summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--.gitignore15
-rw-r--r--README2
-rw-r--r--_test/cases/inc/DifferenceEngine.test.php31
-rw-r--r--_test/cases/inc/auth_admincheck.test.php79
-rw-r--r--_test/cases/inc/auth_password.test.php22
-rw-r--r--_test/cases/inc/init_getbaseurl.test.php25
-rw-r--r--_test/cases/inc/mail_isvalid.test.php4
-rw-r--r--_test/cases/inc/pageutils_getid.test.php2
-rw-r--r--_test/cases/inc/pageutils_resolve_pageid.test.php22
-rw-r--r--_test/cases/inc/parser/parser_eol.test.php12
-rw-r--r--_test/cases/inc/parser/parser_footnote.test.php32
-rw-r--r--_test/cases/inc/parser/parser_formatting.test.php48
-rw-r--r--_test/cases/inc/parser/parser_headers.test.php56
-rw-r--r--_test/cases/inc/parser/parser_i18n.test.php14
-rw-r--r--_test/cases/inc/parser/parser_links.test.php169
-rw-r--r--_test/cases/inc/parser/parser_lists.test.php4
-rw-r--r--_test/cases/inc/parser/parser_preformatted.test.php22
-rw-r--r--_test/cases/inc/parser/parser_quote.test.php6
-rw-r--r--_test/cases/inc/parser/parser_quotes.test.php28
-rw-r--r--_test/cases/inc/parser/parser_replacements.test.php42
-rw-r--r--_test/cases/inc/parser/parser_table.test.php28
-rw-r--r--_test/cases/inc/parser/parser_unformatted.test.php4
-rw-r--r--_test/cases/inc/parser/xhtml_links.test.php199
-rw-r--r--_test/cases/inc/parserutils_set_metadata_during_rendering.test.php93
-rw-r--r--_test/cases/inc/safefn.test.php35
-rw-r--r--_test/cases/lib/exe/css_css_loadfile.test.php57
-rw-r--r--_test/cases/lib/exe/js_js_compress.test.php6
-rwxr-xr-xbin/indexer.php32
-rw-r--r--bin/striplangs.php2
-rw-r--r--conf/.htaccess7
-rw-r--r--conf/acronyms.conf1
-rw-r--r--conf/dokuwiki.php6
-rw-r--r--conf/interwiki.conf10
-rw-r--r--conf/smileys.conf1
-rw-r--r--conf/wordblock.conf5
-rw-r--r--conf/words.aspell.dist5
-rw-r--r--data/.htaccess1
-rw-r--r--data/deleted.files3
-rw-r--r--doku.php6
-rw-r--r--feed.php74
-rw-r--r--inc/.htaccess7
-rw-r--r--inc/DifferenceEngine.php58
-rw-r--r--inc/EmailAddressValidator.php71
-rw-r--r--inc/FeedParser.php2
-rw-r--r--inc/HTTPClient.php129
-rw-r--r--inc/IXR_Library.php9
-rw-r--r--inc/JpegMeta.php25
-rw-r--r--inc/PassHash.class.php379
-rw-r--r--inc/SafeFN.class.php6
-rw-r--r--inc/Sitemapper.php2
-rw-r--r--inc/TarLib.class.php2
-rw-r--r--inc/actions.php31
-rw-r--r--inc/adLDAP.php131
-rw-r--r--inc/auth.php190
-rw-r--r--inc/auth/ad.class.php58
-rw-r--r--inc/auth/ldap.class.php7
-rw-r--r--inc/auth/mysql.class.php2
-rw-r--r--inc/changelog.php5
-rw-r--r--inc/common.php73
-rw-r--r--inc/config_cascade.php14
-rw-r--r--inc/confutils.php21
-rw-r--r--inc/form.php18
-rw-r--r--inc/fulltext.php104
-rw-r--r--inc/html.php138
-rw-r--r--inc/httputils.php52
-rw-r--r--inc/indexer.php1687
-rw-r--r--inc/infoutils.php37
-rw-r--r--inc/init.php39
-rw-r--r--inc/io.php23
-rw-r--r--inc/lang/.htaccess7
-rw-r--r--inc/lang/af/lang.php2
-rw-r--r--inc/lang/ar/admin.txt2
-rw-r--r--inc/lang/ar/denied.txt4
-rw-r--r--inc/lang/ar/draft.txt2
-rw-r--r--inc/lang/ar/lang.php151
-rw-r--r--inc/lang/ar/mailtext.txt4
-rw-r--r--inc/lang/ar/password.txt2
-rw-r--r--inc/lang/ar/resendpwd.txt4
-rw-r--r--inc/lang/ar/subscr_digest.txt21
-rw-r--r--[-rwxr-xr-x]inc/lang/az/admin.txt0
-rw-r--r--[-rwxr-xr-x]inc/lang/az/adminplugins.txt0
-rw-r--r--[-rwxr-xr-x]inc/lang/az/backlinks.txt0
-rw-r--r--[-rwxr-xr-x]inc/lang/az/conflict.txt0
-rw-r--r--[-rwxr-xr-x]inc/lang/az/denied.txt0
-rw-r--r--[-rwxr-xr-x]inc/lang/az/diff.txt0
-rw-r--r--[-rwxr-xr-x]inc/lang/az/draft.txt0
-rw-r--r--[-rwxr-xr-x]inc/lang/az/edit.txt0
-rw-r--r--[-rwxr-xr-x]inc/lang/az/editrev.txt0
-rw-r--r--[-rwxr-xr-x]inc/lang/az/index.txt0
-rw-r--r--[-rwxr-xr-x]inc/lang/az/install.html0
-rw-r--r--inc/lang/az/lang.php2
-rw-r--r--[-rwxr-xr-x]inc/lang/az/locked.txt0
-rw-r--r--[-rwxr-xr-x]inc/lang/az/login.txt0
-rw-r--r--[-rwxr-xr-x]inc/lang/az/mailtext.txt0
-rw-r--r--[-rwxr-xr-x]inc/lang/az/newpage.txt0
-rw-r--r--[-rwxr-xr-x]inc/lang/az/norev.txt0
-rw-r--r--[-rwxr-xr-x]inc/lang/az/password.txt0
-rw-r--r--[-rwxr-xr-x]inc/lang/az/preview.txt0
-rw-r--r--[-rwxr-xr-x]inc/lang/az/pwconfirm.txt0
-rw-r--r--[-rwxr-xr-x]inc/lang/az/read.txt0
-rw-r--r--[-rwxr-xr-x]inc/lang/az/recent.txt0
-rw-r--r--[-rwxr-xr-x]inc/lang/az/register.txt0
-rw-r--r--[-rwxr-xr-x]inc/lang/az/registermail.txt0
-rw-r--r--[-rwxr-xr-x]inc/lang/az/resendpwd.txt0
-rw-r--r--[-rwxr-xr-x]inc/lang/az/revisions.txt0
-rw-r--r--[-rwxr-xr-x]inc/lang/az/searchpage.txt0
-rw-r--r--[-rwxr-xr-x]inc/lang/az/showrev.txt0
-rw-r--r--[-rwxr-xr-x]inc/lang/az/stopwords.txt0
-rw-r--r--[-rwxr-xr-x]inc/lang/az/updateprofile.txt0
-rw-r--r--[-rwxr-xr-x]inc/lang/az/uploadmail.txt0
-rw-r--r--[-rwxr-xr-x]inc/lang/az/wordblock.txt0
-rw-r--r--inc/lang/bg/admin.txt4
-rw-r--r--inc/lang/bg/adminplugins.txt2
-rw-r--r--inc/lang/bg/backlinks.txt4
-rw-r--r--inc/lang/bg/conflict.txt6
-rw-r--r--inc/lang/bg/denied.txt2
-rw-r--r--inc/lang/bg/diff.txt3
-rw-r--r--inc/lang/bg/draft.txt4
-rw-r--r--inc/lang/bg/edit.txt2
-rw-r--r--inc/lang/bg/editrev.txt2
-rw-r--r--inc/lang/bg/index.txt2
-rw-r--r--inc/lang/bg/install.html32
-rw-r--r--inc/lang/bg/lang.php289
-rw-r--r--inc/lang/bg/locked.txt4
-rw-r--r--inc/lang/bg/login.txt4
-rw-r--r--inc/lang/bg/mailtext.txt18
-rw-r--r--inc/lang/bg/newpage.txt2
-rw-r--r--inc/lang/bg/norev.txt2
-rw-r--r--inc/lang/bg/password.txt8
-rw-r--r--inc/lang/bg/preview.txt2
-rw-r--r--inc/lang/bg/pwconfirm.txt9
-rw-r--r--inc/lang/bg/read.txt2
-rw-r--r--inc/lang/bg/recent.txt2
-rw-r--r--inc/lang/bg/register.txt4
-rw-r--r--inc/lang/bg/registermail.txt16
-rw-r--r--inc/lang/bg/resendpwd.txt2
-rw-r--r--inc/lang/bg/revisions.txt4
-rw-r--r--inc/lang/bg/searchpage.txt2
-rw-r--r--inc/lang/bg/showrev.txt2
-rw-r--r--inc/lang/bg/stopwords.txt6
-rw-r--r--inc/lang/bg/subscr_digest.txt18
-rw-r--r--inc/lang/bg/subscr_form.txt3
-rw-r--r--inc/lang/bg/subscr_list.txt15
-rw-r--r--inc/lang/bg/subscr_single.txt22
-rw-r--r--inc/lang/bg/updateprofile.txt2
-rw-r--r--inc/lang/bg/uploadmail.txt20
-rw-r--r--inc/lang/ca-valencia/lang.php3
-rw-r--r--inc/lang/ca/lang.php4
-rw-r--r--inc/lang/cs/lang.php12
-rw-r--r--inc/lang/da/lang.php2
-rw-r--r--inc/lang/de-informal/denied.txt2
-rw-r--r--inc/lang/de-informal/lang.php83
-rw-r--r--inc/lang/de-informal/resendpwd.txt2
-rw-r--r--inc/lang/de-informal/revisions.txt2
-rw-r--r--inc/lang/de-informal/subscr_digest.txt6
-rw-r--r--inc/lang/de-informal/subscr_single.txt12
-rw-r--r--inc/lang/de/denied.txt2
-rw-r--r--inc/lang/de/lang.php32
-rw-r--r--inc/lang/de/resendpwd.txt2
-rw-r--r--inc/lang/de/revisions.txt2
-rw-r--r--inc/lang/de/subscr_digest.txt4
-rw-r--r--inc/lang/de/subscr_single.txt12
-rw-r--r--inc/lang/el/admin.txt2
-rw-r--r--inc/lang/el/adminplugins.txt2
-rw-r--r--inc/lang/el/conflict.txt7
-rw-r--r--inc/lang/el/denied.txt2
-rw-r--r--inc/lang/el/draft.txt4
-rw-r--r--inc/lang/el/edit.txt4
-rw-r--r--inc/lang/el/index.txt2
-rw-r--r--inc/lang/el/install.html39
-rw-r--r--inc/lang/el/lang.php91
-rw-r--r--inc/lang/el/locked.txt3
-rw-r--r--inc/lang/el/login.txt6
-rw-r--r--inc/lang/el/newpage.txt3
-rw-r--r--inc/lang/el/norev.txt5
-rw-r--r--inc/lang/el/password.txt4
-rw-r--r--inc/lang/el/preview.txt3
-rw-r--r--inc/lang/el/pwconfirm.txt6
-rw-r--r--inc/lang/el/read.txt3
-rw-r--r--inc/lang/el/recent.txt2
-rw-r--r--inc/lang/el/register.txt4
-rw-r--r--inc/lang/el/registermail.txt2
-rw-r--r--inc/lang/el/resendpwd.txt4
-rw-r--r--inc/lang/el/revisions.txt7
-rw-r--r--inc/lang/el/searchpage.txt3
-rw-r--r--inc/lang/el/showrev.txt2
-rw-r--r--inc/lang/el/stopwords.txt126
-rw-r--r--inc/lang/el/subscr_digest.txt7
-rw-r--r--inc/lang/el/subscr_list.txt9
-rw-r--r--inc/lang/el/subscr_single.txt9
-rw-r--r--inc/lang/el/updateprofile.txt3
-rw-r--r--inc/lang/en/lang.php7
-rw-r--r--inc/lang/eo/lang.php12
-rw-r--r--inc/lang/es/lang.php9
-rw-r--r--inc/lang/et/lang.php442
-rw-r--r--inc/lang/eu/lang.php5
-rw-r--r--inc/lang/fa/lang.php6
-rw-r--r--inc/lang/fi/lang.php7
-rw-r--r--inc/lang/fo/lang.php4
-rw-r--r--inc/lang/fr/lang.php18
-rw-r--r--inc/lang/gl/lang.php2
-rw-r--r--inc/lang/he/conflict.txt6
-rw-r--r--inc/lang/he/denied.txt2
-rw-r--r--inc/lang/he/draft.txt4
-rw-r--r--inc/lang/he/edit.txt2
-rw-r--r--inc/lang/he/editrev.txt2
-rw-r--r--inc/lang/he/index.txt4
-rw-r--r--inc/lang/he/install.html16
-rw-r--r--inc/lang/he/lang.php331
-rw-r--r--inc/lang/he/mailtext.txt20
-rw-r--r--inc/lang/he/password.txt8
-rw-r--r--inc/lang/he/pwconfirm.txt8
-rw-r--r--inc/lang/he/read.txt2
-rw-r--r--inc/lang/he/register.txt2
-rw-r--r--inc/lang/he/registermail.txt10
-rw-r--r--inc/lang/he/resendpwd.txt4
-rw-r--r--inc/lang/he/subscr_digest.txt20
-rw-r--r--inc/lang/he/subscr_single.txt22
-rw-r--r--inc/lang/hi/lang.php10
-rw-r--r--inc/lang/hr/lang.php116
-rw-r--r--inc/lang/hr/read.txt2
-rw-r--r--inc/lang/hr/resendpwd.txt2
-rw-r--r--inc/lang/hu/lang.php9
-rw-r--r--inc/lang/ia/lang.php2
-rw-r--r--inc/lang/id-ni/lang.php2
-rw-r--r--inc/lang/id/lang.php2
-rw-r--r--inc/lang/is/lang.php2
-rw-r--r--inc/lang/it/denied.txt2
-rw-r--r--inc/lang/it/install.html10
-rw-r--r--inc/lang/it/lang.php74
-rw-r--r--inc/lang/it/mailtext.txt15
-rw-r--r--inc/lang/it/password.txt2
-rw-r--r--inc/lang/it/pwconfirm.txt2
-rw-r--r--inc/lang/it/register.txt3
-rw-r--r--inc/lang/it/registermail.txt10
-rw-r--r--inc/lang/it/resendpwd.txt2
-rw-r--r--inc/lang/it/subscr_digest.txt4
-rw-r--r--inc/lang/it/subscr_list.txt4
-rw-r--r--inc/lang/it/subscr_single.txt11
-rw-r--r--inc/lang/it/uploadmail.txt2
-rw-r--r--inc/lang/ja/lang.php5
-rw-r--r--inc/lang/kk/lang.php116
-rw-r--r--inc/lang/km/lang.php5
-rw-r--r--inc/lang/ko/lang.php18
-rw-r--r--inc/lang/ku/lang.php2
-rw-r--r--inc/lang/la/conflict.txt6
-rw-r--r--inc/lang/la/editrev.txt2
-rw-r--r--inc/lang/la/index.txt2
-rw-r--r--inc/lang/la/install.html8
-rw-r--r--inc/lang/la/lang.php53
-rw-r--r--inc/lang/la/norev.txt4
-rw-r--r--inc/lang/la/showrev.txt2
-rw-r--r--inc/lang/la/subscr_digest.txt2
-rw-r--r--inc/lang/la/subscr_form.txt2
-rw-r--r--inc/lang/la/subscr_list.txt2
-rw-r--r--inc/lang/la/subscr_single.txt2
-rw-r--r--inc/lang/lb/lang.php2
-rw-r--r--inc/lang/lt/lang.php3
-rw-r--r--inc/lang/lv/lang.php5
-rw-r--r--inc/lang/mg/lang.php2
-rw-r--r--inc/lang/mk/lang.php2
-rw-r--r--inc/lang/mr/lang.php3
-rw-r--r--inc/lang/ne/lang.php5
-rw-r--r--inc/lang/nl/lang.php8
-rw-r--r--inc/lang/no/lang.php71
-rw-r--r--inc/lang/pl/lang.php2
-rw-r--r--inc/lang/pt-br/lang.php61
-rw-r--r--inc/lang/pt-br/subscr_digest.txt9
-rw-r--r--inc/lang/pt-br/subscr_list.txt19
-rw-r--r--inc/lang/pt-br/subscr_single.txt10
-rw-r--r--inc/lang/pt/lang.php6
-rw-r--r--inc/lang/ro/lang.php8
-rw-r--r--inc/lang/ru/conflict.txt2
-rw-r--r--inc/lang/ru/draft.txt2
-rw-r--r--inc/lang/ru/edit.txt2
-rw-r--r--inc/lang/ru/editrev.txt2
-rw-r--r--inc/lang/ru/install.html4
-rw-r--r--inc/lang/ru/lang.php53
-rw-r--r--inc/lang/ru/norev.txt2
-rw-r--r--inc/lang/ru/password.txt7
-rw-r--r--inc/lang/ru/preview.txt2
-rw-r--r--inc/lang/ru/pwconfirm.txt2
-rw-r--r--inc/lang/ru/revisions.txt2
-rw-r--r--inc/lang/ru/searchpage.txt2
-rw-r--r--inc/lang/ru/showrev.txt2
-rw-r--r--inc/lang/ru/subscr_digest.txt2
-rw-r--r--inc/lang/ru/subscr_list.txt6
-rw-r--r--inc/lang/ru/subscr_single.txt10
-rw-r--r--inc/lang/sk/lang.php7
-rw-r--r--inc/lang/sl/admin.txt3
-rw-r--r--inc/lang/sl/adminplugins.txt1
-rw-r--r--inc/lang/sl/backlinks.txt5
-rw-r--r--inc/lang/sl/conflict.txt7
-rw-r--r--inc/lang/sl/denied.txt5
-rw-r--r--inc/lang/sl/diff.txt5
-rw-r--r--inc/lang/sl/draft.txt5
-rw-r--r--inc/lang/sl/edit.txt3
-rw-r--r--inc/lang/sl/editrev.txt2
-rw-r--r--inc/lang/sl/index.txt2
-rw-r--r--inc/lang/sl/install.html20
-rw-r--r--inc/lang/sl/lang.php287
-rw-r--r--inc/lang/sl/locked.txt2
-rw-r--r--inc/lang/sl/login.txt3
-rw-r--r--inc/lang/sl/mailtext.txt12
-rw-r--r--inc/lang/sl/newpage.txt4
-rw-r--r--inc/lang/sl/norev.txt5
-rw-r--r--inc/lang/sl/password.txt13
-rw-r--r--inc/lang/sl/preview.txt3
-rw-r--r--inc/lang/sl/pwconfirm.txt14
-rw-r--r--inc/lang/sl/read.txt2
-rw-r--r--inc/lang/sl/recent.txt6
-rw-r--r--inc/lang/sl/register.txt5
-rw-r--r--inc/lang/sl/registermail.txt20
-rw-r--r--inc/lang/sl/resendpwd.txt4
-rw-r--r--inc/lang/sl/revisions.txt3
-rw-r--r--inc/lang/sl/searchpage.txt4
-rw-r--r--inc/lang/sl/showrev.txt2
-rw-r--r--inc/lang/sl/stopwords.txt18
-rw-r--r--inc/lang/sl/subscr_digest.txt19
-rw-r--r--inc/lang/sl/subscr_form.txt3
-rw-r--r--inc/lang/sl/subscr_list.txt16
-rw-r--r--inc/lang/sl/subscr_single.txt22
-rw-r--r--inc/lang/sl/updateprofile.txt3
-rw-r--r--inc/lang/sl/uploadmail.txt14
-rw-r--r--inc/lang/sq/lang.php4
-rw-r--r--inc/lang/sr/lang.php5
-rw-r--r--inc/lang/sv/lang.php66
-rw-r--r--inc/lang/th/lang.php3
-rw-r--r--inc/lang/tr/lang.php2
-rw-r--r--inc/lang/uk/lang.php27
-rw-r--r--inc/lang/vi/lang.php2
-rw-r--r--inc/lang/zh-tw/backlinks.txt5
-rw-r--r--inc/lang/zh-tw/conflict.txt5
-rw-r--r--inc/lang/zh-tw/denied.txt4
-rw-r--r--inc/lang/zh-tw/diff.txt2
-rw-r--r--inc/lang/zh-tw/draft.txt4
-rw-r--r--inc/lang/zh-tw/edit.txt2
-rw-r--r--inc/lang/zh-tw/editrev.txt2
-rw-r--r--inc/lang/zh-tw/index.txt4
-rw-r--r--inc/lang/zh-tw/install.html10
-rw-r--r--inc/lang/zh-tw/lang.php245
-rw-r--r--inc/lang/zh-tw/locked.txt4
-rw-r--r--inc/lang/zh-tw/login.txt2
-rw-r--r--inc/lang/zh-tw/mailtext.txt23
-rw-r--r--inc/lang/zh-tw/newpage.txt4
-rw-r--r--inc/lang/zh-tw/norev.txt5
-rw-r--r--inc/lang/zh-tw/password.txt15
-rw-r--r--inc/lang/zh-tw/pwconfirm.txt12
-rw-r--r--inc/lang/zh-tw/read.txt4
-rw-r--r--inc/lang/zh-tw/register.txt2
-rw-r--r--inc/lang/zh-tw/registermail.txt21
-rw-r--r--inc/lang/zh-tw/resendpwd.txt2
-rw-r--r--inc/lang/zh-tw/searchpage.txt2
-rw-r--r--inc/lang/zh-tw/showrev.txt2
-rw-r--r--inc/lang/zh-tw/subscr_digest.txt19
-rw-r--r--inc/lang/zh-tw/subscr_form.txt3
-rw-r--r--inc/lang/zh-tw/subscr_list.txt16
-rw-r--r--inc/lang/zh-tw/subscr_single.txt22
-rw-r--r--inc/lang/zh-tw/updateprofile.txt4
-rw-r--r--inc/lang/zh-tw/uploadmail.txt23
-rw-r--r--inc/lang/zh/lang.php11
-rw-r--r--inc/load.php14
-rw-r--r--inc/mail.php31
-rw-r--r--inc/media.php166
-rw-r--r--inc/pageutils.php26
-rw-r--r--inc/parser/handler.php253
-rw-r--r--inc/parser/metadata.php7
-rw-r--r--inc/parser/parser.php4
-rw-r--r--inc/parser/xhtml.php28
-rw-r--r--inc/parserutils.php155
-rw-r--r--inc/plugin.php21
-rw-r--r--inc/plugincontroller.class.php32
-rw-r--r--inc/search.php2
-rw-r--r--inc/subscription.php25
-rw-r--r--inc/template.php123
-rw-r--r--inc/toolbar.php2
-rw-r--r--inc/utf8.php6
-rw-r--r--install.php3
-rw-r--r--lib/_fla/.htaccess1
-rw-r--r--lib/exe/ajax.php456
-rw-r--r--lib/exe/css.php185
-rw-r--r--lib/exe/indexer.php38
-rw-r--r--lib/exe/js.php90
-rw-r--r--lib/exe/mediamanager.php22
-rw-r--r--lib/exe/xmlrpc.php191
-rw-r--r--lib/images/admin/acl.pngbin1336 -> 1074 bytes
-rw-r--r--lib/images/admin/config.pngbin1761 -> 1496 bytes
-rw-r--r--lib/images/admin/plugin.pngbin1415 -> 1127 bytes
-rw-r--r--lib/images/admin/popularity.pngbin1420 -> 1189 bytes
-rw-r--r--lib/images/admin/revert.pngbin1598 -> 1295 bytes
-rw-r--r--lib/images/admin/usermanager.pngbin1850 -> 1467 bytes
-rw-r--r--lib/images/close.pngbin1345 -> 137 bytes
-rw-r--r--lib/images/del.pngbin433 -> 355 bytes
-rw-r--r--lib/images/diff.pngbin219 -> 206 bytes
-rw-r--r--lib/images/error.pngbin706 -> 648 bytes
-rw-r--r--lib/images/fileicons/bz2.pngbin720 -> 641 bytes
-rw-r--r--lib/images/fileicons/c.pngbin774 -> 759 bytes
-rw-r--r--lib/images/fileicons/conf.pngbin717 -> 664 bytes
-rw-r--r--lib/images/fileicons/cpp.pngbin859 -> 822 bytes
-rw-r--r--lib/images/fileicons/cs.pngbin808 -> 771 bytes
-rw-r--r--lib/images/fileicons/csv.pngbin480 -> 400 bytes
-rw-r--r--lib/images/fileicons/deb.pngbin716 -> 646 bytes
-rw-r--r--lib/images/fileicons/doc.pngbin659 -> 583 bytes
-rw-r--r--lib/images/fileicons/docx.pngbin659 -> 583 bytes
-rw-r--r--lib/images/fileicons/file.pngbin720 -> 581 bytes
-rw-r--r--lib/images/fileicons/gif.pngbin1001 -> 907 bytes
-rw-r--r--lib/images/fileicons/gz.pngbin716 -> 643 bytes
-rw-r--r--lib/images/fileicons/htm.pngbin748 -> 695 bytes
-rw-r--r--lib/images/fileicons/html.pngbin748 -> 695 bytes
-rw-r--r--lib/images/fileicons/jpeg.pngbin1001 -> 907 bytes
-rw-r--r--lib/images/fileicons/jpg.pngbin1001 -> 907 bytes
-rw-r--r--lib/images/fileicons/lua.pngbin465 -> 440 bytes
-rw-r--r--lib/images/fileicons/mp3.pngbin885 -> 831 bytes
-rw-r--r--lib/images/fileicons/odc.pngbin749 -> 682 bytes
-rw-r--r--lib/images/fileicons/odf.pngbin807 -> 746 bytes
-rw-r--r--lib/images/fileicons/odg.pngbin788 -> 735 bytes
-rw-r--r--lib/images/fileicons/odi.pngbin788 -> 735 bytes
-rw-r--r--lib/images/fileicons/odp.pngbin744 -> 687 bytes
-rw-r--r--lib/images/fileicons/ods.pngbin749 -> 682 bytes
-rw-r--r--lib/images/fileicons/odt.pngbin577 -> 522 bytes
-rw-r--r--lib/images/fileicons/ogg.pngbin865 -> 807 bytes
-rw-r--r--lib/images/fileicons/pdf.pngbin663 -> 592 bytes
-rw-r--r--lib/images/fileicons/php.pngbin755 -> 749 bytes
-rw-r--r--lib/images/fileicons/pl.pngbin698 -> 685 bytes
-rw-r--r--lib/images/fileicons/png.pngbin1001 -> 907 bytes
-rw-r--r--lib/images/fileicons/ppt.pngbin762 -> 697 bytes
-rw-r--r--lib/images/fileicons/pptx.pngbin762 -> 697 bytes
-rw-r--r--lib/images/fileicons/ps.pngbin534 -> 470 bytes
-rw-r--r--lib/images/fileicons/py.pngbin714 -> 683 bytes
-rw-r--r--lib/images/fileicons/rar.pngbin631 -> 557 bytes
-rw-r--r--lib/images/fileicons/rb.pngbin828 -> 802 bytes
-rw-r--r--lib/images/fileicons/rpm.pngbin638 -> 555 bytes
-rw-r--r--lib/images/fileicons/rtf.pngbin474 -> 402 bytes
-rw-r--r--lib/images/fileicons/sql.pngbin865 -> 813 bytes
-rw-r--r--lib/images/fileicons/swf.pngbin843 -> 732 bytes
-rw-r--r--lib/images/fileicons/sxc.pngbin749 -> 682 bytes
-rw-r--r--lib/images/fileicons/sxd.pngbin788 -> 735 bytes
-rw-r--r--lib/images/fileicons/sxi.pngbin744 -> 687 bytes
-rw-r--r--lib/images/fileicons/sxw.pngbin577 -> 522 bytes
-rw-r--r--lib/images/fileicons/tar.pngbin747 -> 663 bytes
-rw-r--r--lib/images/fileicons/tgz.pngbin716 -> 643 bytes
-rw-r--r--lib/images/fileicons/txt.pngbin542 -> 466 bytes
-rw-r--r--lib/images/fileicons/wav.pngbin881 -> 820 bytes
-rw-r--r--lib/images/fileicons/xls.pngbin731 -> 670 bytes
-rw-r--r--lib/images/fileicons/xlsx.pngbin731 -> 670 bytes
-rw-r--r--lib/images/fileicons/xml.pngbin475 -> 409 bytes
-rw-r--r--lib/images/fileicons/zip.pngbin874 -> 800 bytes
-rw-r--r--lib/images/history.pngbin202 -> 149 bytes
-rw-r--r--lib/images/info.pngbin783 -> 725 bytes
-rw-r--r--lib/images/interwiki.pngbin1089 -> 443 bytes
-rw-r--r--lib/images/interwiki/amazon.de.gifbin882 -> 110 bytes
-rw-r--r--lib/images/interwiki/amazon.gifbin882 -> 110 bytes
-rw-r--r--lib/images/interwiki/amazon.uk.gifbin882 -> 110 bytes
-rw-r--r--lib/images/interwiki/callto.gifbin0 -> 178 bytes
-rw-r--r--lib/images/interwiki/doku.gifbin257 -> 188 bytes
-rw-r--r--lib/images/interwiki/google.gifbin980 -> 170 bytes
-rw-r--r--lib/images/interwiki/meatball.gifbin1100 -> 339 bytes
-rw-r--r--lib/images/interwiki/paypal.gifbin0 -> 171 bytes
-rw-r--r--lib/images/interwiki/phpfn.gifbin330 -> 164 bytes
-rw-r--r--lib/images/interwiki/sb.gifbin886 -> 195 bytes
-rw-r--r--lib/images/interwiki/skype.pngbin0 -> 675 bytes
-rw-r--r--lib/images/interwiki/wiki.gifbin909 -> 131 bytes
-rw-r--r--lib/images/interwiki/wp.gifbin680 -> 171 bytes
-rw-r--r--lib/images/interwiki/wpde.gifbin680 -> 171 bytes
-rw-r--r--lib/images/interwiki/wpes.gifbin680 -> 171 bytes
-rw-r--r--lib/images/interwiki/wpfr.gifbin680 -> 171 bytes
-rw-r--r--lib/images/interwiki/wpjp.gifbin680 -> 171 bytes
-rw-r--r--lib/images/interwiki/wpmeta.gifbin680 -> 171 bytes
-rw-r--r--lib/images/interwiki/wppl.gifbin680 -> 171 bytes
-rw-r--r--lib/images/license/badge/cc-by-nc-nd.pngbin5281 -> 1475 bytes
-rw-r--r--lib/images/license/badge/cc-by-nc-sa.pngbin5460 -> 1587 bytes
-rw-r--r--lib/images/license/badge/cc-by-nc.pngbin5145 -> 1421 bytes
-rw-r--r--lib/images/license/badge/cc-by-nd.pngbin4880 -> 1283 bytes
-rw-r--r--lib/images/license/badge/cc-by-sa.pngbin5083 -> 1421 bytes
-rw-r--r--lib/images/license/badge/cc-by.pngbin4739 -> 1204 bytes
-rw-r--r--lib/images/license/badge/cc-zero.pngbin1266 -> 1202 bytes
-rw-r--r--lib/images/license/badge/cc.pngbin958 -> 898 bytes
-rw-r--r--lib/images/license/badge/gnufdl.pngbin1748 -> 1667 bytes
-rw-r--r--lib/images/license/badge/publicdomain.pngbin4962 -> 1345 bytes
-rw-r--r--lib/images/license/button/cc-by-nc-nd.pngbin678 -> 396 bytes
-rw-r--r--lib/images/license/button/cc-by-nc-sa.pngbin686 -> 403 bytes
-rw-r--r--lib/images/license/button/cc-by-nc.pngbin663 -> 388 bytes
-rw-r--r--lib/images/license/button/cc-by-nd.pngbin658 -> 386 bytes
-rw-r--r--lib/images/license/button/cc-by-sa.pngbin661 -> 386 bytes
-rw-r--r--lib/images/license/button/cc-by.pngbin629 -> 369 bytes
-rw-r--r--lib/images/license/button/cc-zero.pngbin706 -> 386 bytes
-rw-r--r--lib/images/license/button/cc.pngbin728 -> 399 bytes
-rw-r--r--lib/images/license/button/gnufdl.pngbin839 -> 509 bytes
-rw-r--r--lib/images/license/button/publicdomain.pngbin621 -> 368 bytes
-rw-r--r--lib/images/loading.gifbin1876 -> 337 bytes
-rw-r--r--lib/images/magnifier.pngbin615 -> 569 bytes
-rw-r--r--lib/images/media_align_center.pngbin294 -> 250 bytes
-rw-r--r--lib/images/media_align_left.pngbin312 -> 251 bytes
-rw-r--r--lib/images/media_align_noalign.pngbin269 -> 220 bytes
-rw-r--r--lib/images/media_align_right.pngbin312 -> 252 bytes
-rw-r--r--lib/images/media_link_direct.pngbin773 -> 720 bytes
-rw-r--r--lib/images/media_link_displaylnk.pngbin343 -> 306 bytes
-rw-r--r--lib/images/media_link_lnk.pngbin651 -> 580 bytes
-rw-r--r--lib/images/media_link_nolnk.pngbin516 -> 464 bytes
-rw-r--r--lib/images/media_size_large.pngbin153 -> 102 bytes
-rw-r--r--lib/images/media_size_medium.pngbin296 -> 231 bytes
-rw-r--r--lib/images/media_size_original.pngbin312 -> 212 bytes
-rw-r--r--lib/images/media_size_small.pngbin305 -> 210 bytes
-rw-r--r--lib/images/minus.gifbin858 -> 85 bytes
-rw-r--r--lib/images/multiupload.pngbin698 -> 581 bytes
-rw-r--r--lib/images/notify.pngbin789 -> 736 bytes
-rw-r--r--lib/images/ns.pngbin853 -> 800 bytes
-rw-r--r--lib/images/page.pngbin635 -> 582 bytes
-rw-r--r--lib/images/pencil.pngbin450 -> 391 bytes
-rw-r--r--lib/images/plus.gifbin860 -> 88 bytes
-rw-r--r--lib/images/smileys/delete.gifbin1421 -> 448 bytes
-rw-r--r--lib/images/smileys/facepalm.gifbin0 -> 185 bytes
-rw-r--r--lib/images/smileys/fixme.gifbin1435 -> 450 bytes
-rw-r--r--lib/images/smileys/icon_arrow.gifbin170 -> 170 bytes
-rw-r--r--lib/images/smileys/icon_biggrin.gifbin172 -> 172 bytes
-rw-r--r--lib/images/smileys/icon_confused.gifbin171 -> 171 bytes
-rw-r--r--lib/images/smileys/icon_cool.gifbin172 -> 172 bytes
-rw-r--r--lib/images/smileys/icon_cry.gifbin498 -> 424 bytes
-rw-r--r--lib/images/smileys/icon_doubt.gifbin990 -> 178 bytes
-rw-r--r--lib/images/smileys/icon_doubt2.gifbin992 -> 180 bytes
-rw-r--r--lib/images/smileys/icon_eek.gifbin170 -> 170 bytes
-rw-r--r--lib/images/smileys/icon_evil.gifbin236 -> 188 bytes
-rw-r--r--lib/images/smileys/icon_exclaim.gifbin236 -> 171 bytes
-rw-r--r--lib/images/smileys/icon_frown.gifbin171 -> 171 bytes
-rw-r--r--lib/images/smileys/icon_fun.gifbin590 -> 179 bytes
-rw-r--r--lib/images/smileys/icon_idea.gifbin176 -> 176 bytes
-rw-r--r--lib/images/smileys/icon_kaddi.gifbin991 -> 179 bytes
-rw-r--r--lib/images/smileys/icon_lol.gifbin336 -> 344 bytes
-rw-r--r--lib/images/smileys/icon_mrgreen.gifbin349 -> 168 bytes
-rw-r--r--lib/images/smileys/icon_neutral.gifbin171 -> 171 bytes
-rw-r--r--lib/images/smileys/icon_question.gifbin248 -> 182 bytes
-rw-r--r--lib/images/smileys/icon_razz.gifbin176 -> 176 bytes
-rw-r--r--lib/images/smileys/icon_redface.gifbin650 -> 669 bytes
-rw-r--r--lib/images/smileys/icon_rolleyes.gifbin485 -> 471 bytes
-rw-r--r--lib/images/smileys/icon_sad.gifbin171 -> 171 bytes
-rw-r--r--lib/images/smileys/icon_silenced.gifbin231 -> 177 bytes
-rw-r--r--lib/images/smileys/icon_smile.gifbin174 -> 174 bytes
-rw-r--r--lib/images/smileys/icon_smile2.gifbin174 -> 174 bytes
-rw-r--r--lib/images/smileys/icon_surprised.gifbin174 -> 174 bytes
-rw-r--r--lib/images/smileys/icon_twisted.gifbin238 -> 180 bytes
-rw-r--r--lib/images/smileys/icon_wink.gifbin170 -> 170 bytes
-rw-r--r--lib/images/success.pngbin816 -> 728 bytes
-rw-r--r--lib/images/throbber.gifbin875 -> 746 bytes
-rw-r--r--lib/images/toolbar/bold.pngbin433 -> 251 bytes
-rw-r--r--lib/images/toolbar/chars.pngbin619 -> 496 bytes
-rw-r--r--lib/images/toolbar/h.pngbin360 -> 258 bytes
-rw-r--r--lib/images/toolbar/h1.pngbin420 -> 290 bytes
-rw-r--r--lib/images/toolbar/h2.pngbin442 -> 328 bytes
-rw-r--r--lib/images/toolbar/h3.pngbin452 -> 322 bytes
-rw-r--r--lib/images/toolbar/h4.pngbin432 -> 310 bytes
-rw-r--r--lib/images/toolbar/h5.pngbin440 -> 325 bytes
-rw-r--r--lib/images/toolbar/hequal.pngbin426 -> 311 bytes
-rw-r--r--lib/images/toolbar/hminus.pngbin538 -> 409 bytes
-rw-r--r--lib/images/toolbar/hplus.pngbin520 -> 396 bytes
-rw-r--r--lib/images/toolbar/hr.pngbin329 -> 254 bytes
-rw-r--r--lib/images/toolbar/image.pngbin625 -> 554 bytes
-rw-r--r--lib/images/toolbar/italic.pngbin322 -> 241 bytes
-rw-r--r--lib/images/toolbar/link.pngbin579 -> 405 bytes
-rw-r--r--lib/images/toolbar/linkextern.pngbin962 -> 904 bytes
-rw-r--r--lib/images/toolbar/mono.pngbin385 -> 296 bytes
-rw-r--r--lib/images/toolbar/ol.pngbin403 -> 304 bytes
-rw-r--r--lib/images/toolbar/sig.pngbin569 -> 471 bytes
-rw-r--r--lib/images/toolbar/smiley.pngbin755 -> 684 bytes
-rw-r--r--lib/images/toolbar/strike.pngbin415 -> 318 bytes
-rw-r--r--lib/images/toolbar/ul.pngbin383 -> 291 bytes
-rw-r--r--lib/images/toolbar/underline.pngbin375 -> 317 bytes
-rw-r--r--lib/images/trash.pngbin476 -> 423 bytes
-rw-r--r--lib/images/up.pngbin376 -> 248 bytes
-rw-r--r--lib/plugins/acl/admin.php81
-rw-r--r--lib/plugins/acl/ajax.php11
-rw-r--r--lib/plugins/acl/lang/ar/help.txt2
-rw-r--r--lib/plugins/acl/lang/ar/lang.php1
-rw-r--r--lib/plugins/acl/lang/bg/help.txt10
-rw-r--r--lib/plugins/acl/lang/bg/lang.php25
-rw-r--r--lib/plugins/acl/lang/cs/lang.php1
-rw-r--r--lib/plugins/acl/lang/de-informal/lang.php1
-rw-r--r--lib/plugins/acl/lang/de/lang.php2
-rw-r--r--lib/plugins/acl/lang/es/lang.php1
-rw-r--r--lib/plugins/acl/lang/et/lang.php39
-rw-r--r--lib/plugins/acl/lang/fi/lang.php1
-rw-r--r--lib/plugins/acl/lang/fr/lang.php2
-rw-r--r--lib/plugins/acl/lang/he/lang.php1
-rw-r--r--lib/plugins/acl/lang/hr/help.txt11
-rw-r--r--lib/plugins/acl/lang/hr/lang.php29
-rw-r--r--lib/plugins/acl/lang/hu/lang.php3
-rw-r--r--lib/plugins/acl/lang/it/lang.php1
-rw-r--r--lib/plugins/acl/lang/kk/lang.php6
-rw-r--r--lib/plugins/acl/lang/la/help.txt4
-rw-r--r--lib/plugins/acl/lang/la/lang.php19
-rw-r--r--lib/plugins/acl/lang/no/lang.php1
-rw-r--r--lib/plugins/acl/lang/pt/lang.php1
-rw-r--r--lib/plugins/acl/lang/ru/help.txt16
-rw-r--r--lib/plugins/acl/lang/ru/lang.php4
-rw-r--r--lib/plugins/acl/lang/sl/help.txt11
-rw-r--r--lib/plugins/acl/lang/sl/lang.php16
-rw-r--r--lib/plugins/acl/lang/sv/lang.php1
-rw-r--r--lib/plugins/acl/lang/zh-tw/help.txt11
-rw-r--r--lib/plugins/acl/lang/zh-tw/lang.php30
-rw-r--r--lib/plugins/acl/lang/zh/lang.php2
-rw-r--r--lib/plugins/acl/pix/group.pngbin753 -> 700 bytes
-rw-r--r--lib/plugins/acl/pix/ns.pngbin853 -> 800 bytes
-rw-r--r--lib/plugins/acl/pix/page.pngbin635 -> 582 bytes
-rw-r--r--lib/plugins/acl/pix/user.pngbin706 -> 653 bytes
-rw-r--r--lib/plugins/acl/script.js147
-rw-r--r--lib/plugins/config/admin.php2
-rw-r--r--lib/plugins/config/images/danger.pngbin701 -> 648 bytes
-rw-r--r--lib/plugins/config/images/security.pngbin749 -> 706 bytes
-rw-r--r--lib/plugins/config/images/warning.pngbin666 -> 613 bytes
-rw-r--r--lib/plugins/config/lang/ar/intro.txt2
-rw-r--r--lib/plugins/config/lang/ar/lang.php29
-rw-r--r--lib/plugins/config/lang/bg/intro.txt8
-rw-r--r--lib/plugins/config/lang/bg/lang.php216
-rw-r--r--lib/plugins/config/lang/ca-valencia/lang.php2
-rw-r--r--lib/plugins/config/lang/ca/lang.php2
-rw-r--r--lib/plugins/config/lang/cs/lang.php6
-rw-r--r--lib/plugins/config/lang/da/lang.php2
-rw-r--r--lib/plugins/config/lang/de-informal/lang.php4
-rw-r--r--lib/plugins/config/lang/de/lang.php5
-rw-r--r--lib/plugins/config/lang/el/lang.php3
-rw-r--r--lib/plugins/config/lang/en/lang.php4
-rw-r--r--lib/plugins/config/lang/eo/lang.php3
-rw-r--r--lib/plugins/config/lang/es/lang.php4
-rw-r--r--lib/plugins/config/lang/et/lang.php32
-rw-r--r--lib/plugins/config/lang/eu/lang.php3
-rw-r--r--lib/plugins/config/lang/fa/lang.php4
-rw-r--r--lib/plugins/config/lang/fi/lang.php5
-rw-r--r--lib/plugins/config/lang/fr/lang.php10
-rw-r--r--lib/plugins/config/lang/gl/lang.php2
-rw-r--r--lib/plugins/config/lang/he/lang.php3
-rw-r--r--lib/plugins/config/lang/hr/lang.php1
-rw-r--r--lib/plugins/config/lang/hu/lang.php6
-rw-r--r--lib/plugins/config/lang/ia/lang.php2
-rw-r--r--lib/plugins/config/lang/it/intro.txt2
-rw-r--r--lib/plugins/config/lang/it/lang.php6
-rw-r--r--lib/plugins/config/lang/ja/lang.php3
-rw-r--r--lib/plugins/config/lang/kk/lang.php6
-rw-r--r--lib/plugins/config/lang/ko/lang.php5
-rw-r--r--lib/plugins/config/lang/la/intro.txt4
-rw-r--r--lib/plugins/config/lang/la/lang.php25
-rw-r--r--lib/plugins/config/lang/lv/lang.php3
-rw-r--r--lib/plugins/config/lang/mr/lang.php2
-rw-r--r--lib/plugins/config/lang/nl/lang.php3
-rw-r--r--lib/plugins/config/lang/no/lang.php3
-rw-r--r--lib/plugins/config/lang/pl/lang.php2
-rw-r--r--lib/plugins/config/lang/pt-br/lang.php7
-rw-r--r--lib/plugins/config/lang/pt/lang.php3
-rw-r--r--lib/plugins/config/lang/ro/lang.php5
-rw-r--r--lib/plugins/config/lang/ru/intro.txt4
-rw-r--r--lib/plugins/config/lang/ru/lang.php52
-rw-r--r--lib/plugins/config/lang/sk/lang.php3
-rw-r--r--lib/plugins/config/lang/sl/intro.txt7
-rw-r--r--lib/plugins/config/lang/sl/lang.php174
-rw-r--r--lib/plugins/config/lang/sq/lang.php2
-rw-r--r--lib/plugins/config/lang/sr/lang.php2
-rw-r--r--lib/plugins/config/lang/sv/lang.php4
-rw-r--r--lib/plugins/config/lang/uk/lang.php6
-rw-r--r--lib/plugins/config/lang/zh-tw/intro.txt6
-rw-r--r--lib/plugins/config/lang/zh-tw/lang.php170
-rw-r--r--lib/plugins/config/lang/zh/lang.php3
-rw-r--r--lib/plugins/config/settings/config.class.php4
-rw-r--r--lib/plugins/config/settings/config.metadata.php4
-rw-r--r--lib/plugins/config/settings/extra.class.php1
-rw-r--r--lib/plugins/info/lang/sl/lang.php12
-rw-r--r--lib/plugins/plugin/admin.php2
-rw-r--r--lib/plugins/plugin/classes/ap_delete.class.php2
-rw-r--r--lib/plugins/plugin/classes/ap_download.class.php4
-rw-r--r--lib/plugins/plugin/classes/ap_manage.class.php2
-rw-r--r--lib/plugins/plugin/lang/ar/admin_plugin.txt2
-rw-r--r--lib/plugins/plugin/lang/ar/lang.php1
-rw-r--r--lib/plugins/plugin/lang/bg/admin_plugin.txt2
-rw-r--r--lib/plugins/plugin/lang/bg/lang.php50
-rw-r--r--lib/plugins/plugin/lang/cs/lang.php2
-rw-r--r--lib/plugins/plugin/lang/de-informal/lang.php2
-rw-r--r--lib/plugins/plugin/lang/de/lang.php3
-rw-r--r--lib/plugins/plugin/lang/en/lang.php1
-rw-r--r--lib/plugins/plugin/lang/es/lang.php2
-rw-r--r--lib/plugins/plugin/lang/et/lang.php32
-rw-r--r--lib/plugins/plugin/lang/eu/lang.php1
-rw-r--r--lib/plugins/plugin/lang/fa/lang.php1
-rw-r--r--lib/plugins/plugin/lang/fi/lang.php2
-rw-r--r--lib/plugins/plugin/lang/fr/lang.php3
-rw-r--r--lib/plugins/plugin/lang/he/lang.php1
-rw-r--r--lib/plugins/plugin/lang/hr/lang.php1
-rw-r--r--lib/plugins/plugin/lang/hu/lang.php4
-rw-r--r--lib/plugins/plugin/lang/it/lang.php1
-rw-r--r--lib/plugins/plugin/lang/ja/lang.php1
-rw-r--r--lib/plugins/plugin/lang/kk/lang.php6
-rw-r--r--lib/plugins/plugin/lang/ko/lang.php1
-rw-r--r--lib/plugins/plugin/lang/la/admin_plugin.txt2
-rw-r--r--lib/plugins/plugin/lang/la/lang.php3
-rw-r--r--lib/plugins/plugin/lang/nl/lang.php1
-rw-r--r--lib/plugins/plugin/lang/no/lang.php1
-rw-r--r--lib/plugins/plugin/lang/pt-br/admin_plugin.txt2
-rw-r--r--lib/plugins/plugin/lang/pt-br/lang.php1
-rw-r--r--lib/plugins/plugin/lang/pt/lang.php2
-rw-r--r--lib/plugins/plugin/lang/ru/lang.php10
-rw-r--r--lib/plugins/plugin/lang/sk/lang.php1
-rw-r--r--lib/plugins/plugin/lang/sl/admin_plugin.txt3
-rw-r--r--lib/plugins/plugin/lang/sl/lang.php34
-rw-r--r--lib/plugins/plugin/lang/sv/lang.php1
-rw-r--r--lib/plugins/plugin/lang/uk/lang.php6
-rw-r--r--lib/plugins/plugin/lang/zh-tw/admin_plugin.txt2
-rw-r--r--lib/plugins/plugin/lang/zh-tw/lang.php37
-rw-r--r--lib/plugins/plugin/lang/zh/lang.php3
-rw-r--r--lib/plugins/popularity/action.php4
-rw-r--r--lib/plugins/popularity/admin.php14
-rw-r--r--lib/plugins/popularity/helper.php28
-rw-r--r--lib/plugins/popularity/lang/ar/intro.txt4
-rw-r--r--lib/plugins/popularity/lang/ar/lang.php6
-rw-r--r--lib/plugins/popularity/lang/ar/submitted.txt3
-rw-r--r--lib/plugins/popularity/lang/bg/intro.txt10
-rw-r--r--lib/plugins/popularity/lang/bg/lang.php10
-rw-r--r--lib/plugins/popularity/lang/bg/submitted.txt3
-rw-r--r--lib/plugins/popularity/lang/cs/lang.php6
-rw-r--r--lib/plugins/popularity/lang/cs/submitted.txt3
-rw-r--r--lib/plugins/popularity/lang/de-informal/lang.php6
-rw-r--r--lib/plugins/popularity/lang/de-informal/submitted.txt3
-rw-r--r--lib/plugins/popularity/lang/de/lang.php7
-rw-r--r--lib/plugins/popularity/lang/de/submitted.txt3
-rw-r--r--lib/plugins/popularity/lang/el/lang.php5
-rw-r--r--lib/plugins/popularity/lang/el/submitted.txt3
-rw-r--r--lib/plugins/popularity/lang/en/lang.php1
-rw-r--r--lib/plugins/popularity/lang/eo/lang.php5
-rw-r--r--lib/plugins/popularity/lang/es/lang.php6
-rw-r--r--lib/plugins/popularity/lang/es/submitted.txt3
-rw-r--r--lib/plugins/popularity/lang/et/lang.php7
-rw-r--r--lib/plugins/popularity/lang/eu/lang.php5
-rw-r--r--lib/plugins/popularity/lang/eu/submitted.txt3
-rw-r--r--lib/plugins/popularity/lang/fa/lang.php5
-rw-r--r--lib/plugins/popularity/lang/fa/submitted.txt2
-rw-r--r--lib/plugins/popularity/lang/fi/lang.php6
-rw-r--r--lib/plugins/popularity/lang/fi/submitted.txt3
-rw-r--r--lib/plugins/popularity/lang/fr/lang.php9
-rw-r--r--lib/plugins/popularity/lang/fr/submitted.txt2
-rw-r--r--lib/plugins/popularity/lang/he/lang.php1
-rw-r--r--lib/plugins/popularity/lang/hr/lang.php1
-rw-r--r--lib/plugins/popularity/lang/hu/lang.php8
-rw-r--r--lib/plugins/popularity/lang/hu/submitted.txt3
-rw-r--r--lib/plugins/popularity/lang/it/intro.txt6
-rw-r--r--lib/plugins/popularity/lang/it/lang.php6
-rw-r--r--lib/plugins/popularity/lang/it/submitted.txt3
-rw-r--r--lib/plugins/popularity/lang/ja/lang.php5
-rw-r--r--lib/plugins/popularity/lang/ja/submitted.txt3
-rw-r--r--lib/plugins/popularity/lang/kk/lang.php6
-rw-r--r--lib/plugins/popularity/lang/ko/lang.php5
-rw-r--r--lib/plugins/popularity/lang/ko/submitted.txt3
-rw-r--r--lib/plugins/popularity/lang/la/intro.txt9
-rw-r--r--lib/plugins/popularity/lang/la/lang.php6
-rw-r--r--lib/plugins/popularity/lang/la/submitted.txt3
-rw-r--r--lib/plugins/popularity/lang/lv/lang.php5
-rw-r--r--lib/plugins/popularity/lang/lv/submitted.txt3
-rw-r--r--lib/plugins/popularity/lang/nl/intro.txt6
-rw-r--r--lib/plugins/popularity/lang/nl/lang.php5
-rw-r--r--lib/plugins/popularity/lang/nl/submitted.txt3
-rw-r--r--lib/plugins/popularity/lang/no/lang.php1
-rw-r--r--lib/plugins/popularity/lang/pt-br/lang.php5
-rw-r--r--lib/plugins/popularity/lang/pt-br/submitted.txt3
-rw-r--r--lib/plugins/popularity/lang/pt/lang.php6
-rw-r--r--lib/plugins/popularity/lang/pt/submitted.txt3
-rw-r--r--lib/plugins/popularity/lang/ro/lang.php5
-rw-r--r--lib/plugins/popularity/lang/ro/submitted.txt3
-rw-r--r--lib/plugins/popularity/lang/ru/intro.txt6
-rw-r--r--lib/plugins/popularity/lang/ru/lang.php7
-rw-r--r--lib/plugins/popularity/lang/ru/submitted.txt2
-rw-r--r--lib/plugins/popularity/lang/sk/lang.php5
-rw-r--r--lib/plugins/popularity/lang/sk/submitted.txt3
-rw-r--r--lib/plugins/popularity/lang/sl/intro.txt9
-rw-r--r--lib/plugins/popularity/lang/sl/lang.php11
-rw-r--r--lib/plugins/popularity/lang/sl/submitted.txt3
-rw-r--r--lib/plugins/popularity/lang/sv/lang.php6
-rw-r--r--lib/plugins/popularity/lang/sv/submitted.txt3
-rw-r--r--lib/plugins/popularity/lang/uk/lang.php6
-rw-r--r--lib/plugins/popularity/lang/zh-tw/intro.txt11
-rw-r--r--lib/plugins/popularity/lang/zh-tw/lang.php11
-rw-r--r--lib/plugins/popularity/lang/zh-tw/submitted.txt3
-rw-r--r--lib/plugins/popularity/lang/zh/lang.php7
-rw-r--r--lib/plugins/popularity/lang/zh/submitted.txt3
-rw-r--r--lib/plugins/popularity/plugin.info.txt2
-rw-r--r--lib/plugins/revert/lang/ar/lang.php1
-rw-r--r--lib/plugins/revert/lang/bg/intro.txt2
-rw-r--r--lib/plugins/revert/lang/bg/lang.php13
-rw-r--r--lib/plugins/revert/lang/cs/lang.php1
-rw-r--r--lib/plugins/revert/lang/de-informal/lang.php1
-rw-r--r--lib/plugins/revert/lang/de/lang.php2
-rw-r--r--lib/plugins/revert/lang/es/lang.php1
-rw-r--r--lib/plugins/revert/lang/et/lang.php7
-rw-r--r--lib/plugins/revert/lang/fi/lang.php1
-rw-r--r--lib/plugins/revert/lang/fr/lang.php2
-rw-r--r--lib/plugins/revert/lang/he/lang.php1
-rw-r--r--lib/plugins/revert/lang/hr/lang.php1
-rw-r--r--lib/plugins/revert/lang/hu/lang.php3
-rw-r--r--lib/plugins/revert/lang/it/lang.php1
-rw-r--r--lib/plugins/revert/lang/kk/lang.php6
-rw-r--r--lib/plugins/revert/lang/la/intro.txt2
-rw-r--r--lib/plugins/revert/lang/la/lang.php1
-rw-r--r--lib/plugins/revert/lang/no/lang.php1
-rw-r--r--lib/plugins/revert/lang/pt/lang.php1
-rw-r--r--lib/plugins/revert/lang/ru/intro.txt2
-rw-r--r--lib/plugins/revert/lang/ru/lang.php2
-rw-r--r--lib/plugins/revert/lang/sl/intro.txt3
-rw-r--r--lib/plugins/revert/lang/sl/lang.php12
-rw-r--r--lib/plugins/revert/lang/sv/lang.php1
-rw-r--r--lib/plugins/revert/lang/uk/lang.php3
-rw-r--r--lib/plugins/revert/lang/zh-tw/intro.txt2
-rw-r--r--lib/plugins/revert/lang/zh-tw/lang.php18
-rw-r--r--lib/plugins/revert/lang/zh/lang.php2
-rw-r--r--lib/plugins/safefnrecode/action.php68
-rw-r--r--lib/plugins/safefnrecode/plugin.info.txt7
-rw-r--r--lib/plugins/syntax.php11
-rw-r--r--lib/plugins/usermanager/admin.php13
-rw-r--r--lib/plugins/usermanager/images/search.pngbin733 -> 550 bytes
-rw-r--r--lib/plugins/usermanager/lang/ar/lang.php1
-rw-r--r--lib/plugins/usermanager/lang/bg/lang.php59
-rw-r--r--lib/plugins/usermanager/lang/bg/list.txt2
-rw-r--r--lib/plugins/usermanager/lang/cs/lang.php1
-rw-r--r--lib/plugins/usermanager/lang/de-informal/lang.php1
-rw-r--r--lib/plugins/usermanager/lang/de/lang.php2
-rw-r--r--lib/plugins/usermanager/lang/es/lang.php1
-rw-r--r--lib/plugins/usermanager/lang/et/lang.php30
-rw-r--r--lib/plugins/usermanager/lang/fi/lang.php1
-rw-r--r--lib/plugins/usermanager/lang/fr/lang.php2
-rw-r--r--lib/plugins/usermanager/lang/he/lang.php1
-rw-r--r--lib/plugins/usermanager/lang/hr/lang.php1
-rw-r--r--lib/plugins/usermanager/lang/hu/lang.php3
-rw-r--r--lib/plugins/usermanager/lang/it/lang.php1
-rw-r--r--lib/plugins/usermanager/lang/kk/lang.php6
-rw-r--r--lib/plugins/usermanager/lang/la/lang.php1
-rw-r--r--lib/plugins/usermanager/lang/no/lang.php1
-rw-r--r--lib/plugins/usermanager/lang/pt/lang.php1
-rw-r--r--lib/plugins/usermanager/lang/ru/lang.php6
-rw-r--r--lib/plugins/usermanager/lang/sl/add.txt2
-rw-r--r--lib/plugins/usermanager/lang/sl/delete.txt2
-rw-r--r--lib/plugins/usermanager/lang/sl/edit.txt2
-rw-r--r--lib/plugins/usermanager/lang/sl/intro.txt1
-rw-r--r--lib/plugins/usermanager/lang/sl/lang.php36
-rw-r--r--lib/plugins/usermanager/lang/sv/lang.php1
-rw-r--r--lib/plugins/usermanager/lang/uk/edit.txt2
-rw-r--r--lib/plugins/usermanager/lang/zh-tw/intro.txt2
-rw-r--r--lib/plugins/usermanager/lang/zh-tw/lang.php24
-rw-r--r--lib/plugins/usermanager/lang/zh/lang.php2
-rw-r--r--lib/plugins/usermanager/script.js11
-rw-r--r--lib/scripts/ajax.js48
-rw-r--r--lib/scripts/behaviour.js184
-rw-r--r--lib/scripts/compatibility.js125
-rw-r--r--lib/scripts/cookie.js74
-rw-r--r--lib/scripts/drag.js2
-rw-r--r--lib/scripts/edit.js316
-rw-r--r--lib/scripts/editor.js116
-rw-r--r--lib/scripts/events.js181
-rw-r--r--lib/scripts/helpers.js48
-rw-r--r--lib/scripts/index.js126
-rw-r--r--lib/scripts/jquery/jquery-ui-theme/images/ui-bg_flat_0_aaaaaa_40x100.pngbin0 -> 180 bytes
-rw-r--r--lib/scripts/jquery/jquery-ui-theme/images/ui-bg_flat_75_ffffff_40x100.pngbin0 -> 178 bytes
-rw-r--r--lib/scripts/jquery/jquery-ui-theme/images/ui-bg_glass_55_fbf9ee_1x400.pngbin0 -> 120 bytes
-rw-r--r--lib/scripts/jquery/jquery-ui-theme/images/ui-bg_glass_65_ffffff_1x400.pngbin0 -> 105 bytes
-rw-r--r--lib/scripts/jquery/jquery-ui-theme/images/ui-bg_glass_75_dadada_1x400.pngbin0 -> 111 bytes
-rw-r--r--lib/scripts/jquery/jquery-ui-theme/images/ui-bg_glass_75_e6e6e6_1x400.pngbin0 -> 110 bytes
-rw-r--r--lib/scripts/jquery/jquery-ui-theme/images/ui-bg_glass_95_fef1ec_1x400.pngbin0 -> 119 bytes
-rw-r--r--lib/scripts/jquery/jquery-ui-theme/images/ui-bg_highlight-soft_75_cccccc_1x100.pngbin0 -> 101 bytes
-rw-r--r--lib/scripts/jquery/jquery-ui-theme/images/ui-icons_222222_256x240.pngbin0 -> 4369 bytes
-rw-r--r--lib/scripts/jquery/jquery-ui-theme/images/ui-icons_2e83ff_256x240.pngbin0 -> 4369 bytes
-rw-r--r--lib/scripts/jquery/jquery-ui-theme/images/ui-icons_454545_256x240.pngbin0 -> 4369 bytes
-rw-r--r--lib/scripts/jquery/jquery-ui-theme/images/ui-icons_888888_256x240.pngbin0 -> 4369 bytes
-rw-r--r--lib/scripts/jquery/jquery-ui-theme/images/ui-icons_cd0a0a_256x240.pngbin0 -> 4369 bytes
-rw-r--r--lib/scripts/jquery/jquery-ui-theme/smoothness.css568
-rw-r--r--lib/scripts/jquery/jquery-ui.js11729
-rw-r--r--lib/scripts/jquery/jquery-ui.min.js412
-rw-r--r--lib/scripts/jquery/jquery.cookie.js96
-rw-r--r--lib/scripts/jquery/jquery.js8981
-rw-r--r--lib/scripts/jquery/jquery.min.js18
-rwxr-xr-xlib/scripts/jquery/update.sh25
-rw-r--r--lib/scripts/linkwiz.js233
-rw-r--r--lib/scripts/locktimer.js110
-rw-r--r--lib/scripts/media.js1043
-rw-r--r--lib/scripts/qsearch.js149
-rw-r--r--lib/scripts/script.js357
-rw-r--r--lib/scripts/subscriptions.js46
-rw-r--r--lib/scripts/toolbar.js88
-rw-r--r--lib/scripts/tree.js96
-rw-r--r--lib/scripts/tw-sack.js2
-rw-r--r--lib/styles/all.css49
-rw-r--r--lib/styles/print.css23
-rw-r--r--lib/styles/screen.css (renamed from lib/styles/style.css)58
-rw-r--r--lib/tpl/default/_linkwiz.css1
-rw-r--r--lib/tpl/default/_mediaoptions.css32
-rw-r--r--lib/tpl/default/design.css26
-rw-r--r--lib/tpl/default/images/UWEB.pngbin1138 -> 462 bytes
-rw-r--r--lib/tpl/default/images/UWEBshadow.pngbin1123 -> 900 bytes
-rw-r--r--lib/tpl/default/images/apple-touch-icon.pngbin0 -> 17728 bytes
-rw-r--r--lib/tpl/default/images/button-cc.gifbin1231 -> 359 bytes
-rw-r--r--lib/tpl/default/images/button-dw.pngbin427 -> 404 bytes
-rw-r--r--lib/tpl/default/images/button-rss.pngbin280 -> 191 bytes
-rw-r--r--lib/tpl/default/images/buttonshadow.pngbin257 -> 218 bytes
-rw-r--r--lib/tpl/default/images/inputshadow.pngbin155 -> 93 bytes
-rw-r--r--lib/tpl/default/images/link_icon.gifbin942 -> 168 bytes
-rw-r--r--lib/tpl/default/images/mail_icon.gifbin918 -> 151 bytes
-rw-r--r--lib/tpl/default/images/tocdot2.gifbin810 -> 50 bytes
-rw-r--r--lib/tpl/default/images/windows.gifbin223 -> 170 bytes
-rw-r--r--lib/tpl/default/main.php5
-rw-r--r--lib/tpl/default/media.css4
-rw-r--r--lib/tpl/default/print.css47
-rw-r--r--lib/tpl/default/rtl.css3
-rw-r--r--lib/tpl/index.php6
903 files changed, 32156 insertions, 6308 deletions
diff --git a/.gitignore b/.gitignore
index 2d7f2df97..6ad14d206 100644
--- a/.gitignore
+++ b/.gitignore
@@ -6,11 +6,14 @@
/conf/user*.css
/conf/user*.js
/conf/words.aspell
+/conf/lang/*
+/conf/plugin_lang/*
.htaccess
*.swp
*.bak
*.old
*~
+*.DS_Store
/data/attic/*
/data/cache/*
/data/index/*
@@ -21,3 +24,15 @@
/data/tmp/*
/lib/tpl/*
/lib/plugins/*
+!/lib/plugins/acl
+!/lib/plugins/config
+!/lib/plugins/info
+!/lib/plugins/plugin
+!/lib/plugins/popularity
+!/lib/plugins/revert
+!/lib/plugins/safefnrecode
+!/lib/plugins/usermanager
+!/lib/plugins/action.php
+!/lib/plugins/admin.php
+!/lib/plugins/index.html
+!/lib/plugins/syntax.php
diff --git a/README b/README
index 76a7cf6cd..6bb9a3bd9 100644
--- a/README
+++ b/README
@@ -4,7 +4,7 @@ at http://www.dokuwiki.org/
For Installation Instructions see
http://www.dokuwiki.org/install
-DokuWiki - 2004-2010 (c) Andreas Gohr <andi@splitbrain.org>
+DokuWiki - 2004-2011 (c) Andreas Gohr <andi@splitbrain.org>
and the DokuWiki Community
See COPYING and file headers for license info
diff --git a/_test/cases/inc/DifferenceEngine.test.php b/_test/cases/inc/DifferenceEngine.test.php
new file mode 100644
index 000000000..aa1756114
--- /dev/null
+++ b/_test/cases/inc/DifferenceEngine.test.php
@@ -0,0 +1,31 @@
+<?php
+require_once DOKU_INC.'inc/DifferenceEngine.php';
+
+class differenceengine_test extends UnitTestCase {
+
+ function test_white_between_words(){
+ // From FS#2161
+ global $lang;
+
+ $df = new Diff(explode("\n","example"),
+ explode("\n","example example2"));
+
+ $idf = new InlineDiffFormatter();
+ $tdf = new TableDiffFormatter();
+
+ $this->assertEqual($idf->format($df), '<tr><td colspan="4" class="diff-blockheader">@@ ' . $lang['line'] .
+ ' -1 +1 @@&nbsp;<span class="diff-deletedline"><del>' . $lang['deleted'] .
+ '</del></span>&nbsp;<span class="diff-addedline">' . $lang['created'] .
+ '</span></td></tr>
+
+<tr><td colspan="4">example&nbsp;<span class="diff-addedline">example2</span></td></tr>
+');
+ $this->assertEqual($tdf->format($df),
+ '<tr><td class="diff-blockheader" colspan="2">' . $lang['line'] . ' 1:</td>
+<td class="diff-blockheader" colspan="2">' . $lang['line'] . ' 1:</td>
+</tr>
+<tr><td>-</td><td class="diff-deletedline">example</td><td>+</td><td class="diff-addedline">example&nbsp;<strong>example2</strong></td></tr>
+');
+ }
+}
+//Setup VIM: ex: et ts=4 :
diff --git a/_test/cases/inc/auth_admincheck.test.php b/_test/cases/inc/auth_admincheck.test.php
index 01dd38df7..2a420ffd4 100644
--- a/_test/cases/inc/auth_admincheck.test.php
+++ b/_test/cases/inc/auth_admincheck.test.php
@@ -2,18 +2,46 @@
require_once DOKU_INC.'inc/init.php';
require_once DOKU_INC.'inc/auth.php';
+require_once DOKU_INC.'inc/auth/basic.class.php';
+
+class auth_admin_test_AuthInSensitive extends auth_basic {
+ function isCaseSensitive(){
+ return false;
+ }
+}
class auth_admin_test extends UnitTestCase {
+ private $oldauth;
+
+ function setup() {
+ global $auth;
+ $this->oldauth = $auth;
+ parent::setup();
+ }
+
+ function setSensitive() {
+ global $auth;
+ $auth = new auth_basic;
+ }
+
+ function setInSensitive() {
+ global $auth;
+ $auth = new auth_admin_test_AuthInSensitive;
+ }
+
function teardown() {
+ global $auth;
global $conf;
global $AUTH_ACL;
unset($conf);
unset($AUTH_ACL);
-
+ $auth = $this->oldauth;
+ parent::teardown();
}
- function test_ismanager(){
+ function test_ismanager_insensitive(){
+ $this->setInSensitive();
global $conf;
$conf['superuser'] = 'john,@admin,@Mötly Görls, Dörte';
$conf['manager'] = 'john,@managers,doe, @Mötly Böys, Dänny';
@@ -36,7 +64,8 @@ class auth_admin_test extends UnitTestCase {
$this->assertEqual(auth_ismanager('jill', array('mötly böys'),false), true);
}
- function test_isadmin(){
+ function test_isadmin_insensitive(){
+ $this->setInSensitive();
global $conf;
$conf['superuser'] = 'john,@admin,doe,@roots';
@@ -54,6 +83,50 @@ class auth_admin_test extends UnitTestCase {
$this->assertEqual(auth_ismanager('doe', array('admin'),true), true);
}
+ function test_ismanager_sensitive(){
+ $this->setSensitive();
+ global $conf;
+ $conf['superuser'] = 'john,@admin,@Mötly Görls, Dörte';
+ $conf['manager'] = 'john,@managers,doe, @Mötly Böys, Dänny';
+
+ // anonymous user
+ $this->assertEqual(auth_ismanager('jill', null,false), false);
+
+ // admin or manager users
+ $this->assertEqual(auth_ismanager('john', null,false), true);
+ $this->assertEqual(auth_ismanager('doe', null,false), true);
+
+ $this->assertEqual(auth_ismanager('dörte', null,false), false);
+ $this->assertEqual(auth_ismanager('dänny', null,false), false);
+
+ // admin or manager groups
+ $this->assertEqual(auth_ismanager('jill', array('admin'),false), true);
+ $this->assertEqual(auth_ismanager('jill', array('managers'),false), true);
+
+ $this->assertEqual(auth_ismanager('jill', array('mötly görls'),false), false);
+ $this->assertEqual(auth_ismanager('jill', array('mötly böys'),false), false);
+ }
+
+ function test_isadmin_sensitive(){
+ $this->setSensitive();
+ global $conf;
+ $conf['superuser'] = 'john,@admin,doe,@roots';
+
+ // anonymous user
+ $this->assertEqual(auth_ismanager('jill', null,true), false);
+
+ // admin user
+ $this->assertEqual(auth_ismanager('john', null,true), true);
+ $this->assertEqual(auth_ismanager('Doe', null,true), false);
+
+ // admin groups
+ $this->assertEqual(auth_ismanager('jill', array('admin'),true), true);
+ $this->assertEqual(auth_ismanager('jill', array('roots'),true), true);
+ $this->assertEqual(auth_ismanager('john', array('admin'),true), true);
+ $this->assertEqual(auth_ismanager('doe', array('admin'),true), true);
+ $this->assertEqual(auth_ismanager('Doe', array('admin'),true), true);
+ }
+
}
//Setup VIM: ex: et ts=4 :
diff --git a/_test/cases/inc/auth_password.test.php b/_test/cases/inc/auth_password.test.php
index cb1cd5593..8646e3226 100644
--- a/_test/cases/inc/auth_password.test.php
+++ b/_test/cases/inc/auth_password.test.php
@@ -15,6 +15,11 @@ class auth_password_test extends UnitTestCase {
'crypt' => 'ablvoGr1hvZ5k',
'mysql' => '4a1fa3780bd6fd55',
'my411' => '*e5929347e25f82e19e4ebe92f1dc6b6e7c2dbd29',
+ 'kmd5' => 'a579299436d7969791189acadd86fcb716',
+ 'pmd5' => '$P$abcdefgh1RC6Fd32heUzl7EYCG9uGw.',
+ 'hmd5' => '$H$abcdefgh1ZbJodHxmeXVAhEzTG7IAp.',
+ 'djangomd5' => 'md5$abcde$d0fdddeda8cd92725d2b54148ac09158',
+ 'djangosha1' => 'sha1$abcde$c8e65a7f0acc9158843048a53dcc5a6bc4d17678',
);
@@ -22,7 +27,7 @@ class auth_password_test extends UnitTestCase {
foreach($this->passes as $method => $hash){
$info = "testing method $method";
$this->signal('failinfo',$info);
- $this->assertEqual(auth_cryptPassword('foo'.$method,$method,'abcdefgh'),$hash);
+ $this->assertEqual(auth_cryptPassword('foo'.$method,$method,'abcdefgh12345678912345678912345678'),$hash);
}
}
@@ -34,10 +39,25 @@ class auth_password_test extends UnitTestCase {
}
}
+ function test_verifySelf(){
+ foreach($this->passes as $method => $hash){
+ $info = "testing method $method";
+ $this->signal('failinfo',$info);
+
+ $hash = auth_cryptPassword('foo'.$method);
+ $this->assertTrue(auth_verifyPassword('foo'.$method,$hash));
+ }
+ }
+
function test_verifyPassword_nohash(){
$this->assertTrue(auth_verifyPassword('foo','$1$$n1rTiFE0nRifwV/43bVon/'));
}
+ function test_verifyPassword_fixedpmd5(){
+ $this->assertTrue(auth_verifyPassword('test12345','$P$9IQRaTwmfeRo7ud9Fh4E2PdI0S3r.L0'));
+ $this->assertTrue(auth_verifyPassword('test12345','$H$9IQRaTwmfeRo7ud9Fh4E2PdI0S3r.L0'));
+ }
+
}
//Setup VIM: ex: et ts=4 :
diff --git a/_test/cases/inc/init_getbaseurl.test.php b/_test/cases/inc/init_getbaseurl.test.php
index d9c76801f..a22172feb 100644
--- a/_test/cases/inc/init_getbaseurl.test.php
+++ b/_test/cases/inc/init_getbaseurl.test.php
@@ -275,6 +275,31 @@ class init_getBaseURL_test extends UnitTestCase {
$this->assertEqual(getBaseURL(true),$correct_result);
}
}
+
+ /**
+ * Absolute URL with IPv6 domain name.
+ * lighttpd, fastcgi
+ *
+ * data provided by Michael Hamann <michael@content-space.de>
+ */
+ function test12() {
+ global $conf;
+ $conf['basedir'] = '';
+ $conf['baseurl'] = '';
+ $conf['canonical'] = 0;
+
+ $_SERVER['DOCUMENT_ROOT'] = '/srv/http/';
+ $_SERVER['HTTP_HOST'] = '[fd00::6592:39ed:a2ed:2c78]';
+ $_SERVER['SCRIPT_FILENAME'] = '/srv/http/~michitux/dokuwiki/doku.php';
+ $_SERVER['REQUEST_URI'] = '/~michitux/dokuwiki/doku.php?do=debug';
+ $_SERVER['SCRIPT_NAME'] = '/~michitux/dokuwiki/doku.php';
+ $_SERVER['PATH_INFO'] = null;
+ $_SERVER['PATH_TRANSLATED'] = null;
+ $_SERVER['PHP_SELF'] = '/~michitux/dokuwiki/doku.php';
+ $_SERVER['SERVER_PORT'] = '80';
+ $_SERVER['SERVER_NAME'] = '[fd00';
+ $this->assertEqual(getBaseURL(true), 'http://[fd00::6592:39ed:a2ed:2c78]/~michitux/dokuwiki/');
+ }
}
//Setup VIM: ex: et ts=2 :
diff --git a/_test/cases/inc/mail_isvalid.test.php b/_test/cases/inc/mail_isvalid.test.php
index 4e047499f..d8c88765e 100644
--- a/_test/cases/inc/mail_isvalid.test.php
+++ b/_test/cases/inc/mail_isvalid.test.php
@@ -25,7 +25,8 @@ class mail_isvalid extends UnitTestCase {
$tests[] = array('bu[g]s@php.net1',false);
$tests[] = array('somebody@somewhere.museum',true);
$tests[] = array('somebody@somewhere.travel',true);
-
+ $tests[] = array('root@[2010:fb:fdac::311:2101]',true);
+ $tests[] = array('test@example', true); // we allow local addresses
// tests from http://code.google.com/p/php-email-address-validation/ below
@@ -62,7 +63,6 @@ class mail_isvalid extends UnitTestCase {
$tests[] = array('test@.org', false);
$tests[] = array('12345678901234567890123456789012345678901234567890123456789012345@example.com', false); // 64 characters is maximum length for local part. This is 65.
$tests[] = array('test@123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012.com', false); // 255 characters is maximum length for domain. This is 256.
- $tests[] = array('test@example', false);
$tests[] = array('test@[123.123.123.123', false);
$tests[] = array('test@123.123.123.123]', false);
diff --git a/_test/cases/inc/pageutils_getid.test.php b/_test/cases/inc/pageutils_getid.test.php
index 7fccc3a60..6eddeb5ea 100644
--- a/_test/cases/inc/pageutils_getid.test.php
+++ b/_test/cases/inc/pageutils_getid.test.php
@@ -99,7 +99,7 @@ class init_getID_test extends UnitTestCase {
$_SERVER['PATH_TRANSLATED'] = '/var/www/index.html';
$_SERVER['PHP_SELF'] = '/dokuwiki/doku.php/';
- $this->assertEqual(getID(), 'start');
+ $this->assertEqual(getID(), cleanID($conf['start']));
}
}
diff --git a/_test/cases/inc/pageutils_resolve_pageid.test.php b/_test/cases/inc/pageutils_resolve_pageid.test.php
index d9ea89869..c65ed1866 100644
--- a/_test/cases/inc/pageutils_resolve_pageid.test.php
+++ b/_test/cases/inc/pageutils_resolve_pageid.test.php
@@ -50,6 +50,10 @@ class init_resolve_pageid_test extends UnitTestCase {
$tests[] = array('foo','foo:','foo:start');
$tests[] = array('foo','playground:','playground:playground');
+ // empty $page
+ global $ID;
+ $ID = 'my:space';
+ $tests[] = array('my', '', 'my:space');
foreach($tests as $test){
$page = $test[1];
@@ -59,5 +63,23 @@ class init_resolve_pageid_test extends UnitTestCase {
}
}
+ /**
+ * Empty page on homepage should resolve to start page
+ */
+ function test_resolve_pageid_empty_homepage() {
+ global $ID;
+ $ID = '';
+
+ global $conf;
+ $conf['start'] = 'someverystrangestartname';
+
+ $ns = '';
+ $page = '';
+ $exist = true;
+
+ resolve_pageid($ns, $page, $exist);
+ $this->assertEqual($page, $conf['start']);
+ }
+
}
//Setup VIM: ex: et ts=4 :
diff --git a/_test/cases/inc/parser/parser_eol.test.php b/_test/cases/inc/parser/parser_eol.test.php
index 8d3a812b2..692882c6c 100644
--- a/_test/cases/inc/parser/parser_eol.test.php
+++ b/_test/cases/inc/parser/parser_eol.test.php
@@ -13,7 +13,7 @@ class TestOfDoku_Parser_Eol extends TestOfDoku_Parser {
$calls = array (
array('document_start',array()),
array('p_open',array()),
- array('cdata',array("Foo".DOKU_PARSER_EOL."Bar".DOKU_PARSER_EOL)),
+ array('cdata',array("Foo".DOKU_PARSER_EOL."Bar")),
array('p_close',array()),
array('document_end',array()),
);
@@ -29,7 +29,7 @@ class TestOfDoku_Parser_Eol extends TestOfDoku_Parser {
array('cdata',array("Foo")),
array('p_close',array()),
array('p_open',array()),
- array('cdata',array("bar".DOKU_PARSER_EOL."Foo".DOKU_PARSER_EOL)),
+ array('cdata',array("bar".DOKU_PARSER_EOL."Foo")),
array('p_close',array()),
array('document_end',array()),
);
@@ -42,7 +42,7 @@ class TestOfDoku_Parser_Eol extends TestOfDoku_Parser {
$calls = array (
array('document_start',array()),
array('p_open',array()),
- array('cdata',array("Foo".DOKU_PARSER_EOL."Bar".DOKU_PARSER_EOL)),
+ array('cdata',array("Foo".DOKU_PARSER_EOL."Bar")),
array('p_close',array()),
array('document_end',array()),
);
@@ -57,7 +57,7 @@ class TestOfDoku_Parser_Eol extends TestOfDoku_Parser {
array('p_open',array()),
array('cdata',array("\nFoo")),
array('linebreak',array()),
- array('cdata',array("Bar\n")),
+ array('cdata',array("Bar")),
array('p_close',array()),
array('document_end',array()),
);
@@ -76,7 +76,7 @@ class TestOfDoku_Parser_Eol extends TestOfDoku_Parser {
array('linebreak',array()),
array('p_close',array()),
array('p_open',array()),
- array('cdata',array("Bar".DOKU_PARSER_EOL)),
+ array('cdata',array("Bar")),
array('p_close',array()),
array('document_end',array()),
);
@@ -89,7 +89,7 @@ class TestOfDoku_Parser_Eol extends TestOfDoku_Parser {
$calls = array (
array('document_start',array()),
array('p_open',array()),
- array('cdata',array("\n".'Foo\\\\Bar'."\n")),
+ array('cdata',array("\n".'Foo\\\\Bar')),
array('p_close',array()),
array('document_end',array()),
);
diff --git a/_test/cases/inc/parser/parser_footnote.test.php b/_test/cases/inc/parser/parser_footnote.test.php
index a1da2ab06..e3571d8e7 100644
--- a/_test/cases/inc/parser/parser_footnote.test.php
+++ b/_test/cases/inc/parser/parser_footnote.test.php
@@ -23,7 +23,7 @@ class TestOfDoku_Parser_Footnote extends TestOfDoku_Parser {
array('cdata',array(' testing ')),
array('footnote_close',array()),
))),
- array('cdata',array(' Bar'."\n")),
+ array('cdata',array(' Bar')),
array('p_close',array()),
array('document_end',array()),
);
@@ -35,7 +35,7 @@ class TestOfDoku_Parser_Footnote extends TestOfDoku_Parser {
$calls = array (
array('document_start',array()),
array('p_open',array()),
- array('cdata',array("\nFoo (( testing\n Bar\n")),
+ array('cdata',array("\nFoo (( testing\n Bar")),
array('p_close',array()),
array('document_end',array()),
);
@@ -54,7 +54,7 @@ class TestOfDoku_Parser_Footnote extends TestOfDoku_Parser {
array('cdata',array(" testing\ntesting ")),
array('footnote_close',array()),
))),
- array('cdata',array(' Bar'.DOKU_PARSER_EOL)),
+ array('cdata',array(' Bar')),
array('p_close',array()),
array('document_end',array()),
);
@@ -72,7 +72,7 @@ class TestOfDoku_Parser_Footnote extends TestOfDoku_Parser {
array('cdata',array(' x((y')),
array('footnote_close',array()),
))),
- array('cdata',array('z )) Bar'."\n")),
+ array('cdata',array('z )) Bar')),
array('p_close',array()),
array('document_end',array()),
);
@@ -91,7 +91,7 @@ class TestOfDoku_Parser_Footnote extends TestOfDoku_Parser {
array('cdata',array(" test\ning ")),
array('footnote_close',array()),
))),
- array('cdata',array('Y'.DOKU_PARSER_EOL.' Bar'.DOKU_PARSER_EOL)),
+ array('cdata',array('Y'.DOKU_PARSER_EOL.' Bar')),
array('p_close',array()),
array('document_end',array()),
);
@@ -114,7 +114,7 @@ class TestOfDoku_Parser_Footnote extends TestOfDoku_Parser {
array('cdata',array(' ')),
array('footnote_close',array()),
))),
- array('cdata',array(' Bar'."\n")),
+ array('cdata',array(' Bar')),
array('p_close',array()),
array('document_end',array()),
);
@@ -135,7 +135,7 @@ class TestOfDoku_Parser_Footnote extends TestOfDoku_Parser {
array('cdata',array("\n ")),
array('footnote_close',array()),
))),
- array('cdata',array(' Bar'."\n")),
+ array('cdata',array(' Bar')),
array('p_close',array()),
array('document_end',array()),
);
@@ -156,7 +156,7 @@ class TestOfDoku_Parser_Footnote extends TestOfDoku_Parser {
array('cdata',array(' ')),
array('footnote_close',array()),
))),
- array('cdata',array(' Bar'."\n")),
+ array('cdata',array(' Bar')),
array('p_close',array()),
array('document_end',array()),
);
@@ -177,7 +177,7 @@ class TestOfDoku_Parser_Footnote extends TestOfDoku_Parser {
array('cdata',array(' ')),
array('footnote_close',array()),
))),
- array('cdata',array(' Bar'."\n")),
+ array('cdata',array(' Bar')),
array('p_close',array()),
array('document_end',array()),
);
@@ -199,7 +199,7 @@ class TestOfDoku_Parser_Footnote extends TestOfDoku_Parser {
array('cdata',array(' ')),
array('footnote_close',array()),
))),
- array('cdata',array(' Bar'.DOKU_PARSER_EOL)),
+ array('cdata',array(' Bar')),
array('p_close',array()),
array('document_end',array()),
);
@@ -221,7 +221,7 @@ class TestOfDoku_Parser_Footnote extends TestOfDoku_Parser {
array('cdata',array(' ')),
array('footnote_close',array()),
))),
- array('cdata',array(' Bar'."\n")),
+ array('cdata',array(' Bar')),
array('p_close',array()),
array('document_end',array()),
);
@@ -240,7 +240,7 @@ class TestOfDoku_Parser_Footnote extends TestOfDoku_Parser {
array('cdata',array(" \n====Test====\n ")),
array('footnote_close',array()),
))),
- array('cdata',array(' Bar'."\n")),
+ array('cdata',array(' Bar')),
array('p_close',array()),
array('document_end',array()),
);
@@ -286,7 +286,7 @@ class TestOfDoku_Parser_Footnote extends TestOfDoku_Parser {
array('cdata',array(' ')),
array('footnote_close',array()),
))),
- array('cdata',array(' Bar'."\n")),
+ array('cdata',array(' Bar')),
array('p_close',array()),
array('document_end',array()),
);
@@ -328,7 +328,7 @@ class TestOfDoku_Parser_Footnote extends TestOfDoku_Parser {
array('cdata',array(' ')),
array('footnote_close',array()),
))),
- array('cdata',array(' Bar'."\n")),
+ array('cdata',array(' Bar')),
array('p_close',array()),
array('document_end',array()),
);
@@ -356,7 +356,7 @@ class TestOfDoku_Parser_Footnote extends TestOfDoku_Parser {
array('cdata',array(' ')),
array('footnote_close',array()),
))),
- array('cdata',array(' Bar'."\n")),
+ array('cdata',array(' Bar')),
array('p_close',array()),
array('document_end',array()),
);
@@ -381,7 +381,7 @@ class TestOfDoku_Parser_Footnote extends TestOfDoku_Parser {
))),
array('cdata',array(" ")),
array('strong_close',array()),
- array('cdata',array(" c ))\n")),
+ array('cdata',array(" c ))")),
array('p_close',array()),
array('document_end',array()),
);
diff --git a/_test/cases/inc/parser/parser_formatting.test.php b/_test/cases/inc/parser/parser_formatting.test.php
index f2eda81b8..69c57dfb5 100644
--- a/_test/cases/inc/parser/parser_formatting.test.php
+++ b/_test/cases/inc/parser/parser_formatting.test.php
@@ -17,7 +17,7 @@ class TestOfDoku_Parser_Formatting extends TestOfDoku_Parser {
array('strong_open',array()),
array('cdata',array('bar')),
array('strong_close',array()),
- array('cdata',array(' def'."\n")),
+ array('cdata',array(' def')),
array('p_close',array()),
array('document_end',array()),
);
@@ -30,7 +30,7 @@ class TestOfDoku_Parser_Formatting extends TestOfDoku_Parser {
$calls = array (
array('document_start',array()),
array('p_open',array()),
- array('cdata',array("\nabc **bar def\n")),
+ array('cdata',array("\nabc **bar def")),
array('p_close',array()),
array('document_end',array()),
);
@@ -47,7 +47,7 @@ class TestOfDoku_Parser_Formatting extends TestOfDoku_Parser {
array('emphasis_open',array()),
array('cdata',array('bar')),
array('emphasis_close',array()),
- array('cdata',array(' def'."\n")),
+ array('cdata',array(' def')),
array('p_close',array()),
array('document_end',array()),
);
@@ -64,7 +64,7 @@ class TestOfDoku_Parser_Formatting extends TestOfDoku_Parser {
array('emphasis_open',array()),
array('cdata',array('Тест: ')),
array('emphasis_close',array()),
- array('cdata',array(' def'."\n")),
+ array('cdata',array(' def')),
array('p_close',array()),
array('document_end',array()),
);
@@ -81,7 +81,7 @@ class TestOfDoku_Parser_Formatting extends TestOfDoku_Parser {
array('emphasis_open',array()),
array('cdata',array('b')),
array('emphasis_close',array()),
- array('cdata',array(' def'."\n")),
+ array('cdata',array(' def')),
array('p_close',array()),
array('document_end',array()),
);
@@ -98,7 +98,7 @@ class TestOfDoku_Parser_Formatting extends TestOfDoku_Parser {
array('emphasis_open',array()),
array('cdata',array('foo:')),
array('emphasis_close',array()),
- array('cdata',array(' bar// def'."\n")),
+ array('cdata',array(' bar// def')),
array('p_close',array()),
array('document_end',array()),
);
@@ -118,7 +118,7 @@ class TestOfDoku_Parser_Formatting extends TestOfDoku_Parser {
array('externallink',array('http://www.google.com', NULL)),
array('cdata',array(' bar')),
array('emphasis_close',array()),
- array('cdata',array(' def'."\n")),
+ array('cdata',array(' def')),
array('p_close',array()),
array('document_end',array()),
);
@@ -131,7 +131,7 @@ class TestOfDoku_Parser_Formatting extends TestOfDoku_Parser {
$calls = array (
array('document_start',array()),
array('p_open',array()),
- array('cdata',array("\nabc //bar def\n")),
+ array('cdata',array("\nabc //bar def")),
array('p_close',array()),
array('document_end',array()),
);
@@ -148,7 +148,7 @@ class TestOfDoku_Parser_Formatting extends TestOfDoku_Parser {
array('emphasis_open',array()),
array('cdata',array('bar')),
array('emphasis_close',array()),
- array('cdata',array(' def'."\n")),
+ array('cdata',array(' def')),
array('p_close',array()),
array('document_end',array()),
);
@@ -161,7 +161,7 @@ class TestOfDoku_Parser_Formatting extends TestOfDoku_Parser {
$calls = array (
array('document_start',array()),
array('p_open',array()),
- array('cdata',array("\nabc //http:// def\n")),
+ array('cdata',array("\nabc //http:// def")),
array('p_close',array()),
array('document_end',array()),
);
@@ -185,7 +185,7 @@ class TestOfDoku_Parser_Formatting extends TestOfDoku_Parser {
array('emphasis_open',array()),
array('cdata',array('text:')),
array('emphasis_close',array()),
- array('cdata',array(" another Blablabla Blablabla\n")),
+ array('cdata',array(" another Blablabla Blablabla")),
array('p_close',array()),
array('document_end',array()),
);
@@ -203,7 +203,7 @@ class TestOfDoku_Parser_Formatting extends TestOfDoku_Parser {
array('emphasis_open',array()),
array('cdata',array('Тест:')),
array('emphasis_close',array()),
- array('cdata',array("\n")),
+ array('cdata', array('')),
array('p_close',array()),
array('document_end',array()),
);
@@ -248,7 +248,7 @@ class TestOfDoku_Parser_Formatting extends TestOfDoku_Parser {
array('underline_open',array()),
array('cdata',array('bar')),
array('underline_close',array()),
- array('cdata',array(' def'."\n")),
+ array('cdata',array(' def')),
array('p_close',array()),
array('document_end',array()),
);
@@ -261,7 +261,7 @@ class TestOfDoku_Parser_Formatting extends TestOfDoku_Parser {
$calls = array (
array('document_start',array()),
array('p_open',array()),
- array('cdata',array("\nabc __bar def\n")),
+ array('cdata',array("\nabc __bar def")),
array('p_close',array()),
array('document_end',array()),
);
@@ -278,7 +278,7 @@ class TestOfDoku_Parser_Formatting extends TestOfDoku_Parser {
array('monospace_open',array()),
array('cdata',array('bar')),
array('monospace_close',array()),
- array('cdata',array(' def'."\n")),
+ array('cdata',array(' def')),
array('p_close',array()),
array('document_end',array()),
);
@@ -291,7 +291,7 @@ class TestOfDoku_Parser_Formatting extends TestOfDoku_Parser {
$calls = array (
array('document_start',array()),
array('p_open',array()),
- array('cdata',array("\nabc ''bar def\n")),
+ array('cdata',array("\nabc ''bar def")),
array('p_close',array()),
array('document_end',array()),
);
@@ -308,7 +308,7 @@ class TestOfDoku_Parser_Formatting extends TestOfDoku_Parser {
array('subscript_open',array()),
array('cdata',array('bar')),
array('subscript_close',array()),
- array('cdata',array(' def'."\n")),
+ array('cdata',array(' def')),
array('p_close',array()),
array('document_end',array()),
);
@@ -321,7 +321,7 @@ class TestOfDoku_Parser_Formatting extends TestOfDoku_Parser {
$calls = array (
array('document_start',array()),
array('p_open',array()),
- array('cdata',array("\nabc <sub>bar def\n")),
+ array('cdata',array("\nabc <sub>bar def")),
array('p_close',array()),
array('document_end',array()),
);
@@ -338,7 +338,7 @@ class TestOfDoku_Parser_Formatting extends TestOfDoku_Parser {
array('superscript_open',array()),
array('cdata',array('bar')),
array('superscript_close',array()),
- array('cdata',array(' def'."\n")),
+ array('cdata',array(' def')),
array('p_close',array()),
array('document_end',array()),
);
@@ -351,7 +351,7 @@ class TestOfDoku_Parser_Formatting extends TestOfDoku_Parser {
$calls = array (
array('document_start',array()),
array('p_open',array()),
- array('cdata',array("\nabc <sup>bar def\n")),
+ array('cdata',array("\nabc <sup>bar def")),
array('p_close',array()),
array('document_end',array()),
);
@@ -368,7 +368,7 @@ class TestOfDoku_Parser_Formatting extends TestOfDoku_Parser {
array('deleted_open',array()),
array('cdata',array('bar')),
array('deleted_close',array()),
- array('cdata',array(' def'."\n")),
+ array('cdata',array(' def')),
array('p_close',array()),
array('document_end',array()),
);
@@ -381,7 +381,7 @@ class TestOfDoku_Parser_Formatting extends TestOfDoku_Parser {
$calls = array (
array('document_start',array()),
array('p_open',array()),
- array('cdata',array("\nabc <del>bar def\n")),
+ array('cdata',array("\nabc <del>bar def")),
array('p_close',array()),
array('document_end',array()),
);
@@ -403,7 +403,7 @@ class TestOfDoku_Parser_Formatting extends TestOfDoku_Parser {
array('emphasis_close',array()),
array('cdata',array('c')),
array('strong_close',array()),
- array('cdata',array(' def'."\n")),
+ array('cdata',array(' def')),
array('p_close',array()),
array('document_end',array()),
);
@@ -424,7 +424,7 @@ class TestOfDoku_Parser_Formatting extends TestOfDoku_Parser {
array('strong_open',array()),
array('cdata',array('c')),
array('strong_close',array()),
- array('cdata',array(' def'."\n")),
+ array('cdata',array(' def')),
array('p_close',array()),
array('document_end',array()),
);
diff --git a/_test/cases/inc/parser/parser_headers.test.php b/_test/cases/inc/parser/parser_headers.test.php
index e1c6783f5..688bac2eb 100644
--- a/_test/cases/inc/parser/parser_headers.test.php
+++ b/_test/cases/inc/parser/parser_headers.test.php
@@ -13,12 +13,12 @@ class TestOfDoku_Parser_Headers extends TestOfDoku_Parser {
$calls = array (
array('document_start',array()),
array('p_open',array()),
- array('cdata',array("\nabc \n")),
+ array('cdata',array("\nabc ")),
array('p_close',array()),
array('header',array('Header',1,6)),
array('section_open',array(1)),
array('p_open',array()),
- array('cdata',array("\n def\n")),
+ array('cdata',array("\n def")),
array('p_close',array()),
array('section_close',array()),
array('document_end',array()),
@@ -32,12 +32,12 @@ class TestOfDoku_Parser_Headers extends TestOfDoku_Parser {
$calls = array (
array('document_start',array()),
array('p_open',array()),
- array('cdata',array("\nabc \n")),
+ array('cdata',array("\nabc ")),
array('p_close',array()),
array('header',array('Header',2,6)),
array('section_open',array(2)),
array('p_open',array()),
- array('cdata',array("\n def\n")),
+ array('cdata',array("\n def")),
array('p_close',array()),
array('section_close',array()),
array('document_end',array()),
@@ -51,12 +51,12 @@ class TestOfDoku_Parser_Headers extends TestOfDoku_Parser {
$calls = array (
array('document_start',array()),
array('p_open',array()),
- array('cdata',array("\nabc \n")),
+ array('cdata',array("\nabc ")),
array('p_close',array()),
array('header',array('Header',3,6)),
array('section_open',array(3)),
array('p_open',array()),
- array('cdata',array("\n def\n")),
+ array('cdata',array("\n def")),
array('p_close',array()),
array('section_close',array()),
array('document_end',array()),
@@ -70,12 +70,12 @@ class TestOfDoku_Parser_Headers extends TestOfDoku_Parser {
$calls = array (
array('document_start',array()),
array('p_open',array()),
- array('cdata',array("\nabc \n")),
+ array('cdata',array("\nabc ")),
array('p_close',array()),
array('header',array('Header',4,6)),
array('section_open',array(4)),
array('p_open',array()),
- array('cdata',array("\n def\n")),
+ array('cdata',array("\n def")),
array('p_close',array()),
array('section_close',array()),
array('document_end',array()),
@@ -89,12 +89,12 @@ class TestOfDoku_Parser_Headers extends TestOfDoku_Parser {
$calls = array (
array('document_start',array()),
array('p_open',array()),
- array('cdata',array("\nabc \n")),
+ array('cdata',array("\nabc ")),
array('p_close',array()),
array('header',array('Header',5,6)),
array('section_open',array(5)),
array('p_open',array()),
- array('cdata',array("\n def\n")),
+ array('cdata',array("\n def")),
array('p_close',array()),
array('section_close',array()),
array('document_end',array()),
@@ -108,12 +108,12 @@ class TestOfDoku_Parser_Headers extends TestOfDoku_Parser {
$calls = array (
array('document_start',array()),
array('p_open',array()),
- array('cdata',array("\nabc \n")),
+ array('cdata',array("\nabc ")),
array('p_close',array()),
array('header',array('Header',2,6)),
array('section_open',array(2)),
array('p_open',array()),
- array('cdata',array("\n def\n")),
+ array('cdata',array("\n def")),
array('p_close',array()),
array('section_close',array()),
array('document_end',array()),
@@ -127,12 +127,12 @@ class TestOfDoku_Parser_Headers extends TestOfDoku_Parser {
$calls = array (
array('document_start',array()),
array('p_open',array()),
- array('cdata',array("\nabc \n")),
+ array('cdata',array("\nabc ")),
array('p_close',array()),
array('header',array('Header',2,6)),
array('section_open',array(2)),
array('p_open',array()),
- array('cdata',array("\n def\n")),
+ array('cdata',array("\n def")),
array('p_close',array()),
array('section_close',array()),
array('document_end',array()),
@@ -146,12 +146,12 @@ class TestOfDoku_Parser_Headers extends TestOfDoku_Parser {
$calls = array (
array('document_start',array()),
array('p_open',array()),
- array('cdata',array("\nabc \n")),
+ array('cdata',array("\nabc ")),
array('p_close',array()),
array('header',array('Header',1,6)),
array('section_open',array(1)),
array('p_open',array()),
- array('cdata',array("\n def\n")),
+ array('cdata',array("\n def")),
array('p_close',array()),
array('section_close',array()),
array('document_end',array()),
@@ -165,7 +165,7 @@ class TestOfDoku_Parser_Headers extends TestOfDoku_Parser {
$calls = array (
array('document_start',array()),
array('p_open',array()),
- array('cdata',array("\nabc \n= Header =\n def\n")),
+ array('cdata',array("\nabc \n= Header =\n def")),
array('p_close',array()),
array('document_end',array()),
);
@@ -179,12 +179,12 @@ class TestOfDoku_Parser_Headers extends TestOfDoku_Parser {
$calls = array (
array('document_start',array()),
array('p_open',array()),
- array('cdata',array("\nabc \n")),
+ array('cdata',array("\nabc ")),
array('p_close',array()),
array('header',array('== Header ==',1,6)),
array('section_open',array(1)),
array('p_open',array()),
- array('cdata',array("\n def\n")),
+ array('cdata',array("\n def")),
array('p_close',array()),
array('section_close',array()),
array('document_end',array()),
@@ -198,12 +198,12 @@ class TestOfDoku_Parser_Headers extends TestOfDoku_Parser {
$calls = array (
array('document_start',array()),
array('p_open',array()),
- array('cdata',array("\nabc \n")),
+ array('cdata',array("\nabc ")),
array('p_close',array()),
array('header',array('====== Header ======',5,6)),
array('section_open',array(5)),
array('p_open',array()),
- array('cdata',array("\n def\n")),
+ array('cdata',array("\n def")),
array('p_close',array()),
array('section_close',array()),
array('document_end',array()),
@@ -217,12 +217,12 @@ class TestOfDoku_Parser_Headers extends TestOfDoku_Parser {
$calls = array (
array('document_start',array()),
array('p_open',array()),
- array('cdata',array("\nabc \n== ====== Header\n")),
+ array('cdata',array("\nabc \n== ====== Header")),
array('p_close',array()),
array('header',array('',1,23)),
array('section_open',array(1)),
array('p_open',array()),
- array('cdata',array("\n def\n")),
+ array('cdata',array("\n def")),
array('p_close',array()),
array('section_close',array()),
array('document_end',array()),
@@ -243,12 +243,12 @@ class TestOfDoku_Parser_Headers extends TestOfDoku_Parser {
$calls = array (
array('document_start',array()),
array('p_open',array()),
- array('cdata',array('abc '.DOKU_PARSER_EOL)),
+ array('cdata',array('abc ')),
array('p_close',array()),
array('header',array('Header',1, 6)),
array('section_open',array(1)),
array('p_open',array()),
- array('cdata',array(' def'.DOKU_PARSER_EOL)),
+ array('cdata',array(' def')),
array('p_close',array()),
array('section_close',array()),
array('document_end',array()),
@@ -263,18 +263,18 @@ class TestOfDoku_Parser_Headers extends TestOfDoku_Parser {
$calls = array (
array('document_start',array()),
array('p_open',array()),
- array('cdata',array("\nabc \n")),
+ array('cdata',array("\nabc ")),
array('p_close',array()),
array('header',array('Header',1,6)),
array('section_open',array(1)),
array('p_open',array()),
- array('cdata',array("\n def abc \n")),
+ array('cdata',array("\n def abc ")),
array('p_close',array()),
array('section_close',array()),
array('header',array('Header2',2,39)),
array('section_open',array(2)),
array('p_open',array()),
- array('cdata',array("\n def\n")),
+ array('cdata',array("\n def")),
array('p_close',array()),
array('section_close',array()),
array('document_end',array())
diff --git a/_test/cases/inc/parser/parser_i18n.test.php b/_test/cases/inc/parser/parser_i18n.test.php
index f0cceb69e..27ec3c78b 100644
--- a/_test/cases/inc/parser/parser_i18n.test.php
+++ b/_test/cases/inc/parser/parser_i18n.test.php
@@ -47,7 +47,7 @@ class TestOfDoku_Parser_i18n extends TestOfDoku_Parser {
array('deleted_open',array()),
array('cdata',array('æ')),
array('deleted_close',array()),
- array('cdata',array("tiøn\n")),
+ array('cdata',array("tiøn")),
array('p_close',array()),
array('document_end',array()),
);
@@ -60,12 +60,12 @@ class TestOfDoku_Parser_i18n extends TestOfDoku_Parser {
$calls = array (
array('document_start',array()),
array('p_open',array()),
- array('cdata',array("\nFoo\n")),
+ array('cdata',array("\nFoo")),
array('p_close',array()),
array('header',array('Iñtërnâtiônàlizætiøn',3,5)),
array('section_open',array(3)),
array('p_open',array()),
- array('cdata',array("\n Bar\n")),
+ array('cdata',array("\n Bar")),
array('p_close',array()),
array('section_close',array()),
array('document_end',array()),
@@ -110,7 +110,7 @@ def');
array('tablerow_close',array()),
array('table_close',array(153)),
array('p_open',array()),
- array('cdata',array('def'."\n")),
+ array('cdata',array('def')),
array('p_close',array()),
array('document_end',array()),
);
@@ -126,7 +126,7 @@ def');
array('p_open',array()),
array('cdata',array("\nFoo ")),
array('acronym',array('Iñtërnâtiônàlizætiøn')),
- array('cdata',array(" Bar\n")),
+ array('cdata',array(" Bar")),
array('p_close',array()),
array('document_end',array()),
);
@@ -141,7 +141,7 @@ def');
array('p_open',array()),
array('cdata',array("\n".'Foo ')),
array('interwikilink',array('wp>Iñtërnâtiônàlizætiøn','Iñtërnâtiônàlizætiøn','wp','Iñtërnâtiônàlizætiøn')),
- array('cdata',array(' Bar'."\n")),
+ array('cdata',array(' Bar')),
array('p_close',array()),
array('document_end',array()),
);
@@ -156,7 +156,7 @@ def');
array('p_open',array()),
array('cdata',array("\n".'Foo ')),
array('internallink',array('x:Iñtërnâtiônàlizætiøn:y:foo_bar:z','Iñtërnâtiônàlizætiøn')),
- array('cdata',array(' Bar'."\n")),
+ array('cdata',array(' Bar')),
array('p_close',array()),
array('document_end',array()),
);
diff --git a/_test/cases/inc/parser/parser_links.test.php b/_test/cases/inc/parser/parser_links.test.php
index 62e3b3b99..53871e110 100644
--- a/_test/cases/inc/parser/parser_links.test.php
+++ b/_test/cases/inc/parser/parser_links.test.php
@@ -16,7 +16,7 @@ class TestOfDoku_Parser_Links extends TestOfDoku_Parser {
array('p_open',array()),
array('cdata',array("\n".'Foo ')),
array('externallink',array('http://www.google.com', NULL)),
- array('cdata',array(' Bar'."\n")),
+ array('cdata',array(' Bar')),
array('p_close',array()),
array('document_end',array()),
);
@@ -31,20 +31,100 @@ class TestOfDoku_Parser_Links extends TestOfDoku_Parser {
array('p_open',array()),
array('cdata',array("\n".'Foo ')),
array('externallink',array('HTTP://WWW.GOOGLE.COM', NULL)),
- array('cdata',array(' Bar'."\n")),
+ array('cdata',array(' Bar')),
array('p_close',array()),
array('document_end',array()),
);
$this->assertEqual(array_map('stripByteIndex',$this->H->calls),$calls);
}
+ function testExternalIPv4() {
+ $this->P->addMode('externallink',new Doku_Parser_Mode_ExternalLink());
+ $this->P->parse("Foo http://123.123.3.21/foo Bar");
+ $calls = array (
+ array('document_start',array()),
+ array('p_open',array()),
+ array('cdata',array("\n".'Foo ')),
+ array('externallink',array('http://123.123.3.21/foo', NULL)),
+ array('cdata',array(' Bar')),
+ array('p_close',array()),
+ array('document_end',array()),
+ );
+ $this->assertEqual(array_map('stripByteIndex',$this->H->calls),$calls);
+ }
+
+ function testExternalIPv6() {
+ $this->P->addMode('externallink',new Doku_Parser_Mode_ExternalLink());
+ $this->P->parse("Foo http://[3ffe:2a00:100:7031::1]/foo Bar");
+ $calls = array (
+ array('document_start',array()),
+ array('p_open',array()),
+ array('cdata',array("\n".'Foo ')),
+ array('externallink',array('http://[3ffe:2a00:100:7031::1]/foo', NULL)),
+ array('cdata',array(' Bar')),
+ array('p_close',array()),
+ array('document_end',array()),
+ );
+ $this->assertEqual(array_map('stripByteIndex',$this->H->calls),$calls);
+ }
+
+ function testExternalMulti(){
+ $this->teardown();
+
+ $links = array(
+ 'http://www.google.com',
+ 'HTTP://WWW.GOOGLE.COM',
+ 'http://[FEDC:BA98:7654:3210:FEDC:BA98:7654:3210]:80/index.html',
+ 'http://[1080:0:0:0:8:800:200C:417A]/index.html',
+ 'http://[3ffe:2a00:100:7031::1]',
+ 'http://[1080::8:800:200C:417A]/foo',
+ 'http://[::192.9.5.5]/ipng',
+ 'http://[::FFFF:129.144.52.38]:80/index.html',
+ 'http://[2010:836B:4179::836B:4179]',
+ );
+ $titles = array(false,null,'foo bar');
+ foreach($links as $link){
+ foreach($titles as $title){
+ if($title === false){
+ $source = $link;
+ $name = null;
+ }elseif($title === null){
+ $source = "[[$link]]";
+ $name = null;
+ }else{
+ $source = "[[$link|$title]]";
+ $name = $title;
+ }
+ $this->signal('failinfo',$source);
+
+ $this->setup();
+ $this->P->addMode('internallink',new Doku_Parser_Mode_InternalLink());
+ $this->P->addMode('externallink',new Doku_Parser_Mode_ExternalLink());
+ $this->P->parse("Foo $source Bar");
+ $calls = array (
+ array('document_start',array()),
+ array('p_open',array()),
+ array('cdata',array("\n".'Foo ')),
+ array('externallink',array($link, $name)),
+ array('cdata',array(' Bar')),
+ array('p_close',array()),
+ array('document_end',array()),
+ );
+ $this->assertEqual(array_map('stripByteIndex',$this->H->calls),$calls);
+ $this->teardown();
+ }
+ }
+
+ $this->setup();
+ }
+
function testExternalLinkJavascript() {
$this->P->addMode('externallink',new Doku_Parser_Mode_ExternalLink());
$this->P->parse("Foo javascript:alert('XSS'); Bar");
$calls = array (
array('document_start',array()),
array('p_open',array()),
- array('cdata',array("\nFoo javascript:alert('XSS'); Bar\n")),
+ array('cdata',array("\nFoo javascript:alert('XSS'); Bar")),
array('p_close',array()),
array('document_end',array()),
);
@@ -59,7 +139,7 @@ class TestOfDoku_Parser_Links extends TestOfDoku_Parser {
array('p_open',array()),
array('cdata',array("\n".'Foo ')),
array('externallink',array('http://www.google.com', 'www.google.com')),
- array('cdata',array(' Bar'."\n")),
+ array('cdata',array(' Bar')),
array('p_close',array()),
array('document_end',array()),
);
@@ -74,15 +154,13 @@ class TestOfDoku_Parser_Links extends TestOfDoku_Parser {
array('p_open',array()),
array('cdata',array("\n".'Foo ')),
array('externallink',array('ftp://ftp.sunsite.com', 'ftp.sunsite.com')),
- array('cdata',array(' Bar'."\n")),
+ array('cdata',array(' Bar')),
array('p_close',array()),
array('document_end',array()),
);
$this->assertEqual(array_map('stripByteIndex',$this->H->calls),$calls);
}
function testEmail() {
-/* $this->fail('The emaillink mode seems to cause php 5.0.5 to segfault');
- return; //FIXME: is this still true?*/
$this->P->addMode('emaillink',new Doku_Parser_Mode_Emaillink());
$this->P->parse("Foo <bugs@php.net> Bar");
$calls = array (
@@ -90,7 +168,7 @@ class TestOfDoku_Parser_Links extends TestOfDoku_Parser {
array('p_open',array()),
array('cdata',array("\n".'Foo ')),
array('emaillink',array('bugs@php.net', NULL)),
- array('cdata',array(' Bar'."\n")),
+ array('cdata',array(' Bar')),
array('p_close',array()),
array('document_end',array()),
);
@@ -105,7 +183,7 @@ class TestOfDoku_Parser_Links extends TestOfDoku_Parser {
array('p_open',array()),
array('cdata',array("\n".'Foo ')),
array('emaillink',array("~fix+bug's.for/ev{e}r@php.net", NULL)),
- array('cdata',array(' Bar'."\n")),
+ array('cdata',array(' Bar')),
array('p_close',array()),
array('document_end',array()),
);
@@ -120,7 +198,7 @@ class TestOfDoku_Parser_Links extends TestOfDoku_Parser {
array('p_open',array()),
array('cdata',array("\n".'Foo ')),
array('emaillink',array('bugs@pHp.net', NULL)),
- array('cdata',array(' Bar'."\n")),
+ array('cdata',array(' Bar')),
array('p_close',array()),
array('document_end',array()),
);
@@ -136,7 +214,22 @@ class TestOfDoku_Parser_Links extends TestOfDoku_Parser {
array('p_open',array()),
array('cdata',array("\n".'Foo ')),
array('internallink',array('l',NULL)),
- array('cdata',array(' Bar'."\n")),
+ array('cdata',array(' Bar')),
+ array('p_close',array()),
+ array('document_end',array()),
+ );
+ $this->assertEqual(array_map('stripByteIndex',$this->H->calls),$calls);
+ }
+
+ function testInternalLinkNoChar() {
+ $this->P->addMode('internallink',new Doku_Parser_Mode_InternalLink());
+ $this->P->parse("Foo [[]] Bar");
+ $calls = array (
+ array('document_start',array()),
+ array('p_open',array()),
+ array('cdata',array("\n".'Foo ')),
+ array('internallink',array('',NULL)),
+ array('cdata',array(' Bar')),
array('p_close',array()),
array('document_end',array()),
);
@@ -151,7 +244,7 @@ class TestOfDoku_Parser_Links extends TestOfDoku_Parser {
array('p_open',array()),
array('cdata',array("\n".'Foo ')),
array('internallink',array('foo:bar',NULL)),
- array('cdata',array(' Bar'."\n")),
+ array('cdata',array(' Bar')),
array('p_close',array()),
array('document_end',array()),
);
@@ -166,7 +259,7 @@ class TestOfDoku_Parser_Links extends TestOfDoku_Parser {
array('p_open',array()),
array('cdata',array("\n".'Foo ')),
array('internallink',array('x:1:y:foo_bar:z','Test')),
- array('cdata',array(' Bar'."\n")),
+ array('cdata',array(' Bar')),
array('p_close',array()),
array('document_end',array()),
);
@@ -181,7 +274,7 @@ class TestOfDoku_Parser_Links extends TestOfDoku_Parser {
array('p_open',array()),
array('cdata',array("\n".'Foo ')),
array('internallink',array('wiki:syntax#internal','Syntax')),
- array('cdata',array(' Bar'."\n")),
+ array('cdata',array(' Bar')),
array('p_close',array()),
array('document_end',array()),
);
@@ -196,7 +289,7 @@ class TestOfDoku_Parser_Links extends TestOfDoku_Parser {
array('p_open',array()),
array('cdata',array("\n".'Foo ')),
array('externallink',array('http://www.google.com','Google')),
- array('cdata',array(' Bar'."\n")),
+ array('cdata',array(' Bar')),
array('p_close',array()),
array('document_end',array()),
);
@@ -211,7 +304,7 @@ class TestOfDoku_Parser_Links extends TestOfDoku_Parser {
array('p_open',array()),
array('cdata',array("\n".'Foo ')),
array('interwikilink',array('iw>somepage','Some Page','iw','somepage')),
- array('cdata',array(' Bar'."\n")),
+ array('cdata',array(' Bar')),
array('p_close',array()),
array('document_end',array()),
);
@@ -226,7 +319,7 @@ class TestOfDoku_Parser_Links extends TestOfDoku_Parser {
array('p_open',array()),
array('cdata',array("\n".'Foo ')),
array('interwikilink',array('IW>somepage','Some Page','iw','somepage')),
- array('cdata',array(' Bar'."\n")),
+ array('cdata',array(' Bar')),
array('p_close',array()),
array('document_end',array()),
);
@@ -241,7 +334,7 @@ class TestOfDoku_Parser_Links extends TestOfDoku_Parser {
array('p_open',array()),
array('cdata',array("\n".'Foo ')),
array('interwikilink',array('wp>Callback_(computer_science)','callbacks','wp','Callback_(computer_science)')),
- array('cdata',array(' Bar'."\n")),
+ array('cdata',array(' Bar')),
array('p_close',array()),
array('document_end',array()),
);
@@ -256,7 +349,7 @@ class TestOfDoku_Parser_Links extends TestOfDoku_Parser {
array('p_open',array()),
array('cdata',array("\n".'Foo ')),
array('camelcaselink',array('FooBar')),
- array('cdata',array(' Bar'."\n")),
+ array('cdata',array(' Bar')),
array('p_close',array()),
array('document_end',array()),
);
@@ -271,7 +364,7 @@ class TestOfDoku_Parser_Links extends TestOfDoku_Parser {
array('p_open',array()),
array('cdata',array("\n".'Foo ')),
array('filelink',array('file://temp/file.txt ',NULL)),
- array('cdata',array('Bar'."\n")),
+ array('cdata',array('Bar')),
array('p_close',array()),
array('document_end',array()),
);
@@ -286,7 +379,7 @@ class TestOfDoku_Parser_Links extends TestOfDoku_Parser {
array('p_open',array()),
array('cdata',array("\n".'Foo ')),
array('externallink',array('file://temp/file.txt','Some File')),
- array('cdata',array(' Bar'."\n")),
+ array('cdata',array(' Bar')),
array('p_close',array()),
array('document_end',array()),
);
@@ -301,7 +394,7 @@ class TestOfDoku_Parser_Links extends TestOfDoku_Parser {
array('p_open',array()),
array('cdata',array("\n".'Foo ')),
array('windowssharelink',array('\\\server\share',NULL)),
- array('cdata',array(' Bar'."\n")),
+ array('cdata',array(' Bar')),
array('p_close',array()),
array('document_end',array()),
);
@@ -316,7 +409,7 @@ class TestOfDoku_Parser_Links extends TestOfDoku_Parser {
array('p_open',array()),
array('cdata',array("\n".'Foo ')),
array('windowssharelink',array('\\\server\share','My Documents')),
- array('cdata',array(' Bar'."\n")),
+ array('cdata',array(' Bar')),
array('p_close',array()),
array('document_end',array()),
);
@@ -331,7 +424,7 @@ class TestOfDoku_Parser_Links extends TestOfDoku_Parser {
array('p_open',array()),
array('cdata',array("\n".'Foo ')),
array('internalmedia',array('img.gif',NULL,NULL,NULL,NULL,'cache','details')),
- array('cdata',array(' Bar'."\n")),
+ array('cdata',array(' Bar')),
array('p_close',array()),
array('document_end',array()),
);
@@ -346,7 +439,7 @@ class TestOfDoku_Parser_Links extends TestOfDoku_Parser {
array('p_open',array()),
array('cdata',array("\n".'Foo ')),
array('internalmedia',array('img.gif',NULL,NULL,NULL,NULL,'cache','linkonly')),
- array('cdata',array(' Bar'."\n")),
+ array('cdata',array(' Bar')),
array('p_close',array()),
array('document_end',array()),
);
@@ -361,7 +454,7 @@ class TestOfDoku_Parser_Links extends TestOfDoku_Parser {
array('p_open',array()),
array('cdata',array("\n".'Foo ')),
array('internalmedia',array('foo.txt','Some File',null,10,10,'cache','details')),
- array('cdata',array(' Bar'."\n")),
+ array('cdata',array(' Bar')),
array('p_close',array()),
array('document_end',array()),
);
@@ -376,7 +469,7 @@ class TestOfDoku_Parser_Links extends TestOfDoku_Parser {
array('p_open',array()),
array('cdata',array("\n".'Foo ')),
array('internalmedia',array('img.gif',NULL,'left',NULL,NULL,'cache','details')),
- array('cdata',array(' Bar'."\n")),
+ array('cdata',array(' Bar')),
array('p_close',array()),
array('document_end',array()),
);
@@ -391,7 +484,7 @@ class TestOfDoku_Parser_Links extends TestOfDoku_Parser {
array('p_open',array()),
array('cdata',array("\n".'Foo ')),
array('internalmedia',array('img.gif',NULL,'right',NULL,NULL,'cache','details')),
- array('cdata',array(' Bar'."\n")),
+ array('cdata',array(' Bar')),
array('p_close',array()),
array('document_end',array()),
);
@@ -406,7 +499,7 @@ class TestOfDoku_Parser_Links extends TestOfDoku_Parser {
array('p_open',array()),
array('cdata',array("\n".'Foo ')),
array('internalmedia',array('img.gif',NULL,'center',NULL,NULL,'cache','details')),
- array('cdata',array(' Bar'."\n")),
+ array('cdata',array(' Bar')),
array('p_close',array()),
array('document_end',array()),
);
@@ -421,7 +514,7 @@ class TestOfDoku_Parser_Links extends TestOfDoku_Parser {
array('p_open',array()),
array('cdata',array("\n".'Foo ')),
array('internalmedia',array('img.gif',NULL,NULL,'50','100','nocache','details')),
- array('cdata',array(' Bar'."\n")),
+ array('cdata',array(' Bar')),
array('p_close',array()),
array('document_end',array()),
);
@@ -436,7 +529,7 @@ class TestOfDoku_Parser_Links extends TestOfDoku_Parser {
array('p_open',array()),
array('cdata',array("\n".'Foo ')),
array('internalmedia',array('img.gif','Some Image',NULL,'50','100','cache','details')),
- array('cdata',array(' Bar'."\n")),
+ array('cdata',array(' Bar')),
array('p_close',array()),
array('document_end',array()),
);
@@ -451,7 +544,7 @@ class TestOfDoku_Parser_Links extends TestOfDoku_Parser {
array('p_open',array()),
array('cdata',array("\n".'Foo ')),
array('externalmedia',array('http://www.google.com/img.gif',NULL,NULL,NULL,NULL,'cache','details')),
- array('cdata',array(' Bar'."\n")),
+ array('cdata',array(' Bar')),
array('p_close',array()),
array('document_end',array()),
);
@@ -466,7 +559,7 @@ class TestOfDoku_Parser_Links extends TestOfDoku_Parser {
array('p_open',array()),
array('cdata',array("\n".'Foo ')),
array('externalmedia',array('http://www.google.com/img.gif',NULL,NULL,'50','100','nocache','details')),
- array('cdata',array(' Bar'."\n")),
+ array('cdata',array(' Bar')),
array('p_close',array()),
array('document_end',array()),
);
@@ -482,7 +575,7 @@ class TestOfDoku_Parser_Links extends TestOfDoku_Parser {
array('cdata',array("\n".'Foo ')),
array('externalmedia',
array('http://www.google.com/img.gif','Some Image',NULL,'50','100','cache','details')),
- array('cdata',array(' Bar'."\n")),
+ array('cdata',array(' Bar')),
array('p_close',array()),
array('document_end',array()),
);
@@ -509,7 +602,7 @@ class TestOfDoku_Parser_Links extends TestOfDoku_Parser {
array('p_open',array()),
array('cdata',array("\n".'Foo ')),
array('internallink',array('x:1:y:foo_bar:z',$image)),
- array('cdata',array(' Bar'."\n")),
+ array('cdata',array(' Bar')),
array('p_close',array()),
array('document_end',array()),
);
@@ -536,7 +629,7 @@ class TestOfDoku_Parser_Links extends TestOfDoku_Parser {
array('p_open',array()),
array('cdata',array("\n".'Foo ')),
array('internallink',array('x:1:y:foo_bar:z',$image)),
- array('cdata',array(' Bar'."\n")),
+ array('cdata',array(' Bar')),
array('p_close',array()),
array('document_end',array()),
);
@@ -563,7 +656,7 @@ class TestOfDoku_Parser_Links extends TestOfDoku_Parser {
array('p_open',array()),
array('cdata',array("\n".'Foo ')),
array('emaillink',array('foo@example.com',$image)),
- array('cdata',array(' Bar'."\n")),
+ array('cdata',array(' Bar')),
array('p_close',array()),
array('document_end',array()),
);
@@ -579,7 +672,7 @@ class TestOfDoku_Parser_Links extends TestOfDoku_Parser {
array('cdata',array("\n".'Foo ')),
array('internalmedia',
array('img.gif','{{foo.gif|{{bar.gif|Bar',NULL,NULL,NULL,'cache','details')),
- array('cdata',array('}}}} Bar'."\n")),
+ array('cdata',array('}}}} Bar')),
array('p_close',array()),
array('document_end',array()),
);
diff --git a/_test/cases/inc/parser/parser_lists.test.php b/_test/cases/inc/parser/parser_lists.test.php
index 34f0eb760..6e61da1a1 100644
--- a/_test/cases/inc/parser/parser_lists.test.php
+++ b/_test/cases/inc/parser/parser_lists.test.php
@@ -171,7 +171,7 @@ class TestOfDoku_Parser_Lists extends TestOfDoku_Parser {
$calls = array (
array('document_start',array()),
array('p_open',array()),
- array('cdata',array("\nFoo -bar *foo Bar\n")),
+ array('cdata',array("\nFoo -bar *foo Bar")),
array('p_close',array()),
array('document_end',array()),
);
@@ -211,7 +211,7 @@ Bar');
array('listitem_close',array()),
array('listu_close',array()),
array('p_open',array()),
- array('cdata',array("Bar".DOKU_PARSER_EOL)),
+ array('cdata',array("Bar")),
array('p_close',array()),
array('document_end',array()),
);
diff --git a/_test/cases/inc/parser/parser_preformatted.test.php b/_test/cases/inc/parser/parser_preformatted.test.php
index 8e3bd591b..7a00f3599 100644
--- a/_test/cases/inc/parser/parser_preformatted.test.php
+++ b/_test/cases/inc/parser/parser_preformatted.test.php
@@ -17,7 +17,7 @@ class TestOfDoku_Parser_Preformatted extends TestOfDoku_Parser {
array('p_close',array()),
array('file',array('testing',null,null)),
array('p_open',array()),
- array('cdata',array(' Bar'."\n")),
+ array('cdata',array(' Bar')),
array('p_close',array()),
array('document_end',array()),
);
@@ -35,7 +35,7 @@ class TestOfDoku_Parser_Preformatted extends TestOfDoku_Parser {
array('p_close',array()),
array('code',array('testing', null, null)),
array('p_open',array()),
- array('cdata',array(' Bar'."\n")),
+ array('cdata',array(' Bar')),
array('p_close',array()),
array('document_end',array()),
);
@@ -52,7 +52,7 @@ class TestOfDoku_Parser_Preformatted extends TestOfDoku_Parser {
array('p_close',array()),
array('code',array('testing', null, null)),
array('p_open',array()),
- array('cdata',array(' Bar'."\n")),
+ array('cdata',array(' Bar')),
array('p_close',array()),
array('document_end',array()),
);
@@ -69,7 +69,7 @@ class TestOfDoku_Parser_Preformatted extends TestOfDoku_Parser {
array('p_close',array()),
array('code',array('testing', 'php', null)),
array('p_open',array()),
- array('cdata',array(' Bar'."\n")),
+ array('cdata',array(' Bar')),
array('p_close',array()),
array('document_end',array()),
);
@@ -86,7 +86,7 @@ class TestOfDoku_Parser_Preformatted extends TestOfDoku_Parser {
array('p_close',array()),
array('preformatted',array("x \n y ")),
array('p_open',array()),
- array('cdata',array('Bar'."\n\n")),
+ array('cdata',array('Bar')),
array('p_close',array()),
array('document_end',array()),
);
@@ -103,7 +103,7 @@ class TestOfDoku_Parser_Preformatted extends TestOfDoku_Parser {
array('p_close',array()),
array('preformatted',array("x \n y ")),
array('p_open',array()),
- array('cdata',array('Bar'."\n\n")),
+ array('cdata',array('Bar')),
array('p_close',array()),
array('document_end',array()),
);
@@ -120,7 +120,7 @@ class TestOfDoku_Parser_Preformatted extends TestOfDoku_Parser {
array('p_close',array()),
array('preformatted',array("x\t\n\ty\t")),
array('p_open',array()),
- array('cdata',array("Bar\n\n")),
+ array('cdata',array("Bar")),
array('p_close',array()),
array('document_end',array()),
);
@@ -137,7 +137,7 @@ class TestOfDoku_Parser_Preformatted extends TestOfDoku_Parser {
array('p_close',array()),
array('preformatted',array("x\t\n\ty\t")),
array('p_open',array()),
- array('cdata',array("Bar\n\n")),
+ array('cdata',array("Bar")),
array('p_close',array()),
array('document_end',array()),
);
@@ -169,7 +169,7 @@ class TestOfDoku_Parser_Preformatted extends TestOfDoku_Parser {
array('p_close',array()),
array('preformatted',array("x \n y \n-X\n*Y")),
array('p_open',array()),
- array('cdata',array("Bar\n\n")),
+ array('cdata',array("Bar")),
array('p_close',array()),
array('document_end',array()),
);
@@ -186,7 +186,7 @@ class TestOfDoku_Parser_Preformatted extends TestOfDoku_Parser {
array('p_open',array()),
array('cdata',array("\n".'Foo ')),
array('php',array('testing')),
- array('cdata',array(' Bar'."\n")),
+ array('cdata',array(' Bar')),
array('p_close',array()),
array('document_end',array()),
);
@@ -203,7 +203,7 @@ class TestOfDoku_Parser_Preformatted extends TestOfDoku_Parser {
array('p_open',array()),
array('cdata',array("\n".'Foo ')),
array('html',array('testing')),
- array('cdata',array(' Bar'."\n")),
+ array('cdata',array(' Bar')),
array('p_close',array()),
array('document_end',array()),
);
diff --git a/_test/cases/inc/parser/parser_quote.test.php b/_test/cases/inc/parser/parser_quote.test.php
index 5d5a7e2a5..ebc5da604 100644
--- a/_test/cases/inc/parser/parser_quote.test.php
+++ b/_test/cases/inc/parser/parser_quote.test.php
@@ -22,7 +22,7 @@ class TestOfDoku_Parser_Quote extends TestOfDoku_Parser {
array('quote_close',array()),
array('quote_close',array()),
array('p_open',array()),
- array('cdata',array("klm\n")),
+ array('cdata',array("klm")),
array('p_close',array()),
array('document_end',array()),
@@ -45,7 +45,7 @@ class TestOfDoku_Parser_Quote extends TestOfDoku_Parser {
array('quote_close',array()),
array('quote_close',array()),
array('p_open',array()),
- array('cdata',array("klm\n")),
+ array('cdata',array("klm")),
array('p_close',array()),
array('document_end',array()),
@@ -86,7 +86,7 @@ class TestOfDoku_Parser_Quote extends TestOfDoku_Parser {
array('quote_close',array()),
array('quote_close',array()),
array('p_open',array()),
- array('cdata',array("klm".DOKU_PARSER_EOL)),
+ array('cdata',array("klm")),
array('p_close',array()),
array('document_end',array()),
diff --git a/_test/cases/inc/parser/parser_quotes.test.php b/_test/cases/inc/parser/parser_quotes.test.php
index 9f191d6b0..77e323799 100644
--- a/_test/cases/inc/parser/parser_quotes.test.php
+++ b/_test/cases/inc/parser/parser_quotes.test.php
@@ -22,7 +22,7 @@ class TestOfDoku_Parser_Quotes extends TestOfDoku_Parser {
array('p_open',array()),
array('cdata',array("\n".'Foo ')),
array('singlequoteopening',array()),
- array('cdata',array('hello Bar'."\n")),
+ array('cdata',array('hello Bar')),
array('p_close',array()),
array('document_end',array()),
);
@@ -39,7 +39,7 @@ class TestOfDoku_Parser_Quotes extends TestOfDoku_Parser {
array('p_open',array()),
array('cdata',array("\n".'Foo said:')),
array('singlequoteopening',array()),
- array('cdata',array('hello Bar'."\n")),
+ array('cdata',array('hello Bar')),
array('p_close',array()),
array('document_end',array()),
);
@@ -56,7 +56,7 @@ class TestOfDoku_Parser_Quotes extends TestOfDoku_Parser {
array('p_open',array()),
array('cdata',array("\n".'Foo hello')),
array('singlequoteclosing',array()),
- array('cdata',array(' Bar'."\n")),
+ array('cdata',array(' Bar')),
array('p_close',array()),
array('document_end',array()),
);
@@ -73,7 +73,7 @@ class TestOfDoku_Parser_Quotes extends TestOfDoku_Parser {
array('p_open',array()),
array('cdata',array("\n".'Foo hello')),
array('singlequoteclosing',array()),
- array('cdata',array(') Bar'."\n")),
+ array('cdata',array(') Bar')),
array('p_close',array()),
array('document_end',array()),
);
@@ -92,7 +92,7 @@ class TestOfDoku_Parser_Quotes extends TestOfDoku_Parser {
array('singlequoteopening',array()),
array('cdata',array('hello')),
array('singlequoteclosing',array()),
- array('cdata',array(' Bar'."\n")),
+ array('cdata',array(' Bar')),
array('p_close',array()),
array('document_end',array()),
);
@@ -109,7 +109,7 @@ class TestOfDoku_Parser_Quotes extends TestOfDoku_Parser {
array('p_open',array()),
array('cdata',array("\n".'hey it')),
array('apostrophe',array()),
- array('cdata',array('s fine weather today'."\n")),
+ array('cdata',array('s fine weather today')),
array('p_close',array()),
array('document_end',array()),
);
@@ -129,7 +129,7 @@ class TestOfDoku_Parser_Quotes extends TestOfDoku_Parser {
array('singlequoteopening',array()),
array('cdata',array('hello')),
array('singlequoteclosing',array()),
- array('cdata',array(') Bar'."\n")),
+ array('cdata',array(') Bar')),
array('p_close',array()),
array('document_end',array()),
);
@@ -146,7 +146,7 @@ class TestOfDoku_Parser_Quotes extends TestOfDoku_Parser {
array('p_open',array()),
array('cdata',array("\n".'Foo ')),
array('doublequoteopening',array()),
- array('cdata',array('hello Bar'."\n")),
+ array('cdata',array('hello Bar')),
array('p_close',array()),
array('document_end',array()),
);
@@ -163,7 +163,7 @@ class TestOfDoku_Parser_Quotes extends TestOfDoku_Parser {
array('p_open',array()),
array('cdata',array("\n".'Foo said:')),
array('doublequoteopening',array()),
- array('cdata',array('hello Bar'."\n")),
+ array('cdata',array('hello Bar')),
array('p_close',array()),
array('document_end',array()),
);
@@ -180,7 +180,7 @@ class TestOfDoku_Parser_Quotes extends TestOfDoku_Parser {
array('p_open',array()),
array('cdata',array("\n".'Foo hello')),
array('doublequoteclosing',array()),
- array('cdata',array(' Bar'."\n")),
+ array('cdata',array(' Bar')),
array('p_close',array()),
array('document_end',array()),
);
@@ -197,7 +197,7 @@ class TestOfDoku_Parser_Quotes extends TestOfDoku_Parser {
array('p_open',array()),
array('cdata',array("\n".'Foo hello')),
array('doublequoteclosing',array()),
- array('cdata',array(') Bar'."\n")),
+ array('cdata',array(') Bar')),
array('p_close',array()),
array('document_end',array()),
);
@@ -216,7 +216,7 @@ class TestOfDoku_Parser_Quotes extends TestOfDoku_Parser {
array('doublequoteopening',array()),
array('cdata',array('hello')),
array('doublequoteclosing',array()),
- array('cdata',array(' Bar'."\n")),
+ array('cdata',array(' Bar')),
array('p_close',array()),
array('document_end',array()),
);
@@ -235,7 +235,7 @@ class TestOfDoku_Parser_Quotes extends TestOfDoku_Parser {
array('doublequoteopening',array()),
array('cdata',array('hello')),
array('doublequoteclosing',array()),
- array('cdata',array(') Bar'."\n")),
+ array('cdata',array(') Bar')),
array('p_close',array()),
array('document_end',array()),
);
@@ -261,7 +261,7 @@ class TestOfDoku_Parser_Quotes extends TestOfDoku_Parser {
array('cdata',array('s world')),
array('singlequoteclosing',array()),
array('doublequoteclosing',array()),
- array('cdata',array(".\n")),
+ array('cdata',array(".")),
array('p_close',array()),
array('document_end',array()),
);
diff --git a/_test/cases/inc/parser/parser_replacements.test.php b/_test/cases/inc/parser/parser_replacements.test.php
index 6aa9069a1..d277560c7 100644
--- a/_test/cases/inc/parser/parser_replacements.test.php
+++ b/_test/cases/inc/parser/parser_replacements.test.php
@@ -17,7 +17,7 @@ class TestOfDoku_Parser_Replacements extends TestOfDoku_Parser {
array('p_open',array()),
array('cdata',array("\n".'abc ')),
array('acronym',array('FOOBAR')),
- array('cdata',array(' xyz'."\n")),
+ array('cdata',array(' xyz')),
array('p_close',array()),
array('document_end',array()),
);
@@ -32,7 +32,7 @@ class TestOfDoku_Parser_Replacements extends TestOfDoku_Parser {
$calls = array (
array('document_start',array()),
array('p_open',array()),
- array('cdata',array("\n".'abcFOOBARxyz'."\n")),
+ array('cdata',array("\n".'abcFOOBARxyz')),
array('p_close',array()),
array('document_end',array()),
);
@@ -49,7 +49,7 @@ class TestOfDoku_Parser_Replacements extends TestOfDoku_Parser {
array('p_open',array()),
array('cdata',array("\n".'FOOBAR ')),
array('acronym',array('FOO')),
- array('cdata',array("\n")),
+ array('cdata',array('')),
array('p_close',array()),
array('document_end',array()),
);
@@ -68,7 +68,7 @@ class TestOfDoku_Parser_Replacements extends TestOfDoku_Parser {
array('acronym',array('FOO')),
array('cdata',array(' def ')),
array('acronym',array('BAR')),
- array('cdata',array(' xyz'."\n")),
+ array('cdata',array(' xyz')),
array('p_close',array()),
array('document_end',array()),
);
@@ -92,7 +92,7 @@ class TestOfDoku_Parser_Replacements extends TestOfDoku_Parser {
array('acronym',array('FOO.1')),
array('cdata',array(" ")),
array('acronym',array('A.FOO.1')),
- array('cdata',array("\n")),
+ array('cdata',array('')),
array('p_close',array()),
array('document_end',array()),
);
@@ -115,7 +115,7 @@ class TestOfDoku_Parser_Replacements extends TestOfDoku_Parser {
array('acronym',array('FOO.1')),
array('cdata',array(" ")),
array('acronym',array('A.FOO.1')),
- array('cdata',array("\n")),
+ array('cdata',array('')),
array('p_close',array()),
array('document_end',array()),
);
@@ -130,7 +130,7 @@ class TestOfDoku_Parser_Replacements extends TestOfDoku_Parser {
$calls = array (
array('document_start',array()),
array('p_open',array()),
- array('cdata',array("\nabc:-)xyz\n")),
+ array('cdata',array("\nabc:-)xyz")),
array('p_close',array()),
array('document_end',array()),
);
@@ -147,7 +147,7 @@ class TestOfDoku_Parser_Replacements extends TestOfDoku_Parser {
array('p_open',array()),
array('cdata',array("\n".'abc ')),
array('smiley',array(':-)')),
- array('cdata',array(' xyz'."\n")),
+ array('cdata',array(' xyz')),
array('p_close',array()),
array('document_end',array()),
);
@@ -162,7 +162,7 @@ class TestOfDoku_Parser_Replacements extends TestOfDoku_Parser {
$calls = array (
array('document_start',array()),
array('p_open',array()),
- array('cdata',array("\nabc:-)x^_^yz\n")),
+ array('cdata',array("\nabc:-)x^_^yz")),
array('p_close',array()),
array('document_end',array()),
);
@@ -181,7 +181,7 @@ class TestOfDoku_Parser_Replacements extends TestOfDoku_Parser {
array('smiley',array(':-)')),
array('cdata',array(' x ')),
array('smiley',array('^_^')),
- array('cdata',array(' yz'."\n")),
+ array('cdata',array(' yz')),
array('p_close',array()),
array('document_end',array()),
);
@@ -197,7 +197,7 @@ class TestOfDoku_Parser_Replacements extends TestOfDoku_Parser {
$calls = array (
array('document_start',array()),
array('p_open',array()),
- array('cdata',array("\nabc".':-\\\\'."xyz\n")),
+ array('cdata',array("\nabc".':-\\\\'."xyz")),
array('p_close',array()),
array('document_end',array()),
);
@@ -215,7 +215,7 @@ class TestOfDoku_Parser_Replacements extends TestOfDoku_Parser {
array('p_open',array()),
array('cdata',array("\n".'abc ')),
array('smiley',array(':-\\\\')),
- array('cdata',array(' xyz'."\n")),
+ array('cdata',array(' xyz')),
array('p_close',array()),
array('document_end',array()),
);
@@ -232,7 +232,7 @@ class TestOfDoku_Parser_Replacements extends TestOfDoku_Parser {
array('p_open',array()),
array('cdata',array("\n".'abc ')),
array('wordblock',array('CAT')),
- array('cdata',array(' xyz'."\n")),
+ array('cdata',array(' xyz')),
array('p_close',array()),
array('document_end',array()),
);
@@ -249,7 +249,7 @@ class TestOfDoku_Parser_Replacements extends TestOfDoku_Parser {
array('p_open',array()),
array('cdata',array("\n".'abc ')),
array('wordblock',array('cat')),
- array('cdata',array(' xyz'."\n")),
+ array('cdata',array(' xyz')),
array('p_close',array()),
array('document_end',array()),
);
@@ -268,7 +268,7 @@ class TestOfDoku_Parser_Replacements extends TestOfDoku_Parser {
array('wordblock',array('cat')),
array('cdata',array(' x ')),
array('wordblock',array('DOG')),
- array('cdata',array(' yz'."\n")),
+ array('cdata',array(' yz')),
array('p_close',array()),
array('document_end',array()),
);
@@ -285,7 +285,7 @@ class TestOfDoku_Parser_Replacements extends TestOfDoku_Parser {
array('p_open',array()),
array('cdata',array("\n".'x ')),
array('entity',array('->')),
- array('cdata',array(' y'."\n")),
+ array('cdata',array(' y')),
array('p_close',array()),
array('document_end',array()),
);
@@ -304,7 +304,7 @@ class TestOfDoku_Parser_Replacements extends TestOfDoku_Parser {
array('entity',array('->')),
array('cdata',array(' y ')),
array('entity',array('<-')),
- array('cdata',array(' z'."\n")),
+ array('cdata',array(' z')),
array('p_close',array()),
array('document_end',array()),
);
@@ -321,7 +321,7 @@ class TestOfDoku_Parser_Replacements extends TestOfDoku_Parser {
array('p_open',array()),
array('cdata',array("\n".'Foo ')),
array('multiplyentity',array(10,20)),
- array('cdata',array(' Bar'."\n")),
+ array('cdata',array(' Bar')),
array('p_close',array()),
array('document_end',array()),
);
@@ -337,7 +337,7 @@ class TestOfDoku_Parser_Replacements extends TestOfDoku_Parser {
$calls = array (
array('document_start',array()),
array('p_open',array()),
- array('cdata',array("\n".'Foo 0x123 Bar'."\n")),
+ array('cdata',array("\n".'Foo 0x123 Bar')),
array('p_close',array()),
array('document_end',array()),
);
@@ -356,7 +356,7 @@ class TestOfDoku_Parser_Replacements extends TestOfDoku_Parser {
array('p_close',array()),
array('hr',array()),
array('p_open',array()),
- array('cdata',array("\n Bar\n")),
+ array('cdata',array("\n Bar")),
array('p_close',array()),
array('document_end',array()),
);
@@ -374,7 +374,7 @@ class TestOfDoku_Parser_Replacements extends TestOfDoku_Parser {
array('p_close',array()),
array('hr',array()),
array('p_open',array()),
- array('cdata',array("\n Bar\n")),
+ array('cdata',array("\n Bar")),
array('p_close',array()),
array('document_end',array()),
);
diff --git a/_test/cases/inc/parser/parser_table.test.php b/_test/cases/inc/parser/parser_table.test.php
index 04bce650a..12898860c 100644
--- a/_test/cases/inc/parser/parser_table.test.php
+++ b/_test/cases/inc/parser/parser_table.test.php
@@ -44,7 +44,7 @@ def');
array('tablerow_close',array()),
array('table_close',array(121)),
array('p_open',array()),
- array('cdata',array('def'."\n")),
+ array('cdata',array('def')),
array('p_close',array()),
array('document_end',array()),
);
@@ -84,7 +84,7 @@ def');
array('tablerow_close',array()),
array('table_close',array(121)),
array('p_open',array()),
- array('cdata',array('def'."\n")),
+ array('cdata',array('def')),
array('p_close',array()),
array('document_end',array()),
);
@@ -108,7 +108,7 @@ def');
array('tablerow_close',array()),
array('table_close',array(7)),
array('p_open',array()),
- array('cdata',array('def'."\n")),
+ array('cdata',array('def')),
array('p_close',array()),
array('document_end',array()),
);
@@ -142,7 +142,7 @@ def');
array('tablerow_close',array()),
array('table_close',array(19)),
array('p_open',array()),
- array('cdata',array('def'."\n")),
+ array('cdata',array('def')),
array('p_close',array()),
array('document_end',array()),
);
@@ -177,7 +177,7 @@ def');
array('tablerow_close',array()),
array('table_close',array(23)),
array('p_open',array()),
- array('cdata',array('def'."\n")),
+ array('cdata',array('def')),
array('p_close',array()),
array('document_end',array()),
);
@@ -220,7 +220,7 @@ def');
array('tablerow_close',array()),
array('table_close',array(31)),
array('p_open',array()),
- array('cdata',array('def'."\n")),
+ array('cdata',array('def')),
array('p_close',array()),
array('document_end',array()),
);
@@ -268,7 +268,7 @@ def');
array('tablerow_close',array()),
array('table_close',array(51)),
array('p_open',array()),
- array('cdata',array('def'."\n")),
+ array('cdata',array('def')),
array('p_close',array()),
array('document_end',array()),
);
@@ -306,7 +306,7 @@ def');
array('tablerow_close',array()),
array('table_close',array(27)),
array('p_open',array()),
- array('cdata',array('def'."\n")),
+ array('cdata',array('def')),
array('p_close',array()),
array('document_end',array()),
);
@@ -326,7 +326,7 @@ def');
$calls = array (
array('document_start',array()),
array('p_open',array()),
- array('cdata',array(DOKU_PARSER_EOL."abc")),
+ array('cdata',array("abc")),
array('p_close',array()),
array('table_open',array(3, 2, 6)),
array('tablerow_open',array()),
@@ -353,7 +353,7 @@ def');
array('tablerow_close',array()),
array('table_close',array(121)),
array('p_open',array()),
- array('cdata',array('def'.DOKU_PARSER_EOL)),
+ array('cdata',array('def')),
array('p_close',array()),
array('document_end',array()),
);
@@ -408,7 +408,7 @@ def');
array('tablerow_close',array()),
array('table_close',array(129)),
array('p_open',array()),
- array('cdata',array('def'."\n")),
+ array('cdata',array('def')),
array('p_close',array()),
array('document_end',array()),
);
@@ -459,7 +459,7 @@ def');
array('tablerow_close',array()),
array('table_close',array(155)),
array('p_open',array()),
- array('cdata',array('def'."\n")),
+ array('cdata',array('def')),
array('p_close',array()),
array('document_end',array()),
);
@@ -506,7 +506,7 @@ def');
array('tablerow_close',array()),
array('table_close',array(123)),
array('p_open',array()),
- array('cdata',array('def'."\n")),
+ array('cdata',array('def')),
array('p_close',array()),
array('document_end',array()),
);
@@ -566,7 +566,7 @@ def');
array('tablerow_close',array()),
array('table_close',array(129)),
array('p_open',array()),
- array('cdata',array('def'."\n")),
+ array('cdata',array('def')),
array('p_close',array()),
array('document_end',array()),
);
diff --git a/_test/cases/inc/parser/parser_unformatted.test.php b/_test/cases/inc/parser/parser_unformatted.test.php
index 56820a27a..dd69564b4 100644
--- a/_test/cases/inc/parser/parser_unformatted.test.php
+++ b/_test/cases/inc/parser/parser_unformatted.test.php
@@ -15,7 +15,7 @@ class TestOfDoku_Parser_Unformatted extends TestOfDoku_Parser {
array('p_open',array()),
array('cdata',array("\n".'Foo ')),
array('unformatted',array('testing')),
- array('cdata',array(' Bar'."\n")),
+ array('cdata',array(' Bar')),
array('p_close',array()),
array('document_end',array()),
);
@@ -32,7 +32,7 @@ class TestOfDoku_Parser_Unformatted extends TestOfDoku_Parser {
array('p_open',array()),
array('cdata',array("\n".'Foo ')),
array('unformatted',array('testing')),
- array('cdata',array(' Bar'."\n")),
+ array('cdata',array(' Bar')),
array('p_close',array()),
array('document_end',array()),
);
diff --git a/_test/cases/inc/parser/xhtml_links.test.php b/_test/cases/inc/parser/xhtml_links.test.php
index 6a74445b0..a9a6dfdbc 100644
--- a/_test/cases/inc/parser/xhtml_links.test.php
+++ b/_test/cases/inc/parser/xhtml_links.test.php
@@ -1,6 +1,7 @@
<?php
if (!defined('DOKU_BASE')) define('DOKU_BASE','./');
require_once DOKU_INC.'inc/parser/xhtml.php';
+require_once DOKU_INC.'inc/pageutils.php';
class xhtml_links_test extends UnitTestCase {
@@ -12,7 +13,7 @@ class xhtml_links_test extends UnitTestCase {
$p = new Doku_Renderer_xhtml();
$p->emaillink('foo@example.com','<script>alert(\'"alert"\');</script>');
- $expect = '<a href="mailto:foo%20%5Bat%5D%20example%20%5Bdot%5D%20com" class="mail JSnocheck" title="foo [at] example [dot] com">&lt;script&gt;alert(&#039;&quot;alert&quot;&#039;);&lt;/script&gt;</a>';
+ $expect = '<a href="mailto:foo%20%5Bat%5D%20example%20%5Bdot%5D%20com" class="mail" title="foo [at] example [dot] com">&lt;script&gt;alert(&#039;&quot;alert&quot;&#039;);&lt;/script&gt;</a>';
$this->assertEqual($p->doc,$expect);
}
@@ -36,9 +37,203 @@ class xhtml_links_test extends UnitTestCase {
$p = new Doku_Renderer_xhtml();
$p->emaillink('foo@example.com',$image);
- $expect = '<a href="mailto:foo%20%5Bat%5D%20example%20%5Bdot%5D%20com" class="media JSnocheck" title="foo [at] example [dot] com"><img src="'.DOKU_BASE.'lib/exe/fetch.php/img.gif?w=10&amp;h=20&amp;cache=nocache" class="media" title="Some Image" alt="Some Image" width="10" height="20" /></a>';
+ $expect = '<a href="mailto:foo%20%5Bat%5D%20example%20%5Bdot%5D%20com" class="media" title="foo [at] example [dot] com"><img src="'.DOKU_BASE.'lib/exe/fetch.php/img.gif?w=10&amp;h=20&amp;cache=nocache" class="media" title="Some Image" alt="Some Image" width="10" height="20" /></a>';
$this->assertEqual($p->doc,$expect);
}
+ /**
+ * Produced by syntax like [[ ]]
+ */
+ function test_empty_internallink(){
+ $page = 'my:space';
+
+ global $ID;
+ $ID = $page;
+
+ global $conf;
+ $conf['start'] = 'start';
+
+ global $conf;
+ $conf['basedir'] = '/';
+ $conf['useheading'] = 0;
+ $conf['userewrite'] = 0;
+ $conf['useslash'] = 0;
+ $conf['canonical'] = 0;
+
+ $p = new Doku_Renderer_xhtml();
+ $p->internallink('');
+
+
+ if (page_exists($page)) {
+ $class = 'wikilink1';
+ $rel = '';
+ }
+ else {
+ $class = 'wikilink2';
+ $rel = ' rel="nofollow"';
+ }
+
+ $parts = split(':', $page);
+ $caption = $parts[count($parts)-1];
+
+ $expect = '<span class="curid"><a href="/./doku.php?id='.$page.'" class="'.$class.'" title="'.$page.'"'.$rel.'>'.$caption.'</a></span>';
+
+ $this->assertEqual($p->doc, $expect);
+ }
+
+ /**
+ * Produced by syntax like [[ |my caption]]
+ */
+ function test_empty_internallink_with_caption(){
+ $page = 'my:space';
+ $caption = 'my caption';
+
+ global $ID;
+ $ID = $page;
+
+ global $conf;
+ $conf['basedir'] = '/';
+ $conf['useheading'] = 0;
+ $conf['userewrite'] = 0;
+ $conf['useslash'] = 0;
+ $conf['canonical'] = 0;
+
+ $p = new Doku_Renderer_xhtml();
+ $p->internallink('', $caption);
+
+ if (page_exists($page)) {
+ $class = 'wikilink1';
+ $rel = '';
+ }
+ else {
+ $class = 'wikilink2';
+ $rel = ' rel="nofollow"';
+ }
+
+ $expect = '<span class="curid"><a href="/./doku.php?id='.$page.'" class="'.$class.'" title="'.$page.'"'.$rel.'>'.$caption.'</a></span>';
+
+ $this->assertEqual($p->doc, $expect);
+ }
+
+ /**
+ * Produced by syntax like [[?do=index]]
+ */
+ function test_empty_internallink_index(){
+ $page = 'my:space';
+
+ global $ID;
+ $ID = $page;
+
+ global $conf;
+ $conf['start'] = 'start';
+
+ global $conf;
+ $conf['basedir'] = '/';
+ $conf['useheading'] = 0;
+ $conf['userewrite'] = 0;
+ $conf['useslash'] = 0;
+ $conf['canonical'] = 0;
+
+ $p = new Doku_Renderer_xhtml();
+ $p->internallink('?do=index');
+
+ if (page_exists($page)) {
+ $class = 'wikilink1';
+ $rel = '';
+ }
+ else {
+ $class = 'wikilink2';
+ $rel = ' rel="nofollow"';
+ }
+
+ $parts = split(':', $page);
+ $caption = $parts[count($parts)-1];
+
+ $expect = '<span class="curid"><a href="/./doku.php?id='.$page.'&amp;do=index" class="'.$class.'" title="'.$page.'"'.$rel.'>'.$caption.'</a></span>';
+
+ $this->assertEqual($p->doc, $expect);
+ }
+
+ /**
+ * Produced by syntax like [[?do=index|my caption]]
+ */
+ function test_empty_internallink_index_with_caption(){
+ $page = 'my:space';
+ $caption = 'my caption';
+
+ global $ID;
+ $ID = $page;
+
+ global $conf;
+ $conf['basedir'] = '/';
+ $conf['useheading'] = 0;
+ $conf['userewrite'] = 0;
+ $conf['useslash'] = 0;
+ $conf['canonical'] = 0;
+
+ $p = new Doku_Renderer_xhtml();
+ $p->internallink('?do=index', $caption);
+
+ if (page_exists($page)) {
+ $class = 'wikilink1';
+ $rel = '';
+ }
+ else {
+ $class = 'wikilink2';
+ $rel = ' rel="nofollow"';
+ }
+
+ $expect = '<span class="curid"><a href="/./doku.php?id='.$page.'&amp;do=index" class="'.$class.'" title="'.$page.'"'.$rel.'>'.$caption.'</a></span>';
+
+ $this->assertEqual($p->doc, $expect);
+ }
+
+ /**
+ * Produced by syntax like [[#test]]
+ */
+ function test_empty_locallink(){
+ $page = 'my:spacex';
+ global $ID;
+ $ID = $page;
+
+ global $conf;
+ $conf['basedir'] = '/';
+ $conf['useheading'] = 0;
+ $conf['userewrite'] = 0;
+ $conf['useslash'] = 0;
+ $conf['canonical'] = 0;
+
+ $p = new Doku_Renderer_xhtml();
+ $p->locallink('test');
+
+ $expect = '<a href="#test" title="'.$page.' &crarr;" class="wikilink1">test</a>';
+
+ $this->assertEqual($p->doc, $expect);
+ }
+
+ /**
+ * Produced by syntax like [[#test|my caption]]
+ */
+ function test_empty_locallink_with_caption(){
+ $page = 'my:spacex';
+ $caption = 'my caption';
+
+ global $ID;
+ $ID = $page;
+
+ global $conf;
+ $conf['basedir'] = '/';
+ $conf['useheading'] = 0;
+ $conf['userewrite'] = 0;
+ $conf['useslash'] = 0;
+ $conf['canonical'] = 0;
+
+ $p = new Doku_Renderer_xhtml();
+ $p->locallink('test', $caption);
+
+ $expect = '<a href="#test" title="'.$page.' &crarr;" class="wikilink1">'.$caption.'</a>';
+
+ $this->assertEqual($p->doc, $expect);
+ }
}
diff --git a/_test/cases/inc/parserutils_set_metadata_during_rendering.test.php b/_test/cases/inc/parserutils_set_metadata_during_rendering.test.php
new file mode 100644
index 000000000..8319da298
--- /dev/null
+++ b/_test/cases/inc/parserutils_set_metadata_during_rendering.test.php
@@ -0,0 +1,93 @@
+<?php
+
+require_once DOKU_INC.'inc/init.php';
+
+class parserutils_set_metadata_during_rendering_test extends UnitTestCase {
+ // the id used for this test case
+ private $id;
+ // if the test case is currently running
+ private $active = false;
+ // the original plugin controller
+ private $plugin_controller;
+
+ // the actual test
+ function test_p_set_metadata_during_rendering() {
+ global $EVENT_HANDLER;
+ $this->id = 'test:p_set_metadata_during_rendering';
+ $this->active = true;
+
+ // write the wiki page so it exists and needs to be rendered
+ saveWikiText($this->id, 'Test '.time(), 'Test data setup');
+
+ $EVENT_HANDLER->register_hook('PARSER_METADATA_RENDER', 'BEFORE', $this, 'helper_set_metadata', array('test_before_set' => 'test'));
+ $EVENT_HANDLER->register_hook('PARSER_METADATA_RENDER', 'AFTER', $this, 'helper_set_metadata', array('test_after_set' => 'test'));
+ $EVENT_HANDLER->register_hook('PARSER_HANDLER_DONE', 'BEFORE', $this, 'helper_inject_test_instruction');
+
+ // Change the global plugin controller so this test can be a fake syntax plugin
+ global $plugin_controller;
+ $this->plugin_controller = $plugin_controller;
+ $plugin_controller = $this;
+
+ // the actual rendering, all hooks should be executed here
+ $newMeta = p_get_metadata($this->id);
+
+ // restore the plugin controller
+ $plugin_controller = $this->plugin_controller;
+
+ // assert that all three calls to p_set_metadata have been successful
+ $this->assertEqual($newMeta['test_before_set'], 'test');
+ $this->assertEqual($newMeta['test_after_set'], 'test');
+ $this->assertEqual($newMeta['test_during_rendering'], 'test');
+
+ // clean up
+ $this->active = false;
+
+ // make sure the saved metadata is the one that has been rendered
+ $this->assertEqual($newMeta, p_get_metadata($this->id));
+
+ saveWikiText($this->id, '', 'Test data remove');
+ }
+
+ // helper for the action plugin part of the test, tries executing p_set_metadata during rendering
+ function helper_set_metadata($event, $meta) {
+ if ($this->active) {
+ p_set_metadata($this->id, $meta, false, true);
+ $key = array_pop(array_keys($meta));
+ $this->assertTrue(is_string($meta[$key])); // ensure we really have a key
+ // ensure that the metadata property hasn't been set previously
+ $this->assertNotEqual($meta[$key], p_get_metadata($this->id, $key));
+ }
+ }
+
+ // helper for injecting an instruction for this test case
+ function helper_inject_test_instruction($event) {
+ if ($this->active)
+ $event->data->calls[] = array('plugin', array('parserutils_test', array()));
+ }
+
+ // fake syntax plugin rendering method that tries calling p_set_metadata during the actual rendering process
+ function render($format, &$renderer, $data) {
+ if ($this->active) {
+ $key = 'test_during_rendering';
+ p_set_metadata($this->id, array($key => 'test'), false, true);
+ // ensure that the metadata property hasn't been set previously
+ $this->assertNotEqual($key, p_get_metadata($this->id, $key));
+ }
+ }
+
+ // wrapper function for the fake plugin controller
+ function getList($type='',$all=false){
+ return $this->plugin_controller->getList();
+ }
+
+ // wrapper function for the fake plugin controller, return $this for the fake syntax of this test
+ function &load($type,$name,$new=false,$disabled=false){
+ if ($name == 'parserutils_test') {
+ return $this;
+ } else {
+ return $this->plugin_controller->load($type, $name, $new, $disabled);
+ }
+ }
+}
+
+// vim:ts=4:sw=4:et:
diff --git a/_test/cases/inc/safefn.test.php b/_test/cases/inc/safefn.test.php
index c789875ba..1227e5578 100644
--- a/_test/cases/inc/safefn.test.php
+++ b/_test/cases/inc/safefn.test.php
@@ -10,19 +10,23 @@ class safeFN_test extends UnitTestCase {
function test1(){
// we test multiple cases here - format: string, repl, additional, test
$tests = array();
- $tests[] = array('äa.txt', '%5g.a.txt');
- $tests[] = array('ä.', '%5g..');
+ $tests[] = array('äa.txt', '%5g]a.txt');
+ $tests[] = array('ä.', '%5g].');
$tests[] = array('asciistring','asciistring');
$tests[] = array('ascii-_/.string','ascii-_/.string');
- $tests[] = array('AName','%x%1a.ame');
- $tests[] = array('A Name','%x%0%1a.ame');
- $tests[] = array('Another...Name','%x.nother...%1a.ame');
- $tests[] = array('Aß∂ƒName','%x%5b%6oy%aa%1a.ame');
- $tests[] = array('A%ß-∂_.ƒName','%x%%5b.-%6oy._.%aa%1a.ame');
- $tests[] = array('A%%ß-∂_.ƒName','%x%%%5b.-%6oy._.%aa%1a.ame');
- $tests[] = array('데이터도 함께 복원됩니다. 강력한','%zf4%13dg%15ao%zhg%0%164o%yig%0%11at%138w%zk9%zag%zb8..%0%xyt%10cl%164c.');
- $tests[] = array('совместимая','%td%ta%sy%t8%t1%td%te%t4%t8%sw%tr.');
- $tests[] = array('нехватка_файлового_пространства_на_сервере_p0-squid.some.domain.1270211897.txt.gz','%t9%t1%th%sy%sw%te%t6%sw._%tg%sw%t5%t7%ta%sy%ta%sz%ta._%tb%tc%ta%td%te%tc%sw%t9%td%te%sy%sw._%t9%sw._%td%t1%tc%sy%t1%tc%t1._p0-squid.some.domain.1270211897.txt.gz');
+ $tests[] = array('AName','%x%1a]ame');
+ $tests[] = array('A Name','%x%0%1a]ame');
+ $tests[] = array('Another...Name','%x]nother...%1a]ame');
+ $tests[] = array('Aß∂ƒName','%x%5b%6oy%aa%1a]ame');
+ $tests[] = array('A%ß-∂_.ƒName','%x%%5b]-%6oy]_.%aa%1a]ame');
+ $tests[] = array('A%%ß-∂_.ƒName','%x%%%5b]-%6oy]_.%aa%1a]ame');
+ $tests[] = array('데이터도 함께 복원됩니다. 강력한','%zf4%13dg%15ao%zhg%0%164o%yig%0%11at%138w%zk9%zag%zb8].%0%xyt%10cl%164c]');
+ $tests[] = array('совместимая','%td%ta%sy%t8%t1%td%te%t4%t8%sw%tr]');
+ $tests[] = array('нехватка_файлового_пространства_на_сервере_p0-squid.some.domain.1270211897.txt.gz','%t9%t1%th%sy%sw%te%t6%sw]_%tg%sw%t5%t7%ta%sy%ta%sz%ta]_%tb%tc%ta%td%te%tc%sw%t9%td%te%sy%sw]_%t9%sw]_%td%t1%tc%sy%t1%tc%t1]_p0-squid.some.domain.1270211897.txt.gz');
+
+ $tests[] = array('name[1]','name[1]');
+ $tests[] = array('Name[1]','%1a]ame[1]');
+ $tests[] = array('Name[A]','%1a]ame[%x]]');
foreach($tests as $test){
list($utf8,$safe) = $test;
@@ -30,6 +34,15 @@ class safeFN_test extends UnitTestCase {
$this->assertEqual(SafeFN::decode($safe),$utf8);
}
}
+
+ function test2(){
+ $tests[] = array('совместимая','%td%ta%sy%t8%t1%td%te%t4%t8%sw%tr');
+
+ foreach($tests as $test){
+ list($utf8,$safe) = $test;
+ $this->assertEqual(SafeFN::decode($safe),$utf8);
+ }
+ }
}
//Setup VIM: ex: et ts=4 :
diff --git a/_test/cases/lib/exe/css_css_loadfile.test.php b/_test/cases/lib/exe/css_css_loadfile.test.php
new file mode 100644
index 000000000..a444d0086
--- /dev/null
+++ b/_test/cases/lib/exe/css_css_loadfile.test.php
@@ -0,0 +1,57 @@
+<?php
+
+require_once DOKU_INC.'lib/exe/css.php';
+
+class css_css_loadfile_test extends UnitTestCase {
+ public function setUp() {
+ $this->file = tempnam('/tmp', 'css');
+ parent::setUp();
+ }
+
+ private function csstest($input, $output = null, $location = 'http://www.example.com/') {
+ io_saveFile($this->file, $input);
+ $this->assertEqual(css_loadfile($this->file, $location), (is_null($output) ? $input : $output));
+ }
+
+ public function test_url_relative() {
+ $this->csstest('#test { background: url("test/test.png"); }', '#test { background: url("http://www.example.com/test/test.png"); }');
+ $this->csstest('#test { background: url(\'test/test.png\'); }', '#test { background: url(\'http://www.example.com/test/test.png\'); }');
+ }
+
+ public function test_url_absolute() {
+ $this->csstest('#test { background: url("/test/test.png"); }');
+ $this->csstest('#test { background: url(\'/test/test.png\'); }');
+ }
+
+ public function test_url_with_protocol() {
+ $this->csstest('#test { background: url("http://www.test.com/test/test.png"); }');
+ $this->csstest('#test { background: url("https://www.test.com/test/test.png"); }');
+ $this->csstest('#test { background: url(\'http://www.test.com/test/test.png\'); }');
+ $this->csstest('#test { background: url(\'https://www.test.com/test/test.png\'); }');
+ }
+
+ public function test_import_relative() {
+ $this->csstest('@import "test/test.png";', '@import "http://www.example.com/test/test.png";');
+ $this->csstest('@import \'test/test.png\';', '@import \'http://www.example.com/test/test.png\';');
+ }
+
+ public function test_import_absolute() {
+ $this->csstest('@import "/test/test.png";');
+ $this->csstest('@import \'/test/test.png\';');
+ }
+
+ public function test_import_with_protocol() {
+ $this->csstest('@import "http://www.test.com/test/test.png";');
+ $this->csstest('@import "https://www.test.com/test/test.png";');
+ $this->csstest('@import \'http://www.test.com/test/test.png\';');
+ $this->csstest('@import \'https://www.test.com/test/test.png\';');
+ }
+
+ public function tearDown() {
+ unlink($this->file);
+ unset($this->file);
+ parent::tearDown();
+ }
+}
+
+//Setup VIM: ex: et ts=4 sw=4 :
diff --git a/_test/cases/lib/exe/js_js_compress.test.php b/_test/cases/lib/exe/js_js_compress.test.php
index 76b51e5ab..4702d35d3 100644
--- a/_test/cases/lib/exe/js_js_compress.test.php
+++ b/_test/cases/lib/exe/js_js_compress.test.php
@@ -105,6 +105,12 @@ class js_js_compress_test extends UnitTestCase {
}
+ function test_complexminified(){
+ $text = 'if(!k.isXML(a))try{if(e||!l.match.PSEUDO.test(c)&&!/!=/.test(c)){var f=b.call(a,c);if(f||!d||a.document&&a.document.nodeType!==11)return f}}catch(g){}return k(c,null,null,[a]).length>0}}}(),function(){var a=c.createElement("div");a.innerHTML="<div class=\'test e\'></div><div class=\'test\'></div>";if(!!a.getElementsByClassName&&a.getElementsByClassName("e").length!==0){a.lastChild.className="e";if(a.getElementsByClassName("e").length===1)return;foo="text/*";bla="*/"';
+
+ $this->assertEqual(js_compress($text),$text);
+ }
+
/**
* Test the files provided with the original JsStrip
*/
diff --git a/bin/indexer.php b/bin/indexer.php
index 67254fa88..f6aeb4f0e 100755
--- a/bin/indexer.php
+++ b/bin/indexer.php
@@ -13,10 +13,6 @@ require_once(DOKU_INC.'inc/auth.php');
require_once(DOKU_INC.'inc/cliopts.php');
session_write_close();
-// Version tag used to force rebuild on upgrade
-// Need to keep in sync with lib/exe/indexer.php
-if(!defined('INDEXER_VERSION')) define('INDEXER_VERSION', 2);
-
// handle options
$short_opts = 'hcuq';
$long_opts = array('help', 'clear', 'update', 'quiet');
@@ -28,6 +24,7 @@ if ( $OPTS->isError() ) {
}
$CLEAR = false;
$QUIET = false;
+$INDEXER = null;
foreach ($OPTS->options as $key => $val) {
switch ($key) {
case 'h':
@@ -70,6 +67,9 @@ function _usage() {
function _update(){
global $conf;
+ global $INDEXER;
+
+ $INDEXER = idx_get_indexer();
$data = array();
_quietecho("Searching pages... ");
@@ -82,25 +82,13 @@ function _update(){
}
function _index($id){
+ global $INDEXER;
global $CLEAR;
+ global $QUIET;
- // if not cleared only update changed and new files
- if(!$CLEAR){
- $idxtag = metaFN($id,'.indexed');
- if(@file_exists($idxtag)){
- if(io_readFile($idxtag) >= INDEXER_VERSION){
- $last = @filemtime(metaFN($id,'.indexed'));
- if($last > @filemtime(wikiFN($id))) return;
- }
- }
- }
-
- _lock();
_quietecho("$id... ");
- idx_addPage($id);
- io_saveFile(metaFN($id,'.indexed'),INDEXER_VERSION);
+ idx_addPage($id, !$QUIET, $CLEAR);
_quietecho("done.\n");
- _unlock();
}
/**
@@ -146,14 +134,18 @@ function _clearindex(){
_quietecho("Clearing index... ");
io_saveFile($conf['indexdir'].'/page.idx','');
io_saveFile($conf['indexdir'].'/title.idx','');
+ io_saveFile($conf['indexdir'].'/pageword.idx','');
+ io_saveFile($conf['indexdir'].'/metadata.idx','');
$dir = @opendir($conf['indexdir']);
if($dir!==false){
while(($f = readdir($dir)) !== false){
if(substr($f,-4)=='.idx' &&
- (substr($f,0,1)=='i' || substr($f,0,1)=='w'))
+ (substr($f,0,1)=='i' || substr($f,0,1)=='w'
+ || substr($f,-6)=='_w.idx' || substr($f,-6)=='_i.idx' || substr($f,-6)=='_p.idx'))
@unlink($conf['indexdir']."/$f");
}
}
+ @unlink($conf['indexdir'].'/lengths.idx');
_quietecho("done.\n");
_unlock();
}
diff --git a/bin/striplangs.php b/bin/striplangs.php
index 288859c6a..40cef5063 100644
--- a/bin/striplangs.php
+++ b/bin/striplangs.php
@@ -22,7 +22,7 @@ function usage($show_examples = false) {
-h, --help get this help
-x, --examples get also usage examples
-k, --keep comma separated list of languages, -e is always implied
- -e, --english keeps english, dummy to use without -k";
+ -e, --english keeps english, dummy to use without -k\n";
if ( $show_examples ) {
print "\n
EXAMPLES
diff --git a/conf/.htaccess b/conf/.htaccess
index 763ebf2ee..f5dda6086 100644
--- a/conf/.htaccess
+++ b/conf/.htaccess
@@ -1,3 +1,4 @@
-## no access to the conf directory
-order allow,deny
-deny from all
+## no access to the conf directory
+order allow,deny
+deny from all
+Satisfy All
diff --git a/conf/acronyms.conf b/conf/acronyms.conf
index 172b9974d..058e85550 100644
--- a/conf/acronyms.conf
+++ b/conf/acronyms.conf
@@ -62,6 +62,7 @@ JPEG Joint Photographics Experts Group
JPG Joint Photographics Experts Group
JS JavaScript
KISS Keep it simple stupid
+LAN Local Area Network
LDAP Lightweight Directory Access Protocol
LGPL GNU Lesser General Public License
LOL Laughing out loud
diff --git a/conf/dokuwiki.php b/conf/dokuwiki.php
index 2405494e0..5e185e9c2 100644
--- a/conf/dokuwiki.php
+++ b/conf/dokuwiki.php
@@ -7,7 +7,7 @@
*
* This is a piece of PHP code so PHP syntax applies!
*
- * For help with the configuration see http://www.splitbrain.org/dokuwiki/wiki:config
+ * For help with the configuration see http://www.dokuwiki.org/config
*/
@@ -99,6 +99,7 @@ $conf['fetchsize'] = 0; //maximum size (bytes) fetch.php may do
$conf['notify'] = ''; //send change info to this email (leave blank for nobody)
$conf['registernotify'] = ''; //send info about newly registered users to this email (leave blank for nobody)
$conf['mailfrom'] = ''; //use this email when sending mails
+$conf['mailprefix'] = ''; //use this as prefix of outgoing mails
$conf['gzip_output'] = 0; //use gzip content encodeing for the output xhtml (if allowed by browser)
$conf['gdlib'] = 2; //the GDlib version (0, 1 or 2) 2 tries to autodetect
$conf['im_convert'] = ''; //path to ImageMagicks convert (will be used instead of GD)
@@ -107,6 +108,7 @@ $conf['subscribers'] = 0; //enable change notice subscription sup
$conf['subscribe_time'] = 24*60*60; //Time after which digests / lists are sent (in sec, default 1 day)
//Should be smaller than the time specified in recent_days
$conf['compress'] = 1; //Strip whitespaces and comments from Styles and JavaScript? 1|0
+$conf['cssdatauri'] = 0; //Maximum byte size of small images to embed into CSS, won't work on IE<8
$conf['hidepages'] = ''; //Regexp for pages to be skipped from RSS, Search and Recent Changes
$conf['send404'] = 0; //Send a HTTP 404 status for non existing pages?
$conf['sitemap'] = 0; //Create a google sitemap? How often? In days.
@@ -121,7 +123,7 @@ $conf['rss_linkto'] = 'diff'; //what page RSS entries link to:
// 'page' - the revised page itself
// 'rev' - page showing all revisions
// 'current' - most recent revision of page
-$conf['rss_content'] = 'abstract'; // what to put in the items by deafult?
+$conf['rss_content'] = 'abstract'; // what to put in the items by default?
// 'abstract' - plain text, first paragraph or so
// 'diff' - plain text unified diff wrapped in <pre> tags
// 'htmldiff' - diff as HTML table
diff --git a/conf/interwiki.conf b/conf/interwiki.conf
index 0e855f626..28d603de2 100644
--- a/conf/interwiki.conf
+++ b/conf/interwiki.conf
@@ -5,7 +5,8 @@
# no further encoding is done
# If no placeholder is defined the urlencoded name is appended to the URL
-# You can add more InterWiki shortcuts here.
+# To prevent losing your added InterWiki shortcuts after an upgrade,
+# you should add new ones to interwiki.local.conf
wp http://en.wikipedia.org/wiki/{NAME}
wpfr http://fr.wikipedia.org/wiki/{NAME}
@@ -15,19 +16,24 @@ wppl http://pl.wikipedia.org/wiki/{NAME}
wpjp http://ja.wikipedia.org/wiki/{NAME}
wpmeta http://meta.wikipedia.org/wiki/{NAME}
doku http://www.dokuwiki.org/
-dokubug http://bugs.splitbrain.org/index.php?do=details&amp;task_id=
+dokubug http://bugs.dokuwiki.org/index.php?do=details&amp;task_id=
rfc http://www.cs.ccu.edu.tw/~chm91u/rfc2html.php?in=
man http://man.cx/
amazon http://www.amazon.com/exec/obidos/ASIN/{URL}/splitbrain-20/
amazon.de http://www.amazon.de/exec/obidos/ASIN/{URL}/splitbrain-21/
amazon.uk http://www.amazon.co.uk/exec/obidos/ASIN/
+paypal https://www.paypal.com/cgi-bin/webscr?cmd=_xclick&amp;business=
phpfn http://www.php.net/{NAME}
coral http://{HOST}.{PORT}.nyud.net:8090/{PATH}?{QUERY}
freecache http://freecache.org/{NAME}
sb http://www.splitbrain.org/go/
+skype skype:{NAME}
google.de http://www.google.de/search?q=
go http://www.google.com/search?q={URL}&amp;btnI=lucky
+# To support VoIP/SIP links
+callto callto://{NAME}
+
# Standards from http://usemod.com/intermap.txt follow
AbbeNormal http://www.ourpla.net/cgi-bin/pikie.cgi?
diff --git a/conf/smileys.conf b/conf/smileys.conf
index 47e4537e2..80daed57a 100644
--- a/conf/smileys.conf
+++ b/conf/smileys.conf
@@ -18,6 +18,7 @@
:-X icon_silenced.gif
:-| icon_neutral.gif
;-) icon_wink.gif
+m( facepalm.gif
^_^ icon_fun.gif
:?: icon_question.gif
:!: icon_exclaim.gif
diff --git a/conf/wordblock.conf b/conf/wordblock.conf
index b3822a29c..fe451f278 100644
--- a/conf/wordblock.conf
+++ b/conf/wordblock.conf
@@ -26,4 +26,7 @@ downgradetowindowsxp\.com
elegantugg\.com
classicedhardy\.com
research-service\.com
-https?:\/\/(\S*?)(2-pay-secure|911essay|academia-research|anypapers|applicationessay|bestbuyessay|bestdissertation|bestessay|bestresume|besttermpaper|businessessay|college-paper|customessay|custom-made-paper|custom-writing|dissertationblog|dissertation-service|dissertations?expert|essaybank|essay-?blog|essaycapital|essaylogic|essaymill|essayontime|essaypaper|essays?land|essaytownsucks|essaywrit|essay-writing-service|fastessays|freelancercareers|genuinecontent|genuineessay|genuinepaper|goessay|grandresume|killer-content|ma-dissertation|managementessay|masterpaper|mightystudent|needessay|researchedge|researchpaper-blog|resumecvservice|resumesexperts|resumesplanet|rushessay|samedayessay|superiorcontent|superiorpaper|superiorthesis|term-paper|termpaper-blog|term-paper-research|thesisblog|universalresearch|valwriting|vdwriters|wisetranslation|writersassembly|writers\.com\.ph|writers\.ph)
+https?:\/\/(\S*?)(2-pay-secure|911essay|academia-research|anypapers|applicationessay|bestbuyessay|bestdissertation|bestessay|bestresume|besttermpaper|businessessay|college-paper|customessay|custom-made-paper|custom-writing|degree-?result|dissertationblog|dissertation-service|dissertations?expert|essaybank|essay-?blog|essaycapital|essaylogic|essaymill|essayontime|essaypaper|essays?land|essaytownsucks|essay-?writ|fastessays|freelancercareers|genuinecontent|genuineessay|genuinepaper|goessay|grandresume|killer-content|ma-dissertation|managementessay|masterpaper|mightystudent|needessay|researchedge|researchpaper-blog|resumecvservice|resumesexperts|resumesplanet|rushessay|samedayessay|superiorcontent|superiorpaper|superiorthesis|term-paper|termpaper-blog|term-paper-research|thesisblog|universalresearch|valwriting|vdwriters|wisetranslation|writersassembly|writers\.com\.ph|writers\.ph)
+flatsinmumbai\.co\.in
+https?:\/\/(\S*?)penny-?stock
+mattressreview\.biz
diff --git a/conf/words.aspell.dist b/conf/words.aspell.dist
deleted file mode 100644
index a49138fcb..000000000
--- a/conf/words.aspell.dist
+++ /dev/null
@@ -1,5 +0,0 @@
-personal_ws-1.1 en 4 utf-8
-DokuWiki
-Wiki
-WikiWiki
-Gohr
diff --git a/data/.htaccess b/data/.htaccess
index 281d5c33d..2cbb757e7 100644
--- a/data/.htaccess
+++ b/data/.htaccess
@@ -1,2 +1,3 @@
order allow,deny
deny from all
+Satisfy All
diff --git a/data/deleted.files b/data/deleted.files
index 4d6f31dbf..ec5d3b65d 100644
--- a/data/deleted.files
+++ b/data/deleted.files
@@ -4,6 +4,9 @@
# A copy of this list is maintained at
# http://www.dokuwiki.org/install:upgrade#files_to_remove
+# removed in 2011-05-25
+conf/words.aspell.dist
+lib/styles/style.css
# removed in 2010-11-07
inc/lang/ar/subscribermail.txt
diff --git a/doku.php b/doku.php
index 1303f1ade..4901750a8 100644
--- a/doku.php
+++ b/doku.php
@@ -7,7 +7,7 @@
*/
// update message version
-$updateVersion = 29;
+$updateVersion = 34;
// xdebug_start_profiling();
@@ -27,9 +27,13 @@ if (isset($_SERVER['HTTP_X_DOKUWIKI_DO'])){
require_once(DOKU_INC.'inc/init.php');
//import variables
+$_REQUEST['id'] = str_replace("\xC2\xAD",'',$_REQUEST['id']); //soft-hyphen
$QUERY = trim($_REQUEST['id']);
$ID = getID();
+
+// deprecated 2011-01-14
$NS = getNS($ID);
+
$REV = $_REQUEST['rev'];
$IDX = $_REQUEST['idx'];
$DATE = $_REQUEST['date'];
diff --git a/feed.php b/feed.php
index 9536c9986..cca8661f4 100644
--- a/feed.php
+++ b/feed.php
@@ -24,7 +24,7 @@ $cache = new cache($key, '.feed');
// prepare cache depends
$depends['files'] = getConfigFiles('main');
$depends['age'] = $conf['rss_update'];
-$depends['purge'] = ($_REQUEST['purge']) ? true : false;
+$depends['purge'] = isset($_REQUEST['purge']);
// check cacheage and deliver if nothing has changed since last
// time or the update interval has not passed, also handles conditional requests
@@ -50,23 +50,25 @@ $rss->cssStyleSheet = DOKU_URL.'lib/exe/css.php?s=feed';
$image = new FeedImage();
$image->title = $conf['title'];
-$image->url = DOKU_URL."lib/images/favicon.ico";
+$image->url = tpl_getFavicon(true);
$image->link = DOKU_URL;
$rss->image = $image;
$data = null;
-if($opt['feed_mode'] == 'list'){
- $data = rssListNamespace($opt);
-}elseif($opt['feed_mode'] == 'search'){
- $data = rssSearch($opt);
-}else{
+$modes = array('list' => 'rssListNamespace',
+ 'search' => 'rssSearch',
+ 'recent' => 'rssRecentChanges');
+if (isset($modes[$opt['feed_mode']])) {
+ $data = $modes[$opt['feed_mode']]($opt);
+} else {
$eventData = array(
'opt' => &$opt,
'data' => &$data,
);
$event = new Doku_Event('FEED_MODE_UNKNOWN', $eventData);
if ($event->advise_before(true)) {
- $data = rssRecentChanges($opt);
+ echo sprintf('<error>Unknown feed mode %s</error>', hsc($opt['feed_mode']));
+ exit;
}
$event->advise_after();
}
@@ -83,29 +85,53 @@ print $feed;
// ---------------------------------------------------------------- //
/**
- * Get URL parameters and config options and return a initialized option array
+ * Get URL parameters and config options and return an initialized option array
*
* @author Andreas Gohr <andi@splitbrain.org>
*/
function rss_parseOptions(){
global $conf;
- $opt['items'] = (int) $_REQUEST['num'];
- $opt['feed_type'] = $_REQUEST['type'];
- $opt['feed_mode'] = $_REQUEST['mode'];
- $opt['show_minor'] = $_REQUEST['minor'];
- $opt['namespace'] = $_REQUEST['ns'];
- $opt['link_to'] = $_REQUEST['linkto'];
- $opt['item_content'] = $_REQUEST['content'];
- $opt['search_query'] = $_REQUEST['q'];
-
- if(!$opt['feed_type']) $opt['feed_type'] = $conf['rss_type'];
- if(!$opt['item_content']) $opt['item_content'] = $conf['rss_content'];
- if(!$opt['link_to']) $opt['link_to'] = $conf['rss_linkto'];
- if(!$opt['items']) $opt['items'] = $conf['recent'];
+ $opt = array();
+
+ foreach(array(
+ // Basic feed properties
+ // Plugins may probably want to add new values to these
+ // properties for implementing own feeds
+
+ // One of: list, search, recent
+ 'feed_mode' => array('mode', 'recent'),
+ // One of: diff, page, rev, current
+ 'link_to' => array('linkto', $conf['rss_linkto']),
+ // One of: abstract, diff, htmldiff, html
+ 'item_content' => array('content', $conf['rss_content']),
+
+ // Special feed properties
+ // These are only used by certain feed_modes
+
+ // String, used for feed title, in list and rc mode
+ 'namespace' => array('ns', null),
+ // Positive integer, only used in rc mode
+ 'items' => array('num', $conf['recent']),
+ // Boolean, only used in rc mode
+ 'show_minor' => array('minor', false),
+ // String, only used in search mode
+ 'search_query' => array('q', null),
+
+ ) as $name => $val) {
+ $opt[$name] = (isset($_REQUEST[$val[0]]) && !empty($_REQUEST[$val[0]]))
+ ? $_REQUEST[$val[0]] : $val[1];
+ }
+
+ $opt['items'] = max(0, (int) $opt['items']);
+ $opt['show_minor'] = (bool) $opt['show_minor'];
+
$opt['guardmail'] = ($conf['mailguard'] != '' && $conf['mailguard'] != 'none');
- switch ($opt['feed_type']){
+ $type = valid_input_set('type', array('rss','rss2','atom','atom1','rss1',
+ 'default' => $conf['rss_type']),
+ $_REQUEST);
+ switch ($type){
case 'rss':
$opt['feed_type'] = 'RSS0.91';
$opt['mime_type'] = 'text/xml';
@@ -279,7 +305,7 @@ function rss_buildItems(&$rss,&$data,$opt){
}
// add category
- if($meta['subject']){
+ if(isset($meta['subject'])) {
$item->category = $meta['subject'];
}else{
$cat = getNS($id);
diff --git a/inc/.htaccess b/inc/.htaccess
index aebb21cd2..68ae43e72 100644
--- a/inc/.htaccess
+++ b/inc/.htaccess
@@ -1,3 +1,4 @@
-## no access to the inc directory
-order allow,deny
-deny from all
+## no access to the inc directory
+order allow,deny
+deny from all
+Satisfy All
diff --git a/inc/DifferenceEngine.php b/inc/DifferenceEngine.php
index dd096a55a..6e1d07382 100644
--- a/inc/DifferenceEngine.php
+++ b/inc/DifferenceEngine.php
@@ -29,8 +29,8 @@ class _DiffOp {
class _DiffOp_Copy extends _DiffOp {
var $type = 'copy';
-
- function _DiffOp_Copy($orig, $closing = false) {
+
+ function __construct($orig, $closing = false) {
if (!is_array($closing))
$closing = $orig;
$this->orig = $orig;
@@ -44,8 +44,8 @@ class _DiffOp_Copy extends _DiffOp {
class _DiffOp_Delete extends _DiffOp {
var $type = 'delete';
-
- function _DiffOp_Delete($lines) {
+
+ function __construct($lines) {
$this->orig = $lines;
$this->closing = false;
}
@@ -57,8 +57,8 @@ class _DiffOp_Delete extends _DiffOp {
class _DiffOp_Add extends _DiffOp {
var $type = 'add';
-
- function _DiffOp_Add($lines) {
+
+ function __construct($lines) {
$this->closing = $lines;
$this->orig = false;
}
@@ -70,8 +70,8 @@ class _DiffOp_Add extends _DiffOp {
class _DiffOp_Change extends _DiffOp {
var $type = 'change';
-
- function _DiffOp_Change($orig, $closing) {
+
+ function __construct($orig, $closing) {
$this->orig = $orig;
$this->closing = $closing;
}
@@ -499,7 +499,7 @@ class Diff {
* (Typically these are lines from a file.)
* @param $to_lines array An array of strings.
*/
- function Diff($from_lines, $to_lines) {
+ function __construct($from_lines, $to_lines) {
$eng = new _DiffEngine;
$this->edits = $eng->diff($from_lines, $to_lines);
//$this->_check($from_lines, $to_lines);
@@ -645,12 +645,12 @@ class MappedDiff extends Diff {
* @param $mapped_to_lines array This array should
* have the same number of elements as $to_lines.
*/
- function MappedDiff($from_lines, $to_lines, $mapped_from_lines, $mapped_to_lines) {
+ function __construct($from_lines, $to_lines, $mapped_from_lines, $mapped_to_lines) {
assert(count($from_lines) == count($mapped_from_lines));
assert(count($to_lines) == count($mapped_to_lines));
- $this->Diff($mapped_from_lines, $mapped_to_lines);
+ parent::__construct($mapped_from_lines, $mapped_to_lines);
$xi = $yi = 0;
$ecnt = count($this->edits);
@@ -827,7 +827,8 @@ class DiffFormatter {
define('NBSP', "\xC2\xA0"); // utf-8 non-breaking space.
class _HWLDF_WordAccumulator {
- function _HWLDF_WordAccumulator() {
+
+ function __construct() {
$this->_lines = array();
$this->_line = '';
$this->_group = '';
@@ -882,11 +883,11 @@ class _HWLDF_WordAccumulator {
class WordLevelDiff extends MappedDiff {
- function WordLevelDiff($orig_lines, $closing_lines) {
+ function __construct($orig_lines, $closing_lines) {
list ($orig_words, $orig_stripped) = $this->_split($orig_lines);
list ($closing_words, $closing_stripped) = $this->_split($closing_lines);
- $this->MappedDiff($orig_words, $closing_words, $orig_stripped, $closing_stripped);
+ parent::__construct($orig_words, $closing_words, $orig_stripped, $closing_stripped);
}
function _split($lines) {
@@ -923,16 +924,16 @@ class WordLevelDiff extends MappedDiff {
}
class InlineWordLevelDiff extends MappedDiff {
-
- function InlineWordLevelDiff($orig_lines, $closing_lines) {
+
+ function __construct($orig_lines, $closing_lines) {
list ($orig_words, $orig_stripped) = $this->_split($orig_lines);
list ($closing_words, $closing_stripped) = $this->_split($closing_lines);
- $this->MappedDiff($orig_words, $closing_words, $orig_stripped, $closing_stripped);
+ parent::__construct($orig_words, $closing_words, $orig_stripped, $closing_stripped);
}
function _split($lines) {
- if (!preg_match_all('/ ( [^\S\n]+ | [0-9_A-Za-z\x80-\xff]+ | . ) (?: (?!< \n) [^\S\n])? /xs',
+ if (!preg_match_all('/ ( [^\S\n]+ | [0-9_A-Za-z\x80-\xff]+ | . ) (?: (?!< \n) [^\S\n])? /xsu',
implode("\n", $lines), $m)) {
return array(array(''), array(''));
}
@@ -943,7 +944,7 @@ class InlineWordLevelDiff extends MappedDiff {
$orig = new _HWLDF_WordAccumulator;
foreach ($this->edits as $edit) {
if ($edit->type == 'copy')
- $orig->addWords($edit->orig);
+ $orig->addWords($edit->closing);
elseif ($edit->type == 'change'){
$orig->addWords($edit->orig, 'del');
$orig->addWords($edit->closing, 'add');
@@ -965,7 +966,7 @@ class InlineWordLevelDiff extends MappedDiff {
*/
class UnifiedDiffFormatter extends DiffFormatter {
- function UnifiedDiffFormatter($context_lines = 4) {
+ function __construct($context_lines = 4) {
$this->leading_context_lines = $context_lines;
$this->trailing_context_lines = $context_lines;
}
@@ -996,7 +997,7 @@ class UnifiedDiffFormatter extends DiffFormatter {
*/
class TableDiffFormatter extends DiffFormatter {
- function TableDiffFormatter() {
+ function __construct() {
$this->leading_context_lines = 2;
$this->trailing_context_lines = 2;
}
@@ -1020,7 +1021,7 @@ class TableDiffFormatter extends DiffFormatter {
$l1 = $lang['line'].' '.$xbeg;
$l2 = $lang['line'].' '.$ybeg;
$r = '<tr><td class="diff-blockheader" colspan="2">'.$l1.":</td>\n".
- ' <td class="diff-blockheader" colspan="2">'.$l2.":</td>\n".
+ '<td class="diff-blockheader" colspan="2">'.$l2.":</td>\n".
"</tr>\n";
return $r;
}
@@ -1087,8 +1088,9 @@ class TableDiffFormatter extends DiffFormatter {
*
*/
class InlineDiffFormatter extends DiffFormatter {
+ var $colspan = 4;
- function InlineDiffFormatter() {
+ function __construct() {
$this->leading_context_lines = 2;
$this->trailing_context_lines = 2;
}
@@ -1113,7 +1115,7 @@ class InlineDiffFormatter extends DiffFormatter {
$xbeg .= "," . $xlen;
if ($ylen != 1)
$ybeg .= "," . $ylen;
- $r = '<tr><td class="diff-blockheader">@@ '.$lang['line']." -$xbeg +$ybeg @@";
+ $r = '<tr><td colspan="'.$this->colspan.'" class="diff-blockheader">@@ '.$lang['line']." -$xbeg +$ybeg @@";
$r .= ' <span class="diff-deletedline"><del>'.$lang['deleted'].'</del></span>';
$r .= ' <span class="diff-addedline">'.$lang['created'].'</span>';
$r .= "</td></tr>\n";
@@ -1132,19 +1134,19 @@ class InlineDiffFormatter extends DiffFormatter {
function _added($lines) {
foreach ($lines as $line) {
- print('<tr><td class="diff-addedline">'. $line . "</td></tr>\n");
+ print('<tr><td colspan="'.$this->colspan.'" class="diff-addedline">'. $line . "</td></tr>\n");
}
}
function _deleted($lines) {
foreach ($lines as $line) {
- print('<tr><td class="diff-deletedline"><del>' . $line . "</del></td></tr>\n");
+ print('<tr><td colspan="'.$this->colspan.'" class="diff-deletedline"><del>' . $line . "</del></td></tr>\n");
}
}
function _context($lines) {
foreach ($lines as $line) {
- print('<tr><td class="diff-context">'.$line."</td></tr>\n");
+ print('<tr><td colspan="'.$this->colspan.'" class="diff-context">'.$line."</td></tr>\n");
}
}
@@ -1153,7 +1155,7 @@ class InlineDiffFormatter extends DiffFormatter {
$add = $diff->inline();
foreach ($add as $line)
- print('<tr><td>'.$line."</td></tr>\n");
+ print('<tr><td colspan="'.$this->colspan.'">'.$line."</td></tr>\n");
}
}
diff --git a/inc/EmailAddressValidator.php b/inc/EmailAddressValidator.php
index 2ce2093e2..bb4ef0ca9 100644
--- a/inc/EmailAddressValidator.php
+++ b/inc/EmailAddressValidator.php
@@ -5,21 +5,38 @@
* @author Dave Child <dave@addedbytes.com>
* @link http://code.google.com/p/php-email-address-validation/
* @license http://www.opensource.org/licenses/bsd-license.php
+ * @version SVN r10 + Issue 15 fix + Issue 12 fix
*/
class EmailAddressValidator {
+ /**
+ * Set true to allow addresses like me@localhost
+ */
+ public $allowLocalAddresses = false;
/**
* Check email address validity
* @param strEmailAddress Email address to be checked
* @return True if email is valid, false if not
*/
- function check_email_address($strEmailAddress) {
+ public function check_email_address($strEmailAddress) {
+
+ // If magic quotes is "on", email addresses with quote marks will
+ // fail validation because of added escape characters. Uncommenting
+ // the next three lines will allow for this issue.
+ //if (get_magic_quotes_gpc()) {
+ // $strEmailAddress = stripslashes($strEmailAddress);
+ //}
// Control characters are not allowed
if (preg_match('/[\x00-\x1F\x7F-\xFF]/', $strEmailAddress)) {
return false;
}
+ // Check email length - min 3 (a@a), max 256
+ if (!$this->check_text_length($strEmailAddress, 3, 256)) {
+ return false;
+ }
+
// Split it into sections using last instance of "@"
$intAtSymbol = strrpos($strEmailAddress, '@');
if ($intAtSymbol === false) {
@@ -31,10 +48,15 @@ class EmailAddressValidator {
// Count the "@" symbols. Only one is allowed, except where
// contained in quote marks in the local part. Quickest way to
- // check this is to remove anything in quotes.
- $arrTempAddress[0] = preg_replace('/"[^"]+"/'
+ // check this is to remove anything in quotes. We also remove
+ // characters escaped with backslash, and the backslash
+ // character.
+ $arrTempAddress[0] = preg_replace('/\./'
,''
,$arrEmailAddress[0]);
+ $arrTempAddress[0] = preg_replace('/"[^"]+"/'
+ ,''
+ ,$arrTempAddress[0]);
$arrTempAddress[1] = $arrEmailAddress[1];
$strTempAddress = $arrTempAddress[0] . $arrTempAddress[1];
// Then check - should be no "@" symbols.
@@ -63,7 +85,7 @@ class EmailAddressValidator {
* @param strLocalPortion Text to be checked
* @return True if local portion is valid, false if not
*/
- function check_local_portion($strLocalPortion) {
+ protected function check_local_portion($strLocalPortion) {
// Local portion can only be from 1 to 64 characters, inclusive.
// Please note that servers are encouraged to accept longer local
// parts than 64 characters.
@@ -94,22 +116,39 @@ class EmailAddressValidator {
* @param strDomainPortion Text to be checked
* @return True if domain portion is valid, false if not
*/
- function check_domain_portion($strDomainPortion) {
+ protected function check_domain_portion($strDomainPortion) {
// Total domain can only be from 1 to 255 characters, inclusive
if (!$this->check_text_length($strDomainPortion, 1, 255)) {
return false;
}
+
+ // some IPv4/v6 regexps borrowed from Feyd
+ // see: http://forums.devnetwork.net/viewtopic.php?f=38&t=53479
+ $dec_octet = '(?:25[0-5]|2[0-4]\d|1\d\d|[1-9]\d|[0-9])';
+ $hex_digit = '[A-Fa-f0-9]';
+ $h16 = "{$hex_digit}{1,4}";
+ $IPv4Address = "$dec_octet\\.$dec_octet\\.$dec_octet\\.$dec_octet";
+ $ls32 = "(?:$h16:$h16|$IPv4Address)";
+ $IPv6Address =
+ "(?:(?:{$IPv4Address})|(?:".
+ "(?:$h16:){6}$ls32" .
+ "|::(?:$h16:){5}$ls32" .
+ "|(?:$h16)?::(?:$h16:){4}$ls32" .
+ "|(?:(?:$h16:){0,1}$h16)?::(?:$h16:){3}$ls32" .
+ "|(?:(?:$h16:){0,2}$h16)?::(?:$h16:){2}$ls32" .
+ "|(?:(?:$h16:){0,3}$h16)?::(?:$h16:){1}$ls32" .
+ "|(?:(?:$h16:){0,4}$h16)?::$ls32" .
+ "|(?:(?:$h16:){0,5}$h16)?::$h16" .
+ "|(?:(?:$h16:){0,6}$h16)?::" .
+ ")(?:\\/(?:12[0-8]|1[0-1][0-9]|[1-9][0-9]|[0-9]))?)";
+
// Check if domain is IP, possibly enclosed in square brackets.
- if (preg_match('/^(25[0-5]|2[0-4][0-9]|1[0-9][0-9]|[1-9]?[0-9])'
- .'(\.(25[0-5]|2[0-4][0-9]|1[0-9][0-9]|[1-9]?[0-9])){3}$/'
- ,$strDomainPortion) ||
- preg_match('/^\[(25[0-5]|2[0-4][0-9]|1[0-9][0-9]|[1-9]?[0-9])'
- .'(\.(25[0-5]|2[0-4][0-9]|1[0-9][0-9]|[1-9]?[0-9])){3}\]$/'
- ,$strDomainPortion)) {
+ if (preg_match("/^($IPv4Address|\[$IPv4Address\]|\[$IPv6Address\])$/",
+ $strDomainPortion)){
return true;
} else {
$arrDomainPortion = explode('.', $strDomainPortion);
- if (sizeof($arrDomainPortion) < 2) {
+ if (!$this->allowLocalAddresses && sizeof($arrDomainPortion) < 2) {
return false; // Not enough parts to domain
}
for ($i = 0, $max = sizeof($arrDomainPortion); $i < $max; $i++) {
@@ -121,6 +160,11 @@ class EmailAddressValidator {
.'([A-Za-z0-9]+))$/', $arrDomainPortion[$i])) {
return false;
}
+ if ($i == $max - 1) { // TLD cannot be only numbers
+ if (strlen(preg_replace('/[0-9]/', '', $arrDomainPortion[$i])) <= 0) {
+ return false;
+ }
+ }
}
}
return true;
@@ -133,7 +177,7 @@ class EmailAddressValidator {
* @param intMaximum Maximum acceptable length
* @return True if string is within bounds (inclusive), false if not
*/
- function check_text_length($strText, $intMinimum, $intMaximum) {
+ protected function check_text_length($strText, $intMinimum, $intMaximum) {
// Minimum and maximum are both inclusive
$intTextLength = strlen($strText);
if (($intTextLength < $intMinimum) || ($intTextLength > $intMaximum)) {
@@ -142,5 +186,6 @@ class EmailAddressValidator {
return true;
}
}
+
}
diff --git a/inc/FeedParser.php b/inc/FeedParser.php
index b98350da7..235bed46e 100644
--- a/inc/FeedParser.php
+++ b/inc/FeedParser.php
@@ -49,7 +49,7 @@ class FeedParser_File extends SimplePie_File {
*/
function FeedParser_File($url, $timeout=10, $redirects=5,
$headers=null, $useragent=null, $force_fsockopen=false) {
- parent::__construct();
+ @parent::__construct();
$this->http = new DokuHTTPClient();
$this->success = $this->http->sendRequest($url);
diff --git a/inc/HTTPClient.php b/inc/HTTPClient.php
index 43b00034c..372769b71 100644
--- a/inc/HTTPClient.php
+++ b/inc/HTTPClient.php
@@ -71,6 +71,7 @@ class DokuHTTPClient extends HTTPClient {
* @link http://www.splitbrain.org/go/videodb
* @author Andreas Goetz <cpuidle@gmx.de>
* @author Andreas Gohr <andi@splitbrain.org>
+ * @author Tobias Sarnowski <sarnowski@new-thoughts.org>
*/
class HTTPClient {
//set these if you like
@@ -86,6 +87,7 @@ class HTTPClient {
var $headers;
var $debug;
var $start = 0; // for timings
+ var $keep_alive = true; // keep alive rocks
// don't set these, read on error
var $error;
@@ -108,6 +110,9 @@ class HTTPClient {
var $proxy_ssl; //boolean set to true if your proxy needs SSL
var $proxy_except; // regexp of URLs to exclude from proxy
+ // list of kept alive connections
+ static $connections = array();
+
// what we use as boundary on multipart/form-data posts
var $boundary = '---DokuWikiHTTPClient--4523452351';
@@ -222,7 +227,7 @@ class HTTPClient {
$path = $uri['path'];
if(empty($path)) $path = '/';
if(!empty($uri['query'])) $path .= '?'.$uri['query'];
- $port = $uri['port'];
+ if(isset($uri['port']) && !empty($uri['port'])) $port = $uri['port'];
if(isset($uri['user'])) $this->user = $uri['user'];
if(isset($uri['pass'])) $this->pass = $uri['pass'];
@@ -235,7 +240,7 @@ class HTTPClient {
}else{
$request_url = $path;
$server = $server;
- if (empty($port)) $port = ($uri['scheme'] == 'https') ? 443 : 80;
+ if (!isset($port)) $port = ($uri['scheme'] == 'https') ? 443 : 80;
}
// add SSL stream prefix if needed - needs SSL support in PHP
@@ -247,7 +252,11 @@ class HTTPClient {
if($uri['port']) $headers['Host'].= ':'.$uri['port'];
$headers['User-Agent'] = $this->agent;
$headers['Referer'] = $this->referer;
- $headers['Connection'] = 'Close';
+ if ($this->keep_alive) {
+ $headers['Connection'] = 'Keep-Alive';
+ } else {
+ $headers['Connection'] = 'Close';
+ }
if($method == 'POST'){
if(is_array($data)){
if($headers['Content-Type'] == 'multipart/form-data'){
@@ -273,15 +282,34 @@ class HTTPClient {
// stop time
$start = time();
- // open socket
- $socket = @fsockopen($server,$port,$errno, $errstr, $this->timeout);
- if (!$socket){
- $this->status = -100;
- $this->error = "Could not connect to $server:$port\n$errstr ($errno)";
- return false;
+ // already connected?
+ $connectionId = $this->_uniqueConnectionId($server,$port);
+ $this->_debug('connection pool', $this->connections);
+ $socket = null;
+ if (isset($this->connections[$connectionId])) {
+ $this->_debug('reusing connection', $connectionId);
+ $socket = $this->connections[$connectionId];
}
- //set non blocking
- stream_set_blocking($socket,0);
+ if (is_null($socket) || feof($socket)) {
+ $this->_debug('opening connection', $connectionId);
+ // open socket
+ $socket = @fsockopen($server,$port,$errno, $errstr, $this->timeout);
+ if (!$socket){
+ $this->status = -100;
+ $this->error = "Could not connect to $server:$port\n$errstr ($errno)";
+ return false;
+ }
+
+ // keep alive?
+ if ($this->keep_alive) {
+ $this->connections[$connectionId] = $socket;
+ } else {
+ unset($this->connections[$connectionId]);
+ }
+ }
+
+ //set blocking
+ stream_set_blocking($socket,1);
// build request
$request = "$method $request_url HTTP/".$this->http.HTTP_NL;
@@ -292,29 +320,52 @@ class HTTPClient {
$this->_debug('request',$request);
+ // select parameters
+ $sel_r = null;
+ $sel_w = array($socket);
+ $sel_e = null;
+
// send request
$towrite = strlen($request);
$written = 0;
while($written < $towrite){
- $ret = fwrite($socket, substr($request,$written));
+ // check timeout
+ if(time()-$start > $this->timeout){
+ $this->status = -100;
+ $this->error = sprintf('Timeout while sending request (%.3fs)',$this->_time() - $this->start);
+ unset($this->connections[$connectionId]);
+ return false;
+ }
+
+ // wait for stream ready or timeout (1sec)
+ if(stream_select($sel_r,$sel_w,$sel_e,1) === false) continue;
+
+ // write to stream
+ $ret = fwrite($socket, substr($request,$written,4096));
if($ret === false){
$this->status = -100;
$this->error = 'Failed writing to socket';
+ unset($this->connections[$connectionId]);
return false;
}
$written += $ret;
}
+ // continue non-blocking
+ stream_set_blocking($socket,0);
+
// read headers from socket
$r_headers = '';
do{
if(time()-$start > $this->timeout){
$this->status = -100;
$this->error = sprintf('Timeout while reading headers (%.3fs)',$this->_time() - $this->start);
+ unset($this->connections[$connectionId]);
return false;
}
if(feof($socket)){
$this->error = 'Premature End of File (socket)';
+ unset($this->connections[$connectionId]);
return false;
}
$r_headers .= fgets($socket,1024);
@@ -327,6 +378,7 @@ class HTTPClient {
if($match[1] > $this->max_bodysize){
$this->error = 'Reported content length exceeds allowed response size';
if ($this->max_bodysize_abort)
+ unset($this->connections[$connectionId]);
return false;
}
}
@@ -334,6 +386,7 @@ class HTTPClient {
// get Status
if (!preg_match('/^HTTP\/(\d\.\d)\s*(\d+).*?\n/', $r_headers, $m)) {
$this->error = 'Server returned bad answer';
+ unset($this->connections[$connectionId]);
return false;
}
$this->status = $m[2];
@@ -359,6 +412,11 @@ class HTTPClient {
// check server status code to follow redirect
if($this->status == 301 || $this->status == 302 ){
+ // close the connection because we don't handle content retrieval here
+ // that's the easiest way to clean up the connection
+ fclose($socket);
+ unset($this->connections[$connectionId]);
+
if (empty($this->resp_headers['location'])){
$this->error = 'Redirect but no Location Header found';
return false;
@@ -386,6 +444,7 @@ class HTTPClient {
// check if headers are as expected
if($this->header_regexp && !preg_match($this->header_regexp,$r_headers)){
$this->error = 'The received headers did not match the given regexp';
+ unset($this->connections[$connectionId]);
return false;
}
@@ -397,11 +456,13 @@ class HTTPClient {
do {
if(feof($socket)){
$this->error = 'Premature End of File (socket)';
+ unset($this->connections[$connectionId]);
return false;
}
if(time()-$start > $this->timeout){
$this->status = -100;
$this->error = sprintf('Timeout while reading chunk (%.3fs)',$this->_time() - $this->start);
+ unset($this->connections[$connectionId]);
return false;
}
$byte = fread($socket,1);
@@ -418,10 +479,12 @@ class HTTPClient {
if($this->max_bodysize && strlen($r_body) > $this->max_bodysize){
$this->error = 'Allowed response size exceeded';
- if ($this->max_bodysize_abort)
+ if ($this->max_bodysize_abort){
+ unset($this->connections[$connectionId]);
return false;
- else
+ } else {
break;
+ }
}
} while ($chunk_size);
}else{
@@ -430,16 +493,19 @@ class HTTPClient {
if(time()-$start > $this->timeout){
$this->status = -100;
$this->error = sprintf('Timeout while reading response (%.3fs)',$this->_time() - $this->start);
+ unset($this->connections[$connectionId]);
return false;
}
$r_body .= fread($socket,4096);
$r_size = strlen($r_body);
if($this->max_bodysize && $r_size > $this->max_bodysize){
$this->error = 'Allowed response size exceeded';
- if ($this->max_bodysize_abort)
+ if ($this->max_bodysize_abort) {
+ unset($this->connections[$connectionId]);
return false;
- else
+ } else {
break;
+ }
}
if(isset($this->resp_headers['content-length']) &&
!isset($this->resp_headers['transfer-encoding']) &&
@@ -450,9 +516,13 @@ class HTTPClient {
}
}
- // close socket
- $status = socket_get_status($socket);
- fclose($socket);
+ if (!$this->keep_alive ||
+ (isset($this->resp_headers['connection']) && $this->resp_headers['connection'] == 'Close')) {
+ // close socket
+ $status = socket_get_status($socket);
+ fclose($socket);
+ unset($this->connections[$connectionId]);
+ }
// decode gzip if needed
if(isset($this->resp_headers['content-encoding']) &&
@@ -506,12 +576,13 @@ class HTTPClient {
*/
function _parseHeaders($string){
$headers = array();
- $lines = explode("\n",$string);
- foreach($lines as $line){
- list($key,$val) = explode(':',$line,2);
- $key = strtolower(trim($key));
- $val = trim($val);
- if(empty($val)) continue;
+ if (!preg_match_all('/^\s*([\w-]+)\s*:\s*([\S \t]+)\s*$/m', $string,
+ $matches, PREG_SET_ORDER)) {
+ return $headers;
+ }
+ foreach($matches as $match){
+ list(, $key, $val) = $match;
+ $key = strtolower($key);
if(isset($headers[$key])){
if(is_array($headers[$key])){
$headers[$key][] = $val;
@@ -598,6 +669,14 @@ class HTTPClient {
return $out;
}
+ /**
+ * Generates a unique identifier for a connection.
+ *
+ * @return string unique identifier
+ */
+ function _uniqueConnectionId($server, $port) {
+ return "$server:$port";
+ }
}
//Setup VIM: ex: et ts=4 :
diff --git a/inc/IXR_Library.php b/inc/IXR_Library.php
index c7f83a6d6..c8255e6d9 100644
--- a/inc/IXR_Library.php
+++ b/inc/IXR_Library.php
@@ -395,13 +395,8 @@ EOD;
$this->output($error->getXml());
}
function output($xml) {
- $xml = '<?xml version="1.0"?>'."\n".$xml;
- $length = strlen($xml);
- header('Connection: close');
- header('Content-Length: '.$length);
- header('Content-Type: text/xml');
- header('Date: '.date('r'));
- echo $xml;
+ header('Content-Type: text/xml; charset=utf-8');
+ echo '<?xml version="1.0"?>', "\n", $xml;
exit;
}
function hasMethod($method) {
diff --git a/inc/JpegMeta.php b/inc/JpegMeta.php
index fa05f6859..afa70168c 100644
--- a/inc/JpegMeta.php
+++ b/inc/JpegMeta.php
@@ -1466,16 +1466,21 @@ class JpegMeta {
$parser = xml_parser_create();
xml_parser_set_option($parser, XML_OPTION_CASE_FOLDING, 0);
xml_parser_set_option($parser, XML_OPTION_SKIP_WHITE, 1);
- xml_parse_into_struct($parser, $data, $values, $tags);
+ $result = xml_parse_into_struct($parser, $data, $values, $tags);
xml_parser_free($parser);
+ if ($result == 0) {
+ $this->_info['xmp'] = false;
+ return false;
+ }
+
$this->_info['xmp'] = array();
$count = count($values);
for ($i = 0; $i < $count; $i++) {
if ($values[$i]['tag'] == 'rdf:Description' && $values[$i]['type'] == 'open') {
- while ($values[++$i]['tag'] != 'rdf:Description') {
- $this->_parseXmpNode($values, $i, $this->_info['xmp'][$values[$i]['tag']]);
+ while ((++$i < $count) && ($values[$i]['tag'] != 'rdf:Description')) {
+ $this->_parseXmpNode($values, $i, $this->_info['xmp'][$values[$i]['tag']], $count);
}
}
}
@@ -1487,7 +1492,7 @@ class JpegMeta {
*
* @author Hakan Sandell <hakan.sandell@mydata.se>
*/
- function _parseXmpNode($values, &$i, &$meta) {
+ function _parseXmpNode($values, &$i, &$meta, $count) {
if ($values[$i]['type'] == 'close') return;
if ($values[$i]['type'] == 'complete') {
@@ -1497,11 +1502,13 @@ class JpegMeta {
}
$i++;
+ if ($i >= $count) return;
+
if ($values[$i]['tag'] == 'rdf:Bag' || $values[$i]['tag'] == 'rdf:Seq') {
// Array property
$meta = array();
while ($values[++$i]['tag'] == 'rdf:li') {
- $this->_parseXmpNode($values, $i, $meta[]);
+ $this->_parseXmpNode($values, $i, $meta[], $count);
}
$i++; // skip closing Bag/Seq tag
@@ -1509,8 +1516,8 @@ class JpegMeta {
// Language Alternative property, only the first (default) value is used
if ($values[$i]['type'] == 'open') {
$i++;
- $this->_parseXmpNode($values, $i, $meta);
- while ($values[++$i]['tag'] != 'rdf:Alt');
+ $this->_parseXmpNode($values, $i, $meta, $count);
+ while ((++$i < $count) && ($values[$i]['tag'] != 'rdf:Alt'));
$i++; // skip closing Alt tag
}
@@ -1519,8 +1526,8 @@ class JpegMeta {
$meta = array();
$startTag = $values[$i-1]['tag'];
do {
- $this->_parseXmpNode($values, $i, $meta[$values[$i]['tag']]);
- } while ($values[++$i]['tag'] != $startTag);
+ $this->_parseXmpNode($values, $i, $meta[$values[$i]['tag']], $count);
+ } while ((++$i < $count) && ($values[$i]['tag'] != $startTag));
}
}
diff --git a/inc/PassHash.class.php b/inc/PassHash.class.php
new file mode 100644
index 000000000..541de6752
--- /dev/null
+++ b/inc/PassHash.class.php
@@ -0,0 +1,379 @@
+<?php
+/**
+ * Password Hashing Class
+ *
+ * This class implements various mechanisms used to hash passwords
+ *
+ * @author Andreas Gohr <andi@splitbrain.org>
+ * @license LGPL2
+ */
+class PassHash {
+ /**
+ * Verifies a cleartext password against a crypted hash
+ *
+ * The method and salt used for the crypted hash is determined automatically,
+ * then the clear text password is crypted using the same method. If both hashs
+ * match true is is returned else false
+ *
+ * @author Andreas Gohr <andi@splitbrain.org>
+ * @return bool
+ */
+ function verify_hash($clear,$hash){
+ $method='';
+ $salt='';
+ $magic='';
+
+ //determine the used method and salt
+ $len = strlen($hash);
+ if(preg_match('/^\$1\$([^\$]{0,8})\$/',$hash,$m)){
+ $method = 'smd5';
+ $salt = $m[1];
+ $magic = '1';
+ }elseif(preg_match('/^\$apr1\$([^\$]{0,8})\$/',$hash,$m)){
+ $method = 'apr1';
+ $salt = $m[1];
+ $magic = 'apr1';
+ }elseif(preg_match('/^\$P\$(.{31})$/',$hash,$m)){
+ $method = 'pmd5';
+ $salt = $m[1];
+ $magic = 'P';
+ }elseif(preg_match('/^\$H\$(.{31})$/',$hash,$m)){
+ $method = 'pmd5';
+ $salt = $m[1];
+ $magic = 'H';
+ }elseif(preg_match('/^sha1\$(.{5})\$/',$hash,$m)){
+ $method = 'djangosha1';
+ $salt = $m[1];
+ }elseif(preg_match('/^md5\$(.{5})\$/',$hash,$m)){
+ $method = 'djangomd5';
+ $salt = $m[1];
+ }elseif(substr($hash,0,6) == '{SSHA}'){
+ $method = 'ssha';
+ $salt = substr(base64_decode(substr($hash, 6)),20);
+ }elseif($len == 32){
+ $method = 'md5';
+ }elseif($len == 40){
+ $method = 'sha1';
+ }elseif($len == 16){
+ $method = 'mysql';
+ }elseif($len == 41 && $hash[0] == '*'){
+ $method = 'my411';
+ }elseif($len == 34){
+ $method = 'kmd5';
+ $salt = $hash;
+ }else{
+ $method = 'crypt';
+ $salt = substr($hash,0,2);
+ }
+
+ //crypt and compare
+ $call = 'hash_'.$method;
+ if($this->$call($clear,$salt,$magic) === $hash){
+ return true;
+ }
+ return false;
+ }
+
+ /**
+ * Create a random salt
+ *
+ * @param int $len - The length of the salt
+ */
+ public function gen_salt($len=32){
+ $salt = '';
+ $chars = 'abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789';
+ for($i=0;$i<$len,$i++;) $salt .= $chars[mt_rand(0,61)];
+ return $salt;
+ }
+
+ /**
+ * Initialize the passed variable with a salt if needed.
+ *
+ * If $salt is not null, the value is kept, but the lenght restriction is
+ * applied.
+ *
+ * @param stringref $salt - The salt, pass null if you want one generated
+ * @param int $len - The length of the salt
+ */
+ public function init_salt(&$salt,$len=32){
+ if(is_null($salt)) $salt = $this->gen_salt($len);
+ if(strlen($salt) > $len) $salt = substr($salt,0,$len);
+ }
+
+ // Password hashing methods follow below
+
+ /**
+ * Password hashing method 'smd5'
+ *
+ * Uses salted MD5 hashs. Salt is 8 bytes long.
+ *
+ * The same mechanism is used by Apache's 'apr1' method. This will
+ * fallback to a implementation in pure PHP if MD5 support is not
+ * available in crypt()
+ *
+ * @author Andreas Gohr <andi@splitbrain.org>
+ * @author <mikey_nich at hotmail dot com>
+ * @link http://de.php.net/manual/en/function.crypt.php#73619
+ * @param string $clear - the clear text to hash
+ * @param string $salt - the salt to use, null for random
+ * @param string $magic - the hash identifier (apr1 or 1)
+ * @returns string - hashed password
+ */
+ public function hash_smd5($clear, $salt=null){
+ $this->init_salt($salt,8);
+
+ if(defined('CRYPT_MD5') && CRYPT_MD5){
+ return crypt($clear,'$1$'.$salt.'$');
+ }else{
+ // Fall back to PHP-only implementation
+ return $this->hash_apr1($clear, $salt, '1');
+ }
+ }
+
+ /**
+ * Password hashing method 'apr1'
+ *
+ * Uses salted MD5 hashs. Salt is 8 bytes long.
+ *
+ * This is basically the same as smd1 above, but as used by Apache.
+ *
+ * @author <mikey_nich at hotmail dot com>
+ * @link http://de.php.net/manual/en/function.crypt.php#73619
+ * @param string $clear - the clear text to hash
+ * @param string $salt - the salt to use, null for random
+ * @param string $magic - the hash identifier (apr1 or 1)
+ * @returns string - hashed password
+ */
+ public function hash_apr1($clear, $salt=null, $magic='apr1'){
+ $this->init_salt($salt,8);
+
+ $len = strlen($clear);
+ $text = $clear.'$'.$magic.'$'.$salt;
+ $bin = pack("H32", md5($clear.$salt.$clear));
+ for($i = $len; $i > 0; $i -= 16) {
+ $text .= substr($bin, 0, min(16, $i));
+ }
+ for($i = $len; $i > 0; $i >>= 1) {
+ $text .= ($i & 1) ? chr(0) : $clear{0};
+ }
+ $bin = pack("H32", md5($text));
+ for($i = 0; $i < 1000; $i++) {
+ $new = ($i & 1) ? $clear : $bin;
+ if ($i % 3) $new .= $salt;
+ if ($i % 7) $new .= $clear;
+ $new .= ($i & 1) ? $bin : $clear;
+ $bin = pack("H32", md5($new));
+ }
+ $tmp = '';
+ for ($i = 0; $i < 5; $i++) {
+ $k = $i + 6;
+ $j = $i + 12;
+ if ($j == 16) $j = 5;
+ $tmp = $bin[$i].$bin[$k].$bin[$j].$tmp;
+ }
+ $tmp = chr(0).chr(0).$bin[11].$tmp;
+ $tmp = strtr(strrev(substr(base64_encode($tmp), 2)),
+ "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/",
+ "./0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz");
+ return '$'.$magic.'$'.$salt.'$'.$tmp;
+ }
+
+ /**
+ * Password hashing method 'md5'
+ *
+ * Uses MD5 hashs.
+ *
+ * @param string $clear - the clear text to hash
+ * @returns string - hashed password
+ */
+ public function hash_md5($clear){
+ return md5($clear);
+ }
+
+ /**
+ * Password hashing method 'sha1'
+ *
+ * Uses SHA1 hashs.
+ *
+ * @param string $clear - the clear text to hash
+ * @returns string - hashed password
+ */
+ public function hash_sha1($clear){
+ return sha1($clear);
+ }
+
+ /**
+ * Password hashing method 'ssha' as used by LDAP
+ *
+ * Uses salted SHA1 hashs. Salt is 4 bytes long.
+ *
+ * @param string $clear - the clear text to hash
+ * @param string $salt - the salt to use, null for random
+ * @returns string - hashed password
+ */
+ public function hash_ssha($clear, $salt=null){
+ $this->init_salt($salt,4);
+ return '{SSHA}'.base64_encode(pack("H*", sha1($clear.$salt)).$salt);
+ }
+
+ /**
+ * Password hashing method 'crypt'
+ *
+ * Uses salted crypt hashs. Salt is 2 bytes long.
+ *
+ * @param string $clear - the clear text to hash
+ * @param string $salt - the salt to use, null for random
+ * @returns string - hashed password
+ */
+ public function hash_crypt($clear, $salt=null){
+ $this->init_salt($salt,2);
+ return crypt($clear,$salt);
+ }
+
+ /**
+ * Password hashing method 'mysql'
+ *
+ * This method was used by old MySQL systems
+ *
+ * @link http://www.php.net/mysql
+ * @author <soren at byu dot edu>
+ * @param string $clear - the clear text to hash
+ * @returns string - hashed password
+ */
+ public function hash_mysql($clear){
+ $nr=0x50305735;
+ $nr2=0x12345671;
+ $add=7;
+ $charArr = preg_split("//", $clear);
+ foreach ($charArr as $char) {
+ if (($char == '') || ($char == ' ') || ($char == '\t')) continue;
+ $charVal = ord($char);
+ $nr ^= ((($nr & 63) + $add) * $charVal) + ($nr << 8);
+ $nr2 += ($nr2 << 8) ^ $nr;
+ $add += $charVal;
+ }
+ return sprintf("%08x%08x", ($nr & 0x7fffffff), ($nr2 & 0x7fffffff));
+ }
+
+ /**
+ * Password hashing method 'my411'
+ *
+ * Uses SHA1 hashs. This method is used by MySQL 4.11 and above
+ *
+ * @param string $clear - the clear text to hash
+ * @returns string - hashed password
+ */
+ public function hash_my411($clear){
+ return '*'.sha1(pack("H*", sha1($clear)));
+ }
+
+ /**
+ * Password hashing method 'kmd5'
+ *
+ * Uses salted MD5 hashs.
+ *
+ * Salt is 2 bytes long, but stored at position 16, so you need to pass at
+ * least 18 bytes. You can pass the crypted hash as salt.
+ *
+ * @param string $clear - the clear text to hash
+ * @param string $salt - the salt to use, null for random
+ * @returns string - hashed password
+ */
+ public function hash_kmd5($clear, $salt=null){
+ $this->init_salt($salt);
+
+ $key = substr($salt, 16, 2);
+ $hash1 = strtolower(md5($key . md5($clear)));
+ $hash2 = substr($hash1, 0, 16) . $key . substr($hash1, 16);
+ return $hash2;
+ }
+
+ /**
+ * Password hashing method 'pmd5'
+ *
+ * Uses salted MD5 hashs. Salt is 1+8 bytes long, 1st byte is the
+ * iteration count.
+ *
+ * @param string $clear - the clear text to hash
+ * @param string $salt - the salt to use, null for random
+ * @param string $magic - the hash identifier (P or H)
+ * @returns string - hashed password
+ */
+ public function hash_pmd5($clear, $salt=null, $magic='P'){
+ $this->init_salt($salt);
+
+ $itoa64 = './0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz';
+ $iterc = $salt[0]; // pos 0 of salt is iteration count
+ $iter = strpos($itoa64,$iterc);
+ $iter = 1 << $iter;
+ $salt = substr($salt,1,8);
+
+ // iterate
+ $hash = md5($salt . $clear, true);
+ do {
+ $hash = md5($hash . $clear, true);
+ } while (--$iter);
+
+ // encode
+ $output = '';
+ $count = 16;
+ $i = 0;
+ do {
+ $value = ord($hash[$i++]);
+ $output .= $itoa64[$value & 0x3f];
+ if ($i < $count)
+ $value |= ord($hash[$i]) << 8;
+ $output .= $itoa64[($value >> 6) & 0x3f];
+ if ($i++ >= $count)
+ break;
+ if ($i < $count)
+ $value |= ord($hash[$i]) << 16;
+ $output .= $itoa64[($value >> 12) & 0x3f];
+ if ($i++ >= $count)
+ break;
+ $output .= $itoa64[($value >> 18) & 0x3f];
+ } while ($i < $count);
+
+ return '$'.$magic.'$'.$iterc.$salt.$output;
+ }
+
+ /**
+ * Alias for hash_pmd5
+ */
+ public function hash_hmd5($clear, $salt=null, $magic='H'){
+ return $this->hash_pmd5($clear, $salt, $magic);
+ }
+
+ /**
+ * Password hashing method 'djangosha1'
+ *
+ * Uses salted SHA1 hashs. Salt is 5 bytes long.
+ * This is used by the Django Python framework
+ *
+ * @link http://docs.djangoproject.com/en/dev/topics/auth/#passwords
+ * @param string $clear - the clear text to hash
+ * @param string $salt - the salt to use, null for random
+ * @returns string - hashed password
+ */
+ public function hash_djangosha1($clear, $salt=null){
+ $this->init_salt($salt,5);
+ return 'sha1$'.$salt.'$'.sha1($salt.$clear);
+ }
+
+ /**
+ * Password hashing method 'djangomd5'
+ *
+ * Uses salted MD5 hashs. Salt is 5 bytes long.
+ * This is used by the Django Python framework
+ *
+ * @link http://docs.djangoproject.com/en/dev/topics/auth/#passwords
+ * @param string $clear - the clear text to hash
+ * @param string $salt - the salt to use, null for random
+ * @returns string - hashed password
+ */
+ public function hash_djangomd5($clear, $salt=null){
+ $this->init_salt($salt,5);
+ return 'md5$'.$salt.'$'.md5($salt.$clear);
+ }
+
+}
diff --git a/inc/SafeFN.class.php b/inc/SafeFN.class.php
index ac6698a63..43b19e9ab 100644
--- a/inc/SafeFN.class.php
+++ b/inc/SafeFN.class.php
@@ -16,9 +16,9 @@
class SafeFN {
// 'safe' characters are a superset of $plain, $pre_indicator and $post_indicator
- private static $plain = '-/_0123456789abcdefghijklmnopqrstuvwxyz'; // these characters aren't converted
+ private static $plain = '-./[_0123456789abcdefghijklmnopqrstuvwxyz'; // these characters aren't converted
private static $pre_indicator = '%';
- private static $post_indicator = '.';
+ private static $post_indicator = ']';
/**
* Convert an UTF-8 string to a safe ASCII String
@@ -37,7 +37,7 @@ class SafeFN {
* - reduce codepoint value for non-printable ASCII characters (0x00 - 0x1f). Space becomes our zero.
* - convert reduced value to base36 (0-9a-z)
* - append $pre_indicator characater followed by base36 string to output, set converted flag
- * continue to next character)
+ * (continue to next character)
*
* @param string $filename a utf8 string, should only include printable characters - not 0x00-0x1f
* @return string an encoded representation of $filename using only 'safe' ASCII characters
diff --git a/inc/Sitemapper.php b/inc/Sitemapper.php
index 47a3fedb5..bbe1caf26 100644
--- a/inc/Sitemapper.php
+++ b/inc/Sitemapper.php
@@ -45,7 +45,7 @@ class Sitemapper {
dbglog("Sitemapper::generate(): using $sitemap"); // FIXME: Only in debug mode
- $pages = idx_getIndex('page', '');
+ $pages = idx_get_indexer()->getPages();
dbglog('Sitemapper::generate(): creating sitemap using '.count($pages).' pages');
$items = array();
diff --git a/inc/TarLib.class.php b/inc/TarLib.class.php
index 7a7acdbdb..12418c48d 100644
--- a/inc/TarLib.class.php
+++ b/inc/TarLib.class.php
@@ -7,7 +7,7 @@
*
* Modified for Dokuwiki
*
- * @license GPL
+ * @license LGPL-2.1
* @link http://docs.maxg.info
* @author Bouchon <tarlib@bouchon.org> (Maxg)
* @author Christopher Smith <chris@jalakai.co.uk>
diff --git a/inc/actions.php b/inc/actions.php
index a4461d1ab..ecf09036f 100644
--- a/inc/actions.php
+++ b/inc/actions.php
@@ -18,6 +18,7 @@ if(!defined('DOKU_INC')) die('meh.');
function act_dispatch(){
global $ACT;
global $ID;
+ global $INFO;
global $QUERY;
global $lang;
global $conf;
@@ -134,8 +135,15 @@ function act_dispatch(){
$pluginlist = plugin_list('admin');
if (in_array($_REQUEST['page'], $pluginlist)) {
// attempt to load the plugin
- if ($plugin =& plugin_load('admin',$_REQUEST['page']) !== null)
- $plugin->handle();
+ if ($plugin =& plugin_load('admin',$_REQUEST['page']) !== null){
+ if($plugin->forAdminOnly() && !$INFO['isadmin']){
+ // a manager tried to load a plugin that's for admins only
+ unset($_REQUEST['page']);
+ msg('For admins only',-1);
+ }else{
+ $plugin->handle();
+ }
+ }
}
}
}
@@ -182,6 +190,7 @@ function act_sendheaders($headers) {
function act_clean($act){
global $lang;
global $conf;
+ global $INFO;
// check if the action was given as array key
if(is_array($act)){
@@ -211,6 +220,9 @@ function act_clean($act){
return 'show';
}
+ //is there really a draft?
+ if($act == 'draft' && !file_exists($INFO['draft'])) return 'edit';
+
if(!in_array($act,array('login','logout','register','save','cancel','edit','draft',
'preview','search','show','check','index','revisions',
'diff','recent','backlink','admin','subscribe','revert',
@@ -244,7 +256,6 @@ function act_permcheck($act){
$permneed = AUTH_CREATE;
}
}elseif(in_array($act,array('login','search','recent','profile','index', 'sitemap'))){
- }elseif(in_array($act,array('login','search','recent','profile','sitemap'))){
$permneed = AUTH_NONE;
}elseif($act == 'revert'){
$permneed = AUTH_ADMIN;
@@ -296,7 +307,6 @@ function act_draftsave($act){
'text' => $_POST['wikitext'],
'suffix' => $_POST['suffix'],
'date' => (int) $_POST['date'],
- 'date' => $_POST['date'],
'client' => $INFO['client'],
);
$cname = getCacheName($draft['client'].$ID,'.draft');
@@ -499,10 +509,14 @@ function act_edit($act){
if(!$DATE) $DATE = $INFO['meta']['date']['modified'];
//check if locked by anyone - if not lock for my self
- $lockedby = checklock($ID);
- if($lockedby) return 'locked';
+ //do not lock when the user can't edit anyway
+ if ($INFO['writable']) {
+ $lockedby = checklock($ID);
+ if($lockedby) return 'locked';
+
+ lock($ID);
+ }
- lock($ID);
return $act;
}
@@ -611,7 +625,7 @@ function act_sitemap($act) {
print "Sitemap generation is disabled.";
exit;
}
-
+
$sitemap = Sitemapper::getFilePath();
if(strrchr($sitemap, '.') === '.gz'){
$mime = 'application/x-gzip';
@@ -627,6 +641,7 @@ function act_sitemap($act) {
if (is_readable($sitemap)) {
// Send headers
header('Content-Type: '.$mime);
+ header('Content-Disposition: attachment; filename='.basename($sitemap));
http_conditionalRequest(filemtime($sitemap));
diff --git a/inc/adLDAP.php b/inc/adLDAP.php
index 94cd8a50d..a64096b85 100644
--- a/inc/adLDAP.php
+++ b/inc/adLDAP.php
@@ -1,7 +1,7 @@
<?php
/**
* PHP LDAP CLASS FOR MANIPULATING ACTIVE DIRECTORY
- * Version 3.3.1
+ * Version 3.3.2
*
* PHP Version 5 with SSL and LDAP support
*
@@ -9,7 +9,7 @@
* email: scott@wiggumworld.com, adldap@richardhyland.com
* http://adldap.sourceforge.net/
*
- * Copyright (c) 2006-2009 Scott Barnett, Richard Hyland
+ * Copyright (c) 2006-2010 Scott Barnett, Richard Hyland
*
* We'd appreciate any improvements or additions to be submitted back
* to benefit the entire community :)
@@ -27,10 +27,10 @@
* @category ToolsAndUtilities
* @package adLDAP
* @author Scott Barnett, Richard Hyland
- * @copyright (c) 2006-2009 Scott Barnett, Richard Hyland
+ * @copyright (c) 2006-2010 Scott Barnett, Richard Hyland
* @license http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html LGPLv2.1
- * @revision $Revision: 67 $
- * @version 3.3.1
+ * @revision $Revision: 91 $
+ * @version 3.3.2
* @link http://adldap.sourceforge.net/
*/
@@ -409,25 +409,26 @@ class adLDAP {
* @param bool optional $prevent_rebind
* @return bool
*/
- public function authenticate($username,$password,$prevent_rebind=false){
+ public function authenticate($username, $password, $prevent_rebind = false) {
// Prevent null binding
- if ($username===NULL || $password===NULL){ return (false); }
- if (empty($username) || empty($password)){ return (false); }
+ if ($username === NULL || $password === NULL) { return false; }
+ if (empty($username) || empty($password)) { return false; }
// Bind as the user
- $this->_bind = @ldap_bind($this->_conn,$username.$this->_account_suffix,$password);
- if (!$this->_bind){ return (false); }
+ $ret = true;
+ $this->_bind = @ldap_bind($this->_conn, $username . $this->_account_suffix, $password);
+ if (!$this->_bind){ $ret = false; }
// Cnce we've checked their details, kick back into admin mode if we have it
- if ($this->_ad_username!=NULL && !$prevent_rebind){
- $this->_bind = @ldap_bind($this->_conn,$this->_ad_username.$this->_account_suffix,$this->_ad_password);
+ if ($this->_ad_username !== NULL && !$prevent_rebind) {
+ $this->_bind = @ldap_bind($this->_conn, $this->_ad_username . $this->_account_suffix , $this->_ad_password);
if (!$this->_bind){
// This should never happen in theory
throw new adLDAPException('Rebind to Active Directory failed. AD said: ' . $this->get_last_error());
}
}
- return (true);
+ return $ret;
}
//*****************************************************************************************************************
@@ -758,7 +759,7 @@ class adLDAP {
$ret_groups=array();
$groups=$this->group_info($group,array("memberof"));
- if (is_array($groups[0]["memberof"])) {
+ if (isset($groups[0]["memberof"]) && is_array($groups[0]["memberof"])) {
$groups=$groups[0]["memberof"];
if ($groups){
@@ -861,7 +862,7 @@ class adLDAP {
* @param array $attributes The attributes to set to the user account
* @return bool
*/
- public function user_create($attributes){
+ public function user_create($attributes){
// Check for compulsory fields
if (!array_key_exists("username",$attributes)){ return ("Missing compulsory field [username]"); }
if (!array_key_exists("firstname",$attributes)){ return ("Missing compulsory field [firstname]"); }
@@ -963,25 +964,36 @@ class adLDAP {
$username = $this->strguid2hex($username);
$filter="objectguid=".$username;
}
+ else if (strstr($username, "@")) {
+ $filter="userPrincipalName=".$username;
+ }
else {
- $filter="samaccountname=".$username;
+ $filter="samaccountname=".$username;
}
+ $filter = "(&(objectCategory=person)({$filter}))";
if ($fields===NULL){ $fields=array("samaccountname","mail","memberof","department","displayname","telephonenumber","primarygroupid","objectsid"); }
+ if (!in_array("objectsid",$fields)){
+ $fields[] = "objectsid";
+ }
$sr=ldap_search($this->_conn,$this->_base_dn,$filter,$fields);
$entries = ldap_get_entries($this->_conn, $sr);
- if ($entries[0]['count'] >= 1) {
- // AD does not return the primary group in the ldap query, we may need to fudge it
- if ($this->_real_primarygroup && isset($entries[0]["primarygroupid"][0]) && isset($entries[0]["objectsid"][0])){
- //$entries[0]["memberof"][]=$this->group_cn($entries[0]["primarygroupid"][0]);
- $entries[0]["memberof"][]=$this->get_primary_group($entries[0]["primarygroupid"][0], $entries[0]["objectsid"][0]);
- } else {
- $entries[0]["memberof"][]="CN=Domain Users,CN=Users,".$this->_base_dn;
+ if (isset($entries[0])) {
+ if ($entries[0]['count'] >= 1) {
+ if (in_array("memberof", $fields)) {
+ // AD does not return the primary group in the ldap query, we may need to fudge it
+ if ($this->_real_primarygroup && isset($entries[0]["primarygroupid"][0]) && isset($entries[0]["objectsid"][0])){
+ //$entries[0]["memberof"][]=$this->group_cn($entries[0]["primarygroupid"][0]);
+ $entries[0]["memberof"][]=$this->get_primary_group($entries[0]["primarygroupid"][0], $entries[0]["objectsid"][0]);
+ } else {
+ $entries[0]["memberof"][]="CN=Domain Users,CN=Users,".$this->_base_dn;
+ }
+ $entries[0]["memberof"]["count"]++;
+ }
}
+ return $entries;
}
-
- $entries[0]["memberof"]["count"]++;
- return ($entries);
+ return false;
}
/**
@@ -1171,8 +1183,17 @@ class adLDAP {
$add=array();
$add["unicodePwd"][0]=$this->encode_password($password);
- $result=ldap_mod_replace($this->_conn,$user_dn,$add);
- if ($result==false){ return (false); }
+ $result=@ldap_mod_replace($this->_conn,$user_dn,$add);
+ if ($result==false){
+ $err = ldap_errno($this->_conn);
+ if($err){
+ $msg = 'Error '.$err.': '.ldap_err2str($err).'.';
+ if($err == 53) $msg .= ' Your password might not match the password policy.';
+ throw new adLDAPException($msg);
+ }else{
+ return false;
+ }
+ }
return (true);
}
@@ -1232,6 +1253,33 @@ class adLDAP {
}
}
+ /**
+ * Move a user account to a different OU
+ *
+ * @param string $username The username to move (please be careful here!)
+ * @param array $container The container or containers to move the user to (please be careful here!).
+ * accepts containers in 1. parent 2. child order
+ * @return array
+ */
+ public function user_move($username, $container) {
+ if (!$this->_bind){ return (false); }
+ if ($username === null){ return ("Missing compulsory field [username]"); }
+ if ($container === null){ return ("Missing compulsory field [container]"); }
+ if (!is_array($container)){ return ("Container must be an array"); }
+
+ $userinfo = $this->user_info($username, array("*"));
+ $dn = $userinfo[0]['distinguishedname'][0];
+ $newrdn = "cn=" . $username;
+ $container = array_reverse($container);
+ $newcontainer = "ou=" . implode(",ou=",$container);
+ $newbasedn = strtolower($newcontainer) . "," . $this->_base_dn;
+ $result=@ldap_rename($this->_conn,$dn,$newrdn,$newbasedn,true);
+ if ($result !== true) {
+ return (false);
+ }
+ return (true);
+ }
+
//*****************************************************************************************************************
// CONTACT FUNCTIONS
// * Still work to do in this area, and new functions to write
@@ -1568,6 +1616,32 @@ class adLDAP {
}
//************************************************************************************************************
+ // ORGANIZATIONAL UNIT FUNCTIONS
+
+ /**
+ * Create an organizational unit
+ *
+ * @param array $attributes Default attributes of the ou
+ * @return bool
+ */
+ public function ou_create($attributes){
+ if (!is_array($attributes)){ return ("Attributes must be an array"); }
+ if (!array_key_exists("ou_name",$attributes)){ return ("Missing compulsory field [ou_name]"); }
+ if (!array_key_exists("container",$attributes)){ return ("Missing compulsory field [container]"); }
+ if (!is_array($attributes["container"])){ return ("Container attribute must be an array."); }
+ $attributes["container"]=array_reverse($attributes["container"]);
+
+ $add=array();
+ $add["objectClass"] = "organizationalUnit";
+
+ $container="OU=".implode(",OU=",$attributes["container"]);
+ $result=ldap_add($this->_conn,"CN=".$add["cn"].", ".$container.",".$this->_base_dn,$add);
+ if ($result!=true){ return (false); }
+
+ return (true);
+ }
+
+ //************************************************************************************************************
// EXCHANGE FUNCTIONS
/**
@@ -1998,6 +2072,7 @@ class adLDAP {
if ($attributes["exchange_usedefaults"]){ $mod["mDBUseDefaults"][0]=$attributes["exchange_usedefaults"]; }
if ($attributes["exchange_policyexclude"]){ $mod["msExchPoliciesExcluded"][0]=$attributes["exchange_policyexclude"]; }
if ($attributes["exchange_policyinclude"]){ $mod["msExchPoliciesIncluded"][0]=$attributes["exchange_policyinclude"]; }
+ if ($attributes["exchange_addressbook"]){ $mod["showInAddressBook"][0]=$attributes["exchange_addressbook"]; }
// This schema is designed for contacts
if ($attributes["exchange_hidefromlists"]){ $mod["msExchHideFromAddressLists"][0]=$attributes["exchange_hidefromlists"]; }
diff --git a/inc/auth.php b/inc/auth.php
index 834b63ec3..eff984b36 100644
--- a/inc/auth.php
+++ b/inc/auth.php
@@ -70,6 +70,12 @@ function auth_setup(){
$_REQUEST['http_credentials'] = false;
if (!$conf['rememberme']) $_REQUEST['r'] = false;
+ // handle renamed HTTP_AUTHORIZATION variable (can happen when a fix like
+ // the one presented at
+ // http://www.besthostratings.com/articles/http-auth-php-cgi.html is used
+ // for enabling HTTP authentication with CGI/SuExec)
+ if(isset($_SERVER['REDIRECT_HTTP_AUTHORIZATION']))
+ $_SERVER['HTTP_AUTHORIZATION'] = $_SERVER['REDIRECT_HTTP_AUTHORIZATION'];
// streamline HTTP auth credentials (IIS/rewrite -> mod_php)
if(isset($_SERVER['HTTP_AUTHORIZATION'])){
list($_SERVER['PHP_AUTH_USER'],$_SERVER['PHP_AUTH_PW']) =
@@ -183,7 +189,8 @@ function auth_login($user,$pass,$sticky=false,$silent=false){
if ($auth->checkPass($user,$pass)){
// make logininfo globally available
$_SERVER['REMOTE_USER'] = $user;
- auth_setCookie($user,PMA_blowfish_encrypt($pass,auth_cookiesalt()),$sticky);
+ $secret = auth_cookiesalt(!$sticky); //bind non-sticky to session
+ auth_setCookie($user,PMA_blowfish_encrypt($pass,$secret),$sticky);
return true;
}else{
//invalid credentials - log off
@@ -194,23 +201,26 @@ function auth_login($user,$pass,$sticky=false,$silent=false){
}else{
// read cookie information
list($user,$sticky,$pass) = auth_getCookie();
- // get session info
- $session = $_SESSION[DOKU_COOKIE]['auth'];
if($user && $pass){
// we got a cookie - see if we can trust it
+
+ // get session info
+ $session = $_SESSION[DOKU_COOKIE]['auth'];
if(isset($session) &&
$auth->useSessionCache($user) &&
($session['time'] >= time()-$conf['auth_security_timeout']) &&
($session['user'] == $user) &&
- ($session['pass'] == $pass) && //still crypted
+ ($session['pass'] == sha1($pass)) && //still crypted
($session['buid'] == auth_browseruid()) ){
+
// he has session, cookie and browser right - let him in
$_SERVER['REMOTE_USER'] = $user;
$USERINFO = $session['info']; //FIXME move all references to session
return true;
}
// no we don't trust it yet - recheck pass but silent
- $pass = PMA_blowfish_decrypt($pass,auth_cookiesalt());
+ $secret = auth_cookiesalt(!$sticky); //bind non-sticky to session
+ $pass = PMA_blowfish_decrypt($pass,$secret);
return auth_login($user,$pass,$sticky,true);
}
}
@@ -291,10 +301,10 @@ function auth_browseruid(){
* and stored in this file.
*
* @author Andreas Gohr <andi@splitbrain.org>
- *
+ * @param bool $addsession if true, the sessionid is added to the salt
* @return string
*/
-function auth_cookiesalt(){
+function auth_cookiesalt($addsession=false){
global $conf;
$file = $conf['metadir'].'/_htcookiesalt';
$salt = io_readFile($file);
@@ -302,6 +312,9 @@ function auth_cookiesalt(){
$salt = uniqid(rand(),true);
io_saveFile($file,$salt);
}
+ if($addsession){
+ $salt .= session_id();
+ }
return $salt;
}
@@ -416,7 +429,7 @@ function auth_isMember($memberlist,$user,array $groups){
if (!$auth) return false;
// clean user and groups
- if($auth->isCaseSensitive()){
+ if(!$auth->isCaseSensitive()){
$user = utf8_strtolower($user);
$groups = array_map('utf8_strtolower',$groups);
}
@@ -431,7 +444,7 @@ function auth_isMember($memberlist,$user,array $groups){
// compare cleaned values
foreach($members as $member){
- if($auth->isCaseSensitive()) $member = utf8_strtolower($member);
+ if(!$auth->isCaseSensitive()) $member = utf8_strtolower($member);
if($member[0] == '@'){
$member = $auth->cleanGroup(substr($member,1));
if(in_array($member, $groups)) return true;
@@ -680,9 +693,8 @@ function register(){
global $conf;
global $auth;
- if (!$auth) return false;
if(!$_POST['save']) return false;
- if(!$auth->canDo('addUser')) return false;
+ if(!actionOK('register')) return false;
//clean username
$_POST['login'] = trim($auth->cleanUser($_POST['login']));
@@ -758,12 +770,10 @@ function updateprofile() {
global $lang;
global $auth;
- if (!$auth) return false;
if(empty($_POST['save'])) return false;
if(!checkSecurityToken()) return false;
- // should not be able to get here without Profile being possible...
- if(!$auth->canDo('Profile')) {
+ if(!actionOK('profile')) {
msg($lang['profna'],-1);
return false;
}
@@ -806,11 +816,11 @@ function updateprofile() {
if ($result = $auth->triggerUserMod('modify', array($_SERVER['REMOTE_USER'], $changes))) {
// update cookie and session with the changed data
- $cookie = base64_decode($_COOKIE[DOKU_COOKIE]);
- list($user,$sticky,$pass) = explode('|',$cookie,3);
- if ($changes['pass']) $pass = PMA_blowfish_encrypt($changes['pass'],auth_cookiesalt());
-
- auth_setCookie($_SERVER['REMOTE_USER'],$pass,(bool)$sticky);
+ if ($changes['pass']){
+ list($user,$sticky,$pass) = auth_getCookie();
+ $pass = PMA_blowfish_encrypt($changes['pass'],auth_cookiesalt(!$sticky));
+ auth_setCookie($_SERVER['REMOTE_USER'],$pass,(bool)$sticky);
+ }
return true;
}
}
@@ -834,11 +844,7 @@ function act_resendpwd(){
global $conf;
global $auth;
- if(!actionOK('resendpwd')) return false;
- if (!$auth) return false;
-
- // should not be able to get here without modPass being possible...
- if(!$auth->canDo('modPass')) {
+ if(!actionOK('resendpwd')) {
msg($lang['resendna'],-1);
return false;
}
@@ -926,18 +932,6 @@ function act_resendpwd(){
* If the selected method needs a salt and none was given, a random one
* is chosen.
*
- * The following methods are understood:
- *
- * smd5 - Salted MD5 hashing
- * apr1 - Apache salted MD5 hashing
- * md5 - Simple MD5 hashing
- * sha1 - SHA1 hashing
- * ssha - Salted SHA1 hashing
- * crypt - Unix crypt
- * mysql - MySQL password (old method)
- * my411 - MySQL 4.1.1 password
- * kmd5 - Salted MD5 hashing as used by UNB
- *
* @author Andreas Gohr <andi@splitbrain.org>
* @return string The crypted password
*/
@@ -945,128 +939,26 @@ function auth_cryptPassword($clear,$method='',$salt=null){
global $conf;
if(empty($method)) $method = $conf['passcrypt'];
- //prepare a salt
- if(is_null($salt)) $salt = md5(uniqid(rand(), true));
-
- switch(strtolower($method)){
- case 'smd5':
- if(defined('CRYPT_MD5') && CRYPT_MD5) return crypt($clear,'$1$'.substr($salt,0,8).'$');
- // when crypt can't handle SMD5, falls through to pure PHP implementation
- $magic = '1';
- case 'apr1':
- //from http://de.php.net/manual/en/function.crypt.php#73619 comment by <mikey_nich at hotmail dot com>
- if(!isset($magic)) $magic = 'apr1';
- $salt = substr($salt,0,8);
- $len = strlen($clear);
- $text = $clear.'$'.$magic.'$'.$salt;
- $bin = pack("H32", md5($clear.$salt.$clear));
- for($i = $len; $i > 0; $i -= 16) {
- $text .= substr($bin, 0, min(16, $i));
- }
- for($i = $len; $i > 0; $i >>= 1) {
- $text .= ($i & 1) ? chr(0) : $clear{0};
- }
- $bin = pack("H32", md5($text));
- for($i = 0; $i < 1000; $i++) {
- $new = ($i & 1) ? $clear : $bin;
- if ($i % 3) $new .= $salt;
- if ($i % 7) $new .= $clear;
- $new .= ($i & 1) ? $bin : $clear;
- $bin = pack("H32", md5($new));
- }
- $tmp = '';
- for ($i = 0; $i < 5; $i++) {
- $k = $i + 6;
- $j = $i + 12;
- if ($j == 16) $j = 5;
- $tmp = $bin[$i].$bin[$k].$bin[$j].$tmp;
- }
- $tmp = chr(0).chr(0).$bin[11].$tmp;
- $tmp = strtr(strrev(substr(base64_encode($tmp), 2)),
- "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/",
- "./0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz");
- return '$'.$magic.'$'.$salt.'$'.$tmp;
- case 'md5':
- return md5($clear);
- case 'sha1':
- return sha1($clear);
- case 'ssha':
- $salt=substr($salt,0,4);
- return '{SSHA}'.base64_encode(pack("H*", sha1($clear.$salt)).$salt);
- case 'crypt':
- return crypt($clear,substr($salt,0,2));
- case 'mysql':
- //from http://www.php.net/mysql comment by <soren at byu dot edu>
- $nr=0x50305735;
- $nr2=0x12345671;
- $add=7;
- $charArr = preg_split("//", $clear);
- foreach ($charArr as $char) {
- if (($char == '') || ($char == ' ') || ($char == '\t')) continue;
- $charVal = ord($char);
- $nr ^= ((($nr & 63) + $add) * $charVal) + ($nr << 8);
- $nr2 += ($nr2 << 8) ^ $nr;
- $add += $charVal;
- }
- return sprintf("%08x%08x", ($nr & 0x7fffffff), ($nr2 & 0x7fffffff));
- case 'my411':
- return '*'.sha1(pack("H*", sha1($clear)));
- case 'kmd5':
- $key = substr($salt, 16, 2);
- $hash1 = strtolower(md5($key . md5($clear)));
- $hash2 = substr($hash1, 0, 16) . $key . substr($hash1, 16);
- return $hash2;
- default:
- msg("Unsupported crypt method $method",-1);
+ $pass = new PassHash();
+ $call = 'hash_'.$method;
+
+ if(!method_exists($pass,$call)){
+ msg("Unsupported crypt method $method",-1);
+ return false;
}
+
+ return $pass->$call($clear,$salt);
}
/**
* Verifies a cleartext password against a crypted hash
*
- * The method and salt used for the crypted hash is determined automatically
- * then the clear text password is crypted using the same method. If both hashs
- * match true is is returned else false
- *
* @author Andreas Gohr <andi@splitbrain.org>
* @return bool
*/
function auth_verifyPassword($clear,$crypt){
- $method='';
- $salt='';
-
- //determine the used method and salt
- $len = strlen($crypt);
- if(preg_match('/^\$1\$([^\$]{0,8})\$/',$crypt,$m)){
- $method = 'smd5';
- $salt = $m[1];
- }elseif(preg_match('/^\$apr1\$([^\$]{0,8})\$/',$crypt,$m)){
- $method = 'apr1';
- $salt = $m[1];
- }elseif(substr($crypt,0,6) == '{SSHA}'){
- $method = 'ssha';
- $salt = substr(base64_decode(substr($crypt, 6)),20);
- }elseif($len == 32){
- $method = 'md5';
- }elseif($len == 40){
- $method = 'sha1';
- }elseif($len == 16){
- $method = 'mysql';
- }elseif($len == 41 && $crypt[0] == '*'){
- $method = 'my411';
- }elseif($len == 34){
- $method = 'kmd5';
- $salt = $crypt;
- }else{
- $method = 'crypt';
- $salt = substr($crypt,0,2);
- }
-
- //crypt and compare
- if(auth_cryptPassword($clear,$method,$salt) === $crypt){
- return true;
- }
- return false;
+ $pass = new PassHash();
+ return $pass->verify_hash($clear,$crypt);
}
/**
@@ -1095,7 +987,7 @@ function auth_setCookie($user,$pass,$sticky) {
}
// set session
$_SESSION[DOKU_COOKIE]['auth']['user'] = $user;
- $_SESSION[DOKU_COOKIE]['auth']['pass'] = $pass;
+ $_SESSION[DOKU_COOKIE]['auth']['pass'] = sha1($pass);
$_SESSION[DOKU_COOKIE]['auth']['buid'] = auth_browseruid();
$_SESSION[DOKU_COOKIE]['auth']['info'] = $USERINFO;
$_SESSION[DOKU_COOKIE]['auth']['time'] = time();
diff --git a/inc/auth/ad.class.php b/inc/auth/ad.class.php
index 41e9d854b..9ffd3e18b 100644
--- a/inc/auth/ad.class.php
+++ b/inc/auth/ad.class.php
@@ -24,6 +24,7 @@
* $conf['auth']['ad']['ad_password'] = 'pass';
* $conf['auth']['ad']['real_primarygroup'] = 1;
* $conf['auth']['ad']['use_ssl'] = 1;
+ * $conf['auth']['ad']['use_tls'] = 1;
* $conf['auth']['ad']['debug'] = 1;
*
* // get additional information to the userinfo array
@@ -51,6 +52,7 @@ class auth_ad extends auth_basic {
global $conf;
$this->cnf = $conf['auth']['ad'];
+
// additional information fields
if (isset($this->cnf['additional'])) {
$this->cnf['additional'] = str_replace(' ', '', $this->cnf['additional']);
@@ -60,7 +62,7 @@ class auth_ad extends auth_basic {
// ldap extension is needed
if (!function_exists('ldap_connect')) {
if ($this->cnf['debug'])
- msg("LDAP err: PHP LDAP extension not found.",-1);
+ msg("AD Auth: PHP LDAP extension not found.",-1);
$this->success = false;
return;
}
@@ -97,7 +99,12 @@ class auth_ad extends auth_basic {
$this->opts['domain_controllers'] = array_map('trim',$this->opts['domain_controllers']);
$this->opts['domain_controllers'] = array_filter($this->opts['domain_controllers']);
- // we currently just handle authentication, so no capabilities are set
+ // we can change the password if SSL is set
+ if($this->opts['use_ssl'] || $this->opts['use_tls']){
+ $this->cando['modPass'] = true;
+ }
+ $this->cando['modName'] = true;
+ $this->cando['modMail'] = true;
}
/**
@@ -126,7 +133,7 @@ class auth_ad extends auth_basic {
* at least these fields:
*
* name string full name of the user
- * mail string email addres of the user
+ * mail string email address of the user
* grps array list of groups the user is in
*
* This LDAP specific function returns the following
@@ -247,6 +254,49 @@ class auth_ad extends auth_basic {
}
/**
+ * Modify user data
+ *
+ * @param $user nick of the user to be changed
+ * @param $changes array of field/value pairs to be changed
+ * @return bool
+ */
+ function modifyUser($user, $changes) {
+ $return = true;
+
+ // password changing
+ if(isset($changes['pass'])){
+ try {
+ $return = $this->adldap->user_password($user,$changes['pass']);
+ } catch (adLDAPException $e) {
+ if ($this->cnf['debug']) msg('AD Auth: '.$e->getMessage(), -1);
+ $return = false;
+ }
+ if(!$return) msg('AD Auth: failed to change the password. Maybe the password policy was not met?',-1);
+ }
+
+ // changing user data
+ $adchanges = array();
+ if(isset($changes['name'])){
+ // get first and last name
+ $parts = explode(' ',$changes['name']);
+ $adchanges['surname'] = array_pop($parts);
+ $adchanges['firstname'] = join(' ',$parts);
+ $adchanges['display_name'] = $changes['name'];
+ }
+ if(isset($changes['mail'])){
+ $adchanges['email'] = $changes['mail'];
+ }
+ try {
+ $return = $return & $this->adldap->user_modify($user,$adchanges);
+ } catch (adLDAPException $e) {
+ if ($this->cnf['debug']) msg('AD Auth: '.$e->getMessage(), -1);
+ $return = false;
+ }
+
+ return $return;
+ }
+
+ /**
* Initialize the AdLDAP library and connect to the server
*/
function _init(){
@@ -261,7 +311,7 @@ class auth_ad extends auth_basic {
return true;
} catch (adLDAPException $e) {
if ($this->cnf['debug']) {
- msg($e->getMessage(), -1);
+ msg('AD Auth: '.$e->getMessage(), -1);
}
$this->success = false;
$this->adldap = null;
diff --git a/inc/auth/ldap.class.php b/inc/auth/ldap.class.php
index 420043238..8eb411995 100644
--- a/inc/auth/ldap.class.php
+++ b/inc/auth/ldap.class.php
@@ -158,8 +158,11 @@ class auth_ldap extends auth_basic {
// in some cases getUserData is called outside the authentication workflow
// eg. for sending email notification on subscribed pages. This data might not
// be accessible anonymously, so we try to rebind the current user here
- $pass = PMA_blowfish_decrypt($_SESSION[DOKU_COOKIE]['auth']['pass'],auth_cookiesalt());
- $this->checkPass($_SESSION[DOKU_COOKIE]['auth']['user'], $pass);
+ list($loginuser,$loginsticky,$loginpass) = auth_getCookie();
+ if($loginuser && $loginpass){
+ $loginpass = PMA_blowfish_decrypt($loginpass, auth_cookiesalt(!$loginsticky));
+ $this->checkPass($loginuser, $loginpass);
+ }
}
$info['user'] = $user;
diff --git a/inc/auth/mysql.class.php b/inc/auth/mysql.class.php
index dbdfe5fda..653c725a3 100644
--- a/inc/auth/mysql.class.php
+++ b/inc/auth/mysql.class.php
@@ -46,7 +46,7 @@ class auth_mysql extends auth_basic {
// set capabilities based upon config strings set
if (empty($this->cnf['server']) || empty($this->cnf['user']) ||
- empty($this->cnf['password']) || empty($this->cnf['database'])){
+ !isset($this->cnf['password']) || empty($this->cnf['database'])){
if ($this->cnf['debug'])
msg("MySQL err: insufficient configuration.",-1,__LINE__,__FILE__);
$this->success = false;
diff --git a/inc/changelog.php b/inc/changelog.php
index cc7612bfd..15cd46d77 100644
--- a/inc/changelog.php
+++ b/inc/changelog.php
@@ -84,7 +84,10 @@ function addLogEntry($date, $id, $type=DOKU_CHANGE_TYPE_EDIT, $summary='', $extr
$meta = array();
if (!$INFO['exists'] && empty($oldmeta['persistent']['date']['created'])){ // newly created
$meta['date']['created'] = $created;
- if ($user) $meta['creator'] = $INFO['userinfo']['name'];
+ if ($user){
+ $meta['creator'] = $INFO['userinfo']['name'];
+ $meta['user'] = $user;
+ }
} elseif (!$INFO['exists'] && !empty($oldmeta['persistent']['date']['created'])) { // re-created / restored
$meta['date']['created'] = $oldmeta['persistent']['date']['created'];
$meta['date']['modified'] = $created; // use the files ctime here
diff --git a/inc/common.php b/inc/common.php
index a1c4580a6..7522095ab 100644
--- a/inc/common.php
+++ b/inc/common.php
@@ -242,13 +242,16 @@ function buildURLparams($params, $sep='&amp;'){
*/
function buildAttributes($params,$skipempty=false){
$url = '';
+ $white = false;
foreach($params as $key => $val){
if($key{0} == '_') continue;
if($val === '' && $skipempty) continue;
+ if($white) $url .= ' ';
$url .= $key.'="';
$url .= htmlspecialchars ($val);
- $url .= '" ';
+ $url .= '"';
+ $white = true;
}
return $url;
}
@@ -281,7 +284,7 @@ function breadcrumbs(){
$name = noNSorNS($ID);
if (useHeading('navigation')) {
// get page title
- $title = p_get_first_heading($ID,true);
+ $title = p_get_first_heading($ID,METADATA_RENDER_USING_SIMPLE_CACHE);
if ($title) {
$name = $title;
}
@@ -636,7 +639,7 @@ function clientIP($single=false){
// decide which IP to use, trying to avoid local addresses
$ip = array_reverse($ip);
foreach($ip as $i){
- if(preg_match('/^(127\.|10\.|192\.168\.|172\.((1[6-9])|(2[0-9])|(3[0-1]))\.)/',$i)){
+ if(preg_match('/^(::1|[fF][eE]80:|127\.|10\.|192\.168\.|172\.((1[6-9])|(2[0-9])|(3[0-1]))\.)/',$i)){
continue;
}else{
return $i;
@@ -801,7 +804,7 @@ function rawWiki($id,$rev=''){
/**
* Returns the pagetemplate contents for the ID's namespace
*
- * @triggers COMMON_PAGE_FROMTEMPLATE
+ * @triggers COMMON_PAGETPL_LOAD
* @author Andreas Gohr <andi@splitbrain.org>
*/
function pageTemplate($id){
@@ -809,29 +812,50 @@ function pageTemplate($id){
if (is_array($id)) $id = $id[0];
- $path = dirname(wikiFN($id));
- $tpl = '';
- if(@file_exists($path.'/_template.txt')){
- $tpl = io_readFile($path.'/_template.txt');
- }else{
- // search upper namespaces for templates
- $len = strlen(rtrim($conf['datadir'],'/'));
- while (strlen($path) >= $len){
- if(@file_exists($path.'/__template.txt')){
- $tpl = io_readFile($path.'/__template.txt');
- break;
+ // prepare initial event data
+ $data = array(
+ 'id' => $id, // the id of the page to be created
+ 'tpl' => '', // the text used as template
+ 'tplfile' => '', // the file above text was/should be loaded from
+ 'doreplace' => true // should wildcard replacements be done on the text?
+ );
+
+ $evt = new Doku_Event('COMMON_PAGETPL_LOAD',$data);
+ if($evt->advise_before(true)){
+ // the before event might have loaded the content already
+ if(empty($data['tpl'])){
+ // if the before event did not set a template file, try to find one
+ if(empty($data['tplfile'])){
+ $path = dirname(wikiFN($id));
+ $tpl = '';
+ if(@file_exists($path.'/_template.txt')){
+ $data['tplfile'] = $path.'/_template.txt';
+ }else{
+ // search upper namespaces for templates
+ $len = strlen(rtrim($conf['datadir'],'/'));
+ while (strlen($path) >= $len){
+ if(@file_exists($path.'/__template.txt')){
+ $data['tplfile'] = $path.'/__template.txt';
+ break;
+ }
+ $path = substr($path, 0, strrpos($path, '/'));
+ }
+ }
}
- $path = substr($path, 0, strrpos($path, '/'));
+ // load the content
+ $data['tpl'] = io_readFile($data['tplfile']);
}
+ if($data['doreplace']) parsePageTemplate($data);
}
- $data = compact('tpl', 'id');
- trigger_event('COMMON_PAGE_FROMTEMPLATE', $data, 'parsePageTemplate', true);
+ $evt->advise_after();
+ unset($evt);
+
return $data['tpl'];
}
/**
* Performs common page template replacements
- * This is the default action for COMMON_PAGE_FROMTEMPLATE
+ * This works on data from COMMON_PAGETPL_LOAD
*
* @author Andreas Gohr <andi@splitbrain.org>
*/
@@ -1128,12 +1152,15 @@ function notify($id,$who,$rev='',$summary='',$minor=false,$replace=array()){
$diff = rawWiki($id);
}
$text = str_replace('@DIFF@',$diff,$text);
- if(utf8_strlen($conf['title']) < 20) {
- $subject = '['.$conf['title'].'] '.$subject;
+ if(empty($conf['mailprefix'])) {
+ if(utf8_strlen($conf['title']) < 20) {
+ $subject = '['.$conf['title'].'] '.$subject;
+ }else{
+ $subject = '['.utf8_substr($conf['title'], 0, 20).'...] '.$subject;
+ }
}else{
- $subject = '['.utf8_substr($conf['title'], 0, 20).'...] '.$subject;
+ $subject = '['.$conf['mailprefix'].'] '.$subject;
}
-
mail_send($to,$subject,$text,$conf['mailfrom'],'',$bcc);
}
diff --git a/inc/config_cascade.php b/inc/config_cascade.php
index 3ae68a000..48ed5a000 100644
--- a/inc/config_cascade.php
+++ b/inc/config_cascade.php
@@ -5,7 +5,8 @@
* This array configures the default locations of various files in the
* DokuWiki directory hierarchy. It can be overriden in inc/preload.php
*/
-$config_cascade = array(
+$config_cascade = array_merge(
+ array(
'main' => array(
'default' => array(DOKU_CONF.'dokuwiki.php'),
'local' => array(DOKU_CONF.'local.php'),
@@ -48,10 +49,11 @@ $config_cascade = array(
'local' => array(DOKU_CONF.'wordblock.local.conf'),
),
'userstyle' => array(
- 'default' => DOKU_CONF.'userstyle.css',
- 'print' => DOKU_CONF.'printstyle.css',
- 'feed' => DOKU_CONF.'feedstyle.css',
- 'all' => DOKU_CONF.'allstyle.css',
+ 'screen' => DOKU_CONF.'userstyle.css',
+ 'rtl' => DOKU_CONF.'userrtl.css',
+ 'print' => DOKU_CONF.'userprint.css',
+ 'feed' => DOKU_CONF.'userfeed.css',
+ 'all' => DOKU_CONF.'userall.css',
),
'userscript' => array(
'default' => DOKU_CONF.'userscript.js'
@@ -62,5 +64,7 @@ $config_cascade = array(
'plainauth.users' => array(
'default' => DOKU_CONF.'users.auth.php',
),
+ ),
+ $config_cascade
);
diff --git a/inc/confutils.php b/inc/confutils.php
index 26ed4f087..29ead1e9f 100644
--- a/inc/confutils.php
+++ b/inc/confutils.php
@@ -241,17 +241,24 @@ function actionOK($action){
// prepare disabled actions array and handle legacy options
$disabled = explode(',',$conf['disableactions']);
$disabled = array_map('trim',$disabled);
- if(isset($conf['openregister']) && !$conf['openregister']) $disabled[] = 'register';
- if(isset($conf['resendpasswd']) && !$conf['resendpasswd']) $disabled[] = 'resendpwd';
- if(isset($conf['subscribers']) && !$conf['subscribers']) {
- $disabled[] = 'subscribe';
- }
- if (is_null($auth) || !$auth->canDo('addUser')) {
+ if((isset($conf['openregister']) && !$conf['openregister']) || is_null($auth) || !$auth->canDo('addUser')) {
$disabled[] = 'register';
}
- if (is_null($auth) || !$auth->canDo('modPass')) {
+ if((isset($conf['resendpasswd']) && !$conf['resendpasswd']) || is_null($auth) || !$auth->canDo('modPass')) {
$disabled[] = 'resendpwd';
}
+ if((isset($conf['subscribers']) && !$conf['subscribers']) || is_null($auth)) {
+ $disabled[] = 'subscribe';
+ }
+ if (is_null($auth) || !$auth->canDo('Profile')) {
+ $disabled[] = 'profile';
+ }
+ if (is_null($auth)) {
+ $disabled[] = 'login';
+ }
+ if (is_null($auth) || !$auth->canDo('logout')) {
+ $disabled[] = 'logout';
+ }
$disabled = array_unique($disabled);
}
diff --git a/inc/form.php b/inc/form.php
index e614d2f30..e74c52c5d 100644
--- a/inc/form.php
+++ b/inc/form.php
@@ -252,7 +252,7 @@ class Doku_Form {
global $lang;
$form = '';
$this->params['accept-charset'] = $lang['encoding'];
- $form .= '<form ' . buildAttributes($this->params,true) . '><div class="no">' . DOKU_LF;
+ $form .= '<form ' . buildAttributes($this->params,false) . '><div class="no">' . DOKU_LF;
if (!empty($this->_hidden)) {
foreach ($this->_hidden as $name=>$value)
$form .= form_hidden(array('name'=>$name, 'value'=>$value));
@@ -696,7 +696,7 @@ function form_wikitext($attrs) {
*/
function form_button($attrs) {
$p = (!empty($attrs['_action'])) ? 'name="do['.$attrs['_action'].']" ' : '';
- return '<input '.$p.buildAttributes($attrs,true).'/>';
+ return '<input '.$p.buildAttributes($attrs,true).' />';
}
/**
@@ -714,7 +714,7 @@ function form_field($attrs) {
if ($attrs['_class']) $s .= ' class="'.$attrs['_class'].'"';
if (!empty($attrs['id'])) $s .= ' for="'.$attrs['id'].'"';
$s .= '><span>'.$attrs['_text'].'</span>';
- $s .= ' <input '.buildAttributes($attrs,true).'/></label>';
+ $s .= ' <input '.buildAttributes($attrs,true).' /></label>';
if (preg_match('/(^| )block($| )/', $attrs['_class']))
$s .= '<br />';
return $s;
@@ -734,7 +734,7 @@ function form_fieldright($attrs) {
$s = '<label';
if ($attrs['_class']) $s .= ' class="'.$attrs['_class'].'"';
if (!empty($attrs['id'])) $s .= ' for="'.$attrs['id'].'"';
- $s .= '><input '.buildAttributes($attrs,true).'/>';
+ $s .= '><input '.buildAttributes($attrs,true).' />';
$s .= ' <span>'.$attrs['_text'].'</span></label>';
if (preg_match('/(^| )block($| )/', $attrs['_class']))
$s .= '<br />';
@@ -758,7 +758,7 @@ function form_textfield($attrs) {
if ($attrs['_class']) $s .= ' class="'.$attrs['_class'].'"';
if (!empty($attrs['id'])) $s .= ' for="'.$attrs['id'].'"';
$s .= '><span>'.$attrs['_text'].'</span> ';
- $s .= '<input type="text" '.buildAttributes($attrs,true).'/></label>';
+ $s .= '<input type="text" '.buildAttributes($attrs,true).' /></label>';
if (preg_match('/(^| )block($| )/', $attrs['_class']))
$s .= '<br />';
return $s;
@@ -781,7 +781,7 @@ function form_passwordfield($attrs) {
if ($attrs['_class']) $s .= ' class="'.$attrs['_class'].'"';
if (!empty($attrs['id'])) $s .= ' for="'.$attrs['id'].'"';
$s .= '><span>'.$attrs['_text'].'</span> ';
- $s .= '<input type="password" '.buildAttributes($attrs,true).'/></label>';
+ $s .= '<input type="password" '.buildAttributes($attrs,true).' /></label>';
if (preg_match('/(^| )block($| )/', $attrs['_class']))
$s .= '<br />';
return $s;
@@ -807,7 +807,7 @@ function form_filefield($attrs) {
$s .= '<input type="file" '.buildAttributes($attrs,true);
if (!empty($attrs['_maxlength'])) $s .= ' maxlength="'.$attrs['_maxlength'].'"';
if (!empty($attrs['_accept'])) $s .= ' accept="'.$attrs['_accept'].'"';
- $s .= '/></label>';
+ $s .= ' /></label>';
if (preg_match('/(^| )block($| )/', $attrs['_class']))
$s .= '<br />';
return $s;
@@ -837,7 +837,7 @@ function form_checkboxfield($attrs) {
. ' value="' . hsc($attrs['value'][1]) . '" />';
$attrs['value'] = $attrs['value'][0];
}
- $s .= '<input type="checkbox" '.buildAttributes($attrs,true).'/>';
+ $s .= '<input type="checkbox" '.buildAttributes($attrs,true).' />';
$s .= ' <span>'.$attrs['_text'].'</span></label>';
if (preg_match('/(^| )block($| )/', $attrs['_class']))
$s .= '<br />';
@@ -860,7 +860,7 @@ function form_radiofield($attrs) {
$s = '<label';
if ($attrs['_class']) $s .= ' class="'.$attrs['_class'].'"';
if (!empty($attrs['id'])) $s .= ' for="'.$attrs['id'].'"';
- $s .= '><input type="radio" '.buildAttributes($attrs,true).'/>';
+ $s .= '><input type="radio" '.buildAttributes($attrs,true).' />';
$s .= ' <span>'.$attrs['_text'].'</span></label>';
if (preg_match('/(^| )block($| )/', $attrs['_class']))
$s .= '<br />';
diff --git a/inc/fulltext.php b/inc/fulltext.php
index 59a9c1d96..620237296 100644
--- a/inc/fulltext.php
+++ b/inc/fulltext.php
@@ -36,19 +36,21 @@ function ft_pageSearch($query,&$highlight){
* @author Kazutaka Miyasaka <kazmiya@gmail.com>
*/
function _ft_pageSearch(&$data) {
+ $Indexer = idx_get_indexer();
+
// parse the given query
- $q = ft_queryParser($data['query']);
+ $q = ft_queryParser($Indexer, $data['query']);
$data['highlight'] = $q['highlight'];
if (empty($q['parsed_ary'])) return array();
// lookup all words found in the query
- $lookup = idx_lookup($q['words']);
+ $lookup = $Indexer->lookup($q['words']);
// get all pages in this dokuwiki site (!: includes nonexistent pages)
$pages_all = array();
- foreach (idx_getIndex('page', '') as $id) {
- $pages_all[trim($id)] = 0; // base: 0 hit
+ foreach ($Indexer->getPages() as $id) {
+ $pages_all[$id] = 0; // base: 0 hit
}
// process the query
@@ -122,35 +124,18 @@ function _ft_pageSearch(&$data) {
/**
* Returns the backlinks for a given page
*
- * Does a quick lookup with the fulltext index, then
- * evaluates the instructions of the found pages
+ * Uses the metadata index.
*/
function ft_backlinks($id){
- global $conf;
- $swfile = DOKU_INC.'inc/lang/'.$conf['lang'].'/stopwords.txt';
- $stopwords = @file_exists($swfile) ? file($swfile) : array();
-
$result = array();
- // quick lookup of the pagename
- $page = noNS($id);
- $matches = idx_lookup(idx_tokenizer($page,$stopwords)); // pagename may contain specials (_ or .)
- $docs = array_keys(ft_resultCombine(array_values($matches)));
- $docs = array_filter($docs,'isVisiblePage'); // discard hidden pages
- if(!count($docs)) return $result;
-
- // check metadata for matching links
- foreach($docs as $match){
- // metadata relation reference links are already resolved
- $links = p_get_metadata($match,'relation references');
- if (isset($links[$id])) $result[] = $match;
- }
+ $result = idx_get_indexer()->lookupKey('relation_references', $id);
if(!count($result)) return $result;
// check ACL permissions
foreach(array_keys($result) as $idx){
- if(auth_quickaclcheck($result[$idx]) < AUTH_READ){
+ if(isHiddenPage($result[$idx]) || auth_quickaclcheck($result[$idx]) < AUTH_READ || !page_exists($result[$idx], '', false)){
unset($result[$idx]);
}
}
@@ -168,17 +153,14 @@ function ft_backlinks($id){
* Aborts after $max found results
*/
function ft_mediause($id,$max){
- global $conf;
- $swfile = DOKU_INC.'inc/lang/'.$conf['lang'].'/stopwords.txt';
- $stopwords = @file_exists($swfile) ? file($swfile) : array();
-
if(!$max) $max = 1; // need to find at least one
$result = array();
// quick lookup of the mediafile
+ // FIXME use metadata key lookup
$media = noNS($id);
- $matches = idx_lookup(idx_tokenizer($media,$stopwords));
+ $matches = idx_lookup(idx_tokenizer($media));
$docs = array_keys(ft_resultCombine(array_values($matches)));
if(!count($docs)) return $result;
@@ -229,7 +211,6 @@ function ft_pageLookup($id, $in_ns=false, $in_title=false){
}
function _ft_pageLookup(&$data){
- global $conf;
// split out original parameters
$id = $data['id'];
if (preg_match('/(?:^| )@(\w+)/', $id, $matches)) {
@@ -239,25 +220,27 @@ function _ft_pageLookup(&$data){
$in_ns = $data['in_ns'];
$in_title = $data['in_title'];
+ $cleaned = cleanID($id);
- $pages = array_map('rtrim', idx_getIndex('page', ''));
- $titles = array_map('rtrim', idx_getIndex('title', ''));
- // check for corrupt title index #FS2076
- if(count($pages) != count($titles)){
- $titles = array_fill(0,count($pages),'');
- @unlink($conf['indexdir'].'/title.idx'); // will be rebuilt in inc/init.php
- }
- $pages = array_combine($pages, $titles);
+ $Indexer = idx_get_indexer();
+ $page_idx = $Indexer->getPages();
- $cleaned = cleanID($id);
+ $pages = array();
if ($id !== '' && $cleaned !== '') {
- foreach ($pages as $p_id => $p_title) {
- if ((strpos($in_ns ? $p_id : noNSorNS($p_id), $cleaned) === false) &&
- (!$in_title || (stripos($p_title, $id) === false)) ) {
- unset($pages[$p_id]);
+ foreach ($page_idx as $p_id) {
+ if ((strpos($in_ns ? $p_id : noNSorNS($p_id), $cleaned) !== false)) {
+ if (!isset($pages[$p_id]))
+ $pages[$p_id] = p_get_first_heading($p_id, METADATA_DONT_RENDER);
+ }
+ }
+ if ($in_title) {
+ foreach ($Indexer->lookupKey('title', $id, '_ft_pageLookupTitleCompare') as $p_id) {
+ if (!isset($pages[$p_id]))
+ $pages[$p_id] = p_get_first_heading($p_id, METADATA_DONT_RENDER);
}
}
}
+
if (isset($ns)) {
foreach (array_keys($pages) as $p_id) {
if (strpos($p_id, $ns) !== 0) {
@@ -281,6 +264,15 @@ function _ft_pageLookup(&$data){
}
/**
+ * Tiny helper function for comparing the searched title with the title
+ * from the search index. This function is a wrapper around stripos with
+ * adapted argument order and return value.
+ */
+function _ft_pageLookupTitleCompare($search, $title) {
+ return stripos($title, $search) !== false;
+}
+
+/**
* Sort pages based on their namespace level first, then on their string
* values. This makes higher hierarchy pages rank higher than lower hierarchy
* pages.
@@ -304,6 +296,7 @@ function ft_pagesorter($a, $b){
*/
function ft_snippet($id,$highlight){
$text = rawWiki($id);
+ $text = str_replace("\xC2\xAD",'',$text); // remove soft-hyphens
$evdata = array(
'id' => $id,
'text' => &$text,
@@ -396,6 +389,11 @@ function ft_snippet($id,$highlight){
* Wraps a search term in regex boundary checks.
*/
function ft_snippet_re_preprocess($term) {
+ // do not process asian terms where word boundaries are not explicit
+ if(preg_match('/'.IDX_ASIAN.'/u',$term)){
+ return $term;
+ }
+
if(substr($term,0,2) == '\\*'){
$term = substr($term,2);
}else{
@@ -494,11 +492,7 @@ function ft_resultComplement($args) {
* @author Andreas Gohr <andi@splitbrain.org>
* @author Kazutaka Miyasaka <kazmiya@gmail.com>
*/
-function ft_queryParser($query){
- global $conf;
- $swfile = DOKU_INC.'inc/lang/'.$conf['lang'].'/stopwords.txt';
- $stopwords = @file_exists($swfile) ? file($swfile) : array();
-
+function ft_queryParser($Indexer, $query){
/**
* parse a search query and transform it into intermediate representation
*
@@ -544,7 +538,7 @@ function ft_queryParser($query){
if (preg_match('/^(-?)"(.+)"$/u', $term, $matches)) {
// phrase-include and phrase-exclude
$not = $matches[1] ? 'NOT' : '';
- $parsed = $not.ft_termParser($matches[2], $stopwords, false, true);
+ $parsed = $not.ft_termParser($Indexer, $matches[2], false, true);
} else {
// fix incomplete phrase
$term = str_replace('"', ' ', $term);
@@ -591,10 +585,10 @@ function ft_queryParser($query){
$parsed .= '(N+:'.$matches[1].')';
} elseif (preg_match('/^-(.+)$/', $token, $matches)) {
// word-exclude
- $parsed .= 'NOT('.ft_termParser($matches[1], $stopwords).')';
+ $parsed .= 'NOT('.ft_termParser($Indexer, $matches[1]).')';
} else {
// word-include
- $parsed .= ft_termParser($token, $stopwords);
+ $parsed .= ft_termParser($Indexer, $token);
}
}
}
@@ -728,18 +722,18 @@ function ft_queryParser($query){
*
* @author Kazutaka Miyasaka <kazmiya@gmail.com>
*/
-function ft_termParser($term, &$stopwords, $consider_asian = true, $phrase_mode = false) {
+function ft_termParser($Indexer, $term, $consider_asian = true, $phrase_mode = false) {
$parsed = '';
if ($consider_asian) {
// successive asian characters need to be searched as a phrase
$words = preg_split('/('.IDX_ASIAN.'+)/u', $term, -1, PREG_SPLIT_DELIM_CAPTURE | PREG_SPLIT_NO_EMPTY);
foreach ($words as $word) {
- if (preg_match('/'.IDX_ASIAN.'/u', $word)) $phrase_mode = true;
- $parsed .= ft_termParser($word, $stopwords, false, $phrase_mode);
+ $phrase_mode = $phrase_mode ? true : preg_match('/'.IDX_ASIAN.'/u', $word);
+ $parsed .= ft_termParser($Indexer, $word, false, $phrase_mode);
}
} else {
$term_noparen = str_replace(array('(', ')'), ' ', $term);
- $words = idx_tokenizer($term_noparen, $stopwords, true);
+ $words = $Indexer->tokenizer($term_noparen, true);
// W_: no need to highlight
if (empty($words)) {
diff --git a/inc/html.php b/inc/html.php
index 9d3c92707..64999ed98 100644
--- a/inc/html.php
+++ b/inc/html.php
@@ -62,17 +62,11 @@ function html_login(){
$form->endFieldset();
if(actionOK('register')){
- $form->addElement('<p>'
- . $lang['reghere']
- . ': <a href="'.wl($ID,'do=register').'" rel="nofollow" class="wikilink1">'.$lang['register'].'</a>'
- . '</p>');
+ $form->addElement('<p>'.$lang['reghere'].': '.tpl_actionlink('register','','','',true).'</p>');
}
if (actionOK('resendpwd')) {
- $form->addElement('<p>'
- . $lang['pwdforget']
- . ': <a href="'.wl($ID,'do=resendpwd').'" rel="nofollow" class="wikilink1">'.$lang['btn_resendpwd'].'</a>'
- . '</p>');
+ $form->addElement('<p>'.$lang['pwdforget'].': '.tpl_actionlink('resendpwd','','','',true).'</p>');
}
html_form('login', $form);
@@ -290,7 +284,8 @@ function html_hilight($html,$phrases){
$regex = join('|',array_map('ft_snippet_re_preprocess', array_map('preg_quote_cb',$phrases)));
if ($regex === '') return $html;
- $html = preg_replace_callback("/((<[^>]*)|$regex)/ui",'html_hilight_callback',$html);
+ if (!utf8_check($regex)) return $html;
+ $html = @preg_replace_callback("/((<[^>]*)|$regex)/ui",'html_hilight_callback',$html);
return $html;
}
@@ -318,7 +313,13 @@ function html_search(){
global $ID;
global $lang;
- print p_locale_xhtml('searchpage');
+ $intro = p_locale_xhtml('searchpage');
+ // allow use of placeholder in search intro
+ $intro = str_replace(
+ array('@QUERY@','@SEARCH@'),
+ array(hsc(rawurlencode($QUERY)),hsc($QUERY)),
+ $intro);
+ echo $intro;
flush();
//show progressbar
@@ -354,7 +355,7 @@ function html_search(){
}
print '</ul> ';
//clear float (see http://www.complexspiral.com/publications/containing-floats/)
- print '<div class="clearer">&nbsp;</div>';
+ print '<div class="clearer"></div>';
print '</div>';
}
flush();
@@ -456,11 +457,7 @@ function html_revisions($first=0){
$form->addElement($date);
$form->addElement(form_makeCloseTag('span'));
- $form->addElement(form_makeTag('img', array(
- 'src' => DOKU_BASE.'lib/images/blank.gif',
- 'width' => '15',
- 'height' => '11',
- 'alt' => '')));
+ $form->addElement('<img src="'.DOKU_BASE.'lib/images/blank.gif" width="15" height="11" alt="" />');
$form->addElement(form_makeOpenTag('a', array(
'class' => 'wikilink1',
@@ -498,11 +495,7 @@ function html_revisions($first=0){
'name' => 'rev2[]',
'value' => $rev)));
}else{
- $form->addElement(form_makeTag('img', array(
- 'src' => DOKU_BASE.'lib/images/blank.gif',
- 'width' => 14,
- 'height' => 11,
- 'alt' => '')));
+ $form->addElement('<img src="'.DOKU_BASE.'lib/images/blank.gif" width="15" height="11" alt="" />');
}
$form->addElement(form_makeOpenTag('span', array('class' => 'date')));
@@ -523,11 +516,7 @@ function html_revisions($first=0){
$form->addElement($ID);
$form->addElement(form_makeCloseTag('a'));
}else{
- $form->addElement(form_makeTag('img', array(
- 'src' => DOKU_BASE.'lib/images/blank.gif',
- 'width' => '15',
- 'height' => '11',
- 'alt' => '')));
+ $form->addElement('<img src="'.DOKU_BASE.'lib/images/blank.gif" width="15" height="11" alt="" />');
$form->addElement($ID);
}
@@ -748,7 +737,7 @@ function html_list_index($item){
/**
* Index List item
*
- * This user function is used in html_build_lidt to build the
+ * This user function is used in html_buildlist to build the
* <li> tags for namespaces when displaying the page index
* it gives different classes to opened or closed "folders"
*
@@ -789,10 +778,20 @@ function html_li_default($item){
* @author Andreas Gohr <andi@splitbrain.org>
*/
function html_buildlist($data,$class,$func,$lifunc='html_li_default'){
- $level = 0;
+ if (count($data) === 0) {
+ return '';
+ }
+
+ $level = $data[0]['level'];
$opens = 0;
$ret = '';
+ if ($level < 2) {
+ // Trigger building a wrapper ul if the first level is
+ // 0 (we have a root object) or 1 (just the root content)
+ --$level;
+ }
+
foreach ($data as $item){
if( $item['level'] > $level ){
@@ -808,7 +807,7 @@ function html_buildlist($data,$class,$func,$lifunc='html_li_default'){
//close higher lists
$ret .= "</ul>\n</li>\n";
}
- }else{
+ } elseif ($ret !== '') {
//close last item
$ret .= "</li>\n";
}
@@ -864,13 +863,18 @@ function html_backlinks(){
* show diff
*
* @author Andreas Gohr <andi@splitbrain.org>
+ * @param string $text - compare with this text with most current version
+ * @param bool $intr - display the intro text
*/
-function html_diff($text='',$intro=true){
+function html_diff($text='',$intro=true,$type=null){
global $ID;
global $REV;
global $lang;
global $conf;
+ if(!$type) $type = $_REQUEST['difftype'];
+ if($type != 'inline') $type = 'sidebyside';
+
// we're trying to be clever here, revisions to compare can be either
// given as rev and rev2 parameters, with rev2 being optional. Or in an
// array in rev2.
@@ -888,6 +892,9 @@ function html_diff($text='',$intro=true){
$rev2 = (int) $_REQUEST['rev2'];
}
+ $r_minor = '';
+ $l_minor = '';
+
if($text){ // compare text to the most current revision
$l_rev = '';
$l_text = rawWiki($ID,'');
@@ -984,17 +991,48 @@ function html_diff($text='',$intro=true){
$df = new Diff(explode("\n",htmlspecialchars($l_text)),
explode("\n",htmlspecialchars($r_text)));
- $tdf = new TableDiffFormatter();
+ if($type == 'inline'){
+ $tdf = new InlineDiffFormatter();
+ } else {
+ $tdf = new TableDiffFormatter();
+ }
+
+
+
if($intro) print p_locale_xhtml('diff');
if (!$text) {
- $diffurl = wl($ID, array('do'=>'diff', 'rev2[0]'=>$l_rev, 'rev2[1]'=>$r_rev));
- ptln('<p class="difflink">');
- ptln(' <a class="wikilink1" href="'.$diffurl.'">'.$lang['difflink'].'</a>');
- ptln('</p>');
+ ptln('<div class="diffoptions">');
+
+ $form = new Doku_Form(array('action'=>wl()));
+ $form->addHidden('id',$ID);
+ $form->addHidden('rev2[0]',$l_rev);
+ $form->addHidden('rev2[1]',$r_rev);
+ $form->addHidden('do','diff');
+ $form->addElement(form_makeListboxField(
+ 'difftype',
+ array(
+ 'sidebyside' => $lang['diff_side'],
+ 'inline' => $lang['diff_inline']),
+ $type,
+ $lang['diff_type'],
+ '','',
+ array('class'=>'quickselect')));
+ $form->addElement(form_makeButton('submit', 'diff','Go'));
+ $form->printForm();
+
+
+ $diffurl = wl($ID, array(
+ 'do' => 'diff',
+ 'rev2[0]' => $l_rev,
+ 'rev2[1]' => $r_rev,
+ 'difftype' => $type,
+ ));
+ ptln('<p><a class="wikilink1" href="'.$diffurl.'">'.$lang['difflink'].'</a></p>');
+ ptln('</div>');
}
?>
- <table class="diff">
+ <table class="diff diff_<?php echo $type?>">
<tr>
<th colspan="2" <?php echo $l_minor?>>
<?php echo $l_head?>
@@ -1034,7 +1072,10 @@ function html_conflict($text,$summary){
* @author Andreas Gohr <andi@splitbrain.org>
*/
function html_msgarea(){
- global $MSG;
+ global $MSG, $MSG_shown;
+ // store if the global $MSG has already been shown and thus HTML output has been started
+ $MSG_shown = true;
+
if(!isset($MSG)) return;
$shown = array();
@@ -1046,6 +1087,8 @@ function html_msgarea(){
print '</div>';
$shown[$hash] = 1;
}
+
+ unset($GLOBALS['MSG']);
}
/**
@@ -1061,17 +1104,17 @@ function html_register(){
print p_locale_xhtml('register');
print '<div class="centeralign">'.NL;
$form = new Doku_Form(array('id' => 'dw__register'));
- $form->startFieldset($lang['register']);
+ $form->startFieldset($lang['btn_register']);
$form->addHidden('do', 'register');
$form->addHidden('save', '1');
- $form->addElement(form_makeTextField('login', $_POST['login'], $lang['user'], null, 'block', array('size'=>'50')));
+ $form->addElement(form_makeTextField('login', $_POST['login'], $lang['user'], '', 'block', array('size'=>'50')));
if (!$conf['autopasswd']) {
$form->addElement(form_makePasswordField('pass', $lang['pass'], '', 'block', array('size'=>'50')));
$form->addElement(form_makePasswordField('passchk', $lang['passchk'], '', 'block', array('size'=>'50')));
}
$form->addElement(form_makeTextField('fullname', $_POST['fullname'], $lang['fullname'], '', 'block', array('size'=>'50')));
$form->addElement(form_makeTextField('email', $_POST['email'], $lang['email'], '', 'block', array('size'=>'50')));
- $form->addElement(form_makeButton('submit', '', $lang['register']));
+ $form->addElement(form_makeButton('submit', '', $lang['btn_register']));
$form->endFieldset();
html_form('register', $form);
@@ -1214,9 +1257,9 @@ function html_edit(){
if($wr && $conf['license']){
$form->addElement(form_makeOpenTag('div', array('class'=>'license')));
$out = $lang['licenseok'];
- $out .= '<a href="'.$license[$conf['license']]['url'].'" rel="license" class="urlextern"';
- if(isset($conf['target']['extern'])) $out .= ' target="'.$conf['target']['extern'].'"';
- $out .= '> '.$license[$conf['license']]['name'].'</a>';
+ $out .= ' <a href="'.$license[$conf['license']]['url'].'" rel="license" class="urlextern"';
+ if($conf['target']['extern']) $out .= ' target="'.$conf['target']['extern'].'"';
+ $out .= '>'.$license[$conf['license']]['name'].'</a>';
$form->addElement($out);
$form->addElement(form_makeCloseTag('div'));
}
@@ -1390,10 +1433,11 @@ function html_admin(){
}
// data security check
- echo '<a style="background: transparent url(data/security.png) left top no-repeat;
- display: block; width:380px; height:73px; border:none; float:right"
- target="_blank"
- href="http://www.dokuwiki.org/security#web_access_security"></a>';
+ // @todo: could be checked and only displayed if $conf['savedir'] is under the web root
+ echo '<a style="border:none; float:right;"
+ href="http://www.dokuwiki.org/security#web_access_security">
+ <img src="data/security.png" alt="Your data directory seems to be protected properly."
+ onerror="this.parentNode.style.display=\'none\'" /></a>';
print p_locale_xhtml('admin');
diff --git a/inc/httputils.php b/inc/httputils.php
index 8da42e3b7..0ad97a9a1 100644
--- a/inc/httputils.php
+++ b/inc/httputils.php
@@ -197,3 +197,55 @@ function http_gzip_valid($uncompressed_file) {
return true;
}
+
+/**
+ * Set HTTP headers and echo cachefile, if useable
+ *
+ * This function handles output of cacheable resource files. It ses the needed
+ * HTTP headers. If a useable cache is present, it is passed to the web server
+ * and the scrpt is terminated.
+ */
+function http_cached($cache, $cache_ok) {
+ global $conf;
+
+ // check cache age & handle conditional request
+ // since the resource files are timestamped, we can use a long max age: 1 year
+ header('Cache-Control: public, max-age=31536000');
+ header('Pragma: public');
+ if($cache_ok){
+ http_conditionalRequest(filemtime($cache));
+ if($conf['allowdebug']) header("X-CacheUsed: $cache");
+
+ // finally send output
+ if ($conf['gzip_output'] && http_gzip_valid($cache)) {
+ header('Vary: Accept-Encoding');
+ header('Content-Encoding: gzip');
+ readfile($cache.".gz");
+ } else {
+ if (!http_sendfile($cache)) readfile($cache);
+ }
+ exit;
+ }
+
+ http_conditionalRequest(time());
+}
+
+/**
+ * Cache content and print it
+ */
+function http_cached_finish($file, $content) {
+ global $conf;
+
+ // save cache file
+ io_saveFile($file, $content);
+ if(function_exists('gzopen')) io_saveFile("$file.gz",$content);
+
+ // finally send output
+ if ($conf['gzip_output']) {
+ header('Vary: Accept-Encoding');
+ header('Content-Encoding: gzip');
+ print gzencode($content,9,FORCE_GZIP);
+ } else {
+ print $content;
+ }
+}
diff --git a/inc/indexer.php b/inc/indexer.php
index 5a361ddc5..9d8d6f99b 100644
--- a/inc/indexer.php
+++ b/inc/indexer.php
@@ -4,10 +4,14 @@
*
* @license GPL 2 (http://www.gnu.org/licenses/gpl.html)
* @author Andreas Gohr <andi@splitbrain.org>
+ * @author Tom N Harris <tnharris@whoopdedo.org>
*/
if(!defined('DOKU_INC')) die('meh.');
+// Version tag used to force rebuild on upgrade
+define('INDEXER_VERSION', 5);
+
// set the minimum token length to use in the index (note, this doesn't apply to numeric tokens)
if (!defined('IDX_MINWORDLENGTH')) define('IDX_MINWORDLENGTH',2);
@@ -23,6 +27,10 @@ define('IDX_ASIAN2','['.
'\x{30FD}-\x{31EF}\x{3200}-\x{D7AF}'.
'\x{F900}-\x{FAFF}'. // CJK Compatibility Ideographs
'\x{FE30}-\x{FE4F}'. // CJK Compatibility Forms
+ "\xF0\xA0\x80\x80-\xF0\xAA\x9B\x9F". // CJK Extension B
+ "\xF0\xAA\x9C\x80-\xF0\xAB\x9C\xBF". // CJK Extension C
+ "\xF0\xAB\x9D\x80-\xF0\xAB\xA0\x9F". // CJK Extension D
+ "\xF0\xAF\xA0\x80-\xF0\xAF\xAB\xBF". // CJK Compatibility Supplement
']');
define('IDX_ASIAN3','['. // Hiragana/Katakana (can be two characters)
'\x{3042}\x{3044}\x{3046}\x{3048}'.
@@ -43,6 +51,36 @@ define('IDX_ASIAN3','['. // Hiragana/Katakana (can be two charact
define('IDX_ASIAN', '(?:'.IDX_ASIAN1.'|'.IDX_ASIAN2.'|'.IDX_ASIAN3.')');
/**
+ * Version of the indexer taking into consideration the external tokenizer.
+ * The indexer is only compatible with data written by the same version.
+ *
+ * @triggers INDEXER_VERSION_GET
+ * Plugins that modify what gets indexed should hook this event and
+ * add their version info to the event data like so:
+ * $data[$plugin_name] = $plugin_version;
+ *
+ * @author Tom N Harris <tnharris@whoopdedo.org>
+ * @author Michael Hamann <michael@content-space.de>
+ */
+function idx_get_version(){
+ static $indexer_version = null;
+ if ($indexer_version == null) {
+ global $conf;
+ $version = INDEXER_VERSION;
+
+ // DokuWiki version is included for the convenience of plugins
+ $data = array('dokuwiki'=>$version);
+ trigger_event('INDEXER_VERSION_GET', $data, null, false);
+ unset($data['dokuwiki']); // this needs to be first
+ ksort($data);
+ foreach ($data as $plugin=>$vers)
+ $version .= '+'.$plugin.'='.$vers;
+ $indexer_version = $version;
+ }
+ return $indexer_version;
+}
+
+/**
* Measure the length of a string.
* Differs from strlen in handling of asian characters.
*
@@ -52,368 +90,1212 @@ function wordlen($w){
$l = strlen($w);
// If left alone, all chinese "words" will get put into w3.idx
// So the "length" of a "word" is faked
- if(preg_match('/'.IDX_ASIAN2.'/u',$w))
- $l += ord($w) - 0xE1; // Lead bytes from 0xE2-0xEF
+ if(preg_match_all('/[\xE2-\xEF]/',$w,$leadbytes)) {
+ foreach($leadbytes[0] as $b)
+ $l += ord($b) - 0xE1;
+ }
return $l;
}
/**
- * Write a list of strings to an index file.
+ * Class that encapsulates operations on the indexer database.
*
* @author Tom N Harris <tnharris@whoopdedo.org>
*/
-function idx_saveIndex($pre, $wlen, &$idx){
- global $conf;
- $fn = $conf['indexdir'].'/'.$pre.$wlen;
- $fh = @fopen($fn.'.tmp','w');
- if(!$fh) return false;
- foreach ($idx as $line) {
- fwrite($fh,$line);
- }
- fclose($fh);
- if(isset($conf['fperm'])) chmod($fn.'.tmp', $conf['fperm']);
- io_rename($fn.'.tmp', $fn.'.idx');
- return true;
-}
+class Doku_Indexer {
-/**
- * Append a given line to an index file.
- *
- * @author Andreas Gohr <andi@splitbrain.org>
- */
-function idx_appendIndex($pre, $wlen, $line){
- global $conf;
- $fn = $conf['indexdir'].'/'.$pre.$wlen;
- $fh = @fopen($fn.'.idx','a');
- if(!$fh) return false;
- fwrite($fh,$line);
- fclose($fh);
- return true;
-}
+ /**
+ * Adds the contents of a page to the fulltext index
+ *
+ * The added text replaces previous words for the same page.
+ * An empty value erases the page.
+ *
+ * @param string $page a page name
+ * @param string $text the body of the page
+ * @return boolean the function completed successfully
+ * @author Tom N Harris <tnharris@whoopdedo.org>
+ * @author Andreas Gohr <andi@splitbrain.org>
+ */
+ public function addPageWords($page, $text) {
+ if (!$this->lock())
+ return "locked";
-/**
- * Read the list of words in an index (if it exists).
- *
- * @author Tom N Harris <tnharris@whoopdedo.org>
- */
-function idx_getIndex($pre, $wlen){
- global $conf;
- $fn = $conf['indexdir'].'/'.$pre.$wlen.'.idx';
- if(!@file_exists($fn)) return array();
- return file($fn);
-}
+ // load known documents
+ $pid = $this->addIndexKey('page', '', $page);
+ if ($pid === false) {
+ $this->unlock();
+ return false;
+ }
-/**
- * Create an empty index file if it doesn't exist yet.
- *
- * FIXME: This function isn't currently used. It will probably be removed soon.
- *
- * @author Tom N Harris <tnharris@whoopdedo.org>
- */
-function idx_touchIndex($pre, $wlen){
- global $conf;
- $fn = $conf['indexdir'].'/'.$pre.$wlen.'.idx';
- if(!@file_exists($fn)){
- touch($fn);
- if($conf['fperm']) chmod($fn, $conf['fperm']);
+ $pagewords = array();
+ // get word usage in page
+ $words = $this->getPageWords($text);
+ if ($words === false) {
+ $this->unlock();
+ return false;
+ }
+
+ if (!empty($words)) {
+ foreach (array_keys($words) as $wlen) {
+ $index = $this->getIndex('i', $wlen);
+ foreach ($words[$wlen] as $wid => $freq) {
+ $idx = ($wid<count($index)) ? $index[$wid] : '';
+ $index[$wid] = $this->updateTuple($idx, $pid, $freq);
+ $pagewords[] = "$wlen*$wid";
+ }
+ if (!$this->saveIndex('i', $wlen, $index)) {
+ $this->unlock();
+ return false;
+ }
+ }
+ }
+
+ // Remove obsolete index entries
+ $pageword_idx = $this->getIndexKey('pageword', '', $pid);
+ if ($pageword_idx !== '') {
+ $oldwords = explode(':',$pageword_idx);
+ $delwords = array_diff($oldwords, $pagewords);
+ $upwords = array();
+ foreach ($delwords as $word) {
+ if ($word != '') {
+ list($wlen,$wid) = explode('*', $word);
+ $wid = (int)$wid;
+ $upwords[$wlen][] = $wid;
+ }
+ }
+ foreach ($upwords as $wlen => $widx) {
+ $index = $this->getIndex('i', $wlen);
+ foreach ($widx as $wid) {
+ $index[$wid] = $this->updateTuple($index[$wid], $pid, 0);
+ }
+ $this->saveIndex('i', $wlen, $index);
+ }
+ }
+ // Save the reverse index
+ $pageword_idx = join(':', $pagewords);
+ if (!$this->saveIndexKey('pageword', '', $pid, $pageword_idx)) {
+ $this->unlock();
+ return false;
+ }
+
+ $this->unlock();
+ return true;
}
-}
-/**
- * Read a line ending with \n.
- * Returns false on EOF.
- *
- * @author Tom N Harris <tnharris@whoopdedo.org>
- */
-function _freadline($fh) {
- if (feof($fh)) return false;
- $ln = '';
- while (($buf = fgets($fh,4096)) !== false) {
- $ln .= $buf;
- if (substr($buf,-1) == "\n") break;
- }
- if ($ln === '') return false;
- if (substr($ln,-1) != "\n") $ln .= "\n";
- return $ln;
-}
+ /**
+ * Split the words in a page and add them to the index.
+ *
+ * @param string $text content of the page
+ * @return array list of word IDs and number of times used
+ * @author Andreas Gohr <andi@splitbrain.org>
+ * @author Christopher Smith <chris@jalakai.co.uk>
+ * @author Tom N Harris <tnharris@whoopdedo.org>
+ */
+ protected function getPageWords($text) {
+ global $conf;
-/**
- * Write a line to an index file.
- *
- * @author Tom N Harris <tnharris@whoopdedo.org>
- */
-function idx_saveIndexLine($pre, $wlen, $idx, $line){
- global $conf;
- if(substr($line,-1) != "\n") $line .= "\n";
- $fn = $conf['indexdir'].'/'.$pre.$wlen;
- $fh = @fopen($fn.'.tmp','w');
- if(!$fh) return false;
- $ih = @fopen($fn.'.idx','r');
- if ($ih) {
- $ln = -1;
- while (($curline = _freadline($ih)) !== false) {
- if (++$ln == $idx) {
- fwrite($fh, $line);
- } else {
- fwrite($fh, $curline);
+ $tokens = $this->tokenizer($text);
+ $tokens = array_count_values($tokens); // count the frequency of each token
+
+ $words = array();
+ foreach ($tokens as $w=>$c) {
+ $l = wordlen($w);
+ if (isset($words[$l])){
+ $words[$l][$w] = $c + (isset($words[$l][$w]) ? $words[$l][$w] : 0);
+ }else{
+ $words[$l] = array($w => $c);
}
}
- if ($idx > $ln) {
- fwrite($fh,$line);
+
+ // arrive here with $words = array(wordlen => array(word => frequency))
+ $word_idx_modified = false;
+ $index = array(); //resulting index
+ foreach (array_keys($words) as $wlen) {
+ $word_idx = $this->getIndex('w', $wlen);
+ foreach ($words[$wlen] as $word => $freq) {
+ $wid = array_search($word, $word_idx);
+ if ($wid === false) {
+ $wid = count($word_idx);
+ $word_idx[] = $word;
+ $word_idx_modified = true;
+ }
+ if (!isset($index[$wlen]))
+ $index[$wlen] = array();
+ $index[$wlen][$wid] = $freq;
+ }
+ // save back the word index
+ if ($word_idx_modified && !$this->saveIndex('w', $wlen, $word_idx))
+ return false;
}
- fclose($ih);
- } else {
- fwrite($fh,$line);
+
+ return $index;
}
- fclose($fh);
- if($conf['fperm']) chmod($fn.'.tmp', $conf['fperm']);
- io_rename($fn.'.tmp', $fn.'.idx');
- return true;
-}
-/**
- * Read a single line from an index (if it exists).
- *
- * @author Tom N Harris <tnharris@whoopdedo.org>
- */
-function idx_getIndexLine($pre, $wlen, $idx){
- global $conf;
- $fn = $conf['indexdir'].'/'.$pre.$wlen.'.idx';
- if(!@file_exists($fn)) return '';
- $fh = @fopen($fn,'r');
- if(!$fh) return '';
- $ln = -1;
- while (($line = _freadline($fh)) !== false) {
- if (++$ln == $idx) break;
- }
- fclose($fh);
- return "$line";
-}
+ /**
+ * Add/update keys to/of the metadata index.
+ *
+ * Adding new keys does not remove other keys for the page.
+ * An empty value will erase the key.
+ * The $key parameter can be an array to add multiple keys. $value will
+ * not be used if $key is an array.
+ *
+ * @param string $page a page name
+ * @param mixed $key a key string or array of key=>value pairs
+ * @param mixed $value the value or list of values
+ * @return boolean the function completed successfully
+ * @author Tom N Harris <tnharris@whoopdedo.org>
+ * @author Michael Hamann <michael@content-space.de>
+ */
+ public function addMetaKeys($page, $key, $value=null) {
+ if (!is_array($key)) {
+ $key = array($key => $value);
+ } elseif (!is_null($value)) {
+ // $key is array, but $value is not null
+ trigger_error("array passed to addMetaKeys but value is not null", E_USER_WARNING);
+ }
-/**
- * Split a page into words
- *
- * Returns an array of word counts, false if an error occurred.
- * Array is keyed on the word length, then the word index.
- *
- * @author Andreas Gohr <andi@splitbrain.org>
- * @author Christopher Smith <chris@jalakai.co.uk>
- */
-function idx_getPageWords($page){
- global $conf;
- $swfile = DOKU_INC.'inc/lang/'.$conf['lang'].'/stopwords.txt';
- if(@file_exists($swfile)){
- $stopwords = file($swfile);
- }else{
- $stopwords = array();
+ if (!$this->lock())
+ return "locked";
+
+ // load known documents
+ $pid = $this->addIndexKey('page', '', $page);
+ if ($pid === false) {
+ $this->unlock();
+ return false;
+ }
+
+ // Special handling for titles so the index file is simpler
+ if (array_key_exists('title', $key)) {
+ $value = $key['title'];
+ if (is_array($value))
+ $value = $value[0];
+ $this->saveIndexKey('title', '', $pid, $value);
+ unset($key['title']);
+ }
+
+ foreach ($key as $name => $values) {
+ $metaname = idx_cleanName($name);
+ $this->addIndexKey('metadata', '', $metaname);
+ $metaidx = $this->getIndex($metaname.'_i', '');
+ $metawords = $this->getIndex($metaname.'_w', '');
+ $addwords = false;
+
+ if (!is_array($values)) $values = array($values);
+
+ $val_idx = $this->getIndexKey($metaname.'_p', '', $pid);
+ if ($val_idx != '') {
+ $val_idx = explode(':', $val_idx);
+ // -1 means remove, 0 keep, 1 add
+ $val_idx = array_combine($val_idx, array_fill(0, count($val_idx), -1));
+ } else {
+ $val_idx = array();
+ }
+
+
+ foreach ($values as $val) {
+ $val = (string)$val;
+ if ($val !== "") {
+ $id = array_search($val, $metawords);
+ if ($id === false) {
+ $id = count($metawords);
+ $metawords[$id] = $val;
+ $addwords = true;
+ }
+ // test if value is already in the index
+ if (isset($val_idx[$id]) && $val_idx[$id] <= 0)
+ $val_idx[$id] = 0;
+ else // else add it
+ $val_idx[$id] = 1;
+ }
+ }
+
+ if ($addwords)
+ $this->saveIndex($metaname.'_w', '', $metawords);
+ $vals_changed = false;
+ foreach ($val_idx as $id => $action) {
+ if ($action == -1) {
+ $metaidx[$id] = $this->updateTuple($metaidx[$id], $pid, 0);
+ $vals_changed = true;
+ unset($val_idx[$id]);
+ } elseif ($action == 1) {
+ $metaidx[$id] = $this->updateTuple($metaidx[$id], $pid, 1);
+ $vals_changed = true;
+ }
+ }
+
+ if ($vals_changed) {
+ $this->saveIndex($metaname.'_i', '', $metaidx);
+ $val_idx = implode(':', array_keys($val_idx));
+ $this->saveIndexKey($metaname.'_p', '', $pid, $val_idx);
+ }
+
+ unset($metaidx);
+ unset($metawords);
+ }
+
+ $this->unlock();
+ return true;
}
- $body = '';
- $data = array($page, $body);
- $evt = new Doku_Event('INDEXER_PAGE_ADD', $data);
- if ($evt->advise_before()) $data[1] .= rawWiki($page);
- $evt->advise_after();
- unset($evt);
+ /**
+ * Remove a page from the index
+ *
+ * Erases entries in all known indexes.
+ *
+ * @param string $page a page name
+ * @return boolean the function completed successfully
+ * @author Tom N Harris <tnharris@whoopdedo.org>
+ */
+ public function deletePage($page) {
+ if (!$this->lock())
+ return "locked";
- list($page,$body) = $data;
+ // load known documents
+ $pid = $this->getIndexKey('page', '', $page);
+ if ($pid === false) {
+ $this->unlock();
+ return false;
+ }
- $body = strtr($body, "\r\n\t", ' ');
- $tokens = explode(' ', $body);
- $tokens = array_count_values($tokens); // count the frequency of each token
+ // Remove obsolete index entries
+ $pageword_idx = $this->getIndexKey('pageword', '', $pid);
+ if ($pageword_idx !== '') {
+ $delwords = explode(':',$pageword_idx);
+ $upwords = array();
+ foreach ($delwords as $word) {
+ if ($word != '') {
+ list($wlen,$wid) = explode('*', $word);
+ $wid = (int)$wid;
+ $upwords[$wlen][] = $wid;
+ }
+ }
+ foreach ($upwords as $wlen => $widx) {
+ $index = $this->getIndex('i', $wlen);
+ foreach ($widx as $wid) {
+ $index[$wid] = $this->updateTuple($index[$wid], $pid, 0);
+ }
+ $this->saveIndex('i', $wlen, $index);
+ }
+ }
+ // Save the reverse index
+ if (!$this->saveIndexKey('pageword', '', $pid, "")) {
+ $this->unlock();
+ return false;
+ }
- // ensure the deaccented or romanised page names of internal links are added to the token array
- // (this is necessary for the backlink function -- there maybe a better way!)
- if ($conf['deaccent']) {
- $links = p_get_metadata($page,'relation references');
+ $this->saveIndexKey('title', '', $pid, "");
+ $keyidx = $this->getIndex('metadata', '');
+ foreach ($keyidx as $metaname) {
+ $val_idx = explode(':', $this->getIndexKey($metaname.'_p', '', $pid));
+ $meta_idx = $this->getIndex($metaname.'_i', '');
+ foreach ($val_idx as $id) {
+ $meta_idx[$id] = $this->updateTuple($meta_idx[$id], $pid, 0);
+ }
+ $this->saveIndex($metaname.'_i', '', $meta_idx);
+ $this->saveIndexKey($metaname.'_p', '', $pid, '');
+ }
+
+ $this->unlock();
+ return true;
+ }
- if (!empty($links)) {
- $tmp = join(' ',array_keys($links)); // make a single string
- $tmp = strtr($tmp, ':', ' '); // replace namespace separator with a space
- $link_tokens = array_unique(explode(' ', $tmp)); // break into tokens
+ /**
+ * Split the text into words for fulltext search
+ *
+ * TODO: does this also need &$stopwords ?
+ *
+ * @triggers INDEXER_TEXT_PREPARE
+ * This event allows plugins to modify the text before it gets tokenized.
+ * Plugins intercepting this event should also intercept INDEX_VERSION_GET
+ *
+ * @param string $text plain text
+ * @param boolean $wc are wildcards allowed?
+ * @return array list of words in the text
+ * @author Tom N Harris <tnharris@whoopdedo.org>
+ * @author Andreas Gohr <andi@splitbrain.org>
+ */
+ public function tokenizer($text, $wc=false) {
+ global $conf;
+ $words = array();
+ $wc = ($wc) ? '' : '\*';
+ $stopwords =& idx_get_stopwords();
- foreach ($link_tokens as $link_token) {
- if (isset($tokens[$link_token])) continue;
- $tokens[$link_token] = 1;
+ // prepare the text to be tokenized
+ $evt = new Doku_Event('INDEXER_TEXT_PREPARE', $text);
+ if ($evt->advise_before(true)) {
+ if (preg_match('/[^0-9A-Za-z ]/u', $text)) {
+ // handle asian chars as single words (may fail on older PHP version)
+ $asia = @preg_replace('/('.IDX_ASIAN.')/u', ' \1 ', $text);
+ if (!is_null($asia)) $text = $asia; // recover from regexp falure
}
}
+ $evt->advise_after();
+ unset($evt);
+
+ $text = strtr($text,
+ array(
+ "\r" => ' ',
+ "\n" => ' ',
+ "\t" => ' ',
+ "\xC2\xAD" => '', //soft-hyphen
+ )
+ );
+ if (preg_match('/[^0-9A-Za-z ]/u', $text))
+ $text = utf8_stripspecials($text, ' ', '\._\-:'.$wc);
+
+ $wordlist = explode(' ', $text);
+ foreach ($wordlist as $i => $word) {
+ $wordlist[$i] = (preg_match('/[^0-9A-Za-z]/u', $word)) ?
+ utf8_strtolower($word) : strtolower($word);
+ }
+
+ foreach ($wordlist as $i => $word) {
+ if ((!is_numeric($word) && strlen($word) < IDX_MINWORDLENGTH)
+ || array_search($word, $stopwords) !== false)
+ unset($wordlist[$i]);
+ }
+ return array_values($wordlist);
}
- $words = array();
- foreach ($tokens as $word => $count) {
- $arr = idx_tokenizer($word,$stopwords);
- $arr = array_count_values($arr);
- foreach ($arr as $w => $c) {
- $l = wordlen($w);
- if(isset($words[$l])){
- $words[$l][$w] = $c * $count + (isset($words[$l][$w]) ? $words[$l][$w] : 0);
- }else{
- $words[$l] = array($w => $c * $count);
+ /**
+ * Find pages in the fulltext index containing the words,
+ *
+ * The search words must be pre-tokenized, meaning only letters and
+ * numbers with an optional wildcard
+ *
+ * The returned array will have the original tokens as key. The values
+ * in the returned list is an array with the page names as keys and the
+ * number of times that token appears on the page as value.
+ *
+ * @param arrayref $tokens list of words to search for
+ * @return array list of page names with usage counts
+ * @author Tom N Harris <tnharris@whoopdedo.org>
+ * @author Andreas Gohr <andi@splitbrain.org>
+ */
+ public function lookup(&$tokens) {
+ $result = array();
+ $wids = $this->getIndexWords($tokens, $result);
+ if (empty($wids)) return array();
+ // load known words and documents
+ $page_idx = $this->getIndex('page', '');
+ $docs = array();
+ foreach (array_keys($wids) as $wlen) {
+ $wids[$wlen] = array_unique($wids[$wlen]);
+ $index = $this->getIndex('i', $wlen);
+ foreach($wids[$wlen] as $ixid) {
+ if ($ixid < count($index))
+ $docs["$wlen*$ixid"] = $this->parseTuples($page_idx, $index[$ixid]);
+ }
+ }
+ // merge found pages into final result array
+ $final = array();
+ foreach ($result as $word => $res) {
+ $final[$word] = array();
+ foreach ($res as $wid) {
+ // handle the case when ($ixid < count($index)) has been false
+ // and thus $docs[$wid] hasn't been set.
+ if (!isset($docs[$wid])) continue;
+ $hits = &$docs[$wid];
+ foreach ($hits as $hitkey => $hitcnt) {
+ // make sure the document still exists
+ if (!page_exists($hitkey, '', false)) continue;
+ if (!isset($final[$word][$hitkey]))
+ $final[$word][$hitkey] = $hitcnt;
+ else
+ $final[$word][$hitkey] += $hitcnt;
+ }
}
}
+ return $final;
}
- // arrive here with $words = array(wordlen => array(word => frequency))
+ /**
+ * Find pages containing a metadata key.
+ *
+ * The metadata values are compared as case-sensitive strings. Pass a
+ * callback function that returns true or false to use a different
+ * comparison function. The function will be called with the $value being
+ * searched for as the first argument, and the word in the index as the
+ * second argument. The function preg_match can be used directly if the
+ * values are regexes.
+ *
+ * @param string $key name of the metadata key to look for
+ * @param string $value search term to look for, must be a string or array of strings
+ * @param callback $func comparison function
+ * @return array lists with page names, keys are query values if $value is array
+ * @author Tom N Harris <tnharris@whoopdedo.org>
+ * @author Michael Hamann <michael@content-space.de>
+ */
+ public function lookupKey($key, &$value, $func=null) {
+ if (!is_array($value))
+ $value_array = array($value);
+ else
+ $value_array =& $value;
+
+ // the matching ids for the provided value(s)
+ $value_ids = array();
- $index = array(); //resulting index
- foreach (array_keys($words) as $wlen){
- $word_idx = idx_getIndex('w',$wlen);
- foreach ($words[$wlen] as $word => $freq) {
- $wid = array_search("$word\n",$word_idx);
- if(!is_int($wid)){
- $wid = count($word_idx);
- $word_idx[] = "$word\n";
+ $metaname = idx_cleanName($key);
+
+ // get all words in order to search the matching ids
+ if ($key == 'title') {
+ $words = $this->getIndex('title', '');
+ } else {
+ $words = $this->getIndex($metaname.'_w', '');
+ }
+
+ if (!is_null($func)) {
+ foreach ($value_array as $val) {
+ foreach ($words as $i => $word) {
+ if (call_user_func_array($func, array($val, $word)))
+ $value_ids[$i][] = $val;
+ }
+ }
+ } else {
+ foreach ($value_array as $val) {
+ $xval = $val;
+ $caret = '^';
+ $dollar = '$';
+ // check for wildcards
+ if (substr($xval, 0, 1) == '*') {
+ $xval = substr($xval, 1);
+ $caret = '';
+ }
+ if (substr($xval, -1, 1) == '*') {
+ $xval = substr($xval, 0, -1);
+ $dollar = '';
+ }
+ if (!$caret || !$dollar) {
+ $re = $caret.preg_quote($xval, '/').$dollar;
+ foreach(array_keys(preg_grep('/'.$re.'/', $words)) as $i)
+ $value_ids[$i][] = $val;
+ } else {
+ if (($i = array_search($val, $words)) !== false)
+ $value_ids[$i][] = $val;
+ }
}
- if(!isset($index[$wlen]))
- $index[$wlen] = array();
- $index[$wlen][$wid] = $freq;
}
- // save back word index
- if(!idx_saveIndex('w',$wlen,$word_idx)){
- trigger_error("Failed to write word index", E_USER_ERROR);
- return false;
+ unset($words); // free the used memory
+
+ // initialize the result so it won't be null
+ $result = array();
+ foreach ($value_array as $val) {
+ $result[$val] = array();
}
+
+ $page_idx = $this->getIndex('page', '');
+
+ // Special handling for titles
+ if ($key == 'title') {
+ foreach ($value_ids as $pid => $val_list) {
+ $page = $page_idx[$pid];
+ foreach ($val_list as $val) {
+ $result[$val][] = $page;
+ }
+ }
+ } else {
+ // load all lines and pages so the used lines can be taken and matched with the pages
+ $lines = $this->getIndex($metaname.'_i', '');
+
+ foreach ($value_ids as $value_id => $val_list) {
+ // parse the tuples of the form page_id*1:page2_id*1 and so on, return value
+ // is an array with page_id => 1, page2_id => 1 etc. so take the keys only
+ $pages = array_keys($this->parseTuples($page_idx, $lines[$value_id]));
+ foreach ($val_list as $val) {
+ $result[$val] = array_merge($result[$val], $pages);
+ }
+ }
+ }
+ if (!is_array($value)) $result = $result[$value];
+ return $result;
}
- return $index;
-}
+ /**
+ * Find the index ID of each search term.
+ *
+ * The query terms should only contain valid characters, with a '*' at
+ * either the beginning or end of the word (or both).
+ * The $result parameter can be used to merge the index locations with
+ * the appropriate query term.
+ *
+ * @param arrayref $words The query terms.
+ * @param arrayref $result Set to word => array("length*id" ...)
+ * @return array Set to length => array(id ...)
+ * @author Tom N Harris <tnharris@whoopdedo.org>
+ */
+ protected function getIndexWords(&$words, &$result) {
+ $tokens = array();
+ $tokenlength = array();
+ $tokenwild = array();
+ foreach ($words as $word) {
+ $result[$word] = array();
+ $caret = '^';
+ $dollar = '$';
+ $xword = $word;
+ $wlen = wordlen($word);
-/**
- * Adds/updates the search for the given page
- *
- * This is the core function of the indexer which does most
- * of the work. This function needs to be called with proper
- * locking!
- *
- * @author Andreas Gohr <andi@splitbrain.org>
- */
-function idx_addPage($page){
- global $conf;
+ // check for wildcards
+ if (substr($xword, 0, 1) == '*') {
+ $xword = substr($xword, 1);
+ $caret = '';
+ $wlen -= 1;
+ }
+ if (substr($xword, -1, 1) == '*') {
+ $xword = substr($xword, 0, -1);
+ $dollar = '';
+ $wlen -= 1;
+ }
+ if ($wlen < IDX_MINWORDLENGTH && $caret && $dollar && !is_numeric($xword))
+ continue;
+ if (!isset($tokens[$xword]))
+ $tokenlength[$wlen][] = $xword;
+ if (!$caret || !$dollar) {
+ $re = $caret.preg_quote($xword, '/').$dollar;
+ $tokens[$xword][] = array($word, '/'.$re.'/');
+ if (!isset($tokenwild[$xword]))
+ $tokenwild[$xword] = $wlen;
+ } else {
+ $tokens[$xword][] = array($word, null);
+ }
+ }
+ asort($tokenwild);
+ // $tokens = array( base word => array( [ query term , regexp ] ... ) ... )
+ // $tokenlength = array( base word length => base word ... )
+ // $tokenwild = array( base word => base word length ... )
+ $length_filter = empty($tokenwild) ? $tokenlength : min(array_keys($tokenlength));
+ $indexes_known = $this->indexLengths($length_filter);
+ if (!empty($tokenwild)) sort($indexes_known);
+ // get word IDs
+ $wids = array();
+ foreach ($indexes_known as $ixlen) {
+ $word_idx = $this->getIndex('w', $ixlen);
+ // handle exact search
+ if (isset($tokenlength[$ixlen])) {
+ foreach ($tokenlength[$ixlen] as $xword) {
+ $wid = array_search($xword, $word_idx);
+ if ($wid !== false) {
+ $wids[$ixlen][] = $wid;
+ foreach ($tokens[$xword] as $w)
+ $result[$w[0]][] = "$ixlen*$wid";
+ }
+ }
+ }
+ // handle wildcard search
+ foreach ($tokenwild as $xword => $wlen) {
+ if ($wlen >= $ixlen) break;
+ foreach ($tokens[$xword] as $w) {
+ if (is_null($w[1])) continue;
+ foreach(array_keys(preg_grep($w[1], $word_idx)) as $wid) {
+ $wids[$ixlen][] = $wid;
+ $result[$w[0]][] = "$ixlen*$wid";
+ }
+ }
+ }
+ }
+ return $wids;
+ }
- // load known documents
- $page_idx = idx_getIndex('page','');
+ /**
+ * Return a list of all pages
+ * Warning: pages may not exist!
+ *
+ * @param string $key list only pages containing the metadata key (optional)
+ * @return array list of page names
+ * @author Tom N Harris <tnharris@whoopdedo.org>
+ */
+ public function getPages($key=null) {
+ $page_idx = $this->getIndex('page', '');
+ if (is_null($key)) return $page_idx;
- // get page id (this is the linenumber in page.idx)
- $pid = array_search("$page\n",$page_idx);
- if(!is_int($pid)){
- $pid = count($page_idx);
- // page was new - write back
- if (!idx_appendIndex('page','',"$page\n")){
- trigger_error("Failed to write page index", E_USER_ERROR);
- return false;
+ $metaname = idx_cleanName($key);
+
+ // Special handling for titles
+ if ($key == 'title') {
+ $title_idx = $this->getIndex('title', '');
+ array_splice($page_idx, count($title_idx));
+ foreach ($title_idx as $i => $title)
+ if ($title === "") unset($page_idx[$i]);
+ return array_values($page_idx);
+ }
+
+ $pages = array();
+ $lines = $this->getIndex($metaname.'_i', '');
+ foreach ($lines as $line) {
+ $pages = array_merge($pages, $this->parseTuples($page_idx, $line));
}
+ return array_keys($pages);
}
- unset($page_idx); // free memory
- idx_saveIndexLine('title', '', $pid, p_get_first_heading($page, false));
+ /**
+ * Return a list of words sorted by number of times used
+ *
+ * @param int $min bottom frequency threshold
+ * @param int $max upper frequency limit. No limit if $max<$min
+ * @param int $length minimum length of words to count
+ * @param string $key metadata key to list. Uses the fulltext index if not given
+ * @return array list of words as the keys and frequency as values
+ * @author Tom N Harris <tnharris@whoopdedo.org>
+ */
+ public function histogram($min=1, $max=0, $minlen=3, $key=null) {
+ if ($min < 1)
+ $min = 1;
+ if ($max < $min)
+ $max = 0;
- $pagewords = array();
- // get word usage in page
- $words = idx_getPageWords($page);
- if($words === false) return false;
+ $result = array();
- if(!empty($words)) {
- foreach(array_keys($words) as $wlen){
- $index = idx_getIndex('i',$wlen);
- foreach($words[$wlen] as $wid => $freq){
- if($wid<count($index)){
- $index[$wid] = idx_updateIndexLine($index[$wid],$pid,$freq);
- }else{
- // New words **should** have been added in increasing order
- // starting with the first unassigned index.
- // If someone can show how this isn't true, then I'll need to sort
- // or do something special.
- $index[$wid] = idx_updateIndexLine('',$pid,$freq);
+ if ($key == 'title') {
+ $index = $this->getIndex('title', '');
+ $index = array_count_values($index);
+ foreach ($index as $val => $cnt) {
+ if ($cnt >= $min && (!$max || $cnt <= $max) && strlen($val) >= $minlen)
+ $result[$val] = $cnt;
+ }
+ }
+ elseif (!is_null($key)) {
+ $metaname = idx_cleanName($key);
+ $index = $this->getIndex($metaname.'_i', '');
+ $val_idx = array();
+ foreach ($index as $wid => $line) {
+ $freq = $this->countTuples($line);
+ if ($freq >= $min && (!$max || $freq <= $max) && strlen($val) >= $minlen)
+ $val_idx[$wid] = $freq;
+ }
+ if (!empty($val_idx)) {
+ $words = $this->getIndex($metaname.'_w', '');
+ foreach ($val_idx as $wid => $freq)
+ $result[$words[$wid]] = $freq;
+ }
+ }
+ else {
+ $lengths = idx_listIndexLengths();
+ foreach ($lengths as $length) {
+ if ($length < $minlen) continue;
+ $index = $this->getIndex('i', $length);
+ $words = null;
+ foreach ($index as $wid => $line) {
+ $freq = $this->countTuples($line);
+ if ($freq >= $min && (!$max || $freq <= $max)) {
+ if ($words === null)
+ $words = $this->getIndex('w', $length);
+ $result[$words[$wid]] = $freq;
+ }
}
- $pagewords[] = "$wlen*$wid";
}
- // save back word index
- if(!idx_saveIndex('i',$wlen,$index)){
- trigger_error("Failed to write index", E_USER_ERROR);
+ }
+
+ arsort($result);
+ return $result;
+ }
+
+ /**
+ * Lock the indexer.
+ *
+ * @author Tom N Harris <tnharris@whoopdedo.org>
+ */
+ protected function lock() {
+ global $conf;
+ $status = true;
+ $run = 0;
+ $lock = $conf['lockdir'].'/_indexer.lock';
+ while (!@mkdir($lock, $conf['dmode'])) {
+ usleep(50);
+ if(is_dir($lock) && time()-@filemtime($lock) > 60*5){
+ // looks like a stale lock - remove it
+ if (!@rmdir($lock)) {
+ $status = "removing the stale lock failed";
+ return false;
+ } else {
+ $status = "stale lock removed";
+ }
+ }elseif($run++ == 1000){
+ // we waited 5 seconds for that lock
return false;
}
}
+ if ($conf['dperm'])
+ chmod($lock, $conf['dperm']);
+ return $status;
+ }
+
+ /**
+ * Release the indexer lock.
+ *
+ * @author Tom N Harris <tnharris@whoopdedo.org>
+ */
+ protected function unlock() {
+ global $conf;
+ @rmdir($conf['lockdir'].'/_indexer.lock');
+ return true;
+ }
+
+ /**
+ * Retrieve the entire index.
+ *
+ * The $suffix argument is for an index that is split into
+ * multiple parts. Different index files should use different
+ * base names.
+ *
+ * @param string $idx name of the index
+ * @param string $suffix subpart identifier
+ * @return array list of lines without CR or LF
+ * @author Tom N Harris <tnharris@whoopdedo.org>
+ */
+ protected function getIndex($idx, $suffix) {
+ global $conf;
+ $fn = $conf['indexdir'].'/'.$idx.$suffix.'.idx';
+ if (!@file_exists($fn)) return array();
+ return file($fn, FILE_IGNORE_NEW_LINES);
+ }
+
+ /**
+ * Replace the contents of the index with an array.
+ *
+ * @param string $idx name of the index
+ * @param string $suffix subpart identifier
+ * @param arrayref $linex list of lines without LF
+ * @author Tom N Harris <tnharris@whoopdedo.org>
+ */
+ protected function saveIndex($idx, $suffix, &$lines) {
+ global $conf;
+ $fn = $conf['indexdir'].'/'.$idx.$suffix;
+ $fh = @fopen($fn.'.tmp', 'w');
+ if (!$fh) return false;
+ fwrite($fh, join("\n", $lines));
+ if (!empty($lines))
+ fwrite($fh, "\n");
+ fclose($fh);
+ if (isset($conf['fperm']))
+ chmod($fn.'.tmp', $conf['fperm']);
+ io_rename($fn.'.tmp', $fn.'.idx');
+ if ($suffix !== '')
+ $this->cacheIndexDir($idx, $suffix, empty($lines));
+ return true;
+ }
+
+ /**
+ * Retrieve a line from the index.
+ *
+ * @param string $idx name of the index
+ * @param string $suffix subpart identifier
+ * @param int $id the line number
+ * @return string a line with trailing whitespace removed
+ * @author Tom N Harris <tnharris@whoopdedo.org>
+ */
+ protected function getIndexKey($idx, $suffix, $id) {
+ global $conf;
+ $fn = $conf['indexdir'].'/'.$idx.$suffix.'.idx';
+ if (!@file_exists($fn)) return '';
+ $fh = @fopen($fn, 'r');
+ if (!$fh) return '';
+ $ln = -1;
+ while (($line = fgets($fh)) !== false) {
+ if (++$ln == $id) break;
+ }
+ fclose($fh);
+ return rtrim((string)$line);
}
- // Remove obsolete index entries
- $pageword_idx = trim(idx_getIndexLine('pageword','',$pid));
- if ($pageword_idx !== '') {
- $oldwords = explode(':',$pageword_idx);
- $delwords = array_diff($oldwords, $pagewords);
- $upwords = array();
- foreach ($delwords as $word) {
- if($word=='') continue;
- list($wlen,$wid) = explode('*',$word);
- $wid = (int)$wid;
- $upwords[$wlen][] = $wid;
+ /**
+ * Write a line into the index.
+ *
+ * @param string $idx name of the index
+ * @param string $suffix subpart identifier
+ * @param int $id the line number
+ * @param string $line line to write
+ * @author Tom N Harris <tnharris@whoopdedo.org>
+ */
+ protected function saveIndexKey($idx, $suffix, $id, $line) {
+ global $conf;
+ if (substr($line, -1) != "\n")
+ $line .= "\n";
+ $fn = $conf['indexdir'].'/'.$idx.$suffix;
+ $fh = @fopen($fn.'.tmp', 'w');
+ if (!$fh) return false;
+ $ih = @fopen($fn.'.idx', 'r');
+ if ($ih) {
+ $ln = -1;
+ while (($curline = fgets($ih)) !== false) {
+ fwrite($fh, (++$ln == $id) ? $line : $curline);
+ }
+ if ($id > $ln) {
+ while ($id > ++$ln)
+ fwrite($fh, "\n");
+ fwrite($fh, $line);
+ }
+ fclose($ih);
+ } else {
+ $ln = -1;
+ while ($id > ++$ln)
+ fwrite($fh, "\n");
+ fwrite($fh, $line);
}
- foreach ($upwords as $wlen => $widx) {
- $index = idx_getIndex('i',$wlen);
- foreach ($widx as $wid) {
- $index[$wid] = idx_updateIndexLine($index[$wid],$pid,0);
+ fclose($fh);
+ if (isset($conf['fperm']))
+ chmod($fn.'.tmp', $conf['fperm']);
+ io_rename($fn.'.tmp', $fn.'.idx');
+ if ($suffix !== '')
+ $this->cacheIndexDir($idx, $suffix);
+ return true;
+ }
+
+ /**
+ * Retrieve or insert a value in the index.
+ *
+ * @param string $idx name of the index
+ * @param string $suffix subpart identifier
+ * @param string $value line to find in the index
+ * @return int line number of the value in the index
+ * @author Tom N Harris <tnharris@whoopdedo.org>
+ */
+ protected function addIndexKey($idx, $suffix, $value) {
+ $index = $this->getIndex($idx, $suffix);
+ $id = array_search($value, $index);
+ if ($id === false) {
+ $id = count($index);
+ $index[$id] = $value;
+ if (!$this->saveIndex($idx, $suffix, $index)) {
+ trigger_error("Failed to write $idx index", E_USER_ERROR);
+ return false;
}
- idx_saveIndex('i',$wlen,$index);
}
+ return $id;
}
- // Save the reverse index
- $pageword_idx = join(':',$pagewords)."\n";
- if(!idx_saveIndexLine('pageword','',$pid,$pageword_idx)){
- trigger_error("Failed to write word index", E_USER_ERROR);
- return false;
+
+ protected function cacheIndexDir($idx, $suffix, $delete=false) {
+ global $conf;
+ if ($idx == 'i')
+ $cachename = $conf['indexdir'].'/lengths';
+ else
+ $cachename = $conf['indexdir'].'/'.$idx.'lengths';
+ $lengths = @file($cachename.'.idx', FILE_IGNORE_NEW_LINES | FILE_SKIP_EMPTY_LINES);
+ if ($lengths === false) $lengths = array();
+ $old = array_search((string)$suffix, $lengths);
+ if (empty($lines)) {
+ if ($old === false) return;
+ unset($lengths[$old]);
+ } else {
+ if ($old !== false) return;
+ $lengths[] = $suffix;
+ sort($lengths);
+ }
+ $fh = @fopen($cachename.'.tmp', 'w');
+ if (!$fh) {
+ trigger_error("Failed to write index cache", E_USER_ERROR);
+ return;
+ }
+ @fwrite($fh, implode("\n", $lengths));
+ @fclose($fh);
+ if (isset($conf['fperm']))
+ chmod($cachename.'.tmp', $conf['fperm']);
+ io_rename($cachename.'.tmp', $cachename.'.idx');
}
- return true;
+ /**
+ * Get the list of lengths indexed in the wiki.
+ *
+ * Read the index directory or a cache file and returns
+ * a sorted array of lengths of the words used in the wiki.
+ *
+ * @author YoBoY <yoboy.leguesh@gmail.com>
+ */
+ protected function listIndexLengths() {
+ global $conf;
+ $cachename = $conf['indexdir'].'/lengths';
+ clearstatcache();
+ if (@file_exists($cachename.'.idx')) {
+ $lengths = @file($cachename.'.idx', FILE_IGNORE_NEW_LINES | FILE_SKIP_EMPTY_LINES);
+ if ($lengths !== false) {
+ $idx = array();
+ foreach ($lengths as $length)
+ $idx[] = (int)$length;
+ return $idx;
+ }
+ }
+
+ $dir = @opendir($conf['indexdir']);
+ if ($dir === false)
+ return array();
+ $lengths[] = array();
+ while (($f = readdir($dir)) !== false) {
+ if (substr($f, 0, 1) == 'i' && substr($f, -4) == '.idx') {
+ $i = substr($f, 1, -4);
+ if (is_numeric($i))
+ $lengths[] = (int)$i;
+ }
+ }
+ closedir($dir);
+ sort($lengths);
+ // save this in a file
+ $fh = @fopen($cachename.'.tmp', 'w');
+ if (!$fh) {
+ trigger_error("Failed to write index cache", E_USER_ERROR);
+ return;
+ }
+ @fwrite($fh, implode("\n", $lengths));
+ @fclose($fh);
+ if (isset($conf['fperm']))
+ chmod($cachename.'.tmp', $conf['fperm']);
+ io_rename($cachename.'.tmp', $cachename.'.idx');
+
+ return $lengths;
+ }
+
+ /**
+ * Get the word lengths that have been indexed.
+ *
+ * Reads the index directory and returns an array of lengths
+ * that there are indices for.
+ *
+ * @author YoBoY <yoboy.leguesh@gmail.com>
+ */
+ protected function indexLengths($filter) {
+ global $conf;
+ $idx = array();
+ if (is_array($filter)) {
+ // testing if index files exist only
+ $path = $conf['indexdir']."/i";
+ foreach ($filter as $key => $value) {
+ if (@file_exists($path.$key.'.idx'))
+ $idx[] = $key;
+ }
+ } else {
+ $lengths = idx_listIndexLengths();
+ foreach ($lengths as $key => $length) {
+ // keep all the values equal or superior
+ if ((int)$length >= (int)$filter)
+ $idx[] = $length;
+ }
+ }
+ return $idx;
+ }
+
+ /**
+ * Insert or replace a tuple in a line.
+ *
+ * @author Tom N Harris <tnharris@whoopdedo.org>
+ */
+ protected function updateTuple($line, $id, $count) {
+ $newLine = $line;
+ if ($newLine !== '')
+ $newLine = preg_replace('/(^|:)'.preg_quote($id,'/').'\*\d*/', '', $newLine);
+ $newLine = trim($newLine, ':');
+ if ($count) {
+ if (strlen($newLine) > 0)
+ return "$id*$count:".$newLine;
+ else
+ return "$id*$count".$newLine;
+ }
+ return $newLine;
+ }
+
+ /**
+ * Split a line into an array of tuples.
+ *
+ * @author Tom N Harris <tnharris@whoopdedo.org>
+ * @author Andreas Gohr <andi@splitbrain.org>
+ */
+ protected function parseTuples(&$keys, $line) {
+ $result = array();
+ if ($line == '') return $result;
+ $parts = explode(':', $line);
+ foreach ($parts as $tuple) {
+ if ($tuple === '') continue;
+ list($key, $cnt) = explode('*', $tuple);
+ if (!$cnt) continue;
+ $key = $keys[$key];
+ if (!$key) continue;
+ $result[$key] = $cnt;
+ }
+ return $result;
+ }
+
+ /**
+ * Sum the counts in a list of tuples.
+ *
+ * @author Tom N Harris <tnharris@whoopdedo.org>
+ */
+ protected function countTuples($line) {
+ $freq = 0;
+ $parts = explode(':', $line);
+ foreach ($parts as $tuple) {
+ if ($tuple === '') continue;
+ list($pid, $cnt) = explode('*', $tuple);
+ $freq += (int)$cnt;
+ }
+ return $freq;
+ }
}
/**
- * Write a new index line to the filehandle
+ * Create an instance of the indexer.
*
- * This function writes an line for the index file to the
- * given filehandle. It removes the given document from
- * the given line and readds it when $count is >0.
+ * @return object a Doku_Indexer
+ * @author Tom N Harris <tnharris@whoopdedo.org>
+ */
+function idx_get_indexer() {
+ static $Indexer = null;
+ if (is_null($Indexer)) {
+ $Indexer = new Doku_Indexer();
+ }
+ return $Indexer;
+}
+
+/**
+ * Returns words that will be ignored.
*
- * @deprecated - see idx_updateIndexLine
- * @author Andreas Gohr <andi@splitbrain.org>
+ * @return array list of stop words
+ * @author Tom N Harris <tnharris@whoopdedo.org>
*/
-function idx_writeIndexLine($fh,$line,$pid,$count){
- fwrite($fh,idx_updateIndexLine($line,$pid,$count));
+function & idx_get_stopwords() {
+ static $stopwords = null;
+ if (is_null($stopwords)) {
+ global $conf;
+ $swfile = DOKU_INC.'inc/lang/'.$conf['lang'].'/stopwords.txt';
+ if(@file_exists($swfile)){
+ $stopwords = file($swfile, FILE_IGNORE_NEW_LINES);
+ }else{
+ $stopwords = array();
+ }
+ }
+ return $stopwords;
}
/**
- * Modify an index line with new information
+ * Adds/updates the search index for the given page
*
- * This returns a line of the index. It removes the
- * given document from the line and readds it if
- * $count is >0.
+ * Locking is handled internally.
*
+ * @param string $page name of the page to index
+ * @param boolean $verbose print status messages
+ * @param boolean $force force reindexing even when the index is up to date
+ * @return boolean the function completed successfully
* @author Tom N Harris <tnharris@whoopdedo.org>
- * @author Andreas Gohr <andi@splitbrain.org>
*/
-function idx_updateIndexLine($line,$pid,$count){
- $line = trim($line);
- $updated = array();
- if($line != ''){
- $parts = explode(':',$line);
- // remove doc from given line
- foreach($parts as $part){
- if($part == '') continue;
- list($doc,$cnt) = explode('*',$part);
- if($doc != $pid){
- $updated[] = $part;
+function idx_addPage($page, $verbose=false, $force=false) {
+ // check if indexing needed
+ $idxtag = metaFN($page,'.indexed');
+ if(!$force && @file_exists($idxtag)){
+ if(trim(io_readFile($idxtag)) == idx_get_version()){
+ $last = @filemtime($idxtag);
+ if($last > @filemtime(wikiFN($page))){
+ if ($verbose) print("Indexer: index for $page up to date".DOKU_LF);
+ return false;
}
}
}
- // add doc
- if ($count){
- $updated[] = "$pid*$count";
+ if (!page_exists($page)) {
+ if (!@file_exists($idxtag)) {
+ if ($verbose) print("Indexer: $page does not exist, ignoring".DOKU_LF);
+ return false;
+ }
+ $Indexer = idx_get_indexer();
+ $result = $Indexer->deletePage($page);
+ if ($result === "locked") {
+ if ($verbose) print("Indexer: locked".DOKU_LF);
+ return false;
+ }
+ @unlink($idxtag);
+ return $result;
+ }
+ $indexenabled = p_get_metadata($page, 'internal index', METADATA_RENDER_UNLIMITED);
+ if ($indexenabled === false) {
+ $result = false;
+ if (@file_exists($idxtag)) {
+ $Indexer = idx_get_indexer();
+ $result = $Indexer->deletePage($page);
+ if ($result === "locked") {
+ if ($verbose) print("Indexer: locked".DOKU_LF);
+ return false;
+ }
+ @unlink($idxtag);
+ }
+ if ($verbose) print("Indexer: index disabled for $page".DOKU_LF);
+ return $result;
}
- return join(':',$updated)."\n";
+ $body = '';
+ $metadata = array();
+ $metadata['title'] = p_get_metadata($page, 'title', METADATA_RENDER_UNLIMITED);
+ if (($references = p_get_metadata($page, 'relation references', METADATA_RENDER_UNLIMITED)) !== null)
+ $metadata['relation_references'] = array_keys($references);
+ else
+ $metadata['relation_references'] = array();
+ $data = compact('page', 'body', 'metadata');
+ $evt = new Doku_Event('INDEXER_PAGE_ADD', $data);
+ if ($evt->advise_before()) $data['body'] = $data['body'] . " " . rawWiki($page);
+ $evt->advise_after();
+ unset($evt);
+ extract($data);
+
+ $Indexer = idx_get_indexer();
+ $result = $Indexer->addPageWords($page, $body);
+ if ($result === "locked") {
+ if ($verbose) print("Indexer: locked".DOKU_LF);
+ return false;
+ }
+
+ if ($result) {
+ $result = $Indexer->addMetaKeys($page, $metadata);
+ if ($result === "locked") {
+ if ($verbose) print("Indexer: locked".DOKU_LF);
+ return false;
+ }
+ }
+
+ if ($result)
+ io_saveFile(metaFN($page,'.indexed'), idx_get_version());
+ if ($verbose) {
+ print("Indexer: finished".DOKU_LF);
+ return true;
+ }
+ return $result;
}
/**
- * Get the list of lenghts indexed in the wiki
+ * Find tokens in the fulltext index
+ *
+ * Takes an array of words and will return a list of matching
+ * pages for each one.
+ *
+ * Important: No ACL checking is done here! All results are
+ * returned, regardless of permissions
+ *
+ * @param arrayref $words list of words to search for
+ * @return array list of pages found, associated with the search terms
+ */
+function idx_lookup(&$words) {
+ $Indexer = idx_get_indexer();
+ return $Indexer->lookup($words);
+}
+
+/**
+ * Split a string into tokens
+ *
+ */
+function idx_tokenizer($string, $wc=false) {
+ $Indexer = idx_get_indexer();
+ return $Indexer->tokenizer($string, $wc);
+}
+
+/* For compatibility */
+
+/**
+ * Read the list of words in an index (if it exists).
+ *
+ * @author Tom N Harris <tnharris@whoopdedo.org>
+ */
+function idx_getIndex($idx, $suffix) {
+ global $conf;
+ $fn = $conf['indexdir'].'/'.$idx.$suffix.'.idx';
+ if (!@file_exists($fn)) return array();
+ return file($fn);
+}
+
+/**
+ * Get the list of lengths indexed in the wiki.
*
* Read the index directory or a cache file and returns
* a sorted array of lengths of the words used in the wiki.
@@ -427,10 +1309,11 @@ function idx_listIndexLengths() {
$docache = false;
} else {
clearstatcache();
- if (@file_exists($conf['indexdir'].'/lengths.idx') and (time() < @filemtime($conf['indexdir'].'/lengths.idx') + $conf['readdircache'])) {
- if (($lengths = @file($conf['indexdir'].'/lengths.idx', FILE_IGNORE_NEW_LINES | FILE_SKIP_EMPTY_LINES) ) !== false) {
+ if (@file_exists($conf['indexdir'].'/lengths.idx')
+ && (time() < @filemtime($conf['indexdir'].'/lengths.idx') + $conf['readdircache'])) {
+ if (($lengths = @file($conf['indexdir'].'/lengths.idx', FILE_IGNORE_NEW_LINES | FILE_SKIP_EMPTY_LINES)) !== false) {
$idx = array();
- foreach ( $lengths as $length) {
+ foreach ($lengths as $length) {
$idx[] = (int)$length;
}
return $idx;
@@ -439,24 +1322,24 @@ function idx_listIndexLengths() {
$docache = true;
}
- if ($conf['readdircache'] == 0 or $docache ) {
+ if ($conf['readdircache'] == 0 || $docache) {
$dir = @opendir($conf['indexdir']);
- if($dir===false)
+ if ($dir === false)
return array();
- $idx[] = array();
+ $idx = array();
while (($f = readdir($dir)) !== false) {
- if (substr($f,0,1) == 'i' && substr($f,-4) == '.idx'){
- $i = substr($f,1,-4);
+ if (substr($f, 0, 1) == 'i' && substr($f, -4) == '.idx') {
+ $i = substr($f, 1, -4);
if (is_numeric($i))
$idx[] = (int)$i;
}
}
closedir($dir);
sort($idx);
- // we save this in a file.
- if ($docache === true) {
- $handle = @fopen($conf['indexdir'].'/lengths.idx','w');
- @fwrite($handle, implode("\n",$idx));
+ // save this in a file
+ if ($docache) {
+ $handle = @fopen($conf['indexdir'].'/lengths.idx', 'w');
+ @fwrite($handle, implode("\n", $idx));
@fclose($handle);
}
return $idx;
@@ -473,232 +1356,40 @@ function idx_listIndexLengths() {
*
* @author YoBoY <yoboy.leguesh@gmail.com>
*/
-function idx_indexLengths(&$filter){
+function idx_indexLengths($filter) {
global $conf;
$idx = array();
- if (is_array($filter)){
- // testing if index files exists only
+ if (is_array($filter)) {
+ // testing if index files exist only
+ $path = $conf['indexdir']."/i";
foreach ($filter as $key => $value) {
- if (@file_exists($conf['indexdir']."/i$key.idx")) {
+ if (@file_exists($path.$key.'.idx'))
$idx[] = $key;
- }
}
} else {
$lengths = idx_listIndexLengths();
- foreach ( $lengths as $key => $length) {
- // we keep all the values equal or superior
- if ((int)$length >= (int)$filter) {
+ foreach ($lengths as $key => $length) {
+ // keep all the values equal or superior
+ if ((int)$length >= (int)$filter)
$idx[] = $length;
- }
}
}
return $idx;
}
/**
- * Find the the index number of each search term.
+ * Clean a name of a key for use as a file name.
*
- * This will group together words that appear in the same index.
- * So it should perform better, because it only opens each index once.
- * Actually, it's not that great. (in my experience) Probably because of the disk cache.
- * And the sorted function does more work, making it slightly slower in some cases.
- *
- * @param array $words The query terms. Words should only contain valid characters,
- * with a '*' at either the beginning or end of the word (or both)
- * @param arrayref $result Set to word => array("length*id" ...), use this to merge the
- * index locations with the appropriate query term.
- * @return array Set to length => array(id ...)
+ * Romanizes non-latin characters, then strips away anything that's
+ * not a letter, number, or underscore.
*
* @author Tom N Harris <tnharris@whoopdedo.org>
*/
-function idx_getIndexWordsSorted($words,&$result){
- // parse and sort tokens
- $tokens = array();
- $tokenlength = array();
- $tokenwild = array();
- foreach($words as $word){
- $result[$word] = array();
- $wild = 0;
- $xword = $word;
- $wlen = wordlen($word);
-
- // check for wildcards
- if(substr($xword,0,1) == '*'){
- $xword = substr($xword,1);
- $wild |= 1;
- $wlen -= 1;
- }
- if(substr($xword,-1,1) == '*'){
- $xword = substr($xword,0,-1);
- $wild |= 2;
- $wlen -= 1;
- }
- if ($wlen < IDX_MINWORDLENGTH && $wild == 0 && !is_numeric($xword)) continue;
- if(!isset($tokens[$xword])){
- $tokenlength[$wlen][] = $xword;
- }
- if($wild){
- $ptn = preg_quote($xword,'/');
- if(($wild&1) == 0) $ptn = '^'.$ptn;
- if(($wild&2) == 0) $ptn = $ptn.'$';
- $tokens[$xword][] = array($word, '/'.$ptn.'/');
- if(!isset($tokenwild[$xword])) $tokenwild[$xword] = $wlen;
- }else
- $tokens[$xword][] = array($word, null);
- }
- asort($tokenwild);
- // $tokens = array( base word => array( [ query word , grep pattern ] ... ) ... )
- // $tokenlength = array( base word length => base word ... )
- // $tokenwild = array( base word => base word length ... )
-
- $length_filter = empty($tokenwild) ? $tokenlength : min(array_keys($tokenlength));
- $indexes_known = idx_indexLengths($length_filter);
- if(!empty($tokenwild)) sort($indexes_known);
- // get word IDs
- $wids = array();
- foreach($indexes_known as $ixlen){
- $word_idx = idx_getIndex('w',$ixlen);
- // handle exact search
- if(isset($tokenlength[$ixlen])){
- foreach($tokenlength[$ixlen] as $xword){
- $wid = array_search("$xword\n",$word_idx);
- if(is_int($wid)){
- $wids[$ixlen][] = $wid;
- foreach($tokens[$xword] as $w)
- $result[$w[0]][] = "$ixlen*$wid";
- }
- }
- }
- // handle wildcard search
- foreach($tokenwild as $xword => $wlen){
- if($wlen >= $ixlen) break;
- foreach($tokens[$xword] as $w){
- if(is_null($w[1])) continue;
- foreach(array_keys(preg_grep($w[1],$word_idx)) as $wid){
- $wids[$ixlen][] = $wid;
- $result[$w[0]][] = "$ixlen*$wid";
- }
- }
- }
- }
- return $wids;
-}
-
-/**
- * Lookup words in index
- *
- * Takes an array of word and will return a list of matching
- * documents for each one.
- *
- * Important: No ACL checking is done here! All results are
- * returned, regardless of permissions
- *
- * @author Andreas Gohr <andi@splitbrain.org>
- */
-function idx_lookup($words){
- global $conf;
-
- $result = array();
-
- $wids = idx_getIndexWordsSorted($words, $result);
- if(empty($wids)) return array();
-
- // load known words and documents
- $page_idx = idx_getIndex('page','');
-
- $docs = array(); // hold docs found
- foreach(array_keys($wids) as $wlen){
- $wids[$wlen] = array_unique($wids[$wlen]);
- $index = idx_getIndex('i',$wlen);
- foreach($wids[$wlen] as $ixid){
- if($ixid < count($index))
- $docs["$wlen*$ixid"] = idx_parseIndexLine($page_idx,$index[$ixid]);
- }
- }
-
- // merge found pages into final result array
- $final = array();
- foreach($result as $word => $res){
- $final[$word] = array();
- foreach($res as $wid){
- $hits = &$docs[$wid];
- foreach ($hits as $hitkey => $hitcnt) {
- if (!isset($final[$word][$hitkey])) {
- $final[$word][$hitkey] = $hitcnt;
- } else {
- $final[$word][$hitkey] += $hitcnt;
- }
- }
- }
- }
- return $final;
-}
-
-/**
- * Returns a list of documents and counts from a index line
- *
- * It omits docs with a count of 0 and pages that no longer
- * exist.
- *
- * @param array $page_idx The list of known pages
- * @param string $line A line from the main index
- * @author Andreas Gohr <andi@splitbrain.org>
- */
-function idx_parseIndexLine(&$page_idx,$line){
- $result = array();
-
- $line = trim($line);
- if($line == '') return $result;
-
- $parts = explode(':',$line);
- foreach($parts as $part){
- if($part == '') continue;
- list($doc,$cnt) = explode('*',$part);
- if(!$cnt) continue;
- $doc = trim($page_idx[$doc]);
- if(!$doc) continue;
- // make sure the document still exists
- if(!page_exists($doc,'',false)) continue;
-
- $result[$doc] = $cnt;
- }
- return $result;
-}
-
-/**
- * Tokenizes a string into an array of search words
- *
- * Uses the same algorithm as idx_getPageWords()
- *
- * @param string $string the query as given by the user
- * @param arrayref $stopwords array of stopwords
- * @param boolean $wc are wildcards allowed?
- */
-function idx_tokenizer($string,&$stopwords,$wc=false){
- $words = array();
- $wc = ($wc) ? '' : $wc = '\*';
-
- if(preg_match('/[^0-9A-Za-z]/u', $string)){
- // handle asian chars as single words (may fail on older PHP version)
- $asia = @preg_replace('/('.IDX_ASIAN.')/u',' \1 ',$string);
- if(!is_null($asia)) $string = $asia; //recover from regexp failure
-
- $arr = explode(' ', utf8_stripspecials($string,' ','\._\-:'.$wc));
- foreach ($arr as $w) {
- if (!is_numeric($w) && strlen($w) < IDX_MINWORDLENGTH) continue;
- $w = utf8_strtolower($w);
- if($stopwords && is_int(array_search("$w\n",$stopwords))) continue;
- $words[] = $w;
- }
- }else{
- $w = $string;
- if (!is_numeric($w) && strlen($w) < IDX_MINWORDLENGTH) return $words;
- $w = strtolower($w);
- if(is_int(array_search("$w\n",$stopwords))) return $words;
- $words[] = $w;
- }
-
- return $words;
+function idx_cleanName($name) {
+ $name = utf8_romanize(trim((string)$name));
+ $name = preg_replace('#[ \./\\:-]+#', '_', $name);
+ $name = preg_replace('/[^A-Za-z0-9_]/', '', $name);
+ return strtolower($name);
}
//Setup VIM: ex: et ts=4 :
diff --git a/inc/infoutils.php b/inc/infoutils.php
index d3c6f2918..786661d01 100644
--- a/inc/infoutils.php
+++ b/inc/infoutils.php
@@ -176,7 +176,8 @@ function check(){
}
if($conf['authtype'] == 'plain'){
- if(is_writable(DOKU_CONF.'users.auth.php')){
+ global $config_cascade;
+ if(is_writable($config_cascade['plainauth.users']['default'])){
msg('conf/users.auth.php is writable',1);
}else{
msg('conf/users.auth.php is not writable',0);
@@ -238,6 +239,36 @@ function check(){
Make sure this directory is properly protected
(See <a href="http://www.dokuwiki.org/security">security</a>)',-1);
}
+
+ // Check for corrupted search index
+ $lengths = idx_listIndexLengths();
+ $index_corrupted = false;
+ foreach ($lengths as $length) {
+ if (count(idx_getIndex('w', $length)) != count(idx_getIndex('i', $length))) {
+ $index_corrupted = true;
+ break;
+ }
+ }
+
+ foreach (idx_getIndex('metadata', '') as $index) {
+ if (count(idx_getIndex($index.'_w', '')) != count(idx_getIndex($index.'_i', ''))) {
+ $index_corrupted = true;
+ break;
+ }
+ }
+
+ if ($index_corrupted)
+ msg('The search index is corrupted. It might produce wrong results and most
+ probably needs to be rebuilt. See
+ <a href="http://www.dokuwiki.org/faq:searchindex">faq:searchindex</a>
+ for ways to rebuild the search index.', -1);
+ elseif (!empty($lengths))
+ msg('The search index seems to be working', 1);
+ else
+ msg('The search index is empty. See
+ <a href="http://www.dokuwiki.org/faq:searchindex">faq:searchindex</a>
+ for help on how to fix the search index. If the default indexer
+ isn\'t used or the wiki is actually empty this is normal.');
}
/**
@@ -258,7 +289,7 @@ function check(){
* @see html_msgarea
*/
function msg($message,$lvl=0,$line='',$file=''){
- global $MSG;
+ global $MSG, $MSG_shown;
$errors[-1] = 'error';
$errors[0] = 'info';
$errors[1] = 'success';
@@ -268,7 +299,7 @@ function msg($message,$lvl=0,$line='',$file=''){
if(!isset($MSG)) $MSG = array();
$MSG[]=array('lvl' => $errors[$lvl], 'msg' => $message);
- if(headers_sent()){
+ if(isset($MSG_shown) || headers_sent()){
if(function_exists('html_msgarea')){
html_msgarea();
}else{
diff --git a/inc/init.php b/inc/init.php
index faf5f54e1..dfa25f8b1 100644
--- a/inc/init.php
+++ b/inc/init.php
@@ -5,13 +5,12 @@
// start timing Dokuwiki execution
function delta_time($start=0) {
- list($usec, $sec) = explode(" ", microtime());
- return ((float)$usec+(float)$sec)-((float)$start);
+ return microtime(true)-((float)$start);
}
define('DOKU_START_TIME', delta_time());
global $config_cascade;
-$config_cascade = '';
+$config_cascade = array();
// if available load a preload config file
$preload = fullpath(dirname(__FILE__)).'/preload.php';
@@ -52,10 +51,9 @@ global $cache_authname;
global $cache_metadata;
$cache_metadata = array();
-//set the configuration cascade - but only if its not already been set in preload.php
-if (empty($config_cascade)) {
- include(DOKU_INC.'inc/config_cascade.php');
-}
+// always include 'inc/config_cascade.php'
+// previously in preload.php set fields of $config_cascade will be merged with the defaults
+include(DOKU_INC.'inc/config_cascade.php');
//prepare config array()
global $conf;
@@ -277,6 +275,7 @@ function init_files(){
}
# create title index (needs to have same length as page.idx)
+ /*
$file = $conf['indexdir'].'/title.idx';
if(!@file_exists($file)){
$pages = file($conf['indexdir'].'/page.idx');
@@ -291,6 +290,7 @@ function init_files(){
nice_die("$file is not writable. Check your permissions settings!");
}
}
+ */
}
/**
@@ -420,14 +420,27 @@ function getBaseURL($abs=null){
if($conf['baseurl']) return rtrim($conf['baseurl'],'/').$dir;
//split hostheader into host and port
- $addr = explode(':',$_SERVER['HTTP_HOST']);
- $host = $addr[0];
- $port = '';
- if (isset($addr[1])) {
- $port = $addr[1];
- } elseif (isset($_SERVER['SERVER_PORT'])) {
+ if(isset($_SERVER['HTTP_HOST'])){
+ $parsed_host = parse_url('http://'.$_SERVER['HTTP_HOST']);
+ $host = $parsed_host['host'];
+ $port = $parsed_host['port'];
+ }elseif(isset($_SERVER['SERVER_NAME'])){
+ $parsed_host = parse_url('http://'.$_SERVER['SERVER_NAME']);
+ $host = $parsed_host['host'];
+ $port = $parsed_host['port'];
+ }else{
+ $host = php_uname('n');
+ $port = '';
+ }
+
+ if(!$port && isset($_SERVER['SERVER_PORT'])) {
$port = $_SERVER['SERVER_PORT'];
}
+
+ if(is_null($port)){
+ $port = '';
+ }
+
if(!is_ssl()){
$proto = 'http://';
if ($port == '80') {
diff --git a/inc/io.php b/inc/io.php
index 559f3febc..034ac650e 100644
--- a/inc/io.php
+++ b/inc/io.php
@@ -529,7 +529,7 @@ function io_rename($from,$to){
/**
- * Runs an external command and returns it's output as string
+ * Runs an external command and returns its output as string
*
* @author Harry Brueckner <harry_b@eml.cc>
* @author Andreas Gohr <andi@splitbrain.org>
@@ -547,6 +547,27 @@ function io_runcmd($cmd){
}
/**
+ * Runs an external command with input and output pipes.
+ * Returns the exit code from the process.
+ *
+ * @author Tom N Harris <tnharris@whoopdedo.org>
+ */
+function io_exec($cmd, $input, &$output){
+ $descspec = array(
+ 0=>array("pipe","r"),
+ 1=>array("pipe","w"),
+ 2=>array("pipe","w"));
+ $ph = proc_open($cmd, $descspec, $pipes);
+ if(!$ph) return -1;
+ fclose($pipes[2]); // ignore stderr
+ fwrite($pipes[0], $input);
+ fclose($pipes[0]);
+ $output = stream_get_contents($pipes[1]);
+ fclose($pipes[1]);
+ return proc_close($ph);
+}
+
+/**
* Search a file for matching lines
*
* This is probably not faster than file()+preg_grep() but less
diff --git a/inc/lang/.htaccess b/inc/lang/.htaccess
index 2ca129b12..572f5156f 100644
--- a/inc/lang/.htaccess
+++ b/inc/lang/.htaccess
@@ -1,3 +1,4 @@
-## no access to the lang directory
-order allow,deny
-deny from all
+## no access to the lang directory
+order allow,deny
+deny from all
+Satisfy All
diff --git a/inc/lang/af/lang.php b/inc/lang/af/lang.php
index fce59d13e..6665196f4 100644
--- a/inc/lang/af/lang.php
+++ b/inc/lang/af/lang.php
@@ -26,6 +26,7 @@ $lang['btn_backlink'] = 'Wat skakel hierheen';
$lang['btn_subscribe'] = 'Hou bladsy dop';
$lang['btn_unsubscribe'] = 'Verwyder van bladsy dophoulys';
$lang['btn_resendpwd'] = 'E-pos nuwe wagwoord';
+$lang['btn_register'] = 'Skep gerus \'n rekening';
$lang['loggedinas'] = 'Ingeteken as';
$lang['user'] = 'Gebruikernaam';
$lang['pass'] = 'Wagwoord';
@@ -35,7 +36,6 @@ $lang['passchk'] = 'Herhaal wagwoord';
$lang['remember'] = 'Onthou my wagwoord oor sessies';
$lang['fullname'] = 'Regte naam';
$lang['email'] = 'E-pos';
-$lang['register'] = 'Skep gerus \'n rekening';
$lang['badlogin'] = 'Intekenfout';
$lang['minoredit'] = 'Klein wysiging';
$lang['reguexists'] = 'Die gebruikersnaam wat jy gebruik het, is alreeds gebruik. Kies asseblief \'n ander gebruikersnaam.';
diff --git a/inc/lang/ar/admin.txt b/inc/lang/ar/admin.txt
index 7edee8a2b..bbb443886 100644
--- a/inc/lang/ar/admin.txt
+++ b/inc/lang/ar/admin.txt
@@ -1,3 +1,3 @@
====== الأدارة ======
-قائمة بالمهام الإدارية المتاحة فى دوكي ويكي. \ No newline at end of file
+قائمة بالمهام الإدارية المتاحة فى دوكو ويكي. \ No newline at end of file
diff --git a/inc/lang/ar/denied.txt b/inc/lang/ar/denied.txt
index 0703697b6..11405233c 100644
--- a/inc/lang/ar/denied.txt
+++ b/inc/lang/ar/denied.txt
@@ -1,3 +1,3 @@
-====== ممنوع ======
+====== لا صلاحيات ======
-عذرا، ليس مصرح لك الاستمرار، لعلك نسيت تسجيل الدخول \ No newline at end of file
+عذرا، ليس مصرح لك الاستمرار، لعلك نسيت تسجيل الدخول؟ \ No newline at end of file
diff --git a/inc/lang/ar/draft.txt b/inc/lang/ar/draft.txt
index a6221b0df..50c07f2ef 100644
--- a/inc/lang/ar/draft.txt
+++ b/inc/lang/ar/draft.txt
@@ -1,5 +1,5 @@
====== وجدت مسوّدة ======
-إن تعديلك لهذه الصفحة في المرة الماضية لم يتم بشكل صحيح، حفظت دوكي ويكي آلياً مسوّدة من عملك الأخير الذي يمكنك استخدامه الآن لمتابعة التعديل. فيما يلي البيانات التي حفظت من المرة الماضية.
+إن تعديلك لهذه الصفحة في المرة الماضية لم يتم بشكل صحيح، حفظت دوكو ويكي آلياً مسوّدة من عملك الأخير الذي يمكنك استخدامه الآن لمتابعة التعديل. فيما يلي البيانات التي حفظت من المرة الماضية.
يرجى أن تقرر إن كنت تريد //استعادة// عملك السابق أو //حذف// المسوّدة أو //إلغاء// عملية التحرير.
diff --git a/inc/lang/ar/lang.php b/inc/lang/ar/lang.php
index 30095347e..e5606c456 100644
--- a/inc/lang/ar/lang.php
+++ b/inc/lang/ar/lang.php
@@ -6,6 +6,7 @@
* @author Mostafa Hussein <mostafa@gmail.com>
* @author Yaman Hokan <always.smile.yh@hotmail.com>
* @author Usama Akkad <uahello@gmail.com>
+ * @author uahello@gmail.com
*/
$lang['encoding'] = 'utf-8';
$lang['direction'] = 'rtl';
@@ -28,7 +29,7 @@ $lang['btn_revs'] = 'نسخ قديمة';
$lang['btn_recent'] = 'أحدث التغييرات';
$lang['btn_upload'] = 'ارفع';
$lang['btn_cancel'] = 'ألغ';
-$lang['btn_index'] = 'فهرس';
+$lang['btn_index'] = 'خريطة موقع';
$lang['btn_secedit'] = 'حرر';
$lang['btn_login'] = 'لج';
$lang['btn_logout'] = 'اخرج';
@@ -45,8 +46,8 @@ $lang['btn_resendpwd'] = 'ارسل كلمة سر جديدة';
$lang['btn_draft'] = 'حرر المسودة';
$lang['btn_recover'] = 'استرجع المسودة';
$lang['btn_draftdel'] = 'احذف المسوّدة';
-$lang['btn_revert'] = 'استعد
-';
+$lang['btn_revert'] = 'استعد';
+$lang['btn_register'] = 'سجّل';
$lang['loggedinas'] = 'داخل باسم';
$lang['user'] = 'اسم المستخدم';
$lang['pass'] = 'كلمة السر';
@@ -54,21 +55,20 @@ $lang['newpass'] = 'كلمة سر جديدة';
$lang['oldpass'] = 'أكد كلمة السر الحالية';
$lang['passchk'] = 'مرة أخرى';
$lang['remember'] = 'تذكرني';
-$lang['fullname'] = 'الاسم الكامل';
+$lang['fullname'] = 'الاسم الحقيقي';
$lang['email'] = 'البريد الإلكتروني';
-$lang['register'] = 'سجّل';
$lang['profile'] = 'الملف الشخصي';
$lang['badlogin'] = 'عذرا، اسم المشترك أو كلمة السر غير صحيحة';
$lang['minoredit'] = 'تعديلات طفيفة';
-$lang['draftdate'] = 'حفظ المسودات تلقائيا مشغل';
-$lang['nosecedit'] = 'غُيرت الصفحة في هذه الأثناء، معلومات الفقرة اصبحت قديمة. حُمُلت كل الصفحة بدلا.';
-$lang['regmissing'] = 'عذرا، يجب ملء جميع الحقول';
+$lang['draftdate'] = 'حفظ المسودات آليا مفعّل';
+$lang['nosecedit'] = 'غُيرت الصفحة في هذه الأثناء، معلومات الجزء اصبحت قديمة. حُمُلت كل الصفحة بدلا.';
+$lang['regmissing'] = 'عذرا، عليك ملء جميع الحقول.';
$lang['reguexists'] = 'عذرا، يوجد مشترك بنفس الاسم.';
$lang['regsuccess'] = 'أنشئ المستخدم و ارسلت كلمة السر بالبريد.';
$lang['regsuccess2'] = 'أنشئ المستخدم.';
-$lang['regmailfail'] = 'حدث خطأ فى إرسال رسالة كلمة اسرر. يرجى مراسلة المدير';
-$lang['regbadmail'] = 'يبدو البريد الإلكتروني المعطى غير صحيح، إن كنت تظن أن هذا خطأ، راسل المدير';
-$lang['regbadpass'] = 'كلمتى المرور غير متطابقتين، حاول مرة أخرى.';
+$lang['regmailfail'] = 'حدث خطأ فى إرسال رسالة كلمة السر. يرجى مراسلة المدير!';
+$lang['regbadmail'] = 'يبدو البريد الإلكتروني المعطى غيرَ صحيح، إن كنت تظن أن هذا خطأ، راسل المدير';
+$lang['regbadpass'] = 'كلمتا المرور غير متطابقتين، حاول مرة أخرى.';
$lang['regpwmail'] = 'كلمة مرورك إلى دوكو ويكي';
$lang['reghere'] = 'ليس لديك حساب بعد؟ احصل على واحد';
$lang['profna'] = 'هذه الويكي لا تدعم تعديل الملف الشخصي';
@@ -81,35 +81,35 @@ $lang['resendpwd'] = 'إرسال كلمة مرور';
$lang['resendpwdmissing'] = 'عذراّ، يجب أن تملأ كل الحقول.';
$lang['resendpwdnouser'] = 'عذراً، لم نجد المستخدم هذا في قاعدة بياناتنا.';
$lang['resendpwdbadauth'] = 'عذراً، رمز التفعيل هذا غير صحيح. نأكد من استخدامك كامل وصلة التأكيد.';
-$lang['resendpwdconfirm'] = 'أرسل رابط التأكيد بواسطة البريد.';
-$lang['resendpwdsuccess'] = 'كلمة السرالجديدة إرسلت عبر البريد.';
-$lang['license'] = 'مالم يشر لخلاف ذلك، فإن المحتوى على هذه الويكي مرخص وفق الرخصة التالية:';
+$lang['resendpwdconfirm'] = 'اُرسل رابط التأكيد بواسطة البريد.';
+$lang['resendpwdsuccess'] = 'كلمة السرالجديدة اُرسلت عبر البريد.';
+$lang['license'] = 'مالم يشر لخلاف ذلك، فإن المحتوى في هذه الويكي مرخص وفق الرخصة التالية:';
$lang['licenseok'] = 'لاحظ: بتحرير هذه الصفحة أنت توافق على ترخيص محتواها تحت الرخصة التالية:';
-$lang['searchmedia'] = 'ابحث في اسماء الملفات:';
+$lang['searchmedia'] = 'ابحث في أسماء الملفات:';
$lang['searchmedia_in'] = 'ابحث في %s';
$lang['txt_upload'] = 'اختر ملفاً للرفع';
$lang['txt_filename'] = 'رفع كـ (اختياري)';
$lang['txt_overwrt'] = 'اكتب على ملف موجود';
-$lang['lockedby'] = 'حالياً مقفل بواسطة';
+$lang['lockedby'] = 'مقفلة حاليا لـ';
$lang['lockexpire'] = 'ينتهي القفل في';
$lang['willexpire'] = 'سينتهي قفل تحرير هذه الصفحه خلال دقيقة.\nلتجنب التعارض استخدم زر المعاينة لتصفير مؤقت القفل.';
-$lang['js']['notsavedyet'] = 'التعديلات غير المحفوظة ستفقد. اكمل فعلا؟';
+$lang['js']['notsavedyet'] = 'التعديلات غير المحفوظة ستفقد.';
$lang['js']['searchmedia'] = 'ابحث عن ملفات';
$lang['js']['keepopen'] = 'أبقي النافذة مفتوحة أثناء الاختيار';
$lang['js']['hidedetails'] = 'أخف التفاصيل';
-$lang['js']['mediatitle'] = 'اعدادات الرابط';
+$lang['js']['mediatitle'] = 'إعدادات الرابط';
$lang['js']['mediadisplay'] = 'نوع الرابط';
$lang['js']['mediaalign'] = 'المحاذاة';
$lang['js']['mediasize'] = 'حجم الصورة';
$lang['js']['mediatarget'] = 'هدف الرابط';
-$lang['js']['mediaclose'] = 'اغلق';
+$lang['js']['mediaclose'] = 'أغلق';
$lang['js']['mediainsert'] = 'أدرج';
-$lang['js']['mediadisplayimg'] = 'اظهر الصورة.';
+$lang['js']['mediadisplayimg'] = 'أظهر الصورة.';
$lang['js']['mediadisplaylnk'] = 'اظهر الرابط فقط.';
$lang['js']['mediasmall'] = 'نسخة مصغرة';
$lang['js']['mediamedium'] = 'نسخة متوسطة';
$lang['js']['medialarge'] = 'نسخة كبيرة';
-$lang['js']['mediaoriginal'] = 'نسخة أصلية';
+$lang['js']['mediaoriginal'] = 'النسخة الأصلية';
$lang['js']['medialnk'] = 'الرابط لصفحة التفاصيل';
$lang['js']['mediadirect'] = 'رابط مباشر للأصل';
$lang['js']['medianolnk'] = 'لا رابط';
@@ -118,70 +118,76 @@ $lang['js']['medialeft'] = 'حاذي الصورة إلى اليسار.';
$lang['js']['mediaright'] = 'حاذي الصورة إلى اليمين.';
$lang['js']['mediacenter'] = 'حاذي الصورة إلى الوسط.';
$lang['js']['medianoalign'] = 'لا تستعمل المحاذاة.';
-$lang['js']['nosmblinks'] = 'الروابط لمجلدات ويندوز المشاركة تعمل فقط مع متصفح مايكروسفت Internet Explorer. ما زال بإمكانك قص و لصق الرابط.';
+$lang['js']['nosmblinks'] = 'الروابط لمجلدات مشاركة وندز تعمل فقط مع متصفح مايكروسفت Internet Explorer.
+ما زال بإمكانك قص و لصق الرابط.';
$lang['js']['linkwiz'] = 'مرشد الروابط';
$lang['js']['linkto'] = 'الرابط إلى :';
$lang['js']['del_confirm'] = 'هل حقاً تريد حذف البنود المختارة؟';
$lang['js']['mu_btn'] = 'رفع عدة ملفات في وقت واحد';
$lang['rssfailed'] = 'خطأ ما حدث أثناء جلب ملف التغذية:';
$lang['nothingfound'] = 'لا يوجد شيء';
-$lang['mediaselect'] = 'ملفات الوسائط المتعددة';
-$lang['fileupload'] = 'تحميل ملف وسائط متعددة';
-$lang['uploadsucc'] = 'تم التحميل بنجاح';
-$lang['uploadfail'] = 'فشل التحميل، قد يكون الخطأ فى التراخيص؟';
-$lang['uploadwrong'] = 'التحميل ممنوع، نوع الملف مرفوض!';
-$lang['uploadexist'] = 'الملف موجود أصلاً. لم يحدث شيء';
-$lang['uploadbadcontent'] = 'المحتوى المحمّل لم يتطابق مع نوع الملف %s';
-$lang['uploadspam'] = 'التحميل محجوب بواسطة القائمة السوداء لبرنامج تقفي التطفل';
-$lang['uploadxss'] = 'التحميل محجوب لمنع المحتويات الخبيثة';
-$lang['uploadsize'] = 'الملف الذي تم رفعه كبير جدا . ( الحد الأقصى %s )';
-$lang['deletesucc'] = 'تم حذف الملف "%s"';
-$lang['deletefail'] = 'لا يمكن حذف "%s"، تأكد من تراخيصك';
-$lang['mediainuse'] = 'لم يحذف الملف "%s"، مازال موجوداً';
+$lang['mediaselect'] = 'ملفات الوسائط';
+$lang['fileupload'] = 'تحميل ملف وسائط';
+$lang['uploadsucc'] = 'تم الرفع بنجاح';
+$lang['uploadfail'] = 'فشل الرفع، ربما خطأ تراخيص؟';
+$lang['uploadwrong'] = 'الرفع ممنوع، نوع الملف مرفوض!';
+$lang['uploadexist'] = 'الملف موجود أصلاً. لم يُعمل شيئ.';
+$lang['uploadbadcontent'] = 'المحتوى المرفوع لم يطابق لاحقة ملفات %s.';
+$lang['uploadspam'] = 'الرفع محجوب بواسطة القائمة السوداء لبرنامج تقفي التطفل.';
+$lang['uploadxss'] = 'رُفض الرفع للإشتباه بمحتوى ضار.';
+$lang['uploadsize'] = 'الملف المرفوع كان كبيرا جدا . ( الحد %s )';
+$lang['deletesucc'] = 'حُذف الملف "%s".';
+$lang['deletefail'] = 'تعذر حذف "%s" - تأكد من الصلاحيات.';
+$lang['mediainuse'] = 'لم يحذف الملف "%s" - مازال مستخدما.';
$lang['namespaces'] = 'فضاء التسمية';
$lang['mediafiles'] = 'ملفات موجودة في';
+$lang['accessdenied'] = 'لا يسمح لك برؤية هذه الصفحة.';
$lang['mediausage'] = 'استخدم هذه الصياغة للدلالة على هذا الملف:';
-$lang['mediaview'] = 'عرض الملف الأصلي';
+$lang['mediaview'] = 'اعرض الملف الأصلي';
$lang['mediaroot'] = 'الجذر';
-$lang['mediaupload'] = 'تحميل ملف إلى فضاء التسمية هنا. لإنشاء فضاءات تسمية فرعية، أضفها إلى بداية خانة تحميل باسم وافصل بينها باستخدام الفواصل';
-$lang['mediaextchange'] = 'تم تغيير نوع الملف من .%s إلى .%s!';
+$lang['mediaupload'] = 'تحميل ملف إلى فضاء التسمية هنا. لإنشاء فضاءات تسمية فرعية، أضفها إلى بداية خانة تحميل باسم وافصل بينها باستخدام الفاصلتان الرأسيتان.';
+$lang['mediaextchange'] = 'غُيرت لاحقة الملف من .%s إلى .%s!';
$lang['reference'] = 'مراجع لـ';
$lang['ref_inuse'] = 'لا يمكن حذف الملف، لأنه مستخدم من قبل الصفحات التالية:';
-$lang['ref_hidden'] = 'بعض المراجع لصفاحات لا تملك ترخيص برؤيتها';
-$lang['hits'] = 'زوار';
-$lang['quickhits'] = 'صفحات بهذا الاسم';
+$lang['ref_hidden'] = 'بعض المراجع على صفحات لا تملك صلاحيات قراءتها';
+$lang['hits'] = 'مرة';
+$lang['quickhits'] = 'صفحات مطابقة';
$lang['toc'] = 'جدول المحتويات';
$lang['current'] = 'حالي';
$lang['yours'] = 'نسختك';
-$lang['diff'] = 'مقارنة بالنسخة الحالية';
-$lang['diff2'] = 'مقارنة بين النسخ المختارة';
+$lang['diff'] = 'أظهر الاختلافات مع النسخة الحالية';
+$lang['diff2'] = 'أظهر الاختلافات بين النسخ المحددة';
+$lang['difflink'] = 'رابط إلى هذه المقارنة';
+$lang['diff_type'] = 'أظهر الفروق:';
+$lang['diff_inline'] = 'ضمنا';
+$lang['diff_side'] = 'جنبا إلى جنب';
$lang['line'] = 'سطر';
$lang['breadcrumb'] = 'أثر';
$lang['youarehere'] = 'أنت هنا';
$lang['lastmod'] = 'آخر تعديل';
$lang['by'] = 'بواسطة';
-$lang['deleted'] = 'تم حذف';
-$lang['created'] = 'تم إنشاء';
-$lang['restored'] = 'عودة لنسخة قديمة';
+$lang['deleted'] = 'حذفت';
+$lang['created'] = 'اُنشئت';
+$lang['restored'] = 'استعيدت نسخة قديمة';
$lang['external_edit'] = 'تحرير خارجي';
$lang['summary'] = 'ملخص التحرير';
$lang['noflash'] = 'تحتاج إلى<a href="http://www.adobe.com/products/flashplayer/">ملحق فلاش أدوبي</a> لعرض هذا المحتوى.';
$lang['download'] = 'نزل Snippet';
$lang['mail_newpage'] = 'إضافة صفحة:';
$lang['mail_changed'] = 'تعديل صفحة:';
-$lang['mail_subscribe_list'] = 'صفحات غيرت في النظاق:';
-$lang['mail_new_user'] = 'مشترك جديد';
-$lang['mail_upload'] = 'تحميل ملف:';
+$lang['mail_subscribe_list'] = 'صفحات غيرت في النطاق:';
+$lang['mail_new_user'] = 'مشترك جديد:';
+$lang['mail_upload'] = 'رفع ملف:';
$lang['qb_bold'] = 'نص عريض';
$lang['qb_italic'] = 'نص مائل';
$lang['qb_underl'] = 'نص مسطر';
$lang['qb_code'] = 'نص برمجي';
$lang['qb_strike'] = 'نص مشطوب';
-$lang['qb_h1'] = 'عنوان مستوى أول';
-$lang['qb_h2'] = 'عنوان مستوى ثاني';
-$lang['qb_h3'] = 'عنوان مستوى ثالث';
-$lang['qb_h4'] = 'عنوان مستوى رابع';
-$lang['qb_h5'] = 'عنوان مستوى خامس';
+$lang['qb_h1'] = 'عنوان مستوى ١';
+$lang['qb_h2'] = 'عنوان مستوى ٢';
+$lang['qb_h3'] = 'عنوان مستوى ٣';
+$lang['qb_h4'] = 'عنوان مستوى ٤';
+$lang['qb_h5'] = 'عنوان مستوى ٥';
$lang['qb_h'] = 'الترويسة';
$lang['qb_hs'] = 'حدد الترويسة';
$lang['qb_hplus'] = 'ترويسة أعلى';
@@ -192,29 +198,29 @@ $lang['qb_extlink'] = 'رابط خارجي';
$lang['qb_hr'] = 'سطر أفقي';
$lang['qb_ol'] = 'بند فى قائمة مرتبة';
$lang['qb_ul'] = 'بند فى قائمة غير مرتبة';
-$lang['qb_media'] = 'إضافة صور و ملفات أخرى';
-$lang['qb_sig'] = 'أضف توقيعك';
-$lang['qb_smileys'] = 'الابتسامات';
+$lang['qb_media'] = 'أضف صورا و ملفات أخرى';
+$lang['qb_sig'] = 'أدرج التوقيع';
+$lang['qb_smileys'] = 'الإبتسامات';
$lang['qb_chars'] = 'محارف خاصة';
$lang['upperns'] = 'انتقل للنطاق الأب';
-$lang['admin_register'] = 'إضافة مشترك جديد';
+$lang['admin_register'] = 'أضف مستخدما جديدا';
$lang['metaedit'] = 'تحرير البيانات الشمولية ';
-$lang['metasaveerr'] = 'فشلت عملية كتابة البيانات الشمولية';
-$lang['metasaveok'] = 'تم حفظ البيانت الشمولية';
-$lang['img_backto'] = 'العودة إلى';
+$lang['metasaveerr'] = 'فشلت كتابة البيانات الشمولية';
+$lang['metasaveok'] = 'حُفظت البيانات الشمولية';
+$lang['img_backto'] = 'عودة إلى';
$lang['img_title'] = 'العنوان';
-$lang['img_caption'] = 'تنويه الصورة';
+$lang['img_caption'] = 'وصف';
$lang['img_date'] = 'التاريخ';
$lang['img_fname'] = 'اسم الملف';
$lang['img_fsize'] = 'الحجم';
$lang['img_artist'] = 'المصور';
$lang['img_copyr'] = 'حقوق النسخ';
-$lang['img_format'] = 'صيغ رسومية';
-$lang['img_camera'] = 'آلة التصوير';
+$lang['img_format'] = 'الهيئة';
+$lang['img_camera'] = 'الكمرا';
$lang['img_keywords'] = 'كلمات مفتاحية';
$lang['subscr_subscribe_success'] = 'اضيف %s لقائمة اشتراك %s';
$lang['subscr_subscribe_error'] = 'خطأ في إضافة %s لقائمة اشتراك %s';
-$lang['subscr_subscribe_noaddress'] = 'ليس هناك عنوان مرتبط بدخولك، لا يمكن اضافتك لقائمة الاشتراك';
+$lang['subscr_subscribe_noaddress'] = 'ليس هناك عنوان مرتبط بولوجك، لا يمكن اضافتك لقائمة الاشتراك';
$lang['subscr_unsubscribe_success'] = 'أزيل %s من قائمة اشتراك %s';
$lang['subscr_unsubscribe_error'] = 'خطأ في إزالة %s من قائمة اشتراك %s';
$lang['subscr_already_subscribed'] = '%s مشترك مسبقا في %s';
@@ -224,20 +230,20 @@ $lang['subscr_m_new_header'] = 'أضف اشتراكا';
$lang['subscr_m_current_header'] = 'الاشتراكات الحالية';
$lang['subscr_m_unsubscribe'] = 'ألغ الاشتراك';
$lang['subscr_m_subscribe'] = 'اشترك';
-$lang['subscr_m_receive'] = 'استقبل';
+$lang['subscr_m_receive'] = 'استقبال';
$lang['subscr_style_every'] = 'بريدا على كل تغيير';
$lang['subscr_style_digest'] = 'بريد ملخص عن تغييرات كل صفحة';
$lang['subscr_style_list'] = 'قائمة بالصفحات المتغيرة منذ آخر بريد';
$lang['authmodfailed'] = 'إعدادات تصريح فاسدة، يرجى مراسلة المدير.';
$lang['authtempfail'] = 'تصريح المشترك غير متوفر مؤقتاً، إن استمرت هذه الحالة يرجى مراسلة المدير';
$lang['i_chooselang'] = 'اختر لغتك';
-$lang['i_installer'] = 'برنامج تنصيب دوكي ويكي';
+$lang['i_installer'] = 'برنامج تنصيب دوكو ويكي';
$lang['i_wikiname'] = 'اسم الويكي';
$lang['i_enableacl'] = 'تفعيل ACL - مفضل';
$lang['i_superuser'] = 'مشرف';
$lang['i_problems'] = 'وجد برنامج التنصيب المشاكل التالية، لا يمكنك المتابعة قبل حلها.';
-$lang['i_modified'] = 'لأسباب أمنية هذا البرنامج سيعمل فقط مع تنصيب دوكي ويكي جديد و غير معدّل.
-يجب أن تعيد فك ضغط الملفات مرة أخرى من المكتبة المضغوطة، أو راجع <a href="http://dokuwiki.org/install"> تعليمات تنصيب دوكي ويكي </a> ';
+$lang['i_modified'] = 'لأسباب أمنية هذا البرنامج سيعمل فقط مع تنصيب دوكو ويكي جديد و غير معدّل.
+يجب أن تعيد فك ضغط الملفات مرة أخرى من المكتبة المضغوطة، أو راجع <a href="http://dokuwiki.org/install"> تعليمات تنصيب دوكو ويكي </a> ';
$lang['i_funcna'] = 'دالة PHP التالية غير متوفرة.
<code>%s</code>
قد يكون مزود خدمة الاستفادة قد حجبها لسبب ما.';
@@ -246,20 +252,21 @@ $lang['i_phpver'] = 'نسخة PHP التي لديك هي
وهي أقل من النسخة المطلوبة
<code>%s</code>
عليك تحديث نسخة PHP';
-$lang['i_permfail'] = 'إن <code>%s</code> غير قابل للكتابة بواسطة دوكي ويكي، عليك تعديل إعدادات الصلاحيات لهذا المجلد!';
+$lang['i_permfail'] = 'إن <code>%s</code> غير قابل للكتابة بواسطة دوكو ويكي، عليك تعديل إعدادات الصلاحيات لهذا المجلد!';
$lang['i_confexists'] = 'إن <code>%s</code> موجود أصلاً';
$lang['i_writeerr'] = 'لا يمكن إنشاء <code>%s</code>، عليك التأكد من صلاحيات الملف أو المجلد وإنشاء الملف يدوياً.';
$lang['i_badhash'] = 'الملف dokuwiki.php غير مصنف أو قد تم تعديله
(hash=<code>%s</code>)';
$lang['i_badval'] = 'القيمة <code>%s</code> غير شرعية أو فارغة';
$lang['i_success'] = 'الإعدادات تمت بنجاح، يرجى حذف الملف install.php الآن.
-ثم تابع إلى <a href="doku.php"> دوكي ويكي الجديدة</a>';
-$lang['i_failure'] = 'بعض الأخطاء حدثت أثنا كتابة ملفات الإعدادات، عليك تعديلها يدوياً قبل أن تستطيع استخدام <a href="doku.php"> دوكي ويكي الجديدة</a>';
+ثم تابع إلى <a href="doku.php"> دوكو ويكي الجديدة</a>';
+$lang['i_failure'] = 'بعض الأخطاء حدثت أثنا كتابة ملفات الإعدادات، عليك تعديلها يدوياً قبل أن تستطيع استخدام <a href="doku.php"> دوكو ويكي الجديدة</a>';
$lang['i_policy'] = 'تصريح ACL مبدئي';
$lang['i_pol0'] = 'ويكي مفتوحة؛ أي القراءة والكتابة والتحميل مسموحة للجميع';
$lang['i_pol1'] = 'ويكي عامة؛ أي القراءة للجميع ولكن الكتابة والتحميل للمشتركين المسجلين فقط';
$lang['i_pol2'] = 'ويكي مغلقة؛ أي القراءة والكتابة والتحميل للمشتركين المسجلين فقط';
$lang['i_retry'] = 'إعادة المحاولة';
+$lang['i_license'] = 'اختر الرخصة التي تريد وضع المحتوى تحتها:';
$lang['mu_intro'] = 'هنا يمكنك رفع ملفات متعددة في وقت واحد. انقر على زر استعرض لاضافتهم إلى الطابور. انقر ارفع عند الانتهاء.';
$lang['mu_gridname'] = 'اسم الملف';
$lang['mu_gridsize'] = 'الحجم';
diff --git a/inc/lang/ar/mailtext.txt b/inc/lang/ar/mailtext.txt
index 541d28da2..21d416566 100644
--- a/inc/lang/ar/mailtext.txt
+++ b/inc/lang/ar/mailtext.txt
@@ -1,4 +1,4 @@
-تم تغيير أو أضافة صفحة فى دوكيويكي. اليك التفاصيل:
+تم تغيير أو أضافة صفحة فى دوكو ويكي. اليك التفاصيل:
التاريخ : @DATE@
المتصفح : @BROWSER@
@@ -13,5 +13,5 @@
--
-تم أرسال هذه الرسالة من الدوكيويكي المتوجدة فى
+تم أرسال هذه الرسالة من دوكو ويكي فى
@DOKUWIKIURL@
diff --git a/inc/lang/ar/password.txt b/inc/lang/ar/password.txt
index c86624966..c8530bb02 100644
--- a/inc/lang/ar/password.txt
+++ b/inc/lang/ar/password.txt
@@ -6,5 +6,5 @@
كلمة السر : @PASSWORD@
--
-تم أرسال هذه الرسالة من دوكيويكي
+تم أرسال هذه الرسالة من دوكو ويكي
@DOKUWIKIURL@
diff --git a/inc/lang/ar/resendpwd.txt b/inc/lang/ar/resendpwd.txt
index e9f6690ae..c69713706 100644
--- a/inc/lang/ar/resendpwd.txt
+++ b/inc/lang/ar/resendpwd.txt
@@ -1,3 +1,3 @@
-==== إرسال رقم سري جديد ====
+==== إرسال كلمة سر جديدة ====
-رجاء اكتب اسم المستخدم في الاستمارة الموجودة في الأسفل ليتم طلب رقم سري جديد لحسابك في هذا الويكي . سيتم إرسال رابط لتأكيد طلبك إلى بريدك الإلكتروني المسجل . \ No newline at end of file
+رجاء اكتب اسم المستخدم في الاستمارة الموجودة في الأسفل ليتم طلب رقم سري جديد لحسابك في هذا الويكي . سيرسل رابط لتأكيد طلبك إلى بريدك الإلكتروني المسجل . \ No newline at end of file
diff --git a/inc/lang/ar/subscr_digest.txt b/inc/lang/ar/subscr_digest.txt
index 8d6e731cf..6e8c2fa94 100644
--- a/inc/lang/ar/subscr_digest.txt
+++ b/inc/lang/ar/subscr_digest.txt
@@ -1 +1,20 @@
-مرحبا! \ No newline at end of file
+مرحبا!
+
+تغيرت الصفحة @PAGE@ في ويكي @TITLE@.
+هذه هي التغيرات:
+
+--------------------------------------------------------
+@DIFF@
+--------------------------------------------------------
+
+النسخة القديمة: @OLDPAGE@
+النسخة الحديثة: @NEWPAGE@
+
+لإلغاء تنبيه الصفحة, لج الويكي في
+@DOKUWIKIURL@ ثم زُر
+@SUBSCRIBE@
+وألغ اشتراكك من الصفحات أو النظاقات
+
+--
+أنشئت هذه الرسالة من دوكو ويكي في
+@DOKUWIKIURL@ \ No newline at end of file
diff --git a/inc/lang/az/admin.txt b/inc/lang/az/admin.txt
index 000caa06d..000caa06d 100755..100644
--- a/inc/lang/az/admin.txt
+++ b/inc/lang/az/admin.txt
diff --git a/inc/lang/az/adminplugins.txt b/inc/lang/az/adminplugins.txt
index 62b1f8793..62b1f8793 100755..100644
--- a/inc/lang/az/adminplugins.txt
+++ b/inc/lang/az/adminplugins.txt
diff --git a/inc/lang/az/backlinks.txt b/inc/lang/az/backlinks.txt
index 72a7c858d..72a7c858d 100755..100644
--- a/inc/lang/az/backlinks.txt
+++ b/inc/lang/az/backlinks.txt
diff --git a/inc/lang/az/conflict.txt b/inc/lang/az/conflict.txt
index 908be09f1..908be09f1 100755..100644
--- a/inc/lang/az/conflict.txt
+++ b/inc/lang/az/conflict.txt
diff --git a/inc/lang/az/denied.txt b/inc/lang/az/denied.txt
index a68b08c8c..a68b08c8c 100755..100644
--- a/inc/lang/az/denied.txt
+++ b/inc/lang/az/denied.txt
diff --git a/inc/lang/az/diff.txt b/inc/lang/az/diff.txt
index a944f84f4..a944f84f4 100755..100644
--- a/inc/lang/az/diff.txt
+++ b/inc/lang/az/diff.txt
diff --git a/inc/lang/az/draft.txt b/inc/lang/az/draft.txt
index 65c743de3..65c743de3 100755..100644
--- a/inc/lang/az/draft.txt
+++ b/inc/lang/az/draft.txt
diff --git a/inc/lang/az/edit.txt b/inc/lang/az/edit.txt
index 7ce66307e..7ce66307e 100755..100644
--- a/inc/lang/az/edit.txt
+++ b/inc/lang/az/edit.txt
diff --git a/inc/lang/az/editrev.txt b/inc/lang/az/editrev.txt
index 8e98d2ff3..8e98d2ff3 100755..100644
--- a/inc/lang/az/editrev.txt
+++ b/inc/lang/az/editrev.txt
diff --git a/inc/lang/az/index.txt b/inc/lang/az/index.txt
index dc3ffa3b0..dc3ffa3b0 100755..100644
--- a/inc/lang/az/index.txt
+++ b/inc/lang/az/index.txt
diff --git a/inc/lang/az/install.html b/inc/lang/az/install.html
index d41511438..d41511438 100755..100644
--- a/inc/lang/az/install.html
+++ b/inc/lang/az/install.html
diff --git a/inc/lang/az/lang.php b/inc/lang/az/lang.php
index ca826c8e0..35b18d3a7 100644
--- a/inc/lang/az/lang.php
+++ b/inc/lang/az/lang.php
@@ -47,6 +47,7 @@ $lang['btn_draft'] = 'Qaralamada düzəliş etmək';
$lang['btn_recover'] = 'Qaralamanı qaytar';
$lang['btn_draftdel'] = 'Qaralamanı sil';
$lang['btn_revert'] = 'Qaytar';
+$lang['btn_register'] = 'Qeydiyyatdan keç';
$lang['loggedinas'] = 'İstifadəcinin adı';
$lang['user'] = 'istifadəci adı';
$lang['pass'] = 'Şifrə';
@@ -56,7 +57,6 @@ $lang['passchk'] = 'təkrarlayın';
$lang['remember'] = 'Məni yadda saxla';
$lang['fullname'] = 'Tam ad';
$lang['email'] = 'E-Mail';
-$lang['register'] = 'Qeydiyyatdan keç';
$lang['profile'] = 'İstifadəçi profili';
$lang['badlogin'] = 'Təssüf ki istifadəçi adı və ya şifrə səhvdir.';
$lang['minoredit'] = 'Az dəyişiklər';
diff --git a/inc/lang/az/locked.txt b/inc/lang/az/locked.txt
index 8ab934443..8ab934443 100755..100644
--- a/inc/lang/az/locked.txt
+++ b/inc/lang/az/locked.txt
diff --git a/inc/lang/az/login.txt b/inc/lang/az/login.txt
index e0a559bc1..e0a559bc1 100755..100644
--- a/inc/lang/az/login.txt
+++ b/inc/lang/az/login.txt
diff --git a/inc/lang/az/mailtext.txt b/inc/lang/az/mailtext.txt
index 439458658..439458658 100755..100644
--- a/inc/lang/az/mailtext.txt
+++ b/inc/lang/az/mailtext.txt
diff --git a/inc/lang/az/newpage.txt b/inc/lang/az/newpage.txt
index c749f20af..c749f20af 100755..100644
--- a/inc/lang/az/newpage.txt
+++ b/inc/lang/az/newpage.txt
diff --git a/inc/lang/az/norev.txt b/inc/lang/az/norev.txt
index 453dad56b..453dad56b 100755..100644
--- a/inc/lang/az/norev.txt
+++ b/inc/lang/az/norev.txt
diff --git a/inc/lang/az/password.txt b/inc/lang/az/password.txt
index 31bf387da..31bf387da 100755..100644
--- a/inc/lang/az/password.txt
+++ b/inc/lang/az/password.txt
diff --git a/inc/lang/az/preview.txt b/inc/lang/az/preview.txt
index dbeaa44f5..dbeaa44f5 100755..100644
--- a/inc/lang/az/preview.txt
+++ b/inc/lang/az/preview.txt
diff --git a/inc/lang/az/pwconfirm.txt b/inc/lang/az/pwconfirm.txt
index 177e5a1fa..177e5a1fa 100755..100644
--- a/inc/lang/az/pwconfirm.txt
+++ b/inc/lang/az/pwconfirm.txt
diff --git a/inc/lang/az/read.txt b/inc/lang/az/read.txt
index 39b31f108..39b31f108 100755..100644
--- a/inc/lang/az/read.txt
+++ b/inc/lang/az/read.txt
diff --git a/inc/lang/az/recent.txt b/inc/lang/az/recent.txt
index 8766d9953..8766d9953 100755..100644
--- a/inc/lang/az/recent.txt
+++ b/inc/lang/az/recent.txt
diff --git a/inc/lang/az/register.txt b/inc/lang/az/register.txt
index eb6386f72..eb6386f72 100755..100644
--- a/inc/lang/az/register.txt
+++ b/inc/lang/az/register.txt
diff --git a/inc/lang/az/registermail.txt b/inc/lang/az/registermail.txt
index 51919756f..51919756f 100755..100644
--- a/inc/lang/az/registermail.txt
+++ b/inc/lang/az/registermail.txt
diff --git a/inc/lang/az/resendpwd.txt b/inc/lang/az/resendpwd.txt
index cc286174a..cc286174a 100755..100644
--- a/inc/lang/az/resendpwd.txt
+++ b/inc/lang/az/resendpwd.txt
diff --git a/inc/lang/az/revisions.txt b/inc/lang/az/revisions.txt
index 7164a9959..7164a9959 100755..100644
--- a/inc/lang/az/revisions.txt
+++ b/inc/lang/az/revisions.txt
diff --git a/inc/lang/az/searchpage.txt b/inc/lang/az/searchpage.txt
index 4f8efe007..4f8efe007 100755..100644
--- a/inc/lang/az/searchpage.txt
+++ b/inc/lang/az/searchpage.txt
diff --git a/inc/lang/az/showrev.txt b/inc/lang/az/showrev.txt
index dd398704b..dd398704b 100755..100644
--- a/inc/lang/az/showrev.txt
+++ b/inc/lang/az/showrev.txt
diff --git a/inc/lang/az/stopwords.txt b/inc/lang/az/stopwords.txt
index 04eb312eb..04eb312eb 100755..100644
--- a/inc/lang/az/stopwords.txt
+++ b/inc/lang/az/stopwords.txt
diff --git a/inc/lang/az/updateprofile.txt b/inc/lang/az/updateprofile.txt
index 569e425d4..569e425d4 100755..100644
--- a/inc/lang/az/updateprofile.txt
+++ b/inc/lang/az/updateprofile.txt
diff --git a/inc/lang/az/uploadmail.txt b/inc/lang/az/uploadmail.txt
index d538f8258..d538f8258 100755..100644
--- a/inc/lang/az/uploadmail.txt
+++ b/inc/lang/az/uploadmail.txt
diff --git a/inc/lang/az/wordblock.txt b/inc/lang/az/wordblock.txt
index ec8b102af..ec8b102af 100755..100644
--- a/inc/lang/az/wordblock.txt
+++ b/inc/lang/az/wordblock.txt
diff --git a/inc/lang/bg/admin.txt b/inc/lang/bg/admin.txt
index 8d16f68aa..d3c14a0da 100644
--- a/inc/lang/bg/admin.txt
+++ b/inc/lang/bg/admin.txt
@@ -1,3 +1,3 @@
-====== Администрация ======
+====== Администриране ======
-Долу може да намерите списък с администраторски задачи в DokuWiki. \ No newline at end of file
+Отдолу ще намерите списъка с администраторските задачи в DokuWiki. \ No newline at end of file
diff --git a/inc/lang/bg/adminplugins.txt b/inc/lang/bg/adminplugins.txt
index 2b0268ed4..df24b0538 100644
--- a/inc/lang/bg/adminplugins.txt
+++ b/inc/lang/bg/adminplugins.txt
@@ -1 +1 @@
-===== Допълнителни Plugins ===== \ No newline at end of file
+===== Допълнителни приставки ===== \ No newline at end of file
diff --git a/inc/lang/bg/backlinks.txt b/inc/lang/bg/backlinks.txt
index 28801a8ee..dd633d94d 100644
--- a/inc/lang/bg/backlinks.txt
+++ b/inc/lang/bg/backlinks.txt
@@ -1,3 +1,3 @@
-====== Задни връзки ======
+====== Обратни препратки ======
-Това е списък на страници, които изглежда препращат обратно към текущата страница.
+Това е списък на страниците, които препращат обратно към текущата страница.
diff --git a/inc/lang/bg/conflict.txt b/inc/lang/bg/conflict.txt
index 51ec4b706..8c62a3787 100644
--- a/inc/lang/bg/conflict.txt
+++ b/inc/lang/bg/conflict.txt
@@ -1,6 +1,6 @@
-====== По-нова версия съшествува ======
+====== Съществува по-нова версия ======
-По-нова версия на документа който сте редактирали съществува. Това се случва когато друг потребител е променил документа докато сте го редактирали.
+Съществува по-нова версия на документа, който сте редактирали. Това се случва когато друг потребител е променил документа докато сте го редактирали.
-Разгледайте внимателно разгледайте разликите показани долу, след това решете коя версия да запазите. Ако изберете ''Запис'', версия Ви ще бъде запазена. Изберете ''Отказ'', за да запазите текущата версия.
+Разгледайте внимателно разликите, след това решете коя версия да бъде запазена. Ако натиснете ''Запис'', ще бъде запазена вашата версия. Натиснете ли ''Отказ'', ще бъде запазена текущата версия.
diff --git a/inc/lang/bg/denied.txt b/inc/lang/bg/denied.txt
index 7b1d5788e..45ce63769 100644
--- a/inc/lang/bg/denied.txt
+++ b/inc/lang/bg/denied.txt
@@ -1,4 +1,4 @@
====== Отказан достъп ======
-Нямате достатъчно права да продължите. Може би сте забравили да влезете?
+Нямате достатъчно права, за да продължите. Може би сте забравили да се впишете?
diff --git a/inc/lang/bg/diff.txt b/inc/lang/bg/diff.txt
index 2bd8262c6..a22031e93 100644
--- a/inc/lang/bg/diff.txt
+++ b/inc/lang/bg/diff.txt
@@ -1,4 +1,3 @@
====== Разлики ======
-Тук са показани разликите между избраната версия на страницата и текущата.
-
+Тук са показани разликите между избраната и текущата версия на страницата.
diff --git a/inc/lang/bg/draft.txt b/inc/lang/bg/draft.txt
index 1938e7d9c..a59201130 100644
--- a/inc/lang/bg/draft.txt
+++ b/inc/lang/bg/draft.txt
@@ -1,6 +1,6 @@
====== Намерена чернова ======
-Последната редакционна сесия на тази страница не е завършена правилно. Dokuwiki автоматично запазва чернова по време на работа, която може сега да използвате, за да продължите редактирането си. Долу може да видите данните, които бяха запазени от последната сесия.
+Последната редакционна сесия на страницата не е завършена правилно. Dokuwiki автоматично запазва чернова по време на редактирането, която можете да ползвате сега, за да продължите работата си. Отдолу може да видите данните, които бяха запазени от последната сесия.
-Моля решете, дали искате да //recover// последната си редакционна сесия, да //delete// автоматично запазената чернова или да //cancel// редакцията.
+Моля решете, дали искате да //възстановите// последната си редакционна сесия, //изтриете// автоматично запазената чернова или //откажете// редакцията.
diff --git a/inc/lang/bg/edit.txt b/inc/lang/bg/edit.txt
index 90d376dbc..086d9978e 100644
--- a/inc/lang/bg/edit.txt
+++ b/inc/lang/bg/edit.txt
@@ -1,2 +1,2 @@
-Редактирайте страницата и натиснете ''Запис''. Погледнете [[wiki:syntax]] за Wiki синтаксис. Моля редактирайте страницата, само ако може да я **подобрите**. Ако искате да пробвате разни неща, научете се да правите първите си стъпки в [[playground:playground|пясъчника]].
+Редактирайте и натиснете ''Запис''. За информация относно ползвания синтаксис прочетете [[wiki:syntax]]. Моля, редактирайте само когато може да **подобрите** съдържанието. Ако ще пробвате разни неща, може да експериментирате в [[playground:playground|пясъчника]].
diff --git a/inc/lang/bg/editrev.txt b/inc/lang/bg/editrev.txt
index 87e7b26a8..ba97f253a 100644
--- a/inc/lang/bg/editrev.txt
+++ b/inc/lang/bg/editrev.txt
@@ -1,2 +1,2 @@
-**Заредили сте стара версия на документа!** Ако я запазите, ще създадете нова редакция с текущите данни.
+**Заредена е стара версия на документа!** Ако я запазите, ще създадете нова версия с текущите данни.
----
diff --git a/inc/lang/bg/index.txt b/inc/lang/bg/index.txt
index 2ebf5128a..7dabac6af 100644
--- a/inc/lang/bg/index.txt
+++ b/inc/lang/bg/index.txt
@@ -1,4 +1,4 @@
====== Индекс ======
-Това е списък на всички достъпни страници подредени по [[doku>namespaces|именни пространства]].
+Това е списък на всички налични страници подредени по [[doku>namespaces|именни пространства]].
diff --git a/inc/lang/bg/install.html b/inc/lang/bg/install.html
index 0d7fd5232..44f02f4c2 100644
--- a/inc/lang/bg/install.html
+++ b/inc/lang/bg/install.html
@@ -1,25 +1,15 @@
-<p>Тази страница помага при първоначална инсталация и настройка на
+<p>Страницата помага при инсталиране за първи път и настройване на
<a href="http://dokuwiki.org">Dokuwiki</a>. Повече информация
-за този инсталатор е достъпна в неговата собствена
-<a href="http://dokuwiki.org/installer">документация</a>.</p>
+за инсталатора ще намерите в <a href="http://dokuwiki.org/installer">документацията му</a>.</p>
-<p>Dokuwiki използва обикновени файлове за хранилище на уики страниците и друга
-информация свързана с тези страници(примерно картинки, търсене, стари версии, т.н.).
-За да използвате успешно DokuWiki
-<strong>трябва</strong> да имате достъп за писане в директориите които съдържат тези
-файлове. Този инсталатор няма възможности да настройва правата на директориите.
-Това обикновено трябва да бъде направено директно от командният ред или ако
-използвате хостинг - през FTP или контрол панела на хоста(примерно cPanel).</p>
+<p>Dokuwiki ползва обикновени файлове за съхраняване на страниците и информацията свързана с тях (примерно картинки, търсения, стари версии, и др.).
+За да функционира нормално DokuWiki
+<strong>трябва</strong> да има право за писане в директориите, които съдържат тези
+файлове. Инсталаторът не може да настройва правата на директориите.
+Вие трябва да направите това директно от командният ред или ако ползвате хостинг през FTP или контролния панела на хоста (примерно cPanel).</p>
-<p>Този инсталатор ще настрои вашата DokuWiki конфигурация за
-<acronym title="access control list">ACL</acronym>, което на
-свой ред ще позволи на администратора да влезе и да има достъп
-до администраторското меню в DokuWiki за инсталиране на плъгини, контрол
-на потребители, управление да достъп до уики страници и промяна на настройките
-Това не е необходимо на DokuWiki да работи, но ще направи DokuWiki по-лесно за
-администриране.</p>
+<p>Инсталаторът ще настрои вашата DokuWiki конфигурация на
+<acronym title="списъка за достъп">ACL</acronym>, което ще позволи на администратора да се впише и ползва администраторското меню в DokuWiki за инсталиране на приставки, контрол на потребителите, управление на достъпа до страниците и промяна на останалите настройки. Това не е необходимо за функционирането на DokuWiki, но прави администрирането по-лесно.</p>
-<p>Опитните потребители или потребителите със специални изисквания
-към настройките може да използват тези връзки за детайли свързани с
-<a href="http://dokuwiki.org/install">инструкции за инсталация</a>
-и <a href="http://dokuwiki.org/config">настройка</a>.</p>
+<p>Опитните потребители и потребителите със специални изисквания към настройките имат на разположение допълнителна информация относно <a href="http://dokuwiki.org/install">инсталирането</a>
+и <a href="http://dokuwiki.org/config">настройването</a>.</p>
diff --git a/inc/lang/bg/lang.php b/inc/lang/bg/lang.php
index 053a7f1ba..3f8460286 100644
--- a/inc/lang/bg/lang.php
+++ b/inc/lang/bg/lang.php
@@ -5,6 +5,7 @@
* @license GPL 2 (http://www.gnu.org/licenses/gpl.html)
* @author Nikolay Vladimirov <nikolay@vladimiroff.com>
* @author Viktor Usunov <usun0v@mail.bg>
+ * @author Kiril <neohidra@gmail.com>
*/
$lang['encoding'] = 'utf-8';
$lang['direction'] = 'ltr';
@@ -14,8 +15,8 @@ $lang['singlequoteopening'] = '‘';
$lang['singlequoteclosing'] = '’';
$lang['apostrophe'] = '’';
$lang['btn_edit'] = 'Редактиране';
-$lang['btn_source'] = 'Показване на кода на страницата';
-$lang['btn_show'] = 'Показване на страница';
+$lang['btn_source'] = 'Преглед на кода';
+$lang['btn_show'] = 'Преглед на страницата';
$lang['btn_create'] = 'Създаване на страница';
$lang['btn_search'] = 'Търсене';
$lang['btn_save'] = 'Запис';
@@ -24,224 +25,260 @@ $lang['btn_top'] = 'Към началото';
$lang['btn_newer'] = '<< по-нови';
$lang['btn_older'] = 'по-стари >>';
$lang['btn_revs'] = 'История';
-$lang['btn_recent'] = 'Последни промени';
+$lang['btn_recent'] = 'Скорошни промени';
$lang['btn_upload'] = 'Качване';
$lang['btn_cancel'] = 'Отказ';
$lang['btn_index'] = 'Индекс';
$lang['btn_secedit'] = 'Редактиране';
-$lang['btn_login'] = 'Вход';
-$lang['btn_logout'] = 'Изход';
+$lang['btn_login'] = 'Вписване';
+$lang['btn_logout'] = 'Отписване';
$lang['btn_admin'] = 'Настройки';
-$lang['btn_update'] = 'Обновяване';
+$lang['btn_update'] = 'Актуализиране';
$lang['btn_delete'] = 'Изтриване';
$lang['btn_back'] = 'Назад';
-$lang['btn_backlink'] = 'Обратни връзки';
-$lang['btn_backtomedia'] = 'Назад към избор на медиен файл';
-$lang['btn_subscribe'] = 'Абониране за Промени';
-$lang['btn_unsubscribe'] = 'Отписване от Промени';
-$lang['btn_subscribens'] = 'Абониране за Промени на именно пространство';
-$lang['btn_unsubscribens'] = 'Отписване от Промени на именно пространство';
-$lang['btn_profile'] = 'Актуализирай Профила';
+$lang['btn_backlink'] = 'Обратни препратки';
+$lang['btn_backtomedia'] = 'Назад към избора на медиен файл';
+$lang['btn_subscribe'] = 'Абонаменти';
+$lang['btn_profile'] = 'Профил';
$lang['btn_reset'] = 'Изчистване';
$lang['btn_resendpwd'] = 'Пращане на нова парола';
$lang['btn_draft'] = 'Редактиране на чернова';
$lang['btn_recover'] = 'Възстановяване на чернова';
$lang['btn_draftdel'] = 'Изтриване на чернова';
$lang['btn_revert'] = 'Възстановяване';
-$lang['loggedinas'] = 'Влезли сте като';
+$lang['btn_register'] = 'Регистриране';
+$lang['loggedinas'] = 'Вписани сте като';
$lang['user'] = 'Потребител';
$lang['pass'] = 'Парола';
$lang['newpass'] = 'Нова парола';
$lang['oldpass'] = 'Потвърждение на текуща парола';
-$lang['passchk'] = 'oтново';
+$lang['passchk'] = 'още веднъж';
$lang['remember'] = 'Запомни ме';
-$lang['fullname'] = 'Пълно име';
+$lang['fullname'] = 'Истинско име';
$lang['email'] = 'Електронна поща';
-$lang['register'] = 'Регистрация';
$lang['profile'] = 'Потребителски профил';
-$lang['badlogin'] = 'Потребителското име или паролата са грешни';
+$lang['badlogin'] = 'Грешно потребителско име или парола.';
$lang['minoredit'] = 'Незначителни промени';
-$lang['draftdate'] = 'Черновата бе автоматично записана на';
+$lang['draftdate'] = 'Черновата е автоматично записана на';
$lang['nosecedit'] = 'Страницата бе междувременно променена, презареждане на страницата поради неактуална информация.';
$lang['regmissing'] = 'Моля, попълнете всички полета.';
-$lang['reguexists'] = 'Потребител с такова име вече съществува.';
-$lang['regsuccess'] = 'Потребителят бе създаден и паролата бе пратена на електронната поща.';
-$lang['regsuccess2'] = 'Потребителят бе създаден.';
-$lang['regmailfail'] = 'Изглежда, че има проблем с пращането на писмото с паролата. Моля, свържете се с администратора.';
+$lang['reguexists'] = 'Вече съществува потребител с избраното име.';
+$lang['regsuccess'] = 'Потребителят е създаден, а паролата е пратена по електронната поща.';
+$lang['regsuccess2'] = 'Потребителят е създаден.';
+$lang['regmailfail'] = 'Изглежда, че има проблем с пращането на писмото с паролата. Моля, свържете се с администратора!';
$lang['regbadmail'] = 'Въведеният адрес изглежда невалиден - ако мислите, че това е грешка, свържете се с администратора.';
-$lang['regbadpass'] = 'Двете въведени пароли не съвпадат, моля опитайте отново';
-$lang['regpwmail'] = 'Парола за DokuWiki';
-$lang['reghere'] = 'Нямате профил все още? Направете си!';
-$lang['profna'] = 'Това Wiki не поддържа промяна на профила';
+$lang['regbadpass'] = 'Двете въведени пароли не съвпадат, моля опитайте отново.';
+$lang['regpwmail'] = 'Паролата ви за DokuWiki';
+$lang['reghere'] = 'Все още нямате профил? Направете си';
+$lang['profna'] = 'Wiki-то не поддържа промяна на профила';
$lang['profnochange'] = 'Няма промени.';
-$lang['profnoempty'] = 'Невъведено име или електронна поща не са позволени.';
-$lang['profchanged'] = 'Потребителският профил бе успешно обновен.';
-$lang['pwdforget'] = 'Забравили сте си паролата? Въведете нова.';
-$lang['resendna'] = 'Това Wiki не поддържа повторно пращане на парола';
+$lang['profnoempty'] = 'Въвеждането на име и ел. поща е задължително';
+$lang['profchanged'] = 'Потребителският профил е обновен успешно.';
+$lang['pwdforget'] = 'Забравили сте паролата си? Получете нова';
+$lang['resendna'] = 'Wiki-то не поддържа повторно пращане на паролата.';
$lang['resendpwd'] = 'Изпращане на нова парола за';
$lang['resendpwdmissing'] = 'Моля, попълнете всички полета.';
-$lang['resendpwdnouser'] = 'Потребителят не бе намерен в базата данни.';
-$lang['resendpwdbadauth'] = 'Този код за потвърждение е невалиден. Проверете дали сте използвали целият линк за потвърждение.';
-$lang['resendpwdconfirm'] = 'Адресът за потвърждение бе пратен по електронната поща.';
-$lang['resendpwdsuccess'] = 'Паролата ви бе изпратена на електронната поща.';
-$lang['license'] = 'Освен ако не е посочено друго, съдържанието на това Wiki е лицензирано под следния лиценз:';
-$lang['licenseok'] = 'Имайте предвид, че чрез редактирането на тази страница, Вие се съгласявате съдържанието й да бъде лицензирано под следния лиценз:';
+$lang['resendpwdnouser'] = 'Потребителят не е намерен в базата от данни.';
+$lang['resendpwdbadauth'] = 'Кодът за потвърждение е невалиден. Проверете дали сте използвали целия линк за потвърждение.';
+$lang['resendpwdconfirm'] = 'Линк за потвърждение е пратен по електронната поща.';
+$lang['resendpwdsuccess'] = 'Новата ви паролата е пратена по електронната поща.';
+$lang['license'] = 'Ако не е посочено друго, съдържанието на Wiki-то е лицензирано под следния лиценз:';
+$lang['licenseok'] = 'Бележка: Редактирайки страницата, вие се съгласявате да лицензирате промените (които сте направили) под следния лиценз:';
$lang['searchmedia'] = 'Търсене на файл: ';
$lang['searchmedia_in'] = 'Търсене в %s';
-$lang['txt_upload'] = 'Изберете файл за качване ';
-$lang['txt_filename'] = 'Качване като (по избор)';
-$lang['txt_overwrt'] = 'Запис върху съществуващ файл';
-$lang['lockedby'] = 'В момента е заключено от';
-$lang['lockexpire'] = 'Затварянето изтича в';
-$lang['willexpire'] = 'Затварянето на страницата за редактиране изтича след минута.\nЗа да избегнете противоречия, използвайте бутона, за да рестартирате броячът за затваряне.';
-$lang['js']['notsavedyet'] = "Незапазените промени ще бъдат загубени.\nИскате ли да продължите?";
-$lang['rssfailed'] = 'Възникна грешка при вземането на този feed: ';
-$lang['nothingfound'] = 'Нищо не бе намерено.';
+$lang['txt_upload'] = 'Изберете файл за качване';
+$lang['txt_filename'] = 'Качи като (незадължително)';
+$lang['txt_overwrt'] = 'Презапиши съществуващите файлове';
+$lang['lockedby'] = 'В момента е заключена от';
+$lang['lockexpire'] = 'Ще бъде отключена на';
+$lang['willexpire'] = 'Страницата ще бъде отключена за редактиране след минута.\nЗа предотвратяване на конфликти, ползвайте бутона "Преглед", за рестартиране на брояча за заключване.';
+$lang['js']['notsavedyet'] = 'Незаписаните промени ще бъдат загубени. Желаете ли да продължите?';
+$lang['js']['searchmedia'] = 'Търсене на файлове';
+$lang['js']['keepopen'] = 'Без затваряне на прозореца след избор';
+$lang['js']['hidedetails'] = 'Без подробности';
+$lang['js']['mediatitle'] = 'Настройки на препратката';
+$lang['js']['mediadisplay'] = 'Тип на препратката';
+$lang['js']['mediaalign'] = 'Подреждане';
+$lang['js']['mediasize'] = 'Размер на изображението';
+$lang['js']['mediatarget'] = 'Препращане към';
+$lang['js']['mediaclose'] = 'Затваряне';
+$lang['js']['mediainsert'] = 'Вмъкване';
+$lang['js']['mediadisplayimg'] = 'Показвай изображението.';
+$lang['js']['mediadisplaylnk'] = 'Показвай само препратката.';
+$lang['js']['mediasmall'] = 'Малка версия';
+$lang['js']['mediamedium'] = 'Средна версия';
+$lang['js']['medialarge'] = 'Голяма версия';
+$lang['js']['mediaoriginal'] = 'Оригинална версия';
+$lang['js']['medialnk'] = 'Препратка към подробна страница';
+$lang['js']['mediadirect'] = 'Директна препратка към оригинала';
+$lang['js']['medianolnk'] = 'Без препратка';
+$lang['js']['medianolink'] = 'Без препратка към изображението';
+$lang['js']['medialeft'] = 'Подреди изображението отляво.';
+$lang['js']['mediaright'] = 'Подреди изображението отдясно.';
+$lang['js']['mediacenter'] = 'Подреди изображението по средата.';
+$lang['js']['medianoalign'] = 'Без подреждане.';
+$lang['js']['nosmblinks'] = 'Връзките към Windows shares работят само под Internet Explorer.
+Можете да копирате и поставите връзката.';
+$lang['js']['linkwiz'] = 'Помощник за препратки';
+$lang['js']['linkto'] = 'Препратка към: ';
+$lang['js']['del_confirm'] = 'Да бъдат ли изтрити избраните елементи?';
+$lang['js']['mu_btn'] = 'Качване на няколко файла наведнъж';
+$lang['rssfailed'] = 'Възникна грешка при получаването на емисията: ';
+$lang['nothingfound'] = 'Нищо не е открито.';
$lang['mediaselect'] = 'Медийни файлове';
$lang['fileupload'] = 'Качване на медийни файлове';
-$lang['uploadsucc'] = 'Качването бе успешно';
-$lang['uploadfail'] = 'Качването бе неуспешно. Може би поради грешни права?';
-$lang['uploadwrong'] = 'Качването бе отказано. Това файлово разширение е забранено!';
-$lang['uploadexist'] = 'Файлът вече съществува. Нищо не бе направено.';
-$lang['uploadbadcontent'] = 'Каченото съдържание на съответства на файлово разширение %s .';
-$lang['uploadspam'] = 'Качването бе блокирано от спам списъка.';
-$lang['uploadxss'] = 'Качването бе блокирано, заради възможно обидно съдържание.';
-$lang['uploadsize'] = 'Файльт за качване бе прекалено голям. (макс. %s)';
+$lang['uploadsucc'] = 'Качването е успешно';
+$lang['uploadfail'] = 'Качването се провали. Може би поради грешни права?';
+$lang['uploadwrong'] = 'Качването е отказано. Файлово разширение е забранено!';
+$lang['uploadexist'] = 'Файлът вече съществува. Нищо не е направено.';
+$lang['uploadbadcontent'] = 'Каченото съдържание не съответства на файлово разширение %s .';
+$lang['uploadspam'] = 'Качването е блокирано от SPAM списъка.';
+$lang['uploadxss'] = 'Качването е блокирано, поради възможно зловредно съдържание.';
+$lang['uploadsize'] = 'Файлът за качване е прекалено голям. (макс. %s)';
$lang['deletesucc'] = 'Файлът "%s" бе изтрит.';
-$lang['deletefail'] = '"%s" не бе изтрит, проверете правата';
+$lang['deletefail'] = '"%s" не може да бъде изтрит - проверете правата.';
$lang['mediainuse'] = 'Файлът "%s" не бе изтрит - все още се ползва.';
$lang['namespaces'] = 'Именни пространства';
-$lang['mediafiles'] = 'Достъпни файлове в';
-$lang['js']['searchmedia'] = 'Търси файлове';
-$lang['js']['keepopen'] = 'Задържане на прозореца отворен при избор';
-$lang['js']['hidedetails'] = 'Скрий детайлите';
-$lang['js']['nosmblinks'] = 'Връзките към Windows shares работят само под Internet Explorer.
-Можете да копирате и поставите връзката.';
-$lang['js']['linkwiz'] = 'Линк съветник';
-$lang['js']['linkto'] = 'Линк към: ';
-$lang['js']['del_confirm'] = 'Да бъдат ли изтрити избраните елементи?';
-$lang['js']['mu_btn'] = 'Качване на няколко файла наведнъж';
-$lang['mediausage'] = 'Използвайте следният синтакс, за да упоменете файла:';
+$lang['mediafiles'] = 'Налични файлове в';
+$lang['accessdenied'] = 'Нямате разрешение да преглеждате страницата.';
+$lang['mediausage'] = 'Ползвайте следния синтаксис, за да упоменете файла:';
$lang['mediaview'] = 'Преглед на оригиналния файл';
$lang['mediaroot'] = 'root';
-$lang['mediaupload'] = 'Качете файл в текущото именнопространство тук. За да създадете подименни пространства, добавете ги в началото на "Качи като" име на файл, разделени с двоеточие.';
-$lang['mediaextchange'] = 'Разширението на файла бе сменено от .%s на .%s!';
-$lang['reference'] = 'Референции за';
+$lang['mediaupload'] = 'Качете файл в текущото именно пространство. За създаване на подимено пространство, добавете име преди това на файла като ги разделите с двоеточие в полето "Качи като"';
+$lang['mediaextchange'] = 'Разширението на файла е сменено от .%s на .%s!';
+$lang['reference'] = 'Връзки за';
$lang['ref_inuse'] = 'Файлът не може да бъде изтрит, защото все още се ползва от следните страници:';
-$lang['ref_hidden'] = 'Някои препратки са към страници, които нямате права да четете';
+$lang['ref_hidden'] = 'Някои връзки са към страници, които нямате права да четете';
$lang['hits'] = 'Съвпадения';
$lang['quickhits'] = 'Съвпадащи имена на страници';
$lang['toc'] = 'Съдържание';
-$lang['current'] = 'текущо';
+$lang['current'] = 'текуща';
$lang['yours'] = 'Вашата версия';
$lang['diff'] = 'Преглед на разликите с текущата версия';
-$lang['diff2'] = 'Показване на разликите между избрани преработки';
+$lang['diff2'] = 'Показване на разликите между избрани версии';
+$lang['difflink'] = 'Препратка към сравнението на версиите';
+$lang['diff_type'] = 'Преглед на разликите:';
+$lang['diff_inline'] = 'Вграден';
+$lang['diff_side'] = 'Един до друг';
$lang['line'] = 'Ред';
$lang['breadcrumb'] = 'Следа';
$lang['youarehere'] = 'Намирате се в';
$lang['lastmod'] = 'Последна промяна';
$lang['by'] = 'от';
-$lang['deleted'] = 'изтриване';
-$lang['created'] = 'създаване';
+$lang['deleted'] = 'изтрита';
+$lang['created'] = 'създадена';
$lang['restored'] = 'възстановена предишна версия';
$lang['external_edit'] = 'външна редакция';
$lang['summary'] = 'Обобщение';
-$lang['noflash'] = '<a href="http://www.adobe.com/products/flashplayer/">Adobe Flash Plugin</a> е необходим за показване на съдържанието.';
+$lang['noflash'] = 'Необходим е <a href="http://www.adobe.com/products/flashplayer/">Adobe Flash Plugin</a> за изобразяване на съдържанието.';
$lang['download'] = 'Изтегляне на фрагмент';
-$lang['mail_newpage'] = 'добавена страница:';
-$lang['mail_changed'] = 'променена страница:';
-$lang['mail_new_user'] = 'нов потребител:';
+$lang['mail_newpage'] = 'добавена страница: ';
+$lang['mail_changed'] = 'променена страница: ';
+$lang['mail_subscribe_list'] = 'променени страници в именно пространство: ';
+$lang['mail_new_user'] = 'нов потребител: ';
$lang['mail_upload'] = 'качен файл: ';
$lang['qb_bold'] = 'Удебелен текст';
$lang['qb_italic'] = 'Курсив текст';
$lang['qb_underl'] = 'Подчертан текст';
$lang['qb_code'] = 'Код';
$lang['qb_strike'] = 'Зачеркнат текст';
-$lang['qb_h1'] = 'Заглавие ниво 1';
-$lang['qb_h2'] = 'Заглавие ниво 2';
-$lang['qb_h3'] = 'Заглавие ниво 3';
-$lang['qb_h4'] = 'Заглавие ниво 4';
-$lang['qb_h5'] = 'Заглавие ниво 5';
+$lang['qb_h1'] = 'Заглавие от 1 ниво';
+$lang['qb_h2'] = 'Заглавие от 2 ниво';
+$lang['qb_h3'] = 'Заглавие от 3 ниво';
+$lang['qb_h4'] = 'Заглавие от 4 ниво';
+$lang['qb_h5'] = 'Заглавие от 5 ниво';
$lang['qb_h'] = 'Заглавие';
-$lang['qb_hs'] = 'Избери заглавие';
-$lang['qb_hplus'] = 'Основно заглавие';
+$lang['qb_hs'] = 'Изберете заглавие';
+$lang['qb_hplus'] = 'Надзаглавие';
$lang['qb_hminus'] = 'Подзаглавие';
-$lang['qb_hequal'] = 'Заглавие на същото ниво';
+$lang['qb_hequal'] = 'Заглавие от същото ниво';
$lang['qb_link'] = 'Вътрешна препратка';
$lang['qb_extlink'] = 'Външна препратка';
$lang['qb_hr'] = 'Хоризонтална линия';
-$lang['qb_ol'] = 'Подреден списък';
-$lang['qb_ul'] = 'Неподреден списък';
+$lang['qb_ol'] = 'Номериран списък';
+$lang['qb_ul'] = 'Неномериран списък';
$lang['qb_media'] = 'Добавяне на изображения и други файлове';
$lang['qb_sig'] = 'Вмъкване на подпис';
$lang['qb_smileys'] = 'Усмивчици';
$lang['qb_chars'] = 'Специални знаци';
-$lang['upperns'] = 'Към свьрзано именно пространство';
-$lang['admin_register'] = 'Добабяне на нов потребител';
+$lang['upperns'] = 'към майчиното именно пространство';
+$lang['admin_register'] = 'Добавяне на нов потребител';
$lang['metaedit'] = 'Редактиране на метаданни';
-$lang['metasaveerr'] = 'Запазването на метаданните бе неуспешно';
-$lang['metasaveok'] = 'Метаданните бяха запазени';
+$lang['metasaveerr'] = 'Записването на метаданните се провали';
+$lang['metasaveok'] = 'Метаданните са запазени успешно';
$lang['img_backto'] = 'Назад към';
$lang['img_title'] = 'Заглавие';
$lang['img_caption'] = 'Надпис';
$lang['img_date'] = 'Дата';
-$lang['img_fname'] = 'Име на файл';
+$lang['img_fname'] = 'Име на файла';
$lang['img_fsize'] = 'Размер';
-$lang['img_artist'] = 'Заснет от';
+$lang['img_artist'] = 'Фотограф';
$lang['img_copyr'] = 'Авторско право';
$lang['img_format'] = 'Формат';
$lang['img_camera'] = 'Фотоапарат';
$lang['img_keywords'] = 'Ключови думи';
-$lang['subscribe_success'] = '%s бе добавен към абонамента за %s';
-$lang['subscribe_error'] = 'Имаше грешка при добавянето на абонамента на %s за %s';
-$lang['subscribe_noaddress'] = 'Няма адрес свързан с потребителя, не може да се абонирате';
-$lang['unsubscribe_success'] = 'Абонаментът %s бе премахнат от списъка за %s';
-$lang['unsubscribe_error'] = 'Имаше грешка при премахването на абонамента на %s от списъка %s';
-$lang['authmodfailed'] = 'Лоша настройка за удостоверяване на потребителя. Моля, уведомете администратора.';
-$lang['authtempfail'] = 'Удостоверяването на потребителите е временно недостъпно. Ако това продължи дълго, моля уведомете администратора.';
-$lang['i_chooselang'] = 'Избор на език';
+$lang['subscr_subscribe_success'] = '%s е добавен към списъка с абониралите се за %s';
+$lang['subscr_subscribe_error'] = 'Грешка при добавянето на %s към списъка с абониралите се за %s';
+$lang['subscr_subscribe_noaddress'] = 'Добавянето ви към списъка с абонати не е възможно поради липсата на свързан адрес (на ел. поща) с профила ви.';
+$lang['subscr_unsubscribe_success'] = '%s е премахнат от списъка с абониралите се за %s';
+$lang['subscr_unsubscribe_error'] = 'Грешка при премахването на %s от списъка с абониралите се за %s';
+$lang['subscr_already_subscribed'] = '%s е вече абониран за %s';
+$lang['subscr_not_subscribed'] = '%s не е абониран за %s';
+$lang['subscr_m_not_subscribed'] = 'Не сте абониран за текущата страницата или именно пространство.';
+$lang['subscr_m_new_header'] = 'Добави абонамент';
+$lang['subscr_m_current_header'] = 'Текущи абонаменти';
+$lang['subscr_m_unsubscribe'] = 'Прекратяване на абонамента';
+$lang['subscr_m_subscribe'] = 'Абониране';
+$lang['subscr_m_receive'] = 'Получаване';
+$lang['subscr_style_every'] = 'на ел. писмо при всяка промяна';
+$lang['subscr_style_digest'] = 'на ел. писмо с обобщение на промените във всяка страница (всеки %.2f дни)';
+$lang['subscr_style_list'] = 'на списък с променените страници от последното ел. писмо (всеки %.2f дни)';
+$lang['authmodfailed'] = 'Лоша настройки за удостоверяване. Моля, уведомете администратора на Wiki страницата.';
+$lang['authtempfail'] = 'Удостоверяването на потребители не е възможно за момента. Ако продължи дълго, моля уведомете администратора на Wiki страницата.';
+$lang['i_chooselang'] = 'Изберете вашия изик';
$lang['i_installer'] = 'Инсталатор на DokuWiki';
-$lang['i_wikiname'] = 'Име на Wiki';
-$lang['i_enableacl'] = 'Включване на списъци за достъп ACL (препоръчително)';
+$lang['i_wikiname'] = 'Име на Wiki-то';
+$lang['i_enableacl'] = 'Ползване на списък за достъп (ACL) [препоръчително]';
$lang['i_superuser'] = 'Супер потребител';
-$lang['i_problems'] = 'Инсталатора намери проблеми указани по-долу. Не може да продължите, докато не ги отстраните.';
-$lang['i_modified'] = 'Поради мерки за сигурност този скрипт ще работи само с нова и непроменена Dokuwiki инсталация. Трябва да разархивирате отново файловете от дръпнатия пакет или да се посъветвате с пълните <a href="http://dokuwiki.org/install">Инструкции за инсталация на Dokuwiki</a>.';
+$lang['i_problems'] = 'Открити са проблеми, които възпрепятстват инсталирането. Ще можете да продължите след като отстраните долуизброените проблеми.';
+$lang['i_modified'] = 'Поради мерки за сигурност инсталаторът работи само с нови и непроменени инсталационни файлове. Трябва да разархивирате отново файловете от сваления архив или да се посъветвате с <a href="http://dokuwiki.org/install">Инструкциите за инсталиране на Dokuwiki</a>.';
$lang['i_funcna'] = 'PHP функцията <code>%s</code> не е достъпна. Може би е забранена от доставчика на хостинг.';
-$lang['i_phpver'] = 'Вашата PHP версия <code>%s</code> е по-стара от необходимата <code>%s</code>. Обновете PHP инсталацията си.';
-$lang['i_permfail'] = '<code>%s</code> не е достъпна за писане от DokuWiki. Трябва да промените настройките за достъп до директорията!';
+$lang['i_phpver'] = 'Инсталираната версия <code>%s</code> на PHP е по-стара от необходимата <code>%s</code>. Актуализирайте PHP инсталацията.';
+$lang['i_permfail'] = '<code>%s</code> не е достъпна за писане от DokuWiki. Трябва да промените правата за достъп до директорията!';
$lang['i_confexists'] = '<code>%s</code> вече съществува';
-$lang['i_writeerr'] = '<code>%s</code> не можа да бъде създаден. Трябва да проверите правата на директорията/файла за достъп и да създадете файл ръчно.';
-$lang['i_badhash'] = 'неразпознат или променен dokuwiki.php (hash=<code>%s</code>)';
+$lang['i_writeerr'] = '<code>%s</code> не можа да бъде създаден. Трябва да проверите правата за достъп до директорията/файла и да създадете файла ръчно.';
+$lang['i_badhash'] = 'Файлът dokuwiki.php не може да бъде разпознат или е променен (hash=<code>%s</code>)';
$lang['i_badval'] = '<code>%s</code> - непозволена или празна стойност';
-$lang['i_success'] = 'Настройката приключи успешно. Може да създадете файлът install.php сега. Продължете към
- <a href="doku.php">Ново Ви DokuWiki</a>.';
-$lang['i_failure'] = 'Имаше грешки при записа на файловете с настройки. Може да трябва да ги редактирате ръчно. Ползвайте <a href="doku.php">Ново Ви DokuWiki</a>.';
-$lang['i_policy'] = 'Първоначална политика за достъп ACL';
-$lang['i_pol0'] = 'Отворено Wiki (четене, писане, качване от всички)';
-$lang['i_pol1'] = 'Публично Wiki (четене от всички, писане и качване от регистрирани потребители)';
-$lang['i_pol2'] = 'Затворено Wiki (четене, писане, качване само от регистрирани потребители)';
+$lang['i_success'] = 'Настройването приключи успешно. Вече можете да изтриете файла install.php. Продължете към <a href="doku.php">Вашето ново DokuWiki</a>.';
+$lang['i_failure'] = 'Възникнаха грешки при записването на файловете с настройки. Вероятно ще се наложи да ги поправите ръчно, за да можете да ползвате <a href="doku.php">Вашето ново DokuWiki</a>.';
+$lang['i_policy'] = 'Първоначална политика за достъп';
+$lang['i_pol0'] = 'Отворено Wiki (всеки може да чете, пише и качва)';
+$lang['i_pol1'] = 'Публично Wiki (всеки може да чете, само регистрирани пишат и качват)';
+$lang['i_pol2'] = 'Затворено Wiki (само регистрирани четат, пишат и качват)';
$lang['i_retry'] = 'Повторен опит';
-$lang['mu_intro'] = 'Тук можете да качите няколко файла наведнъж. Добавете ги към съответните полета и натиснете бутона за качване.
+$lang['i_license'] = 'Моля, изберете лиценз под който желаете да публикувате съдържанието:';
+$lang['mu_intro'] = 'От тук можете да качите няколко файла наведнъж. Натиснете бутона "Избиране", изберете файлове и натиснете "Качване".
';
-$lang['mu_gridname'] = 'Име на файл';
+$lang['mu_gridname'] = 'Име на файла';
$lang['mu_gridsize'] = 'Големина';
$lang['mu_gridstat'] = 'Състояние';
$lang['mu_namespace'] = 'Именно пространство';
-$lang['mu_browse'] = 'Избери';
+$lang['mu_browse'] = 'Избиране';
$lang['mu_toobig'] = 'прекалено голям';
$lang['mu_ready'] = 'готов за качване';
-$lang['mu_done'] = 'приключен';
-$lang['mu_fail'] = 'неуспешен';
-$lang['mu_authfail'] = 'сесията изтече';
+$lang['mu_done'] = 'качен';
+$lang['mu_fail'] = 'неуспешно качване';
+$lang['mu_authfail'] = 'приключила сесия';
$lang['mu_progress'] = '@PCT@% качен';
$lang['mu_filetypes'] = 'Позволени файлови разширения';
-$lang['mu_info'] = 'качени файлове';
+$lang['mu_info'] = 'качени файла.';
$lang['mu_lasterr'] = 'Последна грешка:';
-$lang['recent_global'] = 'В момента преглеждате промените в <b>%s</b> именно пространство. Може да прегледате и <a href="%s">промените на цялото Wiki</a>.';
+$lang['recent_global'] = 'В момента преглеждате промените в именно пространство <b>%s</b>. Може да прегледате и <a href="%s">промените в цялото Wiki</a>.';
$lang['years'] = 'преди %d години';
-$lang['months'] = 'преди %d месеци';
+$lang['months'] = 'преди %d месеца';
$lang['weeks'] = 'преди %d седмици';
$lang['days'] = 'преди %d дни';
$lang['hours'] = 'преди %d часа';
$lang['minutes'] = 'преди %d минути';
$lang['seconds'] = 'преди %d секунди';
+$lang['wordblock'] = 'Направените от вас промени не са съхранени, защото съдържат забранен текст (SPAM).';
diff --git a/inc/lang/bg/locked.txt b/inc/lang/bg/locked.txt
index 0eecc6729..7cdfba786 100644
--- a/inc/lang/bg/locked.txt
+++ b/inc/lang/bg/locked.txt
@@ -1,3 +1,3 @@
-====== Страницата е затворена ======
+====== Страницата е заключена ======
-В момента страницата е затворена за редакция от друг потребител. Трябва да изчаката докато този потребител приключи или затварянето изтече.
+В момента страницата е заключена за редактиране от друг потребител. Трябва да изчакате потребителя да приключи с редактирането на страницата или автоматичното отключване на страницата.
diff --git a/inc/lang/bg/login.txt b/inc/lang/bg/login.txt
index b525f08cf..e5061c3d3 100644
--- a/inc/lang/bg/login.txt
+++ b/inc/lang/bg/login.txt
@@ -1,3 +1,3 @@
-====== Вход ======
+====== Вписване ======
-В момента не сте влезли! Въведете данните си долу, за да го направите. Бисквитките (cookies) трябва да са включени.
+Не сте се вписали! Въведете данните си за удостоверяване отдолу, за да го направите. Бисквитките (cookies) трябва да са включени.
diff --git a/inc/lang/bg/mailtext.txt b/inc/lang/bg/mailtext.txt
index 8c18767e5..ad0024a8d 100644
--- a/inc/lang/bg/mailtext.txt
+++ b/inc/lang/bg/mailtext.txt
@@ -1,16 +1,16 @@
-Страница във DokuWiki бе добавена или променена. Ето детайлите:
+Страница във DokuWiki е добавена или променена. Ето детайлите:
-Дата : @DATE@
-Браузър : @BROWSER@
-IP-адрес : @IPADDRESS@
-Име на хост : @HOSTNAME@
+Дата : @DATE@
+Браузър : @BROWSER@
+IP адрес : @IPADDRESS@
+Име на хоста : @HOSTNAME@
Стара версия: @OLDPAGE@
-Нова версия : @NEWPAGE@
-Обобщение : @SUMMARY@
-Потребител : @USER@
+Нова версия: @NEWPAGE@
+Обобщение: @SUMMARY@
+Потребител : @USER@
@DIFF@
--
-Това писмо е генерирано от DokuWiki на адрес @DOKUWIKIURL@
+Писмото е генерирано от DokuWiki на адрес @DOKUWIKIURL@
diff --git a/inc/lang/bg/newpage.txt b/inc/lang/bg/newpage.txt
index fcc1c6257..22d3bb6d1 100644
--- a/inc/lang/bg/newpage.txt
+++ b/inc/lang/bg/newpage.txt
@@ -1,4 +1,4 @@
====== Несъществуваща тема ======
-Последвали сте връзка към тема, която все още не съществува. Ако правата Ви позволяват, може да я създадете като използвате бутона ''Създаване на страницата''
+Последвали сте препратка към тема, която не съществува. Ако правата ви позволяват, може да я създадете чрез бутона ''Създаване на страница''.
diff --git a/inc/lang/bg/norev.txt b/inc/lang/bg/norev.txt
index 0262aef60..fb7aeef89 100644
--- a/inc/lang/bg/norev.txt
+++ b/inc/lang/bg/norev.txt
@@ -1,4 +1,4 @@
====== Няма такава версия ======
-Избраната версия не съществува. Използвайте бутона ''Редакции'' за списък на стари версии на документа.
+Избраната версия не съществува. Натиснете бутона ''История'' за отваряне на списъка със стари версии на документа.
diff --git a/inc/lang/bg/password.txt b/inc/lang/bg/password.txt
index be2f10c61..7a70ef1d8 100644
--- a/inc/lang/bg/password.txt
+++ b/inc/lang/bg/password.txt
@@ -1,9 +1,9 @@
Здравейте @FULLNAME@!
-Ето Вашите потребителски данни за @TITLE@ на @DOKUWIKIURL@
+Вашите потребителски данни за @TITLE@ на @DOKUWIKIURL@
-Потребител: @LOGIN@
-Парола : @PASSWORD@
+Потребител : @LOGIN@
+Парола : @PASSWORD@
--
-Това писмо е генерирано от DokuWiki на адрес @DOKUWIKIURL@ \ No newline at end of file
+Писмото е генерирано от DokuWiki на адрес @DOKUWIKIURL@ \ No newline at end of file
diff --git a/inc/lang/bg/preview.txt b/inc/lang/bg/preview.txt
index 442f16de2..41fde7380 100644
--- a/inc/lang/bg/preview.txt
+++ b/inc/lang/bg/preview.txt
@@ -1,3 +1,3 @@
====== Преглед ======
-Ето как ще изглежда текста. Той обаче все още **не е запазен** !
+Ето как ще изглежда страницата. Текста все още **не е запазен**! \ No newline at end of file
diff --git a/inc/lang/bg/pwconfirm.txt b/inc/lang/bg/pwconfirm.txt
index 1cd64b151..802153fd4 100644
--- a/inc/lang/bg/pwconfirm.txt
+++ b/inc/lang/bg/pwconfirm.txt
@@ -1,14 +1,13 @@
Здравейте @FULLNAME@!
-Някой е поискал нова парола за потребителя @TITLE@
+Някой е поискал нова парола за потребител @TITLE@
на @DOKUWIKIURL@
-Ако не сте поискали нова парола, товава просто игнорирайте това писмо.
+Ако не сте поискали нова парола, тогава просто игнорирайте това писмо.
-За да потвърдите, че искането е наистина пратено от вас, моля използвайте
-следния адрес.
+За да потвърдите, че искането е наистина от вас, моля ползвайте следния линк:
@CONFIRM@
--
-Това писмо е генерирано от DokuWiki на адрес @DOKUWIKIURL@
+Писмото е генерирано от DokuWiki на адрес @DOKUWIKIURL@
diff --git a/inc/lang/bg/read.txt b/inc/lang/bg/read.txt
index 89e9a9d70..861d47fc5 100644
--- a/inc/lang/bg/read.txt
+++ b/inc/lang/bg/read.txt
@@ -1,2 +1,2 @@
-Тази страница е позволена само за четене. Може да разгледате кода, но не и да го променята. Обърнете се съм администратора си, ако мислите, че това е грешно.
+Страницата е само за четене. Може да разглеждате кода, но не и да го променяте. Обърнете се съм администратора, ако смятате, че това не е редно.
diff --git a/inc/lang/bg/recent.txt b/inc/lang/bg/recent.txt
index 262979e34..c92029054 100644
--- a/inc/lang/bg/recent.txt
+++ b/inc/lang/bg/recent.txt
@@ -1,4 +1,4 @@
-====== Последни промени ======
+====== Скорошни промени ======
Следните страници са били променени наскоро.
diff --git a/inc/lang/bg/register.txt b/inc/lang/bg/register.txt
index 74a07cd90..51fbb83fe 100644
--- a/inc/lang/bg/register.txt
+++ b/inc/lang/bg/register.txt
@@ -1,4 +1,4 @@
-====== Регистрирайте се като нов потребител ======
+====== Регистриране като нов потребител ======
-Моля, попълнете всичката информация долу, за да създадете нов профил в това уики. Бъдете сигурни, че подавате **валиден адрес на електронна поща** - ако не се пита за парола тук, нова ще бъде пратена на този адрес. Потребителското име трябва да бъде валидно [[doku>pagename|име на сраница]]
+Моля, попълнете всичките полета отдолу, за да бъде създаден нов профил. Уверете се, че въведеният **адрес на ел. поща е правилен**. Ако няма поле за парола, ще ви бъде изпратена такава на въведения адрес. Потребителското име трябва да бъде валидно [[doku>pagename|име на страница]].
diff --git a/inc/lang/bg/registermail.txt b/inc/lang/bg/registermail.txt
index 7839b0910..4b0828c7b 100644
--- a/inc/lang/bg/registermail.txt
+++ b/inc/lang/bg/registermail.txt
@@ -1,13 +1,13 @@
-Нов потребител беше регистриран. Ето детайлите:
+Регистриран е нов потребител. Ето детайлите:
Потребител : @NEWUSER@
-Пълно име : @NEWNAME@
-E-поща : @NEWEMAIL@
+Пълно име : @NEWNAME@
+E. поща : @NEWEMAIL@
-Дата : @DATE@
-Браузър : @BROWSER@
-IP-адрес : @IPADDRESS@
-Име на хоста: @HOSTNAME@
+Дата : @DATE@
+Браузър : @BROWSER@
+IP адрес : @IPADDRESS@
+Име на хоста : @HOSTNAME@
--
-Това писмо е генерирано от DokuWiki на адрес @DOKUWIKIURL@ \ No newline at end of file
+Писмото е генерирано от DokuWiki на адрес @DOKUWIKIURL@ \ No newline at end of file
diff --git a/inc/lang/bg/resendpwd.txt b/inc/lang/bg/resendpwd.txt
index 7b9b9a027..38e2d1fe4 100644
--- a/inc/lang/bg/resendpwd.txt
+++ b/inc/lang/bg/resendpwd.txt
@@ -1,3 +1,3 @@
====== Пращане на нова парола ======
-Моля, въведете потребителското си име във формуляра долу, за да поискате нова парола за вашият профил в това Wiki. Връзка за потвърждение ще ви бъде пратена на регистрираният в това Wiki адрес на електронна поща.
+Моля, въведете потребителското си име във формата по-долу, ако желаете да получите нова парола. По ел. поща ще получите линк, с който да потвърдите.
diff --git a/inc/lang/bg/revisions.txt b/inc/lang/bg/revisions.txt
index 295f5f6cc..0e14662b7 100644
--- a/inc/lang/bg/revisions.txt
+++ b/inc/lang/bg/revisions.txt
@@ -1,4 +1,4 @@
-====== Стари редакции ======
+====== Стари версии======
-Това са стари редакции на този документ. За да възстановите стара версия, изберете я долу, натиснете ''Редактиране'' и я запазете.
+Това са старите версии на документа. За да възстановите стара версия, изберете я долу, натиснете ''Редактиране'' и я запазете.
diff --git a/inc/lang/bg/searchpage.txt b/inc/lang/bg/searchpage.txt
index 03e019985..48d47515a 100644
--- a/inc/lang/bg/searchpage.txt
+++ b/inc/lang/bg/searchpage.txt
@@ -1,5 +1,5 @@
====== Търсене ======
-Може да намерите резултатите на търсенето долу. Ако не сте намерили каквото сте търсили, може да създадете или редактирате страница кръстена по вашета заявка за търсене със съответният бутон
+Резултата от търсенето ще намерите по-долу. Ако не намирате каквото сте търсили, може да създадете или редактирате страница, кръстена на вашата заявка, чрез съответния бутон.
===== Резултати =====
diff --git a/inc/lang/bg/showrev.txt b/inc/lang/bg/showrev.txt
index c0b1709fe..a3848f8bb 100644
--- a/inc/lang/bg/showrev.txt
+++ b/inc/lang/bg/showrev.txt
@@ -1,2 +1,2 @@
-**Това е стара редакция на документа**
+**Това е стара версия на документа!**
----
diff --git a/inc/lang/bg/stopwords.txt b/inc/lang/bg/stopwords.txt
index 369f4d789..03fd13758 100644
--- a/inc/lang/bg/stopwords.txt
+++ b/inc/lang/bg/stopwords.txt
@@ -1,7 +1,7 @@
-# Това е списък на думи за игнориране, с една дума на ред
+# Това е списък с думи за игнориране при индексиране, с една дума на ред
# Когато редактирате този файл, не забравяйте да използвате UNIX символ за нов ред
-# Не е нужно да включвате думи по-кратки от 3 символа - те са игнорирани така или иначе
-# Този списък се основава на думи намерени на http://www.ranks.nl/stopwords/
+# Не е нужно да включвате думи по-кратки от 3 символа - те биват игнорирани така или иначе
+# Списъкът се основава на думи от http://www.ranks.nl/stopwords/
about
are
and
diff --git a/inc/lang/bg/subscr_digest.txt b/inc/lang/bg/subscr_digest.txt
new file mode 100644
index 000000000..f0533daf4
--- /dev/null
+++ b/inc/lang/bg/subscr_digest.txt
@@ -0,0 +1,18 @@
+Здравейте!
+
+Страницата @PAGE@ в @TITLE@ wiki е променена.
+Промените са по-долу:
+
+--------------------------------------------------------
+@DIFF@
+--------------------------------------------------------
+
+Стара версия: @OLDPAGE@
+Нова версия: @NEWPAGE@
+
+Ако желаете да прекратите уведомяването за страницата трябва да се впишете на адрес @DOKUWIKIURL@, да посетите
+@SUBSCRIBE@
+и да прекратите абонамента за промени по страницата или именното пространство.
+
+--
+Писмото е генерирано от DokuWiki на адрес @DOKUWIKIURL@ \ No newline at end of file
diff --git a/inc/lang/bg/subscr_form.txt b/inc/lang/bg/subscr_form.txt
new file mode 100644
index 000000000..e32a5ec26
--- /dev/null
+++ b/inc/lang/bg/subscr_form.txt
@@ -0,0 +1,3 @@
+====== Диспечер на абонаменти ======
+
+Страницата ви позволява да управлявате текущите си абонаменти за страници и именни пространства. \ No newline at end of file
diff --git a/inc/lang/bg/subscr_list.txt b/inc/lang/bg/subscr_list.txt
new file mode 100644
index 000000000..e9e65bc39
--- /dev/null
+++ b/inc/lang/bg/subscr_list.txt
@@ -0,0 +1,15 @@
+Здравейте!
+
+Променени са страници от именното пространство @PAGE@ от @TITLE@ wiki.
+Ето променените страници:
+
+--------------------------------------------------------
+@DIFF@
+--------------------------------------------------------
+
+Ако желаете да прекратите уведомяването за страницата трябва да се впишете на адрес @DOKUWIKIURL@, да посетите
+@SUBSCRIBE@
+и да прекратите абонамента за промени по страницата или именното пространство.
+
+--
+Писмото е генерирано от DokuWiki на адрес @DOKUWIKIURL@ \ No newline at end of file
diff --git a/inc/lang/bg/subscr_single.txt b/inc/lang/bg/subscr_single.txt
new file mode 100644
index 000000000..7b26f8e96
--- /dev/null
+++ b/inc/lang/bg/subscr_single.txt
@@ -0,0 +1,22 @@
+Здравейте!
+
+Страницата @PAGE@ в @TITLE@ wiki е променена.
+Промените са по-долу:
+
+--------------------------------------------------------
+@DIFF@
+--------------------------------------------------------
+
+Дата : @DATE@
+Потребител : @USER@
+Обобщение: @SUMMARY@
+Стара версия: @OLDPAGE@
+Нова версия: @NEWPAGE@
+
+Ако желаете да прекратите уведомяването за страницата трябва да се впишете на адрес @DOKUWIKIURL@, да посетите
+@NEWPAGE@
+и да прекратите абонамента за промени по страницата или именното пространство.
+
+--
+Писмото е генерирано от DokuWiki на адрес
+@DOKUWIKIURL@ \ No newline at end of file
diff --git a/inc/lang/bg/updateprofile.txt b/inc/lang/bg/updateprofile.txt
index 0a6f15297..6113f0d07 100644
--- a/inc/lang/bg/updateprofile.txt
+++ b/inc/lang/bg/updateprofile.txt
@@ -1,3 +1,3 @@
====== Обновете профила си ======
-Трябва само да допълните полетата, които искате да промените. Не може да сменяте потребителското си име.
+Трябва само да допълните полетата, които искате да промените. Потребителското не може да бъде променяно.
diff --git a/inc/lang/bg/uploadmail.txt b/inc/lang/bg/uploadmail.txt
index 74f0cdc3e..ebd8d9112 100644
--- a/inc/lang/bg/uploadmail.txt
+++ b/inc/lang/bg/uploadmail.txt
@@ -1,13 +1,13 @@
-Бе качен файл на вашето DokuWiki. Ето детайлите
+Качен е файл на вашето DokuWiki. Ето детайлите
-Файл : @MEDIA@
-Дата : @DATE@
-Браузeр : @BROWSER@
-IP-Адрес : @IPADDRESS@
-Име на хост : @HOSTNAME@
-Размер : @SIZE@
-MIME Тип : @MIME@
-Потребител : @USER@
+Файл : @MEDIA@
+Дата : @DATE@
+Браузър : @BROWSER@
+IP адрес : @IPADDRESS@
+Име на хоста : @HOSTNAME@
+Размер : @SIZE@
+MIME тип : @MIME@
+Потребител : @USER@
--
-Tова писмо е генерирано от DokuWiki на адрес @DOKUWIKIURL@ \ No newline at end of file
+Писмото е генерирано от DokuWiki на адрес @DOKUWIKIURL@ \ No newline at end of file
diff --git a/inc/lang/ca-valencia/lang.php b/inc/lang/ca-valencia/lang.php
index d49c900fa..c6a7dc27e 100644
--- a/inc/lang/ca-valencia/lang.php
+++ b/inc/lang/ca-valencia/lang.php
@@ -4,7 +4,6 @@
*
* @license GPL 2 (http://www.gnu.org/licenses/gpl.html)
* @author Bernat Arlandis i Mañó <berarma@ya.com>
- * @author Bernat Arlandis <berarma@ya.com>
* @author Bernat Arlandis <berarma@llenguaitecnologia.com>
*/
$lang['encoding'] = 'utf-8';
@@ -49,6 +48,7 @@ $lang['btn_draft'] = 'Editar borrador';
$lang['btn_recover'] = 'Recuperar borrador';
$lang['btn_draftdel'] = 'Borrar borrador';
$lang['btn_revert'] = 'Recuperar';
+$lang['btn_register'] = 'Registrar-se';
$lang['loggedinas'] = 'Sessió de';
$lang['user'] = 'Nom d\'usuari';
$lang['pass'] = 'Contrasenya';
@@ -58,7 +58,6 @@ $lang['passchk'] = 'una atra volta';
$lang['remember'] = 'Recorda\'m';
$lang['fullname'] = 'Nom complet';
$lang['email'] = 'Correu electrònic';
-$lang['register'] = 'Registrar-se';
$lang['profile'] = 'Perfil d\'usuari';
$lang['badlogin'] = 'Disculpe, pero el nom d\'usuari o la contrasenya són incorrectes.';
$lang['minoredit'] = 'Canvis menors';
diff --git a/inc/lang/ca/lang.php b/inc/lang/ca/lang.php
index 19fb7c556..342257d11 100644
--- a/inc/lang/ca/lang.php
+++ b/inc/lang/ca/lang.php
@@ -5,8 +5,6 @@
* @license GPL 2 (http://www.gnu.org/licenses/gpl.html)
* @author Carles Bellver <carles.bellver@cent.uji.es>
* @author Carles Bellver <carles.bellver@gmail.com>
- * @author carles.bellver@gmail.com
- * @author carles.bellver@cent.uji.es
*/
$lang['encoding'] = 'utf-8';
$lang['direction'] = 'ltr';
@@ -50,6 +48,7 @@ $lang['btn_draft'] = 'Edita esborrany';
$lang['btn_recover'] = 'Recupera esborrany';
$lang['btn_draftdel'] = 'Suprimeix esborrany';
$lang['btn_revert'] = 'Restaura';
+$lang['btn_register'] = 'Registra\'m';
$lang['loggedinas'] = 'Heu entrat com';
$lang['user'] = 'Nom d\'usuari';
$lang['pass'] = 'Contrasenya';
@@ -59,7 +58,6 @@ $lang['passchk'] = 'una altra vegada';
$lang['remember'] = 'Recorda\'m';
$lang['fullname'] = 'Nom complet';
$lang['email'] = 'Correu electrònic';
-$lang['register'] = 'Registra\'m';
$lang['profile'] = 'Perfil d\'usuari';
$lang['badlogin'] = 'Nom d\'usuari o contrasenya incorrectes.';
$lang['minoredit'] = 'Canvis menors';
diff --git a/inc/lang/cs/lang.php b/inc/lang/cs/lang.php
index 749a41a5b..e1c45e0c9 100644
--- a/inc/lang/cs/lang.php
+++ b/inc/lang/cs/lang.php
@@ -5,10 +5,11 @@
* @license GPL 2 (http://www.gnu.org/licenses/gpl.html)
* @author Bohumir Zamecnik <bohumir@zamecnik.org>
* @author Tomas Valenta <t.valenta@sh.cvut.cz>
+ * @author Tomas Valenta <tomas@valenta.cz>
* @author Zbynek Krivka <zbynek.krivka@seznam.cz>
- * @author tomas@valenta.cz
* @author Marek Sacha <sachamar@fel.cvut.cz>
* @author Lefty <lefty@multihost.cz>
+ * @author Vojta Beran <xmamut@email.cz>
*/
$lang['encoding'] = 'utf-8';
$lang['direction'] = 'ltr';
@@ -49,6 +50,7 @@ $lang['btn_draft'] = 'Upravit koncept';
$lang['btn_recover'] = 'Obnovit koncept';
$lang['btn_draftdel'] = 'Vymazat koncept';
$lang['btn_revert'] = 'Vrátit zpět';
+$lang['btn_register'] = 'Registrovat';
$lang['loggedinas'] = 'Přihlášen(a) jako';
$lang['user'] = 'Uživatelské jméno';
$lang['pass'] = 'Heslo';
@@ -58,7 +60,6 @@ $lang['passchk'] = 'ještě jednou';
$lang['remember'] = 'Přihlásit se nastálo';
$lang['fullname'] = 'Celé jméno';
$lang['email'] = 'E-mail';
-$lang['register'] = 'Registrovat';
$lang['profile'] = 'Uživatelský profil';
$lang['badlogin'] = 'Zadané uživatelské jméno a heslo není správně.';
$lang['minoredit'] = 'Drobné změny';
@@ -158,9 +159,12 @@ $lang['quickhits'] = 'Odpovídající stránky';
$lang['toc'] = 'Obsah';
$lang['current'] = 'aktuální';
$lang['yours'] = 'Vaše verze';
-$lang['diff'] = 'zobrazit rozdíly vůči aktuální verzi';
-$lang['diff2'] = 'zobrazit rozdíly mezi vybranými verzemi';
+$lang['diff'] = 'Zobrazit rozdíly vůči aktuální verzi';
+$lang['diff2'] = 'Zobrazit rozdíly mezi vybranými verzemi';
$lang['difflink'] = 'Odkaz na výstup diff';
+$lang['diff_type'] = 'Prohlédnout rozdíly:';
+$lang['diff_inline'] = 'Vložené';
+$lang['diff_side'] = 'Přidané';
$lang['line'] = 'Řádek';
$lang['breadcrumb'] = 'Historie';
$lang['youarehere'] = 'Umístění';
diff --git a/inc/lang/da/lang.php b/inc/lang/da/lang.php
index 47b42be9d..80d55d6f5 100644
--- a/inc/lang/da/lang.php
+++ b/inc/lang/da/lang.php
@@ -53,6 +53,7 @@ $lang['btn_draft'] = 'Redigér kladde';
$lang['btn_recover'] = 'Gendan kladde';
$lang['btn_draftdel'] = 'Slet kladde';
$lang['btn_revert'] = 'Reetablér';
+$lang['btn_register'] = 'Registrér';
$lang['loggedinas'] = 'Logget ind som';
$lang['user'] = 'Brugernavn';
$lang['pass'] = 'Adgangskode';
@@ -62,7 +63,6 @@ $lang['passchk'] = 'Gentag ny adgangskode';
$lang['remember'] = 'Automatisk log ind';
$lang['fullname'] = 'Fulde navn';
$lang['email'] = 'E-mail';
-$lang['register'] = 'Registrér';
$lang['profile'] = 'Brugerprofil';
$lang['badlogin'] = 'Brugernavn eller adgangskode var forkert.';
$lang['minoredit'] = 'Mindre ændringer';
diff --git a/inc/lang/de-informal/denied.txt b/inc/lang/de-informal/denied.txt
index 6d76891b1..0bc0e59a8 100644
--- a/inc/lang/de-informal/denied.txt
+++ b/inc/lang/de-informal/denied.txt
@@ -1,4 +1,4 @@
====== Zugang verweigert ======
-Du hast nicht die erforderlichen Rechte, um diese Aktion durchzuführen. Eventuell bist du nicht am Wiki angemeldet?
+Du hast nicht die erforderliche Berechtigung, um diese Aktion durchzuführen. Eventuell bist du nicht am Wiki angemeldet?
diff --git a/inc/lang/de-informal/lang.php b/inc/lang/de-informal/lang.php
index 948a1ee51..d39bf8152 100644
--- a/inc/lang/de-informal/lang.php
+++ b/inc/lang/de-informal/lang.php
@@ -17,6 +17,7 @@
* @author Juergen Schwarzer <jschwarzer@freenet.de>
* @author Marcel Metz <marcel_metz@gmx.de>
* @author Matthias Schulte <post@lupo49.de>
+ * @author Christian Wichmann <nospam@zone0.de>
*/
$lang['encoding'] = 'utf-8';
$lang['direction'] = 'ltr';
@@ -49,7 +50,7 @@ $lang['btn_delete'] = 'Löschen';
$lang['btn_back'] = 'Zurück';
$lang['btn_backlink'] = 'Links hierher';
$lang['btn_backtomedia'] = 'Zurück zur Dateiauswahl';
-$lang['btn_subscribe'] = 'Änderungen abonnieren';
+$lang['btn_subscribe'] = 'Aboverwaltung';
$lang['btn_profile'] = 'Benutzerprofil';
$lang['btn_reset'] = 'Zurücksetzen';
$lang['btn_resendpwd'] = 'Sende neues Passwort';
@@ -57,6 +58,7 @@ $lang['btn_draft'] = 'Entwurf bearbeiten';
$lang['btn_recover'] = 'Entwurf wiederherstellen';
$lang['btn_draftdel'] = 'Entwurf löschen';
$lang['btn_revert'] = 'Wiederherstellen';
+$lang['btn_register'] = 'Registrieren';
$lang['loggedinas'] = 'Angemeldet als';
$lang['user'] = 'Benutzername';
$lang['pass'] = 'Passwort';
@@ -66,7 +68,6 @@ $lang['passchk'] = 'und nochmal';
$lang['remember'] = 'Angemeldet bleiben';
$lang['fullname'] = 'Voller Name';
$lang['email'] = 'E-Mail';
-$lang['register'] = 'Registrieren';
$lang['profile'] = 'Benutzerprofil';
$lang['badlogin'] = 'Nutzername oder Passwort sind falsch.';
$lang['minoredit'] = 'kleine Änderung';
@@ -87,7 +88,7 @@ $lang['profnoempty'] = 'Es muss ein Name oder eine E-Mail Adresse ange
$lang['profchanged'] = 'Benutzerprofil erfolgreich geändert.';
$lang['pwdforget'] = 'Passwort vergessen? Fordere ein neues an';
$lang['resendna'] = 'Passwörter versenden ist in diesem Wiki nicht möglich.';
-$lang['resendpwd'] = 'Neues Passwort schicken für';
+$lang['resendpwd'] = 'Neues Passwort senden für';
$lang['resendpwdmissing'] = 'Es tut mir Leid, aber du musst alle Felder ausfüllen.';
$lang['resendpwdnouser'] = 'Es tut mir Leid, aber der Benutzer existiert nicht in unserer Datenbank.';
$lang['resendpwdbadauth'] = 'Es tut mir Leid, aber dieser Authentifizierungscode ist ungültig. Stelle sicher, dass du den kompletten Bestätigungslink verwendet haben.';
@@ -107,27 +108,27 @@ $lang['js']['notsavedyet'] = 'Nicht gespeicherte Änderungen gehen verloren!
$lang['js']['searchmedia'] = 'Suche nach Dateien';
$lang['js']['keepopen'] = 'Fenster nach Auswahl nicht schließen';
$lang['js']['hidedetails'] = 'Details ausblenden';
-$lang['js']['mediatitle'] = 'Link-Eigenschaften';
-$lang['js']['mediadisplay'] = 'Linktyp';
-$lang['js']['mediaalign'] = 'Ausrichtung';
-$lang['js']['mediasize'] = 'Bildgröße';
-$lang['js']['mediatarget'] = 'Linkziel';
-$lang['js']['mediaclose'] = 'Schließen';
-$lang['js']['mediainsert'] = 'Einfügen';
-$lang['js']['mediadisplayimg'] = 'Bild anzeigen.';
-$lang['js']['mediadisplaylnk'] = 'Nur den Link anzeigen.';
-$lang['js']['mediasmall'] = 'Kleine Version';
-$lang['js']['mediamedium'] = 'Mittelgroße Version';
-$lang['js']['medialarge'] = 'Große Version';
-$lang['js']['mediaoriginal'] = 'Original Version';
-$lang['js']['medialnk'] = 'Link zu der Detailseite';
-$lang['js']['mediadirect'] = 'Direkter Link zum Original';
-$lang['js']['medianolnk'] = 'Kein link';
-$lang['js']['medianolink'] = 'Keine Verlinkung des Bildes';
-$lang['js']['medialeft'] = 'Bild nach links ausrichten.';
-$lang['js']['mediaright'] = 'Bild nach rechts ausrichten.';
-$lang['js']['mediacenter'] = 'Bild in der Mitte ausrichten';
-$lang['js']['medianoalign'] = 'Keine Ausrichtung des Bildes.';
+$lang['js']['mediatitle'] = 'Link-Eigenschaften';
+$lang['js']['mediadisplay'] = 'Linktyp';
+$lang['js']['mediaalign'] = 'Ausrichtung';
+$lang['js']['mediasize'] = 'Bildgröße';
+$lang['js']['mediatarget'] = 'Linkziel';
+$lang['js']['mediaclose'] = 'Schließen';
+$lang['js']['mediainsert'] = 'Einfügen';
+$lang['js']['mediadisplayimg'] = 'Bild anzeigen.';
+$lang['js']['mediadisplaylnk'] = 'Nur den Link anzeigen.';
+$lang['js']['mediasmall'] = 'Kleine Version';
+$lang['js']['mediamedium'] = 'Mittelgroße Version';
+$lang['js']['medialarge'] = 'Große Version';
+$lang['js']['mediaoriginal'] = 'Original Version';
+$lang['js']['medialnk'] = 'Link zu der Detailseite';
+$lang['js']['mediadirect'] = 'Direkter Link zum Original';
+$lang['js']['medianolnk'] = 'Kein link';
+$lang['js']['medianolink'] = 'Keine Verlinkung des Bildes';
+$lang['js']['medialeft'] = 'Bild nach links ausrichten.';
+$lang['js']['mediaright'] = 'Bild nach rechts ausrichten.';
+$lang['js']['mediacenter'] = 'Bild in der Mitte ausrichten';
+$lang['js']['medianoalign'] = 'Keine Ausrichtung des Bildes.';
$lang['js']['nosmblinks'] = 'Das Verlinken von Windows-Freigaben funktioniert nur im Microsoft Internet-Explorer.\nDer Link kann jedoch durch Kopieren und Einfügen verwendet werden.';
$lang['js']['linkwiz'] = 'Link-Assistent';
$lang['js']['linkto'] = 'Link zu:';
@@ -148,7 +149,6 @@ $lang['uploadsize'] = 'Die hochgeladene Datei war zu groß. (max. %s)
$lang['deletesucc'] = 'Die Datei "%s" wurde gelöscht.';
$lang['deletefail'] = '"%s" konnte nicht gelöscht werden. Keine Berechtigung?.';
$lang['mediainuse'] = 'Die Datei "%s" wurde nicht gelöscht. Sie wird noch verwendet.';
-$lang['mediainuse'] = 'Die Datei "%s" wurde nicht gelöscht. Sie wird noch verwendet.';
$lang['namespaces'] = 'Namensräume';
$lang['mediafiles'] = 'Vorhandene Dateien in';
$lang['accessdenied'] = 'Du hast keinen Zugriff auf diese Seite';
@@ -168,6 +168,9 @@ $lang['yours'] = 'Deine Version';
$lang['diff'] = 'Zeige Unterschiede zu aktueller Version';
$lang['diff2'] = 'Zeige Unterschiede der ausgewählten Versionen';
$lang['difflink'] = 'Link zu der Versionshistorie';
+$lang['diff_type'] = 'Unterschiede anzeigen:';
+$lang['diff_inline'] = 'Inline';
+$lang['diff_side'] = 'Side by Side';
$lang['line'] = 'Zeile';
$lang['breadcrumb'] = 'Zuletzt angesehen';
$lang['youarehere'] = 'Du befindest dich hier';
@@ -225,22 +228,22 @@ $lang['img_copyr'] = 'Copyright';
$lang['img_format'] = 'Format';
$lang['img_camera'] = 'Kamera';
$lang['img_keywords'] = 'Schlagwörter';
-$lang['subscr_subscribe_success'] = 'Die Seite %s wurde zur Abonnementenliste von %s hinzugefügt';
-$lang['subscr_subscribe_error'] = 'Fehler beim Hinzufügen von %s zur Abonnementenliste von %s';
+$lang['subscr_subscribe_success'] = 'Die Seite %s wurde zur Abonnementenliste von %s hinzugefügt';
+$lang['subscr_subscribe_error'] = 'Fehler beim Hinzufügen von %s zur Abonnementenliste von %s';
$lang['subscr_subscribe_noaddress'] = 'In deinem Account ist keine E-Mail-Adresse hinterlegt. Dadurch kann die Seite nicht abonniert werden';
$lang['subscr_unsubscribe_success'] = 'Die Seite %s wurde von der Abonnementenliste von %s entfernt';
-$lang['subscr_unsubscribe_error'] = 'Fehler beim Entfernen von %s von der Abonnementenliste von %s';
-$lang['subscr_already_subscribed'] = '%s ist bereits auf der Abonnementenliste von %s';
-$lang['subscr_not_subscribed'] = '%s ist nicht auf der Abonnementenliste von %s';
-$lang['subscr_m_not_subscribed'] = 'Du hast kein Abonnement von dieser Seite oder dem Namensraum.';
-$lang['subscr_m_new_header'] = 'Abonnementen hinzufügen';
-$lang['subscr_m_current_header'] = 'Aktive Abonnements';
-$lang['subscr_m_unsubscribe'] = 'Abbestellen';
-$lang['subscr_m_subscribe'] = 'Abonnieren';
-$lang['subscr_m_receive'] = 'Erhalten';
-$lang['subscr_style_every'] = 'E-Mail bei jeder Änderung';
-$lang['subscr_style_digest'] = 'E-Mail mit zusammengefasster Übersicht der Seitenänderungen (alle %.2f Tage)';
-$lang['subscr_style_list'] = 'Auflistung aller geänderten Seiten seit der letzten E-Mail (alle %.2f Tage)';
+$lang['subscr_unsubscribe_error'] = 'Fehler beim Entfernen von %s von der Abonnementenliste von %s';
+$lang['subscr_already_subscribed'] = '%s ist bereits auf der Abonnementenliste von %s';
+$lang['subscr_not_subscribed'] = '%s ist nicht auf der Abonnementenliste von %s';
+$lang['subscr_m_not_subscribed'] = 'Du hast kein Abonnement von dieser Seite oder dem Namensraum.';
+$lang['subscr_m_new_header'] = 'Abonnementen hinzufügen';
+$lang['subscr_m_current_header'] = 'Aktive Abonnements';
+$lang['subscr_m_unsubscribe'] = 'Abbestellen';
+$lang['subscr_m_subscribe'] = 'Abonnieren';
+$lang['subscr_m_receive'] = 'Erhalten';
+$lang['subscr_style_every'] = 'E-Mail bei jeder Änderung';
+$lang['subscr_style_digest'] = 'E-Mail mit zusammengefasster Übersicht der Seitenänderungen (alle %.2f Tage)';
+$lang['subscr_style_list'] = 'Auflistung aller geänderten Seiten seit der letzten E-Mail (alle %.2f Tage)';
$lang['authmodfailed'] = 'Benutzerüberprüfung nicht möglich. Bitte wende dich an den Admin.';
$lang['authtempfail'] = 'Benutzerüberprüfung momentan nicht möglich. Falls das Problem andauert, wende dich an den Admin.';
$lang['i_chooselang'] = 'Wähle deine Sprache';
@@ -288,4 +291,4 @@ $lang['days'] = 'vor %d Tagen';
$lang['hours'] = 'vor %d Stunden';
$lang['minutes'] = 'vor %d Minuten';
$lang['seconds'] = 'vor %d Sekunden';
-$lang['wordblock'] = 'Deine Änderungen konnten nicht gespeichert werden, da Teile des Texts blockierte Wörter (Spam) enthalten.';
+$lang['wordblock'] = 'Deine Bearbeitung wurde nicht gespeichert, da sie gesperrten Text enthielt (Spam).';
diff --git a/inc/lang/de-informal/resendpwd.txt b/inc/lang/de-informal/resendpwd.txt
index 4dcd4bb4d..a0a714218 100644
--- a/inc/lang/de-informal/resendpwd.txt
+++ b/inc/lang/de-informal/resendpwd.txt
@@ -1,3 +1,3 @@
====== Neues Passwort anfordern ======
-Fülle alle Felder unten aus, um ein neues Passwort für deinen Zugang zu erhalten. Das neue Passwort wird an deine gespeicherte E-Mail-Adresse geschickt. Der Benutzername sollte dein Wiki-Benutzername sein.
+Fülle alle Felder unten aus, um ein neues Passwort für deinen Zugang zu erhalten. Das neue Passwort wird an deine gespeicherte E-Mail-Adresse geschickt. Der Benutzername muss deinem Wiki-Benutzernamen entsprechen.
diff --git a/inc/lang/de-informal/revisions.txt b/inc/lang/de-informal/revisions.txt
index e4a7be8f1..b69169a4e 100644
--- a/inc/lang/de-informal/revisions.txt
+++ b/inc/lang/de-informal/revisions.txt
@@ -1,4 +1,4 @@
====== Ältere Versionen ======
-Dies sind ältere Versionen des gewählten Dokuments. Um zu einer älteren Version zurückzukehren, wähle die entsprechende Version aus, klicke auf **''[Diese Seite bearbeiten]''** und speichere sie erneut ab.
+Dies sind ältere Versionen der gewählten Seite. Um zu einer älteren Version zurückzukehren, wähle die entsprechende Version aus, klicke auf **''[Diese Seite bearbeiten]''** und speichere sie erneut ab.
diff --git a/inc/lang/de-informal/subscr_digest.txt b/inc/lang/de-informal/subscr_digest.txt
index 9e943626c..f8cab210f 100644
--- a/inc/lang/de-informal/subscr_digest.txt
+++ b/inc/lang/de-informal/subscr_digest.txt
@@ -1,7 +1,7 @@
Hallo!
Die Seite @PAGE@ im @TITLE@ Wiki wurde bearbeitet.
-Das sind die nderungen:
+Üersicht der Änderungen:
--------------------------------------------------------
@DIFF@
@@ -10,10 +10,10 @@ Das sind die nderungen:
Alte Revision: @OLDPAGE@
Neue Revision: @NEWPAGE@
-Um das Abonnement fr diese Seite aufzulsen, melde dich im Wiki an
+Um das Abonnement für diese Seite aufzulösen, melde dich im Wiki an
@DOKUWIKIURL@, besuchen dann
@SUBSCRIBE@
-und klicke auf den Link 'nderungen abbestellen'.
+und klicke auf den Link 'Aboverwaltung'.
--
Diese Mail kommt vom DokuWiki auf
diff --git a/inc/lang/de-informal/subscr_single.txt b/inc/lang/de-informal/subscr_single.txt
index 3a295be76..3c557bc17 100644
--- a/inc/lang/de-informal/subscr_single.txt
+++ b/inc/lang/de-informal/subscr_single.txt
@@ -1,22 +1,22 @@
Hallo!
Die Seite @PAGE@ im @TITLE@ Wiki wurde bearbeitet.
-Das sind die Änderungen:
+Übersicht der Änderungen:
--------------------------------------------------------
@DIFF@
--------------------------------------------------------
-Datum : @DATE@
-Benutzer : @USER@
-Übersicht: @SUMMARY@
+Datum: @DATE@
+Benutzer: @USER@
+Zusammenfassung: @SUMMARY@
Alte Revision: @OLDPAGE@
Neue Revision: @NEWPAGE@
Um das Abonnement für diese Seite aufzulösen, melde dich im Wiki an
-@DOKUWIKIURL@, besuchen dann
+@DOKUWIKIURL@, besuche dann
@NEWPAGE@
-und klicke auf den Link 'Änderungen abbestellen'.
+und klicke auf den Link 'Aboverwaltung'.
--
Diese Mail kommt vom DokuWiki auf
diff --git a/inc/lang/de/denied.txt b/inc/lang/de/denied.txt
index b87965067..8efa81f1b 100644
--- a/inc/lang/de/denied.txt
+++ b/inc/lang/de/denied.txt
@@ -1,4 +1,4 @@
====== Zugang verweigert ======
-Sie haben nicht die erforderlichen Rechte, um diese Aktion durchzuführen. Eventuell sind Sie nicht beim Wiki angemeldet?
+Sie haben nicht die erforderliche Berechtigung, um diese Aktion durchzuführen. Eventuell sind Sie nicht am Wiki angemeldet?
diff --git a/inc/lang/de/lang.php b/inc/lang/de/lang.php
index ecc190c36..f9f250994 100644
--- a/inc/lang/de/lang.php
+++ b/inc/lang/de/lang.php
@@ -15,8 +15,9 @@
* @author Arne Pelka <mail@arnepelka.de>
* @author Dirk Einecke <dirk@dirkeinecke.de>
* @author Blitzi94@gmx.de
- * @author Robert Bogenschneider <robog@GMX.de>
* @author Robert Bogenschneider <robog@gmx.de>
+ * @author Niels Lange <niels@boldencursief.nl>
+ * @author Christian Wichmann <nospam@zone0.de>
*/
$lang['encoding'] = 'utf-8';
$lang['direction'] = 'ltr';
@@ -49,7 +50,7 @@ $lang['btn_delete'] = 'Löschen';
$lang['btn_back'] = 'Zurück';
$lang['btn_backlink'] = 'Links hierher';
$lang['btn_backtomedia'] = 'Zurück zur Dateiauswahl';
-$lang['btn_subscribe'] = 'Änderungen abonnieren';
+$lang['btn_subscribe'] = 'Aboverwaltung';
$lang['btn_profile'] = 'Benutzerprofil';
$lang['btn_reset'] = 'Zurücksetzen';
$lang['btn_resendpwd'] = 'Sende neues Passwort';
@@ -57,6 +58,7 @@ $lang['btn_draft'] = 'Entwurf bearbeiten';
$lang['btn_recover'] = 'Entwurf wiederherstellen';
$lang['btn_draftdel'] = 'Entwurf löschen';
$lang['btn_revert'] = 'Wiederherstellen';
+$lang['btn_register'] = 'Registrieren';
$lang['loggedinas'] = 'Angemeldet als';
$lang['user'] = 'Benutzername';
$lang['pass'] = 'Passwort';
@@ -66,7 +68,6 @@ $lang['passchk'] = 'und nochmal';
$lang['remember'] = 'Angemeldet bleiben';
$lang['fullname'] = 'Voller Name';
$lang['email'] = 'E-Mail';
-$lang['register'] = 'Registrieren';
$lang['profile'] = 'Benutzerprofil';
$lang['badlogin'] = 'Nutzername oder Passwort sind falsch.';
$lang['minoredit'] = 'kleine Änderung';
@@ -80,14 +81,14 @@ $lang['regmailfail'] = 'Offenbar ist ein Fehler beim Versenden der Pas
$lang['regbadmail'] = 'Die angegebene E-Mail-Adresse scheint ungültig zu sein. Falls dies ein Fehler ist, wenden Sie sich bitte an den Wiki-Admin.';
$lang['regbadpass'] = 'Die beiden eingegeben Passwörter stimmen nicht überein. Bitte versuchen Sie es noch einmal.';
$lang['regpwmail'] = 'Ihr DokuWiki Passwort';
-$lang['reghere'] = 'Sie haben noch keinen Zugang? Hier anmelden';
+$lang['reghere'] = 'Sie haben noch keinen Zugang? Hier registrieren';
$lang['profna'] = 'Änderung des Benutzerprofils in diesem Wiki nicht möglich.';
$lang['profnochange'] = 'Keine Änderungen, nichts zu tun.';
-$lang['profnoempty'] = 'Es muß ein Name und eine E-Mail-Adresse angegeben werden.';
+$lang['profnoempty'] = 'Es muss ein Name und eine E-Mail-Adresse angegeben werden.';
$lang['profchanged'] = 'Benutzerprofil erfolgreich geändert.';
$lang['pwdforget'] = 'Passwort vergessen? Fordere ein neues an';
$lang['resendna'] = 'Passwörter versenden ist in diesem Wiki nicht möglich.';
-$lang['resendpwd'] = 'Neues Passwort schicken für';
+$lang['resendpwd'] = 'Neues Passwort senden für';
$lang['resendpwdmissing'] = 'Es tut mir Leid, aber Sie müssen alle Felder ausfüllen.';
$lang['resendpwdnouser'] = 'Es tut mir Leid, aber der Benutzer existiert nicht in unserer Datenbank.';
$lang['resendpwdbadauth'] = 'Es tut mir Leid, aber dieser Authentifizierungscode ist ungültig. Stellen Sie sicher, dass Sie den kompletten Bestätigungslink verwendet haben.';
@@ -112,13 +113,13 @@ $lang['js']['mediadisplay'] = 'Linktyp';
$lang['js']['mediaalign'] = 'Anordnung';
$lang['js']['mediasize'] = 'Bildgröße';
$lang['js']['mediatarget'] = 'Linkziel';
-$lang['js']['mediaclose'] = 'Schliessen';
+$lang['js']['mediaclose'] = 'Schließen';
$lang['js']['mediainsert'] = 'Einfügen';
$lang['js']['mediadisplayimg'] = 'Bild anzeigen.';
$lang['js']['mediadisplaylnk'] = 'Nur den Link anzeigen.';
$lang['js']['mediasmall'] = 'Kleine Version';
$lang['js']['mediamedium'] = 'Mittlere Version';
-$lang['js']['medialarge'] = 'Grosse Version';
+$lang['js']['medialarge'] = 'Große Version';
$lang['js']['mediaoriginal'] = 'Originalversion';
$lang['js']['medialnk'] = 'Link zur Detailseite';
$lang['js']['mediadirect'] = 'Direktlink zum Original';
@@ -168,6 +169,9 @@ $lang['yours'] = 'Ihre Version';
$lang['diff'] = 'Zeige Unterschiede zu aktueller Version';
$lang['diff2'] = 'Zeige Unterschiede der ausgewählten Versionen';
$lang['difflink'] = 'Link zu dieser Vergleichsansicht';
+$lang['diff_type'] = 'Unterschiede anzeigen:';
+$lang['diff_inline'] = 'Inline';
+$lang['diff_side'] = 'Side by Side';
$lang['line'] = 'Zeile';
$lang['breadcrumb'] = 'Zuletzt angesehen';
$lang['youarehere'] = 'Sie befinden sich hier';
@@ -178,10 +182,10 @@ $lang['created'] = 'angelegt';
$lang['restored'] = 'alte Version wieder hergestellt';
$lang['external_edit'] = 'Externe Bearbeitung';
$lang['summary'] = 'Zusammenfassung';
-$lang['noflash'] = 'Das <a href="http://www.adobe.com/products/flashplayer/">Adobe Flash Plugin</a> wird benötigt, um diesen Ihnalt anzuzeigen.';
+$lang['noflash'] = 'Das <a href="http://www.adobe.com/products/flashplayer/">Adobe Flash Plugin</a> wird benötigt, um diesen Inhalt anzuzeigen.';
$lang['download'] = 'Schnipsel herunterladen';
$lang['mail_newpage'] = 'Neue Seite:';
-$lang['mail_changed'] = 'Seite geaendert:';
+$lang['mail_changed'] = 'Seite geändert:';
$lang['mail_subscribe_list'] = 'Geänderte Seiten im Namensraum:';
$lang['mail_new_user'] = 'Neuer Benutzer:';
$lang['mail_upload'] = 'Datei hochgeladen:';
@@ -238,7 +242,7 @@ $lang['subscr_m_current_header'] = 'Aktuelle Abonnements';
$lang['subscr_m_unsubscribe'] = 'Löschen';
$lang['subscr_m_subscribe'] = 'Abonnieren';
$lang['subscr_m_receive'] = 'Benachrichtigung';
-$lang['subscr_style_every'] = 'Email bei jeder Bearbeitung';
+$lang['subscr_style_every'] = 'E-Mail bei jeder Bearbeitung';
$lang['subscr_style_digest'] = 'Zusammenfassung der Änderungen für jede veränderte Seite (Alle %.2f Tage)';
$lang['subscr_style_list'] = 'Liste der geänderten Seiten (Alle %.2f Tage)';
$lang['authmodfailed'] = 'Benutzerüberprüfung nicht möglich. Bitte wenden Sie sich an den Systembetreuer.';
@@ -250,7 +254,7 @@ $lang['i_enableacl'] = 'Zugangskontrolle (ACL) aktivieren (empfohlen)'
$lang['i_superuser'] = 'Administrator Benutzername';
$lang['i_problems'] = 'Das Installationsprogramm hat unten aufgeführte Probleme festgestellt, die zunächst behoben werden müssen bevor Sie mit der Installation fortfahren können.';
$lang['i_modified'] = 'Aus Sicherheitsgründen arbeitet dieses Script nur mit einer neuen, unmodifizierten DokuWiki Installation. Sie sollten entweder alle Dateien noch einmal frisch installieren oder die <a href="http://dokuwiki.org/install">Dokuwiki-Installationsanleitung</a> konsultieren.';
-$lang['i_funcna'] = 'Die PHP Funktion <code>%s</code> ist nicht verfügbar. Unter Umständen wurde sie von Ihrem Hoster deaktiviert?';
+$lang['i_funcna'] = 'Die PHP-Funktion <code>%s</code> ist nicht verfügbar. Unter Umständen wurde sie von Ihrem Hoster deaktiviert?';
$lang['i_phpver'] = 'Ihre PHP-Version <code>%s</code> ist niedriger als die benötigte Version <code>%s</code>. Bitte aktualisieren Sie Ihre PHP-Installation.';
$lang['i_permfail'] = '<code>%s</code> ist nicht durch DokuWiki beschreibbar. Sie müssen die Berechtigungen dieses Ordners ändern!';
$lang['i_confexists'] = '<code>%s</code> existiert bereits';
@@ -272,7 +276,7 @@ $lang['mu_gridstat'] = 'Status';
$lang['mu_namespace'] = 'Namensraum';
$lang['mu_browse'] = 'Durchsuchen';
$lang['mu_toobig'] = 'zu groß';
-$lang['mu_ready'] = 'bereit zum hochladen';
+$lang['mu_ready'] = 'bereit zum Hochladen';
$lang['mu_done'] = 'fertig';
$lang['mu_fail'] = 'gescheitert';
$lang['mu_authfail'] = 'Sitzung abgelaufen';
@@ -288,4 +292,4 @@ $lang['days'] = 'vor %d Tagen';
$lang['hours'] = 'vor %d Stunden';
$lang['minutes'] = 'vor %d Minuten';
$lang['seconds'] = 'vor %d Sekunden';
-$lang['wordblock'] = 'Deine Bearbeitung wurde nicht gespeichert, da sie gesperrten Text enthielt (Spam).';
+$lang['wordblock'] = 'Ihre Bearbeitung wurde nicht gespeichert, da sie gesperrten Text enthielt (Spam).';
diff --git a/inc/lang/de/resendpwd.txt b/inc/lang/de/resendpwd.txt
index 2ff639369..a63fd5d55 100644
--- a/inc/lang/de/resendpwd.txt
+++ b/inc/lang/de/resendpwd.txt
@@ -1,3 +1,3 @@
====== Neues Passwort anfordern ======
-Füllen Sie alle Felder unten aus, um ein neues Passwort für Ihren Zugang zu erhalten. Das neue Passwort wird an Ihre gespeicherte E-Mail-Adresse geschickt. Der Benutzername sollte Ihr Wiki-Benutzername sein.
+Füllen Sie alle Felder unten aus, um ein neues Passwort für Ihren Zugang zu erhalten. Das neue Passwort wird an Ihre gespeicherte E-Mail-Adresse geschickt. Der Benutzername muss Ihrem Wiki-Benutzernamen entsprechen.
diff --git a/inc/lang/de/revisions.txt b/inc/lang/de/revisions.txt
index e1bafdd2d..843c3f9f4 100644
--- a/inc/lang/de/revisions.txt
+++ b/inc/lang/de/revisions.txt
@@ -1,4 +1,4 @@
====== Ältere Versionen ======
-Dies sind ältere Versionen des gewählten Dokuments. Um zu einer älteren Version zurückzukehren, wählen Sie die entsprechende Version aus, klicken auf **''[Diese Seite bearbeiten]''** und speichern Sie sie erneut ab.
+Dies sind ältere Versionen der gewählten Seite. Um zu einer älteren Version zurückzukehren, wählen Sie die entsprechende Version aus, klicken auf **''[Diese Seite bearbeiten]''** und speichern Sie diese erneut ab.
diff --git a/inc/lang/de/subscr_digest.txt b/inc/lang/de/subscr_digest.txt
index c8bf770ee..7cc79bba2 100644
--- a/inc/lang/de/subscr_digest.txt
+++ b/inc/lang/de/subscr_digest.txt
@@ -1,7 +1,7 @@
Hallo!
Die Seite @PAGE@ im @TITLE@ Wiki wurde bearbeitet.
-Das sind die Änderungen:
+Übersicht der Änderungen:
--------------------------------------------------------
@DIFF@
@@ -13,7 +13,7 @@ Neue Revision: @NEWPAGE@
Um das Abonnement für diese Seite aufzulösen, melden Sie sich im Wiki an
@DOKUWIKIURL@, besuchen dann
@SUBSCRIBE@
-und klicken auf den Link 'Änderungen abbestellen'.
+und klicken auf den Link 'Aboverwaltung'.
--
Diese Mail kommt vom DokuWiki auf
diff --git a/inc/lang/de/subscr_single.txt b/inc/lang/de/subscr_single.txt
index fb149e927..f3e1cd393 100644
--- a/inc/lang/de/subscr_single.txt
+++ b/inc/lang/de/subscr_single.txt
@@ -1,22 +1,22 @@
Hallo!
Die Seite @PAGE@ im @TITLE@ Wiki wurde bearbeitet.
-Das sind die Änderungen:
+Übersicht der Änderungen:
--------------------------------------------------------
@DIFF@
--------------------------------------------------------
-Datum : @DATE@
-Benutzer : @USER@
-Übersicht: @SUMMARY@
+Datum: @DATE@
+Benutzer: @USER@
+Zusammenfassung: @SUMMARY@
Alte Revision: @OLDPAGE@
Neue Revision: @NEWPAGE@
-Um das Abonnement für diese Seite aufzulösen, melde Sie sich im Wiki an
+Um das Abonnement für diese Seite aufzulösen, melden Sie sich im Wiki an
@DOKUWIKIURL@, besuchen dann
@NEWPAGE@
-und klicken auf die Taste 'Änderungen abbestellen'.
+und klicken auf die Taste 'Aboverwaltung'.
--
Diese Mail kommt vom DokuWiki auf
diff --git a/inc/lang/el/admin.txt b/inc/lang/el/admin.txt
index 49e6c657b..729004b05 100644
--- a/inc/lang/el/admin.txt
+++ b/inc/lang/el/admin.txt
@@ -1,3 +1,3 @@
====== Διαχείριση ======
-Παρακάτω μπορείτε να βρείτε μια λίστα με τις δυνατότητες διαχείρισης στο DokuWiki
+Παρακάτω μπορείτε να βρείτε μια λίστα με τις λειτουργίες διαχείρισης στο DokuWiki
diff --git a/inc/lang/el/adminplugins.txt b/inc/lang/el/adminplugins.txt
index ea00b959e..ef1a2853b 100644
--- a/inc/lang/el/adminplugins.txt
+++ b/inc/lang/el/adminplugins.txt
@@ -1 +1 @@
-===== Πρόσθετες συνδεόμενες υπομονάδες ===== \ No newline at end of file
+===== Πρόσθετα ===== \ No newline at end of file
diff --git a/inc/lang/el/conflict.txt b/inc/lang/el/conflict.txt
index 27b80b397..a2065c0f3 100644
--- a/inc/lang/el/conflict.txt
+++ b/inc/lang/el/conflict.txt
@@ -1,5 +1,8 @@
====== Υπάρχει μία νεώτερη έκδοση αυτής της σελίδας ======
-Υπάρχει μία νεώτερη έκδοση της σελίδας που τρoποποιήσατε. Αυτό συμβαίνει εάν κάποιος άλλος χρήστης τροποποίησε την ίδια σελίδα ενώ την τροποποιούσατε και εσείς.
+Υπάρχει μία νεώτερη έκδοση της σελίδας που τρoποποιήσατε.
+Αυτό συμβαίνει εάν κάποιος άλλος χρήστης τροποποίησε την ίδια σελίδα ενώ την επεξεργαζόσασταν και εσείς.
-Ελέγξτε προσεκτικά τις διαφορές που παρουσιάζονται παρακάτω και έπειτα αποφασίστε ποια έκδοση θα κρατήσετε. Εάν επιλέξετε ''Αποθήκευση'', η δική σας έκδοση θα αποθηκευτεί. Εάν επιλέξετε ''Ακύρωση'', η νεώτερη έκδοση θα διατηρηθεί ως τρέχουσα.
+Ελέγξτε προσεκτικά τις διαφορές που παρουσιάζονται παρακάτω και έπειτα αποφασίστε ποια έκδοση θα κρατήσετε.
+Εάν επιλέξετε ''Αποθήκευση'', η δική σας έκδοση θα αποθηκευτεί.
+Εάν επιλέξετε ''Ακύρωση'', η νεώτερη έκδοση θα διατηρηθεί ως τρέχουσα.
diff --git a/inc/lang/el/denied.txt b/inc/lang/el/denied.txt
index 71e9a04b8..36d7ae103 100644
--- a/inc/lang/el/denied.txt
+++ b/inc/lang/el/denied.txt
@@ -2,4 +2,4 @@
Συγγνώμη, αλλά δεν έχετε επαρκή δικαιώματα για την συγκεκριμένη ενέργεια.
-Μήπως παραλείψατε να συνδεθείτε?
+Μήπως παραλείψατε να συνδεθείτε;
diff --git a/inc/lang/el/draft.txt b/inc/lang/el/draft.txt
index 3bb15037f..5ca7b8dfa 100644
--- a/inc/lang/el/draft.txt
+++ b/inc/lang/el/draft.txt
@@ -1,6 +1,8 @@
====== Βρέθηκε μία αυτόματα αποθηκευμένη σελίδα ======
-Η τελευταία τροποποίηση αυτής της σελίδας δεν ολοκληρώθηκε επιτυχώς. Η εφαρμογή αποθήκευσε αυτόματα μία εκδοχή της σελίδας την ώρα που την τροποποιούσατε και μπορείτε να την χρησιμοποιήσετε για να συνεχίσετε την εργασία σας. Παρακάτω φαίνεται αυτή η πιο πρόσφατη αυτόματα αποθηκευμένη σελίδα.
+Η τελευταία τροποποίηση αυτής της σελίδας δεν ολοκληρώθηκε επιτυχώς.
+Η εφαρμογή αποθήκευσε αυτόματα μία εκδοχή της σελίδας την ώρα που την επεξεργαζόσασταν και μπορείτε να την χρησιμοποιήσετε για να συνεχίσετε την εργασία σας.
+Παρακάτω φαίνεται αυτή η πιο πρόσφατη αυτόματα αποθηκευμένη σελίδα.
Μπορείτε να //επαναφέρετε// αυτή την αυτόματα αποθηκευμένη σελίδα ως τρέχουσα, να την //διαγράψετε// ή να //ακυρώσετε// τη διαδικασία τροποποίησης της τρέχουσας σελίδας.
diff --git a/inc/lang/el/edit.txt b/inc/lang/el/edit.txt
index 26b52f97a..8d9559fcc 100644
--- a/inc/lang/el/edit.txt
+++ b/inc/lang/el/edit.txt
@@ -1 +1,3 @@
-Τροποποιήστε την σελίδα **μόνο** εάν μπορείτε να την **βελτιώσετε**. Για να κάνετε δοκιμές με ασφάλεια ή να εξοικειωθείτε με το περιβάλλον χρησιμοποιήστε το [[:playground:playground|playground]]. Αφού τροποποιήστε την σελίδα επιλέξτε ''Αποθήκευση''. Δείτε τις [[:wiki:syntax|οδηγίες]] για την σωστή σύνταξη.
+Τροποποιήστε την σελίδα **μόνο** εάν μπορείτε να την **βελτιώσετε**.
+Για να κάνετε δοκιμές με ασφάλεια ή να εξοικειωθείτε με το περιβάλλον χρησιμοποιήστε το [[:playground:playground|playground]].
+Αφού τροποποιήστε την σελίδα επιλέξτε ''Αποθήκευση''. Δείτε τις [[:wiki:syntax|οδηγίες]] για την σωστή σύνταξη.
diff --git a/inc/lang/el/index.txt b/inc/lang/el/index.txt
index 51f1fc600..e2da3a85e 100644
--- a/inc/lang/el/index.txt
+++ b/inc/lang/el/index.txt
@@ -1,3 +1,3 @@
====== Κατάλογος ======
-Αυτός είναι ένας κατάλογος όλων των διαθέσιμων σελίδων ταξινομημένων κατά [[doku>namespaces|φακέλους]].
+Εδώ βλέπετε τον κατάλογο όλων των διαθέσιμων σελίδων, ταξινομημένες κατά [[doku>namespaces|φακέλους]].
diff --git a/inc/lang/el/install.html b/inc/lang/el/install.html
index 89429d55b..9487de7c7 100644
--- a/inc/lang/el/install.html
+++ b/inc/lang/el/install.html
@@ -1,25 +1,26 @@
<p>Αυτή η σελίδα περιέχει πληροφορίες που βοηθούν στην αρχική εγκατάσταση και
-ρύθμιση της εφαρμογής <a href="http://dokuwiki.org">Dokuwiki</a>. Περισσότερες
-πληροφορίες υπάρχουν στη <a href="http://dokuwiki.org/installer">σελίδα τεκμηρίωσης</a>
-του οδηγού εγκατάστασης.</p>
+ρύθμιση της εφαρμογής <a href="http://www.dokuwiki.org/el:dokuwiki">Dokuwiki</a>.
+Περισσότερες πληροφορίες υπάρχουν στη <a href="http://www.dokuwiki.org/el:installer">
+σελίδα τεκμηρίωσης</a> του οδηγού εγκατάστασης.</p>
-<p>Η εφαρμογή DokuWiki χρησιμοποιεί απλά αρχεία για να αποθηκεύει τις σελίδες wiki
-καθώς και πληροφορίες που σχετίζονται με αυτές (π.χ. εικόνες, καταλόγους αναζήτησης,
-παλαιότερες εκδόσεις σελίδων, κλπ). Για να λειτουργεί σωστά η εφαρμογή DokuWiki
-<strong>πρέπει</strong> να έχει δικαιώματα εγγραφής στους φακέλους που φιλοξενούν
-αυτά τα αρχεία. Ο οδηγός εγκατάστασης δεν έχει την δυνατότητα να παραχωρήσει αυτά τα
-δικαιώματα εγγραφής στους σχετικούς φακέλους. Ο κανονικός τρόπος για να γίνει αυτό είναι
-είτε απευθείας σε περιβάλλον γραμμής εντολών ή, εάν δεν έχετε τέτοια πρόσβαση, μέσω FTP ή
-του πίνακα ελέγχου του περιβάλλοντος φιλοξενίας (π.χ. cPanel).</p>
+<p>Η εφαρμογή DokuWiki χρησιμοποιεί απλά αρχεία για να αποθηκεύει τις σελίδες
+wiki καθώς και πληροφορίες που σχετίζονται με αυτές (π.χ. εικόνες, καταλόγους
+αναζήτησης, παλαιότερες εκδόσεις σελίδων, κλπ). Για να λειτουργεί σωστά η εφαρμογή
+DokuWiki <strong>πρέπει</strong> να έχει δικαιώματα εγγραφής στους φακέλους που
+φιλοξενούν αυτά τα αρχεία. Ο οδηγός εγκατάστασης δεν έχει την δυνατότητα να
+παραχωρήσει αυτά τα δικαιώματα εγγραφής στους σχετικούς φακέλους. Ο κανονικός
+τρόπος για να γίνει αυτό είναι είτε απευθείας σε περιβάλλον γραμμής εντολών ή,
+εάν δεν έχετε τέτοια πρόσβαση, μέσω FTP ή του πίνακα ελέγχου του περιβάλλοντος
+φιλοξενίας (π.χ. cPanel).</p>
<p>Ο οδηγός εγκατάστασης θα ρυθμίσει την εφαρμογή DokuWiki ώστε να χρησιμοποιεί
-<acronym title="access control list">ACL</acronym>, με τρόπο ώστε ο διαχειριστής να
-έχει δυνατότητα εισόδου και πρόσβαση στο μενού διαχείρισης της εφαρμογής για εγκατάσταση
-επεκτάσεων, διαχείριση χρηστών, διαχείριση δικαιωμάτων πρόσβασης στις διάφορες σελίδες και
-αλλαγή των ρυθμίσεων. Αυτό δεν είναι απαραίτητο για να λειτουργήσει η εφαρμογή, αλλά
-κάνει την διαχείρισή της ευκολότερη.</p>
+<acronym title="access control list">ACL</acronym>, με τρόπο ώστε ο διαχειριστής
+να έχει δυνατότητα εισόδου και πρόσβαση στο μενού διαχείρισης της εφαρμογής για
+εγκατάσταση επεκτάσεων, διαχείριση χρηστών, διαχείριση δικαιωμάτων πρόσβασης στις
+διάφορες σελίδες και αλλαγή των ρυθμίσεων. Αυτό δεν είναι απαραίτητο για να
+λειτουργήσει η εφαρμογή, αλλά κάνει την διαχείρισή της ευκολότερη.</p>
<p>Οι έμπειροι χρήστες και οι χρήστες με ειδικές απαιτήσεις μπορούν να επισκεφθούν
-τις σελίδες που περιέχουν λεπτομερείς
-<a href="http://dokuwiki.org/install">οδηγίες εγκατάστασης</a>
-και <a href="http://dokuwiki.org/config">πληροφορίες για τις ρυθμίσεις</a>.</p>
+τις σελίδες που περιέχουν λεπτομερείς <a href="http://dokuwiki.org/install">
+οδηγίες εγκατάστασης</a> και <a href="http://dokuwiki.org/config">πληροφορίες
+για τις ρυθμίσεις</a>.</p> \ No newline at end of file
diff --git a/inc/lang/el/lang.php b/inc/lang/el/lang.php
index 83a869df0..11c64285e 100644
--- a/inc/lang/el/lang.php
+++ b/inc/lang/el/lang.php
@@ -15,7 +15,7 @@ $lang['doublequoteclosing'] = '”';
$lang['singlequoteopening'] = '‘';
$lang['singlequoteclosing'] = '’';
$lang['apostrophe'] = '’';
-$lang['btn_edit'] = 'Τροποποίηση σελίδας';
+$lang['btn_edit'] = 'Επεξεργασία σελίδας';
$lang['btn_source'] = 'Προβολή κώδικα σελίδας';
$lang['btn_show'] = 'Προβολή σελίδας';
$lang['btn_create'] = 'Δημιουργία σελίδας';
@@ -23,30 +23,31 @@ $lang['btn_search'] = 'Αναζήτηση';
$lang['btn_save'] = 'Αποθήκευση';
$lang['btn_preview'] = 'Προεπισκόπηση';
$lang['btn_top'] = 'Επιστροφή στην κορυφή της σελίδας';
-$lang['btn_newer'] = '<< πλέον πρόσφατες';
-$lang['btn_older'] = 'λιγότερο πρόσφατες >>';
+$lang['btn_newer'] = '<< πρόσφατες';
+$lang['btn_older'] = 'παλαιότερες >>';
$lang['btn_revs'] = 'Παλαιότερες εκδόσεις σελίδας';
-$lang['btn_recent'] = 'Πρόσφατες αλλαγές σελίδων';
+$lang['btn_recent'] = 'Πρόσφατες αλλαγές';
$lang['btn_upload'] = 'Φόρτωση';
$lang['btn_cancel'] = 'Ακύρωση';
$lang['btn_index'] = 'Κατάλογος';
-$lang['btn_secedit'] = 'Τροποποίηση';
-$lang['btn_login'] = 'Είσοδος χρήστη';
-$lang['btn_logout'] = 'Έξοδος χρήστη';
+$lang['btn_secedit'] = 'Επεξεργασία';
+$lang['btn_login'] = 'Σύνδεση χρήστη';
+$lang['btn_logout'] = 'Αποσύνδεση χρήστη';
$lang['btn_admin'] = 'Διαχείριση';
$lang['btn_update'] = 'Ενημέρωση';
$lang['btn_delete'] = 'Σβήσιμο';
$lang['btn_back'] = 'Πίσω';
-$lang['btn_backlink'] = 'Σύνδεσμοι προς την τρέχουσα σελίδα';
+$lang['btn_backlink'] = 'Σύνδεσμοι προς αυτή τη σελίδα';
$lang['btn_backtomedia'] = 'Επιστροφή στην επιλογή αρχείων';
$lang['btn_subscribe'] = 'Εγγραφή σε λήψη ενημερώσεων σελίδας';
-$lang['btn_profile'] = 'Τροποποίηση προφίλ';
+$lang['btn_profile'] = 'Επεξεργασία προφίλ';
$lang['btn_reset'] = 'Ακύρωση';
$lang['btn_resendpwd'] = 'Αποστολή νέου κωδικού';
-$lang['btn_draft'] = 'Τροποποίηση αυτόματα αποθηκευμένης σελίδας';
+$lang['btn_draft'] = 'Επεξεργασία αυτόματα αποθηκευμένης σελίδας';
$lang['btn_recover'] = 'Επαναφορά αυτόματα αποθηκευμένης σελίδας';
$lang['btn_draftdel'] = 'Διαγραφή αυτόματα αποθηκευμένης σελίδας';
$lang['btn_revert'] = 'Αποκατάσταση';
+$lang['btn_register'] = 'Εγγραφή';
$lang['loggedinas'] = 'Συνδεδεμένος ως';
$lang['user'] = 'Όνομα χρήστη';
$lang['pass'] = 'Κωδικός';
@@ -55,8 +56,7 @@ $lang['oldpass'] = 'Επιβεβαίωση τρέχοντος κω
$lang['passchk'] = 'ακόμη μια φορά';
$lang['remember'] = 'Απομνημόνευση στοιχείων λογαριασμού';
$lang['fullname'] = 'Ονοματεπώνυμο';
-$lang['email'] = 'E-Mail';
-$lang['register'] = 'Εγγραφή';
+$lang['email'] = 'e-mail';
$lang['profile'] = 'Προφίλ χρήστη';
$lang['badlogin'] = 'Συγνώμη, το όνομα χρήστη ή ο κωδικός ήταν λανθασμένο.';
$lang['minoredit'] = 'Ασήμαντες αλλαγές';
@@ -67,15 +67,15 @@ $lang['reguexists'] = 'Αυτός ο λογαριασμός υπάρ
$lang['regsuccess'] = 'Ο λογαριασμός δημιουργήθηκε και ο κωδικός εστάλει με e-mail.';
$lang['regsuccess2'] = 'Ο λογαριασμός δημιουργήθηκε.';
$lang['regmailfail'] = 'Φαίνεται να υπάρχει πρόβλημα με την αποστολή του κωδικού μέσω e-mail. Παρακαλούμε επικοινωνήστε μαζί μας!';
-$lang['regbadmail'] = 'Η διεύθυνση e-mail δεν δείχνει έγκυρη - εάν πιστεύετε ότι αυτό είναι λάθος, επικοινωνήστε μαζί μας';
+$lang['regbadmail'] = 'Η διεύθυνση e-mail δεν είναι έγκυρη - εάν πιστεύετε ότι αυτό είναι λάθος, επικοινωνήστε μαζί μας';
$lang['regbadpass'] = 'Οι δύο κωδικοί δεν είναι ίδιοι, προσπαθήστε ξανά.';
$lang['regpwmail'] = 'Ο κωδικός σας';
$lang['reghere'] = 'Δεν έχετε λογαριασμό ακόμη? Δημιουργήστε έναν';
-$lang['profna'] = 'Αυτό το wiki δεν υποστηρίζει την τροποποίηση προφίλ.';
+$lang['profna'] = 'Αυτό το wiki δεν υποστηρίζει την επεξεργασία προφίλ.';
$lang['profnochange'] = 'Καμία αλλαγή.';
$lang['profnoempty'] = 'Δεν επιτρέπεται κενό όνομα χρήστη η κενή διεύθυνση email.';
$lang['profchanged'] = 'Το προφίλ χρήστη τροποποιήθηκε επιτυχώς.';
-$lang['pwdforget'] = 'Ξεχάσατε το κωδικό σας? Αποκτήστε νέο.';
+$lang['pwdforget'] = 'Ξεχάσατε το κωδικό σας; Αποκτήστε νέο.';
$lang['resendna'] = 'Αυτό το wiki δεν υποστηρίζει την εκ\' νέου αποστολή κωδικών.';
$lang['resendpwd'] = 'Αποστολή νέων κωδικών για τον χρήστη';
$lang['resendpwdmissing'] = 'Πρέπει να συμπληρώσετε όλα τα πεδία.';
@@ -83,7 +83,7 @@ $lang['resendpwdnouser'] = 'Αυτός ο χρήστης δεν υπάρχ
$lang['resendpwdbadauth'] = 'Αυτός ο κωδικός ενεργοποίησης δεν είναι έγκυρος.';
$lang['resendpwdconfirm'] = 'Ο σύνδεσμος προς την σελίδα ενεργοποίησης εστάλει με e-mail.';
$lang['resendpwdsuccess'] = 'Ο νέος σας κωδικός εστάλη με e-mail.';
-$lang['license'] = 'Εκτός εάν αναφέρεται διαφορετικά, το υλικό αυτού του wiki διατίθεται κάτω από την ακόλουθη άδεια:';
+$lang['license'] = 'Εκτός εάν αναφέρεται διαφορετικά, το περιεχόμενο σε αυτο το wiki διέπεται από την ακόλουθη άδεια:';
$lang['licenseok'] = 'Σημείωση: Τροποποιώντας αυτή την σελίδα αποδέχεστε την διάθεση του υλικού σας σύμφωνα με την ακόλουθη άδεια:';
$lang['searchmedia'] = 'Αναζήτηση αρχείου:';
$lang['searchmedia_in'] = 'Αναζήτηση σε %s';
@@ -92,9 +92,9 @@ $lang['txt_filename'] = 'Επιλέξτε νέο όνομα αρχεί
$lang['txt_overwrt'] = 'Αντικατάσταση υπάρχοντος αρχείου';
$lang['lockedby'] = 'Προσωρινά κλειδωμένο από';
$lang['lockexpire'] = 'Το κλείδωμα λήγει στις';
-$lang['willexpire'] = 'Το κλείδωμά σας για την επεξεργασία αυτής της σελίδας θα λήξει σε ένα λεπτό.\n Για να το ανανεώσετε χρησιμοποιήστε την επιλογή Προεπισκόπηση.';
+$lang['willexpire'] = 'Το κλείδωμά σας για την επεξεργασία αυτής της σελίδας θα λήξει σε ένα λεπτό.\n Για να το ανανεώσετε χρησιμοποιήστε την Προεπισκόπηση.';
$lang['js']['notsavedyet'] = 'Οι μη αποθηκευμένες αλλαγές θα χαθούν.
-Θέλετε να συνεχίσετε?';
+Θέλετε να συνεχίσετε;';
$lang['js']['searchmedia'] = 'Αναζήτηση για αρχεία';
$lang['js']['keepopen'] = 'Το παράθυρο να μην κλείνει';
$lang['js']['hidedetails'] = 'Απόκρυψη λεπτομερειών';
@@ -107,25 +107,25 @@ $lang['js']['mediaclose'] = 'Κλείσιμο';
$lang['js']['mediainsert'] = 'Εισαγωγή';
$lang['js']['mediadisplayimg'] = 'Προβολή εικόνας.';
$lang['js']['mediadisplaylnk'] = 'Προβολή μόνο του συνδέσμου.';
-$lang['js']['mediasmall'] = 'Μικρή έκδοση';
-$lang['js']['mediamedium'] = 'Μεσαία έκδοση';
-$lang['js']['medialarge'] = 'Μεγάλη έκδοση';
-$lang['js']['mediaoriginal'] = 'Κανονική έκδοση';
+$lang['js']['mediasmall'] = 'Μικρό μέγεθος';
+$lang['js']['mediamedium'] = 'Μεσαίο μέγεθος';
+$lang['js']['medialarge'] = 'Μεγάλο μέγεθος';
+$lang['js']['mediaoriginal'] = 'Αρχικό μέγεθος';
$lang['js']['medialnk'] = 'Σύνδεσμος στην σελίδα λεπτομερειών';
$lang['js']['mediadirect'] = 'Απευθείας σύνδεσμος στο αυθεντικό';
$lang['js']['medianolnk'] = 'Χωρίς σύνδεσμο';
$lang['js']['medianolink'] = 'Να μην γίνει σύνδεσμος η εικόνα';
-$lang['js']['medialeft'] = 'Στοίχιση της εικόνας αριστερά.';
-$lang['js']['mediaright'] = 'Στοίχιση της εικόνας δεξιά.';
-$lang['js']['mediacenter'] = 'Στοίχιση της εικόνας στη μέση.';
-$lang['js']['medianoalign'] = 'Να μην γίνει στοίχιση.';
+$lang['js']['medialeft'] = 'Αριστερή στοίχιση εικόνας.';
+$lang['js']['mediaright'] = 'Δεξιά στοίχιση εικόνας.';
+$lang['js']['mediacenter'] = 'Κέντρική στοίχιση εικόνας.';
+$lang['js']['medianoalign'] = 'Χωρίς στοίχηση.';
$lang['js']['nosmblinks'] = 'Οι σύνδεσμοι προς Windows shares δουλεύουν μόνο στον Microsoft Internet Explorer.
Μπορείτε πάντα να κάνετε αντιγραφή και επικόλληση του συνδέσμου.';
$lang['js']['linkwiz'] = 'Αυτόματος Οδηγός Συνδέσμων';
$lang['js']['linkto'] = 'Σύνδεση σε:';
-$lang['js']['del_confirm'] = 'Να διαγραφεί?';
+$lang['js']['del_confirm'] = 'Να διαγραφεί;';
$lang['js']['mu_btn'] = 'Ταυτόχρονη φόρτωση πολλαπλών φακέλων';
-$lang['rssfailed'] = 'Εμφανίστηκε κάποιο σφάλμα κατά την ανάγνωση αυτού του feed: ';
+$lang['rssfailed'] = 'Παρουσιάστηκε κάποιο σφάλμα κατά την ανάγνωση αυτού του feed: ';
$lang['nothingfound'] = 'Δεν βρέθηκαν σχετικά αποτελέσματα.';
$lang['mediaselect'] = 'Επιλογή Αρχείων';
$lang['fileupload'] = 'Φόρτωση αρχείου';
@@ -156,9 +156,12 @@ $lang['quickhits'] = 'Σχετικές σελίδες';
$lang['toc'] = 'Πίνακας Περιεχομένων';
$lang['current'] = 'τρέχουσα';
$lang['yours'] = 'Η έκδοσή σας';
-$lang['diff'] = 'προβολή διαφορών με την τρέχουσα έκδοση';
+$lang['diff'] = 'Προβολή διαφορών με την τρέχουσα έκδοση';
$lang['diff2'] = 'Προβολή διαφορών μεταξύ των επιλεγμένων εκδόσεων';
$lang['difflink'] = 'Σύνδεσμος σε αυτή την προβολή διαφορών.';
+$lang['diff_type'] = 'Προβολή διαφορών:';
+$lang['diff_inline'] = 'Σε σειρά';
+$lang['diff_side'] = 'Δίπλα-δίπλα';
$lang['line'] = 'Γραμμή';
$lang['breadcrumb'] = 'Ιστορικό';
$lang['youarehere'] = 'Είστε εδώ';
@@ -218,12 +221,12 @@ $lang['img_camera'] = 'Camera';
$lang['img_keywords'] = 'Λέξεις-κλειδιά';
$lang['subscr_subscribe_success'] = 'Ο/η %s προστέθηκε στην λίστα ειδοποιήσεων για το %s';
$lang['subscr_subscribe_error'] = 'Σφάλμα κατά την προσθήκη του/της %s στην λίστα ειδοποιήσεων για το %s';
-$lang['subscr_subscribe_noaddress'] = 'Δεν υπάρχει διεύθυνση ταχυδρομείου, συσχετισμένη με το όνομα χρήστη σας, κατά συνέπεια δεν μπορείτε να προστεθείτε στην λίστα ειδοποιήσεων';
+$lang['subscr_subscribe_noaddress'] = 'Δεν υπάρχει διεύθυνση ταχυδρομείου συσχετισμένη με το όνομα χρήστη σας. Κατά συνέπεια δεν μπορείτε να προστεθείτε στην λίστα ειδοποιήσεων';
$lang['subscr_unsubscribe_success'] = 'Ο/η %s, απομακρύνθηκε από την λίστα ειδοποιήσεων για το %s';
$lang['subscr_unsubscribe_error'] = 'Σφάλμα κατά την απομάκρυνση του/της %s στην λίστα ειδοποιήσεων για το %s';
$lang['subscr_already_subscribed'] = 'Ο/η %s είναι ήδη στην λίστα ειδοποίησης για το %s';
$lang['subscr_not_subscribed'] = 'Ο/η %s δεν είναι στην λίστα ειδοποίησης για το %s';
-$lang['subscr_m_not_subscribed'] = 'Αυτήν την στιγμή, δεν είσαστε γραμμένος/η στην λίστα ειδοποίησης της τρέχουσας σελίδας ή φακέλου.';
+$lang['subscr_m_not_subscribed'] = 'Αυτήν την στιγμή, δεν είσαστε εγεγγραμμένος/η στην λίστα ειδοποίησης της τρέχουσας σελίδας ή φακέλου.';
$lang['subscr_m_new_header'] = 'Προσθήκη στην λίστα ειδοποίησης';
$lang['subscr_m_current_header'] = 'Τρέχουσες εγγραφές ειδοποιήσεων';
$lang['subscr_m_unsubscribe'] = 'Διαγραφή';
@@ -231,17 +234,17 @@ $lang['subscr_m_subscribe'] = 'Εγγραφή';
$lang['subscr_m_receive'] = 'Λήψη';
$lang['subscr_style_every'] = 'email σε κάθε αλλαγή';
$lang['subscr_style_digest'] = 'συνοπτικό email αλλαγών της σελίδας (κάθε %.2f μέρες)';
-$lang['subscr_style_list'] = 'λίστα αλλαγμένων σελίδων μετά από το τελευταίο email (κάθε %.2f μέρες)';
+$lang['subscr_style_list'] = 'λίστα σελίδων με αλλαγές μετά από το τελευταίο email (κάθε %.2f μέρες)';
$lang['authmodfailed'] = 'Κακή ρύθμιση λίστας χρηστών. Παρακαλούμε ενημερώστε τον διαχειριστή του wiki.';
-$lang['authtempfail'] = 'Η είσοδος χρηστών δεν λειτουργεί αυτή την στιγμή. Εάν αυτό διαρκεί για πολύ χρόνο, παρακαλούμε ενημερώστε τον διαχειριστή του wiki.';
+$lang['authtempfail'] = 'Η συνδεση χρηστών είναι απενεργοποιημένη αυτή την στιγμή. Αν αυτό διαρκέσει για πολύ, παρακαλούμε ενημερώστε τον διαχειριστή του wiki.';
$lang['i_chooselang'] = 'Επιλογή γλώσσας';
$lang['i_installer'] = 'Οδηγός εγκατάστασης DokuWiki';
$lang['i_wikiname'] = 'Ονομασία wiki';
-$lang['i_enableacl'] = 'Ενεργοποίηση Λίστας Δικαιωμάτων Πρόσβασης - ACL (συνιστάται)';
+$lang['i_enableacl'] = 'Ενεργοποίηση Λίστας Δικαιωμάτων Πρόσβασης - ACL (συνίσταται)';
$lang['i_superuser'] = 'Διαχειριστής';
$lang['i_problems'] = 'Ο οδηγός εγκατάστασης συνάντησε τα προβλήματα που αναφέρονται παρακάτω. Η εγκατάσταση δεν θα ολοκληρωθεί επιτυχώς μέχρι να επιλυθούν αυτά τα προβλήματα.';
$lang['i_modified'] = 'Για λόγους ασφαλείας, ο οδηγός εγκατάστασης λειτουργεί μόνο με νέες και μη τροποποιημένες εγκαταστάσεις Dokuwiki.
-Πρέπει είτε να κάνετε νέα εγκατάσταση, χρησιμοποιώντας το αρχικό πακέτο εγκατάστασης, ή να συμβουλευτείτε τις <a href="http://dokuwiki.org/install">οδηγίες εγκατάστασης της εφαρμογής</a>.';
+Πρέπει είτε να κάνετε νέα εγκατάσταση, χρησιμοποιώντας το αρχικό πακέτο εγκατάστασης, ή να συμβουλευτείτε τις <a href="http://dokuwiki.org/el:install">οδηγίες εγκατάστασης της εφαρμογής</a>.';
$lang['i_funcna'] = 'Η λειτουργία <code>%s</code> της PHP δεν είναι διαθέσιμη. Πιθανόν να είναι απενεργοποιημένη στις ρυθμίσεις έναρξης της PHP';
$lang['i_phpver'] = 'Η έκδοση <code>%s</code> της PHP που έχετε είναι παλαιότερη της απαιτούμενης <code>%s</code>. Πρέπει να αναβαθμίσετε την PHP.';
$lang['i_permfail'] = 'Ο φάκελος <code>%s</code> δεν είναι εγγράψιμος από την εφαρμογή DokuWiki. Πρέπει να διορθώσετε τα δικαιώματα πρόσβασης αυτού του φακέλου!';
@@ -268,16 +271,16 @@ $lang['mu_ready'] = 'έτοιμο για φόρτωση';
$lang['mu_done'] = 'ολοκληρώθηκε';
$lang['mu_fail'] = 'απέτυχε';
$lang['mu_authfail'] = 'η συνεδρία έληξε';
-$lang['mu_progress'] = '@PCT@% φορτώθηκε';
+$lang['mu_progress'] = 'φορτώθηκε @PCT@%';
$lang['mu_filetypes'] = 'Επιτρεπτοί τύποι αρχείων';
$lang['mu_info'] = 'τα αρχεία ανέβηκαν.';
$lang['mu_lasterr'] = 'Τελευταίο σφάλμα:';
$lang['recent_global'] = 'Βλέπετε τις αλλαγές εντός του φακέλου <b>%s</b>. Μπορείτε επίσης να <a href="%s">δείτε τις πρόσφατες αλλαγές σε όλο το wiki</a>.';
-$lang['years'] = 'πριν από %d χρόνια';
-$lang['months'] = 'πριν από %d μήνες';
-$lang['weeks'] = 'πριν από %d εβδομάδες';
-$lang['days'] = 'πριν από %d ημέρες';
-$lang['hours'] = 'πριν από %d ώρες';
-$lang['minutes'] = 'πριν από %d λεπτά';
-$lang['seconds'] = 'πριν από %d δευτερόλεπτα';
-$lang['wordblock'] = 'Η αλλαγή σας δεν αποθηκεύτηκε γιατί περιείχε μπλοκαρισμένο κείμενο (spam).';
+$lang['years'] = 'πριν %d χρόνια';
+$lang['months'] = 'πριν %d μήνες';
+$lang['weeks'] = 'πριν %d εβδομάδες';
+$lang['days'] = 'πριν %d ημέρες';
+$lang['hours'] = 'πριν %d ώρες';
+$lang['minutes'] = 'πριν %d λεπτά';
+$lang['seconds'] = 'πριν %d δευτερόλεπτα';
+$lang['wordblock'] = 'Η αλλαγή σας δεν αποθηκεύτηκε γιατί περιείχε spam.'; \ No newline at end of file
diff --git a/inc/lang/el/locked.txt b/inc/lang/el/locked.txt
index d2f542c19..425c334f1 100644
--- a/inc/lang/el/locked.txt
+++ b/inc/lang/el/locked.txt
@@ -1,4 +1,5 @@
====== Κλειδωμένη σελίδα ======
-Αυτή η σελίδα είναι προς το παρόν δεσμευμένη για τροποποίηση από άλλον χρήστη. Θα πρέπει να περιμένετε μέχρι ο συγκεκριμένος χρήστης να τελειώσει την τροποποίηση ή να εκπνεύσει το χρονικό όριο για το σχετικό κλείδωμα.
+Αυτή η σελίδα είναι προς το παρόν δεσμευμένη για τροποποίηση από άλλον χρήστη.
+Θα πρέπει να περιμένετε μέχρι ο συγκεκριμένος χρήστης να σταματήσει να την επεξεργάζεται ή να εκπνεύσει το χρονικό όριο για το σχετικό κλείδωμα.
diff --git a/inc/lang/el/login.txt b/inc/lang/el/login.txt
index 3839b7279..3021a19ea 100644
--- a/inc/lang/el/login.txt
+++ b/inc/lang/el/login.txt
@@ -1,3 +1,5 @@
-====== Είσοδος χρήστη ======
+====== Σύνδεση χρήστη ======
-Αυτή την στιγμή δεν έχετε συνδεθεί ως χρήστης! Για να συνδεθείτε, εισάγετε τα στοιχεία σας στην παρακάτω φόρμα. Πρέπει να έχετε ενεργοποιήσει τα cookies στον φυλλομετρητή σας.
+Αυτή την στιγμή δεν έχετε συνδεθεί ως χρήστης!
+Για να συνδεθείτε, εισάγετε τα στοιχεία σας στην παρακάτω φόρμα.
+Πρέπει να έχετε ενεργοποιήσει τα cookies στο πρόγραμμα περιήγηση σας.
diff --git a/inc/lang/el/newpage.txt b/inc/lang/el/newpage.txt
index e8d65d6e5..3349ad90e 100644
--- a/inc/lang/el/newpage.txt
+++ b/inc/lang/el/newpage.txt
@@ -1,3 +1,4 @@
====== Αυτή η σελίδα δεν υπάρχει ακόμη ======
-Η σελίδα που ζητάτε δεν υπάρχει ακόμη. Εάν όμως έχετε επαρκή δικαιώματα, μπορείτε να την δημιουργήσετε επιλέγοντας ''Δημιουργία σελίδας''.
+Η σελίδα που ζητάτε δεν υπάρχει ακόμη.
+Aν όμως έχετε επαρκή δικαιώματα, μπορείτε να την δημιουργήσετε επιλέγοντας ''Δημιουργία σελίδας''.
diff --git a/inc/lang/el/norev.txt b/inc/lang/el/norev.txt
index 9ce347948..2b13290ff 100644
--- a/inc/lang/el/norev.txt
+++ b/inc/lang/el/norev.txt
@@ -1,4 +1,5 @@
-====== Δεν υπάρχει τέτοια έκδοση ======
+====== Αυτή η έκδοση δεν υπάρχει ======
-Η έκδοση που αναζητήσατε δεν υπάρχει. Επιλέξτε ''Παλαιότερες εκδόσεις σελίδας'' για να δείτε την λίστα με τις παλαιότερες εκδόσεις της τρέχουσας σελίδας.
+Η έκδοση που αναζητήσατε δεν υπάρχει.
+Μπορείτε να δείτε λίστα με τις παλαιότερες εκδόσεις της τρέχουσας σελίδας πατώντας ''Παλαιότερες εκδόσεις σελίδας''.
diff --git a/inc/lang/el/password.txt b/inc/lang/el/password.txt
index 621a215f0..d27fbb3c3 100644
--- a/inc/lang/el/password.txt
+++ b/inc/lang/el/password.txt
@@ -2,8 +2,8 @@
Αυτά είναι τα στοιχεία εισόδου για το @TITLE@ στο @DOKUWIKIURL@
-Όνομα : @LOGIN@
-Κωδικός : @PASSWORD@
+Όνομα : @LOGIN@
+Συνθηματικό : @PASSWORD@
--
Αυτό το e-mail δημιουργήθηκε αυτόματα από την εφαρμογή DokuWiki στην διεύθυνση
diff --git a/inc/lang/el/preview.txt b/inc/lang/el/preview.txt
index f6709a441..aef65c974 100644
--- a/inc/lang/el/preview.txt
+++ b/inc/lang/el/preview.txt
@@ -1,4 +1,5 @@
====== Προεπισκόπηση ======
-Αυτή είναι μια προεπισκόπηση του πως θα δείχνει η σελίδα. Θυμηθείτε: Οι αλλαγές σας **δεν έχουν αποθηκευθεί** ακόμη!
+Αυτή είναι μια προεπισκόπηση του πως θα δείχνει η σελίδα.
+Υπενθύμιση: Οι αλλαγές σας **δεν έχουν αποθηκευθεί** ακόμη!
diff --git a/inc/lang/el/pwconfirm.txt b/inc/lang/el/pwconfirm.txt
index 03f408819..a9e58be7d 100644
--- a/inc/lang/el/pwconfirm.txt
+++ b/inc/lang/el/pwconfirm.txt
@@ -1,11 +1,11 @@
Γεια σας @FULLNAME@!
-Κάποιος ζήτησε τη δημιουργία νέου κωδικού για τον λογαριασμό @TITLE@
+Κάποιος ζήτησε τη δημιουργία νέου συνθηματικού για τον λογαριασμό @TITLE@
που διατηρείτε στο @DOKUWIKIURL@
-Εάν δεν ζητήσατε εσείς την δημιουργία νέου κωδικού απλά αγνοήστε αυτό το e-mail.
+Αν δεν ζητήσατε εσείς την δημιουργία νέου συνθηματικού απλά αγνοήστε αυτό το e-mail.
-Εάν όντως εσείς ζητήσατε την δημιουργία νέου κωδικού, ακολουθήστε τον παρακάτω σύνδεσμο για να το επιβεβαιώσετε.
+Αν όντως εσείς ζητήσατε την δημιουργία νέου συνθηματικού, ακολουθήστε τον παρακάτω σύνδεσμο για να το επιβεβαιώσετε.
@CONFIRM@
diff --git a/inc/lang/el/read.txt b/inc/lang/el/read.txt
index 2d43c28fc..a620ab559 100644
--- a/inc/lang/el/read.txt
+++ b/inc/lang/el/read.txt
@@ -1 +1,2 @@
-Μπορείτε μόνο να διαβάσετε αυτή την σελίδα και όχι να την τροποποιήσετε. Εάν πιστεύετε ότι αυτό δεν είναι σωστό, απευθυνθείτε στον διαχειριστή της εφαρμογής.
+Μπορείτε να διαβάσετε αυτή την σελίδα αλλά δεν μπορείτε να την τροποποιήσετε.
+Αν πιστεύετε ότι αυτό δεν είναι σωστό, απευθυνθείτε στον διαχειριστή της εφαρμογής.
diff --git a/inc/lang/el/recent.txt b/inc/lang/el/recent.txt
index cc8051581..78c74a655 100644
--- a/inc/lang/el/recent.txt
+++ b/inc/lang/el/recent.txt
@@ -1,3 +1,3 @@
-====== Πρόσφατες αλλαγές σελίδων ======
+====== Πρόσφατες αλλαγές ======
Οι παρακάτω σελίδες τροποποιήθηκαν πρόσφατα:
diff --git a/inc/lang/el/register.txt b/inc/lang/el/register.txt
index 15d64cba3..6a4e963e4 100644
--- a/inc/lang/el/register.txt
+++ b/inc/lang/el/register.txt
@@ -1,3 +1,5 @@
====== Εγγραφή νέου χρήστη ======
-Συμπληρώστε όλα τα παρακάτω πεδία για να δημιουργήσετε ένα νέο λογαριασμό σε αυτό το wiki. Πρέπει να δώσετε μια **υπαρκτή e-mail διεύθυνση** - ο κωδικός σας θα σας αποσταλεί σε αυτήν. Το όνομα χρήστη θα πρέπει να πληρεί τις ίδιες απαιτήσεις ονόματος που ισχύουν και για τους [[doku>pagename|φακέλους]].
+Συμπληρώστε όλα τα παρακάτω πεδία για να δημιουργήσετε ένα νέο λογαριασμό σε αυτό το wiki.
+Πρέπει να δώσετε μια **υπαρκτή e-mail διεύθυνση** - ο κωδικός σας θα σας αποσταλεί σε αυτήν.
+Το όνομα χρήστη θα πρέπει να πληρεί τις ίδιες απαιτήσεις ονόματος που ισχύουν και για τους [[doku>el:pagename|φακέλους]].
diff --git a/inc/lang/el/registermail.txt b/inc/lang/el/registermail.txt
index 5d516ee31..0b3e0b78b 100644
--- a/inc/lang/el/registermail.txt
+++ b/inc/lang/el/registermail.txt
@@ -1,4 +1,4 @@
-Ένας νέος χρήστης εγγράφηκε. Αυτές είναι οι λεπτομέρειες:
+Ένας νέος χρήστης εγγράφηκε. Ορίστε οι λεπτομέρειες:
Χρήστης : @NEWUSER@
Όνομα : @NEWNAME@
diff --git a/inc/lang/el/resendpwd.txt b/inc/lang/el/resendpwd.txt
index 2b91ed017..6b4f3bbca 100644
--- a/inc/lang/el/resendpwd.txt
+++ b/inc/lang/el/resendpwd.txt
@@ -1,4 +1,6 @@
====== Αποστολή νέου κωδικού ======
-Συμπληρώστε όλα τα παρακάτω πεδία για να λάβετε ένα νέο κωδικό για τον λογαριασμό σας σε αυτό το wiki. Ο νέος κωδικός σας θα σταλεί στην e-mail διεύθυνση που έχετε ήδη δηλώσει. Το όνομα πρέπει να είναι αυτό που ισχύει για τον λογαριασμό σας σε αυτό το wiki.
+Συμπληρώστε όλα τα παρακάτω πεδία για να λάβετε ένα νέο κωδικό για τον λογαριασμό σας σε αυτό το wiki.
+Ο νέος κωδικός σας θα σταλεί στην e-mail διεύθυνση που έχετε ήδη δηλώσει.
+Το όνομα πρέπει να είναι αυτό που ισχύει για τον λογαριασμό σας σε αυτό το wiki.
diff --git a/inc/lang/el/revisions.txt b/inc/lang/el/revisions.txt
index 7689c3b2b..955fa1703 100644
--- a/inc/lang/el/revisions.txt
+++ b/inc/lang/el/revisions.txt
@@ -1,3 +1,8 @@
====== Παλαιότερες εκδόσεις σελίδας ======
-Οι παρακάτω είναι παλαιότερες εκδόσεις της τρέχουσας σελίδας. Εάν θέλετε να αντικαταστήσετε την τρέχουσα σελίδα με κάποια από τις παλαιότερες εκδόσεις της, επιλέξτε την σχετική έκδοση, επιλέξτε ''Τροποποίηση σελίδας'', κάνετε τυχόν αλλαγές και αποθηκεύστε την.
+Οι παρακάτω είναι παλαιότερες εκδόσεις της τρέχουσας σελίδας.
+Εάν θέλετε να αντικαταστήσετε την τρέχουσα σελίδα με κάποια από τις παλαιότερες εκδόσεις της κάντε τα παρακάτω:
+ * επιλέξτε την σχετική έκδοση
+ * επιλέξτε ''Τροποποίηση σελίδας''
+ * κάνετε τυχόν αλλαγές
+ * αποθηκεύστε την
diff --git a/inc/lang/el/searchpage.txt b/inc/lang/el/searchpage.txt
index 87f396292..b52162b60 100644
--- a/inc/lang/el/searchpage.txt
+++ b/inc/lang/el/searchpage.txt
@@ -1,5 +1,4 @@
====== Αναζήτηση ======
-Τα αποτελέσματα της αναζήτησής σας ακολουθούν.
+Τα αποτελέσματα της αναζήτησής σας:
-===== Αποτελέσματα ===== \ No newline at end of file
diff --git a/inc/lang/el/showrev.txt b/inc/lang/el/showrev.txt
index 212245420..a6ba3f99e 100644
--- a/inc/lang/el/showrev.txt
+++ b/inc/lang/el/showrev.txt
@@ -1,2 +1,2 @@
-**Αυτή είναι μια παλαιότερη έκδοση της σελίδας!**
+**Βλέπετε μια παλαιότερη έκδοση της σελίδας!**
----
diff --git a/inc/lang/el/stopwords.txt b/inc/lang/el/stopwords.txt
index bc6eb48ae..01d5103b3 100644
--- a/inc/lang/el/stopwords.txt
+++ b/inc/lang/el/stopwords.txt
@@ -1,29 +1,103 @@
# This is a list of words the indexer ignores, one word per line
# When you edit this file be sure to use UNIX line endings (single newline)
# No need to include words shorter than 3 chars - these are ignored anyway
-# This list is based upon the ones found at http://www.ranks.nl/stopwords/
-about
-are
-and
-you
-your
-them
-their
-com
-for
-from
-into
-how
-that
-the
-this
-was
-what
-when
-where
-who
-will
-with
-und
-the
-www
+# This list is provided by Fotis Lazarinis based on his research found at: http://lazarinf.teimes.gr/papers/J8.pdf
+και
+ήταν
+το
+ενός
+να
+πολύ
+του
+όμως
+κατά
+της
+αυτή
+με
+όταν
+που
+μέσα
+την
+οποίο
+από
+πως
+για
+έτσι
+τα
+στους
+είναι
+μέσω
+των
+όλα
+σε
+καθώς
+ο
+αυτά
+οι
+προς
+στο
+ένας
+θα
+πριν
+τη
+μου
+στην
+όχι
+τον
+χωρίς
+τους
+επίσης
+δεν
+μεταξύ
+τις
+μέχρι
+ένα
+έναν
+μια
+μιας
+ότι
+αφού
+ακόμα
+στη
+όπου
+στα
+είχε
+μας
+δηλαδή
+αλλά
+τρόπος
+στον
+όσο
+στις
+ακόμη
+αυτό
+τόσο
+όπως
+έχουμε
+αν
+ώστε
+μπορεί
+αυτές
+μετά
+γιατί
+σας
+πάνω
+δύο
+τότε
+τι
+τώρα
+ως
+κάτι
+κάθε
+άλλο
+πρέπει
+μην
+πιο
+εδώ
+οποία
+είτε
+μόνο
+μη
+ενώ \ No newline at end of file
diff --git a/inc/lang/el/subscr_digest.txt b/inc/lang/el/subscr_digest.txt
index 1a0f44d14..7dd0345d7 100644
--- a/inc/lang/el/subscr_digest.txt
+++ b/inc/lang/el/subscr_digest.txt
@@ -11,10 +11,9 @@
Νέα έκδοση: @NEWPAGE@
Για να σταματήσουν αυτές οι ειδοποιήσεις συνδεθείτε
-στο wiki στην διεύθυνση @DOKUWIKIURL@ και στην
-συνέχεια επισκεφθείτε το @SUBSCRIBE@ και
-διαγραφείτε από τις ειδοποιήσεις της σελίδας ή
-φακέλου.
+στο wiki στην διεύθυνση @DOKUWIKIURL@
+και στην συνέχεια επισκεφθείτε το @SUBSCRIBE@
+και διαγραφείτε από τις ειδοποιήσεις της σελίδας ή του φακέλου.
--
Αυτό το μήνυμα παράχθηκε απο το DokuWiki στην
diff --git a/inc/lang/el/subscr_list.txt b/inc/lang/el/subscr_list.txt
index f5cb8023d..97b8dc47d 100644
--- a/inc/lang/el/subscr_list.txt
+++ b/inc/lang/el/subscr_list.txt
@@ -10,11 +10,10 @@
@DIFF@
--------------------------------------------------------
-Για να σταματήσουν αυτές οι ειδοποιήσεις συνδεθείτε
-στο wiki στην διεύθυνση @DOKUWIKIURL@ και στην
-συνέχεια επισκεφθείτε το @SUBSCRIBE@ και
-διαγραφείτε από τις ειδοποιήσεις της σελίδας ή
-φακέλου.
+Για να σταματήσουν αυτές οι ειδοποιήσεις συνδεθείτε στο wiki
+στην διεύθυνση @DOKUWIKIURL@
+και στην συνέχεια επισκεφθείτε το @SUBSCRIBE@
+και διαγραφείτε από τις ειδοποιήσεις της σελίδας ή του φακέλου.
--
Αυτό το μήνυμα παράχθηκε απο το DokuWiki στην
diff --git a/inc/lang/el/subscr_single.txt b/inc/lang/el/subscr_single.txt
index 9815cc0bb..610af49a2 100644
--- a/inc/lang/el/subscr_single.txt
+++ b/inc/lang/el/subscr_single.txt
@@ -12,11 +12,10 @@
Παλιά έκδοση: @OLDPAGE@
Νέα έκδοση: @NEWPAGE@
-Για να σταματήσουν αυτές οι ειδοποιήσεις συνδεθείτε
-στο wiki στην διεύθυνση @DOKUWIKIURL@ και στην
-συνέχεια επισκεφθείτε το @SUBSCRIBE@ και
-διαγραφείτε από τις ειδοποιήσεις της σελίδας ή
-φακέλου.
+Για να σταματήσουν αυτές οι ειδοποιήσεις συνδεθείτε στο wiki
+στην διεύθυνση @DOKUWIKIURL@
+και στην συνέχεια επισκεφθείτε το @SUBSCRIBE@
+και διαγραφείτε από τις ειδοποιήσεις της σελίδας ή του φακέλου.
--
Αυτό το μήνυμα παράχθηκε απο το DokuWiki στην
diff --git a/inc/lang/el/updateprofile.txt b/inc/lang/el/updateprofile.txt
index ccb9596b6..56f176d37 100644
--- a/inc/lang/el/updateprofile.txt
+++ b/inc/lang/el/updateprofile.txt
@@ -1,3 +1,4 @@
====== Τροποποίηση προφίλ ======
-Τροποποιήστε **μόνο** τα πεδία που θέλετε να αλλάξετε. Δεν μπορείτε να αλλάξετε το πεδίο ''Όνομα''.
+Τροποποιήστε **μόνο** τα πεδία που θέλετε να αλλάξετε.
+Δεν μπορείτε να αλλάξετε το πεδίο ''Όνομα''.
diff --git a/inc/lang/en/lang.php b/inc/lang/en/lang.php
index 9ccbe14e0..51fd8f645 100644
--- a/inc/lang/en/lang.php
+++ b/inc/lang/en/lang.php
@@ -46,7 +46,8 @@ $lang['btn_resendpwd'] = 'Send new password';
$lang['btn_draft'] = 'Edit draft';
$lang['btn_recover'] = 'Recover draft';
$lang['btn_draftdel'] = 'Delete draft';
-$lang['btn_revert'] = 'Restore';
+$lang['btn_revert'] = 'Restore';
+$lang['btn_register'] = 'Register';
$lang['loggedinas'] = 'Logged in as';
$lang['user'] = 'Username';
@@ -57,7 +58,6 @@ $lang['passchk'] = 'once again';
$lang['remember'] = 'Remember me';
$lang['fullname'] = 'Real name';
$lang['email'] = 'E-Mail';
-$lang['register'] = 'Register';
$lang['profile'] = 'User Profile';
$lang['badlogin'] = 'Sorry, username or password was wrong.';
$lang['minoredit'] = 'Minor Changes';
@@ -164,6 +164,9 @@ $lang['yours'] = 'Your Version';
$lang['diff'] = 'Show differences to current revisions';
$lang['diff2'] = 'Show differences between selected revisions';
$lang['difflink'] = 'Link to this comparison view';
+$lang['diff_type'] = 'View differences:';
+$lang['diff_inline']= 'Inline';
+$lang['diff_side'] = 'Side by Side';
$lang['line'] = 'Line';
$lang['breadcrumb'] = 'Trace';
$lang['youarehere'] = 'You are here';
diff --git a/inc/lang/eo/lang.php b/inc/lang/eo/lang.php
index a2457474b..4bb1c005d 100644
--- a/inc/lang/eo/lang.php
+++ b/inc/lang/eo/lang.php
@@ -4,16 +4,11 @@
*
* @license GPL 2 (http://www.gnu.org/licenses/gpl.html)
* @author Antono Vasiljev <esperanto.minsk ĈE tut.by>
- * @author Felipe Castro <fefcas CXE yahoo.com.br>
+ * @author Felipe Castro <fefcas@yahoo.com.br>
* @author Felipe Castro <fefcas@uol.com.br>
* @author Felipe Castro <fefcas@gmail.com>
- * @author Felipe Castro <fefcas (cxe) gmail (punkto) com>
- * @author Felipo Kastro <fefcas@gmail.com>
* @author Robert Bogenschneider <robog@gmx.de>
- * @author Erik Pedersen <erik pedersen@shaw.ca>
* @author Erik Pedersen <erik.pedersen@shaw.ca>
- * @author Robert Bogenschneider <robog@GMX.de>
- * @author Robert BOGENSCHNEIDER <robog@gmx.de>
*/
$lang['encoding'] = 'utf-8';
$lang['direction'] = 'ltr';
@@ -54,6 +49,7 @@ $lang['btn_draft'] = 'Redakti skizon';
$lang['btn_recover'] = 'Restarigi skizon';
$lang['btn_draftdel'] = 'Forigi skizon';
$lang['btn_revert'] = 'Restarigi';
+$lang['btn_register'] = 'Registriĝi';
$lang['loggedinas'] = 'Ensalutita kiel';
$lang['user'] = 'Uzant-nomo';
$lang['pass'] = 'Pasvorto';
@@ -63,7 +59,6 @@ $lang['passchk'] = 'plian fojon';
$lang['remember'] = 'Rememoru min';
$lang['fullname'] = 'Kompleta nomo';
$lang['email'] = 'Retpoŝto';
-$lang['register'] = 'Registriĝi';
$lang['profile'] = 'Uzanto-profilo';
$lang['badlogin'] = 'Pardonu, uzant-nomo aŭ pasvorto estis erara.';
$lang['minoredit'] = 'Etaj modifoj';
@@ -166,6 +161,9 @@ $lang['yours'] = 'Via Versio';
$lang['diff'] = 'Montri diferencojn el la aktuala versio';
$lang['diff2'] = 'Montri diferencojn inter la elektitaj revizioj';
$lang['difflink'] = 'Ligilo al kompara rigardo';
+$lang['diff_type'] = 'Rigardi malsamojn:';
+$lang['diff_inline'] = 'Samlinie';
+$lang['diff_side'] = 'Apude';
$lang['line'] = 'Linio';
$lang['breadcrumb'] = 'Paŝoj';
$lang['youarehere'] = 'Vi estas ĉi tie';
diff --git a/inc/lang/es/lang.php b/inc/lang/es/lang.php
index 04403c821..aad93c075 100644
--- a/inc/lang/es/lang.php
+++ b/inc/lang/es/lang.php
@@ -14,8 +14,7 @@
* @author oliver@samera.com.py
* @author Enrico Nicoletto <liverig@gmail.com>
* @author Manuel Meco <manuel.meco@gmail.com>
- * @author VictorCastelan <victorcastelan@gmail.com>
- * @author Jordan Mero hack.jord@gmail.com
+ * @author Jordan Mero <hack.jord@gmail.com>
* @author Felipe Martinez <metalmartinez@gmail.com>
* @author Javier Aranda <internet@javierav.com>
* @author Zerial <fernando@zerial.org>
@@ -24,6 +23,7 @@
* @author Fernando J. Gómez <fjgomez@gmail.com>
* @author Victor Castelan <victorcastelan@gmail.com>
* @author Mauro Javier Giamberardino <mgiamberardino@gmail.com>
+ * @author emezeta <emezeta@infoprimo.com>
*/
$lang['encoding'] = 'utf-8';
$lang['direction'] = 'ltr';
@@ -64,6 +64,7 @@ $lang['btn_draft'] = 'Editar borrador';
$lang['btn_recover'] = 'Recuperar borrador';
$lang['btn_draftdel'] = 'Eliminar borrador';
$lang['btn_revert'] = 'Restaurar';
+$lang['btn_register'] = 'Registrarse';
$lang['loggedinas'] = 'Conectado como ';
$lang['user'] = 'Usuario';
$lang['pass'] = 'Contraseña';
@@ -73,7 +74,6 @@ $lang['passchk'] = 'otra vez';
$lang['remember'] = 'Recordarme';
$lang['fullname'] = 'Nombre real';
$lang['email'] = 'E-Mail';
-$lang['register'] = 'Registrarse';
$lang['profile'] = 'Perfil del usuario';
$lang['badlogin'] = 'Lo siento, el usuario o la contraseña es incorrecto.';
$lang['minoredit'] = 'Cambios menores';
@@ -176,6 +176,9 @@ $lang['yours'] = 'Tu versión';
$lang['diff'] = 'Muestra diferencias a la versión actual';
$lang['diff2'] = 'Muestra las diferencias entre las revisiones seleccionadas';
$lang['difflink'] = 'Enlace a la vista de comparación';
+$lang['diff_type'] = 'Ver diferencias';
+$lang['diff_inline'] = 'En línea';
+$lang['diff_side'] = 'Lado a lado';
$lang['line'] = 'Línea';
$lang['breadcrumb'] = 'Traza';
$lang['youarehere'] = 'Estás aquí';
diff --git a/inc/lang/et/lang.php b/inc/lang/et/lang.php
index ee765b5b5..180a50c09 100644
--- a/inc/lang/et/lang.php
+++ b/inc/lang/et/lang.php
@@ -3,212 +3,242 @@
* Estonian language file
*
* @license GPL 2 (http://www.gnu.org/licenses/gpl.html)
- * @author Oliver S6ro <seem.iges@mail.ee>
- * @author Aari Juhanson <aari@vmg.vil.ee>
- * @author Kaiko Kaur <kaiko@kultuur.edu.ee>
+ * @author Oliver S6ro <seem.iges@mail.ee>
+ * @author Aari Juhanson <aari@vmg.vil.ee>
+ * @author Kaiko Kaur <kaiko@kultuur.edu.ee>
+ * @author kristian.kankainen@kuu.la
+ * @author Rivo Zängov <eraser@eraser.ee>
*/
-$lang['encoding'] = 'utf-8';
-$lang['direction'] = 'ltr';
-$lang['doublequoteopening'] = '„';//&bdquo;
-$lang['doublequoteclosing'] = '“';//&ldquo;
-$lang['singlequoteopening'] = '‚';//&sbquo;
-$lang['singlequoteclosing'] = '‘';//&lsquo;
-
-$lang['btn_edit'] = 'Toimeta seda lehte';
-$lang['btn_source'] = 'Näita lehepõhja';
-$lang['btn_show'] = 'Näita lehte';
-$lang['btn_create'] = 'Tekita selle lingi alla leht';
-$lang['btn_search'] = 'Otsi';
-$lang['btn_save'] = 'Salvesta';
-$lang['btn_preview']= 'Eelvaade';
-$lang['btn_top'] = 'Tagasi lehe algusesse';
-$lang['btn_revs'] = 'Eelmised versioonid';
-$lang['btn_recent'] = 'Viimased muudatused';
-$lang['btn_upload'] = 'Lae üles';
-$lang['btn_cancel'] = 'Katkesta';
-$lang['btn_index'] = 'Sisukord';
-$lang['btn_secedit']= 'Toimeta';
-$lang['btn_login'] = 'Logi sisse';
-$lang['btn_logout'] = 'Logi välja';
-$lang['btn_admin'] = 'Administreeri';
-$lang['btn_update'] = 'Uuenda';
-$lang['btn_delete'] = 'Kustuta';
-$lang['btn_newer'] = '<< varajasemad';
-$lang['btn_older'] = '>> hilisemad';
-$lang['btn_back'] = 'Tagasi';
-$lang['btn_backtomedia'] = 'Tagasi faili valikusse';
-$lang['btn_profile'] = 'Minu info';
-$lang['btn_reset'] = 'Taasta';
-$lang['btn_resendpwd'] = 'Saada uus parool';
-$lang['btn_draft'] = 'Toimeta mustandit';
-$lang['btn_recover'] = 'Taata mustand';
-$lang['btn_draftdel'] = 'Kustuta mustand';
-$lang['newpass'] = 'Uus parool';
-$lang['oldpass'] = 'Vana parool';
-$lang['passchk'] = 'Korda uut parooli';
-$lang['profile'] = 'Kasutaja info';
-$lang['minoredit'] = 'Ebaolulised muudatused';
-$lang['draftdate'] = 'Mustand automaatselt salvestatud';
-$lang['regsuccess2'] = 'Kasutaja sai tehtud.';
-$lang['regbadpass'] = 'Uus parool on kirjutatud erinevalt. Proovi uuesti.';
-$lang['uploadexist'] = 'Fail on juba olemas. Midagi ei muudetud.';
-$lang['deletesucc'] = 'Fail nimega "%s" sai kustutatud.';
-$lang['deletefail'] = 'Faili nimega "%s" ei kustutatud (kontrolli õigusi).';
-$lang['mediainuse'] = 'Faili nimega "%s" ei kustutatud, sest see on kasutuses.';
-$lang['js']['keepopen'] = 'Jäta aken peale valiku sooritamist avatuks';
-$lang['js']['hidedetails'] = 'Peida detailid';
-$lang['mediausage'] = 'Kasuta järgmist kirjapilti sellele failile viitamaks:';
-$lang['mediaview'] = 'Vaata faili algsel kujul.';
-$lang['mediaroot'] = 'juur';
-$lang['mediaupload'] = 'Lae fail sellesse nimeruumi (kataloogi). Et tekitada veel alam nimeruum kasuta koolonit Wiki nimes.';
-$lang['mediaextchange'] = 'Faili laiend .%s-st %s-ks!';
-$lang['ref_inuse'] = 'Seda faili ei saa kustutada, sest teda kasutavad järgmised lehed:';
-$lang['ref_hidden'] = 'Mõned viidad failile on lehtedel, millele sul ei ole ligipääsu';
-$lang['youarehere'] = 'Sa oled siin';
-$lang['mail_new_user'] = 'Uus kasutaja:';
-$lang['qb_strike'] = 'Läbijoonitud tekst';
-$lang['qb_smileys'] = 'Emotikonid';
-$lang['qb_chars'] = 'Erisümbolid';
-$lang['admin_register'] = 'Lisa kasutaja';
-
-
-#$lang['reference'] = '';
-#$lang['btn_backlink'] = '';
-#$lang['profna'] = '';
-$lang['btn_subscribe'] = 'Jälgi seda lehte (teated meilile)';
-$lang['btn_unsubscribe'] = 'Lõpeta lehe jälgimine';
-$lang['profnochange'] = 'Muutused puuduvad.';
-$lang['profnoempty'] = 'Tühi nimi ega meiliaadress pole lubatud.';
-$lang['profchanged'] = 'Kasutaja info edukalt muudetud';
-$lang['pwdforget'] = 'Unustasid parooli? Tee uus';
-$lang['resendna'] = 'See wiki ei toeta parooli taassaatmist.';
-$lang['resendpwd'] = 'Saada uus parool';
-$lang['resendpwdmissing'] = 'Khmm... Sa pead täitma kõik väljad.';
-$lang['resendpwdnouser'] = 'Aga sellist kasutajat ei ole.';
-$lang['resendpwdbadauth'] = 'See autentimiskood ei ole õige. Kontrolli, et kopeerisid terve lingi.';
-$lang['resendpwdconfirm'] = 'Kinnituslink saadeti meilile.';
-$lang['resendpwdsuccess'] = 'Uus parool saadeti Sinu meilile.';
-$lang['txt_overwrt'] = 'Kirjutan olemasoleva faili üle';
-$lang['metaedit'] = 'Muuda lisainfot';
-$lang['metasaveerr'] = 'Lisainfo salvestamine läks untsu.';
-$lang['metasaveok'] = 'Lisainfo salvestatud';
-$lang['img_backto'] = 'Tagasi';
-$lang['img_title'] = 'Tiitel';
-$lang['img_caption'] = 'Kirjeldus';
-$lang['img_date'] = 'Kuupäev';
-$lang['img_fname'] = 'Faili nimi';
-$lang['img_fsize'] = 'Suurus';
-$lang['img_artist'] = 'Autor';
-#$lang['img_copyr'] = '';
-$lang['img_format'] = 'Formaat';
-$lang['img_camera'] = 'Kaamera';
-$lang['img_keywords'] = 'Võtmesõnad';
-
-$lang['i_chooselang'] = 'Vali keel';
-$lang['i_installer'] = 'DokuWiki paigaldaja';
-$lang['i_wikiname'] = 'Wiki nimi';
-$lang['i_enableacl'] = 'Kas lubada kasutajate haldus (soovitatav)';
-$lang['i_superuser'] = 'Superkasutaja';
-$lang['i_problems'] = 'Paigaldaja leidis mõned vead, mis on allpool välja toodud. Enne vigade eemaldamist ei saa jätkata.';
-$lang['i_modified'] = 'Õnnetuste vältimiseks läheb see skript käima ainult värskelt paigaldatud ja muutmata Dokuwiki peal.
- Sa peaksid ilmselt kogu koodi uuesti lahti pakkima. Vaata ka <a href="http://dokuwiki.org/install">Dokuwiki installeerimis juhendit</a>';
-$lang['i_funcna'] = 'PHP funktsiooni <code>%s</code> ei ole olemas.võibolla sinu serveri hooldaja on selle mingil põhjusel keelanud?';
-$lang['i_permfail'] = 'Dokuwiki ei saa kirjutada faili <code>%s</code>. Kontrolli serveris failide õigused üle.';
-$lang['i_confexists'] = '<code>%s</code> on juba olemas';
-$lang['i_writeerr'] = 'Faili <code>%s</code> ei lubata tekitada. Kontrolli kataloogi ja faili õigusi.';
-#$lang['i_badhash'] = '';
-$lang['i_badval'] = '<code>%s</code> - lubamatu või tühi väärtus';
-$lang['i_success'] = 'Seadistamine on õnnelikult lõpule viidud. Sa võid nüüd kustutada faili install.php. Alusta oma <a href="doku.php">uue DokuWiki</a> täitmist.';
-$lang['i_failure'] = 'Konfiguratsiooni faili kirjutamisel esines vigu. Võimalik, et pead need käsitsi parandama enne <a href="doku.php">uue DokuWiki</a> täitma asumist.';
-$lang['i_policy'] = 'Wiki õiguste algne poliitika';
-$lang['i_pol0'] = 'Avatud (lugemine, kirjutamine ja üleslaadimine kõigile lubatud)';
-$lang['i_pol1'] = 'Avalikuks lugemiseks (lugeda saavad kõik, kirjutada ja üles laadida vaid registreeritud kasutajad)';
-$lang['i_pol2'] = 'Suletud (kõik õigused, kaasaarvatud lugemine on lubatud vaid registreeritud kasutajatele)';
-
-$lang['loggedinas'] = 'Logis sisse kui';
-$lang['user'] = 'Kasutaja';
-$lang['pass'] = 'Parool';
-$lang['remember'] = 'Pea mind meeles';
-$lang['fullname'] = 'Täielik nimi';
-$lang['email'] = 'E-post';
-$lang['register'] = 'Registreeri uus kasutaja';
-$lang['badlogin'] = 'Oops, Sinu kasutajanimi või parool oli vale.';
-
-$lang['regmissing'] = 'Kõik väljad tuleb ära täita.';
-$lang['reguexists'] = 'Tegelikult on sellise nimega kasutaja juba olemas.';
-$lang['regsuccess'] = 'Kasutaja sai tehtud. Parool saadeti Sulle e-posti aadressil.';
-$lang['regmailfail']= 'Ilmselt tekkis e-posti teel parooli saatmisel mingi tõrge. Palun suhtle sel teemal
+$lang['encoding'] = 'utf-8';
+$lang['direction'] = 'ltr';
+$lang['doublequoteopening'] = '„';
+$lang['doublequoteclosing'] = '“';
+$lang['singlequoteopening'] = '‚';
+$lang['singlequoteclosing'] = '‘';
+$lang['apostrophe'] = '\'';
+$lang['btn_edit'] = 'Toimeta seda lehte';
+$lang['btn_source'] = 'Näita lehepõhja';
+$lang['btn_show'] = 'Näita lehte';
+$lang['btn_create'] = 'Tekita selle lingi alla leht';
+$lang['btn_search'] = 'Otsi';
+$lang['btn_save'] = 'Salvesta';
+$lang['btn_preview'] = 'Eelvaade';
+$lang['btn_top'] = 'Tagasi lehe algusesse';
+$lang['btn_newer'] = '<< varajasemad';
+$lang['btn_older'] = '>> hilisemad';
+$lang['btn_revs'] = 'Eelmised versioonid';
+$lang['btn_recent'] = 'Viimased muudatused';
+$lang['btn_upload'] = 'Lae üles';
+$lang['btn_cancel'] = 'Katkesta';
+$lang['btn_index'] = 'Sisukord';
+$lang['btn_secedit'] = 'Toimeta';
+$lang['btn_login'] = 'Logi sisse';
+$lang['btn_logout'] = 'Logi välja';
+$lang['btn_admin'] = 'Administreeri';
+$lang['btn_update'] = 'Uuenda';
+$lang['btn_delete'] = 'Kustuta';
+$lang['btn_back'] = 'Tagasi';
+$lang['btn_backlink'] = 'Tagasilingid';
+$lang['btn_backtomedia'] = 'Tagasi faili valikusse';
+$lang['btn_subscribe'] = 'Jälgi seda lehte (teated meilile)';
+$lang['btn_profile'] = 'Minu info';
+$lang['btn_reset'] = 'Taasta';
+$lang['btn_resendpwd'] = 'Saada uus parool';
+$lang['btn_draft'] = 'Toimeta mustandit';
+$lang['btn_recover'] = 'Taata mustand';
+$lang['btn_draftdel'] = 'Kustuta mustand';
+$lang['btn_revert'] = 'Taasta';
+$lang['btn_register'] = 'Registreeri uus kasutaja';
+$lang['loggedinas'] = 'Logis sisse kui';
+$lang['user'] = 'Kasutaja';
+$lang['pass'] = 'Parool';
+$lang['newpass'] = 'Uus parool';
+$lang['oldpass'] = 'Vana parool';
+$lang['passchk'] = 'Korda uut parooli';
+$lang['remember'] = 'Pea mind meeles';
+$lang['fullname'] = 'Täielik nimi';
+$lang['email'] = 'E-post';
+$lang['profile'] = 'Kasutaja info';
+$lang['badlogin'] = 'Oops, Sinu kasutajanimi või parool oli vale.';
+$lang['minoredit'] = 'Ebaolulised muudatused';
+$lang['draftdate'] = 'Mustand automaatselt salvestatud';
+$lang['regmissing'] = 'Kõik väljad tuleb ära täita.';
+$lang['reguexists'] = 'Tegelikult on sellise nimega kasutaja juba olemas.';
+$lang['regsuccess'] = 'Kasutaja sai tehtud. Parool saadeti Sulle e-posti aadressil.';
+$lang['regsuccess2'] = 'Kasutaja sai tehtud.';
+$lang['regmailfail'] = 'Ilmselt tekkis e-posti teel parooli saatmisel mingi tõrge. Palun suhtle sel teemal
oma serveri administraatoriga!';
-$lang['regbadmail'] = 'Tundub, et Sinu antud e-posti aadress ei toimi - kui Sa arvad, et tegemist on
+$lang['regbadmail'] = 'Tundub, et Sinu antud e-posti aadress ei toimi - kui Sa arvad, et tegemist on
ekstitusega, suhtle oma serveri administraatoriga';
-$lang['regpwmail'] = 'Sinu DokuWiki parool';
-$lang['reghere'] = 'Sul ei olegi veel kasutajakontot? No aga tekita see siis endale!';
-
-$lang['txt_upload'] = 'Vali fail, mida üles laadida';
-$lang['txt_filename'] = 'Siseta oma Wikinimi (soovituslik)';
-$lang['lockedby'] = 'Praegu on selle lukustanud';
-$lang['lockexpire'] = 'Lukustus aegub';
-$lang['willexpire'] = 'Teie lukustus selle lehe toimetamisele aegub umbes minuti pärast.\nIgasugu probleemide vältimiseks kasuta eelvaate nuppu, et lukustusarvesti taas tööle panna.';
-
-$lang['js']['notsavedyet'] = "Sul on seal salvestamata muudatusi, mis kohe kõige kaduva teed lähevad.\nKas Sa ikka tahad edasi liikuda?";
-$lang['rssfailed'] = 'Sinu soovitud info ammutamisel tekkis viga: ';
-$lang['nothingfound']= 'Oops, aga mitte muhvigi ei leitud.';
-
-$lang['mediaselect'] = 'Hunnik faile';
-$lang['fileupload'] = 'Faili üleslaadimine';
-$lang['uploadsucc'] = 'Üleslaadimine läks ootuspäraselt hästi';
-$lang['uploadfail'] = 'Üleslaadimine läks nässu. Äkki pole Sa selleks lihtsalt piisavalt võimukas tegija?';
-$lang['uploadwrong'] = 'Ei saa Sa midagi üles laadida. Oops, aga seda tüüpi faili sul lihtsalt ei lubata üles laadida';
-$lang['namespaces'] = 'Alajaotus';
-$lang['mediafiles'] = 'Failid on Sulle kättesaadavad';
-
-$lang['hits'] = 'Päringu tabamused';
-$lang['quickhits'] = 'Päringule vastavad lehed';
-$lang['toc'] = 'Sisujuht';
-$lang['current'] = 'Hetkel kehtiv';
-$lang['yours'] = 'Sinu versioon';
-$lang['diff'] = 'Näita erinevusi hetkel kehtiva versiooniga';
-$lang['line'] = 'Rida';
-$lang['breadcrumb'] = 'Käidud rada';
-$lang['lastmod'] = 'Viimati muutnud';
-$lang['by'] = 'persoon';
-$lang['deleted'] = 'eemaldatud';
-$lang['created'] = 'tekitatud';
-$lang['restored'] = 'vana versioon taastatud';
-$lang['summary'] = 'kokkuvõte muudatustest';
-
-$lang['mail_newpage'] = 'leht lisatud:';
-$lang['mail_changed'] = 'leht muudetud';
-
-$lang['nosmblinks'] = 'Windowsis võrguarvutiga ühendamine toimib ainult Internet Exploreris ja
-sisevõrgus.\nAga Sa saad õnneks omale lingi kopeerida ja hiljem kuhugi kleepida.';
-
-$lang['qb_bold'] = 'Rasvane kiri';
-$lang['qb_italic'] = 'Kaldkiri';
-$lang['qb_underl'] = 'Alajoonega kiri';
-$lang['qb_code'] = 'Koodi tekst';
-$lang['qb_h1'] = '1. astme pealkiri';
-$lang['qb_h2'] = '2. astme pealkiri';
-$lang['qb_h3'] = '3. astme pealkiri';
-$lang['qb_h4'] = '4. astme pealkiri';
-$lang['qb_h5'] = '5. astme pealkiri';
-$lang['qb_link'] = 'Siselink';
-$lang['qb_extlink'] = 'Välislink';
-$lang['qb_hr'] = 'Horisontaalne vahejoon';
-$lang['qb_ol'] = 'Nummerdatud nimikiri';
-$lang['qb_ul'] = 'Mummuga nimekiri';
-$lang['qb_media'] = 'Lisa pilte ja muid faile';
-$lang['qb_sig'] = 'Lisa allkiri!';
-
-$lang['authmodfailed'] = 'Vigane kasutajate autentimise konfiguratsioon. Palun teavita sellest serveri haldajat.';
-$lang['authtempfail'] = 'Kasutajate autentimine on ajutiselt rivist väljas. Kui see olukord mõne aja jooksul ei parane, siis teavita sellest serveri haldajat.';
-
-$lang['js']['del_confirm']= 'Kas kustutame selle kirje?';
-
-#$lang['subscribe_success'] = '';
-#$lang['subscribe_error'] = '';
-#$lang['subscribe_noaddress'] = '';
-#$lang['unsubscribe_success'] = '';
-#$lang['unsubscribe_error'] = '';
-
-//Setup VIM: ex: et ts=2 :
+$lang['regbadpass'] = 'Uus parool on kirjutatud erinevalt. Proovi uuesti.';
+$lang['regpwmail'] = 'Sinu DokuWiki parool';
+$lang['reghere'] = 'Sul ei olegi veel kasutajakontot? No aga tekita see siis endale!';
+$lang['profna'] = 'Viki ei toeta profiili muudatusi';
+$lang['profnochange'] = 'Muutused puuduvad.';
+$lang['profnoempty'] = 'Tühi nimi ega meiliaadress pole lubatud.';
+$lang['profchanged'] = 'Kasutaja info edukalt muudetud';
+$lang['pwdforget'] = 'Unustasid parooli? Tee uus';
+$lang['resendna'] = 'See wiki ei toeta parooli taassaatmist.';
+$lang['resendpwd'] = 'Saada uus parool';
+$lang['resendpwdmissing'] = 'Khmm... Sa pead täitma kõik väljad.';
+$lang['resendpwdnouser'] = 'Aga sellist kasutajat ei ole.';
+$lang['resendpwdbadauth'] = 'See autentimiskood ei ole õige. Kontrolli, et kopeerisid terve lingi.';
+$lang['resendpwdconfirm'] = 'Kinnituslink saadeti meilile.';
+$lang['resendpwdsuccess'] = 'Uus parool saadeti Sinu meilile.';
+$lang['searchmedia'] = 'Otsi failinime:';
+$lang['searchmedia_in'] = 'Otsi %s';
+$lang['txt_upload'] = 'Vali fail, mida üles laadida';
+$lang['txt_filename'] = 'Siseta oma Wikinimi (soovituslik)';
+$lang['txt_overwrt'] = 'Kirjutan olemasoleva faili üle';
+$lang['lockedby'] = 'Praegu on selle lukustanud';
+$lang['lockexpire'] = 'Lukustus aegub';
+$lang['willexpire'] = 'Teie lukustus selle lehe toimetamisele aegub umbes minuti pärast.\nIgasugu probleemide vältimiseks kasuta eelvaate nuppu, et lukustusarvesti taas tööle panna.';
+$lang['js']['notsavedyet'] = 'Sul on seal salvestamata muudatusi, mis kohe kõige kaduva teed lähevad.
+Kas Sa ikka tahad edasi liikuda?';
+$lang['js']['searchmedia'] = 'Otsi faile';
+$lang['js']['keepopen'] = 'Jäta aken peale valiku sooritamist avatuks';
+$lang['js']['hidedetails'] = 'Peida detailid';
+$lang['js']['mediatitle'] = 'Lingi sätted';
+$lang['js']['mediadisplay'] = 'Lingi liik';
+$lang['js']['mediaalign'] = 'Joondus';
+$lang['js']['mediasize'] = 'Pildi mõõtmed';
+$lang['js']['mediatarget'] = 'Lingi siht';
+$lang['js']['mediaclose'] = 'Sulge';
+$lang['js']['mediainsert'] = 'Sisesta';
+$lang['js']['mediadisplayimg'] = 'Näita pilti.';
+$lang['js']['mediadisplaylnk'] = 'Näita ainult linki.';
+$lang['js']['mediasmall'] = 'Väiksem suurus';
+$lang['js']['mediamedium'] = 'Keskmine suurus';
+$lang['js']['medialarge'] = 'Suurem suurus';
+$lang['js']['mediaoriginal'] = 'Originaali suurus';
+$lang['js']['medialnk'] = 'Link üksikasjadele';
+$lang['js']['mediadirect'] = 'Otselink originaalile';
+$lang['js']['medianolnk'] = 'Ilma lingita';
+$lang['js']['medianolink'] = 'Ära lingi pilti';
+$lang['js']['medialeft'] = 'Joonda pilt vasakule.';
+$lang['js']['mediaright'] = 'Joonda pilt paremale.';
+$lang['js']['mediacenter'] = 'Joonda pilt keskele.';
+$lang['js']['medianoalign'] = 'Ära joonda.';
+$lang['js']['nosmblinks'] = 'Lingid \'Windows shares\'ile töötab ainult Microsoft Internet Exploreriga.
+Siiski võid kopeerida ja asetada lingi.';
+$lang['js']['linkwiz'] = 'Lingi nõustaja';
+$lang['js']['linkto'] = 'Lingi:';
+$lang['js']['del_confirm'] = 'Kas kustutame selle kirje?';
+$lang['js']['mu_btn'] = 'Laadi üles mittu faili';
+$lang['rssfailed'] = 'Sinu soovitud info ammutamisel tekkis viga: ';
+$lang['nothingfound'] = 'Oops, aga mitte muhvigi ei leitud.';
+$lang['mediaselect'] = 'Hunnik faile';
+$lang['fileupload'] = 'Faili üleslaadimine';
+$lang['uploadsucc'] = 'Üleslaadimine läks ootuspäraselt hästi';
+$lang['uploadfail'] = 'Üleslaadimine läks nässu. Äkki pole Sa selleks lihtsalt piisavalt võimukas tegija?';
+$lang['uploadwrong'] = 'Ei saa Sa midagi üles laadida. Oops, aga seda tüüpi faili sul lihtsalt ei lubata üles laadida';
+$lang['uploadexist'] = 'Fail on juba olemas. Midagi ei muudetud.';
+$lang['uploadbadcontent'] = 'Üles laaditu ei sobinud %s faililaiendiga.';
+$lang['uploadsize'] = 'Üles laaditud fail on liiga suur (maksimaalne suurus on %s).';
+$lang['deletesucc'] = 'Fail nimega "%s" sai kustutatud.';
+$lang['deletefail'] = 'Faili nimega "%s" ei kustutatud (kontrolli õigusi).';
+$lang['mediainuse'] = 'Faili nimega "%s" ei kustutatud, sest see on kasutuses.';
+$lang['namespaces'] = 'Alajaotus';
+$lang['mediafiles'] = 'Failid on Sulle kättesaadavad';
+$lang['accessdenied'] = 'Ligipääs keelatud.';
+$lang['mediausage'] = 'Kasuta järgmist kirjapilti sellele failile viitamaks:';
+$lang['mediaview'] = 'Vaata faili algsel kujul.';
+$lang['mediaroot'] = 'juur';
+$lang['mediaupload'] = 'Lae fail sellesse nimeruumi (kataloogi). Et tekitada veel alam nimeruum kasuta koolonit Wiki nimes.';
+$lang['mediaextchange'] = 'Faili laiend .%s-st %s-ks!';
+$lang['reference'] = 'Viited';
+$lang['ref_inuse'] = 'Seda faili ei saa kustutada, sest teda kasutavad järgmised lehed:';
+$lang['ref_hidden'] = 'Mõned viidad failile on lehtedel, millele sul ei ole ligipääsu';
+$lang['hits'] = 'Päringu tabamused';
+$lang['quickhits'] = 'Päringule vastavad lehed';
+$lang['toc'] = 'Sisujuht';
+$lang['current'] = 'Hetkel kehtiv';
+$lang['yours'] = 'Sinu versioon';
+$lang['diff'] = 'Näita erinevusi hetkel kehtiva versiooniga';
+$lang['diff2'] = 'Näita valitud versioonide erinevusi';
+$lang['difflink'] = 'Lõlita võrdlemise vaatele';
+$lang['diff_type'] = 'Vaata erinevusi:';
+$lang['diff_side'] = 'Kõrvuti';
+$lang['line'] = 'Rida';
+$lang['breadcrumb'] = 'Käidud rada';
+$lang['youarehere'] = 'Sa oled siin';
+$lang['lastmod'] = 'Viimati muutnud';
+$lang['by'] = 'persoon';
+$lang['deleted'] = 'eemaldatud';
+$lang['created'] = 'tekitatud';
+$lang['restored'] = 'vana versioon taastatud';
+$lang['external_edit'] = 'väline muutmine';
+$lang['summary'] = 'kokkuvõte muudatustest';
+$lang['mail_newpage'] = 'leht lisatud:';
+$lang['mail_changed'] = 'leht muudetud';
+$lang['mail_new_user'] = 'Uus kasutaja:';
+$lang['qb_bold'] = 'Rasvane kiri';
+$lang['qb_italic'] = 'Kaldkiri';
+$lang['qb_underl'] = 'Alajoonega kiri';
+$lang['qb_code'] = 'Koodi tekst';
+$lang['qb_strike'] = 'Läbijoonitud tekst';
+$lang['qb_h1'] = '1. astme pealkiri';
+$lang['qb_h2'] = '2. astme pealkiri';
+$lang['qb_h3'] = '3. astme pealkiri';
+$lang['qb_h4'] = '4. astme pealkiri';
+$lang['qb_h5'] = '5. astme pealkiri';
+$lang['qb_h'] = 'Pealkiri';
+$lang['qb_hs'] = 'Vali pealkiri';
+$lang['qb_hplus'] = 'Kõrgem pealkiri';
+$lang['qb_hminus'] = 'Madalam pealkiri';
+$lang['qb_hequal'] = 'Sama taseme pealkiri';
+$lang['qb_link'] = 'Siselink';
+$lang['qb_extlink'] = 'Välislink';
+$lang['qb_hr'] = 'Horisontaalne vahejoon';
+$lang['qb_ol'] = 'Nummerdatud nimikiri';
+$lang['qb_ul'] = 'Mummuga nimekiri';
+$lang['qb_media'] = 'Lisa pilte ja muid faile';
+$lang['qb_sig'] = 'Lisa allkiri!';
+$lang['qb_smileys'] = 'Emotikonid';
+$lang['qb_chars'] = 'Erisümbolid';
+$lang['admin_register'] = 'Lisa kasutaja';
+$lang['metaedit'] = 'Muuda lisainfot';
+$lang['metasaveerr'] = 'Lisainfo salvestamine läks untsu.';
+$lang['metasaveok'] = 'Lisainfo salvestatud';
+$lang['img_backto'] = 'Tagasi';
+$lang['img_title'] = 'Tiitel';
+$lang['img_caption'] = 'Kirjeldus';
+$lang['img_date'] = 'Kuupäev';
+$lang['img_fname'] = 'Faili nimi';
+$lang['img_fsize'] = 'Suurus';
+$lang['img_artist'] = 'Autor';
+$lang['img_copyr'] = 'Autoriõigused';
+$lang['img_format'] = 'Formaat';
+$lang['img_camera'] = 'Kaamera';
+$lang['img_keywords'] = 'Võtmesõnad';
+$lang['authmodfailed'] = 'Vigane kasutajate autentimise konfiguratsioon. Palun teavita sellest serveri haldajat.';
+$lang['authtempfail'] = 'Kasutajate autentimine on ajutiselt rivist väljas. Kui see olukord mõne aja jooksul ei parane, siis teavita sellest serveri haldajat.';
+$lang['i_chooselang'] = 'Vali keel';
+$lang['i_installer'] = 'DokuWiki paigaldaja';
+$lang['i_wikiname'] = 'Wiki nimi';
+$lang['i_enableacl'] = 'Kas lubada kasutajate haldus (soovitatav)';
+$lang['i_superuser'] = 'Superkasutaja';
+$lang['i_problems'] = 'Paigaldaja leidis mõned vead, mis on allpool välja toodud. Enne vigade eemaldamist ei saa jätkata.';
+$lang['i_modified'] = 'Õnnetuste vältimiseks läheb see skript käima ainult värskelt paigaldatud ja muutmata Dokuwiki peal.
+ Sa peaksid ilmselt kogu koodi uuesti lahti pakkima. Vaata ka <a href="http://dokuwiki.org/install">Dokuwiki installeerimis juhendit</a>';
+$lang['i_funcna'] = 'PHP funktsiooni <code>%s</code> ei ole olemas.võibolla sinu serveri hooldaja on selle mingil põhjusel keelanud?';
+$lang['i_permfail'] = 'Dokuwiki ei saa kirjutada faili <code>%s</code>. Kontrolli serveris failide õigused üle.';
+$lang['i_confexists'] = '<code>%s</code> on juba olemas';
+$lang['i_writeerr'] = 'Faili <code>%s</code> ei lubata tekitada. Kontrolli kataloogi ja faili õigusi.';
+$lang['i_badval'] = '<code>%s</code> - lubamatu või tühi väärtus';
+$lang['i_success'] = 'Seadistamine on õnnelikult lõpule viidud. Sa võid nüüd kustutada faili install.php. Alusta oma <a href="doku.php">uue DokuWiki</a> täitmist.';
+$lang['i_failure'] = 'Konfiguratsiooni faili kirjutamisel esines vigu. Võimalik, et pead need käsitsi parandama enne <a href="doku.php">uue DokuWiki</a> täitma asumist.';
+$lang['i_policy'] = 'Wiki õiguste algne poliitika';
+$lang['i_pol0'] = 'Avatud (lugemine, kirjutamine ja üleslaadimine kõigile lubatud)';
+$lang['i_pol1'] = 'Avalikuks lugemiseks (lugeda saavad kõik, kirjutada ja üles laadida vaid registreeritud kasutajad)';
+$lang['i_pol2'] = 'Suletud (kõik õigused, kaasaarvatud lugemine on lubatud vaid registreeritud kasutajatele)';
+$lang['i_retry'] = 'Proovi uuesti';
+$lang['mu_gridname'] = 'Failinimi';
+$lang['mu_gridsize'] = 'Suurus';
+$lang['mu_gridstat'] = 'Staatus';
+$lang['mu_browse'] = 'Sirvi';
+$lang['mu_toobig'] = 'liiga suur';
+$lang['mu_ready'] = 'valmis üleslaadimiseks';
+$lang['mu_done'] = 'valmis';
+$lang['mu_fail'] = 'ebaõnnestus';
+$lang['mu_lasterr'] = 'Viimane viga:';
diff --git a/inc/lang/eu/lang.php b/inc/lang/eu/lang.php
index 2efec00be..e49290e5e 100644
--- a/inc/lang/eu/lang.php
+++ b/inc/lang/eu/lang.php
@@ -45,6 +45,7 @@ $lang['btn_draft'] = 'Editatu zirriborroa';
$lang['btn_recover'] = 'Berreskuratu zirriborroa';
$lang['btn_draftdel'] = 'Ezabatu zirriborroa';
$lang['btn_revert'] = 'Berrezarri';
+$lang['btn_register'] = 'Erregistratu';
$lang['loggedinas'] = 'Erabiltzailea';
$lang['user'] = 'Erabiltzailea';
$lang['pass'] = 'Pasahitza';
@@ -54,7 +55,6 @@ $lang['passchk'] = 'berriz';
$lang['remember'] = 'Gogoratu';
$lang['fullname'] = 'Izen Deiturak';
$lang['email'] = 'E-Maila';
-$lang['register'] = 'Erregistratu';
$lang['profile'] = 'Erabiltzaile Profila';
$lang['badlogin'] = 'Barkatu, prozesuak huts egin du; saiatu berriz';
$lang['minoredit'] = 'Aldaketa Txikiak';
@@ -157,6 +157,9 @@ $lang['yours'] = 'Zure Bertsioa';
$lang['diff'] = 'egungo bertsioarekin dituen aldaketak aurkezten ditu';
$lang['diff2'] = 'Erakutsi desberdintasunak aukeratutako bertsioen artean';
$lang['difflink'] = 'Estekatu konparaketa bista honetara';
+$lang['diff_type'] = 'Ikusi diferentziak:';
+$lang['diff_inline'] = 'Lerro tartean';
+$lang['diff_side'] = 'Ondoz ondo';
$lang['line'] = 'Marra';
$lang['breadcrumb'] = 'Traza';
$lang['youarehere'] = 'Hemen zaude';
diff --git a/inc/lang/fa/lang.php b/inc/lang/fa/lang.php
index c5be8e1c0..96374b409 100644
--- a/inc/lang/fa/lang.php
+++ b/inc/lang/fa/lang.php
@@ -10,7 +10,6 @@
* @url http://svn.wikimedia.org/viewvc/mediawiki/trunk/phase3/languages/messages/MessagesFa.php?view=co
* @author behrad eslamifar <behrad_es@yahoo.com)
* @author Mohsen Firoozmandan <info@mambolearn.com>
- * @author omidmr@gmail.com
* @author Omid Mottaghi <omidmr@gmail.com>
* @author Mohammad Reza Shoaei <shoaei@gmail.com>
*/
@@ -53,6 +52,7 @@ $lang['btn_draft'] = 'ویرایش پیش‌نویس';
$lang['btn_recover'] = 'بازیابی پیش‌نویس';
$lang['btn_draftdel'] = 'حذف پیش‌نویس';
$lang['btn_revert'] = 'بازیابی';
+$lang['btn_register'] = 'یک حساب جدید بسازید';
$lang['loggedinas'] = 'به عنوان کاربر روبرو وارد شده‌اید:';
$lang['user'] = 'نام کاربری:';
$lang['pass'] = 'گذرواژه‌ی شما';
@@ -62,7 +62,6 @@ $lang['passchk'] = 'گذرواژه را دوباره وارد کن
$lang['remember'] = 'گذرواژه را به یاد بسپار.';
$lang['fullname'] = '*نام واقعی شما';
$lang['email'] = 'ایمیل شما*';
-$lang['register'] = 'یک حساب جدید بسازید';
$lang['profile'] = 'پروفایل کاربر';
$lang['badlogin'] = 'خطا در ورود به سیستم';
$lang['minoredit'] = 'این ویرایش خُرد است';
@@ -165,6 +164,9 @@ $lang['yours'] = 'نسخه‌ی شما';
$lang['diff'] = 'تفاوت‌ها را با نگارش کنونی نمایش بده.';
$lang['diff2'] = 'تفاوت‌ها را با نگارش انتخابی نمایش بده.';
$lang['difflink'] = 'پیوند به صفحه‌ی تفاوت‌ها';
+$lang['diff_type'] = 'مشاهده تغییرات:';
+$lang['diff_inline'] = 'خطی';
+$lang['diff_side'] = 'کلی';
$lang['line'] = 'خط';
$lang['breadcrumb'] = 'ردپا';
$lang['youarehere'] = 'محل شما';
diff --git a/inc/lang/fi/lang.php b/inc/lang/fi/lang.php
index 2b1ddfa6f..cce597fe7 100644
--- a/inc/lang/fi/lang.php
+++ b/inc/lang/fi/lang.php
@@ -5,9 +5,9 @@
* @license GPL 2 (http://www.gnu.org/licenses/gpl.html)
* @author Petteri <petteri@gmail.com>
* @author Matti Pöllä <mpo@iki.fi>
- * @author otto@valjakko.net
* @author Otto Vainio <otto@valjakko.net>
* @author Teemu Mattila <ghcsystems@gmail.com>
+ * @author Sami Olmari <sami@olmari.fi>
*/
$lang['encoding'] = 'utf-8';
$lang['direction'] = 'ltr';
@@ -48,6 +48,7 @@ $lang['btn_draft'] = 'Muokkaa luonnosta';
$lang['btn_recover'] = 'Palauta luonnos';
$lang['btn_draftdel'] = 'Poista luonnos';
$lang['btn_revert'] = 'palauta';
+$lang['btn_register'] = 'Rekisteröidy';
$lang['loggedinas'] = 'Kirjautunut nimellä';
$lang['user'] = 'Käyttäjänimi';
$lang['pass'] = 'Salasana';
@@ -57,7 +58,6 @@ $lang['passchk'] = 'uudelleen';
$lang['remember'] = 'Muista minut';
$lang['fullname'] = 'Koko nimi';
$lang['email'] = 'Sähköposti';
-$lang['register'] = 'Rekisteröidy';
$lang['profile'] = 'Käyttäjän profiili';
$lang['badlogin'] = 'Käyttäjänimi tai salasana oli väärä.';
$lang['minoredit'] = 'Pieni muutos';
@@ -160,6 +160,9 @@ $lang['yours'] = 'Sinun versiosi';
$lang['diff'] = 'Näytä eroavaisuudet nykyiseen versioon';
$lang['diff2'] = 'Näytä eroavaisuudet valittuun versioon';
$lang['difflink'] = 'Linkki vertailunäkymään';
+$lang['diff_type'] = 'Näytä eroavaisuudet:';
+$lang['diff_inline'] = 'Sisäkkäin';
+$lang['diff_side'] = 'Vierekkäin';
$lang['line'] = 'Rivi';
$lang['breadcrumb'] = 'Jäljet';
$lang['youarehere'] = 'Olet täällä';
diff --git a/inc/lang/fo/lang.php b/inc/lang/fo/lang.php
index 2bc5c3d53..3d4d0455b 100644
--- a/inc/lang/fo/lang.php
+++ b/inc/lang/fo/lang.php
@@ -4,7 +4,7 @@
*
* @license GPL 2 (http://www.gnu.org/licenses/gpl.html)
* @author Poul J. Clementsen <poul@diku.dk>
- * @author Einar Petersen einar.petersen@gmail.com
+ * @author Einar Petersen <einar.petersen@gmail.com>
*/
$lang['encoding'] = 'utf-8';
$lang['direction'] = 'ltr';
@@ -45,6 +45,7 @@ $lang['btn_draft'] = 'Broyt kladdu';
$lang['btn_recover'] = 'Endurbygg kladdu';
$lang['btn_draftdel'] = 'Sletta';
$lang['btn_revert'] = 'Endurbygg';
+$lang['btn_register'] = 'Melda til';
$lang['loggedinas'] = 'Ritavur inn sum';
$lang['user'] = 'Brúkaranavn';
$lang['pass'] = 'Loyniorð';
@@ -54,7 +55,6 @@ $lang['passchk'] = 'Endurtak nýtt loyniorð';
$lang['remember'] = 'Minst til loyniorðið hjá mær';
$lang['fullname'] = 'Navn';
$lang['email'] = 'T-postur';
-$lang['register'] = 'Melda til';
$lang['profile'] = 'Brúkara vangamynd';
$lang['badlogin'] = 'Skeivt brúkaranavn ella loyniorð.';
$lang['minoredit'] = 'Smærri broytingar';
diff --git a/inc/lang/fr/lang.php b/inc/lang/fr/lang.php
index 76e1271bd..047019baf 100644
--- a/inc/lang/fr/lang.php
+++ b/inc/lang/fr/lang.php
@@ -12,7 +12,6 @@
* @author Stéphane Chamberland <stephane.chamberland@ec.gc.ca>
* @author Delassaux Julien <julien@delassaux.fr>
* @author Maurice A. LeBlanc <leblancma@cooptel.qc.ca>
- * @author gb@isis.u-strasbg.fr
* @author stephane.gully@gmail.com
* @author Guillaume Turri <guillaume.turri@gmail.com>
* @author Erik Pedersen <erik.pedersen@shaw.ca>
@@ -20,7 +19,9 @@
* @author Vincent Feltz <psycho@feltzv.fr>
* @author Philippe Bajoit <philippe.bajoit@gmail.com>
* @author Florian Gaub <floriang@floriang.net>
- * @author Samuel Dorsaz samuel.dorsaz@novelion.net
+ * @author Samuel Dorsaz <samuel.dorsaz@novelion.net>
+ * @author Johan Guilbaud <guilbaud.johan@gmail.com>
+ * @author schplurtz@laposte.net
*/
$lang['encoding'] = 'utf-8';
$lang['direction'] = 'ltr';
@@ -61,6 +62,7 @@ $lang['btn_draft'] = 'Modifier le brouillon';
$lang['btn_recover'] = 'Récupérer le brouillon';
$lang['btn_draftdel'] = 'Effacer le brouillon';
$lang['btn_revert'] = 'Restaurer';
+$lang['btn_register'] = 'S\'enregistrer';
$lang['loggedinas'] = 'Connecté en tant que ';
$lang['user'] = 'Utilisateur';
$lang['pass'] = 'Mot de passe';
@@ -70,7 +72,6 @@ $lang['passchk'] = 'Répéter nouveau mot de passe';
$lang['remember'] = 'Mémoriser';
$lang['fullname'] = 'Nom';
$lang['email'] = 'Adresse de courriel';
-$lang['register'] = 'S\'enregistrer';
$lang['profile'] = 'Profil utilisateur';
$lang['badlogin'] = 'L\'utilisateur ou le mot de passe est incorrect.';
$lang['minoredit'] = 'Modification mineure';
@@ -121,10 +122,10 @@ $lang['js']['mediaclose'] = 'Fermer';
$lang['js']['mediainsert'] = 'Insérer';
$lang['js']['mediadisplayimg'] = 'Afficher l\'image.';
$lang['js']['mediadisplaylnk'] = 'N\'afficher que le lien.';
-$lang['js']['mediasmall'] = 'Petite version';
-$lang['js']['mediamedium'] = 'Version moyenne';
-$lang['js']['medialarge'] = 'Grande version';
-$lang['js']['mediaoriginal'] = 'Version originale';
+$lang['js']['mediasmall'] = 'Petite taille';
+$lang['js']['mediamedium'] = 'taille moyenne';
+$lang['js']['medialarge'] = 'Grande taille';
+$lang['js']['mediaoriginal'] = 'taille d\'origine';
$lang['js']['medialnk'] = 'Lien vers la page de détail';
$lang['js']['mediadirect'] = 'Lien direct vers l\'original';
$lang['js']['medianolnk'] = 'Aucun lien';
@@ -173,6 +174,9 @@ $lang['yours'] = 'Votre version';
$lang['diff'] = 'Différences avec la version actuelle';
$lang['diff2'] = 'Différences entre les versions sélectionnées';
$lang['difflink'] = 'Lien vers cette vue';
+$lang['diff_type'] = 'Voir les différences :';
+$lang['diff_inline'] = 'Sur une seule ligne';
+$lang['diff_side'] = 'Côte à côte';
$lang['line'] = 'Ligne';
$lang['breadcrumb'] = 'Piste';
$lang['youarehere'] = 'Vous êtes ici';
diff --git a/inc/lang/gl/lang.php b/inc/lang/gl/lang.php
index 9f1b48173..37cf55d22 100644
--- a/inc/lang/gl/lang.php
+++ b/inc/lang/gl/lang.php
@@ -44,6 +44,7 @@ $lang['btn_draft'] = 'Editar borrador';
$lang['btn_recover'] = 'Recuperar borrador';
$lang['btn_draftdel'] = 'Eliminar borrador';
$lang['btn_revert'] = 'Restaurar';
+$lang['btn_register'] = 'Rexístrate';
$lang['loggedinas'] = 'Iniciaches sesión como';
$lang['user'] = 'Nome de Usuario';
$lang['pass'] = 'Contrasinal';
@@ -53,7 +54,6 @@ $lang['passchk'] = 'de novo';
$lang['remember'] = 'Lémbrame';
$lang['fullname'] = 'Nome Completo';
$lang['email'] = 'Correo-e';
-$lang['register'] = 'Rexístrate';
$lang['profile'] = 'Perfil de Usuario';
$lang['badlogin'] = 'Sentímolo, mais o nome de usuario ou o contrasinal non son correctos.';
$lang['minoredit'] = 'Trocos Menores';
diff --git a/inc/lang/he/conflict.txt b/inc/lang/he/conflict.txt
index d27a78559..c1cccdfcf 100644
--- a/inc/lang/he/conflict.txt
+++ b/inc/lang/he/conflict.txt
@@ -1,6 +1,6 @@
-====== גירסה עדכנית יותר של הקובץ קיימת ======
+====== קיימת גרסה עדכנית יותר של הקובץ ======
-גירסה עדכנית יותר של המסמך קיימת. דבר זה קורה כאשר משתמש אחר שינה את המסמך בזמן שערכת אותו.
+ישנה גרסה עדכנית יותר של המסמך. מצב כזה קורה כאשר משתמש אחר שינה את המסמך בזמן שערכת אותו.
-מומלץ לעיין בהבדלים תחת הודעה ולאחר מכן להחליט איזו גירסה כדאי לשמור. לחיצה על הכפתור "שמור" תשמור את הגרסה שערכת. לחיצה על הכפתור "בטל" תשמור את הגרסה הקיימת.
+מומלץ לעיין בהבדלים המופיעים להלן ולאחר מכן להחליט איזו גרסה כדאי לשמור. לחיצה על הכפתור "שמירה" תשמור את הגרסה שערכת. לחיצה על הכפתור "ביטול" תשמור את הגרסה הקיימת.
diff --git a/inc/lang/he/denied.txt b/inc/lang/he/denied.txt
index 34c8417b4..a366fc198 100644
--- a/inc/lang/he/denied.txt
+++ b/inc/lang/he/denied.txt
@@ -1,3 +1,3 @@
====== הרשאה נדחתה ======
-אנו מצטערים אך אין לך הרשאות מתאימות כדי להמשיך. אולי שכחת להכנס למערכת? \ No newline at end of file
+אנו מצטערים אך אין לך הרשאות מתאימות כדי להמשיך. אולי שכחת להיכנס למערכת? \ No newline at end of file
diff --git a/inc/lang/he/draft.txt b/inc/lang/he/draft.txt
index 22fc88d9f..b999cc187 100644
--- a/inc/lang/he/draft.txt
+++ b/inc/lang/he/draft.txt
@@ -1,5 +1,5 @@
-====== נמצא קובץ טיוטא ======
+====== נמצא קובץ טיוטה ======
-העריכה האחרונה שבוצעה לדף זה לא הסתימה כהלכה. DokuWiki שמר באופן אוטומטי טיוטה של העבודה ובאפשרותך להשתמש בה כדי להמשיך את העריכה. ניתן לראות מטה את המידע שנשמר מהפעם הקודמת.
+העריכה האחרונה שבוצעה לדף זה לא הושלמה כראוי. DokuWiki שמר באופן אוטומטי טיוטה של העבודה ובאפשרותך להשתמש בה כדי להמשיך את העריכה. ניתן לראות להלן את הנתונים שנשמרו מהפעם הקודמת.
באפשרותך לבחור ב//שחזור הטיוטה// של אותה עריכה //מחיקת הטיוטה// או //ביטול// העריכה כליל. \ No newline at end of file
diff --git a/inc/lang/he/edit.txt b/inc/lang/he/edit.txt
index 4d8151e9d..74b3cefeb 100644
--- a/inc/lang/he/edit.txt
+++ b/inc/lang/he/edit.txt
@@ -1 +1 @@
-עריכת הדף ולחיצה על הכפתור "שמור" תעדכן את תוכנו. מומלץ לעיין בדף ה[[wiki:syntax|תחביר]] כדי להכיר את כללי תחביר הויקי. נא לערוך את הדף רק אם הדבר נעשה כדי **לשפר** אותו. אם העריכה היא לצורך התנסות מומלץ לבקר ב[[playground:playground|ארגז החול]].
+עריכת הדף ולחיצה על הלחצן "שמירה" תעדכן את תוכנו. מומלץ לעיין בדף ה[[wiki:syntax|תחביר]] כדי להכיר את כללי תחביר הוויקי. נא לערוך את הדף רק אם הדבר נעשה כדי **לשפר** אותו. אם העריכה היא לצורך התנסות מומלץ לבקר ב[[playground:playground|ארגז החול]].
diff --git a/inc/lang/he/editrev.txt b/inc/lang/he/editrev.txt
index a6c755cba..e33001fa3 100644
--- a/inc/lang/he/editrev.txt
+++ b/inc/lang/he/editrev.txt
@@ -1,2 +1,2 @@
-**הדף שנפתח הוא גרסה ישנה של המסמך!** לחיצה על הכפתור "שמור" תשחזר את המסמך לגרסה המוצגת כעת.
+**הדף שנפתח הוא גרסה ישנה של המסמך!** לחיצה על הלחצן "שמירה" תשחזר את המסמך לגרסה המוצגת כעת.
---- \ No newline at end of file
diff --git a/inc/lang/he/index.txt b/inc/lang/he/index.txt
index 12b7a960e..4b0623f84 100644
--- a/inc/lang/he/index.txt
+++ b/inc/lang/he/index.txt
@@ -1,4 +1,4 @@
-====== אינדקס ======
+====== מפת אתר ======
-זהו קובץ אינדקס הנמצא מעל לכל הדפים המאורגנים ב[[ויקי:דוקיוויקי]].
+זהו קובץ מפת אתר הנמצא מעל לכל הדפים המאורגנים ב[[ויקי:דוקיוויקי]].
diff --git a/inc/lang/he/install.html b/inc/lang/he/install.html
index 7831623c9..3832fb5fb 100644
--- a/inc/lang/he/install.html
+++ b/inc/lang/he/install.html
@@ -1,13 +1,13 @@
-<p>דף זה מסייע להתקנה וההגדרה הראשוניות של
-<a href="http://dokuwiki.org">Dokuwiki</a>. מידע נוסף על מתקין זה זמין בדף
+<p>דף זה מסייע בהליכי ההתקנה וההגדרה הראשוניים של
+<a href="http://dokuwiki.org">Dokuwiki</a>. מידע נוסף על תכנית התקנה זו זמין בדף
<a href="http://dokuwiki.org/installer">התיעוד שלו</a>.</p>
-<p>DokuWiki עושה שימוש בקבצים רגילים לשמירת דפי ויקי ומידע נוסף הקשור לדפים אלו (לדוגמה תמונות, רשימות חיפוש, גרסאות קודמות וכו').
-לתפקוד תקין DokuWiki <strong>חייב</strong> גישה לכתיבה לתיקיות המכילות קבצים אלו. מתקין זה אינו יכול לקבוע הרשאות לתיקיות.
-פעולה זו צריכה בד"כ להתבצע ישירות משורת הפקודה או במקרה שנעשה שימוש בשרת מארח דרך FTP או מנשק הניהול של המארח (cPanell לדוגמה).</p>
+<p>DokuWiki עושה שימוש בקבצים רגילים לשמירת דפי ויקי ומידע נוסף הקשור לדפים אלו (לדוגמה: תמונות, רשימות חיפוש, גרסאות קודמות וכו׳).
+לצורך תפקוד תקין DokuWiki <strong>חייב</strong> גישה לכתיבה לתיקיות המכילות קבצים אלו. תכנית התקנה זו אינה יכולה להגדיר הרשאות לתיקיות.
+פעולה זו צריכה בד״כ להתבצע ישירות משורת הפקודה או במקרה שנעשה שימוש בשרת מארח דרך FTP או מנשק הניהול של המארח (cPanell לדוגמה).</p>
-<p>מתקין זה יגדיר את תצורת ה-<acronym title="access control list">ACL</acronym> ב-DokuWiki שלך
+<p>מתקין זה יגדיר את תצורת ה־<acronym title="access control list">ACL</acronym> ב-DokuWiki שלך
, זה בתורו מאפשר גישת מנהל לתפריט הניהול של DokuWiki כדי להתקין הרחבות, לנהל משתמשים, לנהל גישות לדפי ויקי ושינויים בהגדרות התצורה.
-אין הוא הכרחי לתפקוד DokuWiki אך הוא יהפוך את Dokuwiki קל יותר לניהול.</p>
+אין הוא הכרחי לתפקוד DokuWiki אך הוא יהפוך את Dokuwiki לפשוט יותר לניהול.</p>
-<p>על משתמשים מנוסים או כאלו עם דרישות מיוחדות להתקנה להשתמש בקישורים אלו לפרטים בנוגע ל<a href="http://dokuwiki.org/install">הוראות התקנה</a> ו<a href="http://dokuwiki.org/config">הגדרות תצורה</a>.</p>
+<p>על משתמשים מנוסים או כאלו עם דרישות מיוחדות להתקנה להשתמש בקישורים אלו לפרטים בנוגע ל<a href="http://dokuwiki.org/install">הוראות התקנה</a> ול<a href="http://dokuwiki.org/config">הגדרות תצורה</a>.</p>
diff --git a/inc/lang/he/lang.php b/inc/lang/he/lang.php
index a411764d2..1a47ebcb8 100644
--- a/inc/lang/he/lang.php
+++ b/inc/lang/he/lang.php
@@ -6,10 +6,10 @@
* @link http://sourceforge.net/projects/hebdokuwiki/
* @author גיא שפר <guysoft@ort.org.il>
* @author Denis Simakov <akinoame1@gmail.com>
- * @author DoK <kamberd@yahoo.com>
* @author Dotan Kamber <kamberd@yahoo.com>
* @author Moshe Kaplan <mokplan@gmail.com>
* @author Yaron Yogev <yaronyogev@gmail.com>
+ * @author Yaron Shahrabani <sh.yaron@gmail.com>
*/
$lang['encoding'] = 'utf-8';
$lang['direction'] = 'rtl';
@@ -18,132 +18,153 @@ $lang['doublequoteclosing'] = '”';
$lang['singlequoteopening'] = '‘';
$lang['singlequoteclosing'] = '’';
$lang['apostrophe'] = '\'';
-$lang['btn_edit'] = 'עריכה';
-$lang['btn_source'] = 'הצג את מקור הדף';
-$lang['btn_show'] = 'הצג דף';
+$lang['btn_edit'] = 'עריכת דף זה';
+$lang['btn_source'] = 'הצגת מקור הדף';
+$lang['btn_show'] = 'הצגת דף';
$lang['btn_create'] = 'יצירת דף';
-$lang['btn_search'] = 'חפש';
-$lang['btn_save'] = 'שמור';
+$lang['btn_search'] = 'חיפוש';
+$lang['btn_save'] = 'שמירה';
$lang['btn_preview'] = 'תצוגה מקדימה';
-$lang['btn_top'] = 'חזור למעלה';
-$lang['btn_newer'] = '<< יותר חדש';
-$lang['btn_older'] = 'פחות חדש >>';
+$lang['btn_top'] = 'חזרה למעלה';
+$lang['btn_newer'] = '<< חדש יותר';
+$lang['btn_older'] = 'פחות חדש >>';
$lang['btn_revs'] = 'גרסאות קודמות';
$lang['btn_recent'] = 'שינויים אחרונים';
-$lang['btn_upload'] = 'העלה';
-$lang['btn_cancel'] = 'בטל';
-$lang['btn_index'] = 'אינדקס';
+$lang['btn_upload'] = 'העלאה';
+$lang['btn_cancel'] = 'ביטול';
+$lang['btn_index'] = 'מפת האתר';
$lang['btn_secedit'] = 'עריכה';
$lang['btn_login'] = 'כניסה';
$lang['btn_logout'] = 'יציאה';
-$lang['btn_admin'] = 'מנהל';
-$lang['btn_update'] = 'עדכן';
-$lang['btn_delete'] = 'מחק';
-$lang['btn_back'] = 'חזור';
+$lang['btn_admin'] = 'ניהול';
+$lang['btn_update'] = 'עדכון';
+$lang['btn_delete'] = 'מחיקה';
+$lang['btn_back'] = 'חזרה';
$lang['btn_backlink'] = 'קישורים לכאן';
-$lang['btn_backtomedia'] = 'לחזור לבחירת קובץ מדיה';
-$lang['btn_subscribe'] = 'עקוב אחרי שינוים';
-$lang['btn_unsubscribe'] = 'הפסק לעקוב';
-$lang['btn_subscribens'] = 'הרשמה לשינויים במרחב השם';
-$lang['btn_unsubscribens'] = 'הסרת הרשמה לשינויים במחב השם';
-$lang['btn_profile'] = 'עדכן פרופיל';
+$lang['btn_backtomedia'] = 'חזרה לבחירת קובץ מדיה';
+$lang['btn_subscribe'] = 'מעקב אחרי שינוים';
+$lang['btn_profile'] = 'עדכון הפרופיל';
$lang['btn_reset'] = 'איפוס';
-$lang['btn_resendpwd'] = 'שלח סיסמה חדשה';
+$lang['btn_resendpwd'] = 'שליחת ססמה חדשה';
$lang['btn_draft'] = 'עריכת טיוטה';
$lang['btn_recover'] = 'שחזור טיוטה';
$lang['btn_draftdel'] = 'מחיקת טיוטה';
-$lang['btn_revert'] = 'שחזר';
-$lang['loggedinas'] = 'רשום כ-';
+$lang['btn_revert'] = 'שחזור';
+$lang['btn_register'] = 'הרשמה';
+$lang['loggedinas'] = 'נכנסת בשם';
$lang['user'] = 'שם משתמש';
-$lang['pass'] = 'סיסמה';
-$lang['newpass'] = 'סיסמה חדשה';
-$lang['oldpass'] = 'אשר את הסיסמה הנוכחית';
-$lang['passchk'] = 'שוב';
-$lang['remember'] = 'זכור אותי';
+$lang['pass'] = 'ססמה';
+$lang['newpass'] = 'ססמה חדשה';
+$lang['oldpass'] = 'אישור הססמה הנוכחית';
+$lang['passchk'] = 'פעם נוספת';
+$lang['remember'] = 'שמירת הפרטים שלי';
$lang['fullname'] = 'שם מלא';
-$lang['email'] = 'דוא"ל';
-$lang['register'] = 'הרשמה';
-$lang['profile'] = 'פרופיל';
-$lang['badlogin'] = 'סליחה, שם המשתמש או הסיסמה שגויים';
-$lang['minoredit'] = 'שינוים מינוריים';
-$lang['draftdate'] = 'טיוטה נשמרה ב-';
+$lang['email'] = 'דוא״ל';
+$lang['profile'] = 'פרופיל המשתמש';
+$lang['badlogin'] = 'שם המשתמש או הססמה שגויים, עמך הסליחה';
+$lang['minoredit'] = 'שינוים מזעריים';
+$lang['draftdate'] = 'הטיוטה נשמרה אוטומטית ב־';
$lang['nosecedit'] = 'הדף השתנה בינתיים, הקטע שערכת אינו מעודכן - העמוד כולו נטען במקום זאת.';
-$lang['regmissing'] = 'סליחה, עליך למלא את כל השדות';
-$lang['reguexists'] = 'סליחה, משתמש בשם זה כבר נרשם';
-$lang['regsuccess'] = 'הרשמה הצליחה, המשתמש נרשם והודעה נשלחה בדואר';
-$lang['regsuccess2'] = 'הרשמה הצליחה, המשתמש נרשם.';
-$lang['regmailfail'] = 'שליחת הודעת הדואר כשלה, נא ליצור קשר עם מנהל האתר';
-$lang['regbadmail'] = 'כתובת דואר כנראה לא תקפה, אם לא כך היא יש ליצור קשר עם מנהל האתר';
-$lang['regbadpass'] = 'שתי הסיסמות הן לא זהות, נא לנסות שוב';
-$lang['regpwmail'] = 'סיסמת הדוקוויקי שלך';
-$lang['reghere'] = 'עדיין ללא שם-משתמש? ההרשמה כאן';
+$lang['regmissing'] = 'עליך למלא את כל השדות, עמך הסליחה.';
+$lang['reguexists'] = 'משתמש בשם זה כבר נרשם, עמך הסליחה.';
+$lang['regsuccess'] = 'ההרשמה הצליחה, המשתמש נרשם והודעה נשלחה בדוא״ל.';
+$lang['regsuccess2'] = 'ההרשמה הצליחה, המשתמש נוצר.';
+$lang['regmailfail'] = 'שליחת הודעת הדוא״ל כשלה, נא ליצור קשר עם מנהל האתר!';
+$lang['regbadmail'] = 'יתכן כי כתובת הדוא״ל אינה תקפה, אם לא כך הדבר ליצור קשר עם מנהל האתר';
+$lang['regbadpass'] = 'שתי הססמאות אינן זהות זו לזו, נא לנסות שוב.';
+$lang['regpwmail'] = 'ססמת הדוקוויקי שלך';
+$lang['reghere'] = 'עדיין אין לך חשבון? ההרשמה כאן';
$lang['profna'] = 'בוויקי הזה לא ניתן לשנות פרופיל';
-$lang['profnochange'] = 'אין שינוים, פרופיל לא עודכן';
-$lang['profnoempty'] = 'שם וכתובת דוא"ל לא יכולים להיות ריקים';
-$lang['profchanged'] = 'פרופיל עודכן בהצלחה';
-$lang['pwdforget'] = 'שכחת סיסמה? קבל חדשה';
-$lang['resendna'] = 'הוויקי הזה לא תומך בחידוש סיסמה';
-$lang['resendpwd'] = 'שלח סיסמה חדשה עבור';
-$lang['resendpwdmissing'] = 'סליחה, עליך למלא את כל השדות';
-$lang['resendpwdnouser'] = 'סליחה, משתמש בשם זה לא נמצא';
-$lang['resendpwdbadauth'] = 'סליחה, קוד אימות זה אינו תקף. יש לודא כי נעשה שימוש במלוא קישור האימות.';
-$lang['resendpwdconfirm'] = 'קישור אימות נשלח בדוא"ל.';
-$lang['resendpwdsuccess'] = 'סיסמה חדשה נשלחה בדואר';
-$lang['license'] = 'למעט מקרים בהם צוין אחרת, התוכן בוויקי זה זמין לפי הרשיון הבא:';
-$lang['licenseok'] = 'שים לב: עריכת דף זה מהווה הסכמה מצידך להצגת התוכן שהוספת לפי הרשיון הבא:';
-$lang['searchmedia'] = 'חפש שם קובץ:';
-$lang['txt_upload'] = 'בחר קובץ להעלות';
-$lang['txt_filename'] = 'הכנס שם לוויקי (בחירה)';
-$lang['txt_overwrt'] = 'לכתוב במקום קובץ קיים';
+$lang['profnochange'] = 'אין שינויים, הפרופיל לא עודכן';
+$lang['profnoempty'] = 'השם וכתובת הדוא״ל לא יכולים להיות ריקים';
+$lang['profchanged'] = 'הפרופיל עודכן בהצלחה';
+$lang['pwdforget'] = 'שכחת את הססמה שלך? ניתן לקבל חדשה';
+$lang['resendna'] = 'הוויקי הזה אינו תומך בחידוש ססמה';
+$lang['resendpwd'] = 'שליחת ססמה חדשה עבור';
+$lang['resendpwdmissing'] = 'עליך למלא את כל השדות, עמך הסליחה.';
+$lang['resendpwdnouser'] = 'משתמש בשם זה לא נמצא במסד הנתונים, עמך הסליחה.';
+$lang['resendpwdbadauth'] = 'קוד אימות זה אינו תקף. יש לוודא כי נעשה שימוש בקישור האימות המלא, עמך הסליחה.';
+$lang['resendpwdconfirm'] = 'נשלח קישור לאימות נשלח בדוא״ל.';
+$lang['resendpwdsuccess'] = 'נשלחה ססמה חדשה בדוא״ל';
+$lang['license'] = 'למעט מקרים בהם צוין אחרת, התוכן בוויקי זה זמין לפי הרישיון הבא:';
+$lang['licenseok'] = 'נא לשים לב: עריכת דף זה מהווה הסכמה מצדך להצגת התוכן שהוספת בהתאם הרישיון הבא:';
+$lang['searchmedia'] = 'חיפוש שם קובץ:';
+$lang['searchmedia_in'] = 'חיפוש תחת %s';
+$lang['txt_upload'] = 'בחירת קובץ להעלות';
+$lang['txt_filename'] = 'העלאה בשם (נתון לבחירה)';
+$lang['txt_overwrt'] = 'שכתוב על קובץ קיים';
$lang['lockedby'] = 'נעול על ידי';
-$lang['lockexpire'] = 'נעילה פגה';
-$lang['willexpire'] = 'נעילה תחלוף עוד זמן קצר. \nלמניעת התנגשויות יש להשתמש בכפתור הרענון מטה כדי לאתחל את הנעילה שנית';
-$lang['js']['notsavedyet'] = "קיימים שינויים שטרם נשמרו ואשר יאבדו \n האם להמשיך?";
-$lang['rssfailed'] = 'כשל ב-RSS';
-$lang['nothingfound'] = 'לא נמצאו תוצאות';
-$lang['mediaselect'] = 'בחירת קובץ מדיה';
-$lang['fileupload'] = 'העלאת קובץ מדיה';
-$lang['uploadsucc'] = 'העלאת הקובץ בוצעה בהצלחה';
-$lang['uploadfail'] = 'קרתה שגיאה בעת העלאת הקובץ. תיתכן ובעייה זו נוצרה עקב הרשאות שגיות.';
-$lang['uploadwrong'] = 'העלאה לא אושרה. קבצים בסיומת זו אסורים';
-$lang['uploadexist'] = 'הקובץ כבר קיים. פעולה בוטלה';
+$lang['lockexpire'] = 'הנעילה פגה';
+$lang['willexpire'] = 'הנעילה תחלוף עוד זמן קצר. \nלמניעת התנגשויות יש להשתמש בכפתור הרענון מטה כדי לאפס את מד משך הנעילה.';
+$lang['js']['notsavedyet'] = 'שינויים שלא נשמרו ילכו לאיבוד.';
+$lang['js']['searchmedia'] = 'חיפוש אחר קבצים';
+$lang['js']['keepopen'] = 'השארת חלון פתוח על הבחירה';
+$lang['js']['hidedetails'] = 'הסתרת פרטים';
+$lang['js']['mediatitle'] = 'הגדרות הקישור';
+$lang['js']['mediadisplay'] = 'סוג הקישור';
+$lang['js']['mediaalign'] = 'יישור';
+$lang['js']['mediasize'] = 'גודל התמונה';
+$lang['js']['mediatarget'] = 'יעד הקישור';
+$lang['js']['mediaclose'] = 'סגירה';
+$lang['js']['mediainsert'] = 'הוספה';
+$lang['js']['mediadisplayimg'] = 'הצגת התמונה.';
+$lang['js']['mediadisplaylnk'] = 'הצגת הקישור בלבד.';
+$lang['js']['mediasmall'] = 'גרסה קטנה';
+$lang['js']['mediamedium'] = 'גרסה בינונית';
+$lang['js']['medialarge'] = 'גרסה גדולה';
+$lang['js']['mediaoriginal'] = 'הגרסה המקורית';
+$lang['js']['medialnk'] = 'קישור לעמוד הפרטים';
+$lang['js']['mediadirect'] = 'הקישור הישיר למקור';
+$lang['js']['medianolnk'] = 'אין קישור';
+$lang['js']['medianolink'] = 'אין לקשר לתמונה';
+$lang['js']['medialeft'] = 'יישור התמונה לשמאל.';
+$lang['js']['mediaright'] = 'יישור התמונה לימין.';
+$lang['js']['mediacenter'] = 'מרכוז התמונה.';
+$lang['js']['medianoalign'] = 'לא להשתמש ביישור.';
+$lang['js']['nosmblinks'] = 'קישור לכונני שיתוף של Windows עובד רק באמצעות Microsoft Internet Explorer.
+עדיין ניתן להעתיק ולהדביק את הקישור.';
+$lang['js']['linkwiz'] = 'אשף הקישורים';
+$lang['js']['linkto'] = 'קישור אל:';
+$lang['js']['del_confirm'] = 'באמת למחוק?';
+$lang['js']['mu_btn'] = 'העלאת מספר קבצים יחד';
+$lang['rssfailed'] = 'אירע כשל בעת קבלת הזנה זו:';
+$lang['nothingfound'] = 'לא נמצאו תוצאות.';
+$lang['mediaselect'] = 'קובצי מדיה';
+$lang['fileupload'] = 'העלאת קובצי מדיה';
+$lang['uploadsucc'] = 'ההעלאה הושלמה בהצלחה';
+$lang['uploadfail'] = 'אירעה שגיאה בעת העלאת הקובץ. היתכן שתקלה זו נוצרה עקב הרשאות שגיות?';
+$lang['uploadwrong'] = 'ההעלאה לא אושרה. קבצים בסיומת זו אסורים!';
+$lang['uploadexist'] = 'הקובץ כבר קיים. הפעולה בוטלה.';
$lang['uploadbadcontent'] = 'התוכן שהועלה לא תאם את הסיומת %s של הקובץ.';
-$lang['uploadspam'] = 'ההעלאה נחסמה על ידי הרשימה השחורה של הספאם.';
+$lang['uploadspam'] = 'ההעלאה נחסמה על ידי רשימת חסימת הספאם.';
$lang['uploadxss'] = 'ההעלאה נחסמה בשל חשד לתוכן זדוני.';
-$lang['uploadsize'] = 'הקובץ שהועלה היה גדול מדי. (מקסימום %s)';
-$lang['deletesucc'] = 'קובץ %s נמחק';
-$lang['deletefail'] = 'לא יכולתי למחוק "%s" -- בדקו הרשאות';
-$lang['mediainuse'] = 'קובץ "%s" לא נמחק - הוא עדיין בשימוש';
+$lang['uploadsize'] = 'הקובץ שהועלה היה גדול מדי. (%s לכל היותר)';
+$lang['deletesucc'] = 'הקובץ %s נמחק.';
+$lang['deletefail'] = 'לא ניתן למחוק את "%s" -- נא לבדוק את ההרשאות.';
+$lang['mediainuse'] = 'הקובץ "%s" לא נמחק - הוא עדיין בשימוש.';
$lang['namespaces'] = 'שמות מתחם';
-$lang['mediafiles'] = 'קבצים זמינים ב-';
-$lang['js']['searchmedia'] = 'חיפוש קבצים';
-$lang['js']['keepopen'] = 'השאר חלון פתוח בבחירה';
-$lang['js']['hidedetails'] = 'הסתר פרטים';
-$lang['js']['nosmblinks'] = ':( קישור למערכת קבצים של חלונות פועל רק בדפדפן אינטרנט אקספלורר.
- זה בסדר, אין צורך לעבור. אפשר להעתיק ולהדביק את הקישור';
-$lang['js']['linkwiz'] = 'אשף הקישורים';
-$lang['js']['linkto'] = 'קשר אל:';
-$lang['js']['del_confirm'] = 'באמת למחוק?';
-$lang['js']['mu_btn'] = 'העלאת קבצים מרובים';
-$lang['mediausage'] = 'השתמש בתחביר הבא להתיחסות אל קובץ זה:';
-$lang['mediaview'] = 'הצג את הקובץ המקורי';
+$lang['mediafiles'] = 'קבצים זמינים תחת';
+$lang['accessdenied'] = 'אין לך הרשאה לצפות בדף זה.';
+$lang['mediausage'] = 'יש להשתמש בתחביר הבא כדי להפנות לקובץ זה:';
+$lang['mediaview'] = 'הצגת הקובץ המקורי';
$lang['mediaroot'] = 'root';
-$lang['mediaupload'] = 'כאן ניתן להעלות קובץ למרחב השמות הנוכחי. ליצירת תתי-מרחבי שמות צרפם ב-"העלה" לתחילת שם הקובץ מופרדים בפסיקים';
-$lang['mediaextchange'] = 'סיומת הקובץ השתנתה מ-.%s ל-.%s!';
-$lang['reference'] = 'קישורים ל';
+$lang['mediaupload'] = 'כאן ניתן להעלות קובץ למרחב השם הנוכחי. ליצירת תת־מרחבי שם יש לצרף אותם לתחילת שם הקובץ, מופרדים בפסיקים, בשם הקובץ תחת "העלאה בתור".';
+$lang['mediaextchange'] = 'סיומת הקובץ השתנתה מ־‎.%s ל־‎.%s!';
+$lang['reference'] = 'הפניות אל';
$lang['ref_inuse'] = 'לא ניתן למחוק קובץ זה, כיוון שהדפים הבאים עדיין משתמשים בו:';
-$lang['ref_hidden'] = 'יש קישורים לדפים ללא הרשאת קריאה';
-$lang['hits'] = 'פגיעות';
-$lang['quickhits'] = 'דפים שנמצאו';
+$lang['ref_hidden'] = 'חלק מההפניות נמצאות בדפים שאין לך הרשאות לקרוא אותם';
+$lang['hits'] = 'ביקורים';
+$lang['quickhits'] = 'שמות דפים שנמצאו';
$lang['toc'] = 'תוכן עניינים';
-$lang['current'] = 'גירסה נוכחית';
+$lang['current'] = 'הגרסה הנוכחית';
$lang['yours'] = 'הגרסה שלך';
-$lang['diff'] = 'הצג שינוים מגרסה זו ועד הנוכחית';
+$lang['diff'] = 'הצגת שינוים מגרסה זו ועד הנוכחית';
$lang['diff2'] = 'הצגת הבדלים בין הגרסאות שנבחרו';
+$lang['difflink'] = 'קישור לתצוגה השוואה זו';
$lang['line'] = 'שורה';
$lang['breadcrumb'] = 'ביקורים אחרונים';
-$lang['youarehere'] = 'אתה נמצא כאן';
-$lang['lastmod'] = 'שונה לאחרונה ב';
+$lang['youarehere'] = 'זהו מיקומך';
+$lang['lastmod'] = 'מועד השינוי האחרון';
$lang['by'] = 'על ידי';
$lang['deleted'] = 'נמחק';
$lang['created'] = 'נוצר';
@@ -151,9 +172,10 @@ $lang['restored'] = 'שוחזר';
$lang['external_edit'] = 'עריכה חיצונית';
$lang['summary'] = 'תקציר העריכה';
$lang['noflash'] = '<a href="http://www.adobe.com/products/flashplayer/">תוסף פלאש לדפדפן</a> נדרש כדי להציג תוכן זה.';
-$lang['download'] = 'הורד מקטע';
+$lang['download'] = 'הורדת מקטע';
$lang['mail_newpage'] = 'דף נוסף:';
$lang['mail_changed'] = 'דף שונה:';
+$lang['mail_subscribe_list'] = 'דפים שהשתנו במרחב השם:';
$lang['mail_new_user'] = 'משתמש חדש:';
$lang['mail_upload'] = 'קובץ הועלה:';
$lang['qb_bold'] = 'טקסט מודגש';
@@ -167,7 +189,7 @@ $lang['qb_h3'] = 'כותרת רמה 3';
$lang['qb_h4'] = 'כותרת רמה 4';
$lang['qb_h5'] = 'כותרת רמה 5';
$lang['qb_h'] = 'כותרת';
-$lang['qb_hs'] = 'בחירת כותרת';
+$lang['qb_hs'] = 'כותרת נבחרת';
$lang['qb_hplus'] = 'כותרת ברמה גבוהה יותר';
$lang['qb_hminus'] = 'כותרת ברמה נמוכה יותר';
$lang['qb_hequal'] = 'כותרת באותה רמה';
@@ -175,73 +197,85 @@ $lang['qb_link'] = 'קישור פנימי';
$lang['qb_extlink'] = 'קישור חיצוני';
$lang['qb_hr'] = 'קו אופקי';
$lang['qb_ol'] = 'איבר ברשימה ממוספרת';
-$lang['qb_ul'] = 'אבר ברשימה לא ממוספרת';
-$lang['qb_media'] = 'תמונות או קובץ אחר';
-$lang['qb_sig'] = 'הזנת חתימה';
-$lang['qb_smileys'] = 'פרצופונים';
-$lang['qb_chars'] = 'סימנים מיוחדים';
-$lang['upperns'] = 'עבור למרחב השם שברמה שמעל הנוכחית';
-$lang['admin_register'] = 'להוסיף משתמש חדש';
-$lang['metaedit'] = 'ערוך נתונים';
-$lang['metasaveerr'] = 'כשל בשמירת נתונים';
-$lang['metasaveok'] = 'נתונים נשמרו';
-$lang['img_backto'] = 'הזור ל';
-$lang['img_title'] = 'כותרת';
-$lang['img_caption'] = 'תיאור';
+$lang['qb_ul'] = 'איבר ברשימה לא ממוספרת';
+$lang['qb_media'] = 'תמונות וקבצים אחרים';
+$lang['qb_sig'] = 'הוספת חתימה';
+$lang['qb_smileys'] = 'חייכנים';
+$lang['qb_chars'] = 'תווים מיוחדים';
+$lang['upperns'] = 'מעבר למרחב השם שברמה שמעל הנוכחית';
+$lang['admin_register'] = 'הוספת משתמש חדש';
+$lang['metaedit'] = 'עריכת נתוני העל';
+$lang['metasaveerr'] = 'אירע כשל בשמירת נתוני העל';
+$lang['metasaveok'] = 'נתוני העל נשמרו';
+$lang['img_backto'] = 'חזרה אל';
+$lang['img_title'] = 'שם';
+$lang['img_caption'] = 'כותרת';
$lang['img_date'] = 'תאריך';
$lang['img_fname'] = 'שם הקובץ';
$lang['img_fsize'] = 'גודל';
$lang['img_artist'] = 'צלם';
-$lang['img_copyr'] = 'זכויות';
-$lang['img_format'] = 'פורמט';
+$lang['img_copyr'] = 'זכויות יוצרים';
+$lang['img_format'] = 'מבנה';
$lang['img_camera'] = 'מצלמה';
$lang['img_keywords'] = 'מילות מפתח';
-$lang['subscribe_success'] = '%s נוסף לרשימת המכותבים עבור %s';
-$lang['subscribe_error'] = 'שגיאה בהוספת %s לרשימת המכותבים עבור %s';
-$lang['subscribe_noaddress'] = 'אין כתובת המשויכת לרישום שלך ולכן אין באפשרותך להצטרף לרשימת המכותבים';
-$lang['unsubscribe_success'] = '%s הוסר מרשימת המכותבים עבור %s';
-$lang['unsubscribe_error'] = 'שגיאה בהסרת %s מרשימת המכותבים עבור %s';
-$lang['authmodfailed'] = 'תצורת אימות משתמשים גרועה. נא לדווח למנהל הויקי.';
-$lang['authtempfail'] = 'אימות משתמשים אינו זמין כרגע. אם מצב זה נמשך נא להודיע למנהל הויקי.';
+$lang['subscr_subscribe_success'] = '%s נוסף לרשימת המינויים לדף %s';
+$lang['subscr_subscribe_error'] = 'אירעה שגיאה בהוספת %s לרשימת המינויים לדף %s';
+$lang['subscr_subscribe_noaddress'] = 'אין כתובת המשויכת עם הכניסה שלך, נא ניתן להוסיף אותך לרשימת המינויים';
+$lang['subscr_unsubscribe_success'] = 'המשתמש %s הוסר מרשימת המינויים לדף %s';
+$lang['subscr_unsubscribe_error'] = 'אירעה שגיאה בהסרת %s מרשימת המינויים לדף %s';
+$lang['subscr_already_subscribed'] = 'המשתמש %s כבר מנוי לדף %s';
+$lang['subscr_not_subscribed'] = 'המשתמש %s איננו רשום לדף %s';
+$lang['subscr_m_not_subscribed'] = 'המשתמש שלך אינו רשום, נכון לעכשיו, לדף הנוכחי או למרחב השם.';
+$lang['subscr_m_new_header'] = 'הוספת מינוי';
+$lang['subscr_m_current_header'] = 'המינויים הנוכחיים';
+$lang['subscr_m_unsubscribe'] = 'ביטול המינוי';
+$lang['subscr_m_subscribe'] = 'מינוי';
+$lang['subscr_m_receive'] = 'קבלת';
+$lang['subscr_style_every'] = 'דוא״ל עם כל שינוי';
+$lang['subscr_style_digest'] = 'הודעת דוא״ל המציגה את כל השינויים בכל עמוד (בכל %.2f ימים)';
+$lang['subscr_style_list'] = 'רשימת השינויים בדפים מאז הודעת הדוא״ל האחרונה (בכל %.2f ימים)';
+$lang['authmodfailed'] = 'תצורת אימות המשתמשים אינה תקינה. נא ליידע את מנהל הוויקי.';
+$lang['authtempfail'] = 'אימות משתמשים אינו זמין כרגע. אם מצב זה נמשך נא ליידע את מנהל הוויקי.';
$lang['i_chooselang'] = 'נא לבחור שפה';
-$lang['i_installer'] = 'DokuWiki Installer';
-$lang['i_wikiname'] = 'שם הויקי';
-$lang['i_enableacl'] = 'אפשר ACL (מומלץ)';
-$lang['i_superuser'] = 'משתמש-על';
-$lang['i_problems'] = 'המתקין זיהה מספר בעיות המצוינות מטה. אין באפשרותך להמשיך לפני תיקונן.';
-$lang['i_modified'] = 'משיקולי אבטחה תסריט זה יעבוד אך ורק עם התקנת DokuWiki חדשה שלא עברה כל שינוי.
- עליך לחלץ שנית את הקבצים מהחבילה שהורדה או להעזר בדף
+$lang['i_installer'] = 'תכנית ההתקנה של DokuWiki';
+$lang['i_wikiname'] = 'שם הוויקי';
+$lang['i_enableacl'] = 'הפעלת ACL (מומלץ)';
+$lang['i_superuser'] = 'משתמש־על';
+$lang['i_problems'] = 'תכנית ההתקנה זיהתה מספר בעיות המפורטות להלן. אין באפשרותך להמשיך לפני תיקונן.';
+$lang['i_modified'] = 'משיקולי אבטחה סקריפט זה יעבוד אך ורק עם התקנת DokuWiki חדשה שלא עברה כל שינוי.
+ עליך לחלץ שנית את הקבצים מהחבילה שהורדה או להיעזר בדף
<a href="http://dokuwiki.org/install">Dokuwiki installation instructions</a>';
-$lang['i_funcna'] = 'פונקצית ה-PHP <code>%s</code> אינה זמינה. יתכן כי מארח האתר חסם אותה מסיבה כלשהי?';
-$lang['i_phpver'] = 'גרסת ה-PHP שלך <code>%s</code> נמוכה מהדרוש. עליך לשדרג את התקנת ה-PHP';
-$lang['i_permfail'] = '<code>%s</code> אינה ברת כתיבה על ידי DokuWiki. עליך לשנות הרשאות ספריה זו!';
+$lang['i_funcna'] = 'פונקציית ה-PHP&rlm; <code>%s</code> אינה זמינה. יתכן כי מארח האתר חסם אותה מסיבה כלשהי?';
+$lang['i_phpver'] = 'גרסת ה־PHP שלך <code>%s</code> נמוכה מהדרוש. עליך לשדרג את התקנת ה־PHP שלך.';
+$lang['i_permfail'] = '<code>%s</code> אינה ניתנת לכתיבה על ידי DokuWiki. עליך לשנות הרשאות תיקייה זו!';
$lang['i_confexists'] = '<code>%s</code> כבר קיים';
-$lang['i_writeerr'] = 'אין אפשרות ליצור את <code>%s</code>. נא לבדוק את הרשאות הקובץ/ספריה וליצור את הקובץ ידנית.';
-$lang['i_badhash'] = 'קובץ Dokuwiki.php לא מזוהה או שעבר שינויים (hash=<code>%s</code>)';
-$lang['i_badval'] = '<code>%s</code> - ערך לא חוקי או ריק';
-$lang['i_success'] = 'ההגדרה הסתימה בהצלחה. באפשרותך למחוק עתה את הקובץ install.php ולהמשיך אל <a href="doku.php">DokuWiki החדש שלך</a>.';
-$lang['i_failure'] = 'מספר שגיאות ארעו בעת כתיבת קבצי התצורה. ייתכן כי יהיה צורך לתקנם ידנית לפני שניתן יהיה להשתמש ב<a href="doku.php">DokuWiki החדש שלך</a>.';
-$lang['i_policy'] = 'מדיניות ACL תחילית';
+$lang['i_writeerr'] = 'אין אפשרות ליצור את <code>%s</code>. נא לבדוק את הרשאות הקובץ/תיקייה וליצור את הקובץ ידנית.';
+$lang['i_badhash'] = 'הקובץ Dokuwiki.php אינו מזוהה או שעבר שינויים (hash=<code>%s</code>)';
+$lang['i_badval'] = '<code>%s</code> - הערך אינו חוקי או ריק';
+$lang['i_success'] = 'תהליך ההגדרה הסתיים בהצלחה. כעת ניתן למחוק את הקובץ install.php ולהמשיך אל ה־<a href="doku.php">DokuWiki החדש שלך</a>.';
+$lang['i_failure'] = 'מספר שגיאות אירעו בעת כתיבת קובצי התצורה. יתכן כי יהיה צורך לתקנם ידנית לפני שניתן יהיה להשתמש ב־<a href="doku.php">DokuWiki החדש שלך</a>.';
+$lang['i_policy'] = 'מדיניות ACL התחלתית';
$lang['i_pol0'] = 'ויקי פתוח (קריאה, כתיבה והעלאה לכולם)';
$lang['i_pol1'] = ' ויקי ציבורי (קריאה לכולם, כתיבה והעלאה למשתמשים רשומים)';
$lang['i_pol2'] = 'ויקי סגור (קריאה, כתיבה והעלאה למשתמשים רשומים בלבד)';
-$lang['i_retry'] = 'נסיון נוסף';
-$lang['mu_intro'] = 'כאן תוכל להעלות קבצים מרובים. לחץ על כפתור החיפוש להוסיף אותם למחסנית. לחץ על העלאה לסיום.';
-$lang['mu_gridname'] = 'שם קובץ';
+$lang['i_retry'] = 'ניסיון נוסף';
+$lang['i_license'] = 'נא לבחור את הרישיון שיחול על התוכן שבוויקי שלך:';
+$lang['mu_intro'] = 'דרך כאן ניתן להעלות מספר קבצים בבת אחת. יש ללחוץ על לחצן החיפוש להוסיף אותם למחסנית. ניתן ללחוץ על העלאה לסיום.';
+$lang['mu_gridname'] = 'שם הקובץ';
$lang['mu_gridsize'] = 'גודל';
-$lang['mu_gridstat'] = 'סטאטןס';
+$lang['mu_gridstat'] = 'מצב';
$lang['mu_namespace'] = 'מרחב שם';
$lang['mu_browse'] = 'חיפוש';
$lang['mu_toobig'] = 'גדול מדי';
-$lang['mu_ready'] = 'מוכן להעלאה';
-$lang['mu_done'] = 'סיים';
+$lang['mu_ready'] = 'בהמתנה להעלאה';
+$lang['mu_done'] = 'הסתיים';
$lang['mu_fail'] = 'נכשל';
-$lang['mu_authfail'] = 'תקוף נעילת עריכה פג';
+$lang['mu_authfail'] = 'תוקף ההפעלה פג';
$lang['mu_progress'] = '@PCT@% הועלה';
$lang['mu_filetypes'] = 'סוגי קבצים מורשים';
$lang['mu_info'] = 'הקבצים הועלו';
$lang['mu_lasterr'] = 'שגיאה אחרונה:';
-$lang['recent_global'] = 'אתה צופה כעת בשינויים בתוך מרחב השם <b>%s</b>. אתה יכול גם <a href="%s">לצפות בשינויים האחרונים של כל הוויקי </a>.';
+$lang['recent_global'] = 'נכון לעכשיו מתנהל על ידיך מעקב אחר מרחב השם <b>%s</b>. כמו כן, באפשרותך <a href="%s">לצפות בשינויים האחרונים בוויקי כולו</a>.';
$lang['years'] = 'לפני %d שנים';
$lang['months'] = 'לפני %d חודשים';
$lang['weeks'] = 'לפני %d שבועות';
@@ -249,3 +283,4 @@ $lang['days'] = 'לפני %d ימים';
$lang['hours'] = 'לפני %d שעות';
$lang['minutes'] = 'לפני %d דקות';
$lang['seconds'] = 'לפני %d שניות';
+$lang['wordblock'] = 'השינויים שלך לא נשמרו כיוון שהם מכילים טקסט חסום (ספאם).';
diff --git a/inc/lang/he/mailtext.txt b/inc/lang/he/mailtext.txt
index d7990b2b3..222ee1b6d 100644
--- a/inc/lang/he/mailtext.txt
+++ b/inc/lang/he/mailtext.txt
@@ -1,17 +1,17 @@
-דף בDokuWiki נוסף או שונה. הנה הפרטים:
+דף בDokuWiki נוסף או שונה. להלן הפרטים:
-Date : @DATE@
-Browser : @BROWSER@
-IP-Address : @IPADDRESS@
-Hostname : @HOSTNAME@
-Old Revision: @OLDPAGE@
-New Revision: @NEWPAGE@
-Edit Summary: @SUMMARY@
-User : @USER@
+תאריך : @DATE@
+דפדפן : @BROWSER@
+כתובת ה־IP&rlm; : @IPADDRESS@
+שם המארח : @HOSTNAME@
+המהדורה הישנה: @OLDPAGE@
+המהדורה החדשה: @NEWPAGE@
+תקציר העריכה: @SUMMARY@
+משתמש : @USER@
@DIFF@
--
-דף זה נוצר ע"י DokuWiki ב-
+דף זה נוצר ע״י ה־DokuWiki הזמין בכתובת
@DOKUWIKIURL@
diff --git a/inc/lang/he/password.txt b/inc/lang/he/password.txt
index 29742ebda..745c5cb5c 100644
--- a/inc/lang/he/password.txt
+++ b/inc/lang/he/password.txt
@@ -1,10 +1,10 @@
שלום @FULLNAME@!
-הנה נתוני המשתמש שלך עבור @TITLE@ ב- @DOKUWIKIURL@
+הנה נתוני המשתמש שלך עבור @TITLE@ ב־@DOKUWIKIURL@
-כניסה : @LOGIN@
-סיסמה : @PASSWORD@
+שם כניסה : @LOGIN@
+ססמה : @PASSWORD@
--
-מכתב זה נוצר על ידי דוקוויקי ב-
+מכתב זה נוצר על ידי ה־DokuWiki הזמין בכתובת
@DOKUWIKIURL@ \ No newline at end of file
diff --git a/inc/lang/he/pwconfirm.txt b/inc/lang/he/pwconfirm.txt
index 255195c7f..7dc46c340 100644
--- a/inc/lang/he/pwconfirm.txt
+++ b/inc/lang/he/pwconfirm.txt
@@ -1,13 +1,13 @@
שלום @FULLNAME@!
-מישהו ביקש סיסמה חדשה עבור הכניסה שלך ל-@TITLE@ ב-@DOKUWIKIURL@
+מישהו ביקש ססמה חדשה עבור שם הכניסה שלך לוויקי @TITLE@ בכתובת @DOKUWIKIURL@
-אם לא ביקשת סיסמה חדשה פשוט התעלם מדוא"ל זה.
+אם לא ביקשת ססמה חדשה באפשרותך פשוט להתעלם מהודעת דוא״ל זו.
-כדי לאשר שהבקשה באמת נשלחה על ידך נא השתמש בקישור הבא.
+כדי לאשר שהבקשה באמת נשלחה על ידך עליך השתמש בקישור הבא.
@CONFIRM@
--
-דואר זה נוצר על ידי DokuWiki ב-
+הודעת דוא״ל זו נוצרה על ידי ה־DokuWiki הזמין בכתובת
@DOKUWIKIURL@
diff --git a/inc/lang/he/read.txt b/inc/lang/he/read.txt
index 8e4c177ee..18efc5e03 100644
--- a/inc/lang/he/read.txt
+++ b/inc/lang/he/read.txt
@@ -1,2 +1,2 @@
-דף זה הוא דף לקריאה בלבד. ניתן לצפות בקוד המקור שלו, אבל לא ניתן לערוך אותו. ניתן לפנות אל מנהל הויקי אם לדעתך נפלה טעות.
+דף זה הוא דף לקריאה בלבד. ניתן לצפות בקוד המקור שלו, אך לא ניתן לערוך אותו. ניתן לפנות למנהל הוויקי אם לדעתך נפלה טעות.
diff --git a/inc/lang/he/register.txt b/inc/lang/he/register.txt
index 7225b02fd..c4dfad752 100644
--- a/inc/lang/he/register.txt
+++ b/inc/lang/he/register.txt
@@ -1,3 +1,3 @@
====== הרשמה כמשתמש חדש ======
-יש למלא את כל המידע מטה כדי ליצור חשבון חדש בויקי זה. יש לודא כי מוזנת **כתובת דוא"ל תקפה**- סיסמתך החדשה תשלח לכתובת זו\\ על שם המשתמש להיות [[hdoku>ויקי:שם דף|שם דף]] תקף.
+יש למלא את כל המידע להלן כדי ליצור חשבון חדש בוויקי זה. עליך לוודא כי הזנת **כתובת דוא״ל תקפה**- ססמתך החדשה תשלח לכתובת זו. על שם המשתמש להיות [[hdoku>ויקי:שם דף|שם דף]] תקף.
diff --git a/inc/lang/he/registermail.txt b/inc/lang/he/registermail.txt
index bb64a8158..3edca3fa0 100644
--- a/inc/lang/he/registermail.txt
+++ b/inc/lang/he/registermail.txt
@@ -1,14 +1,14 @@
-משתמש חדש נרשם. הנה הפרטים:
+משתמש חדש נרשם. להלן הפרטים:
שם משתמש : @NEWUSER@
שם מלא : @NEWNAME@
-דוא"ל : @NEWEMAIL@
+דוא״ל : @NEWEMAIL@
תאריך : @DATE@
דפדפן : @BROWSER@
-כתובת רשת : @IPADDRESS@
-שם המחשב : @HOSTNAME@
+כתובת IP&rlm; : @IPADDRESS@
+שם המארח : @HOSTNAME@
--
-דוא"ל זה נוצר על ידי DokuWiki ב-
+הודעת דוא״ל זו נוצרה על ידי ה־DokuWiki הזמין בכתובת
@DOKUWIKIURL@
diff --git a/inc/lang/he/resendpwd.txt b/inc/lang/he/resendpwd.txt
index 47e7749c2..8ca27207b 100644
--- a/inc/lang/he/resendpwd.txt
+++ b/inc/lang/he/resendpwd.txt
@@ -1,4 +1,4 @@
-====== שליחת סיסמה חדשה ======
+====== שליחת ססמה חדשה ======
-יש להזין את שם המשתמש בטופס מטה ולבקש סיסמה חדשה לחשבון שלך בויקי זה. קישור לאימות ישלח לכתובת הדו"ל איתה נרשמת.
+יש להזין את שם המשתמש בטופס מטה ולבקש ססמה חדשה לחשבון שלך בוויקי זה. הקישור לאימות יישלח לכתובת הדוא״ל באמצעותה נרשמת.
diff --git a/inc/lang/he/subscr_digest.txt b/inc/lang/he/subscr_digest.txt
new file mode 100644
index 000000000..af5220229
--- /dev/null
+++ b/inc/lang/he/subscr_digest.txt
@@ -0,0 +1,20 @@
+שלום!
+
+הדף @PAGE@ שבאתר הוויקי @TITLE@ השתנה.
+להלן השינויים:
+
+--------------------------------------------------------
+@DIFF@
+--------------------------------------------------------
+
+המהדורה הישנה: @OLDPAGE@
+המהדורה החדשה: @NEWPAGE@
+
+כדי לבטל את ההתרעות לשינויי העמוד, יש להיכנס לאתר הוויקי בכתובת
+@DOKUWIKIURL@ ואז לבקר באגף
+@SUBSCRIBE@
+ולבטל את המינוי לשינויים בדף ו/או במרחב השם.
+
+--
+הודעת דוא״ל זו נוצרה על ידי ה־DokuWiki שבכתובת
+@DOKUWIKIURL@ \ No newline at end of file
diff --git a/inc/lang/he/subscr_single.txt b/inc/lang/he/subscr_single.txt
new file mode 100644
index 000000000..123b186c8
--- /dev/null
+++ b/inc/lang/he/subscr_single.txt
@@ -0,0 +1,22 @@
+שלום!
+
+הדף @PAGE@ באתר הוויקי @TITLE@ השתנה.
+
+--------------------------------------------------------
+@DIFF@
+--------------------------------------------------------
+
+תאריך : @DATE@
+משתמש : @USER@
+תקציר העריכה: @SUMMARY@
+המהדורה הישנה: @OLDPAGE@
+המהדורה החדשה: @NEWPAGE@
+
+לביטול התרעות בנוגע לעמוד, יש להיכנס לאתר הוויקי בכתובת
+@DOKUWIKIURL@ ואז לבקר בדף
+@NEWPAGE@
+ולבטל את המינוי לקבלת שינויים בדף ו/או במרחב השם.
+
+--
+הודעת דוא״ל זו נוצרה על ידי ה־DokuWiki הזמין בכתובת
+@DOKUWIKIURL@ \ No newline at end of file
diff --git a/inc/lang/hi/lang.php b/inc/lang/hi/lang.php
index b8af3becd..00e5589d8 100644
--- a/inc/lang/hi/lang.php
+++ b/inc/lang/hi/lang.php
@@ -79,11 +79,8 @@ $lang['current'] = 'वर्तमान';
$lang['yours'] = 'आपका संस्करणः';
$lang['diff'] = 'वर्तमान संशोधन में मतभेद दिखाइये |';
$lang['diff2'] = 'चयनित संशोधन के बीच में मतभेद दिखाइये |';
-$lang['line'] = 'रेखा
-';
-$lang['youarehere'] = 'आप यहाँ हैं |
-
-';
+$lang['line'] = 'रेखा';
+$lang['youarehere'] = 'आप यहाँ हैं |';
$lang['lastmod'] = 'अंतिम बार संशोधित';
$lang['by'] = 'के द्वारा';
$lang['deleted'] = 'हटाया';
@@ -121,8 +118,7 @@ $lang['i_superuser'] = 'महाउपयोगकर्ता';
$lang['i_retry'] = 'पुनःप्रयास';
$lang['mu_gridsize'] = 'आकार';
$lang['mu_gridstat'] = 'स्थिति';
-$lang['mu_browse'] = 'ब्राउज़
-';
+$lang['mu_browse'] = 'ब्राउज़';
$lang['mu_toobig'] = 'बहुत बड़ा';
$lang['mu_ready'] = 'अपलोड करने के लिए तैयार';
$lang['mu_done'] = 'पूर्ण';
diff --git a/inc/lang/hr/lang.php b/inc/lang/hr/lang.php
index 545498dee..a76bde2e8 100644
--- a/inc/lang/hr/lang.php
+++ b/inc/lang/hr/lang.php
@@ -6,6 +6,7 @@
* @author Tomo Krajina <aaa@puzz.info>
* @author Branko Rihtman <theney@gmail.com>
* @author Dražen Odobašić <dodobasic@gmail.com>
+ * @author Dejan Igrec dejan.igrec@gmail.com
*/
$lang['encoding'] = 'utf-8';
$lang['direction'] = 'ltr';
@@ -19,7 +20,7 @@ $lang['btn_source'] = 'Prikaži kod dokumenta';
$lang['btn_show'] = 'Prikaži dokument';
$lang['btn_create'] = 'Novi dokument';
$lang['btn_search'] = 'Pretraži';
-$lang['btn_save'] = 'Snimi';
+$lang['btn_save'] = 'Spremi';
$lang['btn_preview'] = 'Prikaži';
$lang['btn_top'] = 'Na vrh';
$lang['btn_newer'] = '<< noviji';
@@ -39,15 +40,14 @@ $lang['btn_back'] = 'Povratak';
$lang['btn_backlink'] = 'Povratni linkovi';
$lang['btn_backtomedia'] = 'Povratak na Mediafile izbornik';
$lang['btn_subscribe'] = 'Pretplati se na promjene dokumenta';
-$lang['btn_unsubscribe'] = 'Odjavi pretplatu o promjenama dokumenta';
-$lang['btn_subscribens'] = 'Pretplati se na promjene imenskog prostora';
-$lang['btn_unsubscribens'] = 'Odjavi pretplatu o promjenama imenskog prostora';
$lang['btn_profile'] = 'Ažuriraj profil';
$lang['btn_reset'] = 'Poništi promjene';
$lang['btn_resendpwd'] = 'Pošalji novu lozinku';
$lang['btn_draft'] = 'Uredi nacrt dokumenta';
$lang['btn_recover'] = 'Vrati prijašnji nacrt dokumenta';
$lang['btn_draftdel'] = 'Obriši nacrt dokumenta';
+$lang['btn_revert'] = 'Vrati';
+$lang['btn_register'] = 'Registracija';
$lang['loggedinas'] = 'Prijavljen kao';
$lang['user'] = 'Korisničko ime';
$lang['pass'] = 'Lozinka';
@@ -57,7 +57,6 @@ $lang['passchk'] = 'Ponoviti';
$lang['remember'] = 'Zapamti me';
$lang['fullname'] = 'Ime i prezime';
$lang['email'] = 'Email';
-$lang['register'] = 'Registracija';
$lang['profile'] = 'Korisnički profil';
$lang['badlogin'] = 'Ne ispravno korisničko ime ili lozinka.';
$lang['minoredit'] = 'Manje izmjene';
@@ -86,13 +85,45 @@ $lang['resendpwdconfirm'] = 'Potvrdni link je poslan emailom.';
$lang['resendpwdsuccess'] = 'Nova lozinka je poslana emailom.';
$lang['license'] = 'Osim na mjestima gdje je naznačeno drugačije, sadržaj ovog wikija je licenciran sljedećom licencom:';
$lang['licenseok'] = 'Pažnja: promjenom ovog dokumenta pristajete licencirati sadržaj sljedećom licencom: ';
+$lang['searchmedia'] = 'Traži naziv datoteke:';
+$lang['searchmedia_in'] = 'Traži u %s';
$lang['txt_upload'] = 'Odaberite datoteku za postavljanje';
$lang['txt_filename'] = 'Postaviti kao (nije obavezno)';
$lang['txt_overwrt'] = 'Prepiši postojeću datoteku';
$lang['lockedby'] = 'Zaključao';
$lang['lockexpire'] = 'Zaključano do';
$lang['willexpire'] = 'Dokument kojeg mijenjate će biti zaključan još 1 minutu.\n Ukoliko želite i dalje raditi izmjene na dokumentu - kliknite na "Pregled".';
-$lang['js']['notsavedyet'] = "Vaše izmjene će se izgubiti.\nŽelite li nastaviti?";
+$lang['js']['notsavedyet'] = 'Vaše izmjene će se izgubiti.
+Želite li nastaviti?';
+$lang['js']['searchmedia'] = 'Traži datoteke';
+$lang['js']['keepopen'] = 'Ostavi prozor otvoren nakon izbora';
+$lang['js']['hidedetails'] = 'Sakrij detalje';
+$lang['js']['mediatitle'] = 'Postavke poveznice';
+$lang['js']['mediadisplay'] = 'Vrsta poveznice';
+$lang['js']['mediaalign'] = 'Poravnanje';
+$lang['js']['mediasize'] = 'Veličina slike';
+$lang['js']['mediatarget'] = 'Cilj poveznice';
+$lang['js']['mediaclose'] = 'Zatvori';
+$lang['js']['mediainsert'] = 'Umetni';
+$lang['js']['mediadisplayimg'] = 'Prikaži sliku.';
+$lang['js']['mediadisplaylnk'] = 'Prikaži samo poveznicu.';
+$lang['js']['mediasmall'] = 'Mala verzija.';
+$lang['js']['mediamedium'] = 'Srednja verzija.';
+$lang['js']['medialarge'] = 'Velika verzija.';
+$lang['js']['mediaoriginal'] = 'Originalna verzija.';
+$lang['js']['medialnk'] = 'Poveznica na stranicu s detaljima';
+$lang['js']['mediadirect'] = 'Direktna poveznica na original';
+$lang['js']['medianolnk'] = 'Bez poveznice';
+$lang['js']['medianolink'] = 'Nemoj povezati sliku';
+$lang['js']['medialeft'] = 'Poravnaj sliku lijevo.';
+$lang['js']['mediaright'] = 'Poravnaj sliku desno.';
+$lang['js']['mediacenter'] = 'Poravnaj sliku u sredinu.';
+$lang['js']['medianoalign'] = 'Bez poravnanja.';
+$lang['js']['nosmblinks'] = 'Linkovi na dijeljene Windows mape rade samo s Internet Explorerom. Link je još uvijek moguće kopirati i zalijepiti.';
+$lang['js']['linkwiz'] = 'Čarobnjak za poveznice';
+$lang['js']['linkto'] = 'Poveznica na:';
+$lang['js']['del_confirm'] = 'Zbilja želite obrisati odabrane stavke?';
+$lang['js']['mu_btn'] = 'Postavi više datoteka odjednom';
$lang['rssfailed'] = 'Došlo je do greške prilikom preuzimanja feed-a: ';
$lang['nothingfound'] = 'Traženi dokumetni nisu pronađeni.';
$lang['mediaselect'] = 'Mediafile datoteke';
@@ -110,10 +141,7 @@ $lang['deletefail'] = '"%s" se ne može obrisati - provjerite dozvole
$lang['mediainuse'] = 'Datoteka "%s" nije obrisana - još uvijek se koristi.';
$lang['namespaces'] = 'Imenski prostori';
$lang['mediafiles'] = 'Datoteke u';
-$lang['js']['keepopen'] = 'Ostavi prozor otvoren nakon izbora';
-$lang['js']['hidedetails'] = 'Sakrij detalje';
-$lang['js']['nosmblinks'] = 'Linkovi na dijeljene Windows mape rade samo s Internet Explorerom. Link je još uvijek moguće kopirati i zalijepiti.';
-$lang['js']['mu_btn'] = 'Postavi više datoteka odjednom';
+$lang['accessdenied'] = 'Nemate potrebne dozvole za pregled ove stranice.';
$lang['mediausage'] = 'Koristi sljedeću sintaksu za referenciranje ove datoteke:';
$lang['mediaview'] = 'Pregledaj originalnu datoteku';
$lang['mediaroot'] = 'root';
@@ -129,6 +157,10 @@ $lang['current'] = 'trenutno';
$lang['yours'] = 'Vaša inačica';
$lang['diff'] = 'Prikaži razlike u odnosu na trenutnu inačicu';
$lang['diff2'] = 'Pokaži razlike između odabranih inačica';
+$lang['difflink'] = 'Poveznica na ovaj prikaz usporedbe';
+$lang['diff_type'] = 'Razlike u prikazu:';
+$lang['diff_inline'] = 'U istoj razini';
+$lang['diff_side'] = 'Usporedo';
$lang['line'] = 'Redak';
$lang['breadcrumb'] = 'Putanja';
$lang['youarehere'] = 'Vi ste ovdje';
@@ -140,8 +172,10 @@ $lang['restored'] = 'vraćena prijašnja inačica';
$lang['external_edit'] = 'vanjsko uređivanje';
$lang['summary'] = 'Sažetak izmjena';
$lang['noflash'] = 'Za prikazivanje ovog sadržaja potreban je <a href="http://www.adobe.com/products/flashplayer/">Adobe Flash Plugin</a>';
+$lang['download'] = 'Preuzmi isječak';
$lang['mail_newpage'] = 'stranica dodana:';
$lang['mail_changed'] = 'stranica izmjenjena:';
+$lang['mail_subscribe_list'] = 'stranice promijenjene u imenskom prostoru:';
$lang['mail_new_user'] = 'novi korisnik:';
$lang['mail_upload'] = 'datoteka postavljena:';
$lang['qb_bold'] = 'Podebljani tekst';
@@ -168,7 +202,7 @@ $lang['qb_media'] = 'Dodaj slike i ostale datoteke';
$lang['qb_sig'] = 'Potpis';
$lang['qb_smileys'] = 'Smiješkići';
$lang['qb_chars'] = 'Posebni znakovi';
-$lang['js']['del_confirm'] = 'Zbilja želite obrisati odabrane stavke?';
+$lang['upperns'] = 'Skoči u nadređeni imenski prostor';
$lang['admin_register'] = 'Dodaj novog korisnika';
$lang['metaedit'] = 'Uredi metapodatake';
$lang['metasaveerr'] = 'Neuspješno zapisivanje metapodataka';
@@ -184,11 +218,22 @@ $lang['img_copyr'] = 'Autorsko pravo';
$lang['img_format'] = 'Format';
$lang['img_camera'] = 'Kamera';
$lang['img_keywords'] = 'Ključne riječi';
-$lang['subscribe_success'] = 'Dodan %s na listu preplata za %s';
-$lang['subscribe_error'] = 'Greška prilikom dodavanju %s na listu pretplata za %s';
-$lang['subscribe_noaddress'] = 'Nije postavljena email adresa za vaš korisnički profil, nije Vas moguće dodati na listu pretplata';
-$lang['unsubscribe_success'] = 'Izbrisan %s s liste pretplata za %s';
-$lang['unsubscribe_error'] = 'Greška prilikom brisanja %s s liste pretplatnika za %s';
+$lang['subscr_subscribe_success'] = 'Dodan %s u listu pretplatnika za %s';
+$lang['subscr_subscribe_error'] = 'Greška kod dodavanja %s u listu pretplatnika za %s';
+$lang['subscr_subscribe_noaddress'] = 'Ne postoji adresa povezana sa vašim podacima za prijavu, stoga ne možete biti dodani u listu pretplatnika';
+$lang['subscr_unsubscribe_success'] = 'Uklonjen %s iz liste pretplatnika za %s';
+$lang['subscr_unsubscribe_error'] = 'Greška prilikom uklanjanja %s iz liste pretplatnika za %s';
+$lang['subscr_already_subscribed'] = '%s je već pretplaćen na %s';
+$lang['subscr_not_subscribed'] = '%s nije pretplaćen na %s';
+$lang['subscr_m_not_subscribed'] = 'Trenutno niste pretplaćeni na trenutnu stranicu ili imenski prostor.';
+$lang['subscr_m_new_header'] = 'Dodaj pretplatu';
+$lang['subscr_m_current_header'] = 'Trenutne pretplate';
+$lang['subscr_m_unsubscribe'] = 'Odjavi pretplatu';
+$lang['subscr_m_subscribe'] = 'Pretplati se';
+$lang['subscr_m_receive'] = 'Primaj';
+$lang['subscr_style_every'] = 'email za svaku promjenu';
+$lang['subscr_style_digest'] = 'email s kratakim prikazom promjena za svaku stranicu (svaka %.2f dana)';
+$lang['subscr_style_list'] = 'listu promijenjenih stranica od zadnjeg primljenog email-a (svaka %.2f dana)';
$lang['authmodfailed'] = 'Greška u konfiguraciji korisničke autentifikacije. Molimo Vas da kontaktirate administratora.';
$lang['authtempfail'] = 'Autentifikacija korisnika je privremeno nedostupna. Molimo Vas da kontaktirate administratora.';
$lang['i_chooselang'] = 'Izaberite vaš jezik';
@@ -198,3 +243,42 @@ $lang['i_enableacl'] = 'Omogući ACL (preporučeno)';
$lang['i_superuser'] = 'Superkorisnik';
$lang['i_problems'] = 'Instalacija je pronašla probleme koji su naznačeni ispod. Nije moguće nastaviti dok se ti problemi ne riješe.';
$lang['i_modified'] = 'Zbog sigurnosnih razlog, ova skripta ce raditi samo sa novim i nepromijenjenim instalacijama dokuWikija. Preporucujemo da ili re-ekstraktirate fajlove iz downloadovanog paketa ili konsultujete pune a href="http://dokuwiki.org/install">Instrukcije za instalaciju Dokuwikija</a>';
+$lang['i_funcna'] = 'PHP funkcija <code>%s</code> nije dostupna. Možda ju je vaš pružatelj hostinga onemogućio iz nekog razloga?';
+$lang['i_phpver'] = 'Vaša PHP verzija <code>%s</code> je niža od potrebne <code>%s</code>. Trebate nadograditi vašu PHP instalaciju.';
+$lang['i_permfail'] = '<code>%s</code> nema dozvolu pisanja od strane DokuWiki. Trebate podesiti dozvole pristupa tom direktoriju.';
+$lang['i_confexists'] = '<code>%s</code> već postoji';
+$lang['i_writeerr'] = 'Ne može se kreirati <code>%s</code>. Trebate provjeriti dozvole direktorija/datoteke i kreirati dokument ručno.';
+$lang['i_badhash'] = 'neprepoznat ili promijenjen dokuwiki.php (hash=<code>%s</code>)';
+$lang['i_badval'] = '<code>%s</code> - nedozvoljena ili prazna vrijednost';
+$lang['i_success'] = 'Konfiguracija je uspješno završena. Sada možete obrisati install.php datoteku. Nastavite na <a href="doku.php">vaš novi DokuWiki</a>.';
+$lang['i_failure'] = 'Pojavile su se neke greške prilikom pisanja konfiguracijskih datoteka. Morati ćete ih ručno ispraviti da bi mogli koristiti <a href="doku.php">vaš novi DokuWiki</a>.';
+$lang['i_policy'] = 'Inicijalna ACL politika';
+$lang['i_pol0'] = 'Otvoreni Wiki (čitanje, pisanje, učitavanje za sve)';
+$lang['i_pol1'] = 'Javni Wiki (čitanje za sve, pisanje i učitavanje za registrirane korisnike)';
+$lang['i_pol2'] = 'Zatvoreni Wiki (čitanje, pisanje, učitavanje samo za registrirane korisnike)';
+$lang['i_retry'] = 'Pokušaj ponovo';
+$lang['i_license'] = 'Molim odaberite licencu pod kojom želite postavljati vaš sadržaj:';
+$lang['mu_intro'] = 'Ovdje možeš učitati više datoteka odjednom. Klikni gumb pregled te ih dodajte u red. Pritisnite učitaj kad ste gotovi.';
+$lang['mu_gridname'] = 'Naziv datoteke';
+$lang['mu_gridsize'] = 'Veličina';
+$lang['mu_gridstat'] = 'Status';
+$lang['mu_namespace'] = 'Imenski prostor';
+$lang['mu_browse'] = 'Pregled';
+$lang['mu_toobig'] = 'prevelik';
+$lang['mu_ready'] = 'spremno za učitavanje';
+$lang['mu_done'] = 'gotovo';
+$lang['mu_fail'] = 'nije uspio';
+$lang['mu_authfail'] = 'sjednica istekla';
+$lang['mu_progress'] = '@PCT@% učitan';
+$lang['mu_filetypes'] = 'Dozvoljeni tipovi datoteka';
+$lang['mu_info'] = 'datoteke učitane.';
+$lang['mu_lasterr'] = 'Posljednja greška:';
+$lang['recent_global'] = 'Trenutno gledate promjene unutar <b>%s</b> imenskog prostora. Također možete <a href="%s">vidjeti zadnje promjene cijelog wiki-a</a>';
+$lang['years'] = '%d godina prije';
+$lang['months'] = '%d mjeseci prije';
+$lang['weeks'] = '%d tjedana prije';
+$lang['days'] = '%d dana prije';
+$lang['hours'] = '%d sati prije';
+$lang['minutes'] = '%d minuta prije';
+$lang['seconds'] = '%d sekundi prije';
+$lang['wordblock'] = 'Vaša promjena nije spremljena jer sadrži blokirani tekst (spam).';
diff --git a/inc/lang/hr/read.txt b/inc/lang/hr/read.txt
index d036c0a7b..221f1b200 100644
--- a/inc/lang/hr/read.txt
+++ b/inc/lang/hr/read.txt
@@ -1 +1 @@
-Nije dopušteno mijenjati sadržaj ove stranice.
+Ova stranica se može samo čitati. Možete vidjeti kod, ali ga ne možete mijenjati. Javite se vašem administratoru ako se s tim ne slažete. \ No newline at end of file
diff --git a/inc/lang/hr/resendpwd.txt b/inc/lang/hr/resendpwd.txt
index fe2c72bf3..ed25f985c 100644
--- a/inc/lang/hr/resendpwd.txt
+++ b/inc/lang/hr/resendpwd.txt
@@ -1,3 +1,3 @@
====== Slanje nove lozinke ======
-Ispunite potrebne podatke da biste dobili novu lozinku za Vaš korisnički račun.
+Ispunite potrebne podatke da biste dobili novu lozinku za Vaš korisnički račun. Link za potvrdu biti će poslan na Vašu email adresu.
diff --git a/inc/lang/hu/lang.php b/inc/lang/hu/lang.php
index b3cd87c29..35e810ff0 100644
--- a/inc/lang/hu/lang.php
+++ b/inc/lang/hu/lang.php
@@ -5,11 +5,11 @@
* @license GPL 2 (http://www.gnu.org/licenses/gpl.html)
* @author Ziegler Gábor <gziegler@freemail.hu>
* @author Sandor TIHANYI <stihanyi+dw@gmail.com>
- * @author Siaynoq Siaynoq <siaynoqmage@gmail.com>
* @author Siaynoq Mage <siaynoqmage@gmail.com>
* @author schilling.janos@gmail.com
- * @author Szabó Dávid (szabo.david@gyumolcstarhely.hu)
* @author Szabó Dávid <szabo.david@gyumolcstarhely.hu>
+ * @author Sándor TIHANYI <stihanyi+dw@gmail.com>
+ * @author David Szabo <szabo.david@gyumolcstarhely.hu>
*/
$lang['encoding'] = 'utf-8';
$lang['direction'] = 'ltr';
@@ -50,6 +50,7 @@ $lang['btn_draft'] = 'Piszkozat szerkesztése';
$lang['btn_recover'] = 'Piszkozat folytatása';
$lang['btn_draftdel'] = 'Piszkozat törlése';
$lang['btn_revert'] = 'Helyreállítás';
+$lang['btn_register'] = 'Regisztráció';
$lang['loggedinas'] = 'Belépett felhasználó: ';
$lang['user'] = 'Azonosító';
$lang['pass'] = 'Jelszó';
@@ -59,7 +60,6 @@ $lang['passchk'] = 'még egyszer';
$lang['remember'] = 'Emlékezz rám';
$lang['fullname'] = 'Teljes név';
$lang['email'] = 'E-Mail';
-$lang['register'] = 'Regisztráció';
$lang['profile'] = 'Személyes beállítások';
$lang['badlogin'] = 'Sajnáljuk, az azonosító, vagy a jelszó nem jó.';
$lang['minoredit'] = 'Apróbb változások';
@@ -162,6 +162,9 @@ $lang['yours'] = 'A te változatod';
$lang['diff'] = 'a különbségeket mutatja az aktuális változathoz képest';
$lang['diff2'] = 'a különbségeket mutatja a kiválasztott változatok között';
$lang['difflink'] = 'Összehasonlító nézet linkje';
+$lang['diff_type'] = 'Összehasonlítás módja:';
+$lang['diff_inline'] = 'Sorok között';
+$lang['diff_side'] = 'Kétoldalas';
$lang['line'] = 'sorszám';
$lang['breadcrumb'] = 'Nyomvonal';
$lang['youarehere'] = 'Itt vagy';
diff --git a/inc/lang/ia/lang.php b/inc/lang/ia/lang.php
index f68467543..bdfef88f4 100644
--- a/inc/lang/ia/lang.php
+++ b/inc/lang/ia/lang.php
@@ -50,6 +50,7 @@ $lang['btn_draft'] = 'Modificar version provisori';
$lang['btn_recover'] = 'Recuperar version provisori';
$lang['btn_draftdel'] = 'Deler version provisori';
$lang['btn_revert'] = 'Restaurar';
+$lang['btn_register'] = 'Crear conto';
$lang['loggedinas'] = 'Session aperite como';
$lang['user'] = 'Nomine de usator';
$lang['pass'] = 'Contrasigno';
@@ -59,7 +60,6 @@ $lang['passchk'] = 'un altere vice';
$lang['remember'] = 'Memorar me';
$lang['fullname'] = 'Nomine real';
$lang['email'] = 'E-mail';
-$lang['register'] = 'Crear conto';
$lang['profile'] = 'Profilo de usator';
$lang['badlogin'] = 'Le nomine de usator o le contrasigno es incorrecte.';
$lang['minoredit'] = 'Modificationes minor';
diff --git a/inc/lang/id-ni/lang.php b/inc/lang/id-ni/lang.php
index 4e26677e0..9c04f0259 100644
--- a/inc/lang/id-ni/lang.php
+++ b/inc/lang/id-ni/lang.php
@@ -41,6 +41,7 @@ $lang['btn_reset'] = 'Fawu\'a';
$lang['btn_resendpwd'] = 'Fa\'ohe\'ö kode sibohou';
$lang['btn_draft'] = 'Fawu\'a wanura';
$lang['btn_draftdel'] = 'Heta zura';
+$lang['btn_register'] = 'Fasura\'ö';
$lang['loggedinas'] = 'Möi bakha zotöi';
$lang['user'] = 'Töi';
$lang['pass'] = 'Kode';
@@ -50,7 +51,6 @@ $lang['passchk'] = 'Sura sakalitö';
$lang['remember'] = 'Töngöni ndra\'o';
$lang['fullname'] = 'Töi safönu';
$lang['email'] = 'Imele';
-$lang['register'] = 'Fasura\'ö';
$lang['profile'] = 'Töi pörofile';
$lang['badlogin'] = 'Bologö dödöu, fasala döi faoma kode.';
$lang['minoredit'] = 'Famawu\'a ma\'ifu';
diff --git a/inc/lang/id/lang.php b/inc/lang/id/lang.php
index 3ea1b394a..c1480f518 100644
--- a/inc/lang/id/lang.php
+++ b/inc/lang/id/lang.php
@@ -45,6 +45,7 @@ $lang['btn_reset'] = 'Reset';
$lang['btn_resendpwd'] = 'Kirim password baru';
$lang['btn_draft'] = 'Edit draft';
$lang['btn_draftdel'] = 'Hapus draft';
+$lang['btn_register'] = 'Daftar';
$lang['loggedinas'] = 'Login sebagai ';
$lang['user'] = 'Username';
$lang['pass'] = 'Password';
@@ -54,7 +55,6 @@ $lang['passchk'] = 'sekali lagi';
$lang['remember'] = 'Ingat saya';
$lang['fullname'] = 'Nama lengkap';
$lang['email'] = 'E-Mail';
-$lang['register'] = 'Daftar';
$lang['profile'] = 'Profil User';
$lang['badlogin'] = 'Maaf, username atau password salah.';
$lang['minoredit'] = 'Perubahan Minor';
diff --git a/inc/lang/is/lang.php b/inc/lang/is/lang.php
index ba1ab2c04..7388e6908 100644
--- a/inc/lang/is/lang.php
+++ b/inc/lang/is/lang.php
@@ -54,6 +54,7 @@ $lang['btn_draft'] = 'Breyta uppkasti';
$lang['btn_recover'] = 'Endurheimta uppkast';
$lang['btn_draftdel'] = 'Eyða uppkasti';
$lang['btn_revert'] = 'Endurheimta';
+$lang['btn_register'] = 'Skráning';
$lang['loggedinas'] = 'Innskráning sem';
$lang['user'] = 'Notendanafn';
$lang['pass'] = 'Aðgangsorð';
@@ -63,7 +64,6 @@ $lang['passchk'] = 'Aðgangsorð (aftur)';
$lang['remember'] = 'Muna.';
$lang['fullname'] = 'Fullt nafn þitt*';
$lang['email'] = 'Tölvupóstfangið þitt*';
-$lang['register'] = 'Skráning';
$lang['profile'] = 'Notendastillingar';
$lang['badlogin'] = 'Því miður, notandanafn eða aðgangsorð var rangur.';
$lang['minoredit'] = 'Minniháttar breyting';
diff --git a/inc/lang/it/denied.txt b/inc/lang/it/denied.txt
index c6ba610c4..d21956a5b 100644
--- a/inc/lang/it/denied.txt
+++ b/inc/lang/it/denied.txt
@@ -1,5 +1,5 @@
====== Accesso negato ======
-Non hai i diritti per continuare. Hai forse dimenticato di effettuare l'accesso?
+Non hai i diritti per continuare. Forse hai dimenticato di effettuare l'accesso?
diff --git a/inc/lang/it/install.html b/inc/lang/it/install.html
index 471734412..3454fbc3e 100644
--- a/inc/lang/it/install.html
+++ b/inc/lang/it/install.html
@@ -1,10 +1,10 @@
-<p>Questa pagina ti assisterà durante la prima installazione e configurazione di
+<p>Questa pagina ti assisterà durante l'installazione e la prima configurazione di
<a href="http://dokuwiki.org">Dokuwiki</a>. Ulteriori informazioni sulla
procedura di installazione sono reperibili nella
<a href="http://dokuwiki.org/installer">pagina di documentazione</a>.</p>
-<p>DokuWiki utilizza normali file per la memorizzazione di pagine wiki ed altre
-informazioni associate a tali pagine (es. immagini, indici per la ricerca, vecchie
+<p>DokuWiki utilizza dei normali file per la memorizzazione delle pagine del wiki e
+delle altre informazioni associate a tali pagine (es. immagini, indici per la ricerca, vecchie
revisioni, ecc.). Per poter operare correttamente DokuWiki
<strong>deve</strong> accedere in scrittura alle directory che contengono tali
file. La procedura di installazione non è in grado di impostare i permessi sulle directory. Questo
@@ -19,6 +19,6 @@ Non è necessario per il funzionamento di DokuWiki, ma renderà Dokuwiki più fa
da amministrare.</p>
<p>Gli utenti esperti o con particolari esigenze di installazione dovrebbero far riferimento ai
-seguenti link per i dettagli riguardanti
+seguenti link per dettagli sulle
<a href="http://dokuwiki.org/install">istruzioni per l'installazione</a>
-e i <a href="http://dokuwiki.org/config">parametri di configurazione</a>.</p>
+e sui <a href="http://dokuwiki.org/config">parametri di configurazione</a>.</p>
diff --git a/inc/lang/it/lang.php b/inc/lang/it/lang.php
index 4bfafb060..682f5b8c2 100644
--- a/inc/lang/it/lang.php
+++ b/inc/lang/it/lang.php
@@ -4,16 +4,15 @@
*
* @license GPL 2 (http://www.gnu.org/licenses/gpl.html)
* @author Giorgio Vecchiocattivi <giorgio@vecchio.it>
- * @author Roberto Bolli <http://www.rbnet.it/>
+ * @author Roberto Bolli [http://www.rbnet.it/]
* @author Silvia Sargentoni <polinnia@tin.it>
* @author Diego Pierotto <ita.translations@tiscali.it>
- * @author Diego Pierotto ita.translations@tiscali.it
- * @author ita.translations@tiscali.it
* @author Lorenzo Breda <lbreda@gmail.com>
* @author snarchio@alice.it
* @author robocap <robocap1@gmail.com>
* @author Matteo Carnevali <rekstorm@gmail.com>
- * @author Osman Tekin osman.tekin93@hotmail.it
+ * @author Osman Tekin <osman.tekin93@hotmail.it>
+ * @author Jacopo Corbetta <jacopo.corbetta@gmail.com>
*/
$lang['encoding'] = 'utf-8';
$lang['direction'] = 'ltr';
@@ -44,7 +43,7 @@ $lang['btn_admin'] = 'Amministrazione';
$lang['btn_update'] = 'Aggiorna';
$lang['btn_delete'] = 'Elimina';
$lang['btn_back'] = 'Indietro';
-$lang['btn_backlink'] = 'Backlinks';
+$lang['btn_backlink'] = 'Puntano qui';
$lang['btn_backtomedia'] = 'Torna alla selezione file';
$lang['btn_subscribe'] = 'Sottoscrivi modifiche';
$lang['btn_profile'] = 'Aggiorna profilo';
@@ -54,30 +53,30 @@ $lang['btn_draft'] = 'Modifica bozza';
$lang['btn_recover'] = 'Ripristina bozza';
$lang['btn_draftdel'] = 'Elimina bozza';
$lang['btn_revert'] = 'Ripristina';
+$lang['btn_register'] = 'Registrazione';
$lang['loggedinas'] = 'Collegato come';
$lang['user'] = 'Nome utente';
$lang['pass'] = 'Password';
$lang['newpass'] = 'Nuova password';
$lang['oldpass'] = 'Conferma password attuale';
$lang['passchk'] = 'Ripeti password';
-$lang['remember'] = 'Ricorda automaticamente';
+$lang['remember'] = 'Memorizza nome utente e password';
$lang['fullname'] = 'Nome completo';
$lang['email'] = 'Email';
-$lang['register'] = 'Registrazione';
$lang['profile'] = 'Profilo utente';
$lang['badlogin'] = 'Il nome utente o la password non sono validi.';
$lang['minoredit'] = 'Modifiche minori';
$lang['draftdate'] = 'Bozza salvata in automatico il';
-$lang['nosecedit'] = 'La pagina nel frattempo è cambiata, la sezione info è scaduta, caricata invece la pagina intera.';
+$lang['nosecedit'] = 'La pagina è stata modificata nel frattempo; è impossibile modificare solo la sezione scelta, quindi è stata caricata la pagina intera.';
$lang['regmissing'] = 'Devi riempire tutti i campi.';
$lang['reguexists'] = 'Il nome utente inserito esiste già.';
$lang['regsuccess'] = 'L\'utente è stato creato. La password è stata spedita via email.';
$lang['regsuccess2'] = 'L\'utente è stato creato.';
-$lang['regmailfail'] = 'Sembra che ci sia stato un errore nell\'invio della email. Contatta il tuo amministratore!';
-$lang['regbadmail'] = 'L\'indirizzo email fornito sembra essere non valido - se pensi che ci sia un errore contatta il tuo amministratore';
+$lang['regmailfail'] = 'Sembra che ci sia stato un errore nell\'invio della email. Contatta l\'amministratore!';
+$lang['regbadmail'] = 'L\'indirizzo email fornito sembra essere non valido - se pensi che ci sia un errore contatta l\'amministratore';
$lang['regbadpass'] = 'Le due password inserite non coincidono, prova di nuovo.';
-$lang['regpwmail'] = 'La tua password DokuWiki';
-$lang['reghere'] = 'Non hai ancora un accesso? Registrati qui.';
+$lang['regpwmail'] = 'La tua password per DokuWiki';
+$lang['reghere'] = 'Non sei ancora registrato? Registrati qui.';
$lang['profna'] = 'Questo wiki non supporta modifiche al profilo';
$lang['profnochange'] = 'Nessuna modifica, niente da aggiornare.';
$lang['profnoempty'] = 'Nome o indirizzo email vuoti non sono consentiti.';
@@ -90,9 +89,9 @@ $lang['resendpwdnouser'] = 'Impossibile trovare questo utente nel database
$lang['resendpwdbadauth'] = 'Spiacenti, questo codice di autorizzazione non è valido. Assicurati di aver usato il link completo di conferma.';
$lang['resendpwdconfirm'] = 'Un link di conferma è stato spedito via email.';
$lang['resendpwdsuccess'] = 'La nuova password è stata spedita via email.';
-$lang['license'] = 'Ad eccezione da dove è diversamente indicato, il contenuto di questo wiki è sotto la seguente licenza:';
+$lang['license'] = 'Ad eccezione da dove è diversamente indicato, il contenuto di questo wiki è soggetto alla seguente licenza:';
$lang['licenseok'] = 'Nota: modificando questa pagina accetti di rilasciare il contenuto sotto la seguente licenza:';
-$lang['searchmedia'] = 'Cerca nome file:';
+$lang['searchmedia'] = 'Cerca file di nome:';
$lang['searchmedia_in'] = 'Cerca in &s';
$lang['txt_upload'] = 'Seleziona un file da caricare';
$lang['txt_filename'] = 'Carica come (opzionale)';
@@ -126,7 +125,7 @@ $lang['js']['mediaright'] = 'Allinea l\'immagine a destra.';
$lang['js']['mediacenter'] = 'Allinea l\'immagine al centro.';
$lang['js']['medianoalign'] = 'Non allineare.';
$lang['js']['nosmblinks'] = 'I collegamenti con le risorse condivise di Windows funzionano solo con Microsoft Internet Explorer.
-Puoi fare un copia/incolla di questo collegamento.';
+È comunque possibile copiare e incollare il collegamento.';
$lang['js']['linkwiz'] = 'Collegamento guidato';
$lang['js']['linkto'] = 'Collega a:';
$lang['js']['del_confirm'] = 'Eliminare veramente questa voce?';
@@ -136,12 +135,12 @@ $lang['nothingfound'] = 'Nessun risultato trovato.';
$lang['mediaselect'] = 'Selezione dei file';
$lang['fileupload'] = 'File caricato';
$lang['uploadsucc'] = 'Invio riuscito';
-$lang['uploadfail'] = 'Invio fallito. Contatta l\'amministratore.';
+$lang['uploadfail'] = 'Invio fallito. È possibile che si tratti di un problema di permessi.';
$lang['uploadwrong'] = 'Invio rifiutato. Questa estensione di file non è ammessa';
-$lang['uploadexist'] = 'Il file esiste già . Invio annullato.';
-$lang['uploadbadcontent'] = 'Il contenuto caricato non corrisponde all\'estensione del file %s.';
-$lang['uploadspam'] = 'Il caricamento è stato bloccato dalla lista nera di spam.';
-$lang['uploadxss'] = 'Il caricamento è stato bloccato perchè il contenuto potrebbe essere malizioso.';
+$lang['uploadexist'] = 'Il file esiste già. Invio annullato.';
+$lang['uploadbadcontent'] = 'Il tipo di contenuto caricato non corrisponde all\'estensione del file %s.';
+$lang['uploadspam'] = 'Il caricamento è stato bloccato come spam perché presente nella lista nera.';
+$lang['uploadxss'] = 'Il caricamento è stato bloccato perchè il contenuto potrebbe essere un virus o presentare problemi di sicurezza.';
$lang['uploadsize'] = 'Il file caricato è troppo grande. (massimo %s)';
$lang['deletesucc'] = 'Il file "%s" è stato eliminato.';
$lang['deletefail'] = '"%s" non può essere eliminato - verifica i permessi.';
@@ -164,7 +163,7 @@ $lang['current'] = 'versione attuale';
$lang['yours'] = 'la tua versione';
$lang['diff'] = 'differenze con la versione attuale';
$lang['diff2'] = 'differenze tra le versioni selezionate';
-$lang['difflink'] = 'Link all visualizzazione della comparazione';
+$lang['difflink'] = 'Link a questa pagina di confronto';
$lang['line'] = 'Linea';
$lang['breadcrumb'] = 'Traccia';
$lang['youarehere'] = 'Ti trovi qui';
@@ -175,7 +174,7 @@ $lang['created'] = 'creata';
$lang['restored'] = 'versione precedente ripristinata';
$lang['external_edit'] = 'modifica esterna';
$lang['summary'] = 'Oggetto della modifica';
-$lang['noflash'] = 'E\' necessario <a href="http://www.adobe.com/products/flashplayer/">Adobe Flash Plugin</a> per visualizzare questo contenuto.';
+$lang['noflash'] = 'E\' necessario <a href="http://www.adobe.com/products/flashplayer/">il plugin Adobe Flash</a> per visualizzare questo contenuto.';
$lang['download'] = 'Scarica lo "snippet"';
$lang['mail_newpage'] = 'pagina aggiunta:';
$lang['mail_changed'] = 'pagina modificata:';
@@ -222,11 +221,11 @@ $lang['img_copyr'] = 'Copyright';
$lang['img_format'] = 'Formato';
$lang['img_camera'] = 'Camera';
$lang['img_keywords'] = 'Parole chiave';
-$lang['subscr_subscribe_success'] = 'Aggiunto %s alla lista di sottoscrizione %s';
-$lang['subscr_subscribe_error'] = 'Impossibile aggiungere %s alla lista di sottoscrizione %s';
-$lang['subscr_subscribe_noaddress'] = 'Non esiste alcun indirizzo associato al tuo account, non puoi essere aggiunto alla lista di sottoscrizione';
-$lang['subscr_unsubscribe_success'] = 'Rimosso %s dalla lista di sottoscrizione %s';
-$lang['subscr_unsubscribe_error'] = 'Impossibile rimuovere %s dalla lista di sottoscrizione %s';
+$lang['subscr_subscribe_success'] = 'Aggiunto %s alla lista di sottoscrizioni %s';
+$lang['subscr_subscribe_error'] = 'Impossibile aggiungere %s alla lista di sottoscrizioni %s';
+$lang['subscr_subscribe_noaddress'] = 'Non esiste alcun indirizzo associato al tuo account, non puoi essere aggiunto alla lista di sottoscrizioni';
+$lang['subscr_unsubscribe_success'] = 'Rimosso %s dalla lista di sottoscrizioni %s';
+$lang['subscr_unsubscribe_error'] = 'Impossibile rimuovere %s dalla lista di sottoscrizioni %s';
$lang['subscr_already_subscribed'] = '% è già iscritto a %s';
$lang['subscr_not_subscribed'] = '% non è iscritto a %s';
$lang['subscr_m_not_subscribed'] = 'Attualmente non sei iscritto alla pagina o categoria corrente';
@@ -238,34 +237,33 @@ $lang['subscr_m_receive'] = 'Ricevi';
$lang['subscr_style_every'] = 'email per ogni modifica';
$lang['subscr_style_digest'] = 'email riassuntiva delle modifiche di ogni pagina';
$lang['subscr_style_list'] = 'elenco delle pagine modificate dall\'ultima email';
-$lang['authmodfailed'] = 'La configurazione dell\'autenticazione non è corretta. Informa l\'amministratore di questo Wiki.';
-$lang['authtempfail'] = 'L\'autenticazione è temporaneamente non disponibile. Se questa situazione persiste, informa l\'amministratore di questo Wiki.';
+$lang['authmodfailed'] = 'La configurazione dell\'autenticazione non è corretta. Informa l\'amministratore di questo wiki.';
+$lang['authtempfail'] = 'L\'autenticazione è temporaneamente non disponibile. Se questa situazione persiste, informa l\'amministratore di questo wiki.';
$lang['i_chooselang'] = 'Scegli la lingua';
-$lang['i_installer'] = 'Installazione DokuWiki';
+$lang['i_installer'] = 'Installazione di DokuWiki';
$lang['i_wikiname'] = 'Nome Wiki';
$lang['i_enableacl'] = 'Abilita ACL (consigliato)';
$lang['i_superuser'] = 'Amministratore';
$lang['i_problems'] = 'Si sono verificati problemi durante l\'installazione, indicati di seguito. Non è possibile continuare finché non saranno risolti.';
$lang['i_modified'] = 'Per motivi di sicurezza questa procedura funziona solamente con un\'installazione Dokuwiki nuova e non modificata.
-Dovresti ri-estrarre i file dal pacchetto scaricato oppure consultare tutte le
+Prova a estrarre di nuovo i file dal pacchetto scaricato oppure consulta le
<a href="http://dokuwiki.org/install">istruzioni per l\'installazione di Dokuwiki</a>';
$lang['i_funcna'] = 'La funzione PHP <code>%s</code> non è disponibile. Forse è stata disabilitata dal tuo provider per qualche motivo?';
$lang['i_phpver'] = 'La versione di PHP <code>%s</code> è inferiore a quella richiesta <code>%s</code>. Devi aggiornare l\'installazione di PHP.';
$lang['i_permfail'] = 'DokuWiki non può scrivere <code>%s</code>. E\' necessario correggere i permessi per questa directory!';
$lang['i_confexists'] = '<code>%s</code> esiste già';
-$lang['i_writeerr'] = 'Impossibile creare <code>%s</code>. E\' necessario verificare i permessi della directory/file e creare il file manualmente.';
+$lang['i_writeerr'] = 'Impossibile creare <code>%s</code>. E\' necessario verificare i permessi della directory o del file oppure creare il file manualmente.';
$lang['i_badhash'] = 'dokuwiki.php (hash=<code>%s</code>) non riconosciuto o modificato';
$lang['i_badval'] = '<code>%s</code> - valore vuoto o non valido';
-$lang['i_success'] = 'La configurazione è stata completata correttamente. Ora è possibile eliminare il file install.php. Continuare con
-<a href="doku.php">il nuovo DokuWiki</a>.';
-$lang['i_failure'] = 'Si sono verificati errori durante la scrittura dei file di configurazione. Potrebbe essere necessario correggerli manualmente prima di poter utilizzare <a href="doku.php">il nuovo DokuWiki</a>.';
+$lang['i_success'] = 'La configurazione è stata completata correttamente. Ora è possibile eliminare il file install.php. Poi, visita <a href="doku.php">il tuo nuovo DokuWiki</a>.';
+$lang['i_failure'] = 'Si sono verificati errori durante la scrittura dei file di configurazione. Potrebbe essere necessario correggerli manualmente prima di poter utilizzare <a href="doku.php">il tuo nuovo DokuWiki</a>.';
$lang['i_policy'] = 'Regole di accesso iniziali';
$lang['i_pol0'] = 'Wiki Aperto (lettura, scrittura, caricamento file per tutti)';
$lang['i_pol1'] = 'Wiki Pubblico (lettura per tutti, scrittura e caricamento file per gli utenti registrati)';
$lang['i_pol2'] = 'Wiki Chiuso (lettura, scrittura, caricamento file solamente per gli utenti registrati)';
$lang['i_retry'] = 'Riprova';
-$lang['i_license'] = 'Perfavore scegli la licenza in cui vuoi inserire il tuo contenuto:';
-$lang['mu_intro'] = 'Qui si possono caricare più di un file alla volta. Cliccare su "Sfoglia..." per aggiungere i file in coda. Fai click su "Invia file" quando si è pronti.';
+$lang['i_license'] = 'Per favore scegli la licenza sotto cui vuoi rilasciare il contenuto:';
+$lang['mu_intro'] = 'Qui si possono caricare più di un file alla volta. Scegliere "Sfoglia..." per aggiungere file alla coda. Alla fine, fai click su "Invia file".';
$lang['mu_gridname'] = 'Nome file';
$lang['mu_gridsize'] = 'Dimensione';
$lang['mu_gridstat'] = 'Stato';
@@ -280,7 +278,7 @@ $lang['mu_progress'] = '@PCT@% caricato';
$lang['mu_filetypes'] = 'Tipi di file permessi';
$lang['mu_info'] = 'file caricati.';
$lang['mu_lasterr'] = 'Ultimo errore:';
-$lang['recent_global'] = 'Stai attualmente vedendo le modifiche dentro l\'area <b>%s</b>. Puoi anche <a href="%s">vedere le modifiche recenti dell\'intero wiki</a>.';
+$lang['recent_global'] = 'Stai attualmente vedendo le modifiche effettuate nell\'area <b>%s</b>. Puoi anche <a href="%s">vedere le modifiche recenti dell\'intero wiki</a>.';
$lang['years'] = '%d anni fa';
$lang['months'] = '%d mesi fa';
$lang['weeks'] = '%d settimane fa';
diff --git a/inc/lang/it/mailtext.txt b/inc/lang/it/mailtext.txt
index a4506e951..3a326961e 100644
--- a/inc/lang/it/mailtext.txt
+++ b/inc/lang/it/mailtext.txt
@@ -1,16 +1,17 @@
Una pagina su DokuWiki è stata aggiunta o modificata. Questi sono i dettagli:
-Data : @DATE@
-Browser : @BROWSER@
-Indirizzo IP : @IPADDRESS@
-Nome host : @HOSTNAME@
-Vecchia revisione : @OLDPAGE@
-Nuova revisione : @NEWPAGE@
+Data : @DATE@
+Browser : @BROWSER@
+Indirizzo IP : @IPADDRESS@
+Nome host : @HOSTNAME@
+Vecchia revisione : @OLDPAGE@
+Nuova revisione : @NEWPAGE@
Oggetto della modifica : @SUMMARY@
+Utente : @USER@
@DIFF@
--
-Questa email è stata generata dal DokuWiki di
+Questa email è stata generata dal DokuWiki all'indirizzo
@DOKUWIKIURL@
diff --git a/inc/lang/it/password.txt b/inc/lang/it/password.txt
index d57c78913..670d5ae44 100644
--- a/inc/lang/it/password.txt
+++ b/inc/lang/it/password.txt
@@ -6,5 +6,5 @@ Nome utente : @LOGIN@
Password : @PASSWORD@
--
-Questa email è stata generata dal DokuWiki di
+Questa email è stata generata dal DokuWiki all'indirizzo
@DOKUWIKIURL@
diff --git a/inc/lang/it/pwconfirm.txt b/inc/lang/it/pwconfirm.txt
index dfcd8a346..8a594ded8 100644
--- a/inc/lang/it/pwconfirm.txt
+++ b/inc/lang/it/pwconfirm.txt
@@ -11,5 +11,5 @@ seguente collegamento.
@CONFIRM@
--
-Questa email è stata generata dal DokuWiki di
+Questa email è stata generata dal DokuWiki all'indirizzo
@DOKUWIKIURL@
diff --git a/inc/lang/it/register.txt b/inc/lang/it/register.txt
index 74f57094d..5a336a971 100644
--- a/inc/lang/it/register.txt
+++ b/inc/lang/it/register.txt
@@ -1,4 +1,3 @@
====== Registrazione nuovo utente ======
-Riempi tutte le informazioni seguenti per creare un nuovo account in questo wiki. Assicurati di inserire un **indirizzo email valido** - la tua nuova password ti sarà inviata con un messaggio di posta elettronica. L'account dovrebbe essere un [[doku>pagename|nome di pagina]] valido.
-
+Riempi tutte le informazioni seguenti per creare un nuovo account in questo wiki. Assicurati di inserire un **indirizzo email valido** - a meno che tu non l'abbia già inserita qui, la password ti sarà inviata con un messaggio di posta elettronica. Il nome utente deve soddisfare i criteri per i [[doku>pagename|nomi delle pagine]]. \ No newline at end of file
diff --git a/inc/lang/it/registermail.txt b/inc/lang/it/registermail.txt
index e8af0d323..30a6fed48 100644
--- a/inc/lang/it/registermail.txt
+++ b/inc/lang/it/registermail.txt
@@ -4,11 +4,11 @@ Nome utente : @NEWUSER@
Nome completo : @NEWNAME@
EMail : @NEWEMAIL@
-Data : @DATE@
-Browser : @BROWSER@
-Indirizzo IP : @IPADDRESS@
-Nome macchina : @HOSTNAME@
+Data : @DATE@
+Browser : @BROWSER@
+Indirizzo IP : @IPADDRESS@
+Nome host : @HOSTNAME@
--
-Questa email è stata generata dal DokuWiki di
+Questa email è stata generata dal DokuWiki all'indirizzo
@DOKUWIKIURL@
diff --git a/inc/lang/it/resendpwd.txt b/inc/lang/it/resendpwd.txt
index fc3f09414..54604d7f3 100644
--- a/inc/lang/it/resendpwd.txt
+++ b/inc/lang/it/resendpwd.txt
@@ -1,3 +1,3 @@
====== Invia nuova password ======
-Riempi tutte le informazioni seguenti per ottenere una nuova password per il tuo account su questo wiki. La nuova password sarà inviata al tuo indirizzo di posta elettronica registrato. Il nome utente deve essere il tuo nome utente di questo wiki.
+Inserisci tutte le informazioni per ottenere una nuova password per il tuo account su questo wiki. La nuova password sarà inviata al tuo indirizzo di posta elettronica registrato. Il nome utente deve essere il tuo nome utente in questo wiki.
diff --git a/inc/lang/it/subscr_digest.txt b/inc/lang/it/subscr_digest.txt
index 8656f8536..a19128702 100644
--- a/inc/lang/it/subscr_digest.txt
+++ b/inc/lang/it/subscr_digest.txt
@@ -10,11 +10,11 @@ Queste sono le modifiche:
Vecchia revisione: @OLDPAGE@
Nuova revisione: @NEWPAGE@
-Per annullare la pagina delle notifiche collegati al
+Per non ricevere più queste notifiche collegati al
wiki @DOKUWIKIURL@ e poi visita @SUBSCRIBE@
e rimuovi la sottoscrizione alle modifiche delle
pagine e/o categorie.
--
-Questa email è stata generata dal DokuWiki di
+Questa email è stata generata dal DokuWiki all'indirizzo
@DOKUWIKIURL@ \ No newline at end of file
diff --git a/inc/lang/it/subscr_list.txt b/inc/lang/it/subscr_list.txt
index e42f7d1ad..8eb7acd3c 100644
--- a/inc/lang/it/subscr_list.txt
+++ b/inc/lang/it/subscr_list.txt
@@ -8,11 +8,11 @@ Queste sono le pagine modificate:
@DIFF@
--------------------------------------------------------
-Per annullare la pagina delle notifiche collegati al
+Per non ricevere più queste notifiche collegati al
wiki @DOKUWIKIURL@ e poi visita @SUBSCRIBE@
e rimuovi la sottoscrizione alle modifiche delle
pagine e/o categorie.
--
-Questa email è stata generata dal DokuWiki di
+Questa email è stata generata dal DokuWiki all'indirizzo
@DOKUWIKIURL@ \ No newline at end of file
diff --git a/inc/lang/it/subscr_single.txt b/inc/lang/it/subscr_single.txt
index 2c4d5cbb8..8cde8ea0f 100644
--- a/inc/lang/it/subscr_single.txt
+++ b/inc/lang/it/subscr_single.txt
@@ -13,11 +13,12 @@ Sommario modifica: @SUMMARY@
Vecchia revisione: @OLDPAGE@
Nuova revisione: @NEWPAGE@
-Per annullare la pagina delle notifiche collegati al
-wiki @DOKUWIKIURL@ e poi visita @SUBSCRIBE@
-e rimuovi la sottoscrizione alle modifiche delle
-pagine e/o categorie.
+Per non ricevere più queste notifiche, collegati al
+wiki all'indirizzo @DOKUWIKIURL@ e poi visita
+@NEWPAGE@
+e rimuovi la sottoscrizione alle modifiche della
+pagina o categoria.
--
-Questa email è stata generata dal DokuWiki di
+Questa email è stata generata dal DokuWiki all'indirizzo
@DOKUWIKIURL@ \ No newline at end of file
diff --git a/inc/lang/it/uploadmail.txt b/inc/lang/it/uploadmail.txt
index d8d17a378..da3dacd36 100644
--- a/inc/lang/it/uploadmail.txt
+++ b/inc/lang/it/uploadmail.txt
@@ -10,5 +10,5 @@ Tipo MIME : @MIME@
Utente : @USER@
--
-Questa email è stata generata dal DokuWiki di
+Questa email è stata generata dal DokuWiki all'indirizzo
@DOKUWIKIURL@ \ No newline at end of file
diff --git a/inc/lang/ja/lang.php b/inc/lang/ja/lang.php
index d9c02764a..e8999e05b 100644
--- a/inc/lang/ja/lang.php
+++ b/inc/lang/ja/lang.php
@@ -47,6 +47,7 @@ $lang['btn_draft'] = 'ドラフトを編集';
$lang['btn_recover'] = 'ドラフトを復元';
$lang['btn_draftdel'] = 'ドラフトを削除';
$lang['btn_revert'] = '元に戻す';
+$lang['btn_register'] = 'ユーザー登録';
$lang['loggedinas'] = 'ようこそ';
$lang['user'] = 'ユーザー名';
$lang['pass'] = 'パスワード';
@@ -56,7 +57,6 @@ $lang['passchk'] = '確認';
$lang['remember'] = 'ユーザー名とパスワードを記憶する';
$lang['fullname'] = 'フルネーム';
$lang['email'] = 'メールアドレス';
-$lang['register'] = 'ユーザー登録';
$lang['profile'] = 'ユーザー情報';
$lang['badlogin'] = 'ユーザー名かパスワードが違います。';
$lang['minoredit'] = '小変更';
@@ -158,6 +158,9 @@ $lang['yours'] = 'あなたのバージョン';
$lang['diff'] = '現在のリビジョンとの差分を表示';
$lang['diff2'] = '選択したリビジョン間の差分を表示';
$lang['difflink'] = 'この比較画面にリンクする';
+$lang['diff_type'] = '差分の表示方法:';
+$lang['diff_inline'] = 'インライン';
+$lang['diff_side'] = '横に並べる';
$lang['line'] = 'ライン';
$lang['breadcrumb'] = 'トレース';
$lang['youarehere'] = '現在位置';
diff --git a/inc/lang/kk/lang.php b/inc/lang/kk/lang.php
new file mode 100644
index 000000000..2b492ed1c
--- /dev/null
+++ b/inc/lang/kk/lang.php
@@ -0,0 +1,116 @@
+<?php
+/**
+ * kazakh language file
+ *
+ * @author Nurgozha Kaliaskarov astana08@gmail.com
+ */
+$lang['encoding'] = 'utf-8';
+$lang['direction'] = 'ltr';
+$lang['doublequoteopening'] = '"';
+$lang['doublequoteclosing'] = '"';
+$lang['singlequoteopening'] = '‘';
+$lang['singlequoteclosing'] = '’';
+$lang['apostrophe'] = '\'';
+$lang['btn_edit'] = 'Бұл мақаланы өңдеү';
+$lang['btn_source'] = 'Бастапқы мәтінді көрсету';
+$lang['btn_show'] = 'Бетті көрсету';
+$lang['btn_create'] = 'Бұл бетті жасау';
+$lang['btn_search'] = 'Іздеу';
+$lang['btn_save'] = 'Сақтау';
+$lang['btn_preview'] = 'Қарап шығу';
+$lang['btn_top'] = 'Жоғары';
+$lang['btn_newer'] = '<<жаңарақ';
+$lang['btn_older'] = 'ескірек>>';
+$lang['btn_revs'] = 'Қайта қараулары';
+$lang['btn_recent'] = 'Жуырдағы өзгерістер';
+$lang['btn_upload'] = 'Еңгізу';
+$lang['btn_cancel'] = 'Болдырмау';
+$lang['btn_index'] = 'Барлық беттері';
+$lang['btn_secedit'] = 'Өңдеу';
+$lang['btn_login'] = 'Кіру';
+$lang['btn_logout'] = 'Шығу';
+$lang['btn_admin'] = 'Басқару';
+$lang['btn_update'] = 'Жаңарту';
+$lang['btn_delete'] = 'Жою';
+$lang['btn_back'] = 'Артқа';
+$lang['btn_backlink'] = 'Кері сілтемелері';
+$lang['btn_backtomedia'] = 'Медиафайлды таңдауға қайту';
+$lang['btn_subscribe'] = 'Жазылуларды басқару';
+$lang['btn_profile'] = 'Профильді жаңарту';
+$lang['btn_reset'] = 'Түсіру';
+$lang['btn_resendpwd'] = 'Жаңа құпиясөзді жіберу';
+$lang['btn_draft'] = 'Шимайды өңдеу';
+$lang['btn_recover'] = 'Шимайды қайтару';
+$lang['btn_draftdel'] = 'Шимайды өшіру';
+$lang['btn_revert'] = 'Қалпына келтіру';
+$lang['btn_register'] = 'Тіркеу';
+$lang['loggedinas'] = 'түпнұсқамен кірген';
+$lang['user'] = 'Түпнұсқа';
+$lang['pass'] = 'Құпиясөз';
+$lang['newpass'] = 'Жаңа құпиясөз';
+$lang['oldpass'] = 'Ағымдағы құпиясөзді растау';
+$lang['passchk'] = 'Тағы бір рет';
+$lang['remember'] = 'Мені сақтау';
+$lang['fullname'] = 'Шын аты';
+$lang['email'] = 'Е-пошта';
+$lang['profile'] = 'Пайдаланушының профилі';
+$lang['badlogin'] = 'Кешріңіз, түпнұсқа әлде құпиясөз дұрыс емес';
+$lang['minoredit'] = 'Шағын өзгерістер';
+$lang['draftdate'] = 'Шимай сақталғаны';
+$lang['nosecedit'] = 'Бет өзгерді де бөлік тұралы ақпарат ескірді. Толық нұсқасы ашылды.';
+$lang['regmissing'] = 'Кешіріңіз, барлық тармақтары толтыруыңыз керек.';
+$lang['reguexists'] = 'Кешіріңіз, бұл түпнұскамен де пайдаланушы бар.';
+$lang['regsuccess'] = 'Пайдаланушы қосылды әрі құпиясөзін электрондық поштаға жіберді.';
+$lang['regsuccess2'] = 'Пайдаланушы қосылды.';
+$lang['regmailfail'] = 'Құпиясөз хатты жіберуде қате болған сияқты. Мархабат, әкімшімен хабарласыңыз.';
+$lang['regbadmail'] = 'Берілген электрондық пошта бұрыс деп көрінеді - егер бұл қателікті деп ойласаңыз, әкімшіге хабарлаңыз.';
+$lang['regbadpass'] = 'Берілген екі құпиясөз бірдей емес, мархабат. қайтадан көріңіз.';
+$lang['regpwmail'] = 'Сіздің DokuWiki құпиясөзіңіз';
+$lang['reghere'] = 'Есебіңіз әлі жоқ па? Біреуін оңай ашыңыз';
+$lang['profna'] = 'Бұл wiki профиль өзертуді қолдамайды';
+$lang['profnochange'] = 'Өзгеріс жоқ, істейтін ештеңе жоқ.';
+$lang['profnoempty'] = 'Бос есім не email рұқсат етілмейді.';
+$lang['profchanged'] = 'Пайдаланушы профилі сәтті жаңартылған.';
+$lang['pwdforget'] = 'Құпиясөзіңізді ұмыттыңызба? Жаңадан біреуін алыңыз';
+$lang['resendna'] = 'Бұл wiki құпиясөзді қайта жіберуді қолдамайды.';
+$lang['resendpwd'] = 'Келесіге жаңа құпиясөзді жіберу ';
+$lang['resendpwdmissing'] = 'Кешіріңіз, барлық тармақтары толтыруыңыз керек.';
+$lang['resendpwdnouser'] = 'Кешіріңіз, бұл пайдаланушыны дерекқорымызда тапқан жоқпыз.';
+$lang['resendpwdbadauth'] = 'Кешіріңіз, бұл түпнұсқалық коды бұрыс. Толық растау сілтемені пайдалануыңызды тексеріңіз.';
+$lang['resendpwdconfirm'] = 'Растау сілтеме email арқылы жіберілді.';
+$lang['resendpwdsuccess'] = 'Сіздің жаңа құпиясөзіңіз email арқылы жіберілді.';
+$lang['license'] = 'Басқаша көрсетілген болмаса, бұл wiki-дің мазмұны келесі лицензия бойынша беріледі:';
+$lang['licenseok'] = 'Ескерту: бұл бетті өңдеуіңізбен мазмұныңыз келесі лицензия бойынша беруге келесесіз:';
+$lang['searchmedia'] = 'Іздеу файлдың атауы:';
+$lang['searchmedia_in'] = '%-мен іздеу:';
+$lang['txt_upload'] = 'Еңгізетін файлды таңдау';
+$lang['txt_filename'] = 'Келесідей еңгізу (қалауынша)';
+$lang['txt_overwrt'] = 'Бар файлды қайта жазу';
+$lang['lockedby'] = 'Осы уақытта тойтарылған';
+$lang['lockexpire'] = 'Тойтару келесі уақытта бітеді';
+$lang['willexpire'] = 'Бұл бетті түзеу тойтаруыңыз бір минутта бітеді. Қақтығыс болмау және тойтару таймерді түсіру үшін қарап шығу пернені басыңыз.';
+$lang['js']['notsavedyet'] = 'Сақталмаған өзгерістер жоғалатын болады.';
+$lang['js']['searchmedia'] = 'Файлдарды іздеу';
+$lang['js']['keepopen'] = 'Таңдаған соң терезе жаппаңыз';
+$lang['js']['hidedetails'] = 'Ұсақтарды жасыру';
+$lang['js']['mediatitle'] = 'Султеме теңшелімдері';
+$lang['js']['mediadisplay'] = 'Сілтеме түрі';
+$lang['js']['mediaalign'] = 'Тегістеуі';
+$lang['js']['mediasize'] = 'Сүреттің өлшемі';
+$lang['js']['mediatarget'] = 'Сілтеме нысанасы';
+$lang['js']['mediaclose'] = 'Жабу';
+$lang['js']['mediainsert'] = 'Еңгізу';
+$lang['js']['mediadisplayimg'] = 'Бұл сүретті көрсету';
+$lang['js']['mediadisplaylnk'] = 'Бұл сілтемені ғана көрсету,';
+$lang['js']['mediasmall'] = 'Шағын нұсқасы';
+$lang['js']['mediamedium'] = 'Орташа нұсқасы';
+$lang['js']['medialarge'] = 'Үлкен нұсқасы';
+$lang['js']['mediaoriginal'] = 'Түпнұсқалық нұсқасы';
+$lang['js']['medialnk'] = 'Толық бетке сілтеме';
+$lang['js']['mediadirect'] = 'Түпнұсқалыққа тұра сілтемесі';
+$lang['js']['medianolnk'] = 'Сілтеме жоқ';
+$lang['js']['medianolink'] = 'Суретті сілтетпеу';
+$lang['js']['medialeft'] = 'Сүретті сол жаққа тегістеу';
+$lang['js']['mediaright'] = 'Сүретті оң жаққа тегістеу';
+$lang['js']['mediacenter'] = 'Сүретті ортаға тегістеу';
+$lang['js']['medianoalign'] = 'Тегістеусіз';
diff --git a/inc/lang/km/lang.php b/inc/lang/km/lang.php
index 3519a484e..90cad3133 100644
--- a/inc/lang/km/lang.php
+++ b/inc/lang/km/lang.php
@@ -1,9 +1,6 @@
<?php
/**
* @license GPL 2 (http://www.gnu.org/licenses/gpl.html)
- * @author Andreas Gohr <andi@splitbrain.org>
- * @author Anika Henke <henke@cosmocode.de>
- * @author Matthias Grimm <matthiasgrimm@users.sourceforge.net>
* @author Ratana Lim <aerorat@yahoo.com>
*/
$lang['encoding'] = 'utf-8';
@@ -46,6 +43,7 @@ $lang['btn_resendpwd'] = 'ផ្ញើពាក្សសម្ងាត់';
$lang['btn_draft'] = 'កែគំរោង';
$lang['btn_recover'] = 'ស្រោះគំរោងឡើង';
$lang['btn_draftdel'] = 'លុបគំរោង';
+$lang['btn_register'] = 'ចុះឈ្មោះ';//'Register';
$lang['loggedinas'] = 'អ្នកប្រើ';
$lang['user'] = 'នាមបម្រើ';
@@ -56,7 +54,6 @@ $lang['passchk'] = 'ម្ដងទាត';
$lang['remember'] = 'ចំណាំខ្ញុំ';
$lang['fullname'] = 'នាមត្រគោល';
$lang['email'] = 'អ៊ីមែល';
-$lang['register'] = 'ចុះឈ្មោះ';//'Register';
$lang['profile'] = 'ប្រវត្តិរូប';// 'User Profile';
$lang['badlogin'] = 'សុំអាទោស​ នាមបំរើ ឬ ពាក្សសម្ងាតមិនត្រវទេ។';
$lang['minoredit'] = 'កែបបណ្តិចបណ្តួច';// 'Minor Changes';
diff --git a/inc/lang/ko/lang.php b/inc/lang/ko/lang.php
index 3765dd011..c85a66d38 100644
--- a/inc/lang/ko/lang.php
+++ b/inc/lang/ko/lang.php
@@ -7,7 +7,6 @@
* @author jk Lee
* @author dongnak@gmail.com
* @author Song Younghwan <purluno@gmail.com>
- * @author SONG Younghwan <purluno@gmail.com>
* @author Seung-Chul Yoo <dryoo@live.com>
*/
$lang['encoding'] = 'utf-8';
@@ -49,6 +48,7 @@ $lang['btn_draft'] = '문서초안 편집';
$lang['btn_recover'] = '문서초안 복구';
$lang['btn_draftdel'] = '문서초안 삭제';
$lang['btn_revert'] = '복원';
+$lang['btn_register'] = '등록';
$lang['loggedinas'] = '다음 사용자로 로그인';
$lang['user'] = '사용자';
$lang['pass'] = '패스워드';
@@ -58,7 +58,6 @@ $lang['passchk'] = '패스워드 다시 확인';
$lang['remember'] = '기억하기';
$lang['fullname'] = '실제 이름';
$lang['email'] = '이메일';
-$lang['register'] = '등록';
$lang['profile'] = '개인 정보';
$lang['badlogin'] = '잘못된 사용자 이름이거나 패스워드입니다.';
$lang['minoredit'] = '일부 내용 변경';
@@ -88,7 +87,7 @@ $lang['resendpwdsuccess'] = '새로운 패스워드는 이메일로 보내
$lang['license'] = '이 위키의 내용은 다음의 라이센스에 따릅니다 :';
$lang['licenseok'] = '주의 : 이 페이지를 수정한다는 다음의 라이센스에 동의함을 의미합니다 :';
$lang['searchmedia'] = '파일이름 찾기:';
-$lang['searchmedia_in'] = ' %에서 검색';
+$lang['searchmedia_in'] = ' %s에서 검색';
$lang['txt_upload'] = '업로드 파일을 선택합니다.';
$lang['txt_filename'] = '업로드 파일 이름을 입력합니다.(선택 사항)';
$lang['txt_overwrt'] = '새로운 파일로 이전 파일을 교체합니다.';
@@ -108,6 +107,7 @@ $lang['js']['mediatarget'] = '링크 목표';
$lang['js']['mediaclose'] = '닫기';
$lang['js']['mediainsert'] = '삽입';
$lang['js']['mediadisplayimg'] = '그림보기';
+$lang['js']['mediadisplaylnk'] = '링크만 보여줍니다.';
$lang['js']['mediasmall'] = '작게';
$lang['js']['mediamedium'] = '중간';
$lang['js']['medialarge'] = '크게';
@@ -159,6 +159,10 @@ $lang['current'] = '현재';
$lang['yours'] = '버전';
$lang['diff'] = '현재 버전과의 차이 보기';
$lang['diff2'] = '선택된 버전들 간 차이 보기';
+$lang['difflink'] = '차이 보기로 연결';
+$lang['diff_type'] = '버전간 차이 표시:';
+$lang['diff_inline'] = '인라인 방식';
+$lang['diff_side'] = '다중창 방식';
$lang['line'] = '줄';
$lang['breadcrumb'] = '추적';
$lang['youarehere'] = '현재 위치';
@@ -216,7 +220,13 @@ $lang['img_copyr'] = '저작권';
$lang['img_format'] = '포맷';
$lang['img_camera'] = '카메라';
$lang['img_keywords'] = '키워드';
-$lang['subscr_subscribe_noaddress'] = '등록된 주소가 없기 때문에 구독목록에 등록되지 않았습니다.';
+$lang['subscr_subscribe_success'] = '%s을(를) 구독목록 %s에 추가하였습니다';
+$lang['subscr_subscribe_error'] = '%s을(를) 구독목록 %s에 추가하는데 실패했습니다';
+$lang['subscr_subscribe_noaddress'] = '등록된 주소가 없기 때문에 구독목록에 등록되지 않았습니다';
+$lang['subscr_unsubscribe_success'] = '%s을(를) 구독목록 %s에서 제거하였습니다';
+$lang['subscr_unsubscribe_error'] = '%s을(를) 구독목록 %s에서 제거하는데 실패했습니다';
+$lang['subscr_already_subscribed'] = '%s은(는) 이미 %s에 구독되고 있습니다';
+$lang['subscr_not_subscribed'] = '%s은(는) 이미 %s에 구독되어 있지 않습니다';
$lang['subscr_m_not_subscribed'] = '현재의 페이지나 네임스페이스에 구독등록이 되어있지 않습니다.';
$lang['subscr_m_new_header'] = '구독 추가';
$lang['subscr_m_current_header'] = '현재 구독중인 것들';
diff --git a/inc/lang/ku/lang.php b/inc/lang/ku/lang.php
index 0ff2ca4ca..9bed43cd1 100644
--- a/inc/lang/ku/lang.php
+++ b/inc/lang/ku/lang.php
@@ -34,6 +34,7 @@ $lang['btn_backlink'] = "Girêdanên paş";
$lang['btn_backtomedia'] = 'Back to Mediafile Selection';
$lang['btn_subscribe'] = 'Subscribe Changes';
$lang['btn_unsubscribe'] = 'Unsubscribe Changes';
+$lang['btn_register'] = 'Register';
$lang['loggedinas'] = 'Logged in as';
$lang['user'] = 'Username';
@@ -42,7 +43,6 @@ $lang['passchk'] = 'once again';
$lang['remember'] = 'Remember me';
$lang['fullname'] = 'Full name';
$lang['email'] = 'E-Mail';
-$lang['register'] = 'Register';
$lang['badlogin'] = 'Sorry, username or password was wrong.';
$lang['regmissing'] = 'Sorry, you must fill in all fields.';
diff --git a/inc/lang/la/conflict.txt b/inc/lang/la/conflict.txt
index 3d1f66ab6..aebc38b25 100644
--- a/inc/lang/la/conflict.txt
+++ b/inc/lang/la/conflict.txt
@@ -1,5 +1,5 @@
-====== Recentior uersio est ======
+====== Recentior forma est ======
-Recentior uersio est: nam dum hanc paginam recensibas, aliquis paginam mutauit.
+Recentior forma est: nam dum hanc paginam recensibas, aliquis paginam mutauit.
-Discrimina uides et uersionem seruandam eligis. Alia uersio delebitur. \ No newline at end of file
+Discrimina uides et formam seruandam eligis. Alia forma delebitur. \ No newline at end of file
diff --git a/inc/lang/la/editrev.txt b/inc/lang/la/editrev.txt
index bac047d31..6a4d082cc 100644
--- a/inc/lang/la/editrev.txt
+++ b/inc/lang/la/editrev.txt
@@ -1,2 +1,2 @@
-**Vetus uersio a te restituta est** Si hanc uersionem seruabis, nouam creabis.
+**Vetus forma a te restituta est** Si hanc formam seruabis, nouam creabis.
---- \ No newline at end of file
diff --git a/inc/lang/la/index.txt b/inc/lang/la/index.txt
index eb6f06f79..cd65dbb59 100644
--- a/inc/lang/la/index.txt
+++ b/inc/lang/la/index.txt
@@ -1,3 +1,3 @@
====== Forma Situs ======
-Haec forma situs ordinata a(b) [[doku>namespaces|namespaces]]. \ No newline at end of file
+Haec forma situs ordinata [[doku>namespaces|generatim]]. \ No newline at end of file
diff --git a/inc/lang/la/install.html b/inc/lang/la/install.html
new file mode 100644
index 000000000..c06f3ac2c
--- /dev/null
+++ b/inc/lang/la/install.html
@@ -0,0 +1,8 @@
+<p>Haec pagina te adiuuat in <a href="http://dokuwiki.org">Dokuuiki</a> conformando. Maiores res in
+<a href="http://dokuwiki.org/installer">hac pagina</a> sunt.</p>
+
+<p>DokuWiki documenta ut omnes paginas uicis et omnia (ut imagines, indices, ueteres formas) quae ad easdem pertinent colligat. Vt bene operet DokuWiki omnes facultates scrini habere <strong>debes</strong>. Hoc instrumentum facultates eligere non potest, his facultatibus locatori spati interretis quaeras uel FTP intrumento uel aliis rebus (ut cPanel) uteraris.</p>
+
+<p>Hoc intrumentum optiones primae DokuWiki <acronym title="index custodiae ,aditus">ICA</acronym>, quos rectori situs inire et indicem, ut addenda optiones uicis et alia administrare possit uidere licet. Hoc instrumentum non necessarium DokuWiki ut feliciter operet, sed melius administrare adiuuat.</p>
+
+<p>Periti uel qui certa quaesita habet paginas <a href="http://dokuwiki.org/install">rationis conformandum uicem</a> et <a href="http://dokuwiki.org/config">optionum conformationis</a> uidere possunt.</p> \ No newline at end of file
diff --git a/inc/lang/la/lang.php b/inc/lang/la/lang.php
index 49ae67c31..d10c094f8 100644
--- a/inc/lang/la/lang.php
+++ b/inc/lang/la/lang.php
@@ -8,6 +8,7 @@
* lines starting with @author
*
* @url http://svn.wikimedia.org/viewvc/mediawiki/trunk/phase3/languages/messages/MessagesLa.php?view=co
+ * @author Massimiliano Vassalli <vassalli.max@gmail.com>
*/
$lang['encoding'] = 'utf-8';
$lang['direction'] = 'ltr';
@@ -19,9 +20,9 @@ $lang['apostrophe'] = '´';
$lang['btn_edit'] = 'Recensere hanc paginam';
$lang['btn_source'] = 'Fontem uidere';
$lang['btn_show'] = 'Ostendere paginam';
-$lang['btn_create'] = 'Facere paginam';
+$lang['btn_create'] = 'Creare paginam';
$lang['btn_search'] = 'Quaerere';
-$lang['btn_save'] = 'Seruare paginam';
+$lang['btn_save'] = 'Seruare';
$lang['btn_preview'] = 'Praeuidere';
$lang['btn_top'] = 'I ad summa';
$lang['btn_newer'] = '<< recentiores';
@@ -39,7 +40,7 @@ $lang['btn_update'] = 'Nouare';
$lang['btn_delete'] = 'Delere';
$lang['btn_back'] = 'Redire';
$lang['btn_backlink'] = 'Nexus ad paginam';
-$lang['btn_backtomedia'] = 'Ad medias redire';
+$lang['btn_backtomedia'] = 'Ad media redire';
$lang['btn_subscribe'] = 'Custodire';
$lang['btn_profile'] = 'Tabellam nouare';
$lang['btn_reset'] = 'Abrogare';
@@ -48,6 +49,7 @@ $lang['btn_draft'] = 'Propositum recensere';
$lang['btn_recover'] = 'Propositum reficere';
$lang['btn_draftdel'] = 'Propositum delere';
$lang['btn_revert'] = 'Reficere';
+$lang['btn_register'] = 'Te adscribere';
$lang['loggedinas'] = 'Nomen sodalis:';
$lang['user'] = 'Nomen sodalis:';
$lang['pass'] = 'Tessera tua';
@@ -55,14 +57,13 @@ $lang['newpass'] = 'Tessera noua';
$lang['oldpass'] = 'Tessera uetus:';
$lang['passchk'] = 'Tesseram tuam adfirmare';
$lang['remember'] = 'Tesseram meam sodalitatis memento';
-$lang['fullname'] = 'Nomen tuum uerum:';
+$lang['fullname'] = 'Nomen tuom uerum:';
$lang['email'] = 'Cursus interretialis:';
-$lang['register'] = 'Te adscribere';
$lang['profile'] = 'Tabella Sodalis';
-$lang['badlogin'] = 'Error in ineundo est.';
-$lang['minoredit'] = 'Haec est recensio minor';
+$lang['badlogin'] = 'Error in ineundo est, rectum nomen uel tessera cedo.';
+$lang['minoredit'] = 'Recensio minor';
$lang['draftdate'] = 'Propositum seruatur die:';
-$lang['nosecedit'] = 'Pagina interea mutatur, pars rerum exiit.';
+$lang['nosecedit'] = 'Pagina interea mutatur, pars rerum exiit, in loco eius tota pagina reclamata est.';
$lang['regmissing'] = 'Omnes campi complendi sunt.';
$lang['reguexists'] = 'Nomen Sodalis ab aliquo iam elegitur.';
$lang['regsuccess'] = 'Adscriptio feliciter perficitur et tessera cursu interretiali mittitur';
@@ -92,17 +93,17 @@ $lang['txt_upload'] = 'Eligere documenta oneranda:';
$lang['txt_filename'] = 'Onerare (optio):';
$lang['txt_overwrt'] = 'Documento ueteri imponere:';
$lang['lockedby'] = 'Nunc hoc intercludit';
-$lang['lockexpire'] = 'Hoc aperiuit';
+$lang['lockexpire'] = 'Hoc apertum';
$lang['willexpire'] = 'Interclusio paginae recensendae uno minuto finita est.\nUt errores uites, \'praeuisio\' preme ut interclusionem ripristines.';
$lang['js']['notsavedyet'] = 'Res non seruatae amissurae sunt.';
$lang['js']['searchmedia'] = 'Quaere inter documenta';
$lang['js']['keepopen'] = 'Fenestram apertam tene';
$lang['js']['hidedetails'] = 'Singulas res abscondere';
-$lang['js']['mediatitle'] = 'Optiones connectendi';
-$lang['js']['mediadisplay'] = 'Exemplar connectendi';
+$lang['js']['mediatitle'] = 'Optiones nexorum';
+$lang['js']['mediadisplay'] = 'Genus nexi';
$lang['js']['mediaalign'] = 'Collocatio';
$lang['js']['mediasize'] = 'Amplitudo imaginis';
-$lang['js']['mediatarget'] = 'Signum connectere';
+$lang['js']['mediatarget'] = 'Cui nexum est';
$lang['js']['mediaclose'] = 'Claudere';
$lang['js']['mediainsert'] = 'Insere';
$lang['js']['mediadisplayimg'] = 'Imaginem ostendere';
@@ -122,7 +123,7 @@ $lang['js']['medianoalign'] = 'Collocationem remouere';
$lang['js']['nosmblinks'] = 'Windows nexa solum cum Microsoft Internet Explorer ostendi possunt.
Adhuc transcribere nexum potes.';
$lang['js']['linkwiz'] = 'Connectendi ductor';
-$lang['js']['linkto'] = 'Nexum:';
+$lang['js']['linkto'] = 'Nexum ad:';
$lang['js']['del_confirm'] = 'Delere electas res uin?';
$lang['js']['mu_btn'] = 'Plura documenta uno tempore onerare';
$lang['rssfailed'] = 'Error in restituendo ';
@@ -140,13 +141,13 @@ $lang['uploadsize'] = 'Documentum onerandum ponderosius est. (Maxime
$lang['deletesucc'] = 'Documentum "%s" deletum est.';
$lang['deletefail'] = '"%s" non deletur: uide facultates.';
$lang['mediainuse'] = 'documentum "%s" non deletur, nam aliquis hoc utitur.';
-$lang['namespaces'] = 'Spatium nominis';
+$lang['namespaces'] = 'Genus';
$lang['mediafiles'] = 'Documentum liberum in:';
$lang['accessdenied'] = 'Non uidere documentum potes.';
$lang['mediausage'] = 'Hac forma uteris ut documentum referas:';
$lang['mediaview'] = 'Vide documentum primigenium';
$lang['mediaroot'] = 'scrinium';
-$lang['mediaupload'] = 'Spatium nominis hic oneras. Si nouom spatium nominis creare uis, ante "Onerare ut" nomen documenti diuisum a duabus punctis ponas.';
+$lang['mediaupload'] = 'Hic genus oneras. Si nouom genus creare uis, ante "Onerare ut" nomen documenti diuisum a duabus punctis ponas.';
$lang['mediaextchange'] = 'Genus documenti mutatum a(b) ".%s" ad ".%s"!';
$lang['reference'] = 'Referre:';
$lang['ref_inuse'] = 'Documentum non deleri potest, nam in his paginis apertum est:';
@@ -170,10 +171,10 @@ $lang['restored'] = 'Recensio uetus restituta';
$lang['external_edit'] = 'Externe recensere';
$lang['summary'] = 'Indicem recensere';
$lang['noflash'] = '<a href="http://www.adobe.com/products/flashplayer/">Adobe Flash Plugin</a> necessarium est.';
-$lang['download'] = 'Snippet cape';
+$lang['download'] = 'Snippet capere';
$lang['mail_newpage'] = 'Pagina addita:';
$lang['mail_changed'] = 'Pagina mutata:';
-$lang['mail_subscribe_list'] = 'Pagina in spatio nominis mutata:';
+$lang['mail_subscribe_list'] = 'Paginae in genere mutatae:';
$lang['mail_new_user'] = 'Nouos Sodalis:';
$lang['mail_upload'] = 'Documentum oneratum:';
$lang['qb_bold'] = 'Litterae pingues';
@@ -198,9 +199,9 @@ $lang['qb_ol'] = 'Index ordinatus rerum';
$lang['qb_ul'] = 'Index non ordinatus rerum';
$lang['qb_media'] = 'Imagines et documenta addere';
$lang['qb_sig'] = 'Subscriptio tua cum indicatione temporis';
-$lang['qb_smileys'] = 'Facies';
+$lang['qb_smileys'] = 'Pupuli';
$lang['qb_chars'] = 'Signa singularia';
-$lang['upperns'] = 'I ad anterius spatium nominis';
+$lang['upperns'] = 'I ad anterius genus';
$lang['admin_register'] = 'Nouom Sodalem creare';
$lang['metaedit'] = 'Res codicis mutare';
$lang['metasaveerr'] = 'Res codicis non scribitur.';
@@ -223,7 +224,7 @@ $lang['subscr_unsubscribe_success'] = 'A subscriptione %s deletur quod %s';
$lang['subscr_unsubscribe_error'] = 'Error delendi %s a subscriptione quod %s';
$lang['subscr_already_subscribed'] = '%s iam subscriptus\a est in %s';
$lang['subscr_not_subscribed'] = '%s non subscriptus\a est in %n';
-$lang['subscr_m_not_subscribed'] = 'Non hanc paginam uel spatium nominis subscribere potes.';
+$lang['subscr_m_not_subscribed'] = 'Non hanc paginam uel genus subscribere potes.';
$lang['subscr_m_new_header'] = 'Subscriptionem addere';
$lang['subscr_m_current_header'] = 'haec subscriptio:';
$lang['subscr_m_unsubscribe'] = 'Delere';
@@ -237,12 +238,12 @@ $lang['authtempfail'] = 'Confirmare non potes. Rectorem conuenis.';
$lang['i_chooselang'] = 'Linguam eligere';
$lang['i_installer'] = 'Docuuicis creator';
$lang['i_wikiname'] = 'Nomen Vicis';
-$lang['i_enableacl'] = 'AAA aptum facias (consulatum est)';
+$lang['i_enableacl'] = 'ICA aptum facias (consulatum est)';
$lang['i_superuser'] = 'Magister\stra';
$lang['i_problems'] = 'Creator hos errores habes. Continuare potes postquam omnia soluentur.';
-$lang['i_modified'] = 'Hoc scriptum solum cum noua uersione Dokuuicis est. Hoc rursum capere in pagina, in qua haec machina capta est, potes aut i ad <a href="http://dokuwiki.org/install">Dokuuicis installation instructions</a>';
+$lang['i_modified'] = 'Hoc scriptum solum cum noua forma Dokuuicis est. Hoc rursum capere in pagina, in qua haec machina capta est, potes aut i ad <a href="http://dokuwiki.org/install">Dokuuicis installation instructions</a>';
$lang['i_funcna'] = 'PHP functio <code>%s</code> inepta est.';
-$lang['i_phpver'] = 'Versio tua PHP <code>%s</code> minor quam illa necessaria <code>%s</code>.';
+$lang['i_phpver'] = 'Forma tua PHP <code>%s</code> minor quam illa necessaria <code>%s</code>.';
$lang['i_permfail'] = '<code>%s</code> non a uice scribitur. Facultates inspicere.';
$lang['i_confexists'] = '<code>%s</code> iam est.';
$lang['i_writeerr'] = '<code>%s</code> non creari potest. Manu illum creas.';
@@ -250,7 +251,7 @@ $lang['i_badhash'] = 'Ignotum uel mutatum dokuwiki.php (<code>%s</co
$lang['i_badval'] = '<code>%s</code> non legitimum uel uacuom';
$lang['i_success'] = 'Administratio feliciter perficitur. Delere install.php documentum potes. I ad <a href="doku.php">hanc paginam</a> ut continues.';
$lang['i_failure'] = 'Aliqui errores dum documenta administrantur sunt. Manu onerare omnes potes priusquam <a href="doku.php">tuo nouo uice</a> uteris.';
-$lang['i_policy'] = 'AAA ratio prima';
+$lang['i_policy'] = 'ICA ratio prima';
$lang['i_pol0'] = 'Vicem aperire (omnes legere, scribere, onerare possunt)';
$lang['i_pol1'] = 'Publicus uicis (omnes legere, Sodales scribere et onerare possunt)';
$lang['i_pol2'] = 'Clausus uicis (Soli Sodales legere scribere et onerare poccunt)';
@@ -260,7 +261,7 @@ $lang['mu_intro'] = 'Plura documenta uno tempore onerare potes.';
$lang['mu_gridname'] = 'Documenti nomen';
$lang['mu_gridsize'] = 'Pondus';
$lang['mu_gridstat'] = 'Status';
-$lang['mu_namespace'] = 'Spatium nominis';
+$lang['mu_namespace'] = 'Genus';
$lang['mu_browse'] = 'Euoluere';
$lang['mu_toobig'] = 'Ponderosius';
$lang['mu_ready'] = 'Aptus ad onerandum';
@@ -271,7 +272,7 @@ $lang['mu_progress'] = '@PCT@% oneratum';
$lang['mu_filetypes'] = 'Genera documenti apta facere';
$lang['mu_info'] = 'Documenta onerare';
$lang['mu_lasterr'] = 'Extremus error:';
-$lang['recent_global'] = 'Mutatione in hoc spatio nominis uides. Recentiores mutationes quoque uidere <a href="%s">potes</a>';
+$lang['recent_global'] = 'Mutatione in hoc genere uides. Recentiores mutationes quoque uidere <a href="%s">potes</a>';
$lang['years'] = 'ab annis %d';
$lang['months'] = 'a mensibus %d';
$lang['weeks'] = 'a septimanis %d';
diff --git a/inc/lang/la/norev.txt b/inc/lang/la/norev.txt
index 872eb8070..19b60fe15 100644
--- a/inc/lang/la/norev.txt
+++ b/inc/lang/la/norev.txt
@@ -1,3 +1,3 @@
-====== Versio non reperta ======
+====== Forma non reperta ======
-Haec uersio non reperta est. Aliam uersionem quaeris. \ No newline at end of file
+Haec forma non reperta est. Aliam formam quaeris. \ No newline at end of file
diff --git a/inc/lang/la/showrev.txt b/inc/lang/la/showrev.txt
index c5019d798..b95e68265 100644
--- a/inc/lang/la/showrev.txt
+++ b/inc/lang/la/showrev.txt
@@ -1,2 +1,2 @@
-**Haec uetus uersio documenti est!**
+**Haec uetus forma documenti est!**
---- \ No newline at end of file
diff --git a/inc/lang/la/subscr_digest.txt b/inc/lang/la/subscr_digest.txt
index a64a2c61b..629213359 100644
--- a/inc/lang/la/subscr_digest.txt
+++ b/inc/lang/la/subscr_digest.txt
@@ -13,7 +13,7 @@ Noua recensio: @NEWPAGE@
Ut paginae adnotationes deleas, in uicem ineas in
@DOKUWIKIURL@, deinde uideas
@NEWPAGE@
-et paginarum spatiorum nominis optiones mutasa.
+et paginarum generum optiones mutes.
--
Hic cursus a uicis generatus
diff --git a/inc/lang/la/subscr_form.txt b/inc/lang/la/subscr_form.txt
index 82b0a692e..23000b31e 100644
--- a/inc/lang/la/subscr_form.txt
+++ b/inc/lang/la/subscr_form.txt
@@ -1,3 +1,3 @@
====== Inscriptionis Administratio ======
-In hac pagina inscriptiones paginae et spatio nominis sunt. \ No newline at end of file
+In hac pagina inscriptiones huius paginae et generis sunt. \ No newline at end of file
diff --git a/inc/lang/la/subscr_list.txt b/inc/lang/la/subscr_list.txt
index 87ce97215..e6ff8d89d 100644
--- a/inc/lang/la/subscr_list.txt
+++ b/inc/lang/la/subscr_list.txt
@@ -10,7 +10,7 @@ Hae mutationes sunt:
Ut adnotationes deleas, preme hic
@DOKUWIKIURL@ then visit
@SUBSCRIBE@
-et paginarum spatiorum nominis mutationes tollis.
+et paginarum et\aut generum mutationes tollis.
--
Hic cursus generatus a(b)
diff --git a/inc/lang/la/subscr_single.txt b/inc/lang/la/subscr_single.txt
index e21af04bb..7839791ea 100644
--- a/inc/lang/la/subscr_single.txt
+++ b/inc/lang/la/subscr_single.txt
@@ -16,7 +16,7 @@ Noua recensio: @NEWPAGE@
Ut paginae adnotationes deleas, in uicem ineas in
@DOKUWIKIURL@, deinde uideas
@NEWPAGE@
-et paginarum spatiorum nominis optiones mutasa.
+et paginarum et\aut generum optiones mutasa.
--
Hic cursus a uicis generatus
diff --git a/inc/lang/lb/lang.php b/inc/lang/lb/lang.php
index 7152b65b1..09fc41f08 100644
--- a/inc/lang/lb/lang.php
+++ b/inc/lang/lb/lang.php
@@ -41,6 +41,7 @@ $lang['btn_resendpwd'] = 'Nei Passwuert schécken';
$lang['btn_draft'] = 'Entworf änneren';
$lang['btn_recover'] = 'Entworf zeréckhuelen';
$lang['btn_draftdel'] = 'Entworf läschen';
+$lang['btn_register'] = 'Registréieren';
$lang['loggedinas'] = 'Ageloggt als';
$lang['user'] = 'Benotzernumm';
$lang['pass'] = 'Passwuert';
@@ -50,7 +51,6 @@ $lang['passchk'] = 'nach eng Kéier';
$lang['remember'] = 'Verhal mech';
$lang['fullname'] = 'Richtegen Numm';
$lang['email'] = 'E-Mail';
-$lang['register'] = 'Registréieren';
$lang['profile'] = 'Benotzerprofil';
$lang['badlogin'] = 'Entschëllegt, de Benotzernumm oder d\'Passwuert war falsch';
$lang['minoredit'] = 'Kleng Ännerungen';
diff --git a/inc/lang/lt/lang.php b/inc/lang/lt/lang.php
index 639ad4749..6ae5f6c73 100644
--- a/inc/lang/lt/lang.php
+++ b/inc/lang/lt/lang.php
@@ -7,7 +7,6 @@
* @author Edmondas Girkantas <eg@zemaitija.net>
* @author Arūnas Vaitekūnas <aras@fan.lt>
* @author audrius.klevas@gmail.com
- * @author Arunas Vaitekunas <aras@fan.lt>
*/
$lang['encoding'] = 'utf-8';
$lang['direction'] = 'ltr';
@@ -50,6 +49,7 @@ $lang['btn_resendpwd'] = 'Išsiųsti naują slaptažodį';
$lang['btn_draft'] = 'Redaguoti juodraštį';
$lang['btn_recover'] = 'Atkurti juodraštį';
$lang['btn_draftdel'] = 'Šalinti juodraštį';
+$lang['btn_register'] = 'Registruotis';
$lang['loggedinas'] = 'Prisijungęs kaip';
$lang['user'] = 'Vartotojo vardas';
$lang['pass'] = 'Slaptažodis';
@@ -59,7 +59,6 @@ $lang['passchk'] = 'dar kartą';
$lang['remember'] = 'Prisiminti mane';
$lang['fullname'] = 'Visas vardas';
$lang['email'] = 'El. pašto adresas';
-$lang['register'] = 'Registruotis';
$lang['profile'] = 'Vartotojo profilis';
$lang['badlogin'] = 'Nurodėte blogą vartotojo vardą arba slaptažodį.';
$lang['minoredit'] = 'Nedidelis pataisymas';
diff --git a/inc/lang/lv/lang.php b/inc/lang/lv/lang.php
index 21c4606b3..519ca231a 100644
--- a/inc/lang/lv/lang.php
+++ b/inc/lang/lv/lang.php
@@ -44,6 +44,7 @@ $lang['btn_draft'] = 'Labot melnrakstu';
$lang['btn_recover'] = 'Atjaunot melnrakstu';
$lang['btn_draftdel'] = 'Dzēst melnrakstu';
$lang['btn_revert'] = 'Atjaunot';
+$lang['btn_register'] = 'Reģistrēties';
$lang['loggedinas'] = 'Pieteicies kā';
$lang['user'] = 'Lietotājvārds';
$lang['pass'] = 'Parole';
@@ -53,7 +54,6 @@ $lang['passchk'] = 'vēlreiz';
$lang['remember'] = 'Atceries mani';
$lang['fullname'] = 'Pilns vārds';
$lang['email'] = 'E-pasts';
-$lang['register'] = 'Reģistrēties';
$lang['profile'] = 'Lietotāja vārds';
$lang['badlogin'] = 'Atvaino, lietotājvārds vai parole aplama.';
$lang['minoredit'] = 'Sīki labojumi';
@@ -156,6 +156,9 @@ $lang['yours'] = 'Tava versija';
$lang['diff'] = 'atšķirības no patreizējas versijas';
$lang['diff2'] = 'norādīto versiju atšķirības';
$lang['difflink'] = 'Saite uz salīdzināšanas skatu.';
+$lang['diff_type'] = 'Skatīt atšķirības:';
+$lang['diff_inline'] = 'Iekļauti';
+$lang['diff_side'] = 'Blakus';
$lang['line'] = 'Rinda';
$lang['breadcrumb'] = 'Ceļš';
$lang['youarehere'] = 'Tu atrodies šeit';
diff --git a/inc/lang/mg/lang.php b/inc/lang/mg/lang.php
index 3727cfe9a..8c95a9e02 100644
--- a/inc/lang/mg/lang.php
+++ b/inc/lang/mg/lang.php
@@ -28,6 +28,7 @@ $lang['btn_update'] = 'Update';
$lang['btn_delete'] = 'Fafao';
$lang['btn_back'] = 'Miverina';
$lang['btn_backtomedia'] = 'Fitsongana fichier Media';
+$lang['btn_register'] = 'Hisoratra';
$lang['loggedinas'] = 'Anaranao:';
$lang['user'] = 'Anarana';
@@ -36,7 +37,6 @@ $lang['passchk'] = 'Ataovy indray';
$lang['remember'] = 'Tsarovy';
$lang['fullname'] = 'Anarana feno';
$lang['email'] = 'Imailaka';
-$lang['register'] = 'Hisoratra';
$lang['badlogin'] = 'Miala tsiny fa misy diso ny anarana na ny alahidy.';
$lang['regmissing'] = 'Tsy maintsy fenoina ny saha rehetra.';
diff --git a/inc/lang/mk/lang.php b/inc/lang/mk/lang.php
index ddd734e22..456a5a3d4 100644
--- a/inc/lang/mk/lang.php
+++ b/inc/lang/mk/lang.php
@@ -47,6 +47,7 @@ $lang['btn_draft'] = 'Уреди скица';
$lang['btn_recover'] = 'Поврати скица';
$lang['btn_draftdel'] = 'Избриши скица';
$lang['btn_revert'] = 'Обнови';
+$lang['btn_register'] = 'Регистрирај се';
$lang['loggedinas'] = 'Најавен/а како';
$lang['user'] = 'Корисничко име';
$lang['pass'] = 'Лозинка';
@@ -56,7 +57,6 @@ $lang['passchk'] = 'уште еднаш';
$lang['remember'] = 'Запомни ме';
$lang['fullname'] = 'Вистинско име';
$lang['email'] = 'Е-пошта';
-$lang['register'] = 'Регистрирај се';
$lang['profile'] = 'Кориснички профил';
$lang['badlogin'] = 'Жалам, корисничкото име или лозинката се погрешни.';
$lang['minoredit'] = 'Мали измени';
diff --git a/inc/lang/mr/lang.php b/inc/lang/mr/lang.php
index 99561f064..d991d46cf 100644
--- a/inc/lang/mr/lang.php
+++ b/inc/lang/mr/lang.php
@@ -10,7 +10,6 @@
* @url http://svn.wikimedia.org/viewvc/mediawiki/trunk/phase3/languages/messages/MessagesMr.php?view=co
* @author ghatothkach@hotmail.com
* @author Padmanabh Kulkarni <kulkarnipadmanabh@gmail.com>
- * @author Padmanabh Kulkarni<kulkarnipadmanabh@gmail.com>
* @author shantanoo@gmail.com
*/
$lang['encoding'] = 'utf-8';
@@ -54,6 +53,7 @@ $lang['btn_resendpwd'] = 'कृपया परवलीचा नव
$lang['btn_draft'] = 'प्रत संपादन';
$lang['btn_recover'] = 'प्रत परत मिळवा';
$lang['btn_draftdel'] = 'प्रत रद्द';
+$lang['btn_register'] = 'नोंदणी';
$lang['loggedinas'] = 'लॉगिन नाव';
$lang['user'] = 'वापरकर्ता';
$lang['pass'] = 'परवलीचा शब्द';
@@ -63,7 +63,6 @@ $lang['passchk'] = 'परत एकदा';
$lang['remember'] = 'लक्षात ठेवा';
$lang['fullname'] = 'पूर्ण नावं';
$lang['email'] = 'इमेल';
-$lang['register'] = 'नोंदणी';
$lang['profile'] = 'वापरकर्त्याची माहिती';
$lang['badlogin'] = 'माफ़ करा, वापरकर्ता नावात किंवा परवलीच्या शब्दात चूक झाली आहे.';
$lang['minoredit'] = 'छोटे बदल';
diff --git a/inc/lang/ne/lang.php b/inc/lang/ne/lang.php
index 6c00610ea..e5b30ceaf 100644
--- a/inc/lang/ne/lang.php
+++ b/inc/lang/ne/lang.php
@@ -3,8 +3,7 @@
* Nepali language file
*
* @author Saroj Kumar Dhakal <lotusnagarkot@gmail.com>
- * @author SarojKumar Dhakal <lotusnagarkot@yahoo.com>
- * @author Saroj Dhakal<lotusnagarkot@yahoo.com>
+ * @author Saroj Kumar Dhakal <lotusnagarkot@yahoo.com>
*/
$lang['encoding'] = 'utf-8';
$lang['direction'] = 'ltr';
@@ -47,6 +46,7 @@ $lang['btn_resendpwd'] = 'नयाँ प्रवेश शव्द(
$lang['btn_draft'] = ' ड्राफ्ट सम्पादन गर्नुहोस् ';
$lang['btn_recover'] = 'पहिलेको ड्राफ्ट हासिल गर्नुहोस ';
$lang['btn_draftdel'] = ' ड्राफ्ट मेटाउनुहोस् ';
+$lang['btn_register'] = 'दर्ता गर्नुहोस्';
$lang['loggedinas'] = 'प्रवेश गर्नुहोस् ';
$lang['user'] = 'प्रयोगकर्ता ';
$lang['pass'] = 'प्रवेशशव्द';
@@ -56,7 +56,6 @@ $lang['passchk'] = 'एकपटक पुन:';
$lang['remember'] = 'मलाई सम्झनु';
$lang['fullname'] = 'पूरा नाम';
$lang['email'] = 'इमेल';
-$lang['register'] = 'दर्ता गर्नुहोस्';
$lang['profile'] = 'प्रयोगकर्ताको प्रोफाइल';
$lang['badlogin'] = 'माफ गर्नुहोस् , प्रयोगकर्तानाम वा प्रवेशशव्द गलत भयो ';
$lang['minoredit'] = 'सामान्य परिवर्तन';
diff --git a/inc/lang/nl/lang.php b/inc/lang/nl/lang.php
index 9d81d0ff4..7dbde5ac8 100644
--- a/inc/lang/nl/lang.php
+++ b/inc/lang/nl/lang.php
@@ -11,8 +11,7 @@
* @author John de Graaff <john@de-graaff.net>
* @author Dion Nicolaas <dion@nicolaas.net>
* @author Danny Rotsaert <danny.rotsaert@edpnet.be>
- * @author Marijn Hofstra hofstra.m@gmail.com
- * @author Matthias Carchon webmaster@c-mattic.be
+ * @author Matthias Carchon <webmaster@c-mattic.be>
* @author Marijn Hofstra <hofstra.m@gmail.com>
* @author Timon Van Overveldt <timonvo@gmail.com>
*/
@@ -55,6 +54,7 @@ $lang['btn_draft'] = 'Bewerk concept';
$lang['btn_recover'] = 'Herstel concept';
$lang['btn_draftdel'] = 'Verwijder concept';
$lang['btn_revert'] = 'Herstellen';
+$lang['btn_register'] = 'Registreren';
$lang['loggedinas'] = 'Ingelogd als';
$lang['user'] = 'Gebruikersnaam';
$lang['pass'] = 'Wachtwoord';
@@ -64,7 +64,6 @@ $lang['passchk'] = 'nogmaals';
$lang['remember'] = 'Bewaar';
$lang['fullname'] = 'Volledige naam';
$lang['email'] = 'E-mail';
-$lang['register'] = 'Registreren';
$lang['profile'] = 'Gebruikersprofiel';
$lang['badlogin'] = 'Sorry, gebruikersnaam of wachtwoord onjuist';
$lang['minoredit'] = 'Kleine wijziging';
@@ -167,6 +166,9 @@ $lang['yours'] = 'Jouw versie';
$lang['diff'] = 'Toon verschillen met huidige revisie';
$lang['diff2'] = 'Toon verschillen tussen geselecteerde revisies';
$lang['difflink'] = 'Link naar deze vergelijking';
+$lang['diff_type'] = 'Bekijk verschillen:';
+$lang['diff_inline'] = 'Inline';
+$lang['diff_side'] = 'Zij aan zij';
$lang['line'] = 'Regel';
$lang['breadcrumb'] = 'Spoor';
$lang['youarehere'] = 'Je bent hier';
diff --git a/inc/lang/no/lang.php b/inc/lang/no/lang.php
index ca63c0094..e610db6bd 100644
--- a/inc/lang/no/lang.php
+++ b/inc/lang/no/lang.php
@@ -5,17 +5,17 @@
* @license GPL 2 (http://www.gnu.org/licenses/gpl.html)
* @author Reidar Mosvold <Reidar.Mosvold@hit.no>
* @author Jorge Barrera Grandon <jorge@digitalwolves.org>
- * @author Rune Rasmussen http://www.syntaxerror.no/
+ * @author Rune Rasmussen [http://www.syntaxerror.no/]
* @author Thomas Nygreen <nygreen@gmail.com>
* @author Arild Burud <arildb@met.no>
* @author Torkill Bruland <torkar-b@online.no>
* @author Rune M. Andersen <rune.andersen@gmail.com>
- * @author Jakob Vad Nielsen (me@jakobnielsen.net)
+ * @author Jakob Vad Nielsen <me@jakobnielsen.net>
* @author Kjell Tore Næsgaard <kjell.t.nasgaard@ntnu.no>
* @author Knut Staring <knutst@gmail.com>
* @author Lisa Ditlefsen <lisa@vervesearch.com>
* @author Erik Pedersen <erik.pedersen@shaw.ca>
- * @author Erik Bjørn Pedersen <erik.pedersen@shaw.ca>
+ * @author Rune Rasmussen syntaxerror.no@gmail.com
*/
$lang['encoding'] = 'utf-8';
$lang['direction'] = 'ltr';
@@ -49,9 +49,6 @@ $lang['btn_back'] = 'Tilbake';
$lang['btn_backlink'] = 'Tilbakelenker';
$lang['btn_backtomedia'] = 'Tilbake til valg av mediafil';
$lang['btn_subscribe'] = 'Abonner på endringer';
-$lang['btn_unsubscribe'] = 'Ikke abonner på endringer';
-$lang['btn_subscribens'] = 'Abonner på endringer i navnerom';
-$lang['btn_unsubscribens'] = 'Stopp abonnement på endringer i navnerom';
$lang['btn_profile'] = 'Oppdater profil';
$lang['btn_reset'] = 'Tilbakestill';
$lang['btn_resendpwd'] = 'Send nytt passord';
@@ -59,6 +56,7 @@ $lang['btn_draft'] = 'Rediger kladd';
$lang['btn_recover'] = 'Gjennvinn kladd';
$lang['btn_draftdel'] = 'Slett kladd';
$lang['btn_revert'] = 'Gjenopprette';
+$lang['btn_register'] = 'Registrer deg';
$lang['loggedinas'] = 'Innlogget som';
$lang['user'] = 'Brukernavn';
$lang['pass'] = 'Passord';
@@ -68,7 +66,6 @@ $lang['passchk'] = 'Bekreft passord';
$lang['remember'] = 'Husk meg';
$lang['fullname'] = 'Fullt navn';
$lang['email'] = 'E-post';
-$lang['register'] = 'Registrer deg';
$lang['profile'] = 'Brukerprofil';
$lang['badlogin'] = 'Ugyldig brukernavn og/eller passord.';
$lang['minoredit'] = 'Mindre endringer';
@@ -105,7 +102,38 @@ $lang['txt_overwrt'] = 'Overskriv eksisterende fil';
$lang['lockedby'] = 'Stengt av';
$lang['lockexpire'] = 'Avstengningen opphører';
$lang['willexpire'] = 'Din redigeringslås for dette dokumentet kommer snart til å opphøre.\nFor å unngå versjonskonflikter bør du forhåndsvise dokumentet ditt for å forlenge redigeringslåsen.';
-$lang['js']['notsavedyet'] = "Ulagrede endringer vil gå tapt.\nVil du fortsette?";
+$lang['js']['notsavedyet'] = 'Ulagrede endringer vil gå tapt.
+Vil du fortsette?';
+$lang['js']['searchmedia'] = 'Søk for filer';
+$lang['js']['keepopen'] = 'Hold vindu åpent ved valg';
+$lang['js']['hidedetails'] = 'Skjul detaljer';
+$lang['js']['mediatitle'] = 'Lenkeinnstillinger';
+$lang['js']['mediadisplay'] = 'Lenketype';
+$lang['js']['mediaalign'] = 'Justering';
+$lang['js']['mediasize'] = 'Bildestørrelse';
+$lang['js']['mediatarget'] = 'Lenkemål';
+$lang['js']['mediaclose'] = 'Lukk';
+$lang['js']['mediainsert'] = 'Sett inn';
+$lang['js']['mediadisplayimg'] = 'Vis bilde';
+$lang['js']['mediadisplaylnk'] = 'Vis bare lenken';
+$lang['js']['mediasmall'] = 'Liten versjon';
+$lang['js']['mediamedium'] = 'Medium versjon';
+$lang['js']['medialarge'] = 'Stor versjon';
+$lang['js']['mediaoriginal'] = 'Original versjon';
+$lang['js']['medialnk'] = 'Lenke til detaljeside';
+$lang['js']['mediadirect'] = 'Direktelenke til original';
+$lang['js']['medianolnk'] = 'Ingen lenke';
+$lang['js']['medianolink'] = 'Ikke lenk bilde';
+$lang['js']['medialeft'] = 'Venstrejuster bilde';
+$lang['js']['mediaright'] = 'Høyrejuster bilde';
+$lang['js']['mediacenter'] = 'Midtstill bilde';
+$lang['js']['medianoalign'] = 'Ingen justering';
+$lang['js']['nosmblinks'] = 'Lenker til Windows-ressurser fungerer bare i Microsoft sin Internet Explorer.
+Du kan fortsatt kopiere og lime inn lenken.';
+$lang['js']['linkwiz'] = 'guide til lenker';
+$lang['js']['linkto'] = 'Lenke til:';
+$lang['js']['del_confirm'] = 'Slett denne oppføringen?';
+$lang['js']['mu_btn'] = 'Last opp flere filer samtidig';
$lang['rssfailed'] = 'En feil oppstod da denne kilden skulle hentes:';
$lang['nothingfound'] = 'Ingen data funnet.';
$lang['mediaselect'] = 'Valg av mediafil';
@@ -123,15 +151,7 @@ $lang['deletefail'] = '"%s" kunne ikke slettes - sjekk rettighetene.'
$lang['mediainuse'] = 'Filen "%s" har ikke biltt slettet - den er fortsatt i bruk.';
$lang['namespaces'] = 'Navnerom';
$lang['mediafiles'] = 'Tilgjengelige filer i';
-$lang['js']['searchmedia'] = 'Søk for filer';
-$lang['js']['keepopen'] = 'Hold vindu åpent ved valg';
-$lang['js']['hidedetails'] = 'Skjul detaljer';
-$lang['js']['nosmblinks'] = 'Lenker til Windows-ressurser fungerer bare i Microsoft sin Internet Explorer.
-Du kan fortsatt kopiere og lime inn lenken.';
-$lang['js']['linkwiz'] = 'guide til lenker';
-$lang['js']['linkto'] = 'Lenke til:';
-$lang['js']['del_confirm'] = 'Slett denne oppføringen?';
-$lang['js']['mu_btn'] = 'Last opp flere filer samtidig';
+$lang['accessdenied'] = 'Du har ikke tilgang til å se denne siden';
$lang['mediausage'] = 'Bruk følgende syntaks til å refferer til denne filen:';
$lang['mediaview'] = 'Vis original fil';
$lang['mediaroot'] = 'rot';
@@ -147,6 +167,9 @@ $lang['current'] = 'nåværende versjon';
$lang['yours'] = 'Din versjon';
$lang['diff'] = 'Vis forskjeller mot nåværende versjon';
$lang['diff2'] = 'Vis forskjeller mellom valgte versjoner';
+$lang['difflink'] = 'Lenk til denne sammenligningen';
+$lang['diff_type'] = 'Vis forskjeller:';
+$lang['diff_side'] = 'Side ved side';
$lang['line'] = 'Linje';
$lang['breadcrumb'] = 'Spor';
$lang['youarehere'] = 'Du er her';
@@ -161,6 +184,7 @@ $lang['noflash'] = 'For at dette innholdet skal vises må du ha <a
$lang['download'] = 'Last ned utdraget';
$lang['mail_newpage'] = 'side lagt til:';
$lang['mail_changed'] = 'side endret:';
+$lang['mail_subscribe_list'] = 'side endret i \'namespace\':';
$lang['mail_new_user'] = 'ny bruker:';
$lang['mail_upload'] = 'fil opplastet:';
$lang['qb_bold'] = 'Fet tekst';
@@ -203,11 +227,12 @@ $lang['img_copyr'] = 'Opphavsrett';
$lang['img_format'] = 'Format';
$lang['img_camera'] = 'Kamera';
$lang['img_keywords'] = 'Nøkkelord';
-$lang['subscribe_success'] = 'Lagt til %s som abonnent av listen for %s';
-$lang['subscribe_error'] = 'En feil oppstod når %s skulle legges til som abonnent av listen for %s';
-$lang['subscribe_noaddress'] = 'Det er ingen adresse assosiert med din login. Du kan dermed ikke bli lagt til som abonnent av listen.';
-$lang['unsubscribe_success'] = 'Fjernet %s som abonnent for listen %s';
-$lang['unsubscribe_error'] = 'En feil oppstod når %s skulle fjernes som abonnent fra listen for %s';
+$lang['subscr_m_new_header'] = 'Legg til abonnement';
+$lang['subscr_m_current_header'] = 'Gjeldende abonnementer';
+$lang['subscr_m_unsubscribe'] = 'Avmeld';
+$lang['subscr_m_subscribe'] = 'Påmeld';
+$lang['subscr_m_receive'] = 'Motta';
+$lang['subscr_style_every'] = 'e-post for alle endringer';
$lang['authmodfailed'] = 'Feilkonfigurert brukerautorisasjon. Vennligst innformer Wiki-admin.';
$lang['authtempfail'] = 'Brukerautorisasjon er midlertidig utilgjengelig. Om dette vedvarer, vennligst informer Wiki-admin.';
$lang['i_chooselang'] = 'Velg ditt språk';
@@ -235,6 +260,7 @@ $lang['i_pol0'] = 'Åpen Wiki (les, skriv og opplasting for alle)
$lang['i_pol1'] = 'Offentlig Wiki (les for alle, skriving og opplasting bare for registrerte brukere)';
$lang['i_pol2'] = 'Lukket Wiki (les, skriv og opplasting bare for registrerte brukere)';
$lang['i_retry'] = 'Prøv igjen';
+$lang['i_license'] = 'Velg lisens som du vil legge ut innholdet under:';
$lang['mu_intro'] = 'Her kan du laste opp flere filer samtidig. Klikk på utforsk-knappen for å legge dem til i køen. Klikk på "last opp" når du er ferdig med å velge filene. ';
$lang['mu_gridname'] = 'Filnavn';
$lang['mu_gridsize'] = 'Størrelse';
@@ -258,3 +284,4 @@ $lang['days'] = '%d dager siden';
$lang['hours'] = '%d timer siden';
$lang['minutes'] = '%d minutter siden';
$lang['seconds'] = '%d sekunder siden';
+$lang['wordblock'] = 'Din endring ble ikke lagret ettersom den inneholder blokkert tekst (søppel).';
diff --git a/inc/lang/pl/lang.php b/inc/lang/pl/lang.php
index 5a366fbb5..bc0509df3 100644
--- a/inc/lang/pl/lang.php
+++ b/inc/lang/pl/lang.php
@@ -51,6 +51,7 @@ $lang['btn_draft'] = 'Edytuj szkic';
$lang['btn_recover'] = 'Przywróć szkic';
$lang['btn_draftdel'] = 'Usuń szkic';
$lang['btn_revert'] = 'Przywróć';
+$lang['btn_register'] = 'Zarejestruj się!';
$lang['loggedinas'] = 'Zalogowany jako';
$lang['user'] = 'Użytkownik';
$lang['pass'] = 'Hasło';
@@ -60,7 +61,6 @@ $lang['passchk'] = 'Powtórz hasło';
$lang['remember'] = 'Zapamiętaj';
$lang['fullname'] = 'Imię i nazwisko';
$lang['email'] = 'E-mail';
-$lang['register'] = 'Zarejestruj się!';
$lang['profile'] = 'Profil użytkownika';
$lang['badlogin'] = 'Nazwa użytkownika lub hasło są nieprawidłowe.';
$lang['minoredit'] = 'Mniejsze zmiany';
diff --git a/inc/lang/pt-br/lang.php b/inc/lang/pt-br/lang.php
index fb05361f0..f3b012521 100644
--- a/inc/lang/pt-br/lang.php
+++ b/inc/lang/pt-br/lang.php
@@ -13,11 +13,11 @@
* @author Jeferson Propheta <jeferson.propheta@gmail.com>
* @author jair.henrique@gmail.com
* @author Luis Dantas <luis@dantas.com>
- * @author Frederico Guimarães <frederico@teia.bio.br>
- * @author Jair Henrique <jair.henrique@gmail.com>
* @author Luis Dantas <luisdantas@gmail.com>
- * @author Sergio Motta sergio@cisne.com.br
+ * @author Jair Henrique <jair.henrique@gmail.com>
+ * @author Sergio Motta <sergio@cisne.com.br>
* @author Isaias Masiero Filho <masiero@masiero.org>
+ * @author Frederico Guimarães <frederico@teia.bio.br>
*/
$lang['encoding'] = 'utf-8';
$lang['direction'] = 'ltr';
@@ -42,7 +42,7 @@ $lang['btn_upload'] = 'Enviar';
$lang['btn_cancel'] = 'Cancelar';
$lang['btn_index'] = 'Índice';
$lang['btn_secedit'] = 'Editar';
-$lang['btn_login'] = 'Autenticar-se';
+$lang['btn_login'] = 'Entrar';
$lang['btn_logout'] = 'Sair';
$lang['btn_admin'] = 'Administrar';
$lang['btn_update'] = 'Atualizar';
@@ -50,24 +50,24 @@ $lang['btn_delete'] = 'Excluir';
$lang['btn_back'] = 'Voltar';
$lang['btn_backlink'] = 'Links reversos';
$lang['btn_backtomedia'] = 'Voltar à seleção do arquivo de mídia';
-$lang['btn_subscribe'] = 'Monitorar alterações na página';
+$lang['btn_subscribe'] = 'Monitorar alterações';
$lang['btn_profile'] = 'Atualizar o perfil';
$lang['btn_reset'] = 'Limpar';
-$lang['btn_resendpwd'] = 'Enviar uma nova senha';
+$lang['btn_resendpwd'] = 'Envie-me uma nova senha';
$lang['btn_draft'] = 'Editar o rascunho';
$lang['btn_recover'] = 'Recuperar o rascunho';
$lang['btn_draftdel'] = 'Excluir o rascunho';
-$lang['btn_revert'] = 'Restaure';
-$lang['loggedinas'] = 'Autenticado(a) como';
+$lang['btn_revert'] = 'Restaurar';
+$lang['btn_register'] = 'Cadastre-se';
+$lang['loggedinas'] = 'Identificado(a) como';
$lang['user'] = 'Nome de usuário';
$lang['pass'] = 'Senha';
$lang['newpass'] = 'Nova senha';
$lang['oldpass'] = 'Confirme a senha atual';
-$lang['passchk'] = 'mais uma vez';
+$lang['passchk'] = 'Outra vez';
$lang['remember'] = 'Lembre-se de mim';
$lang['fullname'] = 'Nome completo';
$lang['email'] = 'E-mail';
-$lang['register'] = 'Registrar';
$lang['profile'] = 'Perfil do usuário';
$lang['badlogin'] = 'Desculpe, mas o nome de usuário ou a senha estão incorretos.';
$lang['minoredit'] = 'Alterações mínimas';
@@ -81,12 +81,12 @@ $lang['regmailfail'] = 'Aparentemente ocorreu um erro no envio da senh
$lang['regbadmail'] = 'O endereço de e-mail fornecido é, aparentemente, inválido - se você acha que isso é um erro, entre em contato com o administrador';
$lang['regbadpass'] = 'As senhas digitadas não são idênticas. Por favor, tente novamente.';
$lang['regpwmail'] = 'A sua senha do DokuWiki';
-$lang['reghere'] = 'Ainda não tem uma conta? Cadastre-se para obter uma.';
+$lang['reghere'] = 'Ainda não tem uma conta? Crie uma';
$lang['profna'] = 'Esse wiki não suporta modificações do perfil.';
$lang['profnochange'] = 'Sem alterações, nada para fazer.';
$lang['profnoempty'] = 'Não são permitidos nomes ou endereços de e-mail em branco.';
$lang['profchanged'] = 'O perfil do usuário foi atualizado com sucesso.';
-$lang['pwdforget'] = 'Esqueceu sua senha? Obtenha uma nova.';
+$lang['pwdforget'] = 'Esqueceu sua senha? Solicite outra';
$lang['resendna'] = 'Esse wiki não tem suporte para o reenvio de senhas.';
$lang['resendpwd'] = 'Enviar a nova senha para';
$lang['resendpwdmissing'] = 'Desculpe, você deve preencher todos os campos.';
@@ -151,7 +151,7 @@ $lang['uploadsize'] = 'O arquivo transmitido era grande demais. (max.
$lang['deletesucc'] = 'O arquivo "%s" foi excluído.';
$lang['deletefail'] = 'Não foi possível excluir "%s" - verifique as permissões.';
$lang['mediainuse'] = 'O arquivo "%s" não foi excluído - ele ainda está em uso.';
-$lang['namespaces'] = 'Espaços de nome';
+$lang['namespaces'] = 'Espaços de nomes';
$lang['mediafiles'] = 'Arquivos disponíveis em';
$lang['accessdenied'] = 'Você não tem permissão para visualizar esta página.';
$lang['mediausage'] = 'Use a seguinte sintaxe para referenciar esse arquivo:';
@@ -170,6 +170,9 @@ $lang['yours'] = 'Sua versão';
$lang['diff'] = 'Mostrar diferenças com a revisão atual';
$lang['diff2'] = 'Mostrar diferenças entre as revisões selecionadas';
$lang['difflink'] = 'Link para esta página de comparações';
+$lang['diff_type'] = 'Ver as diferenças:';
+$lang['diff_inline'] = 'Mescladas';
+$lang['diff_side'] = 'Lado a lado';
$lang['line'] = 'Linha';
$lang['breadcrumb'] = 'Visitou';
$lang['youarehere'] = 'Você está aqui';
@@ -184,7 +187,7 @@ $lang['noflash'] = 'O <a href="http://www.adobe.com/products/flash
$lang['download'] = 'Download Snippet';
$lang['mail_newpage'] = 'página adicionada:';
$lang['mail_changed'] = 'página modificada:';
-$lang['mail_subscribe_list'] = 'páginas alteradas no namespace:';
+$lang['mail_subscribe_list'] = 'páginas alteradas no espaço de nomes:';
$lang['mail_new_user'] = 'novo usuário:';
$lang['mail_upload'] = 'arquivo enviado:';
$lang['qb_bold'] = 'Texto em negrito';
@@ -227,22 +230,22 @@ $lang['img_copyr'] = 'Direitos autorais';
$lang['img_format'] = 'Formato';
$lang['img_camera'] = 'Câmera';
$lang['img_keywords'] = 'Palavras-chave';
-$lang['subscr_subscribe_success'] = 'Adicionado %s para a lista de inscrição para %s';
-$lang['subscr_subscribe_error'] = 'Erro adicionando %s para a lista de inscrição para %s';
-$lang['subscr_subscribe_noaddress'] = 'Não há endereço associado com seu login, você não pode ser adicionado à lista de inscrição';
-$lang['subscr_unsubscribe_success'] = 'Removido %s da lista de inscrição para %s';
-$lang['subscr_unsubscribe_error'] = 'Erro removendo %s da lista de inscrição para %s';
-$lang['subscr_already_subscribed'] = '%s já está inscrito para s%';
-$lang['subscr_not_subscribed'] = 's% não está inscrito para s%';
-$lang['subscr_m_not_subscribed'] = 'Voce não está inscrito na pagina ou namespace corrent';
-$lang['subscr_m_new_header'] = 'Adicionar inscrição';
-$lang['subscr_m_current_header'] = 'Inscrições correntes';
-$lang['subscr_m_unsubscribe'] = 'cancelar inscrição';
-$lang['subscr_m_subscribe'] = 'Inscrição';
+$lang['subscr_subscribe_success'] = 'Adicionado %s à lista de monitoramentos de %s';
+$lang['subscr_subscribe_error'] = 'Ocorreu um erro na adição de %s à lista de monitoramentos de %s';
+$lang['subscr_subscribe_noaddress'] = 'Como não há nenhum endereço associado ao seu usuário, você não pode ser adicionado à lista de monitoramento';
+$lang['subscr_unsubscribe_success'] = '%s foi removido da lista de monitoramento de %s';
+$lang['subscr_unsubscribe_error'] = 'Ocorreu um erro na remoção de %s da lista de monitoramentos de %s';
+$lang['subscr_already_subscribed'] = '%s já está monitorando s%';
+$lang['subscr_not_subscribed'] = 's% não está monitorando s%';
+$lang['subscr_m_not_subscribed'] = 'Você não está monitorando nem a página atual nem o espaço de nomes.';
+$lang['subscr_m_new_header'] = 'Adicionar monitoramento';
+$lang['subscr_m_current_header'] = 'Monitoramentos atuais';
+$lang['subscr_m_unsubscribe'] = 'Cancelar monitoramento';
+$lang['subscr_m_subscribe'] = 'Monitorar';
$lang['subscr_m_receive'] = 'Receber';
-$lang['subscr_style_every'] = 'email em cada modificação';
-$lang['subscr_style_digest'] = 'digerir emails de mudanças para cada página (A cada %.2f dias)';
-$lang['subscr_style_list'] = 'Lista de mudanças desde o último email (A cada %.2f dias)';
+$lang['subscr_style_every'] = 'um e-mail a cada modificação';
+$lang['subscr_style_digest'] = 'um agrupamento de e-mails com as mudanças para cada página (a cada %.2f dias)';
+$lang['subscr_style_list'] = 'uma lista de páginas modificadas desde o último e-mail (a cada %.2f dias)';
$lang['authmodfailed'] = 'A configuração da autenticação de usuário está com problemas. Por favor, informe ao administrador do wiki.';
$lang['authtempfail'] = 'A autenticação de usuários está temporariamente desabilitada. Se essa situação persistir, por favor, informe ao administrador do Wiki.';
$lang['i_chooselang'] = 'Selecione o seu idioma';
diff --git a/inc/lang/pt-br/subscr_digest.txt b/inc/lang/pt-br/subscr_digest.txt
index 6632b1f57..77f76e1c3 100644
--- a/inc/lang/pt-br/subscr_digest.txt
+++ b/inc/lang/pt-br/subscr_digest.txt
@@ -1,6 +1,6 @@
Olá!
-A página @PAGE@ na wiki @TITLE@ mudou.
+A página @PAGE@ na wiki @TITLE@ foi modificada.
Estas foram as mudanças:
--------------------------------------------------------
@@ -10,8 +10,11 @@ Estas foram as mudanças:
Revisão antiga:@OLDPAGE@
Nova Revisão:@NEWPAGE@
-Para cancelar a página de notificações, entre na wiki @DOKUWIKIURL@
-e então visite a página de @SUBSCRIBE@ e cancele a inscrição de edição da página ou namespace.
+Para cancelar as notificações de mudanças, entre em
+@DOKUWIKIURL@, vá até @SUBSCRIBE@
+e cancele o monitoramento da página e/ou do espaço de
+nomes.
+
--
Este e-mail foi gerado pelo DokuWiki em
@DOKUWIKIURL@
diff --git a/inc/lang/pt-br/subscr_list.txt b/inc/lang/pt-br/subscr_list.txt
index 8f4a66d1a..c6011d063 100644
--- a/inc/lang/pt-br/subscr_list.txt
+++ b/inc/lang/pt-br/subscr_list.txt
@@ -1,14 +1,25 @@
Olá!
-Páginas no namespace @PAGE@ na wiki @TITLE@ mudaram.
-Estas foram as mudanças:
+Páginas no espaço de nomes @PAGE@ na wiki
+@TITLE@ foram modificadas.
+Estas são as páginas modificadas:
--------------------------------------------------------
@DIFF@
--------------------------------------------------------
-Para cancelar a página de notificações, entre na wiki @DOKUWIKIURL@
-e então visite a página de @SUBSCRIBE@ e cancele a inscrição de edição da página ou namespace.
+Para cancelar as notificações de alterações, entre em
+@DOKUWIKIURL@, vá até @SUBSCRIBE@
+e cancele o monitoramento da página e/ou do espaço de
+nomes.
+
+
+Para cancelar as notificações de páginas, entre na wiki @DOKUWIKIURL@
+e então visite @SUBSCRIBE@ e cancele a inscrição de edição da página ou namespace.
+
+
+Para cancelar a página de notificações, entre na wiki @DOKUWIKIURL@,
+visite a página de @SUBSCRIBE@ e cancele a inscrição de edição da página ou namespace.
--
Este e-mail foi gerado pelo DokuWiki em
@DOKUWIKIURL@
diff --git a/inc/lang/pt-br/subscr_single.txt b/inc/lang/pt-br/subscr_single.txt
index 1a103558c..b1c052e84 100644
--- a/inc/lang/pt-br/subscr_single.txt
+++ b/inc/lang/pt-br/subscr_single.txt
@@ -1,6 +1,6 @@
Olá!
-A página @PAGE@ na wiki @TITLE@ mudou.
+A página @PAGE@ na wiki @TITLE@ foi alterada.
Estas foram as mudanças:
--------------------------------------------------------
@@ -13,8 +13,10 @@ Sumário : @SUMMARY@
Revisão antiga:@OLDPAGE@
Nova Revisão:@NEWPAGE@
-Para cancelar a página de notificações, entre na wiki @DOKUWIKIURL@ visite @NEWPAGE@
-e cancele a inscrição de edição da página ou namespace.
+Para cancelar as notificações de mudanças, entre em
+@DOKUWIKIURL@, vá até @NEWPAGE@
+e cancele o monitoramento da página e/ou do espaço de
+nomes.
--
Este e-mail foi gerado pelo DokuWiki em
-@DOKUWIKIURL@
+@DOKUWIKIURL@ \ No newline at end of file
diff --git a/inc/lang/pt/lang.php b/inc/lang/pt/lang.php
index 4c0ec02d2..41406ee60 100644
--- a/inc/lang/pt/lang.php
+++ b/inc/lang/pt/lang.php
@@ -8,6 +8,7 @@
* @author Enrico Nicoletto <liverig@gmail.com>
* @author Fil <fil@meteopt.com>
* @author André Neves <drakferion@gmail.com>
+ * @author José Campos zecarlosdecampos@gmail.com
*/
$lang['encoding'] = 'utf-8';
$lang['direction'] = 'ltr';
@@ -48,6 +49,7 @@ $lang['btn_draft'] = 'Editar rascunho';
$lang['btn_recover'] = 'Recuperar rascunho';
$lang['btn_draftdel'] = 'Apagar rascunho';
$lang['btn_revert'] = 'Restaurar';
+$lang['btn_register'] = 'Registar';
$lang['loggedinas'] = 'Está em sessão como';
$lang['user'] = 'Utilizador';
$lang['pass'] = 'Senha';
@@ -57,7 +59,6 @@ $lang['passchk'] = 'Confirmar novamente';
$lang['remember'] = 'Memorizar?';
$lang['fullname'] = 'Nome completo';
$lang['email'] = 'Email';
-$lang['register'] = 'Registar';
$lang['profile'] = 'Perfil do Utilizador';
$lang['badlogin'] = 'O utilizador inválido ou senha inválida.';
$lang['minoredit'] = 'Alterações Menores';
@@ -160,6 +161,9 @@ $lang['yours'] = 'A sua versão';
$lang['diff'] = 'mostrar diferenças com a versão actual';
$lang['diff2'] = 'mostrar diferenças entre versões escolhidas';
$lang['difflink'] = 'Ligação para esta vista de comparação';
+$lang['diff_type'] = 'Ver diferenças';
+$lang['diff_inline'] = 'Embutido';
+$lang['diff_side'] = 'Lado a lado';
$lang['line'] = 'Linha';
$lang['breadcrumb'] = 'Está em';
$lang['youarehere'] = 'Está aqui';
diff --git a/inc/lang/ro/lang.php b/inc/lang/ro/lang.php
index d21249d91..cbecf6f6c 100644
--- a/inc/lang/ro/lang.php
+++ b/inc/lang/ro/lang.php
@@ -5,11 +5,8 @@
* @license GPL 2 (http://www.gnu.org/licenses/gpl.html)
* @author Tiberiu Micu <tibimicu@gmx.net>
* @author Sergiu Baltariu <s_baltariu@yahoo.com>
- * @author s_baltariu@yahoo.com
- * @author Emanuel-Emeric Andrasi <n30@mandrivausers.ro>
* @author Emanuel-Emeric Andrași <n30@mandrivausers.ro>
* @author Emanuel-Emeric Andraşi <em.andrasi@mandrivausers.ro>
- * @author Emanuel-Emeric Andrasi <em.andrasi@mandrivausers.ro>
*/
$lang['encoding'] = 'utf-8';
$lang['direction'] = 'ltr';
@@ -50,6 +47,7 @@ $lang['btn_draft'] = 'Editează schiţă';
$lang['btn_recover'] = 'Recuperează schiţă';
$lang['btn_draftdel'] = 'Şterge schiţă';
$lang['btn_revert'] = 'Revenire';
+$lang['btn_register'] = 'Înregistrează';
$lang['loggedinas'] = 'Logat ca şi';
$lang['user'] = 'Utilizator';
$lang['pass'] = 'Parola';
@@ -59,7 +57,6 @@ $lang['passchk'] = 'încă o dată';
$lang['remember'] = 'Ţine-mă minte';
$lang['fullname'] = 'Nume complet';
$lang['email'] = 'E-Mail';
-$lang['register'] = 'Înregistrează';
$lang['profile'] = 'Profil Utilizator';
$lang['badlogin'] = 'Imi pare rău, utilizatorul şi/sau parola au fost greşite.';
$lang['minoredit'] = 'Modificare Minoră';
@@ -162,6 +159,9 @@ $lang['yours'] = 'Versiunea ta';
$lang['diff'] = 'arată diferenţele faţă de versiunea curentă';
$lang['diff2'] = 'Arată diferenţele dintre versiunile selectate';
$lang['difflink'] = 'Link către această vizualizare comparativă';
+$lang['diff_type'] = 'Vezi diferențe:';
+$lang['diff_inline'] = 'Succesiv';
+$lang['diff_side'] = 'Alăturate';
$lang['line'] = 'Linia';
$lang['breadcrumb'] = 'Traseu';
$lang['youarehere'] = 'Sunteţi aici';
diff --git a/inc/lang/ru/conflict.txt b/inc/lang/ru/conflict.txt
index f1ac60bd4..6c5e33dce 100644
--- a/inc/lang/ru/conflict.txt
+++ b/inc/lang/ru/conflict.txt
@@ -2,4 +2,4 @@
Существует более новая версия документа, который вы редактировали. Такое случается, когда другой пользователь изменил документ, пока вы делали то же самое.
-Внимательно изучите различия, приведенные ниже и решите, какую версию оставить. Если вы выберете ''Сохранить'', то ваша версия будет сохранена. Нажав ''Отменить',' вы оставите текущую версию.
+Внимательно изучите различия, приведенные ниже, и решите, какую версию оставить. Если вы выберете «Сохранить», то ваша версия будет сохранена. Нажав «Отменить», вы оставите текущую версию.
diff --git a/inc/lang/ru/draft.txt b/inc/lang/ru/draft.txt
index bbd2e5913..cb35f72b6 100644
--- a/inc/lang/ru/draft.txt
+++ b/inc/lang/ru/draft.txt
@@ -1,6 +1,6 @@
====== Найден черновик ======
-Последний раз редактирование этой страницы не было корректно завершено. Во время вашей работы был автоматически сохранён черновик, который вы теперь можете восстановить и продолжить прерванную правку. Ниже вы видите автоматически сохраненную версию.
+Последний раз редактирование этой страницы не было корректно завершено. Во время вашей работы был автоматически сохранён черновик, который вы теперь можете восстановить и продолжить прерванную правку. Ниже вы видите автоматически сохранённую версию.
Пожалуйста, решите, хотите ли вы //восстановить// потерянную версию, //удалить// черновик, или //отменить// редактирование.
diff --git a/inc/lang/ru/edit.txt b/inc/lang/ru/edit.txt
index 6398e8e83..aac399d7c 100644
--- a/inc/lang/ru/edit.txt
+++ b/inc/lang/ru/edit.txt
@@ -1,2 +1,2 @@
-Отредактируйте страницу и нажмите ''Сохранить''. Прочтите [[wiki:syntax]] для ознакомления с синтаксисом вики. Пожалуйста, редактируйте только в том случае, если планируете **улучшить** содержимое. Если вы просто хотите потестировать что-либо, воспользуйтесь специальной страницей: [[playground:playground]].
+Отредактируйте страницу и нажмите «Сохранить». Прочтите [[wiki:syntax|справочную страницу]] для ознакомления с синтаксисом вики. Пожалуйста, редактируйте только в том случае, если планируете **улучшить** содержимое. Если вы просто хотите потестировать что-либо, воспользуйтесь специальной страницей: [[playground:playground]].
diff --git a/inc/lang/ru/editrev.txt b/inc/lang/ru/editrev.txt
index db843ec1c..97b799a70 100644
--- a/inc/lang/ru/editrev.txt
+++ b/inc/lang/ru/editrev.txt
@@ -1,2 +1,2 @@
-**Вы загрузили старую ревизию документа!** Сохранив её, вы создадите новую текущую версию с этим содержимым.
+**Вы загрузили старую ревизию документа.** Сохранив её, вы создадите новую текущую версию с этим содержимым.
----
diff --git a/inc/lang/ru/install.html b/inc/lang/ru/install.html
index da0c5e239..b830b06c0 100644
--- a/inc/lang/ru/install.html
+++ b/inc/lang/ru/install.html
@@ -1,6 +1,6 @@
-<p>Эта страница предназначена помочь в первоначальной установке и конфигурации «<a href="http://www.dokuwiki.org">ДокуВики</a>». Дополнительная информация о программе установки доступна на её <a href="http://www.dokuwiki.org/installer">странице документации</a>.</p>
+<p>Эта страница предназначена помочь в первоначальной установке и конфигурации «<a href="http://www.dokuwiki.org/">ДокуВики</a>». Дополнительная информация о программе установки доступна на её <a href="http://www.dokuwiki.org/installer">странице документации</a>.</p>
-<p>«ДокуВики» использует обычные файлы для хранения страниц и дополнительной информации (например, изображений, поискового индекса, предыдущих версий страницы, и т. д.). Для успешной работы «ДокуВики» <strong>необходим</strong> доступ на запись к директориям с этими файлами. Данная программа установки не может самостоятельно изменять системные права доступа к директориям. Обычно это делается напрямую из командной строки (shell), или, если вы используете удалённый хостинг, через FTP или панель управления вашего хостинга (например, cPanel).</p>
+<p>«ДокуВики» использует обычные файлы для хранения страниц и дополнительной информации (например, изображений, поискового индекса, предыдущих версий страницы, и т. д.). Для успешной работы «ДокуВики» <strong>необходим</strong> доступ на запись к директориям с этими файлами. Данная программа установки не может самостоятельно изменять системные права доступа к директориям. Обычно это делается напрямую из командной строки (shell), или, если вы используете удалённый хостинг, через FTP или панель управления своего хостинга (например, cPanel).</p>
<p>Программа установки включит использование списков контроля доступа (<acronym title="access control list">ACL</acronym>) в вашей «ДокуВики». Это позволит администратору, после авторизации в «ДокуВики», использовать специальное меню для установки плагинов, управления пользователями и доступом к страницам вики, а также для настройки конфигурационных параметров. Списки контроля доступа не обязательны для работы «ДокуВики», однако они позволяют упростить управление вашей «ДокуВики».</p>
diff --git a/inc/lang/ru/lang.php b/inc/lang/ru/lang.php
index 88692ae93..1eaa488ec 100644
--- a/inc/lang/ru/lang.php
+++ b/inc/lang/ru/lang.php
@@ -8,15 +8,17 @@
* @author Denis Simakov <akinoame1@gmail.com>
* @author Kaens Bard <kaens@mail.ru>
* @author Andrew Pleshakov <beotiger@mail.ru>
- * @author Змей Этерийский evil_snake@eternion.ru
+ * @author Змей Этерийский <evil_snake@eternion.ru>
* @author Hikaru Nakajima <jisatsu@mail.ru>
* @author Alexei Tereschenko <alexeitlex@yahoo.com>
- * @author Irina Ponomareva irinaponomareva@webperfectionist.com
+ * @author Irina Ponomareva <irinaponomareva@webperfectionist.com>
* @author Alexander Sorkin <kibizoid@gmail.com>
* @author Kirill Krasnov <krasnovforum@gmail.com>
* @author Vlad Tsybenko <vlad.development@gmail.com>
* @author Aleksey Osadchiy <rfc@nm.ru>
* @author Aleksandr Selivanov <alexgearbox@gmail.com>
+ * @author Ladyko Andrey <fylh@succexy.spb.ru>
+ * @author Eugene <windy.wanderer@gmail.com>
*/
$lang['encoding'] = ' utf-8';
$lang['direction'] = 'ltr';
@@ -57,6 +59,7 @@ $lang['btn_draft'] = 'Править черновик';
$lang['btn_recover'] = 'Восстановить черновик';
$lang['btn_draftdel'] = 'Удалить черновик';
$lang['btn_revert'] = 'Восстановить';
+$lang['btn_register'] = 'Зарегистрироваться';
$lang['loggedinas'] = 'Зашли как';
$lang['user'] = 'Логин';
$lang['pass'] = 'Пароль';
@@ -66,7 +69,6 @@ $lang['passchk'] = 'повторите';
$lang['remember'] = 'Запомнить меня';
$lang['fullname'] = 'Полное имя';
$lang['email'] = 'Эл. адрес';
-$lang['register'] = 'Зарегистрироваться';
$lang['profile'] = 'Профиль пользователя';
$lang['badlogin'] = 'Извините, неверное имя пользователя или пароль.';
$lang['minoredit'] = 'Небольшие изменения';
@@ -76,7 +78,7 @@ $lang['regmissing'] = 'Извините, вам следует зап
$lang['reguexists'] = 'Извините, пользователь с таким логином уже существует.';
$lang['regsuccess'] = 'Пользователь создан, пароль выслан на адрес электронной почты.';
$lang['regsuccess2'] = 'Пользователь создан.';
-$lang['regmailfail'] = 'Похоже, проблема с отправкой пароля по почте. Пожалуйста, сообщите администратору.';
+$lang['regmailfail'] = 'Похоже есть проблема с отправкой пароля по почте. Пожалуйста, сообщите об этом администратору.';
$lang['regbadmail'] = 'Данный вами адрес электронной почты выглядит неправильным. Если вы считаете это ошибкой, сообщите администратору.';
$lang['regbadpass'] = 'Два введённых пароля не идентичны. Пожалуйста, попробуйте ещё раз.';
$lang['regpwmail'] = 'Ваш пароль для системы «ДокуВики»';
@@ -94,7 +96,7 @@ $lang['resendpwdbadauth'] = 'Извините, неверный код ав
$lang['resendpwdconfirm'] = 'Ссылка для подтверждения пароля была выслана по электронной почте. ';
$lang['resendpwdsuccess'] = 'Ваш новый пароль был выслан по электронной почте.';
$lang['license'] = 'За исключением случаев, когда указано иное, содержимое этой вики предоставляется на условиях следующей лицензии:';
-$lang['licenseok'] = 'Примечание: редактируя эту страницу, вы соглашаетесь на использование вашего вклада на условиях следующей лицензии:';
+$lang['licenseok'] = 'Примечание: редактируя эту страницу, вы соглашаетесь на использование своего вклада на условиях следующей лицензии:';
$lang['searchmedia'] = 'Поиск по имени файла:';
$lang['searchmedia_in'] = 'Поиск в %s';
$lang['txt_upload'] = 'Выберите файл для загрузки';
@@ -103,8 +105,7 @@ $lang['txt_overwrt'] = 'Перезаписать существующ
$lang['lockedby'] = 'В данный момент заблокирован';
$lang['lockexpire'] = 'Блокировка истекает в';
$lang['willexpire'] = 'Ваша блокировка редактирования этой страницы истекает в течение минуты.\nЧтобы избежать конфликтов и сбросить таймер блокировки, нажмите кнопку просмотра.';
-$lang['js']['notsavedyet'] = 'Несохранённые изменения будут потеряны.
-Вы действительно хотите продолжить?';
+$lang['js']['notsavedyet'] = 'Несохранённые изменения будут потеряны. Вы действительно хотите продолжить?';
$lang['js']['searchmedia'] = 'Поиск файлов';
$lang['js']['keepopen'] = 'Не закрывать окно после выбора';
$lang['js']['hidedetails'] = 'Скрыть детали';
@@ -112,7 +113,7 @@ $lang['js']['mediatitle'] = 'Настройки ссылок';
$lang['js']['mediadisplay'] = 'Тип ссылки';
$lang['js']['mediaalign'] = 'Выравнивание';
$lang['js']['mediasize'] = 'Размер изображения';
-$lang['js']['mediatarget'] = 'target ссылки';
+$lang['js']['mediatarget'] = 'Значение target ссылки';
$lang['js']['mediaclose'] = 'Закрыть';
$lang['js']['mediainsert'] = 'Вставить';
$lang['js']['mediadisplayimg'] = 'Показывать изображение.';
@@ -129,8 +130,7 @@ $lang['js']['medialeft'] = 'Выровнять изображение по
$lang['js']['mediaright'] = 'Выровнять изображение по правому краю.';
$lang['js']['mediacenter'] = 'Выровнять изображение по центру.';
$lang['js']['medianoalign'] = 'Не выравнивать.';
-$lang['js']['nosmblinks'] = 'Ссылка на сетевые каталоги Windows работает только из Интернет Эксплорера
-Но вы можете скопировать ссылку.';
+$lang['js']['nosmblinks'] = 'Ссылка на сетевые каталоги Windows работает только из Интернет Эксплорера. Но вы можете скопировать ссылку.';
$lang['js']['linkwiz'] = 'Мастер ссылок';
$lang['js']['linkto'] = 'Ссылка на:';
$lang['js']['del_confirm'] = 'Вы на самом деле желаете удалить выбранное?';
@@ -149,18 +149,18 @@ $lang['uploadxss'] = 'Загрузка заблокирована п
$lang['uploadsize'] = 'Загруженный файл был слишком большой. (макс. %s)';
$lang['deletesucc'] = 'Файл "%s" был удалён.';
$lang['deletefail'] = 'Невозможно удалить файл "%s". Проверьте права доступа к файлу.';
-$lang['mediainuse'] = 'Файл "%s" не был удалён - файл всё ещё используется.';
+$lang['mediainuse'] = 'Файл "%s" не был удалён — файл всё ещё используется.';
$lang['namespaces'] = 'Пространства имён';
$lang['mediafiles'] = 'Доступные файлы';
$lang['accessdenied'] = 'Вы не можете просмотреть эту страницу.';
$lang['mediausage'] = 'Для ссылки на этот файл используйте следующий синтаксис:';
$lang['mediaview'] = 'Посмотреть исходный файл';
$lang['mediaroot'] = 'корень';
-$lang['mediaupload'] = 'Здесь можно загрузить файл в текущий каталог («пространство имен»). Чтобы создать подкаталоги, добавьте их к началу имени файла («Загрузить как»). Имена подкаталогов разделяются двоеточиями. ';
+$lang['mediaupload'] = 'Здесь можно загрузить файл в текущий каталог («пространство имён»). Чтобы создать подкаталоги, добавьте их к началу имени файла («Загрузить как»). Имена подкаталогов разделяются двоеточиями. ';
$lang['mediaextchange'] = 'Расширение изменилось: с .%s на .%s!';
$lang['reference'] = 'Ссылки для';
-$lang['ref_inuse'] = 'Этот файл не может быть удалён, так как он используется следующими страницами:';
-$lang['ref_hidden'] = 'Некоторые ссылки находятся на страницах, на чтение которых у вас нет прав';
+$lang['ref_inuse'] = 'Этот файл не может быть удалён, так как он используется на следующих страницах:';
+$lang['ref_hidden'] = 'Некоторые ссылки находятся на страницах, на чтение которых у вас нет прав доступа';
$lang['hits'] = 'соответствий';
$lang['quickhits'] = 'Соответствия в названиях страниц';
$lang['toc'] = 'Содержание';
@@ -169,6 +169,9 @@ $lang['yours'] = 'Ваша версия';
$lang['diff'] = 'показать отличия от текущей версии';
$lang['diff2'] = 'Показать различия между ревизиями ';
$lang['difflink'] = 'Ссылка на это сравнение';
+$lang['diff_type'] = 'Посмотреть отличия';
+$lang['diff_inline'] = 'Встроенный';
+$lang['diff_side'] = 'Бок о бок';
$lang['line'] = 'Строка';
$lang['breadcrumb'] = 'Вы посетили';
$lang['youarehere'] = 'Вы находитесь здесь';
@@ -183,7 +186,7 @@ $lang['noflash'] = 'Для просмотра этого соде
$lang['download'] = 'Скачать код';
$lang['mail_newpage'] = 'страница добавлена:';
$lang['mail_changed'] = 'страница изменена:';
-$lang['mail_subscribe_list'] = 'изменились страницы в пространстве имен:';
+$lang['mail_subscribe_list'] = 'изменились страницы в пространстве имён:';
$lang['mail_new_user'] = 'новый пользователь:';
$lang['mail_upload'] = 'файл закачан:';
$lang['qb_bold'] = 'Полужирный';
@@ -210,7 +213,7 @@ $lang['qb_media'] = 'Добавить изображения или
$lang['qb_sig'] = 'Вставить подпись';
$lang['qb_smileys'] = 'Смайлики';
$lang['qb_chars'] = 'Специальные символы';
-$lang['upperns'] = 'Перейти в родительское пространство имен';
+$lang['upperns'] = 'Перейти в родительское пространство имён';
$lang['admin_register'] = 'Добавить пользователя';
$lang['metaedit'] = 'Править метаданные';
$lang['metasaveerr'] = 'Ошибка записи метаданных';
@@ -233,7 +236,7 @@ $lang['subscr_unsubscribe_success'] = 'Удалён %s из подписки н
$lang['subscr_unsubscribe_error'] = 'Ошибка удаления %s из подписки на %s';
$lang['subscr_already_subscribed'] = '%s уже подписан на %s';
$lang['subscr_not_subscribed'] = '%s не подписан на %s';
-$lang['subscr_m_not_subscribed'] = 'Вы не подписаны на текущую страницу или пространство имен.';
+$lang['subscr_m_not_subscribed'] = 'Вы не подписаны на текущую страницу или пространство имён.';
$lang['subscr_m_new_header'] = 'Добавить подписку';
$lang['subscr_m_current_header'] = 'Текущие подписки';
$lang['subscr_m_unsubscribe'] = 'Отменить подписку';
@@ -242,8 +245,8 @@ $lang['subscr_m_receive'] = 'Получить';
$lang['subscr_style_every'] = 'уведомлять о каждом изменении';
$lang['subscr_style_digest'] = 'сводка изменений по каждой странице';
$lang['subscr_style_list'] = 'перечислять изменившиеся страницы с прошлого уведомления';
-$lang['authmodfailed'] = 'Неправильная конфигурация аутентификации пользователя. Пожалуйста, сообщите об этом вашему администратору вики.';
-$lang['authtempfail'] = 'Аутентификация пользователей временно недоступна. Если проблема продолжается какое-то время, пожалуйста, сообщите об этом вашему администратору вики.';
+$lang['authmodfailed'] = 'Неправильная конфигурация аутентификации пользователя. Пожалуйста, сообщите об этом своему администратору вики.';
+$lang['authtempfail'] = 'Аутентификация пользователей временно недоступна. Если проблема продолжается какое-то время, пожалуйста, сообщите об этом своему администратору вики.';
$lang['i_chooselang'] = 'Выберите свой язык/Choose your language';
$lang['i_installer'] = 'Установка «ДокуВики»';
$lang['i_wikiname'] = 'Название вики';
@@ -258,18 +261,18 @@ $lang['i_phpver'] = 'Ваша версия PHP (<code>%s</code>) н
$lang['i_permfail'] = '<code>%s</code> недоступна для записи «ДокуВики». Вам необходимо исправить системные права доступа для этой директории!';
$lang['i_confexists'] = '<code>%s</code> уже существует';
$lang['i_writeerr'] = 'Не удалось создать <code>%s</code>. Вам необходимо проверить системные права доступа к файлу/директориям и создать файл вручную. ';
-$lang['i_badhash'] = 'dokuwiki.php не распознана или изменена (хэш=<code>%s</code>)';
+$lang['i_badhash'] = 'dokuwiki.php не распознан или изменён (хэш=<code>%s</code>)';
$lang['i_badval'] = '<code>%s</code> — недопустимое или пустое значение';
$lang['i_success'] = 'Конфигурация прошла успешно. Теперь вы можете удалить файл install.php. Переходите к
- <a href="doku.php">вашей новой «ДокуВики»</a>.';
-$lang['i_failure'] = 'При записи в файлы конфигурации были обнаружены ошибки. Возможно, вам придется исправить их вручную, прежде чем вы сможете использовать <a href="doku.php">вашу новую «ДокуВики»</a>.';
+ <a href="doku.php">своей новой «ДокуВики»</a>.';
+$lang['i_failure'] = 'При записи в файлы конфигурации были обнаружены ошибки. Возможно, вам придётся исправить их вручную, прежде чем вы сможете использовать <a href="doku.php">свою новую «ДокуВики»</a>.';
$lang['i_policy'] = 'Исходная политика прав доступа';
$lang['i_pol0'] = 'Открытая вики (чтение, запись, закачка файлов для всех)';
$lang['i_pol1'] = 'Общедоступная вики (чтение для всех, запись и загрузка файлов для зарегистрированных пользователей)';
$lang['i_pol2'] = 'Закрытая вики (чтение, запись и загрузка файлов только для зарегистрированных пользователей)';
$lang['i_retry'] = 'Повторить попытку';
-$lang['i_license'] = 'Пожалуйста, выберите тип лицензии для вашей вики:';
-$lang['mu_intro'] = 'Здесь вы можете загрузить несколько файлов сразу. Кликните на «обзор», чтобы добавить их в список. Нажмите «загрузить» когда будете готовы.';
+$lang['i_license'] = 'Пожалуйста, выберите тип лицензии для своей вики:';
+$lang['mu_intro'] = 'Здесь вы можете загрузить несколько файлов сразу. Кликните на «обзор», чтобы добавить их в список. Нажмите «загрузить», когда будете готовы.';
$lang['mu_gridname'] = 'Имя файла';
$lang['mu_gridsize'] = 'Размер';
$lang['mu_gridstat'] = 'Статус';
@@ -284,7 +287,7 @@ $lang['mu_progress'] = '@PCT@% загружено';
$lang['mu_filetypes'] = 'Допустимые типы файлов';
$lang['mu_info'] = 'файлов загружено.';
$lang['mu_lasterr'] = 'Последняя ошибка:';
-$lang['recent_global'] = 'Вы просматриваете изменения в пространстве имён <b>%s</b>. Вы можете также <a href="%s">просмотреть недавние изменения на всей вики</a>.';
+$lang['recent_global'] = 'Вы просматриваете изменения в пространстве имён <b>%s</b>. Вы можете также <a href="%s">просмотреть недавние изменения во всей вики</a>.';
$lang['years'] = '%d лет назад';
$lang['months'] = '%d месяц(ев) назад';
$lang['weeks'] = '%d недель назад';
diff --git a/inc/lang/ru/norev.txt b/inc/lang/ru/norev.txt
index db36a0ddd..388d6149d 100644
--- a/inc/lang/ru/norev.txt
+++ b/inc/lang/ru/norev.txt
@@ -1,4 +1,4 @@
====== Такой версии не существует ======
-Указанная версия страницы не существует. Нажмите на кнопку ''История страницы'', чтобы получить список доступных предыдущих версий этого документа.
+Указанная версия страницы не существует. Нажмите на кнопку «История страницы», чтобы получить список доступных предыдущих версий этого документа.
diff --git a/inc/lang/ru/password.txt b/inc/lang/ru/password.txt
index af6a7d14d..91117ca56 100644
--- a/inc/lang/ru/password.txt
+++ b/inc/lang/ru/password.txt
@@ -1,9 +1,10 @@
-Здравствуйте, @FULLNAME@!
+Здравствуйте, @FULLNAME@.
Ваши данные для @TITLE@ (@DOKUWIKIURL@)
-Имя пользователя : @LOGIN@
-Пароль : @PASSWORD@
+Имя пользователя: @LOGIN@
+
+Пароль: @PASSWORD@
--
Это письмо было сгенерировано «ДокуВики» по адресу
diff --git a/inc/lang/ru/preview.txt b/inc/lang/ru/preview.txt
index 2bc383eb2..401827607 100644
--- a/inc/lang/ru/preview.txt
+++ b/inc/lang/ru/preview.txt
@@ -1,4 +1,4 @@
====== Просмотр ======
-Здесь показано, как ваш текст будет выглядеть. Внимание: текст ещё **не сохранён!**
+Здесь показано, как ваш текст будет выглядеть. Внимание: текст ещё **не сохранён.**
diff --git a/inc/lang/ru/pwconfirm.txt b/inc/lang/ru/pwconfirm.txt
index 3e2331269..9c27af752 100644
--- a/inc/lang/ru/pwconfirm.txt
+++ b/inc/lang/ru/pwconfirm.txt
@@ -1,4 +1,4 @@
-Здравствуйте, @FULLNAME@!
+Здравствуйте, @FULLNAME@.
Кто-то запросил новый пароль для входа в @TITLE@ по адресу @DOKUWIKIURL@
diff --git a/inc/lang/ru/revisions.txt b/inc/lang/ru/revisions.txt
index 06022323f..55072cd8a 100644
--- a/inc/lang/ru/revisions.txt
+++ b/inc/lang/ru/revisions.txt
@@ -1,3 +1,3 @@
====== История страницы ======
-Перед вами — история правок текущего документа. Чтобы вернуться к одной из предыдущих версий, выберите нужную, нажмите ''Править страницу'' и сохраните.
+Перед вами — история правок текущего документа. Чтобы вернуться к одной из предыдущих версий, выберите нужную, нажмите «Править страницу» и сохраните.
diff --git a/inc/lang/ru/searchpage.txt b/inc/lang/ru/searchpage.txt
index 608220495..04feb21cd 100644
--- a/inc/lang/ru/searchpage.txt
+++ b/inc/lang/ru/searchpage.txt
@@ -1,5 +1,5 @@
====== Поиск ======
-Перед вами результаты поиска. Если вы не нашли то, что искали, вы можете создать новую страницу с именем, совпадающим с запросом. Чтобы сделать это, просто нажмите на кнопку ''Создать страницу''.
+Перед вами результаты поиска. Если вы не нашли то, что искали, вы можете создать новую страницу с именем, совпадающим с запросом. Чтобы сделать это, просто нажмите на кнопку «Создать страницу».
===== Результаты ===== \ No newline at end of file
diff --git a/inc/lang/ru/showrev.txt b/inc/lang/ru/showrev.txt
index b3f3852eb..596815870 100644
--- a/inc/lang/ru/showrev.txt
+++ b/inc/lang/ru/showrev.txt
@@ -1,2 +1,2 @@
-**Это старая версия документа!**
+**Это старая версия документа.**
----
diff --git a/inc/lang/ru/subscr_digest.txt b/inc/lang/ru/subscr_digest.txt
index 3d1d35d30..41774a4e9 100644
--- a/inc/lang/ru/subscr_digest.txt
+++ b/inc/lang/ru/subscr_digest.txt
@@ -1,4 +1,4 @@
-Привет!
+Привет.
Страница @PAGE@ в вики @TITLE@ изменилась.
Список изменений:
diff --git a/inc/lang/ru/subscr_list.txt b/inc/lang/ru/subscr_list.txt
index 9d0eb10e0..41e1323bc 100644
--- a/inc/lang/ru/subscr_list.txt
+++ b/inc/lang/ru/subscr_list.txt
@@ -1,6 +1,6 @@
-Привет!
+Привет.
-Страницы в пространстве имен @PAGE@ в вики @TITLE@ были изменены.
+Страницы в пространстве имён @PAGE@ в вики @TITLE@ были изменены.
Список изменившихся страниц:
--------------------------------------------------------
@@ -10,7 +10,7 @@
Чтобы отписаться от уведомлений об изменениях, войдите в вики
@DOKUWIKIURL@ в раздел
@SUBSCRIBE@
-и отмените подписку на страницу и/или пространство имен.
+и отмените подписку на страницу и/или пространство имён.
--
Это письмо создано «ДокуВики» с сайта
diff --git a/inc/lang/ru/subscr_single.txt b/inc/lang/ru/subscr_single.txt
index ed8ead4cd..0e67d8f59 100644
--- a/inc/lang/ru/subscr_single.txt
+++ b/inc/lang/ru/subscr_single.txt
@@ -1,4 +1,5 @@
-Привет!
+Привет.
+
Страница @PAGE@ в вики @TITLE@ изменилась.
Список изменений:
@@ -7,8 +8,9 @@
@DIFF@
--------------------------------------------------------
-Дата : @DATE@
-Автор : @USER@
+Дата: @DATE@
+Автор: @USER@
+
Примечание: @SUMMARY@
Старая версия: @OLDPAGE@
Новая версия: @NEWPAGE@
@@ -16,7 +18,7 @@
Чтобы отписаться от уведомлений об изменениях, войдите в вики
@DOKUWIKIURL@ в раздел
@SUBSCRIBE@
-и отмените подписку на страницу и/или пространство имен.
+и отмените подписку на страницу и/или пространство имён.
--
Это письмо создано «ДокуВики» с сайта
diff --git a/inc/lang/sk/lang.php b/inc/lang/sk/lang.php
index dde10c543..4a2520abd 100644
--- a/inc/lang/sk/lang.php
+++ b/inc/lang/sk/lang.php
@@ -47,6 +47,7 @@ $lang['btn_draft'] = 'Upraviť koncept';
$lang['btn_recover'] = 'Obnoviť koncept';
$lang['btn_draftdel'] = 'Zmazať koncept';
$lang['btn_revert'] = 'Obnoviť';
+$lang['btn_register'] = 'Registrovať';
$lang['loggedinas'] = 'Prihlásený(á) ako';
$lang['user'] = 'Užívateľské meno';
$lang['pass'] = 'Heslo';
@@ -56,7 +57,6 @@ $lang['passchk'] = 'Ešte raz znovu';
$lang['remember'] = 'Zapamätaj si ma';
$lang['fullname'] = 'Celé meno';
$lang['email'] = 'E-Mail';
-$lang['register'] = 'Registrovať';
$lang['profile'] = 'Užívateľský profil';
$lang['badlogin'] = 'Zadané užívateľské meno a heslo nie je správne.';
$lang['minoredit'] = 'Menšie zmeny';
@@ -159,6 +159,9 @@ $lang['yours'] = 'Vaša verzia';
$lang['diff'] = 'Zobraziť rozdiely voči aktuálnej verzii';
$lang['diff2'] = 'Zobraziť rozdiely medzi vybranými verziami';
$lang['difflink'] = 'Odkaz na tento prehľad zmien';
+$lang['diff_type'] = 'Prehľad zmien:';
+$lang['diff_inline'] = 'Vnorený';
+$lang['diff_side'] = 'Vedľa seba';
$lang['line'] = 'Riadok';
$lang['breadcrumb'] = 'História';
$lang['youarehere'] = 'Nachádzate sa';
@@ -240,7 +243,7 @@ $lang['i_wikiname'] = 'Názov Wiki';
$lang['i_enableacl'] = 'Aktivovať ACL (doporučené)';
$lang['i_superuser'] = 'Správca';
$lang['i_problems'] = 'Inštalátor narazil na nižšie uvedené problémy. Nemôžete pokračovať, pokiaľ ich neodstránite.';
-$lang['i_modified'] = 'Z bezpečnostných dôvodov bude tento skript fungovať iba s novou, neupravenou inštaláciou Dokuwiki. Môžete buď znovu rozbaliť stiahnutý inštalačný balíček alebo preštudovať <a href="http://dokuwiki.org/install"> inštalačné inštrukcie Dokuwiki</a>';
+$lang['i_modified'] = 'Z bezpečnostných dôvodov bude tento skript fungovať iba s novou, neupravenou inštaláciou Dokuwiki. Môžete buď znovu rozbaliť stiahnutý inštalačný balík alebo preštudovať <a href="http://dokuwiki.org/install"> inštalačné inštrukcie Dokuwiki</a>';
$lang['i_funcna'] = 'PHP funkcia <code>%s</code> nie je dostupná. Je možné, že ju z určitých dôvodov zablokoval váš poskytovateľ webhostingu?';
$lang['i_phpver'] = 'Vaša verzia PHP <code>%s</code> je nižšia ako požadovaná <code>%s</code>. Potrebujete aktualizovať Vašu inštaláciu PHP.';
$lang['i_permfail'] = '<code>%s</code> nie je zapisovateľný pre DokuWiki. Musíte zmeniť prístupové práva pre tento adresár!';
diff --git a/inc/lang/sl/admin.txt b/inc/lang/sl/admin.txt
new file mode 100644
index 000000000..cee19deff
--- /dev/null
+++ b/inc/lang/sl/admin.txt
@@ -0,0 +1,3 @@
+===== Skrbništvo =====
+
+Navedene možnosti omogočajo skrbniško prilagajanje nastavitev sistema DokuWiki.
diff --git a/inc/lang/sl/adminplugins.txt b/inc/lang/sl/adminplugins.txt
new file mode 100644
index 000000000..899c854fc
--- /dev/null
+++ b/inc/lang/sl/adminplugins.txt
@@ -0,0 +1 @@
+===== Dodatni vstavki ===== \ No newline at end of file
diff --git a/inc/lang/sl/backlinks.txt b/inc/lang/sl/backlinks.txt
index e637199c0..5e4d8ffa7 100644
--- a/inc/lang/sl/backlinks.txt
+++ b/inc/lang/sl/backlinks.txt
@@ -1,4 +1,3 @@
-====== Kaj je povezano sem ======
-
-To je seznam strani, ki so povezane na trenutno stran. Opomba: CamelCase povezave niso zaznane kot take povezave.
+====== Povratne povezave ======
+Spodaj je naveden seznam strani, ki so povezane na trenutno stran. EnoBesedne povezave niso zaznane kot povratne povezave.
diff --git a/inc/lang/sl/conflict.txt b/inc/lang/sl/conflict.txt
index 7ada08b5f..ec5b37016 100644
--- a/inc/lang/sl/conflict.txt
+++ b/inc/lang/sl/conflict.txt
@@ -1,6 +1,5 @@
-====== Obstaja novejša različica ======
+====== Obstaja novejša različica dokumenta ======
-Obstaja novejša različica dokumenta, ki ga urejate. Do tega pride, ko kak drugi uporabnik spremeni dokument med vašim urejanjem.
-
-Temeljito preglejte spodaj prikazane razlike in se potem odločite, katero verzijo želite obdržati. Če izberete ''shrani'', bo shranjena vaša različica. Pritisnite ''prekliči'', če želite ohraniti trenutno različico.
+Obstaja novejša različica dokumenta, ki ga trenutno urejate. Do zapleta pride, ko drug uporabnik spremeni dokument med vašim urejanjem in ga pred vami shrani.
+Temeljito preglejte spodaj izpisane razlike med dokumentoma in izberite različico, ki jo želite ohraniti. V kolikor je izbrana možnost ''shrani'', bo shranjena vaša zadnja različica. Z izbiro možnosti ''prekliči'', pa bo ohranjena trenutno shranjena različica.
diff --git a/inc/lang/sl/denied.txt b/inc/lang/sl/denied.txt
index 96c03a569..5b5fd4d3a 100644
--- a/inc/lang/sl/denied.txt
+++ b/inc/lang/sl/denied.txt
@@ -1,4 +1,3 @@
-====== Nimate dovoljenja ======
-
-Oprostite, za nadaljevanje nimati dovolj dovoljenj. Mogoče ste se pozabili prijaviti?
+====== Ni ustreznih dovoljenj ======
+Za nadaljevanje opravila je treba imeti ustrezna dovoljenja. Ali ste se morda pozabili prijaviti?
diff --git a/inc/lang/sl/diff.txt b/inc/lang/sl/diff.txt
index f98f7e5ce..5cb2e3a12 100644
--- a/inc/lang/sl/diff.txt
+++ b/inc/lang/sl/diff.txt
@@ -1,4 +1,3 @@
-====== Primerjaj izbrane različice ======
-
-Prikazana je razlika med izbrano in trenutno različico te strani.
+====== Primerjava izbranih različic ======
+Prikazane so razlike med izbrano in trenutno različico strani.
diff --git a/inc/lang/sl/draft.txt b/inc/lang/sl/draft.txt
new file mode 100644
index 000000000..b3fe4de35
--- /dev/null
+++ b/inc/lang/sl/draft.txt
@@ -0,0 +1,5 @@
+===== Zaznan je shranjen osnutek strani =====
+
+Zadnja seja te strani ni bila pravilno zaključena. Sistem DokuWiki je samodejno shranil osnutek strani, ki ga je mogoče naprej urejati. Spodaj so navedeni podatki samodejnega shranjevanja zadnje seje.
+
+Vsebino osnutka je mogoče //obnoviti// na zadnjo sejo, //izbrisati// samodejno shranjen osnutek ali pa //prekiniti// urejanje. \ No newline at end of file
diff --git a/inc/lang/sl/edit.txt b/inc/lang/sl/edit.txt
index 180a97ade..71d5fb02f 100644
--- a/inc/lang/sl/edit.txt
+++ b/inc/lang/sl/edit.txt
@@ -1,2 +1 @@
-Uredite stran in pritisnite ''Shrani''. Glej [[wiki:syntax]] za navodila za urejanje. Prosimo vas, da stran spremenite le, če jo nameravate **izboljšati**. Če hočete preizkusiti kakšno zadevo, se poigrajte v [[playground:playground|peskovniku]].
-
+Po koncu urejanja strani, je stran treba ''shraniti''. Navodila in podrobnosti za urejanje je mogoče najti na strani [[wiki:syntax|skladnje]]. Možnosti urejanja in pravila skladnje je mogoče varno preizkusiti v [[playground:playground|peskovniku]].
diff --git a/inc/lang/sl/editrev.txt b/inc/lang/sl/editrev.txt
index cf2b4ec7b..baaacd270 100644
--- a/inc/lang/sl/editrev.txt
+++ b/inc/lang/sl/editrev.txt
@@ -1,2 +1,2 @@
-**Naložili ste staro različico dokumenta!** Če jo shranite, boste ustvarili novo različico s to vsebino.
+**Naložena je stara različica dokumenta!** V kolikor staro različico shranite, bo shranjena kot najnovejša različica.
---- \ No newline at end of file
diff --git a/inc/lang/sl/index.txt b/inc/lang/sl/index.txt
index 89dd05fbe..dd54d2bed 100644
--- a/inc/lang/sl/index.txt
+++ b/inc/lang/sl/index.txt
@@ -1,4 +1,4 @@
====== Kazalo ======
-To je kazalo vseh strani, ki so na voljo, urejenimi po [[doku>namespaces|imenskih prostorih]].
+Na spodnjem seznamu so izpisane vse wiki strani, ki so na voljo, razvrščene pa so po posameznih [[doku>namespaces|imenskih prostorih]].
diff --git a/inc/lang/sl/install.html b/inc/lang/sl/install.html
new file mode 100644
index 000000000..6fb6bead3
--- /dev/null
+++ b/inc/lang/sl/install.html
@@ -0,0 +1,20 @@
+<p>Stran je namenjena pomoči pri prvi namestitvi in nastavitvi spletišča
+<a href="http://dokuwiki.org">Dokuwiki</a>. Več podrobnosti o tem je mogoče najti na straneh dokumentacije
+<a href="http://dokuwiki.org/installer">namestitve</a>.</p>
+
+<p>Sistem DokuWiki uporablja običajne besedilne datoteke za shranjevanje
+wiki strani in drugih podrobnosti o teh straneh (npr. slike, kazalo, stare
+različice in drugo). Za pravilno delovanje <strong>mora</strong> imeti sistem DokuWiki prost
+dostop do map in datotek, zato je ključno, da so dovoljenja določena pravilno.
+Z namestilnikom ni mogoče spreminjanje dovoljenj map. To je običajno najlažje
+narediti v ukazni lupini ali pa, če spletišče Wiki gostuje na zunanjih
+strežnikih, preko nadzornika FTP povezave (npr. cPanel).</p>
+
+<p>Z namestilnikom lahko spremenite nastavitve dostopa sistema Dokuwiki
+<acronym title="access control list">ACL</acronym>, ki omogoča skrbniško prijavo in dostop do upravljanja z vstavki,
+uporabniki, dovoljenji dostopa uporabnikov do določenih strani in do nekaterih
+nastavitev. Za delovanje sistema ACL ni bistven, vendar pa močno vpliva na
+enostavnost upravljanja strani in nastavitev.</p>
+
+<p>Zahtevnejši uporabniki ali skrbniki s posebnimi zahtevami namestitve sistema
+si lahko več podrobnosti ogledajo na straneh <a href="http://dokuwiki.org/install">navodil namestitve</a> in <a href="http://dokuwiki.org/config">nastavitve</a>.</p> \ No newline at end of file
diff --git a/inc/lang/sl/lang.php b/inc/lang/sl/lang.php
index 9d94bab49..0e6c0a706 100644
--- a/inc/lang/sl/lang.php
+++ b/inc/lang/sl/lang.php
@@ -1,146 +1,209 @@
<?php
/**
- * slovenian language file
+ * Slovenian language file
*
- * @license GPL 2 (http://www.gnu.org/licenses/gpl.html)
+ * @license GPL 2 (http://www.gnu.org/licenses/gpl.html)
* @author Jaka Kranjc <lynxlupodian@hotmail.com>
* @author Boštjan Seničar <senicar@gmail.com>
* @author Dejan Levec <webphp@gmail.com>
+ * @author Gregor Skumavc (grega.skumavc@gmail.com)
+ * @author Matej Urbančič (mateju@svn.gnome.org)
*/
$lang['encoding'] = 'utf-8';
+$lang['direction'] = 'ltr';
$lang['doublequoteopening'] = '„';
$lang['doublequoteclosing'] = '“';
$lang['singlequoteopening'] = '‚';
$lang['singlequoteclosing'] = '‘';
$lang['apostrophe'] = '’';
-$lang['btn_edit'] = 'Uredi to stran';
-$lang['btn_source'] = 'Prikaži izvorno kodo strani';
-$lang['btn_show'] = 'Prikaži stran';
-$lang['btn_create'] = 'Ustvari to stran';
-$lang['btn_search'] = 'Išči';
+$lang['btn_edit'] = 'Uredi stran';
+$lang['btn_source'] = 'Pokaži izvorno kodo strani';
+$lang['btn_show'] = 'Pokaži stran';
+$lang['btn_create'] = 'Ustvari stran';
+$lang['btn_search'] = 'Poišči';
$lang['btn_save'] = 'Shrani';
$lang['btn_preview'] = 'Predogled';
$lang['btn_top'] = 'Nazaj na vrh';
$lang['btn_newer'] = '<< novejši';
$lang['btn_older'] = 'starejši >>';
$lang['btn_revs'] = 'Stare različice';
-$lang['btn_recent'] = 'Novosti';
+$lang['btn_recent'] = 'Nedavne spremembe';
$lang['btn_upload'] = 'Pošlji';
$lang['btn_cancel'] = 'Prekliči';
$lang['btn_index'] = 'Kazalo';
$lang['btn_secedit'] = 'Uredi';
$lang['btn_login'] = 'Prijava';
$lang['btn_logout'] = 'Odjava';
-$lang['btn_admin'] = 'Administrator';
+$lang['btn_admin'] = 'Skrbništvo';
$lang['btn_update'] = 'Posodobi';
$lang['btn_delete'] = 'Izbriši';
$lang['btn_back'] = 'Nazaj';
+$lang['btn_backlink'] = 'Povratne povezave';
+$lang['btn_backtomedia'] = 'Nazaj na izbiro predstavnih datotek';
+$lang['btn_subscribe'] = 'Urejanje naročnin';
$lang['btn_profile'] = 'Posodobi profil';
$lang['btn_reset'] = 'Ponastavi';
$lang['btn_resendpwd'] = 'Pošlji novo geslo';
$lang['btn_draft'] = 'Uredi osnutek';
$lang['btn_recover'] = 'Obnovi osnutek';
$lang['btn_draftdel'] = 'Izbriši osnutek';
-$lang['loggedinas'] = 'Prijavljen kot';
+$lang['btn_revert'] = 'Povrni';
+$lang['loggedinas'] = 'Prijava kot';
$lang['user'] = 'Uporabniško ime';
$lang['pass'] = 'Geslo';
$lang['newpass'] = 'Novo geslo';
$lang['oldpass'] = 'Potrdi trenutno geslo';
-$lang['passchk'] = 'ponovno';
+$lang['passchk'] = 'Ponovi novo geslo';
$lang['remember'] = 'Zapomni si me';
$lang['fullname'] = 'Pravo ime';
-$lang['email'] = 'Elektronska pošta';
-$lang['register'] = 'Odpri nov račun';
-$lang['profile'] = 'Profil uporabnika';
-$lang['badlogin'] = 'Oprostite, uporabniško ime ali geslo ni pravo.';
+$lang['email'] = 'Elektronski naslov';
+$lang['register'] = 'Vpis računa';
+$lang['profile'] = 'Uporabniški profil';
+$lang['badlogin'] = 'Uporabniško ime ali geslo je napačno.';
$lang['minoredit'] = 'Manjše spremembe';
-$lang['draftdate'] = 'Samodejno shranjevanje osnutka vključeno';
-$lang['regmissing'] = 'Oprostite, zapolniti morate vsa polja.';
-$lang['reguexists'] = 'Oprostite, uporabnik s tem imenom že obstaja.';
-$lang['regsuccess'] = 'Uporabnik je bil ustvarjen. Geslo je bilo poslano na vaš elektronski naslov.';
-$lang['regsuccess2'] = 'Uporabnik je bil ustvarjen.';
-$lang['regmailfail'] = 'Zgleda, da je prišlo do napake pri pošiljanju gesla. Prosimo da stopite v stik z administratorjem!';
-$lang['regbadmail'] = 'Podan elektronski naslov izgleda neveljaven - če mislite da je to napaka, stopite v stik z administratorjem.';
-$lang['regbadpass'] = 'Gesli nista enaki.';
-$lang['regpwmail'] = 'Vaše geslo za DokuWiki';
-$lang['reghere'] = 'Nimate še računa? Priskrbite si ga';
-$lang['profnochange'] = 'Brez sprememb, ničesar za storiti.';
-$lang['profchanged'] = 'Uporabniški profil uspešno posodobljen';
-$lang['pwdforget'] = 'Pozabili geslo? Pridobite novega';
+$lang['draftdate'] = 'Samodejno shranjevanje osnutka je omogočeno';
+$lang['nosecedit'] = 'Stran je bila v vmesnem času spremenjena. Podatki strani so bili zastareli, zato se je celotna vsebina naložila znova.';
+$lang['regmissing'] = 'Izpolniti je treba vsa polja.';
+$lang['reguexists'] = 'Uporabnik s tem imenom že obstaja.';
+$lang['regsuccess'] = 'Uporabniški račun je uspešno ustvarjen. Geslo je bilo poslano na naveden elektronski naslov.';
+$lang['regsuccess2'] = 'Uporabniški račun je uspešno ustvarjen.';
+$lang['regmailfail'] = 'Videti je, da je prišlo do napake med pošiljanjem gesla. Stopite v stik s skrbnikom sistema!';
+$lang['regbadmail'] = 'Videti je, da je naveden elektronski naslov neveljaven - v kolikor je to napaka, stopite v stik s skrbnikom sistema.';
+$lang['regbadpass'] = 'Gesli nista enaki. Poskusite znova.';
+$lang['regpwmail'] = 'Geslo za DokuWiki';
+$lang['reghere'] = 'Nimate še računa? Vpišite se za nov račun.';
+$lang['profna'] = 'Wiki ne podpira spreminjanja profila.';
+$lang['profnochange'] = 'Brez sprememb.';
+$lang['profnoempty'] = 'Prazno polje elektronskega naslova ali imena ni dovoljeno.';
+$lang['profchanged'] = 'Uporabniški profil je uspešno posodobljen.';
+$lang['pwdforget'] = 'Ali ste pozabili geslo? Pridobite si novo geslo.';
+$lang['resendna'] = 'Wiki ne podpira možnosti ponovnega pošiljanja gesel.';
$lang['resendpwd'] = 'Pošlji novo geslo za';
-$lang['resendpwdmissing'] = 'Se opravičujemo, vendar morate izpolniti vsa polja.';
-$lang['resendpwdnouser'] = 'Se opravičujemo, vendar tega uporabniškega imena ni v bazi.';
-$lang['resendpwdconfirm'] = 'Potrditvena povezava je bila poslana na vaš elektronski naslov';
-$lang['resendpwdsuccess'] = 'Vaše novo geslo je bilo poslano na vaš elektronski naslov';
+$lang['resendpwdmissing'] = 'Izpolniti je treba vsa polja.';
+$lang['resendpwdnouser'] = 'Podanega uporabniškega imena v podatkovni zbirki ni mogoče najti.';
+$lang['resendpwdbadauth'] = 'Koda za overitev ni prava. Prepričajte se, da ste uporabili celotno povezavo za potrditev.';
+$lang['resendpwdconfirm'] = 'Povezava za potrditev računa je bila poslana na elektronski naslov.';
+$lang['resendpwdsuccess'] = 'Novo geslo je bilo poslano na elektronski naslov.';
+$lang['license'] = 'V kolikor ni posebej določeno, je vsebina Wiki strani objavljena pod pogoji dovoljenja:';
+$lang['licenseok'] = 'Opomba: z urejanjem vsebine strani, se strinjate z objavo pod pogoji dovoljenja:';
+$lang['searchmedia'] = 'Poišči ime datoteke:';
+$lang['searchmedia_in'] = 'Poišči v %s';
$lang['txt_upload'] = 'Izberite datoteko za pošiljanje';
-$lang['txt_filename'] = 'Vnesite wikiname (neobvezno)';
+$lang['txt_filename'] = 'Pošlji z imenom (izborno)';
$lang['txt_overwrt'] = 'Prepiši obstoječo datoteko';
-$lang['lockedby'] = 'Trenutno zaklenjeno od';
-$lang['lockexpire'] = 'Zaklep preteče';
-$lang['willexpire'] = 'Vaš zaklep za urejevanje bo pretekel čez eno minuto.\nDa se izognete konfliktom, uporabite predogled, da se merilnik časa za zaklep ponastavi.';
-$lang['js']['notsavedyet'] = "Obstajajo neshranjene spremembe, ki bodo izgubljene.\nRes želite nadaljevati?";
-$lang['rssfailed'] = 'Prišlo je do napake pri prenašanju tega dovoda: ';
-$lang['nothingfound'] = 'Nič ni bilo najdeno.';
-$lang['mediaselect'] = 'Mediafile Izbira';
-$lang['fileupload'] = 'Mediafile Pošiljanje';
-$lang['uploadsucc'] = 'Pošiljanje uspelo';
-$lang['uploadfail'] = 'Pošiljanje je spodletelo. Mogoče nimate dovoljenj?';
-$lang['uploadwrong'] = 'Pošiljanje zavrnjeno. Ta datotečna končnica je prepovedana';
-$lang['uploadexist'] = 'Dokument že obstaja. Brez sprememb.';
-$lang['uploadxss'] = 'Prenos je bil zaustavljen zaradi možne zlonamerne vsebine.';
-$lang['uploadsize'] = 'Prenesen dokument je prevelik. (max. %s)';
-$lang['deletesucc'] = 'Datoteka "%s" je bila izbrisana.';
-$lang['mediainuse'] = 'Dokument "%s" ni bil izbrisan - je še vedno v uporabi.';
-$lang['namespaces'] = 'Imenski prostori';
-$lang['mediafiles'] = 'Datoteke ki so na voljo v';
+$lang['lockedby'] = 'Trenutno je zaklenjeno s strani';
+$lang['lockexpire'] = 'Zaklep preteče ob';
+$lang['willexpire'] = 'Zaklep za urejevanje bo pretekel čez eno minuto.\nV izogib sporom, uporabite predogled, da se merilnik časa za zaklep ponastavi.';
+$lang['js']['notsavedyet'] = 'Neshranjene spremembe bodo izgubljene.';
+$lang['js']['searchmedia'] = 'Poišči datoteke';
+$lang['js']['keepopen'] = 'Od izbiri ohrani okno odprto';
$lang['js']['hidedetails'] = 'Skrij podrobnosti';
-$lang['js']['nosmblinks'] = 'Povezovanje do Windows deljenih datotek deluje samo v Microsoft Internet Explorer-ju.
-Še vedno pa lahko ročno kopirate povezavo.';
-$lang['js']['mu_btn'] = 'Prenesite več dokumentov naenkrat.';
-$lang['mediaview'] = 'Poglej originalno datoteko';
-$lang['hits'] = 'Zadetkov';
-$lang['quickhits'] = 'Ujemanja v imenih strani';
+$lang['js']['mediatitle'] = 'Nastavitve povezave';
+$lang['js']['mediadisplay'] = 'Vrsta povezave';
+$lang['js']['mediaalign'] = 'Poravnava';
+$lang['js']['mediasize'] = 'Velikost slike';
+$lang['js']['mediatarget'] = 'Mesto povezave';
+$lang['js']['mediaclose'] = 'Zapri';
+$lang['js']['mediainsert'] = 'Vstavi';
+$lang['js']['mediadisplayimg'] = 'Pokaži sliko.';
+$lang['js']['mediadisplaylnk'] = 'Pokaži le povezavo.';
+$lang['js']['mediasmall'] = 'Majhna različica';
+$lang['js']['mediamedium'] = 'Srednja različica';
+$lang['js']['medialarge'] = 'Velika različica';
+$lang['js']['mediaoriginal'] = 'Izvorna različica';
+$lang['js']['medialnk'] = 'Povezava na strani podrobnosti';
+$lang['js']['mediadirect'] = 'Neposredna povezava do izvorne različice';
+$lang['js']['medianolnk'] = 'Brez povezave';
+$lang['js']['medianolink'] = 'Ne poveži s sliko';
+$lang['js']['medialeft'] = 'Poravnaj sliko na levo.';
+$lang['js']['mediaright'] = 'Poravnaj sliko na desno.';
+$lang['js']['mediacenter'] = 'Poravnaj sliko na sredini.';
+$lang['js']['medianoalign'] = 'Ne uporabi poravnave.';
+$lang['js']['nosmblinks'] = 'Povezovanje do souporabnih datotek sistema Windows deluje le pri uporabi brskalnika Microsoft Internet Explorer. Povezavo je mogoče kopirati ročno.';
+$lang['js']['linkwiz'] = 'Čarovnik za povezave';
+$lang['js']['linkto'] = 'Poveži na:';
+$lang['js']['del_confirm'] = 'Ali naj se res izbrišejo izbrani predmeti?';
+$lang['js']['mu_btn'] = 'Pošiljanje več dokumentov hkrati.';
+$lang['rssfailed'] = 'Prišlo je do napake med pridobivanjem vira: ';
+$lang['nothingfound'] = 'Ni najdenih predmetov.';
+$lang['mediaselect'] = 'Predstavne datoteke';
+$lang['fileupload'] = 'Pošiljanje predstavnih datotek';
+$lang['uploadsucc'] = 'Pošiljanje je bilo uspešno končano.';
+$lang['uploadfail'] = 'Pošiljanje je spodletelo. Morda so uporabljena neustrezna dovoljenja.';
+$lang['uploadwrong'] = 'Pošiljanje je zavrnjeno. Uporabljena pripona datoteke je prepovedana.';
+$lang['uploadexist'] = 'Datoteka že obstaja. Ni sprememb.';
+$lang['uploadbadcontent'] = 'Poslana datoteka se ne sklada s pripono (%s) datoteke.';
+$lang['uploadspam'] = 'Pošiljanje je bilo ustavljeno na podlagi zapisa na črnem seznamu neželenih datotek.';
+$lang['uploadxss'] = 'Pošiljanje je zaustavljeno zaradi morebitne zlonamerne vsebine.';
+$lang['uploadsize'] = 'poslana datoteka prevelika (največja dovoljena velikost je %s).';
+$lang['deletesucc'] = 'Datoteka "%s" je izbrisana.';
+$lang['deletefail'] = 'Datoteke "%s" ni mogoče izbrisati - preverite uporabniška dovoljenja.';
+$lang['mediainuse'] = 'Datoteka "%s" ni izbrisana - datoteka je še vedno v uporabi.';
+$lang['namespaces'] = 'Imenski prostori';
+$lang['mediafiles'] = 'Datoteke, ki so na voljo v';
+$lang['accessdenied'] = 'Za ogled te strani so zahtevana posebna dovoljenja.';
+$lang['mediausage'] = 'Za navajanje datoteke je treba uporabiti navedeno skladnjo:';
+$lang['mediaview'] = 'Pogled izvorne datoteke';
+$lang['mediaroot'] = 'koren';
+$lang['mediaupload'] = 'Pošiljanje datoteke v trenutni imenski prostor. Za ustvarjanje novih imenskih prostorov, jih pripnite k imenu datoteke navedene pri vnosnem polju "Naloži kot" in jih ločite z dvopičjem.';
+$lang['mediaextchange'] = 'Pripona datoteke je spremenjena iz .%s v .%s!';
+$lang['reference'] = 'Sklic za';
+$lang['ref_inuse'] = 'Datoteke ni mogoče izbrisati, saj je še vedno povezana s stranmi:';
+$lang['ref_hidden'] = 'Nekaj sklicev je navedenih na straneh, do katerih s trenutnimi dovoljenji ni mogoč dostop.';
+$lang['hits'] = 'Zadetki';
+$lang['quickhits'] = 'Ujemanje imen strani';
$lang['toc'] = 'Kazalo';
-$lang['current'] = 'trenutna';
+$lang['current'] = 'Trenutna';
$lang['yours'] = 'Vaša različica';
-$lang['diff'] = 'prikaži razlike s trenutno različico';
+$lang['diff'] = 'Pokaži razlike s trenutno različico';
+$lang['diff2'] = 'Pokaži razlike med izbranimi različicami.';
+$lang['difflink'] = 'Poveži s tem pogledom primerjave.';
$lang['line'] = 'Vrstica';
$lang['breadcrumb'] = 'Sled';
-$lang['youarehere'] = 'Tukaj ste';
-$lang['lastmod'] = 'Zadnjič spremenil/a';
-$lang['by'] = 'od';
+$lang['youarehere'] = 'Trenutno dejavna stran';
+$lang['lastmod'] = 'Zadnja sprememba';
+$lang['by'] = 'uporabnika';
$lang['deleted'] = 'odstranjena';
$lang['created'] = 'ustvarjena';
-$lang['restored'] = 'stara različica povrnjena';
+$lang['restored'] = 'povrnjena stara različica';
+$lang['external_edit'] = 'urejanje v zunanjem urejevalniku';
$lang['summary'] = 'Povzetek urejanja';
-$lang['noflash'] = 'Za prikaz vsebine potrebujete <a href="http://www.adobe.com/products/flashplayer/">Adobe Flash Plugin</a>';
+$lang['noflash'] = 'Za prikaz vsebine je treba namestiti <a href="http://www.adobe.com/products/flashplayer/">Adobe Flash Plugin</a>';
+$lang['download'] = 'Naloži izrezek';
$lang['mail_newpage'] = '[DokuWiki] stran dodana:';
$lang['mail_changed'] = '[DokuWiki] stran spremenjena:';
-$lang['mail_new_user'] = 'nov uporabnik.';
+$lang['mail_subscribe_list'] = 'strani s spremenjenim imenom:';
+$lang['mail_new_user'] = 'nov uporabnik:';
$lang['mail_upload'] = 'naložena datoteka:';
-$lang['qb_bold'] = 'Krepki tisk';
-$lang['qb_italic'] = 'Ležeči tisk';
+$lang['qb_bold'] = 'Krepko besedilo';
+$lang['qb_italic'] = 'Ležeče besedilo';
$lang['qb_underl'] = 'Podčrtano besedilo';
-$lang['qb_code'] = 'Koda';
+$lang['qb_code'] = 'Oznaka kode';
$lang['qb_strike'] = 'Prečrtano besedilo';
-$lang['qb_h1'] = 'Naslov prve stopnje';
-$lang['qb_h2'] = 'Naslov drugee stopnje';
-$lang['qb_h3'] = 'Naslov tretje stopnje';
-$lang['qb_h4'] = 'Naslov četrte stopnje';
-$lang['qb_h5'] = 'Naslov pete stopnje';
+$lang['qb_h1'] = 'Naslov prve ravni';
+$lang['qb_h2'] = 'Naslov druge ravni';
+$lang['qb_h3'] = 'Naslov tretje ravni';
+$lang['qb_h4'] = 'Naslov četrte ravni';
+$lang['qb_h5'] = 'Naslov pete ravni';
+$lang['qb_h'] = 'Naslov';
+$lang['qb_hs'] = 'Izberi naslov';
+$lang['qb_hplus'] = 'Naslov na višji ravni';
+$lang['qb_hminus'] = 'Naslov na nižji ravni';
+$lang['qb_hequal'] = 'Naslov na isti ravni';
$lang['qb_link'] = 'Notranja povezava';
$lang['qb_extlink'] = 'Zunanja povezava';
$lang['qb_hr'] = 'Vodoravna črta';
-$lang['qb_ol'] = 'Element urejenega seznama';
-$lang['qb_ul'] = 'Element neurejenega seznama';
-$lang['qb_media'] = 'Dodaj slike in druge datoteke';
+$lang['qb_ol'] = 'Številčna oznaka predmeta';
+$lang['qb_ul'] = 'Vrstična oznaka predmeta';
+$lang['qb_media'] = 'Dodajanje slik in drugih datotek';
$lang['qb_sig'] = 'Vstavi podpis';
$lang['qb_smileys'] = 'Smeški';
$lang['qb_chars'] = 'Posebni znaki';
+$lang['upperns'] = 'skoči na nadrejeni imenski prostor';
$lang['admin_register'] = 'Dodaj novega uporabnika';
-$lang['metaedit'] = 'Popravi metapodatke';
-$lang['metasaveerr'] = 'Zapisovanje metapodatkov ni uspelo';
-$lang['metasaveok'] = 'Meta podatki shranjeni';
+$lang['metaedit'] = 'Uredi metapodatke';
+$lang['metasaveerr'] = 'Zapisovanje metapodatkov je spodletelo';
+$lang['metasaveok'] = 'Metapodatki so shranjeni';
$lang['img_backto'] = 'Nazaj na';
$lang['img_title'] = 'Naslov';
$lang['img_caption'] = 'Opis';
@@ -148,15 +211,71 @@ $lang['img_date'] = 'Datum';
$lang['img_fname'] = 'Ime datoteke';
$lang['img_fsize'] = 'Velikost';
$lang['img_artist'] = 'Fotograf';
-$lang['img_format'] = 'Velikost';
+$lang['img_copyr'] = 'Avtorska pravica';
+$lang['img_format'] = 'Zapis';
$lang['img_camera'] = 'Fotoaparat';
$lang['img_keywords'] = 'Ključne besede';
+$lang['subscr_subscribe_success'] = 'Uporabniški račun %s je dodan na seznam naročnin na %s';
+$lang['subscr_subscribe_error'] = 'Napaka med dodajanjem %s na seznam naročnin na %s';
+$lang['subscr_subscribe_noaddress'] = 'S trenutnimi prijavnimi podatki ni povezanega elektronskega naslova, zato uporabniškega računa ni mogoče dodati na seznam naročnikov.';
+$lang['subscr_unsubscribe_success'] = 'Uporabniški račun %s je odstranjen s seznama naročnin na %s';
+$lang['subscr_unsubscribe_error'] = 'Napaka med odstranjevanjem %s s seznama naročnin na %s';
+$lang['subscr_already_subscribed'] = '%s je že naročen na %s';
+$lang['subscr_not_subscribed'] = '%s ni naročen na %s';
+$lang['subscr_m_not_subscribed'] = 'Trenutni uporabniški račun nima prijavljene naročnine na trenutno stran ali imenski prostor.';
+$lang['subscr_m_new_header'] = 'Naročanje';
+$lang['subscr_m_current_header'] = 'Trenutne naročnine';
+$lang['subscr_m_unsubscribe'] = 'Prekliči naročnino';
+$lang['subscr_m_subscribe'] = 'Prijavi naročnino';
+$lang['subscr_m_receive'] = 'Prejmi';
+$lang['subscr_style_every'] = 'elektronsko sporočilo ob vsaki spremembi';
+$lang['subscr_style_digest'] = 'strnjeno elektronsko sporočilo sprememb za vsako stran (vsakih %.2f dni)';
+$lang['subscr_style_list'] = 'seznam spremenjenih strani od zadnjega elektronskega sporočila (vsakih %.2f dni)';
+$lang['authmodfailed'] = 'Slaba nastavitev overitve uporabniškega računa. Stopite v stik s skrbnikom sistema wiki.';
+$lang['authtempfail'] = 'Potrditev uporabnika je trenutno nedostopna. Stopite v stik s skrbnikom sistema wiki.';
$lang['i_chooselang'] = 'Izberite jezik';
$lang['i_installer'] = 'DokuWiki namestitev';
-$lang['i_wikiname'] = 'Wiki ime';
+$lang['i_wikiname'] = 'Ime Wiki spletišča';
$lang['i_enableacl'] = 'Omogoči ACL (priporočeno)';
-$lang['i_superuser'] = 'Naduporabnik';
-$lang['i_confexists'] = '<code>%s</code> že obstaja';
+$lang['i_superuser'] = 'Skrbnik';
+$lang['i_problems'] = 'Namestilnik je naletel na težave, ki so izpisane spodaj. Namestitve ni mogoče nadaljevati, dokler težave ne bodo odpravljene.';
+$lang['i_modified'] = 'Iz varnostnih razlogov skript deluje le v novi in neprilagojeni namestitvi sistema DokuWiki. Postopek namestitve je treba začeti znova ali pa sistem namestiti ročno s pomočjo <a href="http://dokuwiki.org/install">navodil nameščanja Dokuwiki</a>.';
+$lang['i_funcna'] = 'Funkcija PHP <code>%s</code> ni na voljo. Morda je možnost na strežniku zaradi varnostnih razlogov onemogočena.';
+$lang['i_phpver'] = 'Različica PHP <code>%s</code> je nižja od zahtevane različice <code>%s</code>. Pred nadaljevanjem je treba posodobiti namestitev PHP.';
+$lang['i_permfail'] = 'Predmet <code>%s</code> ni zapisljiv. Zahtevana je sprememba dovoljenj za to mapo.';
+$lang['i_confexists'] = 'Predmet <code>%s</code> že obstaja.';
+$lang['i_writeerr'] = 'Ni mogoče ustvariti predmeta <code>%s</code>. Preveriti je treba dovoljenja datotek in map in nato ustvariti datoteko ročno.';
+$lang['i_badhash'] = 'nepoznana ali spremenjena datoteka dokuwiki.php (razpršilo=<code>%s</code>)';
+$lang['i_badval'] = '<code>%s</code> - neveljavna ali prazna vrednost';
+$lang['i_success'] = 'Nastavitev je uspešno končana. Datoteko install.php lahko sedaj izbrišete. Nadaljujte v <a href="doku.php">novi DokuWiki</a>.';
+$lang['i_failure'] = 'Med zapisovanjem nastavitvenih datotek je prišlo do napak. Preden lahko uporabite vaš <a href="doku.php">DokuWiki</a>, jih je treba odpraviti.';
+$lang['i_policy'] = 'Začetna določila ACL';
+$lang['i_pol0'] = 'Odprt Wiki (branje, zapis, nalaganje datotek je javno za vse)';
+$lang['i_pol1'] = 'Javni Wiki (branje za vse, zapis in nalaganje datotek za prijavljene uporabnike)';
+$lang['i_pol2'] = 'Zaprt Wiki (berejo in urejajo lahko le prijavljeni uporabniki)';
+$lang['i_retry'] = 'Ponovni poskus';
+$lang['i_license'] = 'Izbor dovoljenja objave vsebine:';
+$lang['mu_intro'] = 'Naložiti je mogoče več datotek hkrati. S klikom na gumb "Prebrskaj", jih je mogoče dodati v vrsto. S klikom na povezavo "naloži" bodo datoteke poslane na strežnik.';
+$lang['mu_gridname'] = 'Ime datoteke';
$lang['mu_gridsize'] = 'Velikost';
+$lang['mu_gridstat'] = 'Stanje';
+$lang['mu_namespace'] = 'Imenski prostor';
+$lang['mu_browse'] = 'Prebrskaj';
+$lang['mu_toobig'] = 'prevelika datoteka';
+$lang['mu_ready'] = 'pripravljena na pošiljanje';
$lang['mu_done'] = 'končano';
-$lang['mu_filetypes'] = 'Dovoljeni tipi datotek';
+$lang['mu_fail'] = 'ni uspelo';
+$lang['mu_authfail'] = 'seja je potekla';
+$lang['mu_progress'] = '@PCT@% je poslano';
+$lang['mu_filetypes'] = 'Dovoljene vrste datotek';
+$lang['mu_info'] = 'poslanih datotek.';
+$lang['mu_lasterr'] = 'Zadnja napaka:';
+$lang['recent_global'] = 'Trenutno so prikazane spremembe znotraj imenskega prostora <b>%s</b>. Mogoče si je ogledati tudi spremembe <a href="%s">celotnega sistema Wiki</a>.';
+$lang['years'] = '%d let nazaj';
+$lang['months'] = '%d mesecev nazaj';
+$lang['weeks'] = '%d tednov nazaj';
+$lang['days'] = '%d dni nazaj';
+$lang['hours'] = '%d ur nazaj';
+$lang['minutes'] = '%d minut nazaj';
+$lang['seconds'] = '%d sekund nazaj';
+$lang['wordblock'] = 'Spremembe niso shranjene, ker je v vsebini navedeno neželeno besedilo (spam).';
diff --git a/inc/lang/sl/locked.txt b/inc/lang/sl/locked.txt
index dbdcf48a1..d51e940b7 100644
--- a/inc/lang/sl/locked.txt
+++ b/inc/lang/sl/locked.txt
@@ -1,3 +1,3 @@
====== Stran je zaklenjena ======
-To stran je nekdo zaklenjenil za urejanje. Počakati morate, da jo ta uporabnik neha urejati ali pa da poteče zaklep.
+Stran je zaklenjenjena za urejanje. Počakati je treba, da zaklep strani poteče.
diff --git a/inc/lang/sl/login.txt b/inc/lang/sl/login.txt
index f385d0099..eeae0c96c 100644
--- a/inc/lang/sl/login.txt
+++ b/inc/lang/sl/login.txt
@@ -1,4 +1,3 @@
====== Prijava ======
-Niste prijavljeni! Spodaj vnesite svoje podatke in se prijavite. Da se lahko prijavite, morate imeti omogočene piškotke.
-
+Niste prijavljeni! Spodaj vnesite ustrezne podatke in se prijavite. Prijaviti se je mogoče le, če so omogočeni piškotki.
diff --git a/inc/lang/sl/mailtext.txt b/inc/lang/sl/mailtext.txt
index a46c672d6..e08d01d9e 100644
--- a/inc/lang/sl/mailtext.txt
+++ b/inc/lang/sl/mailtext.txt
@@ -2,16 +2,14 @@ Stran na vašem DokuWiki je bila dodana ali spremenjena. Podrobnosti:
Datum : @DATE@
Brskalnik : @BROWSER@
-IP-naslov : @IPADDRESS@
-Gostitelj : @HOSTNAME@
+Naslov IP : @IPADDRESS@
+Ime gostitelja : @HOSTNAME@
Stara različica : @OLDPAGE@
-Nova Različica : @NEWPAGE@
+Nova različica : @NEWPAGE@
Povzetek urejanja: @SUMMARY@
Uporabnik : @USER@
@DIFF@
-
---
-To sporočilo je ustvaril DokuWiki na
-@DOKUWIKIURL@
+--
+Sporočilo je samodejno ustvarjeno na spletišču @DOKUWIKIURL@
diff --git a/inc/lang/sl/newpage.txt b/inc/lang/sl/newpage.txt
index c58ab17ff..2f11bbf55 100644
--- a/inc/lang/sl/newpage.txt
+++ b/inc/lang/sl/newpage.txt
@@ -1,3 +1,3 @@
-====== Ta stran še ne obstaja ======
+====== Stran še ne obstaja ======
-Sledili ste povezavi na stran, ki še ne obstaja. Ustvarite jo lahko, tako da pritisnete na ''Ustvari to stran''.
+Sledili ste povezavi na stran, ki še ne obstaja. Stran je mogoče ustvariti preko povezave ''Ustvari stran''.
diff --git a/inc/lang/sl/norev.txt b/inc/lang/sl/norev.txt
index 28b9f8ac5..adaa22d11 100644
--- a/inc/lang/sl/norev.txt
+++ b/inc/lang/sl/norev.txt
@@ -1,4 +1,3 @@
-====== Ta različica ne obstaja ======
-
-Podana različica ne obstaja. Uporabite gumb ''Stare različice'' za seznam starih različic tega dokumenta.
+====== Neobstoječa različica strani ======
+Zahtevana različica strani ne obstaja. Uporabite gumb ''Stare različice'' za izpis seznama starih različic tega dokumenta.
diff --git a/inc/lang/sl/password.txt b/inc/lang/sl/password.txt
index 794fd97b1..61929dccd 100644
--- a/inc/lang/sl/password.txt
+++ b/inc/lang/sl/password.txt
@@ -1,10 +1,9 @@
-Pozdravljeni @FULLNAME@!
+Pozdravljeni, @FULLNAME@!
-Tukaj so vaši podatki za @TITLE@ na @DOKUWIKIURL@
+Spodaj so navedeni podatki za @TITLE@ na wiki spletišču @DOKUWIKIURL@
-Uporabniško ime : @LOGIN@
-Geslo : @PASSWORD@
+Uporabniško ime: @LOGIN@
+Geslo : @PASSWORD@
---
-To sporočilo je ustvaril DokuWiki na
-@DOKUWIKIURL@
+--
+Sporočilo je samodejno ustvarjeno na spletišču @DOKUWIKIURL@
diff --git a/inc/lang/sl/preview.txt b/inc/lang/sl/preview.txt
index 4ebf183ec..c49de6617 100644
--- a/inc/lang/sl/preview.txt
+++ b/inc/lang/sl/preview.txt
@@ -1,4 +1,3 @@
====== Predogled ======
-To je predogled strani. Lahko si ogledate kako bo izgledal dokument. Ne pozabite pa, da še ni shranjen!
-
+Prikazan je predogled strani. Stran še ni shranjena!
diff --git a/inc/lang/sl/pwconfirm.txt b/inc/lang/sl/pwconfirm.txt
index 96c3a64d5..a621821e5 100644
--- a/inc/lang/sl/pwconfirm.txt
+++ b/inc/lang/sl/pwconfirm.txt
@@ -1,13 +1,11 @@
-Pozdravljen @FULLNAME@!
+Pozdravljeni, @FULLNAME@!
-Nekdo je v vašem imenu zahteval novo geslo za uporabniško ime @TITLE@ na @DOKUWIKIURL@.
+S podatki vašega imena je bila poslana zahteva za pridobitev novega gesla za uporabniško ime @TITLE@ na wiki spletišču @DOKUWIKIURL@.
-Če novega gesla niste zahtevali, prezrite to sporočilo.
-
-Za potrditev novega gesla, kliknite spodnjo povezavo.
+ - V kolikor novega gesla niste zahtevali, prezrite to sporočilo.
+ - Za potrditev zahteve za pridobitev novega gesla, kliknite spodnjo povezavo.
@CONFIRM@
---
-To sporočilo je ustvaril DokuWiki na
-@DOKUWIKIURL@
+--
+Sporočilo je samodejno ustvarjeno na spletišču @DOKUWIKIURL@
diff --git a/inc/lang/sl/read.txt b/inc/lang/sl/read.txt
index 1423a4f16..5ba9a2eb0 100644
--- a/inc/lang/sl/read.txt
+++ b/inc/lang/sl/read.txt
@@ -1,2 +1,2 @@
-Ta stran je samo za branje. Lahko si ogledate njeno izvorno kodo, spreminjati pa je ne morete. Vprašajte administratorja, če se vam to zdi narobe.
+Stran je odprta z dovoljenji le za branje. Dovoljeno je ogledati si izvorno kodo strani, vsebine pa ni mogoče spreminjati. Za več podrobnosti stopite v stik s skrbnikom sistema.
diff --git a/inc/lang/sl/recent.txt b/inc/lang/sl/recent.txt
index 534063384..282a492be 100644
--- a/inc/lang/sl/recent.txt
+++ b/inc/lang/sl/recent.txt
@@ -1,5 +1,3 @@
-====== Trenutne spremembe ======
-
-Sledeče strani so bile nedavno spremenjene.
-
+====== Nedavne spremembe ======
+Izpisane wiki strani so bile nedavno spremenjene.
diff --git a/inc/lang/sl/register.txt b/inc/lang/sl/register.txt
index d1f7ab49e..f1b22f933 100644
--- a/inc/lang/sl/register.txt
+++ b/inc/lang/sl/register.txt
@@ -1,4 +1,3 @@
-====== Odpri nov račun ======
-
-Vnesite vse potrebne podatke in si ustvarite račun za ta wiki. Preverite da ste vnesli **veljaven e-mail naslov** - tja bo poslano geslo. Uporabniško ime mora biti veljavno [[doku>pagename|ime strani]].
+====== Vpis novega računa ======
+V spodnji obrazec je treba vnesti vse zahtevane podatke za ustvarjanje novega računa. Vnesti je treba veljaven **elektronski naslov**, na katerega bo poslano geslo. Uporabniško ime mora biti veljavno [[doku>pagename|ime strani]].
diff --git a/inc/lang/sl/registermail.txt b/inc/lang/sl/registermail.txt
index d9622325e..801b7d0db 100644
--- a/inc/lang/sl/registermail.txt
+++ b/inc/lang/sl/registermail.txt
@@ -1,14 +1,14 @@
-Nov uporabnik registriran. Podatki:
+Nov uporabniški račun je uspešno vpisan.
+Podatki računa:
-Uporabniško ime: @NEWUSER@
-Polno ime: @NEWNAME@
-E-mail: @NEWEMAIL@
+Uporabniško ime : @NEWUSER@
+Polno ime : @NEWNAME@
+Elektronski naslov: @NEWEMAIL@
-Datum: @DATE@
-Brskalnik: @BROWSER@
-IP naslov: @IPADDRESS@
-Hostname: @HOSTNAME@
+Datum : @DATE@
+Brskalnik : @BROWSER@
+Naslov IP : @IPADDRESS@
+Ime gostitelja : @HOSTNAME@
--
-To sporočilo je ustvaril DokuWiki na
-@DOKUWIKIURL@
+Sporočilo je samodejno ustvarjeno na spletišču @DOKUWIKIURL@
diff --git a/inc/lang/sl/resendpwd.txt b/inc/lang/sl/resendpwd.txt
index 9f46a7a59..8a1e614f7 100644
--- a/inc/lang/sl/resendpwd.txt
+++ b/inc/lang/sl/resendpwd.txt
@@ -1,3 +1,3 @@
-====== Pošlji novo geslo ======
+====== Pošiljanje novega gesla ======
-Za pridobitev novega gesla, vnesite vaše uporabniško ime v obrazec spodaj. Na vaš email naslov bo poslano sporočilo s povezavo za potrditev avtentičnosti. \ No newline at end of file
+Za pridobitev novega gesla, vnesite vaše uporabniško ime ustrezno polje spodnjega obrazca. Na naveden elektronski naslov bo poslano sporočilo v katerem bo navedena povezava do strani za overjanje istovetnosti uporabnika.
diff --git a/inc/lang/sl/revisions.txt b/inc/lang/sl/revisions.txt
index 19bf39a87..86ede9ded 100644
--- a/inc/lang/sl/revisions.txt
+++ b/inc/lang/sl/revisions.txt
@@ -1,4 +1,3 @@
====== Stare različice ======
-To so stare različice tega dokumenta. Da ga povrnete na starejšo različico, to prvo izberite, pritisnite na ''Uredi to stran'' in jo še shranite.
-
+Prikazana je stara različica tega dokumenta. Stran je mogoče povrniti na starejšo različico tako, da stran izberete, pritisnete na povezavo ''Uredi stran'' in stran nato shranite.
diff --git a/inc/lang/sl/searchpage.txt b/inc/lang/sl/searchpage.txt
index b41c6dd44..736a36182 100644
--- a/inc/lang/sl/searchpage.txt
+++ b/inc/lang/sl/searchpage.txt
@@ -1,5 +1,5 @@
-====== Išči ======
+====== Iskanje ======
-Spodaj so prikazani rezultati vašega iskanja. Če niste našli kar ste iskali, lahko ustvarite novo stran z imenom vaše poizvedbe, tako da uporabite gumb ''Uredi to stran''.
+Spodaj so izpisani rezultati iskanja. V kolikor rezultati niso skladni z zahtevami iskanja, je mogoče ustvariti novo stran z nazivom vaše poizvedbe preko povezave ''Uredi stran''.
===== Rezultati ===== \ No newline at end of file
diff --git a/inc/lang/sl/showrev.txt b/inc/lang/sl/showrev.txt
index 00111ffc5..838339217 100644
--- a/inc/lang/sl/showrev.txt
+++ b/inc/lang/sl/showrev.txt
@@ -1,2 +1,2 @@
-**To je stara različica tega dokumenta!**
+**Stara različica tega dokumenta!**
----
diff --git a/inc/lang/sl/stopwords.txt b/inc/lang/sl/stopwords.txt
new file mode 100644
index 000000000..5d61539e7
--- /dev/null
+++ b/inc/lang/sl/stopwords.txt
@@ -0,0 +1,18 @@
+# To je seznam besed, ki jih ustvarjalnik kazala prezre. Seznam je sestavljen iz
+# besede, ki so zapisane vsaka v svoji vrstici. Datoteka mora biti zapisana s konnim
+# UNIX znakom vrstice. Besede kraje od treh znakov so iz kazala izloene samodejno
+# zaradi preglednosti. Seznam se s bo s asom spreminjal in dopolnjeval.
+moja
+moje
+moji
+mojo
+njegovi
+njegove
+njegovo
+njeno
+njeni
+njene
+njihova
+njihove
+njihovi
+njihovo
diff --git a/inc/lang/sl/subscr_digest.txt b/inc/lang/sl/subscr_digest.txt
new file mode 100644
index 000000000..aeb548beb
--- /dev/null
+++ b/inc/lang/sl/subscr_digest.txt
@@ -0,0 +1,19 @@
+Pozdravljeni!
+
+Strani v imenskem prostoru @PAGE@ wiki spletišča @TITLE@ so spremenjene.
+Podrobnosti sprememb so navedene spodaj.
+
+------------------------------------------------
+@DIFF@
+------------------------------------------------
+
+Stara različica: @OLDPAGE@
+Nova različica : @NEWPAGE@
+
+Za odjavo prejemanja podrobnosti sprememb, se je treba prijaviti na spletišče
+@DOKUWIKIURL@ in med možnostmi naročanja
+@SUBSCRIBE@
+odjaviti prejemanje poročil sprememb strani ali imenskega prostora.
+
+--
+Sporočilo je samodejno ustvarjeno na spletišču @DOKUWIKIURL@
diff --git a/inc/lang/sl/subscr_form.txt b/inc/lang/sl/subscr_form.txt
new file mode 100644
index 000000000..46be8c954
--- /dev/null
+++ b/inc/lang/sl/subscr_form.txt
@@ -0,0 +1,3 @@
+===== Urejanje naročnin ====
+
+Ta stran vam omogoča urejanje vaših naročnin za trenutno stran in imenski prostor. \ No newline at end of file
diff --git a/inc/lang/sl/subscr_list.txt b/inc/lang/sl/subscr_list.txt
new file mode 100644
index 000000000..253cb4104
--- /dev/null
+++ b/inc/lang/sl/subscr_list.txt
@@ -0,0 +1,16 @@
+Pozdravljeni!
+
+Strani v imenskem prostoru @PAGE@ wiki spletišča @TITLE@ so spremenjene.
+Podrobnosti sprememb so navedene spodaj.
+
+------------------------------------------------
+@DIFF@
+------------------------------------------------
+
+Za odjavo prejemanja podrobnosti sprememb, se je treba prijaviti na spletišče
+@DOKUWIKIURL@ in med možnostmi naročanja
+@SUBSCRIBE@
+odjaviti prejemanje poročil sprememb strani ali imenskega prostora.
+
+--
+Sporočilo je samodejno ustvarjeno na spletišču @DOKUWIKIURL@
diff --git a/inc/lang/sl/subscr_single.txt b/inc/lang/sl/subscr_single.txt
new file mode 100644
index 000000000..9fd64be0e
--- /dev/null
+++ b/inc/lang/sl/subscr_single.txt
@@ -0,0 +1,22 @@
+Pozdravljeni!
+
+Stran @PAGE@ na spletišču Wiki @TITLE@ je spremenjena.
+Spremenjeno je:
+
+--------------------------------------------------------
+@DIFF@
+--------------------------------------------------------
+
+Datum : @DATE@
+Uporabnik : @USER@
+Povzetek urejanja: @SUMMARY@
+Stara različica : @OLDPAGE@
+Nova različica : @NEWPAGE@
+
+Preklic obveščanja o spremembah strani je mogoče določiti
+na Wiki naslovu @DOKUWIKIURL@ in z obiskom @NEWPAGE@,
+kjer se je mogoče odjaviti od spremljanja strani ali
+imenskega prostora.
+
+--
+Sporočilo je samodejno ustvarjeno na spletišču @DOKUWIKIURL@ \ No newline at end of file
diff --git a/inc/lang/sl/updateprofile.txt b/inc/lang/sl/updateprofile.txt
new file mode 100644
index 000000000..5e939f2f2
--- /dev/null
+++ b/inc/lang/sl/updateprofile.txt
@@ -0,0 +1,3 @@
+===== Posodabljanje računa =====
+
+Posodobiti ali spremeniti je mogoče le nekatere podatke. Uporabniškega imena ni mogoče spremeniti. \ No newline at end of file
diff --git a/inc/lang/sl/uploadmail.txt b/inc/lang/sl/uploadmail.txt
new file mode 100644
index 000000000..0479be75f
--- /dev/null
+++ b/inc/lang/sl/uploadmail.txt
@@ -0,0 +1,14 @@
+Datoteka je bila uspešno naložena na DokuWiki spletišče.
+Podrobnosti o datoteki:
+
+Datoteka : @MEDIA@
+Datum : @DATE@
+Brskalnik : @BROWSER@
+Naslov IP : @IPADDRESS@
+Ponudnik : @HOSTNAME@
+Velikost : @SIZE@
+Vrsta MIME: @MIME@
+Uporabnik : @USER@
+
+--
+Sporočilo je samodejno ustvarjeno na spletišču @DOKUWIKIURL@ \ No newline at end of file
diff --git a/inc/lang/sq/lang.php b/inc/lang/sq/lang.php
index 0213ba28b..47a54d2ea 100644
--- a/inc/lang/sq/lang.php
+++ b/inc/lang/sq/lang.php
@@ -8,7 +8,7 @@
* lines starting with @author
*
* @url http://svn.wikimedia.org/viewvc/mediawiki/trunk/phase3/languages/messages/MessagesSq.php?view=co
- * @author Leonard Elezi leonard.elezi@depinfo.info
+ * @author Leonard Elezi <leonard.elezi@depinfo.info>
*/
$lang['encoding'] = 'utf-8';
$lang['direction'] = 'ltr';
@@ -49,6 +49,7 @@ $lang['btn_draft'] = 'Redakto skicën';
$lang['btn_recover'] = 'Rekupero skicën';
$lang['btn_draftdel'] = 'Fshi skicën';
$lang['btn_revert'] = 'Kthe si më parë';
+$lang['btn_register'] = 'Regjsitrohuni';
$lang['loggedinas'] = 'Regjistruar si ';
$lang['user'] = 'Nofka e përdoruesit:';
$lang['pass'] = 'Fjalëkalimi';
@@ -58,7 +59,6 @@ $lang['passchk'] = 'Edhe një herë';
$lang['remember'] = 'Më mbaj mend';
$lang['fullname'] = 'Emri i vërtetë';
$lang['email'] = 'Adresa e email-it*';
-$lang['register'] = 'Regjsitrohuni';
$lang['profile'] = 'Profili i përdoruesit';
$lang['badlogin'] = 'Na vjen keq, emri ose fjalëkalimi është gabim.';
$lang['minoredit'] = 'Ndryshime të Vogla';
diff --git a/inc/lang/sr/lang.php b/inc/lang/sr/lang.php
index 71dde4062..b35956f03 100644
--- a/inc/lang/sr/lang.php
+++ b/inc/lang/sr/lang.php
@@ -4,8 +4,7 @@
*
* @license GPL 2 (http://www.gnu.org/licenses/gpl.html)
* @author Filip Brcic <brcha@users.sourceforge.net>
- * @author Иван Петровић petrovicivan@ubuntusrbija.org
- * @author Ivan Petrovic <petrovicivan@ubuntusrbija.org>
+ * @author Иван Петровић (Ivan Petrovic) <petrovicivan@ubuntusrbija.org>
* @author Miroslav Šolti <solti.miroslav@gmail.com>
*/
$lang['encoding'] = 'utf-8';
@@ -47,6 +46,7 @@ $lang['btn_draft'] = 'Измени нацрт';
$lang['btn_recover'] = 'Опорави нацрт';
$lang['btn_draftdel'] = 'Обриши нацрт';
$lang['btn_revert'] = 'Врати на пређашњу верзију';
+$lang['btn_register'] = 'Региструј се';
$lang['loggedinas'] = 'Пријављен као';
$lang['user'] = 'Корисничко име';
$lang['pass'] = 'Лозинка';
@@ -56,7 +56,6 @@ $lang['passchk'] = 'поново';
$lang['remember'] = 'Запамти ме';
$lang['fullname'] = 'Име и презиме';
$lang['email'] = 'Е-адреса';
-$lang['register'] = 'Региструј се';
$lang['profile'] = 'Кориснички профил';
$lang['badlogin'] = 'Извините, није добро корисничко име или шифра.';
$lang['minoredit'] = 'Мала измена';
diff --git a/inc/lang/sv/lang.php b/inc/lang/sv/lang.php
index 09dec8edd..06b21afe8 100644
--- a/inc/lang/sv/lang.php
+++ b/inc/lang/sv/lang.php
@@ -7,15 +7,16 @@
* @author Per Foreby <per@foreby.se>
* @author Nicklas Henriksson <nicklas[at]nihe.se>
* @author Håkan Sandell <hakan.sandell[at]mydata.se>
+ * @author Håkan Sandell <hakan.sandell@home.se>
* @author Dennis Karlsson
* @author Tormod Otter Johansson <tormod@latast.se>
+ * @author Tormod Johansson <tormod.otter.johansson@gmail.com>
* @author emil@sys.nu
* @author Pontus Bergendahl <pontus.bergendahl@gmail.com>
- * @author Tormod Johansson tormod.otter.johansson@gmail.com
* @author Emil Lind <emil@sys.nu>
* @author Bogge Bogge <bogge@bogge.com>
* @author Peter Åström <eaustreum@gmail.com>
- * @author Håkan Sandell <hakan.sandell@home.se>
+ * @author mikael@mallander.net
*/
$lang['encoding'] = 'utf-8';
$lang['direction'] = 'ltr';
@@ -49,10 +50,6 @@ $lang['btn_back'] = 'Tillbaka';
$lang['btn_backlink'] = 'Tillbakalänkar';
$lang['btn_backtomedia'] = 'Tillbaka till val av Mediafil';
$lang['btn_subscribe'] = 'Prenumerera på ändringar';
-$lang['btn_unsubscribe'] = 'Säg upp prenumeration på ändringar';
-$lang['btn_subscribens'] = 'Prenumerera på namnrymdsändringar';
-$lang['btn_unsubscribens'] = 'Sluta prenumerera på namnrymdsändringar
-';
$lang['btn_profile'] = 'Uppdatera profil';
$lang['btn_reset'] = 'Återställ';
$lang['btn_resendpwd'] = 'Skicka nytt lösenord';
@@ -60,6 +57,7 @@ $lang['btn_draft'] = 'Redigera utkast';
$lang['btn_recover'] = 'Återskapa utkast';
$lang['btn_draftdel'] = 'Radera utkast';
$lang['btn_revert'] = 'Återställ';
+$lang['btn_register'] = 'Registrera';
$lang['loggedinas'] = 'Inloggad som';
$lang['user'] = 'Användarnamn';
$lang['pass'] = 'Lösenord';
@@ -69,7 +67,6 @@ $lang['passchk'] = 'en gång till';
$lang['remember'] = 'Kom ihåg mig';
$lang['fullname'] = 'Namn';
$lang['email'] = 'E-post';
-$lang['register'] = 'Registrera';
$lang['profile'] = 'Användarprofil';
$lang['badlogin'] = 'Felaktigt användarnamn eller lösenord.';
$lang['minoredit'] = 'Små ändringar';
@@ -106,7 +103,35 @@ $lang['txt_overwrt'] = 'Skriv över befintlig fil';
$lang['lockedby'] = 'Låst av';
$lang['lockexpire'] = 'Lås upphör att gälla';
$lang['willexpire'] = 'Ditt redigeringslås för detta dokument kommer snart att upphöra.\nFör att undvika versionskonflikter bör du förhandsgranska ditt dokument för att förlänga redigeringslåset.';
-$lang['js']['notsavedyet'] = "Det finns ändringar som inte är sparade.\nÄr du säker på att du vill fortsätta?";
+$lang['js']['notsavedyet'] = 'Det finns ändringar som inte är sparade.
+Är du säker på att du vill fortsätta?';
+$lang['js']['searchmedia'] = 'Sök efter filer';
+$lang['js']['keepopen'] = 'Lämna fönstret öppet efter val av fil';
+$lang['js']['hidedetails'] = 'Dölj detaljer';
+$lang['js']['mediatitle'] = 'Länkinställningar';
+$lang['js']['mediadisplay'] = 'Länktyp';
+$lang['js']['mediaalign'] = 'Justering';
+$lang['js']['mediasize'] = 'Bildstorlek';
+$lang['js']['mediatarget'] = 'Länköppning';
+$lang['js']['mediaclose'] = 'Stäng';
+$lang['js']['mediadisplayimg'] = 'Visa bilden.';
+$lang['js']['mediadisplaylnk'] = 'Visa endast länken.';
+$lang['js']['mediasmall'] = 'Liten storlek';
+$lang['js']['mediamedium'] = 'Mellanstor storlek';
+$lang['js']['medialarge'] = 'Stor storlek';
+$lang['js']['mediaoriginal'] = 'Originalstorlek';
+$lang['js']['mediadirect'] = 'Direktlänk till originalet';
+$lang['js']['medianolnk'] = 'Ingen länk';
+$lang['js']['medianolink'] = 'Länka inte bilden';
+$lang['js']['medialeft'] = 'Justera bilden till vänster.';
+$lang['js']['mediaright'] = 'Justera bilden till höger.';
+$lang['js']['mediacenter'] = 'Centrera bilden.';
+$lang['js']['nosmblinks'] = 'Länkning till Windowsresurser fungerar bara med Microsofts Internet Explorer.
+Du kan fortfarande klippa och klistra in länken om du använder en annan webbläsare än MSIE.';
+$lang['js']['linkwiz'] = 'Snabbguide Länkar';
+$lang['js']['linkto'] = 'Länk till:';
+$lang['js']['del_confirm'] = 'Vill du verkligen radera?';
+$lang['js']['mu_btn'] = 'Ladda upp flera filer samtidigt';
$lang['rssfailed'] = 'Ett fel uppstod när detta RSS-flöde skulle hämtas: ';
$lang['nothingfound'] = 'Inga filer hittades.';
$lang['mediaselect'] = 'Mediafiler';
@@ -124,15 +149,7 @@ $lang['deletefail'] = 'Kunde inte radera "%s" - kontrollera filskydd.
$lang['mediainuse'] = 'Filen "%s" har inte raderats - den används fortfarande.';
$lang['namespaces'] = 'Namnrymder';
$lang['mediafiles'] = 'Tillgängliga filer i';
-$lang['js']['searchmedia'] = 'Sök efter filer';
-$lang['js']['keepopen'] = 'Lämna fönstret öppet efter val av fil';
-$lang['js']['hidedetails'] = 'Dölj detaljer';
-$lang['js']['nosmblinks'] = 'Länkning till Windowsresurser fungerar bara med Microsofts Internet Explorer.
-Du kan fortfarande klippa och klistra in länken om du använder en annan webbläsare än MSIE.';
-$lang['js']['linkwiz'] = 'Snabbguide Länkar';
-$lang['js']['linkto'] = 'Länk till:';
-$lang['js']['del_confirm'] = 'Vill du verkligen radera?';
-$lang['js']['mu_btn'] = 'Ladda upp flera filer samtidigt';
+$lang['accessdenied'] = 'Du får inte läsa den här sidan.';
$lang['mediausage'] = 'Använd följande syntax för att referera till denna fil:';
$lang['mediaview'] = 'Visa originalfilen';
$lang['mediaroot'] = 'rot';
@@ -148,6 +165,9 @@ $lang['current'] = 'aktuell';
$lang['yours'] = 'Din version';
$lang['diff'] = 'visa skillnader mot aktuell version';
$lang['diff2'] = 'Visa skillnader mellan valda versioner';
+$lang['difflink'] = 'Länk till den här jämförelsesidan';
+$lang['diff_type'] = 'Visa skillnader:';
+$lang['diff_side'] = 'Sida vid sida';
$lang['line'] = 'Rad';
$lang['breadcrumb'] = 'Spår';
$lang['youarehere'] = 'Här är du';
@@ -204,11 +224,12 @@ $lang['img_copyr'] = 'Copyright';
$lang['img_format'] = 'Format';
$lang['img_camera'] = 'Kamera';
$lang['img_keywords'] = 'Nyckelord';
-$lang['subscribe_success'] = 'Lade till %s i prenumerationslistan för %s';
-$lang['subscribe_error'] = 'Fel vid tillägg av %s i prenumerationslistan för %s';
-$lang['subscribe_noaddress'] = 'Det finns ingen adress knuten till ditt konto, det går inte att lägga till dig i prenumerationslistan';
-$lang['unsubscribe_success'] = 'Tog bort %s från prenumerationslistan för %s';
-$lang['unsubscribe_error'] = 'Fel vid borttagning %s från prenumerationslistan list för %s';
+$lang['subscr_m_new_header'] = 'Lägg till prenumeration';
+$lang['subscr_m_current_header'] = 'Nuvarande prenumerationer';
+$lang['subscr_m_unsubscribe'] = 'Avsluta prenumeration';
+$lang['subscr_m_subscribe'] = 'Prenumerera';
+$lang['subscr_m_receive'] = 'Ta emot';
+$lang['subscr_style_every'] = 'skicka epost vid varje ändring';
$lang['authmodfailed'] = 'Felaktiga inställningar för användarautentisering. Var vänlig meddela wikiadministratören.';
$lang['authtempfail'] = 'Tillfälligt fel på användarautentisering. Om felet kvarstår, var vänlig meddela wikiadministratören.';
$lang['i_chooselang'] = 'Välj språk';
@@ -259,3 +280,4 @@ $lang['days'] = '%d dagar sedan';
$lang['hours'] = '%d timmar sedan';
$lang['minutes'] = '%d minuter sedan';
$lang['seconds'] = '%d sekunder sedan';
+$lang['wordblock'] = 'Din ändring sparades inte för att den innehåller otillåten text (spam).';
diff --git a/inc/lang/th/lang.php b/inc/lang/th/lang.php
index ea27793b8..d40f30f4a 100644
--- a/inc/lang/th/lang.php
+++ b/inc/lang/th/lang.php
@@ -9,7 +9,6 @@
*
* @url http://svn.wikimedia.org/viewvc/mediawiki/trunk/phase3/languages/messages/MessagesTh.php?view=co
* @author Komgrit Niyomrath <n.komgrit@gmail.com>
- * @author Kittithat Arnontavilas mrtomyum@gmail.com
* @author Arthit Suriyawongkul <arthit@gmail.com>
* @author Kittithat Arnontavilas <mrtomyum@gmail.com>
* @author Thanasak Sompaisansin <jombthep@gmail.com>
@@ -56,6 +55,7 @@ $lang['btn_draft'] = 'แก้ไขเอกสารฉบับ
$lang['btn_recover'] = 'กู้คืนเอกสารฉบับร่าง';
$lang['btn_draftdel'] = 'ลบเอกสารฉบับร่าง';
$lang['btn_revert'] = 'กู้คืน';
+$lang['btn_register'] = 'สร้างบัญชีผู้ใช้';
$lang['loggedinas'] = 'ลงชื่อเข้าใช้เป็น';
$lang['user'] = 'ชื่อผู้ใช้:';
$lang['pass'] = 'รหัสผ่าน';
@@ -65,7 +65,6 @@ $lang['passchk'] = 'พิมพ์รหัสผ่านอี
$lang['remember'] = 'จำชื่อและรหัสผ่าน';
$lang['fullname'] = 'ชื่อจริง:';
$lang['email'] = 'อีเมล:';
-$lang['register'] = 'สร้างบัญชีผู้ใช้';
$lang['profile'] = 'ข้อมูลส่วนตัวผู้ใช้';
$lang['badlogin'] = 'ขัดข้อง:';
$lang['minoredit'] = 'เป็นการแก้ไขเล็กน้อย';
diff --git a/inc/lang/tr/lang.php b/inc/lang/tr/lang.php
index 0c8c1ff3f..0509113b0 100644
--- a/inc/lang/tr/lang.php
+++ b/inc/lang/tr/lang.php
@@ -48,6 +48,7 @@ $lang['btn_draft'] = 'Taslağı düzenle';
$lang['btn_recover'] = 'Taslağı geri yükle';
$lang['btn_draftdel'] = 'Taslağı sil';
$lang['btn_revert'] = 'Geri Yükle';
+$lang['btn_register'] = 'Kayıt ol';
$lang['loggedinas'] = 'Giriş ismi';
$lang['user'] = 'Kullanıcı ismi';
$lang['pass'] = 'Parola';
@@ -57,7 +58,6 @@ $lang['passchk'] = 'Bir kez daha girin';
$lang['remember'] = 'Beni hatırla';
$lang['fullname'] = 'Tam isim';
$lang['email'] = 'E-posta';
-$lang['register'] = 'Kayıt ol';
$lang['profile'] = 'Kullanıcı Bilgileri';
$lang['badlogin'] = 'Üzgünüz, Kullanıcı adı veya şifre yanlış oldu.';
$lang['minoredit'] = 'Küçük Değişiklikler';
diff --git a/inc/lang/uk/lang.php b/inc/lang/uk/lang.php
index d3d5d7acf..7bda02501 100644
--- a/inc/lang/uk/lang.php
+++ b/inc/lang/uk/lang.php
@@ -5,10 +5,10 @@
* @license GPL 2 (http://www.gnu.org/licenses/gpl.html)
* @author Oleksiy Voronin <ovoronin@gmail.com>
* @author serg_stetsuk@ukr.net
- * @author okunia@gmail.com
* @author Oleksandr Kunytsia <okunia@gmail.com>
- * @author Uko uko@uar.net
- * @author Ulrikhe Lukoie <lukoie@gmail>.com
+ * @author Uko <uko@uar.net>
+ * @author Ulrikhe Lukoie <lukoie@gmail.com>
+ * @author Kate Arzamastseva pshns@ukr.net
*/
$lang['encoding'] = 'utf-8';
$lang['direction'] = 'ltr';
@@ -43,12 +43,13 @@ $lang['btn_backlink'] = 'Посилання сюди';
$lang['btn_backtomedia'] = 'Назад до вибору медіа-файлу';
$lang['btn_subscribe'] = 'Підписатися';
$lang['btn_profile'] = 'Оновити профіль';
-$lang['btn_reset'] = 'Очисти';
+$lang['btn_reset'] = 'Очистити';
$lang['btn_resendpwd'] = 'Надіслати новий пароль';
$lang['btn_draft'] = 'Редагувати чернетку';
$lang['btn_recover'] = 'Відновити чернетку';
$lang['btn_draftdel'] = 'Знищити чернетку';
$lang['btn_revert'] = 'Відновити';
+$lang['btn_register'] = 'Реєстрація';
$lang['loggedinas'] = 'Ви';
$lang['user'] = 'Користувач';
$lang['pass'] = 'Пароль';
@@ -58,7 +59,6 @@ $lang['passchk'] = 'ще раз';
$lang['remember'] = 'Запам\'ятати мене';
$lang['fullname'] = 'Повне ім\'я';
$lang['email'] = 'E-Mail';
-$lang['register'] = 'Реєстрація';
$lang['profile'] = 'Профіль користувача';
$lang['badlogin'] = 'Вибачте, невірне ім\'я чи пароль.';
$lang['minoredit'] = 'Незначні зміни';
@@ -108,11 +108,11 @@ $lang['js']['mediatarget'] = 'Ціль посилання';
$lang['js']['mediaclose'] = 'Закрити';
$lang['js']['mediainsert'] = 'Вставити';
$lang['js']['mediadisplayimg'] = 'Показати зображення.';
-$lang['js']['mediadisplaylnk'] = 'Показати тілки посилання.';
-$lang['js']['mediasmall'] = 'Зменшена версіяЁ';
+$lang['js']['mediadisplaylnk'] = 'Показати тільки посилання.';
+$lang['js']['mediasmall'] = 'Зменшена версія';
$lang['js']['mediamedium'] = 'Середня версія';
$lang['js']['medialarge'] = 'Велика версія';
-$lang['js']['mediaoriginal'] = 'Оигінальна версія';
+$lang['js']['mediaoriginal'] = 'Оригінальна версія';
$lang['js']['medialnk'] = 'Посилання на сторінку з описом';
$lang['js']['mediadirect'] = 'Пряме посилання на оригінал';
$lang['js']['medianolnk'] = 'Немає посилання';
@@ -161,6 +161,9 @@ $lang['yours'] = 'Ваша версія';
$lang['diff'] = 'показати відмінності від поточної версії';
$lang['diff2'] = 'Показати відмінності між вибраними версіями';
$lang['difflink'] = 'Посилання на цей список змін';
+$lang['diff_type'] = 'Переглянути відмінності:';
+$lang['diff_inline'] = 'Вбудувати';
+$lang['diff_side'] = 'Поряд';
$lang['line'] = 'Рядок';
$lang['breadcrumb'] = 'Відвідано';
$lang['youarehere'] = 'Ви тут';
@@ -220,9 +223,9 @@ $lang['img_camera'] = 'Камера';
$lang['img_keywords'] = 'Ключові слова';
$lang['subscr_subscribe_success'] = 'Додано %s до списку підписки для %s';
$lang['subscr_subscribe_error'] = 'Помилка при додавані %s до списку підписки для %s';
-$lang['subscr_subscribe_noaddress'] = 'Немає адреси, асоційованої з Вашим логіном, тому Ві не можете бути додані до списку підписки.';
+$lang['subscr_subscribe_noaddress'] = 'Немає адреси, асоційованої з Вашим логіном, тому Ви не можете бути додані до списку підписки.';
$lang['subscr_unsubscribe_success'] = 'Видалено %s із списку підписки для %s';
-$lang['subscr_unsubscribe_error'] = 'Помилка при видаленні %s із списку підписки для %s';
+$lang['subscr_unsubscribe_error'] = 'Помилка при видаленні %s зі списку підписки для %s';
$lang['subscr_already_subscribed'] = '%s вже підписаний до %s';
$lang['subscr_not_subscribed'] = '%s не підписаний до %s';
$lang['subscr_m_not_subscribed'] = 'Ви зараз не підписані до цієї сторінки або простору імен.';
@@ -231,9 +234,9 @@ $lang['subscr_m_current_header'] = 'Поточні підписки';
$lang['subscr_m_unsubscribe'] = 'Відписатися';
$lang['subscr_m_subscribe'] = 'Підписатися';
$lang['subscr_m_receive'] = 'Отримувати';
-$lang['subscr_style_every'] = 'пошту про кожну зміну';
+$lang['subscr_style_every'] = 'повідомляти на пошту про кожну зміну';
$lang['subscr_style_digest'] = 'лист з дайджестом для зміни кожної сторінки (кожні %.2f днів)';
-$lang['subscr_style_list'] = 'список змінених сторінок від часу отримання останньоголиста (кожні %.2f днів)';
+$lang['subscr_style_list'] = 'список змінених сторінок від часу отримання останнього листа (кожні %.2f днів)';
$lang['authmodfailed'] = 'Неправильна настройка автентифікації користувача. Будь ласка, повідомте про це адміністратора.';
$lang['authtempfail'] = 'Автентифікація користувача тимчасово не доступна. Якщо це буде продовжуватись, будь ласка, повідомте адміністратора.';
$lang['i_chooselang'] = 'Виберіть мову';
diff --git a/inc/lang/vi/lang.php b/inc/lang/vi/lang.php
index 750433910..89c9e9cfc 100644
--- a/inc/lang/vi/lang.php
+++ b/inc/lang/vi/lang.php
@@ -27,6 +27,7 @@ $lang['btn_logout'] = 'Thoát';
$lang['btn_admin'] = 'Quản lý';
$lang['btn_update'] = 'Cập nhật';
$lang['btn_delete'] = 'Xoá';
+$lang['btn_register'] = 'Đăng ký';
$lang['loggedinas'] = 'Username đang dùng';
$lang['user'] = 'Username';
@@ -34,7 +35,6 @@ $lang['pass'] = 'Password';
$lang['remember'] = 'Lưu username/password lại';
$lang['fullname'] = 'Họ và tên';
$lang['email'] = 'E-Mail';
-$lang['register'] = 'Đăng ký';
$lang['badlogin'] = 'Username hoặc password không đúng.';
$lang['regmissing'] = 'Bạn cần điền vào tất cả các trường';
diff --git a/inc/lang/zh-tw/backlinks.txt b/inc/lang/zh-tw/backlinks.txt
index 381a76812..5b36728e7 100644
--- a/inc/lang/zh-tw/backlinks.txt
+++ b/inc/lang/zh-tw/backlinks.txt
@@ -1,5 +1,4 @@
-====== 被引用的連結(Backlinks) ======
-
-這裡是有引用、連結到原先頁面的清單。
+====== 反向連結 ======
+這裡是引用、連結到目前頁面的頁面清單。
diff --git a/inc/lang/zh-tw/conflict.txt b/inc/lang/zh-tw/conflict.txt
index e52613dc8..4f31f665f 100644
--- a/inc/lang/zh-tw/conflict.txt
+++ b/inc/lang/zh-tw/conflict.txt
@@ -1,4 +1,5 @@
-====== 有一個更新的版本已存在 ======
+====== 已存在更新版本 ======
-有一個您所編輯的更新版本已經存在了。\\ 這狀況之所以會發生:乃是因為當您正在編修它的時候,而其他使用者已變更這份文件。\\ 請檢驗以下的差異,然後決定要用哪一份。\\ 若您選擇「''儲存''」,那您的版本就會被存下來了。而「取消」則會保留為現在這版本。
+此檔案已存在更新的版本。這是因為有其他使用者在您編輯時變更了這份文件。
+請仔細檢查以下差異,再決定保留哪份。您可選擇「儲存」您的版本或「取消」保留目前版本。 \ No newline at end of file
diff --git a/inc/lang/zh-tw/denied.txt b/inc/lang/zh-tw/denied.txt
index 20c512abc..5a4d483a5 100644
--- a/inc/lang/zh-tw/denied.txt
+++ b/inc/lang/zh-tw/denied.txt
@@ -1,4 +1,4 @@
-====== 拒絕尚未授權 ======
+====== 權限拒絕 ======
-很抱歉您權限不夠以致無法繼續。或許您忘了先登入您的帳號嗎?
+抱歉,您沒有足夠權限繼續執行。或許您忘了登入?
diff --git a/inc/lang/zh-tw/diff.txt b/inc/lang/zh-tw/diff.txt
index a064f81ed..b2b662ec3 100644
--- a/inc/lang/zh-tw/diff.txt
+++ b/inc/lang/zh-tw/diff.txt
@@ -1,4 +1,4 @@
====== 差異處 ======
-這裡會顯示出所選的版次與目前版次的差異處。
+這裡顯示二個版本的差異處。
diff --git a/inc/lang/zh-tw/draft.txt b/inc/lang/zh-tw/draft.txt
index 81a092be0..f14702efb 100644
--- a/inc/lang/zh-tw/draft.txt
+++ b/inc/lang/zh-tw/draft.txt
@@ -1,5 +1,5 @@
====== 發現草稿檔案 ======
-您上次編輯此頁面並未正確的完成。DokuWiki在您編輯的時候自動儲存一份草稿使得您可以繼續編輯。以下您可以觀看上次編輯的資料。
+您上次的編輯程序並未正確完成。DokuWiki 已在您編輯時自動儲存了一份草稿使您可以繼續編輯。以下是上次的編輯資料。
-請決定你要//復原//您遺失的編輯文件,//刪除//這份草稿,或者//取消//目前的編輯程序。
+請決定要//復原//您遺失的編輯文件,//刪除//這份草稿,或者//取消//編輯程序。
diff --git a/inc/lang/zh-tw/edit.txt b/inc/lang/zh-tw/edit.txt
index 5be7fbb4e..bbe5bb8ed 100644
--- a/inc/lang/zh-tw/edit.txt
+++ b/inc/lang/zh-tw/edit.txt
@@ -1 +1 @@
-提示:編修本頁並按「''儲存''」即可。 不懂 Wiki 語法?沒關係點一下 [[wiki:syntax|中文語法]] 。若您覺得可讓本文品質「**更好**」的話,那就請繼續吧 :) \\    但若只想練習或測試東西的話,那麼請先多利用 [[playground:playground|新手試煉場]] 來試煉您的身手吧。
+編輯本頁並按下''儲存''即可。可在[[wiki:syntax|維基語法]]找到語法說明。請只在能讓本文品質「**更好**」時才編輯。如果只是要測試,請使用 [[playground:playground|遊樂場]]。
diff --git a/inc/lang/zh-tw/editrev.txt b/inc/lang/zh-tw/editrev.txt
index b344e0772..96f9a7c6a 100644
--- a/inc/lang/zh-tw/editrev.txt
+++ b/inc/lang/zh-tw/editrev.txt
@@ -1,2 +1,2 @@
-**您目前載入的是本份文件的舊版!!** 若存檔的話,那這些資料就會被存成另一份了喔。
+**您目前載入的是本份文件的舊版!** 您如果存檔,這些資料就會被存成另一份。
----
diff --git a/inc/lang/zh-tw/index.txt b/inc/lang/zh-tw/index.txt
index 961095bff..11ec223d9 100644
--- a/inc/lang/zh-tw/index.txt
+++ b/inc/lang/zh-tw/index.txt
@@ -1,3 +1,3 @@
-====== 索引頁 ======
+====== 站台地圖 ======
-目前您所看到的是用 [[doku>namespaces|namespaces]] 來排序目前所有可用的頁面清單。\\ 請直接按您想要的頁面或者用「顯示頁面」來檢視目前所在頁面
+這個站台地圖列出了所有允許的頁面,依 [[doku>namespaces|命名空間]] 排序。
diff --git a/inc/lang/zh-tw/install.html b/inc/lang/zh-tw/install.html
index 879c152b5..88af0b394 100644
--- a/inc/lang/zh-tw/install.html
+++ b/inc/lang/zh-tw/install.html
@@ -1,8 +1,8 @@
-<p>本页面旨在帮助您完成第一次安装和配置 <a href="http://dokuwiki.org">Dokuwiki</a>。关于安装工具的更多信息请参阅其 <a href="http://dokuwiki.org/installer">官方文档页面</a>。</p>
+<p>本頁面旨在幫助您完成第一次安装和配置 <a href="http://dokuwiki.org">Dokuwiki</a>。關於安裝工具的更多訊息請參閱 <a href="http://dokuwiki.org/installer">官方文檔頁面</a>。</p>
-<p>DokuWiki 使用普通的文件保存维基页面和其他与这些页面挂钩的信息(例如:图像,搜索索引,修订记录等)。为了能正常运行,DokuWiki <strong>必须</strong> 拥有针对那些路径和文件的写权限。本安装工具不能用于设置这些权限。对权限的操作通常通过命令行或使用您的网络服务提供商的 FTP 或控制面板(例如 cPanel)进行操作。</p>
+<p>DokuWiki 使用普通檔案儲存維基頁面以及與頁面相關的訊息(例如:圖像,搜尋索引,修訂記錄等)。為了正常運作,DokuWiki <strong>必須</strong> 擁有針對那些路徑和檔案的寫入權限。本安裝工具無法設定目錄權限,這通常要透過命令行、FTP 或您主機上的控制台(如cPanel)進行。</p>
-<p>本安装工具将设置您的 DokuWiki 配置 <acronym title="访问控制列表">ACL</acronym>,它能让管理员登录并使用“管理”功能来安装插件,管理用户,管理访问权限和其他配置设置。它并不是 DokuWiki 正常运行所必须的,但安装之后它将更方便您的管理。</p>
+<p>本安裝工具將設定您的 DokuWiki 用於 <acronym title="訪問控制列表">ACL</acronym> 的配置檔,它能讓管理員登入並使用「管理」功能來安裝插件、管理用户、管理訪問權限和其他配置設定。它並不是 DokuWiki 正常運作所必須,但安裝之後將更方便管理。</p>
-<p>有经验的用户或有特殊需求的用户请参阅更详细的 <a href="http://dokuwiki.org/install">安装指南</a>
-和 <a href="http://dokuwiki.org/config">配置设置</a>。</p> \ No newline at end of file
+<p>有經驗的用戶或有特殊需求的用戶請參閱更詳細的 <a href="http://dokuwiki.org/install">安裝指南</a>
+和 <a href="http://dokuwiki.org/config">配置設定</a>。</p> \ No newline at end of file
diff --git a/inc/lang/zh-tw/lang.php b/inc/lang/zh-tw/lang.php
index eca7de4c8..074c510e9 100644
--- a/inc/lang/zh-tw/lang.php
+++ b/inc/lang/zh-tw/lang.php
@@ -7,8 +7,9 @@
* @author Li-Jiun Huang <ljhuang.tw@gmail.com>
* @author http://www.chinese-tools.com/tools/converter-simptrad.html
* @author Wayne San <waynesan@zerozone.tw>
- * @author Li-Jiun Huang <ljhuang.tw@gmai.com>
* @author Cheng-Wei Chien <e.cwchien@gmail.com>
+ * @author Danny Lin
+ * @author Shuo-Ting Jian <shoting@gmail.com>
*/
$lang['encoding'] = 'utf-8';
$lang['direction'] = 'ltr';
@@ -18,7 +19,7 @@ $lang['singlequoteopening'] = '‘';
$lang['singlequoteclosing'] = '’';
$lang['apostrophe'] = '’';
$lang['btn_edit'] = '編修本頁';
-$lang['btn_source'] = '顯示頁面來源';
+$lang['btn_source'] = '顯示原始碼';
$lang['btn_show'] = '顯示頁面';
$lang['btn_create'] = '建立此頁';
$lang['btn_search'] = '搜尋';
@@ -31,7 +32,7 @@ $lang['btn_revs'] = '舊版';
$lang['btn_recent'] = '最近更新';
$lang['btn_upload'] = '上傳';
$lang['btn_cancel'] = '取消';
-$lang['btn_index'] = '索引頁';
+$lang['btn_index'] = '站台地圖';
$lang['btn_secedit'] = '改這段';
$lang['btn_login'] = '登入';
$lang['btn_logout'] = '登出';
@@ -42,9 +43,6 @@ $lang['btn_back'] = '回上一步';
$lang['btn_backlink'] = '反向連結';
$lang['btn_backtomedia'] = '重新選擇圖檔';
$lang['btn_subscribe'] = '訂閱更動通知';
-$lang['btn_unsubscribe'] = '退訂更動通知';
-$lang['btn_subscribens'] = '訂閱命名空間更改';
-$lang['btn_unsubscribens'] = '退訂命名空間更改';
$lang['btn_profile'] = '更新個人資料';
$lang['btn_reset'] = '資料重設';
$lang['btn_resendpwd'] = '寄新密碼';
@@ -52,108 +50,135 @@ $lang['btn_draft'] = '編輯草稿';
$lang['btn_recover'] = '復原草稿';
$lang['btn_draftdel'] = '捨棄草稿';
$lang['btn_revert'] = '復原';
+$lang['btn_register'] = '註冊';
$lang['loggedinas'] = '登入為';
$lang['user'] = '帳號';
$lang['pass'] = '密碼';
-$lang['newpass'] = '新的密碼';
-$lang['oldpass'] = '目前的密碼';
-$lang['passchk'] = '再次打新的密碼';
+$lang['newpass'] = '新密碼';
+$lang['oldpass'] = '目前密碼';
+$lang['passchk'] = '確認密碼';
$lang['remember'] = '記住帳號密碼';
-$lang['fullname'] = '暱稱';
+$lang['fullname'] = '真實姓名';
$lang['email'] = 'E-Mail';
-$lang['register'] = '註冊';
$lang['profile'] = '使用者個人資料';
$lang['badlogin'] = '很抱歉,您的使用者名稱或密碼可能有錯誤';
-$lang['minoredit'] = '次要性的修改';
-$lang['draftdate'] = '草稿自動存檔於';
-$lang['nosecedit'] = '此頁面已經同時被修改,部份過時的資料取代了全頁。';
-$lang['regmissing'] = '很抱歉,所有的欄位都要填哦';
-$lang['reguexists'] = '很抱歉,已有人註冊該帳號了喔';
-$lang['regsuccess'] = '使用者已建立,密碼已經用 email 寄到您信箱了唷。';
+$lang['minoredit'] = '小修改';
+$lang['draftdate'] = '草稿已自動存檔於';
+$lang['nosecedit'] = '頁面在這之間已被修改,過時的區段資料已載入全頁取代。';
+$lang['regmissing'] = '很抱歉,所有欄位都要填寫';
+$lang['reguexists'] = '很抱歉,本帳號已被註冊';
+$lang['regsuccess'] = '使用者已建立,密碼已寄發至該 email。';
$lang['regsuccess2'] = '使用者已建立';
-$lang['regmailfail'] = '寄出密碼信似乎發生錯誤,請跟管理者聯絡!';
-$lang['regbadmail'] = '您輸入的 email 似乎不對,如果您認為是正確的,請與管理者聯絡。';
-$lang['regbadpass'] = '兩次打的密碼不一致,請再重試,謝謝。';
+$lang['regmailfail'] = '寄出密碼信似乎發生錯誤,請跟管理員聯絡!';
+$lang['regbadmail'] = '您輸入的 email 似乎不對,如果您認為是正確的,請與管理員聯絡。';
+$lang['regbadpass'] = '兩次輸入的密碼不一致,請再試一次。';
$lang['regpwmail'] = '您的 DokuWiki 帳號密碼';
-$lang['reghere'] = '您還沒有帳號對吧?來註冊一個吧。';
-$lang['profna'] = '本 wiki 不開放修改個人資料';
+$lang['reghere'] = '您還沒有帳號嗎?註冊一個吧。';
+$lang['profna'] = '本維基不開放修改個人資料';
$lang['profnochange'] = '未做任何變更';
-$lang['profnoempty'] = '帳號或 email 地址不可以沒有寫喔!';
+$lang['profnoempty'] = '帳號或 email 地址不可空白!';
$lang['profchanged'] = '個人資料已成功更新囉。';
-$lang['pwdforget'] = '忘記密碼嗎?寄新密碼!';
-$lang['resendna'] = '本 wiki 不開放重寄新密碼';
+$lang['pwdforget'] = '忘記密碼了?索取新密碼!';
+$lang['resendna'] = '本維基不開放重寄密碼';
$lang['resendpwd'] = '寄新密碼給';
-$lang['resendpwdmissing'] = '很抱歉,您必須全填這些資料才可以';
-$lang['resendpwdnouser'] = '很抱歉,資料庫內查無此人';
-$lang['resendpwdbadauth'] = '對不起,該認証碼錯誤。請使用完整的確認鏈接。';
-$lang['resendpwdconfirm'] = '確認鏈接已經通過郵件發送給您了。';
-$lang['resendpwdsuccess'] = '新密碼函已經以 email 寄出了。';
-$lang['license'] = '如未特別註明,此 wiki 上得內容都是根據以下的授權方式:';
-$lang['licenseok'] = '注意:編輯此頁面表示你已同意以下的授權方式:';
+$lang['resendpwdmissing'] = '抱歉,您必須填寫所有欄位。';
+$lang['resendpwdnouser'] = '抱歉,資料庫內找不到這個使用者';
+$lang['resendpwdbadauth'] = '抱歉,認證碼無效。請確認您使用了完整的確認連結。';
+$lang['resendpwdconfirm'] = '確認連結已通過郵件發送給您了。';
+$lang['resendpwdsuccess'] = '您的新密碼已寄出。';
+$lang['license'] = '若未特別註明,此維基上的內容都是採用以下授權方式:';
+$lang['licenseok'] = '注意:編輯此頁面表示您已同意以下的授權方式:';
$lang['searchmedia'] = '搜尋檔名:';
$lang['searchmedia_in'] = '在 %s 裡搜尋';
$lang['txt_upload'] = '請選擇要上傳的檔案';
-$lang['txt_filename'] = '請輸入要存在 wiki 內的檔案名稱 (非必要)';
+$lang['txt_filename'] = '請輸入要存在維基內的檔案名稱 (非必要)';
$lang['txt_overwrt'] = '是否要覆蓋原有檔案';
$lang['lockedby'] = '目前已被下列人員鎖定';
$lang['lockexpire'] = '預計解除鎖定於';
-$lang['willexpire'] = '您目前編輯這頁的鎖定將會在一分鐘內解除。\若要避免發生意外,請按「預覽」鍵來重新設定鎖定狀態';
-$lang['js']['notsavedyet'] = "有尚未儲存的變更將會遺失。\n真的要繼續嗎?";
-$lang['rssfailed'] = '當抓取餵送過來的 RSS 資料時發生錯誤: ';
-$lang['nothingfound'] = '沒找到任何結果。';
-$lang['mediaselect'] = '選擇圖檔';
-$lang['fileupload'] = '上傳圖檔';
-$lang['uploadsucc'] = '上傳成功';
-$lang['uploadfail'] = '上傳失敗。或許權限設定錯誤了嗎?';
-$lang['uploadwrong'] = '拒絕上傳。該檔案類型不被支援。';
-$lang['uploadexist'] = '該檔案已有存在了喔,故取消上傳動作。';
-$lang['uploadbadcontent'] = '上傳檔案的內容不符合 %s 檔的副檔名';
-$lang['uploadspam'] = '被SPAM黑名單限制上傳';
-$lang['uploadxss'] = '因為可能惡意的內容被限制上傳';
-$lang['uploadsize'] = '上傳的檔案尺寸過大(最大:%s)';
-$lang['deletesucc'] = '"%s" 檔已刪除完畢。';
-$lang['deletefail'] = '"%s" 檔無法刪除,請先檢查權限設定。';
-$lang['mediainuse'] = '"%s" 檔因還在使用中,故目前尚無法刪除。';
-$lang['namespaces'] = '命名空間';
-$lang['mediafiles'] = '可用的檔案有';
+$lang['willexpire'] = '本頁的編輯鎖定將在一分鐘內到期。要避免發生衝突,請按「預覽」鍵重設鎖定計時。';
+$lang['js']['notsavedyet'] = '未儲存的變更將會遺失,繼續嗎?';
$lang['js']['searchmedia'] = '搜尋檔案';
-$lang['js']['keepopen'] = '於選擇時保持視窗開啟';
+$lang['js']['keepopen'] = '選擇時保持視窗開啟';
$lang['js']['hidedetails'] = '隱藏詳細內容';
+$lang['js']['mediatitle'] = '連結設定';
+$lang['js']['mediadisplay'] = '連結類型';
+$lang['js']['mediaalign'] = '校正';
+$lang['js']['mediasize'] = '圖像大小';
+$lang['js']['mediatarget'] = '連結目標';
+$lang['js']['mediaclose'] = '關閉';
+$lang['js']['mediainsert'] = '插入';
+$lang['js']['mediadisplayimg'] = '顯示此圖像';
+$lang['js']['mediadisplaylnk'] = '只顯示連結';
+$lang['js']['mediasmall'] = '小型版本';
+$lang['js']['mediamedium'] = '中型版本';
+$lang['js']['medialarge'] = '大型版本';
+$lang['js']['mediaoriginal'] = '原始版本';
+$lang['js']['medialnk'] = '連向內容頁面';
+$lang['js']['mediadirect'] = '連向原始圖片';
+$lang['js']['medianolnk'] = '不連結';
+$lang['js']['medianolink'] = '不連結圖像';
+$lang['js']['medialeft'] = '圖像靠左對齊';
+$lang['js']['mediaright'] = '圖像靠右對齊';
+$lang['js']['mediacenter'] = '圖像置中對齊';
+$lang['js']['medianoalign'] = '不對齊';
$lang['js']['nosmblinks'] = '只有在 Microsoft IE 下才能執行「連結到 Windows shares」。
-不過您仍可拷貝、複製這連結';
+不過您仍可複製及貼上這個連結';
$lang['js']['linkwiz'] = '建立連結精靈';
-$lang['js']['linkto'] = '連至:';
-$lang['js']['del_confirm'] = '確定要刪除該管理規則?';
+$lang['js']['linkto'] = '連結至:';
+$lang['js']['del_confirm'] = '確定刪除選取的項目?';
$lang['js']['mu_btn'] = '上傳多個檔案';
+$lang['rssfailed'] = '擷取 RSS 饋送檔時發生錯誤:';
+$lang['nothingfound'] = '沒找到任何結果。';
+$lang['mediaselect'] = '媒體檔案';
+$lang['fileupload'] = '上傳媒體檔案';
+$lang['uploadsucc'] = '上傳成功';
+$lang['uploadfail'] = '上傳失敗。似乎是權限錯誤?';
+$lang['uploadwrong'] = '拒絕上傳。這個副檔名被禁止了!';
+$lang['uploadexist'] = '檔案已存在,未處理。';
+$lang['uploadbadcontent'] = '上傳檔案的內容不符合 %s 檔的副檔名';
+$lang['uploadspam'] = '這次的上傳被垃圾訊息黑名單阻檔了。';
+$lang['uploadxss'] = '這次的上傳因可能的惡意的內容而被阻檔。';
+$lang['uploadsize'] = '上傳的檔案太大了 (最大:%s)';
+$lang['deletesucc'] = '檔案 "%s" 已刪除。';
+$lang['deletefail'] = '檔案 "%s" 無法刪除,請檢查權限定。';
+$lang['mediainuse'] = '檔案 "%s" 未刪除,因為它正被使用。';
+$lang['namespaces'] = '命名空間';
+$lang['mediafiles'] = '可用的檔案有';
+$lang['accessdenied'] = '您不被允許檢視此頁面';
$lang['mediausage'] = '使用以下的語法來連結此檔案:';
$lang['mediaview'] = '檢視原始檔案';
$lang['mediaroot'] = 'root';
-$lang['mediaupload'] = '上傳文件至當前的命名空間。要創建次級命名空間,將其名稱加在“上傳並重命名為”文件名的前面,並用英文冒號隔開';
-$lang['mediaextchange'] = '檔案類型已由 .%s 變更為 .%s 囉!';
+$lang['mediaupload'] = '上傳檔案至目前的命名空間。要建立次級命名空間,將其名稱加在「上傳並重命名為」檔案名的前面,並用英文冒號隔開';
+$lang['mediaextchange'] = '檔案類型已由 .%s 變更為 .%s !';
$lang['reference'] = '引用到本頁的,合計有';
-$lang['ref_inuse'] = '這檔還不能刪除,因為還有以下的頁面在使用它:';
-$lang['ref_hidden'] = '有些引用到這個的頁面,您目前還沒有權限可讀取喔。';
+$lang['ref_inuse'] = '此檔案無法刪除,因為它正被以下頁面使用:';
+$lang['ref_hidden'] = '一些參考內容位於您沒有讀取權限的頁面中';
$lang['hits'] = '個符合';
$lang['quickhits'] = '符合的頁面名稱';
-$lang['toc'] = '本頁目錄';
+$lang['toc'] = '目錄表';
$lang['current'] = '目前版本';
$lang['yours'] = '您的版本';
-$lang['diff'] = '顯示跟目前版本的差異';
-$lang['diff2'] = '顯示與選擇版本的差異';
+$lang['diff'] = '顯示與目前版本的差異';
+$lang['diff2'] = '顯示選擇版本間的差異';
+$lang['difflink'] = '連向這個比對檢視';
+$lang['diff_type'] = '檢視差異:';
+$lang['diff_inline'] = '行內';
+$lang['diff_side'] = '並排';
$lang['line'] = '行';
-$lang['breadcrumb'] = '目前的足跡';
-$lang['youarehere'] = '(目前所在位置)';
+$lang['breadcrumb'] = '足跡';
+$lang['youarehere'] = '您在這裡';
$lang['lastmod'] = '上一次變更';
-$lang['by'] = '來自';
+$lang['by'] = '由';
$lang['deleted'] = '移除';
$lang['created'] = '建立';
-$lang['restored'] = '已恢復為舊版';
+$lang['restored'] = '恢復為舊版';
$lang['external_edit'] = '外部編輯';
$lang['summary'] = '編輯摘要';
-$lang['noflash'] = '顯示此內容需要<a href="http://www.adobe.com/products/flashplayer/">Adobe Flash Plugin</a>';
+$lang['noflash'] = '顯示此內容需要 <a href="http://www.adobe.com/products/flashplayer/">Adobe Flash Plugin</a>';
$lang['download'] = '下載程式碼片段';
$lang['mail_newpage'] = '增加的頁面:';
$lang['mail_changed'] = '變更的頁面:';
+$lang['mail_subscribe_list'] = '命名空間中更動的頁面:';
$lang['mail_new_user'] = '新使用者:';
$lang['mail_upload'] = '已上傳檔案:';
$lang['qb_bold'] = '粗體';
@@ -171,20 +196,20 @@ $lang['qb_hs'] = '選擇標題';
$lang['qb_hplus'] = '較大標題';
$lang['qb_hminus'] = '較小標題';
$lang['qb_hequal'] = '同等標題';
-$lang['qb_link'] = 'WIKI內部連結';
-$lang['qb_extlink'] = '連結外部URL';
+$lang['qb_link'] = '內部連結';
+$lang['qb_extlink'] = '外部連結';
$lang['qb_hr'] = '水平線';
-$lang['qb_ol'] = '項目表(數字)';
-$lang['qb_ul'] = '項目表(符號)';
+$lang['qb_ol'] = '有序列表項目';
+$lang['qb_ul'] = '無序列表項目';
$lang['qb_media'] = '加入圖片或檔案';
$lang['qb_sig'] = '插入簽名';
$lang['qb_smileys'] = '表情符號';
$lang['qb_chars'] = '特殊字元';
-$lang['upperns'] = '前往父命名空間';
-$lang['admin_register'] = '新增使用者中';
-$lang['metaedit'] = '更改相片資料(EXIF)';
-$lang['metasaveerr'] = '相片資料(EXIF)儲存失敗喔';
-$lang['metasaveok'] = '相片資料已成功儲存';
+$lang['upperns'] = '前往父層命名空間';
+$lang['admin_register'] = '新增使用者';
+$lang['metaedit'] = '編輯後設資料';
+$lang['metasaveerr'] = '後設資料寫入失敗';
+$lang['metasaveok'] = '後設資料已儲存';
$lang['img_backto'] = '回上一頁';
$lang['img_title'] = '標題';
$lang['img_caption'] = '照片說明';
@@ -196,37 +221,48 @@ $lang['img_copyr'] = '版權';
$lang['img_format'] = '格式';
$lang['img_camera'] = '相機';
$lang['img_keywords'] = '關鍵字';
-$lang['subscribe_success'] = '已將『%s』加入 %s 訂閱清單內';
-$lang['subscribe_error'] = '要把『%s』加入 %s 訂閱清單時,發生錯誤';
-$lang['subscribe_noaddress'] = '您的帳號內並無 Email 資料,因此還無法使用訂閱功能唷。';
-$lang['unsubscribe_success'] = '已將『%s』從 %s 訂閱清單中移除';
-$lang['unsubscribe_error'] = '要把『%s』從 %s 訂閱清單中移除時,發生錯誤';
-$lang['authmodfailed'] = '帳號認證的設定不正確,請通知該 Wiki 管理員。';
-$lang['authtempfail'] = '帳號認證目前暫不提供,若本狀況持續發生的話,請通知該 Wiki 管理員。';
+$lang['subscr_subscribe_success'] = '已將 %s 加入至 %s 的訂閱列表';
+$lang['subscr_subscribe_error'] = '將 %s 加入至 %s 的訂閱列表時發生錯誤';
+$lang['subscr_subscribe_noaddress'] = '沒有與您登入相關的地址,無法將您加入訂閱列表';
+$lang['subscr_unsubscribe_success'] = '已將 %s 移除自 %s 的訂閱列表';
+$lang['subscr_unsubscribe_error'] = '將 %s 移除自 %s 的訂閱列表時發生錯誤';
+$lang['subscr_already_subscribed'] = '%s 已經被 %s 訂閱了';
+$lang['subscr_not_subscribed'] = '%s 尚未被 %s 訂閱';
+$lang['subscr_m_not_subscribed'] = '您尚未訂閱目前的頁面或命名空間。';
+$lang['subscr_m_new_header'] = '加入訂閱';
+$lang['subscr_m_current_header'] = '目前訂閱';
+$lang['subscr_m_unsubscribe'] = '取消訂閱';
+$lang['subscr_m_subscribe'] = '訂閱';
+$lang['subscr_m_receive'] = '接收';
+$lang['subscr_style_every'] = '每次更改都發送信件';
+$lang['subscr_style_digest'] = '對每個頁面發送更改的摘要信件 (每 %.2f 天)';
+$lang['subscr_style_list'] = '自上次發信以來更改的頁面的列表 (每 %.2f 天)';
+$lang['authmodfailed'] = '帳號認證的設定不正確,請通知該維基管理員。';
+$lang['authtempfail'] = '帳號認證目前暫不提供,若本狀況持續發生的話,請通知該維基管理員。';
$lang['i_chooselang'] = '選擇您的語系';
$lang['i_installer'] = 'DokuWiki 安裝工具';
-$lang['i_wikiname'] = 'Wiki名稱';
-$lang['i_enableacl'] = '使用ACL(建議)';
+$lang['i_wikiname'] = '維基名稱';
+$lang['i_enableacl'] = '啟用 ACL (建議)';
$lang['i_superuser'] = '超級用戶';
-$lang['i_problems'] = 'Installer發現一些問題,顯示如下。您將無法繼續直到您修正它們。';
-$lang['i_modified'] = '由於安全上的考慮,該腳本隻能用於全新且做任何改動的 Dokuwiki 安裝包。
- 您可以重新解壓下載的程序包,或查閱完整的
- <a href=\"http://dokuwiki.org/install\">Dokuwiki 安裝指南</a>';
-$lang['i_funcna'] = 'PHP function <code>%s</code> 無法使用. 也許你的主機供應者停用它或是其他原因?';
-$lang['i_phpver'] = '您的 PHP 版本 <code>%s</code> 比所需要的版本 <code>%s</code> 還低. 您需要更新您的PHP.';
-$lang['i_permfail'] = '<code>%s</code> 無法被 DokuWiki 所寫入. 您需要修正該目錄的權限!';
-$lang['i_confexists'] = '<code>%s</code>已經存在';
-$lang['i_writeerr'] = '無法建立 <code>%s</code>. 您必須檢查目錄/檔案的權限並手動建立該檔案.';
-$lang['i_badhash'] = '無法辨識或被變更的dokuwiki.php (hash=<code>%s</code>)';
-$lang['i_badval'] = '<code>%s</code> - 非法或是空的值';
-$lang['i_success'] = '設定已經成功地完成. 您現在可以刪除 install.php 這個檔案. 繼續到
+$lang['i_problems'] = '安裝程式發現如下的問題。您必須修正它們才能繼續。';
+$lang['i_modified'] = '出於安全考量,本腳本只能用於安裝全新且未修改的 Dokuwiki。
+您可以重新解壓下載的封包或查閱完整的<a href=\"http://dokuwiki.org/install\">Dokuwiki 安裝指南</a>';
+$lang['i_funcna'] = 'PHP 函數 <code>%s</code> 無法使用。也許您的主機供應者基於某些理由停用了它?';
+$lang['i_phpver'] = '您的 PHP 版本 <code>%s</code> 比需要的版本 <code>%s</code> 還低。您必須更新您的PHP。';
+$lang['i_permfail'] = '<code>%s</code> 無法被 DokuWiki 寫入。您必須修正該目錄的權限!';
+$lang['i_confexists'] = '<code>%s</code> 已經存在';
+$lang['i_writeerr'] = '無法建立 <code>%s</code>。您必須檢查目錄/檔案的權限並手動建立該檔案。';
+$lang['i_badhash'] = '無法辨識或被變更的 dokuwiki.php (hash=<code>%s</code>)';
+$lang['i_badval'] = '<code>%s</code> - 非法或空白的值';
+$lang['i_success'] = '設定已成功完成。您現在可以刪除 install.php 檔案。繼續到
<a href="doku.php">您的新 DokuWiki</a>.';
-$lang['i_failure'] = '在寫入設定檔時發生了一些錯誤.您必須在使用<a href="doku.php">你的新 Dokuwiki</a> 之前手動修正它們';
-$lang['i_policy'] = '初步的ACL政策';
-$lang['i_pol0'] = '開放的 Wiki (可被任何人讀, 寫, 上傳)';
-$lang['i_pol1'] = '公開的 Wiki (可被任何人讀, 但是只能被註冊的使用者寫與上傳)';
-$lang['i_pol2'] = '封閉的 Wiki (只能被註冊的使用者讀, 寫, 上傳)';
+$lang['i_failure'] = '寫入設定檔時發生了一些錯誤。您必須在使用<a href="doku.php">您的新 Dokuwiki</a> 之前手動修正它們。';
+$lang['i_policy'] = '初步的 ACL 政策';
+$lang['i_pol0'] = '開放的維基 (任何人可讀取、寫入、上傳)';
+$lang['i_pol1'] = '公開的維基 (任何人可讀取,註冊使用者可寫入與上傳)';
+$lang['i_pol2'] = '封閉的維基 (只有註冊使用者可讀取、寫入、上傳)';
$lang['i_retry'] = '重試';
+$lang['i_license'] = '請選擇您想要的內容發布許可協議:';
$lang['mu_intro'] = '您可以在這裡一次上傳多個檔案。按下瀏覽按鈕加入檔案,然後按上傳按鈕開始上傳。';
$lang['mu_gridname'] = '檔案名稱';
$lang['mu_gridsize'] = '檔案大小';
@@ -242,7 +278,7 @@ $lang['mu_progress'] = '@PCT@% 已上傳';
$lang['mu_filetypes'] = '接受的檔案類型';
$lang['mu_info'] = '檔案已上傳。';
$lang['mu_lasterr'] = '最新一筆錯誤紀錄:';
-$lang['recent_global'] = '您正在閱讀命名空間: <b>%s</b> 中的變更。您亦可觀看整個 wiki 的<a href="%s">最近更新</a>。';
+$lang['recent_global'] = '您正在閱讀命名空間: <b>%s</b> 中的變更。您亦可觀看整個維基的<a href="%s">最近更新</a>。';
$lang['years'] = '%d 年前';
$lang['months'] = '%d 個月前';
$lang['weeks'] = '%d 週前';
@@ -250,3 +286,4 @@ $lang['days'] = '%d 天前';
$lang['hours'] = '%d 個小時前';
$lang['minutes'] = '%d 分鐘前';
$lang['seconds'] = '%s 秒鐘前';
+$lang['wordblock'] = '您的更改沒有被儲存,因为它包含被阻擋的文字 (垃圾訊息)。';
diff --git a/inc/lang/zh-tw/locked.txt b/inc/lang/zh-tw/locked.txt
index 16a06e802..e13fdc890 100644
--- a/inc/lang/zh-tw/locked.txt
+++ b/inc/lang/zh-tw/locked.txt
@@ -1,3 +1,3 @@
-====== 頁面目前是鎖定狀態中 ======
+====== 頁面鎖定 ======
-本頁目前正由其他使用者編修中,您必須先等到他完成或者鎖定狀態自動解除。
+本頁目前正由其他使用者編修中,您必須等他完成編輯或等鎖定時間過去。
diff --git a/inc/lang/zh-tw/login.txt b/inc/lang/zh-tw/login.txt
index fda49a199..058cc5712 100644
--- a/inc/lang/zh-tw/login.txt
+++ b/inc/lang/zh-tw/login.txt
@@ -1,5 +1,5 @@
====== 登入 ======
-您尚未登入,請輸入您的使用者名稱跟密碼。 另外,瀏覽器需要打開 cookies 設定以進行登入。
+您尚未登入,請輸入您的使用者名稱和密碼。 另外,瀏覽器需要打開 cookies 設定以進行登入。
diff --git a/inc/lang/zh-tw/mailtext.txt b/inc/lang/zh-tw/mailtext.txt
index f6bb0480e..3b6ece377 100644
--- a/inc/lang/zh-tw/mailtext.txt
+++ b/inc/lang/zh-tw/mailtext.txt
@@ -1,16 +1,17 @@
-在您的 DokuWiki 有新增、變動過一頁了。以下是細節資料:
+您的 DokuWiki 有個新增或變動的頁面。詳細資料如下:
-日期 : @DATE@
-瀏覽器 : @BROWSER@
-IP-Address : @IPADDRESS@
-機器名稱 : @HOSTNAME@
-舊版次 : @OLDPAGE@
-新版次 : @NEWPAGE@
-編輯摘要 : @SUMMARY@
-User : @USER@
+日期 : @DATE@
+瀏覽器 : @BROWSER@
+IP位址 : @IPADDRESS@
+主機名稱 : @HOSTNAME@
+舊版本 : @OLDPAGE@
+新版本 : @NEWPAGE@
+編輯摘要 : @SUMMARY@
+使用者 : @USER@
@DIFF@
---
-這封信是由 @DOKUWIKIURL@ 的 DokuWiki 自動產生
+--
+本信件由以下 DokuWiki 站台產生:
+@DOKUWIKIURL@
diff --git a/inc/lang/zh-tw/newpage.txt b/inc/lang/zh-tw/newpage.txt
index bd38f5586..06ccd3d75 100644
--- a/inc/lang/zh-tw/newpage.txt
+++ b/inc/lang/zh-tw/newpage.txt
@@ -1,3 +1,3 @@
-====== 目前尚未有該主題喔 ======
+====== 此主題不存在 ======
-您目前到的這主題尚未建立頁面。但也可以用 「''建立此頁''」來建立。 \ No newline at end of file
+您來到了一個未建立頁面的主題。如果權限允許,您可以用 「建立此頁」按鈕建立頁面。 \ No newline at end of file
diff --git a/inc/lang/zh-tw/norev.txt b/inc/lang/zh-tw/norev.txt
index e2b6a175b..bd1c7a623 100644
--- a/inc/lang/zh-tw/norev.txt
+++ b/inc/lang/zh-tw/norev.txt
@@ -1,4 +1,3 @@
-====== 很抱歉,並無該版次的 ======
-
-該版次的文件並不存在。請用 「''舊版''」 鍵來檢視目前該文件的所有舊版次。
+====== 無此版本 ======
+該版本的文件不存在。請用 「舊版」按鈕檢視該文件所有舊版本清單。 \ No newline at end of file
diff --git a/inc/lang/zh-tw/password.txt b/inc/lang/zh-tw/password.txt
index 14edb6016..5d383b528 100644
--- a/inc/lang/zh-tw/password.txt
+++ b/inc/lang/zh-tw/password.txt
@@ -1,11 +1,10 @@
-(NOTE: This mail is an UTF-8 encoding email)
+@FULLNAME@ 您好!
-嗨,@LOGIN@(@FULLNAME@) 您好!
+這是您在位於 @DOKUWIKIURL@ 之 @TITLE@ 的使用者資料
-這裡是您在 @TITLE@(@DOKUWIKIURL@) 的使用者資料
+帳號 : @LOGIN@
+密碼 : @PASSWORD@
-使用者名稱: @LOGIN@
-   密碼: @PASSWORD@
-
---
-這封信是由 @DOKUWIKIURL@ 的 DokuWiki 自動產生。
+--
+本信件由以下 DokuWiki 站台產生:
+@DOKUWIKIURL@
diff --git a/inc/lang/zh-tw/pwconfirm.txt b/inc/lang/zh-tw/pwconfirm.txt
index b8ad7e1ed..994367980 100644
--- a/inc/lang/zh-tw/pwconfirm.txt
+++ b/inc/lang/zh-tw/pwconfirm.txt
@@ -1,13 +1,13 @@
@FULLNAME@ 您好!
-有人請求為您在 @DOKUWIKIURL@ 注冊的用戶名 @TITLE@ 發送新密碼
+有人為您在 @DOKUWIKIURL@ 註冊的使用者 @TITLE@ 請求新密碼
-如果您沒有請求發送新密碼,請忽略這封郵件。
+如果您沒有請求新密碼,請忽略這封郵件。
-為了確認發送新密碼請求的確來自您,請使用下面的鏈接。
+要確認使用新密碼,請拜訪以下的連結。
@CONFIRM@
---
-本郵件由 DokuWiki 自動創建
-@DOKUWIKIURL@ \ No newline at end of file
+--
+本信件由以下 DokuWiki 站台產生:
+@DOKUWIKIURL@
diff --git a/inc/lang/zh-tw/read.txt b/inc/lang/zh-tw/read.txt
index 364f4adea..a8305611f 100644
--- a/inc/lang/zh-tw/read.txt
+++ b/inc/lang/zh-tw/read.txt
@@ -1,3 +1 @@
-本頁是唯讀的,可以看是怎麼寫的,但不能更動它。如這是誤判,請向管理員詢問。
-
-
+本頁是唯讀的,您可以看到原始碼,但不能更動它。您如果覺得這是誤判,請詢問管理員。 \ No newline at end of file
diff --git a/inc/lang/zh-tw/register.txt b/inc/lang/zh-tw/register.txt
index 1a5ec67e7..0da401ccd 100644
--- a/inc/lang/zh-tw/register.txt
+++ b/inc/lang/zh-tw/register.txt
@@ -1,4 +1,4 @@
====== 註冊新使用者 ======
-請填以下欄位的資料來註冊 wiki 帳號,\\ 還有請確定您有提供一個 **合法的 e-mail 地址** - 也就是您的新密碼會被寄到那。\\ 而登錄的使用者名稱應該是合法的。 [[doku>pagename|pagename]].
+填寫以下資料以註冊維基帳號,請確定您提供的是**合法的 email 地址**-如果這裡沒要求您填寫密碼,您的新密碼會自動產生並寄送到該地址。登錄名稱必須是合法的[[doku>pagename|頁面名稱]]。
diff --git a/inc/lang/zh-tw/registermail.txt b/inc/lang/zh-tw/registermail.txt
index 434f4f877..489e3f9d3 100644
--- a/inc/lang/zh-tw/registermail.txt
+++ b/inc/lang/zh-tw/registermail.txt
@@ -1,13 +1,14 @@
-一個新使用者已經註冊. 以下是詳細內容:
+有新的使用者註冊。詳細資料如下:
-帳號 : @NEWUSER@
-全名 : @NEWNAME@
-E-mail : @NEWEMAIL@
+帳號 : @NEWUSER@
+姓名 : @NEWNAME@
+E-mail : @NEWEMAIL@
-日期 : @DATE@
-瀏覽器 : @BROWSER@
-IP-Address : @IPADDRESS@
-Hostname : @HOSTNAME@
+日期 : @DATE@
+瀏覽器 : @BROWSER@
+IP位址 : @IPADDRESS@
+主機名稱 : @HOSTNAME@
---
-這封信是由 @DOKUWIKIURL@ 的 DokuWiki 所產生的 \ No newline at end of file
+--
+本信件由以下 DokuWiki 站台產生:
+@DOKUWIKIURL@
diff --git a/inc/lang/zh-tw/resendpwd.txt b/inc/lang/zh-tw/resendpwd.txt
index 9250bf4e0..3dbfad750 100644
--- a/inc/lang/zh-tw/resendpwd.txt
+++ b/inc/lang/zh-tw/resendpwd.txt
@@ -1,3 +1,3 @@
====== 寄送新密碼 ======
-請在下面的欄位填上資料,以便重新寄發新的 wiki 密碼到您註冊時所填的 email 地址。 帳號(user name)就是你的 wiki 帳號。
+請在以下欄位輸入您的帳號,新密碼將會寄送到您註冊時填寫的 email 地址。
diff --git a/inc/lang/zh-tw/searchpage.txt b/inc/lang/zh-tw/searchpage.txt
index 9f3d8ee94..e0f04c433 100644
--- a/inc/lang/zh-tw/searchpage.txt
+++ b/inc/lang/zh-tw/searchpage.txt
@@ -1,5 +1,5 @@
====== 搜尋精靈 ======
-提示:您可以在下列找到您的搜尋結果。若沒找到妳想找的東西,那麼可以在妳查詢之後用「建立此頁」來建立新的頁面哦。
+提示:您可以在下面找到您的搜尋結果。若沒找到您想要的,可按下按鈕建立或編輯和查詢關鍵字同名的頁面。
===== 搜尋結果 =====
diff --git a/inc/lang/zh-tw/showrev.txt b/inc/lang/zh-tw/showrev.txt
index 35b6aa59f..306aa6ea7 100644
--- a/inc/lang/zh-tw/showrev.txt
+++ b/inc/lang/zh-tw/showrev.txt
@@ -1,2 +1,2 @@
-**這是本文件的舊版了喔!**
+**這是本文件的舊版!**
----
diff --git a/inc/lang/zh-tw/subscr_digest.txt b/inc/lang/zh-tw/subscr_digest.txt
new file mode 100644
index 000000000..a26e73050
--- /dev/null
+++ b/inc/lang/zh-tw/subscr_digest.txt
@@ -0,0 +1,19 @@
+您好!
+
+維基 @TITLE@ 的頁面 @PAGE@ 已更改。
+更改內容如下:
+
+--------------------------------------------------------
+@DIFF@
+--------------------------------------------------------
+
+舊版本:@OLDPAGE@
+新版本:@NEWPAGE@
+
+要取消頁面提醒,請登入維基 @DOKUWIKIURL@
+然後拜訪 @SUBSCRIBE@
+並取消訂閱頁面或命名空間的更改。
+
+--
+本信件由以下 DokuWiki 站台產生:
+@DOKUWIKIURL@
diff --git a/inc/lang/zh-tw/subscr_form.txt b/inc/lang/zh-tw/subscr_form.txt
new file mode 100644
index 000000000..0ad675cc8
--- /dev/null
+++ b/inc/lang/zh-tw/subscr_form.txt
@@ -0,0 +1,3 @@
+====== 訂閱管理 ======
+
+這個頁面允許您管理在目前頁面和命名空間的訂閱。 \ No newline at end of file
diff --git a/inc/lang/zh-tw/subscr_list.txt b/inc/lang/zh-tw/subscr_list.txt
new file mode 100644
index 000000000..2a1b26c6e
--- /dev/null
+++ b/inc/lang/zh-tw/subscr_list.txt
@@ -0,0 +1,16 @@
+您好!
+
+維基 @TITLE@ 的 @PAGE@ 命名空間的頁面已更改。
+更改內容如下:
+
+--------------------------------------------------------
+@DIFF@
+--------------------------------------------------------
+
+要取消頁面提醒,請登入維基 @DOKUWIKIURL@
+然後拜訪 @SUBSCRIBE@
+並取消訂閱頁面或命名空間的更改。
+
+--
+本信件由以下 DokuWiki 站台產生:
+@DOKUWIKIURL@
diff --git a/inc/lang/zh-tw/subscr_single.txt b/inc/lang/zh-tw/subscr_single.txt
new file mode 100644
index 000000000..f3c623c5c
--- /dev/null
+++ b/inc/lang/zh-tw/subscr_single.txt
@@ -0,0 +1,22 @@
+您好!
+
+維基 @TITLE@ 的頁面 @PAGE@ 已更改。
+更改內容如下:
+
+--------------------------------------------------------
+@DIFF@
+--------------------------------------------------------
+
+時間 : @DATE@
+使用者 : @USER@
+編輯摘要 : @SUMMARY@
+舊版本 : @OLDPAGE@
+新版本 : @NEWPAGE@
+
+要取消頁面提醒,請登入維基 @DOKUWIKIURL@
+然後拜訪 @NEWPAGE@
+並取消訂閱頁面或命名空間的更改。
+
+--
+本信件由以下 DokuWiki 站台產生:
+@DOKUWIKIURL@
diff --git a/inc/lang/zh-tw/updateprofile.txt b/inc/lang/zh-tw/updateprofile.txt
index f92c215ea..47f2ae1c4 100644
--- a/inc/lang/zh-tw/updateprofile.txt
+++ b/inc/lang/zh-tw/updateprofile.txt
@@ -1,5 +1,3 @@
====== 更新個人資料 ======
-請注意:只需變更想更新的資料欄位就好,而帳號名稱是不可以變更的。
-
-
+您只需變更想更新的欄位就好,帳號名稱不能變更。 \ No newline at end of file
diff --git a/inc/lang/zh-tw/uploadmail.txt b/inc/lang/zh-tw/uploadmail.txt
index e7222959b..b4c1311ba 100644
--- a/inc/lang/zh-tw/uploadmail.txt
+++ b/inc/lang/zh-tw/uploadmail.txt
@@ -1,13 +1,14 @@
-一個檔案已經被上傳到您的 DokuWiki. 以下是詳細內容:
+有人把檔案上傳到您的 DokuWiki。詳細資料如下:
-檔名 : @MEDIA@
-日期 : @DATE@
-瀏覽器 : @BROWSER@
-IP-Address : @IPADDRESS@
-Hostname : @HOSTNAME@
-尺寸 : @SIZE@
-MIME Type : @MIME@
-帳號 : @USER@
+檔名 : @MEDIA@
+日期 : @DATE@
+瀏覽器 : @BROWSER@
+IP位址 : @IPADDRESS@
+主機名稱 : @HOSTNAME@
+大小 : @SIZE@
+MIME類型 : @MIME@
+使用者 : @USER@
---
-這封信是由 @DOKUWIKIURL@ 的 DokuWiki 所產生的 \ No newline at end of file
+--
+本信件由以下 DokuWiki 站台產生:
+@DOKUWIKIURL@
diff --git a/inc/lang/zh/lang.php b/inc/lang/zh/lang.php
index f819aff9a..14c92c4b3 100644
--- a/inc/lang/zh/lang.php
+++ b/inc/lang/zh/lang.php
@@ -5,12 +5,14 @@
* @license GPL 2 (http://www.gnu.org/licenses/gpl.html)
* @author ZDYX <zhangduyixiong@gmail.com>
* @author http://www.chinese-tools.com/tools/converter-tradsimp.html
- * @author George Sheraton guxd@163.com
+ * @author George Sheraton <guxd@163.com>
* @author Simon zhan <simonzhan@21cn.com>
* @author mr.jinyi@gmail.com
* @author ben <ben@livetom.com>
* @author lainme <lainme993@gmail.com>
* @author caii <zhoucaiqi@gmail.com>
+ * @author Hiphen Lee <jacob.b.leung@gmail.com>
+ * @author caii, patent agent in China <zhoucaiqi@gmail.com>
*/
$lang['encoding'] = 'utf-8';
$lang['direction'] = 'ltr';
@@ -33,7 +35,7 @@ $lang['btn_revs'] = '修订记录';
$lang['btn_recent'] = '最近更改';
$lang['btn_upload'] = '上传';
$lang['btn_cancel'] = '取消';
-$lang['btn_index'] = '索引';
+$lang['btn_index'] = '网站地图';
$lang['btn_secedit'] = '编辑';
$lang['btn_login'] = '登录';
$lang['btn_logout'] = '退出';
@@ -51,6 +53,7 @@ $lang['btn_draft'] = '编辑草稿';
$lang['btn_recover'] = '恢复草稿';
$lang['btn_draftdel'] = '删除草稿';
$lang['btn_revert'] = '恢复';
+$lang['btn_register'] = '注册';
$lang['loggedinas'] = '登录为';
$lang['user'] = '用户名';
$lang['pass'] = '密码';
@@ -60,7 +63,6 @@ $lang['passchk'] = '请再输一次';
$lang['remember'] = '记住我';
$lang['fullname'] = '全名';
$lang['email'] = 'E-Mail';
-$lang['register'] = '注册';
$lang['profile'] = '用户信息';
$lang['badlogin'] = '对不起,用户名或密码错误。';
$lang['minoredit'] = '细微修改';
@@ -163,6 +165,9 @@ $lang['yours'] = '您的版本';
$lang['diff'] = '显示与当前版本的差别';
$lang['diff2'] = '显示跟目前版本的差异';
$lang['difflink'] = '到此差别页面的链接';
+$lang['diff_type'] = '查看差异:';
+$lang['diff_inline'] = '行内显示';
+$lang['diff_side'] = '并排显示';
$lang['line'] = '行';
$lang['breadcrumb'] = '您的足迹';
$lang['youarehere'] = '您在这里';
diff --git a/inc/load.php b/inc/load.php
index 478ee7c76..d30397f6e 100644
--- a/inc/load.php
+++ b/inc/load.php
@@ -43,7 +43,7 @@ require_once(DOKU_INC.'inc/auth.php');
* require()s their associated php files when an object is instantiated.
*
* @author Andreas Gohr <andi@splitbrain.org>
- * @todo add generic loading of plugins and other generically named classes
+ * @todo add generic loading of renderers and auth backends
*/
function load_autoload($name){
static $classes = null;
@@ -75,6 +75,7 @@ function load_autoload($name){
'Doku_Parser_Mode' => DOKU_INC.'inc/parser/parser.php',
'SafeFN' => DOKU_INC.'inc/SafeFN.class.php',
'Sitemapper' => DOKU_INC.'inc/Sitemapper.php',
+ 'PassHash' => DOKU_INC.'inc/PassHash.class.php',
'DokuWiki_Action_Plugin' => DOKU_PLUGIN.'action.php',
'DokuWiki_Admin_Plugin' => DOKU_PLUGIN.'admin.php',
@@ -86,5 +87,16 @@ function load_autoload($name){
require_once($classes[$name]);
return;
}
+
+ // Plugin loading
+ if(preg_match('/^(helper|syntax|action|admin|renderer)_plugin_([^_]+)(?:_([^_]+))?$/',
+ $name, $m)) {
+ //try to load the wanted plugin file
+ // include, but be silent. Maybe some other autoloader has an idea
+ // how to load this class.
+ $c = ((count($m) === 4) ? "/{$m[3]}" : '');
+ @include DOKU_PLUGIN . "{$m[2]}/{$m[1]}$c.php";
+ return;
+ }
}
diff --git a/inc/mail.php b/inc/mail.php
index e1f327cfe..01b2895e1 100644
--- a/inc/mail.php
+++ b/inc/mail.php
@@ -11,7 +11,6 @@ if(!defined('DOKU_INC')) die('meh.');
// end of line for mail lines - RFC822 says CRLF but postfix (and other MTAs?)
// think different
if(!defined('MAILHEADER_EOL')) define('MAILHEADER_EOL',"\n");
-if(!defined('QUOTEDPRINTABLE_EOL')) define('QUOTEDPRINTABLE_EOL',"\015\012");
#define('MAILHEADER_ASCIIONLY',1);
/**
@@ -105,6 +104,9 @@ function _mail_send_action($data) {
$headers = isset($data['headers']) ? $data['headers'] : null;
$params = isset($data['params']) ? $data['params'] : null;
+ // discard mail request if no recipients are available
+ if(trim($to) === '' && trim($cc) === '' && trim($bcc) === '') return false;
+
// end additional code to support event ... original mail_send() code from here
if(defined('MAILHEADER_ASCIIONLY')){
@@ -113,9 +115,16 @@ function _mail_send_action($data) {
}
if(!utf8_isASCII($subject)) {
- $subject = '=?UTF-8?Q?'.mail_quotedprintable_encode($subject,0).'?=';
+ $enc_subj = '=?UTF-8?Q?'.mail_quotedprintable_encode($subject,0).'?=';
// Spaces must be encoded according to rfc2047. Use the "_" shorthand
- $subject = preg_replace('/ /', '_', $subject);
+ $enc_subj = preg_replace('/ /', '_', $enc_subj);
+
+ // quoted printable has length restriction, use base64 if needed
+ if(strlen($subject) > 74){
+ $enc_subj = '=?UTF-8?B?'.base64_encode($subject).'?=';
+ }
+
+ $subject = $enc_subj;
}
$header = '';
@@ -197,7 +206,16 @@ function mail_encode_address($string,$header='',$names=true){
}
if(!utf8_isASCII($text)){
- $text = '=?UTF-8?Q?'.mail_quotedprintable_encode($text,0).'?=';
+ // put the quotes outside as in =?UTF-8?Q?"Elan Ruusam=C3=A4e"?= vs "=?UTF-8?Q?Elan Ruusam=C3=A4e?="
+ if (preg_match('/^"(.+)"$/', $text, $matches)) {
+ $text = '"=?UTF-8?Q?'.mail_quotedprintable_encode($matches[1], 0).'?="';
+ } else {
+ $text = '=?UTF-8?Q?'.mail_quotedprintable_encode($text, 0).'?=';
+ }
+ // additionally the space character should be encoded as =20 (or each
+ // word QP encoded separately).
+ // however this is needed only in mail headers, not globally in mail_quotedprintable_encode().
+ $text = str_replace(" ", "=20", $text);
}
}else{
$text = '';
@@ -227,6 +245,7 @@ function mail_encode_address($string,$header='',$names=true){
*/
function mail_isvalid($email){
$validator = new EmailAddressValidator;
+ $validator->allowLocalAddresses = true;
return $validator->check_email_address($email);
}
@@ -289,11 +308,11 @@ function mail_quotedprintable_encode($sText,$maxlen=74,$bEmulate_imap_8bit=true)
// but this wouldn't be caught by such an easy RegExp
if($maxlen){
preg_match_all( '/.{1,'.($maxlen - 2).'}([^=]{0,2})?/', $sLine, $aMatch );
- $sLine = implode( '=' . QUOTEDPRINTABLE_EOL, $aMatch[0] ); // add soft crlf's
+ $sLine = implode( '=' . MAILHEADER_EOL, $aMatch[0] ); // add soft crlf's
}
}
// join lines into text
- return implode(QUOTEDPRINTABLE_EOL,$aLines);
+ return implode(MAILHEADER_EOL,$aLines);
}
diff --git a/inc/media.php b/inc/media.php
index 69441352b..731ba1668 100644
--- a/inc/media.php
+++ b/inc/media.php
@@ -141,7 +141,7 @@ function media_metaform($id,$auth){
}
/**
- * Conveinience function to check if a media file is still in use
+ * Convenience function to check if a media file is still in use
*
* @author Michael Klier <chi@chimeric.de>
*/
@@ -160,19 +160,26 @@ function media_inuse($id) {
}
}
+define('DOKU_MEDIA_DELETED', 1);
+define('DOKU_MEDIA_NOT_AUTH', 2);
+define('DOKU_MEDIA_INUSE', 4);
+define('DOKU_MEDIA_EMPTY_NS', 8);
+
/**
* Handles media file deletions
*
* If configured, checks for media references before deletion
*
* @author Andreas Gohr <andi@splitbrain.org>
- * @return mixed false on error, true on delete or array with refs
+ * @return int One of: 0,
+ DOKU_MEDIA_DELETED,
+ DOKU_MEDIA_DELETED | DOKU_MEDIA_EMPTY_NS,
+ DOKU_MEDIA_NOT_AUTH,
+ DOKU_MEDIA_INUSE
*/
function media_delete($id,$auth){
- if($auth < AUTH_DELETE) return false;
- if(!checkSecurityToken()) return false;
- global $conf;
- global $lang;
+ if($auth < AUTH_DELETE) return DOKU_MEDIA_NOT_AUTH;
+ if(media_inuse($id)) return DOKU_MEDIA_INUSE;
$file = mediaFN($id);
@@ -196,38 +203,22 @@ function media_delete($id,$auth){
unset($evt);
if($data['unl'] && $data['del']){
- // current namespace was removed. redirecting to root ns passing msg along
- send_redirect(DOKU_URL.'lib/exe/mediamanager.php?msg1='.
- rawurlencode(sprintf(noNS($id),$lang['deletesucc'])));
+ return DOKU_MEDIA_DELETED | DOKU_MEDIA_EMPTY_NS;
}
- return $data['unl'];
+ return $data['unl'] ? DOKU_MEDIA_DELETED : 0;
}
/**
* Handles media file uploads
*
- * This generates an action event and delegates to _media_upload_action().
- * Action plugins are allowed to pre/postprocess the uploaded file.
- * (The triggered event is preventable.)
- *
- * Event data:
- * $data[0] fn_tmp: the temporary file name (read from $_FILES)
- * $data[1] fn: the file name of the uploaded file
- * $data[2] id: the future directory id of the uploaded file
- * $data[3] imime: the mimetype of the uploaded file
- * $data[4] overwrite: if an existing file is going to be overwritten
- *
- * @triggers MEDIA_UPLOAD_FINISH
* @author Andreas Gohr <andi@splitbrain.org>
* @author Michael Klier <chi@chimeric.de>
* @return mixed false on error, id of the new file on success
*/
function media_upload($ns,$auth){
- if($auth < AUTH_UPLOAD) return false;
if(!checkSecurityToken()) return false;
global $lang;
- global $conf;
// get file and id
$id = $_POST['id'];
@@ -249,8 +240,50 @@ function media_upload($ns,$auth){
msg(sprintf($lang['mediaextchange'],$fext,$iext));
}
+ $res = media_save(array('name' => $file['tmp_name'],
+ 'mime' => $imime,
+ 'ext' => $iext), $ns.':'.$id,
+ $_REQUEST['ow'], $auth, 'move_uploaded_file');
+ if (is_array($res)) {
+ msg($res[0], $res[1]);
+ return false;
+ }
+ return $res;
+}
+
+/**
+ * This generates an action event and delegates to _media_upload_action().
+ * Action plugins are allowed to pre/postprocess the uploaded file.
+ * (The triggered event is preventable.)
+ *
+ * Event data:
+ * $data[0] fn_tmp: the temporary file name (read from $_FILES)
+ * $data[1] fn: the file name of the uploaded file
+ * $data[2] id: the future directory id of the uploaded file
+ * $data[3] imime: the mimetype of the uploaded file
+ * $data[4] overwrite: if an existing file is going to be overwritten
+ *
+ * @triggers MEDIA_UPLOAD_FINISH
+ */
+function media_save($file, $id, $ow, $auth, $move) {
+ if($auth < AUTH_UPLOAD) {
+ return array("You don't have permissions to upload files.", -1);
+ }
+
+ if (!isset($file['mime']) || !isset($file['ext'])) {
+ list($ext, $mime) = mimetype($id);
+ if (!isset($file['mime'])) {
+ $file['mime'] = $mime;
+ }
+ if (!isset($file['ext'])) {
+ $file['ext'] = $ext;
+ }
+ }
+
+ global $lang;
+
// get filename
- $id = cleanID($ns.':'.$id,false,true);
+ $id = cleanID($id,false,true);
$fn = mediaFN($id);
// get filetype regexp
@@ -259,40 +292,35 @@ function media_upload($ns,$auth){
$regex = join('|',$types);
// because a temp file was created already
- if(preg_match('/\.('.$regex.')$/i',$fn)){
- //check for overwrite
- $overwrite = @file_exists($fn);
- if($overwrite && (!$_REQUEST['ow'] || $auth < AUTH_DELETE)){
- msg($lang['uploadexist'],0);
- return false;
- }
- // check for valid content
- $ok = media_contentcheck($file['tmp_name'],$imime);
- if($ok == -1){
- msg(sprintf($lang['uploadbadcontent'],".$iext"),-1);
- return false;
- }elseif($ok == -2){
- msg($lang['uploadspam'],-1);
- return false;
- }elseif($ok == -3){
- msg($lang['uploadxss'],-1);
- return false;
- }
+ if(!preg_match('/\.('.$regex.')$/i',$fn)) {
+ return array($lang['uploadwrong'],-1);
+ }
- // prepare event data
- $data[0] = $file['tmp_name'];
- $data[1] = $fn;
- $data[2] = $id;
- $data[3] = $imime;
- $data[4] = $overwrite;
+ //check for overwrite
+ $overwrite = @file_exists($fn);
+ if($overwrite && (!$ow || $auth < AUTH_DELETE)) {
+ return array($lang['uploadexist'], 0);
+ }
+ // check for valid content
+ $ok = media_contentcheck($file['name'], $file['mime']);
+ if($ok == -1){
+ return array(sprintf($lang['uploadbadcontent'],'.' . $file['ext']),-1);
+ }elseif($ok == -2){
+ return array($lang['uploadspam'],-1);
+ }elseif($ok == -3){
+ return array($lang['uploadxss'],-1);
+ }
- // trigger event
- return trigger_event('MEDIA_UPLOAD_FINISH', $data, '_media_upload_action', true);
+ // prepare event data
+ $data[0] = $file['name'];
+ $data[1] = $fn;
+ $data[2] = $id;
+ $data[3] = $file['mime'];
+ $data[4] = $overwrite;
+ $data[5] = $move;
- }else{
- msg($lang['uploadwrong'],-1);
- }
- return false;
+ // trigger event
+ return trigger_event('MEDIA_UPLOAD_FINISH', $data, '_media_upload_action', true);
}
/**
@@ -301,8 +329,8 @@ function media_upload($ns,$auth){
*/
function _media_upload_action($data) {
// fixme do further sanity tests of given data?
- if(is_array($data) && count($data)===5) {
- return media_upload_finish($data[0], $data[1], $data[2], $data[3], $data[4]);
+ if(is_array($data) && count($data)===6) {
+ return media_upload_finish($data[0], $data[1], $data[2], $data[3], $data[4], $data[5]);
} else {
return false; //callback error
}
@@ -314,14 +342,14 @@ function _media_upload_action($data) {
* @author Andreas Gohr <andi@splitbrain.org>
* @author Michael Klier <chi@chimeric.de>
*/
-function media_upload_finish($fn_tmp, $fn, $id, $imime, $overwrite) {
+function media_upload_finish($fn_tmp, $fn, $id, $imime, $overwrite, $move = 'move_uploaded_file') {
global $conf;
global $lang;
// prepare directory
io_createNamespace($id, 'media');
- if(move_uploaded_file($fn_tmp, $fn)) {
+ if($move($fn_tmp, $fn)) {
// Set the correct permission here.
// Always chmod media because they may be saved with different permissions than expected from the php umask.
// (Should normally chmod to $conf['fperm'] only if $conf['fperm'] is set.)
@@ -336,7 +364,7 @@ function media_upload_finish($fn_tmp, $fn, $id, $imime, $overwrite) {
}
return $id;
}else{
- msg($lang['uploadfail'],-1);
+ return array($lang['uploadfail'],-1);
}
}
@@ -407,7 +435,11 @@ function media_notify($id,$file,$mime){
$text = str_replace('@MEDIA@',ml($id,'',true,'&',true),$text);
$text = str_replace('@SIZE@',filesize_h(filesize($file)),$text);
- $subject = '['.$conf['title'].'] '.$lang['mail_upload'].' '.$id;
+ if(empty($conf['mailprefix'])) {
+ $subject = '['.$conf['title'].'] '.$lang['mail_upload'].' '.$id;
+ } else {
+ $subject = '['.$conf['mailprefix'].'] '.$lang['mail_upload'].' '.$id;
+ }
mail_send($conf['notify'],$subject,$text,$conf['mailfrom']);
}
@@ -735,15 +767,10 @@ function media_nstree($ns){
search($data,$conf['mediadir'],'search_index',array('ns' => $ns, 'nofiles' => true));
// wrap a list with the root level around the other namespaces
- $item = array( 'level' => 0, 'id' => '',
- 'open' =>'true', 'label' => '['.$lang['mediaroot'].']');
+ array_unshift($data, array('level' => 0, 'id' => '', 'open' =>'true',
+ 'label' => '['.$lang['mediaroot'].']'));
- echo '<ul class="idx">';
- echo media_nstree_li($item);
- echo media_nstree_item($item);
echo html_buildlist($data,'idx','media_nstree_item','media_nstree_li');
- echo '</li>';
- echo '</ul>';
}
/**
@@ -783,6 +810,7 @@ function media_nstree_li($item){
$img = DOKU_BASE.'lib/images/plus.gif';
$alt = '+';
}
+ // TODO: only deliver an image if it actually has a subtree...
return '<li class="'.$class.'">'.
'<img src="'.$img.'" alt="'.$alt.'" />';
}
diff --git a/inc/pageutils.php b/inc/pageutils.php
index 42a485bdf..c9bf60135 100644
--- a/inc/pageutils.php
+++ b/inc/pageutils.php
@@ -311,14 +311,13 @@ function metaFN($id,$ext){
* returns an array of full paths to all metafiles of a given ID
*
* @author Esther Brunner <esther@kaffeehaus.ch>
+ * @author Michael Hamann <michael@content-space.de>
*/
function metaFiles($id){
- $name = noNS($id);
- $ns = getNS($id);
- $dir = ($ns) ? metaFN($ns,'').'/' : metaFN($ns,'');
- $files = array();
- $files = glob($dir.$name.'.*');
- return $files;
+ $basename = metaFN($id, '');
+ $files = glob($basename.'.*', GLOB_MARK);
+ // filter files like foo.bar.meta when $id == 'foo'
+ return $files ? preg_grep('/^'.preg_quote($basename, '/').'\.[^.\/]*$/u', $files) : array();
}
/**
@@ -344,10 +343,13 @@ function mediaFN($id){
*/
function localeFN($id){
global $conf;
- $file = DOKU_INC.'inc/lang/'.$conf['lang'].'/'.$id.'.txt';
+ $file = DOKU_CONF.'/lang/'.$conf['lang'].'/'.$id.'.txt';
if(!@file_exists($file)){
- //fall back to english
- $file = DOKU_INC.'inc/lang/en/'.$id.'.txt';
+ $file = DOKU_INC.'inc/lang/'.$conf['lang'].'/'.$id.'.txt';
+ if(!@file_exists($file)){
+ //fall back to english
+ $file = DOKU_INC.'inc/lang/en/'.$id.'.txt';
+ }
}
return $file;
}
@@ -421,8 +423,14 @@ function resolve_mediaid($ns,&$page,&$exists){
*/
function resolve_pageid($ns,&$page,&$exists){
global $conf;
+ global $ID;
$exists = false;
+ //empty address should point to current page
+ if ($page === "") {
+ $page = $ID;
+ }
+
//keep hashlink if exists then clean both parts
if (strpos($page,'#')) {
list($page,$hash) = explode('#',$page,2);
diff --git a/inc/parser/handler.php b/inc/parser/handler.php
index 4d0b56b44..22a50d1b7 100644
--- a/inc/parser/handler.php
+++ b/inc/parser/handler.php
@@ -720,6 +720,7 @@ class Doku_Handler_CallWriter {
// function is required, but since this call writer is first/highest in
// the chain it is not required to do anything
function finalise() {
+ unset($this->Handler);
}
}
@@ -764,6 +765,7 @@ class Doku_Handler_Nest {
$this->process();
$this->CallWriter->finalise();
+ unset($this->CallWriter);
}
function process() {
@@ -817,6 +819,7 @@ class Doku_Handler_List {
$this->process();
$this->CallWriter->finalise();
+ unset($this->CallWriter);
}
//------------------------------------------------------------------------
@@ -1014,6 +1017,7 @@ class Doku_Handler_Preformatted {
$this->process();
$this->CallWriter->finalise();
+ unset($this->CallWriter);
}
function process() {
@@ -1070,6 +1074,7 @@ class Doku_Handler_Quote {
$this->process();
$this->CallWriter->finalise();
+ unset($this->CallWriter);
}
function process() {
@@ -1165,6 +1170,7 @@ class Doku_Handler_Table {
$this->process();
$this->CallWriter->finalise();
+ unset($this->CallWriter);
}
//------------------------------------------------------------------------
@@ -1427,14 +1433,8 @@ class Doku_Handler_Table {
* @author Harry Fuecks <hfuecks@gmail.com>
*/
class Doku_Handler_Block {
-
var $calls = array();
-
- var $blockStack = array();
-
- var $inParagraph = false;
- var $atStart = true;
- var $skipEolKey = -1;
+ var $skipEol = false;
// Blocks these should not be inside paragraphs
var $blockOpen = array(
@@ -1442,9 +1442,9 @@ class Doku_Handler_Block {
'listu_open','listo_open','listitem_open','listcontent_open',
'table_open','tablerow_open','tablecell_open','tableheader_open',
'quote_open',
- 'section_open', // Needed to prevent p_open between header and section_open
'code','file','hr','preformatted','rss',
'htmlblock','phpblock',
+ 'footnote_open',
);
var $blockClose = array(
@@ -1452,18 +1452,18 @@ class Doku_Handler_Block {
'listu_close','listo_close','listitem_close','listcontent_close',
'table_close','tablerow_close','tablecell_close','tableheader_close',
'quote_close',
- 'section_close', // Needed to prevent p_close after section_close
'code','file','hr','preformatted','rss',
'htmlblock','phpblock',
+ 'footnote_close',
);
// Stacks can contain paragraphs
var $stackOpen = array(
- 'footnote_open','section_open',
+ 'section_open',
);
var $stackClose = array(
- 'footnote_close','section_close',
+ 'section_close',
);
@@ -1489,6 +1489,13 @@ class Doku_Handler_Block {
}
}
+ function openParagraph($pos){
+ if ($this->inParagraph) return;
+ $this->calls[] = array('p_open',array(), $pos);
+ $this->inParagraph = true;
+ $this->skipEol = true;
+ }
+
/**
* Close a paragraph if needed
*
@@ -1496,7 +1503,8 @@ class Doku_Handler_Block {
*
* @author Andreas Gohr <andi@splitbrain.org>
*/
- function closeParagraph($pos){
+ function closeParagraph($pos){
+ if (!$this->inParagraph) return;
// look back if there was any content - we don't want empty paragraphs
$content = '';
for($i=count($this->calls)-1; $i>=0; $i--){
@@ -1513,11 +1521,29 @@ class Doku_Handler_Block {
if(trim($content)==''){
//remove the whole paragraph
array_splice($this->calls,$i);
- }else{
+ }else{
+ // remove ending linebreaks in the paragraph
+ $i=count($this->calls)-1;
+ if ($this->calls[$i][0] == 'cdata') $this->calls[$i][1][0] = rtrim($this->calls[$i][1][0],DOKU_PARSER_EOL);
$this->calls[] = array('p_close',array(), $pos);
}
- $this->inParagraph = false;
+ $this->inParagraph = false;
+ $this->skipEol = true;
+ }
+
+ function addCall($call) {
+ $key = count($this->calls);
+ if ($key and ($call[0] == 'cdata') and ($this->calls[$key-1][0] == 'cdata')) {
+ $this->calls[$key-1][1][0] .= $call[1][0];
+ } else {
+ $this->calls[] = $call;
+ }
+ }
+
+ // simple version of addCall, without checking cdata
+ function storeCall($call) {
+ $this->calls[] = $call;
}
/**
@@ -1525,186 +1551,71 @@ class Doku_Handler_Block {
*
* @author Harry Fuecks <hfuecks@gmail.com>
* @author Andreas Gohr <andi@splitbrain.org>
- * @todo This thing is really messy and should be rewritten
*/
function process($calls) {
+ // open first paragraph
+ $this->openParagraph(0);
foreach ( $calls as $key => $call ) {
$cname = $call[0];
- if($cname == 'plugin') {
+ if ($cname == 'plugin') {
$cname='plugin_'.$call[1][0];
-
$plugin = true;
$plugin_open = (($call[1][2] == DOKU_LEXER_ENTER) || ($call[1][2] == DOKU_LEXER_SPECIAL));
$plugin_close = (($call[1][2] == DOKU_LEXER_EXIT) || ($call[1][2] == DOKU_LEXER_SPECIAL));
} else {
$plugin = false;
}
-
- // Process blocks which are stack like... (contain linefeeds)
+ /* stack */
+ if ( in_array($cname,$this->stackClose ) && (!$plugin || $plugin_close)) {
+ $this->closeParagraph($call[2]);
+ $this->storeCall($call);
+ $this->openParagraph($call[2]);
+ continue;
+ }
if ( in_array($cname,$this->stackOpen ) && (!$plugin || $plugin_open) ) {
-
- // Hack - footnotes shouldn't immediately contain a p_open
- if ($this->addToStack($cname != 'footnote_open')) {
- $this->closeParagraph($call[2]);
- }
- $this->calls[] = $call;
-
+ $this->closeParagraph($call[2]);
+ $this->storeCall($call);
+ $this->openParagraph($call[2]);
continue;
}
-
- if ( in_array($cname,$this->stackClose ) && (!$plugin || $plugin_close)) {
-
- if ( $this->inParagraph ) {
- $this->closeParagraph($call[2]);
- }
- $this->calls[] = $call;
- if ($this->removeFromStack()) {
- $this->calls[] = array('p_open',array(), $call[2]);
- }
+ /* block */
+ // If it's a substition it opens and closes at the same call.
+ // To make sure next paragraph is correctly started, let close go first.
+ if ( in_array($cname, $this->blockClose) && (!$plugin || $plugin_close)) {
+ $this->closeParagraph($call[2]);
+ $this->storeCall($call);
+ $this->openParagraph($call[2]);
continue;
}
-
- if ( !$this->atStart ) {
-
- if ( $cname == 'eol' ) {
-
- // Check this isn't an eol instruction to skip...
- if ( $this->skipEolKey != $key ) {
- // Look to see if the next instruction is an EOL
- if ( isset($calls[$key+1]) && $calls[$key+1][0] == 'eol' ) {
-
- if ( $this->inParagraph ) {
- //$this->calls[] = array('p_close',array(), $call[2]);
- $this->closeParagraph($call[2]);
- }
-
- $this->calls[] = array('p_open',array(), $call[2]);
- $this->inParagraph = true;
-
-
- // Mark the next instruction for skipping
- $this->skipEolKey = $key+1;
-
- }else{
- //if this is just a single eol make a space from it
- $this->addCall(array('cdata',array(DOKU_PARSER_EOL), $call[2]));
- }
- }
-
-
- } else {
-
- $storeCall = true;
- if ( $this->inParagraph && (in_array($cname, $this->blockOpen) && (!$plugin || $plugin_open))) {
+ if ( in_array($cname, $this->blockOpen) && (!$plugin || $plugin_open)) {
+ $this->closeParagraph($call[2]);
+ $this->storeCall($call);
+ continue;
+ }
+ /* eol */
+ if ( $cname == 'eol' ) {
+ // Check this isn't an eol instruction to skip...
+ if ( !$this->skipEol ) {
+ // Next is EOL => double eol => mark as paragraph
+ if ( isset($calls[$key+1]) && $calls[$key+1][0] == 'eol' ) {
$this->closeParagraph($call[2]);
- $this->calls[] = $call;
- $storeCall = false;
- }
-
- if ( in_array($cname, $this->blockClose) && (!$plugin || $plugin_close)) {
- if ( $this->inParagraph ) {
- $this->closeParagraph($call[2]);
- }
- if ( $storeCall ) {
- $this->calls[] = $call;
- $storeCall = false;
- }
-
- // This really sucks and suggests this whole class sucks but...
- if ( isset($calls[$key+1])) {
- $cname_plusone = $calls[$key+1][0];
- if ($cname_plusone == 'plugin') {
- $cname_plusone = 'plugin'.$calls[$key+1][1][0];
-
- // plugin test, true if plugin has a state which precludes it requiring blockOpen or blockClose
- $plugin_plusone = true;
- $plugin_test = ($call[$key+1][1][2] == DOKU_LEXER_MATCHED) || ($call[$key+1][1][2] == DOKU_LEXER_MATCHED);
- } else {
- $plugin_plusone = false;
- }
- if ((!in_array($cname_plusone, $this->blockOpen) && !in_array($cname_plusone, $this->blockClose)) ||
- ($plugin_plusone && $plugin_test)
- ) {
-
- $this->calls[] = array('p_open',array(), $call[2]);
- $this->inParagraph = true;
- }
- }
- }
-
- if ( $storeCall ) {
- $this->addCall($call);
- }
-
- }
-
-
- } else {
-
- // Unless there's already a block at the start, start a paragraph
- if ( !in_array($cname,$this->blockOpen) ) {
- $this->calls[] = array('p_open',array(), $call[2]);
- if ( $call[0] != 'eol' ) {
- $this->calls[] = $call;
+ $this->openParagraph($call[2]);
+ } else {
+ //if this is just a single eol make a space from it
+ $this->addCall(array('cdata',array(DOKU_PARSER_EOL), $call[2]));
}
- $this->atStart = false;
- $this->inParagraph = true;
- } else {
- $this->addCall($call);
- $this->atStart = false;
}
-
- }
-
- }
-
- if ( $this->inParagraph ) {
- if ( $cname == 'p_open' ) {
- // Ditch the last call
- array_pop($this->calls);
- } else if ( !in_array($cname, $this->blockClose) ) {
- //$this->calls[] = array('p_close',array(), $call[2]);
- $this->closeParagraph($call[2]);
- } else {
- $last_call = array_pop($this->calls);
- //$this->calls[] = array('p_close',array(), $call[2]);
- $this->closeParagraph($call[2]);
- $this->calls[] = $last_call;
+ continue;
}
+ /* normal */
+ $this->addCall($call);
+ $this->skipEol = false;
}
-
+ // close last paragraph
+ $call = end($this->calls);
+ $this->closeParagraph($call[2]);
return $this->calls;
}
-
- /**
- *
- * @return bool true when a p_close() is required
- */
- function addToStack($newStart = true) {
- $ret = $this->inParagraph;
- $this->blockStack[] = array($this->atStart, $this->inParagraph);
- $this->atStart = $newStart;
- $this->inParagraph = false;
-
- return $ret;
- }
-
- function removeFromStack() {
- $state = array_pop($this->blockStack);
- $this->atStart = $state[0];
- $this->inParagraph = $state[1];
-
- return $this->inParagraph;
- }
-
- function addCall($call) {
- $key = count($this->calls);
- if ($key and ($call[0] == 'cdata') and ($this->calls[$key-1][0] == 'cdata')) {
- $this->calls[$key-1][1][0] .= $call[1][0];
- } else {
- $this->calls[] = $call;
- }
- }
}
//Setup VIM: ex: et ts=4 :
diff --git a/inc/parser/metadata.php b/inc/parser/metadata.php
index 263745593..136c37531 100644
--- a/inc/parser/metadata.php
+++ b/inc/parser/metadata.php
@@ -45,6 +45,9 @@ class Doku_Renderer_metadata extends Doku_Renderer {
if(!$this->persistent['date']['created']){
$this->persistent['date']['created'] = filectime(wikiFN($ID));
}
+ if(!isset($this->persistent['user'])){
+ $this->persistent['user'] = '';
+ }
if(!isset($this->persistent['creator'])){
$this->persistent['creator'] = '';
}
@@ -454,14 +457,14 @@ class Doku_Renderer_metadata extends Doku_Renderer {
$isImage = false;
if (is_null($title)){
if (useHeading('content') && $id){
- $heading = p_get_first_heading($id,false);
+ $heading = p_get_first_heading($id,METADATA_DONT_RENDER);
if ($heading) return $heading;
}
return $default;
} else if (is_string($title)){
return $title;
} else if (is_array($title)){
- return '['.$title['title'].']';
+ if($title['title']) return '['.$title['title'].']';
}
}
diff --git a/inc/parser/parser.php b/inc/parser/parser.php
index b93760f3a..68d4e4569 100644
--- a/inc/parser/parser.php
+++ b/inc/parser/parser.php
@@ -828,7 +828,7 @@ class Doku_Parser_Mode_internallink extends Doku_Parser_Mode {
function connectTo($mode) {
// Word boundaries?
- $this->Lexer->addSpecialPattern("\[\[.+?\]\]",$mode,'internallink');
+ $this->Lexer->addSpecialPattern("\[\[(?:(?:[^[\]]*?\[.*?\])|.*?)\]\]",$mode,'internallink');
}
function getSort() {
@@ -870,7 +870,7 @@ class Doku_Parser_Mode_externallink extends Doku_Parser_Mode {
if(count($this->patterns)) return;
$ltrs = '\w';
- $gunk = '/\#~:.?+=&%@!\-';
+ $gunk = '/\#~:.?+=&%@!\-\[\]';
$punc = '.:?\-;,';
$host = $ltrs.$punc;
$any = $ltrs.$gunk.$punc;
diff --git a/inc/parser/xhtml.php b/inc/parser/xhtml.php
index b0d93f93e..83359cd55 100644
--- a/inc/parser/xhtml.php
+++ b/inc/parser/xhtml.php
@@ -574,11 +574,20 @@ class Doku_Renderer_xhtml extends Doku_Renderer {
$params = $parts[1];
}
+ // For empty $id we need to know the current $ID
+ // We need this check because _simpleTitle needs
+ // correct $id and resolve_pageid() use cleanID($id)
+ // (some things could be lost)
+ if ($id === '') {
+ $id = $ID;
+ }
+
// default name is based on $id as given
$default = $this->_simpleTitle($id);
// now first resolve and clean up the $id
resolve_pageid(getNS($ID),$id,$exists);
+
$name = $this->_getLinkTitle($name, $default, $isImage, $id, $linktype);
if ( !$isImage ) {
if ( $exists ) {
@@ -637,6 +646,19 @@ class Doku_Renderer_xhtml extends Doku_Renderer {
$name = $this->_getLinkTitle($name, $url, $isImage);
+ // url might be an attack vector, only allow registered protocols
+ if(is_null($this->schemes)) $this->schemes = getSchemes();
+ list($scheme) = explode('://',$url);
+ $scheme = strtolower($scheme);
+ if(!in_array($scheme,$this->schemes)) $url = '';
+
+ // is there still an URL?
+ if(!$url){
+ $this->doc .= $name;
+ return;
+ }
+
+ // set class
if ( !$isImage ) {
$class='urlextern';
} else {
@@ -734,9 +756,9 @@ class Doku_Renderer_xhtml extends Doku_Renderer {
$name = $this->_getLinkTitle($name, '', $isImage);
if ( !$isImage ) {
- $link['class']='mail JSnocheck';
+ $link['class']='mail';
} else {
- $link['class']='media JSnocheck';
+ $link['class']='media';
}
$address = $this->_xmlEntities($address);
@@ -1135,7 +1157,7 @@ class Doku_Renderer_xhtml extends Doku_Renderer {
return $this->_imageTitle($title);
} elseif ( is_null($title) || trim($title)=='') {
if (useHeading($linktype) && $id) {
- $heading = p_get_first_heading($id,true);
+ $heading = p_get_first_heading($id);
if ($heading) {
return $this->_xmlEntities($heading);
}
diff --git a/inc/parserutils.php b/inc/parserutils.php
index d4f55a6e4..9384929bf 100644
--- a/inc/parserutils.php
+++ b/inc/parserutils.php
@@ -10,6 +10,45 @@
if(!defined('DOKU_INC')) die('meh.');
/**
+ * How many pages shall be rendered for getting metadata during one request
+ * at maximum? Note that this limit isn't respected when METADATA_RENDER_UNLIMITED
+ * is passed as render parameter to p_get_metadata.
+ */
+if (!defined('P_GET_METADATA_RENDER_LIMIT')) define('P_GET_METADATA_RENDER_LIMIT', 5);
+
+/** Don't render metadata even if it is outdated or doesn't exist */
+define('METADATA_DONT_RENDER', 0);
+/**
+ * Render metadata when the page is really newer or the metadata doesn't exist.
+ * Uses just a simple check, but should work pretty well for loading simple
+ * metadata values like the page title and avoids rendering a lot of pages in
+ * one request. The P_GET_METADATA_RENDER_LIMIT is used in this mode.
+ * Use this if it is unlikely that the metadata value you are requesting
+ * does depend e.g. on pages that are included in the current page using
+ * the include plugin (this is very likely the case for the page title, but
+ * not for relation references).
+ */
+define('METADATA_RENDER_USING_SIMPLE_CACHE', 1);
+/**
+ * Render metadata using the metadata cache logic. The P_GET_METADATA_RENDER_LIMIT
+ * is used in this mode. Use this mode when you are requesting more complex
+ * metadata. Although this will cause rendering more often it might actually have
+ * the effect that less current metadata is returned as it is more likely than in
+ * the simple cache mode that metadata needs to be rendered for all pages at once
+ * which means that when the metadata for the page is requested that actually needs
+ * to be updated the limit might have been reached already.
+ */
+define('METADATA_RENDER_USING_CACHE', 2);
+/**
+ * Render metadata without limiting the number of pages for which metadata is
+ * rendered. Use this mode with care, normally it should only be used in places
+ * like the indexer or in cli scripts where the execution time normally isn't
+ * limited. This can be combined with the simple cache using
+ * METADATA_RENDER_USING_CACHE | METADATA_RENDER_UNLIMITED.
+ */
+define('METADATA_RENDER_UNLIMITED', 4);
+
+/**
* Returns the parsed Wikitext in XHTML for the given id and revision.
*
* If $excuse is true an explanation is returned if the file
@@ -220,11 +259,23 @@ function p_get_instructions($text){
/**
* returns the metadata of a page
*
+ * @param string $id The id of the page the metadata should be returned from
+ * @param string $key The key of the metdata value that shall be read (by default everything) - separate hierarchies by " " like "date created"
+ * @param int $render If the page should be rendererd - possible values:
+ * METADATA_DONT_RENDER, METADATA_RENDER_USING_SIMPLE_CACHE, METADATA_RENDER_USING_CACHE
+ * METADATA_RENDER_UNLIMITED (also combined with the previous two options),
+ * default: METADATA_RENDER_USING_CACHE
+ * @return mixed The requested metadata fields
+ *
* @author Esther Brunner <esther@kaffeehaus.ch>
* @author Michael Hamann <michael@content-space.de>
*/
-function p_get_metadata($id, $key='', $render=false){
+function p_get_metadata($id, $key='', $render=METADATA_RENDER_USING_CACHE){
global $ID;
+ static $render_count = 0;
+ // track pages that have already been rendered in order to avoid rendering the same page
+ // again
+ static $rendered_pages = array();
// cache the current page
// Benchmarking shows the current page's metadata is generally the only page metadata
@@ -232,19 +283,43 @@ function p_get_metadata($id, $key='', $render=false){
$cache = ($ID == $id);
$meta = p_read_metadata($id, $cache);
+ if (!is_numeric($render)) {
+ if ($render) {
+ $render = METADATA_RENDER_USING_SIMPLE_CACHE;
+ } else {
+ $render = METADATA_DONT_RENDER;
+ }
+ }
+
// prevent recursive calls in the cache
static $recursion = false;
- if (!$recursion){
+ if (!$recursion && $render != METADATA_DONT_RENDER && !isset($rendered_pages[$id])&& page_exists($id)){
$recursion = true;
$cachefile = new cache_renderer($id, wikiFN($id), 'metadata');
- if (page_exists($id) && !$cachefile->useCache()){
+ $do_render = false;
+ if ($render & METADATA_RENDER_UNLIMITED || $render_count < P_GET_METADATA_RENDER_LIMIT) {
+ if ($render & METADATA_RENDER_USING_SIMPLE_CACHE) {
+ $pagefn = wikiFN($id);
+ $metafn = metaFN($id, '.meta');
+ if (!@file_exists($metafn) || @filemtime($pagefn) > @filemtime($cachefile->cache)) {
+ $do_render = true;
+ }
+ } elseif (!$cachefile->useCache()){
+ $do_render = true;
+ }
+ }
+ if ($do_render) {
+ ++$render_count;
+ $rendered_pages[$id] = true;
+ $old_meta = $meta;
$meta = p_render_metadata($id, $meta);
- if (p_save_metadata($id, $meta)) {
+ // only update the file when the metadata has been changed
+ if ($meta == $old_meta || p_save_metadata($id, $meta)) {
// store a timestamp in order to make sure that the cachefile is touched
$cachefile->storeCache(time());
- } else {
+ } elseif ($meta != $old_meta) {
msg('Unable to save metadata file. Hint: disk full; file permissions; safe_mode setting.',-1);
}
}
@@ -277,18 +352,25 @@ function p_get_metadata($id, $key='', $render=false){
* @return boolean true on success
*
* @author Esther Brunner <esther@kaffeehaus.ch>
+ * @author Michael Hamann <michael@content-space.de>
*/
function p_set_metadata($id, $data, $render=false, $persistent=true){
if (!is_array($data)) return false;
- global $ID;
+ global $ID, $METADATA_RENDERERS;
- // cache the current page
- $cache = ($ID == $id);
- $orig = p_read_metadata($id, $cache);
+ // if there is currently a renderer change the data in the renderer instead
+ if (isset($METADATA_RENDERERS[$id])) {
+ $orig =& $METADATA_RENDERERS[$id];
+ $meta = $orig;
+ } else {
+ // cache the current page
+ $cache = ($ID == $id);
+ $orig = p_read_metadata($id, $cache);
- // render metadata first?
- $meta = $render ? p_render_metadata($id, $orig) : $orig;
+ // render metadata first?
+ $meta = $render ? p_render_metadata($id, $orig) : $orig;
+ }
// now add the passed metadata
$protected = array('description', 'date', 'contributor');
@@ -325,7 +407,14 @@ function p_set_metadata($id, $data, $render=false, $persistent=true){
// save only if metadata changed
if ($meta == $orig) return true;
- return p_save_metadata($id, $meta);
+ if (isset($METADATA_RENDERERS[$id])) {
+ // set both keys individually as the renderer has references to the individual keys
+ $METADATA_RENDERERS[$id]['current'] = $meta['current'];
+ $METADATA_RENDERERS[$id]['persistent'] = $meta['persistent'];
+ return true;
+ } else {
+ return p_save_metadata($id, $meta);
+ }
}
/**
@@ -399,7 +488,15 @@ function p_save_metadata($id, $meta) {
*/
function p_render_metadata($id, $orig){
// make sure the correct ID is in global ID
- global $ID;
+ global $ID, $METADATA_RENDERERS;
+
+ // avoid recursive rendering processes for the same id
+ if (isset($METADATA_RENDERERS[$id]))
+ return $orig;
+
+ // store the original metadata in the global $METADATA_RENDERERS so p_set_metadata can use it
+ $METADATA_RENDERERS[$id] =& $orig;
+
$keep = $ID;
$ID = $id;
@@ -414,13 +511,14 @@ function p_render_metadata($id, $orig){
$instructions = p_cached_instructions(wikiFN($id),false,$id);
if(is_null($instructions)){
$ID = $keep;
+ unset($METADATA_RENDERERS[$id]);
return null; // something went wrong with the instructions
}
// set up the renderer
$renderer = new Doku_Renderer_metadata();
- $renderer->meta = $orig['current'];
- $renderer->persistent = $orig['persistent'];
+ $renderer->meta =& $orig['current'];
+ $renderer->persistent =& $orig['persistent'];
// loop through the instructions
foreach ($instructions as $instruction){
@@ -428,11 +526,13 @@ function p_render_metadata($id, $orig){
call_user_func_array(array(&$renderer, $instruction[0]), (array) $instruction[1]);
}
- $evt->result = array('current'=>$renderer->meta,'persistent'=>$renderer->persistent);
+ $evt->result = array('current'=>&$renderer->meta,'persistent'=>&$renderer->persistent);
}
$evt->advise_after();
+ // clean up
$ID = $keep;
+ unset($METADATA_RENDERERS[$id]);
return $evt->result;
}
@@ -577,12 +677,16 @@ function & p_get_renderer($mode) {
global $conf, $plugin_controller;
$rname = !empty($conf['renderer_'.$mode]) ? $conf['renderer_'.$mode] : $mode;
+ $rclass = "Doku_Renderer_$rname";
+
+ if( class_exists($rclass) ) {
+ return new $rclass();
+ }
// try default renderer first:
$file = DOKU_INC."inc/parser/$rname.php";
if(@file_exists($file)){
require_once $file;
- $rclass = "Doku_Renderer_$rname";
if ( !class_exists($rclass) ) {
trigger_error("Unable to resolve render class $rclass",E_USER_WARNING);
@@ -610,17 +714,18 @@ function & p_get_renderer($mode) {
* Gets the first heading from a file
*
* @param string $id dokuwiki page id
- * @param bool $render rerender if first heading not known
- * default: true -- must be set to false for calls from the metadata renderer to
- * protects against loops and excessive resource usage when pages
- * for which only a first heading is required will attempt to
- * render metadata for all the pages for which they require first
- * headings ... and so on.
+ * @param int $render rerender if first heading not known
+ * default: METADATA_RENDER_USING_SIMPLE_CACHE
+ * Possible values: METADATA_DONT_RENDER,
+ * METADATA_RENDER_USING_SIMPLE_CACHE,
+ * METADATA_RENDER_USING_CACHE,
+ * METADATA_RENDER_UNLIMITED
*
* @author Andreas Gohr <andi@splitbrain.org>
+ * @author Michael Hamann <michael@content-space.de>
*/
-function p_get_first_heading($id, $render=true){
- return p_get_metadata($id,'title',$render);
+function p_get_first_heading($id, $render=METADATA_RENDER_USING_SIMPLE_CACHE){
+ return p_get_metadata(cleanID($id),'title',$render);
}
/**
diff --git a/inc/plugin.php b/inc/plugin.php
index aff07c1e5..ec94433b6 100644
--- a/inc/plugin.php
+++ b/inc/plugin.php
@@ -33,7 +33,15 @@ class DokuWiki_Plugin {
$parts = explode('_',get_class($this));
$info = DOKU_PLUGIN.'/'.$parts[2].'/plugin.info.txt';
if(@file_exists($info)) return confToHash($info);
- trigger_error('getInfo() not implemented in '.get_class($this).' and '.$info.' not found', E_USER_WARNING);
+
+ msg('getInfo() not implemented in '.get_class($this).
+ ' and '.$info.' not found.<br />This is a bug in the '.
+ $parts[2].' plugin and should be reported to the '.
+ 'plugin author.',-1);
+ return array(
+ 'date' => '0000-00-00',
+ 'name' => $parts[2].' plugin',
+ );
}
// plugin introspection methods
@@ -88,10 +96,13 @@ class DokuWiki_Plugin {
function localFN($id) {
global $conf;
$plugin = $this->getPluginName();
- $file = DOKU_PLUGIN.$plugin.'/lang/'.$conf['lang'].'/'.$id.'.txt';
- if(!@file_exists($file)){
- //fall back to english
- $file = DOKU_PLUGIN.$plugin.'/lang/en/'.$id.'.txt';
+ $file = DOKU_CONF.'/plugin_lang/'.$plugin.'/'.$conf['lang'].'/'.$id.'.txt';
+ if (!@file_exists($file)){
+ $file = DOKU_PLUGIN.$plugin.'/lang/'.$conf['lang'].'/'.$id.'.txt';
+ if(!@file_exists($file)){
+ //fall back to english
+ $file = DOKU_PLUGIN.$plugin.'/lang/en/'.$id.'.txt';
+ }
}
return $file;
}
diff --git a/inc/plugincontroller.class.php b/inc/plugincontroller.class.php
index ad394e11f..ea5725d47 100644
--- a/inc/plugincontroller.class.php
+++ b/inc/plugincontroller.class.php
@@ -72,32 +72,29 @@ class Doku_Plugin_Controller {
return null;
}
+ $class = $type.'_plugin_'.$name;
+
//plugin already loaded?
if(!empty($DOKU_PLUGINS[$type][$name])){
if ($new || !$DOKU_PLUGINS[$type][$name]->isSingleton()) {
- $class = $type.'_plugin_'.$name;
- return class_exists($class) ? new $class : null;
+ return class_exists($class, true) ? new $class : null;
} else {
return $DOKU_PLUGINS[$type][$name];
}
}
- //try to load the wanted plugin file
- $dir = $this->get_directory($plugin);
- $file = $component ? "$type/$component.php" : "$type.php";
-
- if(!is_file(DOKU_PLUGIN."$dir/$file")){
- return null;
- }
-
- if (!include_once(DOKU_PLUGIN."$dir/$file")) {
+ //construct class and instantiate
+ if (!class_exists($class, true)) {
+ # the plugin might be in the wrong directory
+ $dir = $this->get_directory($plugin);
+ $inf = confToHash(DOKU_PLUGIN."$dir/plugin.info.txt");
+ if($inf['base'] && $inf['base'] != $plugin){
+ msg("Plugin installed incorrectly. Rename plugin directory '".
+ hsc($plugin)."' to '".hsc($inf['base'])."'.",-1);
+ }
return null;
}
- //construct class and instantiate
- $class = $type.'_plugin_'.$name;
- if (!class_exists($class)) return null;
-
$DOKU_PLUGINS[$type][$name] = new $class;
return $DOKU_PLUGINS[$type][$name];
}
@@ -125,6 +122,7 @@ class Doku_Plugin_Controller {
}
function _populateMasterList() {
+ global $conf;
if ($dh = opendir(DOKU_PLUGIN)) {
while (false !== ($plugin = readdir($dh))) {
if ($plugin[0] == '.') continue; // skip hidden entries
@@ -134,7 +132,9 @@ class Doku_Plugin_Controller {
// the plugin was disabled by rc2009-01-26
// disabling mechanism was changed back very soon again
// to keep everything simple we just skip the plugin completely
- }elseif(@file_exists(DOKU_PLUGIN.$plugin.'/disabled')){
+ }elseif(@file_exists(DOKU_PLUGIN.$plugin.'/disabled') ||
+ ($plugin === 'plugin' && isset($conf['pluginmanager']) &&
+ !$conf['pluginmanager'])){
$this->list_disabled[] = $plugin;
} else {
$this->list_enabled[] = $plugin;
diff --git a/inc/search.php b/inc/search.php
index db0b008f0..7b53edabe 100644
--- a/inc/search.php
+++ b/inc/search.php
@@ -616,7 +616,7 @@ function search_universal(&$data,$base,$file,$type,$lvl,$opts){
if($type == 'f'){
if($opts['hash']) $item['hash'] = md5(io_readFile($base.'/'.$file,false));
- if($opts['firsthead']) $item['title'] = p_get_first_heading($item['id'],false);
+ if($opts['firsthead']) $item['title'] = p_get_first_heading($item['id'],METADATA_DONT_RENDER);
}
// finally add the item
diff --git a/inc/subscription.php b/inc/subscription.php
index 08d4cb241..c94f17ad0 100644
--- a/inc/subscription.php
+++ b/inc/subscription.php
@@ -46,22 +46,23 @@ function subscription_filename($id) {
*/
function subscription_lock_filename ($id){
global $conf;
- return $conf['lockdir'].'/_subscr_' . $id . '.lock';
+ return $conf['lockdir'].'/_subscr_' . md5($id) . '.lock';
}
function subscription_lock($id) {
- // FIXME merge this with the indexer lock generation, abstract out
global $conf;
$lock = subscription_lock_filename($id);
- while(!@mkdir($lock,$conf['dmode'])){
- usleep(50);
- if(time()-@filemtime($lock) > 60*5){
- // looks like a stale lock - remove it
- @rmdir($lock);
- }else{
- return false;
- }
+
+ if (is_dir($lock) && time()-@filemtime($lock) > 60*5) {
+ // looks like a stale lock - remove it
+ @rmdir($lock);
}
+
+ // try creating the lock directory
+ if (!@mkdir($lock,$conf['dmode'])) {
+ return false;
+ }
+
if($conf['dperm']) chmod($lock, $conf['dperm']);
return true;
}
@@ -277,8 +278,8 @@ function subscription_addresslist(&$data){
}
$pres = array('style' => 'every', 'escaped' => true);
if (!$self && isset($_SERVER['REMOTE_USER'])) {
- $pres['user'] = '((?:(?!' . preg_quote_cb($_SERVER['REMOTE_USER']) .
- ')\S?)+)';
+ $pres['user'] = '((?!' . preg_quote_cb($_SERVER['REMOTE_USER']) .
+ '(?: |$))\S+)';
}
$subs = subscription_find($id, $pres);
$emails = array();
diff --git a/inc/template.php b/inc/template.php
index 53ae9abce..5184929b8 100644
--- a/inc/template.php
+++ b/inc/template.php
@@ -93,7 +93,7 @@ function tpl_content_core(){
break;
case 'index':
html_index($IDX); #FIXME can this be pulled from globals? is it sanitized correctly?
- break;
+ break;
case 'backlink':
html_backlinks();
break;
@@ -155,7 +155,7 @@ function tpl_toc($return=false){
$toc = $TOC;
}elseif(($ACT == 'show' || substr($ACT,0,6) == 'export') && !$REV && $INFO['exists']){
// get TOC from metadata, render if neccessary
- $meta = p_get_metadata($ID, false, true);
+ $meta = p_get_metadata($ID, false, METADATA_RENDER_USING_CACHE);
if(isset($meta['internal']['toc'])){
$tocok = $meta['internal']['toc'];
}else{
@@ -209,14 +209,9 @@ function tpl_admin(){
}
if ($plugin !== null){
- if($plugin->forAdminOnly() && !$INFO['isadmin']){
- msg('For admins only',-1);
- html_admin();
- }else{
- if(!is_array($TOC)) $TOC = $plugin->getTOC(); //if TOC wasn't requested yet
- if($INFO['prependTOC']) tpl_toc();
- $plugin->html();
- }
+ if(!is_array($TOC)) $TOC = $plugin->getTOC(); //if TOC wasn't requested yet
+ if($INFO['prependTOC']) tpl_toc();
+ $plugin->html();
}else{
html_admin();
}
@@ -581,18 +576,25 @@ function tpl_get_action($type) {
$accesskey = 'b';
break;
case 'login':
- if(!$conf['useacl'] || !$auth){
- return false;
- }
$params['sectok'] = getSecurityToken();
if(isset($_SERVER['REMOTE_USER'])){
- if (!$auth->canDo('logout')) {
+ if (!actionOK('logout')) {
return false;
}
$params['do'] = 'logout';
$type = 'logout';
}
break;
+ case 'register':
+ if($_SERVER['REMOTE_USER']){
+ return false;
+ }
+ break;
+ case 'resendpwd':
+ if($_SERVER['REMOTE_USER']){
+ return false;
+ }
+ break;
case 'admin':
if(!$INFO['ismanager']){
return false;
@@ -609,20 +611,19 @@ function tpl_get_action($type) {
$type = 'subscribe';
$params['do'] = 'subscribe';
case 'subscribe':
- if(!$conf['useacl'] || !$auth || !$conf['subscribers'] || !$_SERVER['REMOTE_USER']){
+ if(!$_SERVER['REMOTE_USER']){
return false;
}
break;
case 'backlink':
break;
case 'profile':
- if(!$conf['useacl'] || !$auth || !isset($_SERVER['REMOTE_USER']) ||
- !$auth->canDo('Profile')){
+ if(!isset($_SERVER['REMOTE_USER'])){
return false;
}
break;
case 'subscribens':
- // Superseeded by subscribe/subscription
+ // Superseded by subscribe/subscription
return '';
break;
default:
@@ -685,7 +686,7 @@ function tpl_searchform($ajax=true,$autocomplete=true){
*
* @author Andreas Gohr <andi@splitbrain.org>
*/
-function tpl_breadcrumbs($sep='&raquo;'){
+function tpl_breadcrumbs($sep='&bull;'){
global $lang;
global $conf;
@@ -739,48 +740,30 @@ function tpl_youarehere($sep=' &raquo; '){
$parts = explode(':', $ID);
$count = count($parts);
- if($GLOBALS['ACT'] == 'search')
- {
- $parts = array($conf['start']);
- $count = 1;
- }
-
echo '<span class="bchead">'.$lang['youarehere'].': </span>';
// always print the startpage
- $title = useHeading('navigation') ? p_get_first_heading($conf['start']) : $conf['start'];
- if(!$title) $title = $conf['start'];
- tpl_link(wl($conf['start']),hsc($title),'title="'.$conf['start'].'"');
+ tpl_pagelink(':'.$conf['start']);
// print intermediate namespace links
$part = '';
for($i=0; $i<$count - 1; $i++){
$part .= $parts[$i].':';
$page = $part;
- resolve_pageid('',$page,$exists);
if ($page == $conf['start']) continue; // Skip startpage
// output
echo $sep;
- if($exists){
- $title = useHeading('navigation') ? p_get_first_heading($page) : $parts[$i];
- tpl_link(wl($page),hsc($title),'title="'.$page.'"');
- }else{
- tpl_link(wl($page),$parts[$i],'title="'.$page.'" class="wikilink2" rel="nofollow"');
- }
+ tpl_pagelink($page);
}
// print current page, skipping start page, skipping for namespace index
+ resolve_pageid('',$page,$exists);
if(isset($page) && $page==$part.$parts[$i]) return;
$page = $part.$parts[$i];
if($page == $conf['start']) return;
echo $sep;
- if(page_exists($page)){
- $title = useHeading('navigation') ? p_get_first_heading($page) : $parts[$i];
- tpl_link(wl($page),hsc($title),'title="'.$page.'"');
- }else{
- tpl_link(wl($page),$parts[$i],'title="'.$page.'" class="wikilink2" rel="nofollow"');
- }
+ tpl_pagelink($page);
return true;
}
@@ -989,8 +972,7 @@ function _tpl_img_action($data, $param=NULL) {
}
/**
- * This function inserts a 1x1 pixel gif which in reality
- * is the indexer function.
+ * This function inserts a small gif which in reality is the indexer function.
*
* Should be called somewhere at the very end of the main.php
* template
@@ -1000,12 +982,10 @@ function tpl_indexerWebBug(){
global $INFO;
if(!$INFO['exists']) return false;
- if(isHiddenPage($ID)) return false; //no need to index hidden pages
-
$p = array();
$p['src'] = DOKU_BASE.'lib/exe/indexer.php?id='.rawurlencode($ID).
'&'.time();
- $p['width'] = 1;
+ $p['width'] = 2; //no more 1x1 px image because we live in times of ad blockers...
$p['height'] = 1;
$p['alt'] = '';
$att = buildAttributes($p);
@@ -1178,7 +1158,7 @@ function tpl_actiondropdown($empty='',$button='&gt;'){
if($REV) echo '<input type="hidden" name="rev" value="'.$REV.'" />';
echo '<input type="hidden" name="sectok" value="'.getSecurityToken().'" />';
- echo '<select name="do" id="action__selector" class="edit">';
+ echo '<select name="do" class="edit quickselect">';
echo '<option value="">'.$empty.'</option>';
echo '<optgroup label=" &mdash; ">';
@@ -1218,7 +1198,7 @@ function tpl_actiondropdown($empty='',$button='&gt;'){
echo '</optgroup>';
echo '</select>';
- echo '<input type="submit" value="'.$button.'" id="action__selectorbtn" />';
+ echo '<input type="submit" value="'.$button.'" />';
echo '</form>';
}
@@ -1248,7 +1228,7 @@ function tpl_license($img='badge',$imgonly=false,$return=false){
}
if(!$imgonly) {
$out .= $lang['license'];
- $out .= '<a href="'.$lic['url'].'" rel="license" class="urlextern"';
+ $out .= ' <a href="'.$lic['url'].'" rel="license" class="urlextern"';
if($conf['target']['extern']) $out .= ' target="'.$conf['target']['extern'].'"';
$out .= '>'.$lic['name'].'</a>';
}
@@ -1360,15 +1340,50 @@ function tpl_flush(){
/**
- * Use favicon.ico from data/media root directory if it exists, otherwise use
+ * Returns icon from data/media root directory if it exists, otherwise
* the one in the template's image directory.
*
+ * @param bool $abs - if to use absolute URL
+ * @param string $fileName - file name of icon
* @author Anika Henke <anika@selfthinker.org>
*/
-function tpl_getFavicon() {
- if (file_exists(mediaFN('favicon.ico')))
- return ml('favicon.ico');
- return DOKU_TPL.'images/favicon.ico';
+function tpl_getFavicon($abs=false, $fileName='favicon.ico') {
+ if (file_exists(mediaFN($fileName))) {
+ return ml($fileName, '', true, '', $abs);
+ }
+
+ if($abs) {
+ return DOKU_URL.substr(DOKU_TPL.'images/'.$fileName, strlen(DOKU_REL));
+ }
+ return DOKU_TPL.'images/'.$fileName;
+}
+
+/**
+ * Returns <link> tag for various icon types (favicon|mobile|generic)
+ *
+ * @param array $types - list of icon types to display (favicon|mobile|generic)
+ * @author Anika Henke <anika@selfthinker.org>
+ */
+function tpl_favicon($types=array('favicon')) {
+
+ $return = '';
+
+ foreach ($types as $type) {
+ switch($type) {
+ case 'favicon':
+ $return .= '<link rel="shortcut icon" href="'.tpl_getFavicon().'" />'.NL;
+ break;
+ case 'mobile':
+ $return .= '<link rel="apple-touch-icon" href="'.tpl_getFavicon(false, 'apple-touch-icon.png').'" />'.NL;
+ break;
+ case 'generic':
+ // ideal world solution, which doesn't work in any browser yet
+ $return .= '<link rel="icon" href="'.tpl_getFavicon(false, 'icon.svg').'" type="image/svg+xml" />'.NL;
+ break;
+ }
+ }
+
+ return $return;
}
diff --git a/inc/toolbar.php b/inc/toolbar.php
index 58d80043c..02172510e 100644
--- a/inc/toolbar.php
+++ b/inc/toolbar.php
@@ -213,7 +213,7 @@ function toolbar_JSdefines($varname){
'type' => 'picker',
'title' => $lang['qb_chars'],
'icon' => 'chars.png',
- 'list' => explode(' ','À à Á á  â à ã Ä ä Ǎ ǎ Ă ă Å å Ā ā Ą ą Æ æ Ć ć Ç ç Č č Ĉ ĉ Ċ ċ Ð đ ð Ď ď È è É é Ê ê Ë ë Ě ě Ē ē Ė ė Ę ę Ģ ģ Ĝ ĝ Ğ ğ Ġ ġ Ĥ ĥ Ì ì Í í Î î Ï ï Ǐ ǐ Ī ī İ ı Į į Ĵ ĵ Ķ ķ Ĺ ĺ Ļ ļ Ľ ľ Ł ł Ŀ ŀ Ń ń Ñ ñ Ņ ņ Ň ň Ò ò Ó ó Ô ô Õ õ Ö ö Ǒ ǒ Ō ō Ő ő Œ œ Ø ø Ŕ ŕ Ŗ ŗ Ř ř Ś ś Ş ş Š š Ŝ ŝ Ţ ţ Ť ť Ù ù Ú ú Û û Ü ü Ǔ ǔ Ŭ ŭ Ū ū Ů ů ǖ ǘ ǚ ǜ Ų ų Ű ű Ŵ ŵ Ý ý Ÿ ÿ Ŷ ŷ Ź ź Ž ž Ż ż Þ þ ß Ħ ħ ¿ ¡ ¢ £ ¤ ¥ € ¦ § ª ¬ ¯ ° ± ÷ ‰ ¼ ½ ¾ ¹ ² ³ µ ¶ † ‡ · • º ∀ ∂ ∃ Ə ə ∅ ∇ ∈ ∉ ∋ ∏ ∑ ‾ − ∗ √ ∝ ∞ ∠ ∧ ∨ ∩ ∪ ∫ ∴ ∼ ≅ ≈ ≠ ≡ ≤ ≥ ⊂ ⊃ ⊄ ⊆ ⊇ ⊕ ⊗ ⊥ ⋅ ◊ ℘ ℑ ℜ ℵ ♠ ♣ ♥ ♦ α β Γ γ Δ δ ε ζ η Θ θ ι κ Λ λ μ Ξ ξ Π π ρ Σ σ Τ τ υ Φ φ χ Ψ ψ Ω ω ★ ☆ ☎ ☚ ☛ ☜ ☝ ☞ ☟ ☹ ☺ ✔ ✘ × „ “ ” ‚ ‘ ’ « » ‹ › — – … ← ↑ → ↓ ↔ ⇐ ⇑ ⇒ ⇓ ⇔ © ™ ® ′ ″ [ ] { } ~ ( ) % § $ # | @'),
+ 'list' => explode(' ','À à Á á  â à ã Ä ä Ǎ ǎ Ă ă Å å Ā ā Ą ą Æ æ Ć ć Ç ç Č č Ĉ ĉ Ċ ċ Ð đ ð Ď ď È è É é Ê ê Ë ë Ě ě Ē ē Ė ė Ę ę Ģ ģ Ĝ ĝ Ğ ğ Ġ ġ Ĥ ĥ Ì ì Í í Î î Ï ï Ǐ ǐ Ī ī İ ı Į į Ĵ ĵ Ķ ķ Ĺ ĺ Ļ ļ Ľ ľ Ł ł Ŀ ŀ Ń ń Ñ ñ Ņ ņ Ň ň Ò ò Ó ó Ô ô Õ õ Ö ö Ǒ ǒ Ō ō Ő ő Œ œ Ø ø Ŕ ŕ Ŗ ŗ Ř ř Ś ś Ş ş Š š Ŝ ŝ Ţ ţ Ť ť Ù ù Ú ú Û û Ü ü Ǔ ǔ Ŭ ŭ Ū ū Ů ů ǖ ǘ ǚ ǜ Ų ų Ű ű Ŵ ŵ Ý ý Ÿ ÿ Ŷ ŷ Ź ź Ž ž Ż ż Þ þ ß Ħ ħ ¿ ¡ ¢ £ ¤ ¥ € ¦ § ª ¬ ¯ ° ± ÷ ‰ ¼ ½ ¾ ¹ ² ³ µ ¶ † ‡ · • º ∀ ∂ ∃ Ə ə ∅ ∇ ∈ ∉ ∋ ∏ ∑ ‾ − ∗ × ⁄ √ ∝ ∞ ∠ ∧ ∨ ∩ ∪ ∫ ∴ ∼ ≅ ≈ ≠ ≡ ≤ ≥ ⊂ ⊃ ⊄ ⊆ ⊇ ⊕ ⊗ ⊥ ⋅ ◊ ℘ ℑ ℜ ℵ ♠ ♣ ♥ ♦ α β Γ γ Δ δ ε ζ η Θ θ ι κ Λ λ μ Ξ ξ Π π ρ Σ σ Τ τ υ Φ φ χ Ψ ψ Ω ω ★ ☆ ☎ ☚ ☛ ☜ ☝ ☞ ☟ ☹ ☺ ✔ ✘ „ “ ” ‚ ‘ ’ « » ‹ › — – … ← ↑ → ↓ ↔ ⇐ ⇑ ⇒ ⇓ ⇔ © ™ ® ′ ″ [ ] { } ~ ( ) % § $ # | @'),
'block' => false
),
array(
diff --git a/inc/utf8.php b/inc/utf8.php
index 3d4de2289..303987e4f 100644
--- a/inc/utf8.php
+++ b/inc/utf8.php
@@ -1261,6 +1261,7 @@ if(empty($UTF8_SPECIAL_CHARS2)) $UTF8_SPECIAL_CHARS2 =
* @link http://www.btranslations.com/resources/romanization/korean.asp
* @author Arthit Suriyawongkul <arthit@gmail.com>
* @author Denis Scheither <amorphis@uni-bremen.de>
+ * @author Eivind Morland <eivind.morland@gmail.com>
*/
global $UTF8_ROMANIZATION;
if(empty($UTF8_ROMANIZATION)) $UTF8_ROMANIZATION = array(
@@ -1293,6 +1294,11 @@ if(empty($UTF8_ROMANIZATION)) $UTF8_ROMANIZATION = array(
'ड'=>'dq','ढ'=>'dqh','ण'=>'nq','त'=>'t','थ'=>'th','द'=>'d','ध'=>'dh',
'न'=>'n','प'=>'p','फ'=>'ph','ब'=>'b','भ'=>'bh','म'=>'m','य'=>'z','र'=>'r',
'ल'=>'l','व'=>'v','श'=>'sh','ष'=>'sqh','स'=>'s','ह'=>'x',
+ //Sanskrit diacritics
+ 'Ā'=>'A','Ī'=>'I','Ū'=>'U','Ṛ'=>'R','Ṝ'=>'R','Ṅ'=>'N','Ñ'=>'N','Ṭ'=>'T',
+ 'Ḍ'=>'D','Ṇ'=>'N','Ś'=>'S','Ṣ'=>'S','Ṁ'=>'M','Ṃ'=>'M','Ḥ'=>'H','Ḷ'=>'L','Ḹ'=>'L',
+ 'ā'=>'a','ī'=>'i','ū'=>'u','ṛ'=>'r','ṝ'=>'r','ṅ'=>'n','ñ'=>'n','ṭ'=>'t',
+ 'ḍ'=>'d','ṇ'=>'n','ś'=>'s','ṣ'=>'s','ṁ'=>'m','ṃ'=>'m','ḥ'=>'h','ḷ'=>'l','ḹ'=>'l',
//Hebrew
'א'=>'a', 'ב'=>'b','ג'=>'g','ד'=>'d','ה'=>'h','ו'=>'v','ז'=>'z','ח'=>'kh','ט'=>'th',
'י'=>'y','ך'=>'h','כ'=>'k','ל'=>'l','ם'=>'m','מ'=>'m','ן'=>'n','נ'=>'n',
diff --git a/install.php b/install.php
index 9b852977f..5d71db515 100644
--- a/install.php
+++ b/install.php
@@ -46,7 +46,8 @@ $dokuwiki_hash = array(
'2008-05-04' => '1e5c42eac3219d9e21927c39e3240aad',
'2009-02-14' => 'ec8c04210732a14fdfce0f7f6eead865',
'2009-12-25' => '993c4b2b385643efe5abf8e7010e11f4',
- '2010-11-07' => '7921d48195f4db21b8ead6d9bea801b8'
+ '2010-11-07' => '7921d48195f4db21b8ead6d9bea801b8',
+ '2011-05-25' => '4241865472edb6fa14a1227721008072',
);
diff --git a/lib/_fla/.htaccess b/lib/_fla/.htaccess
index 9a7d38c12..055d099c7 100644
--- a/lib/_fla/.htaccess
+++ b/lib/_fla/.htaccess
@@ -1,3 +1,4 @@
## no access to the fla directory
order allow,deny
deny from all
+Satisfy All
diff --git a/lib/exe/ajax.php b/lib/exe/ajax.php
index e514762fd..2bfa3680c 100644
--- a/lib/exe/ajax.php
+++ b/lib/exe/ajax.php
@@ -8,7 +8,7 @@
//fix for Opera XMLHttpRequests
if(!count($_POST) && !empty($HTTP_RAW_POST_DATA)){
- parse_str($HTTP_RAW_POST_DATA, $_POST);
+ parse_str($HTTP_RAW_POST_DATA, $_POST);
}
if(!defined('DOKU_INC')) define('DOKU_INC',dirname(__FILE__).'/../../');
@@ -20,25 +20,25 @@ header('Content-Type: text/html; charset=utf-8');
//call the requested function
-if(isset($_POST['call']))
- $call = $_POST['call'];
-else if(isset($_GET['call']))
- $call = $_GET['call'];
-else
- exit;
-
+if(isset($_POST['call'])){
+ $call = $_POST['call'];
+}else if(isset($_GET['call'])){
+ $call = $_GET['call'];
+}else{
+ exit;
+}
$callfn = 'ajax_'.$call;
if(function_exists($callfn)){
- $callfn();
+ $callfn();
}else{
- $evt = new Doku_Event('AJAX_CALL_UNKNOWN', $call);
- if ($evt->advise_before()) {
- print "AJAX call '".htmlspecialchars($call)."' unknown!\n";
- exit;
- }
- $evt->advise_after();
- unset($evt);
+ $evt = new Doku_Event('AJAX_CALL_UNKNOWN', $call);
+ if ($evt->advise_before()) {
+ print "AJAX call '".htmlspecialchars($call)."' unknown!\n";
+ exit;
+ }
+ $evt->advise_after();
+ unset($evt);
}
/**
@@ -47,33 +47,33 @@ if(function_exists($callfn)){
* @author Andreas Gohr <andi@splitbrain.org>
*/
function ajax_qsearch(){
- global $conf;
- global $lang;
-
- $query = $_POST['q'];
- if(empty($query)) $query = $_GET['q'];
- if(empty($query)) return;
-
- $data = ft_pageLookup($query, true, useHeading('navigation'));
-
- if(!count($data)) return;
-
- print '<strong>'.$lang['quickhits'].'</strong>';
- print '<ul>';
- foreach($data as $id => $title){
- if (useHeading('navigation')) {
- $name = $title;
- } else {
- $ns = getNS($id);
- if($ns){
- $name = shorten(noNS($id), ' ('.$ns.')',30);
- }else{
- $name = $id;
+ global $conf;
+ global $lang;
+
+ $query = $_POST['q'];
+ if(empty($query)) $query = $_GET['q'];
+ if(empty($query)) return;
+
+ $data = ft_pageLookup($query, true, useHeading('navigation'));
+
+ if(!count($data)) return;
+
+ print '<strong>'.$lang['quickhits'].'</strong>';
+ print '<ul>';
+ foreach($data as $id => $title){
+ if (useHeading('navigation')) {
+ $name = $title;
+ } else {
+ $ns = getNS($id);
+ if($ns){
+ $name = noNS($id).' ('.$ns.')';
+ }else{
+ $name = $id;
+ }
}
+ echo '<li>' . html_wikilink(':'.$id,$name) . '</li>';
}
- echo '<li>' . html_wikilink(':'.$id,$name) . '</li>';
- }
- print '</ul>';
+ print '</ul>';
}
/**
@@ -83,36 +83,36 @@ function ajax_qsearch(){
* @author Mike Frysinger <vapier@gentoo.org>
*/
function ajax_suggestions() {
- global $conf;
- global $lang;
-
- $query = cleanID($_POST['q']);
- if(empty($query)) $query = cleanID($_GET['q']);
- if(empty($query)) return;
-
- $data = array();
- $data = ft_pageLookup($query);
- if(!count($data)) return;
- $data = array_keys($data);
-
- // limit results to 15 hits
- $data = array_slice($data, 0, 15);
- $data = array_map('trim',$data);
- $data = array_map('noNS',$data);
- $data = array_unique($data);
- sort($data);
-
- /* now construct a json */
- $suggestions = array(
- $query, // the original query
- $data, // some suggestions
- array(), // no description
- array() // no urls
- );
- $json = new JSON();
-
- header('Content-Type: application/x-suggestions+json');
- print $json->encode($suggestions);
+ global $conf;
+ global $lang;
+
+ $query = cleanID($_POST['q']);
+ if(empty($query)) $query = cleanID($_GET['q']);
+ if(empty($query)) return;
+
+ $data = array();
+ $data = ft_pageLookup($query);
+ if(!count($data)) return;
+ $data = array_keys($data);
+
+ // limit results to 15 hits
+ $data = array_slice($data, 0, 15);
+ $data = array_map('trim',$data);
+ $data = array_map('noNS',$data);
+ $data = array_unique($data);
+ sort($data);
+
+ /* now construct a json */
+ $suggestions = array(
+ $query, // the original query
+ $data, // some suggestions
+ array(), // no description
+ array() // no urls
+ );
+ $json = new JSON();
+
+ header('Content-Type: application/x-suggestions+json');
+ print $json->encode($suggestions);
}
/**
@@ -121,32 +121,42 @@ function ajax_suggestions() {
* Andreas Gohr <andi@splitbrain.org>
*/
function ajax_lock(){
- global $conf;
- global $lang;
- $id = cleanID($_POST['id']);
- if(empty($id)) return;
+ global $conf;
+ global $lang;
+ global $ID;
+ global $INFO;
- if(!checklock($id)){
- lock($id);
- echo 1;
- }
+ $ID = cleanID($_POST['id']);
+ if(empty($ID)) return;
- if($conf['usedraft'] && $_POST['wikitext']){
- $client = $_SERVER['REMOTE_USER'];
- if(!$client) $client = clientIP(true);
+ $INFO = pageinfo();
+
+ if (!$INFO['writable']) {
+ echo 'Permission denied';
+ return;
+ }
- $draft = array('id' => $id,
- 'prefix' => substr($_POST['prefix'], 0, -1),
- 'text' => $_POST['wikitext'],
- 'suffix' => $_POST['suffix'],
- 'date' => (int) $_POST['date'],
- 'client' => $client,
- );
- $cname = getCacheName($draft['client'].$id,'.draft');
- if(io_saveFile($cname,serialize($draft))){
- echo $lang['draftdate'].' '.dformat();
+ if(!checklock($ID)){
+ lock($ID);
+ echo 1;
+ }
+
+ if($conf['usedraft'] && $_POST['wikitext']){
+ $client = $_SERVER['REMOTE_USER'];
+ if(!$client) $client = clientIP(true);
+
+ $draft = array('id' => $ID,
+ 'prefix' => substr($_POST['prefix'], 0, -1),
+ 'text' => $_POST['wikitext'],
+ 'suffix' => $_POST['suffix'],
+ 'date' => (int) $_POST['date'],
+ 'client' => $client,
+ );
+ $cname = getCacheName($draft['client'].$ID,'.draft');
+ if(io_saveFile($cname,serialize($draft))){
+ echo $lang['draftdate'].' '.dformat();
+ }
}
- }
}
@@ -156,14 +166,14 @@ function ajax_lock(){
* @author Andreas Gohr <andi@splitbrain.org>
*/
function ajax_draftdel(){
- $id = cleanID($_REQUEST['id']);
- if(empty($id)) return;
+ $id = cleanID($_REQUEST['id']);
+ if(empty($id)) return;
- $client = $_SERVER['REMOTE_USER'];
- if(!$client) $client = clientIP(true);
+ $client = $_SERVER['REMOTE_USER'];
+ if(!$client) $client = clientIP(true);
- $cname = getCacheName($client.$id,'.draft');
- @unlink($cname);
+ $cname = getCacheName($client.$id,'.draft');
+ @unlink($cname);
}
/**
@@ -172,22 +182,20 @@ function ajax_draftdel(){
* @author Andreas Gohr <andi@splitbrain.org>
*/
function ajax_medians(){
- global $conf;
-
- // wanted namespace
- $ns = cleanID($_POST['ns']);
- $dir = utf8_encodeFN(str_replace(':','/',$ns));
-
- $lvl = count(explode(':',$ns));
-
- $data = array();
- search($data,$conf['mediadir'],'search_index',array('nofiles' => true),$dir);
- foreach($data as $item){
- $item['level'] = $lvl+1;
- echo media_nstree_li($item);
- echo media_nstree_item($item);
- echo '</li>';
- }
+ global $conf;
+
+ // wanted namespace
+ $ns = cleanID($_POST['ns']);
+ $dir = utf8_encodeFN(str_replace(':','/',$ns));
+
+ $lvl = count(explode(':',$ns));
+
+ $data = array();
+ search($data,$conf['mediadir'],'search_index',array('nofiles' => true),$dir);
+ foreach(array_keys($data) as $item){
+ $data[$item]['level'] = $lvl+1;
+ }
+ echo html_buildlist($data, 'idx', 'media_nstree_item', 'media_nstree_li');
}
/**
@@ -196,11 +204,11 @@ function ajax_medians(){
* @author Andreas Gohr <andi@splitbrain.org>
*/
function ajax_medialist(){
- global $conf;
- global $NS;
+ global $conf;
+ global $NS;
- $NS = $_POST['ns'];
- tpl_mediaContent(true);
+ $NS = $_POST['ns'];
+ tpl_mediaContent(true);
}
/**
@@ -209,24 +217,20 @@ function ajax_medialist(){
* @author Andreas Gohr <andi@splitbrain.org>
*/
function ajax_index(){
- global $conf;
-
- // wanted namespace
- $ns = cleanID($_POST['idx']);
- $dir = utf8_encodeFN(str_replace(':','/',$ns));
-
- $lvl = count(explode(':',$ns));
-
- $data = array();
- search($data,$conf['datadir'],'search_index',array('ns' => $ns),$dir);
- foreach($data as $item){
- $item['level'] = $lvl+1;
- echo html_li_index($item);
- echo '<div class="li">';
- echo html_list_index($item);
- echo '</div>';
- echo '</li>';
- }
+ global $conf;
+
+ // wanted namespace
+ $ns = cleanID($_POST['idx']);
+ $dir = utf8_encodeFN(str_replace(':','/',$ns));
+
+ $lvl = count(explode(':',$ns));
+
+ $data = array();
+ search($data,$conf['datadir'],'search_index',array('ns' => $ns),$dir);
+ foreach(array_keys($data) as $item){
+ $data[$item]['level'] = $lvl+1;
+ }
+ echo html_buildlist($data, 'idx', 'html_list_index', 'html_li_index');
}
/**
@@ -235,107 +239,105 @@ function ajax_index(){
* @author Andreas Gohr <gohr@cosmocode.de>
*/
function ajax_linkwiz(){
- global $conf;
- global $lang;
-
- $q = ltrim($_POST['q'],':');
- $id = noNS($q);
- $ns = getNS($q);
-
- $ns = cleanID($ns);
- $id = cleanID($id);
-
- $nsd = utf8_encodeFN(str_replace(':','/',$ns));
- $idd = utf8_encodeFN(str_replace(':','/',$id));
-
- $data = array();
- if($q && !$ns){
-
- // use index to lookup matching pages
- $pages = array();
- $pages = ft_pageLookup($id,true);
-
- // result contains matches in pages and namespaces
- // we now extract the matching namespaces to show
- // them seperately
- $dirs = array();
-
-
- foreach($pages as $pid => $title){
- if(strpos(noNS($pid),$id) === false){
- // match was in the namespace
- $dirs[getNS($pid)] = 1; // assoc array avoids dupes
- }else{
- // it is a matching page, add it to the result
- $data[] = array(
- 'id' => $pid,
- 'title' => $title,
- 'type' => 'f',
- );
- }
- unset($pages[$pid]);
- }
- foreach($dirs as $dir => $junk){
- $data[] = array(
- 'id' => $dir,
- 'type' => 'd',
- );
- }
+ global $conf;
+ global $lang;
+
+ $q = ltrim(trim($_POST['q']),':');
+ $id = noNS($q);
+ $ns = getNS($q);
+
+ $ns = cleanID($ns);
+ $id = cleanID($id);
+
+ $nsd = utf8_encodeFN(str_replace(':','/',$ns));
+ $idd = utf8_encodeFN(str_replace(':','/',$id));
+
+ $data = array();
+ if($q && !$ns){
+
+ // use index to lookup matching pages
+ $pages = array();
+ $pages = ft_pageLookup($id,true);
+
+ // result contains matches in pages and namespaces
+ // we now extract the matching namespaces to show
+ // them seperately
+ $dirs = array();
+
+ foreach($pages as $pid => $title){
+ if(strpos(noNS($pid),$id) === false){
+ // match was in the namespace
+ $dirs[getNS($pid)] = 1; // assoc array avoids dupes
+ }else{
+ // it is a matching page, add it to the result
+ $data[] = array(
+ 'id' => $pid,
+ 'title' => $title,
+ 'type' => 'f',
+ );
+ }
+ unset($pages[$pid]);
+ }
+ foreach($dirs as $dir => $junk){
+ $data[] = array(
+ 'id' => $dir,
+ 'type' => 'd',
+ );
+ }
- }else{
-
- $opts = array(
- 'depth' => 1,
- 'listfiles' => true,
- 'listdirs' => true,
- 'pagesonly' => true,
- 'firsthead' => true,
- 'sneakyacl' => $conf['sneaky_index'],
- );
- if($id) $opts['filematch'] = '^.*\/'.$id;
- if($id) $opts['dirmatch'] = '^.*\/'.$id;
- search($data,$conf['datadir'],'search_universal',$opts,$nsd);
-
- // add back to upper
- if($ns){
- array_unshift($data,array(
- 'id' => getNS($ns),
- 'type' => 'u',
- ));
- }
- }
+ }else{
- // fixme sort results in a useful way ?
+ $opts = array(
+ 'depth' => 1,
+ 'listfiles' => true,
+ 'listdirs' => true,
+ 'pagesonly' => true,
+ 'firsthead' => true,
+ 'sneakyacl' => $conf['sneaky_index'],
+ );
+ if($id) $opts['filematch'] = '^.*\/'.$id;
+ if($id) $opts['dirmatch'] = '^.*\/'.$id;
+ search($data,$conf['datadir'],'search_universal',$opts,$nsd);
+
+ // add back to upper
+ if($ns){
+ array_unshift($data,array(
+ 'id' => getNS($ns),
+ 'type' => 'u',
+ ));
+ }
+ }
- if(!count($data)){
- echo $lang['nothingfound'];
- exit;
- }
+ // fixme sort results in a useful way ?
- // output the found data
- $even = 1;
- foreach($data as $item){
- $even *= -1; //zebra
+ if(!count($data)){
+ echo $lang['nothingfound'];
+ exit;
+ }
- if(($item['type'] == 'd' || $item['type'] == 'u') && $item['id']) $item['id'] .= ':';
- $link = wl($item['id']);
+ // output the found data
+ $even = 1;
+ foreach($data as $item){
+ $even *= -1; //zebra
- echo '<div class="'.(($even > 0)?'even':'odd').' type_'.$item['type'].'">';
+ if(($item['type'] == 'd' || $item['type'] == 'u') && $item['id']) $item['id'] .= ':';
+ $link = wl($item['id']);
+ echo '<div class="'.(($even > 0)?'even':'odd').' type_'.$item['type'].'">';
- if($item['type'] == 'u'){
- $name = $lang['upperns'];
- }else{
- $name = htmlspecialchars($item['id']);
- }
+ if($item['type'] == 'u'){
+ $name = $lang['upperns'];
+ }else{
+ $name = htmlspecialchars($item['id']);
+ }
- echo '<a href="'.$link.'" title="'.htmlspecialchars($item['id']).'" class="wikilink1">'.$name.'</a>';
+ echo '<a href="'.$link.'" title="'.htmlspecialchars($item['id']).'" class="wikilink1">'.$name.'</a>';
- if($item['title']){
- echo '<span>'.htmlspecialchars($item['title']).'</span>';
+ if($item['title']){
+ echo '<span>'.htmlspecialchars($item['title']).'</span>';
+ }
+ echo '</div>';
}
- echo '</div>';
- }
}
diff --git a/lib/exe/css.php b/lib/exe/css.php
index e64ebc22a..8f86f2433 100644
--- a/lib/exe/css.php
+++ b/lib/exe/css.php
@@ -30,10 +30,10 @@ function css_out(){
global $lang;
global $config_cascade;
- $style = '';
+ $mediatype = 'screen';
if (isset($_REQUEST['s']) &&
in_array($_REQUEST['s'], array('all', 'print', 'feed'))) {
- $style = $_REQUEST['s'];
+ $mediatype = $_REQUEST['s'];
}
$tpl = trim(preg_replace('/[^\w-]+/','',$_REQUEST['t']));
@@ -46,7 +46,7 @@ function css_out(){
}
// The generated script depends on some dynamic options
- $cache = getCacheName('styles'.$_SERVER['HTTP_HOST'].$_SERVER['SERVER_PORT'].DOKU_BASE.$tplinc.$style,'.css');
+ $cache = new cache('styles'.$_SERVER['HTTP_HOST'].$_SERVER['SERVER_PORT'].DOKU_BASE.$tplinc.$mediatype,'.css');
// load template styles
$tplstyles = array();
@@ -60,49 +60,41 @@ function css_out(){
// Array of needed files and their web locations, the latter ones
// are needed to fix relative paths in the stylesheets
$files = array();
- //if (isset($tplstyles['all'])) $files = array_merge($files, $tplstyles['all']);
- if(!empty($style)){
- $files[DOKU_INC.'lib/styles/'.$style.'.css'] = DOKU_BASE.'lib/styles/';
- // load plugin, template, user styles
- $files = array_merge($files, css_pluginstyles($style));
- if (isset($tplstyles[$style])) $files = array_merge($files, $tplstyles[$style]);
-
- if(isset($config_cascade['userstyle'][$style])){
- $files[$config_cascade['userstyle'][$style]] = DOKU_BASE;
- }
- }else{
- $files[DOKU_INC.'lib/styles/style.css'] = DOKU_BASE.'lib/styles/';
- // load plugin, template, user styles
- $files = array_merge($files, css_pluginstyles('screen'));
- if (isset($tplstyles['screen'])) $files = array_merge($files, $tplstyles['screen']);
+ // load core styles
+ $files[DOKU_INC.'lib/styles/'.$mediatype.'.css'] = DOKU_BASE.'lib/styles/';
+ // load jQuery-UI theme
+ $files[DOKU_INC.'lib/scripts/jquery/jquery-ui-theme/smoothness.css'] = DOKU_BASE.'lib/scripts/jquery/jquery-ui-theme/';
+ // load plugin styles
+ $files = array_merge($files, css_pluginstyles($mediatype));
+ // load template styles
+ if (isset($tplstyles[$mediatype])) {
+ $files = array_merge($files, $tplstyles[$mediatype]);
+ }
+ // if old 'default' userstyle setting exists, make it 'screen' userstyle for backwards compatibility
+ if (isset($config_cascade['userstyle']['default'])) {
+ $config_cascade['userstyle']['screen'] = $config_cascade['userstyle']['default'];
+ }
+ // load user styles
+ if(isset($config_cascade['userstyle'][$mediatype])){
+ $files[$config_cascade['userstyle'][$mediatype]] = DOKU_BASE;
+ }
+ // load rtl styles
+ // @todo: this currently adds the rtl styles only to the 'screen' media type
+ // but 'print' and 'all' should also be supported
+ if ($mediatype=='screen') {
if($lang['direction'] == 'rtl'){
if (isset($tplstyles['rtl'])) $files = array_merge($files, $tplstyles['rtl']);
}
- if(isset($config_cascade['userstyle']['default'])){
- $files[$config_cascade['userstyle']['default']] = DOKU_BASE;
- }
}
- // check cache age & handle conditional request
- header('Cache-Control: public, max-age=3600');
- header('Pragma: public');
- if(css_cacheok($cache,array_keys($files),$tplinc)){
- http_conditionalRequest(filemtime($cache));
- if($conf['allowdebug']) header("X-CacheUsed: $cache");
-
- // finally send output
- if ($conf['gzip_output'] && http_gzip_valid($cache)) {
- header('Vary: Accept-Encoding');
- header('Content-Encoding: gzip');
- readfile($cache.".gz");
- } else {
- if (!http_sendfile($cache)) readfile($cache);
- }
+ $cache_files = array_merge(array_keys($files), getConfigFiles('main'));
+ $cache_files[] = $tplinc.'style.ini';
+ $cache_files[] = __FILE__;
- return;
- } else {
- http_conditionalRequest(time());
- }
+ // check cache age & handle conditional request
+ // This may exit if a cache can be used
+ http_cached($cache->cache,
+ $cache->useCache(array('files' => $cache_files)));
// start output buffering and build the stylesheet
ob_start();
@@ -123,50 +115,21 @@ function css_out(){
// apply style replacements
$css = css_applystyle($css,$tplinc);
+ // place all @import statements at the top of the file
+ $css = css_moveimports($css);
+
// compress whitespace and comments
if($conf['compress']){
$css = css_compress($css);
}
- // save cache file
- io_saveFile($cache,$css);
- if(function_exists('gzopen')) io_saveFile("$cache.gz",$css);
-
- // finally send output
- if ($conf['gzip_output']) {
- header('Vary: Accept-Encoding');
- header('Content-Encoding: gzip');
- print gzencode($css,9,FORCE_GZIP);
- } else {
- print $css;
+ // embed small images right into the stylesheet
+ if($conf['cssdatauri']){
+ $base = preg_quote(DOKU_BASE,'#');
+ $css = preg_replace_callback('#(url\([ \'"]*)('.$base.')(.*?(?:\.(png|gif)))#i','css_datauri',$css);
}
-}
-
-/**
- * Checks if a CSS Cache file still is valid
- *
- * @author Andreas Gohr <andi@splitbrain.org>
- */
-function css_cacheok($cache,$files,$tplinc){
- global $config_cascade;
-
- if(isset($_REQUEST['purge'])) return false; //support purge request
-
- $ctime = @filemtime($cache);
- if(!$ctime) return false; //There is no cache
-
- // some additional files to check
- $files = array_merge($files, getConfigFiles('main'));
- $files[] = $tplinc.'style.ini';
- $files[] = __FILE__;
- // now walk the files
- foreach($files as $file){
- if(@filemtime($file) > $ctime){
- return false;
- }
- }
- return true;
+ http_cached_finish($cache->cache, $css);
}
/**
@@ -199,7 +162,7 @@ function css_interwiki(){
// default style
echo 'a.interwiki {';
echo ' background: transparent url('.DOKU_BASE.'lib/images/interwiki.png) 0px 1px no-repeat;';
- echo ' padding-left: 16px;';
+ echo ' padding: 1px 0px 1px 16px;';
echo '}';
// additional styles when icon available
@@ -264,30 +227,53 @@ function css_loadfile($file,$location=''){
$css = io_readFile($file);
if(!$location) return $css;
- $css = preg_replace('#(url\([ \'"]*)((?!/|http://|https://| |\'|"))#','\\1'.$location.'\\3',$css);
+ $css = preg_replace('#(url\([ \'"]*)(?!/|data:|http://|https://| |\'|")#','\\1'.$location,$css);
+ $css = preg_replace('#(@import\s+[\'"])(?!/|data:|http://|https://)#', '\\1'.$location, $css);
+
return $css;
}
+/**
+ * Converte local image URLs to data URLs if the filesize is small
+ *
+ * Callback for preg_replace_callback
+ */
+function css_datauri($match){
+ global $conf;
+
+ $pre = unslash($match[1]);
+ $base = unslash($match[2]);
+ $url = unslash($match[3]);
+ $ext = unslash($match[4]);
+
+ $local = DOKU_INC.$url;
+ $size = @filesize($local);
+ if($size && $size < $conf['cssdatauri']){
+ $data = base64_encode(file_get_contents($local));
+ }
+ if($data){
+ $url = 'data:image/'.$ext.';base64,'.$data;
+ }else{
+ $url = $base.$url;
+ }
+ return $pre.$url;
+}
+
/**
* Returns a list of possible Plugin Styles (no existance check here)
*
* @author Andreas Gohr <andi@splitbrain.org>
*/
-function css_pluginstyles($mode='screen'){
+function css_pluginstyles($mediatype='screen'){
global $lang;
$list = array();
$plugins = plugin_list();
foreach ($plugins as $p){
- if($mode == 'all'){
- $list[DOKU_PLUGIN."$p/all.css"] = DOKU_BASE."lib/plugins/$p/";
- }elseif($mode == 'print'){
- $list[DOKU_PLUGIN."$p/print.css"] = DOKU_BASE."lib/plugins/$p/";
- }elseif($mode == 'feed'){
- $list[DOKU_PLUGIN."$p/feed.css"] = DOKU_BASE."lib/plugins/$p/";
- }else{
+ $list[DOKU_PLUGIN."$p/$mediatype.css"] = DOKU_BASE."lib/plugins/$p/";
+ // alternative for screen.css
+ if ($mediatype=='screen') {
$list[DOKU_PLUGIN."$p/style.css"] = DOKU_BASE."lib/plugins/$p/";
- $list[DOKU_PLUGIN."$p/screen.css"] = DOKU_BASE."lib/plugins/$p/";
}
if($lang['direction'] == 'rtl'){
$list[DOKU_PLUGIN."$p/rtl.css"] = DOKU_BASE."lib/plugins/$p/";
@@ -297,6 +283,29 @@ function css_pluginstyles($mode='screen'){
}
/**
+ * Move all @import statements in a combined stylesheet to the top so they
+ * aren't ignored by the browser.
+ *
+ * @author Gabriel Birke <birke@d-scribe.de>
+ */
+function css_moveimports($css)
+{
+ if(!preg_match_all('/@import\s+(?:url\([^)]+\)|"[^"]+")\s*[^;]*;\s*/', $css, $matches, PREG_OFFSET_CAPTURE)) {
+ return $css;
+ }
+ $newCss = "";
+ $imports = "";
+ $offset = 0;
+ foreach($matches[0] as $match) {
+ $newCss .= substr($css, $offset, $match[1] - $offset);
+ $imports .= $match[0];
+ $offset = $match[1] + strlen($match[0]);
+ }
+ $newCss .= substr($css, $offset);
+ return $imports.$newCss;
+}
+
+/**
* Very simple CSS optimizer
*
* @author Andreas Gohr <andi@splitbrain.org>
diff --git a/lib/exe/indexer.php b/lib/exe/indexer.php
index 58b0d0787..95e2af05b 100644
--- a/lib/exe/indexer.php
+++ b/lib/exe/indexer.php
@@ -11,9 +11,6 @@ require_once(DOKU_INC.'inc/init.php');
session_write_close(); //close session
if(!defined('NL')) define('NL',"\n");
-// Version tag used to force rebuild on upgrade
-define('INDEXER_VERSION', 2);
-
// keep running after browser closes connection
@ignore_user_abort(true);
@@ -136,41 +133,8 @@ function runIndexer(){
if(!$ID) return false;
- // check if indexing needed
- $idxtag = metaFN($ID,'.indexed');
- if(@file_exists($idxtag)){
- if(io_readFile($idxtag) >= INDEXER_VERSION){
- $last = @filemtime($idxtag);
- if($last > @filemtime(wikiFN($ID))){
- print "runIndexer(): index for $ID up to date".NL;
- return false;
- }
- }
- }
-
- // try to aquire a lock
- $lock = $conf['lockdir'].'/_indexer.lock';
- while(!@mkdir($lock,$conf['dmode'])){
- usleep(50);
- if(time()-@filemtime($lock) > 60*5){
- // looks like a stale lock - remove it
- @rmdir($lock);
- print "runIndexer(): stale lock removed".NL;
- }else{
- print "runIndexer(): indexer locked".NL;
- return false;
- }
- }
- if($conf['dperm']) chmod($lock, $conf['dperm']);
-
// do the work
- idx_addPage($ID);
-
- // we're finished - save and free lock
- io_saveFile(metaFN($ID,'.indexed'),INDEXER_VERSION);
- @rmdir($lock);
- print "runIndexer(): finished".NL;
- return true;
+ return idx_addPage($ID, true);
}
/**
diff --git a/lib/exe/js.php b/lib/exe/js.php
index 117021308..93d5439e0 100644
--- a/lib/exe/js.php
+++ b/lib/exe/js.php
@@ -32,27 +32,37 @@ function js_out(){
global $config_cascade;
// The generated script depends on some dynamic options
- $cache = getCacheName('scripts'.$_SERVER['HTTP_HOST'].$_SERVER['SERVER_PORT'],'.js');
+ $cache = new cache('scripts'.$_SERVER['HTTP_HOST'].$_SERVER['SERVER_PORT'],
+ '.js');
+
+ // load minified version for some files
+ $min = $conf['compress'] ? '.min' : '';
// array of core files
$files = array(
+ DOKU_INC."lib/scripts/jquery/jquery$min.js",
+ DOKU_INC.'lib/scripts/jquery/jquery.cookie.js',
+ DOKU_INC."lib/scripts/jquery/jquery-ui$min.js",
DOKU_INC.'lib/scripts/helpers.js',
- DOKU_INC.'lib/scripts/events.js',
DOKU_INC.'lib/scripts/delay.js',
DOKU_INC.'lib/scripts/cookie.js',
DOKU_INC.'lib/scripts/script.js',
DOKU_INC.'lib/scripts/tw-sack.js',
- DOKU_INC.'lib/scripts/ajax.js',
+ DOKU_INC.'lib/scripts/qsearch.js',
+ DOKU_INC.'lib/scripts/tree.js',
DOKU_INC.'lib/scripts/index.js',
DOKU_INC.'lib/scripts/drag.js',
DOKU_INC.'lib/scripts/textselection.js',
DOKU_INC.'lib/scripts/toolbar.js',
DOKU_INC.'lib/scripts/edit.js',
+ DOKU_INC.'lib/scripts/editor.js',
+ DOKU_INC.'lib/scripts/locktimer.js',
DOKU_INC.'lib/scripts/linkwiz.js',
DOKU_INC.'lib/scripts/media.js',
- DOKU_INC.'lib/scripts/subscriptions.js',
+ DOKU_INC.'lib/scripts/compatibility.js',
# disabled for FS#1958 DOKU_INC.'lib/scripts/hotkeys.js',
DOKU_TPLINC.'script.js',
+ DOKU_INC.'lib/scripts/behaviour.js',
);
// add possible plugin scripts and userscript
@@ -61,25 +71,13 @@ function js_out(){
$files[] = $config_cascade['userscript']['default'];
}
+ $cache_files = array_merge($files, getConfigFiles('main'));
+ $cache_files[] = __FILE__;
+
// check cache age & handle conditional request
- header('Cache-Control: public, max-age=3600');
- header('Pragma: public');
- if(js_cacheok($cache,$files)){
- http_conditionalRequest(filemtime($cache));
- if($conf['allowdebug']) header("X-CacheUsed: $cache");
-
- // finally send output
- if ($conf['gzip_output'] && http_gzip_valid($cache)) {
- header('Vary: Accept-Encoding');
- header('Content-Encoding: gzip');
- readfile($cache.".gz");
- } else {
- if (!http_sendfile($cache)) readfile($cache);
- }
- return;
- } else {
- http_conditionalRequest(time());
- }
+ // This may exit if a cache can be used
+ http_cached($cache->cache,
+ $cache->useCache(array('files' => $cache_files)));
// start output buffering and build the script
ob_start();
@@ -108,14 +106,10 @@ function js_out(){
// init stuff
js_runonstart("addEvent(document,'click',closePopups)");
- js_runonstart('addTocToggle()');
- js_runonstart("initSizeCtl('size__ctl','wiki__text')");
js_runonstart("initToolbar('tool__bar','wiki__text',toolbar)");
if($conf['locktime'] != 0){
- js_runonstart("locktimer.init(".($conf['locktime'] - 60).",'".js_escape($lang['willexpire'])."',".$conf['usedraft'].")");
+ js_runonstart("locktimer.init(".($conf['locktime'] - 60).",'".js_escape($lang['willexpire'])."',".$conf['usedraft'].", 'wiki__text')");
}
- js_runonstart('scrollToMarker()');
- js_runonstart('focusMarker()');
// init hotkeys - must have been done after init of toolbar
# disabled for FS#1958 js_runonstart('initializeHotkeys()');
@@ -130,18 +124,7 @@ function js_out(){
$js .= "\n"; // https://bugzilla.mozilla.org/show_bug.cgi?id=316033
- // save cache file
- io_saveFile($cache,$js);
- if(function_exists('gzopen')) io_saveFile("$cache.gz",$js);
-
- // finally send output
- if ($conf['gzip_output']) {
- header('Vary: Accept-Encoding');
- header('Content-Encoding: gzip');
- print gzencode($js,9,FORCE_GZIP);
- } else {
- print $js;
- }
+ http_cached_finish($cache->cache, $js);
}
/**
@@ -173,32 +156,7 @@ function js_load($file){
}
$data = str_replace($match[0],$idata,$data);
}
- echo $data;
-}
-
-/**
- * Checks if a JavaScript Cache file still is valid
- *
- * @author Andreas Gohr <andi@splitbrain.org>
- */
-function js_cacheok($cache,$files){
- if(isset($_REQUEST['purge'])) return false; //support purge request
-
- $ctime = @filemtime($cache);
- if(!$ctime) return false; //There is no cache
-
- // some additional files to check
- $files = array_merge($files, getConfigFiles('main'));
- $files[] = DOKU_CONF.'userscript.js';
- $files[] = __FILE__;
-
- // now walk the files
- foreach($files as $file){
- if(@filemtime($file) > $ctime){
- return false;
- }
- }
- return true;
+ echo "$data\n";
}
/**
@@ -285,7 +243,7 @@ function js_compress($s){
// items that don't need spaces next to them
$chars = "^&|!+\-*\/%=\?:;,{}()<>% \t\n\r'\"[]";
- $regex_starters = array("(", "=", "[", "," , ":");
+ $regex_starters = array("(", "=", "[", "," , ":", "!");
$whitespaces_chars = array(" ", "\t", "\n", "\r", "\0", "\x0B");
diff --git a/lib/exe/mediamanager.php b/lib/exe/mediamanager.php
index c79a25c08..02fde5a8d 100644
--- a/lib/exe/mediamanager.php
+++ b/lib/exe/mediamanager.php
@@ -82,18 +82,24 @@
// handle deletion
if($DEL) {
- $INUSE = media_inuse($DEL);
- if(!$INUSE) {
- if(media_delete($DEL,$AUTH)) {
- msg(sprintf($lang['deletesucc'],noNS($DEL)),1);
- } else {
- msg(sprintf($lang['deletefail'],noNS($DEL)),-1);
+ $res = 0;
+ if(checkSecurityToken()) {
+ $res = media_delete($DEL,$AUTH);
+ }
+ if ($res & DOKU_MEDIA_DELETED) {
+ $msg = sprintf($lang['deletesucc'], noNS($DEL));
+ if ($res & DOKU_MEDIA_EMPTY_NS) {
+ // current namespace was removed. redirecting to root ns passing msg along
+ send_redirect(DOKU_URL.'lib/exe/mediamanager.php?msg1='.
+ rawurlencode($msg).'&edid='.$_REQUEST['edid']);
}
- } else {
+ msg($msg,1);
+ } elseif ($res & DOKU_MEDIA_INUSE) {
if(!$conf['refshow']) {
- unset($INUSE);
msg(sprintf($lang['mediainuse'],noNS($DEL)),0);
}
+ } else {
+ msg(sprintf($lang['deletefail'],noNS($DEL)),-1);
}
}
diff --git a/lib/exe/xmlrpc.php b/lib/exe/xmlrpc.php
index d232930a3..8b572d213 100644
--- a/lib/exe/xmlrpc.php
+++ b/lib/exe/xmlrpc.php
@@ -1,7 +1,7 @@
<?php
if(!defined('DOKU_INC')) define('DOKU_INC',dirname(__FILE__).'/../../');
-// fix when '<?xml' isn't on the very first line
+// fix when '< ?xml' isn't on the very first line
if(isset($HTTP_RAW_POST_DATA)) $HTTP_RAW_POST_DATA = trim($HTTP_RAW_POST_DATA);
/**
@@ -30,26 +30,9 @@ class dokuwiki_xmlrpc_server extends IXR_IntrospectionServer {
global $USERINFO;
if(!$conf['useacl']) return true; //no ACL - then no checks
+ if(trim($conf['xmlrpcuser']) == '') return true; //no restrictions
- $allowed = explode(',',$conf['xmlrpcuser']);
- $allowed = array_map('trim', $allowed);
- $allowed = array_unique($allowed);
- $allowed = array_filter($allowed);
-
- if(!count($allowed)) return true; //no restrictions
-
- $user = $_SERVER['REMOTE_USER'];
- $groups = (array) $USERINFO['grps'];
-
- if(in_array($user,$allowed)) return true; //user explicitly mentioned
-
- //check group memberships
- foreach($groups as $group){
- if(in_array('@'.$group,$allowed)) return true;
- }
-
- //still here? no access!
- return false;
+ return auth_isMember($conf['xmlrpcuser'],$_SERVER['REMOTE_USER'],(array) $USERINFO['grps']);
}
/**
@@ -296,6 +279,7 @@ class dokuwiki_xmlrpc_server extends IXR_IntrospectionServer {
* Return a raw wiki page
*/
function rawPage($id,$rev=''){
+ $id = cleanID($id);
if(auth_quickaclcheck($id) < AUTH_READ){
return new IXR_Error(1, 'You are not allowed to read this page');
}
@@ -351,6 +335,7 @@ class dokuwiki_xmlrpc_server extends IXR_IntrospectionServer {
* Return a wiki page rendered to html
*/
function htmlPage($id,$rev=''){
+ $id = cleanID($id);
if(auth_quickaclcheck($id) < AUTH_READ){
return new IXR_Error(1, 'You are not allowed to read this page');
}
@@ -362,9 +347,8 @@ class dokuwiki_xmlrpc_server extends IXR_IntrospectionServer {
*/
function listPages(){
$list = array();
- $pages = array_filter(array_filter(idx_getIndex('page', ''),
- 'isVisiblePage'),
- 'page_exists');
+ $pages = idx_get_indexer()->getPages();
+ $pages = array_filter(array_filter($pages,'isVisiblePage'),'page_exists');
foreach(array_keys($pages) as $idx) {
$perm = auth_quickaclcheck($pages[$idx]);
@@ -488,6 +472,7 @@ class dokuwiki_xmlrpc_server extends IXR_IntrospectionServer {
* Return some basic data about a page
*/
function pageInfo($id,$rev=''){
+ $id = cleanID($id);
if(auth_quickaclcheck($id) < AUTH_READ){
return new IXR_Error(1, 'You are not allowed to read this page');
}
@@ -559,27 +544,7 @@ class dokuwiki_xmlrpc_server extends IXR_IntrospectionServer {
unlock($id);
// run the indexer if page wasn't indexed yet
- if(!@file_exists(metaFN($id, '.indexed'))) {
- // try to aquire a lock
- $lock = $conf['lockdir'].'/_indexer.lock';
- while(!@mkdir($lock,$conf['dmode'])){
- usleep(50);
- if(time()-@filemtime($lock) > 60*5){
- // looks like a stale lock - remove it
- @rmdir($lock);
- }else{
- return false;
- }
- }
- if($conf['dperm']) chmod($lock, $conf['dperm']);
-
- // do the work
- idx_addPage($id);
-
- // we're finished - save and free lock
- io_saveFile(metaFN($id,'.indexed'),INDEXER_VERSION);
- @rmdir($lock);
- }
+ idx_addPage($id);
return 0;
}
@@ -601,64 +566,27 @@ class dokuwiki_xmlrpc_server extends IXR_IntrospectionServer {
* Michael Klier <chi@chimeric.de>
*/
function putAttachment($id, $file, $params) {
- global $conf;
- global $lang;
-
+ $id = cleanID($id);
$auth = auth_quickaclcheck(getNS($id).':*');
- if($auth >= AUTH_UPLOAD) {
- if(!isset($id)) {
- return new IXR_ERROR(1, 'Filename not given.');
- }
- $ftmp = $conf['tmpdir'] . '/' . md5($id.clientIP());
-
- // save temporary file
- @unlink($ftmp);
- $buff = base64_decode($file);
- io_saveFile($ftmp, $buff);
+ if(!isset($id)) {
+ return new IXR_ERROR(1, 'Filename not given.');
+ }
- // get filename
- list($iext, $imime,$dl) = mimetype($id);
- $id = cleanID($id);
- $fn = mediaFN($id);
-
- // get filetype regexp
- $types = array_keys(getMimeTypes());
- $types = array_map(create_function('$q','return preg_quote($q,"/");'),$types);
- $regex = join('|',$types);
-
- // because a temp file was created already
- if(preg_match('/\.('.$regex.')$/i',$fn)) {
- //check for overwrite
- $overwrite = @file_exists($fn);
- if($overwrite && (!$params['ow'] || $auth < AUTH_DELETE)) {
- return new IXR_ERROR(1, $lang['uploadexist'].'1');
- }
- // check for valid content
- $ok = media_contentcheck($ftmp, $imime);
- if($ok == -1) {
- return new IXR_ERROR(1, sprintf($lang['uploadexist'].'2', ".$iext"));
- } elseif($ok == -2) {
- return new IXR_ERROR(1, $lang['uploadspam']);
- } elseif($ok == -3) {
- return new IXR_ERROR(1, $lang['uploadxss']);
- }
+ global $conf;
- // prepare event data
- $data[0] = $ftmp;
- $data[1] = $fn;
- $data[2] = $id;
- $data[3] = $imime;
- $data[4] = $overwrite;
+ $ftmp = $conf['tmpdir'] . '/' . md5($id.clientIP());
- // trigger event
- return trigger_event('MEDIA_UPLOAD_FINISH', $data, array($this, '_media_upload_action'), true);
+ // save temporary file
+ @unlink($ftmp);
+ $buff = base64_decode($file);
+ io_saveFile($ftmp, $buff);
- } else {
- return new IXR_ERROR(1, $lang['uploadwrong']);
- }
+ $res = media_save(array('name' => $ftmp), $id, $params['ow'], $auth, 'rename');
+ if (is_array($res)) {
+ return new IXR_ERROR(-$res[1], $res[0]);
} else {
- return new IXR_ERROR(1, "You don't have permissions to upload files.");
+ return $res;
}
}
@@ -668,56 +596,17 @@ class dokuwiki_xmlrpc_server extends IXR_IntrospectionServer {
* @author Gina Haeussge <osd@foosel.net>
*/
function deleteAttachment($id){
+ $id = cleanID($id);
$auth = auth_quickaclcheck(getNS($id).':*');
- if($auth < AUTH_DELETE) return new IXR_ERROR(1, "You don't have permissions to delete files.");
- global $conf;
- global $lang;
-
- // check for references if needed
- $mediareferences = array();
- if($conf['refcheck']){
- $mediareferences = ft_mediause($id,$conf['refshow']);
- }
-
- if(!count($mediareferences)){
- $file = mediaFN($id);
- if(@unlink($file)){
- addMediaLogEntry(time(), $id, DOKU_CHANGE_TYPE_DELETE);
- io_sweepNS($id,'mediadir');
- return 0;
- }
- //something went wrong
- return new IXR_ERROR(1, 'Could not delete file');
- } else {
+ $res = media_delete($id, $auth);
+ if ($res & DOKU_MEDIA_DELETED) {
+ return 0;
+ } elseif ($res & DOKU_MEDIA_NOT_AUTH) {
+ return new IXR_ERROR(1, "You don't have permissions to delete files.");
+ } elseif ($res & DOKU_MEDIA_INUSE) {
return new IXR_ERROR(1, 'File is still referenced');
- }
- }
-
- /**
- * Moves the temporary file to its final destination.
- *
- * Michael Klier <chi@chimeric.de>
- */
- function _media_upload_action($data) {
- global $conf;
-
- if(is_array($data) && count($data)===5) {
- io_createNamespace($data[2], 'media');
- if(rename($data[0], $data[1])) {
- chmod($data[1], $conf['fmode']);
- media_notify($data[2], $data[1], $data[3]);
- // add a log entry to the media changelog
- if ($data[4]) {
- addMediaLogEntry(time(), $data[2], DOKU_CHANGE_TYPE_EDIT);
- } else {
- addMediaLogEntry(time(), $data[2], DOKU_CHANGE_TYPE_CREATE);
- }
- return $data[2];
- } else {
- return new IXR_ERROR(1, 'Upload failed.');
- }
} else {
- return new IXR_ERROR(1, 'Upload failed.');
+ return new IXR_ERROR(1, 'Could not delete file');
}
}
@@ -725,6 +614,7 @@ class dokuwiki_xmlrpc_server extends IXR_IntrospectionServer {
* Returns the permissions of a given wiki page
*/
function aclCheck($id) {
+ $id = cleanID($id);
return auth_quickaclcheck($id);
}
@@ -734,13 +624,14 @@ class dokuwiki_xmlrpc_server extends IXR_IntrospectionServer {
* @author Michael Klier <chi@chimeric.de>
*/
function listLinks($id) {
+ $id = cleanID($id);
if(auth_quickaclcheck($id) < AUTH_READ){
return new IXR_Error(1, 'You are not allowed to read this page');
}
$links = array();
// resolve page instructions
- $ins = p_cached_instructions(wikiFN(cleanID($id)));
+ $ins = p_cached_instructions(wikiFN($id));
// instantiate new Renderer - needed for interwiki links
include(DOKU_INC.'inc/parser/xhtml.php');
@@ -848,6 +739,10 @@ class dokuwiki_xmlrpc_server extends IXR_IntrospectionServer {
* @author Michael Klier <chi@chimeric.de>
*/
function pageVersions($id, $first) {
+ $id = cleanID($id);
+ if(auth_quickaclcheck($id) < AUTH_READ){
+ return new IXR_Error(1, 'You are not allowed to read this page');
+ }
global $conf;
$versions = array();
@@ -923,7 +818,8 @@ class dokuwiki_xmlrpc_server extends IXR_IntrospectionServer {
$unlockfail = array();
foreach((array) $set['lock'] as $id){
- if(checklock($id)){
+ $id = cleanID($id);
+ if(auth_quickaclcheck($id) < AUTH_EDIT || checklock($id)){
$lockfail[] = $id;
}else{
lock($id);
@@ -932,10 +828,11 @@ class dokuwiki_xmlrpc_server extends IXR_IntrospectionServer {
}
foreach((array) $set['unlock'] as $id){
- if(unlock($id)){
- $unlocked[] = $id;
- }else{
+ $id = cleanID($id);
+ if(auth_quickaclcheck($id) < AUTH_EDIT || !unlock($id)){
$unlockfail[] = $id;
+ }else{
+ $unlocked[] = $id;
}
}
diff --git a/lib/images/admin/acl.png b/lib/images/admin/acl.png
index 96fb4cd56..c8f610c12 100644
--- a/lib/images/admin/acl.png
+++ b/lib/images/admin/acl.png
Binary files differ
diff --git a/lib/images/admin/config.png b/lib/images/admin/config.png
index e4d376d85..3ec3923d1 100644
--- a/lib/images/admin/config.png
+++ b/lib/images/admin/config.png
Binary files differ
diff --git a/lib/images/admin/plugin.png b/lib/images/admin/plugin.png
index e2823bac7..f71124e5c 100644
--- a/lib/images/admin/plugin.png
+++ b/lib/images/admin/plugin.png
Binary files differ
diff --git a/lib/images/admin/popularity.png b/lib/images/admin/popularity.png
index 4e22aaf0d..19392367a 100644
--- a/lib/images/admin/popularity.png
+++ b/lib/images/admin/popularity.png
Binary files differ
diff --git a/lib/images/admin/revert.png b/lib/images/admin/revert.png
index 002d3a75b..5304f1b76 100644
--- a/lib/images/admin/revert.png
+++ b/lib/images/admin/revert.png
Binary files differ
diff --git a/lib/images/admin/usermanager.png b/lib/images/admin/usermanager.png
index c5c8dc6d6..898544ce9 100644
--- a/lib/images/admin/usermanager.png
+++ b/lib/images/admin/usermanager.png
Binary files differ
diff --git a/lib/images/close.png b/lib/images/close.png
index e1b498c14..4ccef0603 100644
--- a/lib/images/close.png
+++ b/lib/images/close.png
Binary files differ
diff --git a/lib/images/del.png b/lib/images/del.png
index a3260d718..e59ded55f 100644
--- a/lib/images/del.png
+++ b/lib/images/del.png
Binary files differ
diff --git a/lib/images/diff.png b/lib/images/diff.png
index 0b98d79ac..657b10999 100644
--- a/lib/images/diff.png
+++ b/lib/images/diff.png
Binary files differ
diff --git a/lib/images/error.png b/lib/images/error.png
index 8a1ba4c66..7bd84f7a3 100644
--- a/lib/images/error.png
+++ b/lib/images/error.png
Binary files differ
diff --git a/lib/images/fileicons/bz2.png b/lib/images/fileicons/bz2.png
index d48cae038..6ec2f98ef 100644
--- a/lib/images/fileicons/bz2.png
+++ b/lib/images/fileicons/bz2.png
Binary files differ
diff --git a/lib/images/fileicons/c.png b/lib/images/fileicons/c.png
index 9446afcb4..6f57337c7 100644
--- a/lib/images/fileicons/c.png
+++ b/lib/images/fileicons/c.png
Binary files differ
diff --git a/lib/images/fileicons/conf.png b/lib/images/fileicons/conf.png
index ddffe6fd1..20c20fa3d 100644
--- a/lib/images/fileicons/conf.png
+++ b/lib/images/fileicons/conf.png
Binary files differ
diff --git a/lib/images/fileicons/cpp.png b/lib/images/fileicons/cpp.png
index 2dc51b16d..6f2797da5 100644
--- a/lib/images/fileicons/cpp.png
+++ b/lib/images/fileicons/cpp.png
Binary files differ
diff --git a/lib/images/fileicons/cs.png b/lib/images/fileicons/cs.png
index d5db29ba5..d3afa112c 100644
--- a/lib/images/fileicons/cs.png
+++ b/lib/images/fileicons/cs.png
Binary files differ
diff --git a/lib/images/fileicons/csv.png b/lib/images/fileicons/csv.png
index 3a8835360..b604453c4 100644
--- a/lib/images/fileicons/csv.png
+++ b/lib/images/fileicons/csv.png
Binary files differ
diff --git a/lib/images/fileicons/deb.png b/lib/images/fileicons/deb.png
index 9229d8783..8fe57327a 100644
--- a/lib/images/fileicons/deb.png
+++ b/lib/images/fileicons/deb.png
Binary files differ
diff --git a/lib/images/fileicons/doc.png b/lib/images/fileicons/doc.png
index 932567f8a..79d8ff1cd 100644
--- a/lib/images/fileicons/doc.png
+++ b/lib/images/fileicons/doc.png
Binary files differ
diff --git a/lib/images/fileicons/docx.png b/lib/images/fileicons/docx.png
index 932567f8a..79d8ff1cd 100644
--- a/lib/images/fileicons/docx.png
+++ b/lib/images/fileicons/docx.png
Binary files differ
diff --git a/lib/images/fileicons/file.png b/lib/images/fileicons/file.png
index 817014fa7..8158a8a21 100644
--- a/lib/images/fileicons/file.png
+++ b/lib/images/fileicons/file.png
Binary files differ
diff --git a/lib/images/fileicons/gif.png b/lib/images/fileicons/gif.png
index aa4cc23a5..1d9dd562a 100644
--- a/lib/images/fileicons/gif.png
+++ b/lib/images/fileicons/gif.png
Binary files differ
diff --git a/lib/images/fileicons/gz.png b/lib/images/fileicons/gz.png
index 2426bd169..48f19596c 100644
--- a/lib/images/fileicons/gz.png
+++ b/lib/images/fileicons/gz.png
Binary files differ
diff --git a/lib/images/fileicons/htm.png b/lib/images/fileicons/htm.png
index 1a6812185..d45e4c19a 100644
--- a/lib/images/fileicons/htm.png
+++ b/lib/images/fileicons/htm.png
Binary files differ
diff --git a/lib/images/fileicons/html.png b/lib/images/fileicons/html.png
index 1a6812185..d45e4c19a 100644
--- a/lib/images/fileicons/html.png
+++ b/lib/images/fileicons/html.png
Binary files differ
diff --git a/lib/images/fileicons/jpeg.png b/lib/images/fileicons/jpeg.png
index aa4cc23a5..1d9dd562a 100644
--- a/lib/images/fileicons/jpeg.png
+++ b/lib/images/fileicons/jpeg.png
Binary files differ
diff --git a/lib/images/fileicons/jpg.png b/lib/images/fileicons/jpg.png
index aa4cc23a5..1d9dd562a 100644
--- a/lib/images/fileicons/jpg.png
+++ b/lib/images/fileicons/jpg.png
Binary files differ
diff --git a/lib/images/fileicons/lua.png b/lib/images/fileicons/lua.png
index 7c07d023f..994c6e8f0 100644
--- a/lib/images/fileicons/lua.png
+++ b/lib/images/fileicons/lua.png
Binary files differ
diff --git a/lib/images/fileicons/mp3.png b/lib/images/fileicons/mp3.png
index 928705d7a..411dad080 100644
--- a/lib/images/fileicons/mp3.png
+++ b/lib/images/fileicons/mp3.png
Binary files differ
diff --git a/lib/images/fileicons/odc.png b/lib/images/fileicons/odc.png
index 47f65c84d..4d6676c3a 100644
--- a/lib/images/fileicons/odc.png
+++ b/lib/images/fileicons/odc.png
Binary files differ
diff --git a/lib/images/fileicons/odf.png b/lib/images/fileicons/odf.png
index a2fbc5195..cb88d68e6 100644
--- a/lib/images/fileicons/odf.png
+++ b/lib/images/fileicons/odf.png
Binary files differ
diff --git a/lib/images/fileicons/odg.png b/lib/images/fileicons/odg.png
index 74f6303d3..a07216f4a 100644
--- a/lib/images/fileicons/odg.png
+++ b/lib/images/fileicons/odg.png
Binary files differ
diff --git a/lib/images/fileicons/odi.png b/lib/images/fileicons/odi.png
index 74f6303d3..a07216f4a 100644
--- a/lib/images/fileicons/odi.png
+++ b/lib/images/fileicons/odi.png
Binary files differ
diff --git a/lib/images/fileicons/odp.png b/lib/images/fileicons/odp.png
index 2a94290d7..2f2574af6 100644
--- a/lib/images/fileicons/odp.png
+++ b/lib/images/fileicons/odp.png
Binary files differ
diff --git a/lib/images/fileicons/ods.png b/lib/images/fileicons/ods.png
index 47f65c84d..4d6676c3a 100644
--- a/lib/images/fileicons/ods.png
+++ b/lib/images/fileicons/ods.png
Binary files differ
diff --git a/lib/images/fileicons/odt.png b/lib/images/fileicons/odt.png
index b0c21fc1f..f9c126efd 100644
--- a/lib/images/fileicons/odt.png
+++ b/lib/images/fileicons/odt.png
Binary files differ
diff --git a/lib/images/fileicons/ogg.png b/lib/images/fileicons/ogg.png
index 62cea6aaa..0a21eae65 100644
--- a/lib/images/fileicons/ogg.png
+++ b/lib/images/fileicons/ogg.png
Binary files differ
diff --git a/lib/images/fileicons/pdf.png b/lib/images/fileicons/pdf.png
index 638066dea..029dcffec 100644
--- a/lib/images/fileicons/pdf.png
+++ b/lib/images/fileicons/pdf.png
Binary files differ
diff --git a/lib/images/fileicons/php.png b/lib/images/fileicons/php.png
index e735f875b..f81e405de 100644
--- a/lib/images/fileicons/php.png
+++ b/lib/images/fileicons/php.png
Binary files differ
diff --git a/lib/images/fileicons/pl.png b/lib/images/fileicons/pl.png
index 6ac381cd7..92f3f9754 100644
--- a/lib/images/fileicons/pl.png
+++ b/lib/images/fileicons/pl.png
Binary files differ
diff --git a/lib/images/fileicons/png.png b/lib/images/fileicons/png.png
index aa4cc23a5..1d9dd562a 100644
--- a/lib/images/fileicons/png.png
+++ b/lib/images/fileicons/png.png
Binary files differ
diff --git a/lib/images/fileicons/ppt.png b/lib/images/fileicons/ppt.png
index adaefc602..b7afb2266 100644
--- a/lib/images/fileicons/ppt.png
+++ b/lib/images/fileicons/ppt.png
Binary files differ
diff --git a/lib/images/fileicons/pptx.png b/lib/images/fileicons/pptx.png
index adaefc602..b7afb2266 100644
--- a/lib/images/fileicons/pptx.png
+++ b/lib/images/fileicons/pptx.png
Binary files differ
diff --git a/lib/images/fileicons/ps.png b/lib/images/fileicons/ps.png
index c51c763ab..40a80baad 100644
--- a/lib/images/fileicons/ps.png
+++ b/lib/images/fileicons/ps.png
Binary files differ
diff --git a/lib/images/fileicons/py.png b/lib/images/fileicons/py.png
index a21b8da49..15a727c54 100644
--- a/lib/images/fileicons/py.png
+++ b/lib/images/fileicons/py.png
Binary files differ
diff --git a/lib/images/fileicons/rar.png b/lib/images/fileicons/rar.png
index a6af4d1ca..c761a4f7f 100644
--- a/lib/images/fileicons/rar.png
+++ b/lib/images/fileicons/rar.png
Binary files differ
diff --git a/lib/images/fileicons/rb.png b/lib/images/fileicons/rb.png
index 45f448978..408f708a1 100644
--- a/lib/images/fileicons/rb.png
+++ b/lib/images/fileicons/rb.png
Binary files differ
diff --git a/lib/images/fileicons/rpm.png b/lib/images/fileicons/rpm.png
index 22212eafa..5cf727de0 100644
--- a/lib/images/fileicons/rpm.png
+++ b/lib/images/fileicons/rpm.png
Binary files differ
diff --git a/lib/images/fileicons/rtf.png b/lib/images/fileicons/rtf.png
index d8bada5fe..99fe3d8fd 100644
--- a/lib/images/fileicons/rtf.png
+++ b/lib/images/fileicons/rtf.png
Binary files differ
diff --git a/lib/images/fileicons/sql.png b/lib/images/fileicons/sql.png
index f60054a3a..a7b0684c7 100644
--- a/lib/images/fileicons/sql.png
+++ b/lib/images/fileicons/sql.png
Binary files differ
diff --git a/lib/images/fileicons/swf.png b/lib/images/fileicons/swf.png
index 0729ed020..ecc7309ad 100644
--- a/lib/images/fileicons/swf.png
+++ b/lib/images/fileicons/swf.png
Binary files differ
diff --git a/lib/images/fileicons/sxc.png b/lib/images/fileicons/sxc.png
index 47f65c84d..4d6676c3a 100644
--- a/lib/images/fileicons/sxc.png
+++ b/lib/images/fileicons/sxc.png
Binary files differ
diff --git a/lib/images/fileicons/sxd.png b/lib/images/fileicons/sxd.png
index 74f6303d3..a07216f4a 100644
--- a/lib/images/fileicons/sxd.png
+++ b/lib/images/fileicons/sxd.png
Binary files differ
diff --git a/lib/images/fileicons/sxi.png b/lib/images/fileicons/sxi.png
index 2a94290d7..2f2574af6 100644
--- a/lib/images/fileicons/sxi.png
+++ b/lib/images/fileicons/sxi.png
Binary files differ
diff --git a/lib/images/fileicons/sxw.png b/lib/images/fileicons/sxw.png
index b0c21fc1f..f9c126efd 100644
--- a/lib/images/fileicons/sxw.png
+++ b/lib/images/fileicons/sxw.png
Binary files differ
diff --git a/lib/images/fileicons/tar.png b/lib/images/fileicons/tar.png
index 5a2f717fc..a28c86f2d 100644
--- a/lib/images/fileicons/tar.png
+++ b/lib/images/fileicons/tar.png
Binary files differ
diff --git a/lib/images/fileicons/tgz.png b/lib/images/fileicons/tgz.png
index 2426bd169..48f19596c 100644
--- a/lib/images/fileicons/tgz.png
+++ b/lib/images/fileicons/tgz.png
Binary files differ
diff --git a/lib/images/fileicons/txt.png b/lib/images/fileicons/txt.png
index da20009c6..bb94949f6 100644
--- a/lib/images/fileicons/txt.png
+++ b/lib/images/fileicons/txt.png
Binary files differ
diff --git a/lib/images/fileicons/wav.png b/lib/images/fileicons/wav.png
index 79e80760e..c167f4fdb 100644
--- a/lib/images/fileicons/wav.png
+++ b/lib/images/fileicons/wav.png
Binary files differ
diff --git a/lib/images/fileicons/xls.png b/lib/images/fileicons/xls.png
index e8cd58dc0..24911b802 100644
--- a/lib/images/fileicons/xls.png
+++ b/lib/images/fileicons/xls.png
Binary files differ
diff --git a/lib/images/fileicons/xlsx.png b/lib/images/fileicons/xlsx.png
index e8cd58dc0..24911b802 100644
--- a/lib/images/fileicons/xlsx.png
+++ b/lib/images/fileicons/xlsx.png
Binary files differ
diff --git a/lib/images/fileicons/xml.png b/lib/images/fileicons/xml.png
index eb4632397..ae9831b34 100644
--- a/lib/images/fileicons/xml.png
+++ b/lib/images/fileicons/xml.png
Binary files differ
diff --git a/lib/images/fileicons/zip.png b/lib/images/fileicons/zip.png
index 999ffbe80..fb8850c9a 100644
--- a/lib/images/fileicons/zip.png
+++ b/lib/images/fileicons/zip.png
Binary files differ
diff --git a/lib/images/history.png b/lib/images/history.png
index ef9e311d3..82a418d44 100644
--- a/lib/images/history.png
+++ b/lib/images/history.png
Binary files differ
diff --git a/lib/images/info.png b/lib/images/info.png
index a237c1782..121c7336d 100644
--- a/lib/images/info.png
+++ b/lib/images/info.png
Binary files differ
diff --git a/lib/images/interwiki.png b/lib/images/interwiki.png
index 73d6f8d39..f957e71e5 100644
--- a/lib/images/interwiki.png
+++ b/lib/images/interwiki.png
Binary files differ
diff --git a/lib/images/interwiki/amazon.de.gif b/lib/images/interwiki/amazon.de.gif
index f52c1c581..6e36a051a 100644
--- a/lib/images/interwiki/amazon.de.gif
+++ b/lib/images/interwiki/amazon.de.gif
Binary files differ
diff --git a/lib/images/interwiki/amazon.gif b/lib/images/interwiki/amazon.gif
index f52c1c581..6e36a051a 100644
--- a/lib/images/interwiki/amazon.gif
+++ b/lib/images/interwiki/amazon.gif
Binary files differ
diff --git a/lib/images/interwiki/amazon.uk.gif b/lib/images/interwiki/amazon.uk.gif
index f52c1c581..6e36a051a 100644
--- a/lib/images/interwiki/amazon.uk.gif
+++ b/lib/images/interwiki/amazon.uk.gif
Binary files differ
diff --git a/lib/images/interwiki/callto.gif b/lib/images/interwiki/callto.gif
new file mode 100644
index 000000000..f6d424554
--- /dev/null
+++ b/lib/images/interwiki/callto.gif
Binary files differ
diff --git a/lib/images/interwiki/doku.gif b/lib/images/interwiki/doku.gif
index 7dc4248e8..3ccf01227 100644
--- a/lib/images/interwiki/doku.gif
+++ b/lib/images/interwiki/doku.gif
Binary files differ
diff --git a/lib/images/interwiki/google.gif b/lib/images/interwiki/google.gif
index fb39f6152..3a28437f3 100644
--- a/lib/images/interwiki/google.gif
+++ b/lib/images/interwiki/google.gif
Binary files differ
diff --git a/lib/images/interwiki/meatball.gif b/lib/images/interwiki/meatball.gif
index 7ac545436..8a4cbdbfc 100644
--- a/lib/images/interwiki/meatball.gif
+++ b/lib/images/interwiki/meatball.gif
Binary files differ
diff --git a/lib/images/interwiki/paypal.gif b/lib/images/interwiki/paypal.gif
new file mode 100644
index 000000000..1d2834062
--- /dev/null
+++ b/lib/images/interwiki/paypal.gif
Binary files differ
diff --git a/lib/images/interwiki/phpfn.gif b/lib/images/interwiki/phpfn.gif
index 638d4c450..89ac1db94 100644
--- a/lib/images/interwiki/phpfn.gif
+++ b/lib/images/interwiki/phpfn.gif
Binary files differ
diff --git a/lib/images/interwiki/sb.gif b/lib/images/interwiki/sb.gif
index e272a29b7..710e4945b 100644
--- a/lib/images/interwiki/sb.gif
+++ b/lib/images/interwiki/sb.gif
Binary files differ
diff --git a/lib/images/interwiki/skype.png b/lib/images/interwiki/skype.png
new file mode 100644
index 000000000..c70216702
--- /dev/null
+++ b/lib/images/interwiki/skype.png
Binary files differ
diff --git a/lib/images/interwiki/wiki.gif b/lib/images/interwiki/wiki.gif
index e8dc5d274..df241d6bb 100644
--- a/lib/images/interwiki/wiki.gif
+++ b/lib/images/interwiki/wiki.gif
Binary files differ
diff --git a/lib/images/interwiki/wp.gif b/lib/images/interwiki/wp.gif
index ca853b8c9..b07fd893d 100644
--- a/lib/images/interwiki/wp.gif
+++ b/lib/images/interwiki/wp.gif
Binary files differ
diff --git a/lib/images/interwiki/wpde.gif b/lib/images/interwiki/wpde.gif
index ca853b8c9..b07fd893d 100644
--- a/lib/images/interwiki/wpde.gif
+++ b/lib/images/interwiki/wpde.gif
Binary files differ
diff --git a/lib/images/interwiki/wpes.gif b/lib/images/interwiki/wpes.gif
index ca853b8c9..b07fd893d 100644
--- a/lib/images/interwiki/wpes.gif
+++ b/lib/images/interwiki/wpes.gif
Binary files differ
diff --git a/lib/images/interwiki/wpfr.gif b/lib/images/interwiki/wpfr.gif
index ca853b8c9..b07fd893d 100644
--- a/lib/images/interwiki/wpfr.gif
+++ b/lib/images/interwiki/wpfr.gif
Binary files differ
diff --git a/lib/images/interwiki/wpjp.gif b/lib/images/interwiki/wpjp.gif
index ca853b8c9..b07fd893d 100644
--- a/lib/images/interwiki/wpjp.gif
+++ b/lib/images/interwiki/wpjp.gif
Binary files differ
diff --git a/lib/images/interwiki/wpmeta.gif b/lib/images/interwiki/wpmeta.gif
index ca853b8c9..b07fd893d 100644
--- a/lib/images/interwiki/wpmeta.gif
+++ b/lib/images/interwiki/wpmeta.gif
Binary files differ
diff --git a/lib/images/interwiki/wppl.gif b/lib/images/interwiki/wppl.gif
index ca853b8c9..b07fd893d 100644
--- a/lib/images/interwiki/wppl.gif
+++ b/lib/images/interwiki/wppl.gif
Binary files differ
diff --git a/lib/images/license/badge/cc-by-nc-nd.png b/lib/images/license/badge/cc-by-nc-nd.png
index 49f272f82..94aae9e09 100644
--- a/lib/images/license/badge/cc-by-nc-nd.png
+++ b/lib/images/license/badge/cc-by-nc-nd.png
Binary files differ
diff --git a/lib/images/license/badge/cc-by-nc-sa.png b/lib/images/license/badge/cc-by-nc-sa.png
index 0f2a0f107..51141f5ec 100644
--- a/lib/images/license/badge/cc-by-nc-sa.png
+++ b/lib/images/license/badge/cc-by-nc-sa.png
Binary files differ
diff --git a/lib/images/license/badge/cc-by-nc.png b/lib/images/license/badge/cc-by-nc.png
index 5f9821470..aeb8cdc8c 100644
--- a/lib/images/license/badge/cc-by-nc.png
+++ b/lib/images/license/badge/cc-by-nc.png
Binary files differ
diff --git a/lib/images/license/badge/cc-by-nd.png b/lib/images/license/badge/cc-by-nd.png
index 8f317035e..6a2e59a68 100644
--- a/lib/images/license/badge/cc-by-nd.png
+++ b/lib/images/license/badge/cc-by-nd.png
Binary files differ
diff --git a/lib/images/license/badge/cc-by-sa.png b/lib/images/license/badge/cc-by-sa.png
index f0a944e0b..f0aa4aaf0 100644
--- a/lib/images/license/badge/cc-by-sa.png
+++ b/lib/images/license/badge/cc-by-sa.png
Binary files differ
diff --git a/lib/images/license/badge/cc-by.png b/lib/images/license/badge/cc-by.png
index 822491edb..c7389b2f6 100644
--- a/lib/images/license/badge/cc-by.png
+++ b/lib/images/license/badge/cc-by.png
Binary files differ
diff --git a/lib/images/license/badge/cc-zero.png b/lib/images/license/badge/cc-zero.png
index 8a0ef3e3b..fd3dff422 100644
--- a/lib/images/license/badge/cc-zero.png
+++ b/lib/images/license/badge/cc-zero.png
Binary files differ
diff --git a/lib/images/license/badge/cc.png b/lib/images/license/badge/cc.png
index a66f4d1a0..8ac73aa4e 100644
--- a/lib/images/license/badge/cc.png
+++ b/lib/images/license/badge/cc.png
Binary files differ
diff --git a/lib/images/license/badge/gnufdl.png b/lib/images/license/badge/gnufdl.png
index 1371aba88..e92910128 100644
--- a/lib/images/license/badge/gnufdl.png
+++ b/lib/images/license/badge/gnufdl.png
Binary files differ
diff --git a/lib/images/license/badge/publicdomain.png b/lib/images/license/badge/publicdomain.png
index cedc39c62..8148d037a 100644
--- a/lib/images/license/badge/publicdomain.png
+++ b/lib/images/license/badge/publicdomain.png
Binary files differ
diff --git a/lib/images/license/button/cc-by-nc-nd.png b/lib/images/license/button/cc-by-nc-nd.png
index b27ead2f6..ac58d8627 100644
--- a/lib/images/license/button/cc-by-nc-nd.png
+++ b/lib/images/license/button/cc-by-nc-nd.png
Binary files differ
diff --git a/lib/images/license/button/cc-by-nc-sa.png b/lib/images/license/button/cc-by-nc-sa.png
index 1c54f994d..a9d23c0b6 100644
--- a/lib/images/license/button/cc-by-nc-sa.png
+++ b/lib/images/license/button/cc-by-nc-sa.png
Binary files differ
diff --git a/lib/images/license/button/cc-by-nc.png b/lib/images/license/button/cc-by-nc.png
index 33c7b1fa4..d936464ad 100644
--- a/lib/images/license/button/cc-by-nc.png
+++ b/lib/images/license/button/cc-by-nc.png
Binary files differ
diff --git a/lib/images/license/button/cc-by-nd.png b/lib/images/license/button/cc-by-nd.png
index 52073c043..3fc490870 100644
--- a/lib/images/license/button/cc-by-nd.png
+++ b/lib/images/license/button/cc-by-nd.png
Binary files differ
diff --git a/lib/images/license/button/cc-by-sa.png b/lib/images/license/button/cc-by-sa.png
index 0b1880f91..3c6270a0d 100644
--- a/lib/images/license/button/cc-by-sa.png
+++ b/lib/images/license/button/cc-by-sa.png
Binary files differ
diff --git a/lib/images/license/button/cc-by.png b/lib/images/license/button/cc-by.png
index 99d8efd35..867daaee4 100644
--- a/lib/images/license/button/cc-by.png
+++ b/lib/images/license/button/cc-by.png
Binary files differ
diff --git a/lib/images/license/button/cc-zero.png b/lib/images/license/button/cc-zero.png
index fc99eff61..251efcd1c 100644
--- a/lib/images/license/button/cc-zero.png
+++ b/lib/images/license/button/cc-zero.png
Binary files differ
diff --git a/lib/images/license/button/cc.png b/lib/images/license/button/cc.png
index adfa085bd..9c492950f 100644
--- a/lib/images/license/button/cc.png
+++ b/lib/images/license/button/cc.png
Binary files differ
diff --git a/lib/images/license/button/gnufdl.png b/lib/images/license/button/gnufdl.png
index cb815ac13..0b52ea12e 100644
--- a/lib/images/license/button/gnufdl.png
+++ b/lib/images/license/button/gnufdl.png
Binary files differ
diff --git a/lib/images/license/button/publicdomain.png b/lib/images/license/button/publicdomain.png
index f78e73d02..54ea38b64 100644
--- a/lib/images/license/button/publicdomain.png
+++ b/lib/images/license/button/publicdomain.png
Binary files differ
diff --git a/lib/images/loading.gif b/lib/images/loading.gif
index 240bd88c5..35058e20f 100644
--- a/lib/images/loading.gif
+++ b/lib/images/loading.gif
Binary files differ
diff --git a/lib/images/magnifier.png b/lib/images/magnifier.png
index cf3d97f75..89febff10 100644
--- a/lib/images/magnifier.png
+++ b/lib/images/magnifier.png
Binary files differ
diff --git a/lib/images/media_align_center.png b/lib/images/media_align_center.png
index 3db90fc17..807f9d9a8 100644
--- a/lib/images/media_align_center.png
+++ b/lib/images/media_align_center.png
Binary files differ
diff --git a/lib/images/media_align_left.png b/lib/images/media_align_left.png
index cebbb1a9a..fa6cf33ca 100644
--- a/lib/images/media_align_left.png
+++ b/lib/images/media_align_left.png
Binary files differ
diff --git a/lib/images/media_align_noalign.png b/lib/images/media_align_noalign.png
index 74f34e5f1..263e090fe 100644
--- a/lib/images/media_align_noalign.png
+++ b/lib/images/media_align_noalign.png
Binary files differ
diff --git a/lib/images/media_align_right.png b/lib/images/media_align_right.png
index 5f54a4a49..33539dbdb 100644
--- a/lib/images/media_align_right.png
+++ b/lib/images/media_align_right.png
Binary files differ
diff --git a/lib/images/media_link_direct.png b/lib/images/media_link_direct.png
index 4bdb3541e..4350b803d 100644
--- a/lib/images/media_link_direct.png
+++ b/lib/images/media_link_direct.png
Binary files differ
diff --git a/lib/images/media_link_displaylnk.png b/lib/images/media_link_displaylnk.png
index 25eacb7c2..53927566a 100644
--- a/lib/images/media_link_displaylnk.png
+++ b/lib/images/media_link_displaylnk.png
Binary files differ
diff --git a/lib/images/media_link_lnk.png b/lib/images/media_link_lnk.png
index 1209164ca..5ff4ee182 100644
--- a/lib/images/media_link_lnk.png
+++ b/lib/images/media_link_lnk.png
Binary files differ
diff --git a/lib/images/media_link_nolnk.png b/lib/images/media_link_nolnk.png
index fc3c393ca..c9378c7fd 100644
--- a/lib/images/media_link_nolnk.png
+++ b/lib/images/media_link_nolnk.png
Binary files differ
diff --git a/lib/images/media_size_large.png b/lib/images/media_size_large.png
index e2fb548d9..012a418c3 100644
--- a/lib/images/media_size_large.png
+++ b/lib/images/media_size_large.png
Binary files differ
diff --git a/lib/images/media_size_medium.png b/lib/images/media_size_medium.png
index b33157256..1469f519f 100644
--- a/lib/images/media_size_medium.png
+++ b/lib/images/media_size_medium.png
Binary files differ
diff --git a/lib/images/media_size_original.png b/lib/images/media_size_original.png
index d179aa2db..f58d056aa 100644
--- a/lib/images/media_size_original.png
+++ b/lib/images/media_size_original.png
Binary files differ
diff --git a/lib/images/media_size_small.png b/lib/images/media_size_small.png
index 04efe7080..a0aafa4a7 100644
--- a/lib/images/media_size_small.png
+++ b/lib/images/media_size_small.png
Binary files differ
diff --git a/lib/images/minus.gif b/lib/images/minus.gif
index 499a2e2aa..7e8cbd754 100644
--- a/lib/images/minus.gif
+++ b/lib/images/minus.gif
Binary files differ
diff --git a/lib/images/multiupload.png b/lib/images/multiupload.png
index 1e8efa063..bc16c76d6 100644
--- a/lib/images/multiupload.png
+++ b/lib/images/multiupload.png
Binary files differ
diff --git a/lib/images/notify.png b/lib/images/notify.png
index 6e0015df4..c18ef1001 100644
--- a/lib/images/notify.png
+++ b/lib/images/notify.png
Binary files differ
diff --git a/lib/images/ns.png b/lib/images/ns.png
index da3c2a2d7..c35e832da 100644
--- a/lib/images/ns.png
+++ b/lib/images/ns.png
Binary files differ
diff --git a/lib/images/page.png b/lib/images/page.png
index 03ddd799f..b1b7ebe94 100644
--- a/lib/images/page.png
+++ b/lib/images/page.png
Binary files differ
diff --git a/lib/images/pencil.png b/lib/images/pencil.png
index 0bfecd50e..78142b61e 100644
--- a/lib/images/pencil.png
+++ b/lib/images/pencil.png
Binary files differ
diff --git a/lib/images/plus.gif b/lib/images/plus.gif
index 9306686d8..3da3b9458 100644
--- a/lib/images/plus.gif
+++ b/lib/images/plus.gif
Binary files differ
diff --git a/lib/images/smileys/delete.gif b/lib/images/smileys/delete.gif
index d668348b9..e94c68c56 100644
--- a/lib/images/smileys/delete.gif
+++ b/lib/images/smileys/delete.gif
Binary files differ
diff --git a/lib/images/smileys/facepalm.gif b/lib/images/smileys/facepalm.gif
new file mode 100644
index 000000000..5bebb2097
--- /dev/null
+++ b/lib/images/smileys/facepalm.gif
Binary files differ
diff --git a/lib/images/smileys/fixme.gif b/lib/images/smileys/fixme.gif
index b66ea99d6..e19141370 100644
--- a/lib/images/smileys/fixme.gif
+++ b/lib/images/smileys/fixme.gif
Binary files differ
diff --git a/lib/images/smileys/icon_arrow.gif b/lib/images/smileys/icon_arrow.gif
index 2880055cc..6771defd3 100644
--- a/lib/images/smileys/icon_arrow.gif
+++ b/lib/images/smileys/icon_arrow.gif
Binary files differ
diff --git a/lib/images/smileys/icon_biggrin.gif b/lib/images/smileys/icon_biggrin.gif
index d3527723c..aa29c14f6 100644
--- a/lib/images/smileys/icon_biggrin.gif
+++ b/lib/images/smileys/icon_biggrin.gif
Binary files differ
diff --git a/lib/images/smileys/icon_confused.gif b/lib/images/smileys/icon_confused.gif
index 0c49e0698..0ea9ed241 100644
--- a/lib/images/smileys/icon_confused.gif
+++ b/lib/images/smileys/icon_confused.gif
Binary files differ
diff --git a/lib/images/smileys/icon_cool.gif b/lib/images/smileys/icon_cool.gif
index cead0306c..3469ad482 100644
--- a/lib/images/smileys/icon_cool.gif
+++ b/lib/images/smileys/icon_cool.gif
Binary files differ
diff --git a/lib/images/smileys/icon_cry.gif b/lib/images/smileys/icon_cry.gif
index 7d54b1f99..25aea5753 100644
--- a/lib/images/smileys/icon_cry.gif
+++ b/lib/images/smileys/icon_cry.gif
Binary files differ
diff --git a/lib/images/smileys/icon_doubt.gif b/lib/images/smileys/icon_doubt.gif
index fd7903b19..b4afc6da7 100644
--- a/lib/images/smileys/icon_doubt.gif
+++ b/lib/images/smileys/icon_doubt.gif
Binary files differ
diff --git a/lib/images/smileys/icon_doubt2.gif b/lib/images/smileys/icon_doubt2.gif
index eb4b70b66..1f57eb963 100644
--- a/lib/images/smileys/icon_doubt2.gif
+++ b/lib/images/smileys/icon_doubt2.gif
Binary files differ
diff --git a/lib/images/smileys/icon_eek.gif b/lib/images/smileys/icon_eek.gif
index 5d3978106..276b01d55 100644
--- a/lib/images/smileys/icon_eek.gif
+++ b/lib/images/smileys/icon_eek.gif
Binary files differ
diff --git a/lib/images/smileys/icon_evil.gif b/lib/images/smileys/icon_evil.gif
index ab1aa8e12..d756916c9 100644
--- a/lib/images/smileys/icon_evil.gif
+++ b/lib/images/smileys/icon_evil.gif
Binary files differ
diff --git a/lib/images/smileys/icon_exclaim.gif b/lib/images/smileys/icon_exclaim.gif
index 6e50e2eec..215b32e76 100644
--- a/lib/images/smileys/icon_exclaim.gif
+++ b/lib/images/smileys/icon_exclaim.gif
Binary files differ
diff --git a/lib/images/smileys/icon_frown.gif b/lib/images/smileys/icon_frown.gif
index d2ac78c04..d46caf78f 100644
--- a/lib/images/smileys/icon_frown.gif
+++ b/lib/images/smileys/icon_frown.gif
Binary files differ
diff --git a/lib/images/smileys/icon_fun.gif b/lib/images/smileys/icon_fun.gif
index a8bb8a303..6d3c44276 100644
--- a/lib/images/smileys/icon_fun.gif
+++ b/lib/images/smileys/icon_fun.gif
Binary files differ
diff --git a/lib/images/smileys/icon_idea.gif b/lib/images/smileys/icon_idea.gif
index a40ae0d7e..41eaa0624 100644
--- a/lib/images/smileys/icon_idea.gif
+++ b/lib/images/smileys/icon_idea.gif
Binary files differ
diff --git a/lib/images/smileys/icon_kaddi.gif b/lib/images/smileys/icon_kaddi.gif
index 1410f7f1e..56344bbb0 100644
--- a/lib/images/smileys/icon_kaddi.gif
+++ b/lib/images/smileys/icon_kaddi.gif
Binary files differ
diff --git a/lib/images/smileys/icon_lol.gif b/lib/images/smileys/icon_lol.gif
index 374ba150f..d1c20c07a 100644
--- a/lib/images/smileys/icon_lol.gif
+++ b/lib/images/smileys/icon_lol.gif
Binary files differ
diff --git a/lib/images/smileys/icon_mrgreen.gif b/lib/images/smileys/icon_mrgreen.gif
index b54cd0f94..fc5d91683 100644
--- a/lib/images/smileys/icon_mrgreen.gif
+++ b/lib/images/smileys/icon_mrgreen.gif
Binary files differ
diff --git a/lib/images/smileys/icon_neutral.gif b/lib/images/smileys/icon_neutral.gif
index 4f311567e..c82a974c7 100644
--- a/lib/images/smileys/icon_neutral.gif
+++ b/lib/images/smileys/icon_neutral.gif
Binary files differ
diff --git a/lib/images/smileys/icon_question.gif b/lib/images/smileys/icon_question.gif
index 9d072265b..4e3092498 100644
--- a/lib/images/smileys/icon_question.gif
+++ b/lib/images/smileys/icon_question.gif
Binary files differ
diff --git a/lib/images/smileys/icon_razz.gif b/lib/images/smileys/icon_razz.gif
index 29da2a2fc..310655eec 100644
--- a/lib/images/smileys/icon_razz.gif
+++ b/lib/images/smileys/icon_razz.gif
Binary files differ
diff --git a/lib/images/smileys/icon_redface.gif b/lib/images/smileys/icon_redface.gif
index ad7628320..160c20f33 100644
--- a/lib/images/smileys/icon_redface.gif
+++ b/lib/images/smileys/icon_redface.gif
Binary files differ
diff --git a/lib/images/smileys/icon_rolleyes.gif b/lib/images/smileys/icon_rolleyes.gif
index d7f5f2f4b..502c5c174 100644
--- a/lib/images/smileys/icon_rolleyes.gif
+++ b/lib/images/smileys/icon_rolleyes.gif
Binary files differ
diff --git a/lib/images/smileys/icon_sad.gif b/lib/images/smileys/icon_sad.gif
index d2ac78c04..d46caf78f 100644
--- a/lib/images/smileys/icon_sad.gif
+++ b/lib/images/smileys/icon_sad.gif
Binary files differ
diff --git a/lib/images/smileys/icon_silenced.gif b/lib/images/smileys/icon_silenced.gif
index 448399b2b..5f722e04e 100644
--- a/lib/images/smileys/icon_silenced.gif
+++ b/lib/images/smileys/icon_silenced.gif
Binary files differ
diff --git a/lib/images/smileys/icon_smile.gif b/lib/images/smileys/icon_smile.gif
index 7b1f6d304..df125e2b5 100644
--- a/lib/images/smileys/icon_smile.gif
+++ b/lib/images/smileys/icon_smile.gif
Binary files differ
diff --git a/lib/images/smileys/icon_smile2.gif b/lib/images/smileys/icon_smile2.gif
index 769639d32..6b4909c81 100644
--- a/lib/images/smileys/icon_smile2.gif
+++ b/lib/images/smileys/icon_smile2.gif
Binary files differ
diff --git a/lib/images/smileys/icon_surprised.gif b/lib/images/smileys/icon_surprised.gif
index cb2142431..aaa94f1da 100644
--- a/lib/images/smileys/icon_surprised.gif
+++ b/lib/images/smileys/icon_surprised.gif
Binary files differ
diff --git a/lib/images/smileys/icon_twisted.gif b/lib/images/smileys/icon_twisted.gif
index 502fe247e..eaec19338 100644
--- a/lib/images/smileys/icon_twisted.gif
+++ b/lib/images/smileys/icon_twisted.gif
Binary files differ
diff --git a/lib/images/smileys/icon_wink.gif b/lib/images/smileys/icon_wink.gif
index d14828804..78b6ad3db 100644
--- a/lib/images/smileys/icon_wink.gif
+++ b/lib/images/smileys/icon_wink.gif
Binary files differ
diff --git a/lib/images/success.png b/lib/images/success.png
index a5ae9f11b..9241adbb2 100644
--- a/lib/images/success.png
+++ b/lib/images/success.png
Binary files differ
diff --git a/lib/images/throbber.gif b/lib/images/throbber.gif
index d04bd3949..27178a8cf 100644
--- a/lib/images/throbber.gif
+++ b/lib/images/throbber.gif
Binary files differ
diff --git a/lib/images/toolbar/bold.png b/lib/images/toolbar/bold.png
index 7ebe99ee9..51ddb8880 100644
--- a/lib/images/toolbar/bold.png
+++ b/lib/images/toolbar/bold.png
Binary files differ
diff --git a/lib/images/toolbar/chars.png b/lib/images/toolbar/chars.png
index 3f3396aeb..bad37e503 100644
--- a/lib/images/toolbar/chars.png
+++ b/lib/images/toolbar/chars.png
Binary files differ
diff --git a/lib/images/toolbar/h.png b/lib/images/toolbar/h.png
index aae052462..6a48cbbc0 100644
--- a/lib/images/toolbar/h.png
+++ b/lib/images/toolbar/h.png
Binary files differ
diff --git a/lib/images/toolbar/h1.png b/lib/images/toolbar/h1.png
index 93dae935f..85bd06e6c 100644
--- a/lib/images/toolbar/h1.png
+++ b/lib/images/toolbar/h1.png
Binary files differ
diff --git a/lib/images/toolbar/h2.png b/lib/images/toolbar/h2.png
index f0eee3bd0..be2c60031 100644
--- a/lib/images/toolbar/h2.png
+++ b/lib/images/toolbar/h2.png
Binary files differ
diff --git a/lib/images/toolbar/h3.png b/lib/images/toolbar/h3.png
index 8cfd4c077..350da88b6 100644
--- a/lib/images/toolbar/h3.png
+++ b/lib/images/toolbar/h3.png
Binary files differ
diff --git a/lib/images/toolbar/h4.png b/lib/images/toolbar/h4.png
index 7b8f51a1b..bc1b7038f 100644
--- a/lib/images/toolbar/h4.png
+++ b/lib/images/toolbar/h4.png
Binary files differ
diff --git a/lib/images/toolbar/h5.png b/lib/images/toolbar/h5.png
index 44b00d9c8..b6c263dfb 100644
--- a/lib/images/toolbar/h5.png
+++ b/lib/images/toolbar/h5.png
Binary files differ
diff --git a/lib/images/toolbar/hequal.png b/lib/images/toolbar/hequal.png
index 8fc6b0d75..da4e921ff 100644
--- a/lib/images/toolbar/hequal.png
+++ b/lib/images/toolbar/hequal.png
Binary files differ
diff --git a/lib/images/toolbar/hminus.png b/lib/images/toolbar/hminus.png
index f9d67adcb..c00f70223 100644
--- a/lib/images/toolbar/hminus.png
+++ b/lib/images/toolbar/hminus.png
Binary files differ
diff --git a/lib/images/toolbar/hplus.png b/lib/images/toolbar/hplus.png
index 66f3d5e33..6124b5c33 100644
--- a/lib/images/toolbar/hplus.png
+++ b/lib/images/toolbar/hplus.png
Binary files differ
diff --git a/lib/images/toolbar/hr.png b/lib/images/toolbar/hr.png
index f86a8ec94..de3a8a55b 100644
--- a/lib/images/toolbar/hr.png
+++ b/lib/images/toolbar/hr.png
Binary files differ
diff --git a/lib/images/toolbar/image.png b/lib/images/toolbar/image.png
index 1aab5d7de..70b12fcc2 100644
--- a/lib/images/toolbar/image.png
+++ b/lib/images/toolbar/image.png
Binary files differ
diff --git a/lib/images/toolbar/italic.png b/lib/images/toolbar/italic.png
index 324e7c036..d69e66070 100644
--- a/lib/images/toolbar/italic.png
+++ b/lib/images/toolbar/italic.png
Binary files differ
diff --git a/lib/images/toolbar/link.png b/lib/images/toolbar/link.png
index 41e52c6ab..01105b0d3 100644
--- a/lib/images/toolbar/link.png
+++ b/lib/images/toolbar/link.png
Binary files differ
diff --git a/lib/images/toolbar/linkextern.png b/lib/images/toolbar/linkextern.png
index 75afd3dc2..acc0c6fc5 100644
--- a/lib/images/toolbar/linkextern.png
+++ b/lib/images/toolbar/linkextern.png
Binary files differ
diff --git a/lib/images/toolbar/mono.png b/lib/images/toolbar/mono.png
index 178cec9f2..b91ad2e0d 100644
--- a/lib/images/toolbar/mono.png
+++ b/lib/images/toolbar/mono.png
Binary files differ
diff --git a/lib/images/toolbar/ol.png b/lib/images/toolbar/ol.png
index 3162fa21d..186f1fad4 100644
--- a/lib/images/toolbar/ol.png
+++ b/lib/images/toolbar/ol.png
Binary files differ
diff --git a/lib/images/toolbar/sig.png b/lib/images/toolbar/sig.png
index ef997b7cd..72fdad0a0 100644
--- a/lib/images/toolbar/sig.png
+++ b/lib/images/toolbar/sig.png
Binary files differ
diff --git a/lib/images/toolbar/smiley.png b/lib/images/toolbar/smiley.png
index e92845cb4..85036c1a8 100644
--- a/lib/images/toolbar/smiley.png
+++ b/lib/images/toolbar/smiley.png
Binary files differ
diff --git a/lib/images/toolbar/strike.png b/lib/images/toolbar/strike.png
index 203aacc2b..e532d1f07 100644
--- a/lib/images/toolbar/strike.png
+++ b/lib/images/toolbar/strike.png
Binary files differ
diff --git a/lib/images/toolbar/ul.png b/lib/images/toolbar/ul.png
index 471171db4..008820722 100644
--- a/lib/images/toolbar/ul.png
+++ b/lib/images/toolbar/ul.png
Binary files differ
diff --git a/lib/images/toolbar/underline.png b/lib/images/toolbar/underline.png
index bf9665a68..fa271517c 100644
--- a/lib/images/toolbar/underline.png
+++ b/lib/images/toolbar/underline.png
Binary files differ
diff --git a/lib/images/trash.png b/lib/images/trash.png
index ebad933c8..350c5e1cf 100644
--- a/lib/images/trash.png
+++ b/lib/images/trash.png
Binary files differ
diff --git a/lib/images/up.png b/lib/images/up.png
index 557d5e6a9..b1eac912d 100644
--- a/lib/images/up.png
+++ b/lib/images/up.png
Binary files differ
diff --git a/lib/plugins/acl/admin.php b/lib/plugins/acl/admin.php
index 3e7bd8121..7c12b3374 100644
--- a/lib/plugins/acl/admin.php
+++ b/lib/plugins/acl/admin.php
@@ -17,7 +17,7 @@ if(!defined('DOKU_INC')) die();
class admin_plugin_acl extends DokuWiki_Admin_Plugin {
var $acl = null;
var $ns = null;
- /**
+ /**
* The currently selected item, associative array with id and type.
* Populated from (in this order):
* $_REQUEST['current_ns']
@@ -37,7 +37,7 @@ class admin_plugin_acl extends DokuWiki_Admin_Plugin {
return array(
'author' => 'Andreas Gohr',
'email' => 'andi@splitbrain.org',
- 'date' => '2010-01-17',
+ 'date' => '2011-04-16',
'name' => 'ACL Manager',
'desc' => 'Manage Page Access Control Lists',
'url' => 'http://dokuwiki.org/plugin:acl',
@@ -72,7 +72,7 @@ class admin_plugin_acl extends DokuWiki_Admin_Plugin {
global $config_cascade;
// fresh 1:1 copy without replacements
- $AUTH_ACL = file(DOKU_CONF.'acl.auth.php');
+ $AUTH_ACL = file($config_cascade['acl']['default']);
// namespace given?
@@ -253,19 +253,12 @@ class admin_plugin_acl extends DokuWiki_Admin_Plugin {
$data = $this->_get_tree($ns);
// wrap a list with the root level around the other namespaces
- $item = array( 'level' => 0, 'id' => '*', 'type' => 'd',
- 'open' =>'true', 'label' => '['.$lang['mediaroot'].']');
+ array_unshift($data, array( 'level' => 0, 'id' => '*', 'type' => 'd',
+ 'open' =>'true', 'label' => '['.$lang['mediaroot'].']'));
- echo '<ul class="acltree">';
- echo $this->_html_li_acl($item);
- echo '<div class="li">';
- echo $this->_html_list_acl($item);
- echo '</div>';
echo html_buildlist($data,'acl',
array($this,'_html_list_acl'),
array($this,'_html_li_acl'));
- echo '</li>';
- echo '</ul>';
}
@@ -449,7 +442,7 @@ class admin_plugin_acl extends DokuWiki_Admin_Plugin {
$user = '';
$groups = array(ltrim($who,'@'));
}else{
- $user = auth_nameencode($who);
+ $user = $who;
$info = $auth->getUserData($user);
if($info === false){
$groups = array();
@@ -521,7 +514,7 @@ class admin_plugin_acl extends DokuWiki_Admin_Plugin {
}
// highlight?
- if( ($item['type']== $this->current_item['type'] && $item['id'] == $this->current_item['id']))
+ if( ($item['type']== $this->current_item['type'] && $item['id'] == $this->current_item['id']))
$cl = ' cur';
// namespace or page?
@@ -711,7 +704,7 @@ class admin_plugin_acl extends DokuWiki_Admin_Plugin {
$new_config = $acl_config.$new_acl;
- return io_saveFile(DOKU_CONF.'acl.auth.php', $new_config);
+ return io_saveFile($config_cascade['acl']['default'], $new_config);
}
/**
@@ -729,7 +722,7 @@ class admin_plugin_acl extends DokuWiki_Admin_Plugin {
// save all non!-matching
$new_config = preg_grep("/$acl_pattern/", $acl_config, PREG_GREP_INVERT);
- return io_saveFile(DOKU_CONF.'acl.auth.php', join('',$new_config));
+ return io_saveFile($config_cascade['acl']['default'], join('',$new_config));
}
/**
@@ -800,38 +793,42 @@ class admin_plugin_acl extends DokuWiki_Admin_Plugin {
echo '<select name="acl_t" class="edit">'.NL;
echo ' <option value="__g__" class="aclgroup"'.$gsel.'>'.$this->getLang('acl_group').':</option>'.NL;
echo ' <option value="__u__" class="acluser"'.$usel.'>'.$this->getLang('acl_user').':</option>'.NL;
- echo ' <optgroup label="&nbsp;">'.NL;
- foreach($this->specials as $ug){
- if($ug == $this->who){
- $sel = ' selected="selected"';
- $inlist = true;
- }else{
- $sel = '';
- }
+ if (!empty($this->specials)) {
+ echo ' <optgroup label="&nbsp;">'.NL;
+ foreach($this->specials as $ug){
+ if($ug == $this->who){
+ $sel = ' selected="selected"';
+ $inlist = true;
+ }else{
+ $sel = '';
+ }
- if($ug{0} == '@'){
- echo ' <option value="'.hsc($ug).'" class="aclgroup"'.$sel.'>'.hsc($ug).'</option>'.NL;
- }else{
- echo ' <option value="'.hsc($ug).'" class="acluser"'.$sel.'>'.hsc($ug).'</option>'.NL;
+ if($ug{0} == '@'){
+ echo ' <option value="'.hsc($ug).'" class="aclgroup"'.$sel.'>'.hsc($ug).'</option>'.NL;
+ }else{
+ echo ' <option value="'.hsc($ug).'" class="acluser"'.$sel.'>'.hsc($ug).'</option>'.NL;
+ }
}
+ echo ' </optgroup>'.NL;
}
- echo ' </optgroup>'.NL;
- echo ' <optgroup label="&nbsp;">'.NL;
- foreach($this->usersgroups as $ug){
- if($ug == $this->who){
- $sel = ' selected="selected"';
- $inlist = true;
- }else{
- $sel = '';
- }
+ if (!empty($this->usersgroups)) {
+ echo ' <optgroup label="&nbsp;">'.NL;
+ foreach($this->usersgroups as $ug){
+ if($ug == $this->who){
+ $sel = ' selected="selected"';
+ $inlist = true;
+ }else{
+ $sel = '';
+ }
- if($ug{0} == '@'){
- echo ' <option value="'.hsc($ug).'" class="aclgroup"'.$sel.'>'.hsc($ug).'</option>'.NL;
- }else{
- echo ' <option value="'.hsc($ug).'" class="acluser"'.$sel.'>'.hsc($ug).'</option>'.NL;
+ if($ug{0} == '@'){
+ echo ' <option value="'.hsc($ug).'" class="aclgroup"'.$sel.'>'.hsc($ug).'</option>'.NL;
+ }else{
+ echo ' <option value="'.hsc($ug).'" class="acluser"'.$sel.'>'.hsc($ug).'</option>'.NL;
+ }
}
+ echo ' </optgroup>'.NL;
}
- echo ' </optgroup>'.NL;
echo '</select>'.NL;
return $inlist;
}
diff --git a/lib/plugins/acl/ajax.php b/lib/plugins/acl/ajax.php
index d91586a5d..d704fa8c9 100644
--- a/lib/plugins/acl/ajax.php
+++ b/lib/plugins/acl/ajax.php
@@ -44,13 +44,10 @@ if($ajax == 'info'){
$data = $acl->_get_tree($ns,$ns);
- foreach($data as $item){
- $item['level'] = $lvl+1;
- echo $acl->_html_li_acl($item);
- echo '<div class="li">';
- echo $acl->_html_list_acl($item);
- echo '</div>';
- echo '</li>';
+ foreach(array_keys($data) as $item){
+ $data[$item]['level'] = $lvl+1;
}
+ echo html_buildlist($data, 'acl', array($acl, '_html_list_acl'),
+ array($acl, '_html_li_acl'));
}
diff --git a/lib/plugins/acl/lang/ar/help.txt b/lib/plugins/acl/lang/ar/help.txt
index afae13a86..70f5cf645 100644
--- a/lib/plugins/acl/lang/ar/help.txt
+++ b/lib/plugins/acl/lang/ar/help.txt
@@ -8,4 +8,4 @@
في الجدول في الأسفل تجد قواعد التحكم بالوصول معروضة. يمكنك استخدامها لحذف أو تغيير عدة قواعد بسرعة.
-قراءة [[doku>acl|المستندات الرسمية عن ACL]] قد يساعدك على الفهم الكامل لطريقة عمل التحكم بالوصول في دوكي ويكي.
+قراءة [[doku>acl|المستندات الرسمية عن ACL]] قد يساعدك على الفهم الكامل لطريقة عمل التحكم بالوصول في دوكو ويكي.
diff --git a/lib/plugins/acl/lang/ar/lang.php b/lib/plugins/acl/lang/ar/lang.php
index 552ce90d9..7c05b721c 100644
--- a/lib/plugins/acl/lang/ar/lang.php
+++ b/lib/plugins/acl/lang/ar/lang.php
@@ -6,6 +6,7 @@
* @author Mostafa Hussein <mostafa@gmail.com>
* @author Yaman Hokan <always.smile.yh@hotmail.com>
* @author Usama Akkad <uahello@gmail.com>
+ * @author uahello@gmail.com
*/
$lang['admin_acl'] = 'إدارة قوائم التحكم بالدخول';
$lang['acl_group'] = 'مجموعة';
diff --git a/lib/plugins/acl/lang/bg/help.txt b/lib/plugins/acl/lang/bg/help.txt
index 23028cb35..2de453420 100644
--- a/lib/plugins/acl/lang/bg/help.txt
+++ b/lib/plugins/acl/lang/bg/help.txt
@@ -1,11 +1,11 @@
=== Помощ ===
-На тази страница можете да добавяте и премахвате разрешения за определяне на имена и страници във Вашето Wiki.
+От тук можете да добавяте и премахвате права за именни пространства и страници във вашето Wiki.
-Левият панел показва всички налични имена и страници.
+Левият панел показва всички налични именни пространства и страници.
-Формата по-горе ви позволява да видите и промените разрешенията на избрания потребител или група.
+Формата отгоре ви позволява да преглеждате и променяте правата на избран потребител или група.
-В таблицата по-долу са показани всички актуални правила за контрол на достъпа. Можете да я използвате за бързо изтриване или промяна на множество правила.
+В таблицата отдолу са показани всички актуални правила за контрол на достъпа. Можете да я ползвате за бързо изтриване или промяна на множество правила.
-Четене на [[doku>acl|ACL документацията]] може да ви помогне да разберете напълно как работи контрола на достъпа в DokuWiki. \ No newline at end of file
+За да разберете как работи контрола на достъпа в DokuWiki трябва да прочетете [[doku>acl|документацията относно ACL]]. \ No newline at end of file
diff --git a/lib/plugins/acl/lang/bg/lang.php b/lib/plugins/acl/lang/bg/lang.php
index 9facd4259..0746e32c9 100644
--- a/lib/plugins/acl/lang/bg/lang.php
+++ b/lib/plugins/acl/lang/bg/lang.php
@@ -5,6 +5,7 @@
* @license GPL 2 (http://www.gnu.org/licenses/gpl.html)
* @author Nikolay Vladimirov <nikolay@vladimiroff.com>
* @author Viktor Usunov <usun0v@mail.bg>
+ * @author Kiril <neohidra@gmail.com>
*/
$lang['admin_acl'] = 'Управление на списъците за достъп';
$lang['acl_group'] = 'Група';
@@ -13,17 +14,17 @@ $lang['acl_perms'] = 'Права за';
$lang['page'] = 'Страница';
$lang['namespace'] = 'Именно пространство';
$lang['btn_select'] = 'Избери';
-$lang['p_user_id'] = 'Потребителят <b class="acluser">%s</b> има в момента следните права за страницата <b class="aclpage">%s</b>: <i>%s</i>.';
-$lang['p_user_ns'] = 'Потребителят <b class="acluser">%s</b> има в момента следните права в именното пространство <b class="aclns">%s</b>: <i>%s</i>.';
-$lang['p_group_id'] = 'Членове на групата <b class="aclgroup">%s</b> имат в момента следните права за страницата <b class="aclpage">%s</b>: <i>%s</i>.';
-$lang['p_group_ns'] = 'Членове на групата <b class="aclgroup">%s</b> имат в момента следните права в именното пространство <b class="aclns">%s</b>: <i>%s</i>.';
-$lang['p_choose_id'] = 'Моля <b>въведете потребител или група</b> в полето горе, за да видите или промените правата за страницата <b class="aclpage">%s</b>.';
-$lang['p_choose_ns'] = 'Моля <b>въведете потребител или група</b> в полето горе, за да видите или промените правата за именното пространство <b class="aclns">%s</b>.';
-$lang['p_inherited'] = 'Забележка: Тези разрешения не са определени изрично, но са били наследени от други групи или именни пространства.';
-$lang['p_isadmin'] = 'Забележка: Избраните група или потребител притежават пълни права, според конфигурацията им.';
-$lang['p_include'] = 'Висши разрешения включват по-нисши такива. Създаване или премахване на разрешения се прилага само за именни пространства, не за страници.';
+$lang['p_user_id'] = 'Потребителят <b class="acluser">%s</b> в момента има следните права за страницата <b class="aclpage">%s</b>: <i>%s</i>.';
+$lang['p_user_ns'] = 'Потребителят <b class="acluser">%s</b> в момента има следните права за именното пространство <b class="aclns">%s</b>: <i>%s</i>.';
+$lang['p_group_id'] = 'Членовете на групата <b class="aclgroup">%s</b> в момента имат следните права за страницата <b class="aclpage">%s</b>: <i>%s</i>.';
+$lang['p_group_ns'] = 'Членовете на групата <b class="aclgroup">%s</b> в момента имат следните права за именното пространство <b class="aclns">%s</b>: <i>%s</i>.';
+$lang['p_choose_id'] = 'Моля, <b>въведете потребител или група</b> в полето отгоре, за да видите или промените правата за страницата <b class="aclpage">%s</b>.';
+$lang['p_choose_ns'] = 'Моля, <b>въведете потребител или група</b> в полето отгоре, за да видите или промените правата за именното пространство <b class="aclns">%s</b>.';
+$lang['p_inherited'] = 'Бележка: Тези разрешения не са зададени директно, а са наследени от други групи или именни пространства.';
+$lang['p_isadmin'] = 'Бележка: Избраната група или потребител има всички права, защото е определен за суперпотребител.';
+$lang['p_include'] = 'Висши права включват по-нисшите такива. Правата за създаване, качване и изтриване са приложими само за именни пространства, но не за страници.';
$lang['current'] = 'Текущи ACL права';
-$lang['where'] = 'Страница/Именно постранство';
+$lang['where'] = 'Страница/Именно пространство';
$lang['who'] = 'Потребител/Група';
$lang['perm'] = 'Права';
$lang['acl_perm0'] = 'Никакви';
@@ -32,5 +33,5 @@ $lang['acl_perm2'] = 'Редактиране';
$lang['acl_perm4'] = 'Създаване';
$lang['acl_perm8'] = 'Качване';
$lang['acl_perm16'] = 'Изтриване';
-$lang['acl_new'] = 'Добавяне на ново';
-$lang['acl_mod'] = 'Промяна на вписване';
+$lang['acl_new'] = 'Добавяне на право';
+$lang['acl_mod'] = 'Промяна на записа';
diff --git a/lib/plugins/acl/lang/cs/lang.php b/lib/plugins/acl/lang/cs/lang.php
index 311b79ae9..7c1efbd4c 100644
--- a/lib/plugins/acl/lang/cs/lang.php
+++ b/lib/plugins/acl/lang/cs/lang.php
@@ -8,6 +8,7 @@
* @author tomas@valenta.cz
* @author Marek Sacha <sachamar@fel.cvut.cz>
* @author Lefty <lefty@multihost.cz>
+ * @author Vojta Beran <xmamut@email.cz>
*/
$lang['admin_acl'] = 'Správa přístupových práv';
$lang['acl_group'] = 'Skupina';
diff --git a/lib/plugins/acl/lang/de-informal/lang.php b/lib/plugins/acl/lang/de-informal/lang.php
index fdb6f5a89..e24584a55 100644
--- a/lib/plugins/acl/lang/de-informal/lang.php
+++ b/lib/plugins/acl/lang/de-informal/lang.php
@@ -6,6 +6,7 @@
* @author Juergen Schwarzer <jschwarzer@freenet.de>
* @author Marcel Metz <marcel_metz@gmx.de>
* @author Matthias Schulte <post@lupo49.de>
+ * @author Christian Wichmann <nospam@zone0.de>
*/
$lang['admin_acl'] = 'Zugriffskontrollsystem Management';
$lang['acl_group'] = 'Gruppe';
diff --git a/lib/plugins/acl/lang/de/lang.php b/lib/plugins/acl/lang/de/lang.php
index 0d30fe7a1..3c6bf8cf0 100644
--- a/lib/plugins/acl/lang/de/lang.php
+++ b/lib/plugins/acl/lang/de/lang.php
@@ -17,6 +17,8 @@
* @author Blitzi94@gmx.de
* @author Robert Bogenschneider <robog@GMX.de>
* @author Robert Bogenschneider <robog@gmx.de>
+ * @author Niels Lange <niels@boldencursief.nl>
+ * @author Christian Wichmann <nospam@zone0.de>
*/
$lang['admin_acl'] = 'Zugangsverwaltung';
$lang['acl_group'] = 'Gruppe';
diff --git a/lib/plugins/acl/lang/es/lang.php b/lib/plugins/acl/lang/es/lang.php
index e63448a00..096320af9 100644
--- a/lib/plugins/acl/lang/es/lang.php
+++ b/lib/plugins/acl/lang/es/lang.php
@@ -19,6 +19,7 @@
* @author Fernando J. Gómez <fjgomez@gmail.com>
* @author Victor Castelan <victorcastelan@gmail.com>
* @author Mauro Javier Giamberardino <mgiamberardino@gmail.com>
+ * @author emezeta <emezeta@infoprimo.com>
*/
$lang['admin_acl'] = 'Administración de lista de control de acceso';
$lang['acl_group'] = 'Grupo';
diff --git a/lib/plugins/acl/lang/et/lang.php b/lib/plugins/acl/lang/et/lang.php
index 2f7208b7c..bc4c73a16 100644
--- a/lib/plugins/acl/lang/et/lang.php
+++ b/lib/plugins/acl/lang/et/lang.php
@@ -3,21 +3,26 @@
* Estonian language file
*
* @license GPL 2 (http://www.gnu.org/licenses/gpl.html)
- * @author Oliver S6ro <seem.iges@mail.ee>
- * @author Aari Juhanson <aari@vmg.vil.ee>
- * @author Kaiko Kaur <kaiko@kultuur.edu.ee>
+ * @author Oliver S6ro <seem.iges@mail.ee>
+ * @author Aari Juhanson <aari@vmg.vil.ee>
+ * @author Kaiko Kaur <kaiko@kultuur.edu.ee>
+ * @author kristian.kankainen@kuu.la
+ * @author Rivo Zängov <eraser@eraser.ee>
*/
-
-$lang['admin_acl'] = 'Ligipääsukontrolli nimekirja haldamine';
-$lang['acl_group'] = 'Grupp';
-$lang['acl_user'] = 'Kasutaja';
-$lang['acl_perms'] = 'Lubatud';
-$lang['page'] = 'leht';
-$lang['namespace'] = 'alajaotus';
-
-$lang['acl_perm1'] = 'Lugemine';
-$lang['acl_perm2'] = 'Toimetamine';
-$lang['acl_perm4'] = 'Tekitamine';
-$lang['acl_perm8'] = 'Üles laadimine';
-$lang['acl_new'] = 'Uue kirje lisamine';
-//Setup VIM: ex: et ts=2 :
+$lang['admin_acl'] = 'Ligipääsukontrolli nimekirja haldamine';
+$lang['acl_group'] = 'Grupp';
+$lang['acl_user'] = 'Kasutaja';
+$lang['acl_perms'] = 'Lubatud';
+$lang['page'] = 'leht';
+$lang['namespace'] = 'alajaotus';
+$lang['btn_select'] = 'Vali';
+$lang['who'] = 'Kasutaja/Grupp';
+$lang['perm'] = 'Õigused';
+$lang['acl_perm0'] = 'Pole';
+$lang['acl_perm1'] = 'Lugemine';
+$lang['acl_perm2'] = 'Toimetamine';
+$lang['acl_perm4'] = 'Tekitamine';
+$lang['acl_perm8'] = 'Üles laadimine';
+$lang['acl_perm16'] = 'Kustuta';
+$lang['acl_new'] = 'Uue kirje lisamine';
+$lang['acl_mod'] = 'Muuda sissekannet';
diff --git a/lib/plugins/acl/lang/fi/lang.php b/lib/plugins/acl/lang/fi/lang.php
index 04074d8d4..4f145e0f6 100644
--- a/lib/plugins/acl/lang/fi/lang.php
+++ b/lib/plugins/acl/lang/fi/lang.php
@@ -5,6 +5,7 @@
* @author otto@valjakko.net
* @author Otto Vainio <otto@valjakko.net>
* @author Teemu Mattila <ghcsystems@gmail.com>
+ * @author Sami Olmari <sami@olmari.fi>
*/
$lang['admin_acl'] = 'Käyttöoikeudet (ACL)';
$lang['acl_group'] = 'Ryhmä';
diff --git a/lib/plugins/acl/lang/fr/lang.php b/lib/plugins/acl/lang/fr/lang.php
index 63e529aab..fd3f40dfc 100644
--- a/lib/plugins/acl/lang/fr/lang.php
+++ b/lib/plugins/acl/lang/fr/lang.php
@@ -20,6 +20,8 @@
* @author Philippe Bajoit <philippe.bajoit@gmail.com>
* @author Florian Gaub <floriang@floriang.net>
* @author Samuel Dorsaz samuel.dorsaz@novelion.net
+ * @author Johan Guilbaud <guilbaud.johan@gmail.com>
+ * @author schplurtz@laposte.net
*/
$lang['admin_acl'] = 'Gestion de la liste des contrôles d\'accès (ACL)';
$lang['acl_group'] = 'Groupe';
diff --git a/lib/plugins/acl/lang/he/lang.php b/lib/plugins/acl/lang/he/lang.php
index ac00730dd..91025f4b8 100644
--- a/lib/plugins/acl/lang/he/lang.php
+++ b/lib/plugins/acl/lang/he/lang.php
@@ -7,6 +7,7 @@
* @author Dotan Kamber <kamberd@yahoo.com>
* @author Moshe Kaplan <mokplan@gmail.com>
* @author Yaron Yogev <yaronyogev@gmail.com>
+ * @author Yaron Shahrabani <sh.yaron@gmail.com>
*/
$lang['admin_acl'] = 'ניהול רשימת בקרת גישות';
$lang['acl_group'] = 'קבוצה';
diff --git a/lib/plugins/acl/lang/hr/help.txt b/lib/plugins/acl/lang/hr/help.txt
new file mode 100644
index 000000000..4e7cfc3c2
--- /dev/null
+++ b/lib/plugins/acl/lang/hr/help.txt
@@ -0,0 +1,11 @@
+=== Brza Pomoć: ===
+
+Na ovoj stranici možeš dodavati i brisati dozvole za imenske prostore i stranice u svom wiki-u.
+
+Lijevi prozor prikazuje sve dostupne imenske prostore i stranice.
+
+Forma iznad ti omogućuje pregled i mijenjanje dozvola odabranom korisniku ili grupi.
+
+U tablici ispod prikazana su sva trenutno postavljena pravila kontrole pristupa. Koristite je za višestruko brisanje ili mijenjanje pravila.
+
+Čitanje [[doku>acl|službena dokumentacija o ACL]] može vam pomoći potpuno razumijeti kako kontrola pristupa radi u DokuWiki. \ No newline at end of file
diff --git a/lib/plugins/acl/lang/hr/lang.php b/lib/plugins/acl/lang/hr/lang.php
index d2094b77b..8c21f1b0b 100644
--- a/lib/plugins/acl/lang/hr/lang.php
+++ b/lib/plugins/acl/lang/hr/lang.php
@@ -4,4 +4,33 @@
*
* @author Branko Rihtman <theney@gmail.com>
* @author Dražen Odobašić <dodobasic@gmail.com>
+ * @author Dejan Igrec dejan.igrec@gmail.com
*/
+$lang['admin_acl'] = 'Upravljanje listom kontrole pristupa';
+$lang['acl_group'] = 'Grupa';
+$lang['acl_user'] = 'Korisnik';
+$lang['acl_perms'] = 'Dozvole za';
+$lang['page'] = 'Stranica';
+$lang['namespace'] = 'Imenski prostor';
+$lang['btn_select'] = 'Odaberi';
+$lang['p_user_id'] = 'Korisnik <b class="acluser">%s</b> trenutno ima sljedeće dozvole na stranici <b class="aclpage">%s</b>: <i>%s</i>.';
+$lang['p_user_ns'] = 'Korisnik <b class="acluser">%s</b> trenutno ima sljedeće dozvole u imenskom prostoru <b class="aclns">%s</b>: <i>%s</i>.';
+$lang['p_group_id'] = 'Članovi grupe <b class="aclgroup">%s</b> trenutno imaju sljedeće dozvole na stranici <b class="aclpage">%s</b>: <i>%s</i>.';
+$lang['p_group_ns'] = 'Članovi grupe <b class="aclgroup">%s</b> trenutno imaju sljedeće dozvole u imenskom prostoru <b class="aclns">%s</b>: <i>%s</i>.';
+$lang['p_choose_id'] = 'Molim <b>unesti korisnika ili grupu</b> u gornju formu za pregled ili uređivanje dozvola postavljenih za stranicu <b class="aclpage">%s</b>.';
+$lang['p_choose_ns'] = 'Molim <b>unesti korisnika ili grupu</b> u gornju formu za pregled ili uređivanje dozvola postavljenih za imenski prostor <b class="aclns">%s</b>.';
+$lang['p_inherited'] = 'Napomena: Ove dozvole nisu postavljene eksplicitno već su naslijeđene od drugih grupa ili nadređenih imenskih prostora.';
+$lang['p_isadmin'] = 'Napomena: Odabrana grupa ili korisnik uvijek ima sve dozvole jer je postavljen kao superuser.';
+$lang['p_include'] = 'Više dozvole uključuju sve niže. Dozvole Kreiraj, Učitaj i Briši se primjenjuju samo na imenske prostore, ne stranice.';
+$lang['current'] = 'Trenutna ACL Pravila';
+$lang['where'] = 'Stranica/Imenski prostor';
+$lang['who'] = 'Korisnik/Grupa';
+$lang['perm'] = 'Dozvole';
+$lang['acl_perm0'] = 'Ništa';
+$lang['acl_perm1'] = 'Čitaj';
+$lang['acl_perm2'] = 'Uredi';
+$lang['acl_perm4'] = 'Kreiraj';
+$lang['acl_perm8'] = 'Učitaj';
+$lang['acl_perm16'] = 'Briši';
+$lang['acl_new'] = 'Dodaj novi Zapis';
+$lang['acl_mod'] = 'Promijeni Zapis';
diff --git a/lib/plugins/acl/lang/hu/lang.php b/lib/plugins/acl/lang/hu/lang.php
index 318287073..255d838b6 100644
--- a/lib/plugins/acl/lang/hu/lang.php
+++ b/lib/plugins/acl/lang/hu/lang.php
@@ -5,8 +5,9 @@
* @author Sandor TIHANYI <stihanyi+dw@gmail.com>
* @author Siaynoq Mage <siaynoqmage@gmail.com>
* @author schilling.janos@gmail.com
- * @author Szabó Dávid (szabo.david@gyumolcstarhely.hu)
* @author Szabó Dávid <szabo.david@gyumolcstarhely.hu>
+ * @author Sándor TIHANYI <stihanyi+dw@gmail.com>
+ * @author David Szabo <szabo.david@gyumolcstarhely.hu>
*/
$lang['admin_acl'] = 'Hozzáférési lista (ACL) kezelő';
$lang['acl_group'] = 'Csoport:';
diff --git a/lib/plugins/acl/lang/it/lang.php b/lib/plugins/acl/lang/it/lang.php
index 89e421bbb..f789b979f 100644
--- a/lib/plugins/acl/lang/it/lang.php
+++ b/lib/plugins/acl/lang/it/lang.php
@@ -12,6 +12,7 @@
* @author snarchio@alice.it
* @author robocap <robocap1@gmail.com>
* @author Osman Tekin osman.tekin93@hotmail.it
+ * @author Jacopo Corbetta <jacopo.corbetta@gmail.com>
*/
$lang['admin_acl'] = 'Gestione Lista Controllo Accessi (ACL)';
$lang['acl_group'] = 'Gruppo';
diff --git a/lib/plugins/acl/lang/kk/lang.php b/lib/plugins/acl/lang/kk/lang.php
new file mode 100644
index 000000000..dde5b9577
--- /dev/null
+++ b/lib/plugins/acl/lang/kk/lang.php
@@ -0,0 +1,6 @@
+<?php
+/**
+ * kazakh language file
+ *
+ * @author Nurgozha Kaliaskarov astana08@gmail.com
+ */
diff --git a/lib/plugins/acl/lang/la/help.txt b/lib/plugins/acl/lang/la/help.txt
index ba974f48c..553884c30 100644
--- a/lib/plugins/acl/lang/la/help.txt
+++ b/lib/plugins/acl/lang/la/help.txt
@@ -1,8 +1,8 @@
=== Auxilium: ===
-Hic facultates spatiorum nominis paginarumque addere delereue potes.
+Hic facultates generum paginarumque addere delereue potes.
-Tabella sinistra omnes paginas spatia nominisque ostendit.
+Tabella sinistra omnes paginas generaque ostendit.
His campis mutare facultates electorum Sodalium Gregumque potes.
diff --git a/lib/plugins/acl/lang/la/lang.php b/lib/plugins/acl/lang/la/lang.php
index dd6043602..941de1f79 100644
--- a/lib/plugins/acl/lang/la/lang.php
+++ b/lib/plugins/acl/lang/la/lang.php
@@ -2,25 +2,26 @@
/**
* Latin language file
*
+ * @author Massimiliano Vassalli <vassalli.max@gmail.com>
*/
-$lang['admin_acl'] = 'Aditus Administrationis Aditus';
+$lang['admin_acl'] = 'Administratio Indicis Custodiae Aditus';
$lang['acl_group'] = 'Grex';
$lang['acl_user'] = 'Sodalis';
$lang['acl_perms'] = 'Facultas:';
$lang['page'] = 'Pagina';
-$lang['namespace'] = 'Spatium nominis';
+$lang['namespace'] = 'Genus';
$lang['btn_select'] = 'eligere';
$lang['p_user_id'] = 'Sodalis <b class="acluser">%s</b> nunc has facultates paginae "<b class="aclpage">%s</b> habes: <i>%s</i>.';
-$lang['p_user_ns'] = 'Sodalis <b class="acluser">%s</b> nunc has facultates spatio nominis "<b class="aclns">%s</b> habes: <i>%s</i>.';
+$lang['p_user_ns'] = 'Sodalis <b class="acluser">%s</b> nunc has facultates generis "<b class="aclns">%s</b> habes: <i>%s</i>.';
$lang['p_group_id'] = 'Socius\a gregis <b class="aclgroup">%s</b> nunc has facultates paginae "<b class="aclpage">%s</b> habes: <i>%s</i>.';
-$lang['p_group_ns'] = 'Socius\a gregis <b class="aclgroup">%s</b> nunc has facultates paginae "<b class="aclns">%s</b> habes: <i>%s</i>.';
+$lang['p_group_ns'] = 'Socius\a gregis <b class="aclgroup">%s</b> nunc has facultates generis "<b class="aclns">%s</b> habes: <i>%s</i>.';
$lang['p_choose_id'] = '<b>Sodalis grexue</b> in campo insere ut facultates paginae <b class="aclpage">%s</b> uideas.';
-$lang['p_choose_ns'] = '<b>Sodalis grexue</b> in campo insere ut facultates paginae <b class="aclns">%s</b> uideas.';
-$lang['p_inherited'] = 'Caue: hae facultates et huic rei et aliis gregibus uel spatiis nominis legitimae sunt.';
+$lang['p_choose_ns'] = '<b>Sodalis grexue</b> in campo insere ut facultates generis <b class="aclns">%s</b> uideas.';
+$lang['p_inherited'] = 'Caue: hae facultates et huic rei et aliis gregibus uel generibus legitimae sunt.';
$lang['p_isadmin'] = 'Caue: electi greges semper plenum ius habent, eo quod ut magister\stra elegitur.';
-$lang['p_include'] = 'Maiores facultates minores includunt. Creare, onerare uel delere facultates solum spatis nominis, non paginis potes';
-$lang['current'] = 'Communes AAA leges';
-$lang['where'] = 'Pagina/Spatium nominis';
+$lang['p_include'] = 'Maiores facultates minores includunt. Creandi, onerandi uel delendi facultates solum generibus, non paginis sunt.';
+$lang['current'] = 'Communes ICA leges';
+$lang['where'] = 'Pagina/Genus';
$lang['who'] = 'Sodalis/Grex';
$lang['perm'] = 'Facultates';
$lang['acl_perm0'] = 'Nihil';
diff --git a/lib/plugins/acl/lang/no/lang.php b/lib/plugins/acl/lang/no/lang.php
index cd9e2edfb..71df0b382 100644
--- a/lib/plugins/acl/lang/no/lang.php
+++ b/lib/plugins/acl/lang/no/lang.php
@@ -15,6 +15,7 @@
* @author Lisa Ditlefsen <lisa@vervesearch.com>
* @author Erik Pedersen <erik.pedersen@shaw.ca>
* @author Erik Bjørn Pedersen <erik.pedersen@shaw.ca>
+ * @author Rune Rasmussen syntaxerror.no@gmail.com
*/
$lang['admin_acl'] = 'Administrasjon av lister for adgangskontroll (ACL)';
$lang['acl_group'] = 'Gruppe';
diff --git a/lib/plugins/acl/lang/pt/lang.php b/lib/plugins/acl/lang/pt/lang.php
index 6e094fd74..d90bab624 100644
--- a/lib/plugins/acl/lang/pt/lang.php
+++ b/lib/plugins/acl/lang/pt/lang.php
@@ -8,6 +8,7 @@
* @author Enrico Nicoletto <liverig@gmail.com>
* @author Fil <fil@meteopt.com>
* @author André Neves <drakferion@gmail.com>
+ * @author José Campos zecarlosdecampos@gmail.com
*/
$lang['admin_acl'] = 'Gestão de ACLs';
$lang['acl_group'] = 'Grupo';
diff --git a/lib/plugins/acl/lang/ru/help.txt b/lib/plugins/acl/lang/ru/help.txt
index a3c1b4f64..7807105a8 100644
--- a/lib/plugins/acl/lang/ru/help.txt
+++ b/lib/plugins/acl/lang/ru/help.txt
@@ -1,11 +1,7 @@
-=== Краткая справка: ===
+=== Краткая справка ===
-На этой странице вы можете добавить или удалить права доступа к пространствам имён и страницам вашей вики.
-
-На панели слева отображены доступные пространства имён и страницы.
-
-Форма выше позволяет вам просмотреть и изменить права доступа для выбранного пользователя или группы.
-
-Текущие права доступа отображены в таблице ниже. Вы можете использовать её для быстрого удаления или изменения правил.
-
-Прочтение [[doku>acl|официальной документации по ACL]] может помочь вам в полном понимании работы управления правами доступа в «ДокуВики».
+На этой странице вы можете добавить или удалить права доступа к пространствам имён и страницам своей вики.\\
+На панели слева отображены доступные пространства имён и страницы.\\
+Форма выше позволяет вам просмотреть и изменить права доступа для выбранного пользователя или группы.\\
+Текущие права доступа отображены в таблице ниже. Вы можете использовать её для быстрого удаления или изменения правил.\\
+Прочтение [[doku>acl|официальной документации по ACL]] может помочь вам в полном понимании работы управления правами доступа в «ДокуВики».
diff --git a/lib/plugins/acl/lang/ru/lang.php b/lib/plugins/acl/lang/ru/lang.php
index 0c02dfbb1..6d04dde21 100644
--- a/lib/plugins/acl/lang/ru/lang.php
+++ b/lib/plugins/acl/lang/ru/lang.php
@@ -13,13 +13,15 @@
* @author Vlad Tsybenko <vlad.development@gmail.com>
* @author Aleksey Osadchiy <rfc@nm.ru>
* @author Aleksandr Selivanov <alexgearbox@gmail.com>
+ * @author Ladyko Andrey <fylh@succexy.spb.ru>
+ * @author Eugene <windy.wanderer@gmail.com>
*/
$lang['admin_acl'] = 'Управление списками контроля доступа';
$lang['acl_group'] = 'Группа';
$lang['acl_user'] = 'Пользователь';
$lang['acl_perms'] = 'Права доступа для';
$lang['page'] = 'Страница';
-$lang['namespace'] = 'Пространство имен';
+$lang['namespace'] = 'Пространство имён';
$lang['btn_select'] = 'Выбрать';
$lang['p_user_id'] = 'Сейчас пользователь <b class="acluser">%s</b> имеет следующие права на доступ к странице <b class="aclpage">%s</b>: <i>%s</i>.';
$lang['p_user_ns'] = 'Сейчас пользователь <b class="acluser">%s</b> имеет следующие права на доступ к пространству имён <b class="aclns">%s</b>: <i>%s</i>.';
diff --git a/lib/plugins/acl/lang/sl/help.txt b/lib/plugins/acl/lang/sl/help.txt
new file mode 100644
index 000000000..eada41c29
--- /dev/null
+++ b/lib/plugins/acl/lang/sl/help.txt
@@ -0,0 +1,11 @@
+=== Hitra pomo ===
+
+Na tej strani je mogoe dodajati, odstranjevati in spreminjati dovoljenja za delo z wiki stranmi in imenskimi prostori.
+
+Na veli strani so izpisani vsi imenski prostori in strani.
+
+Na obrazcu zgoraj je mogoe pregledovati in spreminjati dovoljenja za izbranega uporabnika ali skupino.
+
+V preglednici spodaj so prikazana vsa pravila nadzora. Ta je mogoe hitro spreminjati ali brisati.
+
+Ve podrobnosti o delovanju nadzora dostopa sistema DokuWiki je mogoe najti v [[doku>acl|uradni dokumentaciji ACL]].
diff --git a/lib/plugins/acl/lang/sl/lang.php b/lib/plugins/acl/lang/sl/lang.php
index 32141fbce..3fb391570 100644
--- a/lib/plugins/acl/lang/sl/lang.php
+++ b/lib/plugins/acl/lang/sl/lang.php
@@ -4,14 +4,30 @@
*
* @author Dejan Levec <webphp@gmail.com>
* @author Boštjan Seničar <senicar@gmail.com>
+ * @author Gregor Skumavc (grega.skumavc@gmail.com)
+ * @author Matej Urbančič (mateju@svn.gnome.org)
*/
+$lang['admin_acl'] = 'Upravljanje dostopa';
$lang['acl_group'] = 'Skupina';
$lang['acl_user'] = 'Uporabnik';
$lang['acl_perms'] = 'Dovoljenja za';
$lang['page'] = 'Stran';
+$lang['namespace'] = 'Imenski prostor';
$lang['btn_select'] = 'Izberi';
+$lang['p_user_id'] = 'Uporabnik %s ima naslednja dovoljenja za stran %s: %s.';
+$lang['p_user_ns'] = 'Uporabnik %s ima naslednja dovoljenja za imenski prostor %s: %s.';
+$lang['p_group_id'] = 'Uporabniška skupina %s ima naslednja dovoljenja za stran %s: %s.';
+$lang['p_group_ns'] = 'Uporabniška skupina %s ima naslednja dovoljenja za imenski prostor %s: %s.';
+$lang['p_choose_id'] = 'Vnesite ime <b>uporabnika ali skupine</b> v zgornji obrazec za ogled ali urejanje dovoljenj za stran %s.';
+$lang['p_choose_ns'] = 'Vnesite ime <b>uporabnika ali skupine</b> v zgornji obrazec za ogled ali urejanje dovoljenj za imenski prostor %s.';
+$lang['p_inherited'] = 'Opomba: trenutna dovoljenja niso bila posebej določena, temveč so bila prevzeta iz drugih skupin ali višjih imenskih prostorov.';
+$lang['p_isadmin'] = 'Opomba: izbrana skupina ali uporabnik imajo vsa dovoljenja za spreminjanje, saj so določeni kot skrbniki sistema.';
+$lang['p_include'] = 'Višja dovoljenja vključujejo tudi nižja. ';
+$lang['current'] = 'Trenutna pravila dostopa';
+$lang['where'] = 'Stran / Imenski prostor';
$lang['who'] = 'Uporabnik/Skupina';
$lang['perm'] = 'Dovoljenja';
+$lang['acl_perm0'] = 'Nič';
$lang['acl_perm1'] = 'Preberi';
$lang['acl_perm2'] = 'Uredi';
$lang['acl_perm4'] = 'Ustvari';
diff --git a/lib/plugins/acl/lang/sv/lang.php b/lib/plugins/acl/lang/sv/lang.php
index b5fd3b866..7f963d5e1 100644
--- a/lib/plugins/acl/lang/sv/lang.php
+++ b/lib/plugins/acl/lang/sv/lang.php
@@ -15,6 +15,7 @@
* @author Bogge Bogge <bogge@bogge.com>
* @author Peter Åström <eaustreum@gmail.com>
* @author Håkan Sandell <hakan.sandell@home.se>
+ * @author mikael@mallander.net
*/
$lang['admin_acl'] = 'Hantera behörighetslistan (ACL)';
$lang['acl_group'] = 'Grupp';
diff --git a/lib/plugins/acl/lang/zh-tw/help.txt b/lib/plugins/acl/lang/zh-tw/help.txt
index 871c1f4f1..bc1bddb00 100644
--- a/lib/plugins/acl/lang/zh-tw/help.txt
+++ b/lib/plugins/acl/lang/zh-tw/help.txt
@@ -1,11 +1,12 @@
=== 快速指南: ===
-在此頁面你可以為你的wiki中的namespace以及頁面增加或移除權限
+你可以用這個頁面為維基中的命名空間或頁面增加或移除權限。
-左方的面板顯示了所有的namespace以及頁面
+左方面板顯示了所有命名空間和頁面。
-上方的表格允許你觀看以及修改被選擇的使用者或群組的權限
+上方表格允許你觀看及修改選取的使用者或群組的權限。
-下方的表格顯示了目前所有的存取控制規則(ACL) 你可以使用它快速的刪除或更改多項規則
+下方表格顯示了目前所有的存取控制表 (ACL),你可以用它快速刪除或更改多項規則。
+
+閱讀 [[doku>acl|official documentation on ACL]] 可以幫助你完整地了解 DokuWiki 存取控制的運作。
-閱讀 [[doku>acl|official documentation on ACL]] 也許可以幫助你去完整地了解在DokuWiki中, 存取控制是如何運作的.
diff --git a/lib/plugins/acl/lang/zh-tw/lang.php b/lib/plugins/acl/lang/zh-tw/lang.php
index d64e85a92..085537864 100644
--- a/lib/plugins/acl/lang/zh-tw/lang.php
+++ b/lib/plugins/acl/lang/zh-tw/lang.php
@@ -9,32 +9,34 @@
* @author Wayne San <waynesan@zerozone.tw>
* @author Li-Jiun Huang <ljhuang.tw@gmai.com>
* @author Cheng-Wei Chien <e.cwchien@gmail.com>
+ * @author Danny Lin <danny0838@pchome.com.tw>
+ * @author Shuo-Ting Jian <shoting@gmail.com>
*/
-$lang['admin_acl'] = '設定 ACL 存取名單';
+$lang['admin_acl'] = '管理存取控制表 (ACL)';
$lang['acl_group'] = '群組';
-$lang['acl_user'] = '帳號';
+$lang['acl_user'] = '使用者';
$lang['acl_perms'] = '設定權限於';
$lang['page'] = '頁面';
$lang['namespace'] = '命名空間';
$lang['btn_select'] = '選擇';
-$lang['p_user_id'] = '使用者 <b class="acluser">%s</b> 在頁面 <b class="aclpage">%s</b>目前擁有以下的權限: <i>%s</i>.';
-$lang['p_user_ns'] = '用戶 <b class=\"acluser\">%s</b> 當前在命名空間 <b class=\"aclns\">%s</b> 擁有以下權限:<i>%s</i>。';
-$lang['p_group_id'] = '群組 <b class="aclgroup">%s</b> 的成員目前對於頁面 <b class="aclpage">%s</b> 擁有以下的權限: <i>%s</i>.';
-$lang['p_group_ns'] = '<b class=\"aclgroup\">%s</b> 組成員當前在命名空間 <b class=\"aclns\">%s</b> 擁有以下權限:<i>%s</i>。';
-$lang['p_choose_id'] = '請在上方的表格中 <b>輸入一個帳號或群組</b> 來觀看或編輯頁面 <b class="aclpage">%s</b> 的權限.';
-$lang['p_choose_ns'] = '請在上表中<b>輸入用戶名或組名稱</b>,來查看或編輯命名空間 <b class=\"aclns\">%s</b> 的權限設置。';
-$lang['p_inherited'] = '請注意:這些權限並沒有明確設定,而是從其他組或更高級的名稱空間繼承而來。';
-$lang['p_isadmin'] = '請注意:選定的組或用戶擁有完全權限,因為它被設定為超級用戶。';
-$lang['p_include'] = '較高的權限亦包含了較低的權限。新增、上傳與刪除權限只能在命名空間中使用,而非頁面。';
-$lang['current'] = '目前的ACL規則';
+$lang['p_user_id'] = '使用者 <b class="acluser">%s</b> 目前在頁面 <b class="aclpage">%s</b> 擁有以下權限:<i>%s</i>。';
+$lang['p_user_ns'] = '使用者 <b class=\"acluser\">%s</b> 目前在命名空間 <b class=\"aclns\">%s</b> 擁有以下權限:<i>%s</i>。';
+$lang['p_group_id'] = '群組 <b class="aclgroup">%s</b> 的成員目前在頁面 <b class="aclpage">%s</b> 擁有以下權限:<i>%s</i>。';
+$lang['p_group_ns'] = '群組 <b class=\"aclgroup\">%s</b> 的成員目前在命名空間 <b class=\"aclns\">%s</b> 擁有以下權限:<i>%s</i>。';
+$lang['p_choose_id'] = '請在上方表格<b>輸入使用者或群組</b>以檢視或編輯頁面 <b class="aclpage">%s</b> 的權限設定。';
+$lang['p_choose_ns'] = '請在上方表格<b>輸入使用者或群組</b>以檢視或編輯命名空間 <b class=\"aclns\">%s</b> 的權限設定。';
+$lang['p_inherited'] = '注意:這些權限並未明確指定,而是從群組或上層的命名空間繼承而來。';
+$lang['p_isadmin'] = '注意:選取的群組或使用者擁有完整權限,因為它被設定為超級使用者。';
+$lang['p_include'] = '較高的權限亦包含了較低的權限。新增、上傳與刪除權限只能設定在命名空間,不能設定在頁面。';
+$lang['current'] = '目前的存取控制規則';
$lang['where'] = '頁面/命名空間';
$lang['who'] = '使用者/群組';
$lang['perm'] = '權限';
$lang['acl_perm0'] = '無';
-$lang['acl_perm1'] = '讀取權限';
+$lang['acl_perm1'] = '讀取頁面';
$lang['acl_perm2'] = '編輯頁面';
$lang['acl_perm4'] = '新增頁面';
$lang['acl_perm8'] = '上傳圖檔';
$lang['acl_perm16'] = '刪除檔案';
-$lang['acl_new'] = '新增管理規則';
+$lang['acl_new'] = '增加規則';
$lang['acl_mod'] = '修改規則';
diff --git a/lib/plugins/acl/lang/zh/lang.php b/lib/plugins/acl/lang/zh/lang.php
index d79a78089..581d08539 100644
--- a/lib/plugins/acl/lang/zh/lang.php
+++ b/lib/plugins/acl/lang/zh/lang.php
@@ -11,6 +11,8 @@
* @author ben <ben@livetom.com>
* @author lainme <lainme993@gmail.com>
* @author caii <zhoucaiqi@gmail.com>
+ * @author Hiphen Lee <jacob.b.leung@gmail.com>
+ * @author caii, patent agent in China <zhoucaiqi@gmail.com>
*/
$lang['admin_acl'] = '访问控制列表(ACL)管理器';
$lang['acl_group'] = '组';
diff --git a/lib/plugins/acl/pix/group.png b/lib/plugins/acl/pix/group.png
index 7fb4e1f1e..d80eb2606 100644
--- a/lib/plugins/acl/pix/group.png
+++ b/lib/plugins/acl/pix/group.png
Binary files differ
diff --git a/lib/plugins/acl/pix/ns.png b/lib/plugins/acl/pix/ns.png
index da3c2a2d7..c35e832da 100644
--- a/lib/plugins/acl/pix/ns.png
+++ b/lib/plugins/acl/pix/ns.png
Binary files differ
diff --git a/lib/plugins/acl/pix/page.png b/lib/plugins/acl/pix/page.png
index 03ddd799f..b1b7ebe94 100644
--- a/lib/plugins/acl/pix/page.png
+++ b/lib/plugins/acl/pix/page.png
Binary files differ
diff --git a/lib/plugins/acl/pix/user.png b/lib/plugins/acl/pix/user.png
index 8fd539e9c..7b4a507a0 100644
--- a/lib/plugins/acl/pix/user.png
+++ b/lib/plugins/acl/pix/user.png
Binary files differ
diff --git a/lib/plugins/acl/script.js b/lib/plugins/acl/script.js
index d5d0371a9..5b6c9ce1b 100644
--- a/lib/plugins/acl/script.js
+++ b/lib/plugins/acl/script.js
@@ -1,59 +1,53 @@
+/**
+ * ACL Manager AJAX enhancements
+ *
+ * @author Andreas Gohr <andi@splitbrain.org>
+ */
acl = {
+ /**
+ * Initialize the object and attach the event handlers
+ */
init: function(){
- this.ctl = $('acl_manager');
- if(!this.ctl) return;
-
- var sel = $('acl__user').getElementsByTagName('select')[0];
+ if(!jQuery('#acl_manager').length) return; //FIXME only one underscore!!
- addEvent(sel,'change',acl.userselhandler);
- addEvent($('acl__tree'),'click',acl.treehandler);
- addEvent($('acl__user').getElementsByTagName('input')[1],'click',acl.loadinfo);
+ jQuery('#acl__user select').change(acl.userselhandler);
+ jQuery('#acl__tree').click(acl.treehandler);
+ jQuery('#acl__user input[type=submit]').click(acl.loadinfo);
},
-
/**
* Handle user dropdown
+ *
+ * Hides or shows the user/group entry box depending on what was selected in the
+ * dropdown element
*/
userselhandler: function(e){
// make entry field visible/invisible
if(this.value == '__g__' || this.value == '__u__'){
- $('acl__user').getElementsByTagName('input')[0].style.display = ''; //acl_w
- $('acl__user').getElementsByTagName('input')[1].style.display = ''; //submit
+ jQuery('#acl__user input').show();
}else{
- $('acl__user').getElementsByTagName('input')[0].style.display = 'none';
- $('acl__user').getElementsByTagName('input')[1].style.display = 'none';
+ jQuery('#acl__user input').hide();
}
-
acl.loadinfo();
},
/**
* Load the current permission info and edit form
- *
- * @param frm - Form element with needed data
*/
loadinfo: function(){
- // get form
- var frm = $('acl__detail').getElementsByTagName('form')[0];
-
- // prepare an AJAX call
- var ajax = new sack(DOKU_BASE + 'lib/plugins/acl/ajax.php');
- ajax.AjaxFailedAlert = '';
- ajax.encodeURIString = false;
- if(ajax.failed) return true;
-
- // prepare data
- var data = Array();
- data[0] = ajax.encVar('ns',frm.elements['ns'].value);
- data[1] = ajax.encVar('id',frm.elements['id'].value);
- data[2] = ajax.encVar('acl_t',frm.elements['acl_t'].value);
- data[3] = ajax.encVar('acl_w',frm.elements['acl_w'].value);
- data[4] = ajax.encVar('sectok',frm.elements['sectok'].value);
- data[5] = ajax.encVar('ajax','info');
-
- ajax.elementObj = $('acl__info');
-
- ajax.runAJAX(data.join('&'));
+ var frm = jQuery('#acl__detail form')[0];
+
+ jQuery('#acl__info').load(
+ DOKU_BASE + 'lib/plugins/acl/ajax.php',
+ {
+ 'ns': frm.elements['ns'].value,
+ 'id': frm.elements['id'].value,
+ 'acl_t': frm.elements['acl_t'].value,
+ 'acl_w': frm.elements['acl_w'].value,
+ 'sectok': frm.elements['sectok'].value,
+ 'ajax': 'info',
+ }
+ );
return false;
},
@@ -74,55 +68,40 @@ acl = {
},
/**
- * htmlspecialchars equivalent
- *
- * @todo put in gloabl scripts lib?
- */
- hsc: function(str) {
- str = str.replace(/&/g,"&amp;");
- str = str.replace(/\"/g,"&quot;");
- str = str.replace(/\'/g,"&#039;");
- str = str.replace(/</g,"&lt;");
- str = str.replace(/>/g,"&gt;");
- return str;
- },
-
-
- /**
* Open or close a subtree using AJAX
*
* @author Andreas Gohr <andi@splitbrain.org>
+ * @param DOMElement clicky - the plus/minus icon in front of a namespace
*/
treetoggle: function(clicky){
- var listitem = clicky.parentNode.parentNode;
+ var listitem = jQuery(clicky).parent().parent();
// if already open, close by removing the sublist
- var sublists = listitem.getElementsByTagName('ul');
+ var sublists = listitem.find('ul');
if(sublists.length){
- listitem.removeChild(sublists[0]);
+ listitem.remove('ul');
clicky.src = DOKU_BASE+'lib/images/plus.gif';
clicky.alt = '+';
return false;
}
- // get the enclosed link (is always the first one)
- var link = listitem.getElementsByTagName('a')[0];
+ // prepare new ul to load into it via ajax
+ var ul = document.createElement('ul');
+ listitem[0].appendChild(ul);
- // prepare an AJAX call to fetch the subtree
- var ajax = new sack(DOKU_BASE + 'lib/plugins/acl/ajax.php');
- ajax.AjaxFailedAlert = '';
- ajax.encodeURIString = false;
- if(ajax.failed) return true;
+ // get the enclosed link and the edit form
+ var link = listitem.find('a')[0];
+ var frm = jQuery('#acl__detail form')[0];
+
+ // prepare ajax data
+ var data = acl.parseatt(link.search);
+ data['ajax'] = 'tree';
+ data['current_ns'] = frm.elements['ns'].value;
+ data['current_id'] = frm.elements['id'].value;
+
+ // run ajax
+ jQuery(ul).load(DOKU_BASE + 'lib/plugins/acl/ajax.php', data);
- //prepare the new ul
- var ul = document.createElement('ul');
- listitem.appendChild(ul);
- ajax.elementObj = ul;
- ajax.setVar('ajax', 'tree');
- var frm = $('acl__detail').getElementsByTagName('form')[0];
- ajax.setVar('current_ns', encodeURIComponent(frm.elements['ns'].value));
- ajax.setVar('current_id', encodeURIComponent(frm.elements['id'].value));
- ajax.runAJAX(link.search.substr(1));
clicky.src = DOKU_BASE+'lib/images/minus.gif';
return false;
},
@@ -130,30 +109,30 @@ acl = {
/**
* Handles all clicks in the tree, dispatching the right action based on the
* clicked element
+ *
+ * @param Event e The event object that caused the execution
*/
treehandler: function(e){
if(e.target.src){ // is it an image?
acl.treetoggle(e.target);
} else if(e.target.href){ // is it a link?
// remove highlighting
- var obj = getElementsByClass('cur',$('acl__tree'),'a');
- for(var i=0; i<obj.length; i++){
- obj[i].className = obj[i].className.replace(/ cur/,'');
- }
+ jQuery('#acl__tree a.cur').removeClass('cur');
+
+ var link = jQuery(e.target);
// add new highlighting
- e.target.className += ' cur';
+ link.addClass('cur');
// set new page to detail form
- var frm = $('acl__detail').getElementsByTagName('form')[0];
- if(e.target.className.search(/wikilink1/) > -1){
- frm.elements['ns'].value = '';
- frm.elements['id'].value = acl.hsc(acl.parseatt(e.target.search)['id']);
- }else if(e.target.className.search(/idx_dir/) > -1){
- frm.elements['ns'].value = acl.hsc(acl.parseatt(e.target.search)['ns']);
- frm.elements['id'].value = '';
+ var frm = jQuery('#acl__detail form')[0];
+ if(link.hasClass('wikilink1')){
+ jQuery('#acl__detail form input[name=ns]').val('');
+ jQuery('#acl__detail form input[name=id]').val(acl.parseatt(link[0].search)['id']);
+ }else if(link.hasClass('idx_dir')){
+ jQuery('#acl__detail form input[name=ns]').val(acl.parseatt(link[0].search)['ns']);
+ jQuery('#acl__detail form input[name=id]').val('');
}
-
acl.loadinfo();
}
@@ -164,4 +143,4 @@ acl = {
};
-addInitEvent(acl.init);
+jQuery(acl.init);
diff --git a/lib/plugins/config/admin.php b/lib/plugins/config/admin.php
index d245d3fce..e24f3b87b 100644
--- a/lib/plugins/config/admin.php
+++ b/lib/plugins/config/admin.php
@@ -113,7 +113,7 @@ class admin_plugin_config extends DokuWiki_Admin_Plugin {
// rewrite config is broken. Add $ID as hidden field to remember
// current ID in most cases.
ptln('<form action="'.script().'" method="post">');
- ptln('<input type="hidden" name="id" value="'.$ID.'" />');
+ ptln('<div class="no"><input type="hidden" name="id" value="'.$ID.'" /></div>');
formSecurityToken();
$this->_print_h1('dokuwiki_settings', $this->getLang('_header_dokuwiki'));
diff --git a/lib/plugins/config/images/danger.png b/lib/plugins/config/images/danger.png
index c37bd062e..7bd84f7a3 100644
--- a/lib/plugins/config/images/danger.png
+++ b/lib/plugins/config/images/danger.png
Binary files differ
diff --git a/lib/plugins/config/images/security.png b/lib/plugins/config/images/security.png
index 2ebc4f6f9..1800f8e56 100644
--- a/lib/plugins/config/images/security.png
+++ b/lib/plugins/config/images/security.png
Binary files differ
diff --git a/lib/plugins/config/images/warning.png b/lib/plugins/config/images/warning.png
index 628cf2dae..c5e482f84 100644
--- a/lib/plugins/config/images/warning.png
+++ b/lib/plugins/config/images/warning.png
Binary files differ
diff --git a/lib/plugins/config/lang/ar/intro.txt b/lib/plugins/config/lang/ar/intro.txt
index 3e09db401..d447ec315 100644
--- a/lib/plugins/config/lang/ar/intro.txt
+++ b/lib/plugins/config/lang/ar/intro.txt
@@ -1,6 +1,6 @@
====== مدير الضبط ======
-استخدم هذه الصفحة للتحكم باعدادات دوكي ويكي المثبتة عندك. للمساعدة في أمر ما أشر إلى [[doku>config]]. لمعلومات اكثر عن هذه الاضافة انظر [[doku>plugin:config]].
+استخدم هذه الصفحة للتحكم باعدادات دوكو ويكي المثبتة عندك. للمساعدة في أمر ما أشر إلى [[doku>config]]. لمعلومات اكثر عن هذه الاضافة انظر [[doku>plugin:config]].
الاعدادات الظاهرة بخلفية حمراء فاتحة اعدادات محمية ولا يمكن تغييرها بهذه الاضافة. الاعدادات الظاهرة بخلفية زرقاء هي القيم الافتراضية والاعدادات الظاهرة بخلفية بيضاء خصصت لهذا التثبيت محليا. الاعدادات الزرقاء والبيضاء يمكن تغييرها.
diff --git a/lib/plugins/config/lang/ar/lang.php b/lib/plugins/config/lang/ar/lang.php
index 5d0ff76b9..63d258485 100644
--- a/lib/plugins/config/lang/ar/lang.php
+++ b/lib/plugins/config/lang/ar/lang.php
@@ -4,6 +4,7 @@
*
* @author Yaman Hokan <always.smile.yh@hotmail.com>
* @author Usama Akkad <uahello@gmail.com>
+ * @author uahello@gmail.com
*/
$lang['menu'] = 'الإعدادات';
$lang['error'] = 'لم تحدث الاعدادات بسبب قيمة غير صالحة، رجاء راجع تغييراتك ثم ارسلها.
@@ -16,7 +17,7 @@ $lang['danger'] = 'خطر: تغيير هذا الخيار قد ي
$lang['warning'] = 'تحذير: تغييرهذا الخيار قد يؤدي لسلوك غير متوقع.';
$lang['security'] = 'تحذير أمني: تغيير هذا الخيار قد يؤدي إلى مخاطرة أمنية.';
$lang['_configuration_manager'] = 'مدير الاعدادات';
-$lang['_header_dokuwiki'] = 'اعدادات دوكي ويكي';
+$lang['_header_dokuwiki'] = 'اعدادات دوكو ويكي';
$lang['_header_plugin'] = 'اعدادات الملحقات';
$lang['_header_template'] = 'اعدادات القوالب';
$lang['_header_undefined'] = 'اعدادات غير محددة';
@@ -32,6 +33,7 @@ $lang['_network'] = 'اعدادات الشبكة';
$lang['_plugin_sufix'] = 'اعدادات الملحقات';
$lang['_template_sufix'] = 'اعدادات القوالب';
$lang['_msg_setting_undefined'] = 'لا بيانات إعدادات.';
+$lang['_msg_setting_no_class'] = 'لا صنف إعدادات.';
$lang['_msg_setting_no_default'] = 'لا قيمة افتراضية.';
$lang['fmode'] = 'نمط انشاء الملفات';
$lang['dmode'] = 'نمط انشاء المجلدات';
@@ -45,6 +47,8 @@ $lang['template'] = 'القالب';
$lang['license'] = 'تحت أي رخصة تريد اصدار المحتوى؟';
$lang['fullpath'] = 'اظهر المحتوى الكامل للصفحات في ';
$lang['recent'] = 'أحدث التغييرات';
+$lang['breadcrumbs'] = 'عدد العناقيد للزيارات';
+$lang['youarehere'] = 'عناقيد هرمية';
$lang['typography'] = 'اعمل استبدالات طبوغرافية';
$lang['htmlok'] = 'مكّن تضمين HTML';
$lang['phpok'] = 'مكّن تضمين PHP';
@@ -74,16 +78,17 @@ $lang['defaultgroup'] = 'المجموعة الافتراضية';
$lang['superuser'] = 'مجموعة المستخدم المتفوق أو مستخدم أو قائمة مفصولة بالفاصلة مستخدم1،@مجموعة، مستخدم2 صلاحيتهم الوصول الكامل لكل الصفحات و الوظائف بغض النظر عن اعدادات ACL';
$lang['manager'] = 'مجموعة المدراء أو مستخدم أو قائمة مفصولة بالفاصلة مستخدم1،@مجموعة، مستخدم2 صلاحيتهم بعض الوظائف الادارية';
$lang['profileconfirm'] = 'اكد تغيير اللاحة بكلمة المرور';
-$lang['disableactions'] = 'عطّل اجراءات دوكي ويكي';
+$lang['disableactions'] = 'عطّل اجراءات دوكو ويكي';
$lang['disableactions_check'] = 'تحقق';
$lang['disableactions_subscription'] = 'اشترك/الغ الاشتراك';
$lang['disableactions_wikicode'] = 'اعرض المصدر/صدّر صرفا';
$lang['disableactions_other'] = 'اجراءات أخرى (مفصولة بالفاصلة)';
-$lang['sneaky_index'] = 'افتراضيا، ستعرض دوكي ويكي كل اسماء النطاقات في عرض الفهرس. تفعيل هذا الخيار سيخفي مالا يملك المستخدم صلاحية قراءته. قد يؤدي هذا إلى اخفاء نطاقات فرعية متاحة. وقد يؤدي لجعل صفحة الفهرس معطلة في بعض اعدادات ACL.';
+$lang['sneaky_index'] = 'افتراضيا، ستعرض دوكو ويكي كل اسماء النطاقات في عرض الفهرس. تفعيل هذا الخيار سيخفي مالا يملك المستخدم صلاحية قراءته. قد يؤدي هذا إلى اخفاء نطاقات فرعية متاحة. وقد يؤدي لجعل صفحة الفهرس معطلة في بعض اعدادات ACL.';
$lang['auth_security_timeout'] = 'زمن انتهاء أمان المواثقة (ثوان)';
$lang['securecookie'] = 'هل يفرض على كعكات التصفح المعدة عبر HTTPS ان ترسل فقط عبر HTTPS من قبل المتصفح؟ عطل هذا إن كان الولوج للويكي مؤمنا فقط عبر SSL لكن تصفح الويكي غير مؤمن.';
$lang['xmlrpc'] = 'مكّن/عطل واجهة XML-RPC.';
-$lang['updatecheck'] = 'تحقق من التحديثات و تنبيهات الأمان؟ دوكو ويكي ستحتاج للاتصال ب splitbrain.org لأجل ذلك';
+$lang['xmlrpcuser'] = 'احصر الوصول لـ XML-RPC بمستخدمين أو مجموعات مفصولة بالفاصلة هنا. اتركها فارغة لتمكين الوصول للجميع.';
+$lang['updatecheck'] = 'تحقق من التحديثات و تنبيهات الأمان؟ دوكو ويكي ستحتاج للاتصال ب update.dokuwiki.org لأجل ذلك';
$lang['userewrite'] = 'استعمل عناوين URLs جميلة';
$lang['useslash'] = 'استخدم الشرطة كفاصل النطاق في العناوين';
$lang['usedraft'] = 'احفظ المسودة تلقائيا أثناء التحرير';
@@ -98,6 +103,7 @@ $lang['fetchsize'] = 'الحجم الأعظمي (بايت) ل fetch.
$lang['notify'] = 'ارسل تنبيهات التغيير لهذا البريد';
$lang['registernotify'] = 'ارسل بيانات عن المستخدمين المسجلين جديدا لهذا البريد';
$lang['mailfrom'] = 'البريد الالكتروني ليستخدم للرسائل الآلية';
+$lang['mailprefix'] = 'بادئة موضوع البريد لتستخدم مع الرسائل الآلية';
$lang['gzip_output'] = 'استخدم ترميز-محتوى gzip ل xhtml';
$lang['gdlib'] = 'اصدار مكتبة GD';
$lang['im_convert'] = 'المسار إلى اداة تحويل ImageMagick';
@@ -108,6 +114,9 @@ $lang['compress'] = 'رُص مخرجات CSS و جافا سكربت
$lang['hidepages'] = 'أخف الصفحات المنطبق عليها (تعابير شرطية)';
$lang['send404'] = 'ارسل "HTTP 404/Page Not Found" للصفحات غير الموجودة';
$lang['sitemap'] = 'ولد خرائط موقع جوجل (أيام)';
+$lang['xsendfile'] = 'استخدم ترويسة X-Sendfile لتمكين خادم الوب من تقديم ملفات ثابتة؟ يجب أن يكون خادم الوب داعما له.';
+$lang['renderer__core'] = '%s (نواة دوكو ويكي)';
+$lang['renderer__plugin'] = '%s (ملحق)';
$lang['rememberme'] = 'اسمح بكعكات الدخول الدائم (تذكرني)';
$lang['rss_type'] = 'نوع تلقيمات XML';
$lang['rss_linkto'] = 'تلقيمات XML توصل إلى';
@@ -116,6 +125,7 @@ $lang['rss_update'] = 'تحديث تلقيم XML (ثوان)';
$lang['recent_days'] = 'مدة إبقاء أحدث التغييرات (ايام)';
$lang['rss_show_summary'] = 'تلقيم XML يظهر ملخصا في العنوان';
$lang['target____wiki'] = 'النافذة الهدف للروابط الداخلية';
+$lang['target____interwiki'] = 'النافذة الهدف للروابط الممرة interwiki';
$lang['target____extern'] = 'النافذة الهدف للروابط الخارجية';
$lang['target____media'] = 'النافذة الهدف لروابط الوسائط';
$lang['target____windows'] = 'النافذة الهدف لروابط النوافذ';
@@ -124,6 +134,7 @@ $lang['proxy____port'] = 'منفذ الوكيل';
$lang['proxy____user'] = 'اسم مستخدم الوكيل';
$lang['proxy____pass'] = 'كلمة سر الوكيل';
$lang['proxy____ssl'] = 'استخدم ssl للاتصال بالوكيل';
+$lang['proxy____except'] = 'تعبير شرطي لمقابلة العناوين التي ستتجاوز البروكسي.';
$lang['safemodehack'] = 'مكّن hack الوضع الآمن';
$lang['ftp____host'] = 'خادوم FTP ل hack الوضع الآمن';
$lang['ftp____port'] = 'منفذ FTP ل hack الوضع الآمن';
@@ -136,7 +147,10 @@ $lang['typography_o_1'] = 'استبعاد الاقتباس المفرد';
$lang['typography_o_2'] = 'تضمين علامات اقتباس مفردة (قد لا يعمل دائما)';
$lang['userewrite_o_0'] = 'لاشيء';
$lang['userewrite_o_1'] = '.htaccess';
+$lang['userewrite_o_2'] = 'دو';
$lang['deaccent_o_0'] = 'معطل';
+$lang['deaccent_o_1'] = 'أزل اللهجة';
+$lang['deaccent_o_2'] = 'اجعلها لاتينية';
$lang['gdlib_o_0'] = 'مكتبة GD غير متوفرة';
$lang['gdlib_o_1'] = 'الاصدار 1.x';
$lang['gdlib_o_2'] = 'اكتشاف تلقائي';
@@ -145,6 +159,7 @@ $lang['rss_type_o_rss1'] = 'RSS 1.0';
$lang['rss_type_o_rss2'] = 'RSS 2.0';
$lang['rss_type_o_atom'] = 'أتوم 0.3';
$lang['rss_type_o_atom1'] = 'أتوم 1.0';
+$lang['rss_content_o_abstract'] = 'خلاصة';
$lang['rss_content_o_diff'] = 'الفروق الموحدة';
$lang['rss_content_o_htmldiff'] = 'جدول الفروق بهيئة HTML';
$lang['rss_content_o_html'] = 'محتوى HTML الكامل للصفحة';
@@ -156,11 +171,15 @@ $lang['compression_o_0'] = 'لا شيء';
$lang['compression_o_gz'] = 'gzip';
$lang['compression_o_bz2'] = 'bz2';
$lang['xsendfile_o_0'] = 'لا تستخدم';
+$lang['xsendfile_o_1'] = 'ترويسة lighttpd مملوكة (قبل الاصدار 1.5)';
+$lang['xsendfile_o_2'] = 'ترويسة X-Sendfile قياسية';
+$lang['xsendfile_o_3'] = 'ترويسة Nginx X-Accel-Redirect مملوكة';
$lang['showuseras_o_loginname'] = 'اسم الدخول';
$lang['showuseras_o_username'] = 'اسم المستخدم الكامل';
$lang['showuseras_o_email'] = 'عنوان بريد المستخدم (مبهم تبعا لاعدادات حارس_البريد)';
$lang['showuseras_o_email_link'] = 'عنوان بريد المستخدم كـ مالتيو: رابط';
$lang['useheading_o_0'] = 'أبدا';
-$lang['useheading_o_navigation'] = 'ال';
+$lang['useheading_o_navigation'] = 'التنقل فقط';
$lang['useheading_o_content'] = 'محتوى الويكي فقط';
$lang['useheading_o_1'] = 'دائما';
+$lang['readdircache'] = 'المدة القصوى لتخزين ';
diff --git a/lib/plugins/config/lang/bg/intro.txt b/lib/plugins/config/lang/bg/intro.txt
index 8723a77a4..db09e6838 100644
--- a/lib/plugins/config/lang/bg/intro.txt
+++ b/lib/plugins/config/lang/bg/intro.txt
@@ -1,7 +1,7 @@
-====== Управление на настройките ======
+====== Диспечер на настройките ======
-Използвайте тази страница за да управлявате настройките на вашета Dokuwiki инсталация. За отделните настройки вижте [[doku>config]]. За повече подробности за тази приставка вижте [[doku>plugin:config]].
+От тук можете да управлявате настройките на вашето Dokuwiki. За отделните настройки вижте [[doku>config]]. За повече информация относно тази приставка вижте [[doku>plugin:config]].
-Настройките показани със светло червен фон за защитени и не могат да се променят с тази приставка. Настройките показани със син фон са стандартните стойности и настройките с бял фон са били настроени локално за тази конкретна инсталация. Както сините, така и белите настройки могат да се променят.
+Настройките изобразени със светло червен фон са защитени и не могат да бъдат променяни с тази приставка. Настройките показани със син фон са стандартните стойности, а настройките с бял фон са били настроени локално за тази конкретна инсталация. Можете да променяте както сините, така и белите настройки.
-Не забравяйте да натиснете бутона **ЗАПИС** преди да напуснете страницата, иначе промените ви ще бъдат загубени.
+Не забравяйте да натиснете бутона **ЗАПИС** преди да напуснете страницата, в противен случай промените няма да бъдат приложени.
diff --git a/lib/plugins/config/lang/bg/lang.php b/lib/plugins/config/lang/bg/lang.php
index 855f0b2c2..2489b0d25 100644
--- a/lib/plugins/config/lang/bg/lang.php
+++ b/lib/plugins/config/lang/bg/lang.php
@@ -5,150 +5,155 @@
* @license GPL 2 (http://www.gnu.org/licenses/gpl.html)
* @author Nikolay Vladimirov <nikolay@vladimiroff.com>
* @author Viktor Usunov <usun0v@mail.bg>
+ * @author Kiril <neohidra@gmail.com>
*/
$lang['menu'] = 'Настройки';
-$lang['error'] = 'Невъзможно е обновяването на настройките, поради невалидна стойност, моля, прегледайте промените си и пробвайте отново.
- <br />Неверните стойности ще бъдат обградени с червена рамка.';
-$lang['updated'] = 'Обновяването на настройките бе успешно.';
+$lang['error'] = 'Обновяването на настройките не е възможно, поради невалидна стойност, моля, прегледайте промените си и пробвайте отново.
+<br />Неверните стойности ще бъдат обградени с червена рамка.';
+$lang['updated'] = 'Обновяването на настройките е успешно.';
$lang['nochoice'] = '(няма друг възможен избор)';
-$lang['locked'] = 'Невъзможно е обновяването на файлът с настройките, ако това не е нарочно, проверете,<br /> дали локалните име на файл и права са верни.';
-$lang['danger'] = 'Внимание: промяна на тази опция може да направи уикито и конфигурационното меню недостъпни.';
-$lang['warning'] = 'Предупреждение: промяна на тази опция може предизвика нежелани реакции.';
-$lang['security'] = 'Предупреждение: промяната на тази опция може да представлява риск за сигурността.';
-$lang['_configuration_manager'] = 'Управление на настройките';
-$lang['_header_dokuwiki'] = 'DokuWiki настройки';
-$lang['_header_plugin'] = 'Настройки на приставките';
-$lang['_header_template'] = 'Настройки на шаблоните';
+$lang['locked'] = 'Обновяването на файла с настройките не е възможно, ако това не е нарочно, проверете,<br /> дали името на локалния файл с настройки и правата са верни.';
+$lang['danger'] = 'Внимание: промяна на опцията може да направи wiki-то и менюто за настройване недостъпни.';
+$lang['warning'] = 'Предупреждение: промяна на опцията може предизвика нежелани последици.';
+$lang['security'] = 'Предупреждение: промяна на опцията може да представлява риск за сигурността.';
+$lang['_configuration_manager'] = 'Диспечер на настройките';
+$lang['_header_dokuwiki'] = 'Настройки на DokuWiki';
+$lang['_header_plugin'] = 'Настройки на приставки';
+$lang['_header_template'] = 'Настройки на шаблони';
$lang['_header_undefined'] = 'Неопределени настройки';
$lang['_basic'] = 'Основни настройки';
-$lang['_display'] = 'Настройки на показването';
-$lang['_authentication'] = 'Настройки на идентификацията';
-$lang['_anti_spam'] = 'Анти-спам настройки';
-$lang['_editing'] = 'Настройки на редактирането';
+$lang['_display'] = 'Настройки за изобразяване';
+$lang['_authentication'] = 'Настройки за удостоверяване';
+$lang['_anti_spam'] = 'Настройки за борба със SPAM-ма';
+$lang['_editing'] = 'Настройки за редактиране';
$lang['_links'] = 'Настройки на препратките';
$lang['_media'] = 'Настройки на медията';
$lang['_advanced'] = 'Допълнителни настройки';
$lang['_network'] = 'Мрежови настройки';
-$lang['_plugin_sufix'] = 'Настройки на приставките';
-$lang['_template_sufix'] = 'Настройки на шаблони';
-$lang['_msg_setting_undefined'] = 'Няма метаданни на настройките.';
+$lang['_plugin_sufix'] = ' - настройки на приставката';
+$lang['_template_sufix'] = ' - настройки на шаблона';
+$lang['_msg_setting_undefined'] = 'Няма метаданни за настройките.';
$lang['_msg_setting_no_class'] = 'Няма клас настройки.';
$lang['_msg_setting_no_default'] = 'Няма стандартна стойност.';
-$lang['fmode'] = 'Режим(права) на създаване на файловете';
-$lang['dmode'] = 'Режим(права) за създаване на директориите';
+$lang['fmode'] = 'Режим (права) за създаване на файлове';
+$lang['dmode'] = 'Режим (права) за създаване на директории';
$lang['lang'] = 'Език';
-$lang['basedir'] = 'Главна директория';
-$lang['baseurl'] = 'Главен адрес (URL)';
+$lang['basedir'] = 'Главна директория (напр. <code>/dokuwiki/</code>). Оставете празно, за да бъде засечена автоматично.';
+$lang['baseurl'] = 'URL адрес (напр. <code>http://www.yourserver.com</code>). Оставете празно, за да бъде засечен автоматично.';
$lang['savedir'] = 'Директория за записване на данните';
$lang['start'] = 'Име на началната страница';
-$lang['title'] = 'Име на Wiki';
+$lang['title'] = 'Име на Wiki-то';
$lang['template'] = 'Шаблон';
$lang['license'] = 'Под какъв лиценз да бъде публикувано съдържанието?';
-$lang['fullpath'] = 'Показване на пълния път до страниците в долния им край.';
-$lang['recent'] = 'Последни промени';
+$lang['fullpath'] = 'Показване на пълния път до страниците в долния колонтитул.';
+$lang['recent'] = 'Скорошни промени';
$lang['breadcrumbs'] = 'Брой на следите';
$lang['youarehere'] = 'Йерархични следи';
-$lang['typography'] = 'Поправяне на разместени букви';
-$lang['htmlok'] = 'Позволяване на вграден HTML код';
-$lang['phpok'] = 'Позволяване на вграден PHP код';
+$lang['typography'] = 'Замяна на последователност от символи с типографски еквивалент';
+$lang['htmlok'] = 'Разрешаване вграждането на HTML код';
+$lang['phpok'] = 'Разрешаване вграждането на PHP код';
$lang['dformat'] = 'Формат на датата (виж. <a href="http://www.php.net/strftime">strftime</a> функцията на PHP)';
$lang['signature'] = 'Подпис';
-$lang['toptoclevel'] = 'Главно ниво за съдържанието';
-$lang['tocminheads'] = 'Минимална сума на заглавията, която определя дали съдържанието е създадено';
-$lang['maxtoclevel'] = 'Максимално ниво на съдържанието';
-$lang['maxseclevel'] = 'Максимално ниво на редактиране на секция';
-$lang['camelcase'] = 'Използване на CamelCase за препратки';
-$lang['deaccent'] = 'Окончателни имена на страници';
-$lang['useheading'] = 'Използване на първото заглавие за име на страница';
-$lang['refcheck'] = 'Проверка за препратка на медия';
-$lang['refshow'] = 'Брой на показани медийни препратки';
-$lang['allowdebug'] = 'Пускане на debug <b>изключете, ако не е нужен!</b>';
-$lang['usewordblock'] = 'Блокиране на спам базирано на списък от думи';
-$lang['indexdelay'] = 'Забавяне преди индексиране(секунди)';
-$lang['relnofollow'] = 'Използване на rel="nofollow" за външни връзки';
-$lang['mailguard'] = 'Промяна на адреса на електронната поща във форма непозволяваща пращането на спам';
-$lang['iexssprotect'] = 'Проверяване на качените файлове за възможно зловреден JavaScript и HTML код';
-$lang['showuseras'] = 'Какво да се показва на дисплея за потребителя, който последно е променил тази страница';
-$lang['useacl'] = 'Използване на списъци за достъп';
-$lang['autopasswd'] = 'Автоматично генериране на пароли';
-$lang['authtype'] = 'Метод на идентификация';
+$lang['toptoclevel'] = 'Главно ниво (заглавие) за съдържанието';
+$lang['tocminheads'] = 'Минимален брой заглавия, определящ дали да бъде създадено съдържание';
+$lang['maxtoclevel'] = 'Максимален брой нива (заглавия) за включване в съдържанието';
+$lang['maxseclevel'] = 'Максимален брой нива предоставяни за самостоятелно редактиране';
+$lang['camelcase'] = 'Ползване на CamelCase за линкове';
+$lang['deaccent'] = 'Почистване имената на страниците (на файловете)';
+$lang['useheading'] = 'Ползване на първото заглавие за име на страница';
+$lang['refcheck'] = 'Проверка за препратка към медия, преди да бъде изтрита';
+$lang['refshow'] = 'Брой на показваните медийни препратки';
+$lang['allowdebug'] = 'Включване на режи debug - <b>изключете, ако не е нужен!</b>';
+$lang['usewordblock'] = 'Блокиране на SPAM въз основа на на списък от думи';
+$lang['indexdelay'] = 'Забавяне преди индексиране (сек)';
+$lang['relnofollow'] = 'Ползване на rel="nofollow" за външни препратки';
+$lang['mailguard'] = 'Промяна на адресите на ел. поща (във форма непозволяваща пращането на SPAM)';
+$lang['iexssprotect'] = 'Проверяване на качените файлове за вероятен зловреден JavaScript и HTML код';
+$lang['showuseras'] = 'Какво да се показва за потребителя, който последно е променил страницата';
+$lang['useacl'] = 'Ползване на списъци за достъп';
+$lang['autopasswd'] = 'Автоматично генериране на пароли, на нови потребители и пращане по пощата';
+$lang['authtype'] = 'Метод за удостоверяване';
$lang['passcrypt'] = 'Метод за криптиране на паролите';
-$lang['defaultgroup'] = 'Група по подразбиране';
-$lang['superuser'] = 'Супер потребител - група или потребител с пълен достъп до всички страници и функции без значение от настройките на списъците за достъп (ACL)';
-$lang['manager'] = 'Управител - група или потребител, с достъп до определени управляващи фунции ';
+$lang['defaultgroup'] = 'Стандартна група';
+$lang['superuser'] = 'Супер потребител - група, потребител или списък със стойности разделени чрез запетая (user1,@group1,user2) с пълен достъп до всички страници и функции без значение от настройките на списъците за достъп (ACL)';
+$lang['manager'] = 'Управител - група, потребител или списък със стойности разделени чрез запетая (user1,@group1,user2) с достъп до определени управленски фунции ';
$lang['profileconfirm'] = 'Потвърждаване на промени в профила с парола';
-$lang['disableactions'] = 'Изключване на DokuWiki функции';
+$lang['disableactions'] = 'Изключване функции на DokuWiki';
$lang['disableactions_check'] = 'Проверка';
-$lang['disableactions_subscription'] = 'Записване/Отписване';
+$lang['disableactions_subscription'] = 'Абониране/Отписване';
$lang['disableactions_wikicode'] = 'Преглед на кода/Експортиране на оригинална версия';
$lang['disableactions_other'] = 'Други действия (разделени със запетая)';
-$lang['sneaky_index'] = 'По подразбиране DokuWiki ще показва всички именни пространства в индекса. Избирането на настройката ще доведе до скриване на тези, за които потребителят няма права за четене. Това може да означава и скриване на достъпните подименни пространства. Това може да направи индекса неизползваем при определени настрокйки на списъците за контрол на достъп (ACL). ';
-$lang['auth_security_timeout'] = 'Изчакване при вписване преди Timeout (в секунди)';
-$lang['securecookie'] = 'Да се изпращат ли бисквитки, посочени чрез HTTPS, само чрез HTTPS от браузъра? Забранете тази опция, когато SSL се използва само за вписване в системата, а четенето е възможно и без SSL.
+$lang['sneaky_index'] = 'Стандартно DokuWiki ще показва всички именни пространства в индекса. Опцията скрива тези, за които потребителят няма права за четене. Това може да доведе и до скриване на иначе достъпни подименни пространства. С определени настройки на списъците за контрол на достъпа (ACL) може да направи индекса неизползваем. ';
+$lang['auth_security_timeout'] = 'Автоматично проверяване на удостоверяването всеки (сек)';
+$lang['securecookie'] = 'Да се изпращат ли бисквитките зададени чрез HTTPS, само чрез HTTPS от браузъра? Изключете опцията, когато SSL се ползва само за вписване, а четенето е без SSL.
';
-$lang['xmlrpc'] = 'Включи/изключи XML-RPC интерфейса';
-$lang['xmlrpcuser'] = 'Ограничаване на XML-RPC достъп до дадени тук и отделени със запетая групи или потребители. Оставете празни да даде достъп до всички.';
-$lang['updatecheck'] = 'Проверка за нови версии и предупреждения за сигурност? Dokiwiki трябва да може да се свърже със splitbrain.org за тази функционалност.';
-$lang['userewrite'] = 'Използване на валидни URL';
-$lang['useslash'] = 'Използване на наклонена черта за разделител на именнипространсвта в URL';
-$lang['usedraft'] = 'Автоматично запазване на чернова при редактиране';
+$lang['xmlrpc'] = 'Включване/Изключване на интерфейса XML-RPC.';
+$lang['xmlrpcuser'] = 'Ограничаване на XML-RPC достъпа до отделени със запетая групи или потребители. Оставете празно, за да даде достъп на всеки.';
+$lang['updatecheck'] = 'Проверяване за за нови версии и предупреждения за сигурността? Необходимо е Dokiwiki да може да се свързва със update.dokuwiki.org за тази функционалност.';
+$lang['userewrite'] = 'Ползване на nice URL адреси';
+$lang['useslash'] = 'Ползване на наклонена черта за разделител на именните пространства в URL';
+$lang['usedraft'] = 'Автоматично запазване на чернова по време на редактиране';
$lang['sepchar'] = 'Разделител между думите в имената на страници';
-$lang['canonical'] = 'Използване на уеднаквени URL';
-$lang['autoplural'] = 'Проверка за множествено число в препратките';
+$lang['canonical'] = 'Ползване на напълно уеднаквени URL адреси (абсолютни адреси - http://server/path)';
+$lang['fnencode'] = 'Метод за кодиране на не-ASCII именуваните файлове.';
+$lang['autoplural'] = 'Проверяване за множествено число в препратките';
$lang['compression'] = 'Метод за компресия на attic файлове';
-$lang['cachetime'] = 'Максимална възраст на кеша (сек)';
-$lang['locktime'] = 'Максимална възраст на заключващите файлове (сек)';
-$lang['fetchsize'] = 'Максимален размер (байтове), който fetch.php може да дърпа';
-$lang['notify'] = 'Пращане на съобщения за промени на тази e-поща';
-$lang['registernotify'] = 'Пращане информация на нови потребители на тази е-поща';
-$lang['mailfrom'] = 'Адрес на е-поща, който да се използва за пращане на автоматичната поща';
-$lang['gzip_output'] = 'Използване gzip Кодиране на съдържанието(Content-Encoding) за xhtml';
+$lang['cachetime'] = 'Макс. период за съхраняване на кеша (сек)';
+$lang['locktime'] = 'Макс. период за съхраняване на заключените файлове (сек)';
+$lang['fetchsize'] = 'Максимален размер (байтове), който fetch.php може да сваля';
+$lang['notify'] = 'Пращане на съобщения за промени по странците на следната eл. поща';
+$lang['registernotify'] = 'Пращане на информация за нови потребители на следната ел. поща';
+$lang['mailfrom'] = 'Ел. поща, която да се ползва за автоматично изпращане на ел. писма';
+$lang['mailprefix'] = 'Представка за темите (поле subject) на автоматично изпращаните ел. писма';
+$lang['gzip_output'] = 'Кодиране на съдържанието с gzip за xhtml';
$lang['gdlib'] = 'Версия на GD Lib';
$lang['im_convert'] = 'Път до инструмента за трансформация на ImageMagick';
$lang['jpg_quality'] = 'Kачество на JPG компресията (0-100)';
-$lang['subscribers'] = 'Поддръжка за абониране към страница';
-$lang['compress'] = 'Компактен CSS и javascript изход';
-$lang['hidepages'] = 'Скриване на съвпадащи имена на страници(regular expressions)';
+$lang['subscribers'] = 'Включване на поддръжката за абониране към страници';
+$lang['subscribe_time'] = 'Време след което абонаментните списъци и обобщения се изпращат (сек); Трябва да е по-малко от времето определено в recent_days.';
+$lang['compress'] = 'Компактен CSS и javascript изглед';
+$lang['hidepages'] = 'Скриване на съвпадащите страници (regular expressions)';
$lang['send404'] = 'Пращане на "HTTP 404/Page Not Found" за несъществуващи страници';
$lang['sitemap'] = 'Генериране на Google sitemap (дни)';
-$lang['broken_iua'] = 'Отметнете, ако ignore_user_abort функцията не работи, търсенето може да не се извършва правилно.Известно е, че комбинацията IIS+PHP/CGI е лоша. Вижте <a href="http://bugs.splitbrain.org/?do=details&amp;task_id=852">Грешка 852</a> за повече информация.';
-$lang['xsendfile'] = 'Използване на Х-Sendfile header, за позволяване на уеб сървъра да дава статични файлове? Вашият уеб сървър трябва да поддържа това.';
-$lang['renderer_xhtml'] = 'Показвай main (XHTML) код за wiki';
-$lang['renderer__core'] = '%s (DokuWiki ядро)';
+$lang['broken_iua'] = 'Отметнете, ако ignore_user_abort функцията не работи. Може да попречи на търсенето в страниците. Знае се, че комбинацията IIS+PHP/CGI е лоша. Вижте <a href="http://bugs.splitbrain.org/?do=details&amp;task_id=852">Грешка 852</a> за повече информация.';
+$lang['xsendfile'] = 'Ползване на Х-Sendfile header, за да може уебсървъра да дава статични файлове? Вашият уебсървър трябва да го поддържа.';
+$lang['renderer_xhtml'] = 'Представяне на основните изходни данни (xhtml) от wiki-то с';
+$lang['renderer__core'] = '%s (ядрото на DokuWiki)';
$lang['renderer__plugin'] = '%s (приставка)';
-$lang['rememberme'] = 'Остави постоянни бисквитки за вход (запомни ме)';
-$lang['rss_type'] = 'Вид на XML източника (feed)';
-$lang['rss_linkto'] = 'XML feed препраща към';
-$lang['rss_content'] = 'Какво да се показва в XML feed елементите?';
-$lang['rss_update'] = 'Интервал на обновяване XML източника (сек)';
-$lang['recent_days'] = 'Колко последни промени да се пазят (дни)';
-$lang['rss_show_summary'] = 'XML feed show summary in title';
+$lang['rememberme'] = 'Ползване на постоянни бисквитки за вписване (за функцията "Запомни ме")';
+$lang['rss_type'] = 'Тип на XML емисията';
+$lang['rss_linkto'] = 'XML емисията препраща към';
+$lang['rss_content'] = 'Какво да показват елементите на XML емисията?';
+$lang['rss_update'] = 'Интервал на актуализиране на XML емисията (сек)';
+$lang['recent_days'] = 'Колко от скорошните промени да се пазят (дни)';
+$lang['rss_show_summary'] = 'Показване на обобщение в заглавието на XML емисията';
$lang['target____wiki'] = 'Прозорец за вътрешни препратки';
-$lang['target____interwiki'] = 'Прозорец за вътрешни уики препратки';
+$lang['target____interwiki'] = 'Прозорец за препратки в wiki-то';
$lang['target____extern'] = 'Прозорец за външни препратки';
-$lang['target____media'] = 'Прозорец за препратки към медия';
-$lang['target____windows'] = 'Прозорец за препратки към прозорци';
+$lang['target____media'] = 'Прозорец за медийни препратки';
+$lang['target____windows'] = 'Прозорец за препратки към Windows';
$lang['proxy____host'] = 'Име на прокси сървър';
-$lang['proxy____port'] = 'Порт на проксито';
+$lang['proxy____port'] = 'Порт за проксито';
$lang['proxy____user'] = 'Потребител за проксито';
$lang['proxy____pass'] = 'Парола за проксито';
-$lang['proxy____ssl'] = 'Използване на ssl за връзка към проксито';
-$lang['safemodehack'] = 'Позволи safemode хак';
-$lang['ftp____host'] = 'FTP сървър за safemode хака';
-$lang['ftp____port'] = 'FTP порт за safemode хака';
-$lang['ftp____user'] = 'FTP потребител за safemode хака';
-$lang['ftp____pass'] = 'FTP парола за safemode хака';
-$lang['ftp____root'] = 'FTP главна директория safemode хака';
+$lang['proxy____ssl'] = 'Ползване на SSL при свързване с проксито';
+$lang['proxy____except'] = 'Регулярен израз определящ за кои URL адреси да не се ползва прокси сървър.';
+$lang['safemodehack'] = 'Ползване на хака safemode';
+$lang['ftp____host'] = 'FTP сървър за хака safemode';
+$lang['ftp____port'] = 'FTP порт за хака safemode';
+$lang['ftp____user'] = 'FTP потребител за хака safemode';
+$lang['ftp____pass'] = 'FTP парола за хака safemode';
+$lang['ftp____root'] = 'FTP главна директория за хака safemode';
$lang['license_o_'] = 'Нищо не е избрано';
$lang['typography_o_0'] = 'без';
$lang['typography_o_1'] = 'с изключение на единични кавички';
-$lang['typography_o_2'] = 'всякаква форма за кавичките (не винаги работи)';
+$lang['typography_o_2'] = 'включително единични кавички (не винаги работи)';
$lang['userewrite_o_0'] = 'без';
-$lang['userewrite_o_1'] = '.htaccess файл';
+$lang['userewrite_o_1'] = 'файлът .htaccess';
$lang['userewrite_o_2'] = 'вътрешно от DokuWiki ';
$lang['deaccent_o_0'] = 'изключено';
$lang['deaccent_o_1'] = 'премахване на акценти';
-$lang['deaccent_o_2'] = 'романизация';
+$lang['deaccent_o_2'] = 'транслитерация';
$lang['gdlib_o_0'] = 'GD Lib не е достъпна';
$lang['gdlib_o_1'] = 'Версия 1.x';
$lang['gdlib_o_2'] = 'Автоматично разпознаване';
@@ -158,12 +163,12 @@ $lang['rss_type_o_rss2'] = 'RSS версия 2.0';
$lang['rss_type_o_atom'] = 'Atom версия 0.3';
$lang['rss_type_o_atom1'] = 'Atom версия 1.0';
$lang['rss_content_o_abstract'] = 'Извлечение';
-$lang['rss_content_o_diff'] = 'Обединен Diff';
-$lang['rss_content_o_htmldiff'] = 'Diff таблица в HTML формат';
+$lang['rss_content_o_diff'] = 'Обединени разлики';
+$lang['rss_content_o_htmldiff'] = 'Таблица с разликите в HTML формат';
$lang['rss_content_o_html'] = 'Цялото съдържание на HTML страницата';
$lang['rss_linkto_o_diff'] = 'изглед на разликите';
$lang['rss_linkto_o_page'] = 'променената страница';
-$lang['rss_linkto_o_rev'] = 'списък на текущите версии';
+$lang['rss_linkto_o_rev'] = 'списък на версиите';
$lang['rss_linkto_o_current'] = 'текущата страница';
$lang['compression_o_0'] = 'без';
$lang['compression_o_gz'] = 'gzip';
@@ -172,11 +177,12 @@ $lang['xsendfile_o_0'] = 'не използвайте';
$lang['xsendfile_o_1'] = 'Специфичен lighttpd header (преди версия 1.5)';
$lang['xsendfile_o_2'] = 'Стандартен X-Sendfile header';
$lang['xsendfile_o_3'] = 'Специфичен Nginx X-Accel-Redirect header за пренасочване';
-$lang['showuseras_o_loginname'] = 'Потребителско име';
+$lang['showuseras_o_loginname'] = 'Име за вписване';
$lang['showuseras_o_username'] = 'Пълно потребителско име';
-$lang['showuseras_o_email'] = 'Пълен адрес на електронната поща на потребителя';
-$lang['showuseras_o_email_link'] = 'Адрес на електронната поща на потребителя под формата на mailto: линк';
+$lang['showuseras_o_email'] = 'Ел, поща (променени според настройките на mailguard)';
+$lang['showuseras_o_email_link'] = 'Ел. поща под формата на връзка тип mailto:';
$lang['useheading_o_0'] = 'Никога';
$lang['useheading_o_navigation'] = 'Само за навигация';
-$lang['useheading_o_content'] = 'Само за Wiki съдържание';
+$lang['useheading_o_content'] = 'Само за съдържанието на Wiki-то';
$lang['useheading_o_1'] = 'Винаги';
+$lang['readdircache'] = 'Максимален период за съхраняване кеша на readdir (сек)';
diff --git a/lib/plugins/config/lang/ca-valencia/lang.php b/lib/plugins/config/lang/ca-valencia/lang.php
index 239213433..76f11a4a5 100644
--- a/lib/plugins/config/lang/ca-valencia/lang.php
+++ b/lib/plugins/config/lang/ca-valencia/lang.php
@@ -88,7 +88,7 @@ $lang['auth_security_timeout'] = 'Temps de seguritat màxim per a l\'autenticaci
$lang['securecookie'] = '¿El navegador deuria enviar per HTTPS només les galletes que s\'han generat per HTTPS? Desactive esta opció quan utilise SSL només en la pàgina d\'inici de sessió.';
$lang['xmlrpc'] = 'Activar/desactivar interfaç XML-RPC.';
$lang['xmlrpcuser'] = 'Restringir l\'accés XML-RPC a la llista d\'usuaris i grups separada per comes definida ací. Deixar buit per a donar accés a tots.';
-$lang['updatecheck'] = '¿Buscar actualisacions i advertències de seguritat? DokuWiki necessita conectar a splitbrain.org per ad açò.';
+$lang['updatecheck'] = '¿Buscar actualisacions i advertències de seguritat? DokuWiki necessita conectar a update.dokuwiki.org per ad açò.';
$lang['userewrite'] = 'Utilisar URL millorades';
$lang['useslash'] = 'Utilisar \'/\' per a separar espais de noms en les URL';
$lang['usedraft'] = 'Guardar automàticament un borrador mentres edite';
diff --git a/lib/plugins/config/lang/ca/lang.php b/lib/plugins/config/lang/ca/lang.php
index f0d622d35..d53cf1031 100644
--- a/lib/plugins/config/lang/ca/lang.php
+++ b/lib/plugins/config/lang/ca/lang.php
@@ -88,7 +88,7 @@ $lang['auth_security_timeout'] = 'Temps d\'espera de seguretat en l\'autenticaci
$lang['securecookie'] = 'Les galetes que s\'han creat via HTTPS, només s\'han d\'enviar des del navegador per HTTPS? Inhabiliteu aquesta opció si només l\'inici de sessió del wiki es fa amb SSL i la navegació del wiki es fa sense seguretat.';
$lang['xmlrpc'] = 'Habilita/inhabilita la interfície XML-RPC';
$lang['xmlrpcuser'] = 'Restringeix l\'accés per XML-RPC als usuaris o grups següents, separats per comes. Deixeu aquest camp en blanc per donar accés a tothom.';
-$lang['updatecheck'] = 'Comprova actualitzacions i avisos de seguretat. DokuWiki necessitarà contactar amb splitbrain.org per utilitzar aquesta característica.';
+$lang['updatecheck'] = 'Comprova actualitzacions i avisos de seguretat. DokuWiki necessitarà contactar amb update.dokuwiki.org per utilitzar aquesta característica.';
$lang['userewrite'] = 'Utilitza URL nets';
$lang['useslash'] = 'Utilitza la barra / com a separador d\'espais en els URL';
$lang['usedraft'] = 'Desa automàticament un esborrany mentre s\'edita';
diff --git a/lib/plugins/config/lang/cs/lang.php b/lib/plugins/config/lang/cs/lang.php
index 06839c1d0..9126a041a 100644
--- a/lib/plugins/config/lang/cs/lang.php
+++ b/lib/plugins/config/lang/cs/lang.php
@@ -8,6 +8,7 @@
* @author tomas@valenta.cz
* @author Marek Sacha <sachamar@fel.cvut.cz>
* @author Lefty <lefty@multihost.cz>
+ * @author Vojta Beran <xmamut@email.cz>
*/
$lang['menu'] = 'Správa nastavení';
$lang['error'] = 'Nastavení nebyla změněna kvůli alespoň jedné neplatné položce,
@@ -98,7 +99,7 @@ $lang['auth_security_timeout'] = 'Časový limit pro autentikaci (v sekundách)'
$lang['securecookie'] = 'Má prohlížeč posílat cookies nastavené přes HTTPS opět jen přes HTTPS? Vypněte tuto volbu, pokud chcete, aby bylo pomocí SSL zabezpečeno pouze přihlašování do wiki, ale obsah budete prohlížet nezabezpečeně.';
$lang['xmlrpc'] = 'Povolit/Zakázat rozhraní XML-RPC.';
$lang['xmlrpcuser'] = 'Omezit přístup pomocí XML-RPC pouze na zde zadané skupiny či uživatele (oddělené čárkami). Necháte-li pole prázdné, dáte přístup komukoliv.';
-$lang['updatecheck'] = 'Kontrolovat aktualizace a bezpečnostní varování? DokuWiki potřebuje pro tuto funkci přístup k splitbrain.org';
+$lang['updatecheck'] = 'Kontrolovat aktualizace a bezpečnostní varování? DokuWiki potřebuje pro tuto funkci přístup k update.dokuwiki.org';
$lang['userewrite'] = 'Používat "pěkná" URL';
$lang['useslash'] = 'Používat lomítko jako oddělovač jmenných prostorů v URL';
$lang['usedraft'] = 'Během editace ukládat koncept automaticky';
@@ -112,7 +113,8 @@ $lang['locktime'] = 'Maximální životnost zámkových souborů (v
$lang['fetchsize'] = 'Maximální velikost souboru (v bajtech), co ještě fetch.php bude stahovat z externích zdrojů';
$lang['notify'] = 'Posílat oznámení o změnách na následující emailovou adresu';
$lang['registernotify'] = 'Posílat informace o nově registrovaných uživatelích na tuto mailovou adresu';
-$lang['mailfrom'] = 'Emailová adresa, která se bude používat pro automatické maily';
+$lang['mailfrom'] = 'E-mailová adresa, která se bude používat pro automatické maily';
+$lang['mailprefix'] = 'Předpona předmětu e-mailu, která se bude používat pro automatické maily';
$lang['gzip_output'] = 'Používat pro xhtml Content-Encoding gzip';
$lang['gdlib'] = 'Verze GD knihovny';
$lang['im_convert'] = 'Cesta k nástroji convert z balíku ImageMagick';
diff --git a/lib/plugins/config/lang/da/lang.php b/lib/plugins/config/lang/da/lang.php
index bc2bc0560..a4c0bba75 100644
--- a/lib/plugins/config/lang/da/lang.php
+++ b/lib/plugins/config/lang/da/lang.php
@@ -94,7 +94,7 @@ $lang['auth_security_timeout'] = 'Tidsudløb for bekræftelse (sekunder)';
$lang['securecookie'] = 'Skal datafiler skabt af HTTPS kun sendes af HTTPS gennem browseren? Slå denne valgmulighed fra hvis kun brugen af din wiki er SSL-beskyttet, mens den almindelige tilgang udefra ikke er sikret.';
$lang['xmlrpc'] = 'Slå XML-RPC-grænseflade til/fra.';
$lang['xmlrpcuser'] = 'Begræns XML-RPC-adgang til de nævnte og med komma adskilte grupper eller brugere. Lad den stå tom for at give alle adgang.';
-$lang['updatecheck'] = 'Kig efter opdateringer og sikkerhedsadvarsler? DokuWiki er nødt til at kontakte splitbrain.org for at tilgå denne funktion.';
+$lang['updatecheck'] = 'Kig efter opdateringer og sikkerhedsadvarsler? DokuWiki er nødt til at kontakte update.dokuwiki.org for at tilgå denne funktion.';
$lang['userewrite'] = 'Brug pæne netadresser';
$lang['useslash'] = 'Brug skråstreg som navnerumsdeler i netadresser';
$lang['usedraft'] = 'Gem automatisk en kladde under redigering';
diff --git a/lib/plugins/config/lang/de-informal/lang.php b/lib/plugins/config/lang/de-informal/lang.php
index 01beeeeb9..ab7f59eac 100644
--- a/lib/plugins/config/lang/de-informal/lang.php
+++ b/lib/plugins/config/lang/de-informal/lang.php
@@ -6,6 +6,7 @@
* @author Juergen Schwarzer <jschwarzer@freenet.de>
* @author Marcel Metz <marcel_metz@gmx.de>
* @author Matthias Schulte <post@lupo49.de>
+ * @author Christian Wichmann <nospam@zone0.de>
*/
$lang['menu'] = 'Einstellungen';
$lang['error'] = 'Einstellungen wurden nicht aktualisiert auf Grund eines ungültigen Wertes. Bitte überprüfe deine Änderungen und versuche es erneut.<br />Die/der ungültige(n) Wert(e) werden durch eine rote Umrandung hervorgehoben.';
@@ -87,7 +88,7 @@ $lang['auth_security_timeout'] = 'Zeitüberschreitung bei der Authentifizierung
$lang['securecookie'] = 'Sollen Cookies, die via HTTPS gesetzt wurden nur per HTTPS versendet werden? Deaktiviere diese Option, wenn nur der Login deines Wikis mit SSL gesichert ist, aber das Betrachten des Wikis ungesichert geschieht.';
$lang['xmlrpc'] = 'Aktiviere/Deaktiviere die XML-RPC-Schnittstelle';
$lang['xmlrpcuser'] = 'XML-RPC-Zugriff auf folgende Gruppen oder Benutzer (kommasepariert) beschränken. Wenn du dieses Feld leer lässt, wir der Zugriff jedem gewährt.';
-$lang['updatecheck'] = 'Automatisch auf Updates und Sicherheitswarnungen prüfen? DokuWiki muss sich dafür mit splitbrain.org verbinden.';
+$lang['updatecheck'] = 'Automatisch auf Updates und Sicherheitswarnungen prüfen? DokuWiki muss sich dafür mit update.dokuwiki.org verbinden.';
$lang['userewrite'] = 'Benutze schöne URLs';
$lang['useslash'] = 'Benutze Schrägstrich als Namensraumtrenner in URLs';
$lang['usedraft'] = 'Speichere automatisch Entwürfe während der Bearbeitung';
@@ -102,6 +103,7 @@ $lang['fetchsize'] = 'Maximale Größe (in Bytes), die fetch.php von
$lang['notify'] = 'Sende Änderungsbenachrichtigungen an diese E-Mail-Adresse.';
$lang['registernotify'] = 'Sende Information bei neu registrierten Benutzern an diese E-Mail-Adresse.';
$lang['mailfrom'] = 'Absenderadresse für automatisch erzeugte E-Mails';
+$lang['mailprefix'] = 'Präfix für E-Mail-Betreff beim automatischen Versand von Benachrichtigungen';
$lang['gzip_output'] = 'Seiten mit gzip komprimiert ausliefern';
$lang['gdlib'] = 'GD Lib Version';
$lang['im_convert'] = 'Pfad zu ImageMagicks Konvertierwerkzeug';
diff --git a/lib/plugins/config/lang/de/lang.php b/lib/plugins/config/lang/de/lang.php
index 9a8ca3b30..b4746d757 100644
--- a/lib/plugins/config/lang/de/lang.php
+++ b/lib/plugins/config/lang/de/lang.php
@@ -13,6 +13,8 @@
* @author Blitzi94@gmx.de
* @author Robert Bogenschneider <robog@GMX.de>
* @author Robert Bogenschneider <robog@gmx.de>
+ * @author Niels Lange <niels@boldencursief.nl>
+ * @author Christian Wichmann <nospam@zone0.de>
*/
$lang['menu'] = 'Konfiguration';
$lang['error'] = 'Die Einstellungen wurden wegen einer fehlerhaften Eingabe nicht gespeichert.
@@ -97,7 +99,7 @@ $lang['auth_security_timeout'] = 'Authentifikations-Timeout (Sekunden)';
$lang['securecookie'] = 'Sollen Cookies, die via HTTPS gesetzt wurden nur per HTTPS versendet werden? Deaktivieren Sie diese Option, wenn nur der Login Ihres Wikis mit SSL gesichert ist, aber das Betrachten des Wikis ungesichert geschieht.';
$lang['xmlrpc'] = 'XML-RPC-Zugriff erlauben.';
$lang['xmlrpcuser'] = 'XML-RPC-Zugriff auf folgende Gruppen oder Benutzer (kommasepariert) beschränken. Wenn Sie dieses Feld leer lassen, wir der Zugriff jedem gewährt.';
-$lang['updatecheck'] = 'Automatisch auf Updates und Sicherheitswarnungen prüfen? DokuWiki muss sich dafür mit splitbrain.org verbinden.';
+$lang['updatecheck'] = 'Automatisch auf Updates und Sicherheitswarnungen prüfen? DokuWiki muss sich dafür mit update.dokuwiki.org verbinden.';
$lang['userewrite'] = 'URL rewriting';
$lang['useslash'] = 'Schrägstrich (/) als Namensraumtrenner in URLs verwenden';
$lang['usedraft'] = 'Während des Bearbeitens automatisch Zwischenentwürfe speichern';
@@ -112,6 +114,7 @@ $lang['fetchsize'] = 'Maximale Größe (in Bytes), die fetch.php von
$lang['notify'] = 'Änderungsmitteilungen an diese E-Mail-Adresse versenden';
$lang['registernotify'] = 'Information über neu registrierte Nutzer an diese E-Mail-Adresse senden';
$lang['mailfrom'] = 'Absender-E-Mail-Adresse für automatische Mails';
+$lang['mailprefix'] = 'Präfix für E-Mail-Betreff beim automatischen Versand von Benachrichtigungen';
$lang['gzip_output'] = 'Seiten mit gzip komprimiert ausliefern';
$lang['gdlib'] = 'GD Lib Version';
$lang['im_convert'] = 'Pfad zu ImageMagicks Konvertierwerkzeug';
diff --git a/lib/plugins/config/lang/el/lang.php b/lib/plugins/config/lang/el/lang.php
index df9029506..ed7af0ff4 100644
--- a/lib/plugins/config/lang/el/lang.php
+++ b/lib/plugins/config/lang/el/lang.php
@@ -93,7 +93,7 @@ $lang['auth_security_timeout'] = 'Διάρκεια χρόνου για ασφά
$lang['securecookie'] = 'Τα cookies που έχουν οριστεί μέσω HTTPS πρέπει επίσης να αποστέλλονται μόνο μέσω HTTPS από τον φυλλομετρητή? Απενεργοποιήστε αυτή την επιλογή όταν μόνο η είσοδος στο wiki σας διασφαλίζεται μέσω SSL αλλά η περιήγηση γίνεται και χωρίς αυτό.';
$lang['xmlrpc'] = 'Ενεργοποίηση/Απενεργοποίηση της διασύνδεσης XML-RPC ';
$lang['xmlrpcuser'] = 'Περιορισμός XML-RPC πρόσβασης στις ομάδες η τους χρήστες (διαχωριζόμενοι με κόμμα). Αφήστε το κενό για πρόσβαση από όλους.';
-$lang['updatecheck'] = 'Έλεγχος για ύπαρξη νέων εκδόσεων και ενημερώσεων ασφαλείας της εφαρμογής? Απαιτείται η σύνδεση με το splitbrain.org για να λειτουργήσει σωστά αυτή η επιλογή.';
+$lang['updatecheck'] = 'Έλεγχος για ύπαρξη νέων εκδόσεων και ενημερώσεων ασφαλείας της εφαρμογής? Απαιτείται η σύνδεση με το update.dokuwiki.org για να λειτουργήσει σωστά αυτή η επιλογή.';
$lang['userewrite'] = 'Χρήση ωραίων URLs';
$lang['useslash'] = 'Χρήση slash σαν διαχωριστικό φακέλων στα URLs';
$lang['usedraft'] = 'Αυτόματη αποθήκευση αντιγράφων κατά την τροποποίηση σελίδων';
@@ -108,6 +108,7 @@ $lang['fetchsize'] = 'Μέγιστο μέγεθος (σε bytes) ε
$lang['notify'] = 'Αποστολή ενημέρωσης για αλλαγές σε αυτή την e-mail διεύθυνση';
$lang['registernotify'] = 'Αποστολή ενημερωτικών μηνυμάτων σε αυτή την e-mail διεύθυνση κατά την εγγραφή νέων χρηστών';
$lang['mailfrom'] = 'e-mail διεύθυνση αποστολέα για μηνύματα από την εφαρμογή';
+$lang['mailprefix'] = 'Πρόθεμα θέματος που να χρησιμοποιείται για τα αυτόματα μηνύματα ηλεκτρονικού ταχυδρομείου.';
$lang['gzip_output'] = 'Χρήση gzip Content-Encoding για την xhtml';
$lang['gdlib'] = 'Έκδοση βιβλιοθήκης GD';
$lang['im_convert'] = 'Διαδρομή προς το εργαλείο μετατροπής εικόνων του ImageMagick';
diff --git a/lib/plugins/config/lang/en/lang.php b/lib/plugins/config/lang/en/lang.php
index 9003337df..8609e278f 100644
--- a/lib/plugins/config/lang/en/lang.php
+++ b/lib/plugins/config/lang/en/lang.php
@@ -111,7 +111,7 @@ $lang['xmlrpc'] = 'Enable/disable XML-RPC interface.';
$lang['xmlrpcuser'] = 'Restrict XML-RPC access to the comma separated groups or users given here. Leave empty to give access to everyone.';
/* Advanced Options */
-$lang['updatecheck'] = 'Check for updates and security warnings? DokuWiki needs to contact splitbrain.org for this feature.';
+$lang['updatecheck'] = 'Check for updates and security warnings? DokuWiki needs to contact update.dokuwiki.org for this feature.';
$lang['userewrite'] = 'Use nice URLs';
$lang['useslash'] = 'Use slash as namespace separator in URLs';
$lang['usedraft'] = 'Automatically save a draft while editing';
@@ -126,6 +126,7 @@ $lang['fetchsize'] = 'Maximum size (bytes) fetch.php may download from extern'
$lang['notify'] = 'Send change notifications to this email address';
$lang['registernotify'] = 'Send info on newly registered users to this email address';
$lang['mailfrom'] = 'Email address to use for automatic mails';
+$lang['mailprefix'] = 'Email subject prefix to use for automatic mails';
$lang['gzip_output'] = 'Use gzip Content-Encoding for xhtml';
$lang['gdlib'] = 'GD Lib version';
$lang['im_convert'] = 'Path to ImageMagick\'s convert tool';
@@ -133,6 +134,7 @@ $lang['jpg_quality'] = 'JPG compression quality (0-100)';
$lang['subscribers'] = 'Enable page subscription support';
$lang['subscribe_time'] = 'Time after which subscription lists and digests are sent (sec); This should be smaller than the time specified in recent_days.';
$lang['compress'] = 'Compact CSS and javascript output';
+$lang['cssdatauri'] = 'Size in bytes up to which images referenced in CSS files should be embedded right into the stylesheet to reduce HTTP request header overhead. This technique won\'t work in IE < 8! <code>400</code> to <code>600</code> bytes is a good value. Set <code>0</code> to disable.';
$lang['hidepages'] = 'Hide matching pages (regular expressions)';
$lang['send404'] = 'Send "HTTP 404/Page Not Found" for non existing pages';
$lang['sitemap'] = 'Generate Google sitemap (days)';
diff --git a/lib/plugins/config/lang/eo/lang.php b/lib/plugins/config/lang/eo/lang.php
index b519aa4e3..8a9ee3840 100644
--- a/lib/plugins/config/lang/eo/lang.php
+++ b/lib/plugins/config/lang/eo/lang.php
@@ -93,7 +93,7 @@ $lang['auth_security_timeout'] = 'Sekureca Templimo por aŭtentigo (sekundoj)';
$lang['securecookie'] = 'Ĉu kuketoj difinitaj per HTTPS nur estu senditaj de la foliumilo per HTTPS? Malebligu tiun ĉi opcion kiam nur la ensaluto al via vikio estas sekurigita per SSL, sed foliumado de la vikio estas farita malsekure.';
$lang['xmlrpc'] = 'Ebligi/malebligi la interfacon XML-RPC.';
$lang['xmlrpcuser'] = 'Permesi XML-RPC-an aliron al certaj grupoj aŭ uzantoj, bonvolu meti iliajn komoseparitajn nomojn tie ĉi. Alirebli de ĉiu, ĝin lasu malplena.';
-$lang['updatecheck'] = 'Ĉu kontroli aktualigojn kaj sekurecajn avizojn? DokuWiki bezonas kontakti splitbrain.org por tiu ĉi trajto.';
+$lang['updatecheck'] = 'Ĉu kontroli aktualigojn kaj sekurecajn avizojn? DokuWiki bezonas kontakti update.dokuwiki.org por tiu ĉi trajto.';
$lang['userewrite'] = 'Uzi netajn URL-ojn';
$lang['useslash'] = 'Uzi frakcistrekon kiel apartigsignaĵo por nomspacoj en URL-oj';
$lang['usedraft'] = 'Aŭtomate konservi skizon dum redaktado';
@@ -108,6 +108,7 @@ $lang['fetchsize'] = 'Maksimuma grandeco (bitokoj) permesita al "fet
$lang['notify'] = 'Sendi avizojn pri ŝanĝoj al tiu ĉi retadreso';
$lang['registernotify'] = 'Sendi informon pri ĵus aliĝintoj al tiu ĉi retadreso';
$lang['mailfrom'] = 'Retadreso uzota por aŭtomataj retmesaĝoj ';
+$lang['mailprefix'] = 'Retpoŝta temo-prefikso por uzi en aŭtomataj mesaĝoj';
$lang['gzip_output'] = 'Uzi gzip-a enhav-enkodigo por XHTML';
$lang['gdlib'] = 'Versio de GD Lib';
$lang['im_convert'] = 'Pado al la konvertilo de ImageMagick';
diff --git a/lib/plugins/config/lang/es/lang.php b/lib/plugins/config/lang/es/lang.php
index 2e5d0d01a..5355d64ad 100644
--- a/lib/plugins/config/lang/es/lang.php
+++ b/lib/plugins/config/lang/es/lang.php
@@ -19,6 +19,7 @@
* @author Fernando J. Gómez <fjgomez@gmail.com>
* @author Victor Castelan <victorcastelan@gmail.com>
* @author Mauro Javier Giamberardino <mgiamberardino@gmail.com>
+ * @author emezeta <emezeta@infoprimo.com>
*/
$lang['menu'] = 'Parámetros de configuración';
$lang['error'] = 'Los parámetros no han sido actualizados a causa de un valor inválido, por favor revise los cambios y re-envíe el formulario. <br /> Los valores incorrectos se mostrarán con un marco rojo alrededor.';
@@ -100,7 +101,7 @@ $lang['auth_security_timeout'] = 'Tiempo de Autenticación (en segundos), por mo
$lang['securecookie'] = 'Las cookies establecidas por HTTPS, ¿el naveagdor solo puede enviarlas por HTTPS? Inhabilite esta opción cuando solo se asegure con SSL la entrada, pero no la navegación de su wiki.';
$lang['xmlrpc'] = 'Habilitar/Deshabilitar interfaz XML-RPC';
$lang['xmlrpcuser'] = 'Restringir el acceso XML-RPC a los grupos o usuarios separados por coma mencionados aquí. Dejar en blanco para dar acceso a todo el mundo. ';
-$lang['updatecheck'] = '¿Comprobar actualizaciones y advertencias de seguridad? Esta característica requiere que DokuWiki se conecte a splitbrain.org.';
+$lang['updatecheck'] = '¿Comprobar actualizaciones y advertencias de seguridad? Esta característica requiere que DokuWiki se conecte a update.dokuwiki.org.';
$lang['userewrite'] = 'Usar URLs bonitas';
$lang['useslash'] = 'Usar barra (/) como separador de espacios de nombres en las URLs';
$lang['usedraft'] = 'Guardar automáticamente un borrador mientras se edita';
@@ -115,6 +116,7 @@ $lang['fetchsize'] = 'Tamaño máximo (bytes) que fetch.php puede de
$lang['notify'] = 'Enviar notificación de cambios a esta dirección de correo electrónico';
$lang['registernotify'] = 'Enviar información cuando se registran nuevos usuarios a esta dirección de correo electrónico';
$lang['mailfrom'] = 'Dirección de correo electrónico para emails automáticos';
+$lang['mailprefix'] = 'Asunto por defecto que se utilizará en mails automáticos.';
$lang['gzip_output'] = 'Usar gzip Content-Encoding para xhtml';
$lang['gdlib'] = 'Versión de GD Lib';
$lang['im_convert'] = 'Ruta a la herramienta de conversión de ImageMagick';
diff --git a/lib/plugins/config/lang/et/lang.php b/lib/plugins/config/lang/et/lang.php
new file mode 100644
index 000000000..27f2e87ac
--- /dev/null
+++ b/lib/plugins/config/lang/et/lang.php
@@ -0,0 +1,32 @@
+<?php
+/**
+ * Estonian language file
+ *
+ * @author kristian.kankainen@kuu.la
+ * @author Rivo Zängov <eraser@eraser.ee>
+ */
+$lang['menu'] = 'Seadete haldamine';
+$lang['_configuration_manager'] = 'Seadete haldamine';
+$lang['_basic'] = 'Peamised seaded';
+$lang['_display'] = 'Näitamise seaded';
+$lang['_authentication'] = 'Audentimise seaded';
+$lang['_anti_spam'] = 'Spämmitõrje seaded';
+$lang['_editing'] = 'Muutmise seaded';
+$lang['_links'] = 'Lingi seaded';
+$lang['_media'] = 'Meedia seaded';
+$lang['_advanced'] = 'Laiendatud seaded';
+$lang['_network'] = 'Võrgu seaded';
+$lang['_plugin_sufix'] = 'Plugina seaded';
+$lang['_template_sufix'] = 'Kujunduse seaded';
+$lang['title'] = 'Wiki pealkiri';
+$lang['template'] = 'Kujundus';
+$lang['recent'] = 'Viimased muudatused';
+$lang['signature'] = 'Allkiri';
+$lang['defaultgroup'] = 'Vaikimisi grupp';
+$lang['disableactions_check'] = 'Kontrolli';
+$lang['compression_o_0'] = 'pole';
+$lang['compression_o_gz'] = 'gzip';
+$lang['compression_o_bz2'] = 'bz2';
+$lang['xsendfile_o_0'] = 'ära kasuta';
+$lang['useheading_o_0'] = 'Mitte kunagi';
+$lang['useheading_o_1'] = 'Alati';
diff --git a/lib/plugins/config/lang/eu/lang.php b/lib/plugins/config/lang/eu/lang.php
index a50bd6d4e..9d001d494 100644
--- a/lib/plugins/config/lang/eu/lang.php
+++ b/lib/plugins/config/lang/eu/lang.php
@@ -85,7 +85,7 @@ $lang['auth_security_timeout'] = 'Kautotze Segurtasun Denbora-Muga (segunduak)';
$lang['securecookie'] = 'HTTPS bidez ezarritako cookie-ak HTTPS bidez bakarrik bidali beharko lituzke nabigatzaileak? Ezgaitu aukera hau bakarrik saio hasierak SSL bidezko segurtasuna badu baina wiki-areb nabigazioa modu ez seguruan egiten bada. ';
$lang['xmlrpc'] = 'Gaitu/ezgaitu XML-RPC interfazea.';
$lang['xmlrpcuser'] = 'XML-RPC atzipena mugatu hemen emandako komaz bereiztutako talde eta erabiltzaileei. Utzi hutsik atzipena guztiei emateko.';
-$lang['updatecheck'] = 'Konprobatu eguneratze eta segurtasun oharrak? DokuWiki-k honetarako splitbrain.org kontaktatu behar du.';
+$lang['updatecheck'] = 'Konprobatu eguneratze eta segurtasun oharrak? DokuWiki-k honetarako update.dokuwiki.org kontaktatu behar du.';
$lang['userewrite'] = 'Erabili URL politak';
$lang['useslash'] = 'Erabili barra (/) izen-espazio banatzaile moduan URLetan';
$lang['usedraft'] = 'Automatikoki zirriborroa gorde editatze garaian';
@@ -100,6 +100,7 @@ $lang['fetchsize'] = 'Kanpo esteketatik fetch.php-k deskargatu dezak
$lang['notify'] = 'Aldaketen jakinarazpenak posta-e helbide honetara bidali';
$lang['registernotify'] = 'Erregistratu berri diren erabiltzaileei buruzko informazioa post-e helbide honetara bidali';
$lang['mailfrom'] = 'Posta automatikoentzat erabiliko den posta-e helbidea';
+$lang['mailprefix'] = 'Posta automatikoen gaientzat erabili beharreko aurrizkia';
$lang['gzip_output'] = 'Gzip Eduki-Kodeketa erabili xhtml-rentzat';
$lang['gdlib'] = 'GD Lib bertsioa';
$lang['im_convert'] = 'ImageMagick-en aldaketa tresnara bidea';
diff --git a/lib/plugins/config/lang/fa/lang.php b/lib/plugins/config/lang/fa/lang.php
index 98744f366..42cc3ed05 100644
--- a/lib/plugins/config/lang/fa/lang.php
+++ b/lib/plugins/config/lang/fa/lang.php
@@ -88,7 +88,7 @@ $lang['auth_security_timeout'] = 'زمان انقضای معتبرسازی به
$lang['securecookie'] = 'آیا کوکی‌ها باید با قرارداد HTTPS ارسال شوند؟ این گزینه را زمانی که فقط صفحه‌ی ورود ویکی‌تان با SSL امن شده است، اما ویکی را ناامن مرور می‌کنید، غیرفعال نمایید.';
$lang['xmlrpc'] = 'فعال/غیرفعال کردن XML-RPC';
$lang['xmlrpcuser'] = 'محمدود کردن دسترسی به XML-RPC توسط گروه های جدا شده توسط ویرگول ویا اعضای داده شده در اینجا. این مکان را خالی بگزارید تا به همه دسترسی داده شود.';
-$lang['updatecheck'] = 'هشدارهای به روز رسانی و امنیتی بررسی شود؟ برای این‌کار DokuWiki با سرور splitbrain.org تماس خواهد گرفت.';
+$lang['updatecheck'] = 'هشدارهای به روز رسانی و امنیتی بررسی شود؟ برای این‌کار DokuWiki با سرور update.dokuwiki.org تماس خواهد گرفت.';
$lang['userewrite'] = 'از زیباکننده‌ی آدرس‌ها استفاده شود';
$lang['useslash'] = 'از اسلش «/» برای جداکننده‌ی آدرس فضای‌نام‌ها استفاده شود';
$lang['usedraft'] = 'ایجاد خودکار چرک‌نویس در زمان نگارش';
@@ -103,11 +103,13 @@ $lang['fetchsize'] = 'بیشینه‌ی حجمی که فایل fetch
$lang['notify'] = 'تغییرات به این ایمیل ارسال شود';
$lang['registernotify'] = 'اطلاعات کاربران تازه وارد به این ایمیل ارسال شود';
$lang['mailfrom'] = 'آدرس ایمیلی که برای ایمیل‌های خودکار استفاده می‌شود';
+$lang['mailprefix'] = 'پیشوند تیتر ایمیل (جهت ایمیل های خودکار)';
$lang['gzip_output'] = 'استفاده از gzip برای xhtmlها';
$lang['gdlib'] = 'نگارش کتاب‌خانه‌ی GD';
$lang['im_convert'] = 'مسیر ابزار convert از برنامه‌ی ImageMagick';
$lang['jpg_quality'] = 'کیفیت فشرده سازی JPEG (از 0 تا 100)';
$lang['subscribers'] = 'توانایی عضویت در صفحات باشد';
+$lang['subscribe_time'] = 'زمان مورد نیاز برای ارسال خبر نامه ها (ثانیه); این مقدار می بایست کمتر زمانی باشد که در recent_days تعریف شده است.';
$lang['compress'] = 'فشرده‌سازی کد‌های CSS و JavaScript';
$lang['hidepages'] = 'مخفی کردن صفحات با فرمت زیر (از عبارات منظم استفاده شود)';
$lang['send404'] = 'ارسال «HTTP 404/Page Not Found» برای صفحاتی که وجود ندارند';
diff --git a/lib/plugins/config/lang/fi/lang.php b/lib/plugins/config/lang/fi/lang.php
index b033e312b..0e9bad030 100644
--- a/lib/plugins/config/lang/fi/lang.php
+++ b/lib/plugins/config/lang/fi/lang.php
@@ -5,6 +5,7 @@
* @author otto@valjakko.net
* @author Otto Vainio <otto@valjakko.net>
* @author Teemu Mattila <ghcsystems@gmail.com>
+ * @author Sami Olmari <sami@olmari.fi>
*/
$lang['menu'] = 'Asetukset';
$lang['error'] = 'Asetuksia ei päivitetty väärän arvon vuoksi. Tarkista muutokset ja lähetä sivu uudestaan.
@@ -88,7 +89,7 @@ $lang['auth_security_timeout'] = 'Autentikoinnin aikakatkaisu (sekunteja)';
$lang['securecookie'] = 'Lähetetäänkö HTTPS:n kautta asetetut evästetiedot HTTPS-yhteydellä? Kytke pois, jos vain wikisi kirjautuminen on suojattu SSL:n avulla, mutta muuten wikiä käytetään ilman suojausta.';
$lang['xmlrpc'] = 'Käytä/poista XML-RPC liityntää';
$lang['xmlrpcuser'] = 'Estä XML-RPC:n käyttö pilkulla erotetun listan ryhmille tai käyttäjille. Jätä tyhjäksi salliaksesi käyttö kaikille.';
-$lang['updatecheck'] = 'Tarkista päivityksiä ja turvavaroituksia? Tätä varten DokuWikin pitää ottaa yhteys splitbrain.orgiin.';
+$lang['updatecheck'] = 'Tarkista päivityksiä ja turvavaroituksia? Tätä varten DokuWikin pitää ottaa yhteys update.dokuwiki.orgiin.';
$lang['userewrite'] = 'Käytä siivottuja URLeja';
$lang['useslash'] = 'Käytä kauttaviivaa nimiavaruuksien erottimena URL-osoitteissa';
$lang['usedraft'] = 'Tallenna vedos muokkaustilassa automaattisesti ';
@@ -103,6 +104,7 @@ $lang['fetchsize'] = 'Suurin koko (bytejä), jonka fetch.php voi lad
$lang['notify'] = 'Lähetä muutosilmoitukset tähän osoitteeseen';
$lang['registernotify'] = 'Lähetä ilmoitus uusista rekisteröitymisistä tähän osoitteeseen';
$lang['mailfrom'] = 'Sähköpostiosoite automaattisia postituksia varten';
+$lang['mailprefix'] = 'Etuliite automaattisesti lähetettyihin dähköposteihin';
$lang['gzip_output'] = 'Käytä gzip "Content-Encoding"-otsaketta xhtml-tiedostojen lähettämiseen';
$lang['gdlib'] = 'GD Lib versio';
$lang['im_convert'] = 'ImageMagick-muunnostyökalun polku';
@@ -110,6 +112,7 @@ $lang['jpg_quality'] = 'JPG pakkauslaatu (0-100)';
$lang['subscribers'] = 'Salli tuki sivujen tilaamiselle';
$lang['subscribe_time'] = 'Aika jonka jälkeen tilauslinkit ja yhteenveto lähetetään (sek). Tämän pitäisi olla pienempi, kuin recent_days aika.';
$lang['compress'] = 'Pakkaa CSS ja javascript';
+$lang['cssdatauri'] = 'Maksimikoko tavuina jossa kuvat joihin viitataan CSS-tiedostoista olisi sisällytettynä suoraan tyylitiedostoon jotta HTTP-kyselyjen kaistaa saataisiin kutistettua. Tämä tekniikka ei toimi IE versiossa aikasempi kuin 8! <code>400:sta</code> <code>600:aan</code> tavua on hyvä arvo. Aseta <code>0</code> kytkeäksesi ominaisuuden pois.';
$lang['hidepages'] = 'Piilota seuraavat sivut (säännönmukainen lauseke)';
$lang['send404'] = 'Lähetä "HTTP 404/Page Not Found" puuttuvista sivuista';
$lang['sitemap'] = 'Luo Google sitemap (päiviä)';
diff --git a/lib/plugins/config/lang/fr/lang.php b/lib/plugins/config/lang/fr/lang.php
index b51c260fc..1de255b40 100644
--- a/lib/plugins/config/lang/fr/lang.php
+++ b/lib/plugins/config/lang/fr/lang.php
@@ -15,6 +15,8 @@
* @author Philippe Bajoit <philippe.bajoit@gmail.com>
* @author Florian Gaub <floriang@floriang.net>
* @author Samuel Dorsaz samuel.dorsaz@novelion.net
+ * @author Johan Guilbaud <guilbaud.johan@gmail.com>
+ * @author schplurtz@laposte.net
*/
$lang['menu'] = 'Paramètres de configuration';
$lang['error'] = 'Paramètres non modifiés en raison d\'une valeur non valide, vérifiez vos réglages et réessayez. <br />Les valeurs erronées sont entourées d\'une bordure rouge.';
@@ -96,13 +98,13 @@ $lang['auth_security_timeout'] = 'Délai d\'expiration de sécurité (secondes)'
$lang['securecookie'] = 'Les cookies mis via HTTPS doivent-ils n\'être envoyé par le navigateur que via HTTPS ? Ne désactivez cette option que si la connexion à votre wiki est sécurisée avec SSL mais que la navigation sur le wiki n\'est pas sécurisée.';
$lang['xmlrpc'] = 'Activer l\'interface XML-RPC.';
$lang['xmlrpcuser'] = 'Restreindre l\'accès à XML-RPC aux groupes et utilisateurs indiqués ici. Laisser vide afin que tout le monde y ait accès.';
-$lang['updatecheck'] = 'Vérifier les mises à jour ? DokuWiki doit pouvoir contacter splitbrain.org.';
+$lang['updatecheck'] = 'Vérifier les mises à jour ? DokuWiki doit pouvoir contacter update.dokuwiki.org.';
$lang['userewrite'] = 'URL esthétiques';
$lang['useslash'] = 'Utiliser « / » comme séparateur de catégorie dans les URL';
$lang['usedraft'] = 'Enregistrer automatiquement un brouillon pendant l\'édition';
$lang['sepchar'] = 'Séparateur de mots dans les noms de page';
$lang['canonical'] = 'Utiliser des URL canoniques';
-$lang['fnencode'] = 'Méhtode pou r l\'encodage des fichiers non-ASCII';
+$lang['fnencode'] = 'Méthode pour l\'encodage des fichiers non-ASCII';
$lang['autoplural'] = 'Rechercher les formes plurielles dans les liens';
$lang['compression'] = 'Méthode de compression pour les fichiers dans attic';
$lang['cachetime'] = 'Âge maximum d\'un fichier en cache (en secondes)';
@@ -111,6 +113,7 @@ $lang['fetchsize'] = 'Taille maximale (en octets) du fichier que fet
$lang['notify'] = 'Notifier les modifications à cette adresse de courriel';
$lang['registernotify'] = 'Envoyer un courriel annonçant les nouveaux utilisateurs enregistrés à cette adresse';
$lang['mailfrom'] = 'Expéditeur des notifications par courriel du wiki';
+$lang['mailprefix'] = 'Préfixe à utiliser dans les objets des courriels automatiques';
$lang['gzip_output'] = 'Utiliser Content-Encoding gzip pour XHTML';
$lang['gdlib'] = 'Version de GD Lib';
$lang['im_convert'] = 'Chemin vers l\'outil de conversion d\'ImageMagick';
@@ -118,6 +121,7 @@ $lang['jpg_quality'] = 'Qualité de la compression JPEG (0-100)';
$lang['subscribers'] = 'Activer l\'abonnement aux pages';
$lang['subscribe_time'] = 'Délai après lequel les listes d\'abonnement et résumés sont envoyés (en secondes). Devrait être plus petit que le délai précisé dans recent_days.';
$lang['compress'] = 'Compresser CSS et JavaScript';
+$lang['cssdatauri'] = 'Taille maximale en octets pour inclure dans les feuilles de styles CSS, les images qui y sont référencées. Cette technique minimise les requêtes HTTP. Pour IE, ceci ne fonctionne qu\'à partir de la version 8 ! Valeurs correctes entre <code>400</code> et <code>600</code>. <code>0</code> pour désactiver.';
$lang['hidepages'] = 'Cacher les pages correspondant à (expression régulière)';
$lang['send404'] = 'Renvoyer "HTTP 404/Page Non Trouvée" pour les pages introuvables';
$lang['sitemap'] = 'Fréquence de génération une carte Google du site (en jours)';
@@ -161,7 +165,7 @@ $lang['userewrite_o_2'] = 'Interne à DokuWiki';
$lang['deaccent_o_0'] = 'off';
$lang['deaccent_o_1'] = 'supprimer les accents';
$lang['deaccent_o_2'] = 'convertir en roman';
-$lang['gdlib_o_0'] = 'GD Lib non disponible';
+$lang['gdlib_o_0'] = 'Librairie GD non disponible';
$lang['gdlib_o_1'] = 'version 1.x';
$lang['gdlib_o_2'] = 'auto-détectée';
$lang['rss_type_o_rss'] = 'RSS 0.91';
diff --git a/lib/plugins/config/lang/gl/lang.php b/lib/plugins/config/lang/gl/lang.php
index ac91098cb..07d62b7af 100644
--- a/lib/plugins/config/lang/gl/lang.php
+++ b/lib/plugins/config/lang/gl/lang.php
@@ -86,7 +86,7 @@ $lang['auth_security_timeout'] = 'Tempo Límite de Seguridade de Autenticación
$lang['securecookie'] = 'Deben enviarse só vía HTTPS polo navegador as cookies configuradas vía HTTPS? Desactiva esta opción cando só o inicio de sesión do teu wiki estea asegurado con SSL pero a navegación do mesmo se faga de xeito inseguro.';
$lang['xmlrpc'] = 'Activar/Desactivar interface XML-RPC';
$lang['xmlrpcuser'] = 'Restrinxir o acceso mediante XML-RPC á lista separada por comas dos grupos e/ou usuarios proporcionados aquí. Déixao baleiro para darlle acceso a todas as persoas.';
-$lang['updatecheck'] = 'Comprobar se hai actualizacións e avisos de seguridade? O DokuWiki precisa contactar con splitbrain.org para executar esta característica.';
+$lang['updatecheck'] = 'Comprobar se hai actualizacións e avisos de seguridade? O DokuWiki precisa contactar con update.dokuwiki.org para executar esta característica.';
$lang['userewrite'] = 'Utilizar URLs amigábeis';
$lang['useslash'] = 'Utilizar a barra inclinada (/) como separador de nome de espazo nos URLs';
$lang['usedraft'] = 'Gardar un borrador automaticamente no tempo da edición';
diff --git a/lib/plugins/config/lang/he/lang.php b/lib/plugins/config/lang/he/lang.php
index a39d0ab5c..e80a1bd7a 100644
--- a/lib/plugins/config/lang/he/lang.php
+++ b/lib/plugins/config/lang/he/lang.php
@@ -7,6 +7,7 @@
* @author Dotan Kamber <kamberd@yahoo.com>
* @author Moshe Kaplan <mokplan@gmail.com>
* @author Yaron Yogev <yaronyogev@gmail.com>
+ * @author Yaron Shahrabani <sh.yaron@gmail.com>
*/
$lang['menu'] = 'הגדרות תצורה';
$lang['error'] = 'ההגדרות לא עודכנו בגלל ערך לא תקף, נא לעיין בשינויים ולשלוח שנית.
@@ -82,7 +83,7 @@ $lang['disableactions_other'] = 'פעולות אחרות (מופרדות בפס
$lang['sneaky_index'] = 'כברירת מחדל, דוקוויקי יציג את כל מרחבי השמות בתצוגת תוכן הענינים. בחירה באפשרות זאת תסתיר את אלו שבהם למשתמש אין הרשאות קריאה. התוצאה עלולה להיות הסתרת תת מרחבי שמות אליהם יש למשתמש גישה. באופן זה תוכן הענינים עלול להפוך לחסר תועלת עם הגדרות ACL מסוימות';
$lang['auth_security_timeout'] = 'מגבלת אבטח פסק הזמן להזדהות (שניות)';
$lang['xmlrpc'] = 'לאפשר.לחסום את מנשק XML-RPC';
-$lang['updatecheck'] = 'בדיקת עידכוני אבטחה והתראות? על DokuWiki להתקשר אל splitbrain.org לצורך כך.';
+$lang['updatecheck'] = 'בדיקת עידכוני אבטחה והתראות? על DokuWiki להתקשר אל update.dokuwiki.org לצורך כך.';
$lang['userewrite'] = 'השתמש בכתובות URL יפות';
$lang['useslash'] = 'השתמש בלוכסן להגדרת מרחבי שמות בכתובות';
$lang['usedraft'] = 'שמור טיוטות באופן אוטומטי בעת עריכה';
diff --git a/lib/plugins/config/lang/hr/lang.php b/lib/plugins/config/lang/hr/lang.php
index d2094b77b..96f1d6afe 100644
--- a/lib/plugins/config/lang/hr/lang.php
+++ b/lib/plugins/config/lang/hr/lang.php
@@ -4,4 +4,5 @@
*
* @author Branko Rihtman <theney@gmail.com>
* @author Dražen Odobašić <dodobasic@gmail.com>
+ * @author Dejan Igrec dejan.igrec@gmail.com
*/
diff --git a/lib/plugins/config/lang/hu/lang.php b/lib/plugins/config/lang/hu/lang.php
index 47c1e67c7..f991b7c95 100644
--- a/lib/plugins/config/lang/hu/lang.php
+++ b/lib/plugins/config/lang/hu/lang.php
@@ -5,8 +5,9 @@
* @author Sandor TIHANYI <stihanyi+dw@gmail.com>
* @author Siaynoq Mage <siaynoqmage@gmail.com>
* @author schilling.janos@gmail.com
- * @author Szabó Dávid (szabo.david@gyumolcstarhely.hu)
* @author Szabó Dávid <szabo.david@gyumolcstarhely.hu>
+ * @author Sándor TIHANYI <stihanyi+dw@gmail.com>
+ * @author David Szabo <szabo.david@gyumolcstarhely.hu>
*/
$lang['menu'] = 'Beállító Központ';
$lang['error'] = 'Helytelen érték miatt a módosítások nem mentődtek. Nézd át a módosításokat, és ments újra.
@@ -90,7 +91,7 @@ $lang['auth_security_timeout'] = 'Authentikációs biztonsági időablak (másod
$lang['securecookie'] = 'A böngészők a HTTPS felett beállított sütijüket csak HTTPS felett küldhetik? Kapcsoljuk ki ezt az opciót, ha csak a bejelentkezést védjük SSL-lel, a wiki tartalmának böngészése nyílt forgalommal történik.';
$lang['xmlrpc'] = 'XML-RPC interfész engedélyezése/tiltása';
$lang['xmlrpcuser'] = 'Korlátozza XML-RPC hozzáférést az itt megadott vesszővel elválasztott csoportok vagy felhasználók számára. Hagyja üresen, ha mindenki számára biztosítja a hozzáférést.';
-$lang['updatecheck'] = 'Frissítések és biztonsági figyelmeztetések figyelése. Ehhez a DokuWikinek kapcsolatba kell lépnie a splitbrain.org-gal.';
+$lang['updatecheck'] = 'Frissítések és biztonsági figyelmeztetések figyelése. Ehhez a DokuWikinek kapcsolatba kell lépnie a update.dokuwiki.org-gal.';
$lang['userewrite'] = 'Szép URL-ek használata';
$lang['useslash'] = 'Per-jel használata névtér-elválasztóként az URL-ekben';
$lang['usedraft'] = 'Piszkozat automatikus mentése szerkesztés alatt';
@@ -105,6 +106,7 @@ $lang['fetchsize'] = 'Maximális méret (bájtban), amit a fetch.php
$lang['notify'] = 'Az oldal-változásokat erre az e-mail címre küldje';
$lang['registernotify'] = 'Értesítés egy újonnan regisztrált felhasználóról erre az e-mail címre';
$lang['mailfrom'] = 'Az automatikusan küldött levelekben használt e-mail cím';
+$lang['mailprefix'] = 'Előtag az automatikus e-mailek tárgyában';
$lang['gzip_output'] = 'gzip tömörítés használata xhtml-hez (Content-Encoding)';
$lang['gdlib'] = 'GD Lib verzió';
$lang['im_convert'] = 'Útvonal az ImageMagick csomag convert parancsához';
diff --git a/lib/plugins/config/lang/ia/lang.php b/lib/plugins/config/lang/ia/lang.php
index 624b79485..689869b89 100644
--- a/lib/plugins/config/lang/ia/lang.php
+++ b/lib/plugins/config/lang/ia/lang.php
@@ -85,7 +85,7 @@ $lang['auth_security_timeout'] = 'Expiration pro securitate de authentication (s
$lang['securecookie'] = 'Debe le cookies definite via HTTPS solmente esser inviate via HTTPS per le navigator? Disactiva iste option si solmente le apertura de sessiones a tu wiki es protegite con SSL ma le navigation del wiki es facite sin securitate.';
$lang['xmlrpc'] = 'Activar/disactivar interfacie XML-RPC.';
$lang['xmlrpcuser'] = 'Limitar le accesso a XML-RPC al gruppos o usatores date hic, separate per commas. Lassa isto vacue pro dar accesso a omnes.';
-$lang['updatecheck'] = 'Verificar si existe actualisationes e advertimentos de securitate? DokuWiki debe contactar splitbrain.org pro exequer iste function.';
+$lang['updatecheck'] = 'Verificar si existe actualisationes e advertimentos de securitate? DokuWiki debe contactar update.dokuwiki.org pro exequer iste function.';
$lang['userewrite'] = 'Usar URLs nette';
$lang['useslash'] = 'Usar le barra oblique ("/") como separator de spatios de nomines in URLs';
$lang['usedraft'] = 'Automaticamente salveguardar un version provisori durante le modification';
diff --git a/lib/plugins/config/lang/it/intro.txt b/lib/plugins/config/lang/it/intro.txt
index 95e7151f3..617e8c7b5 100644
--- a/lib/plugins/config/lang/it/intro.txt
+++ b/lib/plugins/config/lang/it/intro.txt
@@ -4,6 +4,6 @@ Usa questa pagina per gestire la configurazione della tua installazione DokuWiki
Le impostazioni con lo sfondo rosso chiaro sono protette e non possono essere modificate con questo plugin. Le impostazioni con lo sfondo blu contengono i valori predefiniti, e le impostazioni con lo sfondo bianco sono relative solo a questa particolare installazione. Sia le impostazioni su sfondo blu che quelle su sfondo bianco possono essere modificate.
-Ricordati di premere il pulsante **SALVA** prima di lasciare questa pagina altrimenti le modifiche saranno perse.
+Ricordati di premere il pulsante **SALVA** prima di lasciare questa pagina altrimenti le modifiche andranno perse.
diff --git a/lib/plugins/config/lang/it/lang.php b/lib/plugins/config/lang/it/lang.php
index 5bbc6894f..c4dd433ed 100644
--- a/lib/plugins/config/lang/it/lang.php
+++ b/lib/plugins/config/lang/it/lang.php
@@ -12,6 +12,7 @@
* @author snarchio@alice.it
* @author robocap <robocap1@gmail.com>
* @author Osman Tekin osman.tekin93@hotmail.it
+ * @author Jacopo Corbetta <jacopo.corbetta@gmail.com>
*/
$lang['menu'] = 'Configurazione Wiki';
$lang['error'] = 'Impostazioni non aggiornate a causa di un valore non corretto, controlla le modifiche apportate e salva di nuovo.
@@ -95,7 +96,7 @@ $lang['auth_security_timeout'] = 'Tempo di sicurezza per l\'autenticazione (seco
$lang['securecookie'] = 'Devono i cookies impostati tramite HTTPS essere inviati al browser solo tramite HTTPS? Disattiva questa opzione solo quando l\'accesso al tuo wiki viene effettuato con il protocollo SSL ma la navigazione del wiki non risulta sicura.';
$lang['xmlrpc'] = 'Abilita/disabilita interfaccia XML-RPC.';
$lang['xmlrpcuser'] = 'Limita l\'accesso XML-RPC ai gruppi o utenti indicati qui (separati da virgola). Lascia il campo vuoto per dare accesso a tutti.';
-$lang['updatecheck'] = 'Controllare aggiornamenti e avvisi di sicurezza? DokuWiki deve contattare splitbrain.org per questa funzione.';
+$lang['updatecheck'] = 'Controllare aggiornamenti e avvisi di sicurezza? DokuWiki deve contattare update.dokuwiki.org per questa funzione.';
$lang['userewrite'] = 'Usa il rewrite delle URL';
$lang['useslash'] = 'Usa la barra rovescia (slash) come separatore nelle URL';
$lang['usedraft'] = 'Salva una bozza in automatico in fase di modifica';
@@ -110,6 +111,7 @@ $lang['fetchsize'] = 'Dimensione massima (bytes) scaricabile da fetc
$lang['notify'] = 'Invia notifiche sulle modifiche a questo indirizzo';
$lang['registernotify'] = 'Invia informazioni sui nuovi utenti registrati a questo indirizzo email';
$lang['mailfrom'] = 'Mittente per le mail automatiche';
+$lang['mailprefix'] = 'Prefisso da inserire nell\'oggetto delle mail automatiche';
$lang['gzip_output'] = 'Usa il Content-Encoding gzip per xhtml';
$lang['gdlib'] = 'Versione GD Lib ';
$lang['im_convert'] = 'Percorso per il convertitore di ImageMagick';
@@ -182,7 +184,7 @@ $lang['xsendfile_o_0'] = 'non usare';
$lang['xsendfile_o_1'] = 'Header proprietario lighttpd (prima della versione 1.5)';
$lang['xsendfile_o_2'] = 'Header standard X-Sendfile';
$lang['xsendfile_o_3'] = 'Header proprietario Nginx X-Accel-Redirect';
-$lang['showuseras_o_loginname'] = 'Nome accesso';
+$lang['showuseras_o_loginname'] = 'Nome utente';
$lang['showuseras_o_username'] = 'Nome completo dell\'utente';
$lang['showuseras_o_email'] = 'Indirizzo email dell\'utente (offuscato in base alle impostazioni di sicurezza posta)';
$lang['showuseras_o_email_link'] = 'Indirizzo email dell\'utente come collegamento mailto:';
diff --git a/lib/plugins/config/lang/ja/lang.php b/lib/plugins/config/lang/ja/lang.php
index 9ec416196..19f10af48 100644
--- a/lib/plugins/config/lang/ja/lang.php
+++ b/lib/plugins/config/lang/ja/lang.php
@@ -91,7 +91,7 @@ $lang['auth_security_timeout'] = '認証タイムアウト設定(秒)';
$lang['securecookie'] = 'クッキーをHTTPSにてセットする場合は、ブラウザよりHTTPS経由で送信された場合にみに制限しますか?ログインのみをSSLで行う場合は、この機能を無効にしてください。';
$lang['xmlrpc'] = 'XML-RPCインターフェースを有効/無効にする';
$lang['xmlrpcuser'] = 'XML-RPCアクセスを指定グループとユーザーに制限します(半角コンマ区切り)。 すべての人にアクセスを許可する場合は空のままにしてください。';
-$lang['updatecheck'] = 'DokuWikiの更新とセキュリティに関する情報をチェックしますか? この機能は splitbrain.org への接続が必要です。';
+$lang['updatecheck'] = 'DokuWikiの更新とセキュリティに関する情報をチェックしますか? この機能は update.dokuwiki.org への接続が必要です。';
$lang['userewrite'] = 'URLの書き換え';
$lang['useslash'] = 'URL上の名前空間の区切りにスラッシュを使用';
$lang['usedraft'] = '編集中の自動保存(ドラフト)機能を使用';
@@ -106,6 +106,7 @@ $lang['fetchsize'] = '外部からのダウンロード最大サイ
$lang['notify'] = '変更を通知するメールアドレス';
$lang['registernotify'] = '新規ユーザー登録を通知するメールアドレス';
$lang['mailfrom'] = 'メール送信時の送信元アドレス';
+$lang['mailprefix'] = '自動メールの題名に使用する接頭語';
$lang['gzip_output'] = 'xhtmlに対するコンテンツ圧縮(gzip)を使用';
$lang['gdlib'] = 'GDlibバージョン';
$lang['im_convert'] = 'ImageMagick変換ツールへのパス';
diff --git a/lib/plugins/config/lang/kk/lang.php b/lib/plugins/config/lang/kk/lang.php
new file mode 100644
index 000000000..dde5b9577
--- /dev/null
+++ b/lib/plugins/config/lang/kk/lang.php
@@ -0,0 +1,6 @@
+<?php
+/**
+ * kazakh language file
+ *
+ * @author Nurgozha Kaliaskarov astana08@gmail.com
+ */
diff --git a/lib/plugins/config/lang/ko/lang.php b/lib/plugins/config/lang/ko/lang.php
index 13f5efefe..20cfcdcfe 100644
--- a/lib/plugins/config/lang/ko/lang.php
+++ b/lib/plugins/config/lang/ko/lang.php
@@ -92,13 +92,13 @@ $lang['auth_security_timeout'] = '인증 보안 초과 시간(초)';
$lang['securecookie'] = 'HTTPS로 보내진 쿠키는 HTTPS에만 적용 할까요? 위키의 로그인 페이지만 SSL로 암호화 하고 위키 페이지는 그렇지 않은경우 꺼야 합니다.';
$lang['xmlrpc'] = 'XML-RPC 인터페이스 지원/무시';
$lang['xmlrpcuser'] = '주어진 그룹이나 유저들에게만 XML-RPC접근을 허락하려면 컴마로 구분하여 적으세요. 비어두면 모두에게 허용됩니다.';
-$lang['updatecheck'] = '업데이트와 보안 문제를 검사(DokuWiki를 splitbrain.org에 연결해야 합니다.)';
+$lang['updatecheck'] = '업데이트와 보안 문제를 검사(DokuWiki를 update.dokuwiki.org에 연결해야 합니다.)';
$lang['userewrite'] = 'URL rewriting기능 사용';
$lang['useslash'] = 'URL에서 네임스페이스 구분자로 슬래쉬 문자 사용';
$lang['usedraft'] = '편집하는 동안 자동으로 문서 초안 저장';
$lang['sepchar'] = '페이지 이름 단어 구분자';
$lang['canonical'] = '완전한 canonical URL 사용';
-$lang['fnencode'] = '아스키가 아닌 파일이르믈 인코딩 하는 방법.';
+$lang['fnencode'] = '아스키가 아닌 파일이름을 인코딩 하는 방법.';
$lang['autoplural'] = '링크 연결시 plural폼 검사';
$lang['compression'] = 'attic파일 압축 방법 선택';
$lang['cachetime'] = '최대 캐쉬 생존 시간(초)';
@@ -107,6 +107,7 @@ $lang['fetchsize'] = 'fetch.php가 외부에서 다운로드할 수
$lang['notify'] = '이메일 알람 기능';
$lang['registernotify'] = '신규 등록자 알람 기능';
$lang['mailfrom'] = '자동으로 보내지는 메일 발신자';
+$lang['mailprefix'] = '자동으로 보내지는 메일의 제목 말머리 내용';
$lang['gzip_output'] = 'xhml 내용 gzip 압축 여부';
$lang['gdlib'] = 'GD 라이브러리 버전';
$lang['im_convert'] = 'ImageMagick 위치';
diff --git a/lib/plugins/config/lang/la/intro.txt b/lib/plugins/config/lang/la/intro.txt
index d23029ab1..573d34ac1 100644
--- a/lib/plugins/config/lang/la/intro.txt
+++ b/lib/plugins/config/lang/la/intro.txt
@@ -1,6 +1,6 @@
-====== Administrationis Administrator ======
+====== Optionum Administratio ======
-In hac pagina administratoris optiones mutare et inspicere potes. Auxilia in pagina [[doku>config]] sunt, si singulas res uidere uis, i ad paginam [[doku>plugin:config]].
+In hac pagina administratoris optiones mutare et inspicere potes. Auxilia in pagina [[doku>config|conformationis]] sunt, si singulas res uidere uis, i ad paginam [[doku>plugin:config|conformationis]].
Optiones ostensae rubro colore tutae et non nunc mutabiles sunt. Optiones ostensae caeruleo colore praecipuae sunt et optiones ostensae in area alba singulares huic uici sunt. Et caerulae et albae optiones mutabiles sunt.
diff --git a/lib/plugins/config/lang/la/lang.php b/lib/plugins/config/lang/la/lang.php
index ca0eb1c31..07d92ae36 100644
--- a/lib/plugins/config/lang/la/lang.php
+++ b/lib/plugins/config/lang/la/lang.php
@@ -2,6 +2,7 @@
/**
* Latin language file
*
+ * @author Massimiliano Vassalli <vassalli.max@gmail.com>
*/
$lang['menu'] = 'Optiones Administrationis';
$lang['error'] = 'Optiones non nouatae ob errores: rursum temptat. Errores rubro colore signati sunt.';
@@ -9,17 +10,17 @@ $lang['updated'] = 'Optiones feliciter nouatae.';
$lang['nochoice'] = '(nulla optio est)';
$lang['locked'] = 'Optio documenti non nouata est, <br/> optiones et facultates documenti inspicis.';
$lang['danger'] = 'CAVE: si has optiones mutabis, in administrationis indicem non inire potes.';
-$lang['warning'] = 'CAVE: si hae optiones mutantur, graues errores erunt.';
-$lang['security'] = 'CAVE: si hae optiones mutantur, graues errores erunt.';
-$lang['_configuration_manager'] = 'Administrationis Administrator';
+$lang['warning'] = 'CAVE: si hae optiones mutabis, graues errores erunt.';
+$lang['security'] = 'CAVE: si hae optiones mutabis, graues errores erunt.';
+$lang['_configuration_manager'] = 'Optionum administratio';
$lang['_header_dokuwiki'] = 'Vicis Optiones';
$lang['_header_plugin'] = 'Addendorum Optiones';
$lang['_header_template'] = 'Vicis Formae Optiones';
$lang['_header_undefined'] = 'Variae Optiones';
-$lang['_basic'] = 'Fundamenti Optiones';
-$lang['_display'] = 'Visiuae Optiones';
+$lang['_basic'] = 'Praecipuae Optiones';
+$lang['_display'] = 'Speciei Optiones';
$lang['_authentication'] = 'Confirmationis Optiones';
-$lang['_anti_spam'] = 'Malorum Optiones';
+$lang['_anti_spam'] = 'In Mala Optiones';
$lang['_editing'] = 'Recensendi Optiones';
$lang['_links'] = 'Nexi Optiones';
$lang['_media'] = 'Visiuorum Optiones';
@@ -70,7 +71,7 @@ $lang['autopasswd'] = 'Tessera machinatione generata';
$lang['authtype'] = 'Confirmationis finis';
$lang['passcrypt'] = 'Ratio tesserae tuendae';
$lang['defaultgroup'] = 'Grex communis';
-$lang['superuser'] = 'Magister\stra - grex, Sodalis uel index diuisus a uigulis sodalis1,@grex,sodalis2 cum plenis facultatibus sine AAA optionum termino';
+$lang['superuser'] = 'Magister\stra - grex, Sodalis uel index diuisus a uigulis sodalis1,@grex,sodalis2 cum plenis facultatibus sine ICA optionum termino';
$lang['manager'] = 'Administrator - grex, Sodalis uel index diuisus a uigulis sodalis1,@grex,sodalis2 cum certis facultatibus';
$lang['profileconfirm'] = 'Mutationes tessera confirmanda sunt';
$lang['disableactions'] = 'Vicis actiones ineptas facere';
@@ -78,14 +79,14 @@ $lang['disableactions_check'] = 'Inspicere';
$lang['disableactions_subscription'] = 'Inscribe/Delere';
$lang['disableactions_wikicode'] = 'Fontem uidere/Rudem transcribere';
$lang['disableactions_other'] = 'Aliae actiones (uirgulis diuisae)';
-$lang['sneaky_index'] = 'Hic uicis omnes spatia nomini in indice inserit. Si ineptam hanc optionem facias, solum ea spatia, quae Sodales uidere possunt, in indice erunt. Hoc suggreges et subspatia abscondere potest.';
+$lang['sneaky_index'] = 'Hic uicis omnia genera in indice inserit. Si ineptam hanc optionem facias, solum ea, quae Sodales uidere possunt, in indice erunt. Hoc suggreges et suggenera abscondere potest.';
$lang['auth_security_timeout'] = 'Confirmationis Tempus (secundis)';
$lang['securecookie'] = 'Formulae HTTPS mittine solum per HTTPS possunt? Ineptam hanc optio facias, si accessus uicis tutus est, sed interretis non.';
$lang['xmlrpc'] = 'Aptam\Ineptam XML-RPC administrationem facere';
$lang['xmlrpcuser'] = 'Accessus XML-RPC gregibus uel Sodalibus in hoc indice astringere. Nihil scribere ut omnes accessum habeant';
-$lang['updatecheck'] = 'Nouationes et fiducias inspicerene? Hic uicis connectere splitbrain.org debes.';
+$lang['updatecheck'] = 'Nouationes et fiducias inspicerene? Hic uicis connectere update.dokuwiki.org debes.';
$lang['userewrite'] = 'VRL formosis uti';
-$lang['useslash'] = 'Repagula ut spatium nominis diuidas uti';
+$lang['useslash'] = 'Repagula in URL, ut genera diuidas, uti';
$lang['usedraft'] = 'Propositum in recensione machinatione seruatur';
$lang['sepchar'] = 'Signum, quod paginas diuidit';
$lang['canonical'] = 'VRL perfecto uti';
@@ -99,7 +100,7 @@ $lang['notify'] = 'Adnotationis mutationes ad hunc cursum mittere
$lang['registernotify'] = 'De nouis Sodalibus ad hunc cursum notas mittere';
$lang['mailfrom'] = 'Cursus interretialis, quo in cursibus uti';
$lang['gzip_output'] = 'gzip Argumentum-Codificans xhtml uti';
-$lang['gdlib'] = 'GD Lib uersio';
+$lang['gdlib'] = 'GD Lib forma';
$lang['im_convert'] = 'Domicilium machinae ImageMagick\'s';
$lang['jpg_quality'] = 'JPG compressio colorum (0-100)';
$lang['subscribers'] = 'Inscriptionis paginarum auxilium aptus facere';
@@ -148,7 +149,7 @@ $lang['deaccent_o_0'] = 'ex';
$lang['deaccent_o_1'] = 'accentum tollere';
$lang['deaccent_o_2'] = 'Latinis litteris';
$lang['gdlib_o_0'] = 'GD Lib inepta';
-$lang['gdlib_o_1'] = 'Versio 1.x';
+$lang['gdlib_o_1'] = 'Forma 1.x';
$lang['gdlib_o_2'] = 'Machinatione inspicere';
$lang['rss_type_o_rss'] = 'RSS 0.91';
$lang['rss_type_o_rss1'] = 'RSS 1.0';
diff --git a/lib/plugins/config/lang/lv/lang.php b/lib/plugins/config/lang/lv/lang.php
index 64c828f77..2f5883269 100644
--- a/lib/plugins/config/lang/lv/lang.php
+++ b/lib/plugins/config/lang/lv/lang.php
@@ -86,7 +86,7 @@ $lang['auth_security_timeout'] = 'Autorizācijas drošības intervāls (sekundē
$lang['securecookie'] = 'Vai pa HTTPS sūtāmās sīkdatnes sūtīt tikai pa HTTPS? Atslēdz šo iespēju, kad tikai pieteikšanās wiki sistēmā notiek pa SSL šifrētu savienojumu, bet skatīšana - pa nešifrētu.';
$lang['xmlrpc'] = 'Ieslēgt/izslēgt XML-RPC interfeisu.';
$lang['xmlrpcuser'] = 'Ierobežot XML-RPC piekļuvi norādītām lietotāju grupām vai lietotājiem (atdalīt ar komatiem!). Atstāt tukšu, lai piekļuve būtu visiem.';
-$lang['updatecheck'] = 'Pārbaudīt, vai pieejami atjauninājumi un drošības brīdinājumi? Dokuwiki sazināsies ar splitbrain.org';
+$lang['updatecheck'] = 'Pārbaudīt, vai pieejami atjauninājumi un drošības brīdinājumi? Dokuwiki sazināsies ar update.dokuwiki.org';
$lang['userewrite'] = 'Ērti lasāmas adreses (URL)';
$lang['useslash'] = 'Lietot slīpiņu par URL atdalītāju';
$lang['usedraft'] = 'Labojot automātiski saglabāt melnrakstu';
@@ -101,6 +101,7 @@ $lang['fetchsize'] = 'Maksimālais faila apjoms baitos, ko fetch.php
$lang['notify'] = 'Nosūtīt izmaiņu paziņojumu uz epasta adresi';
$lang['registernotify'] = 'Nosūtīt paziņojumu par jauniem lietotājiem uz epasta adresi';
$lang['mailfrom'] = 'Epasta adrese automātiskajiem paziņojumiem';
+$lang['mailprefix'] = 'E-pasta temata prefikss automātiskajiem paziņojumiem';
$lang['gzip_output'] = 'Lietot gzip Content-Encoding priekš xhtml';
$lang['gdlib'] = 'GD Lib versija';
$lang['im_convert'] = 'Ceļš uz ImageMagick convert rīku';
diff --git a/lib/plugins/config/lang/mr/lang.php b/lib/plugins/config/lang/mr/lang.php
index 79e8ea426..321e05546 100644
--- a/lib/plugins/config/lang/mr/lang.php
+++ b/lib/plugins/config/lang/mr/lang.php
@@ -88,7 +88,7 @@ $lang['auth_security_timeout'] = 'अधिकृत करण्याच्य
$lang['securecookie'] = 'HTTPS वापरून सेट केलेले कूकीज ब्राउजरने HTTPS द्वाराच पाठवले पाहिजेत का? जर तुमच्या विकीचं फ़क्त लॉगिन पानच SSL वापरून सुरक्षित केलं असेल व पानांचं ब्राउजिंग असुरक्षित असेल तर हा पर्याय चालू करू नका.';
$lang['xmlrpc'] = 'XML-RPC इंटरफेस चालू/बंद करा';
$lang['xmlrpcuser'] = 'XML-RPC सुविधा फ़क्त इथे स्वल्पविरामाने अलग करून दिलेल्या गट किंवा वापरकर्त्याला उपलब्ध आहेत. सर्वाना ही सुविधा देण्यासाठी ही जागा रिकामी सोडा.';
-$lang['updatecheck'] = 'अपडेट आणि सुरक्षिततेविशयी सूचनान्वर पाळत ठेऊ का? या सुविधेसाठी डॉक्युविकीला splitbrain.org शी संपर्क साधावा लागेल.';
+$lang['updatecheck'] = 'अपडेट आणि सुरक्षिततेविशयी सूचनान्वर पाळत ठेऊ का? या सुविधेसाठी डॉक्युविकीला update.dokuwiki.org शी संपर्क साधावा लागेल.';
$lang['userewrite'] = 'छान छान URL वापर';
$lang['useslash'] = 'URL मधे नेमस्पेस अलग करण्यासाठी \'/\' चिह्न वापरा';
$lang['usedraft'] = 'संपादन करताना मसुदा आपोआप सुरक्षित करा';
diff --git a/lib/plugins/config/lang/nl/lang.php b/lib/plugins/config/lang/nl/lang.php
index a9e0d935f..bf1ce46c1 100644
--- a/lib/plugins/config/lang/nl/lang.php
+++ b/lib/plugins/config/lang/nl/lang.php
@@ -94,7 +94,7 @@ $lang['auth_security_timeout'] = 'Authenticatiebeveiligings-timeout (seconden)';
$lang['securecookie'] = 'Moeten cookies die via HTTPS gezet zijn alleen via HTTPS verzonden worden door de browser? Zet deze optie uit als alleen het inloggen op de wiki beveiligd is, maar het gebruik verder niet.';
$lang['xmlrpc'] = 'Inschakelen/uitschakelen XML-RPC interface.';
$lang['xmlrpcuser'] = 'Beperk XML-RPC toegang tot de lijst met kommagescheiden groepen of gebruikers die hier zijn opgegeven. Laat leeg om iedereen toegang te geven.';
-$lang['updatecheck'] = 'Controleer op nieuwe versies en beveiligingswaarschuwingen? DokuWiki moet hiervoor contact opnemen met splitbrain.org.';
+$lang['updatecheck'] = 'Controleer op nieuwe versies en beveiligingswaarschuwingen? DokuWiki moet hiervoor contact opnemen met update.dokuwiki.org.';
$lang['userewrite'] = 'Gebruik nette URL\'s';
$lang['useslash'] = 'Gebruik slash (/) als scheiding tussen namepaces in URL\'s';
$lang['usedraft'] = 'Sla automatisch een concept op tijdens het wijzigen';
@@ -109,6 +109,7 @@ $lang['fetchsize'] = 'Maximum grootte (bytes) die fetch.php mag down
$lang['notify'] = 'Stuur e-mailnotificaties naar dit adres';
$lang['registernotify'] = 'Stuur informatie over nieuw aangemelde gebruikers naar dit e-mailadres';
$lang['mailfrom'] = 'E-mailadres voor automatische e-mail';
+$lang['mailprefix'] = 'Te gebruiken voorvoegsel voor onderwerp automatische email';
$lang['gzip_output'] = 'Gebruik gzip Content-Encoding voor xhtml';
$lang['gdlib'] = 'Versie GD Lib ';
$lang['im_convert'] = 'Path naar ImageMagick\'s convert tool';
diff --git a/lib/plugins/config/lang/no/lang.php b/lib/plugins/config/lang/no/lang.php
index 4529b55fe..6ac765cbf 100644
--- a/lib/plugins/config/lang/no/lang.php
+++ b/lib/plugins/config/lang/no/lang.php
@@ -12,6 +12,7 @@
* @author Lisa Ditlefsen <lisa@vervesearch.com>
* @author Erik Pedersen <erik.pedersen@shaw.ca>
* @author Erik Bjørn Pedersen <erik.pedersen@shaw.ca>
+ * @author Rune Rasmussen syntaxerror.no@gmail.com
*/
$lang['menu'] = 'Konfigurasjonsinnstillinger';
$lang['error'] = 'Innstillingene ble ikke oppdatert på grunn av en eller flere ugyldig verdier. Vennligst se gjennom endringene og prøv på nytt.
@@ -99,7 +100,7 @@ $lang['securecookie'] = 'Skal informasjonskapsler satt via HTTPS kun se
$lang['xmlrpc'] = 'Slå på/slå av XML-RPC-grensesnitt';
$lang['xmlrpcuser'] = 'Å tillate XML-RPC-adgang til bestemte grupper eller brukere, sette deres navne (kommaseparert) her. Slik får du tilgang til alle, la feltet tomt.
';
-$lang['updatecheck'] = 'Se etter oppdateringer og sikkerhetsadvarsler? Denne funksjonen er avhengig av å kontakte splitbrain.org.';
+$lang['updatecheck'] = 'Se etter oppdateringer og sikkerhetsadvarsler? Denne funksjonen er avhengig av å kontakte update.dokuwiki.org.';
$lang['userewrite'] = 'Bruk pene URLer';
$lang['useslash'] = 'Bruk / som skilletegn mellom navnerom i URLer';
$lang['usedraft'] = 'Lagre kladd automatisk under redigering';
diff --git a/lib/plugins/config/lang/pl/lang.php b/lib/plugins/config/lang/pl/lang.php
index 88cd0f72b..c051e9e13 100644
--- a/lib/plugins/config/lang/pl/lang.php
+++ b/lib/plugins/config/lang/pl/lang.php
@@ -93,7 +93,7 @@ $lang['auth_security_timeout'] = 'Czas wygaśnięcia uwierzytelnienia (w sekunda
$lang['securecookie'] = 'Czy ciasteczka wysłane do przeglądarki przez HTTPS powinny być przez nią odsyłane też tylko przez HTTPS? Odznacz tę opcję tylko wtedy, gdy logowanie użytkowników jest zabezpieczone SSL, ale przeglądanie stron odbywa się bez zabezpieczenia.';
$lang['xmlrpc'] = 'Włącz/wyłącz interfejs XML-RPC';
$lang['xmlrpcuser'] = 'Lista użytkowników i grup, którzy mogą korzystać z protokołu XML-RPC. Nazwy grup i użytkowników rozdziel przecinkami, puste pole oznacza dostęp dla wszystkich.';
-$lang['updatecheck'] = 'Sprawdzanie aktualizacji i bezpieczeństwa. DokuWiki będzie kontaktować się z serwerem splitbrain.org.';
+$lang['updatecheck'] = 'Sprawdzanie aktualizacji i bezpieczeństwa. DokuWiki będzie kontaktować się z serwerem update.dokuwiki.org.';
$lang['userewrite'] = 'Proste adresy URL';
$lang['useslash'] = 'Używanie ukośnika jako separatora w adresie URL';
$lang['usedraft'] = 'Automatyczne zapisywanie szkicu podczas edycji';
diff --git a/lib/plugins/config/lang/pt-br/lang.php b/lib/plugins/config/lang/pt-br/lang.php
index 222123876..9e5798e30 100644
--- a/lib/plugins/config/lang/pt-br/lang.php
+++ b/lib/plugins/config/lang/pt-br/lang.php
@@ -91,7 +91,7 @@ $lang['profileconfirm'] = 'Confirmar mudanças no perfil com a senha';
$lang['disableactions'] = 'Desabilitar as ações do DokuWiki';
$lang['disableactions_check'] = 'Verificação';
$lang['disableactions_subscription'] = 'Monitoramento';
-$lang['disableactions_wikicode'] = 'Visualização da fonte/Exportação sem processamento';
+$lang['disableactions_wikicode'] = 'Ver a fonte/Exportar sem processamento';
$lang['disableactions_other'] = 'Outras ações (separadas por vírgula)';
$lang['sneaky_index'] = 'Por padrão, o DokuWiki irá exibir todos os espaços de nomes na visualização do índice. Ao habilitar essa opção, serão escondidos aqueles que o usuário não tiver permissão de leitura. Isso pode resultar na omissão de subespaços de nomes, tornando o índice inútil para certas configurações de ACL.';
$lang['auth_security_timeout'] = 'Tempo limite de segurança para autenticações (seg)';
@@ -113,12 +113,13 @@ $lang['fetchsize'] = 'Tamanho máximo (em bytes) que o "fetch.php" p
$lang['notify'] = 'Enviar notificações de mudança para esse endereço de e-mail';
$lang['registernotify'] = 'Enviar informações de usuários registrados para esse endereço de e-mail';
$lang['mailfrom'] = 'Endereço de e-mail a ser utilizado para mensagens automáticas';
+$lang['mailprefix'] = 'Prefixo do assunto dos e-mails de envio automático';
$lang['gzip_output'] = 'Usar "Content-Encoding" do gzip para o código xhtml';
$lang['gdlib'] = 'Versão da biblioteca "GD Lib"';
$lang['im_convert'] = 'Caminho para a ferramenta de conversão ImageMagick';
$lang['jpg_quality'] = 'Qualidade de compressão do JPG (0-100)';
-$lang['subscribers'] = 'Habilitar o suporte a monitoramento de páginas';
-$lang['subscribe_time'] = 'Tempo de envio que as listas de inscrições serão enviadas (segundos); Este tempo deve ser menor que o tempo especificado em mudanças recentes.';
+$lang['subscribers'] = 'Habilitar o suporte ao monitoramento de páginas';
+$lang['subscribe_time'] = 'Tempo de espera antes do envio das listas e mensagens de monitoramento (segundos); este tempo deve ser menor que o especificado no parâmetro recent_days';
$lang['compress'] = 'Compactar as saídas de CSS e JavaScript';
$lang['hidepages'] = 'Esconder páginas correspondentes (expressão regular)';
$lang['send404'] = 'Enviar "HTTP 404/Página não encontrada" para páginas não existentes';
diff --git a/lib/plugins/config/lang/pt/lang.php b/lib/plugins/config/lang/pt/lang.php
index 336de5b36..f4382aa94 100644
--- a/lib/plugins/config/lang/pt/lang.php
+++ b/lib/plugins/config/lang/pt/lang.php
@@ -6,6 +6,7 @@
* @author Enrico Nicoletto <liverig@gmail.com>
* @author Fil <fil@meteopt.com>
* @author André Neves <drakferion@gmail.com>
+ * @author José Campos zecarlosdecampos@gmail.com
*/
$lang['menu'] = 'Configuração';
$lang['error'] = 'Parâmetros de Configuração não actualizados devido a valores inválidos. Por favor, reveja as modificações que pretende efectuar antes de re-submetê-las.<br /> Os valores incorrectos serão mostrados dentro de uma "moldura" vermelha.';
@@ -103,6 +104,7 @@ $lang['fetchsize'] = 'Tamanho máximo (bytes) que o fetch.php pode t
$lang['notify'] = 'Enviar notificações de mudanças para este endereço de email';
$lang['registernotify'] = 'Enviar informações de utilizadores registados para este endereço de email';
$lang['mailfrom'] = 'Endereço de email a ser utilizado para mensagens automáticas';
+$lang['mailprefix'] = 'Prefixo de email a ser utilizado para mensagens automáticas';
$lang['gzip_output'] = 'Usar "Content-Encoding" do gzip para o código xhtml';
$lang['gdlib'] = 'Versão GD Lib';
$lang['im_convert'] = 'Caminho para a ferramenta "convert" do ImageMagick';
@@ -110,6 +112,7 @@ $lang['jpg_quality'] = 'Compressão/Qualidade JPG (0-100)';
$lang['subscribers'] = 'Habilitar o suporte a subscrição de páginas ';
$lang['subscribe_time'] = 'Tempo após o qual as listas de subscrição e "digests" são enviados (seg.); Isto deve ser inferior ao tempo especificado em recent_days.';
$lang['compress'] = 'Compactar as saídas de CSS e JavaScript';
+$lang['cssdatauri'] = 'Tamanho em bytes até ao qual as imagens referenciadas em ficheiros CSS devem ser embutidas diretamente no CSS para reduzir a carga de pedidos HTTP extra. Esta técnica não funciona em IE < 8! <code>400</code> a <code>600</code> bytes é um bom valor. Escolher <code>0</code> para desativar.';
$lang['hidepages'] = 'Esconder páginas correspondentes (expressões regulares)';
$lang['send404'] = 'Enviar "HTTP 404/Página não encontrada" para páginas não existentes';
$lang['sitemap'] = 'Gerar Sitemap Google (dias)';
diff --git a/lib/plugins/config/lang/ro/lang.php b/lib/plugins/config/lang/ro/lang.php
index 7eb22c341..8ea923913 100644
--- a/lib/plugins/config/lang/ro/lang.php
+++ b/lib/plugins/config/lang/ro/lang.php
@@ -89,7 +89,7 @@ $lang['auth_security_timeout'] = 'Timpul de expirare al Autentificării Securiza
$lang['securecookie'] = 'Cookies-urile setate via HTTPS să fie trimise doar via HTTPS de către browser? Dezactivaţi această opţiune numai când login-ul wiki-ului este securizat cu SSL dar navigarea wiki-ului se realizează nesecurizat.';
$lang['xmlrpc'] = 'Activează/dezactivează interfaţa XML-RPC';
$lang['xmlrpcuser'] = 'Restricţionaţi accesul XML-RPC la grupurile sau utilizatorii separaţi prin virgulă daţi aici. Lasaţi gol pentru a da acces tuturor.';
-$lang['updatecheck'] = 'Verificare actualizări şi avertismente privind securitatea? DokuWiki trebuie să contacteze splitbrain.org pentru această facilitate.';
+$lang['updatecheck'] = 'Verificare actualizări şi avertismente privind securitatea? DokuWiki trebuie să contacteze update.dokuwiki.org pentru această facilitate.';
$lang['userewrite'] = 'Folosire URL-uri "nice"';
$lang['useslash'] = 'Foloseşte slash-ul ca separator de spaţii de nume în URL-uri';
$lang['usedraft'] = 'Salvează automat o schiţă în timpul editării';
@@ -104,6 +104,7 @@ $lang['fetchsize'] = 'Dimensiunea maximă (byte) pe care fetch.php p
$lang['notify'] = 'Trimite notificări privind modificările pe această adresă de email';
$lang['registernotify'] = 'Trimite informare noilor utilizatori înregistraţi pe această adresă de email';
$lang['mailfrom'] = 'Adresa de email utilizată pentru mailuri automate';
+$lang['mailprefix'] = 'Prefix subiect e-mail de folosit pentru mail-uri automate';
$lang['gzip_output'] = 'Foloseşte gzip pentru codarea conţinutului xhtml';
$lang['gdlib'] = 'Versiunea GD Lib';
$lang['im_convert'] = 'Calea către instrumentul de conversie ImageMagick';
@@ -136,6 +137,7 @@ $lang['proxy____port'] = 'Port Proxy';
$lang['proxy____user'] = 'Nume utilizator Proxy';
$lang['proxy____pass'] = 'Parolă Proxy';
$lang['proxy____ssl'] = 'Foloseşte SSL pentru conectare la Proxy';
+$lang['proxy____except'] = 'Expresie regulară de potrivit cu URL-uri pentru care proxy-ul trebuie păsuit.';
$lang['safemodehack'] = 'Activează safemode hack';
$lang['ftp____host'] = 'Server FTP pentru safemode hack';
$lang['ftp____port'] = 'Port FTP pentru safemode hack';
@@ -183,3 +185,4 @@ $lang['useheading_o_0'] = 'Niciodată';
$lang['useheading_o_navigation'] = 'Doar navigare';
$lang['useheading_o_content'] = 'Doar conţinutul Wiki';
$lang['useheading_o_1'] = 'Întotdeauna';
+$lang['readdircache'] = 'Vârsta maximă depozitare readdir (sec)';
diff --git a/lib/plugins/config/lang/ru/intro.txt b/lib/plugins/config/lang/ru/intro.txt
index c66a69e64..a629d9332 100644
--- a/lib/plugins/config/lang/ru/intro.txt
+++ b/lib/plugins/config/lang/ru/intro.txt
@@ -1,9 +1,9 @@
====== Настройки вики ======
-Здесь вы можете изменить настройки вашей «ДокуВики». Для справки по поводу конкретных опций смотрите [[doku>config]]. Дополнительные детали об этом плагине доступны здесь: [[doku>plugin:config]].
+Здесь вы можете изменить настройки своей «ДокуВики». Для справки по поводу конкретных опций смотрите [[doku>config]]. Дополнительные детали об этом плагине доступны здесь: [[doku>plugin:config]].
Настройки, отображаемые на светло-красном фоне, защищены от изменений и не могут быть отредактированы с помощью этого плагина. Голубым фоном отмечены настройки со значениями по умолчанию, а белым фоном — настройки, которые были локально изменены для этой конкретной «ДокуВики». Как голубые, так и белые настройки доступны для изменения.
-Не забудьте нажать кнопку **Сохранить** перед тем, как покинуть эту страницу, иначе все ваши изменения будут потеряны.
+Не забудьте нажать кнопку «**Сохранить**» перед тем, как покинуть эту страницу, иначе все ваши изменения будут потеряны.
diff --git a/lib/plugins/config/lang/ru/lang.php b/lib/plugins/config/lang/ru/lang.php
index 167c54eea..f29257a28 100644
--- a/lib/plugins/config/lang/ru/lang.php
+++ b/lib/plugins/config/lang/ru/lang.php
@@ -14,13 +14,14 @@
* @author Vlad Tsybenko <vlad.development@gmail.com>
* @author Aleksey Osadchiy <rfc@nm.ru>
* @author Aleksandr Selivanov <alexgearbox@gmail.com>
+ * @author Ladyko Andrey <fylh@succexy.spb.ru>
+ * @author Eugene <windy.wanderer@gmail.com>
*/
$lang['menu'] = 'Настройки вики';
-$lang['error'] = 'Настройки не были сохранены из-за ошибки в одном из значений. Пожалуйста, проверьте ваши изменения и попробуйте еще раз.<br />Неправильные значения будут обведены красной рамкой.';
+$lang['error'] = 'Настройки не были сохранены из-за ошибки в одном из значений. Пожалуйста, проверьте свои изменения и попробуйте ещё раз.<br />Неправильные значения будут обведены красной рамкой.';
$lang['updated'] = 'Настройки успешно сохранены.';
$lang['nochoice'] = '(нет других вариантов)';
-$lang['locked'] = 'Файл настройки недоступен для изменения. Если это не специально, <br />
-убедитесь, что файл локальной настройки имеет правильное имя и права доступа.';
+$lang['locked'] = 'Файл настройки недоступен для изменения. Если это не специально, <br />убедитесь, что файл локальной настройки имеет правильное имя и права доступа.';
$lang['danger'] = 'Внимание: изменение этой опции может сделать вашу вики и меню конфигурации недоступными.';
$lang['warning'] = 'Предостережение: изменение этой опции может вызвать непредсказуемое поведение.';
$lang['security'] = 'Предостережение по безопасности: изменение этой опции может вызвать риск, связанный с безопасностью.';
@@ -63,7 +64,7 @@ $lang['phpok'] = 'Разрешить PHP';
$lang['dformat'] = 'Формат даты и времени';
$lang['signature'] = 'Шаблон подписи';
$lang['toptoclevel'] = 'Мин. уровень в содержании';
-$lang['tocminheads'] = 'Минимальное количество заголовков, при котором будет составлено содержание';
+$lang['tocminheads'] = 'Мин. количество заголовков, при котором будет составлено содержание';
$lang['maxtoclevel'] = 'Макс. уровень в содержании';
$lang['maxseclevel'] = 'Макс. уровень для правки';
$lang['camelcase'] = 'Использовать ВикиРегистр для ссылок';
@@ -84,22 +85,22 @@ $lang['authtype'] = 'Механизм аутентификации'
$lang['passcrypt'] = 'Метод шифрования пароля';
$lang['defaultgroup'] = 'Группа по умолчанию';
$lang['superuser'] = 'Суперпользователь — группа или пользователь с полным доступом ко всем страницам и функциям администрирования, независимо от установок ACL. Перечень разделяйте запятыми: user1,@group1,user2';
-$lang['manager'] = 'Менеджер — группа или пользователь с доступом к определенным функциям управления. Перечень разделяйте запятыми: user1,@group1,user2';
+$lang['manager'] = 'Менеджер — группа или пользователь с доступом к определённым функциям управления. Перечень разделяйте запятыми: user1,@group1,user2';
$lang['profileconfirm'] = 'Пароль для изменения профиля';
$lang['disableactions'] = 'Заблокировать операции «ДокуВики»';
$lang['disableactions_check'] = 'Проверка';
$lang['disableactions_subscription'] = 'Подписка/Отмена подписки';
$lang['disableactions_wikicode'] = 'Показ/экспорт исходного текста';
$lang['disableactions_other'] = 'Другие операции (через запятую)';
-$lang['sneaky_index'] = 'По умолчанию, «ДокуВики» показывает в индексе страниц все пространства имен. Включение этой опции скроет пространства имен, для которых пользователь не имеет прав чтения. Это может привести к скрытию доступных вложенных пространств имен и потере функциональности индекса страниц при некоторых конфигурациях прав доступа.';
+$lang['sneaky_index'] = 'По умолчанию, «ДокуВики» показывает в индексе страниц все пространства имён. Включение этой опции скроет пространства имён, для которых пользователь не имеет прав чтения. Это может привести к скрытию доступных вложенных пространств имён и потере функциональности индекса страниц при некоторых конфигурациях прав доступа.';
$lang['auth_security_timeout'] = 'Интервал для безопасности авторизации (сек.)';
$lang['securecookie'] = 'Должны ли куки (cookies), выставленные через HTTPS, отправляться браузером только через HTTPS. Отключите эту опцию в случае, когда только логин вашей вики передаётся через SSL, а обычный просмотр осуществляется в небезопасном режиме.';
$lang['xmlrpc'] = 'Включить/выключить XML-RPC интерфейс.';
-$lang['xmlrpcuser'] = 'Запретить XML-RPC доступ для списка групп и пользователей, перечисленных через запятую. Оставьте пустым, если хотите оставить доступ всем.';
-$lang['updatecheck'] = 'Проверять наличие обновлений и предупреждений о безопасности? Для этого «ДокуВики» потребуется связываться со <a href="http://www.splitbrain.org/">splitbrain.org</a>.';
+$lang['xmlrpcuser'] = 'Запретить XML-RPC-доступ для списка групп и пользователей, перечисленных через запятую. Оставьте пустым, если хотите оставить доступ всем.';
+$lang['updatecheck'] = 'Проверять наличие обновлений и предупреждений о безопасности? Для этого «ДокуВики» потребуется связываться с сайтом <a href="http://www.splitbrain.org/">splitbrain.org</a>.';
$lang['userewrite'] = 'Удобочитаемые адреса (URL)';
$lang['useslash'] = 'Использовать слэш';
-$lang['usedraft'] = 'Автоматически сохранять черновик в время правки';
+$lang['usedraft'] = 'Автоматически сохранять черновик во время правки';
$lang['sepchar'] = 'Разделитель слов в имени страницы';
$lang['canonical'] = 'Полные канонические адреса (URL)';
$lang['fnencode'] = 'Метод кодирования имён файлов, записанных не ASCII-символами.';
@@ -111,18 +112,19 @@ $lang['fetchsize'] = 'Максимальный размер файл
$lang['notify'] = 'Электронный адрес для извещений';
$lang['registernotify'] = 'Посылать информацию о новых зарегистрированных пользователях на этот электронный адрес';
$lang['mailfrom'] = 'Электронный адрес вики (От:)';
+$lang['mailprefix'] = 'Префикс используемый для автоматического письма станет темой сообщений';
$lang['gzip_output'] = 'Использовать gzip-сжатие для xhtml';
$lang['gdlib'] = 'Версия LibGD';
$lang['im_convert'] = 'Путь к ImageMagick';
-$lang['jpg_quality'] = 'Качество сжатия JPG (0–100). Значение о умолчнию — 70.';
+$lang['jpg_quality'] = 'Качество сжатия JPG (0–100). Значение по умолчанию — 70.';
$lang['subscribers'] = 'Разрешить подписку на изменения';
-$lang['subscribe_time'] = 'Интервал рассылки подписок и сводок (сек.); Должен быть меньше, чем значение, указанное в recent_days.';
+$lang['subscribe_time'] = 'Интервал рассылки подписок и сводок (сек.). Должен быть меньше, чем значение, указанное в recent_days.';
$lang['compress'] = 'Сжимать файлы CSS и javascript';
$lang['hidepages'] = 'Скрыть страницы (рег. выражение)';
$lang['send404'] = 'Посылать «HTTP404/Page Not Found»';
$lang['sitemap'] = 'Число дней, через которое нужно создавать (обновлять) карту сайта для поисковиков (Гугл, Яндекс и др.)';
$lang['broken_iua'] = 'Возможно, функция ignore_user_abort не работает в вашей системе? Это может привести к потере функциональности индексирования поиска. Эта проблема присутствует, например, в IIS+PHP/CGI. Для дополнительной информации смотрите <a href="http://bugs.splitbrain.org/?do=details&amp;task_id=852">баг 852</a>.';
-$lang['xsendfile'] = 'Используете заголовок X-Sendfile для загрузки файлов на вебсервер? Ваш вебсервер должен поддерживать это.';
+$lang['xsendfile'] = 'Используете заголовок X-Sendfile для загрузки файлов на веб-сервер? Ваш веб-сервер должен поддерживать это.';
$lang['renderer_xhtml'] = 'Обработчик основного (xhtml) вывода вики';
$lang['renderer__core'] = '%s (ядро dokuwiki)';
$lang['renderer__plugin'] = '%s (плагин)';
@@ -138,18 +140,18 @@ $lang['target____interwiki'] = 'target для ссылок между вики
$lang['target____extern'] = 'target для внешних ссылок';
$lang['target____media'] = 'target для ссылок на медиафайлы';
$lang['target____windows'] = 'target для ссылок на сетевые каталоги';
-$lang['proxy____host'] = 'proxy - адрес';
-$lang['proxy____port'] = 'proxy - порт';
-$lang['proxy____user'] = 'proxy - имя пользователя';
-$lang['proxy____pass'] = 'proxy - пароль';
-$lang['proxy____ssl'] = 'proxy - ssl';
+$lang['proxy____host'] = 'proxy-адрес';
+$lang['proxy____port'] = 'proxy-порт';
+$lang['proxy____user'] = 'proxy-имя пользователя';
+$lang['proxy____pass'] = 'proxy-пароль';
+$lang['proxy____ssl'] = 'proxy-ssl';
$lang['proxy____except'] = 'Регулярное выражение для адресов (URL), для которых прокси должен быть пропущен.';
$lang['safemodehack'] = 'Включить обход safemode (хак)';
-$lang['ftp____host'] = 'ftp - адрес';
-$lang['ftp____port'] = 'ftp - порт';
-$lang['ftp____user'] = 'ftp - имя пользователя';
-$lang['ftp____pass'] = 'ftp - пароль';
-$lang['ftp____root'] = 'ftp - корневая директория';
+$lang['ftp____host'] = 'ftp-адрес';
+$lang['ftp____port'] = 'ftp-порт';
+$lang['ftp____user'] = 'ftp-имя пользователя';
+$lang['ftp____pass'] = 'ftp-пароль';
+$lang['ftp____root'] = 'ftp-корневая директория';
$lang['license_o_'] = 'Не выбрано';
$lang['typography_o_0'] = 'нет';
$lang['typography_o_1'] = 'Только двойные кавычки';
@@ -185,10 +187,10 @@ $lang['xsendfile_o_2'] = 'Стандартный заголовок X-Se
$lang['xsendfile_o_3'] = 'Проприетарный заголовок Nginx X-Accel-Redirect';
$lang['showuseras_o_loginname'] = 'Логин';
$lang['showuseras_o_username'] = 'Полное имя пользователя';
-$lang['showuseras_o_email'] = 'Адрес электронной почты пользователя (зашифрован согласно настройкам mailguard)';
-$lang['showuseras_o_email_link'] = 'Адрес электронной почты пользователя в виде ссылки mailto:';
+$lang['showuseras_o_email'] = 'Адрес электропочты в шифрованном виде (см. mailguard)';
+$lang['showuseras_o_email_link'] = 'Адрес электропочты в виде ссылки mailto:';
$lang['useheading_o_0'] = 'Никогда';
$lang['useheading_o_navigation'] = 'Только навигация';
$lang['useheading_o_content'] = 'Только содержимое вики';
$lang['useheading_o_1'] = 'Всегда';
-$lang['readdircache'] = 'Максимальное время жизни кэша readdir (сек)';
+$lang['readdircache'] = 'Максимальное время жизни кэша readdir (сек.)';
diff --git a/lib/plugins/config/lang/sk/lang.php b/lib/plugins/config/lang/sk/lang.php
index ad1ab110f..79f54dc4d 100644
--- a/lib/plugins/config/lang/sk/lang.php
+++ b/lib/plugins/config/lang/sk/lang.php
@@ -87,7 +87,7 @@ $lang['auth_security_timeout'] = 'Časový limit pri prihlasovaní (v sekundách
$lang['securecookie'] = 'Mal by prehliadač posielať cookies nastavené cez HTTPS posielať iba cez HTTPS (bezpečné) pripojenie? Vypnite túto voľbu iba v prípade, ak je prihlasovanie do Vašej wiki zabezpečené SSL, ale prezeranie wiki je nezabezpečené.';
$lang['xmlrpc'] = 'Povoliť/zakázať XML-RPC rozhranie.';
$lang['xmlrpcuser'] = 'Obmedziť XML-RPC prístup iba pre uvedené skupiny alebo používateľov (oddelených čiarkami).';
-$lang['updatecheck'] = 'Kontrolovať aktualizácie a bezpečnostné upozornenia? DokuWiki potrebuje pre túto funkciu prístup k splitbrain.org.';
+$lang['updatecheck'] = 'Kontrolovať aktualizácie a bezpečnostné upozornenia? DokuWiki potrebuje pre túto funkciu prístup k update.dokuwiki.org.';
$lang['userewrite'] = 'Používať nice URLs';
$lang['useslash'] = 'Používať lomku (/) ako oddeľovač v URL';
$lang['usedraft'] = 'Automaticky ukladať koncept počas úpravy stránky';
@@ -102,6 +102,7 @@ $lang['fetchsize'] = 'Maximálna veľkosť (v bajtoch) pri sťahovan
$lang['notify'] = 'Posielať upozornenia na zmeny na túto e-mailovú adresu';
$lang['registernotify'] = 'Posielať informáciu o nových užívateľoch na túto e-mailovú adresu';
$lang['mailfrom'] = 'E-mailová adresa na automatické e-maily';
+$lang['mailprefix'] = 'Prefix predmetu emailovej spravy zasielanej automaticky';
$lang['gzip_output'] = 'Používať gzip Content-Encoding pre xhtml';
$lang['gdlib'] = 'Verzia GD Lib';
$lang['im_convert'] = 'Cesta k ImageMagick convert tool';
diff --git a/lib/plugins/config/lang/sl/intro.txt b/lib/plugins/config/lang/sl/intro.txt
new file mode 100644
index 000000000..506cd34bd
--- /dev/null
+++ b/lib/plugins/config/lang/sl/intro.txt
@@ -0,0 +1,7 @@
+====== Splošne nastavitve ======
+
+Na tej strani je mogoče spreminjati nastavitve sistema DokuWiki. Pomoč o posameznih nastavitvah je na voljo med [[doku>config|nastavitvami]]. Več podrobnosti o vstavku je na voljo na [[doku>plugin:config|nastavitvami vstavka]].
+
+Nastavitve označene s svetlo rdečim ozadjem so zaščitene in jih s tem vstavkom ni mogoče spreminjati. Nastavitve označene s svetlo modrim ozadjem so privzete vrednosti in nastavitve z belim ozadjem so tiste, ki so bile določene krajevno posebej za to nastavitev. Spreminjati je mogoče vrednosti označene z modrimi in belim ozadjem.
+
+Spremembe je treba **shraniti**, da se uveljavijo, sicer se spremembe prezrejo.
diff --git a/lib/plugins/config/lang/sl/lang.php b/lib/plugins/config/lang/sl/lang.php
index 52b88a053..dadd01595 100644
--- a/lib/plugins/config/lang/sl/lang.php
+++ b/lib/plugins/config/lang/sl/lang.php
@@ -4,21 +4,183 @@
*
* @author Dejan Levec <webphp@gmail.com>
* @author Boštjan Seničar <senicar@gmail.com>
+ * @author Gregor Skumavc (grega.skumavc@gmail.com)
+ * @author Matej Urbančič (mateju@svn.gnome.org)
*/
-$lang['lang'] = 'Jezik';
+
+$lang['menu'] = 'Splošne nastavitve';
+$lang['error'] = 'Nastavitve niso shranjene zaradi neveljavne vrednosti.<br />Neveljavna vrednost je označena z rdečim robom vnosnega polja.';
+$lang['updated'] = 'Nastavitve so uspešno posodobljene.';
+$lang['nochoice'] = '(ni drugih možnosti na voljo)';
+$lang['locked'] = 'Nastavitvene datoteke ni mogoče posodobiti.<br />Preverite dovoljenja za spreminjanje in ime nastavitvene datoteke.';
+$lang['danger'] = 'Opozorilo: spreminjanje te možnosti lahko povzroči težave v delovanju sistema wiki.';
+$lang['warning'] = 'Opozorilo: spreminjanje te možnosti lahko vpliva na pravilno delovanje sistema wiki.';
+$lang['security'] = 'Varnostno opozorilo: spreminjanje te možnosti lahko vpliva na varnost sistema.';
+$lang['_configuration_manager'] = 'Upravljalnik nastavitev';
+$lang['_header_dokuwiki'] = 'Nastavitve DokuWiki';
+$lang['_header_plugin'] = 'Nastavitve vstavkov';
+$lang['_header_template'] = 'Nastavitve predlog';
+$lang['_header_undefined'] = 'Neopredeljene nastavitve';
+$lang['_basic'] = 'Osnovne nastavitve';
+$lang['_display'] = 'Nastavitve prikazovanja';
+$lang['_authentication'] = 'Nastavitve overjanja';
+$lang['_anti_spam'] = 'Nastavitve neželenih sporočil (Anti-Spam)';
+$lang['_editing'] = 'Nastavitve urejanja';
+$lang['_links'] = 'Nastavitve povezav';
+$lang['_media'] = 'Predstavnostne nastavitve';
+$lang['_advanced'] = 'Napredne nastavitve';
+$lang['_network'] = 'Omrežne nastavitve';
+$lang['_plugin_sufix'] = 'nastavitve';
+$lang['_template_sufix'] = 'nastavitve';
+$lang['_msg_setting_undefined'] = 'Ni nastavitvenih metapodatkov.';
+$lang['_msg_setting_no_class'] = 'Ni nastavitvenega razreda.';
+$lang['_msg_setting_no_default'] = 'Ni privzete vrednosti.';
+$lang['fmode'] = 'Način ustvarjanja datotek';
+$lang['dmode'] = 'Način ustvarjanja map';
+$lang['lang'] = 'Jezik vmesnika';
+$lang['basedir'] = 'Pot do strežnika (npr. /dokuwiki/). Prazno polje določa samodejno zaznavanje';
+$lang['baseurl'] = 'Naslov URL strežnika (npr. http://www.streznik.si). Prazno polje določa samodejno zaznavanje';
+$lang['savedir'] = 'Mapa za shranjevanje podatkov';
+$lang['start'] = 'Ime začetne strani wiki';
+$lang['title'] = 'Naslov Wiki spletišča';
$lang['template'] = 'Predloga';
-$lang['recent'] = 'Zadnje spremembe';
+$lang['license'] = 'Pod pogoji katerega dovoljenja je objavljena vsebina?';
+$lang['fullpath'] = 'Pokaži polno pot strani v nogi strani';
+$lang['recent'] = 'Nedavne spremembe';
+$lang['breadcrumbs'] = 'Število drobtinic poti';
+$lang['youarehere'] = 'Hierarhične drobtinice poti';
+$lang['typography'] = 'Omogoči tipografske zamenjave';
+$lang['htmlok'] = 'Dovoli vstavljeno kodo HTML';
+$lang['phpok'] = 'Dovoli vstavljeno kodo PHP';
+$lang['dformat'] = 'Oblika zapisa časa (funkcija PHP <a href="http://www.php.net/strftime">strftime</a>)';
$lang['signature'] = 'Podpis';
+$lang['toptoclevel'] = 'Vrhnja raven kazala';
+$lang['tocminheads'] = 'Najmanjše število naslovov za izgradnjo kazala';
+$lang['maxtoclevel'] = 'Najvišja raven kazala';
+$lang['maxseclevel'] = 'Največja raven urejanja odseka';
+$lang['camelcase'] = 'Uporabi EnoBesedni zapisa za povezave';
+$lang['deaccent'] = 'Počisti imena strani';
+$lang['useheading'] = 'Uporabi prvi naslov za ime strani';
+$lang['refcheck'] = 'Preverjanje sklica predstavnih datotek';
+$lang['refshow'] = 'Število predstavnostnih sklicev za prikaz';
+$lang['allowdebug'] = 'Dovoli razhroščevanje (po potrebi!)';
+$lang['usewordblock'] = 'Zaustavi neželeno besedilo glede na seznam besed';
+$lang['indexdelay'] = 'Časovni zamik pred ustvarjanjem kazala (v sekundah)';
+$lang['relnofollow'] = 'Uporabni možnost rel="nofollow" pri zunanjih povezavah';
+$lang['mailguard'] = 'Šifriraj elektronske naslove';
+$lang['iexssprotect'] = 'Preveri poslane datoteke za zlonamerno kodo JavaScript ali HTML';
+$lang['showuseras'] = 'Kaj prikazati za prikaz uporabnika, ki je zadnji urejal stran';
+$lang['useacl'] = 'Uporabi seznam nadzora dostopa (ACL)';
+$lang['autopasswd'] = 'Samodejno ustvari gesla';
+$lang['authtype'] = 'Ozadnji način overitve';
+$lang['passcrypt'] = 'Način šifriranja gesel';
$lang['defaultgroup'] = 'Privzeta skupina';
+$lang['superuser'] = 'Skrbnik - skupina, uporabnik ali z vejico ločen seznam uporabnik1,@skupina1,uporabnik2 s polnim dostopom do vseh strani in možnosti, neodvisno od nastavitev nadzora dostopa ACL';
+$lang['manager'] = 'Upravljavec - skupina, uporabnik ali z vejico ločen seznam uporabnik1,@skupina1,uporabnik2 z dovoljenji za dostop do nekaterih možnosti upravljanja';
+$lang['profileconfirm'] = 'Potrdi spremembe profila z geslom';
+$lang['disableactions'] = 'Onemogoči dejanja DokuWiki';
$lang['disableactions_check'] = 'Preveri';
-$lang['userewrite'] = 'Uporabi lepše URL naslove';
+$lang['disableactions_subscription'] = 'Naročanje/Preklic naročnine';
+$lang['disableactions_wikicode'] = 'Pogled izvorne kode/Surovi izvoz';
+$lang['disableactions_other'] = 'Druga dejanja (z vejico ločen seznam)';
+$lang['sneaky_index'] = 'Privzeto pokaže sistem DokuWiki vse imenske prostore v pogledu kazala. Z omogočanjem te možnosti bodo skriti vsi imenski prostori, v katere prijavljen uporabnik nima dovoljenj dostopa. S tem je mogoče preprečiti dostop do podrejenih strani. Možnost lahko vpliva na uporabnost nastavitev nadzora dostopa ACL.';
+$lang['auth_security_timeout'] = 'Varnostna časovna omejitev overitve (v sekundah)';
+$lang['securecookie'] = 'Ali naj se piškotki poslani preko varne povezave HTTPS v brskalniku pošiljajo le preko HTTPS? Onemogočanje možnosti je priporočljivo le takrat, ko je prijava varovana s protokolom SSL, brskanje po strani pa ni posebej zavarovano.';
+$lang['xmlrpc'] = 'Omogoči/Onemogoči vmesnik XML-RPC.';
+$lang['xmlrpcuser'] = 'Omejitev dostopa do vmesnika XML-RPC z vejico ločenim seznamom skupin in uporabnikov. Prazno polje pomeni, prost dostop za vse uporabnike.';
+$lang['updatecheck'] = 'Ali naj sistem preveri za posodobitve in varnostna opozorila.';
+$lang['userewrite'] = 'Uporabi olepšan zapis naslovov URL';
+$lang['useslash'] = 'Uporabi poševnico kot ločilnik imenskih prostorov v naslovih URL';
+$lang['usedraft'] = 'Samodejno shrani osnutek med urejanjem strani';
+$lang['sepchar'] = 'Ločilnik besed imen strani';
+$lang['canonical'] = 'Uporabi polni kanonični zapis naslova URL';
+$lang['fnencode'] = 'Način kodiranja ne-ASCII imen datotek.';
+$lang['autoplural'] = 'Preveri množinske oblike povezav';
+$lang['compression'] = 'Način stiskanja za arhivirane datoteke';
+$lang['cachetime'] = 'Največja dovoljena starost predpomnilnika (v sekundah)';
+$lang['locktime'] = 'Največja dovoljena starost datotek zaklepa (v sekundah)';
+$lang['fetchsize'] = 'največja dovoljena velikost zunanjega prejemanja z datoteko fetch.php (v bajtih)';
+$lang['notify'] = 'Pošlji obvestila o spremembah na določen elektronski naslov';
+$lang['registernotify'] = 'Pošlji obvestila o novih vpisanih uporabnikih na določen elektronski naslov';
+$lang['mailfrom'] = 'Elektronski naslov za samodejno poslana sporočila';
+$lang['gzip_output'] = 'Uporabi stiskanje gzip vsebine za xhtml';
+$lang['gdlib'] = 'Različica GD Lib';
+$lang['im_convert'] = 'Pot do orodja za pretvarjanje slik ImageMagick';
+$lang['jpg_quality'] = 'Kakovost stiskanja datotek JPG (0-100)';
+$lang['subscribers'] = 'Omogoči podporo naročanju na strani';
+$lang['subscribe_time'] = 'Čas po katerem so poslani povzetki sprememb (v sekundah); Vrednost mora biti krajša od časa, ki je določen z nedavno_dni.';
+$lang['compress'] = 'Združi odvod CSS in JavaScript v brskalniku';
+$lang['hidepages'] = 'Skrij skladne strani (logični izraz)';
+$lang['send404'] = 'Pošlji "HTTP 404/Strani ni mogoče najti" pri dostopu do neobstoječih strani';
+$lang['sitemap'] = 'Ustvari Google kazalo strani (v dnevih)';
+$lang['broken_iua'] = 'Ali je možnost ignore_user_abort okvarjena na sistemu? Napaka lahko vpliva na delovanje iskalnika. Napake so pogoste ob uporabi IIS+PHP/CGI. Več o tem si je mogoče prebrati v <a href="http://bugs.splitbrain.org/?do=details&amp;task_id=852">poročilu o hrošču 852</a>.';
+$lang['xsendfile'] = 'Uporabi glavo X-Sendfile za prejemanje statičnih datotek. Spletni strežnik mora možnost podpirati.';
+$lang['renderer_xhtml'] = 'Izrisovalnik za odvod Wiki strani (xhtml)';
+$lang['renderer__core'] = '%s (jedro dokuwiki)';
+$lang['renderer__plugin'] = '%s (vstavek)';
+$lang['rememberme'] = 'Dovoli trajne prijavne piškotke (trajno pomnenje prijave)';
+$lang['rss_type'] = 'Vrsta virov XML';
+$lang['rss_linkto'] = 'XML viri so povezani z';
+$lang['rss_content'] = 'Kaj prikazati med predmeti virov XML?';
+$lang['rss_update'] = 'Časovni razmik posodobitve virov XML (v sekundah)';
+$lang['recent_days'] = 'Koliko nedavnih sprememb naj se ohrani (v dnevih)';
+$lang['rss_show_summary'] = 'Viri XML so povzeti v naslovu';
+$lang['target____wiki'] = 'Ciljno okno za notranje povezave';
+$lang['target____interwiki'] = 'Ciljno okno za notranje wiki povezave';
+$lang['target____extern'] = 'Ciljno okno za zunanje povezave';
+$lang['target____media'] = 'Ciljno okno za predstavne povezave';
+$lang['target____windows'] = 'Ciljno okno za povezave oken';
+$lang['proxy____host'] = 'Ime posredniškega strežnika';
+$lang['proxy____port'] = 'Vrata posredniškega strežnika';
+$lang['proxy____user'] = 'Uporabniško ime posredniškega strežnika';
+$lang['proxy____pass'] = 'Geslo posredniškega strežnika';
+$lang['proxy____ssl'] = 'Uporabi varno povezavo SSL za povezavo z posredniškim strežnikom';
+$lang['proxy____except'] = 'Logični izrazi morajo biti skladni z naslovi URL, ki gredo mimo posredniškega strežnika.';
+$lang['safemodehack'] = 'Omogoči obhod načina SafeMode PHP';
+$lang['ftp____host'] = 'Strežnik FTP za obhod načina SafeMode';
+$lang['ftp____port'] = 'Vrata strežnika FTP za obhod načina SafeMode';
+$lang['ftp____user'] = 'Uporabniško ime za FTP za obhod načina SafeMode';
+$lang['ftp____pass'] = 'Geslo za strežnik FTP za obhod načina SafeMode';
+$lang['ftp____root'] = 'Korenska mapa FTP za obhod načina SafeMode';
+$lang['license_o_'] = 'Ni izbranega dovoljenja';
+$lang['typography_o_0'] = 'brez';
+$lang['typography_o_1'] = 'izloči enojne narekovaje';
+$lang['typography_o_2'] = 'z enojnimi narekovaji (lahko včasih ne deluje)';
+$lang['userewrite_o_0'] = 'brez';
$lang['userewrite_o_1'] = '.htaccess';
+$lang['userewrite_o_2'] = 'notranji DokuWiki';
+$lang['deaccent_o_0'] = 'onemogočeno';
+$lang['deaccent_o_1'] = 'odstrani naglasne oznake';
+$lang['deaccent_o_2'] = 'pretvori v romanski zapis';
+$lang['gdlib_o_0'] = 'Knjižnica GD Lib ni na voljo';
+$lang['gdlib_o_1'] = 'Različica 1.x';
+$lang['gdlib_o_2'] = 'Samodejno zaznavanje';
$lang['rss_type_o_rss'] = 'RSS 0.91';
$lang['rss_type_o_rss1'] = 'RSS 1.0';
$lang['rss_type_o_rss2'] = 'RSS 2.0';
$lang['rss_type_o_atom'] = 'Atom 0.3';
$lang['rss_type_o_atom1'] = 'Atom 1.0';
+$lang['rss_content_o_abstract'] = 'Povzetek';
+$lang['rss_content_o_diff'] = 'Poenotena primerjava';
+$lang['rss_content_o_htmldiff'] = 'HTML oblikovana preglednica primerjave';
+$lang['rss_content_o_html'] = 'Polna HTML vsebina strani';
+$lang['rss_linkto_o_diff'] = 'primerjalni pogled';
+$lang['rss_linkto_o_page'] = 'pregledana stran';
+$lang['rss_linkto_o_rev'] = 'seznam pregledovanj';
$lang['rss_linkto_o_current'] = 'trenutna stran';
-$lang['compression_o_0'] = 'brez stiskanja';
-$lang['compression_o_gz'] = 'gzip stiskanje';
-$lang['compression_o_bz2'] = 'bz2 stiskanje';
+$lang['compression_o_0'] = 'brez';
+$lang['compression_o_gz'] = 'gzip';
+$lang['compression_o_bz2'] = 'bz2';
+$lang['xsendfile_o_0'] = 'ne uporabi';
+$lang['xsendfile_o_1'] = 'plačniška glava lighttpd (pred različico 1.5)';
+$lang['xsendfile_o_2'] = 'običajna glava X-Sendfile';
+$lang['xsendfile_o_3'] = 'plačniška glava Nginx X-Accel-Redirect';
+$lang['showuseras_o_loginname'] = 'Prijavno ime';
+$lang['showuseras_o_username'] = 'Polno ime uporabnika';
+$lang['showuseras_o_email'] = 'Elektronski naslov uporabnika (šifriran po določilih varovanja)';
+$lang['showuseras_o_email_link'] = 'Elektronski naslov uporabnika kot povezava mailto:';
+$lang['useheading_o_0'] = 'nikoli';
+$lang['useheading_o_navigation'] = 'le za krmarjenje';
+$lang['useheading_o_content'] = 'le za vsebino Wiki';
+$lang['useheading_o_1'] = 'vedno';
+$lang['readdircache'] = 'Največja dovoljena starost predpomnilnika prebranih map (v sekundah)';
diff --git a/lib/plugins/config/lang/sq/lang.php b/lib/plugins/config/lang/sq/lang.php
index 6cf8fd5af..adeb2a47d 100644
--- a/lib/plugins/config/lang/sq/lang.php
+++ b/lib/plugins/config/lang/sq/lang.php
@@ -85,7 +85,7 @@ $lang['auth_security_timeout'] = 'Koha e Përfundimit për Autentikim (sekonda)'
$lang['securecookie'] = 'A duhet që cookies të vendosura nëpërmjet HTTPS të dërgohen vetëm nëpërmjet HTTPS nga shfletuesit? Caktivizojeni këtë alternativë kur vetëm hyrja në wiki-n tuaj sigurohet me SSL por shfletimi i wiki-t bëhet në mënyrë të pasigurtë.';
$lang['xmlrpc'] = 'Aktivizo/Caktivizo ndërfaqen XML-RPC';
$lang['xmlrpcuser'] = 'Kufizo aksesin XML-RPC vetëm tek grupet ose përdoruesit e ndarë me presje të dhënë këtu. Lëre bosh për t\'i dhënë akses të gjithëve.';
-$lang['updatecheck'] = 'Kontrollo për përditësime dhe paralajmërime sigurie? DokuWiki duhet të kontaktojë me splitbrain.org për këtë veti.';
+$lang['updatecheck'] = 'Kontrollo për përditësime dhe paralajmërime sigurie? DokuWiki duhet të kontaktojë me update.dokuwiki.org për këtë veti.';
$lang['userewrite'] = 'Përdor URL të këndshme.';
$lang['useslash'] = 'Përdor / si ndarës të hapësirave të emrit në URL';
$lang['usedraft'] = 'Ruaj automatikisht një skicë gjatë redaktimit';
diff --git a/lib/plugins/config/lang/sr/lang.php b/lib/plugins/config/lang/sr/lang.php
index f66a7f717..5906dcd7e 100644
--- a/lib/plugins/config/lang/sr/lang.php
+++ b/lib/plugins/config/lang/sr/lang.php
@@ -86,7 +86,7 @@ $lang['auth_security_timeout'] = 'Временска пауза у аутент
$lang['securecookie'] = 'Да ли колачићи који су постављени преко ХТТПС треба слати веб читачу само преко ХТТПС? Искључите ову опцију само ако је пријављивање на вики заштићено ССЛом а остали део викија незаштићен.';
$lang['xmlrpc'] = 'Укључи/искључи ИксМЛ-РПЦ интерфејс';
$lang['xmlrpcuser'] = 'Ограничи ИксМЛ-РПЦ приступ на наведене групе корисника раздвојене зарезом. Остави празно да би свима дао приступ.';
-$lang['updatecheck'] = 'Провера надоградњи и сигурносних упозорења? Dokuwiki мора да контактира splitbrain.org ради добијања информација.';
+$lang['updatecheck'] = 'Провера надоградњи и сигурносних упозорења? Dokuwiki мора да контактира update.dokuwiki.org ради добијања информација.';
$lang['userewrite'] = 'Направи леп УРЛ';
$lang['useslash'] = 'Користи косу црту у УРЛу за раздвајање именских простора ';
$lang['usedraft'] = 'Аутоматски сачувај скицу у току писања измена';
diff --git a/lib/plugins/config/lang/sv/lang.php b/lib/plugins/config/lang/sv/lang.php
index 3b5752ea1..dfd93d37d 100644
--- a/lib/plugins/config/lang/sv/lang.php
+++ b/lib/plugins/config/lang/sv/lang.php
@@ -15,6 +15,7 @@
* @author Bogge Bogge <bogge@bogge.com>
* @author Peter Åström <eaustreum@gmail.com>
* @author Håkan Sandell <hakan.sandell@home.se>
+ * @author mikael@mallander.net
*/
$lang['menu'] = 'Hantera inställningar';
$lang['error'] = 'Inställningarna uppdaterades inte på grund av ett felaktigt värde. Titta igenom dina ändringar och försök sedan spara igen.
@@ -98,7 +99,7 @@ $lang['auth_security_timeout'] = 'Autentisieringssäkerhets timeout (sekunder)';
$lang['securecookie'] = 'Skall cookies som sätts via HTTPS endast skickas via HTTPS från webbläsaren? Avaktivera detta alternativ endast om inloggningen till din wiki är säkrad med SSL men läsning av wikin är osäkrad.';
$lang['xmlrpc'] = 'Aktivera/avaktivera XML-RPC-gränssnitt';
$lang['xmlrpcuser'] = 'Begränsa XML-RPC tillträde till komma separerade grupper eller användare som ges här. Lämna tomt för att ge tillgång till alla.';
-$lang['updatecheck'] = 'Kontrollera uppdateringar och säkerhetsvarningar? DokuWiki behöver kontakta splitbrain.org för den här funktionen.';
+$lang['updatecheck'] = 'Kontrollera uppdateringar och säkerhetsvarningar? DokuWiki behöver kontakta update.dokuwiki.org för den här funktionen.';
$lang['userewrite'] = 'Använd rena webbadresser';
$lang['useslash'] = 'Använd snedstreck för att separera namnrymder i webbadresser';
$lang['usedraft'] = 'Spara utkast automatiskt under redigering';
@@ -112,6 +113,7 @@ $lang['fetchsize'] = 'Maximal storlek (bytes) som fetch.php får lad
$lang['notify'] = 'Skicka meddelande om ändrade sidor till den här e-postadressen';
$lang['registernotify'] = 'Skicka meddelande om nyregistrerade användare till en här e-postadressen';
$lang['mailfrom'] = 'Avsändaradress i automatiska e-postmeddelanden';
+$lang['mailprefix'] = 'Prefix i början på ämnesraden vid automatiska e-postmeddelanden';
$lang['gzip_output'] = 'Använd gzip Content-Encoding för xhtml';
$lang['gdlib'] = 'Version av GD-biblioteket';
$lang['im_convert'] = 'Sökväg till ImageMagicks konverteringsverktyg';
diff --git a/lib/plugins/config/lang/uk/lang.php b/lib/plugins/config/lang/uk/lang.php
index f98e9463c..72d7e12f5 100644
--- a/lib/plugins/config/lang/uk/lang.php
+++ b/lib/plugins/config/lang/uk/lang.php
@@ -9,6 +9,7 @@
* @author Oleksandr Kunytsia <okunia@gmail.com>
* @author Uko uko@uar.net
* @author Ulrikhe Lukoie <lukoie@gmail>.com
+ * @author Kate Arzamastseva pshns@ukr.net
*/
$lang['menu'] = 'Настройка конфігурації';
$lang['error'] = 'Параметри не збережено через помилкові значення. Будь ласка, перегляньте ваші зміни та спробуйте ще раз
@@ -92,7 +93,7 @@ $lang['auth_security_timeout'] = 'Таймаут аутентифікації (
$lang['securecookie'] = 'Чи повинен браузер надсилати файли cookies тільки через HTTPS? Вимкніть цей параметр, лише тоді, якщо вхід до Вікі захищено SSL, але перегляд сторінок відбувається у незахищеному режимі.';
$lang['xmlrpc'] = 'Дозволити/заборонити XML-RPC інтерфейс';
$lang['xmlrpcuser'] = 'Заборонити XML-RPC доступ до користувачів або груп поданих тут та розділених комою. Залишіть поле незаповненим, щоб дозволити доступ усім.';
-$lang['updatecheck'] = 'Перевірити наявність оновлень чи попереджень безпеки? Для цього ДокуВікі необхідно зв\'язатися зі splitbrain.org.';
+$lang['updatecheck'] = 'Перевірити наявність оновлень чи попереджень безпеки? Для цього ДокуВікі необхідно зв\'язатися зі update.dokuwiki.org.';
$lang['userewrite'] = 'Красиві URL';
$lang['useslash'] = 'Слеш, як розділювач просторів імен в URL';
$lang['usedraft'] = 'Автоматично зберігати чернетку при редагуванні';
@@ -107,6 +108,7 @@ $lang['fetchsize'] = 'Максимальний розмір (в ба
$lang['notify'] = 'E-mail для сповіщень';
$lang['registernotify'] = 'Надсилати інформацію про нових користувачів на цю адресу';
$lang['mailfrom'] = 'E-mail для автоматичних повідомлень';
+$lang['mailprefix'] = 'Префікс теми повідомлення, що використовується в автоматичній розсилці електронних листів';
$lang['gzip_output'] = 'Використовувати gzip, як Content-Encoding для xhtml';
$lang['gdlib'] = 'Версія GD Lib';
$lang['im_convert'] = 'Шлях до ImageMagick';
@@ -187,4 +189,4 @@ $lang['useheading_o_0'] = 'Ніколи';
$lang['useheading_o_navigation'] = 'Лише для навігації';
$lang['useheading_o_content'] = 'Лише у змісті';
$lang['useheading_o_1'] = 'Завжди';
-$lang['readdircache'] = 'Макссимальний вік для файлів кешу (сек.)';
+$lang['readdircache'] = 'Максимальний вік для файлів кешу (сек.)';
diff --git a/lib/plugins/config/lang/zh-tw/intro.txt b/lib/plugins/config/lang/zh-tw/intro.txt
index e27b18ba2..c257947d9 100644
--- a/lib/plugins/config/lang/zh-tw/intro.txt
+++ b/lib/plugins/config/lang/zh-tw/intro.txt
@@ -1,7 +1,7 @@
====== 配置管理器 ======
-使用本頁中的內容來控制您的 Dokuwiki 設置。 每個單獨設置的相關信息請參閱 [[doku>config]]。 配置管理器的更多信息請參閱 [[doku>plugin:config]]。
+使用本頁控制您的 Dokuwiki 設定。每個獨立設定的相關訊息可參閱 [[doku>config]]。配置管理器的更多訊息請參閱 [[doku>plugin:config]]。
-淡紅色背景的項目被保護,不能通過這個管理器更改。 藍色背景的項目是系統的默認值,白色背景的項目是您作出更改的項目。藍色和白色的設置項目都可以更改。
+淡紅色背景的項目是被保護的,不能通過這個管理器更改。藍色背景的項目是系統的預設值,白色背景的項目是您更改過的。藍色和白色的設定項目都可以更改。
-離開本頁之前不要忘記點擊最后的 **保存** 按鈕,否則您做的修改不會生效。
+離開本頁之前不要忘記點擊最下面的 **儲存** 按鈕,否則您的修改將不會生效。
diff --git a/lib/plugins/config/lang/zh-tw/lang.php b/lib/plugins/config/lang/zh-tw/lang.php
index c363fb709..29aeaec3b 100644
--- a/lib/plugins/config/lang/zh-tw/lang.php
+++ b/lib/plugins/config/lang/zh-tw/lang.php
@@ -7,150 +7,155 @@
* @author Wayne San <waynesan@zerozone.tw>
* @author Li-Jiun Huang <ljhuang.tw@gmai.com>
* @author Cheng-Wei Chien <e.cwchien@gmail.com>
+ * @author Danny Lin
+ * @author Shuo-Ting Jian <shoting@gmail.com>
*/
$lang['menu'] = '系統配置設定';
-$lang['error'] = '設定因為不合法的值而失敗,請檢查您的改變並重新送出。
-<br />不正確的值會被紅色方框圍住。';
+$lang['error'] = '設定因為不合法的值而未更新,請檢查您的更改並重新送出。
+<br />不正確的值會被紅色方框包住。';
$lang['updated'] = '成功地更新設定。';
-$lang['nochoice'] = '(無其他選項可選)';
-$lang['locked'] = '設定檔無法被更新, 如果這不是故意的, <br />
-請確定設定檔名以及權限是正確的.';
-$lang['danger'] = '危險:改變此選項可能使得您的 wiki 以及其設定選單無法存取。';
-$lang['warning'] = '警告:改變此選項可能導致未預期的行為。';
-$lang['security'] = '安全性警告:改變此選項可能造成安全上的危險。';
-$lang['_configuration_manager'] = '設定管理';
+$lang['nochoice'] = '(無其他可用選項)';
+$lang['locked'] = '設定檔無法更新,若非故意,請確認本地檔名及權限正確。';
+$lang['danger'] = '危險:改變此選項可能使您無法存取維基及配置選單。';
+$lang['warning'] = '警告:改變此選項可能導致不可預期的行為。';
+$lang['security'] = '安全性警告:改變此選項可能造成安全風險。';
+$lang['_configuration_manager'] = '配置管理';
$lang['_header_dokuwiki'] = 'DokuWiki 設定';
-$lang['_header_plugin'] = '外掛設定';
+$lang['_header_plugin'] = '插件設定';
$lang['_header_template'] = '樣板設定';
-$lang['_header_undefined'] = '不明確的設定';
+$lang['_header_undefined'] = '未定義設定';
$lang['_basic'] = '基本設定';
$lang['_display'] = '顯示設定';
$lang['_authentication'] = '認證設定';
-$lang['_anti_spam'] = 'Anti-Spam 設定';
+$lang['_anti_spam'] = '反垃圾設定';
$lang['_editing'] = '編輯設定';
$lang['_links'] = '連結設定';
$lang['_media'] = '媒體設定';
$lang['_advanced'] = '進階設定';
$lang['_network'] = '網路設定';
-$lang['_plugin_sufix'] = '外掛設定';
+$lang['_plugin_sufix'] = '插件設定';
$lang['_template_sufix'] = '樣板設定';
-$lang['_msg_setting_undefined'] = '设置的元数据不存在。';
-$lang['_msg_setting_no_class'] = '設置的分類不存在。';
+$lang['_msg_setting_undefined'] = '設定的後設數據不存在。';
+$lang['_msg_setting_no_class'] = '設定的分類不存在。';
$lang['_msg_setting_no_default'] = '無預設值';
$lang['fmode'] = '檔案建立模式';
$lang['dmode'] = '目錄建立模式';
$lang['lang'] = '語系';
$lang['basedir'] = '根目錄';
-$lang['baseurl'] = '根路徑(URL)';
+$lang['baseurl'] = '根路徑 (URL)';
$lang['savedir'] = '儲存資料的目錄';
$lang['start'] = '開始頁面的名稱';
-$lang['title'] = 'Wiki 標題';
+$lang['title'] = '維基標題';
$lang['template'] = '樣板';
$lang['license'] = '您希望您的內容為何種授權方式?';
$lang['fullpath'] = '顯示完整的路徑於頁面底部';
$lang['recent'] = '最近更新';
-$lang['breadcrumbs'] = '显示“足迹”的数量';
-$lang['youarehere'] = '顯示“您在這裡”';
-$lang['typography'] = '進行字符替換';
-$lang['htmlok'] = '允許嵌入式HTML';
-$lang['phpok'] = '允許嵌入式PHP';
-$lang['dformat'] = '日期格式(請見 PHP\'s <a href="http://www.php.net/strftime">strftime</a> function)';
+$lang['breadcrumbs'] = '導覽鏈數量';
+$lang['youarehere'] = '顯示階層式導覽鏈';
+$lang['typography'] = '進行字元替換';
+$lang['htmlok'] = '允許嵌入式 HTML';
+$lang['phpok'] = '允許嵌入式 PHP';
+$lang['dformat'] = '日期格式 (參見 PHP 的 <a href="http://www.php.net/strftime">strftime</a> 函數)';
$lang['signature'] = '簽名';
-$lang['toptoclevel'] = '本頁目錄的最高層級';
-$lang['tocminheads'] = '決定是否建立本頁目錄的最少標題數量';
-$lang['maxtoclevel'] = '本頁目錄顯示的最大層級';
+$lang['toptoclevel'] = '目錄表的最上層級';
+$lang['tocminheads'] = '決定是否建立目錄表的最少標題數量';
+$lang['maxtoclevel'] = '目錄表顯示的最大層級';
$lang['maxseclevel'] = '可編輯段落的最大層級';
-$lang['camelcase'] = '對鏈接使用 CamelCase';
+$lang['camelcase'] = '對連結使用 CamelCase';
$lang['deaccent'] = '清理頁面名稱';
$lang['useheading'] = '使用第一個標題作為頁面名稱';
$lang['refcheck'] = '媒體連結檢查';
$lang['refshow'] = '媒體連結的顯示數量';
-$lang['allowdebug'] = '允許 debug <b> 如果不需要則停用! </b>';
-$lang['usewordblock'] = '基於 wordlist 來限制 spam';
-$lang['indexdelay'] = '建立索引前的延遲時間(秒)';
-$lang['relnofollow'] = '使用 rel="nofollow" 於外部連結';
-$lang['mailguard'] = '暗化E-mail位址';
+$lang['allowdebug'] = '允許除錯 <b>(不需要請停用!)</b>';
+$lang['usewordblock'] = '根據字詞表阻擋垃圾訊息';
+$lang['indexdelay'] = '建立索引前的延遲時間 (秒)';
+$lang['relnofollow'] = '外部連結使用 rel="nofollow"';
+$lang['mailguard'] = '混淆 E-mail 位址';
$lang['iexssprotect'] = '檢查上傳的檔案中是否隱含惡意的 JavaScript 或 HTML 碼';
-$lang['showuseras'] = '在顯示最近修改頁面,將使用者顯示為:';
+$lang['showuseras'] = '將最後編輯頁面的使用者顯示為:';
$lang['useacl'] = '使用存取控制名單';
$lang['autopasswd'] = '自動產生密碼';
-$lang['authtype'] = '认证后台管理方式';
+$lang['authtype'] = '認證後台管理方式';
$lang['passcrypt'] = '密碼加密方式';
$lang['defaultgroup'] = '預設群組';
-$lang['superuser'] = '超級用戶 - 不論 ACL 如何設置,都能訪問所有頁面與功能的用戶組/用戶';
-$lang['manager'] = '管理员 - 能访问相应管理功能的用户组/用户';
+$lang['superuser'] = '超級用戶 - 不論 ACL 如何設定,都能訪問所有頁面與功能的用戶組/用戶';
+$lang['manager'] = '管理員 - 能訪問相應管理功能的用戶组/用戶';
$lang['profileconfirm'] = '修改個人資料時需要確認密碼';
-$lang['disableactions'] = '停用DokuWiki功能';
+$lang['disableactions'] = '停用的 DokuWiki 動作';
$lang['disableactions_check'] = '檢查';
$lang['disableactions_subscription'] = '訂閱/取消訂閱';
-$lang['disableactions_wikicode'] = '查看源文件/導出源文件';
-$lang['disableactions_other'] = '其他功能(以逗號分隔)';
-$lang['sneaky_index'] = '默認情況下,DokuWiki 在索引頁會顯示所有 namespace。啟用該選項能隱藏那些用戶沒有權限閱讀的頁面。但也可能將用戶能夠閱讀的子頁面一並隱藏。這有可能導致在特定 ACL 設置下,索引功能不可用。';
-$lang['auth_security_timeout'] = '認證確定的 Timeout (秒)';
-$lang['securecookie'] = '「cookies set via HTTPS」是否只能由瀏覽器經 HTTPS 傳送?當你登入 wiki 是被 SSL 所保護但瀏覽 wiki 是沒有被保護時,取消此選項。';
+$lang['disableactions_wikicode'] = '檢視原始碼/匯出原始檔';
+$lang['disableactions_other'] = '其他功能 (逗號分隔)';
+$lang['sneaky_index'] = '預設情況下,DokuWiki 會在索引頁會顯示所有命名空間。啟用此選項會隱藏用戶沒有閱讀權限的頁面,但也可能將能閱讀的子頁面一併隱藏。在特定 ACL 設定下,這可能導致索引無法使用。';
+$lang['auth_security_timeout'] = '安全認證的計時 (秒)';
+$lang['securecookie'] = 'HTTPS 頁面設定的 cookie 是否只能由瀏覽器經 HTTPS 傳送?取消此選項後,只有登入維基會被 SSL 保護而瀏覽時不會。';
$lang['xmlrpc'] = '啟用/停用 XML-RPC 介面';
-$lang['xmlrpcuser'] = 'XML-RPC 存取權限將局限於在此提供的群組或使用者(逗點分隔)。若要開放權限給所有人請留白。';
-$lang['updatecheck'] = '檢查更新與安全性警告? 使用此功能, DokuWiki 需要聯繫 splitbrain.org.';
-$lang['userewrite'] = '使用更整潔的 URL';
-$lang['useslash'] = '在 URL 中使用斜杠作为命名空间的分隔符';
+$lang['xmlrpcuser'] = 'XML-RPC 存取權限將局限於在此提供的群組或使用者 (逗號分隔)。若要開放權限給所有人請留白。';
+$lang['updatecheck'] = '檢查更新與安全性警告?DokuWiki 需要聯繫 update.dokuwiki.org 才能使用此功能。';
+$lang['userewrite'] = '使用好看的 URL';
+$lang['useslash'] = '在 URL 中使用斜線作為命名空間的分隔字元';
$lang['usedraft'] = '編輯時自動儲存草稿';
$lang['sepchar'] = '頁面名稱中單字的分隔字元';
-$lang['canonical'] = '使用完全標准的 URL';
-$lang['autoplural'] = '在鏈接中檢查多種格式';
+$lang['canonical'] = '使用最典型的 URL';
+$lang['fnencode'] = '非 ASCII 文件名稱的編輯方法。';
+$lang['autoplural'] = '檢查複數形式的連結 (英文)';
$lang['compression'] = 'attic 文件的壓縮方式';
-$lang['cachetime'] = 'cache的最大時間(秒)';
-$lang['locktime'] = '鎖定檔案的最大時間(秒)';
-$lang['fetchsize'] = 'fetch.php可以從外部下載的最大檔案尺寸(bytes)';
-$lang['notify'] = '寄送變更通知信到這個E-mail位址';
-$lang['registernotify'] = '寄送新使用者註冊資訊到這個E-mail位址';
+$lang['cachetime'] = '緩存的最大存在時間 (秒)';
+$lang['locktime'] = '檔案的最大鎖定時間 (秒)';
+$lang['fetchsize'] = 'fetch.php 可以從外部下載的最大檔案尺寸 (bytes)';
+$lang['notify'] = '寄送變更通知信到這個 E-mail 位址';
+$lang['registernotify'] = '寄送新使用者註冊資訊到這個 E-mail 位址';
$lang['mailfrom'] = '自動發送郵件時使用的郵件地址';
+$lang['mailprefix'] = '自動發送郵件時使用的標題前綴';
$lang['gzip_output'] = '對 xhtml 使用 gzip 內容編碼';
$lang['gdlib'] = 'GD Lib 版本';
-$lang['im_convert'] = 'ImageMagick的轉換工具路徑';
+$lang['im_convert'] = 'ImageMagick 的轉換工具路徑';
$lang['jpg_quality'] = 'JPG 壓縮品質(0-100)';
$lang['subscribers'] = '啟用頁面訂閱';
-$lang['compress'] = '緊密CSS與JavaScript的輸出';
-$lang['hidepages'] = '隱藏匹配的界面(正則表達式)';
-$lang['send404'] = '存取不存在的頁面時送出"HTTP 404/Page Not Found"';
-$lang['sitemap'] = '產生 Google sitemap (天)';
+$lang['subscribe_time'] = '訂閱列表和摘要發送的時間間隔 (秒);這個值應該小於指定的最近更改保留時間 (recent_days)。';
+$lang['compress'] = '壓縮 CSS 與 JavaScript 的輸出';
+$lang['hidepages'] = '隱藏匹配的界面 (正規式)';
+$lang['send404'] = '存取不存在的頁面時送出 "HTTP 404/Page Not Found"';
+$lang['sitemap'] = '產生 Google 站台地圖 (天)';
$lang['broken_iua'] = 'ignore_user_abort 功能失效了?這有可能導致搜索索引不可用。IIS+PHP/CGI 已損壞。請參閱 <a href=\"http://bugs.splitbrain.org/?do=details&task_id=852\">Bug 852</a> 獲取更多信息。';
$lang['xsendfile'] = '使用 X-Sendfile 頭讓服務器發送狀態文件?您的服務器需要支持該功能。';
-$lang['renderer_xhtml'] = '主维基页面 (xhtml) 输出使用的渲染';
+$lang['renderer_xhtml'] = '主要維基輸出 (xhtml) 的的渲染器';
$lang['renderer__core'] = '%s (dokuwiki 核心)';
-$lang['renderer__plugin'] = '%s (外掛)';
-$lang['rememberme'] = '是否在登入畫面顯示記住我';
+$lang['renderer__plugin'] = '%s (插件)';
+$lang['rememberme'] = '允許自動登入 (記住我)';
$lang['rss_type'] = 'XML feed 類型';
$lang['rss_linkto'] = 'XML feed 連結到';
$lang['rss_content'] = 'XML feed 項目中顯示什麼呢?';
-$lang['rss_update'] = 'XML feed 更新間隔時間(秒)';
-$lang['recent_days'] = '保存多少天內的變更';
-$lang['rss_show_summary'] = '於標題中顯示簡要的XML feed';
+$lang['rss_update'] = 'XML feed 更新間隔時間 (秒)';
+$lang['recent_days'] = '儲存多少天內的變更';
+$lang['rss_show_summary'] = '於標題中顯示簡要的 XML feed';
$lang['target____wiki'] = '內部連結的目標視窗';
-$lang['target____interwiki'] = 'wiki內部連結的目標視窗';
+$lang['target____interwiki'] = '跨維基連結的目標視窗';
$lang['target____extern'] = '外部連結的目標視窗';
$lang['target____media'] = '媒體連結的目標視窗';
-$lang['target____windows'] = '視窗連結的目標視窗';
+$lang['target____windows'] = 'Windows 連結的目標視窗';
$lang['proxy____host'] = 'Proxy 伺服器名稱';
$lang['proxy____port'] = 'Proxy 連接埠';
$lang['proxy____user'] = 'Proxy 使用者名稱';
$lang['proxy____pass'] = 'Proxy 密碼';
$lang['proxy____ssl'] = '使用 SSL 連接到 Proxy';
+$lang['proxy____except'] = '比對 proxy 代理時應跳過的地址的正規式。';
$lang['safemodehack'] = '啟用 Safemode Hack';
-$lang['ftp____host'] = 'Safemode Hack 的 FTP 服務器';
+$lang['ftp____host'] = 'Safemode Hack 的 FTP 伺服器';
$lang['ftp____port'] = 'Safemode Hack 的 FTP 端口';
-$lang['ftp____user'] = 'Safemode Hack 的 FTP 用戶名';
+$lang['ftp____user'] = 'Safemode Hack 的 FTP 帳戶';
$lang['ftp____pass'] = 'Safemode Hack 的 FTP 密碼';
$lang['ftp____root'] = 'Safemode Hack 的 FTP 根路徑';
$lang['license_o_'] = '未選擇';
$lang['typography_o_0'] = '無';
-$lang['typography_o_1'] = '仅限双引号';
-$lang['typography_o_2'] = '所有引號(不一定能正常運行)';
+$lang['typography_o_1'] = '只限雙引號';
+$lang['typography_o_2'] = '包括單引號 (未必能運作)';
$lang['userewrite_o_0'] = '無';
$lang['userewrite_o_1'] = '.htaccess';
$lang['userewrite_o_2'] = 'DokuWiki 內部控制';
$lang['deaccent_o_0'] = '關閉';
$lang['deaccent_o_1'] = '移除重音符號';
-$lang['deaccent_o_2'] = '用羅馬字拼寫';
+$lang['deaccent_o_2'] = '羅馬字母轉寫';
$lang['gdlib_o_0'] = 'GD Lib 無法使用';
$lang['gdlib_o_1'] = '版本 1.x';
$lang['gdlib_o_2'] = '自動偵測';
@@ -159,11 +164,11 @@ $lang['rss_type_o_rss1'] = 'RSS 1.0';
$lang['rss_type_o_rss2'] = 'RSS 2.0';
$lang['rss_type_o_atom'] = 'Atom 0.3';
$lang['rss_type_o_atom1'] = 'Atom 1.0';
-$lang['rss_content_o_abstract'] = '概要';
-$lang['rss_content_o_diff'] = '統一差異';
-$lang['rss_content_o_htmldiff'] = 'HTML格式的差異對照表';
+$lang['rss_content_o_abstract'] = '摘要';
+$lang['rss_content_o_diff'] = '統一的差異';
+$lang['rss_content_o_htmldiff'] = 'HTML 格式的差異對照表';
$lang['rss_content_o_html'] = '完整的 HTML 頁面內容';
-$lang['rss_linkto_o_diff'] = '差別查看';
+$lang['rss_linkto_o_diff'] = '差異檢視';
$lang['rss_linkto_o_page'] = '已修訂的頁面';
$lang['rss_linkto_o_rev'] = '版本清單';
$lang['rss_linkto_o_current'] = '目前頁面';
@@ -171,14 +176,15 @@ $lang['compression_o_0'] = '無';
$lang['compression_o_gz'] = 'gzip';
$lang['compression_o_bz2'] = 'bz2';
$lang['xsendfile_o_0'] = '不使用';
-$lang['xsendfile_o_1'] = '專有 lighttpd 頭(1.5 發布前)';
-$lang['xsendfile_o_2'] = '標准 X-Sendfile 頭';
-$lang['xsendfile_o_3'] = '專有 Nginx X-Accel-Redirect 頭';
+$lang['xsendfile_o_1'] = '專有 lighttpd 標頭 (1.5 發布前)';
+$lang['xsendfile_o_2'] = '標準 X-Sendfile 標頭';
+$lang['xsendfile_o_3'] = '專有 Nginx X-Accel-Redirect 標頭';
$lang['showuseras_o_loginname'] = '登入名稱';
$lang['showuseras_o_username'] = '完整姓名';
-$lang['showuseras_o_email'] = '使用者的 email 位址 (根據郵件監控設定來暗化)';
-$lang['showuseras_o_email_link'] = '使用者的 eamil 位址標示成 mailto: link';
+$lang['showuseras_o_email'] = '使用者的 email 位址 (根據郵件監控設定混淆化)';
+$lang['showuseras_o_email_link'] = '使用者的 email 位址標示成 mailto: link';
$lang['useheading_o_0'] = '永不';
-$lang['useheading_o_navigation'] = '只有導覽';
-$lang['useheading_o_content'] = '只有 Wiki 內容';
+$lang['useheading_o_navigation'] = '僅導覽';
+$lang['useheading_o_content'] = '僅維基內容';
$lang['useheading_o_1'] = '總是';
+$lang['readdircache'] = 'readdir 緩存的最大存在時間 (秒)';
diff --git a/lib/plugins/config/lang/zh/lang.php b/lib/plugins/config/lang/zh/lang.php
index 0419968c7..0aeb977e7 100644
--- a/lib/plugins/config/lang/zh/lang.php
+++ b/lib/plugins/config/lang/zh/lang.php
@@ -11,6 +11,8 @@
* @author ben <ben@livetom.com>
* @author lainme <lainme993@gmail.com>
* @author caii <zhoucaiqi@gmail.com>
+ * @author Hiphen Lee <jacob.b.leung@gmail.com>
+ * @author caii, patent agent in China <zhoucaiqi@gmail.com>
*/
$lang['menu'] = '配置设置';
$lang['error'] = '由于非法参数,设置没有更新。请检查您做的改动并重新提交。
@@ -109,6 +111,7 @@ $lang['fetchsize'] = 'fetch.php 能从外部下载的最大文件大
$lang['notify'] = '发送更改通知给这个邮件地址';
$lang['registernotify'] = '发送新注册用户的信息给这个邮件地址';
$lang['mailfrom'] = '自动发送邮件时使用的邮件地址';
+$lang['mailprefix'] = '自动发送邮件时使用的邮件地址前缀';
$lang['gzip_output'] = '对 xhtml 使用 gzip 内容编码';
$lang['gdlib'] = 'GD 库版本';
$lang['im_convert'] = 'ImageMagick 转换工具的路径';
diff --git a/lib/plugins/config/settings/config.class.php b/lib/plugins/config/settings/config.class.php
index b38f79906..54fe2ad9c 100644
--- a/lib/plugins/config/settings/config.class.php
+++ b/lib/plugins/config/settings/config.class.php
@@ -100,8 +100,8 @@ if (!class_exists('configuration')) {
if ($this->locked) return false;
-# $file = eval('return '.$this->_local_file.';');
- $file = $this->_local_files[0];
+ // write back to the last file in the local config cascade
+ $file = end($this->_local_files);
// backup current file (remove any existing backup)
if (@file_exists($file) && $backup) {
diff --git a/lib/plugins/config/settings/config.metadata.php b/lib/plugins/config/settings/config.metadata.php
index c64fded81..5f2c32ea7 100644
--- a/lib/plugins/config/settings/config.metadata.php
+++ b/lib/plugins/config/settings/config.metadata.php
@@ -123,7 +123,7 @@ $meta['_authentication'] = array('fieldset');
$meta['useacl'] = array('onoff');
$meta['autopasswd'] = array('onoff');
$meta['authtype'] = array('authtype');
-$meta['passcrypt'] = array('multichoice','_choices' => array('smd5','md5','apr1','sha1','ssha','crypt','mysql','my411','kmd5'));
+$meta['passcrypt'] = array('multichoice','_choices' => array('smd5','md5','apr1','sha1','ssha','crypt','mysql','my411','kmd5','pmd5','hmd5'));
$meta['defaultgroup']= array('string');
$meta['superuser'] = array('string');
$meta['manager'] = array('string');
@@ -178,7 +178,9 @@ $meta['canonical'] = array('onoff');
$meta['fnencode'] = array('multichoice','_choices' => array('url','safe','utf-8'));
$meta['autoplural'] = array('onoff');
$meta['mailfrom'] = array('richemail');
+$meta['mailprefix'] = array('string');
$meta['compress'] = array('onoff');
+$meta['cssdatauri'] = array('numeric','_pattern' => '/^\d+$/');
$meta['gzip_output'] = array('onoff');
$meta['hidepages'] = array('string');
$meta['send404'] = array('onoff');
diff --git a/lib/plugins/config/settings/extra.class.php b/lib/plugins/config/settings/extra.class.php
index f6b69ead1..b4e35b1cc 100644
--- a/lib/plugins/config/settings/extra.class.php
+++ b/lib/plugins/config/settings/extra.class.php
@@ -90,7 +90,6 @@ if (!class_exists('setting_disableactions')) {
// transfer some DokuWiki language strings to the plugin
if (!$plugin->localised) $this->setupLocale();
$plugin->lang[$this->_key.'_revisions'] = $lang['btn_revs'];
- $plugin->lang[$this->_key.'_register'] = $lang['register'];
foreach ($this->_choices as $choice)
if (isset($lang['btn_'.$choice])) $plugin->lang[$this->_key.'_'.$choice] = $lang['btn_'.$choice];
diff --git a/lib/plugins/info/lang/sl/lang.php b/lib/plugins/info/lang/sl/lang.php
new file mode 100644
index 000000000..62936947c
--- /dev/null
+++ b/lib/plugins/info/lang/sl/lang.php
@@ -0,0 +1,12 @@
+<?php
+/**
+ * English language file
+ *
+ * @license GPL 2 (http://www.gnu.org/licenses/gpl.html)
+ * @author Guillaume Turri <guillaume.turri@gmail.com>
+ */
+
+$lang['encoding'] = 'utf-8';
+$lang['direction'] = 'ltr';
+$lang['onHidden'] = 'Click to display ⇲';
+$lang['onVisible'] = 'Click to hide ⇱';
diff --git a/lib/plugins/plugin/admin.php b/lib/plugins/plugin/admin.php
index c662b565a..b2108f185 100644
--- a/lib/plugins/plugin/admin.php
+++ b/lib/plugins/plugin/admin.php
@@ -44,7 +44,7 @@ class admin_plugin_plugin extends DokuWiki_Admin_Plugin {
function admin_plugin_plugin() {
global $conf;
- $this->disabled = (isset($conf['pluginmanager']) && ($conf['pluginmanager'] == 0));
+ $this->disabled = plugin_isdisabled('plugin');
}
/**
diff --git a/lib/plugins/plugin/classes/ap_delete.class.php b/lib/plugins/plugin/classes/ap_delete.class.php
index 231147479..581a6295f 100644
--- a/lib/plugins/plugin/classes/ap_delete.class.php
+++ b/lib/plugins/plugin/classes/ap_delete.class.php
@@ -6,7 +6,7 @@ class ap_delete extends ap_manage {
if (!$this->dir_delete(DOKU_PLUGIN.plugin_directory($this->manager->plugin))) {
$this->manager->error = sprintf($this->lang['error_delete'],$this->manager->plugin);
} else {
- msg("Plugin {$this->manager->plugin} successfully deleted.");
+ msg(sprintf($this->lang['deleted'],$this->plugin));
$this->refresh();
}
}
diff --git a/lib/plugins/plugin/classes/ap_download.class.php b/lib/plugins/plugin/classes/ap_download.class.php
index beba0ab07..6aab4ba3c 100644
--- a/lib/plugins/plugin/classes/ap_download.class.php
+++ b/lib/plugins/plugin/classes/ap_download.class.php
@@ -1,7 +1,7 @@
<?php
class ap_download extends ap_manage {
- var $overwrite = false;
+ var $overwrite = true;
/**
* Initiate the plugin download
@@ -114,7 +114,7 @@ class ap_download extends ap_manage {
if ($tmp) $this->dir_delete($tmp);
if (!$this->manager->error) {
- msg('Plugin package ('.count($this->downloaded).' plugin'.(count($this->downloaded) != 1?'s':'').': '.join(',',$this->downloaded).') successfully installed.',1);
+ msg(sprintf($this->lang['packageinstalled'], count($this->downloaded), join(',',$this->downloaded)),1);
$this->refresh();
return true;
}
diff --git a/lib/plugins/plugin/classes/ap_manage.class.php b/lib/plugins/plugin/classes/ap_manage.class.php
index 2982a3ebb..fb148f263 100644
--- a/lib/plugins/plugin/classes/ap_manage.class.php
+++ b/lib/plugins/plugin/classes/ap_manage.class.php
@@ -176,7 +176,7 @@ class ap_manage {
function dir_delete($path) {
if (!is_string($path) || $path == "") return false;
- if (is_dir($path)) {
+ if (is_dir($path) && !is_link($path)) {
if (!$dh = @opendir($path)) return false;
while ($f = readdir($dh)) {
diff --git a/lib/plugins/plugin/lang/ar/admin_plugin.txt b/lib/plugins/plugin/lang/ar/admin_plugin.txt
index 1aeaf13ad..2ef9fd595 100644
--- a/lib/plugins/plugin/lang/ar/admin_plugin.txt
+++ b/lib/plugins/plugin/lang/ar/admin_plugin.txt
@@ -1,4 +1,4 @@
====== إدارة الإضافات ======
-على هذه الصفحة يمكنك إدارة كل ما يتعلق ب[[doku>plugins|إضافات]] دوكي ويكي. لتتمكن من تنزيل و تثبيت الإضافات يجب أن يكون دليل الاضافات قابلا للكتابة من خادوم الوب.
+على هذه الصفحة يمكنك إدارة كل ما يتعلق ب[[doku>plugins|إضافات]] دوكو ويكي. لتتمكن من تنزيل و تثبيت الإضافات يجب أن يكون دليل الاضافات قابلا للكتابة من خادوم الوب.
diff --git a/lib/plugins/plugin/lang/ar/lang.php b/lib/plugins/plugin/lang/ar/lang.php
index 55987881c..fbc6d3c36 100644
--- a/lib/plugins/plugin/lang/ar/lang.php
+++ b/lib/plugins/plugin/lang/ar/lang.php
@@ -4,6 +4,7 @@
*
* @author Yaman Hokan <always.smile.yh@hotmail.com>
* @author Usama Akkad <uahello@gmail.com>
+ * @author uahello@gmail.com
*/
$lang['menu'] = 'إدارة الملحقات';
$lang['download'] = 'نزّل و ثبت اضافة جديدة';
diff --git a/lib/plugins/plugin/lang/bg/admin_plugin.txt b/lib/plugins/plugin/lang/bg/admin_plugin.txt
index e74e88d00..bad73e136 100644
--- a/lib/plugins/plugin/lang/bg/admin_plugin.txt
+++ b/lib/plugins/plugin/lang/bg/admin_plugin.txt
@@ -1,3 +1,3 @@
====== Управление на приставките ======
-На тази страница можете на управлявате всичко свързано с [[doku>plugins|приставките]] на Dokuwiki. За да можете да свалите и инсталирате приставка, вашата plugin директория трябва да е позволена за писане от сървъра.
+От тази страница можете на управлявате [[doku>plugins|приставките]] на Dokuwiki. За да свалите и инсталирате приставка, е необходимо писането в директорията .../lib/plugins/ да е позволено на сървъра.
diff --git a/lib/plugins/plugin/lang/bg/lang.php b/lib/plugins/plugin/lang/bg/lang.php
index 99e7a2fe4..79f6e081f 100644
--- a/lib/plugins/plugin/lang/bg/lang.php
+++ b/lib/plugins/plugin/lang/bg/lang.php
@@ -5,6 +5,7 @@
* @license GPL 2 (http://www.gnu.org/licenses/gpl.html)
* @author Nikolay Vladimirov <nikolay@vladimiroff.com>
* @author Viktor Usunov <usun0v@mail.bg>
+ * @author Kiril <neohidra@gmail.com>
*/
$lang['menu'] = 'Управление на приставките';
$lang['download'] = 'Сваляне и инсталиране на нова приставка';
@@ -16,37 +17,38 @@ $lang['btn_settings'] = 'настройки';
$lang['btn_download'] = 'Сваляне';
$lang['btn_enable'] = 'Запис';
$lang['url'] = 'URL';
-$lang['installed'] = 'Инсталирани:';
-$lang['lastupdate'] = 'Последно обновени:';
+$lang['installed'] = 'Инсталирана:';
+$lang['lastupdate'] = 'Актуализирана:';
$lang['source'] = 'Източник:';
$lang['unknown'] = 'непознат';
-$lang['updating'] = 'Качване ...';
-$lang['updated'] = 'Качването на приставката %s бе упешно.';
-$lang['updates'] = 'Обновяването на следните приставки бе успешно';
-$lang['update_none'] = 'Не бяха намерени нови версии.';
+$lang['updating'] = 'Актуализиране ...';
+$lang['updated'] = 'Приставката %s е качена успешно';
+$lang['updates'] = 'Следните приставки са актуализирани успешно';
+$lang['update_none'] = 'Не са намерени нови версии.';
$lang['deleting'] = 'Изтриване ...';
-$lang['deleted'] = 'Изтриването на приставката %s бе успешно.';
+$lang['deleted'] = 'Приставката %s е изтрита успешно.';
$lang['downloading'] = 'Сваляне ...';
-$lang['downloaded'] = 'Инсталирането на приставката %s бе успешно ';
-$lang['downloads'] = 'Инсталирането на следните приставки бе успешно:';
-$lang['download_none'] = 'Не бяха намерени приставки или е имало грешка при свалянето и инсталирането.';
-$lang['plugin'] = 'Приставки:';
+$lang['downloaded'] = 'Приставката %s е инсталирана успешно ';
+$lang['downloads'] = 'Следните приставки са инсталирани успешно:';
+$lang['download_none'] = 'Не са намерени приставки или е възникнала непозната грешка при свалянето и инсталирането.';
+$lang['plugin'] = 'Приставка:';
$lang['components'] = 'Компоненти';
-$lang['noinfo'] = 'Тази приставка не върна информация, може да е повредена.';
+$lang['noinfo'] = 'Приставка не върна информация, може да е повредена.';
$lang['name'] = 'Име:';
$lang['date'] = 'Дата:';
$lang['type'] = 'Тип:';
$lang['desc'] = 'Описание:';
$lang['author'] = 'Автор:';
-$lang['www'] = 'Сайт:';
-$lang['error'] = 'Имаше непозната грешка.';
-$lang['error_download'] = 'Свалянето на приставката %s бе невъзможно.';
-$lang['error_badurl'] = 'Предполагаем грешен адрес - не може да се определи име на файла от адреса(url)';
-$lang['error_dircreate'] = 'Създаването на временна директория за сваляне е невъзможно.';
-$lang['error_decompress'] = 'Разархивирането на сваленият файл е невъзможно.Това може да е резултат от грешно сваляне, в такъв случай трябва да опитате отново; или формата на компресия е непозната - в този случай трябва да свалите и инсталирате приставката ръчно.';
-$lang['error_copy'] = 'Имаше грешка при копирането на файл по време на инсталацията на приставката <em>%s</em>: дискът е пълен или правата за достъп до файловете са грешни. Това може да е довело до частично инсталирана приставка и оставяне на нестабилна инсталация на уикито ви.';
-$lang['error_delete'] = 'Имаше грешка при изтриването на приставката <em>%s</em>. Най-вероятната причина е недостатъчна права за достъп до файл или директория';
-$lang['enabled'] = 'Приставката %s бе включена.';
-$lang['notenabled'] = 'Приставката %s не бе включена, моля проверете файловите разрешения.';
-$lang['disabled'] = 'Приставката %s бе изключена.';
-$lang['notdisabled'] = 'Приставката %s не бе изключена, моля проверете файловите разрешения.';
+$lang['www'] = 'Уебстраница:';
+$lang['error'] = 'Възникна непозната грешка.';
+$lang['error_download'] = 'Свалянето на приставката %s е невъзможно.';
+$lang['error_badurl'] = 'Предполагаем грешен адрес - не може да се определи име на файла от URL адреса';
+$lang['error_dircreate'] = 'Създаването на временна директория за сваляне не е възможно.';
+$lang['error_decompress'] = 'Разархивирането на сваленият файл е невъзможно. Вероятно е резултат от грешка при свалянето, в този случай трябва да опитате отново; или формата на компресия е непознат - тогава трябва да свалите и инсталирате приставката ръчно.';
+$lang['error_copy'] = 'Възникна грешка при копиране на файл по време на инсталиране на приставката <em>%s</em>: вероятно дискът е пълен или правата за достъп до файловете са грешни. Може да доведе до частично инсталирана приставка и да причини нестабилно функциониране на wiki-то ви.';
+$lang['error_delete'] = 'Възникна грешка при изтриването на приставката <em>%s</em>. Най-вероятната причина е в правата за достъп до файл или директория';
+$lang['enabled'] = 'Приставката %s е включена.';
+$lang['notenabled'] = 'Приставката %s не може да бъде включена, моля проверете правата за файловете.';
+$lang['disabled'] = 'Приставката %s е изключена.';
+$lang['notdisabled'] = 'Приставката %s не е изключена, моля проверете правата за файловете.';
+$lang['packageinstalled'] = 'Пакетът е инсталиран успешно (%d приставка%s: %s).';
diff --git a/lib/plugins/plugin/lang/cs/lang.php b/lib/plugins/plugin/lang/cs/lang.php
index 54de0ff18..7c0fb3468 100644
--- a/lib/plugins/plugin/lang/cs/lang.php
+++ b/lib/plugins/plugin/lang/cs/lang.php
@@ -9,6 +9,7 @@
* @author tomas@valenta.cz
* @author Marek Sacha <sachamar@fel.cvut.cz>
* @author Lefty <lefty@multihost.cz>
+ * @author Vojta Beran <xmamut@email.cz>
*/
$lang['menu'] = 'Správa pluginů';
$lang['download'] = 'Stáhnout a instalovat plugin';
@@ -55,3 +56,4 @@ $lang['enabled'] = 'Plugin %s aktivován.';
$lang['notenabled'] = 'Plugin %s nelze aktivovat, zkontrolujte práva k souborům.';
$lang['disabled'] = 'Plugin %s deaktivován.';
$lang['notdisabled'] = 'Plugin %s nelze deaktivovat, zkontrolujte práva k souborům.';
+$lang['packageinstalled'] = 'Plugin package (%d plugin%s: %s) úspěšně nainstalován.';
diff --git a/lib/plugins/plugin/lang/de-informal/lang.php b/lib/plugins/plugin/lang/de-informal/lang.php
index 65050b896..0bd142e23 100644
--- a/lib/plugins/plugin/lang/de-informal/lang.php
+++ b/lib/plugins/plugin/lang/de-informal/lang.php
@@ -6,6 +6,7 @@
* @author Juergen Schwarzer <jschwarzer@freenet.de>
* @author Marcel Metz <marcel_metz@gmx.de>
* @author Matthias Schulte <post@lupo49.de>
+ * @author Christian Wichmann <nospam@zone0.de>
*/
$lang['menu'] = 'Plugins verwalten';
$lang['download'] = 'Herunterladen und installieren einer neuen Erweiterung';
@@ -51,3 +52,4 @@ $lang['enabled'] = 'Erweiterung %s aktiviert.';
$lang['notenabled'] = 'Erweiterung %s konnte nicht aktiviert werden. Überprüfen sie die Zugriffsberechtigung der Datei.';
$lang['disabled'] = 'Erweiterung %s deaktiviert.';
$lang['notdisabled'] = 'Erweiterung %s konnte nicht deaktiviert werden - überprüfe Dateiberechtigungen';
+$lang['packageinstalled'] = 'Plugin-Paket (%d Plugin%s: %s) erfolgreich installiert.';
diff --git a/lib/plugins/plugin/lang/de/lang.php b/lib/plugins/plugin/lang/de/lang.php
index e981f4a60..6c1bd033c 100644
--- a/lib/plugins/plugin/lang/de/lang.php
+++ b/lib/plugins/plugin/lang/de/lang.php
@@ -14,6 +14,8 @@
* @author Blitzi94@gmx.de
* @author Robert Bogenschneider <robog@GMX.de>
* @author Robert Bogenschneider <robog@gmx.de>
+ * @author Niels Lange <niels@boldencursief.nl>
+ * @author Christian Wichmann <nospam@zone0.de>
*/
$lang['menu'] = 'Plugins verwalten';
$lang['download'] = 'Neues Plugin herunterladen und installieren';
@@ -59,3 +61,4 @@ $lang['enabled'] = 'Plugin %s wurde aktiviert.';
$lang['notenabled'] = 'Plugin %s konnte nicht aktiviert werden, überprüfen Sie die Dateirechte.';
$lang['disabled'] = 'Plugin %s wurde deaktiviert.';
$lang['notdisabled'] = 'Plugin %s konnte nicht deaktiviert werden, überprüfen Sie die Dateirechte.';
+$lang['packageinstalled'] = 'Plugin-Paket (%d Plugin%s: %s) erfolgreich installiert.';
diff --git a/lib/plugins/plugin/lang/en/lang.php b/lib/plugins/plugin/lang/en/lang.php
index ccbd207e9..87570a708 100644
--- a/lib/plugins/plugin/lang/en/lang.php
+++ b/lib/plugins/plugin/lang/en/lang.php
@@ -73,5 +73,6 @@ $lang['enabled'] = 'Plugin %s enabled.';
$lang['notenabled'] = 'Plugin %s could not be enabled, check file permissions.';
$lang['disabled'] = 'Plugin %s disabled.';
$lang['notdisabled'] = 'Plugin %s could not be disabled, check file permissions.';
+$lang['packageinstalled'] = 'Plugin package (%d plugin(s): %s) successfully installed.';
//Setup VIM: ex: et ts=4 :
diff --git a/lib/plugins/plugin/lang/es/lang.php b/lib/plugins/plugin/lang/es/lang.php
index d26218b2d..207c48d2c 100644
--- a/lib/plugins/plugin/lang/es/lang.php
+++ b/lib/plugins/plugin/lang/es/lang.php
@@ -19,6 +19,7 @@
* @author Fernando J. Gómez <fjgomez@gmail.com>
* @author Victor Castelan <victorcastelan@gmail.com>
* @author Mauro Javier Giamberardino <mgiamberardino@gmail.com>
+ * @author emezeta <emezeta@infoprimo.com>
*/
$lang['menu'] = 'Administración de Plugins';
$lang['download'] = 'Descargar e instalar un nuevo plugin';
@@ -64,3 +65,4 @@ $lang['enabled'] = 'Plugin %s habilitado.';
$lang['notenabled'] = 'Plugin %s no puede ser habilitado, verifica los permisos del archivo.';
$lang['disabled'] = 'Plugin %s desabilitado.';
$lang['notdisabled'] = 'Plugin %s no puede ser desabilitado, verifica los permisos de archivo.';
+$lang['packageinstalled'] = 'Plugin (%d plugin%s: %s) instalado exitosamente.';
diff --git a/lib/plugins/plugin/lang/et/lang.php b/lib/plugins/plugin/lang/et/lang.php
new file mode 100644
index 000000000..088acf39b
--- /dev/null
+++ b/lib/plugins/plugin/lang/et/lang.php
@@ -0,0 +1,32 @@
+<?php
+/**
+ * Estonian language file
+ *
+ * @author kristian.kankainen@kuu.la
+ * @author Rivo Zängov <eraser@eraser.ee>
+ */
+$lang['manage'] = 'Paigaldatud pluginad';
+$lang['btn_info'] = 'info';
+$lang['btn_update'] = 'uuenda';
+$lang['btn_delete'] = 'kustuta';
+$lang['btn_settings'] = 'seaded';
+$lang['btn_download'] = 'Lae alla';
+$lang['btn_enable'] = 'Salvesta';
+$lang['url'] = 'URL';
+$lang['installed'] = 'Paigaldatud:';
+$lang['lastupdate'] = 'Viimati uuendatud:';
+$lang['source'] = 'Allikas:';
+$lang['unknown'] = 'tundmatu';
+$lang['updating'] = 'Uuendamine ...';
+$lang['update_none'] = 'Uuendusi ei leitud.';
+$lang['deleting'] = 'Kustutamine ...';
+$lang['deleted'] = 'Plugin %s on kustutatud.';
+$lang['downloading'] = 'Allalaadimine ...';
+$lang['plugin'] = 'Plugin:';
+$lang['components'] = 'Komponendid';
+$lang['name'] = 'Nimi:';
+$lang['date'] = 'Kuupäev';
+$lang['type'] = 'Tüüp:';
+$lang['desc'] = 'Kirjeldus:';
+$lang['author'] = 'Autor:';
+$lang['www'] = 'Veeb:';
diff --git a/lib/plugins/plugin/lang/eu/lang.php b/lib/plugins/plugin/lang/eu/lang.php
index 370aa9739..ebcda7e16 100644
--- a/lib/plugins/plugin/lang/eu/lang.php
+++ b/lib/plugins/plugin/lang/eu/lang.php
@@ -48,3 +48,4 @@ $lang['enabled'] = '%s Plugin-a gaitua.';
$lang['notenabled'] = '%s Plugin-a ezin izan da gaitu, egiaztatu fitxategi baimenak.';
$lang['disabled'] = '%s Plugin-a ezgaitua.';
$lang['notdisabled'] = '%s Plugin-a ezin izan da ezgaitu, egiaztatu fitxategi baimenak. ';
+$lang['packageinstalled'] = 'Plugin paketea (%d plugin%s: %s) arrakastaz instalatua izan da.';
diff --git a/lib/plugins/plugin/lang/fa/lang.php b/lib/plugins/plugin/lang/fa/lang.php
index f1a228931..19a839660 100644
--- a/lib/plugins/plugin/lang/fa/lang.php
+++ b/lib/plugins/plugin/lang/fa/lang.php
@@ -52,3 +52,4 @@ $lang['enabled'] = 'افزونه‌ی %s فعال شد.';
$lang['notenabled'] = 'افزونه‌ی %s قابلیت فعال کردن ندارد، دسترسی‌ها را چک کنید.';
$lang['disabled'] = 'افزونه‌ی %s غیرفعال شد.';
$lang['notdisabled'] = 'افزونه‌ی %s قابلیت غیرفعال کردن ندارد، دسترسی‌ها را چک کنید.';
+$lang['packageinstalled'] = 'بسته افزونه (%d افزونه%s: %s) به درستی نصب شد.';
diff --git a/lib/plugins/plugin/lang/fi/lang.php b/lib/plugins/plugin/lang/fi/lang.php
index 817b4f20a..c348a2331 100644
--- a/lib/plugins/plugin/lang/fi/lang.php
+++ b/lib/plugins/plugin/lang/fi/lang.php
@@ -5,6 +5,7 @@
* @author otto@valjakko.net
* @author Otto Vainio <otto@valjakko.net>
* @author Teemu Mattila <ghcsystems@gmail.com>
+ * @author Sami Olmari <sami@olmari.fi>
*/
$lang['menu'] = 'Ylläpidä liitännäisiä';
$lang['download'] = 'Lataa ja asenna uusi liitännäinen';
@@ -50,3 +51,4 @@ $lang['enabled'] = 'Liitännäinen %s käytössä';
$lang['notenabled'] = 'Liitännäistä %s ei voitu ottaa käyttöön. Tarkista tiedostojen oikeudet.';
$lang['disabled'] = 'Liitännäinen %s pois käytössä';
$lang['notdisabled'] = 'Liitännäistä %s ei voitu ottaa pois käytöstä. Tarkista tiedostojen oikeudet.';
+$lang['packageinstalled'] = 'Pluginpaketti (%d plugin%s: %s:) asennettu onnistuneesti.';
diff --git a/lib/plugins/plugin/lang/fr/lang.php b/lib/plugins/plugin/lang/fr/lang.php
index 79080f5f3..0ff26da19 100644
--- a/lib/plugins/plugin/lang/fr/lang.php
+++ b/lib/plugins/plugin/lang/fr/lang.php
@@ -15,6 +15,8 @@
* @author Philippe Bajoit <philippe.bajoit@gmail.com>
* @author Florian Gaub <floriang@floriang.net>
* @author Samuel Dorsaz samuel.dorsaz@novelion.net
+ * @author Johan Guilbaud <guilbaud.johan@gmail.com>
+ * @author schplurtz@laposte.net
*/
$lang['menu'] = 'Gestion des modules externes';
$lang['download'] = 'Télécharger et installer un nouveau module';
@@ -60,3 +62,4 @@ $lang['enabled'] = 'Module %s activé.';
$lang['notenabled'] = 'Le module %s n\'a pas pu être activé, vérifiez le fichier des permissions.';
$lang['disabled'] = 'Module %s désactivé.';
$lang['notdisabled'] = 'Le module %s n\'a pas pu être désactivé, vérifiez le fichier des permissions.';
+$lang['packageinstalled'] = 'Ensemble de modules (%d module(s): %s) installé avec succès.';
diff --git a/lib/plugins/plugin/lang/he/lang.php b/lib/plugins/plugin/lang/he/lang.php
index c6e462193..47253e335 100644
--- a/lib/plugins/plugin/lang/he/lang.php
+++ b/lib/plugins/plugin/lang/he/lang.php
@@ -7,6 +7,7 @@
* @author Dotan Kamber <kamberd@yahoo.com>
* @author Moshe Kaplan <mokplan@gmail.com>
* @author Yaron Yogev <yaronyogev@gmail.com>
+ * @author Yaron Shahrabani <sh.yaron@gmail.com>
*/
$lang['menu'] = 'ניהול הרחבות';
$lang['download'] = 'הורדת והתקנת הרחבה חדשה';
diff --git a/lib/plugins/plugin/lang/hr/lang.php b/lib/plugins/plugin/lang/hr/lang.php
index d2094b77b..96f1d6afe 100644
--- a/lib/plugins/plugin/lang/hr/lang.php
+++ b/lib/plugins/plugin/lang/hr/lang.php
@@ -4,4 +4,5 @@
*
* @author Branko Rihtman <theney@gmail.com>
* @author Dražen Odobašić <dodobasic@gmail.com>
+ * @author Dejan Igrec dejan.igrec@gmail.com
*/
diff --git a/lib/plugins/plugin/lang/hu/lang.php b/lib/plugins/plugin/lang/hu/lang.php
index 32242ece9..25c7b6322 100644
--- a/lib/plugins/plugin/lang/hu/lang.php
+++ b/lib/plugins/plugin/lang/hu/lang.php
@@ -5,8 +5,9 @@
* @author Sandor TIHANYI <stihanyi+dw@gmail.com>
* @author Siaynoq Mage <siaynoqmage@gmail.com>
* @author schilling.janos@gmail.com
- * @author Szabó Dávid (szabo.david@gyumolcstarhely.hu)
* @author Szabó Dávid <szabo.david@gyumolcstarhely.hu>
+ * @author Sándor TIHANYI <stihanyi+dw@gmail.com>
+ * @author David Szabo <szabo.david@gyumolcstarhely.hu>
*/
$lang['menu'] = 'Bővítménykezelő';
$lang['download'] = 'Új bővítmény letöltése és telepítése';
@@ -52,3 +53,4 @@ $lang['enabled'] = 'A(z) %s bővítmény bekapcsolva.';
$lang['notenabled'] = 'A(z) %s bővítmény engedélyezése nem sikerült. Ellenőrizze a fájl-hozzáférési engedélyeket.';
$lang['disabled'] = 'A(z) %s bővítmény kikapcsolva.';
$lang['notdisabled'] = 'A(z) %s bővítmény kikapcsolása nem sikerült. Ellenőrizze a fájl-hozzáférési engedélyeket.';
+$lang['packageinstalled'] = 'A bővítmény csomag(ok) feltelepült(ek): %d plugin%s: %s';
diff --git a/lib/plugins/plugin/lang/it/lang.php b/lib/plugins/plugin/lang/it/lang.php
index c7ce28a59..e675c5530 100644
--- a/lib/plugins/plugin/lang/it/lang.php
+++ b/lib/plugins/plugin/lang/it/lang.php
@@ -12,6 +12,7 @@
* @author snarchio@alice.it
* @author robocap <robocap1@gmail.com>
* @author Osman Tekin osman.tekin93@hotmail.it
+ * @author Jacopo Corbetta <jacopo.corbetta@gmail.com>
*/
$lang['menu'] = 'Gestione Plugin';
$lang['download'] = 'Scarica e installa un nuovo plugin';
diff --git a/lib/plugins/plugin/lang/ja/lang.php b/lib/plugins/plugin/lang/ja/lang.php
index 0deb420c9..56a827b7e 100644
--- a/lib/plugins/plugin/lang/ja/lang.php
+++ b/lib/plugins/plugin/lang/ja/lang.php
@@ -53,3 +53,4 @@ $lang['enabled'] = 'プラグイン %s が有効です。';
$lang['notenabled'] = 'プラグイン %s を有効にすることができません。権限を確認してください。';
$lang['disabled'] = 'プラグイン %s が無効です。';
$lang['notdisabled'] = 'プラグイン %s を無効にすることができません。権限を確認してください。';
+$lang['packageinstalled'] = 'プラグインパッケージ(%d plugin%s: %s)は正しくインストールされました。';
diff --git a/lib/plugins/plugin/lang/kk/lang.php b/lib/plugins/plugin/lang/kk/lang.php
new file mode 100644
index 000000000..dde5b9577
--- /dev/null
+++ b/lib/plugins/plugin/lang/kk/lang.php
@@ -0,0 +1,6 @@
+<?php
+/**
+ * kazakh language file
+ *
+ * @author Nurgozha Kaliaskarov astana08@gmail.com
+ */
diff --git a/lib/plugins/plugin/lang/ko/lang.php b/lib/plugins/plugin/lang/ko/lang.php
index 72c04ddab..ab305dcd8 100644
--- a/lib/plugins/plugin/lang/ko/lang.php
+++ b/lib/plugins/plugin/lang/ko/lang.php
@@ -53,3 +53,4 @@ $lang['enabled'] = '%s 플러그인을 켰습니다.';
$lang['notenabled'] = '%s 플러그인을 킬 수 없습니다. 파일 권한을 확인하십시오.';
$lang['disabled'] = '%s 플러그인을 껐습니다.';
$lang['notdisabled'] = '%s 플러그인을 끌 수 없습니다. 파일 권한을 확인하십시오.';
+$lang['packageinstalled'] = '플러그인 패키지(%d 개의 플러그인%s: %s)가 성공적으로 설치되었습니다.';
diff --git a/lib/plugins/plugin/lang/la/admin_plugin.txt b/lib/plugins/plugin/lang/la/admin_plugin.txt
index 1a361140c..2a41977fc 100644
--- a/lib/plugins/plugin/lang/la/admin_plugin.txt
+++ b/lib/plugins/plugin/lang/la/admin_plugin.txt
@@ -1,3 +1,3 @@
====== Addendorum Administratio ======
-In hac pagina omnia uicis [[doku>plugins|plugins]] mutare et administrare potes. Ut addenda capere et his uti, in scrinio addendorum scribere et legere potest. \ No newline at end of file
+In hac pagina omnia uicis [[doku>plugins|plugins]] mutare et administrare potes. Vt addenda capere et his uti, in scrinio addendorum scribere et legere potest. \ No newline at end of file
diff --git a/lib/plugins/plugin/lang/la/lang.php b/lib/plugins/plugin/lang/la/lang.php
index 021dc84d5..cd2d81cbd 100644
--- a/lib/plugins/plugin/lang/la/lang.php
+++ b/lib/plugins/plugin/lang/la/lang.php
@@ -2,8 +2,9 @@
/**
* Latin language file
*
+ * @author Massimiliano Vassalli <vassalli.max@gmail.com>
*/
-$lang['menu'] = 'Administrationis addenda';
+$lang['menu'] = 'Addendorum administratio';
$lang['download'] = 'Noua addenda cape';
$lang['manage'] = 'Addenta in usu';
$lang['btn_info'] = 'Notae';
diff --git a/lib/plugins/plugin/lang/nl/lang.php b/lib/plugins/plugin/lang/nl/lang.php
index cb7fc44fc..66cd7c0a2 100644
--- a/lib/plugins/plugin/lang/nl/lang.php
+++ b/lib/plugins/plugin/lang/nl/lang.php
@@ -56,3 +56,4 @@ $lang['enabled'] = 'Plugin %s ingeschakeld.';
$lang['notenabled'] = 'Plugin %s kon niet worden ingeschakeld, controleer bestandsrechten.';
$lang['disabled'] = 'Plugin %s uitgeschakeld.';
$lang['notdisabled'] = 'Plugin %s kon niet worden uitgeschakeld, controleer bestandsrechten.';
+$lang['packageinstalled'] = 'Plugin package (%d plugin%s: %s) succesvol geïnstalleerd.';
diff --git a/lib/plugins/plugin/lang/no/lang.php b/lib/plugins/plugin/lang/no/lang.php
index 72d9c19ba..a95ea0085 100644
--- a/lib/plugins/plugin/lang/no/lang.php
+++ b/lib/plugins/plugin/lang/no/lang.php
@@ -12,6 +12,7 @@
* @author Lisa Ditlefsen <lisa@vervesearch.com>
* @author Erik Pedersen <erik.pedersen@shaw.ca>
* @author Erik Bjørn Pedersen <erik.pedersen@shaw.ca>
+ * @author Rune Rasmussen syntaxerror.no@gmail.com
*/
$lang['menu'] = 'Behandle tillegg';
$lang['download'] = 'Last ned og installer et tillegg';
diff --git a/lib/plugins/plugin/lang/pt-br/admin_plugin.txt b/lib/plugins/plugin/lang/pt-br/admin_plugin.txt
index 1809bb585..9e49f5136 100644
--- a/lib/plugins/plugin/lang/pt-br/admin_plugin.txt
+++ b/lib/plugins/plugin/lang/pt-br/admin_plugin.txt
@@ -1,3 +1,3 @@
====== Gerenciamento de Plug-ins ======
-Nesta página você pode gerenciar tudo relacionado aos [[doku>plug-ins|plug-ins]] do DokuWiki. Para você baixar e instalar um plug-in o servidor web deve ter permissão de escrita na pasta onde ficam os plug-ins.
+Nesta página você pode gerenciar tudo relacionado aos [[doku>plugins|plug-ins]] do DokuWiki. Para você baixar e instalar um plug-in o servidor web deve ter permissão de escrita na pasta onde ficam os plug-ins.
diff --git a/lib/plugins/plugin/lang/pt-br/lang.php b/lib/plugins/plugin/lang/pt-br/lang.php
index 28955004f..bae962730 100644
--- a/lib/plugins/plugin/lang/pt-br/lang.php
+++ b/lib/plugins/plugin/lang/pt-br/lang.php
@@ -60,3 +60,4 @@ $lang['enabled'] = 'O plug-in %s foi habilitado.';
$lang['notenabled'] = 'Não foi possível habilitar o plug-in %s. Verifique as permissões de acesso.';
$lang['disabled'] = 'O plug-in %s foi desabilitado.';
$lang['notdisabled'] = 'Não foi possível desabilitar o plug-in %s. Verifique as permissões de acesso.';
+$lang['packageinstalled'] = 'O pacote do plugin (%d plugin%s: %s) foi instalado com sucesso.';
diff --git a/lib/plugins/plugin/lang/pt/lang.php b/lib/plugins/plugin/lang/pt/lang.php
index 3e9e6ae04..1567741f9 100644
--- a/lib/plugins/plugin/lang/pt/lang.php
+++ b/lib/plugins/plugin/lang/pt/lang.php
@@ -6,6 +6,7 @@
* @author Enrico Nicoletto <liverig@gmail.com>
* @author Fil <fil@meteopt.com>
* @author André Neves <drakferion@gmail.com>
+ * @author José Campos zecarlosdecampos@gmail.com
*/
$lang['menu'] = 'Gerir Plugins';
$lang['download'] = 'Descarregar e instalar um novo plugin';
@@ -51,3 +52,4 @@ $lang['enabled'] = 'Plugin %s habilitado.';
$lang['notenabled'] = 'Plugin %s não pôde ser habilitado, verifique as permissões.';
$lang['disabled'] = 'Plugin %s desabilitado.';
$lang['notdisabled'] = 'Plugin %s não pôde ser desabilitado, verifique as permissões.';
+$lang['packageinstalled'] = 'Pacote de Plugins (%d plugin%s: %s) instalado com sucesso.';
diff --git a/lib/plugins/plugin/lang/ru/lang.php b/lib/plugins/plugin/lang/ru/lang.php
index a33f95418..757b607f5 100644
--- a/lib/plugins/plugin/lang/ru/lang.php
+++ b/lib/plugins/plugin/lang/ru/lang.php
@@ -14,6 +14,8 @@
* @author Vlad Tsybenko <vlad.development@gmail.com>
* @author Aleksey Osadchiy <rfc@nm.ru>
* @author Aleksandr Selivanov <alexgearbox@gmail.com>
+ * @author Ladyko Andrey <fylh@succexy.spb.ru>
+ * @author Eugene <windy.wanderer@gmail.com>
*/
$lang['menu'] = 'Управление плагинами';
$lang['download'] = 'Скачать и установить новый плагин';
@@ -30,11 +32,11 @@ $lang['lastupdate'] = 'Последнее обновление:';
$lang['source'] = 'Источник:';
$lang['unknown'] = 'неизвестно';
$lang['updating'] = 'Обновление...';
-$lang['updated'] = 'Плагин %s успешно обновлен';
+$lang['updated'] = 'Плагин %s успешно обновлён';
$lang['updates'] = 'Следующие плагины были успешно обновлены';
$lang['update_none'] = 'Обновления не найдены.';
$lang['deleting'] = 'Удаление...';
-$lang['deleted'] = 'Плагин %s удален.';
+$lang['deleted'] = 'Плагин %s удалён.';
$lang['downloading'] = 'Скачивание...';
$lang['downloaded'] = 'Плагин %s успешно установлен';
$lang['downloads'] = 'Следующие плагины были успешно установлены:';
@@ -50,9 +52,9 @@ $lang['author'] = 'Автор:';
$lang['www'] = 'Странца:';
$lang['error'] = 'Произошла неизвестная ошибка.';
$lang['error_download'] = 'Не могу скачать файл плагина: %s';
-$lang['error_badurl'] = 'Возможно, неправильный адрес — не могу определить имя файла из адреса';
+$lang['error_badurl'] = 'Возможно неправильный адрес — не могу определить имя файла из адреса';
$lang['error_dircreate'] = 'Не могу создать временную директорию для скачивания';
-$lang['error_decompress'] = 'Менеджеру плагинов не удалось распаковать скачанный файл. Это может быть результатом ошибки при скачивании, в этом случае вы можете попробовать снова; или же плагин упакован неизвестным архиватором, тогда вам необходимо скачать и установить плагин вручную.';
+$lang['error_decompress'] = 'Менеджеру плагинов не удалось распаковать скачанный файл. Это может быть результатом ошибки при скачивании, в этом случае вы можете попробовать снова, или же плагин упакован неизвестным архиватором, тогда вам необходимо скачать и установить плагин вручную.';
$lang['error_copy'] = 'Произошла ошибка копирования при попытке установки файлов для плагина <em>%s</em>: переполнение диска или неправильные права доступа. Это могло привести к частичной установке плагина и неустойчивости вашей вики.';
$lang['error_delete'] = 'Произошла ошибка при попытке удалить плагин <em>%s</em>. Наиболее вероятно, что нет необходимых прав доступа к файлам или директориям';
$lang['enabled'] = 'Плагин %s включён.';
diff --git a/lib/plugins/plugin/lang/sk/lang.php b/lib/plugins/plugin/lang/sk/lang.php
index a10bc0fe4..7a8f32a53 100644
--- a/lib/plugins/plugin/lang/sk/lang.php
+++ b/lib/plugins/plugin/lang/sk/lang.php
@@ -51,3 +51,4 @@ $lang['enabled'] = 'Plugin %s aktivovaný.';
$lang['notenabled'] = 'Plugin %s nemôže byť aktivovaný, skontrolujte prístupové práva.';
$lang['disabled'] = 'Plugin %s deaktivovaný.';
$lang['notdisabled'] = 'Plugin %s nemôže byť deaktivovaný, skontrolujte prístupové práva.';
+$lang['packageinstalled'] = 'Plugin package (%d plugin%s: %s) úspešne inštalovaný.';
diff --git a/lib/plugins/plugin/lang/sl/admin_plugin.txt b/lib/plugins/plugin/lang/sl/admin_plugin.txt
new file mode 100644
index 000000000..2e99c6297
--- /dev/null
+++ b/lib/plugins/plugin/lang/sl/admin_plugin.txt
@@ -0,0 +1,3 @@
+====== Upravljanje vstavkov ======
+
+Na tej strani je mogoe spreminjati in prilagajati nastavitve Dokuwiki [[doku>plugins|vstavkov]]. Za prejemanje in nameanje vstavkov v ustrezne mape, morajo imeti te doloena ustrezna dovoljenja za pisanje spletnega strenika.
diff --git a/lib/plugins/plugin/lang/sl/lang.php b/lib/plugins/plugin/lang/sl/lang.php
index 9423e4e75..39ba20139 100644
--- a/lib/plugins/plugin/lang/sl/lang.php
+++ b/lib/plugins/plugin/lang/sl/lang.php
@@ -4,19 +4,51 @@
*
* @author Dejan Levec <webphp@gmail.com>
* @author Boštjan Seničar <senicar@gmail.com>
+ * @author Gregor Skumavc (grega.skumavc@gmail.com)
+ * @author Matej Urbančič (mateju@svn.gnome.org)
*/
+
+$lang['menu'] = 'Upravljanje vstavkov';
+$lang['download'] = 'Prejmi in namesti nov vstavek';
+$lang['manage'] = 'Nameščeni vstavki';
+$lang['btn_info'] = 'Podrobnosti';
+$lang['btn_update'] = 'Posodobi';
$lang['btn_delete'] = 'Izbriši';
$lang['btn_settings'] = 'Nastavitve';
+$lang['btn_download'] = 'Prejmi';
$lang['btn_enable'] = 'Shrani';
$lang['url'] = 'URL';
$lang['installed'] = 'Nameščeno:';
$lang['lastupdate'] = 'Nazadnje posodobljeno:';
$lang['source'] = 'Vir:';
+$lang['unknown'] = 'neznano';
$lang['updating'] = 'Posodabljanje ...';
+$lang['updated'] = 'Vstavek %s je uspešno posodobljen';
+$lang['updates'] = 'Navedeni vstavki so uspešno posodobljeni';
+$lang['update_none'] = 'Posodobitev ni mogoče najti.';
$lang['deleting'] = 'Brisanje ...';
+$lang['deleted'] = 'Vstavek %s je izbrisan.';
+$lang['downloading'] = 'Prejemanje ...';
+$lang['downloaded'] = 'Vstavek %s je uspešno nameščen';
+$lang['downloads'] = 'Navedeni vstavki so uspešno nameščeni:';
+$lang['download_none'] = 'Vstavkov ni mogoče najti ali pa je prišlo do napake med prejemanjem in nameščanjem.';
+$lang['plugin'] = 'Vstavek:';
+$lang['components'] = 'Sestavni deli';
+$lang['noinfo'] = 'Vstavek nima vpisanih podrobnih podatkov, kar pomeni, da je morda neveljaven.';
$lang['name'] = 'Ime:';
$lang['date'] = 'Datum:';
-$lang['type'] = 'Tip:';
+$lang['type'] = 'Vrsta:';
$lang['desc'] = 'Opis:';
$lang['author'] = 'Avtor:';
$lang['www'] = 'Spletna stran:';
+$lang['error'] = 'Prišlo je do neznane napake.';
+$lang['error_download'] = 'Ni mogoče prejeti datoteke vstavka: %s';
+$lang['error_badurl'] = 'Napaka naslova URL - ni mogoče določiti imena datoteke iz naslova URL';
+$lang['error_dircreate'] = 'Ni mogoče ustvariti začasne mape za prejemanje';
+$lang['error_decompress'] = 'Z upravljalnikom vstavkov ni mogoče razširiti prejetega arhiva vstavka. Najverjetneje je prišlo do napake med prejemanjem datoteke ali pa zapis arhiva ni znan. Poskusite znova ali pa napako odpravite z ročnim nameščanjem vstavka.';
+$lang['error_copy'] = 'Prišlo je do napake med nameščanjem datotek vstavka <em>%s</em>: najverjetneje so težave s prostorom za namestitev ali pa ni ustreznih dovoljenj za nameščanje. Zaradi nepopolne namestitve lahko nastopijo težave v delovanju sistema Wiki.';
+$lang['error_delete'] = 'Prišlo je do napake med brisanjem vstavka <em>%s</em>: najverjetneje ni ustreznih dovoljenj za dostop do datoteke ali mape';
+$lang['enabled'] = 'Vstavek %s je omogočen.';
+$lang['notenabled'] = 'Vstavka %s ni mogoče omogočiti zaradi neustreznih dovoljen.';
+$lang['disabled'] = 'Vstavek %s je onemogočen.';
+$lang['notdisabled'] = 'Vstavka %s ni mogoče onemogočiti zaradi neustreznih dovoljen.';
diff --git a/lib/plugins/plugin/lang/sv/lang.php b/lib/plugins/plugin/lang/sv/lang.php
index 0fe03387b..5892e42b5 100644
--- a/lib/plugins/plugin/lang/sv/lang.php
+++ b/lib/plugins/plugin/lang/sv/lang.php
@@ -15,6 +15,7 @@
* @author Bogge Bogge <bogge@bogge.com>
* @author Peter Åström <eaustreum@gmail.com>
* @author Håkan Sandell <hakan.sandell@home.se>
+ * @author mikael@mallander.net
*/
$lang['menu'] = 'Hantera insticksmoduler';
$lang['download'] = 'Ladda ned och installera en ny insticksmodul';
diff --git a/lib/plugins/plugin/lang/uk/lang.php b/lib/plugins/plugin/lang/uk/lang.php
index c5bab816f..69ee9ded1 100644
--- a/lib/plugins/plugin/lang/uk/lang.php
+++ b/lib/plugins/plugin/lang/uk/lang.php
@@ -9,13 +9,14 @@
* @author Oleksandr Kunytsia <okunia@gmail.com>
* @author Uko uko@uar.net
* @author Ulrikhe Lukoie <lukoie@gmail>.com
+ * @author Kate Arzamastseva pshns@ukr.net
*/
$lang['menu'] = 'Керування доданками';
$lang['download'] = 'Завантажити та встановити новий доданок';
$lang['manage'] = 'Встановлені доданки';
$lang['btn_info'] = 'дані';
$lang['btn_update'] = 'оновити';
-$lang['btn_delete'] = 'вилучити';
+$lang['btn_delete'] = 'видалити';
$lang['btn_settings'] = 'параметри';
$lang['btn_download'] = 'Завантажити';
$lang['btn_enable'] = 'Зберегти';
@@ -49,8 +50,9 @@ $lang['error_badurl'] = 'Можливо, невірна адреса -
$lang['error_dircreate'] = 'Не можливо створити тимчасову папку для завантаження';
$lang['error_decompress'] = 'Менеджеру доданків не вдалося розпакувати завантажений файл. Це може бути результатом помилки при завантаженні, в цьому разі ви можете спробувати знову; або ж доданок упакований невідомим архіватором, тоді вам необхідно завантажити та встановити доданок вручну.';
$lang['error_copy'] = 'Виникла помилка копіювання при спробі установки файлів для доданка <em>%s</em>: переповнення диску або невірні права доступу. Це могло привести до часткової установки доданка и нестійкості вашої Вікі.';
-$lang['error_delete'] = 'При спробі вилучення доданка <em>%s</em> виникла помилка. Найбільш вірогідно, що немає необхідних прав доступу до файлів або тек';
+$lang['error_delete'] = 'При спробі вилучення доданка <em>%s</em> виникла помилка. Найбільш вірогідно, що немає необхідних прав доступу до файлів або директорії';
$lang['enabled'] = 'Доданок %s увімкнено.';
$lang['notenabled'] = 'Не вдається увімкнути доданок %s. Перевірте права доступу до файлу.';
$lang['disabled'] = 'Доданок %s вимкнено.';
$lang['notdisabled'] = 'Не вдається вимкнути доданок %s. Перевірте права доступу до файлу.';
+$lang['packageinstalled'] = 'Пакет плагінів (%d plugin%s: %s) успішно встановлений.';
diff --git a/lib/plugins/plugin/lang/zh-tw/admin_plugin.txt b/lib/plugins/plugin/lang/zh-tw/admin_plugin.txt
index 41d630199..84d095f51 100644
--- a/lib/plugins/plugin/lang/zh-tw/admin_plugin.txt
+++ b/lib/plugins/plugin/lang/zh-tw/admin_plugin.txt
@@ -1,3 +1,3 @@
====== 插件管理器 ======
-本頁中您可以管理與 Dokuwiki [[doku>plugins|插件]] 相關的選項。 要通過插件管理器正常下載並安裝插件,插件所在的文件夾必須可寫。
+您可以用本頁管理與 Dokuwiki [[doku>plugins|插件]] 相關的選項。若要正常下載及安裝插件,插件所在的資料夾必須允許網頁伺服器寫入。
diff --git a/lib/plugins/plugin/lang/zh-tw/lang.php b/lib/plugins/plugin/lang/zh-tw/lang.php
index 2e480ee15..54234212d 100644
--- a/lib/plugins/plugin/lang/zh-tw/lang.php
+++ b/lib/plugins/plugin/lang/zh-tw/lang.php
@@ -7,10 +7,12 @@
* @author Wayne San <waynesan@zerozone.tw>
* @author Li-Jiun Huang <ljhuang.tw@gmai.com>
* @author Cheng-Wei Chien <e.cwchien@gmail.com>
+ * @author Danny Lin
+ * @author Shuo-Ting Jian <shoting@gmail.com>
*/
-$lang['menu'] = '管理外掛(Plugins)';
-$lang['download'] = '下載與安裝外掛';
-$lang['manage'] = '已安裝的外掛';
+$lang['menu'] = '管理插件 (Plugins)';
+$lang['download'] = '下載與安裝插件';
+$lang['manage'] = '已安裝的插件';
$lang['btn_info'] = '資訊';
$lang['btn_update'] = '更新';
$lang['btn_delete'] = '刪除';
@@ -20,21 +22,21 @@ $lang['btn_enable'] = '儲存';
$lang['url'] = 'URL';
$lang['installed'] = '安裝:';
$lang['lastupdate'] = '上次更新:';
-$lang['source'] = '来源:';
+$lang['source'] = '來源:';
$lang['unknown'] = '未知';
$lang['updating'] = '更新中 ...';
-$lang['updated'] = '外掛(Plugin) %s 成功地更新';
-$lang['updates'] = '以下的外掛(Plugin)已經成功地更新';
+$lang['updated'] = '插件 %s 成功地更新';
+$lang['updates'] = '以下的插件已經成功地更新';
$lang['update_none'] = '找不到更新';
$lang['deleting'] = '刪除中 ...';
-$lang['deleted'] = '外掛(Plugin) %s 已刪除。';
+$lang['deleted'] = '插件 %s 已刪除。';
$lang['downloading'] = '下載中 ...';
-$lang['downloaded'] = '外掛(Plugin) %s 已成功地安裝';
-$lang['downloads'] = '以下的外掛(Plugins)已成功地安裝:';
-$lang['download_none'] = '找不到外掛, 或是下載與安裝的期間發生了一些未知的問題';
-$lang['plugin'] = '外掛(Plugin):';
+$lang['downloaded'] = '插件 %s 已成功地安裝';
+$lang['downloads'] = '以下的插件已成功地安裝:';
+$lang['download_none'] = '找不到插件,或在下載與安裝時發生了未知的問題';
+$lang['plugin'] = '插件:';
$lang['components'] = '元件';
-$lang['noinfo'] = '此外掛沒有回傳任何資訊, 可能是無效的';
+$lang['noinfo'] = '此插件沒有回傳任何資訊,可能是無效的';
$lang['name'] = '名稱:';
$lang['date'] = '日期:';
$lang['type'] = '類型:';
@@ -42,13 +44,14 @@ $lang['desc'] = '描述:';
$lang['author'] = '作者:';
$lang['www'] = '網頁:';
$lang['error'] = '一個未知的錯誤發生。';
-$lang['error_download'] = '無法下載外掛檔案: %s';
+$lang['error_download'] = '無法下載插件檔案: %s';
$lang['error_badurl'] = 'URL 可能有問題 - 從 URL 中無法得知文件名';
$lang['error_dircreate'] = '無法建立暫存目錄來接收下載的內容';
$lang['error_decompress'] = '插件管理器無法解壓下載的文件。這可能是由於下載出現錯誤,遇到這種情況,請您再次嘗試;或者是壓縮格式無法識別,遇到這種情況,您需要手動下載並安裝該插件。';
-$lang['error_copy'] = '嘗試安裝插件 <em>%s</em> 的相關文件時產生一個復制錯誤:磁盤空間已滿或文件訪問權限錯誤。這可能是由於一個安裝了一部分的插件,並使得您的維基系統不穩定。';
-$lang['error_delete'] = '嘗試刪除插件 <em>%s</em> 時產生一個錯誤。最有可能的情況是文件或路徑的訪問權限不夠';
-$lang['enabled'] = '插件 %s 已啟動。';
-$lang['notenabled'] = '插件 %s 無法啟動,請檢查檔案權限。';
+$lang['error_copy'] = '嘗試安裝插件 <em>%s</em> 的相關文件時發生複製錯誤:可能是磁碟空間不足或檔案存取權限錯誤。這可能是由於未安裝完全的插件使維基系統不穩定導致。';
+$lang['error_delete'] = '嘗試刪除插件 <em>%s</em> 時發生錯誤。最可能原因是檔案或目錄存取權限不足';
+$lang['enabled'] = '插件 %s 已啟用。';
+$lang['notenabled'] = '插件 %s 無法啟用,請檢查檔案權限。';
$lang['disabled'] = '插件 %s 已停用。';
$lang['notdisabled'] = '插件 %s 無法停用,請檢查檔案權限。';
+$lang['packageinstalled'] = '插件 (%d 插件%s: %s) 已成功地安裝。';
diff --git a/lib/plugins/plugin/lang/zh/lang.php b/lib/plugins/plugin/lang/zh/lang.php
index af2db4ee5..6fc1f4d7d 100644
--- a/lib/plugins/plugin/lang/zh/lang.php
+++ b/lib/plugins/plugin/lang/zh/lang.php
@@ -11,6 +11,8 @@
* @author ben <ben@livetom.com>
* @author lainme <lainme993@gmail.com>
* @author caii <zhoucaiqi@gmail.com>
+ * @author Hiphen Lee <jacob.b.leung@gmail.com>
+ * @author caii, patent agent in China <zhoucaiqi@gmail.com>
*/
$lang['menu'] = '插件管理器';
$lang['download'] = '下载并安装新的插件';
@@ -56,3 +58,4 @@ $lang['enabled'] = '%s 插件启用';
$lang['notenabled'] = '%s插件启用失败,请检查文件权限。';
$lang['disabled'] = '%s 插件禁用';
$lang['notdisabled'] = '%s插件禁用失败,请检查文件权限。';
+$lang['packageinstalled'] = '插件 (%d plugin%s: %s) 已成功安装。';
diff --git a/lib/plugins/popularity/action.php b/lib/plugins/popularity/action.php
index ce10808b9..bf11efba6 100644
--- a/lib/plugins/popularity/action.php
+++ b/lib/plugins/popularity/action.php
@@ -48,10 +48,10 @@ class action_plugin_popularity extends Dokuwiki_Action_Plugin {
/**
* Check if it's time to send autosubmit data
- * (we should have check the autosubmit is enabled first)
+ * (we should have check if autosubmit is enabled first)
*/
function _isTooEarlyToSubmit(){
- $lastSubmit = @filemtime($this->helper->autosubmitFile);
+ $lastSubmit = $this->helper->lastSentTime();
return $lastSubmit + 24*60*60*30 > time();
}
}
diff --git a/lib/plugins/popularity/admin.php b/lib/plugins/popularity/admin.php
index 22ddb245b..a04e98a66 100644
--- a/lib/plugins/popularity/admin.php
+++ b/lib/plugins/popularity/admin.php
@@ -53,6 +53,10 @@ class admin_plugin_popularity extends DokuWiki_Admin_Plugin {
//Send the data
if ( isset($_REQUEST['data']) ){
$this->sentStatus = $this->helper->sendData( $_REQUEST['data'] );
+ if ( $this->sentStatus === '' ){
+ //Update the last time we sent the data
+ touch ( $this->helper->popularityLastSubmitFile );
+ }
//Deal with the autosubmit option
$this->_enableAutosubmit( isset($_REQUEST['autosubmit']) );
}
@@ -87,6 +91,12 @@ class admin_plugin_popularity extends DokuWiki_Admin_Plugin {
flush();
echo $this->buildForm('server');
+
+ //Print the last time the data was sent
+ $lastSent = $this->helper->lastSentTime();
+ if ( $lastSent !== 0 ){
+ echo $this->getLang('lastSent') . ' ' . datetime_h($lastSent);
+ }
} else {
//If we just submitted the form
if ( $this->sentStatus === '' ){
@@ -127,8 +137,8 @@ class admin_plugin_popularity extends DokuWiki_Admin_Plugin {
.($this->helper->isAutosubmitEnabled() ? 'checked' : '' )
.'/>' . $this->getLang('autosubmit') .'<br />'
.'</label>'
- .'<input type="hidden" name="do" value="admin">'
- .'<input type="hidden" name="page" value="popularity">';
+ .'<input type="hidden" name="do" value="admin" />'
+ .'<input type="hidden" name="page" value="popularity" />';
}
$form .= '<input type="submit" class="button" value="'.$this->getLang('submit').'"/>'
.'</fieldset>'
diff --git a/lib/plugins/popularity/helper.php b/lib/plugins/popularity/helper.php
index 00a359cbd..af1e8a706 100644
--- a/lib/plugins/popularity/helper.php
+++ b/lib/plugins/popularity/helper.php
@@ -13,7 +13,7 @@ class helper_plugin_popularity extends Dokuwiki_Plugin {
/**
* Name of the file which determine if the the autosubmit is enabled,
- * and when it was submited for the las time
+ * and when it was submited for the last time
*/
var $autosubmitFile;
@@ -22,10 +22,19 @@ class helper_plugin_popularity extends Dokuwiki_Plugin {
*/
var $autosubmitErrorFile;
+ /**
+ * Name of the file which determine when the popularity data was manually
+ * submitted for the last time
+ * (If this file doesn't exist, the data has never been sent)
+ */
+ var $popularityLastSubmitFile;
+
+
function helper_plugin_popularity(){
global $conf;
$this->autosubmitFile = $conf['cachedir'].'/autosubmit.txt';
$this->autosubmitErrorFile = $conf['cachedir'].'/autosubmitError.txt';
+ $this->popularityLastSubmitFile = $conf['cachedir'].'/lastSubmitTime.txt';
}
function getMethods(){
@@ -48,6 +57,12 @@ class helper_plugin_popularity extends Dokuwiki_Plugin {
'params' => array(),
'return' => array('data' => 'string')
);
+ $result[] = array(
+ 'name' => 'lastSentTime',
+ 'desc' => 'Compute the last time popularity data was sent',
+ 'params' => array(),
+ 'return' => array('data' => 'int')
+ );
return $result;
}
@@ -76,6 +91,16 @@ class helper_plugin_popularity extends Dokuwiki_Plugin {
}
/**
+ * Compute the last time the data was sent. If it has never been sent, we return 0.
+ */
+ function lastSentTime(){
+ $manualSubmission = @filemtime($this->popularityLastSubmitFile);
+ $autoSubmission = @filemtime($this->autosubmitFile);
+
+ return max((int) $manualSubmission, (int) $autoSubmission);
+ }
+
+ /**
* Gather all information
* @return The popularity data as a string
*/
@@ -109,6 +134,7 @@ class helper_plugin_popularity extends Dokuwiki_Plugin {
$data['popversion'] = $this->version;
$data['language'] = $conf['lang'];
$data['now'] = time();
+ $data['popauto'] = (int) $this->isAutoSubmitEnabled();
// some config values
$data['conf_useacl'] = $conf['useacl'];
diff --git a/lib/plugins/popularity/lang/ar/intro.txt b/lib/plugins/popularity/lang/ar/intro.txt
index e5710af36..a81fede51 100644
--- a/lib/plugins/popularity/lang/ar/intro.txt
+++ b/lib/plugins/popularity/lang/ar/intro.txt
@@ -1,9 +1,9 @@
====== Popularity Feedback ======
-تجمع هذه الأداة بيانات مجهولة الاسم وتسمح لك بردها لمطوري لدوكي ويكي. يساعدهم ذلك على معرفة كيفية استخدام دوكي ويكي من المستخدمين والتأكد من أن التطويرات المستقبلية مدعومة بتقارير استخدام حقيقية.
+تجمع هذه الأداة بيانات مجهولة الاسم وتسمح لك بردها لمطوري دوكو ويكي. يساعدهم ذلك على معرفة كيفية استخدام دوكو ويكي من المستخدمين والتأكد من أن التطويرات المستقبلية مدعومة بتقارير استخدام حقيقية.
نشجعك على تكرار هذه الخطوة من وقت لآخر لابقاء المطورين على علم بنمو الويكي خاصتك. بياناتك المرسلة مكررا ستحتفظ ب ID بلا اسماء يميزها.
-البيانات المرسلة تحتوي معلومات مثل اصدار دوكي ويكي، عدد وحجم صفحاتك وملفاتك، الاضافات المركبة و معلومات عن PHP عندك.
+البيانات المرسلة تحتوي معلومات مثل اصدار دوكو ويكي، عدد وحجم صفحاتك وملفاتك، الاضافات المركبة و معلومات عن PHP عندك.
البيانات التي سترسل معروضة صرفا أسفله. رجاء استخدم زر "أرسل البيانات" لنقل المعلومات. \ No newline at end of file
diff --git a/lib/plugins/popularity/lang/ar/lang.php b/lib/plugins/popularity/lang/ar/lang.php
index c0e7dc6af..481668505 100644
--- a/lib/plugins/popularity/lang/ar/lang.php
+++ b/lib/plugins/popularity/lang/ar/lang.php
@@ -4,6 +4,12 @@
*
* @author Yaman Hokan <always.smile.yh@hotmail.com>
* @author Usama Akkad <uahello@gmail.com>
+ * @author uahello@gmail.com
*/
$lang['name'] = 'رد الشعبية (قد يأخذ بعض الوقت ليحمل)';
$lang['submit'] = 'أرسل البيانات';
+$lang['autosubmit'] = 'ارسل البيانات آليا كل شهر';
+$lang['submissionFailed'] = 'تعذر إرسال البيانات بسبب الخطأ التالي:';
+$lang['submitDirectly'] = 'يمكنك إرسال البيانات يدويا بارسال النموذج التالي.';
+$lang['autosubmitError'] = 'فشلت آخر محاولة للإرسال، بسبب الخطأ التالي:';
+$lang['lastSent'] = 'أرسلت البيانات';
diff --git a/lib/plugins/popularity/lang/ar/submitted.txt b/lib/plugins/popularity/lang/ar/submitted.txt
new file mode 100644
index 000000000..085e3bd98
--- /dev/null
+++ b/lib/plugins/popularity/lang/ar/submitted.txt
@@ -0,0 +1,3 @@
+====== رد الشعبية ======
+
+أرسلت البيانات بنجاح. \ No newline at end of file
diff --git a/lib/plugins/popularity/lang/bg/intro.txt b/lib/plugins/popularity/lang/bg/intro.txt
index 06c338585..35023b897 100644
--- a/lib/plugins/popularity/lang/bg/intro.txt
+++ b/lib/plugins/popularity/lang/bg/intro.txt
@@ -1,9 +1,9 @@
-====== Обратна връзка за популярност ======
+====== Обратна връзка ======
-Този инструмент събира данни за потребителите на Вашето Wiki и ви позволява да ги изпратите анонимно на DokuWiki. Това ни помага да разберем как DokuWiki се използва от потребителите си и да разработваме бъдещи решения, съответно реалното използване.
+Инструментът събира данни за вашето Wiki и ви позволява да ги изпратите да разработчиците на DokuWiki. Информацията ще им помогне да разберат как DokuWiki се ползва от потребителите и че статистиката е в подкрепа на поетата насока за развитие.
-Моля изпозвайте тази опция, за да информирате разработчиците на този продукт. Вашите данни ще бъдат идентифицирани с анонимен номер.
+Моля, ползвайте функцията, от време на време, когато уебстраницата ви се разраства, за да информирате разработчиците. Изпратените данни ще бъдат идентифицирани с анонимен идентификатор.
-Събраните данни съдържат информация за вашата версия на DokuWiki, броя и размера на вашите страници и файлове, инсталирани плъгини и информация за вашата PHP инсталация.
+Събираните данни съдържат информация като версията на DokuWiki, броя и размера на вашите страници и файлове, инсталирани приставки и информация за локалната инсталация на PHP.
-Изходните данни са показано по-долу във вида, в който ще бъдат изпратени. Моля ползвайте сьответния бутон, за да изпратите тази информация. \ No newline at end of file
+Данните, които ще бъдат изпратени са изобразени отдолу. Моля, натиснете бутона "Изпращане на данните", за да бъдат изпратени. \ No newline at end of file
diff --git a/lib/plugins/popularity/lang/bg/lang.php b/lib/plugins/popularity/lang/bg/lang.php
index adf99a9f5..ba731c0fc 100644
--- a/lib/plugins/popularity/lang/bg/lang.php
+++ b/lib/plugins/popularity/lang/bg/lang.php
@@ -3,6 +3,12 @@
* Bulgarian language file
*
* @author Viktor Usunov <usun0v@mail.bg>
+ * @author Kiril <neohidra@gmail.com>
*/
-$lang['name'] = 'Обратна връзка за популярност (може да отнеме известно време за зареждане)';
-$lang['submit'] = 'Прати данните';
+$lang['name'] = 'Обратна връзка (зареждането изисква време)';
+$lang['submit'] = 'Изпращане на данните';
+$lang['autosubmit'] = 'Автоматично изпращане на данните веднъж в месеца';
+$lang['submissionFailed'] = 'Данните не могат да бъдат изпратени поради следната грешка:';
+$lang['submitDirectly'] = 'Можете да изпратите данните ръчно чрез следния формуляр.';
+$lang['autosubmitError'] = 'Последното автоматично изпращане се провали, поради следната грешка:';
+$lang['lastSent'] = 'Данните са изпратени';
diff --git a/lib/plugins/popularity/lang/bg/submitted.txt b/lib/plugins/popularity/lang/bg/submitted.txt
new file mode 100644
index 000000000..3ecd24f96
--- /dev/null
+++ b/lib/plugins/popularity/lang/bg/submitted.txt
@@ -0,0 +1,3 @@
+====== Обратна връзка ======
+
+Данните са изпратени успешно. \ No newline at end of file
diff --git a/lib/plugins/popularity/lang/cs/lang.php b/lib/plugins/popularity/lang/cs/lang.php
index c992ec4c6..b0dc4d1a8 100644
--- a/lib/plugins/popularity/lang/cs/lang.php
+++ b/lib/plugins/popularity/lang/cs/lang.php
@@ -6,6 +6,12 @@
* @author tomas@valenta.cz
* @author Marek Sacha <sachamar@fel.cvut.cz>
* @author Lefty <lefty@multihost.cz>
+ * @author Vojta Beran <xmamut@email.cz>
*/
$lang['name'] = 'Průzkum používání (může chviličku trvat, než se natáhne)';
$lang['submit'] = 'Odeslat data';
+$lang['autosubmit'] = 'Automaticky odesílat data jednou měsíčně';
+$lang['submissionFailed'] = 'Data nemohla být odeslána kvůli následující chybě:';
+$lang['submitDirectly'] = 'Data můžete odeslat ručně zasláním následujícího formuláře.';
+$lang['autosubmitError'] = 'Poslední automatické odeslání selhalo kvůli následující chybě:';
+$lang['lastSent'] = 'Data byla odeslána.';
diff --git a/lib/plugins/popularity/lang/cs/submitted.txt b/lib/plugins/popularity/lang/cs/submitted.txt
new file mode 100644
index 000000000..ff1f41c9f
--- /dev/null
+++ b/lib/plugins/popularity/lang/cs/submitted.txt
@@ -0,0 +1,3 @@
+===== Průzkum používání =====
+
+Data byla úspěšně odeslána. \ No newline at end of file
diff --git a/lib/plugins/popularity/lang/de-informal/lang.php b/lib/plugins/popularity/lang/de-informal/lang.php
index 076b37115..f884ed690 100644
--- a/lib/plugins/popularity/lang/de-informal/lang.php
+++ b/lib/plugins/popularity/lang/de-informal/lang.php
@@ -6,6 +6,12 @@
* @author Juergen Schwarzer <jschwarzer@freenet.de>
* @author Marcel Metz <marcel_metz@gmx.de>
* @author Matthias Schulte <post@lupo49.de>
+ * @author Christian Wichmann <nospam@zone0.de>
*/
$lang['name'] = 'Popularitätsrückmeldung (kann eine Weile dauern, bis es fertig geladen wurde)';
$lang['submit'] = 'Sende Daten';
+$lang['autosubmit'] = 'Daten einmal im Monat automatisch senden';
+$lang['submissionFailed'] = 'Die Daten konnten aufgrund des folgenden Fehlers nicht gesendet werden: ';
+$lang['submitDirectly'] = 'Du kannst die Daten durch Betätigung des Buttons manuell versenden.';
+$lang['autosubmitError'] = 'Beim letzten automatischen Versuch die Daten zu senden, ist folgender Fehler aufgetreten: ';
+$lang['lastSent'] = 'Die Daten wurden gesendet';
diff --git a/lib/plugins/popularity/lang/de-informal/submitted.txt b/lib/plugins/popularity/lang/de-informal/submitted.txt
new file mode 100644
index 000000000..e7b45b5b7
--- /dev/null
+++ b/lib/plugins/popularity/lang/de-informal/submitted.txt
@@ -0,0 +1,3 @@
+====== Popularitäts-Feedback ======
+
+Die Daten wurden erfolgreich versandt. \ No newline at end of file
diff --git a/lib/plugins/popularity/lang/de/lang.php b/lib/plugins/popularity/lang/de/lang.php
index 1372e9d8a..4649062f7 100644
--- a/lib/plugins/popularity/lang/de/lang.php
+++ b/lib/plugins/popularity/lang/de/lang.php
@@ -11,6 +11,13 @@
* @author Blitzi94@gmx.de
* @author Robert Bogenschneider <robog@GMX.de>
* @author Robert Bogenschneider <robog@gmx.de>
+ * @author Niels Lange <niels@boldencursief.nl>
+ * @author Christian Wichmann <nospam@zone0.de>
*/
$lang['name'] = 'Popularitäts-Feedback (Eventuell längere Ladezeit)';
$lang['submit'] = 'Daten senden';
+$lang['autosubmit'] = 'Daten einmal im Monat automatisch senden';
+$lang['submissionFailed'] = 'Die Daten konnten aufgrund des folgenden Fehlers nicht gesendet werden: ';
+$lang['submitDirectly'] = 'Sie können die Daten durch Betätigung des Buttons manuell versenden.';
+$lang['autosubmitError'] = 'Beim letzten automatischen Versuch die Daten zu senden, ist folgender Fehler aufgetreten: ';
+$lang['lastSent'] = 'Die Daten wurden gesendet';
diff --git a/lib/plugins/popularity/lang/de/submitted.txt b/lib/plugins/popularity/lang/de/submitted.txt
new file mode 100644
index 000000000..e7b45b5b7
--- /dev/null
+++ b/lib/plugins/popularity/lang/de/submitted.txt
@@ -0,0 +1,3 @@
+====== Popularitäts-Feedback ======
+
+Die Daten wurden erfolgreich versandt. \ No newline at end of file
diff --git a/lib/plugins/popularity/lang/el/lang.php b/lib/plugins/popularity/lang/el/lang.php
index 0d16bbf86..41704fa06 100644
--- a/lib/plugins/popularity/lang/el/lang.php
+++ b/lib/plugins/popularity/lang/el/lang.php
@@ -7,3 +7,8 @@
*/
$lang['name'] = 'Αναφορά Δημοτικότητας (ίσως αργήσει λίγο να εμφανιστεί)';
$lang['submit'] = 'Αποστολή Δεδομένων';
+$lang['autosubmit'] = 'Να αποστέλονται τα δεδομένα αυτόματα μια φορά το μήνα.';
+$lang['submissionFailed'] = 'Τα δεδομένα δεν ήταν δυνατό να αποσταλλούν λόγω του παρακάτω σφάλματος:';
+$lang['submitDirectly'] = 'Μπορείτε να αποστείλλετε τα δεδομένα χειροκίνητα με την υποβολή της παρακάτω φόρμας.';
+$lang['autosubmitError'] = 'Η τελευταία αυτόματη υποβολή των δεδομένων απέτυχε με το παρακάτω μήνυμα σφάλματος:';
+$lang['lastSent'] = 'Τα δεδομένα έχουν σταλεί.';
diff --git a/lib/plugins/popularity/lang/el/submitted.txt b/lib/plugins/popularity/lang/el/submitted.txt
new file mode 100644
index 000000000..8004f9997
--- /dev/null
+++ b/lib/plugins/popularity/lang/el/submitted.txt
@@ -0,0 +1,3 @@
+====== Αποτέλεσμα Υποβολής Δημοσιότητας ======
+
+Τα δεδομένα στάλθηκαν επιτυχώς. \ No newline at end of file
diff --git a/lib/plugins/popularity/lang/en/lang.php b/lib/plugins/popularity/lang/en/lang.php
index a94623718..af6797cb2 100644
--- a/lib/plugins/popularity/lang/en/lang.php
+++ b/lib/plugins/popularity/lang/en/lang.php
@@ -6,3 +6,4 @@ $lang['autosubmit'] = 'Automatically send data once a month';
$lang['submissionFailed'] = 'The data couldn\'t be sent due to the following error:';
$lang['submitDirectly'] = 'You can send the data manually by submitting the following form.';
$lang['autosubmitError'] = 'The last autosubmit failed, because of the following error: ';
+$lang['lastSent'] = 'The data has been sent';
diff --git a/lib/plugins/popularity/lang/eo/lang.php b/lib/plugins/popularity/lang/eo/lang.php
index 9326cc741..a7c124f51 100644
--- a/lib/plugins/popularity/lang/eo/lang.php
+++ b/lib/plugins/popularity/lang/eo/lang.php
@@ -12,3 +12,8 @@
*/
$lang['name'] = 'Populareca enketo (eble la ŝargo prokrastos iomete)';
$lang['submit'] = 'Sendi datenaron';
+$lang['autosubmit'] = 'Aŭtomate sendi datumaron monate';
+$lang['submissionFailed'] = 'La datumaro ne povis esti sendata pro la jena eraro:';
+$lang['submitDirectly'] = 'Vi povas sendi vi mem la datumaron per la sekva informilo.';
+$lang['autosubmitError'] = 'La lasta aŭtomata sendo malsukcesis, pro la jena eraro:';
+$lang['lastSent'] = 'La datumaro estas sendita';
diff --git a/lib/plugins/popularity/lang/es/lang.php b/lib/plugins/popularity/lang/es/lang.php
index c76190c2c..5e42cd45c 100644
--- a/lib/plugins/popularity/lang/es/lang.php
+++ b/lib/plugins/popularity/lang/es/lang.php
@@ -16,6 +16,12 @@
* @author Victor Castelan <victorcastelan@gmail.com>
* @author Mauro Javier Giamberardino <mgiamberardino@gmail.com>
* @author Oscar M. Lage <r0sk10@gmail.com>
+ * @author emezeta <emezeta@infoprimo.com>
*/
$lang['name'] = 'Retroinformación (Feedback) plugin Popularity';
$lang['submit'] = 'Enviar datos';
+$lang['autosubmit'] = 'Enviar automáticamente datos una vez al mes';
+$lang['submissionFailed'] = 'Los datos no se pudo enviar debido al error siguiente:';
+$lang['submitDirectly'] = 'Puede enviar los datos de forma manual mediante la presentación de la siguiente forma.';
+$lang['autosubmitError'] = 'El último auto no pudo presentar, debido al error siguiente:';
+$lang['lastSent'] = 'Los datos se han enviado';
diff --git a/lib/plugins/popularity/lang/es/submitted.txt b/lib/plugins/popularity/lang/es/submitted.txt
new file mode 100644
index 000000000..bb1754cdd
--- /dev/null
+++ b/lib/plugins/popularity/lang/es/submitted.txt
@@ -0,0 +1,3 @@
+====== Retroinformación Popularity ======
+
+Los datos se han enviado con éxito. \ No newline at end of file
diff --git a/lib/plugins/popularity/lang/et/lang.php b/lib/plugins/popularity/lang/et/lang.php
new file mode 100644
index 000000000..ca1410ab0
--- /dev/null
+++ b/lib/plugins/popularity/lang/et/lang.php
@@ -0,0 +1,7 @@
+<?php
+/**
+ * Estonian language file
+ *
+ * @author kristian.kankainen@kuu.la
+ * @author Rivo Zängov <eraser@eraser.ee>
+ */
diff --git a/lib/plugins/popularity/lang/eu/lang.php b/lib/plugins/popularity/lang/eu/lang.php
index a4d16c020..05e4262de 100644
--- a/lib/plugins/popularity/lang/eu/lang.php
+++ b/lib/plugins/popularity/lang/eu/lang.php
@@ -6,3 +6,8 @@
*/
$lang['name'] = 'Popularitate Feedback-a (denbora dezente iraun dezake kargatzen)';
$lang['submit'] = 'Datuak Bidali';
+$lang['autosubmit'] = 'Automatikoki bidali informazioa hilabetean behin';
+$lang['submissionFailed'] = 'Informazioa ezin izan da bidali ondorengo errorea dela eta:';
+$lang['submitDirectly'] = 'Informazioa eskuz bidali dezakezu ondorengo formularioa bidaliz.';
+$lang['autosubmitError'] = 'Azken bidalketa automatikoak huts egin zuen ondorengo errorea dela eta:';
+$lang['lastSent'] = 'Informazioa bidalia izan da';
diff --git a/lib/plugins/popularity/lang/eu/submitted.txt b/lib/plugins/popularity/lang/eu/submitted.txt
new file mode 100644
index 000000000..94c81a528
--- /dev/null
+++ b/lib/plugins/popularity/lang/eu/submitted.txt
@@ -0,0 +1,3 @@
+====== Popularitate Feedback-a ======
+
+Informazioa arrakastaz bidalia izan da. \ No newline at end of file
diff --git a/lib/plugins/popularity/lang/fa/lang.php b/lib/plugins/popularity/lang/fa/lang.php
index 05f8460b6..70c65f1b3 100644
--- a/lib/plugins/popularity/lang/fa/lang.php
+++ b/lib/plugins/popularity/lang/fa/lang.php
@@ -10,3 +10,8 @@
*/
$lang['name'] = 'بازخورد محبوبیت (ممکن است اندکی زمان ببرد)';
$lang['submit'] = 'ارسال اطلاعات';
+$lang['autosubmit'] = 'ارسال خودکار اطلاعات به صورت ماهیانه';
+$lang['submissionFailed'] = 'اطلاعات به علت بروز خطای زیر قابل ارسال نیستند:';
+$lang['submitDirectly'] = 'شما میتوانید اطلاعات را با تکمیل این فرم به صورت دستی ارسال کنید.';
+$lang['autosubmitError'] = 'آخرین ارسال خودکار با خطای مواجه شد, به علت زیر:';
+$lang['lastSent'] = 'اطلاعات ارسال شد.';
diff --git a/lib/plugins/popularity/lang/fa/submitted.txt b/lib/plugins/popularity/lang/fa/submitted.txt
new file mode 100644
index 000000000..63eec47ba
--- /dev/null
+++ b/lib/plugins/popularity/lang/fa/submitted.txt
@@ -0,0 +1,2 @@
+====== بازخورد محبوبیت ======
+اطلاعات ارسال شد. \ No newline at end of file
diff --git a/lib/plugins/popularity/lang/fi/lang.php b/lib/plugins/popularity/lang/fi/lang.php
index 3aa5dc23b..d7c230742 100644
--- a/lib/plugins/popularity/lang/fi/lang.php
+++ b/lib/plugins/popularity/lang/fi/lang.php
@@ -4,6 +4,12 @@
*
* @author Otto Vainio <otto@valjakko.net>
* @author Teemu Mattila <ghcsystems@gmail.com>
+ * @author Sami Olmari <sami@olmari.fi>
*/
$lang['name'] = 'Suosion palaute (voi kestää jonkun aikaa latautua)';
$lang['submit'] = 'Lähetä tiedot';
+$lang['autosubmit'] = 'Lähetä tiedot automaattisesti kerran kuussa';
+$lang['submissionFailed'] = 'Tietoja ei voitu lähettää seuraavan virheen vuoksi:';
+$lang['submitDirectly'] = 'Voit lähettää tiedot käsin seuraavan kaavakkeen avulla';
+$lang['autosubmitError'] = 'Edellinen automaattilähetys epäonnistui seuraavan virheen vuoksi:';
+$lang['lastSent'] = 'Tiedot on lähetetty';
diff --git a/lib/plugins/popularity/lang/fi/submitted.txt b/lib/plugins/popularity/lang/fi/submitted.txt
new file mode 100644
index 000000000..31059c880
--- /dev/null
+++ b/lib/plugins/popularity/lang/fi/submitted.txt
@@ -0,0 +1,3 @@
+====== Suosion palaute ======
+
+Tiedot lähetettiin onnistuneesti. \ No newline at end of file
diff --git a/lib/plugins/popularity/lang/fr/lang.php b/lib/plugins/popularity/lang/fr/lang.php
index 5ddd074a7..3ccc4cb5f 100644
--- a/lib/plugins/popularity/lang/fr/lang.php
+++ b/lib/plugins/popularity/lang/fr/lang.php
@@ -12,6 +12,13 @@
* @author Philippe Bajoit <philippe.bajoit@gmail.com>
* @author Florian Gaub <floriang@floriang.net>
* @author Samuel Dorsaz samuel.dorsaz@novelion.net
+ * @author Johan Guilbaud <guilbaud.johan@gmail.com>
+ * @author schplurtz@laposte.net
*/
-$lang['name'] = 'Enquête de popularité (peut nécessiter un certain temps pour être chargé)';
+$lang['name'] = 'Enquête de popularité (peut nécessiter un certain temps pour être chargée)';
$lang['submit'] = 'Envoyer les données';
+$lang['autosubmit'] = 'Envoyer les données automatiquement chaque mois';
+$lang['submissionFailed'] = 'Les données ne peuvent pas être envoyées à cause des erreurs suivantes :';
+$lang['submitDirectly'] = 'Vous pouvez envoyer le données manuellement en soumettant ce formulaire.';
+$lang['autosubmitError'] = 'La dernière soumission automatique a échoué pour les raisons suivantes :';
+$lang['lastSent'] = 'Les données ont été envoyées';
diff --git a/lib/plugins/popularity/lang/fr/submitted.txt b/lib/plugins/popularity/lang/fr/submitted.txt
new file mode 100644
index 000000000..0bc4cfe71
--- /dev/null
+++ b/lib/plugins/popularity/lang/fr/submitted.txt
@@ -0,0 +1,2 @@
+====== Enquête de popularité ======
+Les données ont été envoyées avec succès. \ No newline at end of file
diff --git a/lib/plugins/popularity/lang/he/lang.php b/lib/plugins/popularity/lang/he/lang.php
index 024f94ae8..f619127cd 100644
--- a/lib/plugins/popularity/lang/he/lang.php
+++ b/lib/plugins/popularity/lang/he/lang.php
@@ -5,6 +5,7 @@
* @author Dotan Kamber <kamberd@yahoo.com>
* @author Moshe Kaplan <mokplan@gmail.com>
* @author Yaron Yogev <yaronyogev@gmail.com>
+ * @author Yaron Shahrabani <sh.yaron@gmail.com>
*/
$lang['name'] = 'משוב פופולריות (יתכן זמן טעינה ארוך)';
$lang['submit'] = 'שלח מידע';
diff --git a/lib/plugins/popularity/lang/hr/lang.php b/lib/plugins/popularity/lang/hr/lang.php
index d2094b77b..96f1d6afe 100644
--- a/lib/plugins/popularity/lang/hr/lang.php
+++ b/lib/plugins/popularity/lang/hr/lang.php
@@ -4,4 +4,5 @@
*
* @author Branko Rihtman <theney@gmail.com>
* @author Dražen Odobašić <dodobasic@gmail.com>
+ * @author Dejan Igrec dejan.igrec@gmail.com
*/
diff --git a/lib/plugins/popularity/lang/hu/lang.php b/lib/plugins/popularity/lang/hu/lang.php
index d1510ed75..5dcd1adf0 100644
--- a/lib/plugins/popularity/lang/hu/lang.php
+++ b/lib/plugins/popularity/lang/hu/lang.php
@@ -5,8 +5,14 @@
* @author Sandor TIHANYI <stihanyi+dw@gmail.com>
* @author Siaynoq Mage <siaynoqmage@gmail.com>
* @author schilling.janos@gmail.com
- * @author Szabó Dávid (szabo.david@gyumolcstarhely.hu)
* @author Szabó Dávid <szabo.david@gyumolcstarhely.hu>
+ * @author Sándor TIHANYI <stihanyi+dw@gmail.com>
+ * @author David Szabo <szabo.david@gyumolcstarhely.hu>
*/
$lang['name'] = 'Visszajelzés a DokuWiki használatáról (sok időt vehet igénybe a betöltése)';
$lang['submit'] = 'Adatok elküldése';
+$lang['autosubmit'] = 'Adatok havonkénti automatikus elküldése.';
+$lang['submissionFailed'] = 'Az adatok a következő hiba miatt nem kerültek elküldésre:';
+$lang['submitDirectly'] = 'Az adatokat a következő űrlap segítségével lehet elküldeni.';
+$lang['autosubmitError'] = 'Az adatok a következő hiba miatt nem kerültek automatikusan elküldésre:';
+$lang['lastSent'] = 'Az adatokat elküldtük.';
diff --git a/lib/plugins/popularity/lang/hu/submitted.txt b/lib/plugins/popularity/lang/hu/submitted.txt
new file mode 100644
index 000000000..30ab8bd8e
--- /dev/null
+++ b/lib/plugins/popularity/lang/hu/submitted.txt
@@ -0,0 +1,3 @@
+====== Visszajelzés a DokuWiki használatáról ======
+
+Az adatokat sikeresen elküldtük. \ No newline at end of file
diff --git a/lib/plugins/popularity/lang/it/intro.txt b/lib/plugins/popularity/lang/it/intro.txt
index 62303eca7..f65310a5a 100644
--- a/lib/plugins/popularity/lang/it/intro.txt
+++ b/lib/plugins/popularity/lang/it/intro.txt
@@ -2,8 +2,8 @@
Questo strumento raccoglie dati anonimi sul tuo wiki e ti permette di inviarli agli sviluppatori di Dokuwiki. Questo aiuta loro a capire come Dokuwiki viene utilizzato dagli utenti e prendere decisioni future sullo sviluppo in base a quelle che sono le reali statistiche di utilizzo da parte degli utenti.
-Ti incoraggiamo a ripetere questa operazione al più spesso per mantenere informati gli sviluppatori sulla crescita del tuo wiki. L'insieme dei dati raccolti saranno identificati tramite un ID anonimo.
+Ti incoraggiamo a ripetere ogni tanto questa operazione per mantenere informati gli sviluppatori sulla crescita del tuo wiki. L'insieme dei dati raccolti saranno identificati tramite un ID anonimo.
-I dati raccolti contengono informazioni come la versione di DokuWiki, il numero e le dimensioni delle pagine e dei files, i plugins installati e qualche informazione sulla versione di PHP presente nel sistema.
+I dati raccolti contengono informazioni come la versione di DokuWiki, il numero e le dimensioni delle pagine e dei file, i plugin installati e informazioni sulla versione di PHP presente nel sistema.
-A continuazione puoi vedere un'anteprima dei dati che saranno inviati. Utilizza il tasto "Invia dati" per trasferire le informazioni. \ No newline at end of file
+A continuazione puoi vedere un'anteprima dei dati che saranno inviati. Utilizza il pulsante "Invia dati" per trasferire le informazioni. \ No newline at end of file
diff --git a/lib/plugins/popularity/lang/it/lang.php b/lib/plugins/popularity/lang/it/lang.php
index 583dfae26..a7852f22c 100644
--- a/lib/plugins/popularity/lang/it/lang.php
+++ b/lib/plugins/popularity/lang/it/lang.php
@@ -8,6 +8,12 @@
* @author snarchio@alice.it
* @author robocap <robocap1@gmail.com>
* @author Osman Tekin osman.tekin93@hotmail.it
+ * @author Jacopo Corbetta <jacopo.corbetta@gmail.com>
*/
$lang['name'] = 'Raccolta dati sul wiki (può impiegare del tempo per caricarsi)';
$lang['submit'] = 'Invia dati';
+$lang['autosubmit'] = 'Invia automaticamente i dati una volta al mese';
+$lang['submissionFailed'] = 'È stato impossibile inviare i dati a causa del seguente errore:';
+$lang['submitDirectly'] = 'È possibile inviare i dati manualmente utilizzando il pulsante sottostante.';
+$lang['autosubmitError'] = 'L\'ultimo invio automatico non è andato a buon fine a causa del seguente errore:';
+$lang['lastSent'] = 'I dati sono stati inviati';
diff --git a/lib/plugins/popularity/lang/it/submitted.txt b/lib/plugins/popularity/lang/it/submitted.txt
new file mode 100644
index 000000000..78247154e
--- /dev/null
+++ b/lib/plugins/popularity/lang/it/submitted.txt
@@ -0,0 +1,3 @@
+====== Raccolta dati sul wiki ======
+
+I dati sono stati inviati correttamente. \ No newline at end of file
diff --git a/lib/plugins/popularity/lang/ja/lang.php b/lib/plugins/popularity/lang/ja/lang.php
index 1e0dbdc3f..736924bb1 100644
--- a/lib/plugins/popularity/lang/ja/lang.php
+++ b/lib/plugins/popularity/lang/ja/lang.php
@@ -9,3 +9,8 @@
*/
$lang['name'] = '利用状況調査(ロードに少し時間が掛かります)';
$lang['submit'] = 'データ送信';
+$lang['autosubmit'] = '月に一度は自動的にデータを送付';
+$lang['submissionFailed'] = '次のエラーによりデータが送信できませんでした:';
+$lang['submitDirectly'] = '次のフォームを使ってデータを手動で送信することができます。';
+$lang['autosubmitError'] = '以下のエラーにより最後の自動送信に失敗しました:';
+$lang['lastSent'] = 'データを送信しました。';
diff --git a/lib/plugins/popularity/lang/ja/submitted.txt b/lib/plugins/popularity/lang/ja/submitted.txt
new file mode 100644
index 000000000..604f8e55f
--- /dev/null
+++ b/lib/plugins/popularity/lang/ja/submitted.txt
@@ -0,0 +1,3 @@
+====== 利用状況調査 ======
+
+データの送信に成功しました。 \ No newline at end of file
diff --git a/lib/plugins/popularity/lang/kk/lang.php b/lib/plugins/popularity/lang/kk/lang.php
new file mode 100644
index 000000000..dde5b9577
--- /dev/null
+++ b/lib/plugins/popularity/lang/kk/lang.php
@@ -0,0 +1,6 @@
+<?php
+/**
+ * kazakh language file
+ *
+ * @author Nurgozha Kaliaskarov astana08@gmail.com
+ */
diff --git a/lib/plugins/popularity/lang/ko/lang.php b/lib/plugins/popularity/lang/ko/lang.php
index 91d798a5f..0f1442d53 100644
--- a/lib/plugins/popularity/lang/ko/lang.php
+++ b/lib/plugins/popularity/lang/ko/lang.php
@@ -10,3 +10,8 @@
*/
$lang['name'] = '인기도 조사 (불러오는데 시간이 걸릴 수 있습니다.)';
$lang['submit'] = '자료 보내기';
+$lang['autosubmit'] = '자료를 자동으로 매달 한번씩 보내기';
+$lang['submissionFailed'] = '다음과 같은 이유로 자료 전송에 실패했습니다 :';
+$lang['submitDirectly'] = '아래의 양식에 맞춰 수동으로 작성된 자료를 보낼 수 있습니다';
+$lang['autosubmitError'] = '다음과 같은 이유로 자동 자료 전송에 실패했습니다 :';
+$lang['lastSent'] = '자료가 전송되었습니다';
diff --git a/lib/plugins/popularity/lang/ko/submitted.txt b/lib/plugins/popularity/lang/ko/submitted.txt
new file mode 100644
index 000000000..e8b434dc5
--- /dev/null
+++ b/lib/plugins/popularity/lang/ko/submitted.txt
@@ -0,0 +1,3 @@
+====== 인기도 조사 ======
+
+자료 전송이 성공적으로 완료되었습니다 \ No newline at end of file
diff --git a/lib/plugins/popularity/lang/la/intro.txt b/lib/plugins/popularity/lang/la/intro.txt
index 6f4ce8488..c3029caf4 100644
--- a/lib/plugins/popularity/lang/la/intro.txt
+++ b/lib/plugins/popularity/lang/la/intro.txt
@@ -1,5 +1,10 @@
====== Index Fauoris Popularis ======
-Haec machina fauorem popularem mittis sic ut creatores uicis meliorem illum facere possint.
+Haoc instrumentum fauorem popularem mittis sic ut creatores uicis meliorem illum facere possint.
+
+Rursum te fauorem mittere experamus sic ut si mutationes meliores uel peiores esse uidere possimus.
+
+Res mittendae tua forma in usu, numerus et pondus paginarum et aliarum rerum, addenda in usu et de PHP.
+
+Res rudes mittendae subter ostenduntur. "Res mittere" premas ut eas transferas.
-Rursum te fauorem mittere experamus sic ut si mutationes meliores uel peiores esse uidere possimus. \ No newline at end of file
diff --git a/lib/plugins/popularity/lang/la/lang.php b/lib/plugins/popularity/lang/la/lang.php
index e634f9d41..c7f307c29 100644
--- a/lib/plugins/popularity/lang/la/lang.php
+++ b/lib/plugins/popularity/lang/la/lang.php
@@ -2,6 +2,12 @@
/**
* Latin language file
*
+ * @author Massimiliano Vassalli <vassalli.max@gmail.com>
*/
$lang['name'] = 'Index fauoris popularis (multum tempus quaerere potest)';
$lang['submit'] = 'Missum die';
+$lang['autosubmit'] = 'Constanter res omni mense mittuntur';
+$lang['submissionFailed'] = 'Res non mittuntur ea causa:';
+$lang['submitDirectly'] = 'Res tu mittere potes cum hoc exemplar compleas.';
+$lang['autosubmitError'] = 'Extrema missio lapsa est ea causa:';
+$lang['lastSent'] = 'Res missae sunt';
diff --git a/lib/plugins/popularity/lang/la/submitted.txt b/lib/plugins/popularity/lang/la/submitted.txt
new file mode 100644
index 000000000..2b2faf439
--- /dev/null
+++ b/lib/plugins/popularity/lang/la/submitted.txt
@@ -0,0 +1,3 @@
+====== Index fauoris popularis ======
+
+Res feliciter missae sunt. \ No newline at end of file
diff --git a/lib/plugins/popularity/lang/lv/lang.php b/lib/plugins/popularity/lang/lv/lang.php
index 7dba689e0..f0c940b6f 100644
--- a/lib/plugins/popularity/lang/lv/lang.php
+++ b/lib/plugins/popularity/lang/lv/lang.php
@@ -6,3 +6,8 @@
*/
$lang['name'] = 'Popularitātes atsauksmes (ielāde var aizņemt kādu laiku)';
$lang['submit'] = 'Nosūtīt datus';
+$lang['autosubmit'] = 'Automātiski reizi mēnesī nosūtīt datus';
+$lang['submissionFailed'] = 'Datus nevar nosūtīt kļūdas dēļ:';
+$lang['submitDirectly'] = 'Jūs pats varat pats nosūtīt datus no šīs veidlapas.';
+$lang['autosubmitError'] = 'Pēdējā automātiskā nosūtīšana kļūdas dēļ:';
+$lang['lastSent'] = 'Dati nosūtīti';
diff --git a/lib/plugins/popularity/lang/lv/submitted.txt b/lib/plugins/popularity/lang/lv/submitted.txt
new file mode 100644
index 000000000..c31338abf
--- /dev/null
+++ b/lib/plugins/popularity/lang/lv/submitted.txt
@@ -0,0 +1,3 @@
+====== Popularitātes atsauksmes ======
+
+Dati veiksmīgi nosūtīti \ No newline at end of file
diff --git a/lib/plugins/popularity/lang/nl/intro.txt b/lib/plugins/popularity/lang/nl/intro.txt
index 92962944b..3c045c427 100644
--- a/lib/plugins/popularity/lang/nl/intro.txt
+++ b/lib/plugins/popularity/lang/nl/intro.txt
@@ -1,9 +1,9 @@
====== Populariteitsfeedback ======
-Dit onderdeel verzamelt anonieme gegevens over je wiki en stelt je in staat deze te versturen naar de ontwikkelaars van DokuWiki. Dit helpt hen te begrijpen hoe DokuWiki wordt gebruikt door de gebruikers en zorgt er ook voor dat toekomstige ontwikkelkeuzes kunnen worden gestaafd door echte gebruikersstatistieken.
+Dit onderdeel verzamelt anonieme gegevens over uw wiki en stelt u in staat deze te versturen naar de ontwikkelaars van DokuWiki. Dit helpt hen te begrijpen hoe DokuWiki wordt gebruikt door de gebruikers en zorgt er ook voor dat toekomstige ontwikkelkeuzes kunnen worden gestaafd door echte gebruikersstatistieken.
-U wordt verzocht deze stap van tijd tot tijd te herhalen om ontwikkelaars op de hoogte te houden terwijl je wiki groeit. De herhaalde data zal worden geïdentificeerd door een uniek, anoniem ID.
+U wordt verzocht deze stap van tijd tot tijd te herhalen om ontwikkelaars op de hoogte te houden terwijl uw wiki groeit. De herhaalde data zal worden geïdentificeerd door een uniek, anoniem ID.
-De verzamelde gegevens bevat onder andere gegevens over je versie van DokuWiki, het aantal- en de grootte van de pagina's en bestanden, geïnstalleerde plugins en informatie over PHP.
+De verzamelde gegevens bevat onder andere gegevens over uw versie van DokuWiki, het aantal- en de grootte van de pagina's en bestanden, geïnstalleerde plugins en informatie over PHP.
De ruwe data die verzonden worden staan hieronder. Gebruik de knop "Verstuur" om de informatie te verzenden.
diff --git a/lib/plugins/popularity/lang/nl/lang.php b/lib/plugins/popularity/lang/nl/lang.php
index 54e12ae91..0a8386f42 100644
--- a/lib/plugins/popularity/lang/nl/lang.php
+++ b/lib/plugins/popularity/lang/nl/lang.php
@@ -13,3 +13,8 @@
*/
$lang['name'] = 'Populariteitsfeedback (kan even duren om in te laden)';
$lang['submit'] = 'Verstuur';
+$lang['autosubmit'] = 'Gegevens automatisch maandelijks verzenden';
+$lang['submissionFailed'] = 'De gegevens konden niet verstuurd worden vanwege de volgende fouten:';
+$lang['submitDirectly'] = 'Je kan de gegevens handmatig sturen door het onderstaande formulier te verzenden.';
+$lang['autosubmitError'] = 'De laatste automatische verzending is mislukt vanwege de volgende fout:';
+$lang['lastSent'] = 'De gegevens zijn verstuurd.';
diff --git a/lib/plugins/popularity/lang/nl/submitted.txt b/lib/plugins/popularity/lang/nl/submitted.txt
new file mode 100644
index 000000000..219d80fb6
--- /dev/null
+++ b/lib/plugins/popularity/lang/nl/submitted.txt
@@ -0,0 +1,3 @@
+===== Populariteitsfeedback =====
+
+Het versturen van de gegevens is gelukt. \ No newline at end of file
diff --git a/lib/plugins/popularity/lang/no/lang.php b/lib/plugins/popularity/lang/no/lang.php
index 0f7c140ff..e80016f92 100644
--- a/lib/plugins/popularity/lang/no/lang.php
+++ b/lib/plugins/popularity/lang/no/lang.php
@@ -9,6 +9,7 @@
* @author Lisa Ditlefsen <lisa@vervesearch.com>
* @author Erik Pedersen <erik.pedersen@shaw.ca>
* @author Erik Bjørn Pedersen <erik.pedersen@shaw.ca>
+ * @author Rune Rasmussen syntaxerror.no@gmail.com
*/
$lang['name'] = 'Popularitetsfeedback (kan ta litt tid å laste)';
$lang['submit'] = 'Send data';
diff --git a/lib/plugins/popularity/lang/pt-br/lang.php b/lib/plugins/popularity/lang/pt-br/lang.php
index 907b4db5d..67a3abd7e 100644
--- a/lib/plugins/popularity/lang/pt-br/lang.php
+++ b/lib/plugins/popularity/lang/pt-br/lang.php
@@ -17,3 +17,8 @@
*/
$lang['name'] = 'Retorno de popularidade (pode demorar um pouco para carregar)';
$lang['submit'] = 'Enviar dados';
+$lang['autosubmit'] = 'Enviar os dados automaticamente uma vez por mês';
+$lang['submissionFailed'] = 'Os dados não puderam ser enviados devido ao seguinte erro:';
+$lang['submitDirectly'] = 'Você pode enviar os dados manualmente, submetendo o formulário baixo.';
+$lang['autosubmitError'] = 'Ocorreu uma falha na última submissão automática, devido ao seguinte erro:';
+$lang['lastSent'] = 'Os dados foram enviados';
diff --git a/lib/plugins/popularity/lang/pt-br/submitted.txt b/lib/plugins/popularity/lang/pt-br/submitted.txt
new file mode 100644
index 000000000..7c0cea8c1
--- /dev/null
+++ b/lib/plugins/popularity/lang/pt-br/submitted.txt
@@ -0,0 +1,3 @@
+====== Retorno de popularidade ======
+
+Os dados foram enviados com sucesso. \ No newline at end of file
diff --git a/lib/plugins/popularity/lang/pt/lang.php b/lib/plugins/popularity/lang/pt/lang.php
index da92ee729..ac27dc8c0 100644
--- a/lib/plugins/popularity/lang/pt/lang.php
+++ b/lib/plugins/popularity/lang/pt/lang.php
@@ -5,6 +5,12 @@
* @author Enrico Nicoletto <liverig@gmail.com>
* @author Fil <fil@meteopt.com>
* @author André Neves <drakferion@gmail.com>
+ * @author José Campos zecarlosdecampos@gmail.com
*/
$lang['name'] = 'Retorno (feedback) de Popularidade (pode levar algum tempo a carregar)';
$lang['submit'] = 'Enviar Dados';
+$lang['autosubmit'] = 'Enviar dados automáticamente uma vez por mês';
+$lang['submissionFailed'] = 'Os dados não foram enviados devido ao seguinte erro:';
+$lang['submitDirectly'] = 'Pode enviar os dados manualmente, submetendo o seguinte formulário.';
+$lang['autosubmitError'] = 'A última auto-submissão falhou, por causa do seguinte erro:';
+$lang['lastSent'] = 'Os dados foram enviados';
diff --git a/lib/plugins/popularity/lang/pt/submitted.txt b/lib/plugins/popularity/lang/pt/submitted.txt
new file mode 100644
index 000000000..d2bb2b7ae
--- /dev/null
+++ b/lib/plugins/popularity/lang/pt/submitted.txt
@@ -0,0 +1,3 @@
+====== Retorno de Popularidade ======
+
+Os dados foram enviados com sucesso. \ No newline at end of file
diff --git a/lib/plugins/popularity/lang/ro/lang.php b/lib/plugins/popularity/lang/ro/lang.php
index 15da1cf3b..1644ea574 100644
--- a/lib/plugins/popularity/lang/ro/lang.php
+++ b/lib/plugins/popularity/lang/ro/lang.php
@@ -9,3 +9,8 @@
*/
$lang['name'] = 'Feedback de popularitate (încărcarea poate dura mai mult)';
$lang['submit'] = 'Trimite datele';
+$lang['autosubmit'] = 'Trimite datele automat o dată pe lună';
+$lang['submissionFailed'] = 'Datele nu au fost trimise din cauza următoarei erori:';
+$lang['submitDirectly'] = 'Puteți trimite datele manual prin completarea următorului formular.';
+$lang['autosubmitError'] = 'Ultima trimitere automată a eșuat din cauza următoarei erori:';
+$lang['lastSent'] = 'Datele au fost trimise';
diff --git a/lib/plugins/popularity/lang/ro/submitted.txt b/lib/plugins/popularity/lang/ro/submitted.txt
new file mode 100644
index 000000000..214ffb71f
--- /dev/null
+++ b/lib/plugins/popularity/lang/ro/submitted.txt
@@ -0,0 +1,3 @@
+====== Feedback de popularitate ======
+
+Datele au fost trimise cu succes. \ No newline at end of file
diff --git a/lib/plugins/popularity/lang/ru/intro.txt b/lib/plugins/popularity/lang/ru/intro.txt
index 587a7ae85..e8118e4eb 100644
--- a/lib/plugins/popularity/lang/ru/intro.txt
+++ b/lib/plugins/popularity/lang/ru/intro.txt
@@ -1,10 +1,10 @@
====== Сбор информации о популярности ======
-Этот инструмент собирает анонимные данные о вашей вики и позволяет вам отправить их разработчикам «ДокуВики». Эти данные помогут им понять то, как именно используется «ДокуВики», и удостовериться, что принимаемые проектные решения соответствуют жизненным реалиям.
+Этот инструмент собирает анонимные данные о вашей вики и позволяет вам отправить их разработчикам «ДокуВики». Эти данные помогут им понять, как именно используется «ДокуВики», и удостовериться, что принимаемые проектные решения соответствуют жизненным реалиям.
-Отправляйте данные время от времени для того, чтобы сообщить разработчикам о том, что ваша вики «подросла». Отправленные вами данные будут идентифицированы по анонимному ID.
+Отправляйте данные время от времени для того, чтобы сообщать разработчикам о том, что ваша вики «подросла». Отправленные вами данные будут идентифицированы по анонимному ID.
Собранные данные содержат такую информацию, как: версия «ДокуВики», количество и размер ваших страниц и файлов, установленные плагины, информацию об установленном PHP.
-Данные, которые будут посланы, представлены ниже. Пожалуйста, используйте кнопку «Отправить данные», чтобы передать информацию.
+Данные, которые будут отосланы, представлены ниже. Пожалуйста, используйте кнопку «Отправить данные», чтобы передать информацию.
diff --git a/lib/plugins/popularity/lang/ru/lang.php b/lib/plugins/popularity/lang/ru/lang.php
index df89c7022..79b3e224d 100644
--- a/lib/plugins/popularity/lang/ru/lang.php
+++ b/lib/plugins/popularity/lang/ru/lang.php
@@ -11,6 +11,13 @@
* @author Vlad Tsybenko <vlad.development@gmail.com>
* @author Aleksey Osadchiy <rfc@nm.ru>
* @author Aleksandr Selivanov <alexgearbox@gmail.com>
+ * @author Ladyko Andrey <fylh@succexy.spb.ru>
+ * @author Eugene <windy.wanderer@gmail.com>
*/
$lang['name'] = 'Сбор информации о популярности (для загрузки может потребоваться некоторое время)';
$lang['submit'] = 'Отправить данные';
+$lang['autosubmit'] = 'Автоматически отправлять данные один раз в месяц';
+$lang['submissionFailed'] = 'Данные не могут быть отправлены из-за ошибки:';
+$lang['submitDirectly'] = 'Вы можете отправлять данные вручную, заполнив форму:';
+$lang['autosubmitError'] = 'Последнее автоотправление данных не удалось из-за ошибки:';
+$lang['lastSent'] = 'Данные отправлены';
diff --git a/lib/plugins/popularity/lang/ru/submitted.txt b/lib/plugins/popularity/lang/ru/submitted.txt
new file mode 100644
index 000000000..a239943a4
--- /dev/null
+++ b/lib/plugins/popularity/lang/ru/submitted.txt
@@ -0,0 +1,2 @@
+====== Общественная обратная связь ======
+Данные были успешно отправлены. \ No newline at end of file
diff --git a/lib/plugins/popularity/lang/sk/lang.php b/lib/plugins/popularity/lang/sk/lang.php
index 2e414d835..bc46b03c5 100644
--- a/lib/plugins/popularity/lang/sk/lang.php
+++ b/lib/plugins/popularity/lang/sk/lang.php
@@ -8,3 +8,8 @@
*/
$lang['name'] = 'Prieskum používania (môže chvíľu trvať)';
$lang['submit'] = 'Poslať dáta';
+$lang['autosubmit'] = 'Automaticky zaslať dáta raz mesačne';
+$lang['submissionFailed'] = 'Dáta nemohli byť odoslané z nasledujúceho dôdovu:';
+$lang['submitDirectly'] = 'Dáta môžu byť zaslané manuálne nasledujúcim formulárom:';
+$lang['autosubmitError'] = 'Posledné automatické odoslanie dát zlyhalo z nasledujúceho dôvodu:';
+$lang['lastSent'] = 'Dáta boli odoslané.';
diff --git a/lib/plugins/popularity/lang/sk/submitted.txt b/lib/plugins/popularity/lang/sk/submitted.txt
new file mode 100644
index 000000000..f99fb9fa9
--- /dev/null
+++ b/lib/plugins/popularity/lang/sk/submitted.txt
@@ -0,0 +1,3 @@
+====== Prieskum používania ======
+
+Dáta boli úspešne odoslané. \ No newline at end of file
diff --git a/lib/plugins/popularity/lang/sl/intro.txt b/lib/plugins/popularity/lang/sl/intro.txt
new file mode 100644
index 000000000..ceb0e61e6
--- /dev/null
+++ b/lib/plugins/popularity/lang/sl/intro.txt
@@ -0,0 +1,9 @@
+====== Poroilo o uporabi ======
+
+To orodje je namenjeno zbiranju brezimnih podatkov o postavljeni Dokuwiki strani in omogoa poiljanje nekaterih podatkov neposredno razvijalcem sistema. S temi podatki lahko razvijalci razumejo naine uporabe sistema, zahteve uporabnikov in pogostost uporabe, kar s statistinimi podatki vpliva tudi na nadaljnji razvoj sistema.
+
+Priporoeno je, da poroilo o uporabi poljete vsake toliko asa, saj lahko le tako razvijalci dobijo podatke o hitrosti rasti spletia in pogostosti uporabe. Vsi podatki so poslani oznaeni s posebno vpisno tevilko, ki omogoa brezimno sledenje.
+
+Zbrani podatki vsebujejo podrobnosti o razliici uporabljenega sistema DokuWiki, tevilo in velikost wiki strani, datotekah, ki so naloene na sistem in podatke o vstavkih ter PHP namestitvi in razliici.
+
+Surovi podatki, ki bodo poslani so prikazani spodaj. S pritiskom na gumb "Polji podatke", bodo ti poslani na strenik razvijalcev.
diff --git a/lib/plugins/popularity/lang/sl/lang.php b/lib/plugins/popularity/lang/sl/lang.php
index befb1eec0..5c92dd7c4 100644
--- a/lib/plugins/popularity/lang/sl/lang.php
+++ b/lib/plugins/popularity/lang/sl/lang.php
@@ -2,7 +2,12 @@
/**
* Slovenian language file
*
- * @author Dejan Levec <webphp@gmail.com>
- * @author Boštjan Seničar <senicar@gmail.com>
+ * @author Matej Urbančič (mateju@svn.gnome.org)
*/
-$lang['submit'] = 'Pošlji';
+$lang['name'] = 'Poročilo o uporabi (nalaganje strani je lahko dolgotrajno)';
+$lang['submit'] = 'Pošlji podatke';
+$lang['autosubmit'] = 'Samodejno pošlji podatke enkrat mesečno';
+$lang['submissionFailed'] = 'Podatkov zaradi napake ni mogoče poslati:';
+$lang['submitDirectly'] = 'Podatke je mogoče poslati ročno s pošiljanjem preko obrazca.';
+$lang['autosubmitError'] = 'Zadnji poskus samodejnega pošiljanja je spodletel zaradi napake:';
+$lang['lastSent'] = 'Podatki so bili uspešno poslani.';
diff --git a/lib/plugins/popularity/lang/sl/submitted.txt b/lib/plugins/popularity/lang/sl/submitted.txt
new file mode 100644
index 000000000..988afd837
--- /dev/null
+++ b/lib/plugins/popularity/lang/sl/submitted.txt
@@ -0,0 +1,3 @@
+====== Poroilo o uporabi ======
+
+Podatki so bili uspeno poslani.
diff --git a/lib/plugins/popularity/lang/sv/lang.php b/lib/plugins/popularity/lang/sv/lang.php
index 10e71b790..8be542e7f 100644
--- a/lib/plugins/popularity/lang/sv/lang.php
+++ b/lib/plugins/popularity/lang/sv/lang.php
@@ -12,6 +12,12 @@
* @author Bogge Bogge <bogge@bogge.com>
* @author Peter Åström <eaustreum@gmail.com>
* @author Håkan Sandell <hakan.sandell@home.se>
+ * @author mikael@mallander.net
*/
$lang['name'] = 'Popularitets-feedback (det kan ta en stund att ladda sidan)';
$lang['submit'] = 'Sänd data';
+$lang['autosubmit'] = 'Skicka data automatiskt varje månad';
+$lang['submissionFailed'] = 'Datan kunde inte skickas för att:';
+$lang['submitDirectly'] = 'Du kan skicka datan manuellt genom att fylla i följande formulär.';
+$lang['autosubmitError'] = 'Senaste automatiska sändning av datan misslyckades för att:';
+$lang['lastSent'] = 'Datan har skickats';
diff --git a/lib/plugins/popularity/lang/sv/submitted.txt b/lib/plugins/popularity/lang/sv/submitted.txt
new file mode 100644
index 000000000..fb8eab773
--- /dev/null
+++ b/lib/plugins/popularity/lang/sv/submitted.txt
@@ -0,0 +1,3 @@
+====== Popularitetsfeedback ======
+
+Datan har skickats utan problem. \ No newline at end of file
diff --git a/lib/plugins/popularity/lang/uk/lang.php b/lib/plugins/popularity/lang/uk/lang.php
index 157944fe4..584641482 100644
--- a/lib/plugins/popularity/lang/uk/lang.php
+++ b/lib/plugins/popularity/lang/uk/lang.php
@@ -7,6 +7,12 @@
* @author Oleksandr Kunytsia <okunia@gmail.com>
* @author Uko uko@uar.net
* @author Ulrikhe Lukoie <lukoie@gmail>.com
+ * @author Kate Arzamastseva pshns@ukr.net
*/
$lang['name'] = 'Відгук популярності (може зайняти деякий час)';
$lang['submit'] = 'Передати дані';
+$lang['autosubmit'] = 'Автоматично надсилати дані один раз на місяць';
+$lang['submissionFailed'] = 'Дані не можуть бути відправлені через таку помилку:';
+$lang['submitDirectly'] = 'Ви можете надіслати дані вручну, відправивши наступну форму.';
+$lang['autosubmitError'] = 'Останнє автоматичне відправлення не вдалося через таку помилку:';
+$lang['lastSent'] = 'Дані були відправлені';
diff --git a/lib/plugins/popularity/lang/zh-tw/intro.txt b/lib/plugins/popularity/lang/zh-tw/intro.txt
index 54444afc0..37c63dced 100644
--- a/lib/plugins/popularity/lang/zh-tw/intro.txt
+++ b/lib/plugins/popularity/lang/zh-tw/intro.txt
@@ -1,9 +1,10 @@
-====== 人氣反饋 ======
+====== 人氣回饋 ======
-本工具收集關於您維基站點的匿名信息,並允許您將其發送給 DokuWiki 的開發者。這樣做有助於我們了解用戶是如何使用 DokuWiki 的,並能使我們未來的開發決策建立在現實使用數據上。
+本工具會從您的維基站台收集訊息,並以匿名的方式發送給 DokuWiki 的開發者。這有助於他們了解使用者們如何使用 DokuWiki ,並能基於實際統計資料對未來開發做出更準確的決策。
-我們鼓勵您不時重復該步驟,以便我們能了解您的維基站點發展進度。您的數據集將被匿名 ID 標識。
+我們鼓勵您經常重複這個步驟,讓開發者了解您的維基站台的成長情形。您的資料集將會被標識為一個匿名的識別碼 (ID)。
-收集的數據包括 DokuWiki 版本、您的頁面數量以及文件大小、已安裝的插件、服務器上的 PHP 相關信息。
+收集的資料包括 DokuWiki 版本、頁面數量、檔案大小、安裝的插件、伺服器的 PHP 資訊。
+
+將被發送的原始資料顯示如下。請點擊「發送資料」按鈕進行傳輸。
-將被發送的原始數據如下所示。請點擊“發送數據”按扭進行傳輸。 \ No newline at end of file
diff --git a/lib/plugins/popularity/lang/zh-tw/lang.php b/lib/plugins/popularity/lang/zh-tw/lang.php
index 4757ab84b..3ced0ee5a 100644
--- a/lib/plugins/popularity/lang/zh-tw/lang.php
+++ b/lib/plugins/popularity/lang/zh-tw/lang.php
@@ -7,6 +7,13 @@
* @author Wayne San <waynesan@zerozone.tw>
* @author Li-Jiun Huang <ljhuang.tw@gmai.com>
* @author Cheng-Wei Chien <e.cwchien@gmail.com>
+ * @author Danny Lin
+ * @author Shuo-Ting Jian <shoting@gmail.com>
*/
-$lang['name'] = '人氣反饋(載入可能需要一些時間)';
-$lang['submit'] = '發送數據';
+$lang['name'] = '人氣回饋(載入可能需要一些時間)';
+$lang['submit'] = '發送資料';
+$lang['autosubmit'] = '每月自動發送';
+$lang['submissionFailed'] = '由於以下原因,資料無法發送:';
+$lang['submitDirectly'] = '你可以利用以下的表單來發手動發送資料.';
+$lang['autosubmitError'] = '由於以下原因,上次自動發送失敗:';
+$lang['lastSent'] = '資料已發送';
diff --git a/lib/plugins/popularity/lang/zh-tw/submitted.txt b/lib/plugins/popularity/lang/zh-tw/submitted.txt
new file mode 100644
index 000000000..6febcd5b8
--- /dev/null
+++ b/lib/plugins/popularity/lang/zh-tw/submitted.txt
@@ -0,0 +1,3 @@
+====== 人氣回饋 ======
+
+資料已發送成功 \ No newline at end of file
diff --git a/lib/plugins/popularity/lang/zh/lang.php b/lib/plugins/popularity/lang/zh/lang.php
index 191b9c1af..a2464762d 100644
--- a/lib/plugins/popularity/lang/zh/lang.php
+++ b/lib/plugins/popularity/lang/zh/lang.php
@@ -10,6 +10,13 @@
* @author ben <ben@livetom.com>
* @author lainme <lainme993@gmail.com>
* @author caii <zhoucaiqi@gmail.com>
+ * @author Hiphen Lee <jacob.b.leung@gmail.com>
+ * @author caii, patent agent in China <zhoucaiqi@gmail.com>
*/
$lang['name'] = '人气反馈(载入可能需要一些时间)';
$lang['submit'] = '发送数据';
+$lang['autosubmit'] = '每月自动发送';
+$lang['submissionFailed'] = '数据由于以下原因不恩你给发送:';
+$lang['submitDirectly'] = '你可以手动提交下面的表单来发送数据。';
+$lang['autosubmitError'] = '印以下原因,上一次自动提交失败:';
+$lang['lastSent'] = '数据已发送';
diff --git a/lib/plugins/popularity/lang/zh/submitted.txt b/lib/plugins/popularity/lang/zh/submitted.txt
new file mode 100644
index 000000000..6039b70e1
--- /dev/null
+++ b/lib/plugins/popularity/lang/zh/submitted.txt
@@ -0,0 +1,3 @@
+====== 人气反馈 ======
+
+数据发送成功。 \ No newline at end of file
diff --git a/lib/plugins/popularity/plugin.info.txt b/lib/plugins/popularity/plugin.info.txt
index 2652bd669..16b148f41 100644
--- a/lib/plugins/popularity/plugin.info.txt
+++ b/lib/plugins/popularity/plugin.info.txt
@@ -1,7 +1,7 @@
base popularity
author Andreas Gohr
email andi@splitbrain.org
-date 2010-12-09
+date 2011-08-18
name Popularity Feedback Plugin
desc Send anonymous data about your wiki to the developers.
url http://www.dokuwiki.org/plugin:popularity
diff --git a/lib/plugins/revert/lang/ar/lang.php b/lib/plugins/revert/lang/ar/lang.php
index 1e4e104fb..a073c336d 100644
--- a/lib/plugins/revert/lang/ar/lang.php
+++ b/lib/plugins/revert/lang/ar/lang.php
@@ -4,6 +4,7 @@
*
* @author Yaman Hokan <always.smile.yh@hotmail.com>
* @author Usama Akkad <uahello@gmail.com>
+ * @author uahello@gmail.com
*/
$lang['menu'] = 'مدير الاسترجاع';
$lang['filter'] = 'ابحث في الصفحات المتأذاة';
diff --git a/lib/plugins/revert/lang/bg/intro.txt b/lib/plugins/revert/lang/bg/intro.txt
index ab7308d6d..44d5a0938 100644
--- a/lib/plugins/revert/lang/bg/intro.txt
+++ b/lib/plugins/revert/lang/bg/intro.txt
@@ -1,4 +1,4 @@
====== Възстановяване ======
-Тази страница помага при автоматичното възстановяване от спам-атака. За да намерите списък със спамнати страници, въведете текст за търсене(пр. спам препратка), след това потвърдете, че намерените страници са наистина спам и възстановете редакциите.
+Страницата помага за автоматично възстановяване след SPAM атака. За да намерите спамнатите страници, въведете текст за търсене (напр. линк от SPAM съобщението), след това потвърдете, че намерените страници са наистина SPAM и възстановете старите им версии.
diff --git a/lib/plugins/revert/lang/bg/lang.php b/lib/plugins/revert/lang/bg/lang.php
index 6f0ff0672..0819de01a 100644
--- a/lib/plugins/revert/lang/bg/lang.php
+++ b/lib/plugins/revert/lang/bg/lang.php
@@ -3,13 +3,14 @@
* bulgarian language file
* @author Nikolay Vladimirov <nikolay@vladimiroff.com>
* @author Viktor Usunov <usun0v@mail.bg>
+ * @author Kiril <neohidra@gmail.com>
*/
$lang['menu'] = 'Възстановяване';
-$lang['filter'] = 'Търсене на спамната страници';
-$lang['revert'] = 'Избрани страници за възстановяване';
-$lang['reverted'] = '%s върнат до версия %s';
-$lang['removed'] = '%s премахнат';
+$lang['filter'] = 'Търсене на спамнати страници';
+$lang['revert'] = 'Възстанови избраните страници';
+$lang['reverted'] = '%s върната до версия %s';
+$lang['removed'] = '%s премахната';
$lang['revstart'] = 'Процесът на възстановяване започна. Това може да отнеме много време. Ако скриптът се просрочи преди да завърши, трябва да възстановявате на по-малки парчета.';
$lang['revstop'] = 'Процесът на възстановяване завърши успешно.';
-$lang['note1'] = 'Забележка: за търсенето имат значение малки/големи букви';
-$lang['note2'] = 'Забележка: страницата ще бъде възвърната без да съдържа спам терминът <i>%s</i>.';
+$lang['note1'] = 'Бележка: при търсенето се различават малки от големи букви';
+$lang['note2'] = 'Бележка: страницата ще бъде върната към стара версия без SPAM терминa <i>%s</i>.';
diff --git a/lib/plugins/revert/lang/cs/lang.php b/lib/plugins/revert/lang/cs/lang.php
index ca0474cba..5c8899200 100644
--- a/lib/plugins/revert/lang/cs/lang.php
+++ b/lib/plugins/revert/lang/cs/lang.php
@@ -9,6 +9,7 @@
* @author tomas@valenta.cz
* @author Marek Sacha <sachamar@fel.cvut.cz>
* @author Lefty <lefty@multihost.cz>
+ * @author Vojta Beran <xmamut@email.cz>
*/
$lang['menu'] = 'Obnova zaspamovaných stránek';
$lang['filter'] = 'Hledat zaspamované stránky';
diff --git a/lib/plugins/revert/lang/de-informal/lang.php b/lib/plugins/revert/lang/de-informal/lang.php
index ac2f35e85..b6709d2fa 100644
--- a/lib/plugins/revert/lang/de-informal/lang.php
+++ b/lib/plugins/revert/lang/de-informal/lang.php
@@ -6,6 +6,7 @@
* @author Juergen Schwarzer <jschwarzer@freenet.de>
* @author Marcel Metz <marcel_metz@gmx.de>
* @author Matthias Schulte <post@lupo49.de>
+ * @author Christian Wichmann <nospam@zone0.de>
*/
$lang['menu'] = 'Zurückstellungsmanager';
$lang['filter'] = 'Durchsuche als Spam markierte Seiten';
diff --git a/lib/plugins/revert/lang/de/lang.php b/lib/plugins/revert/lang/de/lang.php
index 5dee8007b..0bc8e2ce0 100644
--- a/lib/plugins/revert/lang/de/lang.php
+++ b/lib/plugins/revert/lang/de/lang.php
@@ -12,6 +12,8 @@
* @author Blitzi94@gmx.de
* @author Robert Bogenschneider <robog@GMX.de>
* @author Robert Bogenschneider <robog@gmx.de>
+ * @author Niels Lange <niels@boldencursief.nl>
+ * @author Christian Wichmann <nospam@zone0.de>
*/
$lang['menu'] = 'Seiten wieder herstellen';
$lang['filter'] = 'Nach betroffenen Seiten suchen';
diff --git a/lib/plugins/revert/lang/es/lang.php b/lib/plugins/revert/lang/es/lang.php
index 420454d45..7e357e3db 100644
--- a/lib/plugins/revert/lang/es/lang.php
+++ b/lib/plugins/revert/lang/es/lang.php
@@ -17,6 +17,7 @@
* @author Fernando J. Gómez <fjgomez@gmail.com>
* @author Victor Castelan <victorcastelan@gmail.com>
* @author Mauro Javier Giamberardino <mgiamberardino@gmail.com>
+ * @author emezeta <emezeta@infoprimo.com>
*/
$lang['menu'] = 'Restaurador';
$lang['filter'] = 'Buscar páginas con spam';
diff --git a/lib/plugins/revert/lang/et/lang.php b/lib/plugins/revert/lang/et/lang.php
new file mode 100644
index 000000000..ca1410ab0
--- /dev/null
+++ b/lib/plugins/revert/lang/et/lang.php
@@ -0,0 +1,7 @@
+<?php
+/**
+ * Estonian language file
+ *
+ * @author kristian.kankainen@kuu.la
+ * @author Rivo Zängov <eraser@eraser.ee>
+ */
diff --git a/lib/plugins/revert/lang/fi/lang.php b/lib/plugins/revert/lang/fi/lang.php
index 26bc6b76a..fdf9bb81c 100644
--- a/lib/plugins/revert/lang/fi/lang.php
+++ b/lib/plugins/revert/lang/fi/lang.php
@@ -5,6 +5,7 @@
* @author otto@valjakko.net
* @author Otto Vainio <otto@valjakko.net>
* @author Teemu Mattila <ghcsystems@gmail.com>
+ * @author Sami Olmari <sami@olmari.fi>
*/
$lang['menu'] = 'Palautuksenhallinta';
$lang['filter'] = 'Etsi spammattyjä sivuja';
diff --git a/lib/plugins/revert/lang/fr/lang.php b/lib/plugins/revert/lang/fr/lang.php
index d80ece209..17a2c3a01 100644
--- a/lib/plugins/revert/lang/fr/lang.php
+++ b/lib/plugins/revert/lang/fr/lang.php
@@ -13,6 +13,8 @@
* @author Philippe Bajoit <philippe.bajoit@gmail.com>
* @author Florian Gaub <floriang@floriang.net>
* @author Samuel Dorsaz samuel.dorsaz@novelion.net
+ * @author Johan Guilbaud <guilbaud.johan@gmail.com>
+ * @author schplurtz@laposte.net
*/
$lang['menu'] = 'Gestionnaire de réversions';
$lang['filter'] = 'Trouver les pages spammées ';
diff --git a/lib/plugins/revert/lang/he/lang.php b/lib/plugins/revert/lang/he/lang.php
index 585487816..ac3c3412e 100644
--- a/lib/plugins/revert/lang/he/lang.php
+++ b/lib/plugins/revert/lang/he/lang.php
@@ -5,6 +5,7 @@
* @author Dotan Kamber <kamberd@yahoo.com>
* @author Moshe Kaplan <mokplan@gmail.com>
* @author Yaron Yogev <yaronyogev@gmail.com>
+ * @author Yaron Shahrabani <sh.yaron@gmail.com>
*/
$lang['menu'] = 'מנהל שחזור';
$lang['filter'] = 'חפש דפים עם ספאם';
diff --git a/lib/plugins/revert/lang/hr/lang.php b/lib/plugins/revert/lang/hr/lang.php
index d2094b77b..96f1d6afe 100644
--- a/lib/plugins/revert/lang/hr/lang.php
+++ b/lib/plugins/revert/lang/hr/lang.php
@@ -4,4 +4,5 @@
*
* @author Branko Rihtman <theney@gmail.com>
* @author Dražen Odobašić <dodobasic@gmail.com>
+ * @author Dejan Igrec dejan.igrec@gmail.com
*/
diff --git a/lib/plugins/revert/lang/hu/lang.php b/lib/plugins/revert/lang/hu/lang.php
index 6cbdf3643..058a63196 100644
--- a/lib/plugins/revert/lang/hu/lang.php
+++ b/lib/plugins/revert/lang/hu/lang.php
@@ -5,8 +5,9 @@
* @author Sandor TIHANYI <stihanyi+dw@gmail.com>
* @author Siaynoq Mage <siaynoqmage@gmail.com>
* @author schilling.janos@gmail.com
- * @author Szabó Dávid (szabo.david@gyumolcstarhely.hu)
* @author Szabó Dávid <szabo.david@gyumolcstarhely.hu>
+ * @author Sándor TIHANYI <stihanyi+dw@gmail.com>
+ * @author David Szabo <szabo.david@gyumolcstarhely.hu>
*/
$lang['menu'] = 'Visszaállítás kezelő (anti-SPAM)';
$lang['filter'] = 'SPAM tartalmú oldalak keresése';
diff --git a/lib/plugins/revert/lang/it/lang.php b/lib/plugins/revert/lang/it/lang.php
index 319493acd..79565655b 100644
--- a/lib/plugins/revert/lang/it/lang.php
+++ b/lib/plugins/revert/lang/it/lang.php
@@ -9,6 +9,7 @@
* @author snarchio@alice.it
* @author robocap <robocap1@gmail.com>
* @author Osman Tekin osman.tekin93@hotmail.it
+ * @author Jacopo Corbetta <jacopo.corbetta@gmail.com>
*/
$lang['menu'] = 'Gestore di ripristini';
$lang['filter'] = 'Cerca pagine con spam';
diff --git a/lib/plugins/revert/lang/kk/lang.php b/lib/plugins/revert/lang/kk/lang.php
new file mode 100644
index 000000000..dde5b9577
--- /dev/null
+++ b/lib/plugins/revert/lang/kk/lang.php
@@ -0,0 +1,6 @@
+<?php
+/**
+ * kazakh language file
+ *
+ * @author Nurgozha Kaliaskarov astana08@gmail.com
+ */
diff --git a/lib/plugins/revert/lang/la/intro.txt b/lib/plugins/revert/lang/la/intro.txt
index 35916f683..99a206f63 100644
--- a/lib/plugins/revert/lang/la/intro.txt
+++ b/lib/plugins/revert/lang/la/intro.txt
@@ -1,3 +1,3 @@
====== Restituendi Administrator ======
-Haec pagina contra mala interretialia paginas restituta. Ut paginas aegras quaeras, malum VRL scribe, deinde paginas malas eligas. \ No newline at end of file
+Haec pagina contra mala interretialia paginas restituta. Vt paginas aegras quaeras, malum VRL scribe, deinde paginas malas eligas. \ No newline at end of file
diff --git a/lib/plugins/revert/lang/la/lang.php b/lib/plugins/revert/lang/la/lang.php
index f742e63f2..af4203437 100644
--- a/lib/plugins/revert/lang/la/lang.php
+++ b/lib/plugins/revert/lang/la/lang.php
@@ -2,6 +2,7 @@
/**
* Latin language file
*
+ * @author Massimiliano Vassalli <vassalli.max@gmail.com>
*/
$lang['menu'] = 'Restituendi administrator';
$lang['filter'] = 'Malas paginas quaerere';
diff --git a/lib/plugins/revert/lang/no/lang.php b/lib/plugins/revert/lang/no/lang.php
index 262ea3fe5..6f9ba2555 100644
--- a/lib/plugins/revert/lang/no/lang.php
+++ b/lib/plugins/revert/lang/no/lang.php
@@ -12,6 +12,7 @@
* @author Lisa Ditlefsen <lisa@vervesearch.com>
* @author Erik Pedersen <erik.pedersen@shaw.ca>
* @author Erik Bjørn Pedersen <erik.pedersen@shaw.ca>
+ * @author Rune Rasmussen syntaxerror.no@gmail.com
*/
$lang['menu'] = 'Tilbakestillingsbehandler';
$lang['filter'] = 'Søk etter søppelmeldinger';
diff --git a/lib/plugins/revert/lang/pt/lang.php b/lib/plugins/revert/lang/pt/lang.php
index 4ad114efe..3b2850f41 100644
--- a/lib/plugins/revert/lang/pt/lang.php
+++ b/lib/plugins/revert/lang/pt/lang.php
@@ -6,6 +6,7 @@
* @author Enrico Nicoletto <liverig@gmail.com>
* @author Fil <fil@meteopt.com>
* @author André Neves <drakferion@gmail.com>
+ * @author José Campos zecarlosdecampos@gmail.com
*/
$lang['menu'] = 'Gestor de Reversões';
$lang['filter'] = 'Pesquisar por páginas "spammy"';
diff --git a/lib/plugins/revert/lang/ru/intro.txt b/lib/plugins/revert/lang/ru/intro.txt
index 66c5af005..52d1f8d3d 100644
--- a/lib/plugins/revert/lang/ru/intro.txt
+++ b/lib/plugins/revert/lang/ru/intro.txt
@@ -1,3 +1,3 @@
====== Менеджер откаток ======
-Эта страница поможет вам в автоматической откатке изменений после спам-атаки. Для того, чтобы найти спам-страницы, введите ключевые слова и произведите поиск (например, по URL спамера). Затем убедитесь, что найденные страницы действительно содержат спам, и сделайте откатку изменений.
+Эта страница поможет вам в автоматической откатке изменений после спам-атаки. Для того, чтобы найти спам-страницы, введите ключевые слова и произведите поиск (например, по URL спамера). Затем убедитесь, что найденные страницы действительно содержат спам и сделайте откатку изменений.
diff --git a/lib/plugins/revert/lang/ru/lang.php b/lib/plugins/revert/lang/ru/lang.php
index 712a41f08..9624d8fd6 100644
--- a/lib/plugins/revert/lang/ru/lang.php
+++ b/lib/plugins/revert/lang/ru/lang.php
@@ -12,6 +12,8 @@
* @author Vlad Tsybenko <vlad.development@gmail.com>
* @author Aleksey Osadchiy <rfc@nm.ru>
* @author Aleksandr Selivanov <alexgearbox@gmail.com>
+ * @author Ladyko Andrey <fylh@succexy.spb.ru>
+ * @author Eugene <windy.wanderer@gmail.com>
*/
$lang['menu'] = 'Менеджер откаток';
$lang['filter'] = 'Поиск спам-страниц';
diff --git a/lib/plugins/revert/lang/sl/intro.txt b/lib/plugins/revert/lang/sl/intro.txt
new file mode 100644
index 000000000..c63f281ed
--- /dev/null
+++ b/lib/plugins/revert/lang/sl/intro.txt
@@ -0,0 +1,3 @@
+====== Povrnitev okvarjene vsebine ======
+
+Na tej strani je mogoe povrniti vsebino wiki strani na izvorne vrednosti po napadu na stran in vpisu neelenih vsebin. Za iskanje strani z neeleno vsebino, uporabite iskalnik z ustreznim nizom (npr. naslov URL), potem pa potrdite, da so najdene strani res z neeleno vsebino in nato povrnite stanje na zadnjo pravo razliico.
diff --git a/lib/plugins/revert/lang/sl/lang.php b/lib/plugins/revert/lang/sl/lang.php
index 1fcf4ca36..92b0427ce 100644
--- a/lib/plugins/revert/lang/sl/lang.php
+++ b/lib/plugins/revert/lang/sl/lang.php
@@ -2,6 +2,14 @@
/**
* Slovenian language file
*
- * @author Dejan Levec <webphp@gmail.com>
- * @author Boštjan Seničar <senicar@gmail.com>
+ * @author Matej Urbančič (mateju@svn.gnome.org)
*/
+$lang['menu'] = 'Povrnitev okvarjene vsebine';
+$lang['filter'] = 'Iskanje strani z neželeno vsebino';
+$lang['revert'] = 'Povrni izbrane strani';
+$lang['reverted'] = 'stran %s je povrnjena na različico %s';
+$lang['removed'] = 'stran %s je odstranjena';
+$lang['revstart'] = 'Postopek povrnitve vsebine je začet. Opravilo je lahko dolgotrajno. V kolikor opravilo časovno poteče prek končanjem povrnitve, bo treba postopek ponoviti na manjših odsekih.';
+$lang['revstop'] = 'Postopek povrnitve vsebine je uspešno končan.';
+$lang['note1'] = 'Opomba: iskanje upošteva velikost črk';
+$lang['note2'] = 'Opomba: stran bo povrnjena na zadnjo različico brez neželenega pojma <i>%s</i>.';
diff --git a/lib/plugins/revert/lang/sv/lang.php b/lib/plugins/revert/lang/sv/lang.php
index 1b6ca3374..29c6702eb 100644
--- a/lib/plugins/revert/lang/sv/lang.php
+++ b/lib/plugins/revert/lang/sv/lang.php
@@ -14,6 +14,7 @@
* @author Bogge Bogge <bogge@bogge.com>
* @author Peter Åström <eaustreum@gmail.com>
* @author Håkan Sandell <hakan.sandell@home.se>
+ * @author mikael@mallander.net
*/
$lang['menu'] = 'Hantera återställningar';
$lang['filter'] = 'Sök efter spamsidor';
diff --git a/lib/plugins/revert/lang/uk/lang.php b/lib/plugins/revert/lang/uk/lang.php
index ffc394f43..310f8e8da 100644
--- a/lib/plugins/revert/lang/uk/lang.php
+++ b/lib/plugins/revert/lang/uk/lang.php
@@ -7,13 +7,14 @@
* @author Oleksandr Kunytsia <okunia@gmail.com>
* @author Uko uko@uar.net
* @author Ulrikhe Lukoie <lukoie@gmail>.com
+ * @author Kate Arzamastseva pshns@ukr.net
*/
$lang['menu'] = 'Менеджер відновлення';
$lang['filter'] = 'Пошук спамних сторінок';
$lang['revert'] = 'Відновити обрані сторінки';
$lang['reverted'] = '%s відновлено до версії %s';
$lang['removed'] = '%s вилучено';
-$lang['revstart'] = 'Розпочато процес відновлення. Це може зайняти багато часу. Якщо скрипт закінчує роботу по таймауту, необхідно відновлювати меншими частинами.';
+$lang['revstart'] = 'Розпочато процес відновлення. Це може зайняти багато часу. Якщо скрипт не закінчує роботу до таймауту, необхідно відновлювати меншими частинами.';
$lang['revstop'] = 'Процес відновлення успішно закінчено.';
$lang['note1'] = 'Увага: пошук залежить від регістру символів';
$lang['note2'] = 'Увага: сторінку буде відновлено до останньої версії, яка не містить спамерського терміну <i>%s</i>.';
diff --git a/lib/plugins/revert/lang/zh-tw/intro.txt b/lib/plugins/revert/lang/zh-tw/intro.txt
index 2aad10206..17632b1dd 100644
--- a/lib/plugins/revert/lang/zh-tw/intro.txt
+++ b/lib/plugins/revert/lang/zh-tw/intro.txt
@@ -1,3 +1,3 @@
====== 還原管理器 ======
-該頁面能幫助您的頁面從垃圾信息的攻擊中自動還原過來。 請先輸入關鍵詞搜索包含垃圾信息的頁面(如某個垃圾信息的 URL),然后請確定搜索結果的確包含垃圾信息,並將其還原至先前的修訂版。
+本頁面能幫助您自動還原被垃圾訊息攻擊的頁面過來。先輸入關鍵字詞搜尋包含垃圾訊息的頁面(如垃圾訊息的 URL),確認找到的頁面確實包含垃圾訊息,再將它們還原。
diff --git a/lib/plugins/revert/lang/zh-tw/lang.php b/lib/plugins/revert/lang/zh-tw/lang.php
index 40a137dc0..a853ccd2e 100644
--- a/lib/plugins/revert/lang/zh-tw/lang.php
+++ b/lib/plugins/revert/lang/zh-tw/lang.php
@@ -7,13 +7,15 @@
* @author Wayne San <waynesan@zerozone.tw>
* @author Li-Jiun Huang <ljhuang.tw@gmai.com>
* @author Cheng-Wei Chien <e.cwchien@gmail.com>
+ * @author Danny Lin <danny0838@pchome.com.tw>
+ * @author Shuo-Ting Jian <shoting@gmail.com>
*/
$lang['menu'] = '還原管理';
-$lang['filter'] = '搜索包含垃圾信息的頁面';
-$lang['revert'] = '還原所選的頁面';
-$lang['reverted'] = '%s已還原到版本%s';
-$lang['removed'] = '%s已移除';
-$lang['revstart'] = '已開始還原操作。有可能需要很長時間。如果計時器在還原操作完成前停止了,請嘗試還原較少的內容。';
-$lang['revstop'] = '還原程序已成工的完成。';
-$lang['note1'] = '注意: 搜尋有分大小寫';
-$lang['note2'] = '注意: 此頁將會被還原到不包含給予的spam term <i>%s</i> 的最新版本.';
+$lang['filter'] = '搜索包含垃圾訊息的頁面';
+$lang['revert'] = '還原選取的頁面';
+$lang['reverted'] = '%s 已還原為版本 %s';
+$lang['removed'] = '%s 已移除';
+$lang['revstart'] = '已開始還原操作。有可能需要很長時間。如果程式執行逾時,請嘗試分次還原少量內容。';
+$lang['revstop'] = '還原程序已成功完成。';
+$lang['note1'] = '注意:搜尋區分大小寫';
+$lang['note2'] = '注意:此頁面將被還原為最後一個不含垃圾訊息 <i>%s</i> 的版本。';
diff --git a/lib/plugins/revert/lang/zh/lang.php b/lib/plugins/revert/lang/zh/lang.php
index 5ff1ed426..eb8733618 100644
--- a/lib/plugins/revert/lang/zh/lang.php
+++ b/lib/plugins/revert/lang/zh/lang.php
@@ -11,6 +11,8 @@
* @author ben <ben@livetom.com>
* @author lainme <lainme993@gmail.com>
* @author caii <zhoucaiqi@gmail.com>
+ * @author Hiphen Lee <jacob.b.leung@gmail.com>
+ * @author caii, patent agent in China <zhoucaiqi@gmail.com>
*/
$lang['menu'] = '还原管理器';
$lang['filter'] = '搜索包含垃圾信息的页面';
diff --git a/lib/plugins/safefnrecode/action.php b/lib/plugins/safefnrecode/action.php
new file mode 100644
index 000000000..5d3eaae3a
--- /dev/null
+++ b/lib/plugins/safefnrecode/action.php
@@ -0,0 +1,68 @@
+<?php
+/**
+ * DokuWiki Plugin safefnrecode (Action Component)
+ *
+ * @license GPL 2 http://www.gnu.org/licenses/gpl-2.0.html
+ * @author Andreas Gohr <andi@splitbrain.org>
+ */
+
+// must be run within Dokuwiki
+if (!defined('DOKU_INC')) die();
+
+require_once DOKU_PLUGIN.'action.php';
+
+class action_plugin_safefnrecode extends DokuWiki_Action_Plugin {
+
+ public function register(Doku_Event_Handler &$controller) {
+
+ $controller->register_hook('INDEXER_TASKS_RUN', 'BEFORE', $this, 'handle_indexer_tasks_run');
+
+ }
+
+ public function handle_indexer_tasks_run(Doku_Event &$event, $param) {
+ global $conf;
+ if($conf['fnencode'] != 'safe') return;
+
+ if(!file_exists($conf['datadir'].'_safefn.recoded')){
+ $this->recode($conf['datadir']);
+ touch($conf['datadir'].'_safefn.recoded');
+ }
+
+ if(!file_exists($conf['olddir'].'_safefn.recoded')){
+ $this->recode($conf['olddir']);
+ touch($conf['olddir'].'_safefn.recoded');
+ }
+
+ if(!file_exists($conf['metadir'].'_safefn.recoded')){
+ $this->recode($conf['metadir']);
+ touch($conf['metadir'].'_safefn.recoded');
+ }
+
+ if(!file_exists($conf['mediadir'].'_safefn.recoded')){
+ $this->recode($conf['mediadir']);
+ touch($conf['mediadir'].'_safefn.recoded');
+ }
+
+ }
+
+ /**
+ * Recursive function to rename all safe encoded files to use the new
+ * square bracket post indicator
+ */
+ private function recode($dir){
+ $dh = opendir($dir);
+ if(!$dh) return;
+ while (($file = readdir($dh)) !== false) {
+ if($file == '.' || $file == '..') continue; # cur and upper dir
+ if(is_dir("$dir/$file")) $this->recode("$dir/$file"); #recurse
+ if(strpos($file,'%') === false) continue; # no encoding used
+ $new = preg_replace('/(%[^\]]*?)\./','\1]',$file); # new post indicator
+ if(preg_match('/%[^\]]+$/',$new)) $new .= ']'; # fix end FS#2122
+ rename("$dir/$file","$dir/$new"); # rename it
+ }
+ closedir($dh);
+ }
+
+}
+
+// vim:ts=4:sw=4:et:
diff --git a/lib/plugins/safefnrecode/plugin.info.txt b/lib/plugins/safefnrecode/plugin.info.txt
new file mode 100644
index 000000000..b1600060c
--- /dev/null
+++ b/lib/plugins/safefnrecode/plugin.info.txt
@@ -0,0 +1,7 @@
+base safefnrecode
+author Andreas Gohr
+email andi@splitbrain.org
+date 2011-04-03
+name safefnrecode plugin
+desc Changes existing page and foldernames for the change in the safe filename encoding
+url http://www.dokuwiki.org/plugin:safefnrecode
diff --git a/lib/plugins/syntax.php b/lib/plugins/syntax.php
index 05b0dc466..12451f636 100644
--- a/lib/plugins/syntax.php
+++ b/lib/plugins/syntax.php
@@ -188,10 +188,13 @@ class DokuWiki_Syntax_Plugin extends Doku_Parser_Mode {
function localFN($id) {
global $conf;
$plugin = $this->getPluginName();
- $file = DOKU_PLUGIN.$plugin.'/lang/'.$conf['lang'].'/'.$id.'.txt';
- if(!@file_exists($file)){
- //fall back to english
- $file = DOKU_PLUGIN.$plugin.'/lang/en/'.$id.'.txt';
+ $file = DOKU_CONF.'/plugin_lang/'.$plugin.'/'.$conf['lang'].'/'.$id.'.txt';
+ if (!@file_exists($file)){
+ $file = DOKU_PLUGIN.$plugin.'/lang/'.$conf['lang'].'/'.$id.'.txt';
+ if(!@file_exists($file)){
+ //fall back to english
+ $file = DOKU_PLUGIN.$plugin.'/lang/en/'.$id.'.txt';
+ }
}
return $file;
}
diff --git a/lib/plugins/usermanager/admin.php b/lib/plugins/usermanager/admin.php
index df13f65e3..e40ee9b7e 100644
--- a/lib/plugins/usermanager/admin.php
+++ b/lib/plugins/usermanager/admin.php
@@ -562,16 +562,19 @@ class admin_plugin_usermanager extends DokuWiki_Admin_Plugin {
* @return array(user, password, full name, email, array(groups))
*/
function _retrieveUser($clean=true) {
+ global $auth;
- $user[0] = ($clean) ? cleanID(preg_replace('/.*:/','',$_REQUEST['userid'])) : $_REQUEST['userid'];
+ $user[0] = ($clean) ? $auth->cleanUser($_REQUEST['userid']) : $_REQUEST['userid'];
$user[1] = $_REQUEST['userpass'];
$user[2] = $_REQUEST['username'];
$user[3] = $_REQUEST['usermail'];
- $user[4] = preg_split('/\s*,\s*/',$_REQUEST['usergroups'],-1,PREG_SPLIT_NO_EMPTY);
+ $user[4] = explode(',',$_REQUEST['usergroups']);
- if (empty($user[4]) || (is_array($user[4]) && (count($user[4]) == 1) && (trim($user[4][0]) == ''))) {
- $user[4] = null;
- }
+ $user[4] = array_map('trim',$user[4]);
+ if($clean) $user[4] = array_map(array($auth,'cleanGroup'),$user[4]);
+ $user[4] = array_filter($user[4]);
+ $user[4] = array_unique($user[4]);
+ if(!count($user[4])) $user[4] = null;
return $user;
}
diff --git a/lib/plugins/usermanager/images/search.png b/lib/plugins/usermanager/images/search.png
index 1aa445f03..e9dabc11e 100644
--- a/lib/plugins/usermanager/images/search.png
+++ b/lib/plugins/usermanager/images/search.png
Binary files differ
diff --git a/lib/plugins/usermanager/lang/ar/lang.php b/lib/plugins/usermanager/lang/ar/lang.php
index 6c1b2b840..d4b891320 100644
--- a/lib/plugins/usermanager/lang/ar/lang.php
+++ b/lib/plugins/usermanager/lang/ar/lang.php
@@ -4,6 +4,7 @@
*
* @author Yaman Hokan <always.smile.yh@hotmail.com>
* @author Usama Akkad <uahello@gmail.com>
+ * @author uahello@gmail.com
*/
$lang['menu'] = 'مدير المستخدمين';
$lang['noauth'] = '(مصادقة المستخدمين غير متوفرة)';
diff --git a/lib/plugins/usermanager/lang/bg/lang.php b/lib/plugins/usermanager/lang/bg/lang.php
index 58c8453f2..9ed27f42a 100644
--- a/lib/plugins/usermanager/lang/bg/lang.php
+++ b/lib/plugins/usermanager/lang/bg/lang.php
@@ -4,11 +4,12 @@
*
* @author Nikolay Vladimirov <nikolay@vladimiroff.com>
* @author Viktor Usunov <usun0v@mail.bg>
+ * @author Kiril <neohidra@gmail.com>
*/
-$lang['menu'] = 'Управление на потребителите';
-$lang['noauth'] = '(идентифицирането на потребителите е недостъпно)';
-$lang['nosupport'] = '(не се поддържа управление на потребители)';
-$lang['badauth'] = 'невалиден механизъм при идентификация';
+$lang['menu'] = 'Диспечер на потребителите';
+$lang['noauth'] = '(удостоверяването на потребители не е налично)';
+$lang['nosupport'] = '(управлението на потребители не се поддържа)';
+$lang['badauth'] = 'невалиден механизъм за удостоверяване';
$lang['user_id'] = 'Потребител';
$lang['user_pass'] = 'Парола';
$lang['user_name'] = 'Истинско име';
@@ -16,33 +17,33 @@ $lang['user_mail'] = 'Електронна поща';
$lang['user_groups'] = 'Групи';
$lang['field'] = 'Поле';
$lang['value'] = 'Стойност';
-$lang['add'] = 'Добавяне';
-$lang['delete'] = 'Изтриване';
-$lang['delete_selected'] = 'Изтриване на избраните';
-$lang['edit'] = 'Редактиране';
+$lang['add'] = 'Добави';
+$lang['delete'] = 'Изтрий';
+$lang['delete_selected'] = 'Изтрий избраните';
+$lang['edit'] = 'Редактирай';
$lang['edit_prompt'] = 'Редактиране на потребителя';
-$lang['modify'] = 'Запис на промените';
+$lang['modify'] = 'Запиши промените';
$lang['search'] = 'Търсене';
-$lang['search_prompt'] = 'Търсене';
+$lang['search_prompt'] = 'Търси';
$lang['clear'] = 'Обновяване на търсенето';
$lang['filter'] = 'Филтър';
-$lang['summary'] = 'Показване на потребители %1$d-%2$d от %3$d намерени. %4$d потребители общо.';
-$lang['nonefound'] = 'Няма намерени потребители. Общо %d потребители.';
-$lang['delete_ok'] = '%d потребители изтрити';
-$lang['delete_fail'] = '%d не бяха изтрити';
-$lang['update_ok'] = 'Обновяването на потребителя бе успешно';
-$lang['update_fail'] = 'Обновяването на потребителя бе неуспешно';
-$lang['update_exists'] = 'Смяната на потребителското име бе невъзможна, оказаното потребителско име (%s) вече съществува (всякакви други промени ще бъдат приложени).';
+$lang['summary'] = 'Показване на потребители %1$d-%2$d от %3$d намерени. Общо %4$d потребителя.';
+$lang['nonefound'] = 'Не са намерени потребители. Общо %d потребителя.';
+$lang['delete_ok'] = '%d изтрити потребителя';
+$lang['delete_fail'] = 'изтриването на %d се провали.';
+$lang['update_ok'] = 'Обновяването на потребителя е успешно';
+$lang['update_fail'] = 'Обновяването на потребителя се провали';
+$lang['update_exists'] = 'Смяната на потребителското име се провали, въведеното потребителско име (%s) вече съществува (всички други промени ще бъдат приложени).';
$lang['start'] = 'начало';
-$lang['prev'] = 'предишно';
-$lang['next'] = 'следващо';
-$lang['last'] = 'последно';
-$lang['edit_usermissing'] = 'Избраният потребител не бе намерен, оказаното потребителско име може да е изтрито или променено другаде.';
-$lang['user_notify'] = 'Осведомяване на потребителя';
-$lang['note_notify'] = 'Осведомителната e-поща се праща само, ако на потребителя е дадена нова парола.';
-$lang['note_group'] = 'Новите потребители ще бъдат добавяни към групата (%s) ако не бъде посочена друга.';
-$lang['note_pass'] = 'Паролата ще бъде генерирана автоматично, ако полето е оставено празно и функцията за уведомяване на потребителя е включена.';
-$lang['add_ok'] = 'Добавянето на потребителя бе успешно';
-$lang['add_fail'] = 'Добавянето на потребителя бе неуспешно';
-$lang['notify_ok'] = 'Осведомително е-писмо бе изпратено';
-$lang['notify_fail'] = 'Пращането на осведомително е-писмо е невъзможно';
+$lang['prev'] = 'назад';
+$lang['next'] = 'напред';
+$lang['last'] = 'край';
+$lang['edit_usermissing'] = 'Избраният потребител не е намерен, въведеното потребителско име може да е изтрито или променено другаде.';
+$lang['user_notify'] = 'Уведомяване на потребителя';
+$lang['note_notify'] = 'Ел. писмо се изпраща само ако бъде променена паролата на потребителя.';
+$lang['note_group'] = 'Новите потребители биват добавяни към стандартната групата (%s) ако не е посочена друга.';
+$lang['note_pass'] = 'Паролата ще бъде генерирана автоматично, ако оставите полето празно и функцията за уведомяване на потребителя е включена.';
+$lang['add_ok'] = 'Добавянето на потребителя е успешно';
+$lang['add_fail'] = 'Добавянето на потребителя се провали';
+$lang['notify_ok'] = 'Изпратено е осведомително ел. писмо';
+$lang['notify_fail'] = 'Изпращането на осведомително ел. писмо не е възможно';
diff --git a/lib/plugins/usermanager/lang/bg/list.txt b/lib/plugins/usermanager/lang/bg/list.txt
index e90205fe6..106856c0e 100644
--- a/lib/plugins/usermanager/lang/bg/list.txt
+++ b/lib/plugins/usermanager/lang/bg/list.txt
@@ -1 +1 @@
-===== Списък с потребителите =====
+===== Списък на потребителите =====
diff --git a/lib/plugins/usermanager/lang/cs/lang.php b/lib/plugins/usermanager/lang/cs/lang.php
index 7d8e4599d..c805011d7 100644
--- a/lib/plugins/usermanager/lang/cs/lang.php
+++ b/lib/plugins/usermanager/lang/cs/lang.php
@@ -8,6 +8,7 @@
* @author tomas@valenta.cz
* @author Marek Sacha <sachamar@fel.cvut.cz>
* @author Lefty <lefty@multihost.cz>
+ * @author Vojta Beran <xmamut@email.cz>
*/
$lang['menu'] = 'Správa uživatelů';
$lang['noauth'] = '(autentizace uživatelů není k dispozici)';
diff --git a/lib/plugins/usermanager/lang/de-informal/lang.php b/lib/plugins/usermanager/lang/de-informal/lang.php
index e906c0cf8..95b36c60f 100644
--- a/lib/plugins/usermanager/lang/de-informal/lang.php
+++ b/lib/plugins/usermanager/lang/de-informal/lang.php
@@ -6,6 +6,7 @@
* @author Juergen Schwarzer <jschwarzer@freenet.de>
* @author Marcel Metz <marcel_metz@gmx.de>
* @author Matthias Schulte <post@lupo49.de>
+ * @author Christian Wichmann <nospam@zone0.de>
*/
$lang['menu'] = 'Benutzerverwalter';
$lang['noauth'] = '(Benutzeranmeldung ist nicht verfügbar)';
diff --git a/lib/plugins/usermanager/lang/de/lang.php b/lib/plugins/usermanager/lang/de/lang.php
index 816aaebd7..090d1d1d9 100644
--- a/lib/plugins/usermanager/lang/de/lang.php
+++ b/lib/plugins/usermanager/lang/de/lang.php
@@ -13,6 +13,8 @@
* @author Blitzi94@gmx.de
* @author Robert Bogenschneider <robog@GMX.de>
* @author Robert Bogenschneider <robog@gmx.de>
+ * @author Niels Lange <niels@boldencursief.nl>
+ * @author Christian Wichmann <nospam@zone0.de>
*/
$lang['menu'] = 'Benutzerverwaltung';
$lang['noauth'] = '(Authentifizierungssystem nicht verfügbar)';
diff --git a/lib/plugins/usermanager/lang/es/lang.php b/lib/plugins/usermanager/lang/es/lang.php
index a5b6bcbb8..1e79c6826 100644
--- a/lib/plugins/usermanager/lang/es/lang.php
+++ b/lib/plugins/usermanager/lang/es/lang.php
@@ -18,6 +18,7 @@
* @author Fernando J. Gómez <fjgomez@gmail.com>
* @author Victor Castelan <victorcastelan@gmail.com>
* @author Mauro Javier Giamberardino <mgiamberardino@gmail.com>
+ * @author emezeta <emezeta@infoprimo.com>
*/
$lang['menu'] = 'Administración de usuarios';
$lang['noauth'] = '(la autenticación de usuarios no está disponible)';
diff --git a/lib/plugins/usermanager/lang/et/lang.php b/lib/plugins/usermanager/lang/et/lang.php
new file mode 100644
index 000000000..2161df918
--- /dev/null
+++ b/lib/plugins/usermanager/lang/et/lang.php
@@ -0,0 +1,30 @@
+<?php
+/**
+ * Estonian language file
+ *
+ * @author kristian.kankainen@kuu.la
+ * @author Rivo Zängov <eraser@eraser.ee>
+ */
+$lang['menu'] = 'Kasutajate haldamine';
+$lang['user_id'] = 'Kasutaja';
+$lang['user_pass'] = 'Parool';
+$lang['user_name'] = 'Tegelik nimi';
+$lang['user_mail'] = 'E-post';
+$lang['user_groups'] = 'Grupid';
+$lang['field'] = 'Väli';
+$lang['value'] = 'Väärtus';
+$lang['add'] = 'Lisa';
+$lang['delete'] = 'Kustuta';
+$lang['delete_selected'] = 'Kustuta valitud';
+$lang['edit'] = 'Muuda';
+$lang['edit_prompt'] = 'Muuda seda kasutajat';
+$lang['modify'] = 'Salvesta muudatused';
+$lang['search'] = 'Otsi';
+$lang['search_prompt'] = 'Soorita otsing';
+$lang['filter'] = 'Filtreeri';
+$lang['update_fail'] = 'Kasutaja uuendamine ebaõnnestus';
+$lang['start'] = 'esimesed';
+$lang['prev'] = 'eelmine';
+$lang['next'] = 'järgmine';
+$lang['last'] = 'viimased';
+$lang['user_notify'] = 'Teavita kasutajat';
diff --git a/lib/plugins/usermanager/lang/fi/lang.php b/lib/plugins/usermanager/lang/fi/lang.php
index 6eeb4c3e8..1db4bd7fb 100644
--- a/lib/plugins/usermanager/lang/fi/lang.php
+++ b/lib/plugins/usermanager/lang/fi/lang.php
@@ -5,6 +5,7 @@
* @author otto@valjakko.net
* @author Otto Vainio <otto@valjakko.net>
* @author Teemu Mattila <ghcsystems@gmail.com>
+ * @author Sami Olmari <sami@olmari.fi>
*/
$lang['menu'] = 'Käyttäjähallinta';
$lang['noauth'] = '(autentikointi ei ole käytössä)';
diff --git a/lib/plugins/usermanager/lang/fr/lang.php b/lib/plugins/usermanager/lang/fr/lang.php
index 92bc127ed..b6910663c 100644
--- a/lib/plugins/usermanager/lang/fr/lang.php
+++ b/lib/plugins/usermanager/lang/fr/lang.php
@@ -14,6 +14,8 @@
* @author Philippe Bajoit <philippe.bajoit@gmail.com>
* @author Florian Gaub <floriang@floriang.net>
* @author Samuel Dorsaz samuel.dorsaz@novelion.net
+ * @author Johan Guilbaud <guilbaud.johan@gmail.com>
+ * @author schplurtz@laposte.net
*/
$lang['menu'] = 'Gestion des utilisateurs';
$lang['noauth'] = '(authentification utilisateur non disponible)';
diff --git a/lib/plugins/usermanager/lang/he/lang.php b/lib/plugins/usermanager/lang/he/lang.php
index b2b55c3b4..601163013 100644
--- a/lib/plugins/usermanager/lang/he/lang.php
+++ b/lib/plugins/usermanager/lang/he/lang.php
@@ -6,6 +6,7 @@
* @author Dotan Kamber <kamberd@yahoo.com>
* @author Moshe Kaplan <mokplan@gmail.com>
* @author Yaron Yogev <yaronyogev@gmail.com>
+ * @author Yaron Shahrabani <sh.yaron@gmail.com>
*/
$lang['menu'] = 'מנהל משתמשים';
$lang['noauth'] = '(אימות משתמשים אינו זמין)';
diff --git a/lib/plugins/usermanager/lang/hr/lang.php b/lib/plugins/usermanager/lang/hr/lang.php
index d2094b77b..96f1d6afe 100644
--- a/lib/plugins/usermanager/lang/hr/lang.php
+++ b/lib/plugins/usermanager/lang/hr/lang.php
@@ -4,4 +4,5 @@
*
* @author Branko Rihtman <theney@gmail.com>
* @author Dražen Odobašić <dodobasic@gmail.com>
+ * @author Dejan Igrec dejan.igrec@gmail.com
*/
diff --git a/lib/plugins/usermanager/lang/hu/lang.php b/lib/plugins/usermanager/lang/hu/lang.php
index 7b22dfb48..9b9740cb0 100644
--- a/lib/plugins/usermanager/lang/hu/lang.php
+++ b/lib/plugins/usermanager/lang/hu/lang.php
@@ -5,8 +5,9 @@
* @author Sandor TIHANYI <stihanyi+dw@gmail.com>
* @author Siaynoq Mage <siaynoqmage@gmail.com>
* @author schilling.janos@gmail.com
- * @author Szabó Dávid (szabo.david@gyumolcstarhely.hu)
* @author Szabó Dávid <szabo.david@gyumolcstarhely.hu>
+ * @author Sándor TIHANYI <stihanyi+dw@gmail.com>
+ * @author David Szabo <szabo.david@gyumolcstarhely.hu>
*/
$lang['menu'] = 'Felhasználók kezelése';
$lang['noauth'] = '(A felhasználói azonosítás nem működik.)';
diff --git a/lib/plugins/usermanager/lang/it/lang.php b/lib/plugins/usermanager/lang/it/lang.php
index a766e5d07..34c510def 100644
--- a/lib/plugins/usermanager/lang/it/lang.php
+++ b/lib/plugins/usermanager/lang/it/lang.php
@@ -11,6 +11,7 @@
* @author snarchio@alice.it
* @author robocap <robocap1@gmail.com>
* @author Osman Tekin osman.tekin93@hotmail.it
+ * @author Jacopo Corbetta <jacopo.corbetta@gmail.com>
*/
$lang['menu'] = 'Gestione Utenti';
$lang['noauth'] = '(autenticazione non disponibile)';
diff --git a/lib/plugins/usermanager/lang/kk/lang.php b/lib/plugins/usermanager/lang/kk/lang.php
new file mode 100644
index 000000000..dde5b9577
--- /dev/null
+++ b/lib/plugins/usermanager/lang/kk/lang.php
@@ -0,0 +1,6 @@
+<?php
+/**
+ * kazakh language file
+ *
+ * @author Nurgozha Kaliaskarov astana08@gmail.com
+ */
diff --git a/lib/plugins/usermanager/lang/la/lang.php b/lib/plugins/usermanager/lang/la/lang.php
index 2646979bd..52c848754 100644
--- a/lib/plugins/usermanager/lang/la/lang.php
+++ b/lib/plugins/usermanager/lang/la/lang.php
@@ -2,6 +2,7 @@
/**
* Latin language file
*
+ * @author Massimiliano Vassalli <vassalli.max@gmail.com>
*/
$lang['menu'] = 'Sodalis Tabella';
$lang['noauth'] = '(Sodalis confirmatio deest)';
diff --git a/lib/plugins/usermanager/lang/no/lang.php b/lib/plugins/usermanager/lang/no/lang.php
index df38de1b0..31e27747d 100644
--- a/lib/plugins/usermanager/lang/no/lang.php
+++ b/lib/plugins/usermanager/lang/no/lang.php
@@ -12,6 +12,7 @@
* @author Lisa Ditlefsen <lisa@vervesearch.com>
* @author Erik Pedersen <erik.pedersen@shaw.ca>
* @author Erik Bjørn Pedersen <erik.pedersen@shaw.ca>
+ * @author Rune Rasmussen syntaxerror.no@gmail.com
*/
$lang['menu'] = 'Behandle brukere';
$lang['noauth'] = '(autentisering av brukere ikke tilgjengelig)';
diff --git a/lib/plugins/usermanager/lang/pt/lang.php b/lib/plugins/usermanager/lang/pt/lang.php
index 8c4607922..6d0d85e38 100644
--- a/lib/plugins/usermanager/lang/pt/lang.php
+++ b/lib/plugins/usermanager/lang/pt/lang.php
@@ -6,6 +6,7 @@
* @author Enrico Nicoletto <liverig@gmail.com>
* @author Fil <fil@meteopt.com>
* @author André Neves <drakferion@gmail.com>
+ * @author José Campos zecarlosdecampos@gmail.com
*/
$lang['menu'] = 'Gestor de Perfis';
$lang['noauth'] = '(autenticação indisponível)';
diff --git a/lib/plugins/usermanager/lang/ru/lang.php b/lib/plugins/usermanager/lang/ru/lang.php
index 81d9a72a6..456ba5b29 100644
--- a/lib/plugins/usermanager/lang/ru/lang.php
+++ b/lib/plugins/usermanager/lang/ru/lang.php
@@ -14,6 +14,8 @@
* @author Vlad Tsybenko <vlad.development@gmail.com>
* @author Aleksey Osadchiy <rfc@nm.ru>
* @author Aleksandr Selivanov <alexgearbox@gmail.com>
+ * @author Ladyko Andrey <fylh@succexy.spb.ru>
+ * @author Eugene <windy.wanderer@gmail.com>
*/
$lang['menu'] = 'Управление пользователями';
$lang['noauth'] = '(авторизация пользователей недоступна)';
@@ -47,12 +49,12 @@ $lang['start'] = 'в начало';
$lang['prev'] = 'назад';
$lang['next'] = 'вперёд';
$lang['last'] = 'в конец';
-$lang['edit_usermissing'] = 'Выбранный пользователь не найден. Возможно, указанный логин был удалён или изменен извне.';
+$lang['edit_usermissing'] = 'Выбранный пользователь не найден. Возможно, указанный логин был удалён или изменён извне.';
$lang['user_notify'] = 'Сообщить пользователю';
$lang['note_notify'] = 'Письма с уведомлением высылаются только в случае получения нового пароля.';
$lang['note_group'] = 'Если группа не указана, новые пользователи будут добавлены в группу по умолчанию (%s).';
$lang['note_pass'] = 'Пароль будет сгенерирован автоматически, если поле оставлено пустым и включено уведомление пользователя.';
$lang['add_ok'] = 'Пользователь успешно добавлен';
$lang['add_fail'] = 'Не удалось добавить пользователя';
-$lang['notify_ok'] = 'Пиьмо с уведомлением отправлено';
+$lang['notify_ok'] = 'Письмо с уведомлением отправлено';
$lang['notify_fail'] = 'Не удалось отправить письмо с уведомлением';
diff --git a/lib/plugins/usermanager/lang/sl/add.txt b/lib/plugins/usermanager/lang/sl/add.txt
index 985fa607e..c1d8913b4 100644
--- a/lib/plugins/usermanager/lang/sl/add.txt
+++ b/lib/plugins/usermanager/lang/sl/add.txt
@@ -1 +1 @@
-===== Dodaj uporabnika ===== \ No newline at end of file
+===== Dodajanje uporabnika ===== \ No newline at end of file
diff --git a/lib/plugins/usermanager/lang/sl/delete.txt b/lib/plugins/usermanager/lang/sl/delete.txt
index 515b343e5..7d9de54e6 100644
--- a/lib/plugins/usermanager/lang/sl/delete.txt
+++ b/lib/plugins/usermanager/lang/sl/delete.txt
@@ -1 +1 @@
-===== Izbriši uporabnika ===== \ No newline at end of file
+===== Izbrisanje uporabnika ===== \ No newline at end of file
diff --git a/lib/plugins/usermanager/lang/sl/edit.txt b/lib/plugins/usermanager/lang/sl/edit.txt
index 23aeb0c3b..e80bc8585 100644
--- a/lib/plugins/usermanager/lang/sl/edit.txt
+++ b/lib/plugins/usermanager/lang/sl/edit.txt
@@ -1 +1 @@
-===== Uredi uporabnika ===== \ No newline at end of file
+===== Urejanje uporabnikov ===== \ No newline at end of file
diff --git a/lib/plugins/usermanager/lang/sl/intro.txt b/lib/plugins/usermanager/lang/sl/intro.txt
new file mode 100644
index 000000000..a4729a8a5
--- /dev/null
+++ b/lib/plugins/usermanager/lang/sl/intro.txt
@@ -0,0 +1 @@
+====== Upravljanje uporabnikov ======
diff --git a/lib/plugins/usermanager/lang/sl/lang.php b/lib/plugins/usermanager/lang/sl/lang.php
index e31f8ff1a..96acfd0af 100644
--- a/lib/plugins/usermanager/lang/sl/lang.php
+++ b/lib/plugins/usermanager/lang/sl/lang.php
@@ -4,17 +4,47 @@
*
* @author Dejan Levec <webphp@gmail.com>
* @author Boštjan Seničar <senicar@gmail.com>
+ * @author Gregor Skumavc (grega.skumavc@gmail.com)
+ * @author Matej Urbančič (mateju@svn.gnome.org)
*/
+$lang['menu'] = 'Upravljanje uporabnikov';
+$lang['noauth'] = '(overjanje istovetnosti uporabnikov ni na voljo)';
+$lang['nosupport'] = '(upravljanje računov uporabnikov ni podprto)';
+$lang['badauth'] = 'neveljaven način overjanja';
$lang['user_id'] = 'Uporabnik';
$lang['user_pass'] = 'Geslo';
-$lang['user_mail'] = 'Email';
+$lang['user_name'] = 'Pravo ime';
+$lang['user_mail'] = 'Elektronski naslov';
$lang['user_groups'] = 'Skupine';
+$lang['field'] = 'Polje';
+$lang['value'] = 'Vrednost';
$lang['add'] = 'Dodaj';
$lang['delete'] = 'Izbriši';
$lang['delete_selected'] = 'Izbriši izbrano';
$lang['edit'] = 'Uredi';
+$lang['edit_prompt'] = 'Uredi tega uporabnika';
$lang['modify'] = 'Shrani spremembe';
$lang['search'] = 'Iskanje';
-$lang['prev'] = 'Prejšnji';
+$lang['search_prompt'] = 'Poišči';
+$lang['clear'] = 'Počisti filter iskanja';
+$lang['filter'] = 'Filter';
+$lang['summary'] = 'Izpisani so uporabniki %1$d-%2$d od skupno %3$d. Vseh uporabnikov je %4$d.';
+$lang['nonefound'] = 'Ni najdenih uporabnikov. Vseh uporabnikov je %d.';
+$lang['delete_ok'] = '%d uporabnikov je izbrisanih';
+$lang['delete_fail'] = '%d ni bilo mogoče izbrisati';
+$lang['update_ok'] = 'Uporabniški račun je uspešno posodobljen';
+$lang['update_fail'] = 'Posodobitev uporabniškega računa je spodletela';
+$lang['update_exists'] = 'Spreminjanje imena uporabnika je spodletelo. Navedeno uporabniško ime (%s) že obstaja (vse ostale spremembe bodo uveljavljene).';
+$lang['start'] = 'Začetni';
+$lang['prev'] = 'Predhodni';
$lang['next'] = 'Naslednji';
-$lang['last'] = 'Zadnji';
+$lang['last'] = 'Končni';
+$lang['edit_usermissing'] = 'Izbranega uporabnika ni mogoče najti. Navedeno uporabniško ime je morda izbrisano ali spremenjeno.';
+$lang['user_notify'] = 'Obvesti uporabnika';
+$lang['note_notify'] = 'Obvestilna sporočila so poslana le, če uporabnik prejme novo geslo za dostop do strani.';
+$lang['note_group'] = 'Nov uporabnik bo dodan k privzeti skupini (%s), v kolikor ni navedene druge skupine.';
+$lang['note_pass'] = 'Geslo bo ustvarjeno samodejno, v kolikor je polje izpuščeno in je omogočeno obveščanje uporabnika.';
+$lang['add_ok'] = 'Uporabnik je uspešno dodan';
+$lang['add_fail'] = 'Dodajanje uporabnika je spodletelo';
+$lang['notify_ok'] = 'Obvestilno sporočilo je poslano.';
+$lang['notify_fail'] = 'Obvestilnega sporočila ni mogoče poslati.';
diff --git a/lib/plugins/usermanager/lang/sv/lang.php b/lib/plugins/usermanager/lang/sv/lang.php
index cedd30d1f..bd747927e 100644
--- a/lib/plugins/usermanager/lang/sv/lang.php
+++ b/lib/plugins/usermanager/lang/sv/lang.php
@@ -14,6 +14,7 @@
* @author Bogge Bogge <bogge@bogge.com>
* @author Peter Åström <eaustreum@gmail.com>
* @author Håkan Sandell <hakan.sandell@home.se>
+ * @author mikael@mallander.net
*/
$lang['menu'] = 'Hantera användare';
$lang['noauth'] = '(användarautentisering ej tillgänlig)';
diff --git a/lib/plugins/usermanager/lang/uk/edit.txt b/lib/plugins/usermanager/lang/uk/edit.txt
index e359f748c..efc84be89 100644
--- a/lib/plugins/usermanager/lang/uk/edit.txt
+++ b/lib/plugins/usermanager/lang/uk/edit.txt
@@ -1 +1 @@
-===== Змінити користувача =====
+===== Редагувати користувача =====
diff --git a/lib/plugins/usermanager/lang/zh-tw/intro.txt b/lib/plugins/usermanager/lang/zh-tw/intro.txt
index 9c499d862..8f9488d7d 100644
--- a/lib/plugins/usermanager/lang/zh-tw/intro.txt
+++ b/lib/plugins/usermanager/lang/zh-tw/intro.txt
@@ -1 +1 @@
-====== 帳號管理員(User Manager) ======
+====== 帳號管理員 ======
diff --git a/lib/plugins/usermanager/lang/zh-tw/lang.php b/lib/plugins/usermanager/lang/zh-tw/lang.php
index 26c87205d..5cb20aae8 100644
--- a/lib/plugins/usermanager/lang/zh-tw/lang.php
+++ b/lib/plugins/usermanager/lang/zh-tw/lang.php
@@ -8,8 +8,10 @@
* @author Wayne San <waynesan@zerozone.tw>
* @author Li-Jiun Huang <ljhuang.tw@gmai.com>
* @author Cheng-Wei Chien <e.cwchien@gmail.com>
+ * @author Danny Lin <danny0838@pchome.com.tw>
+ * @author Shuo-Ting Jian <shoting@gmail.com>
*/
-$lang['menu'] = '帳號管理員(User Manager)';
+$lang['menu'] = '帳號管理員';
$lang['noauth'] = '(帳號認證尚未開放)';
$lang['nosupport'] = '(尚不支援帳號管理)';
$lang['badauth'] = '錯誤的認證機制';
@@ -28,25 +30,25 @@ $lang['edit_prompt'] = '修改該帳號';
$lang['modify'] = '儲存變更';
$lang['search'] = '搜尋';
$lang['search_prompt'] = '開始搜尋';
-$lang['clear'] = '重新設定搜尋的條件';
+$lang['clear'] = '重設篩選條件';
$lang['filter'] = '篩選條件(Filter)';
-$lang['summary'] = '顯示帳號 %1$d 至 %2$d 共 %3$d 筆符合. 總共有 %4$d 個帳號';
-$lang['nonefound'] = '找不到該用戶(共 %d 帳號)。';
+$lang['summary'] = '顯示帳號 %1$d-%2$d,共 %3$d 筆符合。共有 %4$d 個帳號。';
+$lang['nonefound'] = '找不到帳號。共有 %d 個帳號。';
$lang['delete_ok'] = '已刪除 %d 個帳號';
$lang['delete_fail'] = '%d 個帳號刪除失敗';
$lang['update_ok'] = '成功更新該帳號';
$lang['update_fail'] = '更新該帳號時失敗';
-$lang['update_exists'] = '變更帳號名稱 (%s) 時失敗,應該是已有同名的帳號,不過除了帳號名稱之外的其他修改仍會儲存。';
+$lang['update_exists'] = '變更帳號名稱 (%s) 失敗,因為有同名帳號存在(其他修改已套用)。';
$lang['start'] = '開始';
-$lang['prev'] = '上一步';
-$lang['next'] = '下一步';
-$lang['last'] = '最後步驟';
-$lang['edit_usermissing'] = '找不到所選的帳號,該帳號可能已經被刪除或是改為其他名稱喔。';
+$lang['prev'] = '上一頁';
+$lang['next'] = '下一頁';
+$lang['last'] = '最後一頁';
+$lang['edit_usermissing'] = '找不到選取的帳號,可能已被刪除或改為其他名稱。';
$lang['user_notify'] = '通知使用者';
-$lang['note_notify'] = '通知信只有在給予使用者新密碼時寄送。';
+$lang['note_notify'] = '通知信只會在指定使用者新密碼時寄送。';
$lang['note_group'] = '如果沒有指定群組,新使用者將會被加入到預設群組(%s)當中。';
$lang['note_pass'] = '如果沒有輸入這個欄位而且有勾選通知使用者,則會自動產生一組密碼。';
$lang['add_ok'] = '新增使用者成功';
$lang['add_fail'] = '新增使用者失敗';
$lang['notify_ok'] = '通知信已寄出';
-$lang['notify_fail'] = '通知信無法被寄出';
+$lang['notify_fail'] = '通知信無法寄出';
diff --git a/lib/plugins/usermanager/lang/zh/lang.php b/lib/plugins/usermanager/lang/zh/lang.php
index 5836d3346..9bfa496c2 100644
--- a/lib/plugins/usermanager/lang/zh/lang.php
+++ b/lib/plugins/usermanager/lang/zh/lang.php
@@ -10,6 +10,8 @@
* @author ben <ben@livetom.com>
* @author lainme <lainme993@gmail.com>
* @author caii <zhoucaiqi@gmail.com>
+ * @author Hiphen Lee <jacob.b.leung@gmail.com>
+ * @author caii, patent agent in China <zhoucaiqi@gmail.com>
*/
$lang['menu'] = '用户管理器';
$lang['noauth'] = '(用户认证不可用)';
diff --git a/lib/plugins/usermanager/script.js b/lib/plugins/usermanager/script.js
index 68d437129..de013242b 100644
--- a/lib/plugins/usermanager/script.js
+++ b/lib/plugins/usermanager/script.js
@@ -1,9 +1,8 @@
/**
* Add JavaScript confirmation to the User Delete button
*/
-function usrmgr_delconfirm(){
- if($('usrmgr__del')){
- addEvent( $('usrmgr__del'),'click',function(){ return confirm(reallyDel); } );
- }
-};
-addInitEvent(usrmgr_delconfirm);
+jQuery(function(){
+ jQuery('#usrmgr__del').click(function(){
+ return confirm(LANG.del_confirm);
+ });
+});
diff --git a/lib/scripts/ajax.js b/lib/scripts/ajax.js
deleted file mode 100644
index de009d448..000000000
--- a/lib/scripts/ajax.js
+++ /dev/null
@@ -1,48 +0,0 @@
-/**
- * AJAX functions for the pagename quicksearch
- *
- * @license GPL2 (http://www.gnu.org/licenses/gpl.html)
- * @author Andreas Gohr <andi@splitbrain.org>
- * @author Adrian Lang <lang@cosmocode.de>
- */
-addInitEvent(function () {
-
- var inID = 'qsearch__in';
- var outID = 'qsearch__out';
-
- var inObj = document.getElementById(inID);
- var outObj = document.getElementById(outID);
-
- // objects found?
- if (inObj === null){ return; }
- if (outObj === null){ return; }
-
- function clear_results(){
- outObj.style.display = 'none';
- outObj.innerHTML = '';
- }
-
- var sack_obj = new sack(DOKU_BASE + 'lib/exe/ajax.php');
- sack_obj.AjaxFailedAlert = '';
- sack_obj.encodeURIString = false;
- sack_obj.onCompletion = function () {
- var data = sack_obj.response;
- if (data === '') { return; }
-
- outObj.innerHTML = data;
- outObj.style.display = 'block';
- };
-
- // attach eventhandler to search field
- var delay = new Delay(function () {
- clear_results();
- var value = inObj.value;
- if(value === ''){ return; }
- sack_obj.runAJAX('call=qsearch&q=' + encodeURI(value));
- });
-
- addEvent(inObj, 'keyup', function () {clear_results(); delay.start(); });
-
- // attach eventhandler to output field
- addEvent(outObj, 'click', function () {outObj.style.display = 'none'; });
-});
diff --git a/lib/scripts/behaviour.js b/lib/scripts/behaviour.js
new file mode 100644
index 000000000..0f69d5721
--- /dev/null
+++ b/lib/scripts/behaviour.js
@@ -0,0 +1,184 @@
+/*jslint sloppy: true */
+/*global jQuery, LANG, document, alert */
+
+/**
+ * Automatic behaviours
+ *
+ * This class wraps various JavaScript functionalities that are triggered
+ * automatically whenever a certain object is in the DOM or a certain CSS
+ * class was found
+ */
+var dw_behaviour = {
+
+ init: function(){
+ dw_behaviour.focusMarker();
+ dw_behaviour.scrollToMarker();
+ dw_behaviour.removeHighlightOnClick();
+ dw_behaviour.quickSelect();
+ dw_behaviour.checkWindowsShares();
+ dw_behaviour.initTocToggle();
+ dw_behaviour.subscription();
+ },
+
+ /**
+ * Looks for an element with the ID scroll__here at scrolls to it
+ */
+ scrollToMarker: function(){
+ var $obj = jQuery('#scroll__here');
+ if($obj.length) {
+ $obj[0].scrollIntoView();
+ }
+ },
+
+ /**
+ * Looks for an element with the ID focus__this at sets focus to it
+ */
+ focusMarker: function(){
+ jQuery('#focus__this').focus();
+ },
+
+ /**
+ * Remove all search highlighting when clicking on a highlighted term
+ *
+ * @FIXME would be nice to have it fade out
+ */
+ removeHighlightOnClick: function(){
+ jQuery('span.search_hit').click(
+ function(e){
+ jQuery(e.target).removeClass('search_hit');
+ }
+ );
+ },
+
+ /**
+ * Autosubmit quick select forms
+ *
+ * When a <select> tag has the class "quickselect", this script will
+ * automatically submit its parent form when the select value changes.
+ * It also hides the submit button of the form.
+ *
+ * @author Andreas Gohr <andi@splitbrain.org>
+ */
+ quickSelect: function(){
+ jQuery('select.quickselect')
+ .change(function(e){ e.target.form.submit(); })
+ .parents('form').find('input[type=submit]').hide();
+ },
+
+ /**
+ * Display error for Windows Shares on browsers other than IE
+ *
+ * @author Michael Klier <chi@chimeric.de>
+ */
+ checkWindowsShares: function() {
+ if(!LANG.nosmblinks || document.all !== null) {
+ // No warning requested or none necessary
+ return;
+ }
+
+ jQuery('a.windows').live('click', function(){
+ alert(LANG.nosmblinks);
+ });
+ },
+
+ /**
+ * Adds the toggle switch to the TOC
+ */
+ initTocToggle: function() {
+ var $header = jQuery('#toc__header');
+ if(!$header.length) return;
+ var $toc = jQuery('#toc__inside');
+
+ var $clicky = jQuery(document.createElement('span'))
+ .attr('id','toc__toggle')
+ .css('cursor','pointer')
+ .click(function(){
+ $toc.slideToggle(200);
+ setClicky();
+ });
+ $header.prepend($clicky);
+
+ var setClicky = function(){
+ if($toc.css('display') == 'none'){
+ $clicky.html('<span>+</span>');
+ $clicky[0].className = 'toc_open';
+ }else{
+ $clicky.html('<span>&minus;</span>');
+ $clicky[0].className = 'toc_close';
+ }
+ };
+
+ setClicky();
+ },
+
+ /**
+ * Hide list subscription style if target is a page
+ *
+ * @author Adrian Lang <lang@cosmocode.de>
+ * @author Pierre Spring <pierre.spring@caillou.ch>
+ */
+ subscription: function(){
+ var $form, $list, $digest;
+
+ $form = jQuery('#subscribe__form');
+ if (0 === $form.length) return;
+
+ $list = $form.find("input[name='sub_style'][value='list']");
+ $digest = $form.find("input[name='sub_style'][value='digest']");
+
+ $form.find("input[name='sub_target']")
+ .click(
+ function () {
+ var $this = jQuery(this), show_list;
+ if (!$this.prop('checked')) {
+ return;
+ }
+
+ show_list = $this.val().match(/:$/);
+ $list.parent().dw_toggle(show_list);
+ if (!show_list && $list.prop('checked')) {
+ $digest.prop('checked', 'checked');
+ }
+ }
+ )
+ .filter(':checked')
+ .click();
+ }
+};
+
+/**
+ * Hides elements with a slide animation
+ *
+ * @param fn optional callback to run after hiding
+ * @author Adrian Lang <mail@adrianlang.de>
+ */
+jQuery.fn.dw_hide = function(fn) {
+ return this.slideUp('fast', fn);
+};
+
+/**
+ * Unhides elements with a slide animation
+ *
+ * @param fn optional callback to run after hiding
+ * @author Adrian Lang <mail@adrianlang.de>
+ */
+jQuery.fn.dw_show = function(fn) {
+ return this.slideDown('fast', fn);
+};
+
+/**
+ * Toggles visibility of an element using a slide element
+ *
+ * @param bool the current state of the element (optional)
+ */
+jQuery.fn.dw_toggle = function(bool) {
+ return this.each(function() {
+ var $this = jQuery(this);
+ if (typeof bool === 'undefined') {
+ bool = $this.is(':hidden');
+ }
+ $this[bool ? "dw_show" : "dw_hide" ]();
+ });
+};
+
+jQuery(dw_behaviour.init);
diff --git a/lib/scripts/compatibility.js b/lib/scripts/compatibility.js
new file mode 100644
index 000000000..a5cc87e58
--- /dev/null
+++ b/lib/scripts/compatibility.js
@@ -0,0 +1,125 @@
+/*jslint sloppy: true */
+/*global dw_index, dw_qsearch, DEPRECATED_WRAP */
+
+var index = {
+ throbber_delay: dw_index.throbber_delay,
+ toggle: DEPRECATED_WRAP(dw_index.toggle, dw_index),
+ treeattach: DEPRECATED_WRAP(dw_index.treeattach, dw_index)
+};
+
+var ajax_quicksearch = {
+ init: DEPRECATED_WRAP(dw_qsearch.init, dw_qsearch),
+ clear_results: DEPRECATED_WRAP(dw_qsearch.clear_results, dw_qsearch),
+ onCompletion: DEPRECATED_WRAP(dw_qsearch.onCompletion, dw_qsearch)
+};
+
+var linkwiz = {
+ init: DEPRECATED_WRAP(dw_linkwiz.init, dw_linkwiz),
+ onEntry: DEPRECATED_WRAP(dw_linkwiz.onEntry, dw_linkwiz),
+ getResult: DEPRECATED_WRAP(dw_linkwiz.getResult, dw_linkwiz),
+ select: DEPRECATED_WRAP(dw_linkwiz.select, dw_linkwiz),
+ deselect: DEPRECATED_WRAP(dw_linkwiz.deselect, dw_linkwiz),
+ onResultClick: DEPRECATED_WRAP(dw_linkwiz.onResultClick, dw_linkwiz),
+ resultClick: DEPRECATED_WRAP(dw_linkwiz.resultClick, dw_linkwiz),
+ insertLink: DEPRECATED_WRAP(dw_linkwiz.insertLink, dw_linkwiz),
+ autocomplete: DEPRECATED_WRAP(dw_linkwiz.autocomplete, dw_linkwiz),
+ autocomplete_exec: DEPRECATED_WRAP(dw_linkwiz.autocomplete_exec, dw_linkwiz),
+ show: DEPRECATED_WRAP(dw_linkwiz.show, dw_linkwiz),
+ hide: DEPRECATED_WRAP(dw_linkwiz.hide, dw_linkwiz),
+ toggle: DEPRECATED_WRAP(dw_linkwiz.toggle, dw_linkwiz)
+};
+
+var media_manager = {
+ // treeattach, selectorattach, confirmattach are munched together into
+ // dw_mediamanager.init
+ attachoptions: DEPRECATED_WRAP(dw_mediamanager.attachoptions, dw_mediamanager),
+ togglekeepopen: function (event, cb) {
+ DEPRECATED('Use dw_mediamanager.toggleOption instead');
+ return dw_mediamanager.toggleOption.call(cb, 'keepopen');
+ },
+ togglehide: function (event, cb) {
+ DEPRECATED('Use dw_mediamanager.toggleOption instead');
+ return dw_mediamanager.toggleOption.call(cb, 'hide');
+ },
+ updatehide: DEPRECATED_WRAP(dw_mediamanager.updatehide, dw_mediamanager),
+ select: function (event, link) {
+ DEPRECATED('Use dw_mediamanager.select instead');
+ return dw_mediamanager.select.call(link, event);
+ },
+ initpopup: DEPRECATED_WRAP(dw_mediamanager.initpopup, dw_mediamanager),
+ insert: DEPRECATED_WRAP(dw_mediamanager.insert, dw_mediamanager),
+ list: function (event, link) {
+ DEPRECATED('Use dw_mediamanager.list instead');
+ return dw_mediamanager.list.call(link, event);
+ },
+ // toggle is handled by dw_tree
+ suggest: DEPRECATED_WRAP(dw_mediamanager.suggest, dw_mediamanager),
+ initFlashUpload: DEPRECATED_WRAP(dw_mediamanager.initFlashUpload, dw_mediamanager),
+ closePopup: function () {
+ DEPRECATED();
+ dw_mediamanager.$popup.dialog('close');
+ },
+ setalign: function (event, cb) {
+ DEPRECATED('Use dw_mediamanager.setOpt instead');
+ return dw_mediamanager.setOpt.call(this, 'align', event);
+ },
+ setlink: function (event, cb) {
+ DEPRECATED('Use dw_mediamanager.setOpt instead');
+ return dw_mediamanager.setOpt.call(this, 'link', event);
+ },
+ setsize: function (event, cb) {
+ DEPRECATED('Use dw_mediamanager.setOpt instead');
+ return dw_mediamanager.setOpt.call(this, 'size', event);
+ },
+ outSet: function (id) {
+ DEPRECATED();
+ return jQuery(id).removeClass('selected');
+ },
+ inSet: function (id) {
+ DEPRECATED();
+ return jQuery(id).addClass('selected');
+ }
+};
+
+initSizeCtl = DEPRECATED_WRAP(dw_editor.initSizeCtl);
+sizeCtl = DEPRECATED_WRAP(dw_editor.sizeCtl);
+toggleWrap = DEPRECATED_WRAP(dw_editor.toggleWrap);
+setWrap = DEPRECATED_WRAP(dw_editor.setWrap);
+
+function findPosX(object){
+ DEPRECATED('Use jQuery.position() instead');
+ return jQuery(object).position().left;
+}
+
+function findPosY(object){
+ DEPRECATED('Use jQuery.position() instead');
+ return jQuery(object).position().top;
+}
+
+function getElementsByClass(searchClass,node,tag){
+ DEPRECATED('Use jQuery() instead');
+ if(node == null) node = document;
+ if(typeof tag === 'undefined') tag = '';
+ return jQuery(node).find(tag+'.'+searchClass).toArray();
+}
+
+function prependChild(parent,element) {
+ DEPRECATED('Use jQuery.prepend() instead');
+ jQuery(parent).prepend(element);
+}
+
+function addEvent(element, type, handler) {
+ DEPRECATED('Use jQuery.bind() instead.');
+ jQuery(element).bind(type,{},handler);
+}
+
+function removeEvent(element, type, handler) {
+ DEPRECATED('Use jQuery.unbind() instead.');
+ jQuery(element).unbind(type,handler);
+}
+
+function addInitEvent(func) {
+ DEPRECATED('Use jQuery(<function>) instead');
+ jQuery(func);
+}
+
diff --git a/lib/scripts/cookie.js b/lib/scripts/cookie.js
index d7e6b3550..f7d9b5ffb 100644
--- a/lib/scripts/cookie.js
+++ b/lib/scripts/cookie.js
@@ -1,13 +1,14 @@
/**
- * Handles the cookie used by several JavaScript functions
- *
- * Only a single cookie is written and read. You may only save
- * sime name-value pairs - no complex types!
- *
- * You should only use the getValue and setValue methods
- *
- * @author Andreas Gohr <andi@splitbrain.org>
- */
+* Handles the cookie used by several JavaScript functions
+*
+* Only a single cookie is written and read. You may only save
+* sime name-value pairs - no complex types!
+*
+* You should only use the getValue and setValue methods
+*
+* @author Andreas Gohr <andi@splitbrain.org>
+* @author Michal Rezler <m.rezler@centrum.cz>
+*/
DokuCookie = {
data: Array(),
name: 'DOKU_PREFS',
@@ -18,21 +19,21 @@ DokuCookie = {
* @author Andreas Gohr <andi@splitbrain.org>
*/
setValue: function(key,val){
- DokuCookie.init();
- DokuCookie.data[key] = val;
+ this.init();
+ this.data[key] = val;
// prepare expire date
var now = new Date();
- DokuCookie.fixDate(now);
+ this.fixDate(now);
now.setTime(now.getTime() + 365 * 24 * 60 * 60 * 1000); //expire in a year
//save the whole data array
var text = '';
- for(var key in DokuCookie.data){
- if (!DokuCookie.data.hasOwnProperty(key)) continue;
- text += '#'+escape(key)+'#'+DokuCookie.data[key];
+ for(var key in this.data){
+ if (!this.data.hasOwnProperty(key)) continue;
+ text += '#'+escape(key)+'#'+this.data[key];
}
- DokuCookie.setCookie(DokuCookie.name,text.substr(1),now,DOKU_BASE);
+ this.setCookie(this.name,text.substr(1),now,DOKU_BASE);
},
/**
@@ -41,8 +42,8 @@ DokuCookie = {
* @author Andreas Gohr <andi@splitbrain.org>
*/
getValue: function(key){
- DokuCookie.init();
- return DokuCookie.data[key];
+ this.init();
+ return this.data[key];
},
/**
@@ -51,12 +52,12 @@ DokuCookie = {
* @author Andreas Gohr <andi@splitbrain.org>
*/
init: function(){
- if(DokuCookie.data.length) return;
- var text = DokuCookie.getCookie(DokuCookie.name);
+ if(this.data.length) return;
+ var text = this.getCookie(this.name);
if(text){
var parts = text.split('#');
for(var i=0; i<parts.length; i+=2){
- DokuCookie.data[unescape(parts[i])] = unescape(parts[i+1]);
+ this.data[unescape(parts[i])] = unescape(parts[i+1]);
}
}
},
@@ -66,13 +67,15 @@ DokuCookie = {
*
* @link http://www.webreference.com/js/column8/functions.html
*/
- setCookie: function(name, value, expires, path, domain, secure) {
- var curCookie = name + "=" + escape(value) +
- ((expires) ? "; expires=" + expires.toGMTString() : "") +
- ((path) ? "; path=" + path : "") +
- ((domain) ? "; domain=" + domain : "") +
- ((secure) ? "; secure" : "");
- document.cookie = curCookie;
+ setCookie: function(name, value, expires_, path_, domain_, secure_) {
+ var params = {
+ expires: expires_,
+ path: path_,
+ domain: domain_,
+ secure: secure_,
+ };
+
+ jQuery.cookie(name, value, params);
},
/**
@@ -81,20 +84,7 @@ DokuCookie = {
* @link http://www.webreference.com/js/column8/functions.html
*/
getCookie: function(name) {
- var dc = document.cookie;
- var prefix = name + "=";
- var begin = dc.indexOf("; " + prefix);
- if (begin == -1) {
- begin = dc.indexOf(prefix);
- if (begin !== 0){ return null; }
- } else {
- begin += 2;
- }
- var end = document.cookie.indexOf(";", begin);
- if (end == -1){
- end = dc.length;
- }
- return unescape(dc.substring(begin + prefix.length, end));
+ return unescape(jQuery.cookie(name));
},
/**
diff --git a/lib/scripts/drag.js b/lib/scripts/drag.js
index 2212fb6c1..dd252d95d 100644
--- a/lib/scripts/drag.js
+++ b/lib/scripts/drag.js
@@ -5,6 +5,7 @@
* customization, drag can be used as a javascript prototype, it is
* inheritance-aware.
*
+ * @deprecated
* @link http://nofunc.org/Drag_Drop/
*/
var drag = {
@@ -25,6 +26,7 @@ var drag = {
* @param DOMObject handle A handle on which the obj can be dragged
*/
attach: function (obj,handle) {
+ DEPRECATED('Use jQuery.draggable() instead.');
if(handle){
handle.dragobject = obj;
}else{
diff --git a/lib/scripts/edit.js b/lib/scripts/edit.js
index 01262bcef..a9623e14d 100644
--- a/lib/scripts/edit.js
+++ b/lib/scripts/edit.js
@@ -11,37 +11,41 @@
* Style the buttons through the toolbutton class
*
* @author Andreas Gohr <andi@splitbrain.org>
+ * @author Michal Rezler <m.rezler@centrum.cz>
*/
function createToolButton(icon,label,key,id,classname){
- var btn = document.createElement('button');
- var ico = document.createElement('img');
+ var $ = jQuery;
+ var btn = $('<button>');
+ var ico = $('<img />');
// preapare the basic button stuff
- btn.className = 'toolbutton';
+ btn.attr('class', 'toolbutton');
if(classname){
- btn.className += ' '+classname;
+ btn.attr('class', 'toolbutton '+classname);
}
- btn.title = label;
+
+ btn.attr('title', label);
if(key){
- btn.title += ' ['+key.toUpperCase()+']';
- btn.accessKey = key;
+ btn.attr('title', label + ' ['+key.toUpperCase()+']')
+ .attr('accessKey', key);
}
// set IDs if given
if(id){
- btn.id = id;
- ico.id = id+'_ico';
+ btn.attr('id', id);
+ ico.attr('id', id+'_ico');
}
// create the icon and add it to the button
if(icon.substr(0,1) == '/'){
- ico.src = icon;
+ ico.attr('src', icon);
}else{
- ico.src = DOKU_BASE+'lib/images/toolbar/'+icon;
+ ico.attr('src', DOKU_BASE+'lib/images/toolbar/'+icon);
}
- btn.appendChild(ico);
+ btn.append(ico);
- return btn;
+ // we have to return a javascript object (for compatibility reasons)
+ return btn[0];
}
/**
@@ -60,45 +64,56 @@ function createToolButton(icon,label,key,id,classname){
*/
function createPicker(id,props,edid){
var icobase = props['icobase'];
- var list = props['list'];
+ var list = props['list'];
+ var $ = jQuery;
// create the wrapping div
- var picker = document.createElement('div');
- picker.className = 'picker';
+ var picker = $('<div></div>');
+
+ var className = 'picker';
if(props['class']){
- picker.className += ' '+props['class'];
+ className += ' '+props['class'];
}
- picker.id = id;
- picker.style.position = 'absolute';
- picker.style.marginLeft = '-10000px'; // no display:none, to keep access keys working
- picker.style.marginTop = '-10000px';
+
+ picker.attr('class', className)
+ .attr('id', id)
+ .css('position', 'absolute')
+ .css('marginLeft', '-10000px') // no display:none, to keep access keys working
+ .css('marginTop', '-10000px');
for(var key in list){
if (!list.hasOwnProperty(key)) continue;
if(isNaN(key)){
// associative array -> treat as image/value pairs
- var btn = document.createElement('button');
- btn.className = 'pickerbutton';
- var ico = document.createElement('img');
- if(list[key].substr(0,1) == '/'){
- ico.src = list[key];
- }else{
- ico.src = DOKU_BASE+'lib/images/'+icobase+'/'+list[key];
+ var btn = $('<button>');
+ btn.attr('class', 'pickerbutton')
+ .attr('title', key);
+
+ var ico = $('<img>');
+ if (list[key].substr(0,1) == '/') {
+ var src = list[key];
+ } else {
+ var src = DOKU_BASE+'lib/images/'+icobase+'/'+list[key];
}
- btn.title = key;
- btn.appendChild(ico);
- addEvent(btn,'click',bind(pickerInsert,key,edid));
- picker.appendChild(btn);
- }else if(isString(list[key])){
+
+ ico.attr('src', src);
+ btn.append(ico);
+
+ btn.bind('click', bind(pickerInsert, key, edid));
+ picker.append(btn);
+ }else if (typeof (list[key]) == 'string'){
// a list of text -> treat as text picker
- var btn = document.createElement('button');
- btn.className = 'pickerbutton';
- var txt = document.createTextNode(list[key]);
- btn.title = list[key];
- btn.appendChild(txt);
- addEvent(btn,'click',bind(pickerInsert,list[key],edid));
- picker.appendChild(btn);
+ var btn = $('<button>');
+ btn.attr('class', 'pickerbutton')
+ .attr('title', list[key]);
+
+ var txt = $(document.createTextNode(list[key]));
+ btn.append(txt);
+
+ btn.bind('click', bind(pickerInsert, list[key], edid));
+
+ picker.append(btn);
}else{
// a list of lists -> treat it as subtoolbar
initToolbar(picker,edid,list);
@@ -106,9 +121,11 @@ function createPicker(id,props,edid){
}
}
- var body = document.getElementsByTagName('body')[0];
- body.appendChild(picker);
- return picker;
+ var body = $('body');
+ body.append(picker);
+
+ // we have to return a javascript object (for compatibility reasons)
+ return picker[0];
}
/**
@@ -132,7 +149,7 @@ function pickerInsert(text,edid){
*/
function addBtnActionSignature(btn, props, edid) {
if(typeof(SIG) != 'undefined' && SIG != ''){
- addEvent(btn,'click',bind(insertAtCarret,edid,SIG));
+ btn.bind('click', bind(insertAtCarret,edid,SIG));
return true;
}
return false;
@@ -218,19 +235,6 @@ function keyHandler(e){
}
}
-//FIXME consolidate somewhere else
-addInitEvent(function(){
- var field = $('wiki__text');
- if(!field) return;
- // in Firefox, keypress doesn't send the correct keycodes,
- // in Opera, the default of keydown can't be prevented
- if (is_opera) {
- addEvent(field,'keypress',keyHandler);
- } else {
- addEvent(field,'keydown',keyHandler);
- }
-});
-
/**
* Determine the current section level while editing
*
@@ -261,27 +265,26 @@ function currentHeadlineLevel(textboxId){
/**
* global var used for not saved yet warning
*/
-var textChanged = false;
+window.textChanged = false;
/**
* Delete the draft before leaving the page
*/
function deleteDraft() {
if (is_opera) return;
+ if (window.keepDraft) return;
// remove a possibly saved draft using ajax
- var dwform = $('dw__editform');
- if(dwform){
- var params = 'call=draftdel';
- params += '&id='+encodeURIComponent(dwform.elements.id.value);
-
- var sackobj = new sack(DOKU_BASE + 'lib/exe/ajax.php');
- // this needs to be synchronous and GET to not be aborted upon page unload
- sackobj.asynchronous = false;
- sackobj.method = 'GET';
- sackobj.AjaxFailedAlert = '';
- sackobj.encodeURIString = false;
- sackobj.runAJAX(params);
+ var dwform = jQuery('#dw__editform');
+ if(dwform.length != 0) {
+
+ jQuery.post(
+ DOKU_BASE + 'lib/exe/ajax.php',
+ {
+ call: 'draftdel',
+ id: jQuery('#dw__editform input[name=id]').val()
+ }
+ );
}
}
@@ -291,39 +294,65 @@ function deleteDraft() {
*
* Sets focus to the editbox as well
*/
-addInitEvent(function (){
- var editform = $('dw__editform');
- if (!editform) return;
-
- var edit_text = $('wiki__text');
- if(edit_text) {
- if(edit_text.readOnly) return;
+addInitEvent(function () {
+ var $ = jQuery;
+ var editform = $('#dw__editform');
+ if (editform.length == 0) return;
+
+ var edit_text = $('#wiki__text');
+ if (edit_text.length > 0) {
+ if(edit_text.attr('readOnly')) return;
+
+ // in Firefox, keypress doesn't send the correct keycodes,
+ // in Opera, the default of keydown can't be prevented
+ if (is_opera) {
+ edit_text.keypress(keyHandler);
+ } else {
+ edit_text.keydown(keyHandler);
+ }
- // set focus
+ // set focus and place cursor at the start
+ var sel = getSelection(edit_text.get(0));
+ sel.start = 0;
+ sel.end = 0;
+ setSelection(sel);
edit_text.focus();
}
- var checkfunc = function(){
+ var checkfunc = function() {
textChanged = true; //global var
summaryCheck();
};
- addEvent(editform, 'change', checkfunc);
- addEvent(editform, 'keydown', checkfunc);
+
+ editform.change(checkfunc);
+ editform.keydown(checkfunc);
window.onbeforeunload = function(){
- if(textChanged) {
+ if(window.textChanged) {
return LANG.notsavedyet;
}
};
window.onunload = deleteDraft;
// reset change memory var on submit
- addEvent($('edbtn__save'), 'click', function(){ textChanged = false; });
- addEvent($('edbtn__preview'), 'click', function(){ textChanged = false; });
+ $('#edbtn__save').click(
+ function() {
+ window.onbeforeunload = '';
+ textChanged = false;
+ }
+ );
+ $('#edbtn__preview').click(
+ function() {
+ window.onbeforeunload = '';
+ textChanged = false;
+ window.keepDraft = true; // needed to keep draft on page unload
+ }
+ );
+
+ var summary = $('#edit__summary');
+ summary.change(summaryCheck);
+ summary.keyup(summaryCheck);
- var summary = $('edit__summary');
- addEvent(summary, 'change', summaryCheck);
- addEvent(summary, 'keyup', summaryCheck);
if (textChanged) summaryCheck();
});
@@ -333,112 +362,11 @@ addInitEvent(function (){
* @author Andreas Gohr <andi@splitbrain.org>
*/
function summaryCheck(){
- var sum = document.getElementById('edit__summary');
- if(sum.value === ''){
- sum.className='missing';
- }else{
- sum.className='edit';
+ var sum = jQuery('#edit__summary');
+
+ if (sum.val() === '') {
+ sum.attr('class', 'missing');
+ } else{
+ sum.attr('class', 'edit');
}
}
-
-
-/**
- * Class managing the timer to display a warning on a expiring lock
- */
-function locktimer_class(){
- this.sack = null;
- this.timeout = 0;
- this.timerID = null;
- this.lasttime = null;
- this.msg = '';
- this.pageid = '';
-};
-var locktimer = new locktimer_class();
- locktimer.init = function(timeout,msg,draft){
- // init values
- locktimer.timeout = timeout*1000;
- locktimer.msg = msg;
- locktimer.draft = draft;
- locktimer.lasttime = new Date();
-
- if(!$('dw__editform')) return;
- locktimer.pageid = $('dw__editform').elements.id.value;
- if(!locktimer.pageid) return;
-
- // init ajax component
- locktimer.sack = new sack(DOKU_BASE + 'lib/exe/ajax.php');
- locktimer.sack.AjaxFailedAlert = '';
- locktimer.sack.encodeURIString = false;
- locktimer.sack.onCompletion = locktimer.refreshed;
-
- // register refresh event
- addEvent($('dw__editform'),'keypress',function(){locktimer.refresh();});
- // start timer
- locktimer.reset();
- };
-
- /**
- * (Re)start the warning timer
- */
- locktimer.reset = function(){
- locktimer.clear();
- locktimer.timerID = window.setTimeout("locktimer.warning()", locktimer.timeout);
- };
-
- /**
- * Display the warning about the expiring lock
- */
- locktimer.warning = function(){
- locktimer.clear();
- alert(locktimer.msg);
- };
-
- /**
- * Remove the current warning timer
- */
- locktimer.clear = function(){
- if(locktimer.timerID !== null){
- window.clearTimeout(locktimer.timerID);
- locktimer.timerID = null;
- }
- };
-
- /**
- * Refresh the lock via AJAX
- *
- * Called on keypresses in the edit area
- */
- locktimer.refresh = function(){
- var now = new Date();
- // refresh every minute only
- if(now.getTime() - locktimer.lasttime.getTime() > 30*1000){ //FIXME decide on time
- var params = 'call=lock&id='+encodeURIComponent(locktimer.pageid);
- var dwform = $('dw__editform');
- if(locktimer.draft && dwform.elements.wikitext){
- params += '&prefix='+encodeURIComponent(dwform.elements.prefix.value);
- params += '&wikitext='+encodeURIComponent(dwform.elements.wikitext.value);
- params += '&suffix='+encodeURIComponent(dwform.elements.suffix.value);
- if(dwform.elements.date){
- params += '&date='+encodeURIComponent(dwform.elements.date.value);
- }
- }
- locktimer.sack.runAJAX(params);
- locktimer.lasttime = now;
- }
- };
-
-
- /**
- * Callback. Resets the warning timer
- */
- locktimer.refreshed = function(){
- var data = this.response;
- var error = data.charAt(0);
- data = data.substring(1);
-
- $('draft__status').innerHTML=data;
- if(error != '1') return; // locking failed
- locktimer.reset();
- };
-// end of locktimer class functions
-
diff --git a/lib/scripts/editor.js b/lib/scripts/editor.js
new file mode 100644
index 000000000..fbdb1d79a
--- /dev/null
+++ b/lib/scripts/editor.js
@@ -0,0 +1,116 @@
+/**
+ * The DokuWiki editor features
+ *
+ * These are the advanced features of the editor. It does NOT contain any
+ * code for the toolbar buttons and it functions. See toolbar.js for that.
+ */
+
+var dw_editor = {
+
+ /**
+ * initialize the default editor functionality
+ *
+ * All other functions can also be called separately for non-default
+ * textareas
+ */
+ init: function(){
+ var editor = jQuery('#wiki__text');
+ if(!editor.length) return;
+
+ dw_editor.initSizeCtl('#size__ctl',editor);
+ },
+
+ /**
+ * Add the edit window size and wrap controls
+ *
+ * Initial values are read from cookie if it exists
+ *
+ * @param selector ctlarea the div to place the controls
+ * @param selector editor the textarea to control
+ */
+ initSizeCtl: function(ctlarea,editor){
+ var ctl = jQuery(ctlarea);
+ var textarea = jQuery(editor);
+ if(!ctl.length || !textarea.length) return;
+
+ var hgt = DokuCookie.getValue('sizeCtl');
+ if(hgt){
+ textarea.css('height', hgt);
+ }else{
+ textarea.css('height', '300px');
+ }
+
+ var wrp = DokuCookie.getValue('wrapCtl');
+ if(wrp){
+ dw_editor.setWrap(textarea[0], wrp);
+ } // else use default value
+
+ var l = document.createElement('img');
+ var s = document.createElement('img');
+ var w = document.createElement('img');
+ l.src = DOKU_BASE+'lib/images/larger.gif';
+ s.src = DOKU_BASE+'lib/images/smaller.gif';
+ w.src = DOKU_BASE+'lib/images/wrap.gif';
+ jQuery(l).click(function(){dw_editor.sizeCtl(editor,100);});
+ jQuery(s).click(function(){dw_editor.sizeCtl(editor,-100);});
+ jQuery(w).click(function(){dw_editor.toggleWrap(editor);});
+ ctl.append(l);
+ ctl.append(s);
+ ctl.append(w);
+ },
+
+ /**
+ * This sets the vertical size of the editbox and adjusts the cookie
+ *
+ * @param selector editor the textarea to control
+ * @param int val the relative value to resize in pixel
+ */
+ sizeCtl: function(editor,val){
+ var textarea = jQuery(editor);
+ var height = parseInt(textarea.css('height'));
+ height += val;
+ textarea.css('height', height+'px');
+ DokuCookie.setValue('sizeCtl',textarea.css('height'));
+ },
+
+ /**
+ * Toggle the wrapping mode of the editor textarea and adjusts the
+ * cookie
+ *
+ * @param selector editor the textarea to control
+ */
+ toggleWrap: function(editor){
+ var textarea = jQuery(editor);
+ var wrap = textarea.attr('wrap');
+ if(wrap && wrap.toLowerCase() == 'off'){
+ dw_editor.setWrap(textarea[0], 'soft');
+ }else{
+ dw_editor.setWrap(textarea[0], 'off');
+ }
+ DokuCookie.setValue('wrapCtl',textarea.attr('wrap'));
+ },
+
+ /**
+ * Set the wrapping mode of a textarea
+ *
+ * @author Fluffy Convict <fluffyconvict@hotmail.com>
+ * @author <shutdown@flashmail.com>
+ * @link http://news.hping.org/comp.lang.javascript.archive/12265.html
+ * @link https://bugzilla.mozilla.org/show_bug.cgi?id=41464
+ * @param DomObject textarea
+ * @param string wrapAttrValue
+ */
+ setWrap: function(textarea, wrapAttrValue){
+ textarea.setAttribute('wrap', wrapAttrValue);
+
+ // Fix display for mozilla
+ var parNod = textarea.parentNode;
+ var nxtSib = textarea.nextSibling;
+ parNod.removeChild(textarea);
+ parNod.insertBefore(textarea, nxtSib);
+ }
+
+
+};
+
+jQuery(dw_editor.init);
diff --git a/lib/scripts/events.js b/lib/scripts/events.js
deleted file mode 100644
index a1fcac718..000000000
--- a/lib/scripts/events.js
+++ /dev/null
@@ -1,181 +0,0 @@
-// written by Dean Edwards, 2005
-// with input from Tino Zijdel
-
-// http://dean.edwards.name/weblog/2005/10/add-event/
-
-function addEvent(element, type, handler) {
- // assign each event handler a unique ID
- if (!handler.$$guid) handler.$$guid = addEvent.guid++;
- // create a hash table of event types for the element
- if (!element.events) element.events = {};
- // create a hash table of event handlers for each element/event pair
- var handlers = element.events[type];
- if (!handlers) {
- handlers = element.events[type] = {};
- // store the existing event handler (if there is one)
- if (element["on" + type]) {
- handlers[0] = element["on" + type];
- }
- }
- // store the event handler in the hash table
- handlers[handler.$$guid] = handler;
- // assign a global event handler to do all the work
- element["on" + type] = handleEvent;
-};
-// a counter used to create unique IDs
-addEvent.guid = 1;
-
-function removeEvent(element, type, handler) {
- // delete the event handler from the hash table
- if (element.events && element.events[type]) {
- delete element.events[type][handler.$$guid];
- }
-};
-
-function handleEvent(event) {
- var returnValue = true;
- // grab the event object (IE uses a global event object)
- event = event || fixEvent(window.event, this);
- // get a reference to the hash table of event handlers
- var handlers = this.events[event.type];
- // execute each event handler
- for (var i in handlers) {
- if (!handlers.hasOwnProperty(i)) continue;
- if (handlers[i].call(this, event) === false) {
- returnValue = false;
- }
- }
- return returnValue;
-};
-
-function fixEvent(event, _this) {
- // add W3C standard event methods
- event.preventDefault = fixEvent.preventDefault;
- event.stopPropagation = fixEvent.stopPropagation;
- // fix target
- event.target = event.srcElement;
- event.currentTarget = _this;
- // fix coords
- var base = (document.documentElement.scrollTop?document.documentElement:document.body);
- event.pageX = (typeof event.pageX !== 'undefined') ? event.pageX : event.clientX + base.scrollLeft;
- event.pageY = (typeof event.pageY !== 'undefined') ? event.pageY : event.clientY + base.scrollTop;
-
- return event;
-};
-fixEvent.preventDefault = function() {
- this.returnValue = false;
-};
-fixEvent.stopPropagation = function() {
- this.cancelBubble = true;
-};
-
-
-/**
- * Pseudo event handler to be fired after the DOM was parsed or
- * on window load at last.
- *
- * @author based upon some code by Dean Edwards
- * @author Dean Edwards
- * @link http://dean.edwards.name/weblog/2006/06/again/
- */
-window.fireoninit = function() {
- // quit if this function has already been called
- if (arguments.callee.done) return;
- // flag this function so we don't do the same thing twice
- arguments.callee.done = true;
- // kill the timer
- if (_timer) {
- clearInterval(_timer);
- _timer = null;
- }
-
- if (typeof window.oninit == 'function') {
- window.oninit();
- }
-};
-
-/**
- * Run the fireoninit function as soon as possible after
- * the DOM was loaded, using different methods for different
- * Browsers
- *
- * @author Dean Edwards
- * @link http://dean.edwards.name/weblog/2006/06/again/
- */
- // for Mozilla
- if (document.addEventListener) {
- document.addEventListener("DOMContentLoaded", window.fireoninit, null);
- }
-
- // for Internet Explorer (using conditional comments)
- /*@cc_on
- @if (@_win32)
- document.write("<scr" + "ipt id=\"__ie_init\" defer=\"true\" src=\"//:\"><\/script>");
- var script = document.getElementById("__ie_init");
- script.onreadystatechange = function() {
- if (this.readyState == "complete") {
- window.fireoninit(); // call the onload handler
- }
- };
- @end @*/
-
- // for Safari
- if (/WebKit/i.test(navigator.userAgent)) { // sniff
- var _timer = setInterval(function() {
- if (/loaded|complete/.test(document.readyState)) {
- window.fireoninit(); // call the onload handler
- }
- }, 10);
- }
-
- // for other browsers
- window.onload = window.fireoninit;
-
-
-/**
- * This is a pseudo Event that will be fired by the fireoninit
- * function above.
- *
- * Use addInitEvent to bind to this event!
- *
- * @author Andreas Gohr <andi@splitbrain.org>
- * @see fireoninit()
- */
-window.oninit = function(){};
-
-/**
- * Bind a function to the window.init pseudo event
- *
- * @author Simon Willison
- * @see http://simon.incutio.com/archive/2004/05/26/addLoadEvent
- */
-function addInitEvent(func) {
- var oldoninit = window.oninit;
- if (typeof window.oninit != 'function') {
- window.oninit = func;
- } else {
- window.oninit = function() {
- oldoninit();
- func();
- };
- }
-}
-
-/**
- * Bind variables to a function call creating a closure
- *
- * Use this to circumvent variable scope problems when creating closures
- * inside a loop
- *
- * @author Adrian Lang <lang@cosmocode.de>
- * @link http://www.cosmocode.de/en/blog/gohr/2009-10/15-javascript-fixing-the-closure-scope-in-loops
- * @param functionref fnc - the function to be called
- * @param mixed - any arguments to be passed to the function
- * @returns functionref
- */
-function bind (fnc) {
- var args = Array.prototype.slice.call(arguments, 1);
- return function() {
- return fnc.apply(this, args);
- };
-}
diff --git a/lib/scripts/helpers.js b/lib/scripts/helpers.js
index 129964d29..b286965cf 100644
--- a/lib/scripts/helpers.js
+++ b/lib/scripts/helpers.js
@@ -144,3 +144,51 @@ function hasFlash(version){
if(ver >= version) return true;
return false;
}
+
+/**
+ * A PHP-style substr_replace
+ *
+ * Supports negative start and length and omitting length, but not
+ * str and replace arrays.
+ * See http://php.net/substr-replace for further documentation.
+ */
+function substr_replace(str, replace, start, length) {
+ var a2, b1;
+ a2 = (start < 0 ? str.length : 0) + start;
+ if (typeof length === 'undefined') {
+ length = str.length - a2;
+ } else if (length < 0 && start < 0 && length <= start) {
+ length = 0;
+ }
+ b1 = (length < 0 ? str.length : a2) + length;
+ return str.substring(0, a2) + replace + str.substring(b1);
+}
+
+/**
+ * Bind variables to a function call creating a closure
+ *
+ * Use this to circumvent variable scope problems when creating closures
+ * inside a loop
+ *
+ * @author Adrian Lang <lang@cosmocode.de>
+ * @link http://www.cosmocode.de/en/blog/gohr/2009-10/15-javascript-fixing-the-closure-scope-in-loops
+ * @param functionref fnc - the function to be called
+ * @param mixed - any arguments to be passed to the function
+ * @returns functionref
+ */
+function bind(fnc/*, ... */) {
+ var Aps = Array.prototype.slice;
+ // Store passed arguments in this scope.
+ // Since arguments is no Array nor has an own slice method,
+ // we have to apply the slice method from the Array.prototype
+ var static_args = Aps.call(arguments, 1);
+
+ // Return a function evaluating the passed function with the
+ // given args and optional arguments passed on invocation.
+ return function (/* ... */) {
+ // Same here, but we use Array.prototype.slice solely for
+ // converting arguments to an Array.
+ return fnc.apply(this,
+ static_args.concat(Aps.call(arguments, 0)));
+ };
+}
diff --git a/lib/scripts/index.js b/lib/scripts/index.js
index 9c7943d0c..96d4e2fb9 100644
--- a/lib/scripts/index.js
+++ b/lib/scripts/index.js
@@ -1,115 +1,19 @@
-/**
- * Javascript for index view
- *
- * @author Andreas Gohr <andi@splitbrain.org>
- */
-
-var index = {
-
- /**
- * Delay in ms before showing the throbber.
- * Used to skip the throbber for fast AJAX calls.
- */
- throbber_delay: 500,
-
- /**
- * Attach event handlers to all "folders" below the given element
- *
- * @author Andreas Gohr <andi@splitbrain.org>
- */
- treeattach: function(obj){
- if(!obj) return;
-
- var items = getElementsByClass('idx_dir',obj,'a');
- for(var i=0; i<items.length; i++){
- var elem = items[i];
-
- // attach action to make the link clickable by AJAX
- addEvent(elem,'click',function(e){ return index.toggle(e,this); });
-
- // get the listitem the elem belongs to
- var listitem = elem.parentNode;
- while (listitem.tagName != 'LI') {
- listitem = listitem.parentNode;
- }
- //when there are uls under this listitem mark this listitem as opened
- if (listitem.getElementsByTagName('ul').length) {
- listitem.open = true;
- }
- }
- },
-
- /**
- * Open or close a subtree using AJAX
- * The contents of subtrees are "cached" untill the page is reloaded.
- * A "loading" indicator is shown only when the AJAX call is slow.
- *
- * @author Andreas Gohr <andi@splitbrain.org>
- * @author Ben Coburn <btcoburn@silicodon.net>
- */
- toggle: function(e,clicky){
- var listitem = clicky.parentNode.parentNode;
-
- listitem.open = !listitem.open;
- // listitem.open represents now the action to be done
-
- // if already open, close by removing the sublist
- var sublists = listitem.getElementsByTagName('ul');
- if(!listitem.open){
- if (sublists.length) {
- sublists[0].style.display='none';
- }
- listitem.className='closed';
- e.preventDefault();
- return false;
- }
-
- // just show if already loaded
- if(sublists.length && listitem.open){
- sublists[0].style.display='';
- listitem.className='open';
- e.preventDefault();
- return false;
- }
-
- // prepare an AJAX call to fetch the subtree
- var ajax = new sack(DOKU_BASE + 'lib/exe/ajax.php');
- ajax.AjaxFailedAlert = '';
- ajax.encodeURIString = false;
- if(ajax.failed) return true;
-
- //prepare the new ul
- var ul = document.createElement('ul');
- ul.className = 'idx';
- timeout = window.setTimeout(function(){
- // show the throbber as needed
- if (listitem.open) {
- ul.innerHTML = '<li><img src="'+DOKU_BASE+'lib/images/throbber.gif" alt="loading..." title="loading..." /></li>';
- listitem.appendChild(ul);
- listitem.className='open';
- }
- }, this.throbber_delay);
- ajax.elementObj = ul;
- ajax.afterCompletion = function(){
- window.clearTimeout(timeout);
- index.treeattach(ul);
- if (listitem.className!='open') {
- if (!listitem.open) {
- ul.style.display='none';
- }
- listitem.appendChild(ul);
- if (listitem.open) {
- listitem.className='open';
- }
- }
- };
- ajax.runAJAX(clicky.search.substr(1)+'&call=index');
- e.preventDefault();
- return false;
+/*jslint white: true, onevar: true, undef: true, nomen: true, eqeqeq: true, plusplus: true, bitwise: true, regexp: false, newcap: true, immed: true */
+/*global jQuery, window, DOKU_BASE, DEPRECATED, bind*/
+
+var dw_index = jQuery('#index__tree').dw_tree({deferInit: true,
+ load_data: function (show_sublist, $clicky) {
+ jQuery.post(
+ DOKU_BASE + 'lib/exe/ajax.php',
+ $clicky[0].search.substr(1) + '&call=index',
+ show_sublist, 'html'
+ );
}
-};
+});
+jQuery(function () {
+ var $tree = jQuery('#index__tree');
+ dw_index.$obj = $tree;
-addInitEvent(function(){
- index.treeattach($('index__tree'));
+ dw_index.init();
});
diff --git a/lib/scripts/jquery/jquery-ui-theme/images/ui-bg_flat_0_aaaaaa_40x100.png b/lib/scripts/jquery/jquery-ui-theme/images/ui-bg_flat_0_aaaaaa_40x100.png
new file mode 100644
index 000000000..5b5dab2ab
--- /dev/null
+++ b/lib/scripts/jquery/jquery-ui-theme/images/ui-bg_flat_0_aaaaaa_40x100.png
Binary files differ
diff --git a/lib/scripts/jquery/jquery-ui-theme/images/ui-bg_flat_75_ffffff_40x100.png b/lib/scripts/jquery/jquery-ui-theme/images/ui-bg_flat_75_ffffff_40x100.png
new file mode 100644
index 000000000..ac8b229af
--- /dev/null
+++ b/lib/scripts/jquery/jquery-ui-theme/images/ui-bg_flat_75_ffffff_40x100.png
Binary files differ
diff --git a/lib/scripts/jquery/jquery-ui-theme/images/ui-bg_glass_55_fbf9ee_1x400.png b/lib/scripts/jquery/jquery-ui-theme/images/ui-bg_glass_55_fbf9ee_1x400.png
new file mode 100644
index 000000000..ad3d6346e
--- /dev/null
+++ b/lib/scripts/jquery/jquery-ui-theme/images/ui-bg_glass_55_fbf9ee_1x400.png
Binary files differ
diff --git a/lib/scripts/jquery/jquery-ui-theme/images/ui-bg_glass_65_ffffff_1x400.png b/lib/scripts/jquery/jquery-ui-theme/images/ui-bg_glass_65_ffffff_1x400.png
new file mode 100644
index 000000000..42ccba269
--- /dev/null
+++ b/lib/scripts/jquery/jquery-ui-theme/images/ui-bg_glass_65_ffffff_1x400.png
Binary files differ
diff --git a/lib/scripts/jquery/jquery-ui-theme/images/ui-bg_glass_75_dadada_1x400.png b/lib/scripts/jquery/jquery-ui-theme/images/ui-bg_glass_75_dadada_1x400.png
new file mode 100644
index 000000000..5a46b47cb
--- /dev/null
+++ b/lib/scripts/jquery/jquery-ui-theme/images/ui-bg_glass_75_dadada_1x400.png
Binary files differ
diff --git a/lib/scripts/jquery/jquery-ui-theme/images/ui-bg_glass_75_e6e6e6_1x400.png b/lib/scripts/jquery/jquery-ui-theme/images/ui-bg_glass_75_e6e6e6_1x400.png
new file mode 100644
index 000000000..86c2baa65
--- /dev/null
+++ b/lib/scripts/jquery/jquery-ui-theme/images/ui-bg_glass_75_e6e6e6_1x400.png
Binary files differ
diff --git a/lib/scripts/jquery/jquery-ui-theme/images/ui-bg_glass_95_fef1ec_1x400.png b/lib/scripts/jquery/jquery-ui-theme/images/ui-bg_glass_95_fef1ec_1x400.png
new file mode 100644
index 000000000..4443fdc1a
--- /dev/null
+++ b/lib/scripts/jquery/jquery-ui-theme/images/ui-bg_glass_95_fef1ec_1x400.png
Binary files differ
diff --git a/lib/scripts/jquery/jquery-ui-theme/images/ui-bg_highlight-soft_75_cccccc_1x100.png b/lib/scripts/jquery/jquery-ui-theme/images/ui-bg_highlight-soft_75_cccccc_1x100.png
new file mode 100644
index 000000000..7c9fa6c6e
--- /dev/null
+++ b/lib/scripts/jquery/jquery-ui-theme/images/ui-bg_highlight-soft_75_cccccc_1x100.png
Binary files differ
diff --git a/lib/scripts/jquery/jquery-ui-theme/images/ui-icons_222222_256x240.png b/lib/scripts/jquery/jquery-ui-theme/images/ui-icons_222222_256x240.png
new file mode 100644
index 000000000..b273ff111
--- /dev/null
+++ b/lib/scripts/jquery/jquery-ui-theme/images/ui-icons_222222_256x240.png
Binary files differ
diff --git a/lib/scripts/jquery/jquery-ui-theme/images/ui-icons_2e83ff_256x240.png b/lib/scripts/jquery/jquery-ui-theme/images/ui-icons_2e83ff_256x240.png
new file mode 100644
index 000000000..09d1cdc85
--- /dev/null
+++ b/lib/scripts/jquery/jquery-ui-theme/images/ui-icons_2e83ff_256x240.png
Binary files differ
diff --git a/lib/scripts/jquery/jquery-ui-theme/images/ui-icons_454545_256x240.png b/lib/scripts/jquery/jquery-ui-theme/images/ui-icons_454545_256x240.png
new file mode 100644
index 000000000..59bd45b90
--- /dev/null
+++ b/lib/scripts/jquery/jquery-ui-theme/images/ui-icons_454545_256x240.png
Binary files differ
diff --git a/lib/scripts/jquery/jquery-ui-theme/images/ui-icons_888888_256x240.png b/lib/scripts/jquery/jquery-ui-theme/images/ui-icons_888888_256x240.png
new file mode 100644
index 000000000..6d02426c1
--- /dev/null
+++ b/lib/scripts/jquery/jquery-ui-theme/images/ui-icons_888888_256x240.png
Binary files differ
diff --git a/lib/scripts/jquery/jquery-ui-theme/images/ui-icons_cd0a0a_256x240.png b/lib/scripts/jquery/jquery-ui-theme/images/ui-icons_cd0a0a_256x240.png
new file mode 100644
index 000000000..2ab019b73
--- /dev/null
+++ b/lib/scripts/jquery/jquery-ui-theme/images/ui-icons_cd0a0a_256x240.png
Binary files differ
diff --git a/lib/scripts/jquery/jquery-ui-theme/smoothness.css b/lib/scripts/jquery/jquery-ui-theme/smoothness.css
new file mode 100644
index 000000000..ad212daef
--- /dev/null
+++ b/lib/scripts/jquery/jquery-ui-theme/smoothness.css
@@ -0,0 +1,568 @@
+/*
+ * jQuery UI CSS Framework 1.8.14
+ *
+ * Copyright 2011, 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: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%; }
+
+
+/*
+ * jQuery UI CSS Framework 1.8.14
+ *
+ * Copyright 2011, 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/?ffDefault=Verdana,Arial,sans-serif&fwDefault=normal&fsDefault=1.1em&cornerRadius=4px&bgColorHeader=cccccc&bgTextureHeader=03_highlight_soft.png&bgImgOpacityHeader=75&borderColorHeader=aaaaaa&fcHeader=222222&iconColorHeader=222222&bgColorContent=ffffff&bgTextureContent=01_flat.png&bgImgOpacityContent=75&borderColorContent=aaaaaa&fcContent=222222&iconColorContent=222222&bgColorDefault=e6e6e6&bgTextureDefault=02_glass.png&bgImgOpacityDefault=75&borderColorDefault=d3d3d3&fcDefault=555555&iconColorDefault=888888&bgColorHover=dadada&bgTextureHover=02_glass.png&bgImgOpacityHover=75&borderColorHover=999999&fcHover=212121&iconColorHover=454545&bgColorActive=ffffff&bgTextureActive=02_glass.png&bgImgOpacityActive=65&borderColorActive=aaaaaa&fcActive=212121&iconColorActive=454545&bgColorHighlight=fbf9ee&bgTextureHighlight=02_glass.png&bgImgOpacityHighlight=55&borderColorHighlight=fcefa1&fcHighlight=363636&iconColorHighlight=2e83ff&bgColorError=fef1ec&bgTextureError=02_glass.png&bgImgOpacityError=95&borderColorError=cd0a0a&fcError=cd0a0a&iconColorError=cd0a0a&bgColorOverlay=aaaaaa&bgTextureOverlay=01_flat.png&bgImgOpacityOverlay=0&opacityOverlay=30&bgColorShadow=aaaaaa&bgTextureShadow=01_flat.png&bgImgOpacityShadow=0&opacityShadow=30&thicknessShadow=8px&offsetTopShadow=-8px&offsetLeftShadow=-8px&cornerRadiusShadow=8px
+ */
+
+
+/* Component containers
+----------------------------------*/
+.ui-widget { font-family: Verdana,Arial,sans-serif; font-size: 1.1em; }
+.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; font-size: 1em; }
+.ui-widget-content { border: 1px solid #aaaaaa; background: #ffffff url(images/ui-bg_flat_75_ffffff_40x100.png) 50% 50% repeat-x; color: #222222; }
+.ui-widget-content a { color: #222222; }
+.ui-widget-header { border: 1px solid #aaaaaa; background: #cccccc url(images/ui-bg_highlight-soft_75_cccccc_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 #d3d3d3; background: #e6e6e6 url(images/ui-bg_glass_75_e6e6e6_1x400.png) 50% 50% repeat-x; font-weight: normal; color: #555555; }
+.ui-state-default a, .ui-state-default a:link, .ui-state-default a:visited { color: #555555; 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; background: #dadada url(images/ui-bg_glass_75_dadada_1x400.png) 50% 50% repeat-x; font-weight: normal; color: #212121; }
+.ui-state-hover a, .ui-state-hover a:hover { color: #212121; text-decoration: none; }
+.ui-state-active, .ui-widget-content .ui-state-active, .ui-widget-header .ui-state-active { border: 1px solid #aaaaaa; background: #ffffff url(images/ui-bg_glass_65_ffffff_1x400.png) 50% 50% repeat-x; font-weight: normal; color: #212121; }
+.ui-state-active a, .ui-state-active a:link, .ui-state-active a:visited { color: #212121; 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; background: #fbf9ee url(images/ui-bg_glass_55_fbf9ee_1x400.png) 50% 50% 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: #fef1ec url(images/ui-bg_glass_95_fef1ec_1x400.png) 50% 50% repeat-x; color: #cd0a0a; }
+.ui-state-error a, .ui-widget-content .ui-state-error a, .ui-widget-header .ui-state-error a { color: #cd0a0a; }
+.ui-state-error-text, .ui-widget-content .ui-state-error-text, .ui-widget-header .ui-state-error-text { color: #cd0a0a; }
+.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); }
+.ui-widget-content .ui-icon {background-image: url(images/ui-icons_222222_256x240.png); }
+.ui-widget-header .ui-icon {background-image: url(images/ui-icons_222222_256x240.png); }
+.ui-state-default .ui-icon { background-image: url(images/ui-icons_888888_256x240.png); }
+.ui-state-hover .ui-icon, .ui-state-focus .ui-icon {background-image: url(images/ui-icons_454545_256x240.png); }
+.ui-state-active .ui-icon {background-image: url(images/ui-icons_454545_256x240.png); }
+.ui-state-highlight .ui-icon {background-image: url(images/ui-icons_2e83ff_256x240.png); }
+.ui-state-error .ui-icon, .ui-state-error-text .ui-icon {background-image: url(images/ui-icons_cd0a0a_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-all, .ui-corner-top, .ui-corner-left, .ui-corner-tl { -moz-border-radius-topleft: 4px; -webkit-border-top-left-radius: 4px; -khtml-border-top-left-radius: 4px; border-top-left-radius: 4px; }
+.ui-corner-all, .ui-corner-top, .ui-corner-right, .ui-corner-tr { -moz-border-radius-topright: 4px; -webkit-border-top-right-radius: 4px; -khtml-border-top-right-radius: 4px; border-top-right-radius: 4px; }
+.ui-corner-all, .ui-corner-bottom, .ui-corner-left, .ui-corner-bl { -moz-border-radius-bottomleft: 4px; -webkit-border-bottom-left-radius: 4px; -khtml-border-bottom-left-radius: 4px; border-bottom-left-radius: 4px; }
+.ui-corner-all, .ui-corner-bottom, .ui-corner-right, .ui-corner-br { -moz-border-radius-bottomright: 4px; -webkit-border-bottom-right-radius: 4px; -khtml-border-bottom-right-radius: 4px; border-bottom-right-radius: 4px; }
+
+/* Overlays */
+.ui-widget-overlay { background: #aaaaaa url(images/ui-bg_flat_0_aaaaaa_40x100.png) 50% 50% repeat-x; opacity: .30;filter:Alpha(Opacity=30); }
+.ui-widget-shadow { margin: -8px 0 0 -8px; padding: 8px; background: #aaaaaa url(images/ui-bg_flat_0_aaaaaa_40x100.png) 50% 50% repeat-x; opacity: .30;filter:Alpha(Opacity=30); -moz-border-radius: 8px; -khtml-border-radius: 8px; -webkit-border-radius: 8px; border-radius: 8px; }/*
+ * jQuery UI Resizable 1.8.14
+ *
+ * Copyright 2011, 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;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; }
+.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;}/*
+ * jQuery UI Selectable 1.8.14
+ *
+ * Copyright 2011, 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; }
+/*
+ * jQuery UI Accordion 1.8.14
+ *
+ * Copyright 2011, 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; }
+/*
+ * jQuery UI Autocomplete 1.8.14
+ *
+ * Copyright 2011, 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.14
+ *
+ * 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;
+}
+/*
+ * jQuery UI Button 1.8.14
+ *
+ * Copyright 2011, 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 */
+.ui-button-icon-only { width: 2.2em; } /* to make room for the icon, a width needs to be set here */
+button.ui-button-icon-only { width: 2.4em; } /* button elements seem to need a little more width */
+.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 */
+/*
+ * jQuery UI Dialog 1.8.14
+ *
+ * Copyright 2011, 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; }
+/*
+ * jQuery UI Slider 1.8.14
+ *
+ * Copyright 2011, 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; }/*
+ * jQuery UI Tabs 1.8.14
+ *
+ * Copyright 2011, 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; }
+/*
+ * jQuery UI Datepicker 1.8.14
+ *
+ * Copyright 2011, 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 {
+ 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*/
+}/*
+ * jQuery UI Progressbar 1.8.14
+ *
+ * Copyright 2011, 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; }
+.ui-progressbar .ui-progressbar-value {margin: -1px; height:100%; } \ No newline at end of file
diff --git a/lib/scripts/jquery/jquery-ui.js b/lib/scripts/jquery/jquery-ui.js
new file mode 100644
index 000000000..bc11b0315
--- /dev/null
+++ b/lib/scripts/jquery/jquery-ui.js
@@ -0,0 +1,11729 @@
+/*!
+ * jQuery UI 1.8.14
+ *
+ * Copyright 2011, 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.14",
+
+ 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({
+ _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" );
+ }
+});
+
+$.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: 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" ) );
+
+ $.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";
+});
+
+
+
+
+
+// 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 );
+/*!
+ * jQuery UI Widget 1.8.14
+ *
+ * Copyright 2011, 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++ ) {
+ $( elem ).triggerHandler( "remove" );
+ }
+ _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() {
+ $( this ).triggerHandler( "remove" );
+ });
+ }
+ }
+ 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 callback = this.options[ type ];
+
+ event = $.Event( event );
+ event.type = ( type === this.widgetEventPrefix ?
+ type :
+ this.widgetEventPrefix + type ).toLowerCase();
+ data = data || {};
+
+ // copy original event properties over to the new event
+ // this would happen if we could call $.event.fix instead of $.Event
+ // but we don't have a way to force an event to be fixed multiple times
+ if ( event.originalEvent ) {
+ for ( var i = $.event.props.length, prop; i; ) {
+ prop = $.event.props[ --i ];
+ event[ prop ] = event.originalEvent[ prop ];
+ }
+ }
+
+ this.element.trigger( event, data );
+
+ return !( $.isFunction(callback) &&
+ callback.call( this.element[0], event, data ) === false ||
+ event.isDefaultPrevented() );
+ }
+};
+
+})( jQuery );
+/*!
+ * jQuery UI Mouse 1.8.14
+ *
+ * Copyright 2011, 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).mousedown(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);
+ },
+
+ _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),
+ elIsCancel = (typeof this.options.cancel == "string" ? $(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);
+/*
+ * jQuery UI Draggable 1.8.14
+ *
+ * Copyright 2011, 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;
+
+ $(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);
+
+ //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.helper.addClass("ui-draggable-dragging");
+ 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 removed, don't bother to continue if helper is set to "original"
+ if((!this.element[0] || !this.element[0].parentNode) && 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) {
+ if (this.options.iframeFix === true) {
+ $("div.ui-draggable-iframeFix").each(function() {
+ this.parentNode.removeChild(this);
+ }); //Remove frame helpers
+ }
+
+ //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.14"
+});
+
+$.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);
+/*
+ * jQuery UI Droppable 1.8.14
+ *
+ * Copyright 2011, 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.14"
+});
+
+$.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 = dropped || this._drop.call(this, event);
+
+ 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.parentsUntil( "body" ).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) {
+ var parent = this.element.parents(':data(droppable):eq(0)');
+ 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.parentsUntil( "body" ).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);
+/*
+ * jQuery UI Resizable 1.8.14
+ *
+ * Copyright 2011, 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)) {
+
+ //Opera fix for relative positioning
+ if (/relative/.test(this.element.css('position')) && $.browser.opera)
+ this.element.css({ position: 'relative', top: 'auto', left: 'auto' });
+
+ //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>');
+
+ // increase zIndex of sw, se, ne, nw axis
+ //TODO : this modifies original option
+ if(/sw|se|ne|nw/.test(handle)) 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 });
+ }
+
+ //Opera fixing relative position
+ if ($.browser.opera && (/relative/).test(el.css('position')))
+ el.css({ position: 'relative', top: 'auto', left: 'auto' });
+
+ 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.14"
+});
+
+/*
+ * 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),
+ position: el.css('position') // to reset Opera on stop()
+ });
+ });
+ };
+
+ 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;
+ });
+
+ // Opera fixing relative position
+ if ($.browser.opera && /relative/.test(el.css('position'))) {
+ self._revertToRelativePosition = true;
+ el.css({ position: 'absolute', top: 'auto', left: 'auto' });
+ }
+
+ 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) {
+ var self = $(this).data("resizable"), o = self.options;
+
+ var _reset = function (exp) {
+ $(exp).each(function() {
+ var el = $(this);
+ // reset position for Opera - no need to verify it was changed
+ el.css({ position: el.data("resizable-alsoresize").position });
+ });
+ };
+
+ if (self._revertToRelativePosition) {
+ self._revertToRelativePosition = false;
+ if (typeof(o.alsoResize) == 'object' && !o.alsoResize.nodeType) {
+ $.each(o.alsoResize, function (exp) { _reset(exp); });
+ }else{
+ _reset(o.alsoResize);
+ }
+ }
+
+ $(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 / o.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 * o.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);
+/*
+ * jQuery UI Selectable 1.8.14
+ *
+ * Copyright 2011, 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.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) {
+ 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 || !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 && 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 && !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.14"
+});
+
+})(jQuery);
+/*
+ * jQuery UI Sortable 1.8.14
+ *
+ * Copyright 2011, 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",
+ 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();
+
+ },
+
+ destroy: function() {
+ this.element
+ .removeClass("ui-sortable ui-sortable-disabled")
+ .removeData("sortable")
+ .unbind(".sortable");
+ this._mouseDestroy();
+
+ for ( var i = this.items.length - 1; i >= 0; i-- )
+ this.items[i].item.removeData("sortable-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) {
+
+ 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, 'sortable-item') == self) {
+ currentItem = $(this);
+ return false;
+ }
+ });
+ if($.data(event.target, 'sortable-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
+ };
+
+ // 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");
+
+ $.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._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;
+
+ 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 = $.ui.isOverAxis(this.positionAbs.top + this.offset.click.top, item.top, item.height),
+ isOverElementWidth = $.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], 'sortable');
+ 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(sortable-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) {
+ 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], 'sortable');
+ 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('sortable-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.items[j][this.containers[innermostIndex].floating ? 'left' : 'top'];
+ if(Math.abs(cur - base) < dist) {
+ dist = Math.abs(cur - base); itemWithLeastDistance = this.items[j];
+ }
+ }
+
+ 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
+ if(!$.ui.contains(this.element[0], this.currentItem[0])) { //Node was moved out of the current element
+ if(!noPropagation) delayedTriggers.push(function(event) { this._trigger("remove", event, this._uiHash()); });
+ for (var i = this.containers.length - 1; i >= 0; i--){
+ if($.ui.contains(this.containers[i].element[0], this.currentItem[0]) && !noPropagation) {
+ delayedTriggers.push((function(c) { return function(event) { c._trigger("receive", event, this._uiHash(this)); }; }).call(this, this.containers[i]));
+ delayedTriggers.push((function(c) { return function(event) { c._trigger("update", event, this._uiHash(this)); }; }).call(this, this.containers[i]));
+ }
+ };
+ };
+
+ //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());
+ }
+ 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.14"
+});
+
+})(jQuery);
+/*
+ * jQuery UI Effects 1.8.14
+ *
+ * Copyright 2011, 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 {
+ color = $.curCSS(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.14",
+
+ // 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
+ });
+
+ element.wrap(wrapper);
+ 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) {
+ if (element.parent().is('.ui-effects-wrapper'))
+ return element.parent().replaceWith(element);
+ return element;
+ },
+
+ setTransition: function(element, list, factor, value) {
+ value = value || {};
+ $.each(list, function(i, x){
+ 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 ***********************************/
+/******************************************************************************/
+
+/*
+ * jQuery Easing v1.3 - http://gsgd.co.uk/sandbox/jquery/easing/
+ *
+ * Uses the built in easing capabilities added In jQuery 1.1
+ * to offer multiple easing options
+ *
+ * TERMS OF USE - jQuery Easing
+ *
+ * Open source under the BSD License.
+ *
+ * Copyright 2008 George McGinley Smith
+ * 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 the author nor the names of 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 OWNER 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.
+ *
+*/
+
+// t: current time, b: begInnIng value, c: change In value, d: duration
+$.easing.jswing = $.easing.swing;
+
+$.extend($.easing,
+{
+ def: 'easeOutQuad',
+ swing: function (x, t, b, c, d) {
+ //alert($.easing.default);
+ return $.easing[$.easing.def](x, t, b, c, d);
+ },
+ easeInQuad: function (x, t, b, c, d) {
+ return c*(t/=d)*t + b;
+ },
+ easeOutQuad: function (x, t, b, c, d) {
+ return -c *(t/=d)*(t-2) + b;
+ },
+ easeInOutQuad: function (x, t, b, c, d) {
+ if ((t/=d/2) < 1) return c/2*t*t + b;
+ return -c/2 * ((--t)*(t-2) - 1) + b;
+ },
+ easeInCubic: function (x, t, b, c, d) {
+ return c*(t/=d)*t*t + b;
+ },
+ easeOutCubic: function (x, t, b, c, d) {
+ return c*((t=t/d-1)*t*t + 1) + b;
+ },
+ easeInOutCubic: function (x, t, b, c, d) {
+ if ((t/=d/2) < 1) return c/2*t*t*t + b;
+ return c/2*((t-=2)*t*t + 2) + b;
+ },
+ easeInQuart: function (x, t, b, c, d) {
+ return c*(t/=d)*t*t*t + b;
+ },
+ easeOutQuart: function (x, t, b, c, d) {
+ return -c * ((t=t/d-1)*t*t*t - 1) + b;
+ },
+ easeInOutQuart: function (x, t, b, c, d) {
+ if ((t/=d/2) < 1) return c/2*t*t*t*t + b;
+ return -c/2 * ((t-=2)*t*t*t - 2) + b;
+ },
+ easeInQuint: function (x, t, b, c, d) {
+ return c*(t/=d)*t*t*t*t + b;
+ },
+ easeOutQuint: function (x, t, b, c, d) {
+ return c*((t=t/d-1)*t*t*t*t + 1) + b;
+ },
+ easeInOutQuint: function (x, t, b, c, d) {
+ if ((t/=d/2) < 1) return c/2*t*t*t*t*t + b;
+ return c/2*((t-=2)*t*t*t*t + 2) + b;
+ },
+ easeInSine: function (x, t, b, c, d) {
+ return -c * Math.cos(t/d * (Math.PI/2)) + c + b;
+ },
+ easeOutSine: function (x, t, b, c, d) {
+ return c * Math.sin(t/d * (Math.PI/2)) + b;
+ },
+ easeInOutSine: function (x, t, b, c, d) {
+ return -c/2 * (Math.cos(Math.PI*t/d) - 1) + b;
+ },
+ easeInExpo: function (x, t, b, c, d) {
+ return (t==0) ? b : c * Math.pow(2, 10 * (t/d - 1)) + b;
+ },
+ easeOutExpo: function (x, t, b, c, d) {
+ return (t==d) ? b+c : c * (-Math.pow(2, -10 * t/d) + 1) + b;
+ },
+ easeInOutExpo: function (x, t, b, c, d) {
+ if (t==0) return b;
+ if (t==d) return b+c;
+ if ((t/=d/2) < 1) return c/2 * Math.pow(2, 10 * (t - 1)) + b;
+ return c/2 * (-Math.pow(2, -10 * --t) + 2) + b;
+ },
+ easeInCirc: function (x, t, b, c, d) {
+ return -c * (Math.sqrt(1 - (t/=d)*t) - 1) + b;
+ },
+ easeOutCirc: function (x, t, b, c, d) {
+ return c * Math.sqrt(1 - (t=t/d-1)*t) + b;
+ },
+ easeInOutCirc: function (x, t, b, c, d) {
+ if ((t/=d/2) < 1) return -c/2 * (Math.sqrt(1 - t*t) - 1) + b;
+ return c/2 * (Math.sqrt(1 - (t-=2)*t) + 1) + b;
+ },
+ easeInElastic: function (x, t, b, c, d) {
+ var s=1.70158;var p=0;var a=c;
+ if (t==0) return b; if ((t/=d)==1) return b+c; if (!p) p=d*.3;
+ if (a < Math.abs(c)) { a=c; var s=p/4; }
+ else var s = p/(2*Math.PI) * Math.asin (c/a);
+ return -(a*Math.pow(2,10*(t-=1)) * Math.sin( (t*d-s)*(2*Math.PI)/p )) + b;
+ },
+ easeOutElastic: function (x, t, b, c, d) {
+ var s=1.70158;var p=0;var a=c;
+ if (t==0) return b; if ((t/=d)==1) return b+c; if (!p) p=d*.3;
+ if (a < Math.abs(c)) { a=c; var s=p/4; }
+ else var s = p/(2*Math.PI) * Math.asin (c/a);
+ return a*Math.pow(2,-10*t) * Math.sin( (t*d-s)*(2*Math.PI)/p ) + c + b;
+ },
+ easeInOutElastic: function (x, t, b, c, d) {
+ var s=1.70158;var p=0;var a=c;
+ if (t==0) return b; if ((t/=d/2)==2) return b+c; if (!p) p=d*(.3*1.5);
+ if (a < Math.abs(c)) { a=c; var s=p/4; }
+ else var s = p/(2*Math.PI) * Math.asin (c/a);
+ if (t < 1) return -.5*(a*Math.pow(2,10*(t-=1)) * Math.sin( (t*d-s)*(2*Math.PI)/p )) + b;
+ return a*Math.pow(2,-10*(t-=1)) * Math.sin( (t*d-s)*(2*Math.PI)/p )*.5 + c + b;
+ },
+ easeInBack: function (x, t, b, c, d, s) {
+ if (s == undefined) s = 1.70158;
+ return c*(t/=d)*t*((s+1)*t - s) + b;
+ },
+ easeOutBack: function (x, t, b, c, d, s) {
+ if (s == undefined) s = 1.70158;
+ return c*((t=t/d-1)*t*((s+1)*t + s) + 1) + b;
+ },
+ easeInOutBack: function (x, t, b, c, d, s) {
+ if (s == undefined) s = 1.70158;
+ if ((t/=d/2) < 1) return c/2*(t*t*(((s*=(1.525))+1)*t - s)) + b;
+ return c/2*((t-=2)*t*(((s*=(1.525))+1)*t + s) + 2) + b;
+ },
+ easeInBounce: function (x, t, b, c, d) {
+ return c - $.easing.easeOutBounce (x, d-t, 0, c, d) + b;
+ },
+ easeOutBounce: function (x, t, b, c, d) {
+ if ((t/=d) < (1/2.75)) {
+ return c*(7.5625*t*t) + b;
+ } else if (t < (2/2.75)) {
+ return c*(7.5625*(t-=(1.5/2.75))*t + .75) + b;
+ } else if (t < (2.5/2.75)) {
+ return c*(7.5625*(t-=(2.25/2.75))*t + .9375) + b;
+ } else {
+ return c*(7.5625*(t-=(2.625/2.75))*t + .984375) + b;
+ }
+ },
+ easeInOutBounce: function (x, t, b, c, d) {
+ if (t < d/2) return $.easing.easeInBounce (x, t*2, 0, c, d) * .5 + b;
+ return $.easing.easeOutBounce (x, t*2-d, 0, c, d) * .5 + c*.5 + b;
+ }
+});
+
+/*
+ *
+ * TERMS OF USE - EASING EQUATIONS
+ *
+ * Open source under the BSD License.
+ *
+ * Copyright 2001 Robert Penner
+ * 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 the author nor the names of 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 OWNER 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.
+ *
+ */
+
+})(jQuery);
+/*
+ * jQuery UI Effects Blind 1.8.14
+ *
+ * Copyright 2011, 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);
+/*
+ * jQuery UI Effects Bounce 1.8.14
+ *
+ * Copyright 2011, 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({margin:true}) / 3 : el.outerWidth({margin: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);
+/*
+ * jQuery UI Effects Clip 1.8.14
+ *
+ * Copyright 2011, 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);
+/*
+ * jQuery UI Effects Drop 1.8.14
+ *
+ * Copyright 2011, 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({margin:true}) / 2 : el.outerWidth({margin: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);
+/*
+ * jQuery UI Effects Explode 1.8.14
+ *
+ * Copyright 2011, 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);
+/*
+ * jQuery UI Effects Fade 1.8.14
+ *
+ * Copyright 2011, 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);
+/*
+ * jQuery UI Effects Fold 1.8.14
+ *
+ * Copyright 2011, 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);
+/*
+ * jQuery UI Effects Highlight 1.8.14
+ *
+ * Copyright 2011, 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);
+/*
+ * jQuery UI Effects Pulsate 1.8.14
+ *
+ * Copyright 2011, 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);
+/*
+ * jQuery UI Effects Scale 1.8.14
+ *
+ * Copyright 2011, 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(){
+ 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);
+/*
+ * jQuery UI Effects Shake 1.8.14
+ *
+ * Copyright 2011, 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);
+/*
+ * jQuery UI Effects Slide 1.8.14
+ *
+ * Copyright 2011, 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({margin:true}) : el.outerWidth({margin: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);
+/*
+ * jQuery UI Effects Transfer 1.8.14
+ *
+ * Copyright 2011, 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);
+/*
+ * jQuery UI Accordion 1.8.14
+ *
+ * Copyright 2011, 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.14",
+ 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( parseInt( s.parent().width(), 10 )
+ - parseInt( s.css( "paddingLeft" ), 10 )
+ - parseInt( s.css( "paddingRight" ), 10 )
+ - ( parseInt( s.css( "borderLeftWidth" ), 10 ) || 0 )
+ - ( parseInt( s.css( "borderRightWidth" ), 10) || 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 );
+/*
+ * jQuery UI Autocomplete 1.8.14
+ *
+ * Copyright 2011, 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.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.attr( "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._move( "previous", event );
+ // prevent moving cursor to beginning of text field in some browsers
+ event.preventDefault();
+ break;
+ case keyCode.DOWN:
+ self._move( "next", event );
+ // prevent moving cursor to end of text field in some browsers
+ event.preventDefault();
+ 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.response = function() {
+ return self._response.apply( self, arguments );
+ };
+ 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();
+ }
+ },
+
+ destroy: function() {
+ this.element
+ .removeClass( "ui-autocomplete-input" )
+ .removeAttr( "autocomplete" )
+ .removeAttr( "role" )
+ .removeAttr( "aria-autocomplete" )
+ .removeAttr( "aria-haspopup" );
+ this.menu.element.remove();
+ $.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",
+ autocompleteRequest: ++requestIndex,
+ success: function( data, status ) {
+ if ( this.autocompleteRequest === requestIndex ) {
+ response( data );
+ }
+ },
+ error: function() {
+ if ( this.autocompleteRequest === requestIndex ) {
+ 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( content ) {
+ if ( !this.options.disabled && content && content.length ) {
+ content = this._normalize( content );
+ this._suggest( content );
+ this._trigger( "open" );
+ } else {
+ this.close();
+ }
+ this.pending--;
+ if ( !this.pending ) {
+ this.element.removeClass( "ui-autocomplete-loading" );
+ }
+ },
+
+ 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(
+ ul.width( "" ).outerWidth(),
+ 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;
+ }
+});
+
+$.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));
+/*
+ * jQuery UI Button 1.8.14
+ *
+ * Copyright 2011, 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.attr( "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();
+ }
+
+ if ( this.element.is( ":disabled" ) ) {
+ options.disabled = true;
+ }
+
+ 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.attr( "disabled", true );
+ } else {
+ this.element.removeAttr( "disabled" );
+ }
+ 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>" )
+ .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 ltr = this.element.css( "direction" ) === "ltr";
+
+ 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( ltr ? "ui-corner-left" : "ui-corner-right" )
+ .end()
+ .filter( ":last" )
+ .addClass( ltr ? "ui-corner-right" : "ui-corner-left" )
+ .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 ) );
+/*
+ * jQuery UI Datepicker 1.8.14
+ *
+ * Copyright 2011, 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.14" } });
+
+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
+ };
+ $.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);
+ },
+
+ /* 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
+ $.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);
+ inst.dpDiv.show();
+ },
+
+ /* 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; z-index: -10;"/>');
+ 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]);
+ 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 (event) {
+ $.datepicker.log(event);
+ }
+ }
+ return true;
+ },
+
+ /* Pop-up the date picker for a given input field.
+ @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) {
+ if ( $.datepicker._datepickerShowing ) {
+ $.datepicker._triggerOnClose($.datepicker._curInst);
+ }
+ $.datepicker._curInst.dpDiv.stop(true, true);
+ }
+ var beforeShow = $.datepicker._get(inst, 'beforeShow');
+ extendRemove(inst.settings, (beforeShow ? beforeShow.apply(input, [input, inst]) : {}));
+ 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));
+ 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 + $(document).scrollLeft();
+ var viewHeight = document.documentElement.clientHeight + $(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];
+ },
+
+ /* Trigger custom callback of onClose. */
+ _triggerOnClose: function(inst) {
+ var onClose = this._get(inst, 'onClose');
+ if (onClose)
+ onClose.apply((inst.input ? inst.input[0] : null),
+ [(inst.input ? inst.input.val() : ''), inst]);
+ },
+
+ /* 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);
+ this._curInst = null;
+ };
+ 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();
+ $.datepicker._triggerOnClose(inst);
+ this._datepickerShowing = false;
+ 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);
+ if ($target[0].id != $.datepicker._mainDivId &&
+ $target.parents('#' + $.datepicker._mainDivId).length == 0 &&
+ !$target.hasClass($.datepicker.markerClassName) &&
+ !$target.hasClass($.datepicker._triggerClass) &&
+ $.datepicker._datepickerShowing && !($.datepicker._inDialog && $.blockUI))
+ $.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._selectingMonthYear = false;
+ 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);
+ },
+
+ /* Restore input focus after not changing month/year. */
+ _clickMonthYear: function(id) {
+ var target = $(id);
+ var inst = this._getInst(target[0]);
+ if (inst.input && inst._selectingMonthYear) {
+ setTimeout(function() {
+ inst.input.focus();
+ }, 0);
+ }
+ inst._selectingMonthYear = !inst._selectingMonthYear;
+ },
+
+ /* 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;
+ },
+
+ /* 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" onclick="DP_jQuery_' + dpuuid +
+ '.datepicker._adjustDate(\'#' + inst.id + '\', -' + stepMonths + ', \'M\');"' +
+ ' 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" onclick="DP_jQuery_' + dpuuid +
+ '.datepicker._adjustDate(\'#' + inst.id + '\', +' + stepMonths + ', \'M\');"' +
+ ' 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" onclick="DP_jQuery_' + dpuuid +
+ '.datepicker._hideDatepicker();">' + 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" onclick="DP_jQuery_' + dpuuid +
+ '.datepicker._gotoToday(\'#' + inst.id + '\');"' +
+ '>' + 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 ? '' : ' onclick="DP_jQuery_' + dpuuid + '.datepicker._selectDay(\'#' +
+ inst.id + '\',' + printDate.getMonth() + ',' + printDate.getFullYear() + ', this);return false;"') + '>' + // 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" ' +
+ 'onchange="DP_jQuery_' + dpuuid + '.datepicker._selectMonthYear(\'#' + inst.id + '\', this, \'M\');" ' +
+ 'onclick="DP_jQuery_' + dpuuid + '.datepicker._clickMonthYear(\'#' + inst.id + '\');"' +
+ '>';
+ 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" ' +
+ 'onchange="DP_jQuery_' + dpuuid + '.datepicker._selectMonthYear(\'#' + inst.id + '\', this, \'Y\');" ' +
+ 'onclick="DP_jQuery_' + dpuuid + '.datepicker._clickMonthYear(\'#' + inst.id + '\');"' +
+ '>';
+ 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.14";
+
+// Workaround for #4055
+// Add another global to avoid noConflict issues with inline event handlers
+window['DP_jQuery_' + dpuuid] = $;
+
+})(jQuery);
+/*
+ * jQuery UI Dialog 1.8.14
+ *
+ * Copyright 2011, 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
+ },
+ // support for jQuery 1.3.2 - handle common attrFn methods for dialog
+ attrFn = $.attrFn || {
+ val: true,
+ css: true,
+ html: true,
+ text: true,
+ data: true,
+ width: true,
+ height: true,
+ offset: true,
+ click: 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.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.attr('scrollTop'), scrollLeft: self.element.attr('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('keypress.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 attrFn ) {
+ 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.14",
+
+ 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.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));
+/*
+ * jQuery UI Position 1.8.14
+ *
+ * Copyright 2011, 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",
+ _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 (see #5280)
+ 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 ) {
+ return this.each(function() {
+ $.offset.setOffset( this, options );
+ });
+ }
+ return _offset.call( this );
+ };
+}
+
+}( jQuery ));
+/*
+ * jQuery UI Progressbar 1.8.14
+ *
+ * Copyright 2011, 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.14"
+});
+
+})( jQuery );
+/*
+ * jQuery UI Slider 1.8.14
+ *
+ * Copyright 2011, 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 ret = true,
+ 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:
+ ret = false;
+ 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 );
+
+ return ret;
+
+ })
+ .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.attr( "disabled", "disabled" );
+ this.element.addClass( "ui-disabled" );
+ } else {
+ this.handles.removeAttr( "disabled" );
+ 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.14"
+});
+
+}(jQuery));
+/*
+ * jQuery UI Tabs 1.8.14
+ *
+ * Copyright 2011, 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.14"
+});
+
+/*
+ * 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 ) {
+ t = o.selected;
+ 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/lib/scripts/jquery/jquery-ui.min.js b/lib/scripts/jquery/jquery-ui.min.js
new file mode 100644
index 000000000..882309218
--- /dev/null
+++ b/lib/scripts/jquery/jquery-ui.min.js
@@ -0,0 +1,412 @@
+/*!
+ * jQuery UI 1.8.14
+ *
+ * Copyright 2011, 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(a,d){function c(h,g){var i=h.nodeName.toLowerCase();if("area"===i){g=h.parentNode;i=g.name;if(!h.href||!i||g.nodeName.toLowerCase()!=="map")return false;h=a("img[usemap=#"+i+"]")[0];return!!h&&e(h)}return(/input|select|textarea|button|object/.test(i)?!h.disabled:"a"==i?h.href||g:g)&&e(h)}function e(h){return!a(h).parents().andSelf().filter(function(){return a.curCSS(this,"visibility")==="hidden"||a.expr.filters.hidden(this)}).length}a.ui=a.ui||{};if(!a.ui.version){a.extend(a.ui,{version:"1.8.14",
+keyCode:{ALT:18,BACKSPACE:8,CAPS_LOCK:20,COMMA:188,COMMAND:91,COMMAND_LEFT:91,COMMAND_RIGHT:93,CONTROL:17,DELETE:46,DOWN:40,END:35,ENTER:13,ESCAPE:27,HOME:36,INSERT:45,LEFT:37,MENU:93,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}});a.fn.extend({_focus:a.fn.focus,focus:function(h,g){return typeof h==="number"?this.each(function(){var i=this;setTimeout(function(){a(i).focus();
+g&&g.call(i)},h)}):this._focus.apply(this,arguments)},scrollParent:function(){var h;h=a.browser.msie&&/(static|relative)/.test(this.css("position"))||/absolute/.test(this.css("position"))?this.parents().filter(function(){return/(relative|absolute|fixed)/.test(a.curCSS(this,"position",1))&&/(auto|scroll)/.test(a.curCSS(this,"overflow",1)+a.curCSS(this,"overflow-y",1)+a.curCSS(this,"overflow-x",1))}).eq(0):this.parents().filter(function(){return/(auto|scroll)/.test(a.curCSS(this,"overflow",1)+a.curCSS(this,
+"overflow-y",1)+a.curCSS(this,"overflow-x",1))}).eq(0);return/fixed/.test(this.css("position"))||!h.length?a(document):h},zIndex:function(h){if(h!==d)return this.css("zIndex",h);if(this.length){h=a(this[0]);for(var g;h.length&&h[0]!==document;){g=h.css("position");if(g==="absolute"||g==="relative"||g==="fixed"){g=parseInt(h.css("zIndex"),10);if(!isNaN(g)&&g!==0)return g}h=h.parent()}}return 0},disableSelection:function(){return this.bind((a.support.selectstart?"selectstart":"mousedown")+".ui-disableSelection",
+function(h){h.preventDefault()})},enableSelection:function(){return this.unbind(".ui-disableSelection")}});a.each(["Width","Height"],function(h,g){function i(l,o,n,k){a.each(b,function(){o-=parseFloat(a.curCSS(l,"padding"+this,true))||0;if(n)o-=parseFloat(a.curCSS(l,"border"+this+"Width",true))||0;if(k)o-=parseFloat(a.curCSS(l,"margin"+this,true))||0});return o}var b=g==="Width"?["Left","Right"]:["Top","Bottom"],f=g.toLowerCase(),j={innerWidth:a.fn.innerWidth,innerHeight:a.fn.innerHeight,outerWidth:a.fn.outerWidth,
+outerHeight:a.fn.outerHeight};a.fn["inner"+g]=function(l){if(l===d)return j["inner"+g].call(this);return this.each(function(){a(this).css(f,i(this,l)+"px")})};a.fn["outer"+g]=function(l,o){if(typeof l!=="number")return j["outer"+g].call(this,l);return this.each(function(){a(this).css(f,i(this,l,true,o)+"px")})}});a.extend(a.expr[":"],{data:function(h,g,i){return!!a.data(h,i[3])},focusable:function(h){return c(h,!isNaN(a.attr(h,"tabindex")))},tabbable:function(h){var g=a.attr(h,"tabindex"),i=isNaN(g);
+return(i||g>=0)&&c(h,!i)}});a(function(){var h=document.body,g=h.appendChild(g=document.createElement("div"));a.extend(g.style,{minHeight:"100px",height:"auto",padding:0,borderWidth:0});a.support.minHeight=g.offsetHeight===100;a.support.selectstart="onselectstart"in g;h.removeChild(g).style.display="none"});a.extend(a.ui,{plugin:{add:function(h,g,i){h=a.ui[h].prototype;for(var b in i){h.plugins[b]=h.plugins[b]||[];h.plugins[b].push([g,i[b]])}},call:function(h,g,i){if((g=h.plugins[g])&&h.element[0].parentNode)for(var b=
+0;b<g.length;b++)h.options[g[b][0]]&&g[b][1].apply(h.element,i)}},contains:function(h,g){return document.compareDocumentPosition?h.compareDocumentPosition(g)&16:h!==g&&h.contains(g)},hasScroll:function(h,g){if(a(h).css("overflow")==="hidden")return false;g=g&&g==="left"?"scrollLeft":"scrollTop";var i=false;if(h[g]>0)return true;h[g]=1;i=h[g]>0;h[g]=0;return i},isOverAxis:function(h,g,i){return h>g&&h<g+i},isOver:function(h,g,i,b,f,j){return a.ui.isOverAxis(h,i,f)&&a.ui.isOverAxis(g,b,j)}})}})(jQuery);
+(function(a,d){if(a.cleanData){var c=a.cleanData;a.cleanData=function(h){for(var g=0,i;(i=h[g])!=null;g++)a(i).triggerHandler("remove");c(h)}}else{var e=a.fn.remove;a.fn.remove=function(h,g){return this.each(function(){if(!g)if(!h||a.filter(h,[this]).length)a("*",this).add([this]).each(function(){a(this).triggerHandler("remove")});return e.call(a(this),h,g)})}}a.widget=function(h,g,i){var b=h.split(".")[0],f;h=h.split(".")[1];f=b+"-"+h;if(!i){i=g;g=a.Widget}a.expr[":"][f]=function(j){return!!a.data(j,
+h)};a[b]=a[b]||{};a[b][h]=function(j,l){arguments.length&&this._createWidget(j,l)};g=new g;g.options=a.extend(true,{},g.options);a[b][h].prototype=a.extend(true,g,{namespace:b,widgetName:h,widgetEventPrefix:a[b][h].prototype.widgetEventPrefix||h,widgetBaseClass:f},i);a.widget.bridge(h,a[b][h])};a.widget.bridge=function(h,g){a.fn[h]=function(i){var b=typeof i==="string",f=Array.prototype.slice.call(arguments,1),j=this;i=!b&&f.length?a.extend.apply(null,[true,i].concat(f)):i;if(b&&i.charAt(0)==="_")return j;
+b?this.each(function(){var l=a.data(this,h),o=l&&a.isFunction(l[i])?l[i].apply(l,f):l;if(o!==l&&o!==d){j=o;return false}}):this.each(function(){var l=a.data(this,h);l?l.option(i||{})._init():a.data(this,h,new g(i,this))});return j}};a.Widget=function(h,g){arguments.length&&this._createWidget(h,g)};a.Widget.prototype={widgetName:"widget",widgetEventPrefix:"",options:{disabled:false},_createWidget:function(h,g){a.data(g,this.widgetName,this);this.element=a(g);this.options=a.extend(true,{},this.options,
+this._getCreateOptions(),h);var i=this;this.element.bind("remove."+this.widgetName,function(){i.destroy()});this._create();this._trigger("create");this._init()},_getCreateOptions:function(){return a.metadata&&a.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(h,g){var i=h;if(arguments.length===0)return a.extend({},this.options);if(typeof h==="string"){if(g===d)return this.options[h];i={};i[h]=g}this._setOptions(i);return this},_setOptions:function(h){var g=this;a.each(h,function(i,b){g._setOption(i,b)});return this},_setOption:function(h,g){this.options[h]=g;if(h==="disabled")this.widget()[g?"addClass":"removeClass"](this.widgetBaseClass+"-disabled ui-state-disabled").attr("aria-disabled",g);return this},
+enable:function(){return this._setOption("disabled",false)},disable:function(){return this._setOption("disabled",true)},_trigger:function(h,g,i){var b=this.options[h];g=a.Event(g);g.type=(h===this.widgetEventPrefix?h:this.widgetEventPrefix+h).toLowerCase();i=i||{};if(g.originalEvent){h=a.event.props.length;for(var f;h;){f=a.event.props[--h];g[f]=g.originalEvent[f]}}this.element.trigger(g,i);return!(a.isFunction(b)&&b.call(this.element[0],g,i)===false||g.isDefaultPrevented())}}})(jQuery);
+(function(a){var d=false;a(document).mousedown(function(){d=false});a.widget("ui.mouse",{options:{cancel:":input,option",distance:1,delay:0},_mouseInit:function(){var c=this;this.element.bind("mousedown."+this.widgetName,function(e){return c._mouseDown(e)}).bind("click."+this.widgetName,function(e){if(true===a.data(e.target,c.widgetName+".preventClickEvent")){a.removeData(e.target,c.widgetName+".preventClickEvent");e.stopImmediatePropagation();return false}});this.started=false},_mouseDestroy:function(){this.element.unbind("."+
+this.widgetName)},_mouseDown:function(c){if(!d){this._mouseStarted&&this._mouseUp(c);this._mouseDownEvent=c;var e=this,h=c.which==1,g=typeof this.options.cancel=="string"?a(c.target).closest(this.options.cancel).length:false;if(!h||g||!this._mouseCapture(c))return true;this.mouseDelayMet=!this.options.delay;if(!this.mouseDelayMet)this._mouseDelayTimer=setTimeout(function(){e.mouseDelayMet=true},this.options.delay);if(this._mouseDistanceMet(c)&&this._mouseDelayMet(c)){this._mouseStarted=this._mouseStart(c)!==
+false;if(!this._mouseStarted){c.preventDefault();return true}}true===a.data(c.target,this.widgetName+".preventClickEvent")&&a.removeData(c.target,this.widgetName+".preventClickEvent");this._mouseMoveDelegate=function(i){return e._mouseMove(i)};this._mouseUpDelegate=function(i){return e._mouseUp(i)};a(document).bind("mousemove."+this.widgetName,this._mouseMoveDelegate).bind("mouseup."+this.widgetName,this._mouseUpDelegate);c.preventDefault();return d=true}},_mouseMove:function(c){if(a.browser.msie&&
+!(document.documentMode>=9)&&!c.button)return this._mouseUp(c);if(this._mouseStarted){this._mouseDrag(c);return c.preventDefault()}if(this._mouseDistanceMet(c)&&this._mouseDelayMet(c))(this._mouseStarted=this._mouseStart(this._mouseDownEvent,c)!==false)?this._mouseDrag(c):this._mouseUp(c);return!this._mouseStarted},_mouseUp:function(c){a(document).unbind("mousemove."+this.widgetName,this._mouseMoveDelegate).unbind("mouseup."+this.widgetName,this._mouseUpDelegate);if(this._mouseStarted){this._mouseStarted=
+false;c.target==this._mouseDownEvent.target&&a.data(c.target,this.widgetName+".preventClickEvent",true);this._mouseStop(c)}return false},_mouseDistanceMet:function(c){return Math.max(Math.abs(this._mouseDownEvent.pageX-c.pageX),Math.abs(this._mouseDownEvent.pageY-c.pageY))>=this.options.distance},_mouseDelayMet:function(){return this.mouseDelayMet},_mouseStart:function(){},_mouseDrag:function(){},_mouseStop:function(){},_mouseCapture:function(){return true}})})(jQuery);
+(function(a){a.widget("ui.draggable",a.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")){this.element.removeData("draggable").unbind(".draggable").removeClass("ui-draggable ui-draggable-dragging ui-draggable-disabled");this._mouseDestroy();return this}},_mouseCapture:function(d){var c=
+this.options;if(this.helper||c.disabled||a(d.target).is(".ui-resizable-handle"))return false;this.handle=this._getHandle(d);if(!this.handle)return false;a(c.iframeFix===true?"iframe":c.iframeFix).each(function(){a('<div class="ui-draggable-iframeFix" style="background: #fff;"></div>').css({width:this.offsetWidth+"px",height:this.offsetHeight+"px",position:"absolute",opacity:"0.001",zIndex:1E3}).css(a(this).offset()).appendTo("body")});return true},_mouseStart:function(d){var c=this.options;this.helper=
+this._createHelper(d);this._cacheHelperProportions();if(a.ui.ddmanager)a.ui.ddmanager.current=this;this._cacheMargins();this.cssPosition=this.helper.css("position");this.scrollParent=this.helper.scrollParent();this.offset=this.positionAbs=this.element.offset();this.offset={top:this.offset.top-this.margins.top,left:this.offset.left-this.margins.left};a.extend(this.offset,{click:{left:d.pageX-this.offset.left,top:d.pageY-this.offset.top},parent:this._getParentOffset(),relative:this._getRelativeOffset()});
+this.originalPosition=this.position=this._generatePosition(d);this.originalPageX=d.pageX;this.originalPageY=d.pageY;c.cursorAt&&this._adjustOffsetFromHelper(c.cursorAt);c.containment&&this._setContainment();if(this._trigger("start",d)===false){this._clear();return false}this._cacheHelperProportions();a.ui.ddmanager&&!c.dropBehaviour&&a.ui.ddmanager.prepareOffsets(this,d);this.helper.addClass("ui-draggable-dragging");this._mouseDrag(d,true);a.ui.ddmanager&&a.ui.ddmanager.dragStart(this,d);return true},
+_mouseDrag:function(d,c){this.position=this._generatePosition(d);this.positionAbs=this._convertPositionTo("absolute");if(!c){c=this._uiHash();if(this._trigger("drag",d,c)===false){this._mouseUp({});return false}this.position=c.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";a.ui.ddmanager&&a.ui.ddmanager.drag(this,d);return false},_mouseStop:function(d){var c=
+false;if(a.ui.ddmanager&&!this.options.dropBehaviour)c=a.ui.ddmanager.drop(this,d);if(this.dropped){c=this.dropped;this.dropped=false}if((!this.element[0]||!this.element[0].parentNode)&&this.options.helper=="original")return false;if(this.options.revert=="invalid"&&!c||this.options.revert=="valid"&&c||this.options.revert===true||a.isFunction(this.options.revert)&&this.options.revert.call(this.element,c)){var e=this;a(this.helper).animate(this.originalPosition,parseInt(this.options.revertDuration,
+10),function(){e._trigger("stop",d)!==false&&e._clear()})}else this._trigger("stop",d)!==false&&this._clear();return false},_mouseUp:function(d){this.options.iframeFix===true&&a("div.ui-draggable-iframeFix").each(function(){this.parentNode.removeChild(this)});a.ui.ddmanager&&a.ui.ddmanager.dragStop(this,d);return a.ui.mouse.prototype._mouseUp.call(this,d)},cancel:function(){this.helper.is(".ui-draggable-dragging")?this._mouseUp({}):this._clear();return this},_getHandle:function(d){var c=!this.options.handle||
+!a(this.options.handle,this.element).length?true:false;a(this.options.handle,this.element).find("*").andSelf().each(function(){if(this==d.target)c=true});return c},_createHelper:function(d){var c=this.options;d=a.isFunction(c.helper)?a(c.helper.apply(this.element[0],[d])):c.helper=="clone"?this.element.clone().removeAttr("id"):this.element;d.parents("body").length||d.appendTo(c.appendTo=="parent"?this.element[0].parentNode:c.appendTo);d[0]!=this.element[0]&&!/(fixed|absolute)/.test(d.css("position"))&&
+d.css("position","absolute");return d},_adjustOffsetFromHelper:function(d){if(typeof d=="string")d=d.split(" ");if(a.isArray(d))d={left:+d[0],top:+d[1]||0};if("left"in d)this.offset.click.left=d.left+this.margins.left;if("right"in d)this.offset.click.left=this.helperProportions.width-d.right+this.margins.left;if("top"in d)this.offset.click.top=d.top+this.margins.top;if("bottom"in d)this.offset.click.top=this.helperProportions.height-d.bottom+this.margins.top},_getParentOffset:function(){this.offsetParent=
+this.helper.offsetParent();var d=this.offsetParent.offset();if(this.cssPosition=="absolute"&&this.scrollParent[0]!=document&&a.ui.contains(this.scrollParent[0],this.offsetParent[0])){d.left+=this.scrollParent.scrollLeft();d.top+=this.scrollParent.scrollTop()}if(this.offsetParent[0]==document.body||this.offsetParent[0].tagName&&this.offsetParent[0].tagName.toLowerCase()=="html"&&a.browser.msie)d={top:0,left:0};return{top:d.top+(parseInt(this.offsetParent.css("borderTopWidth"),10)||0),left:d.left+(parseInt(this.offsetParent.css("borderLeftWidth"),
+10)||0)}},_getRelativeOffset:function(){if(this.cssPosition=="relative"){var d=this.element.position();return{top:d.top-(parseInt(this.helper.css("top"),10)||0)+this.scrollParent.scrollTop(),left:d.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 d=this.options;if(d.containment=="parent")d.containment=this.helper[0].parentNode;if(d.containment=="document"||d.containment=="window")this.containment=[d.containment=="document"?0:a(window).scrollLeft()-this.offset.relative.left-this.offset.parent.left,d.containment=="document"?0:a(window).scrollTop()-this.offset.relative.top-this.offset.parent.top,
+(d.containment=="document"?0:a(window).scrollLeft())+a(d.containment=="document"?document:window).width()-this.helperProportions.width-this.margins.left,(d.containment=="document"?0:a(window).scrollTop())+(a(d.containment=="document"?document:window).height()||document.body.parentNode.scrollHeight)-this.helperProportions.height-this.margins.top];if(!/^(document|window|parent)$/.test(d.containment)&&d.containment.constructor!=Array){d=a(d.containment);var c=d[0];if(c){d.offset();var e=a(c).css("overflow")!=
+"hidden";this.containment=[(parseInt(a(c).css("borderLeftWidth"),10)||0)+(parseInt(a(c).css("paddingLeft"),10)||0),(parseInt(a(c).css("borderTopWidth"),10)||0)+(parseInt(a(c).css("paddingTop"),10)||0),(e?Math.max(c.scrollWidth,c.offsetWidth):c.offsetWidth)-(parseInt(a(c).css("borderLeftWidth"),10)||0)-(parseInt(a(c).css("paddingRight"),10)||0)-this.helperProportions.width-this.margins.left-this.margins.right,(e?Math.max(c.scrollHeight,c.offsetHeight):c.offsetHeight)-(parseInt(a(c).css("borderTopWidth"),
+10)||0)-(parseInt(a(c).css("paddingBottom"),10)||0)-this.helperProportions.height-this.margins.top-this.margins.bottom];this.relative_container=d}}else if(d.containment.constructor==Array)this.containment=d.containment},_convertPositionTo:function(d,c){if(!c)c=this.position;d=d=="absolute"?1:-1;var e=this.cssPosition=="absolute"&&!(this.scrollParent[0]!=document&&a.ui.contains(this.scrollParent[0],this.offsetParent[0]))?this.offsetParent:this.scrollParent,h=/(html|body)/i.test(e[0].tagName);return{top:c.top+
+this.offset.relative.top*d+this.offset.parent.top*d-(a.browser.safari&&a.browser.version<526&&this.cssPosition=="fixed"?0:(this.cssPosition=="fixed"?-this.scrollParent.scrollTop():h?0:e.scrollTop())*d),left:c.left+this.offset.relative.left*d+this.offset.parent.left*d-(a.browser.safari&&a.browser.version<526&&this.cssPosition=="fixed"?0:(this.cssPosition=="fixed"?-this.scrollParent.scrollLeft():h?0:e.scrollLeft())*d)}},_generatePosition:function(d){var c=this.options,e=this.cssPosition=="absolute"&&
+!(this.scrollParent[0]!=document&&a.ui.contains(this.scrollParent[0],this.offsetParent[0]))?this.offsetParent:this.scrollParent,h=/(html|body)/i.test(e[0].tagName),g=d.pageX,i=d.pageY;if(this.originalPosition){var b;if(this.containment){if(this.relative_container){b=this.relative_container.offset();b=[this.containment[0]+b.left,this.containment[1]+b.top,this.containment[2]+b.left,this.containment[3]+b.top]}else b=this.containment;if(d.pageX-this.offset.click.left<b[0])g=b[0]+this.offset.click.left;
+if(d.pageY-this.offset.click.top<b[1])i=b[1]+this.offset.click.top;if(d.pageX-this.offset.click.left>b[2])g=b[2]+this.offset.click.left;if(d.pageY-this.offset.click.top>b[3])i=b[3]+this.offset.click.top}if(c.grid){i=c.grid[1]?this.originalPageY+Math.round((i-this.originalPageY)/c.grid[1])*c.grid[1]:this.originalPageY;i=b?!(i-this.offset.click.top<b[1]||i-this.offset.click.top>b[3])?i:!(i-this.offset.click.top<b[1])?i-c.grid[1]:i+c.grid[1]:i;g=c.grid[0]?this.originalPageX+Math.round((g-this.originalPageX)/
+c.grid[0])*c.grid[0]:this.originalPageX;g=b?!(g-this.offset.click.left<b[0]||g-this.offset.click.left>b[2])?g:!(g-this.offset.click.left<b[0])?g-c.grid[0]:g+c.grid[0]:g}}return{top:i-this.offset.click.top-this.offset.relative.top-this.offset.parent.top+(a.browser.safari&&a.browser.version<526&&this.cssPosition=="fixed"?0:this.cssPosition=="fixed"?-this.scrollParent.scrollTop():h?0:e.scrollTop()),left:g-this.offset.click.left-this.offset.relative.left-this.offset.parent.left+(a.browser.safari&&a.browser.version<
+526&&this.cssPosition=="fixed"?0:this.cssPosition=="fixed"?-this.scrollParent.scrollLeft():h?0:e.scrollLeft())}},_clear:function(){this.helper.removeClass("ui-draggable-dragging");this.helper[0]!=this.element[0]&&!this.cancelHelperRemoval&&this.helper.remove();this.helper=null;this.cancelHelperRemoval=false},_trigger:function(d,c,e){e=e||this._uiHash();a.ui.plugin.call(this,d,[c,e]);if(d=="drag")this.positionAbs=this._convertPositionTo("absolute");return a.Widget.prototype._trigger.call(this,d,c,
+e)},plugins:{},_uiHash:function(){return{helper:this.helper,position:this.position,originalPosition:this.originalPosition,offset:this.positionAbs}}});a.extend(a.ui.draggable,{version:"1.8.14"});a.ui.plugin.add("draggable","connectToSortable",{start:function(d,c){var e=a(this).data("draggable"),h=e.options,g=a.extend({},c,{item:e.element});e.sortables=[];a(h.connectToSortable).each(function(){var i=a.data(this,"sortable");if(i&&!i.options.disabled){e.sortables.push({instance:i,shouldRevert:i.options.revert});
+i.refreshPositions();i._trigger("activate",d,g)}})},stop:function(d,c){var e=a(this).data("draggable"),h=a.extend({},c,{item:e.element});a.each(e.sortables,function(){if(this.instance.isOver){this.instance.isOver=0;e.cancelHelperRemoval=true;this.instance.cancelHelperRemoval=false;if(this.shouldRevert)this.instance.options.revert=true;this.instance._mouseStop(d);this.instance.options.helper=this.instance.options._helper;e.options.helper=="original"&&this.instance.currentItem.css({top:"auto",left:"auto"})}else{this.instance.cancelHelperRemoval=
+false;this.instance._trigger("deactivate",d,h)}})},drag:function(d,c){var e=a(this).data("draggable"),h=this;a.each(e.sortables,function(){this.instance.positionAbs=e.positionAbs;this.instance.helperProportions=e.helperProportions;this.instance.offset.click=e.offset.click;if(this.instance._intersectsWith(this.instance.containerCache)){if(!this.instance.isOver){this.instance.isOver=1;this.instance.currentItem=a(h).clone().removeAttr("id").appendTo(this.instance.element).data("sortable-item",true);
+this.instance.options._helper=this.instance.options.helper;this.instance.options.helper=function(){return c.helper[0]};d.target=this.instance.currentItem[0];this.instance._mouseCapture(d,true);this.instance._mouseStart(d,true,true);this.instance.offset.click.top=e.offset.click.top;this.instance.offset.click.left=e.offset.click.left;this.instance.offset.parent.left-=e.offset.parent.left-this.instance.offset.parent.left;this.instance.offset.parent.top-=e.offset.parent.top-this.instance.offset.parent.top;
+e._trigger("toSortable",d);e.dropped=this.instance.element;e.currentItem=e.element;this.instance.fromOutside=e}this.instance.currentItem&&this.instance._mouseDrag(d)}else if(this.instance.isOver){this.instance.isOver=0;this.instance.cancelHelperRemoval=true;this.instance.options.revert=false;this.instance._trigger("out",d,this.instance._uiHash(this.instance));this.instance._mouseStop(d,true);this.instance.options.helper=this.instance.options._helper;this.instance.currentItem.remove();this.instance.placeholder&&
+this.instance.placeholder.remove();e._trigger("fromSortable",d);e.dropped=false}})}});a.ui.plugin.add("draggable","cursor",{start:function(){var d=a("body"),c=a(this).data("draggable").options;if(d.css("cursor"))c._cursor=d.css("cursor");d.css("cursor",c.cursor)},stop:function(){var d=a(this).data("draggable").options;d._cursor&&a("body").css("cursor",d._cursor)}});a.ui.plugin.add("draggable","opacity",{start:function(d,c){d=a(c.helper);c=a(this).data("draggable").options;if(d.css("opacity"))c._opacity=
+d.css("opacity");d.css("opacity",c.opacity)},stop:function(d,c){d=a(this).data("draggable").options;d._opacity&&a(c.helper).css("opacity",d._opacity)}});a.ui.plugin.add("draggable","scroll",{start:function(){var d=a(this).data("draggable");if(d.scrollParent[0]!=document&&d.scrollParent[0].tagName!="HTML")d.overflowOffset=d.scrollParent.offset()},drag:function(d){var c=a(this).data("draggable"),e=c.options,h=false;if(c.scrollParent[0]!=document&&c.scrollParent[0].tagName!="HTML"){if(!e.axis||e.axis!=
+"x")if(c.overflowOffset.top+c.scrollParent[0].offsetHeight-d.pageY<e.scrollSensitivity)c.scrollParent[0].scrollTop=h=c.scrollParent[0].scrollTop+e.scrollSpeed;else if(d.pageY-c.overflowOffset.top<e.scrollSensitivity)c.scrollParent[0].scrollTop=h=c.scrollParent[0].scrollTop-e.scrollSpeed;if(!e.axis||e.axis!="y")if(c.overflowOffset.left+c.scrollParent[0].offsetWidth-d.pageX<e.scrollSensitivity)c.scrollParent[0].scrollLeft=h=c.scrollParent[0].scrollLeft+e.scrollSpeed;else if(d.pageX-c.overflowOffset.left<
+e.scrollSensitivity)c.scrollParent[0].scrollLeft=h=c.scrollParent[0].scrollLeft-e.scrollSpeed}else{if(!e.axis||e.axis!="x")if(d.pageY-a(document).scrollTop()<e.scrollSensitivity)h=a(document).scrollTop(a(document).scrollTop()-e.scrollSpeed);else if(a(window).height()-(d.pageY-a(document).scrollTop())<e.scrollSensitivity)h=a(document).scrollTop(a(document).scrollTop()+e.scrollSpeed);if(!e.axis||e.axis!="y")if(d.pageX-a(document).scrollLeft()<e.scrollSensitivity)h=a(document).scrollLeft(a(document).scrollLeft()-
+e.scrollSpeed);else if(a(window).width()-(d.pageX-a(document).scrollLeft())<e.scrollSensitivity)h=a(document).scrollLeft(a(document).scrollLeft()+e.scrollSpeed)}h!==false&&a.ui.ddmanager&&!e.dropBehaviour&&a.ui.ddmanager.prepareOffsets(c,d)}});a.ui.plugin.add("draggable","snap",{start:function(){var d=a(this).data("draggable"),c=d.options;d.snapElements=[];a(c.snap.constructor!=String?c.snap.items||":data(draggable)":c.snap).each(function(){var e=a(this),h=e.offset();this!=d.element[0]&&d.snapElements.push({item:this,
+width:e.outerWidth(),height:e.outerHeight(),top:h.top,left:h.left})})},drag:function(d,c){for(var e=a(this).data("draggable"),h=e.options,g=h.snapTolerance,i=c.offset.left,b=i+e.helperProportions.width,f=c.offset.top,j=f+e.helperProportions.height,l=e.snapElements.length-1;l>=0;l--){var o=e.snapElements[l].left,n=o+e.snapElements[l].width,k=e.snapElements[l].top,m=k+e.snapElements[l].height;if(o-g<i&&i<n+g&&k-g<f&&f<m+g||o-g<i&&i<n+g&&k-g<j&&j<m+g||o-g<b&&b<n+g&&k-g<f&&f<m+g||o-g<b&&b<n+g&&k-g<j&&
+j<m+g){if(h.snapMode!="inner"){var p=Math.abs(k-j)<=g,q=Math.abs(m-f)<=g,s=Math.abs(o-b)<=g,r=Math.abs(n-i)<=g;if(p)c.position.top=e._convertPositionTo("relative",{top:k-e.helperProportions.height,left:0}).top-e.margins.top;if(q)c.position.top=e._convertPositionTo("relative",{top:m,left:0}).top-e.margins.top;if(s)c.position.left=e._convertPositionTo("relative",{top:0,left:o-e.helperProportions.width}).left-e.margins.left;if(r)c.position.left=e._convertPositionTo("relative",{top:0,left:n}).left-e.margins.left}var u=
+p||q||s||r;if(h.snapMode!="outer"){p=Math.abs(k-f)<=g;q=Math.abs(m-j)<=g;s=Math.abs(o-i)<=g;r=Math.abs(n-b)<=g;if(p)c.position.top=e._convertPositionTo("relative",{top:k,left:0}).top-e.margins.top;if(q)c.position.top=e._convertPositionTo("relative",{top:m-e.helperProportions.height,left:0}).top-e.margins.top;if(s)c.position.left=e._convertPositionTo("relative",{top:0,left:o}).left-e.margins.left;if(r)c.position.left=e._convertPositionTo("relative",{top:0,left:n-e.helperProportions.width}).left-e.margins.left}if(!e.snapElements[l].snapping&&
+(p||q||s||r||u))e.options.snap.snap&&e.options.snap.snap.call(e.element,d,a.extend(e._uiHash(),{snapItem:e.snapElements[l].item}));e.snapElements[l].snapping=p||q||s||r||u}else{e.snapElements[l].snapping&&e.options.snap.release&&e.options.snap.release.call(e.element,d,a.extend(e._uiHash(),{snapItem:e.snapElements[l].item}));e.snapElements[l].snapping=false}}}});a.ui.plugin.add("draggable","stack",{start:function(){var d=a(this).data("draggable").options;d=a.makeArray(a(d.stack)).sort(function(e,h){return(parseInt(a(e).css("zIndex"),
+10)||0)-(parseInt(a(h).css("zIndex"),10)||0)});if(d.length){var c=parseInt(d[0].style.zIndex)||0;a(d).each(function(e){this.style.zIndex=c+e});this[0].style.zIndex=c+d.length}}});a.ui.plugin.add("draggable","zIndex",{start:function(d,c){d=a(c.helper);c=a(this).data("draggable").options;if(d.css("zIndex"))c._zIndex=d.css("zIndex");d.css("zIndex",c.zIndex)},stop:function(d,c){d=a(this).data("draggable").options;d._zIndex&&a(c.helper).css("zIndex",d._zIndex)}})})(jQuery);
+(function(a){a.widget("ui.droppable",{widgetEventPrefix:"drop",options:{accept:"*",activeClass:false,addClasses:true,greedy:false,hoverClass:false,scope:"default",tolerance:"intersect"},_create:function(){var d=this.options,c=d.accept;this.isover=0;this.isout=1;this.accept=a.isFunction(c)?c:function(e){return e.is(c)};this.proportions={width:this.element[0].offsetWidth,height:this.element[0].offsetHeight};a.ui.ddmanager.droppables[d.scope]=a.ui.ddmanager.droppables[d.scope]||[];a.ui.ddmanager.droppables[d.scope].push(this);
+d.addClasses&&this.element.addClass("ui-droppable")},destroy:function(){for(var d=a.ui.ddmanager.droppables[this.options.scope],c=0;c<d.length;c++)d[c]==this&&d.splice(c,1);this.element.removeClass("ui-droppable ui-droppable-disabled").removeData("droppable").unbind(".droppable");return this},_setOption:function(d,c){if(d=="accept")this.accept=a.isFunction(c)?c:function(e){return e.is(c)};a.Widget.prototype._setOption.apply(this,arguments)},_activate:function(d){var c=a.ui.ddmanager.current;this.options.activeClass&&
+this.element.addClass(this.options.activeClass);c&&this._trigger("activate",d,this.ui(c))},_deactivate:function(d){var c=a.ui.ddmanager.current;this.options.activeClass&&this.element.removeClass(this.options.activeClass);c&&this._trigger("deactivate",d,this.ui(c))},_over:function(d){var c=a.ui.ddmanager.current;if(!(!c||(c.currentItem||c.element)[0]==this.element[0]))if(this.accept.call(this.element[0],c.currentItem||c.element)){this.options.hoverClass&&this.element.addClass(this.options.hoverClass);
+this._trigger("over",d,this.ui(c))}},_out:function(d){var c=a.ui.ddmanager.current;if(!(!c||(c.currentItem||c.element)[0]==this.element[0]))if(this.accept.call(this.element[0],c.currentItem||c.element)){this.options.hoverClass&&this.element.removeClass(this.options.hoverClass);this._trigger("out",d,this.ui(c))}},_drop:function(d,c){var e=c||a.ui.ddmanager.current;if(!e||(e.currentItem||e.element)[0]==this.element[0])return false;var h=false;this.element.find(":data(droppable)").not(".ui-draggable-dragging").each(function(){var g=
+a.data(this,"droppable");if(g.options.greedy&&!g.options.disabled&&g.options.scope==e.options.scope&&g.accept.call(g.element[0],e.currentItem||e.element)&&a.ui.intersect(e,a.extend(g,{offset:g.element.offset()}),g.options.tolerance)){h=true;return false}});if(h)return false;if(this.accept.call(this.element[0],e.currentItem||e.element)){this.options.activeClass&&this.element.removeClass(this.options.activeClass);this.options.hoverClass&&this.element.removeClass(this.options.hoverClass);this._trigger("drop",
+d,this.ui(e));return this.element}return false},ui:function(d){return{draggable:d.currentItem||d.element,helper:d.helper,position:d.position,offset:d.positionAbs}}});a.extend(a.ui.droppable,{version:"1.8.14"});a.ui.intersect=function(d,c,e){if(!c.offset)return false;var h=(d.positionAbs||d.position.absolute).left,g=h+d.helperProportions.width,i=(d.positionAbs||d.position.absolute).top,b=i+d.helperProportions.height,f=c.offset.left,j=f+c.proportions.width,l=c.offset.top,o=l+c.proportions.height;
+switch(e){case "fit":return f<=h&&g<=j&&l<=i&&b<=o;case "intersect":return f<h+d.helperProportions.width/2&&g-d.helperProportions.width/2<j&&l<i+d.helperProportions.height/2&&b-d.helperProportions.height/2<o;case "pointer":return a.ui.isOver((d.positionAbs||d.position.absolute).top+(d.clickOffset||d.offset.click).top,(d.positionAbs||d.position.absolute).left+(d.clickOffset||d.offset.click).left,l,f,c.proportions.height,c.proportions.width);case "touch":return(i>=l&&i<=o||b>=l&&b<=o||i<l&&b>o)&&(h>=
+f&&h<=j||g>=f&&g<=j||h<f&&g>j);default:return false}};a.ui.ddmanager={current:null,droppables:{"default":[]},prepareOffsets:function(d,c){var e=a.ui.ddmanager.droppables[d.options.scope]||[],h=c?c.type:null,g=(d.currentItem||d.element).find(":data(droppable)").andSelf(),i=0;a:for(;i<e.length;i++)if(!(e[i].options.disabled||d&&!e[i].accept.call(e[i].element[0],d.currentItem||d.element))){for(var b=0;b<g.length;b++)if(g[b]==e[i].element[0]){e[i].proportions.height=0;continue a}e[i].visible=e[i].element.css("display")!=
+"none";if(e[i].visible){h=="mousedown"&&e[i]._activate.call(e[i],c);e[i].offset=e[i].element.offset();e[i].proportions={width:e[i].element[0].offsetWidth,height:e[i].element[0].offsetHeight}}}},drop:function(d,c){var e=false;a.each(a.ui.ddmanager.droppables[d.options.scope]||[],function(){if(this.options){if(!this.options.disabled&&this.visible&&a.ui.intersect(d,this,this.options.tolerance))e=e||this._drop.call(this,c);if(!this.options.disabled&&this.visible&&this.accept.call(this.element[0],d.currentItem||
+d.element)){this.isout=1;this.isover=0;this._deactivate.call(this,c)}}});return e},dragStart:function(d,c){d.element.parentsUntil("body").bind("scroll.droppable",function(){d.options.refreshPositions||a.ui.ddmanager.prepareOffsets(d,c)})},drag:function(d,c){d.options.refreshPositions&&a.ui.ddmanager.prepareOffsets(d,c);a.each(a.ui.ddmanager.droppables[d.options.scope]||[],function(){if(!(this.options.disabled||this.greedyChild||!this.visible)){var e=a.ui.intersect(d,this,this.options.tolerance);if(e=
+!e&&this.isover==1?"isout":e&&this.isover==0?"isover":null){var h;if(this.options.greedy){var g=this.element.parents(":data(droppable):eq(0)");if(g.length){h=a.data(g[0],"droppable");h.greedyChild=e=="isover"?1:0}}if(h&&e=="isover"){h.isover=0;h.isout=1;h._out.call(h,c)}this[e]=1;this[e=="isout"?"isover":"isout"]=0;this[e=="isover"?"_over":"_out"].call(this,c);if(h&&e=="isout"){h.isout=0;h.isover=1;h._over.call(h,c)}}}})},dragStop:function(d,c){d.element.parentsUntil("body").unbind("scroll.droppable");
+d.options.refreshPositions||a.ui.ddmanager.prepareOffsets(d,c)}}})(jQuery);
+(function(a){a.widget("ui.resizable",a.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:1E3},_create:function(){var e=this,h=this.options;this.element.addClass("ui-resizable");a.extend(this,{_aspectRatio:!!h.aspectRatio,aspectRatio:h.aspectRatio,originalElement:this.element,
+_proportionallyResizeElements:[],_helper:h.helper||h.ghost||h.animate?h.helper||"ui-resizable-helper":null});if(this.element[0].nodeName.match(/canvas|textarea|input|select|button|img/i)){/relative/.test(this.element.css("position"))&&a.browser.opera&&this.element.css({position:"relative",top:"auto",left:"auto"});this.element.wrap(a('<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")}));this.element=this.element.parent().data("resizable",this.element.data("resizable"));this.elementIsWrapper=true;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});this.originalResizeStyle=
+this.originalElement.css("resize");this.originalElement.css("resize","none");this._proportionallyResizeElements.push(this.originalElement.css({position:"static",zoom:1,display:"block"}));this.originalElement.css({margin:this.originalElement.css("margin")});this._proportionallyResize()}this.handles=h.handles||(!a(".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 g=this.handles.split(",");this.handles={};for(var i=0;i<g.length;i++){var b=a.trim(g[i]),f=a('<div class="ui-resizable-handle '+("ui-resizable-"+b)+'"></div>');/sw|se|ne|nw/.test(b)&&f.css({zIndex:++h.zIndex});"se"==b&&f.addClass("ui-icon ui-icon-gripsmall-diagonal-se");this.handles[b]=".ui-resizable-"+b;this.element.append(f)}}this._renderAxis=function(j){j=j||this.element;for(var l in this.handles){if(this.handles[l].constructor==
+String)this.handles[l]=a(this.handles[l],this.element).show();if(this.elementIsWrapper&&this.originalElement[0].nodeName.match(/textarea|input|select|button/i)){var o=a(this.handles[l],this.element),n=0;n=/sw|ne|nw|se|n|s/.test(l)?o.outerHeight():o.outerWidth();o=["padding",/ne|nw|n/.test(l)?"Top":/se|sw|s/.test(l)?"Bottom":/^e$/.test(l)?"Right":"Left"].join("");j.css(o,n);this._proportionallyResize()}a(this.handles[l])}};this._renderAxis(this.element);this._handles=a(".ui-resizable-handle",this.element).disableSelection();
+this._handles.mouseover(function(){if(!e.resizing){if(this.className)var j=this.className.match(/ui-resizable-(se|sw|ne|nw|n|e|s|w)/i);e.axis=j&&j[1]?j[1]:"se"}});if(h.autoHide){this._handles.hide();a(this.element).addClass("ui-resizable-autohide").hover(function(){if(!h.disabled){a(this).removeClass("ui-resizable-autohide");e._handles.show()}},function(){if(!h.disabled)if(!e.resizing){a(this).addClass("ui-resizable-autohide");e._handles.hide()}})}this._mouseInit()},destroy:function(){this._mouseDestroy();
+var e=function(g){a(g).removeClass("ui-resizable ui-resizable-disabled ui-resizable-resizing").removeData("resizable").unbind(".resizable").find(".ui-resizable-handle").remove()};if(this.elementIsWrapper){e(this.element);var h=this.element;h.after(this.originalElement.css({position:h.css("position"),width:h.outerWidth(),height:h.outerHeight(),top:h.css("top"),left:h.css("left")})).remove()}this.originalElement.css("resize",this.originalResizeStyle);e(this.originalElement);return this},_mouseCapture:function(e){var h=
+false;for(var g in this.handles)if(a(this.handles[g])[0]==e.target)h=true;return!this.options.disabled&&h},_mouseStart:function(e){var h=this.options,g=this.element.position(),i=this.element;this.resizing=true;this.documentScroll={top:a(document).scrollTop(),left:a(document).scrollLeft()};if(i.is(".ui-draggable")||/absolute/.test(i.css("position")))i.css({position:"absolute",top:g.top,left:g.left});a.browser.opera&&/relative/.test(i.css("position"))&&i.css({position:"relative",top:"auto",left:"auto"});
+this._renderProxy();g=d(this.helper.css("left"));var b=d(this.helper.css("top"));if(h.containment){g+=a(h.containment).scrollLeft()||0;b+=a(h.containment).scrollTop()||0}this.offset=this.helper.offset();this.position={left:g,top:b};this.size=this._helper?{width:i.outerWidth(),height:i.outerHeight()}:{width:i.width(),height:i.height()};this.originalSize=this._helper?{width:i.outerWidth(),height:i.outerHeight()}:{width:i.width(),height:i.height()};this.originalPosition={left:g,top:b};this.sizeDiff=
+{width:i.outerWidth()-i.width(),height:i.outerHeight()-i.height()};this.originalMousePosition={left:e.pageX,top:e.pageY};this.aspectRatio=typeof h.aspectRatio=="number"?h.aspectRatio:this.originalSize.width/this.originalSize.height||1;h=a(".ui-resizable-"+this.axis).css("cursor");a("body").css("cursor",h=="auto"?this.axis+"-resize":h);i.addClass("ui-resizable-resizing");this._propagate("start",e);return true},_mouseDrag:function(e){var h=this.helper,g=this.originalMousePosition,i=this._change[this.axis];
+if(!i)return false;g=i.apply(this,[e,e.pageX-g.left||0,e.pageY-g.top||0]);this._updateVirtualBoundaries(e.shiftKey);if(this._aspectRatio||e.shiftKey)g=this._updateRatio(g,e);g=this._respectSize(g,e);this._propagate("resize",e);h.css({top:this.position.top+"px",left:this.position.left+"px",width:this.size.width+"px",height:this.size.height+"px"});!this._helper&&this._proportionallyResizeElements.length&&this._proportionallyResize();this._updateCache(g);this._trigger("resize",e,this.ui());return false},
+_mouseStop:function(e){this.resizing=false;var h=this.options,g=this;if(this._helper){var i=this._proportionallyResizeElements,b=i.length&&/textarea/i.test(i[0].nodeName);i=b&&a.ui.hasScroll(i[0],"left")?0:g.sizeDiff.height;b=b?0:g.sizeDiff.width;b={width:g.helper.width()-b,height:g.helper.height()-i};i=parseInt(g.element.css("left"),10)+(g.position.left-g.originalPosition.left)||null;var f=parseInt(g.element.css("top"),10)+(g.position.top-g.originalPosition.top)||null;h.animate||this.element.css(a.extend(b,
+{top:f,left:i}));g.helper.height(g.size.height);g.helper.width(g.size.width);this._helper&&!h.animate&&this._proportionallyResize()}a("body").css("cursor","auto");this.element.removeClass("ui-resizable-resizing");this._propagate("stop",e);this._helper&&this.helper.remove();return false},_updateVirtualBoundaries:function(e){var h=this.options,g,i,b;h={minWidth:c(h.minWidth)?h.minWidth:0,maxWidth:c(h.maxWidth)?h.maxWidth:Infinity,minHeight:c(h.minHeight)?h.minHeight:0,maxHeight:c(h.maxHeight)?h.maxHeight:
+Infinity};if(this._aspectRatio||e){e=h.minHeight*this.aspectRatio;i=h.minWidth/this.aspectRatio;g=h.maxHeight*this.aspectRatio;b=h.maxWidth/this.aspectRatio;if(e>h.minWidth)h.minWidth=e;if(i>h.minHeight)h.minHeight=i;if(g<h.maxWidth)h.maxWidth=g;if(b<h.maxHeight)h.maxHeight=b}this._vBoundaries=h},_updateCache:function(e){this.offset=this.helper.offset();if(c(e.left))this.position.left=e.left;if(c(e.top))this.position.top=e.top;if(c(e.height))this.size.height=e.height;if(c(e.width))this.size.width=
+e.width},_updateRatio:function(e){var h=this.position,g=this.size,i=this.axis;if(c(e.height))e.width=e.height*this.aspectRatio;else if(c(e.width))e.height=e.width/this.aspectRatio;if(i=="sw"){e.left=h.left+(g.width-e.width);e.top=null}if(i=="nw"){e.top=h.top+(g.height-e.height);e.left=h.left+(g.width-e.width)}return e},_respectSize:function(e){var h=this._vBoundaries,g=this.axis,i=c(e.width)&&h.maxWidth&&h.maxWidth<e.width,b=c(e.height)&&h.maxHeight&&h.maxHeight<e.height,f=c(e.width)&&h.minWidth&&
+h.minWidth>e.width,j=c(e.height)&&h.minHeight&&h.minHeight>e.height;if(f)e.width=h.minWidth;if(j)e.height=h.minHeight;if(i)e.width=h.maxWidth;if(b)e.height=h.maxHeight;var l=this.originalPosition.left+this.originalSize.width,o=this.position.top+this.size.height,n=/sw|nw|w/.test(g);g=/nw|ne|n/.test(g);if(f&&n)e.left=l-h.minWidth;if(i&&n)e.left=l-h.maxWidth;if(j&&g)e.top=o-h.minHeight;if(b&&g)e.top=o-h.maxHeight;if((h=!e.width&&!e.height)&&!e.left&&e.top)e.top=null;else if(h&&!e.top&&e.left)e.left=
+null;return e},_proportionallyResize:function(){if(this._proportionallyResizeElements.length)for(var e=this.helper||this.element,h=0;h<this._proportionallyResizeElements.length;h++){var g=this._proportionallyResizeElements[h];if(!this.borderDif){var i=[g.css("borderTopWidth"),g.css("borderRightWidth"),g.css("borderBottomWidth"),g.css("borderLeftWidth")],b=[g.css("paddingTop"),g.css("paddingRight"),g.css("paddingBottom"),g.css("paddingLeft")];this.borderDif=a.map(i,function(f,j){f=parseInt(f,10)||
+0;j=parseInt(b[j],10)||0;return f+j})}a.browser.msie&&(a(e).is(":hidden")||a(e).parents(":hidden").length)||g.css({height:e.height()-this.borderDif[0]-this.borderDif[2]||0,width:e.width()-this.borderDif[1]-this.borderDif[3]||0})}},_renderProxy:function(){var e=this.options;this.elementOffset=this.element.offset();if(this._helper){this.helper=this.helper||a('<div style="overflow:hidden;"></div>');var h=a.browser.msie&&a.browser.version<7,g=h?1:0;h=h?2:-1;this.helper.addClass(this._helper).css({width:this.element.outerWidth()+
+h,height:this.element.outerHeight()+h,position:"absolute",left:this.elementOffset.left-g+"px",top:this.elementOffset.top-g+"px",zIndex:++e.zIndex});this.helper.appendTo("body").disableSelection()}else this.helper=this.element},_change:{e:function(e,h){return{width:this.originalSize.width+h}},w:function(e,h){return{left:this.originalPosition.left+h,width:this.originalSize.width-h}},n:function(e,h,g){return{top:this.originalPosition.top+g,height:this.originalSize.height-g}},s:function(e,h,g){return{height:this.originalSize.height+
+g}},se:function(e,h,g){return a.extend(this._change.s.apply(this,arguments),this._change.e.apply(this,[e,h,g]))},sw:function(e,h,g){return a.extend(this._change.s.apply(this,arguments),this._change.w.apply(this,[e,h,g]))},ne:function(e,h,g){return a.extend(this._change.n.apply(this,arguments),this._change.e.apply(this,[e,h,g]))},nw:function(e,h,g){return a.extend(this._change.n.apply(this,arguments),this._change.w.apply(this,[e,h,g]))}},_propagate:function(e,h){a.ui.plugin.call(this,e,[h,this.ui()]);
+e!="resize"&&this._trigger(e,h,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}}});a.extend(a.ui.resizable,{version:"1.8.14"});a.ui.plugin.add("resizable","alsoResize",{start:function(){var e=a(this).data("resizable").options,h=function(g){a(g).each(function(){var i=a(this);i.data("resizable-alsoresize",{width:parseInt(i.width(),
+10),height:parseInt(i.height(),10),left:parseInt(i.css("left"),10),top:parseInt(i.css("top"),10),position:i.css("position")})})};if(typeof e.alsoResize=="object"&&!e.alsoResize.parentNode)if(e.alsoResize.length){e.alsoResize=e.alsoResize[0];h(e.alsoResize)}else a.each(e.alsoResize,function(g){h(g)});else h(e.alsoResize)},resize:function(e,h){var g=a(this).data("resizable");e=g.options;var i=g.originalSize,b=g.originalPosition,f={height:g.size.height-i.height||0,width:g.size.width-i.width||0,top:g.position.top-
+b.top||0,left:g.position.left-b.left||0},j=function(l,o){a(l).each(function(){var n=a(this),k=a(this).data("resizable-alsoresize"),m={},p=o&&o.length?o:n.parents(h.originalElement[0]).length?["width","height"]:["width","height","top","left"];a.each(p,function(q,s){if((q=(k[s]||0)+(f[s]||0))&&q>=0)m[s]=q||null});if(a.browser.opera&&/relative/.test(n.css("position"))){g._revertToRelativePosition=true;n.css({position:"absolute",top:"auto",left:"auto"})}n.css(m)})};typeof e.alsoResize=="object"&&!e.alsoResize.nodeType?
+a.each(e.alsoResize,function(l,o){j(l,o)}):j(e.alsoResize)},stop:function(){var e=a(this).data("resizable"),h=e.options,g=function(i){a(i).each(function(){var b=a(this);b.css({position:b.data("resizable-alsoresize").position})})};if(e._revertToRelativePosition){e._revertToRelativePosition=false;typeof h.alsoResize=="object"&&!h.alsoResize.nodeType?a.each(h.alsoResize,function(i){g(i)}):g(h.alsoResize)}a(this).removeData("resizable-alsoresize")}});a.ui.plugin.add("resizable","animate",{stop:function(e){var h=
+a(this).data("resizable"),g=h.options,i=h._proportionallyResizeElements,b=i.length&&/textarea/i.test(i[0].nodeName),f=b&&a.ui.hasScroll(i[0],"left")?0:h.sizeDiff.height;b={width:h.size.width-(b?0:h.sizeDiff.width),height:h.size.height-f};f=parseInt(h.element.css("left"),10)+(h.position.left-h.originalPosition.left)||null;var j=parseInt(h.element.css("top"),10)+(h.position.top-h.originalPosition.top)||null;h.element.animate(a.extend(b,j&&f?{top:j,left:f}:{}),{duration:g.animateDuration,easing:g.animateEasing,
+step:function(){var l={width:parseInt(h.element.css("width"),10),height:parseInt(h.element.css("height"),10),top:parseInt(h.element.css("top"),10),left:parseInt(h.element.css("left"),10)};i&&i.length&&a(i[0]).css({width:l.width,height:l.height});h._updateCache(l);h._propagate("resize",e)}})}});a.ui.plugin.add("resizable","containment",{start:function(){var e=a(this).data("resizable"),h=e.element,g=e.options.containment;if(h=g instanceof a?g.get(0):/parent/.test(g)?h.parent().get(0):g){e.containerElement=
+a(h);if(/document/.test(g)||g==document){e.containerOffset={left:0,top:0};e.containerPosition={left:0,top:0};e.parentData={element:a(document),left:0,top:0,width:a(document).width(),height:a(document).height()||document.body.parentNode.scrollHeight}}else{var i=a(h),b=[];a(["Top","Right","Left","Bottom"]).each(function(l,o){b[l]=d(i.css("padding"+o))});e.containerOffset=i.offset();e.containerPosition=i.position();e.containerSize={height:i.innerHeight()-b[3],width:i.innerWidth()-b[1]};g=e.containerOffset;
+var f=e.containerSize.height,j=e.containerSize.width;j=a.ui.hasScroll(h,"left")?h.scrollWidth:j;f=a.ui.hasScroll(h)?h.scrollHeight:f;e.parentData={element:h,left:g.left,top:g.top,width:j,height:f}}}},resize:function(e){var h=a(this).data("resizable"),g=h.options,i=h.containerOffset,b=h.position;e=h._aspectRatio||e.shiftKey;var f={top:0,left:0},j=h.containerElement;if(j[0]!=document&&/static/.test(j.css("position")))f=i;if(b.left<(h._helper?i.left:0)){h.size.width+=h._helper?h.position.left-i.left:
+h.position.left-f.left;if(e)h.size.height=h.size.width/g.aspectRatio;h.position.left=g.helper?i.left:0}if(b.top<(h._helper?i.top:0)){h.size.height+=h._helper?h.position.top-i.top:h.position.top;if(e)h.size.width=h.size.height*g.aspectRatio;h.position.top=h._helper?i.top:0}h.offset.left=h.parentData.left+h.position.left;h.offset.top=h.parentData.top+h.position.top;g=Math.abs((h._helper?h.offset.left-f.left:h.offset.left-f.left)+h.sizeDiff.width);i=Math.abs((h._helper?h.offset.top-f.top:h.offset.top-
+i.top)+h.sizeDiff.height);b=h.containerElement.get(0)==h.element.parent().get(0);f=/relative|absolute/.test(h.containerElement.css("position"));if(b&&f)g-=h.parentData.left;if(g+h.size.width>=h.parentData.width){h.size.width=h.parentData.width-g;if(e)h.size.height=h.size.width/h.aspectRatio}if(i+h.size.height>=h.parentData.height){h.size.height=h.parentData.height-i;if(e)h.size.width=h.size.height*h.aspectRatio}},stop:function(){var e=a(this).data("resizable"),h=e.options,g=e.containerOffset,i=e.containerPosition,
+b=e.containerElement,f=a(e.helper),j=f.offset(),l=f.outerWidth()-e.sizeDiff.width;f=f.outerHeight()-e.sizeDiff.height;e._helper&&!h.animate&&/relative/.test(b.css("position"))&&a(this).css({left:j.left-i.left-g.left,width:l,height:f});e._helper&&!h.animate&&/static/.test(b.css("position"))&&a(this).css({left:j.left-i.left-g.left,width:l,height:f})}});a.ui.plugin.add("resizable","ghost",{start:function(){var e=a(this).data("resizable"),h=e.options,g=e.size;e.ghost=e.originalElement.clone();e.ghost.css({opacity:0.25,
+display:"block",position:"relative",height:g.height,width:g.width,margin:0,left:0,top:0}).addClass("ui-resizable-ghost").addClass(typeof h.ghost=="string"?h.ghost:"");e.ghost.appendTo(e.helper)},resize:function(){var e=a(this).data("resizable");e.ghost&&e.ghost.css({position:"relative",height:e.size.height,width:e.size.width})},stop:function(){var e=a(this).data("resizable");e.ghost&&e.helper&&e.helper.get(0).removeChild(e.ghost.get(0))}});a.ui.plugin.add("resizable","grid",{resize:function(){var e=
+a(this).data("resizable"),h=e.options,g=e.size,i=e.originalSize,b=e.originalPosition,f=e.axis;h.grid=typeof h.grid=="number"?[h.grid,h.grid]:h.grid;var j=Math.round((g.width-i.width)/(h.grid[0]||1))*(h.grid[0]||1);h=Math.round((g.height-i.height)/(h.grid[1]||1))*(h.grid[1]||1);if(/^(se|s|e)$/.test(f)){e.size.width=i.width+j;e.size.height=i.height+h}else if(/^(ne)$/.test(f)){e.size.width=i.width+j;e.size.height=i.height+h;e.position.top=b.top-h}else{if(/^(sw)$/.test(f)){e.size.width=i.width+j;e.size.height=
+i.height+h}else{e.size.width=i.width+j;e.size.height=i.height+h;e.position.top=b.top-h}e.position.left=b.left-j}}});var d=function(e){return parseInt(e,10)||0},c=function(e){return!isNaN(parseInt(e,10))}})(jQuery);
+(function(a){a.widget("ui.selectable",a.ui.mouse,{options:{appendTo:"body",autoRefresh:true,distance:0,filter:"*",tolerance:"touch"},_create:function(){var d=this;this.element.addClass("ui-selectable");this.dragged=false;var c;this.refresh=function(){c=a(d.options.filter,d.element[0]);c.each(function(){var e=a(this),h=e.offset();a.data(this,"selectable-item",{element:this,$element:e,left:h.left,top:h.top,right:h.left+e.outerWidth(),bottom:h.top+e.outerHeight(),startselected:false,selected:e.hasClass("ui-selected"),
+selecting:e.hasClass("ui-selecting"),unselecting:e.hasClass("ui-unselecting")})})};this.refresh();this.selectees=c.addClass("ui-selectee");this._mouseInit();this.helper=a("<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(d){var c=this;this.opos=[d.pageX,
+d.pageY];if(!this.options.disabled){var e=this.options;this.selectees=a(e.filter,this.element[0]);this._trigger("start",d);a(e.appendTo).append(this.helper);this.helper.css({left:d.clientX,top:d.clientY,width:0,height:0});e.autoRefresh&&this.refresh();this.selectees.filter(".ui-selected").each(function(){var h=a.data(this,"selectable-item");h.startselected=true;if(!d.metaKey){h.$element.removeClass("ui-selected");h.selected=false;h.$element.addClass("ui-unselecting");h.unselecting=true;c._trigger("unselecting",
+d,{unselecting:h.element})}});a(d.target).parents().andSelf().each(function(){var h=a.data(this,"selectable-item");if(h){var g=!d.metaKey||!h.$element.hasClass("ui-selected");h.$element.removeClass(g?"ui-unselecting":"ui-selected").addClass(g?"ui-selecting":"ui-unselecting");h.unselecting=!g;h.selecting=g;(h.selected=g)?c._trigger("selecting",d,{selecting:h.element}):c._trigger("unselecting",d,{unselecting:h.element});return false}})}},_mouseDrag:function(d){var c=this;this.dragged=true;if(!this.options.disabled){var e=
+this.options,h=this.opos[0],g=this.opos[1],i=d.pageX,b=d.pageY;if(h>i){var f=i;i=h;h=f}if(g>b){f=b;b=g;g=f}this.helper.css({left:h,top:g,width:i-h,height:b-g});this.selectees.each(function(){var j=a.data(this,"selectable-item");if(!(!j||j.element==c.element[0])){var l=false;if(e.tolerance=="touch")l=!(j.left>i||j.right<h||j.top>b||j.bottom<g);else if(e.tolerance=="fit")l=j.left>h&&j.right<i&&j.top>g&&j.bottom<b;if(l){if(j.selected){j.$element.removeClass("ui-selected");j.selected=false}if(j.unselecting){j.$element.removeClass("ui-unselecting");
+j.unselecting=false}if(!j.selecting){j.$element.addClass("ui-selecting");j.selecting=true;c._trigger("selecting",d,{selecting:j.element})}}else{if(j.selecting)if(d.metaKey&&j.startselected){j.$element.removeClass("ui-selecting");j.selecting=false;j.$element.addClass("ui-selected");j.selected=true}else{j.$element.removeClass("ui-selecting");j.selecting=false;if(j.startselected){j.$element.addClass("ui-unselecting");j.unselecting=true}c._trigger("unselecting",d,{unselecting:j.element})}if(j.selected)if(!d.metaKey&&
+!j.startselected){j.$element.removeClass("ui-selected");j.selected=false;j.$element.addClass("ui-unselecting");j.unselecting=true;c._trigger("unselecting",d,{unselecting:j.element})}}}});return false}},_mouseStop:function(d){var c=this;this.dragged=false;a(".ui-unselecting",this.element[0]).each(function(){var e=a.data(this,"selectable-item");e.$element.removeClass("ui-unselecting");e.unselecting=false;e.startselected=false;c._trigger("unselected",d,{unselected:e.element})});a(".ui-selecting",this.element[0]).each(function(){var e=
+a.data(this,"selectable-item");e.$element.removeClass("ui-selecting").addClass("ui-selected");e.selecting=false;e.selected=true;e.startselected=true;c._trigger("selected",d,{selected:e.element})});this._trigger("stop",d);this.helper.remove();return false}});a.extend(a.ui.selectable,{version:"1.8.14"})})(jQuery);
+(function(a){a.widget("ui.sortable",a.ui.mouse,{widgetEventPrefix:"sort",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:1E3},_create:function(){var d=this.options;this.containerCache={};this.element.addClass("ui-sortable");
+this.refresh();this.floating=this.items.length?d.axis==="x"||/left|right/.test(this.items[0].item.css("float"))||/inline|table-cell/.test(this.items[0].item.css("display")):false;this.offset=this.element.offset();this._mouseInit()},destroy:function(){this.element.removeClass("ui-sortable ui-sortable-disabled").removeData("sortable").unbind(".sortable");this._mouseDestroy();for(var d=this.items.length-1;d>=0;d--)this.items[d].item.removeData("sortable-item");return this},_setOption:function(d,c){if(d===
+"disabled"){this.options[d]=c;this.widget()[c?"addClass":"removeClass"]("ui-sortable-disabled")}else a.Widget.prototype._setOption.apply(this,arguments)},_mouseCapture:function(d,c){if(this.reverting)return false;if(this.options.disabled||this.options.type=="static")return false;this._refreshItems(d);var e=null,h=this;a(d.target).parents().each(function(){if(a.data(this,"sortable-item")==h){e=a(this);return false}});if(a.data(d.target,"sortable-item")==h)e=a(d.target);if(!e)return false;if(this.options.handle&&
+!c){var g=false;a(this.options.handle,e).find("*").andSelf().each(function(){if(this==d.target)g=true});if(!g)return false}this.currentItem=e;this._removeCurrentsFromItems();return true},_mouseStart:function(d,c,e){c=this.options;var h=this;this.currentContainer=this;this.refreshPositions();this.helper=this._createHelper(d);this._cacheHelperProportions();this._cacheMargins();this.scrollParent=this.helper.scrollParent();this.offset=this.currentItem.offset();this.offset={top:this.offset.top-this.margins.top,
+left:this.offset.left-this.margins.left};this.helper.css("position","absolute");this.cssPosition=this.helper.css("position");a.extend(this.offset,{click:{left:d.pageX-this.offset.left,top:d.pageY-this.offset.top},parent:this._getParentOffset(),relative:this._getRelativeOffset()});this.originalPosition=this._generatePosition(d);this.originalPageX=d.pageX;this.originalPageY=d.pageY;c.cursorAt&&this._adjustOffsetFromHelper(c.cursorAt);this.domPosition={prev:this.currentItem.prev()[0],parent:this.currentItem.parent()[0]};
+this.helper[0]!=this.currentItem[0]&&this.currentItem.hide();this._createPlaceholder();c.containment&&this._setContainment();if(c.cursor){if(a("body").css("cursor"))this._storedCursor=a("body").css("cursor");a("body").css("cursor",c.cursor)}if(c.opacity){if(this.helper.css("opacity"))this._storedOpacity=this.helper.css("opacity");this.helper.css("opacity",c.opacity)}if(c.zIndex){if(this.helper.css("zIndex"))this._storedZIndex=this.helper.css("zIndex");this.helper.css("zIndex",c.zIndex)}if(this.scrollParent[0]!=
+document&&this.scrollParent[0].tagName!="HTML")this.overflowOffset=this.scrollParent.offset();this._trigger("start",d,this._uiHash());this._preserveHelperProportions||this._cacheHelperProportions();if(!e)for(e=this.containers.length-1;e>=0;e--)this.containers[e]._trigger("activate",d,h._uiHash(this));if(a.ui.ddmanager)a.ui.ddmanager.current=this;a.ui.ddmanager&&!c.dropBehaviour&&a.ui.ddmanager.prepareOffsets(this,d);this.dragging=true;this.helper.addClass("ui-sortable-helper");this._mouseDrag(d);
+return true},_mouseDrag:function(d){this.position=this._generatePosition(d);this.positionAbs=this._convertPositionTo("absolute");if(!this.lastPositionAbs)this.lastPositionAbs=this.positionAbs;if(this.options.scroll){var c=this.options,e=false;if(this.scrollParent[0]!=document&&this.scrollParent[0].tagName!="HTML"){if(this.overflowOffset.top+this.scrollParent[0].offsetHeight-d.pageY<c.scrollSensitivity)this.scrollParent[0].scrollTop=e=this.scrollParent[0].scrollTop+c.scrollSpeed;else if(d.pageY-this.overflowOffset.top<
+c.scrollSensitivity)this.scrollParent[0].scrollTop=e=this.scrollParent[0].scrollTop-c.scrollSpeed;if(this.overflowOffset.left+this.scrollParent[0].offsetWidth-d.pageX<c.scrollSensitivity)this.scrollParent[0].scrollLeft=e=this.scrollParent[0].scrollLeft+c.scrollSpeed;else if(d.pageX-this.overflowOffset.left<c.scrollSensitivity)this.scrollParent[0].scrollLeft=e=this.scrollParent[0].scrollLeft-c.scrollSpeed}else{if(d.pageY-a(document).scrollTop()<c.scrollSensitivity)e=a(document).scrollTop(a(document).scrollTop()-
+c.scrollSpeed);else if(a(window).height()-(d.pageY-a(document).scrollTop())<c.scrollSensitivity)e=a(document).scrollTop(a(document).scrollTop()+c.scrollSpeed);if(d.pageX-a(document).scrollLeft()<c.scrollSensitivity)e=a(document).scrollLeft(a(document).scrollLeft()-c.scrollSpeed);else if(a(window).width()-(d.pageX-a(document).scrollLeft())<c.scrollSensitivity)e=a(document).scrollLeft(a(document).scrollLeft()+c.scrollSpeed)}e!==false&&a.ui.ddmanager&&!c.dropBehaviour&&a.ui.ddmanager.prepareOffsets(this,
+d)}this.positionAbs=this._convertPositionTo("absolute");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";for(c=this.items.length-1;c>=0;c--){e=this.items[c];var h=e.item[0],g=this._intersectsWithPointer(e);if(g)if(h!=this.currentItem[0]&&this.placeholder[g==1?"next":"prev"]()[0]!=h&&!a.ui.contains(this.placeholder[0],h)&&(this.options.type=="semi-dynamic"?!a.ui.contains(this.element[0],
+h):true)){this.direction=g==1?"down":"up";if(this.options.tolerance=="pointer"||this._intersectsWithSides(e))this._rearrange(d,e);else break;this._trigger("change",d,this._uiHash());break}}this._contactContainers(d);a.ui.ddmanager&&a.ui.ddmanager.drag(this,d);this._trigger("sort",d,this._uiHash());this.lastPositionAbs=this.positionAbs;return false},_mouseStop:function(d,c){if(d){a.ui.ddmanager&&!this.options.dropBehaviour&&a.ui.ddmanager.drop(this,d);if(this.options.revert){var e=this;c=e.placeholder.offset();
+e.reverting=true;a(this.helper).animate({left:c.left-this.offset.parent.left-e.margins.left+(this.offsetParent[0]==document.body?0:this.offsetParent[0].scrollLeft),top:c.top-this.offset.parent.top-e.margins.top+(this.offsetParent[0]==document.body?0:this.offsetParent[0].scrollTop)},parseInt(this.options.revert,10)||500,function(){e._clear(d)})}else this._clear(d,c);return false}},cancel:function(){var d=this;if(this.dragging){this._mouseUp({target:null});this.options.helper=="original"?this.currentItem.css(this._storedCSS).removeClass("ui-sortable-helper"):
+this.currentItem.show();for(var c=this.containers.length-1;c>=0;c--){this.containers[c]._trigger("deactivate",null,d._uiHash(this));if(this.containers[c].containerCache.over){this.containers[c]._trigger("out",null,d._uiHash(this));this.containers[c].containerCache.over=0}}}if(this.placeholder){this.placeholder[0].parentNode&&this.placeholder[0].parentNode.removeChild(this.placeholder[0]);this.options.helper!="original"&&this.helper&&this.helper[0].parentNode&&this.helper.remove();a.extend(this,{helper:null,
+dragging:false,reverting:false,_noFinalSort:null});this.domPosition.prev?a(this.domPosition.prev).after(this.currentItem):a(this.domPosition.parent).prepend(this.currentItem)}return this},serialize:function(d){var c=this._getItemsAsjQuery(d&&d.connected),e=[];d=d||{};a(c).each(function(){var h=(a(d.item||this).attr(d.attribute||"id")||"").match(d.expression||/(.+)[-=_](.+)/);if(h)e.push((d.key||h[1]+"[]")+"="+(d.key&&d.expression?h[1]:h[2]))});!e.length&&d.key&&e.push(d.key+"=");return e.join("&")},
+toArray:function(d){var c=this._getItemsAsjQuery(d&&d.connected),e=[];d=d||{};c.each(function(){e.push(a(d.item||this).attr(d.attribute||"id")||"")});return e},_intersectsWith:function(d){var c=this.positionAbs.left,e=c+this.helperProportions.width,h=this.positionAbs.top,g=h+this.helperProportions.height,i=d.left,b=i+d.width,f=d.top,j=f+d.height,l=this.offset.click.top,o=this.offset.click.left;l=h+l>f&&h+l<j&&c+o>i&&c+o<b;return this.options.tolerance=="pointer"||this.options.forcePointerForContainers||
+this.options.tolerance!="pointer"&&this.helperProportions[this.floating?"width":"height"]>d[this.floating?"width":"height"]?l:i<c+this.helperProportions.width/2&&e-this.helperProportions.width/2<b&&f<h+this.helperProportions.height/2&&g-this.helperProportions.height/2<j},_intersectsWithPointer:function(d){var c=a.ui.isOverAxis(this.positionAbs.top+this.offset.click.top,d.top,d.height);d=a.ui.isOverAxis(this.positionAbs.left+this.offset.click.left,d.left,d.width);c=c&&d;d=this._getDragVerticalDirection();
+var e=this._getDragHorizontalDirection();if(!c)return false;return this.floating?e&&e=="right"||d=="down"?2:1:d&&(d=="down"?2:1)},_intersectsWithSides:function(d){var c=a.ui.isOverAxis(this.positionAbs.top+this.offset.click.top,d.top+d.height/2,d.height);d=a.ui.isOverAxis(this.positionAbs.left+this.offset.click.left,d.left+d.width/2,d.width);var e=this._getDragVerticalDirection(),h=this._getDragHorizontalDirection();return this.floating&&h?h=="right"&&d||h=="left"&&!d:e&&(e=="down"&&c||e=="up"&&!c)},
+_getDragVerticalDirection:function(){var d=this.positionAbs.top-this.lastPositionAbs.top;return d!=0&&(d>0?"down":"up")},_getDragHorizontalDirection:function(){var d=this.positionAbs.left-this.lastPositionAbs.left;return d!=0&&(d>0?"right":"left")},refresh:function(d){this._refreshItems(d);this.refreshPositions();return this},_connectWith:function(){var d=this.options;return d.connectWith.constructor==String?[d.connectWith]:d.connectWith},_getItemsAsjQuery:function(d){var c=[],e=[],h=this._connectWith();
+if(h&&d)for(d=h.length-1;d>=0;d--)for(var g=a(h[d]),i=g.length-1;i>=0;i--){var b=a.data(g[i],"sortable");if(b&&b!=this&&!b.options.disabled)e.push([a.isFunction(b.options.items)?b.options.items.call(b.element):a(b.options.items,b.element).not(".ui-sortable-helper").not(".ui-sortable-placeholder"),b])}e.push([a.isFunction(this.options.items)?this.options.items.call(this.element,null,{options:this.options,item:this.currentItem}):a(this.options.items,this.element).not(".ui-sortable-helper").not(".ui-sortable-placeholder"),
+this]);for(d=e.length-1;d>=0;d--)e[d][0].each(function(){c.push(this)});return a(c)},_removeCurrentsFromItems:function(){for(var d=this.currentItem.find(":data(sortable-item)"),c=0;c<this.items.length;c++)for(var e=0;e<d.length;e++)d[e]==this.items[c].item[0]&&this.items.splice(c,1)},_refreshItems:function(d){this.items=[];this.containers=[this];var c=this.items,e=[[a.isFunction(this.options.items)?this.options.items.call(this.element[0],d,{item:this.currentItem}):a(this.options.items,this.element),
+this]],h=this._connectWith();if(h)for(var g=h.length-1;g>=0;g--)for(var i=a(h[g]),b=i.length-1;b>=0;b--){var f=a.data(i[b],"sortable");if(f&&f!=this&&!f.options.disabled){e.push([a.isFunction(f.options.items)?f.options.items.call(f.element[0],d,{item:this.currentItem}):a(f.options.items,f.element),f]);this.containers.push(f)}}for(g=e.length-1;g>=0;g--){d=e[g][1];h=e[g][0];b=0;for(i=h.length;b<i;b++){f=a(h[b]);f.data("sortable-item",d);c.push({item:f,instance:d,width:0,height:0,left:0,top:0})}}},refreshPositions:function(d){if(this.offsetParent&&
+this.helper)this.offset.parent=this._getParentOffset();for(var c=this.items.length-1;c>=0;c--){var e=this.items[c];if(!(e.instance!=this.currentContainer&&this.currentContainer&&e.item[0]!=this.currentItem[0])){var h=this.options.toleranceElement?a(this.options.toleranceElement,e.item):e.item;if(!d){e.width=h.outerWidth();e.height=h.outerHeight()}h=h.offset();e.left=h.left;e.top=h.top}}if(this.options.custom&&this.options.custom.refreshContainers)this.options.custom.refreshContainers.call(this);else for(c=
+this.containers.length-1;c>=0;c--){h=this.containers[c].element.offset();this.containers[c].containerCache.left=h.left;this.containers[c].containerCache.top=h.top;this.containers[c].containerCache.width=this.containers[c].element.outerWidth();this.containers[c].containerCache.height=this.containers[c].element.outerHeight()}return this},_createPlaceholder:function(d){var c=d||this,e=c.options;if(!e.placeholder||e.placeholder.constructor==String){var h=e.placeholder;e.placeholder={element:function(){var g=
+a(document.createElement(c.currentItem[0].nodeName)).addClass(h||c.currentItem[0].className+" ui-sortable-placeholder").removeClass("ui-sortable-helper")[0];if(!h)g.style.visibility="hidden";return g},update:function(g,i){if(!(h&&!e.forcePlaceholderSize)){i.height()||i.height(c.currentItem.innerHeight()-parseInt(c.currentItem.css("paddingTop")||0,10)-parseInt(c.currentItem.css("paddingBottom")||0,10));i.width()||i.width(c.currentItem.innerWidth()-parseInt(c.currentItem.css("paddingLeft")||0,10)-parseInt(c.currentItem.css("paddingRight")||
+0,10))}}}}c.placeholder=a(e.placeholder.element.call(c.element,c.currentItem));c.currentItem.after(c.placeholder);e.placeholder.update(c,c.placeholder)},_contactContainers:function(d){for(var c=null,e=null,h=this.containers.length-1;h>=0;h--)if(!a.ui.contains(this.currentItem[0],this.containers[h].element[0]))if(this._intersectsWith(this.containers[h].containerCache)){if(!(c&&a.ui.contains(this.containers[h].element[0],c.element[0]))){c=this.containers[h];e=h}}else if(this.containers[h].containerCache.over){this.containers[h]._trigger("out",
+d,this._uiHash(this));this.containers[h].containerCache.over=0}if(c)if(this.containers.length===1){this.containers[e]._trigger("over",d,this._uiHash(this));this.containers[e].containerCache.over=1}else if(this.currentContainer!=this.containers[e]){c=1E4;h=null;for(var g=this.positionAbs[this.containers[e].floating?"left":"top"],i=this.items.length-1;i>=0;i--)if(a.ui.contains(this.containers[e].element[0],this.items[i].item[0])){var b=this.items[i][this.containers[e].floating?"left":"top"];if(Math.abs(b-
+g)<c){c=Math.abs(b-g);h=this.items[i]}}if(h||this.options.dropOnEmpty){this.currentContainer=this.containers[e];h?this._rearrange(d,h,null,true):this._rearrange(d,null,this.containers[e].element,true);this._trigger("change",d,this._uiHash());this.containers[e]._trigger("change",d,this._uiHash(this));this.options.placeholder.update(this.currentContainer,this.placeholder);this.containers[e]._trigger("over",d,this._uiHash(this));this.containers[e].containerCache.over=1}}},_createHelper:function(d){var c=
+this.options;d=a.isFunction(c.helper)?a(c.helper.apply(this.element[0],[d,this.currentItem])):c.helper=="clone"?this.currentItem.clone():this.currentItem;d.parents("body").length||a(c.appendTo!="parent"?c.appendTo:this.currentItem[0].parentNode)[0].appendChild(d[0]);if(d[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(d[0].style.width==
+""||c.forceHelperSize)d.width(this.currentItem.width());if(d[0].style.height==""||c.forceHelperSize)d.height(this.currentItem.height());return d},_adjustOffsetFromHelper:function(d){if(typeof d=="string")d=d.split(" ");if(a.isArray(d))d={left:+d[0],top:+d[1]||0};if("left"in d)this.offset.click.left=d.left+this.margins.left;if("right"in d)this.offset.click.left=this.helperProportions.width-d.right+this.margins.left;if("top"in d)this.offset.click.top=d.top+this.margins.top;if("bottom"in d)this.offset.click.top=
+this.helperProportions.height-d.bottom+this.margins.top},_getParentOffset:function(){this.offsetParent=this.helper.offsetParent();var d=this.offsetParent.offset();if(this.cssPosition=="absolute"&&this.scrollParent[0]!=document&&a.ui.contains(this.scrollParent[0],this.offsetParent[0])){d.left+=this.scrollParent.scrollLeft();d.top+=this.scrollParent.scrollTop()}if(this.offsetParent[0]==document.body||this.offsetParent[0].tagName&&this.offsetParent[0].tagName.toLowerCase()=="html"&&a.browser.msie)d=
+{top:0,left:0};return{top:d.top+(parseInt(this.offsetParent.css("borderTopWidth"),10)||0),left:d.left+(parseInt(this.offsetParent.css("borderLeftWidth"),10)||0)}},_getRelativeOffset:function(){if(this.cssPosition=="relative"){var d=this.currentItem.position();return{top:d.top-(parseInt(this.helper.css("top"),10)||0)+this.scrollParent.scrollTop(),left:d.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 d=this.options;if(d.containment=="parent")d.containment=this.helper[0].parentNode;if(d.containment=="document"||d.containment=="window")this.containment=[0-this.offset.relative.left-this.offset.parent.left,0-this.offset.relative.top-this.offset.parent.top,a(d.containment=="document"?
+document:window).width()-this.helperProportions.width-this.margins.left,(a(d.containment=="document"?document:window).height()||document.body.parentNode.scrollHeight)-this.helperProportions.height-this.margins.top];if(!/^(document|window|parent)$/.test(d.containment)){var c=a(d.containment)[0];d=a(d.containment).offset();var e=a(c).css("overflow")!="hidden";this.containment=[d.left+(parseInt(a(c).css("borderLeftWidth"),10)||0)+(parseInt(a(c).css("paddingLeft"),10)||0)-this.margins.left,d.top+(parseInt(a(c).css("borderTopWidth"),
+10)||0)+(parseInt(a(c).css("paddingTop"),10)||0)-this.margins.top,d.left+(e?Math.max(c.scrollWidth,c.offsetWidth):c.offsetWidth)-(parseInt(a(c).css("borderLeftWidth"),10)||0)-(parseInt(a(c).css("paddingRight"),10)||0)-this.helperProportions.width-this.margins.left,d.top+(e?Math.max(c.scrollHeight,c.offsetHeight):c.offsetHeight)-(parseInt(a(c).css("borderTopWidth"),10)||0)-(parseInt(a(c).css("paddingBottom"),10)||0)-this.helperProportions.height-this.margins.top]}},_convertPositionTo:function(d,c){if(!c)c=
+this.position;d=d=="absolute"?1:-1;var e=this.cssPosition=="absolute"&&!(this.scrollParent[0]!=document&&a.ui.contains(this.scrollParent[0],this.offsetParent[0]))?this.offsetParent:this.scrollParent,h=/(html|body)/i.test(e[0].tagName);return{top:c.top+this.offset.relative.top*d+this.offset.parent.top*d-(a.browser.safari&&this.cssPosition=="fixed"?0:(this.cssPosition=="fixed"?-this.scrollParent.scrollTop():h?0:e.scrollTop())*d),left:c.left+this.offset.relative.left*d+this.offset.parent.left*d-(a.browser.safari&&
+this.cssPosition=="fixed"?0:(this.cssPosition=="fixed"?-this.scrollParent.scrollLeft():h?0:e.scrollLeft())*d)}},_generatePosition:function(d){var c=this.options,e=this.cssPosition=="absolute"&&!(this.scrollParent[0]!=document&&a.ui.contains(this.scrollParent[0],this.offsetParent[0]))?this.offsetParent:this.scrollParent,h=/(html|body)/i.test(e[0].tagName);if(this.cssPosition=="relative"&&!(this.scrollParent[0]!=document&&this.scrollParent[0]!=this.offsetParent[0]))this.offset.relative=this._getRelativeOffset();
+var g=d.pageX,i=d.pageY;if(this.originalPosition){if(this.containment){if(d.pageX-this.offset.click.left<this.containment[0])g=this.containment[0]+this.offset.click.left;if(d.pageY-this.offset.click.top<this.containment[1])i=this.containment[1]+this.offset.click.top;if(d.pageX-this.offset.click.left>this.containment[2])g=this.containment[2]+this.offset.click.left;if(d.pageY-this.offset.click.top>this.containment[3])i=this.containment[3]+this.offset.click.top}if(c.grid){i=this.originalPageY+Math.round((i-
+this.originalPageY)/c.grid[1])*c.grid[1];i=this.containment?!(i-this.offset.click.top<this.containment[1]||i-this.offset.click.top>this.containment[3])?i:!(i-this.offset.click.top<this.containment[1])?i-c.grid[1]:i+c.grid[1]:i;g=this.originalPageX+Math.round((g-this.originalPageX)/c.grid[0])*c.grid[0];g=this.containment?!(g-this.offset.click.left<this.containment[0]||g-this.offset.click.left>this.containment[2])?g:!(g-this.offset.click.left<this.containment[0])?g-c.grid[0]:g+c.grid[0]:g}}return{top:i-
+this.offset.click.top-this.offset.relative.top-this.offset.parent.top+(a.browser.safari&&this.cssPosition=="fixed"?0:this.cssPosition=="fixed"?-this.scrollParent.scrollTop():h?0:e.scrollTop()),left:g-this.offset.click.left-this.offset.relative.left-this.offset.parent.left+(a.browser.safari&&this.cssPosition=="fixed"?0:this.cssPosition=="fixed"?-this.scrollParent.scrollLeft():h?0:e.scrollLeft())}},_rearrange:function(d,c,e,h){e?e[0].appendChild(this.placeholder[0]):c.item[0].parentNode.insertBefore(this.placeholder[0],
+this.direction=="down"?c.item[0]:c.item[0].nextSibling);this.counter=this.counter?++this.counter:1;var g=this,i=this.counter;window.setTimeout(function(){i==g.counter&&g.refreshPositions(!h)},0)},_clear:function(d,c){this.reverting=false;var e=[];!this._noFinalSort&&this.currentItem.parent().length&&this.placeholder.before(this.currentItem);this._noFinalSort=null;if(this.helper[0]==this.currentItem[0]){for(var h in this._storedCSS)if(this._storedCSS[h]=="auto"||this._storedCSS[h]=="static")this._storedCSS[h]=
+"";this.currentItem.css(this._storedCSS).removeClass("ui-sortable-helper")}else this.currentItem.show();this.fromOutside&&!c&&e.push(function(g){this._trigger("receive",g,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])&&!c)e.push(function(g){this._trigger("update",g,this._uiHash())});if(!a.ui.contains(this.element[0],this.currentItem[0])){c||e.push(function(g){this._trigger("remove",
+g,this._uiHash())});for(h=this.containers.length-1;h>=0;h--)if(a.ui.contains(this.containers[h].element[0],this.currentItem[0])&&!c){e.push(function(g){return function(i){g._trigger("receive",i,this._uiHash(this))}}.call(this,this.containers[h]));e.push(function(g){return function(i){g._trigger("update",i,this._uiHash(this))}}.call(this,this.containers[h]))}}for(h=this.containers.length-1;h>=0;h--){c||e.push(function(g){return function(i){g._trigger("deactivate",i,this._uiHash(this))}}.call(this,
+this.containers[h]));if(this.containers[h].containerCache.over){e.push(function(g){return function(i){g._trigger("out",i,this._uiHash(this))}}.call(this,this.containers[h]));this.containers[h].containerCache.over=0}}this._storedCursor&&a("body").css("cursor",this._storedCursor);this._storedOpacity&&this.helper.css("opacity",this._storedOpacity);if(this._storedZIndex)this.helper.css("zIndex",this._storedZIndex=="auto"?"":this._storedZIndex);this.dragging=false;if(this.cancelHelperRemoval){if(!c){this._trigger("beforeStop",
+d,this._uiHash());for(h=0;h<e.length;h++)e[h].call(this,d);this._trigger("stop",d,this._uiHash())}return false}c||this._trigger("beforeStop",d,this._uiHash());this.placeholder[0].parentNode.removeChild(this.placeholder[0]);this.helper[0]!=this.currentItem[0]&&this.helper.remove();this.helper=null;if(!c){for(h=0;h<e.length;h++)e[h].call(this,d);this._trigger("stop",d,this._uiHash())}this.fromOutside=false;return true},_trigger:function(){a.Widget.prototype._trigger.apply(this,arguments)===false&&this.cancel()},
+_uiHash:function(d){var c=d||this;return{helper:c.helper,placeholder:c.placeholder||a([]),position:c.position,originalPosition:c.originalPosition,offset:c.positionAbs,item:c.currentItem,sender:d?d.element:null}}});a.extend(a.ui.sortable,{version:"1.8.14"})})(jQuery);
+jQuery.effects||function(a,d){function c(n){var k;if(n&&n.constructor==Array&&n.length==3)return n;if(k=/rgb\(\s*([0-9]{1,3})\s*,\s*([0-9]{1,3})\s*,\s*([0-9]{1,3})\s*\)/.exec(n))return[parseInt(k[1],10),parseInt(k[2],10),parseInt(k[3],10)];if(k=/rgb\(\s*([0-9]+(?:\.[0-9]+)?)\%\s*,\s*([0-9]+(?:\.[0-9]+)?)\%\s*,\s*([0-9]+(?:\.[0-9]+)?)\%\s*\)/.exec(n))return[parseFloat(k[1])*2.55,parseFloat(k[2])*2.55,parseFloat(k[3])*2.55];if(k=/#([a-fA-F0-9]{2})([a-fA-F0-9]{2})([a-fA-F0-9]{2})/.exec(n))return[parseInt(k[1],
+16),parseInt(k[2],16),parseInt(k[3],16)];if(k=/#([a-fA-F0-9])([a-fA-F0-9])([a-fA-F0-9])/.exec(n))return[parseInt(k[1]+k[1],16),parseInt(k[2]+k[2],16),parseInt(k[3]+k[3],16)];if(/rgba\(0, 0, 0, 0\)/.exec(n))return j.transparent;return j[a.trim(n).toLowerCase()]}function e(n,k){var m;do{m=a.curCSS(n,k);if(m!=""&&m!="transparent"||a.nodeName(n,"body"))break;k="backgroundColor"}while(n=n.parentNode);return c(m)}function h(){var n=document.defaultView?document.defaultView.getComputedStyle(this,null):this.currentStyle,
+k={},m,p;if(n&&n.length&&n[0]&&n[n[0]])for(var q=n.length;q--;){m=n[q];if(typeof n[m]=="string"){p=m.replace(/\-(\w)/g,function(s,r){return r.toUpperCase()});k[p]=n[m]}}else for(m in n)if(typeof n[m]==="string")k[m]=n[m];return k}function g(n){var k,m;for(k in n){m=n[k];if(m==null||a.isFunction(m)||k in o||/scrollbar/.test(k)||!/color/i.test(k)&&isNaN(parseFloat(m)))delete n[k]}return n}function i(n,k){var m={_:0},p;for(p in k)if(n[p]!=k[p])m[p]=k[p];return m}function b(n,k,m,p){if(typeof n=="object"){p=
+k;m=null;k=n;n=k.effect}if(a.isFunction(k)){p=k;m=null;k={}}if(typeof k=="number"||a.fx.speeds[k]){p=m;m=k;k={}}if(a.isFunction(m)){p=m;m=null}k=k||{};m=m||k.duration;m=a.fx.off?0:typeof m=="number"?m:m in a.fx.speeds?a.fx.speeds[m]:a.fx.speeds._default;p=p||k.complete;return[n,k,m,p]}function f(n){if(!n||typeof n==="number"||a.fx.speeds[n])return true;if(typeof n==="string"&&!a.effects[n])return true;return false}a.effects={};a.each(["backgroundColor","borderBottomColor","borderLeftColor","borderRightColor",
+"borderTopColor","borderColor","color","outlineColor"],function(n,k){a.fx.step[k]=function(m){if(!m.colorInit){m.start=e(m.elem,k);m.end=c(m.end);m.colorInit=true}m.elem.style[k]="rgb("+Math.max(Math.min(parseInt(m.pos*(m.end[0]-m.start[0])+m.start[0],10),255),0)+","+Math.max(Math.min(parseInt(m.pos*(m.end[1]-m.start[1])+m.start[1],10),255),0)+","+Math.max(Math.min(parseInt(m.pos*(m.end[2]-m.start[2])+m.start[2],10),255),0)+")"}});var j={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]},l=["add","remove","toggle"],o={border:1,borderBottom:1,borderColor:1,borderLeft:1,borderRight:1,borderTop:1,borderWidth:1,margin:1,padding:1};a.effects.animateClass=function(n,k,m,
+p){if(a.isFunction(m)){p=m;m=null}return this.queue(function(){var q=a(this),s=q.attr("style")||" ",r=g(h.call(this)),u,v=q.attr("class");a.each(l,function(w,x){n[x]&&q[x+"Class"](n[x])});u=g(h.call(this));q.attr("class",v);q.animate(i(r,u),{queue:false,duration:k,easing:m,complete:function(){a.each(l,function(w,x){n[x]&&q[x+"Class"](n[x])});if(typeof q.attr("style")=="object"){q.attr("style").cssText="";q.attr("style").cssText=s}else q.attr("style",s);p&&p.apply(this,arguments);a.dequeue(this)}})})};
+a.fn.extend({_addClass:a.fn.addClass,addClass:function(n,k,m,p){return k?a.effects.animateClass.apply(this,[{add:n},k,m,p]):this._addClass(n)},_removeClass:a.fn.removeClass,removeClass:function(n,k,m,p){return k?a.effects.animateClass.apply(this,[{remove:n},k,m,p]):this._removeClass(n)},_toggleClass:a.fn.toggleClass,toggleClass:function(n,k,m,p,q){return typeof k=="boolean"||k===d?m?a.effects.animateClass.apply(this,[k?{add:n}:{remove:n},m,p,q]):this._toggleClass(n,k):a.effects.animateClass.apply(this,
+[{toggle:n},k,m,p])},switchClass:function(n,k,m,p,q){return a.effects.animateClass.apply(this,[{add:k,remove:n},m,p,q])}});a.extend(a.effects,{version:"1.8.14",save:function(n,k){for(var m=0;m<k.length;m++)k[m]!==null&&n.data("ec.storage."+k[m],n[0].style[k[m]])},restore:function(n,k){for(var m=0;m<k.length;m++)k[m]!==null&&n.css(k[m],n.data("ec.storage."+k[m]))},setMode:function(n,k){if(k=="toggle")k=n.is(":hidden")?"show":"hide";return k},getBaseline:function(n,k){var m;switch(n[0]){case "top":m=
+0;break;case "middle":m=0.5;break;case "bottom":m=1;break;default:m=n[0]/k.height}switch(n[1]){case "left":n=0;break;case "center":n=0.5;break;case "right":n=1;break;default:n=n[1]/k.width}return{x:n,y:m}},createWrapper:function(n){if(n.parent().is(".ui-effects-wrapper"))return n.parent();var k={width:n.outerWidth(true),height:n.outerHeight(true),"float":n.css("float")},m=a("<div></div>").addClass("ui-effects-wrapper").css({fontSize:"100%",background:"transparent",border:"none",margin:0,padding:0});
+n.wrap(m);m=n.parent();if(n.css("position")=="static"){m.css({position:"relative"});n.css({position:"relative"})}else{a.extend(k,{position:n.css("position"),zIndex:n.css("z-index")});a.each(["top","left","bottom","right"],function(p,q){k[q]=n.css(q);if(isNaN(parseInt(k[q],10)))k[q]="auto"});n.css({position:"relative",top:0,left:0,right:"auto",bottom:"auto"})}return m.css(k).show()},removeWrapper:function(n){if(n.parent().is(".ui-effects-wrapper"))return n.parent().replaceWith(n);return n},setTransition:function(n,
+k,m,p){p=p||{};a.each(k,function(q,s){unit=n.cssUnit(s);if(unit[0]>0)p[s]=unit[0]*m+unit[1]});return p}});a.fn.extend({effect:function(n){var k=b.apply(this,arguments),m={options:k[1],duration:k[2],callback:k[3]};k=m.options.mode;var p=a.effects[n];if(a.fx.off||!p)return k?this[k](m.duration,m.callback):this.each(function(){m.callback&&m.callback.call(this)});return p.call(this,m)},_show:a.fn.show,show:function(n){if(f(n))return this._show.apply(this,arguments);else{var k=b.apply(this,arguments);
+k[1].mode="show";return this.effect.apply(this,k)}},_hide:a.fn.hide,hide:function(n){if(f(n))return this._hide.apply(this,arguments);else{var k=b.apply(this,arguments);k[1].mode="hide";return this.effect.apply(this,k)}},__toggle:a.fn.toggle,toggle:function(n){if(f(n)||typeof n==="boolean"||a.isFunction(n))return this.__toggle.apply(this,arguments);else{var k=b.apply(this,arguments);k[1].mode="toggle";return this.effect.apply(this,k)}},cssUnit:function(n){var k=this.css(n),m=[];a.each(["em","px","%",
+"pt"],function(p,q){if(k.indexOf(q)>0)m=[parseFloat(k),q]});return m}});a.easing.jswing=a.easing.swing;a.extend(a.easing,{def:"easeOutQuad",swing:function(n,k,m,p,q){return a.easing[a.easing.def](n,k,m,p,q)},easeInQuad:function(n,k,m,p,q){return p*(k/=q)*k+m},easeOutQuad:function(n,k,m,p,q){return-p*(k/=q)*(k-2)+m},easeInOutQuad:function(n,k,m,p,q){if((k/=q/2)<1)return p/2*k*k+m;return-p/2*(--k*(k-2)-1)+m},easeInCubic:function(n,k,m,p,q){return p*(k/=q)*k*k+m},easeOutCubic:function(n,k,m,p,q){return p*
+((k=k/q-1)*k*k+1)+m},easeInOutCubic:function(n,k,m,p,q){if((k/=q/2)<1)return p/2*k*k*k+m;return p/2*((k-=2)*k*k+2)+m},easeInQuart:function(n,k,m,p,q){return p*(k/=q)*k*k*k+m},easeOutQuart:function(n,k,m,p,q){return-p*((k=k/q-1)*k*k*k-1)+m},easeInOutQuart:function(n,k,m,p,q){if((k/=q/2)<1)return p/2*k*k*k*k+m;return-p/2*((k-=2)*k*k*k-2)+m},easeInQuint:function(n,k,m,p,q){return p*(k/=q)*k*k*k*k+m},easeOutQuint:function(n,k,m,p,q){return p*((k=k/q-1)*k*k*k*k+1)+m},easeInOutQuint:function(n,k,m,p,q){if((k/=
+q/2)<1)return p/2*k*k*k*k*k+m;return p/2*((k-=2)*k*k*k*k+2)+m},easeInSine:function(n,k,m,p,q){return-p*Math.cos(k/q*(Math.PI/2))+p+m},easeOutSine:function(n,k,m,p,q){return p*Math.sin(k/q*(Math.PI/2))+m},easeInOutSine:function(n,k,m,p,q){return-p/2*(Math.cos(Math.PI*k/q)-1)+m},easeInExpo:function(n,k,m,p,q){return k==0?m:p*Math.pow(2,10*(k/q-1))+m},easeOutExpo:function(n,k,m,p,q){return k==q?m+p:p*(-Math.pow(2,-10*k/q)+1)+m},easeInOutExpo:function(n,k,m,p,q){if(k==0)return m;if(k==q)return m+p;if((k/=
+q/2)<1)return p/2*Math.pow(2,10*(k-1))+m;return p/2*(-Math.pow(2,-10*--k)+2)+m},easeInCirc:function(n,k,m,p,q){return-p*(Math.sqrt(1-(k/=q)*k)-1)+m},easeOutCirc:function(n,k,m,p,q){return p*Math.sqrt(1-(k=k/q-1)*k)+m},easeInOutCirc:function(n,k,m,p,q){if((k/=q/2)<1)return-p/2*(Math.sqrt(1-k*k)-1)+m;return p/2*(Math.sqrt(1-(k-=2)*k)+1)+m},easeInElastic:function(n,k,m,p,q){n=1.70158;var s=0,r=p;if(k==0)return m;if((k/=q)==1)return m+p;s||(s=q*0.3);if(r<Math.abs(p)){r=p;n=s/4}else n=s/(2*Math.PI)*Math.asin(p/
+r);return-(r*Math.pow(2,10*(k-=1))*Math.sin((k*q-n)*2*Math.PI/s))+m},easeOutElastic:function(n,k,m,p,q){n=1.70158;var s=0,r=p;if(k==0)return m;if((k/=q)==1)return m+p;s||(s=q*0.3);if(r<Math.abs(p)){r=p;n=s/4}else n=s/(2*Math.PI)*Math.asin(p/r);return r*Math.pow(2,-10*k)*Math.sin((k*q-n)*2*Math.PI/s)+p+m},easeInOutElastic:function(n,k,m,p,q){n=1.70158;var s=0,r=p;if(k==0)return m;if((k/=q/2)==2)return m+p;s||(s=q*0.3*1.5);if(r<Math.abs(p)){r=p;n=s/4}else n=s/(2*Math.PI)*Math.asin(p/r);if(k<1)return-0.5*
+r*Math.pow(2,10*(k-=1))*Math.sin((k*q-n)*2*Math.PI/s)+m;return r*Math.pow(2,-10*(k-=1))*Math.sin((k*q-n)*2*Math.PI/s)*0.5+p+m},easeInBack:function(n,k,m,p,q,s){if(s==d)s=1.70158;return p*(k/=q)*k*((s+1)*k-s)+m},easeOutBack:function(n,k,m,p,q,s){if(s==d)s=1.70158;return p*((k=k/q-1)*k*((s+1)*k+s)+1)+m},easeInOutBack:function(n,k,m,p,q,s){if(s==d)s=1.70158;if((k/=q/2)<1)return p/2*k*k*(((s*=1.525)+1)*k-s)+m;return p/2*((k-=2)*k*(((s*=1.525)+1)*k+s)+2)+m},easeInBounce:function(n,k,m,p,q){return p-a.easing.easeOutBounce(n,
+q-k,0,p,q)+m},easeOutBounce:function(n,k,m,p,q){return(k/=q)<1/2.75?p*7.5625*k*k+m:k<2/2.75?p*(7.5625*(k-=1.5/2.75)*k+0.75)+m:k<2.5/2.75?p*(7.5625*(k-=2.25/2.75)*k+0.9375)+m:p*(7.5625*(k-=2.625/2.75)*k+0.984375)+m},easeInOutBounce:function(n,k,m,p,q){if(k<q/2)return a.easing.easeInBounce(n,k*2,0,p,q)*0.5+m;return a.easing.easeOutBounce(n,k*2-q,0,p,q)*0.5+p*0.5+m}})}(jQuery);
+(function(a){a.effects.blind=function(d){return this.queue(function(){var c=a(this),e=["position","top","bottom","left","right"],h=a.effects.setMode(c,d.options.mode||"hide"),g=d.options.direction||"vertical";a.effects.save(c,e);c.show();var i=a.effects.createWrapper(c).css({overflow:"hidden"}),b=g=="vertical"?"height":"width";g=g=="vertical"?i.height():i.width();h=="show"&&i.css(b,0);var f={};f[b]=h=="show"?g:0;i.animate(f,d.duration,d.options.easing,function(){h=="hide"&&c.hide();a.effects.restore(c,
+e);a.effects.removeWrapper(c);d.callback&&d.callback.apply(c[0],arguments);c.dequeue()})})}})(jQuery);
+(function(a){a.effects.bounce=function(d){return this.queue(function(){var c=a(this),e=["position","top","bottom","left","right"],h=a.effects.setMode(c,d.options.mode||"effect"),g=d.options.direction||"up",i=d.options.distance||20,b=d.options.times||5,f=d.duration||250;/show|hide/.test(h)&&e.push("opacity");a.effects.save(c,e);c.show();a.effects.createWrapper(c);var j=g=="up"||g=="down"?"top":"left";g=g=="up"||g=="left"?"pos":"neg";i=d.options.distance||(j=="top"?c.outerHeight({margin:true})/3:c.outerWidth({margin:true})/
+3);if(h=="show")c.css("opacity",0).css(j,g=="pos"?-i:i);if(h=="hide")i/=b*2;h!="hide"&&b--;if(h=="show"){var l={opacity:1};l[j]=(g=="pos"?"+=":"-=")+i;c.animate(l,f/2,d.options.easing);i/=2;b--}for(l=0;l<b;l++){var o={},n={};o[j]=(g=="pos"?"-=":"+=")+i;n[j]=(g=="pos"?"+=":"-=")+i;c.animate(o,f/2,d.options.easing).animate(n,f/2,d.options.easing);i=h=="hide"?i*2:i/2}if(h=="hide"){l={opacity:0};l[j]=(g=="pos"?"-=":"+=")+i;c.animate(l,f/2,d.options.easing,function(){c.hide();a.effects.restore(c,e);a.effects.removeWrapper(c);
+d.callback&&d.callback.apply(this,arguments)})}else{o={};n={};o[j]=(g=="pos"?"-=":"+=")+i;n[j]=(g=="pos"?"+=":"-=")+i;c.animate(o,f/2,d.options.easing).animate(n,f/2,d.options.easing,function(){a.effects.restore(c,e);a.effects.removeWrapper(c);d.callback&&d.callback.apply(this,arguments)})}c.queue("fx",function(){c.dequeue()});c.dequeue()})}})(jQuery);
+(function(a){a.effects.clip=function(d){return this.queue(function(){var c=a(this),e=["position","top","bottom","left","right","height","width"],h=a.effects.setMode(c,d.options.mode||"hide"),g=d.options.direction||"vertical";a.effects.save(c,e);c.show();var i=a.effects.createWrapper(c).css({overflow:"hidden"});i=c[0].tagName=="IMG"?i:c;var b={size:g=="vertical"?"height":"width",position:g=="vertical"?"top":"left"};g=g=="vertical"?i.height():i.width();if(h=="show"){i.css(b.size,0);i.css(b.position,
+g/2)}var f={};f[b.size]=h=="show"?g:0;f[b.position]=h=="show"?0:g/2;i.animate(f,{queue:false,duration:d.duration,easing:d.options.easing,complete:function(){h=="hide"&&c.hide();a.effects.restore(c,e);a.effects.removeWrapper(c);d.callback&&d.callback.apply(c[0],arguments);c.dequeue()}})})}})(jQuery);
+(function(a){a.effects.drop=function(d){return this.queue(function(){var c=a(this),e=["position","top","bottom","left","right","opacity"],h=a.effects.setMode(c,d.options.mode||"hide"),g=d.options.direction||"left";a.effects.save(c,e);c.show();a.effects.createWrapper(c);var i=g=="up"||g=="down"?"top":"left";g=g=="up"||g=="left"?"pos":"neg";var b=d.options.distance||(i=="top"?c.outerHeight({margin:true})/2:c.outerWidth({margin:true})/2);if(h=="show")c.css("opacity",0).css(i,g=="pos"?-b:b);var f={opacity:h==
+"show"?1:0};f[i]=(h=="show"?g=="pos"?"+=":"-=":g=="pos"?"-=":"+=")+b;c.animate(f,{queue:false,duration:d.duration,easing:d.options.easing,complete:function(){h=="hide"&&c.hide();a.effects.restore(c,e);a.effects.removeWrapper(c);d.callback&&d.callback.apply(this,arguments);c.dequeue()}})})}})(jQuery);
+(function(a){a.effects.explode=function(d){return this.queue(function(){var c=d.options.pieces?Math.round(Math.sqrt(d.options.pieces)):3,e=d.options.pieces?Math.round(Math.sqrt(d.options.pieces)):3;d.options.mode=d.options.mode=="toggle"?a(this).is(":visible")?"hide":"show":d.options.mode;var h=a(this).show().css("visibility","hidden"),g=h.offset();g.top-=parseInt(h.css("marginTop"),10)||0;g.left-=parseInt(h.css("marginLeft"),10)||0;for(var i=h.outerWidth(true),b=h.outerHeight(true),f=0;f<c;f++)for(var j=
+0;j<e;j++)h.clone().appendTo("body").wrap("<div></div>").css({position:"absolute",visibility:"visible",left:-j*(i/e),top:-f*(b/c)}).parent().addClass("ui-effects-explode").css({position:"absolute",overflow:"hidden",width:i/e,height:b/c,left:g.left+j*(i/e)+(d.options.mode=="show"?(j-Math.floor(e/2))*(i/e):0),top:g.top+f*(b/c)+(d.options.mode=="show"?(f-Math.floor(c/2))*(b/c):0),opacity:d.options.mode=="show"?0:1}).animate({left:g.left+j*(i/e)+(d.options.mode=="show"?0:(j-Math.floor(e/2))*(i/e)),top:g.top+
+f*(b/c)+(d.options.mode=="show"?0:(f-Math.floor(c/2))*(b/c)),opacity:d.options.mode=="show"?1:0},d.duration||500);setTimeout(function(){d.options.mode=="show"?h.css({visibility:"visible"}):h.css({visibility:"visible"}).hide();d.callback&&d.callback.apply(h[0]);h.dequeue();a("div.ui-effects-explode").remove()},d.duration||500)})}})(jQuery);
+(function(a){a.effects.fade=function(d){return this.queue(function(){var c=a(this),e=a.effects.setMode(c,d.options.mode||"hide");c.animate({opacity:e},{queue:false,duration:d.duration,easing:d.options.easing,complete:function(){d.callback&&d.callback.apply(this,arguments);c.dequeue()}})})}})(jQuery);
+(function(a){a.effects.fold=function(d){return this.queue(function(){var c=a(this),e=["position","top","bottom","left","right"],h=a.effects.setMode(c,d.options.mode||"hide"),g=d.options.size||15,i=!!d.options.horizFirst,b=d.duration?d.duration/2:a.fx.speeds._default/2;a.effects.save(c,e);c.show();var f=a.effects.createWrapper(c).css({overflow:"hidden"}),j=h=="show"!=i,l=j?["width","height"]:["height","width"];j=j?[f.width(),f.height()]:[f.height(),f.width()];var o=/([0-9]+)%/.exec(g);if(o)g=parseInt(o[1],
+10)/100*j[h=="hide"?0:1];if(h=="show")f.css(i?{height:0,width:g}:{height:g,width:0});i={};o={};i[l[0]]=h=="show"?j[0]:g;o[l[1]]=h=="show"?j[1]:0;f.animate(i,b,d.options.easing).animate(o,b,d.options.easing,function(){h=="hide"&&c.hide();a.effects.restore(c,e);a.effects.removeWrapper(c);d.callback&&d.callback.apply(c[0],arguments);c.dequeue()})})}})(jQuery);
+(function(a){a.effects.highlight=function(d){return this.queue(function(){var c=a(this),e=["backgroundImage","backgroundColor","opacity"],h=a.effects.setMode(c,d.options.mode||"show"),g={backgroundColor:c.css("backgroundColor")};if(h=="hide")g.opacity=0;a.effects.save(c,e);c.show().css({backgroundImage:"none",backgroundColor:d.options.color||"#ffff99"}).animate(g,{queue:false,duration:d.duration,easing:d.options.easing,complete:function(){h=="hide"&&c.hide();a.effects.restore(c,e);h=="show"&&!a.support.opacity&&
+this.style.removeAttribute("filter");d.callback&&d.callback.apply(this,arguments);c.dequeue()}})})}})(jQuery);
+(function(a){a.effects.pulsate=function(d){return this.queue(function(){var c=a(this),e=a.effects.setMode(c,d.options.mode||"show");times=(d.options.times||5)*2-1;duration=d.duration?d.duration/2:a.fx.speeds._default/2;isVisible=c.is(":visible");animateTo=0;if(!isVisible){c.css("opacity",0).show();animateTo=1}if(e=="hide"&&isVisible||e=="show"&&!isVisible)times--;for(e=0;e<times;e++){c.animate({opacity:animateTo},duration,d.options.easing);animateTo=(animateTo+1)%2}c.animate({opacity:animateTo},duration,
+d.options.easing,function(){animateTo==0&&c.hide();d.callback&&d.callback.apply(this,arguments)});c.queue("fx",function(){c.dequeue()}).dequeue()})}})(jQuery);
+(function(a){a.effects.puff=function(d){return this.queue(function(){var c=a(this),e=a.effects.setMode(c,d.options.mode||"hide"),h=parseInt(d.options.percent,10)||150,g=h/100,i={height:c.height(),width:c.width()};a.extend(d.options,{fade:true,mode:e,percent:e=="hide"?h:100,from:e=="hide"?i:{height:i.height*g,width:i.width*g}});c.effect("scale",d.options,d.duration,d.callback);c.dequeue()})};a.effects.scale=function(d){return this.queue(function(){var c=a(this),e=a.extend(true,{},d.options),h=a.effects.setMode(c,
+d.options.mode||"effect"),g=parseInt(d.options.percent,10)||(parseInt(d.options.percent,10)==0?0:h=="hide"?0:100),i=d.options.direction||"both",b=d.options.origin;if(h!="effect"){e.origin=b||["middle","center"];e.restore=true}b={height:c.height(),width:c.width()};c.from=d.options.from||(h=="show"?{height:0,width:0}:b);g={y:i!="horizontal"?g/100:1,x:i!="vertical"?g/100:1};c.to={height:b.height*g.y,width:b.width*g.x};if(d.options.fade){if(h=="show"){c.from.opacity=0;c.to.opacity=1}if(h=="hide"){c.from.opacity=
+1;c.to.opacity=0}}e.from=c.from;e.to=c.to;e.mode=h;c.effect("size",e,d.duration,d.callback);c.dequeue()})};a.effects.size=function(d){return this.queue(function(){var c=a(this),e=["position","top","bottom","left","right","width","height","overflow","opacity"],h=["position","top","bottom","left","right","overflow","opacity"],g=["width","height","overflow"],i=["fontSize"],b=["borderTopWidth","borderBottomWidth","paddingTop","paddingBottom"],f=["borderLeftWidth","borderRightWidth","paddingLeft","paddingRight"],
+j=a.effects.setMode(c,d.options.mode||"effect"),l=d.options.restore||false,o=d.options.scale||"both",n=d.options.origin,k={height:c.height(),width:c.width()};c.from=d.options.from||k;c.to=d.options.to||k;if(n){n=a.effects.getBaseline(n,k);c.from.top=(k.height-c.from.height)*n.y;c.from.left=(k.width-c.from.width)*n.x;c.to.top=(k.height-c.to.height)*n.y;c.to.left=(k.width-c.to.width)*n.x}var m={from:{y:c.from.height/k.height,x:c.from.width/k.width},to:{y:c.to.height/k.height,x:c.to.width/k.width}};
+if(o=="box"||o=="both"){if(m.from.y!=m.to.y){e=e.concat(b);c.from=a.effects.setTransition(c,b,m.from.y,c.from);c.to=a.effects.setTransition(c,b,m.to.y,c.to)}if(m.from.x!=m.to.x){e=e.concat(f);c.from=a.effects.setTransition(c,f,m.from.x,c.from);c.to=a.effects.setTransition(c,f,m.to.x,c.to)}}if(o=="content"||o=="both")if(m.from.y!=m.to.y){e=e.concat(i);c.from=a.effects.setTransition(c,i,m.from.y,c.from);c.to=a.effects.setTransition(c,i,m.to.y,c.to)}a.effects.save(c,l?e:h);c.show();a.effects.createWrapper(c);
+c.css("overflow","hidden").css(c.from);if(o=="content"||o=="both"){b=b.concat(["marginTop","marginBottom"]).concat(i);f=f.concat(["marginLeft","marginRight"]);g=e.concat(b).concat(f);c.find("*[width]").each(function(){child=a(this);l&&a.effects.save(child,g);var p={height:child.height(),width:child.width()};child.from={height:p.height*m.from.y,width:p.width*m.from.x};child.to={height:p.height*m.to.y,width:p.width*m.to.x};if(m.from.y!=m.to.y){child.from=a.effects.setTransition(child,b,m.from.y,child.from);
+child.to=a.effects.setTransition(child,b,m.to.y,child.to)}if(m.from.x!=m.to.x){child.from=a.effects.setTransition(child,f,m.from.x,child.from);child.to=a.effects.setTransition(child,f,m.to.x,child.to)}child.css(child.from);child.animate(child.to,d.duration,d.options.easing,function(){l&&a.effects.restore(child,g)})})}c.animate(c.to,{queue:false,duration:d.duration,easing:d.options.easing,complete:function(){c.to.opacity===0&&c.css("opacity",c.from.opacity);j=="hide"&&c.hide();a.effects.restore(c,
+l?e:h);a.effects.removeWrapper(c);d.callback&&d.callback.apply(this,arguments);c.dequeue()}})})}})(jQuery);
+(function(a){a.effects.shake=function(d){return this.queue(function(){var c=a(this),e=["position","top","bottom","left","right"];a.effects.setMode(c,d.options.mode||"effect");var h=d.options.direction||"left",g=d.options.distance||20,i=d.options.times||3,b=d.duration||d.options.duration||140;a.effects.save(c,e);c.show();a.effects.createWrapper(c);var f=h=="up"||h=="down"?"top":"left",j=h=="up"||h=="left"?"pos":"neg";h={};var l={},o={};h[f]=(j=="pos"?"-=":"+=")+g;l[f]=(j=="pos"?"+=":"-=")+g*2;o[f]=
+(j=="pos"?"-=":"+=")+g*2;c.animate(h,b,d.options.easing);for(g=1;g<i;g++)c.animate(l,b,d.options.easing).animate(o,b,d.options.easing);c.animate(l,b,d.options.easing).animate(h,b/2,d.options.easing,function(){a.effects.restore(c,e);a.effects.removeWrapper(c);d.callback&&d.callback.apply(this,arguments)});c.queue("fx",function(){c.dequeue()});c.dequeue()})}})(jQuery);
+(function(a){a.effects.slide=function(d){return this.queue(function(){var c=a(this),e=["position","top","bottom","left","right"],h=a.effects.setMode(c,d.options.mode||"show"),g=d.options.direction||"left";a.effects.save(c,e);c.show();a.effects.createWrapper(c).css({overflow:"hidden"});var i=g=="up"||g=="down"?"top":"left";g=g=="up"||g=="left"?"pos":"neg";var b=d.options.distance||(i=="top"?c.outerHeight({margin:true}):c.outerWidth({margin:true}));if(h=="show")c.css(i,g=="pos"?isNaN(b)?"-"+b:-b:b);
+var f={};f[i]=(h=="show"?g=="pos"?"+=":"-=":g=="pos"?"-=":"+=")+b;c.animate(f,{queue:false,duration:d.duration,easing:d.options.easing,complete:function(){h=="hide"&&c.hide();a.effects.restore(c,e);a.effects.removeWrapper(c);d.callback&&d.callback.apply(this,arguments);c.dequeue()}})})}})(jQuery);
+(function(a){a.effects.transfer=function(d){return this.queue(function(){var c=a(this),e=a(d.options.to),h=e.offset();e={top:h.top,left:h.left,height:e.innerHeight(),width:e.innerWidth()};h=c.offset();var g=a('<div class="ui-effects-transfer"></div>').appendTo(document.body).addClass(d.options.className).css({top:h.top,left:h.left,height:c.innerHeight(),width:c.innerWidth(),position:"absolute"}).animate(e,d.duration,d.options.easing,function(){g.remove();d.callback&&d.callback.apply(c[0],arguments);
+c.dequeue()})})}})(jQuery);
+(function(a){a.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 d=this,c=d.options;d.running=0;d.element.addClass("ui-accordion ui-widget ui-helper-reset").children("li").addClass("ui-accordion-li-fix");d.headers=
+d.element.find(c.header).addClass("ui-accordion-header ui-helper-reset ui-state-default ui-corner-all").bind("mouseenter.accordion",function(){c.disabled||a(this).addClass("ui-state-hover")}).bind("mouseleave.accordion",function(){c.disabled||a(this).removeClass("ui-state-hover")}).bind("focus.accordion",function(){c.disabled||a(this).addClass("ui-state-focus")}).bind("blur.accordion",function(){c.disabled||a(this).removeClass("ui-state-focus")});d.headers.next().addClass("ui-accordion-content ui-helper-reset ui-widget-content ui-corner-bottom");
+if(c.navigation){var e=d.element.find("a").filter(c.navigationFilter).eq(0);if(e.length){var h=e.closest(".ui-accordion-header");d.active=h.length?h:e.closest(".ui-accordion-content").prev()}}d.active=d._findActive(d.active||c.active).addClass("ui-state-default ui-state-active").toggleClass("ui-corner-all").toggleClass("ui-corner-top");d.active.next().addClass("ui-accordion-content-active");d._createIcons();d.resize();d.element.attr("role","tablist");d.headers.attr("role","tab").bind("keydown.accordion",
+function(g){return d._keydown(g)}).next().attr("role","tabpanel");d.headers.not(d.active||"").attr({"aria-expanded":"false","aria-selected":"false",tabIndex:-1}).next().hide();d.active.length?d.active.attr({"aria-expanded":"true","aria-selected":"true",tabIndex:0}):d.headers.eq(0).attr("tabIndex",0);a.browser.safari||d.headers.find("a").attr("tabIndex",-1);c.event&&d.headers.bind(c.event.split(" ").join(".accordion ")+".accordion",function(g){d._clickHandler.call(d,g,this);g.preventDefault()})},_createIcons:function(){var d=
+this.options;if(d.icons){a("<span></span>").addClass("ui-icon "+d.icons.header).prependTo(this.headers);this.active.children(".ui-icon").toggleClass(d.icons.header).toggleClass(d.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 d=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 c=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(d.autoHeight||d.fillHeight)c.css("height","");return a.Widget.prototype.destroy.call(this)},_setOption:function(d,c){a.Widget.prototype._setOption.apply(this,arguments);d=="active"&&this.activate(c);if(d=="icons"){this._destroyIcons();
+c&&this._createIcons()}if(d=="disabled")this.headers.add(this.headers.next())[c?"addClass":"removeClass"]("ui-accordion-disabled ui-state-disabled")},_keydown:function(d){if(!(this.options.disabled||d.altKey||d.ctrlKey)){var c=a.ui.keyCode,e=this.headers.length,h=this.headers.index(d.target),g=false;switch(d.keyCode){case c.RIGHT:case c.DOWN:g=this.headers[(h+1)%e];break;case c.LEFT:case c.UP:g=this.headers[(h-1+e)%e];break;case c.SPACE:case c.ENTER:this._clickHandler({target:d.target},d.target);
+d.preventDefault()}if(g){a(d.target).attr("tabIndex",-1);a(g).attr("tabIndex",0);g.focus();return false}return true}},resize:function(){var d=this.options,c;if(d.fillSpace){if(a.browser.msie){var e=this.element.parent().css("overflow");this.element.parent().css("overflow","hidden")}c=this.element.parent().height();a.browser.msie&&this.element.parent().css("overflow",e);this.headers.each(function(){c-=a(this).outerHeight(true)});this.headers.next().each(function(){a(this).height(Math.max(0,c-a(this).innerHeight()+
+a(this).height()))}).css("overflow","auto")}else if(d.autoHeight){c=0;this.headers.next().each(function(){c=Math.max(c,a(this).height("").height())}).height(c)}return this},activate:function(d){this.options.active=d;d=this._findActive(d)[0];this._clickHandler({target:d},d);return this},_findActive:function(d){return d?typeof d==="number"?this.headers.filter(":eq("+d+")"):this.headers.not(this.headers.not(d)):d===false?a([]):this.headers.filter(":eq(0)")},_clickHandler:function(d,c){var e=this.options;
+if(!e.disabled)if(d.target){d=a(d.currentTarget||c);c=d[0]===this.active[0];e.active=e.collapsible&&c?false:this.headers.index(d);if(!(this.running||!e.collapsible&&c)){var h=this.active;f=d.next();i=this.active.next();b={options:e,newHeader:c&&e.collapsible?a([]):d,oldHeader:this.active,newContent:c&&e.collapsible?a([]):f,oldContent:i};var g=this.headers.index(this.active[0])>this.headers.index(d[0]);this.active=c?a([]):d;this._toggle(f,i,b,c,g);h.removeClass("ui-state-active ui-corner-top").addClass("ui-state-default ui-corner-all").children(".ui-icon").removeClass(e.icons.headerSelected).addClass(e.icons.header);
+if(!c){d.removeClass("ui-state-default ui-corner-all").addClass("ui-state-active ui-corner-top").children(".ui-icon").removeClass(e.icons.header).addClass(e.icons.headerSelected);d.next().addClass("ui-accordion-content-active")}}}else if(e.collapsible){this.active.removeClass("ui-state-active ui-corner-top").addClass("ui-state-default ui-corner-all").children(".ui-icon").removeClass(e.icons.headerSelected).addClass(e.icons.header);this.active.next().addClass("ui-accordion-content-active");var i=this.active.next(),
+b={options:e,newHeader:a([]),oldHeader:e.active,newContent:a([]),oldContent:i},f=this.active=a([]);this._toggle(f,i,b)}},_toggle:function(d,c,e,h,g){var i=this,b=i.options;i.toShow=d;i.toHide=c;i.data=e;var f=function(){if(i)return i._completed.apply(i,arguments)};i._trigger("changestart",null,i.data);i.running=c.size()===0?d.size():c.size();if(b.animated){e={};e=b.collapsible&&h?{toShow:a([]),toHide:c,complete:f,down:g,autoHeight:b.autoHeight||b.fillSpace}:{toShow:d,toHide:c,complete:f,down:g,autoHeight:b.autoHeight||
+b.fillSpace};if(!b.proxied)b.proxied=b.animated;if(!b.proxiedDuration)b.proxiedDuration=b.duration;b.animated=a.isFunction(b.proxied)?b.proxied(e):b.proxied;b.duration=a.isFunction(b.proxiedDuration)?b.proxiedDuration(e):b.proxiedDuration;h=a.ui.accordion.animations;var j=b.duration,l=b.animated;if(l&&!h[l]&&!a.easing[l])l="slide";h[l]||(h[l]=function(o){this.slide(o,{easing:l,duration:j||700})});h[l](e)}else{if(b.collapsible&&h)d.toggle();else{c.hide();d.show()}f(true)}c.prev().attr({"aria-expanded":"false",
+"aria-selected":"false",tabIndex:-1}).blur();d.prev().attr({"aria-expanded":"true","aria-selected":"true",tabIndex:0}).focus()},_completed:function(d){this.running=d?0:--this.running;if(!this.running){this.options.clearStyle&&this.toShow.add(this.toHide).css({height:"",overflow:""});this.toHide.removeClass("ui-accordion-content-active");if(this.toHide.length)this.toHide.parent()[0].className=this.toHide.parent()[0].className;this._trigger("change",null,this.data)}}});a.extend(a.ui.accordion,{version:"1.8.14",
+animations:{slide:function(d,c){d=a.extend({easing:"swing",duration:300},d,c);if(d.toHide.size())if(d.toShow.size()){var e=d.toShow.css("overflow"),h=0,g={},i={},b;c=d.toShow;b=c[0].style.width;c.width(parseInt(c.parent().width(),10)-parseInt(c.css("paddingLeft"),10)-parseInt(c.css("paddingRight"),10)-(parseInt(c.css("borderLeftWidth"),10)||0)-(parseInt(c.css("borderRightWidth"),10)||0));a.each(["height","paddingTop","paddingBottom"],function(f,j){i[j]="hide";f=(""+a.css(d.toShow[0],j)).match(/^([\d+-.]+)(.*)$/);
+g[j]={value:f[1],unit:f[2]||"px"}});d.toShow.css({height:0,overflow:"hidden"}).show();d.toHide.filter(":hidden").each(d.complete).end().filter(":visible").animate(i,{step:function(f,j){if(j.prop=="height")h=j.end-j.start===0?0:(j.now-j.start)/(j.end-j.start);d.toShow[0].style[j.prop]=h*g[j.prop].value+g[j.prop].unit},duration:d.duration,easing:d.easing,complete:function(){d.autoHeight||d.toShow.css("height","");d.toShow.css({width:b,overflow:e});d.complete()}})}else d.toHide.animate({height:"hide",
+paddingTop:"hide",paddingBottom:"hide"},d);else d.toShow.animate({height:"show",paddingTop:"show",paddingBottom:"show"},d)},bounceslide:function(d){this.slide(d,{easing:d.down?"easeOutBounce":"swing",duration:d.down?1E3:200})}}})})(jQuery);
+(function(a){var d=0;a.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 c=this,e=this.element[0].ownerDocument,h;this.element.addClass("ui-autocomplete-input").attr("autocomplete","off").attr({role:"textbox","aria-autocomplete":"list","aria-haspopup":"true"}).bind("keydown.autocomplete",function(g){if(!(c.options.disabled||c.element.attr("readonly"))){h=
+false;var i=a.ui.keyCode;switch(g.keyCode){case i.PAGE_UP:c._move("previousPage",g);break;case i.PAGE_DOWN:c._move("nextPage",g);break;case i.UP:c._move("previous",g);g.preventDefault();break;case i.DOWN:c._move("next",g);g.preventDefault();break;case i.ENTER:case i.NUMPAD_ENTER:if(c.menu.active){h=true;g.preventDefault()}case i.TAB:if(!c.menu.active)return;c.menu.select(g);break;case i.ESCAPE:c.element.val(c.term);c.close(g);break;default:clearTimeout(c.searching);c.searching=setTimeout(function(){if(c.term!=
+c.element.val()){c.selectedItem=null;c.search(null,g)}},c.options.delay);break}}}).bind("keypress.autocomplete",function(g){if(h){h=false;g.preventDefault()}}).bind("focus.autocomplete",function(){if(!c.options.disabled){c.selectedItem=null;c.previous=c.element.val()}}).bind("blur.autocomplete",function(g){if(!c.options.disabled){clearTimeout(c.searching);c.closing=setTimeout(function(){c.close(g);c._change(g)},150)}});this._initSource();this.response=function(){return c._response.apply(c,arguments)};
+this.menu=a("<ul></ul>").addClass("ui-autocomplete").appendTo(a(this.options.appendTo||"body",e)[0]).mousedown(function(g){var i=c.menu.element[0];a(g.target).closest(".ui-menu-item").length||setTimeout(function(){a(document).one("mousedown",function(b){b.target!==c.element[0]&&b.target!==i&&!a.ui.contains(i,b.target)&&c.close()})},1);setTimeout(function(){clearTimeout(c.closing)},13)}).menu({focus:function(g,i){i=i.item.data("item.autocomplete");false!==c._trigger("focus",g,{item:i})&&/^key/.test(g.originalEvent.type)&&
+c.element.val(i.value)},selected:function(g,i){var b=i.item.data("item.autocomplete"),f=c.previous;if(c.element[0]!==e.activeElement){c.element.focus();c.previous=f;setTimeout(function(){c.previous=f;c.selectedItem=b},1)}false!==c._trigger("select",g,{item:b})&&c.element.val(b.value);c.term=c.element.val();c.close(g);c.selectedItem=b},blur:function(){c.menu.element.is(":visible")&&c.element.val()!==c.term&&c.element.val(c.term)}}).zIndex(this.element.zIndex()+1).css({top:0,left:0}).hide().data("menu");
+a.fn.bgiframe&&this.menu.element.bgiframe()},destroy:function(){this.element.removeClass("ui-autocomplete-input").removeAttr("autocomplete").removeAttr("role").removeAttr("aria-autocomplete").removeAttr("aria-haspopup");this.menu.element.remove();a.Widget.prototype.destroy.call(this)},_setOption:function(c,e){a.Widget.prototype._setOption.apply(this,arguments);c==="source"&&this._initSource();if(c==="appendTo")this.menu.element.appendTo(a(e||"body",this.element[0].ownerDocument)[0]);c==="disabled"&&
+e&&this.xhr&&this.xhr.abort()},_initSource:function(){var c=this,e,h;if(a.isArray(this.options.source)){e=this.options.source;this.source=function(g,i){i(a.ui.autocomplete.filter(e,g.term))}}else if(typeof this.options.source==="string"){h=this.options.source;this.source=function(g,i){c.xhr&&c.xhr.abort();c.xhr=a.ajax({url:h,data:g,dataType:"json",autocompleteRequest:++d,success:function(b){this.autocompleteRequest===d&&i(b)},error:function(){this.autocompleteRequest===d&&i([])}})}}else this.source=
+this.options.source},search:function(c,e){c=c!=null?c:this.element.val();this.term=this.element.val();if(c.length<this.options.minLength)return this.close(e);clearTimeout(this.closing);if(this._trigger("search",e)!==false)return this._search(c)},_search:function(c){this.pending++;this.element.addClass("ui-autocomplete-loading");this.source({term:c},this.response)},_response:function(c){if(!this.options.disabled&&c&&c.length){c=this._normalize(c);this._suggest(c);this._trigger("open")}else this.close();
+this.pending--;this.pending||this.element.removeClass("ui-autocomplete-loading")},close:function(c){clearTimeout(this.closing);if(this.menu.element.is(":visible")){this.menu.element.hide();this.menu.deactivate();this._trigger("close",c)}},_change:function(c){this.previous!==this.element.val()&&this._trigger("change",c,{item:this.selectedItem})},_normalize:function(c){if(c.length&&c[0].label&&c[0].value)return c;return a.map(c,function(e){if(typeof e==="string")return{label:e,value:e};return a.extend({label:e.label||
+e.value,value:e.value||e.label},e)})},_suggest:function(c){var e=this.menu.element.empty().zIndex(this.element.zIndex()+1);this._renderMenu(e,c);this.menu.deactivate();this.menu.refresh();e.show();this._resizeMenu();e.position(a.extend({of:this.element},this.options.position));this.options.autoFocus&&this.menu.next(new a.Event("mouseover"))},_resizeMenu:function(){var c=this.menu.element;c.outerWidth(Math.max(c.width("").outerWidth(),this.element.outerWidth()))},_renderMenu:function(c,e){var h=this;
+a.each(e,function(g,i){h._renderItem(c,i)})},_renderItem:function(c,e){return a("<li></li>").data("item.autocomplete",e).append(a("<a></a>").text(e.label)).appendTo(c)},_move:function(c,e){if(this.menu.element.is(":visible"))if(this.menu.first()&&/^previous/.test(c)||this.menu.last()&&/^next/.test(c)){this.element.val(this.term);this.menu.deactivate()}else this.menu[c](e);else this.search(null,e)},widget:function(){return this.menu.element}});a.extend(a.ui.autocomplete,{escapeRegex:function(c){return c.replace(/[-[\]{}()*+?.,\\^$|#\s]/g,
+"\\$&")},filter:function(c,e){var h=new RegExp(a.ui.autocomplete.escapeRegex(e),"i");return a.grep(c,function(g){return h.test(g.label||g.value||g)})}})})(jQuery);
+(function(a){a.widget("ui.menu",{_create:function(){var d=this;this.element.addClass("ui-menu ui-widget ui-widget-content ui-corner-all").attr({role:"listbox","aria-activedescendant":"ui-active-menuitem"}).click(function(c){if(a(c.target).closest(".ui-menu-item a").length){c.preventDefault();d.select(c)}});this.refresh()},refresh:function(){var d=this;this.element.children("li:not(.ui-menu-item):has(a)").addClass("ui-menu-item").attr("role","menuitem").children("a").addClass("ui-corner-all").attr("tabindex",
+-1).mouseenter(function(c){d.activate(c,a(this).parent())}).mouseleave(function(){d.deactivate()})},activate:function(d,c){this.deactivate();if(this.hasScroll()){var e=c.offset().top-this.element.offset().top,h=this.element.scrollTop(),g=this.element.height();if(e<0)this.element.scrollTop(h+e);else e>=g&&this.element.scrollTop(h+e-g+c.height())}this.active=c.eq(0).children("a").addClass("ui-state-hover").attr("id","ui-active-menuitem").end();this._trigger("focus",d,{item:c})},deactivate:function(){if(this.active){this.active.children("a").removeClass("ui-state-hover").removeAttr("id");
+this._trigger("blur");this.active=null}},next:function(d){this.move("next",".ui-menu-item:first",d)},previous:function(d){this.move("prev",".ui-menu-item:last",d)},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(d,c,e){if(this.active){d=this.active[d+"All"](".ui-menu-item").eq(0);d.length?this.activate(e,d):this.activate(e,this.element.children(c))}else this.activate(e,
+this.element.children(c))},nextPage:function(d){if(this.hasScroll())if(!this.active||this.last())this.activate(d,this.element.children(".ui-menu-item:first"));else{var c=this.active.offset().top,e=this.element.height(),h=this.element.children(".ui-menu-item").filter(function(){var g=a(this).offset().top-c-e+a(this).height();return g<10&&g>-10});h.length||(h=this.element.children(".ui-menu-item:last"));this.activate(d,h)}else this.activate(d,this.element.children(".ui-menu-item").filter(!this.active||
+this.last()?":first":":last"))},previousPage:function(d){if(this.hasScroll())if(!this.active||this.first())this.activate(d,this.element.children(".ui-menu-item:last"));else{var c=this.active.offset().top,e=this.element.height();result=this.element.children(".ui-menu-item").filter(function(){var h=a(this).offset().top-c+e-a(this).height();return h<10&&h>-10});result.length||(result=this.element.children(".ui-menu-item:first"));this.activate(d,result)}else this.activate(d,this.element.children(".ui-menu-item").filter(!this.active||
+this.first()?":last":":first"))},hasScroll:function(){return this.element.height()<this.element[a.fn.prop?"prop":"attr"]("scrollHeight")},select:function(d){this._trigger("selected",d,{item:this.active})}})})(jQuery);
+(function(a){var d,c,e,h,g=function(){var b=a(this).find(":ui-button");setTimeout(function(){b.button("refresh")},1)},i=function(b){var f=b.name,j=b.form,l=a([]);if(f)l=j?a(j).find("[name='"+f+"']"):a("[name='"+f+"']",b.ownerDocument).filter(function(){return!this.form});return l};a.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",g);if(typeof this.options.disabled!==
+"boolean")this.options.disabled=this.element.attr("disabled");this._determineButtonType();this.hasTitle=!!this.buttonElement.attr("title");var b=this,f=this.options,j=this.type==="checkbox"||this.type==="radio",l="ui-state-hover"+(!j?" ui-state-active":"");if(f.label===null)f.label=this.buttonElement.html();if(this.element.is(":disabled"))f.disabled=true;this.buttonElement.addClass("ui-button ui-widget ui-state-default ui-corner-all").attr("role","button").bind("mouseenter.button",function(){if(!f.disabled){a(this).addClass("ui-state-hover");
+this===d&&a(this).addClass("ui-state-active")}}).bind("mouseleave.button",function(){f.disabled||a(this).removeClass(l)}).bind("click.button",function(o){if(f.disabled){o.preventDefault();o.stopImmediatePropagation()}});this.element.bind("focus.button",function(){b.buttonElement.addClass("ui-state-focus")}).bind("blur.button",function(){b.buttonElement.removeClass("ui-state-focus")});if(j){this.element.bind("change.button",function(){h||b.refresh()});this.buttonElement.bind("mousedown.button",function(o){if(!f.disabled){h=
+false;c=o.pageX;e=o.pageY}}).bind("mouseup.button",function(o){if(!f.disabled)if(c!==o.pageX||e!==o.pageY)h=true})}if(this.type==="checkbox")this.buttonElement.bind("click.button",function(){if(f.disabled||h)return false;a(this).toggleClass("ui-state-active");b.buttonElement.attr("aria-pressed",b.element[0].checked)});else if(this.type==="radio")this.buttonElement.bind("click.button",function(){if(f.disabled||h)return false;a(this).addClass("ui-state-active");b.buttonElement.attr("aria-pressed",true);
+var o=b.element[0];i(o).not(o).map(function(){return a(this).button("widget")[0]}).removeClass("ui-state-active").attr("aria-pressed",false)});else{this.buttonElement.bind("mousedown.button",function(){if(f.disabled)return false;a(this).addClass("ui-state-active");d=this;a(document).one("mouseup",function(){d=null})}).bind("mouseup.button",function(){if(f.disabled)return false;a(this).removeClass("ui-state-active")}).bind("keydown.button",function(o){if(f.disabled)return false;if(o.keyCode==a.ui.keyCode.SPACE||
+o.keyCode==a.ui.keyCode.ENTER)a(this).addClass("ui-state-active")}).bind("keyup.button",function(){a(this).removeClass("ui-state-active")});this.buttonElement.is("a")&&this.buttonElement.keyup(function(o){o.keyCode===a.ui.keyCode.SPACE&&a(this).click()})}this._setOption("disabled",f.disabled);this._resetButton()},_determineButtonType:function(){this.type=this.element.is(":checkbox")?"checkbox":this.element.is(":radio")?"radio":this.element.is("input")?"input":"button";if(this.type==="checkbox"||this.type===
+"radio"){var b=this.element.parents().filter(":last"),f="label[for="+this.element.attr("id")+"]";this.buttonElement=b.find(f);if(!this.buttonElement.length){b=b.length?b.siblings():this.element.siblings();this.buttonElement=b.filter(f);if(!this.buttonElement.length)this.buttonElement=b.find(f)}this.element.addClass("ui-helper-hidden-accessible");(b=this.element.is(":checked"))&&this.buttonElement.addClass("ui-state-active");this.buttonElement.attr("aria-pressed",b)}else this.buttonElement=this.element},
+widget:function(){return this.buttonElement},destroy:function(){this.element.removeClass("ui-helper-hidden-accessible");this.buttonElement.removeClass("ui-button ui-widget ui-state-default ui-corner-all ui-state-hover ui-state-active 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").removeAttr("role").removeAttr("aria-pressed").html(this.buttonElement.find(".ui-button-text").html());this.hasTitle||this.buttonElement.removeAttr("title");
+a.Widget.prototype.destroy.call(this)},_setOption:function(b,f){a.Widget.prototype._setOption.apply(this,arguments);if(b==="disabled")f?this.element.attr("disabled",true):this.element.removeAttr("disabled");else this._resetButton()},refresh:function(){var b=this.element.is(":disabled");b!==this.options.disabled&&this._setOption("disabled",b);if(this.type==="radio")i(this.element[0]).each(function(){a(this).is(":checked")?a(this).button("widget").addClass("ui-state-active").attr("aria-pressed",true):
+a(this).button("widget").removeClass("ui-state-active").attr("aria-pressed",false)});else if(this.type==="checkbox")this.element.is(":checked")?this.buttonElement.addClass("ui-state-active").attr("aria-pressed",true):this.buttonElement.removeClass("ui-state-active").attr("aria-pressed",false)},_resetButton:function(){if(this.type==="input")this.options.label&&this.element.val(this.options.label);else{var b=this.buttonElement.removeClass("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"),
+f=a("<span></span>").addClass("ui-button-text").html(this.options.label).appendTo(b.empty()).text(),j=this.options.icons,l=j.primary&&j.secondary,o=[];if(j.primary||j.secondary){if(this.options.text)o.push("ui-button-text-icon"+(l?"s":j.primary?"-primary":"-secondary"));j.primary&&b.prepend("<span class='ui-button-icon-primary ui-icon "+j.primary+"'></span>");j.secondary&&b.append("<span class='ui-button-icon-secondary ui-icon "+j.secondary+"'></span>");if(!this.options.text){o.push(l?"ui-button-icons-only":
+"ui-button-icon-only");this.hasTitle||b.attr("title",f)}}else o.push("ui-button-text-only");b.addClass(o.join(" "))}}});a.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(b,f){b==="disabled"&&this.buttons.button("option",b,f);a.Widget.prototype._setOption.apply(this,arguments)},refresh:function(){var b=this.element.css("direction")===
+"ltr";this.buttons=this.element.find(this.options.items).filter(":ui-button").button("refresh").end().not(":ui-button").button().end().map(function(){return a(this).button("widget")[0]}).removeClass("ui-corner-all ui-corner-left ui-corner-right").filter(":first").addClass(b?"ui-corner-left":"ui-corner-right").end().filter(":last").addClass(b?"ui-corner-right":"ui-corner-left").end().end()},destroy:function(){this.element.removeClass("ui-buttonset");this.buttons.map(function(){return a(this).button("widget")[0]}).removeClass("ui-corner-left ui-corner-right").end().button("destroy");
+a.Widget.prototype.destroy.call(this)}})})(jQuery);
+(function(a,d){function c(){this.debug=false;this._curInst=null;this._keyEvent=false;this._disabledInputs=[];this._inDialog=this._datepickerShowing=false;this._mainDivId="ui-datepicker-div";this._inlineClass="ui-datepicker-inline";this._appendClass="ui-datepicker-append";this._triggerClass="ui-datepicker-trigger";this._dialogClass="ui-datepicker-dialog";this._disableClass="ui-datepicker-disabled";this._unselectableClass="ui-datepicker-unselectable";this._currentClass="ui-datepicker-current-day";this._dayOverClass=
+"ui-datepicker-days-cell-over";this.regional=[];this.regional[""]={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:"mm/dd/yy",firstDay:0,isRTL:false,showMonthAfterYear:false,yearSuffix:""};this._defaults={showOn:"focus",showAnim:"fadeIn",showOptions:{},defaultDate:null,appendText:"",buttonText:"...",buttonImage:"",buttonImageOnly:false,hideIfNoPrevNext:false,navigationAsDateFormat:false,gotoCurrent:false,changeMonth:false,changeYear:false,yearRange:"c-10:c+10",showOtherMonths:false,selectOtherMonths:false,showWeek:false,calculateWeek:this.iso8601Week,shortYearCutoff:"+10",
+minDate:null,maxDate:null,duration:"fast",beforeShowDay:null,beforeShow:null,onSelect:null,onChangeMonthYear:null,onClose:null,numberOfMonths:1,showCurrentAtPos:0,stepMonths:1,stepBigMonths:12,altField:"",altFormat:"",constrainInput:true,showButtonPanel:false,autoSize:false};a.extend(this._defaults,this.regional[""]);this.dpDiv=e(a('<div id="'+this._mainDivId+'" class="ui-datepicker ui-widget ui-widget-content ui-helper-clearfix ui-corner-all"></div>'))}function e(b){return b.bind("mouseout",function(f){f=
+a(f.target).closest("button, .ui-datepicker-prev, .ui-datepicker-next, .ui-datepicker-calendar td a");f.length&&f.removeClass("ui-state-hover ui-datepicker-prev-hover ui-datepicker-next-hover")}).bind("mouseover",function(f){f=a(f.target).closest("button, .ui-datepicker-prev, .ui-datepicker-next, .ui-datepicker-calendar td a");if(!(a.datepicker._isDisabledDatepicker(i.inline?b.parent()[0]:i.input[0])||!f.length)){f.parents(".ui-datepicker-calendar").find("a").removeClass("ui-state-hover");f.addClass("ui-state-hover");
+f.hasClass("ui-datepicker-prev")&&f.addClass("ui-datepicker-prev-hover");f.hasClass("ui-datepicker-next")&&f.addClass("ui-datepicker-next-hover")}})}function h(b,f){a.extend(b,f);for(var j in f)if(f[j]==null||f[j]==d)b[j]=f[j];return b}a.extend(a.ui,{datepicker:{version:"1.8.14"}});var g=(new Date).getTime(),i;a.extend(c.prototype,{markerClassName:"hasDatepicker",maxRows:4,log:function(){this.debug&&console.log.apply("",arguments)},_widgetDatepicker:function(){return this.dpDiv},setDefaults:function(b){h(this._defaults,
+b||{});return this},_attachDatepicker:function(b,f){var j=null;for(var l in this._defaults){var o=b.getAttribute("date:"+l);if(o){j=j||{};try{j[l]=eval(o)}catch(n){j[l]=o}}}l=b.nodeName.toLowerCase();o=l=="div"||l=="span";if(!b.id){this.uuid+=1;b.id="dp"+this.uuid}var k=this._newInst(a(b),o);k.settings=a.extend({},f||{},j||{});if(l=="input")this._connectDatepicker(b,k);else o&&this._inlineDatepicker(b,k)},_newInst:function(b,f){return{id:b[0].id.replace(/([^A-Za-z0-9_-])/g,"\\\\$1"),input:b,selectedDay:0,
+selectedMonth:0,selectedYear:0,drawMonth:0,drawYear:0,inline:f,dpDiv:!f?this.dpDiv:e(a('<div class="'+this._inlineClass+' ui-datepicker ui-widget ui-widget-content ui-helper-clearfix ui-corner-all"></div>'))}},_connectDatepicker:function(b,f){var j=a(b);f.append=a([]);f.trigger=a([]);if(!j.hasClass(this.markerClassName)){this._attachments(j,f);j.addClass(this.markerClassName).keydown(this._doKeyDown).keypress(this._doKeyPress).keyup(this._doKeyUp).bind("setData.datepicker",function(l,o,n){f.settings[o]=
+n}).bind("getData.datepicker",function(l,o){return this._get(f,o)});this._autoSize(f);a.data(b,"datepicker",f)}},_attachments:function(b,f){var j=this._get(f,"appendText"),l=this._get(f,"isRTL");f.append&&f.append.remove();if(j){f.append=a('<span class="'+this._appendClass+'">'+j+"</span>");b[l?"before":"after"](f.append)}b.unbind("focus",this._showDatepicker);f.trigger&&f.trigger.remove();j=this._get(f,"showOn");if(j=="focus"||j=="both")b.focus(this._showDatepicker);if(j=="button"||j=="both"){j=
+this._get(f,"buttonText");var o=this._get(f,"buttonImage");f.trigger=a(this._get(f,"buttonImageOnly")?a("<img/>").addClass(this._triggerClass).attr({src:o,alt:j,title:j}):a('<button type="button"></button>').addClass(this._triggerClass).html(o==""?j:a("<img/>").attr({src:o,alt:j,title:j})));b[l?"before":"after"](f.trigger);f.trigger.click(function(){a.datepicker._datepickerShowing&&a.datepicker._lastInput==b[0]?a.datepicker._hideDatepicker():a.datepicker._showDatepicker(b[0]);return false})}},_autoSize:function(b){if(this._get(b,
+"autoSize")&&!b.inline){var f=new Date(2009,11,20),j=this._get(b,"dateFormat");if(j.match(/[DM]/)){var l=function(o){for(var n=0,k=0,m=0;m<o.length;m++)if(o[m].length>n){n=o[m].length;k=m}return k};f.setMonth(l(this._get(b,j.match(/MM/)?"monthNames":"monthNamesShort")));f.setDate(l(this._get(b,j.match(/DD/)?"dayNames":"dayNamesShort"))+20-f.getDay())}b.input.attr("size",this._formatDate(b,f).length)}},_inlineDatepicker:function(b,f){var j=a(b);if(!j.hasClass(this.markerClassName)){j.addClass(this.markerClassName).append(f.dpDiv).bind("setData.datepicker",
+function(l,o,n){f.settings[o]=n}).bind("getData.datepicker",function(l,o){return this._get(f,o)});a.data(b,"datepicker",f);this._setDate(f,this._getDefaultDate(f),true);this._updateDatepicker(f);this._updateAlternate(f);f.dpDiv.show()}},_dialogDatepicker:function(b,f,j,l,o){b=this._dialogInst;if(!b){this.uuid+=1;this._dialogInput=a('<input type="text" id="'+("dp"+this.uuid)+'" style="position: absolute; top: -100px; width: 0px; z-index: -10;"/>');this._dialogInput.keydown(this._doKeyDown);a("body").append(this._dialogInput);
+b=this._dialogInst=this._newInst(this._dialogInput,false);b.settings={};a.data(this._dialogInput[0],"datepicker",b)}h(b.settings,l||{});f=f&&f.constructor==Date?this._formatDate(b,f):f;this._dialogInput.val(f);this._pos=o?o.length?o:[o.pageX,o.pageY]:null;if(!this._pos)this._pos=[document.documentElement.clientWidth/2-100+(document.documentElement.scrollLeft||document.body.scrollLeft),document.documentElement.clientHeight/2-150+(document.documentElement.scrollTop||document.body.scrollTop)];this._dialogInput.css("left",
+this._pos[0]+20+"px").css("top",this._pos[1]+"px");b.settings.onSelect=j;this._inDialog=true;this.dpDiv.addClass(this._dialogClass);this._showDatepicker(this._dialogInput[0]);a.blockUI&&a.blockUI(this.dpDiv);a.data(this._dialogInput[0],"datepicker",b);return this},_destroyDatepicker:function(b){var f=a(b),j=a.data(b,"datepicker");if(f.hasClass(this.markerClassName)){var l=b.nodeName.toLowerCase();a.removeData(b,"datepicker");if(l=="input"){j.append.remove();j.trigger.remove();f.removeClass(this.markerClassName).unbind("focus",
+this._showDatepicker).unbind("keydown",this._doKeyDown).unbind("keypress",this._doKeyPress).unbind("keyup",this._doKeyUp)}else if(l=="div"||l=="span")f.removeClass(this.markerClassName).empty()}},_enableDatepicker:function(b){var f=a(b),j=a.data(b,"datepicker");if(f.hasClass(this.markerClassName)){var l=b.nodeName.toLowerCase();if(l=="input"){b.disabled=false;j.trigger.filter("button").each(function(){this.disabled=false}).end().filter("img").css({opacity:"1.0",cursor:""})}else if(l=="div"||l=="span"){f=
+f.children("."+this._inlineClass);f.children().removeClass("ui-state-disabled");f.find("select.ui-datepicker-month, select.ui-datepicker-year").removeAttr("disabled")}this._disabledInputs=a.map(this._disabledInputs,function(o){return o==b?null:o})}},_disableDatepicker:function(b){var f=a(b),j=a.data(b,"datepicker");if(f.hasClass(this.markerClassName)){var l=b.nodeName.toLowerCase();if(l=="input"){b.disabled=true;j.trigger.filter("button").each(function(){this.disabled=true}).end().filter("img").css({opacity:"0.5",
+cursor:"default"})}else if(l=="div"||l=="span"){f=f.children("."+this._inlineClass);f.children().addClass("ui-state-disabled");f.find("select.ui-datepicker-month, select.ui-datepicker-year").attr("disabled","disabled")}this._disabledInputs=a.map(this._disabledInputs,function(o){return o==b?null:o});this._disabledInputs[this._disabledInputs.length]=b}},_isDisabledDatepicker:function(b){if(!b)return false;for(var f=0;f<this._disabledInputs.length;f++)if(this._disabledInputs[f]==b)return true;return false},
+_getInst:function(b){try{return a.data(b,"datepicker")}catch(f){throw"Missing instance data for this datepicker";}},_optionDatepicker:function(b,f,j){var l=this._getInst(b);if(arguments.length==2&&typeof f=="string")return f=="defaults"?a.extend({},a.datepicker._defaults):l?f=="all"?a.extend({},l.settings):this._get(l,f):null;var o=f||{};if(typeof f=="string"){o={};o[f]=j}if(l){this._curInst==l&&this._hideDatepicker();var n=this._getDateDatepicker(b,true),k=this._getMinMaxDate(l,"min"),m=this._getMinMaxDate(l,
+"max");h(l.settings,o);if(k!==null&&o.dateFormat!==d&&o.minDate===d)l.settings.minDate=this._formatDate(l,k);if(m!==null&&o.dateFormat!==d&&o.maxDate===d)l.settings.maxDate=this._formatDate(l,m);this._attachments(a(b),l);this._autoSize(l);this._setDate(l,n);this._updateAlternate(l);this._updateDatepicker(l)}},_changeDatepicker:function(b,f,j){this._optionDatepicker(b,f,j)},_refreshDatepicker:function(b){(b=this._getInst(b))&&this._updateDatepicker(b)},_setDateDatepicker:function(b,f){if(b=this._getInst(b)){this._setDate(b,
+f);this._updateDatepicker(b);this._updateAlternate(b)}},_getDateDatepicker:function(b,f){(b=this._getInst(b))&&!b.inline&&this._setDateFromField(b,f);return b?this._getDate(b):null},_doKeyDown:function(b){var f=a.datepicker._getInst(b.target),j=true,l=f.dpDiv.is(".ui-datepicker-rtl");f._keyEvent=true;if(a.datepicker._datepickerShowing)switch(b.keyCode){case 9:a.datepicker._hideDatepicker();j=false;break;case 13:j=a("td."+a.datepicker._dayOverClass+":not(."+a.datepicker._currentClass+")",f.dpDiv);
+j[0]?a.datepicker._selectDay(b.target,f.selectedMonth,f.selectedYear,j[0]):a.datepicker._hideDatepicker();return false;case 27:a.datepicker._hideDatepicker();break;case 33:a.datepicker._adjustDate(b.target,b.ctrlKey?-a.datepicker._get(f,"stepBigMonths"):-a.datepicker._get(f,"stepMonths"),"M");break;case 34:a.datepicker._adjustDate(b.target,b.ctrlKey?+a.datepicker._get(f,"stepBigMonths"):+a.datepicker._get(f,"stepMonths"),"M");break;case 35:if(b.ctrlKey||b.metaKey)a.datepicker._clearDate(b.target);
+j=b.ctrlKey||b.metaKey;break;case 36:if(b.ctrlKey||b.metaKey)a.datepicker._gotoToday(b.target);j=b.ctrlKey||b.metaKey;break;case 37:if(b.ctrlKey||b.metaKey)a.datepicker._adjustDate(b.target,l?+1:-1,"D");j=b.ctrlKey||b.metaKey;if(b.originalEvent.altKey)a.datepicker._adjustDate(b.target,b.ctrlKey?-a.datepicker._get(f,"stepBigMonths"):-a.datepicker._get(f,"stepMonths"),"M");break;case 38:if(b.ctrlKey||b.metaKey)a.datepicker._adjustDate(b.target,-7,"D");j=b.ctrlKey||b.metaKey;break;case 39:if(b.ctrlKey||
+b.metaKey)a.datepicker._adjustDate(b.target,l?-1:+1,"D");j=b.ctrlKey||b.metaKey;if(b.originalEvent.altKey)a.datepicker._adjustDate(b.target,b.ctrlKey?+a.datepicker._get(f,"stepBigMonths"):+a.datepicker._get(f,"stepMonths"),"M");break;case 40:if(b.ctrlKey||b.metaKey)a.datepicker._adjustDate(b.target,+7,"D");j=b.ctrlKey||b.metaKey;break;default:j=false}else if(b.keyCode==36&&b.ctrlKey)a.datepicker._showDatepicker(this);else j=false;if(j){b.preventDefault();b.stopPropagation()}},_doKeyPress:function(b){var f=
+a.datepicker._getInst(b.target);if(a.datepicker._get(f,"constrainInput")){f=a.datepicker._possibleChars(a.datepicker._get(f,"dateFormat"));var j=String.fromCharCode(b.charCode==d?b.keyCode:b.charCode);return b.ctrlKey||b.metaKey||j<" "||!f||f.indexOf(j)>-1}},_doKeyUp:function(b){b=a.datepicker._getInst(b.target);if(b.input.val()!=b.lastVal)try{if(a.datepicker.parseDate(a.datepicker._get(b,"dateFormat"),b.input?b.input.val():null,a.datepicker._getFormatConfig(b))){a.datepicker._setDateFromField(b);
+a.datepicker._updateAlternate(b);a.datepicker._updateDatepicker(b)}}catch(f){a.datepicker.log(f)}return true},_showDatepicker:function(b){b=b.target||b;if(b.nodeName.toLowerCase()!="input")b=a("input",b.parentNode)[0];if(!(a.datepicker._isDisabledDatepicker(b)||a.datepicker._lastInput==b)){var f=a.datepicker._getInst(b);if(a.datepicker._curInst&&a.datepicker._curInst!=f){a.datepicker._datepickerShowing&&a.datepicker._triggerOnClose(a.datepicker._curInst);a.datepicker._curInst.dpDiv.stop(true,true)}var j=
+a.datepicker._get(f,"beforeShow");h(f.settings,j?j.apply(b,[b,f]):{});f.lastVal=null;a.datepicker._lastInput=b;a.datepicker._setDateFromField(f);if(a.datepicker._inDialog)b.value="";if(!a.datepicker._pos){a.datepicker._pos=a.datepicker._findPos(b);a.datepicker._pos[1]+=b.offsetHeight}var l=false;a(b).parents().each(function(){l|=a(this).css("position")=="fixed";return!l});if(l&&a.browser.opera){a.datepicker._pos[0]-=document.documentElement.scrollLeft;a.datepicker._pos[1]-=document.documentElement.scrollTop}j=
+{left:a.datepicker._pos[0],top:a.datepicker._pos[1]};a.datepicker._pos=null;f.dpDiv.empty();f.dpDiv.css({position:"absolute",display:"block",top:"-1000px"});a.datepicker._updateDatepicker(f);j=a.datepicker._checkOffset(f,j,l);f.dpDiv.css({position:a.datepicker._inDialog&&a.blockUI?"static":l?"fixed":"absolute",display:"none",left:j.left+"px",top:j.top+"px"});if(!f.inline){j=a.datepicker._get(f,"showAnim");var o=a.datepicker._get(f,"duration"),n=function(){var k=f.dpDiv.find("iframe.ui-datepicker-cover");
+if(k.length){var m=a.datepicker._getBorders(f.dpDiv);k.css({left:-m[0],top:-m[1],width:f.dpDiv.outerWidth(),height:f.dpDiv.outerHeight()})}};f.dpDiv.zIndex(a(b).zIndex()+1);a.datepicker._datepickerShowing=true;a.effects&&a.effects[j]?f.dpDiv.show(j,a.datepicker._get(f,"showOptions"),o,n):f.dpDiv[j||"show"](j?o:null,n);if(!j||!o)n();f.input.is(":visible")&&!f.input.is(":disabled")&&f.input.focus();a.datepicker._curInst=f}}},_updateDatepicker:function(b){this.maxRows=4;var f=a.datepicker._getBorders(b.dpDiv);
+i=b;b.dpDiv.empty().append(this._generateHTML(b));var j=b.dpDiv.find("iframe.ui-datepicker-cover");j.length&&j.css({left:-f[0],top:-f[1],width:b.dpDiv.outerWidth(),height:b.dpDiv.outerHeight()});b.dpDiv.find("."+this._dayOverClass+" a").mouseover();f=this._getNumberOfMonths(b);j=f[1];b.dpDiv.removeClass("ui-datepicker-multi-2 ui-datepicker-multi-3 ui-datepicker-multi-4").width("");j>1&&b.dpDiv.addClass("ui-datepicker-multi-"+j).css("width",17*j+"em");b.dpDiv[(f[0]!=1||f[1]!=1?"add":"remove")+"Class"]("ui-datepicker-multi");
+b.dpDiv[(this._get(b,"isRTL")?"add":"remove")+"Class"]("ui-datepicker-rtl");b==a.datepicker._curInst&&a.datepicker._datepickerShowing&&b.input&&b.input.is(":visible")&&!b.input.is(":disabled")&&b.input[0]!=document.activeElement&&b.input.focus();if(b.yearshtml){var l=b.yearshtml;setTimeout(function(){l===b.yearshtml&&b.yearshtml&&b.dpDiv.find("select.ui-datepicker-year:first").replaceWith(b.yearshtml);l=b.yearshtml=null},0)}},_getBorders:function(b){var f=function(j){return{thin:1,medium:2,thick:3}[j]||
+j};return[parseFloat(f(b.css("border-left-width"))),parseFloat(f(b.css("border-top-width")))]},_checkOffset:function(b,f,j){var l=b.dpDiv.outerWidth(),o=b.dpDiv.outerHeight(),n=b.input?b.input.outerWidth():0,k=b.input?b.input.outerHeight():0,m=document.documentElement.clientWidth+a(document).scrollLeft(),p=document.documentElement.clientHeight+a(document).scrollTop();f.left-=this._get(b,"isRTL")?l-n:0;f.left-=j&&f.left==b.input.offset().left?a(document).scrollLeft():0;f.top-=j&&f.top==b.input.offset().top+
+k?a(document).scrollTop():0;f.left-=Math.min(f.left,f.left+l>m&&m>l?Math.abs(f.left+l-m):0);f.top-=Math.min(f.top,f.top+o>p&&p>o?Math.abs(o+k):0);return f},_findPos:function(b){for(var f=this._get(this._getInst(b),"isRTL");b&&(b.type=="hidden"||b.nodeType!=1||a.expr.filters.hidden(b));)b=b[f?"previousSibling":"nextSibling"];b=a(b).offset();return[b.left,b.top]},_triggerOnClose:function(b){var f=this._get(b,"onClose");if(f)f.apply(b.input?b.input[0]:null,[b.input?b.input.val():"",b])},_hideDatepicker:function(b){var f=
+this._curInst;if(!(!f||b&&f!=a.data(b,"datepicker")))if(this._datepickerShowing){b=this._get(f,"showAnim");var j=this._get(f,"duration"),l=function(){a.datepicker._tidyDialog(f);this._curInst=null};a.effects&&a.effects[b]?f.dpDiv.hide(b,a.datepicker._get(f,"showOptions"),j,l):f.dpDiv[b=="slideDown"?"slideUp":b=="fadeIn"?"fadeOut":"hide"](b?j:null,l);b||l();a.datepicker._triggerOnClose(f);this._datepickerShowing=false;this._lastInput=null;if(this._inDialog){this._dialogInput.css({position:"absolute",
+left:"0",top:"-100px"});if(a.blockUI){a.unblockUI();a("body").append(this.dpDiv)}}this._inDialog=false}},_tidyDialog:function(b){b.dpDiv.removeClass(this._dialogClass).unbind(".ui-datepicker-calendar")},_checkExternalClick:function(b){if(a.datepicker._curInst){b=a(b.target);b[0].id!=a.datepicker._mainDivId&&b.parents("#"+a.datepicker._mainDivId).length==0&&!b.hasClass(a.datepicker.markerClassName)&&!b.hasClass(a.datepicker._triggerClass)&&a.datepicker._datepickerShowing&&!(a.datepicker._inDialog&&
+a.blockUI)&&a.datepicker._hideDatepicker()}},_adjustDate:function(b,f,j){b=a(b);var l=this._getInst(b[0]);if(!this._isDisabledDatepicker(b[0])){this._adjustInstDate(l,f+(j=="M"?this._get(l,"showCurrentAtPos"):0),j);this._updateDatepicker(l)}},_gotoToday:function(b){b=a(b);var f=this._getInst(b[0]);if(this._get(f,"gotoCurrent")&&f.currentDay){f.selectedDay=f.currentDay;f.drawMonth=f.selectedMonth=f.currentMonth;f.drawYear=f.selectedYear=f.currentYear}else{var j=new Date;f.selectedDay=j.getDate();f.drawMonth=
+f.selectedMonth=j.getMonth();f.drawYear=f.selectedYear=j.getFullYear()}this._notifyChange(f);this._adjustDate(b)},_selectMonthYear:function(b,f,j){b=a(b);var l=this._getInst(b[0]);l._selectingMonthYear=false;l["selected"+(j=="M"?"Month":"Year")]=l["draw"+(j=="M"?"Month":"Year")]=parseInt(f.options[f.selectedIndex].value,10);this._notifyChange(l);this._adjustDate(b)},_clickMonthYear:function(b){var f=this._getInst(a(b)[0]);f.input&&f._selectingMonthYear&&setTimeout(function(){f.input.focus()},0);f._selectingMonthYear=
+!f._selectingMonthYear},_selectDay:function(b,f,j,l){var o=a(b);if(!(a(l).hasClass(this._unselectableClass)||this._isDisabledDatepicker(o[0]))){o=this._getInst(o[0]);o.selectedDay=o.currentDay=a("a",l).html();o.selectedMonth=o.currentMonth=f;o.selectedYear=o.currentYear=j;this._selectDate(b,this._formatDate(o,o.currentDay,o.currentMonth,o.currentYear))}},_clearDate:function(b){b=a(b);this._getInst(b[0]);this._selectDate(b,"")},_selectDate:function(b,f){b=this._getInst(a(b)[0]);f=f!=null?f:this._formatDate(b);
+b.input&&b.input.val(f);this._updateAlternate(b);var j=this._get(b,"onSelect");if(j)j.apply(b.input?b.input[0]:null,[f,b]);else b.input&&b.input.trigger("change");if(b.inline)this._updateDatepicker(b);else{this._hideDatepicker();this._lastInput=b.input[0];typeof b.input[0]!="object"&&b.input.focus();this._lastInput=null}},_updateAlternate:function(b){var f=this._get(b,"altField");if(f){var j=this._get(b,"altFormat")||this._get(b,"dateFormat"),l=this._getDate(b),o=this.formatDate(j,l,this._getFormatConfig(b));
+a(f).each(function(){a(this).val(o)})}},noWeekends:function(b){b=b.getDay();return[b>0&&b<6,""]},iso8601Week:function(b){b=new Date(b.getTime());b.setDate(b.getDate()+4-(b.getDay()||7));var f=b.getTime();b.setMonth(0);b.setDate(1);return Math.floor(Math.round((f-b)/864E5)/7)+1},parseDate:function(b,f,j){if(b==null||f==null)throw"Invalid arguments";f=typeof f=="object"?f.toString():f+"";if(f=="")return null;var l=(j?j.shortYearCutoff:null)||this._defaults.shortYearCutoff;l=typeof l!="string"?l:(new Date).getFullYear()%
+100+parseInt(l,10);for(var o=(j?j.dayNamesShort:null)||this._defaults.dayNamesShort,n=(j?j.dayNames:null)||this._defaults.dayNames,k=(j?j.monthNamesShort:null)||this._defaults.monthNamesShort,m=(j?j.monthNames:null)||this._defaults.monthNames,p=j=-1,q=-1,s=-1,r=false,u=function(z){(z=H+1<b.length&&b.charAt(H+1)==z)&&H++;return z},v=function(z){var I=u(z);z=new RegExp("^\\d{1,"+(z=="@"?14:z=="!"?20:z=="y"&&I?4:z=="o"?3:2)+"}");z=f.substring(y).match(z);if(!z)throw"Missing number at position "+y;y+=
+z[0].length;return parseInt(z[0],10)},w=function(z,I,N){z=a.map(u(z)?N:I,function(D,E){return[[E,D]]}).sort(function(D,E){return-(D[1].length-E[1].length)});var J=-1;a.each(z,function(D,E){D=E[1];if(f.substr(y,D.length).toLowerCase()==D.toLowerCase()){J=E[0];y+=D.length;return false}});if(J!=-1)return J+1;else throw"Unknown name at position "+y;},x=function(){if(f.charAt(y)!=b.charAt(H))throw"Unexpected literal at position "+y;y++},y=0,H=0;H<b.length;H++)if(r)if(b.charAt(H)=="'"&&!u("'"))r=false;
+else x();else switch(b.charAt(H)){case "d":q=v("d");break;case "D":w("D",o,n);break;case "o":s=v("o");break;case "m":p=v("m");break;case "M":p=w("M",k,m);break;case "y":j=v("y");break;case "@":var C=new Date(v("@"));j=C.getFullYear();p=C.getMonth()+1;q=C.getDate();break;case "!":C=new Date((v("!")-this._ticksTo1970)/1E4);j=C.getFullYear();p=C.getMonth()+1;q=C.getDate();break;case "'":if(u("'"))x();else r=true;break;default:x()}if(y<f.length)throw"Extra/unparsed characters found in date: "+f.substring(y);
+if(j==-1)j=(new Date).getFullYear();else if(j<100)j+=(new Date).getFullYear()-(new Date).getFullYear()%100+(j<=l?0:-100);if(s>-1){p=1;q=s;do{l=this._getDaysInMonth(j,p-1);if(q<=l)break;p++;q-=l}while(1)}C=this._daylightSavingAdjust(new Date(j,p-1,q));if(C.getFullYear()!=j||C.getMonth()+1!=p||C.getDate()!=q)throw"Invalid date";return C},ATOM:"yy-mm-dd",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",
+TICKS:"!",TIMESTAMP:"@",W3C:"yy-mm-dd",_ticksTo1970:(718685+Math.floor(492.5)-Math.floor(19.7)+Math.floor(4.925))*24*60*60*1E7,formatDate:function(b,f,j){if(!f)return"";var l=(j?j.dayNamesShort:null)||this._defaults.dayNamesShort,o=(j?j.dayNames:null)||this._defaults.dayNames,n=(j?j.monthNamesShort:null)||this._defaults.monthNamesShort;j=(j?j.monthNames:null)||this._defaults.monthNames;var k=function(u){(u=r+1<b.length&&b.charAt(r+1)==u)&&r++;return u},m=function(u,v,w){v=""+v;if(k(u))for(;v.length<
+w;)v="0"+v;return v},p=function(u,v,w,x){return k(u)?x[v]:w[v]},q="",s=false;if(f)for(var r=0;r<b.length;r++)if(s)if(b.charAt(r)=="'"&&!k("'"))s=false;else q+=b.charAt(r);else switch(b.charAt(r)){case "d":q+=m("d",f.getDate(),2);break;case "D":q+=p("D",f.getDay(),l,o);break;case "o":q+=m("o",Math.round(((new Date(f.getFullYear(),f.getMonth(),f.getDate())).getTime()-(new Date(f.getFullYear(),0,0)).getTime())/864E5),3);break;case "m":q+=m("m",f.getMonth()+1,2);break;case "M":q+=p("M",f.getMonth(),n,
+j);break;case "y":q+=k("y")?f.getFullYear():(f.getYear()%100<10?"0":"")+f.getYear()%100;break;case "@":q+=f.getTime();break;case "!":q+=f.getTime()*1E4+this._ticksTo1970;break;case "'":if(k("'"))q+="'";else s=true;break;default:q+=b.charAt(r)}return q},_possibleChars:function(b){for(var f="",j=false,l=function(n){(n=o+1<b.length&&b.charAt(o+1)==n)&&o++;return n},o=0;o<b.length;o++)if(j)if(b.charAt(o)=="'"&&!l("'"))j=false;else f+=b.charAt(o);else switch(b.charAt(o)){case "d":case "m":case "y":case "@":f+=
+"0123456789";break;case "D":case "M":return null;case "'":if(l("'"))f+="'";else j=true;break;default:f+=b.charAt(o)}return f},_get:function(b,f){return b.settings[f]!==d?b.settings[f]:this._defaults[f]},_setDateFromField:function(b,f){if(b.input.val()!=b.lastVal){var j=this._get(b,"dateFormat"),l=b.lastVal=b.input?b.input.val():null,o,n;o=n=this._getDefaultDate(b);var k=this._getFormatConfig(b);try{o=this.parseDate(j,l,k)||n}catch(m){this.log(m);l=f?"":l}b.selectedDay=o.getDate();b.drawMonth=b.selectedMonth=
+o.getMonth();b.drawYear=b.selectedYear=o.getFullYear();b.currentDay=l?o.getDate():0;b.currentMonth=l?o.getMonth():0;b.currentYear=l?o.getFullYear():0;this._adjustInstDate(b)}},_getDefaultDate:function(b){return this._restrictMinMax(b,this._determineDate(b,this._get(b,"defaultDate"),new Date))},_determineDate:function(b,f,j){var l=function(n){var k=new Date;k.setDate(k.getDate()+n);return k},o=function(n){try{return a.datepicker.parseDate(a.datepicker._get(b,"dateFormat"),n,a.datepicker._getFormatConfig(b))}catch(k){}var m=
+(n.toLowerCase().match(/^c/)?a.datepicker._getDate(b):null)||new Date,p=m.getFullYear(),q=m.getMonth();m=m.getDate();for(var s=/([+-]?[0-9]+)\s*(d|D|w|W|m|M|y|Y)?/g,r=s.exec(n);r;){switch(r[2]||"d"){case "d":case "D":m+=parseInt(r[1],10);break;case "w":case "W":m+=parseInt(r[1],10)*7;break;case "m":case "M":q+=parseInt(r[1],10);m=Math.min(m,a.datepicker._getDaysInMonth(p,q));break;case "y":case "Y":p+=parseInt(r[1],10);m=Math.min(m,a.datepicker._getDaysInMonth(p,q));break}r=s.exec(n)}return new Date(p,
+q,m)};if(f=(f=f==null||f===""?j:typeof f=="string"?o(f):typeof f=="number"?isNaN(f)?j:l(f):new Date(f.getTime()))&&f.toString()=="Invalid Date"?j:f){f.setHours(0);f.setMinutes(0);f.setSeconds(0);f.setMilliseconds(0)}return this._daylightSavingAdjust(f)},_daylightSavingAdjust:function(b){if(!b)return null;b.setHours(b.getHours()>12?b.getHours()+2:0);return b},_setDate:function(b,f,j){var l=!f,o=b.selectedMonth,n=b.selectedYear;f=this._restrictMinMax(b,this._determineDate(b,f,new Date));b.selectedDay=
+b.currentDay=f.getDate();b.drawMonth=b.selectedMonth=b.currentMonth=f.getMonth();b.drawYear=b.selectedYear=b.currentYear=f.getFullYear();if((o!=b.selectedMonth||n!=b.selectedYear)&&!j)this._notifyChange(b);this._adjustInstDate(b);if(b.input)b.input.val(l?"":this._formatDate(b))},_getDate:function(b){return!b.currentYear||b.input&&b.input.val()==""?null:this._daylightSavingAdjust(new Date(b.currentYear,b.currentMonth,b.currentDay))},_generateHTML:function(b){var f=new Date;f=this._daylightSavingAdjust(new Date(f.getFullYear(),
+f.getMonth(),f.getDate()));var j=this._get(b,"isRTL"),l=this._get(b,"showButtonPanel"),o=this._get(b,"hideIfNoPrevNext"),n=this._get(b,"navigationAsDateFormat"),k=this._getNumberOfMonths(b),m=this._get(b,"showCurrentAtPos"),p=this._get(b,"stepMonths"),q=k[0]!=1||k[1]!=1,s=this._daylightSavingAdjust(!b.currentDay?new Date(9999,9,9):new Date(b.currentYear,b.currentMonth,b.currentDay)),r=this._getMinMaxDate(b,"min"),u=this._getMinMaxDate(b,"max");m=b.drawMonth-m;var v=b.drawYear;if(m<0){m+=12;v--}if(u){var w=
+this._daylightSavingAdjust(new Date(u.getFullYear(),u.getMonth()-k[0]*k[1]+1,u.getDate()));for(w=r&&w<r?r:w;this._daylightSavingAdjust(new Date(v,m,1))>w;){m--;if(m<0){m=11;v--}}}b.drawMonth=m;b.drawYear=v;w=this._get(b,"prevText");w=!n?w:this.formatDate(w,this._daylightSavingAdjust(new Date(v,m-p,1)),this._getFormatConfig(b));w=this._canAdjustMonth(b,-1,v,m)?'<a class="ui-datepicker-prev ui-corner-all" onclick="DP_jQuery_'+g+".datepicker._adjustDate('#"+b.id+"', -"+p+", 'M');\" title=\""+w+'"><span class="ui-icon ui-icon-circle-triangle-'+
+(j?"e":"w")+'">'+w+"</span></a>":o?"":'<a class="ui-datepicker-prev ui-corner-all ui-state-disabled" title="'+w+'"><span class="ui-icon ui-icon-circle-triangle-'+(j?"e":"w")+'">'+w+"</span></a>";var x=this._get(b,"nextText");x=!n?x:this.formatDate(x,this._daylightSavingAdjust(new Date(v,m+p,1)),this._getFormatConfig(b));o=this._canAdjustMonth(b,+1,v,m)?'<a class="ui-datepicker-next ui-corner-all" onclick="DP_jQuery_'+g+".datepicker._adjustDate('#"+b.id+"', +"+p+", 'M');\" title=\""+x+'"><span class="ui-icon ui-icon-circle-triangle-'+
+(j?"w":"e")+'">'+x+"</span></a>":o?"":'<a class="ui-datepicker-next ui-corner-all ui-state-disabled" title="'+x+'"><span class="ui-icon ui-icon-circle-triangle-'+(j?"w":"e")+'">'+x+"</span></a>";p=this._get(b,"currentText");x=this._get(b,"gotoCurrent")&&b.currentDay?s:f;p=!n?p:this.formatDate(p,x,this._getFormatConfig(b));n=!b.inline?'<button type="button" class="ui-datepicker-close ui-state-default ui-priority-primary ui-corner-all" onclick="DP_jQuery_'+g+'.datepicker._hideDatepicker();">'+this._get(b,
+"closeText")+"</button>":"";l=l?'<div class="ui-datepicker-buttonpane ui-widget-content">'+(j?n:"")+(this._isInRange(b,x)?'<button type="button" class="ui-datepicker-current ui-state-default ui-priority-secondary ui-corner-all" onclick="DP_jQuery_'+g+".datepicker._gotoToday('#"+b.id+"');\">"+p+"</button>":"")+(j?"":n)+"</div>":"";n=parseInt(this._get(b,"firstDay"),10);n=isNaN(n)?0:n;p=this._get(b,"showWeek");x=this._get(b,"dayNames");this._get(b,"dayNamesShort");var y=this._get(b,"dayNamesMin"),H=
+this._get(b,"monthNames"),C=this._get(b,"monthNamesShort"),z=this._get(b,"beforeShowDay"),I=this._get(b,"showOtherMonths"),N=this._get(b,"selectOtherMonths");this._get(b,"calculateWeek");for(var J=this._getDefaultDate(b),D="",E=0;E<k[0];E++){var P="";this.maxRows=4;for(var L=0;L<k[1];L++){var Q=this._daylightSavingAdjust(new Date(v,m,b.selectedDay)),B=" ui-corner-all",F="";if(q){F+='<div class="ui-datepicker-group';if(k[1]>1)switch(L){case 0:F+=" ui-datepicker-group-first";B=" ui-corner-"+(j?"right":
+"left");break;case k[1]-1:F+=" ui-datepicker-group-last";B=" ui-corner-"+(j?"left":"right");break;default:F+=" ui-datepicker-group-middle";B="";break}F+='">'}F+='<div class="ui-datepicker-header ui-widget-header ui-helper-clearfix'+B+'">'+(/all|left/.test(B)&&E==0?j?o:w:"")+(/all|right/.test(B)&&E==0?j?w:o:"")+this._generateMonthYearHeader(b,m,v,r,u,E>0||L>0,H,C)+'</div><table class="ui-datepicker-calendar"><thead><tr>';var G=p?'<th class="ui-datepicker-week-col">'+this._get(b,"weekHeader")+"</th>":
+"";for(B=0;B<7;B++){var A=(B+n)%7;G+="<th"+((B+n+6)%7>=5?' class="ui-datepicker-week-end"':"")+'><span title="'+x[A]+'">'+y[A]+"</span></th>"}F+=G+"</tr></thead><tbody>";G=this._getDaysInMonth(v,m);if(v==b.selectedYear&&m==b.selectedMonth)b.selectedDay=Math.min(b.selectedDay,G);B=(this._getFirstDayOfMonth(v,m)-n+7)%7;G=Math.ceil((B+G)/7);this.maxRows=G=q?this.maxRows>G?this.maxRows:G:G;A=this._daylightSavingAdjust(new Date(v,m,1-B));for(var R=0;R<G;R++){F+="<tr>";var S=!p?"":'<td class="ui-datepicker-week-col">'+
+this._get(b,"calculateWeek")(A)+"</td>";for(B=0;B<7;B++){var M=z?z.apply(b.input?b.input[0]:null,[A]):[true,""],K=A.getMonth()!=m,O=K&&!N||!M[0]||r&&A<r||u&&A>u;S+='<td class="'+((B+n+6)%7>=5?" ui-datepicker-week-end":"")+(K?" ui-datepicker-other-month":"")+(A.getTime()==Q.getTime()&&m==b.selectedMonth&&b._keyEvent||J.getTime()==A.getTime()&&J.getTime()==Q.getTime()?" "+this._dayOverClass:"")+(O?" "+this._unselectableClass+" ui-state-disabled":"")+(K&&!I?"":" "+M[1]+(A.getTime()==s.getTime()?" "+
+this._currentClass:"")+(A.getTime()==f.getTime()?" ui-datepicker-today":""))+'"'+((!K||I)&&M[2]?' title="'+M[2]+'"':"")+(O?"":' onclick="DP_jQuery_'+g+".datepicker._selectDay('#"+b.id+"',"+A.getMonth()+","+A.getFullYear()+', this);return false;"')+">"+(K&&!I?"&#xa0;":O?'<span class="ui-state-default">'+A.getDate()+"</span>":'<a class="ui-state-default'+(A.getTime()==f.getTime()?" ui-state-highlight":"")+(A.getTime()==s.getTime()?" ui-state-active":"")+(K?" ui-priority-secondary":"")+'" href="#">'+
+A.getDate()+"</a>")+"</td>";A.setDate(A.getDate()+1);A=this._daylightSavingAdjust(A)}F+=S+"</tr>"}m++;if(m>11){m=0;v++}F+="</tbody></table>"+(q?"</div>"+(k[0]>0&&L==k[1]-1?'<div class="ui-datepicker-row-break"></div>':""):"");P+=F}D+=P}D+=l+(a.browser.msie&&parseInt(a.browser.version,10)<7&&!b.inline?'<iframe src="javascript:false;" class="ui-datepicker-cover" frameborder="0"></iframe>':"");b._keyEvent=false;return D},_generateMonthYearHeader:function(b,f,j,l,o,n,k,m){var p=this._get(b,"changeMonth"),
+q=this._get(b,"changeYear"),s=this._get(b,"showMonthAfterYear"),r='<div class="ui-datepicker-title">',u="";if(n||!p)u+='<span class="ui-datepicker-month">'+k[f]+"</span>";else{k=l&&l.getFullYear()==j;var v=o&&o.getFullYear()==j;u+='<select class="ui-datepicker-month" onchange="DP_jQuery_'+g+".datepicker._selectMonthYear('#"+b.id+"', this, 'M');\" onclick=\"DP_jQuery_"+g+".datepicker._clickMonthYear('#"+b.id+"');\">";for(var w=0;w<12;w++)if((!k||w>=l.getMonth())&&(!v||w<=o.getMonth()))u+='<option value="'+
+w+'"'+(w==f?' selected="selected"':"")+">"+m[w]+"</option>";u+="</select>"}s||(r+=u+(n||!(p&&q)?"&#xa0;":""));if(!b.yearshtml){b.yearshtml="";if(n||!q)r+='<span class="ui-datepicker-year">'+j+"</span>";else{m=this._get(b,"yearRange").split(":");var x=(new Date).getFullYear();k=function(y){y=y.match(/c[+-].*/)?j+parseInt(y.substring(1),10):y.match(/[+-].*/)?x+parseInt(y,10):parseInt(y,10);return isNaN(y)?x:y};f=k(m[0]);m=Math.max(f,k(m[1]||""));f=l?Math.max(f,l.getFullYear()):f;m=o?Math.min(m,o.getFullYear()):
+m;for(b.yearshtml+='<select class="ui-datepicker-year" onchange="DP_jQuery_'+g+".datepicker._selectMonthYear('#"+b.id+"', this, 'Y');\" onclick=\"DP_jQuery_"+g+".datepicker._clickMonthYear('#"+b.id+"');\">";f<=m;f++)b.yearshtml+='<option value="'+f+'"'+(f==j?' selected="selected"':"")+">"+f+"</option>";b.yearshtml+="</select>";r+=b.yearshtml;b.yearshtml=null}}r+=this._get(b,"yearSuffix");if(s)r+=(n||!(p&&q)?"&#xa0;":"")+u;r+="</div>";return r},_adjustInstDate:function(b,f,j){var l=b.drawYear+(j==
+"Y"?f:0),o=b.drawMonth+(j=="M"?f:0);f=Math.min(b.selectedDay,this._getDaysInMonth(l,o))+(j=="D"?f:0);l=this._restrictMinMax(b,this._daylightSavingAdjust(new Date(l,o,f)));b.selectedDay=l.getDate();b.drawMonth=b.selectedMonth=l.getMonth();b.drawYear=b.selectedYear=l.getFullYear();if(j=="M"||j=="Y")this._notifyChange(b)},_restrictMinMax:function(b,f){var j=this._getMinMaxDate(b,"min");b=this._getMinMaxDate(b,"max");f=j&&f<j?j:f;return f=b&&f>b?b:f},_notifyChange:function(b){var f=this._get(b,"onChangeMonthYear");
+if(f)f.apply(b.input?b.input[0]:null,[b.selectedYear,b.selectedMonth+1,b])},_getNumberOfMonths:function(b){b=this._get(b,"numberOfMonths");return b==null?[1,1]:typeof b=="number"?[1,b]:b},_getMinMaxDate:function(b,f){return this._determineDate(b,this._get(b,f+"Date"),null)},_getDaysInMonth:function(b,f){return 32-this._daylightSavingAdjust(new Date(b,f,32)).getDate()},_getFirstDayOfMonth:function(b,f){return(new Date(b,f,1)).getDay()},_canAdjustMonth:function(b,f,j,l){var o=this._getNumberOfMonths(b);
+j=this._daylightSavingAdjust(new Date(j,l+(f<0?f:o[0]*o[1]),1));f<0&&j.setDate(this._getDaysInMonth(j.getFullYear(),j.getMonth()));return this._isInRange(b,j)},_isInRange:function(b,f){var j=this._getMinMaxDate(b,"min");b=this._getMinMaxDate(b,"max");return(!j||f.getTime()>=j.getTime())&&(!b||f.getTime()<=b.getTime())},_getFormatConfig:function(b){var f=this._get(b,"shortYearCutoff");f=typeof f!="string"?f:(new Date).getFullYear()%100+parseInt(f,10);return{shortYearCutoff:f,dayNamesShort:this._get(b,
+"dayNamesShort"),dayNames:this._get(b,"dayNames"),monthNamesShort:this._get(b,"monthNamesShort"),monthNames:this._get(b,"monthNames")}},_formatDate:function(b,f,j,l){if(!f){b.currentDay=b.selectedDay;b.currentMonth=b.selectedMonth;b.currentYear=b.selectedYear}f=f?typeof f=="object"?f:this._daylightSavingAdjust(new Date(l,j,f)):this._daylightSavingAdjust(new Date(b.currentYear,b.currentMonth,b.currentDay));return this.formatDate(this._get(b,"dateFormat"),f,this._getFormatConfig(b))}});a.fn.datepicker=
+function(b){if(!this.length)return this;if(!a.datepicker.initialized){a(document).mousedown(a.datepicker._checkExternalClick).find("body").append(a.datepicker.dpDiv);a.datepicker.initialized=true}var f=Array.prototype.slice.call(arguments,1);if(typeof b=="string"&&(b=="isDisabled"||b=="getDate"||b=="widget"))return a.datepicker["_"+b+"Datepicker"].apply(a.datepicker,[this[0]].concat(f));if(b=="option"&&arguments.length==2&&typeof arguments[1]=="string")return a.datepicker["_"+b+"Datepicker"].apply(a.datepicker,
+[this[0]].concat(f));return this.each(function(){typeof b=="string"?a.datepicker["_"+b+"Datepicker"].apply(a.datepicker,[this].concat(f)):a.datepicker._attachDatepicker(this,b)})};a.datepicker=new c;a.datepicker.initialized=false;a.datepicker.uuid=(new Date).getTime();a.datepicker.version="1.8.14";window["DP_jQuery_"+g]=a})(jQuery);
+(function(a,d){var c={buttons:true,height:true,maxHeight:true,maxWidth:true,minHeight:true,minWidth:true,width:true},e={maxHeight:true,maxWidth:true,minHeight:true,minWidth:true},h=a.attrFn||{val:true,css:true,html:true,text:true,data:true,width:true,height:true,offset:true,click:true};a.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",using:function(g){var i=a(this).css(g).offset().top;i<0&&a(this).css("top",g.top-i)}},resizable:true,show:null,stack:true,title:"",width:300,zIndex:1E3},_create:function(){this.originalTitle=this.element.attr("title");if(typeof this.originalTitle!=="string")this.originalTitle="";this.options.title=this.options.title||this.originalTitle;var g=this,i=g.options,b=i.title||"&#160;",f=a.ui.dialog.getTitleId(g.element),j=(g.uiDialog=a("<div></div>")).appendTo(document.body).hide().addClass("ui-dialog ui-widget ui-widget-content ui-corner-all "+
+i.dialogClass).css({zIndex:i.zIndex}).attr("tabIndex",-1).css("outline",0).keydown(function(n){if(i.closeOnEscape&&n.keyCode&&n.keyCode===a.ui.keyCode.ESCAPE){g.close(n);n.preventDefault()}}).attr({role:"dialog","aria-labelledby":f}).mousedown(function(n){g.moveToTop(false,n)});g.element.show().removeAttr("title").addClass("ui-dialog-content ui-widget-content").appendTo(j);var l=(g.uiDialogTitlebar=a("<div></div>")).addClass("ui-dialog-titlebar ui-widget-header ui-corner-all ui-helper-clearfix").prependTo(j),
+o=a('<a href="#"></a>').addClass("ui-dialog-titlebar-close ui-corner-all").attr("role","button").hover(function(){o.addClass("ui-state-hover")},function(){o.removeClass("ui-state-hover")}).focus(function(){o.addClass("ui-state-focus")}).blur(function(){o.removeClass("ui-state-focus")}).click(function(n){g.close(n);return false}).appendTo(l);(g.uiDialogTitlebarCloseText=a("<span></span>")).addClass("ui-icon ui-icon-closethick").text(i.closeText).appendTo(o);a("<span></span>").addClass("ui-dialog-title").attr("id",
+f).html(b).prependTo(l);if(a.isFunction(i.beforeclose)&&!a.isFunction(i.beforeClose))i.beforeClose=i.beforeclose;l.find("*").add(l).disableSelection();i.draggable&&a.fn.draggable&&g._makeDraggable();i.resizable&&a.fn.resizable&&g._makeResizable();g._createButtons(i.buttons);g._isOpen=false;a.fn.bgiframe&&j.bgiframe()},_init:function(){this.options.autoOpen&&this.open()},destroy:function(){var g=this;g.overlay&&g.overlay.destroy();g.uiDialog.hide();g.element.unbind(".dialog").removeData("dialog").removeClass("ui-dialog-content ui-widget-content").hide().appendTo("body");
+g.uiDialog.remove();g.originalTitle&&g.element.attr("title",g.originalTitle);return g},widget:function(){return this.uiDialog},close:function(g){var i=this,b,f;if(false!==i._trigger("beforeClose",g)){i.overlay&&i.overlay.destroy();i.uiDialog.unbind("keypress.ui-dialog");i._isOpen=false;if(i.options.hide)i.uiDialog.hide(i.options.hide,function(){i._trigger("close",g)});else{i.uiDialog.hide();i._trigger("close",g)}a.ui.dialog.overlay.resize();if(i.options.modal){b=0;a(".ui-dialog").each(function(){if(this!==
+i.uiDialog[0]){f=a(this).css("z-index");isNaN(f)||(b=Math.max(b,f))}});a.ui.dialog.maxZ=b}return i}},isOpen:function(){return this._isOpen},moveToTop:function(g,i){var b=this,f=b.options;if(f.modal&&!g||!f.stack&&!f.modal)return b._trigger("focus",i);if(f.zIndex>a.ui.dialog.maxZ)a.ui.dialog.maxZ=f.zIndex;if(b.overlay){a.ui.dialog.maxZ+=1;b.overlay.$el.css("z-index",a.ui.dialog.overlay.maxZ=a.ui.dialog.maxZ)}g={scrollTop:b.element.attr("scrollTop"),scrollLeft:b.element.attr("scrollLeft")};a.ui.dialog.maxZ+=
+1;b.uiDialog.css("z-index",a.ui.dialog.maxZ);b.element.attr(g);b._trigger("focus",i);return b},open:function(){if(!this._isOpen){var g=this,i=g.options,b=g.uiDialog;g.overlay=i.modal?new a.ui.dialog.overlay(g):null;g._size();g._position(i.position);b.show(i.show);g.moveToTop(true);i.modal&&b.bind("keypress.ui-dialog",function(f){if(f.keyCode===a.ui.keyCode.TAB){var j=a(":tabbable",this),l=j.filter(":first");j=j.filter(":last");if(f.target===j[0]&&!f.shiftKey){l.focus(1);return false}else if(f.target===
+l[0]&&f.shiftKey){j.focus(1);return false}}});a(g.element.find(":tabbable").get().concat(b.find(".ui-dialog-buttonpane :tabbable").get().concat(b.get()))).eq(0).focus();g._isOpen=true;g._trigger("open");return g}},_createButtons:function(g){var i=this,b=false,f=a("<div></div>").addClass("ui-dialog-buttonpane ui-widget-content ui-helper-clearfix"),j=a("<div></div>").addClass("ui-dialog-buttonset").appendTo(f);i.uiDialog.find(".ui-dialog-buttonpane").remove();typeof g==="object"&&g!==null&&a.each(g,
+function(){return!(b=true)});if(b){a.each(g,function(l,o){o=a.isFunction(o)?{click:o,text:l}:o;var n=a('<button type="button"></button>').click(function(){o.click.apply(i.element[0],arguments)}).appendTo(j);a.each(o,function(k,m){if(k!=="click")k in h?n[k](m):n.attr(k,m)});a.fn.button&&n.button()});f.appendTo(i.uiDialog)}},_makeDraggable:function(){function g(l){return{position:l.position,offset:l.offset}}var i=this,b=i.options,f=a(document),j;i.uiDialog.draggable({cancel:".ui-dialog-content, .ui-dialog-titlebar-close",
+handle:".ui-dialog-titlebar",containment:"document",start:function(l,o){j=b.height==="auto"?"auto":a(this).height();a(this).height(a(this).height()).addClass("ui-dialog-dragging");i._trigger("dragStart",l,g(o))},drag:function(l,o){i._trigger("drag",l,g(o))},stop:function(l,o){b.position=[o.position.left-f.scrollLeft(),o.position.top-f.scrollTop()];a(this).removeClass("ui-dialog-dragging").height(j);i._trigger("dragStop",l,g(o));a.ui.dialog.overlay.resize()}})},_makeResizable:function(g){function i(l){return{originalPosition:l.originalPosition,
+originalSize:l.originalSize,position:l.position,size:l.size}}g=g===d?this.options.resizable:g;var b=this,f=b.options,j=b.uiDialog.css("position");g=typeof g==="string"?g:"n,e,s,w,se,sw,ne,nw";b.uiDialog.resizable({cancel:".ui-dialog-content",containment:"document",alsoResize:b.element,maxWidth:f.maxWidth,maxHeight:f.maxHeight,minWidth:f.minWidth,minHeight:b._minHeight(),handles:g,start:function(l,o){a(this).addClass("ui-dialog-resizing");b._trigger("resizeStart",l,i(o))},resize:function(l,o){b._trigger("resize",
+l,i(o))},stop:function(l,o){a(this).removeClass("ui-dialog-resizing");f.height=a(this).height();f.width=a(this).width();b._trigger("resizeStop",l,i(o));a.ui.dialog.overlay.resize()}}).css("position",j).find(".ui-resizable-se").addClass("ui-icon ui-icon-grip-diagonal-se")},_minHeight:function(){var g=this.options;return g.height==="auto"?g.minHeight:Math.min(g.minHeight,g.height)},_position:function(g){var i=[],b=[0,0],f;if(g){if(typeof g==="string"||typeof g==="object"&&"0"in g){i=g.split?g.split(" "):
+[g[0],g[1]];if(i.length===1)i[1]=i[0];a.each(["left","top"],function(j,l){if(+i[j]===i[j]){b[j]=i[j];i[j]=l}});g={my:i.join(" "),at:i.join(" "),offset:b.join(" ")}}g=a.extend({},a.ui.dialog.prototype.options.position,g)}else g=a.ui.dialog.prototype.options.position;(f=this.uiDialog.is(":visible"))||this.uiDialog.show();this.uiDialog.css({top:0,left:0}).position(a.extend({of:window},g));f||this.uiDialog.hide()},_setOptions:function(g){var i=this,b={},f=false;a.each(g,function(j,l){i._setOption(j,l);
+if(j in c)f=true;if(j in e)b[j]=l});f&&this._size();this.uiDialog.is(":data(resizable)")&&this.uiDialog.resizable("option",b)},_setOption:function(g,i){var b=this,f=b.uiDialog;switch(g){case "beforeclose":g="beforeClose";break;case "buttons":b._createButtons(i);break;case "closeText":b.uiDialogTitlebarCloseText.text(""+i);break;case "dialogClass":f.removeClass(b.options.dialogClass).addClass("ui-dialog ui-widget ui-widget-content ui-corner-all "+i);break;case "disabled":i?f.addClass("ui-dialog-disabled"):
+f.removeClass("ui-dialog-disabled");break;case "draggable":var j=f.is(":data(draggable)");j&&!i&&f.draggable("destroy");!j&&i&&b._makeDraggable();break;case "position":b._position(i);break;case "resizable":(j=f.is(":data(resizable)"))&&!i&&f.resizable("destroy");j&&typeof i==="string"&&f.resizable("option","handles",i);!j&&i!==false&&b._makeResizable(i);break;case "title":a(".ui-dialog-title",b.uiDialogTitlebar).html(""+(i||"&#160;"));break}a.Widget.prototype._setOption.apply(b,arguments)},_size:function(){var g=
+this.options,i,b,f=this.uiDialog.is(":visible");this.element.show().css({width:"auto",minHeight:0,height:0});if(g.minWidth>g.width)g.width=g.minWidth;i=this.uiDialog.css({height:"auto",width:g.width}).height();b=Math.max(0,g.minHeight-i);if(g.height==="auto")if(a.support.minHeight)this.element.css({minHeight:b,height:"auto"});else{this.uiDialog.show();g=this.element.css("height","auto").height();f||this.uiDialog.hide();this.element.height(Math.max(g,b))}else this.element.height(Math.max(g.height-
+i,0));this.uiDialog.is(":data(resizable)")&&this.uiDialog.resizable("option","minHeight",this._minHeight())}});a.extend(a.ui.dialog,{version:"1.8.14",uuid:0,maxZ:0,getTitleId:function(g){g=g.attr("id");if(!g){this.uuid+=1;g=this.uuid}return"ui-dialog-title-"+g},overlay:function(g){this.$el=a.ui.dialog.overlay.create(g)}});a.extend(a.ui.dialog.overlay,{instances:[],oldInstances:[],maxZ:0,events:a.map("focus,mousedown,mouseup,keydown,keypress,click".split(","),function(g){return g+".dialog-overlay"}).join(" "),
+create:function(g){if(this.instances.length===0){setTimeout(function(){a.ui.dialog.overlay.instances.length&&a(document).bind(a.ui.dialog.overlay.events,function(b){if(a(b.target).zIndex()<a.ui.dialog.overlay.maxZ)return false})},1);a(document).bind("keydown.dialog-overlay",function(b){if(g.options.closeOnEscape&&b.keyCode&&b.keyCode===a.ui.keyCode.ESCAPE){g.close(b);b.preventDefault()}});a(window).bind("resize.dialog-overlay",a.ui.dialog.overlay.resize)}var i=(this.oldInstances.pop()||a("<div></div>").addClass("ui-widget-overlay")).appendTo(document.body).css({width:this.width(),
+height:this.height()});a.fn.bgiframe&&i.bgiframe();this.instances.push(i);return i},destroy:function(g){var i=a.inArray(g,this.instances);i!=-1&&this.oldInstances.push(this.instances.splice(i,1)[0]);this.instances.length===0&&a([document,window]).unbind(".dialog-overlay");g.remove();var b=0;a.each(this.instances,function(){b=Math.max(b,this.css("z-index"))});this.maxZ=b},height:function(){var g,i;if(a.browser.msie&&a.browser.version<7){g=Math.max(document.documentElement.scrollHeight,document.body.scrollHeight);
+i=Math.max(document.documentElement.offsetHeight,document.body.offsetHeight);return g<i?a(window).height()+"px":g+"px"}else return a(document).height()+"px"},width:function(){var g,i;if(a.browser.msie){g=Math.max(document.documentElement.scrollWidth,document.body.scrollWidth);i=Math.max(document.documentElement.offsetWidth,document.body.offsetWidth);return g<i?a(window).width()+"px":g+"px"}else return a(document).width()+"px"},resize:function(){var g=a([]);a.each(a.ui.dialog.overlay.instances,function(){g=
+g.add(this)});g.css({width:0,height:0}).css({width:a.ui.dialog.overlay.width(),height:a.ui.dialog.overlay.height()})}});a.extend(a.ui.dialog.overlay.prototype,{destroy:function(){a.ui.dialog.overlay.destroy(this.$el)}})})(jQuery);
+(function(a){a.ui=a.ui||{};var d=/left|center|right/,c=/top|center|bottom/,e=a.fn.position,h=a.fn.offset;a.fn.position=function(g){if(!g||!g.of)return e.apply(this,arguments);g=a.extend({},g);var i=a(g.of),b=i[0],f=(g.collision||"flip").split(" "),j=g.offset?g.offset.split(" "):[0,0],l,o,n;if(b.nodeType===9){l=i.width();o=i.height();n={top:0,left:0}}else if(b.setTimeout){l=i.width();o=i.height();n={top:i.scrollTop(),left:i.scrollLeft()}}else if(b.preventDefault){g.at="left top";l=o=0;n={top:g.of.pageY,
+left:g.of.pageX}}else{l=i.outerWidth();o=i.outerHeight();n=i.offset()}a.each(["my","at"],function(){var k=(g[this]||"").split(" ");if(k.length===1)k=d.test(k[0])?k.concat(["center"]):c.test(k[0])?["center"].concat(k):["center","center"];k[0]=d.test(k[0])?k[0]:"center";k[1]=c.test(k[1])?k[1]:"center";g[this]=k});if(f.length===1)f[1]=f[0];j[0]=parseInt(j[0],10)||0;if(j.length===1)j[1]=j[0];j[1]=parseInt(j[1],10)||0;if(g.at[0]==="right")n.left+=l;else if(g.at[0]==="center")n.left+=l/2;if(g.at[1]==="bottom")n.top+=
+o;else if(g.at[1]==="center")n.top+=o/2;n.left+=j[0];n.top+=j[1];return this.each(function(){var k=a(this),m=k.outerWidth(),p=k.outerHeight(),q=parseInt(a.curCSS(this,"marginLeft",true))||0,s=parseInt(a.curCSS(this,"marginTop",true))||0,r=m+q+(parseInt(a.curCSS(this,"marginRight",true))||0),u=p+s+(parseInt(a.curCSS(this,"marginBottom",true))||0),v=a.extend({},n),w;if(g.my[0]==="right")v.left-=m;else if(g.my[0]==="center")v.left-=m/2;if(g.my[1]==="bottom")v.top-=p;else if(g.my[1]==="center")v.top-=
+p/2;v.left=Math.round(v.left);v.top=Math.round(v.top);w={left:v.left-q,top:v.top-s};a.each(["left","top"],function(x,y){a.ui.position[f[x]]&&a.ui.position[f[x]][y](v,{targetWidth:l,targetHeight:o,elemWidth:m,elemHeight:p,collisionPosition:w,collisionWidth:r,collisionHeight:u,offset:j,my:g.my,at:g.at})});a.fn.bgiframe&&k.bgiframe();k.offset(a.extend(v,{using:g.using}))})};a.ui.position={fit:{left:function(g,i){var b=a(window);b=i.collisionPosition.left+i.collisionWidth-b.width()-b.scrollLeft();g.left=
+b>0?g.left-b:Math.max(g.left-i.collisionPosition.left,g.left)},top:function(g,i){var b=a(window);b=i.collisionPosition.top+i.collisionHeight-b.height()-b.scrollTop();g.top=b>0?g.top-b:Math.max(g.top-i.collisionPosition.top,g.top)}},flip:{left:function(g,i){if(i.at[0]!=="center"){var b=a(window);b=i.collisionPosition.left+i.collisionWidth-b.width()-b.scrollLeft();var f=i.my[0]==="left"?-i.elemWidth:i.my[0]==="right"?i.elemWidth:0,j=i.at[0]==="left"?i.targetWidth:-i.targetWidth,l=-2*i.offset[0];g.left+=
+i.collisionPosition.left<0?f+j+l:b>0?f+j+l:0}},top:function(g,i){if(i.at[1]!=="center"){var b=a(window);b=i.collisionPosition.top+i.collisionHeight-b.height()-b.scrollTop();var f=i.my[1]==="top"?-i.elemHeight:i.my[1]==="bottom"?i.elemHeight:0,j=i.at[1]==="top"?i.targetHeight:-i.targetHeight,l=-2*i.offset[1];g.top+=i.collisionPosition.top<0?f+j+l:b>0?f+j+l:0}}}};if(!a.offset.setOffset){a.offset.setOffset=function(g,i){if(/static/.test(a.curCSS(g,"position")))g.style.position="relative";var b=a(g),
+f=b.offset(),j=parseInt(a.curCSS(g,"top",true),10)||0,l=parseInt(a.curCSS(g,"left",true),10)||0;f={top:i.top-f.top+j,left:i.left-f.left+l};"using"in i?i.using.call(g,f):b.css(f)};a.fn.offset=function(g){var i=this[0];if(!i||!i.ownerDocument)return null;if(g)return this.each(function(){a.offset.setOffset(this,g)});return h.call(this)}}})(jQuery);
+(function(a,d){a.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=a("<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();a.Widget.prototype.destroy.apply(this,arguments)},value:function(c){if(c===d)return this._value();this._setOption("value",c);return this},_setOption:function(c,e){if(c==="value"){this.options.value=e;this._refreshValue();this._value()===this.options.max&&this._trigger("complete")}a.Widget.prototype._setOption.apply(this,arguments)},_value:function(){var c=this.options.value;if(typeof c!=="number")c=0;return Math.min(this.options.max,Math.max(this.min,c))},_percentage:function(){return 100*
+this._value()/this.options.max},_refreshValue:function(){var c=this.value(),e=this._percentage();if(this.oldValue!==c){this.oldValue=c;this._trigger("change")}this.valueDiv.toggle(c>this.min).toggleClass("ui-corner-right",c===this.options.max).width(e.toFixed(0)+"%");this.element.attr("aria-valuenow",c)}});a.extend(a.ui.progressbar,{version:"1.8.14"})})(jQuery);
+(function(a){a.widget("ui.slider",a.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 d=this,c=this.options,e=this.element.find(".ui-slider-handle").addClass("ui-state-default ui-corner-all"),h=c.values&&c.values.length||1,g=[];this._mouseSliding=this._keySliding=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"+(c.disabled?" ui-slider-disabled ui-disabled":""));this.range=a([]);if(c.range){if(c.range===true){if(!c.values)c.values=[this._valueMin(),this._valueMin()];if(c.values.length&&c.values.length!==2)c.values=[c.values[0],c.values[0]]}this.range=a("<div></div>").appendTo(this.element).addClass("ui-slider-range ui-widget-header"+(c.range==="min"||c.range==="max"?" ui-slider-range-"+c.range:""))}for(var i=e.length;i<h;i+=1)g.push("<a class='ui-slider-handle ui-state-default ui-corner-all' href='#'></a>");
+this.handles=e.add(a(g.join("")).appendTo(d.element));this.handle=this.handles.eq(0);this.handles.add(this.range).filter("a").click(function(b){b.preventDefault()}).hover(function(){c.disabled||a(this).addClass("ui-state-hover")},function(){a(this).removeClass("ui-state-hover")}).focus(function(){if(c.disabled)a(this).blur();else{a(".ui-slider .ui-state-focus").removeClass("ui-state-focus");a(this).addClass("ui-state-focus")}}).blur(function(){a(this).removeClass("ui-state-focus")});this.handles.each(function(b){a(this).data("index.ui-slider-handle",
+b)});this.handles.keydown(function(b){var f=true,j=a(this).data("index.ui-slider-handle"),l,o,n;if(!d.options.disabled){switch(b.keyCode){case a.ui.keyCode.HOME:case a.ui.keyCode.END:case a.ui.keyCode.PAGE_UP:case a.ui.keyCode.PAGE_DOWN:case a.ui.keyCode.UP:case a.ui.keyCode.RIGHT:case a.ui.keyCode.DOWN:case a.ui.keyCode.LEFT:f=false;if(!d._keySliding){d._keySliding=true;a(this).addClass("ui-state-active");l=d._start(b,j);if(l===false)return}break}n=d.options.step;l=d.options.values&&d.options.values.length?
+(o=d.values(j)):(o=d.value());switch(b.keyCode){case a.ui.keyCode.HOME:o=d._valueMin();break;case a.ui.keyCode.END:o=d._valueMax();break;case a.ui.keyCode.PAGE_UP:o=d._trimAlignValue(l+(d._valueMax()-d._valueMin())/5);break;case a.ui.keyCode.PAGE_DOWN:o=d._trimAlignValue(l-(d._valueMax()-d._valueMin())/5);break;case a.ui.keyCode.UP:case a.ui.keyCode.RIGHT:if(l===d._valueMax())return;o=d._trimAlignValue(l+n);break;case a.ui.keyCode.DOWN:case a.ui.keyCode.LEFT:if(l===d._valueMin())return;o=d._trimAlignValue(l-
+n);break}d._slide(b,j,o);return f}}).keyup(function(b){var f=a(this).data("index.ui-slider-handle");if(d._keySliding){d._keySliding=false;d._stop(b,f);d._change(b,f);a(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(d){var c=this.options,e,h,g,i,b;if(c.disabled)return false;this.elementSize={width:this.element.outerWidth(),height:this.element.outerHeight()};this.elementOffset=this.element.offset();e=this._normValueFromMouse({x:d.pageX,y:d.pageY});h=this._valueMax()-this._valueMin()+1;i=this;this.handles.each(function(f){var j=Math.abs(e-i.values(f));if(h>j){h=j;g=a(this);b=f}});if(c.range===true&&this.values(1)===c.min){b+=1;g=a(this.handles[b])}if(this._start(d,b)===false)return false;
+this._mouseSliding=true;i._handleIndex=b;g.addClass("ui-state-active").focus();c=g.offset();this._clickOffset=!a(d.target).parents().andSelf().is(".ui-slider-handle")?{left:0,top:0}:{left:d.pageX-c.left-g.width()/2,top:d.pageY-c.top-g.height()/2-(parseInt(g.css("borderTopWidth"),10)||0)-(parseInt(g.css("borderBottomWidth"),10)||0)+(parseInt(g.css("marginTop"),10)||0)};this.handles.hasClass("ui-state-hover")||this._slide(d,b,e);return this._animateOff=true},_mouseStart:function(){return true},_mouseDrag:function(d){var c=
+this._normValueFromMouse({x:d.pageX,y:d.pageY});this._slide(d,this._handleIndex,c);return false},_mouseStop:function(d){this.handles.removeClass("ui-state-active");this._mouseSliding=false;this._stop(d,this._handleIndex);this._change(d,this._handleIndex);this._clickOffset=this._handleIndex=null;return this._animateOff=false},_detectOrientation:function(){this.orientation=this.options.orientation==="vertical"?"vertical":"horizontal"},_normValueFromMouse:function(d){var c;if(this.orientation==="horizontal"){c=
+this.elementSize.width;d=d.x-this.elementOffset.left-(this._clickOffset?this._clickOffset.left:0)}else{c=this.elementSize.height;d=d.y-this.elementOffset.top-(this._clickOffset?this._clickOffset.top:0)}c=d/c;if(c>1)c=1;if(c<0)c=0;if(this.orientation==="vertical")c=1-c;d=this._valueMax()-this._valueMin();return this._trimAlignValue(this._valueMin()+c*d)},_start:function(d,c){var e={handle:this.handles[c],value:this.value()};if(this.options.values&&this.options.values.length){e.value=this.values(c);
+e.values=this.values()}return this._trigger("start",d,e)},_slide:function(d,c,e){var h;if(this.options.values&&this.options.values.length){h=this.values(c?0:1);if(this.options.values.length===2&&this.options.range===true&&(c===0&&e>h||c===1&&e<h))e=h;if(e!==this.values(c)){h=this.values();h[c]=e;d=this._trigger("slide",d,{handle:this.handles[c],value:e,values:h});this.values(c?0:1);d!==false&&this.values(c,e,true)}}else if(e!==this.value()){d=this._trigger("slide",d,{handle:this.handles[c],value:e});
+d!==false&&this.value(e)}},_stop:function(d,c){var e={handle:this.handles[c],value:this.value()};if(this.options.values&&this.options.values.length){e.value=this.values(c);e.values=this.values()}this._trigger("stop",d,e)},_change:function(d,c){if(!this._keySliding&&!this._mouseSliding){var e={handle:this.handles[c],value:this.value()};if(this.options.values&&this.options.values.length){e.value=this.values(c);e.values=this.values()}this._trigger("change",d,e)}},value:function(d){if(arguments.length){this.options.value=
+this._trimAlignValue(d);this._refreshValue();this._change(null,0)}else return this._value()},values:function(d,c){var e,h,g;if(arguments.length>1){this.options.values[d]=this._trimAlignValue(c);this._refreshValue();this._change(null,d)}else if(arguments.length)if(a.isArray(arguments[0])){e=this.options.values;h=arguments[0];for(g=0;g<e.length;g+=1){e[g]=this._trimAlignValue(h[g]);this._change(null,g)}this._refreshValue()}else return this.options.values&&this.options.values.length?this._values(d):
+this.value();else return this._values()},_setOption:function(d,c){var e,h=0;if(a.isArray(this.options.values))h=this.options.values.length;a.Widget.prototype._setOption.apply(this,arguments);switch(d){case "disabled":if(c){this.handles.filter(".ui-state-focus").blur();this.handles.removeClass("ui-state-hover");this.handles.attr("disabled","disabled");this.element.addClass("ui-disabled")}else{this.handles.removeAttr("disabled");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(e=0;e<h;e+=1)this._change(null,e);this._animateOff=false;break}},_value:function(){var d=this.options.value;return d=this._trimAlignValue(d)},_values:function(d){var c,e;if(arguments.length){c=this.options.values[d];
+return c=this._trimAlignValue(c)}else{c=this.options.values.slice();for(e=0;e<c.length;e+=1)c[e]=this._trimAlignValue(c[e]);return c}},_trimAlignValue:function(d){if(d<=this._valueMin())return this._valueMin();if(d>=this._valueMax())return this._valueMax();var c=this.options.step>0?this.options.step:1,e=(d-this._valueMin())%c;alignValue=d-e;if(Math.abs(e)*2>=c)alignValue+=e>0?c:-c;return parseFloat(alignValue.toFixed(5))},_valueMin:function(){return this.options.min},_valueMax:function(){return this.options.max},
+_refreshValue:function(){var d=this.options.range,c=this.options,e=this,h=!this._animateOff?c.animate:false,g,i={},b,f,j,l;if(this.options.values&&this.options.values.length)this.handles.each(function(o){g=(e.values(o)-e._valueMin())/(e._valueMax()-e._valueMin())*100;i[e.orientation==="horizontal"?"left":"bottom"]=g+"%";a(this).stop(1,1)[h?"animate":"css"](i,c.animate);if(e.options.range===true)if(e.orientation==="horizontal"){if(o===0)e.range.stop(1,1)[h?"animate":"css"]({left:g+"%"},c.animate);
+if(o===1)e.range[h?"animate":"css"]({width:g-b+"%"},{queue:false,duration:c.animate})}else{if(o===0)e.range.stop(1,1)[h?"animate":"css"]({bottom:g+"%"},c.animate);if(o===1)e.range[h?"animate":"css"]({height:g-b+"%"},{queue:false,duration:c.animate})}b=g});else{f=this.value();j=this._valueMin();l=this._valueMax();g=l!==j?(f-j)/(l-j)*100:0;i[e.orientation==="horizontal"?"left":"bottom"]=g+"%";this.handle.stop(1,1)[h?"animate":"css"](i,c.animate);if(d==="min"&&this.orientation==="horizontal")this.range.stop(1,
+1)[h?"animate":"css"]({width:g+"%"},c.animate);if(d==="max"&&this.orientation==="horizontal")this.range[h?"animate":"css"]({width:100-g+"%"},{queue:false,duration:c.animate});if(d==="min"&&this.orientation==="vertical")this.range.stop(1,1)[h?"animate":"css"]({height:g+"%"},c.animate);if(d==="max"&&this.orientation==="vertical")this.range[h?"animate":"css"]({height:100-g+"%"},{queue:false,duration:c.animate})}}});a.extend(a.ui.slider,{version:"1.8.14"})})(jQuery);
+(function(a,d){function c(){return++h}function e(){return++g}var h=0,g=0;a.widget("ui.tabs",{options:{add:null,ajaxOptions:null,cache:false,cookie:null,collapsible:false,disable:null,disabled:[],enable:null,event:"click",fx:null,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(i,b){if(i=="selected")this.options.collapsible&&
+b==this.options.selected||this.select(b);else{this.options[i]=b;this._tabify()}},_tabId:function(i){return i.title&&i.title.replace(/\s/g,"_").replace(/[^\w\u00c0-\uFFFF-]/g,"")||this.options.idPrefix+c()},_sanitizeSelector:function(i){return i.replace(/:/g,"\\:")},_cookie:function(){var i=this.cookie||(this.cookie=this.options.cookie.name||"ui-tabs-"+e());return a.cookie.apply(null,[i].concat(a.makeArray(arguments)))},_ui:function(i,b){return{tab:i,panel:b,index:this.anchors.index(i)}},_cleanup:function(){this.lis.filter(".ui-state-processing").removeClass("ui-state-processing").find("span:data(label.tabs)").each(function(){var i=
+a(this);i.html(i.data("label.tabs")).removeData("label.tabs")})},_tabify:function(i){function b(r,u){r.css("display","");!a.support.opacity&&u.opacity&&r[0].style.removeAttribute("filter")}var f=this,j=this.options,l=/^#.+/;this.list=this.element.find("ol,ul").eq(0);this.lis=a(" > li:has(a[href])",this.list);this.anchors=this.lis.map(function(){return a("a",this)[0]});this.panels=a([]);this.anchors.each(function(r,u){var v=a(u).attr("href"),w=v.split("#")[0],x;if(w&&(w===location.toString().split("#")[0]||
+(x=a("base")[0])&&w===x.href)){v=u.hash;u.href=v}if(l.test(v))f.panels=f.panels.add(f.element.find(f._sanitizeSelector(v)));else if(v&&v!=="#"){a.data(u,"href.tabs",v);a.data(u,"load.tabs",v.replace(/#.*$/,""));v=f._tabId(u);u.href="#"+v;u=f.element.find("#"+v);if(!u.length){u=a(j.panelTemplate).attr("id",v).addClass("ui-tabs-panel ui-widget-content ui-corner-bottom").insertAfter(f.panels[r-1]||f.list);u.data("destroy.tabs",true)}f.panels=f.panels.add(u)}else j.disabled.push(r)});if(i){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");if(j.selected===d){location.hash&&this.anchors.each(function(r,u){if(u.hash==location.hash){j.selected=r;return false}});if(typeof j.selected!=="number"&&j.cookie)j.selected=parseInt(f._cookie(),10);if(typeof j.selected!=="number"&&this.lis.filter(".ui-tabs-selected").length)j.selected=
+this.lis.index(this.lis.filter(".ui-tabs-selected"));j.selected=j.selected||(this.lis.length?0:-1)}else if(j.selected===null)j.selected=-1;j.selected=j.selected>=0&&this.anchors[j.selected]||j.selected<0?j.selected:0;j.disabled=a.unique(j.disabled.concat(a.map(this.lis.filter(".ui-state-disabled"),function(r){return f.lis.index(r)}))).sort();a.inArray(j.selected,j.disabled)!=-1&&j.disabled.splice(a.inArray(j.selected,j.disabled),1);this.panels.addClass("ui-tabs-hide");this.lis.removeClass("ui-tabs-selected ui-state-active");
+if(j.selected>=0&&this.anchors.length){f.element.find(f._sanitizeSelector(f.anchors[j.selected].hash)).removeClass("ui-tabs-hide");this.lis.eq(j.selected).addClass("ui-tabs-selected ui-state-active");f.element.queue("tabs",function(){f._trigger("show",null,f._ui(f.anchors[j.selected],f.element.find(f._sanitizeSelector(f.anchors[j.selected].hash))[0]))});this.load(j.selected)}a(window).bind("unload",function(){f.lis.add(f.anchors).unbind(".tabs");f.lis=f.anchors=f.panels=null})}else j.selected=this.lis.index(this.lis.filter(".ui-tabs-selected"));
+this.element[j.collapsible?"addClass":"removeClass"]("ui-tabs-collapsible");j.cookie&&this._cookie(j.selected,j.cookie);i=0;for(var o;o=this.lis[i];i++)a(o)[a.inArray(i,j.disabled)!=-1&&!a(o).hasClass("ui-tabs-selected")?"addClass":"removeClass"]("ui-state-disabled");j.cache===false&&this.anchors.removeData("cache.tabs");this.lis.add(this.anchors).unbind(".tabs");if(j.event!=="mouseover"){var n=function(r,u){u.is(":not(.ui-state-disabled)")&&u.addClass("ui-state-"+r)},k=function(r,u){u.removeClass("ui-state-"+
+r)};this.lis.bind("mouseover.tabs",function(){n("hover",a(this))});this.lis.bind("mouseout.tabs",function(){k("hover",a(this))});this.anchors.bind("focus.tabs",function(){n("focus",a(this).closest("li"))});this.anchors.bind("blur.tabs",function(){k("focus",a(this).closest("li"))})}var m,p;if(j.fx)if(a.isArray(j.fx)){m=j.fx[0];p=j.fx[1]}else m=p=j.fx;var q=p?function(r,u){a(r).closest("li").addClass("ui-tabs-selected ui-state-active");u.hide().removeClass("ui-tabs-hide").animate(p,p.duration||"normal",
+function(){b(u,p);f._trigger("show",null,f._ui(r,u[0]))})}:function(r,u){a(r).closest("li").addClass("ui-tabs-selected ui-state-active");u.removeClass("ui-tabs-hide");f._trigger("show",null,f._ui(r,u[0]))},s=m?function(r,u){u.animate(m,m.duration||"normal",function(){f.lis.removeClass("ui-tabs-selected ui-state-active");u.addClass("ui-tabs-hide");b(u,m);f.element.dequeue("tabs")})}:function(r,u){f.lis.removeClass("ui-tabs-selected ui-state-active");u.addClass("ui-tabs-hide");f.element.dequeue("tabs")};
+this.anchors.bind(j.event+".tabs",function(){var r=this,u=a(r).closest("li"),v=f.panels.filter(":not(.ui-tabs-hide)"),w=f.element.find(f._sanitizeSelector(r.hash));if(u.hasClass("ui-tabs-selected")&&!j.collapsible||u.hasClass("ui-state-disabled")||u.hasClass("ui-state-processing")||f.panels.filter(":animated").length||f._trigger("select",null,f._ui(this,w[0]))===false){this.blur();return false}j.selected=f.anchors.index(this);f.abort();if(j.collapsible)if(u.hasClass("ui-tabs-selected")){j.selected=
+-1;j.cookie&&f._cookie(j.selected,j.cookie);f.element.queue("tabs",function(){s(r,v)}).dequeue("tabs");this.blur();return false}else if(!v.length){j.cookie&&f._cookie(j.selected,j.cookie);f.element.queue("tabs",function(){q(r,w)});f.load(f.anchors.index(this));this.blur();return false}j.cookie&&f._cookie(j.selected,j.cookie);if(w.length){v.length&&f.element.queue("tabs",function(){s(r,v)});f.element.queue("tabs",function(){q(r,w)});f.load(f.anchors.index(this))}else throw"jQuery UI Tabs: Mismatching fragment identifier.";
+a.browser.msie&&this.blur()});this.anchors.bind("click.tabs",function(){return false})},_getIndex:function(i){if(typeof i=="string")i=this.anchors.index(this.anchors.filter("[href$="+i+"]"));return i},destroy:function(){var i=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 b=
+a.data(this,"href.tabs");if(b)this.href=b;var f=a(this).unbind(".tabs");a.each(["href","load","cache"],function(j,l){f.removeData(l+".tabs")})});this.lis.unbind(".tabs").add(this.panels).each(function(){a.data(this,"destroy.tabs")?a(this).remove():a(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")});i.cookie&&this._cookie(null,i.cookie);return this},add:function(i,
+b,f){if(f===d)f=this.anchors.length;var j=this,l=this.options;b=a(l.tabTemplate.replace(/#\{href\}/g,i).replace(/#\{label\}/g,b));i=!i.indexOf("#")?i.replace("#",""):this._tabId(a("a",b)[0]);b.addClass("ui-state-default ui-corner-top").data("destroy.tabs",true);var o=j.element.find("#"+i);o.length||(o=a(l.panelTemplate).attr("id",i).data("destroy.tabs",true));o.addClass("ui-tabs-panel ui-widget-content ui-corner-bottom ui-tabs-hide");if(f>=this.lis.length){b.appendTo(this.list);o.appendTo(this.list[0].parentNode)}else{b.insertBefore(this.lis[f]);
+o.insertBefore(this.panels[f])}l.disabled=a.map(l.disabled,function(n){return n>=f?++n:n});this._tabify();if(this.anchors.length==1){l.selected=0;b.addClass("ui-tabs-selected ui-state-active");o.removeClass("ui-tabs-hide");this.element.queue("tabs",function(){j._trigger("show",null,j._ui(j.anchors[0],j.panels[0]))});this.load(0)}this._trigger("add",null,this._ui(this.anchors[f],this.panels[f]));return this},remove:function(i){i=this._getIndex(i);var b=this.options,f=this.lis.eq(i).remove(),j=this.panels.eq(i).remove();
+if(f.hasClass("ui-tabs-selected")&&this.anchors.length>1)this.select(i+(i+1<this.anchors.length?1:-1));b.disabled=a.map(a.grep(b.disabled,function(l){return l!=i}),function(l){return l>=i?--l:l});this._tabify();this._trigger("remove",null,this._ui(f.find("a")[0],j[0]));return this},enable:function(i){i=this._getIndex(i);var b=this.options;if(a.inArray(i,b.disabled)!=-1){this.lis.eq(i).removeClass("ui-state-disabled");b.disabled=a.grep(b.disabled,function(f){return f!=i});this._trigger("enable",null,
+this._ui(this.anchors[i],this.panels[i]));return this}},disable:function(i){i=this._getIndex(i);var b=this.options;if(i!=b.selected){this.lis.eq(i).addClass("ui-state-disabled");b.disabled.push(i);b.disabled.sort();this._trigger("disable",null,this._ui(this.anchors[i],this.panels[i]))}return this},select:function(i){i=this._getIndex(i);if(i==-1)if(this.options.collapsible&&this.options.selected!=-1)i=this.options.selected;else return this;this.anchors.eq(i).trigger(this.options.event+".tabs");return this},
+load:function(i){i=this._getIndex(i);var b=this,f=this.options,j=this.anchors.eq(i)[0],l=a.data(j,"load.tabs");this.abort();if(!l||this.element.queue("tabs").length!==0&&a.data(j,"cache.tabs"))this.element.dequeue("tabs");else{this.lis.eq(i).addClass("ui-state-processing");if(f.spinner){var o=a("span",j);o.data("label.tabs",o.html()).html(f.spinner)}this.xhr=a.ajax(a.extend({},f.ajaxOptions,{url:l,success:function(n,k){b.element.find(b._sanitizeSelector(j.hash)).html(n);b._cleanup();f.cache&&a.data(j,
+"cache.tabs",true);b._trigger("load",null,b._ui(b.anchors[i],b.panels[i]));try{f.ajaxOptions.success(n,k)}catch(m){}},error:function(n,k){b._cleanup();b._trigger("load",null,b._ui(b.anchors[i],b.panels[i]));try{f.ajaxOptions.error(n,k,i,j)}catch(m){}}}));b.element.dequeue("tabs");return this}},abort:function(){this.element.queue([]);this.panels.stop(false,true);this.element.queue("tabs",this.element.queue("tabs").splice(-2,2));if(this.xhr){this.xhr.abort();delete this.xhr}this._cleanup();return this},
+url:function(i,b){this.anchors.eq(i).removeData("cache.tabs").data("load.tabs",b);return this},length:function(){return this.anchors.length}});a.extend(a.ui.tabs,{version:"1.8.14"});a.extend(a.ui.tabs.prototype,{rotation:null,rotate:function(i,b){var f=this,j=this.options,l=f._rotate||(f._rotate=function(o){clearTimeout(f.rotation);f.rotation=setTimeout(function(){var n=j.selected;f.select(++n<f.anchors.length?n:0)},i);o&&o.stopPropagation()});b=f._unrotate||(f._unrotate=!b?function(o){o.clientX&&
+f.rotate(null)}:function(){t=j.selected;l()});if(i){this.element.bind("tabsshow",l);this.anchors.bind(j.event+".tabs",b);l()}else{clearTimeout(f.rotation);this.element.unbind("tabsshow",l);this.anchors.unbind(j.event+".tabs",b);delete this._rotate;delete this._unrotate}return this}})})(jQuery);
diff --git a/lib/scripts/jquery/jquery.cookie.js b/lib/scripts/jquery/jquery.cookie.js
new file mode 100644
index 000000000..6df1faca2
--- /dev/null
+++ b/lib/scripts/jquery/jquery.cookie.js
@@ -0,0 +1,96 @@
+/**
+ * Cookie plugin
+ *
+ * Copyright (c) 2006 Klaus Hartl (stilbuero.de)
+ * Dual licensed under the MIT and GPL licenses:
+ * http://www.opensource.org/licenses/mit-license.php
+ * http://www.gnu.org/licenses/gpl.html
+ *
+ */
+
+/**
+ * Create a cookie with the given name and value and other optional parameters.
+ *
+ * @example $.cookie('the_cookie', 'the_value');
+ * @desc Set the value of a cookie.
+ * @example $.cookie('the_cookie', 'the_value', { expires: 7, path: '/', domain: 'jquery.com', secure: true });
+ * @desc Create a cookie with all available options.
+ * @example $.cookie('the_cookie', 'the_value');
+ * @desc Create a session cookie.
+ * @example $.cookie('the_cookie', null);
+ * @desc Delete a cookie by passing null as value. Keep in mind that you have to use the same path and domain
+ * used when the cookie was set.
+ *
+ * @param String name The name of the cookie.
+ * @param String value The value of the cookie.
+ * @param Object options An object literal containing key/value pairs to provide optional cookie attributes.
+ * @option Number|Date expires Either an integer specifying the expiration date from now on in days or a Date object.
+ * If a negative value is specified (e.g. a date in the past), the cookie will be deleted.
+ * If set to null or omitted, the cookie will be a session cookie and will not be retained
+ * when the the browser exits.
+ * @option String path The value of the path atribute of the cookie (default: path of page that created the cookie).
+ * @option String domain The value of the domain attribute of the cookie (default: domain of page that created the cookie).
+ * @option Boolean secure If true, the secure attribute of the cookie will be set and the cookie transmission will
+ * require a secure protocol (like HTTPS).
+ * @type undefined
+ *
+ * @name $.cookie
+ * @cat Plugins/Cookie
+ * @author Klaus Hartl/klaus.hartl@stilbuero.de
+ */
+
+/**
+ * Get the value of a cookie with the given name.
+ *
+ * @example $.cookie('the_cookie');
+ * @desc Get the value of a cookie.
+ *
+ * @param String name The name of the cookie.
+ * @return The value of the cookie.
+ * @type String
+ *
+ * @name $.cookie
+ * @cat Plugins/Cookie
+ * @author Klaus Hartl/klaus.hartl@stilbuero.de
+ */
+jQuery.cookie = function(name, value, options) {
+ if (typeof value != 'undefined') { // name and value given, set cookie
+ options = options || {};
+ if (value === null) {
+ value = '';
+ options.expires = -1;
+ }
+ var expires = '';
+ if (options.expires && (typeof options.expires == 'number' || options.expires.toUTCString)) {
+ var date;
+ if (typeof options.expires == 'number') {
+ date = new Date();
+ date.setTime(date.getTime() + (options.expires * 24 * 60 * 60 * 1000));
+ } else {
+ date = options.expires;
+ }
+ expires = '; expires=' + date.toUTCString(); // use expires attribute, max-age is not supported by IE
+ }
+ // CAUTION: Needed to parenthesize options.path and options.domain
+ // in the following expressions, otherwise they evaluate to undefined
+ // in the packed version for some reason...
+ var path = options.path ? '; path=' + (options.path) : '';
+ var domain = options.domain ? '; domain=' + (options.domain) : '';
+ var secure = options.secure ? '; secure' : '';
+ document.cookie = [name, '=', encodeURIComponent(value), expires, path, domain, secure].join('');
+ } else { // only name given, get cookie
+ var cookieValue = null;
+ if (document.cookie && document.cookie != '') {
+ var cookies = document.cookie.split(';');
+ for (var i = 0; i < cookies.length; i++) {
+ var cookie = jQuery.trim(cookies[i]);
+ // Does this cookie string begin with the name we want?
+ if (cookie.substring(0, name.length + 1) == (name + '=')) {
+ cookieValue = decodeURIComponent(cookie.substring(name.length + 1));
+ break;
+ }
+ }
+ }
+ return cookieValue;
+ }
+}; \ No newline at end of file
diff --git a/lib/scripts/jquery/jquery.js b/lib/scripts/jquery/jquery.js
new file mode 100644
index 000000000..f3201aacb
--- /dev/null
+++ b/lib/scripts/jquery/jquery.js
@@ -0,0 +1,8981 @@
+/*!
+ * jQuery JavaScript Library v1.6.2
+ * http://jquery.com/
+ *
+ * Copyright 2011, John Resig
+ * Dual licensed under the MIT or GPL Version 2 licenses.
+ * http://jquery.org/license
+ *
+ * Includes Sizzle.js
+ * http://sizzlejs.com/
+ * Copyright 2011, The Dojo Foundation
+ * Released under the MIT, BSD, and GPL Licenses.
+ *
+ * Date: Thu Jun 30 14:16:56 2011 -0400
+ */
+(function( window, undefined ) {
+
+// Use the correct document accordingly with window argument (sandbox)
+var document = window.document,
+ navigator = window.navigator,
+ location = window.location;
+var jQuery = (function() {
+
+// Define a local copy of jQuery
+var jQuery = function( selector, context ) {
+ // The jQuery object is actually just the init constructor 'enhanced'
+ return new jQuery.fn.init( selector, context, rootjQuery );
+ },
+
+ // Map over jQuery in case of overwrite
+ _jQuery = window.jQuery,
+
+ // Map over the $ in case of overwrite
+ _$ = window.$,
+
+ // A central reference to the root jQuery(document)
+ rootjQuery,
+
+ // A simple way to check for HTML strings or ID strings
+ // (both of which we optimize for)
+ quickExpr = /^(?:[^<]*(<[\w\W]+>)[^>]*$|#([\w\-]*)$)/,
+
+ // Check if a string has a non-whitespace character in it
+ rnotwhite = /\S/,
+
+ // Used for trimming whitespace
+ trimLeft = /^\s+/,
+ trimRight = /\s+$/,
+
+ // Check for digits
+ rdigit = /\d/,
+
+ // Match a standalone tag
+ rsingleTag = /^<(\w+)\s*\/?>(?:<\/\1>)?$/,
+
+ // JSON RegExp
+ rvalidchars = /^[\],:{}\s]*$/,
+ rvalidescape = /\\(?:["\\\/bfnrt]|u[0-9a-fA-F]{4})/g,
+ rvalidtokens = /"[^"\\\n\r]*"|true|false|null|-?\d+(?:\.\d*)?(?:[eE][+\-]?\d+)?/g,
+ rvalidbraces = /(?:^|:|,)(?:\s*\[)+/g,
+
+ // Useragent RegExp
+ rwebkit = /(webkit)[ \/]([\w.]+)/,
+ ropera = /(opera)(?:.*version)?[ \/]([\w.]+)/,
+ rmsie = /(msie) ([\w.]+)/,
+ rmozilla = /(mozilla)(?:.*? rv:([\w.]+))?/,
+
+ // Matches dashed string for camelizing
+ rdashAlpha = /-([a-z])/ig,
+
+ // Used by jQuery.camelCase as callback to replace()
+ fcamelCase = function( all, letter ) {
+ return letter.toUpperCase();
+ },
+
+ // Keep a UserAgent string for use with jQuery.browser
+ userAgent = navigator.userAgent,
+
+ // For matching the engine and version of the browser
+ browserMatch,
+
+ // The deferred used on DOM ready
+ readyList,
+
+ // The ready event handler
+ DOMContentLoaded,
+
+ // Save a reference to some core methods
+ toString = Object.prototype.toString,
+ hasOwn = Object.prototype.hasOwnProperty,
+ push = Array.prototype.push,
+ slice = Array.prototype.slice,
+ trim = String.prototype.trim,
+ indexOf = Array.prototype.indexOf,
+
+ // [[Class]] -> type pairs
+ class2type = {};
+
+jQuery.fn = jQuery.prototype = {
+ constructor: jQuery,
+ init: function( selector, context, rootjQuery ) {
+ var match, elem, ret, doc;
+
+ // Handle $(""), $(null), or $(undefined)
+ if ( !selector ) {
+ return this;
+ }
+
+ // Handle $(DOMElement)
+ if ( selector.nodeType ) {
+ this.context = this[0] = selector;
+ this.length = 1;
+ return this;
+ }
+
+ // The body element only exists once, optimize finding it
+ if ( selector === "body" && !context && document.body ) {
+ this.context = document;
+ this[0] = document.body;
+ this.selector = selector;
+ this.length = 1;
+ return this;
+ }
+
+ // Handle HTML strings
+ if ( typeof selector === "string" ) {
+ // Are we dealing with HTML string or an ID?
+ 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 = quickExpr.exec( selector );
+ }
+
+ // Verify a match, and that no context was specified for #id
+ if ( match && (match[1] || !context) ) {
+
+ // HANDLE: $(html) -> $(array)
+ if ( match[1] ) {
+ context = context instanceof jQuery ? context[0] : context;
+ doc = (context ? context.ownerDocument || context : document);
+
+ // If a single string is passed in and it's a single tag
+ // just do a createElement and skip the rest
+ ret = rsingleTag.exec( selector );
+
+ if ( ret ) {
+ if ( jQuery.isPlainObject( context ) ) {
+ selector = [ document.createElement( ret[1] ) ];
+ jQuery.fn.attr.call( selector, context, true );
+
+ } else {
+ selector = [ doc.createElement( ret[1] ) ];
+ }
+
+ } else {
+ ret = jQuery.buildFragment( [ match[1] ], [ doc ] );
+ selector = (ret.cacheable ? jQuery.clone(ret.fragment) : ret.fragment).childNodes;
+ }
+
+ 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.6.2",
+
+ // 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 slice.call( this, 0 );
+ },
+
+ // 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 = this.constructor();
+
+ if ( jQuery.isArray( elems ) ) {
+ push.apply( ret, elems );
+
+ } else {
+ jQuery.merge( ret, 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 ) {
+ // Attach the listeners
+ jQuery.bindReady();
+
+ // Add the callback
+ readyList.done( fn );
+
+ return this;
+ },
+
+ eq: function( 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( slice.apply( this, arguments ),
+ "slice", 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: 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 ) {
+ // Either a released hold or an DOMready/load event and not yet ready
+ if ( (wait === true && !--jQuery.readyWait) || (wait !== true && !jQuery.isReady) ) {
+ // 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" ).unbind( "ready" );
+ }
+ }
+ },
+
+ bindReady: function() {
+ if ( readyList ) {
+ return;
+ }
+
+ readyList = jQuery._Deferred();
+
+ // Catch cases where $(document).ready() is called after the
+ // browser event has already occurred.
+ if ( document.readyState === "complete" ) {
+ // Handle it asynchronously to allow scripts the opportunity to delay ready
+ return setTimeout( jQuery.ready, 1 );
+ }
+
+ // Mozilla, Opera and webkit nightlies currently support this event
+ 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 if ( document.attachEvent ) {
+ // 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 toplevel = false;
+
+ try {
+ toplevel = window.frameElement == null;
+ } catch(e) {}
+
+ if ( document.documentElement.doScroll && toplevel ) {
+ doScrollCheck();
+ }
+ }
+ },
+
+ // 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";
+ },
+
+ // A crude way of determining if an object is a window
+ isWindow: function( obj ) {
+ return obj && typeof obj === "object" && "setInterval" in obj;
+ },
+
+ isNaN: function( obj ) {
+ return obj == null || !rdigit.test( obj ) || isNaN( obj );
+ },
+
+ type: function( obj ) {
+ return obj == null ?
+ String( obj ) :
+ class2type[ 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;
+ }
+
+ // Not own constructor property must be Object
+ if ( obj.constructor &&
+ !hasOwn.call(obj, "constructor") &&
+ !hasOwn.call(obj.constructor.prototype, "isPrototypeOf") ) {
+ 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 || hasOwn.call( obj, key );
+ },
+
+ isEmptyObject: function( obj ) {
+ for ( var name in obj ) {
+ return false;
+ }
+ return true;
+ },
+
+ error: function( msg ) {
+ throw msg;
+ },
+
+ parseJSON: function( data ) {
+ if ( typeof data !== "string" || !data ) {
+ 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
+ // (xml & tmp used internally)
+ parseXML: function( data , xml , tmp ) {
+
+ 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 );
+ }
+
+ tmp = xml.documentElement;
+
+ if ( ! tmp || ! tmp.nodeName || tmp.nodeName === "parsererror" ) {
+ 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 && 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 );
+ }
+ },
+
+ // Converts a dashed string to camelCased string;
+ // Used by both the css and data modules
+ camelCase: function( string ) {
+ return string.replace( rdashAlpha, fcamelCase );
+ },
+
+ nodeName: function( elem, name ) {
+ return elem.nodeName && elem.nodeName.toUpperCase() === name.toUpperCase();
+ },
+
+ // args is for internal usage only
+ each: function( object, callback, args ) {
+ var name, i = 0,
+ length = object.length,
+ isObj = length === undefined || jQuery.isFunction( object );
+
+ if ( args ) {
+ if ( isObj ) {
+ for ( name in object ) {
+ if ( callback.apply( object[ name ], args ) === false ) {
+ break;
+ }
+ }
+ } else {
+ for ( ; i < length; ) {
+ if ( callback.apply( object[ i++ ], args ) === false ) {
+ break;
+ }
+ }
+ }
+
+ // A special, fast, case for the most common use of each
+ } else {
+ if ( isObj ) {
+ for ( name in object ) {
+ if ( callback.call( object[ name ], name, object[ name ] ) === false ) {
+ break;
+ }
+ }
+ } else {
+ for ( ; i < length; ) {
+ if ( callback.call( object[ i ], i, object[ i++ ] ) === false ) {
+ break;
+ }
+ }
+ }
+ }
+
+ return object;
+ },
+
+ // Use native String.trim function wherever possible
+ trim: trim ?
+ function( text ) {
+ return text == null ?
+ "" :
+ trim.call( text );
+ } :
+
+ // Otherwise use our own trimming functionality
+ function( text ) {
+ return text == null ?
+ "" :
+ text.toString().replace( trimLeft, "" ).replace( trimRight, "" );
+ },
+
+ // results is for internal usage only
+ makeArray: function( array, results ) {
+ var ret = results || [];
+
+ if ( array != null ) {
+ // The window, strings (and functions) also have 'length'
+ // The extra typeof function check is to prevent crashes
+ // in Safari 2 (See: #3039)
+ // Tweaked logic slightly to handle Blackberry 4.7 RegExp issues #6930
+ var type = jQuery.type( array );
+
+ if ( array.length == null || type === "string" || type === "function" || type === "regexp" || jQuery.isWindow( array ) ) {
+ push.call( ret, array );
+ } else {
+ jQuery.merge( ret, array );
+ }
+ }
+
+ return ret;
+ },
+
+ inArray: function( elem, array ) {
+
+ if ( indexOf ) {
+ return indexOf.call( array, elem );
+ }
+
+ for ( var i = 0, length = array.length; i < length; i++ ) {
+ if ( array[ i ] === elem ) {
+ return i;
+ }
+ }
+
+ return -1;
+ },
+
+ merge: function( first, second ) {
+ var i = first.length,
+ j = 0;
+
+ if ( typeof second.length === "number" ) {
+ for ( var l = second.length; 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 ret = [], retVal;
+ inv = !!inv;
+
+ // Go through the array, only saving the items
+ // that pass the validator function
+ for ( var i = 0, length = elems.length; 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 ) {
+ if ( typeof context === "string" ) {
+ var 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
+ var args = slice.call( arguments, 2 ),
+ proxy = function() {
+ return fn.apply( context, args.concat( 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 || proxy.guid || jQuery.guid++;
+
+ return proxy;
+ },
+
+ // Mutifunctional method to get and set values to a collection
+ // The value/s can optionally be executed if it's a function
+ access: function( elems, key, value, exec, fn, pass ) {
+ var length = elems.length;
+
+ // Setting many attributes
+ if ( typeof key === "object" ) {
+ for ( var k in key ) {
+ jQuery.access( elems, k, key[k], exec, fn, value );
+ }
+ return elems;
+ }
+
+ // Setting one attribute
+ if ( value !== undefined ) {
+ // Optionally, function values get executed if exec is true
+ exec = !pass && exec && jQuery.isFunction(value);
+
+ for ( var i = 0; i < length; i++ ) {
+ fn( elems[i], key, exec ? value.call( elems[i], i, fn( elems[i], key ) ) : value, pass );
+ }
+
+ return elems;
+ }
+
+ // Getting an attribute
+ return length ? fn( elems[0], key ) : undefined;
+ },
+
+ now: function() {
+ return (new Date()).getTime();
+ },
+
+ // Use of jQuery.browser is frowned upon.
+ // More details: http://docs.jquery.com/Utilities/jQuery.browser
+ uaMatch: function( ua ) {
+ ua = ua.toLowerCase();
+
+ var match = rwebkit.exec( ua ) ||
+ ropera.exec( ua ) ||
+ rmsie.exec( ua ) ||
+ ua.indexOf("compatible") < 0 && rmozilla.exec( ua ) ||
+ [];
+
+ return { browser: match[1] || "", version: match[2] || "0" };
+ },
+
+ 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;
+ },
+
+ browser: {}
+});
+
+// Populate the class2type map
+jQuery.each("Boolean Number String Function Array Date RegExp Object".split(" "), function(i, name) {
+ class2type[ "[object " + name + "]" ] = name.toLowerCase();
+});
+
+browserMatch = jQuery.uaMatch( userAgent );
+if ( browserMatch.browser ) {
+ jQuery.browser[ browserMatch.browser ] = true;
+ jQuery.browser.version = browserMatch.version;
+}
+
+// Deprecated, use jQuery.browser.webkit instead
+if ( jQuery.browser.webkit ) {
+ jQuery.browser.safari = true;
+}
+
+// IE doesn't match non-breaking spaces with \s
+if ( rnotwhite.test( "\xA0" ) ) {
+ trimLeft = /^[\s\xA0]+/;
+ trimRight = /[\s\xA0]+$/;
+}
+
+// All jQuery objects should point back to these
+rootjQuery = jQuery(document);
+
+// Cleanup functions for the document ready method
+if ( document.addEventListener ) {
+ DOMContentLoaded = function() {
+ document.removeEventListener( "DOMContentLoaded", DOMContentLoaded, false );
+ jQuery.ready();
+ };
+
+} else if ( document.attachEvent ) {
+ DOMContentLoaded = function() {
+ // Make sure body exists, at least, in case IE gets a little overzealous (ticket #5443).
+ if ( document.readyState === "complete" ) {
+ document.detachEvent( "onreadystatechange", DOMContentLoaded );
+ jQuery.ready();
+ }
+ };
+}
+
+// The DOM ready check for Internet Explorer
+function doScrollCheck() {
+ if ( jQuery.isReady ) {
+ return;
+ }
+
+ try {
+ // If IE is used, use the trick by Diego Perini
+ // http://javascript.nwbox.com/IEContentLoaded/
+ document.documentElement.doScroll("left");
+ } catch(e) {
+ setTimeout( doScrollCheck, 1 );
+ return;
+ }
+
+ // and execute any waiting functions
+ jQuery.ready();
+}
+
+return jQuery;
+
+})();
+
+
+var // Promise methods
+ promiseMethods = "done fail isResolved isRejected promise then always pipe".split( " " ),
+ // Static reference to slice
+ sliceDeferred = [].slice;
+
+jQuery.extend({
+ // Create a simple deferred (one callbacks list)
+ _Deferred: function() {
+ var // callbacks list
+ callbacks = [],
+ // stored [ context , args ]
+ fired,
+ // to avoid firing when already doing so
+ firing,
+ // flag to know if the deferred has been cancelled
+ cancelled,
+ // the deferred itself
+ deferred = {
+
+ // done( f1, f2, ...)
+ done: function() {
+ if ( !cancelled ) {
+ var args = arguments,
+ i,
+ length,
+ elem,
+ type,
+ _fired;
+ if ( fired ) {
+ _fired = fired;
+ fired = 0;
+ }
+ for ( i = 0, length = args.length; i < length; i++ ) {
+ elem = args[ i ];
+ type = jQuery.type( elem );
+ if ( type === "array" ) {
+ deferred.done.apply( deferred, elem );
+ } else if ( type === "function" ) {
+ callbacks.push( elem );
+ }
+ }
+ if ( _fired ) {
+ deferred.resolveWith( _fired[ 0 ], _fired[ 1 ] );
+ }
+ }
+ return this;
+ },
+
+ // resolve with given context and args
+ resolveWith: function( context, args ) {
+ if ( !cancelled && !fired && !firing ) {
+ // make sure args are available (#8421)
+ args = args || [];
+ firing = 1;
+ try {
+ while( callbacks[ 0 ] ) {
+ callbacks.shift().apply( context, args );
+ }
+ }
+ finally {
+ fired = [ context, args ];
+ firing = 0;
+ }
+ }
+ return this;
+ },
+
+ // resolve with this as context and given arguments
+ resolve: function() {
+ deferred.resolveWith( this, arguments );
+ return this;
+ },
+
+ // Has this deferred been resolved?
+ isResolved: function() {
+ return !!( firing || fired );
+ },
+
+ // Cancel
+ cancel: function() {
+ cancelled = 1;
+ callbacks = [];
+ return this;
+ }
+ };
+
+ return deferred;
+ },
+
+ // Full fledged deferred (two callbacks list)
+ Deferred: function( func ) {
+ var deferred = jQuery._Deferred(),
+ failDeferred = jQuery._Deferred(),
+ promise;
+ // Add errorDeferred methods, then and promise
+ jQuery.extend( deferred, {
+ then: function( doneCallbacks, failCallbacks ) {
+ deferred.done( doneCallbacks ).fail( failCallbacks );
+ return this;
+ },
+ always: function() {
+ return deferred.done.apply( deferred, arguments ).fail.apply( this, arguments );
+ },
+ fail: failDeferred.done,
+ rejectWith: failDeferred.resolveWith,
+ reject: failDeferred.resolve,
+ isRejected: failDeferred.isResolved,
+ pipe: function( fnDone, fnFail ) {
+ return jQuery.Deferred(function( newDefer ) {
+ jQuery.each( {
+ done: [ fnDone, "resolve" ],
+ fail: [ fnFail, "reject" ]
+ }, function( handler, data ) {
+ var fn = data[ 0 ],
+ action = data[ 1 ],
+ returned;
+ if ( jQuery.isFunction( fn ) ) {
+ deferred[ handler ](function() {
+ returned = fn.apply( this, arguments );
+ if ( returned && jQuery.isFunction( returned.promise ) ) {
+ returned.promise().then( newDefer.resolve, newDefer.reject );
+ } else {
+ newDefer[ action ]( returned );
+ }
+ });
+ } else {
+ deferred[ handler ]( newDefer[ action ] );
+ }
+ });
+ }).promise();
+ },
+ // Get a promise for this deferred
+ // If obj is provided, the promise aspect is added to the object
+ promise: function( obj ) {
+ if ( obj == null ) {
+ if ( promise ) {
+ return promise;
+ }
+ promise = obj = {};
+ }
+ var i = promiseMethods.length;
+ while( i-- ) {
+ obj[ promiseMethods[i] ] = deferred[ promiseMethods[i] ];
+ }
+ return obj;
+ }
+ });
+ // Make sure only one callback list will be used
+ deferred.done( failDeferred.cancel ).fail( deferred.cancel );
+ // Unexpose cancel
+ delete deferred.cancel;
+ // Call given func if any
+ if ( func ) {
+ func.call( deferred, deferred );
+ }
+ return deferred;
+ },
+
+ // Deferred helper
+ when: function( firstParam ) {
+ var args = arguments,
+ i = 0,
+ length = args.length,
+ count = length,
+ deferred = length <= 1 && firstParam && jQuery.isFunction( firstParam.promise ) ?
+ firstParam :
+ jQuery.Deferred();
+ function resolveFunc( i ) {
+ return function( value ) {
+ args[ i ] = arguments.length > 1 ? sliceDeferred.call( arguments, 0 ) : value;
+ if ( !( --count ) ) {
+ // Strange bug in FF4:
+ // Values changed onto the arguments object sometimes end up as undefined values
+ // outside the $.when method. Cloning the object into a fresh array solves the issue
+ deferred.resolveWith( deferred, sliceDeferred.call( args, 0 ) );
+ }
+ };
+ }
+ if ( length > 1 ) {
+ for( ; i < length; i++ ) {
+ if ( args[ i ] && jQuery.isFunction( args[ i ].promise ) ) {
+ args[ i ].promise().then( resolveFunc(i), deferred.reject );
+ } else {
+ --count;
+ }
+ }
+ if ( !count ) {
+ deferred.resolveWith( deferred, args );
+ }
+ } else if ( deferred !== firstParam ) {
+ deferred.resolveWith( deferred, length ? [ firstParam ] : [] );
+ }
+ return deferred.promise();
+ }
+});
+
+
+
+jQuery.support = (function() {
+
+ var div = document.createElement( "div" ),
+ documentElement = document.documentElement,
+ all,
+ a,
+ select,
+ opt,
+ input,
+ marginDiv,
+ support,
+ fragment,
+ body,
+ testElementParent,
+ testElement,
+ testElementStyle,
+ tds,
+ events,
+ eventName,
+ i,
+ isSupported;
+
+ // Preliminary tests
+ div.setAttribute("className", "t");
+ div.innerHTML = " <link/><table></table><a href='/a' style='top:1px;float:left;opacity:.55;'>a</a><input type='checkbox'/>";
+
+ all = div.getElementsByTagName( "*" );
+ a = div.getElementsByTagName( "a" )[ 0 ];
+
+ // Can't get basic test support
+ if ( !all || !all.length || !a ) {
+ return {};
+ }
+
+ // First batch of supports tests
+ select = document.createElement( "select" );
+ opt = select.appendChild( document.createElement("option") );
+ input = div.getElementsByTagName( "input" )[ 0 ];
+
+ 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.55$/.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",
+
+ // Will be defined later
+ submitBubbles: true,
+ changeBubbles: true,
+ focusinBubbles: false,
+ deleteExpando: true,
+ noCloneEvent: true,
+ inlineBlockNeedsLayout: false,
+ shrinkWrapBlocks: false,
+ reliableMarginRight: true
+ };
+
+ // 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", function() {
+ // Cloning a node shouldn't copy over any
+ // bound event handlers (IE does this)
+ support.noCloneEvent = false;
+ });
+ div.cloneNode( true ).fireEvent( "onclick" );
+ }
+
+ // Check if a radio maintains it's 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");
+ div.appendChild( input );
+ fragment = document.createDocumentFragment();
+ fragment.appendChild( div.firstChild );
+
+ // WebKit doesn't clone checked state correctly in fragments
+ support.checkClone = fragment.cloneNode( true ).cloneNode( true ).lastChild.checked;
+
+ div.innerHTML = "";
+
+ // Figure out if the W3C box model works as expected
+ div.style.width = div.style.paddingLeft = "1px";
+
+ body = document.getElementsByTagName( "body" )[ 0 ];
+ // We use our own, invisible, body unless the body is already present
+ // in which case we use a div (#9239)
+ testElement = document.createElement( body ? "div" : "body" );
+ testElementStyle = {
+ visibility: "hidden",
+ width: 0,
+ height: 0,
+ border: 0,
+ margin: 0
+ };
+ if ( body ) {
+ jQuery.extend( testElementStyle, {
+ position: "absolute",
+ left: -1000,
+ top: -1000
+ });
+ }
+ for ( i in testElementStyle ) {
+ testElement.style[ i ] = testElementStyle[ i ];
+ }
+ testElement.appendChild( div );
+ testElementParent = body || documentElement;
+ testElementParent.insertBefore( testElement, testElementParent.firstChild );
+
+ // Check if a disconnected checkbox will retain its checked
+ // value of true after appended to the DOM (IE6/7)
+ support.appendChecked = input.checked;
+
+ support.boxModel = div.offsetWidth === 2;
+
+ if ( "zoom" in div.style ) {
+ // 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.style.display = "inline";
+ div.style.zoom = 1;
+ support.inlineBlockNeedsLayout = ( div.offsetWidth === 2 );
+
+ // Check if elements with layout shrink-wrap their children
+ // (IE 6 does this)
+ div.style.display = "";
+ div.innerHTML = "<div style='width:4px;'></div>";
+ support.shrinkWrapBlocks = ( div.offsetWidth !== 2 );
+ }
+
+ div.innerHTML = "<table><tr><td style='padding:0;border:0;display:none'></td><td>t</td></tr></table>";
+ tds = div.getElementsByTagName( "td" );
+
+ // 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)
+ 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 );
+ div.innerHTML = "";
+
+ // 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
+ if ( document.defaultView && document.defaultView.getComputedStyle ) {
+ marginDiv = document.createElement( "div" );
+ marginDiv.style.width = "0";
+ marginDiv.style.marginRight = "0";
+ div.appendChild( marginDiv );
+ support.reliableMarginRight =
+ ( parseInt( ( document.defaultView.getComputedStyle( marginDiv, null ) || { marginRight: 0 } ).marginRight, 10 ) || 0 ) === 0;
+ }
+
+ // Remove the body element we added
+ testElement.innerHTML = "";
+ testElementParent.removeChild( testElement );
+
+ // Technique from Juriy Zaytsev
+ // http://thinkweb2.com/projects/prototype/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: 1,
+ change: 1,
+ focusin: 1
+ } ) {
+ eventName = "on" + i;
+ isSupported = ( eventName in div );
+ if ( !isSupported ) {
+ div.setAttribute( eventName, "return;" );
+ isSupported = ( typeof div[ eventName ] === "function" );
+ }
+ support[ i + "Bubbles" ] = isSupported;
+ }
+ }
+
+ // Null connected elements to avoid leaks in IE
+ testElement = fragment = select = opt = body = marginDiv = div = input = null;
+
+ return support;
+})();
+
+// Keep track of boxModel
+jQuery.boxModel = jQuery.support.boxModel;
+
+
+
+
+var rbrace = /^(?:\{.*\}|\[.*\])$/,
+ rmultiDash = /([a-z])([A-Z])/g;
+
+jQuery.extend({
+ cache: {},
+
+ // Please use with caution
+ 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 internalKey = jQuery.expando, getByName = typeof name === "string", thisCache,
+
+ // 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[ jQuery.expando ] : elem[ jQuery.expando ] && jQuery.expando;
+
+ // 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 || (pvt && id && !cache[ id ][ internalKey ])) && 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[ jQuery.expando ] = id = ++jQuery.uuid;
+ } else {
+ id = jQuery.expando;
+ }
+ }
+
+ if ( !cache[ id ] ) {
+ cache[ id ] = {};
+
+ // TODO: This is a hack for 1.5 ONLY. 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 ][ internalKey ] = jQuery.extend(cache[ id ][ internalKey ], name);
+ } else {
+ cache[ id ] = jQuery.extend(cache[ id ], name);
+ }
+ }
+
+ thisCache = cache[ id ];
+
+ // Internal jQuery data is stored in a separate object inside the object's data
+ // cache in order to avoid key collisions between internal data and user-defined
+ // data
+ if ( pvt ) {
+ if ( !thisCache[ internalKey ] ) {
+ thisCache[ internalKey ] = {};
+ }
+
+ thisCache = thisCache[ internalKey ];
+ }
+
+ if ( data !== undefined ) {
+ thisCache[ jQuery.camelCase( name ) ] = data;
+ }
+
+ // TODO: This is a hack for 1.5 ONLY. It will be removed in 1.6. Users should
+ // not attempt to inspect the internal events object using jQuery.data, as this
+ // internal data object is undocumented and subject to change.
+ if ( name === "events" && !thisCache[name] ) {
+ return thisCache[ internalKey ] && thisCache[ internalKey ].events;
+ }
+
+ return getByName ?
+ // Check for both converted-to-camel and non-converted data property names
+ thisCache[ jQuery.camelCase( name ) ] || thisCache[ name ] :
+ thisCache;
+ },
+
+ removeData: function( elem, name, pvt /* Internal Use Only */ ) {
+ if ( !jQuery.acceptData( elem ) ) {
+ return;
+ }
+
+ var internalKey = jQuery.expando, isNode = elem.nodeType,
+
+ // See jQuery.data for more information
+ cache = isNode ? jQuery.cache : elem,
+
+ // See jQuery.data for more information
+ 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 ) {
+ var thisCache = pvt ? cache[ id ][ internalKey ] : cache[ id ];
+
+ if ( thisCache ) {
+ delete thisCache[ name ];
+
+ // If there is no data left in the cache, we want to continue
+ // and let the cache object itself get destroyed
+ if ( !isEmptyDataObject(thisCache) ) {
+ return;
+ }
+ }
+ }
+
+ // See jQuery.data for more information
+ if ( pvt ) {
+ delete cache[ id ][ internalKey ];
+
+ // Don't destroy the parent cache unless the internal data object
+ // had been the only thing left in it
+ if ( !isEmptyDataObject(cache[ id ]) ) {
+ return;
+ }
+ }
+
+ var internalCache = cache[ id ][ internalKey ];
+
+ // Browsers that fail expando deletion also refuse to delete expandos on
+ // the window, but it will allow it on all other JS objects; other browsers
+ // don't care
+ if ( jQuery.support.deleteExpando || cache != window ) {
+ delete cache[ id ];
+ } else {
+ cache[ id ] = null;
+ }
+
+ // We destroyed the entire user cache at once because it's faster than
+ // iterating through each key, but we need to continue to persist internal
+ // data if it existed
+ if ( internalCache ) {
+ cache[ id ] = {};
+ // TODO: This is a hack for 1.5 ONLY. Avoids exposing jQuery
+ // metadata on plain JS objects when the object is serialized using
+ // JSON.stringify
+ if ( !isNode ) {
+ cache[ id ].toJSON = jQuery.noop;
+ }
+
+ cache[ id ][ internalKey ] = internalCache;
+
+ // Otherwise, we need to eliminate the expando on the node to avoid
+ // false lookups in the cache for entries that no longer exist
+ } else if ( isNode ) {
+ // 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 ( jQuery.support.deleteExpando ) {
+ delete elem[ jQuery.expando ];
+ } else if ( elem.removeAttribute ) {
+ elem.removeAttribute( jQuery.expando );
+ } else {
+ elem[ jQuery.expando ] = 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 ) {
+ if ( elem.nodeName ) {
+ var match = jQuery.noData[ elem.nodeName.toLowerCase() ];
+
+ if ( match ) {
+ return !(match === true || elem.getAttribute("classid") !== match);
+ }
+ }
+
+ return true;
+ }
+});
+
+jQuery.fn.extend({
+ data: function( key, value ) {
+ var data = null;
+
+ if ( typeof key === "undefined" ) {
+ if ( this.length ) {
+ data = jQuery.data( this[0] );
+
+ if ( this[0].nodeType === 1 ) {
+ var attr = this[0].attributes, name;
+ for ( var i = 0, l = attr.length; i < l; i++ ) {
+ name = attr[i].name;
+
+ if ( name.indexOf( "data-" ) === 0 ) {
+ name = jQuery.camelCase( name.substring(5) );
+
+ dataAttr( this[0], name, data[ name ] );
+ }
+ }
+ }
+ }
+
+ return data;
+
+ } else if ( typeof key === "object" ) {
+ return this.each(function() {
+ jQuery.data( this, key );
+ });
+ }
+
+ var parts = key.split(".");
+ parts[1] = parts[1] ? "." + parts[1] : "";
+
+ if ( value === undefined ) {
+ data = this.triggerHandler("getData" + parts[1] + "!", [parts[0]]);
+
+ // Try to fetch any internally stored data first
+ if ( data === undefined && this.length ) {
+ data = jQuery.data( this[0], key );
+ data = dataAttr( this[0], key, data );
+ }
+
+ return data === undefined && parts[1] ?
+ this.data( parts[0] ) :
+ data;
+
+ } else {
+ return this.each(function() {
+ var $this = jQuery( this ),
+ args = [ parts[0], value ];
+
+ $this.triggerHandler( "setData" + parts[1] + "!", args );
+ jQuery.data( this, key, value );
+ $this.triggerHandler( "changeData" + parts[1] + "!", args );
+ });
+ }
+ },
+
+ 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-$2" ).toLowerCase();
+
+ data = elem.getAttribute( name );
+
+ if ( typeof data === "string" ) {
+ try {
+ data = data === "true" ? true :
+ data === "false" ? false :
+ data === "null" ? null :
+ !jQuery.isNaN( data ) ? parseFloat( 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;
+}
+
+// TODO: This is a hack for 1.5 ONLY to allow objects with a single toJSON
+// property to be considered empty objects; this property always exists in
+// order to make sure JSON.stringify does not expose internal metadata
+function isEmptyDataObject( obj ) {
+ for ( var name in obj ) {
+ if ( name !== "toJSON" ) {
+ return false;
+ }
+ }
+
+ return true;
+}
+
+
+
+
+function handleQueueMarkDefer( elem, type, src ) {
+ var deferDataKey = type + "defer",
+ queueDataKey = type + "queue",
+ markDataKey = type + "mark",
+ defer = jQuery.data( elem, deferDataKey, undefined, true );
+ if ( defer &&
+ ( src === "queue" || !jQuery.data( elem, queueDataKey, undefined, true ) ) &&
+ ( src === "mark" || !jQuery.data( elem, markDataKey, undefined, true ) ) ) {
+ // Give room for hard-coded callbacks to fire first
+ // and eventually mark/queue something else on the element
+ setTimeout( function() {
+ if ( !jQuery.data( elem, queueDataKey, undefined, true ) &&
+ !jQuery.data( elem, markDataKey, undefined, true ) ) {
+ jQuery.removeData( elem, deferDataKey, true );
+ defer.resolve();
+ }
+ }, 0 );
+ }
+}
+
+jQuery.extend({
+
+ _mark: function( elem, type ) {
+ if ( elem ) {
+ type = (type || "fx") + "mark";
+ jQuery.data( elem, type, (jQuery.data(elem,type,undefined,true) || 0) + 1, true );
+ }
+ },
+
+ _unmark: function( force, elem, type ) {
+ if ( force !== true ) {
+ type = elem;
+ elem = force;
+ force = false;
+ }
+ if ( elem ) {
+ type = type || "fx";
+ var key = type + "mark",
+ count = force ? 0 : ( (jQuery.data( elem, key, undefined, true) || 1 ) - 1 );
+ if ( count ) {
+ jQuery.data( elem, key, count, true );
+ } else {
+ jQuery.removeData( elem, key, true );
+ handleQueueMarkDefer( elem, type, "mark" );
+ }
+ }
+ },
+
+ queue: function( elem, type, data ) {
+ if ( elem ) {
+ type = (type || "fx") + "queue";
+ var q = jQuery.data( elem, type, undefined, true );
+ // Speed up dequeue by getting out quickly if this is just a lookup
+ if ( data ) {
+ if ( !q || jQuery.isArray(data) ) {
+ q = jQuery.data( elem, type, jQuery.makeArray(data), true );
+ } else {
+ q.push( data );
+ }
+ }
+ return q || [];
+ }
+ },
+
+ dequeue: function( elem, type ) {
+ type = type || "fx";
+
+ var queue = jQuery.queue( elem, type ),
+ fn = queue.shift(),
+ defer;
+
+ // If the fx queue is dequeued, always remove the progress sentinel
+ if ( fn === "inprogress" ) {
+ fn = queue.shift();
+ }
+
+ if ( fn ) {
+ // Add a progress sentinel to prevent the fx queue from being
+ // automatically dequeued
+ if ( type === "fx" ) {
+ queue.unshift("inprogress");
+ }
+
+ fn.call(elem, function() {
+ jQuery.dequeue(elem, type);
+ });
+ }
+
+ if ( !queue.length ) {
+ jQuery.removeData( elem, type + "queue", true );
+ handleQueueMarkDefer( elem, type, "queue" );
+ }
+ }
+});
+
+jQuery.fn.extend({
+ queue: function( type, data ) {
+ if ( typeof type !== "string" ) {
+ data = type;
+ type = "fx";
+ }
+
+ if ( data === undefined ) {
+ return jQuery.queue( this[0], type );
+ }
+ return this.each(function() {
+ var queue = jQuery.queue( this, type, data );
+
+ 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() {
+ var elem = this;
+ setTimeout(function() {
+ jQuery.dequeue( elem, type );
+ }, time );
+ });
+ },
+ 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, object ) {
+ if ( typeof type !== "string" ) {
+ object = type;
+ type = undefined;
+ }
+ type = type || "fx";
+ var defer = jQuery.Deferred(),
+ elements = this,
+ i = elements.length,
+ count = 1,
+ deferDataKey = type + "defer",
+ queueDataKey = type + "queue",
+ markDataKey = type + "mark",
+ tmp;
+ function resolve() {
+ if ( !( --count ) ) {
+ defer.resolveWith( elements, [ elements ] );
+ }
+ }
+ while( i-- ) {
+ if (( tmp = jQuery.data( elements[ i ], deferDataKey, undefined, true ) ||
+ ( jQuery.data( elements[ i ], queueDataKey, undefined, true ) ||
+ jQuery.data( elements[ i ], markDataKey, undefined, true ) ) &&
+ jQuery.data( elements[ i ], deferDataKey, jQuery._Deferred(), true ) )) {
+ count++;
+ tmp.done( resolve );
+ }
+ }
+ resolve();
+ return defer.promise();
+ }
+});
+
+
+
+
+var rclass = /[\n\t\r]/g,
+ rspace = /\s+/,
+ 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,
+ rinvalidChar = /\:|^on/,
+ formHook, boolHook;
+
+jQuery.fn.extend({
+ attr: function( name, value ) {
+ return jQuery.access( this, name, value, true, jQuery.attr );
+ },
+
+ removeAttr: function( name ) {
+ return this.each(function() {
+ jQuery.removeAttr( this, name );
+ });
+ },
+
+ prop: function( name, value ) {
+ return jQuery.access( this, name, value, true, jQuery.prop );
+ },
+
+ 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( 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 ] + " " ) ) {
+ setClass += classNames[ c ] + " ";
+ }
+ }
+ elem.className = jQuery.trim( setClass );
+ }
+ }
+ }
+ }
+
+ return this;
+ },
+
+ removeClass: function( value ) {
+ var classNames, i, l, elem, className, c, cl;
+
+ 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 ) {
+ classNames = (value || "").split( rspace );
+
+ for ( i = 0, l = this.length; i < l; i++ ) {
+ elem = this[ i ];
+
+ if ( elem.nodeType === 1 && elem.className ) {
+ if ( value ) {
+ className = (" " + elem.className + " ").replace( rclass, " " );
+ for ( c = 0, cl = classNames.length; c < cl; c++ ) {
+ className = className.replace(" " + classNames[ c ] + " ", " ");
+ }
+ elem.className = jQuery.trim( className );
+
+ } else {
+ elem.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( rspace );
+
+ while ( (className = classNames[ i++ ]) ) {
+ // check each className given, space seperated 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 + " ";
+ for ( var i = 0, l = this.length; i < l; i++ ) {
+ if ( (" " + this[i].className + " ").replace(rclass, " ").indexOf( className ) > -1 ) {
+ return true;
+ }
+ }
+
+ return false;
+ },
+
+ val: function( value ) {
+ var hooks, ret,
+ elem = this[0];
+
+ if ( !arguments.length ) {
+ if ( elem ) {
+ hooks = jQuery.valHooks[ elem.nodeName.toLowerCase() ] || jQuery.valHooks[ elem.type ];
+
+ 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 undefined;
+ }
+
+ var isFunction = jQuery.isFunction( value );
+
+ return this.each(function( i ) {
+ var self = jQuery(this), val;
+
+ 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.nodeName.toLowerCase() ] || jQuery.valHooks[ this.type ];
+
+ // 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,
+ index = elem.selectedIndex,
+ values = [],
+ options = elem.options,
+ one = elem.type === "select-one";
+
+ // Nothing was selected
+ if ( index < 0 ) {
+ return null;
+ }
+
+ // Loop through all the selected options
+ for ( var i = one ? index : 0, max = one ? index + 1 : options.length; i < max; i++ ) {
+ var option = options[ i ];
+
+ // Don't return options that are disabled or in a disabled optgroup
+ if ( option.selected && (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 );
+ }
+ }
+
+ // Fixes Bug #2551 -- select.val() broken in IE after form.reset()
+ if ( one && !values.length && options.length ) {
+ return jQuery( options[ index ] ).val();
+ }
+
+ 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;
+ }
+ }
+ },
+
+ attrFn: {
+ val: true,
+ css: true,
+ html: true,
+ text: true,
+ data: true,
+ width: true,
+ height: true,
+ offset: true
+ },
+
+ attrFix: {
+ // Always normalize to ensure hook usage
+ tabindex: "tabIndex"
+ },
+
+ attr: function( elem, name, value, pass ) {
+ var nType = elem.nodeType;
+
+ // don't get/set attributes on text, comment and attribute nodes
+ if ( !elem || nType === 3 || nType === 8 || nType === 2 ) {
+ return undefined;
+ }
+
+ if ( pass && name in jQuery.attrFn ) {
+ return jQuery( elem )[ name ]( value );
+ }
+
+ // Fallback to prop when attributes are not supported
+ if ( !("getAttribute" in elem) ) {
+ return jQuery.prop( elem, name, value );
+ }
+
+ var ret, hooks,
+ notxml = nType !== 1 || !jQuery.isXMLDoc( elem );
+
+ // Normalize the name if needed
+ if ( notxml ) {
+ name = jQuery.attrFix[ name ] || name;
+
+ hooks = jQuery.attrHooks[ name ];
+
+ if ( !hooks ) {
+ // Use boolHook for boolean attributes
+ if ( rboolean.test( name ) ) {
+
+ hooks = boolHook;
+
+ // Use formHook for forms and if the name contains certain characters
+ } else if ( formHook && name !== "className" &&
+ (jQuery.nodeName( elem, "form" ) || rinvalidChar.test( name )) ) {
+
+ hooks = formHook;
+ }
+ }
+ }
+
+ if ( value !== undefined ) {
+
+ if ( value === null ) {
+ jQuery.removeAttr( elem, name );
+ return undefined;
+
+ } 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, name ) {
+ var propName;
+ if ( elem.nodeType === 1 ) {
+ name = jQuery.attrFix[ name ] || name;
+
+ if ( jQuery.support.getSetAttribute ) {
+ // Use removeAttribute in browsers that support it
+ elem.removeAttribute( name );
+ } else {
+ jQuery.attr( elem, name, "" );
+ elem.removeAttributeNode( elem.getAttributeNode( name ) );
+ }
+
+ // Set corresponding property to false for boolean attributes
+ if ( rboolean.test( name ) && (propName = jQuery.propFix[ name ] || name) 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;
+ }
+ }
+ },
+ 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;
+ }
+ },
+ // Use the value property for back compat
+ // Use the formHook for button elements in IE6/7 (#1954)
+ value: {
+ get: function( elem, name ) {
+ if ( formHook && jQuery.nodeName( elem, "button" ) ) {
+ return formHook.get( elem, name );
+ }
+ return name in elem ?
+ elem.value :
+ null;
+ },
+ set: function( elem, value, name ) {
+ if ( formHook && jQuery.nodeName( elem, "button" ) ) {
+ return formHook.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 nType = elem.nodeType;
+
+ // don't get/set properties on text, comment and attribute nodes
+ if ( !elem || nType === 3 || nType === 8 || nType === 2 ) {
+ return undefined;
+ }
+
+ var ret, hooks,
+ 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 )) !== undefined ) {
+ return ret;
+
+ } else {
+ return elem[ name ];
+ }
+ }
+ },
+
+ propHooks: {}
+});
+
+// Hook for boolean attributes
+boolHook = {
+ get: function( elem, name ) {
+ // Align boolean attributes with corresponding properties
+ return jQuery.prop( elem, name ) ?
+ 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 ( !jQuery.support.getSetAttribute ) {
+
+ // propFix is more comprehensive and contains all fixes
+ jQuery.attrFix = jQuery.propFix;
+
+ // Use this for any attribute on a form in IE6/7
+ formHook = jQuery.attrHooks.name = jQuery.attrHooks.title = jQuery.valHooks.button = {
+ get: function( elem, name ) {
+ var ret;
+ ret = elem.getAttributeNode( name );
+ // Return undefined if nodeValue is empty string
+ return ret && ret.nodeValue !== "" ?
+ ret.nodeValue :
+ undefined;
+ },
+ set: function( elem, value, name ) {
+ // Check form objects in IE (multiple bugs related)
+ // Only use nodeValue if the attribute node exists on the form
+ var ret = elem.getAttributeNode( name );
+ if ( ret ) {
+ ret.nodeValue = value;
+ return 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;
+ }
+ }
+ });
+ });
+}
+
+
+// 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;
+ }
+ }
+ }
+ });
+}
+
+// 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 rnamespaces = /\.(.*)$/,
+ rformElems = /^(?:textarea|input|select)$/i,
+ rperiod = /\./g,
+ rspaces = / /g,
+ rescape = /[^\w\s.|`]/g,
+ fcleanup = function( nm ) {
+ return nm.replace(rescape, "\\$&");
+ };
+
+/*
+ * A number of helper functions used for managing events.
+ * Many of the ideas behind this code originated from
+ * Dean Edwards' addEvent library.
+ */
+jQuery.event = {
+
+ // Bind an event to an element
+ // Original by Dean Edwards
+ add: function( elem, types, handler, data ) {
+ if ( elem.nodeType === 3 || elem.nodeType === 8 ) {
+ return;
+ }
+
+ if ( handler === false ) {
+ handler = returnFalse;
+ } else if ( !handler ) {
+ // Fixes bug #7229. Fix recommended by jdalton
+ return;
+ }
+
+ var handleObjIn, handleObj;
+
+ if ( handler.handler ) {
+ handleObjIn = handler;
+ handler = handleObjIn.handler;
+ }
+
+ // Make sure that the function being executed has a unique ID
+ if ( !handler.guid ) {
+ handler.guid = jQuery.guid++;
+ }
+
+ // Init the element's event structure
+ var elemData = jQuery._data( elem );
+
+ // If no elemData is found then we must be trying to bind to one of the
+ // banned noData elements
+ if ( !elemData ) {
+ return;
+ }
+
+ var events = elemData.events,
+ eventHandle = elemData.handle;
+
+ if ( !events ) {
+ elemData.events = events = {};
+ }
+
+ 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.handle.apply( eventHandle.elem, arguments ) :
+ undefined;
+ };
+ }
+
+ // Add elem as a property of the handle function
+ // This is to prevent a memory leak with non-native events in IE.
+ eventHandle.elem = elem;
+
+ // Handle multiple events separated by a space
+ // jQuery(...).bind("mouseover mouseout", fn);
+ types = types.split(" ");
+
+ var type, i = 0, namespaces;
+
+ while ( (type = types[ i++ ]) ) {
+ handleObj = handleObjIn ?
+ jQuery.extend({}, handleObjIn) :
+ { handler: handler, data: data };
+
+ // Namespaced event handlers
+ if ( type.indexOf(".") > -1 ) {
+ namespaces = type.split(".");
+ type = namespaces.shift();
+ handleObj.namespace = namespaces.slice(0).sort().join(".");
+
+ } else {
+ namespaces = [];
+ handleObj.namespace = "";
+ }
+
+ handleObj.type = type;
+ if ( !handleObj.guid ) {
+ handleObj.guid = handler.guid;
+ }
+
+ // Get the current list of functions bound to this event
+ var handlers = events[ type ],
+ special = jQuery.event.special[ type ] || {};
+
+ // Init the event handler queue
+ if ( !handlers ) {
+ handlers = events[ type ] = [];
+
+ // Check for a special event handler
+ // 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 the function to the element's handler list
+ handlers.push( handleObj );
+
+ // Keep track of which events have 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, pos ) {
+ // don't do events on text and comment nodes
+ if ( elem.nodeType === 3 || elem.nodeType === 8 ) {
+ return;
+ }
+
+ if ( handler === false ) {
+ handler = returnFalse;
+ }
+
+ var ret, type, fn, j, i = 0, all, namespaces, namespace, special, eventType, handleObj, origType,
+ elemData = jQuery.hasData( elem ) && jQuery._data( elem ),
+ events = elemData && elemData.events;
+
+ if ( !elemData || !events ) {
+ return;
+ }
+
+ // types is actually an event object here
+ if ( types && types.type ) {
+ handler = types.handler;
+ types = types.type;
+ }
+
+ // Unbind all events for the element
+ if ( !types || typeof types === "string" && types.charAt(0) === "." ) {
+ types = types || "";
+
+ for ( type in events ) {
+ jQuery.event.remove( elem, type + types );
+ }
+
+ return;
+ }
+
+ // Handle multiple events separated by a space
+ // jQuery(...).unbind("mouseover mouseout", fn);
+ types = types.split(" ");
+
+ while ( (type = types[ i++ ]) ) {
+ origType = type;
+ handleObj = null;
+ all = type.indexOf(".") < 0;
+ namespaces = [];
+
+ if ( !all ) {
+ // Namespaced event handlers
+ namespaces = type.split(".");
+ type = namespaces.shift();
+
+ namespace = new RegExp("(^|\\.)" +
+ jQuery.map( namespaces.slice(0).sort(), fcleanup ).join("\\.(?:.*\\.)?") + "(\\.|$)");
+ }
+
+ eventType = events[ type ];
+
+ if ( !eventType ) {
+ continue;
+ }
+
+ if ( !handler ) {
+ for ( j = 0; j < eventType.length; j++ ) {
+ handleObj = eventType[ j ];
+
+ if ( all || namespace.test( handleObj.namespace ) ) {
+ jQuery.event.remove( elem, origType, handleObj.handler, j );
+ eventType.splice( j--, 1 );
+ }
+ }
+
+ continue;
+ }
+
+ special = jQuery.event.special[ type ] || {};
+
+ for ( j = pos || 0; j < eventType.length; j++ ) {
+ handleObj = eventType[ j ];
+
+ if ( handler.guid === handleObj.guid ) {
+ // remove the given handler for the given type
+ if ( all || namespace.test( handleObj.namespace ) ) {
+ if ( pos == null ) {
+ eventType.splice( j--, 1 );
+ }
+
+ if ( special.remove ) {
+ special.remove.call( elem, handleObj );
+ }
+ }
+
+ if ( pos != null ) {
+ break;
+ }
+ }
+ }
+
+ // remove generic event handler if no more handlers exist
+ if ( eventType.length === 0 || pos != null && eventType.length === 1 ) {
+ if ( !special.teardown || special.teardown.call( elem, namespaces ) === false ) {
+ jQuery.removeEvent( elem, type, elemData.handle );
+ }
+
+ ret = null;
+ delete events[ type ];
+ }
+ }
+
+ // Remove the expando if it's no longer used
+ if ( jQuery.isEmptyObject( events ) ) {
+ var handle = elemData.handle;
+ if ( handle ) {
+ handle.elem = null;
+ }
+
+ delete elemData.events;
+ delete elemData.handle;
+
+ if ( jQuery.isEmptyObject( elemData ) ) {
+ jQuery.removeData( elem, undefined, 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 ) {
+ // Event object or event type
+ var type = event.type || event,
+ namespaces = [],
+ exclusive;
+
+ 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.exclusive = exclusive;
+ event.namespace = namespaces.join(".");
+ event.namespace_re = new RegExp("(^|\\.)" + namespaces.join("\\.(?:.*\\.)?") + "(\\.|$)");
+
+ // triggerHandler() and global events don't bubble or run the default action
+ if ( onlyHandlers || !elem ) {
+ event.preventDefault();
+ event.stopPropagation();
+ }
+
+ // Handle a global trigger
+ if ( !elem ) {
+ // TODO: Stop taunting the data cache; remove global events and always attach to document
+ jQuery.each( jQuery.cache, function() {
+ // internalKey variable is just used to make it easier to find
+ // and potentially change this stuff later; currently it just
+ // points to jQuery.expando
+ var internalKey = jQuery.expando,
+ internalCache = this[ internalKey ];
+ if ( internalCache && internalCache.events && internalCache.events[ type ] ) {
+ jQuery.event.trigger( event, data, internalCache.handle.elem );
+ }
+ });
+ return;
+ }
+
+ // Don't do events on text and comment nodes
+ if ( elem.nodeType === 3 || elem.nodeType === 8 ) {
+ return;
+ }
+
+ // Clean up the event in case it is being reused
+ event.result = undefined;
+ 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 );
+
+ var cur = elem,
+ // IE doesn't like method names with a colon (#3533, #8272)
+ ontype = type.indexOf(":") < 0 ? "on" + type : "";
+
+ // Fire event on the current element, then bubble up the DOM tree
+ do {
+ var handle = jQuery._data( cur, "handle" );
+
+ event.currentTarget = cur;
+ if ( handle ) {
+ handle.apply( cur, data );
+ }
+
+ // Trigger an inline bound script
+ if ( ontype && jQuery.acceptData( cur ) && cur[ ontype ] && cur[ ontype ].apply( cur, data ) === false ) {
+ event.result = false;
+ event.preventDefault();
+ }
+
+ // Bubble up to document, then to window
+ cur = cur.parentNode || cur.ownerDocument || cur === event.target.ownerDocument && window;
+ } while ( cur && !event.isPropagationStopped() );
+
+ // If nobody prevented the default action, do it now
+ if ( !event.isDefaultPrevented() ) {
+ var old,
+ special = jQuery.event.special[ type ] || {};
+
+ if ( (!special._default || special._default.call( elem.ownerDocument, event ) === 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.
+ // IE<9 dies on focus to hidden element (#1486), may want to revisit a try/catch.
+ try {
+ if ( ontype && elem[ type ] ) {
+ // Don't re-trigger an onFOO event when we call its FOO() method
+ old = elem[ ontype ];
+
+ if ( old ) {
+ elem[ ontype ] = null;
+ }
+
+ jQuery.event.triggered = type;
+ elem[ type ]();
+ }
+ } catch ( ieError ) {}
+
+ if ( old ) {
+ elem[ ontype ] = old;
+ }
+
+ jQuery.event.triggered = undefined;
+ }
+ }
+
+ return event.result;
+ },
+
+ handle: function( event ) {
+ event = jQuery.event.fix( event || window.event );
+ // Snapshot the handlers list since a called handler may add/remove events.
+ var handlers = ((jQuery._data( this, "events" ) || {})[ event.type ] || []).slice(0),
+ run_all = !event.exclusive && !event.namespace,
+ args = Array.prototype.slice.call( arguments, 0 );
+
+ // Use the fix-ed Event rather than the (read-only) native event
+ args[0] = event;
+ event.currentTarget = this;
+
+ for ( var j = 0, l = handlers.length; j < l; j++ ) {
+ var handleObj = handlers[ j ];
+
+ // Triggered event must 1) be non-exclusive and have no namespace, or
+ // 2) have namespace(s) a subset or equal to those in the bound event.
+ if ( run_all || event.namespace_re.test( handleObj.namespace ) ) {
+ // Pass in a reference to the handler function itself
+ // So that we can later remove it
+ event.handler = handleObj.handler;
+ event.data = handleObj.data;
+ event.handleObj = handleObj;
+
+ var ret = handleObj.handler.apply( this, args );
+
+ if ( ret !== undefined ) {
+ event.result = ret;
+ if ( ret === false ) {
+ event.preventDefault();
+ event.stopPropagation();
+ }
+ }
+
+ if ( event.isImmediatePropagationStopped() ) {
+ break;
+ }
+ }
+ }
+ return event.result;
+ },
+
+ props: "altKey attrChange attrName bubbles button cancelable charCode clientX clientY ctrlKey currentTarget data detail eventPhase fromElement handler keyCode layerX layerY metaKey newValue offsetX offsetY pageX pageY prevValue relatedNode relatedTarget screenX screenY shiftKey srcElement target toElement view wheelDelta which".split(" "),
+
+ fix: function( event ) {
+ if ( event[ jQuery.expando ] ) {
+ return event;
+ }
+
+ // store a copy of the original event object
+ // and "clone" to set read-only properties
+ var originalEvent = event;
+ event = jQuery.Event( originalEvent );
+
+ for ( var i = this.props.length, prop; i; ) {
+ prop = this.props[ --i ];
+ event[ prop ] = originalEvent[ prop ];
+ }
+
+ // Fix target property, if necessary
+ if ( !event.target ) {
+ // Fixes #1925 where srcElement might not be defined either
+ event.target = event.srcElement || document;
+ }
+
+ // check if target is a textnode (safari)
+ if ( event.target.nodeType === 3 ) {
+ event.target = event.target.parentNode;
+ }
+
+ // Add relatedTarget, if necessary
+ if ( !event.relatedTarget && event.fromElement ) {
+ event.relatedTarget = event.fromElement === event.target ? event.toElement : event.fromElement;
+ }
+
+ // Calculate pageX/Y if missing and clientX/Y available
+ if ( event.pageX == null && event.clientX != null ) {
+ var eventDocument = event.target.ownerDocument || document,
+ doc = eventDocument.documentElement,
+ body = eventDocument.body;
+
+ event.pageX = event.clientX + (doc && doc.scrollLeft || body && body.scrollLeft || 0) - (doc && doc.clientLeft || body && body.clientLeft || 0);
+ event.pageY = event.clientY + (doc && doc.scrollTop || body && body.scrollTop || 0) - (doc && doc.clientTop || body && body.clientTop || 0);
+ }
+
+ // Add which for key events
+ if ( event.which == null && (event.charCode != null || event.keyCode != null) ) {
+ event.which = event.charCode != null ? event.charCode : event.keyCode;
+ }
+
+ // Add metaKey to non-Mac browsers (use ctrl for PC's and Meta for Macs)
+ if ( !event.metaKey && event.ctrlKey ) {
+ event.metaKey = event.ctrlKey;
+ }
+
+ // Add which for click: 1 === left; 2 === middle; 3 === right
+ // Note: button is not normalized, so don't use it
+ if ( !event.which && event.button !== undefined ) {
+ event.which = (event.button & 1 ? 1 : ( event.button & 2 ? 3 : ( event.button & 4 ? 2 : 0 ) ));
+ }
+
+ return event;
+ },
+
+ // Deprecated, use jQuery.guid instead
+ guid: 1E8,
+
+ // Deprecated, use jQuery.proxy instead
+ proxy: jQuery.proxy,
+
+ special: {
+ ready: {
+ // Make sure the ready event is setup
+ setup: jQuery.bindReady,
+ teardown: jQuery.noop
+ },
+
+ live: {
+ add: function( handleObj ) {
+ jQuery.event.add( this,
+ liveConvert( handleObj.origType, handleObj.selector ),
+ jQuery.extend({}, handleObj, {handler: liveHandler, guid: handleObj.handler.guid}) );
+ },
+
+ remove: function( handleObj ) {
+ jQuery.event.remove( this, liveConvert( handleObj.origType, handleObj.selector ), handleObj );
+ }
+ },
+
+ 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;
+ }
+ }
+ }
+ }
+};
+
+jQuery.removeEvent = document.removeEventListener ?
+ function( elem, type, handle ) {
+ if ( elem.removeEventListener ) {
+ elem.removeEventListener( type, handle, false );
+ }
+ } :
+ function( elem, type, handle ) {
+ if ( elem.detachEvent ) {
+ elem.detachEvent( "on" + type, handle );
+ }
+ };
+
+jQuery.Event = function( src, props ) {
+ // Allow instantiation without the 'new' keyword
+ if ( !this.preventDefault ) {
+ 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 );
+ }
+
+ // timeStamp is buggy for some events on Firefox(#3843)
+ // So we won't rely on the native value
+ this.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
+};
+
+// Checks if an event happened on an element within another element
+// Used in jQuery.event.special.mouseenter and mouseleave handlers
+var withinElement = function( event ) {
+
+ // Check if mouse(over|out) are still within the same parent element
+ var related = event.relatedTarget,
+ inside = false,
+ eventType = event.type;
+
+ event.type = event.data;
+
+ if ( related !== this ) {
+
+ if ( related ) {
+ inside = jQuery.contains( this, related );
+ }
+
+ if ( !inside ) {
+
+ jQuery.event.handle.apply( this, arguments );
+
+ event.type = eventType;
+ }
+ }
+},
+
+// In case of event delegation, we only need to rename the event.type,
+// liveHandler will take care of the rest.
+delegate = function( event ) {
+ event.type = event.data;
+ jQuery.event.handle.apply( this, arguments );
+};
+
+// Create mouseenter and mouseleave events
+jQuery.each({
+ mouseenter: "mouseover",
+ mouseleave: "mouseout"
+}, function( orig, fix ) {
+ jQuery.event.special[ orig ] = {
+ setup: function( data ) {
+ jQuery.event.add( this, fix, data && data.selector ? delegate : withinElement, orig );
+ },
+ teardown: function( data ) {
+ jQuery.event.remove( this, fix, data && data.selector ? delegate : withinElement );
+ }
+ };
+});
+
+// submit delegation
+if ( !jQuery.support.submitBubbles ) {
+
+ jQuery.event.special.submit = {
+ setup: function( data, namespaces ) {
+ if ( !jQuery.nodeName( this, "form" ) ) {
+ jQuery.event.add(this, "click.specialSubmit", function( e ) {
+ var elem = e.target,
+ type = elem.type;
+
+ if ( (type === "submit" || type === "image") && jQuery( elem ).closest("form").length ) {
+ trigger( "submit", this, arguments );
+ }
+ });
+
+ jQuery.event.add(this, "keypress.specialSubmit", function( e ) {
+ var elem = e.target,
+ type = elem.type;
+
+ if ( (type === "text" || type === "password") && jQuery( elem ).closest("form").length && e.keyCode === 13 ) {
+ trigger( "submit", this, arguments );
+ }
+ });
+
+ } else {
+ return false;
+ }
+ },
+
+ teardown: function( namespaces ) {
+ jQuery.event.remove( this, ".specialSubmit" );
+ }
+ };
+
+}
+
+// change delegation, happens here so we have bind.
+if ( !jQuery.support.changeBubbles ) {
+
+ var changeFilters,
+
+ getVal = function( elem ) {
+ var type = elem.type, val = elem.value;
+
+ if ( type === "radio" || type === "checkbox" ) {
+ val = elem.checked;
+
+ } else if ( type === "select-multiple" ) {
+ val = elem.selectedIndex > -1 ?
+ jQuery.map( elem.options, function( elem ) {
+ return elem.selected;
+ }).join("-") :
+ "";
+
+ } else if ( jQuery.nodeName( elem, "select" ) ) {
+ val = elem.selectedIndex;
+ }
+
+ return val;
+ },
+
+ testChange = function testChange( e ) {
+ var elem = e.target, data, val;
+
+ if ( !rformElems.test( elem.nodeName ) || elem.readOnly ) {
+ return;
+ }
+
+ data = jQuery._data( elem, "_change_data" );
+ val = getVal(elem);
+
+ // the current data will be also retrieved by beforeactivate
+ if ( e.type !== "focusout" || elem.type !== "radio" ) {
+ jQuery._data( elem, "_change_data", val );
+ }
+
+ if ( data === undefined || val === data ) {
+ return;
+ }
+
+ if ( data != null || val ) {
+ e.type = "change";
+ e.liveFired = undefined;
+ jQuery.event.trigger( e, arguments[1], elem );
+ }
+ };
+
+ jQuery.event.special.change = {
+ filters: {
+ focusout: testChange,
+
+ beforedeactivate: testChange,
+
+ click: function( e ) {
+ var elem = e.target, type = jQuery.nodeName( elem, "input" ) ? elem.type : "";
+
+ if ( type === "radio" || type === "checkbox" || jQuery.nodeName( elem, "select" ) ) {
+ testChange.call( this, e );
+ }
+ },
+
+ // Change has to be called before submit
+ // Keydown will be called before keypress, which is used in submit-event delegation
+ keydown: function( e ) {
+ var elem = e.target, type = jQuery.nodeName( elem, "input" ) ? elem.type : "";
+
+ if ( (e.keyCode === 13 && !jQuery.nodeName( elem, "textarea" ) ) ||
+ (e.keyCode === 32 && (type === "checkbox" || type === "radio")) ||
+ type === "select-multiple" ) {
+ testChange.call( this, e );
+ }
+ },
+
+ // Beforeactivate happens also before the previous element is blurred
+ // with this event you can't trigger a change event, but you can store
+ // information
+ beforeactivate: function( e ) {
+ var elem = e.target;
+ jQuery._data( elem, "_change_data", getVal(elem) );
+ }
+ },
+
+ setup: function( data, namespaces ) {
+ if ( this.type === "file" ) {
+ return false;
+ }
+
+ for ( var type in changeFilters ) {
+ jQuery.event.add( this, type + ".specialChange", changeFilters[type] );
+ }
+
+ return rformElems.test( this.nodeName );
+ },
+
+ teardown: function( namespaces ) {
+ jQuery.event.remove( this, ".specialChange" );
+
+ return rformElems.test( this.nodeName );
+ }
+ };
+
+ changeFilters = jQuery.event.special.change.filters;
+
+ // Handle when the input is .focus()'d
+ changeFilters.focus = changeFilters.beforeactivate;
+}
+
+function trigger( type, elem, args ) {
+ // 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.
+ // Don't pass args or remember liveFired; they apply to the donor event.
+ var event = jQuery.extend( {}, args[ 0 ] );
+ event.type = type;
+ event.originalEvent = {};
+ event.liveFired = undefined;
+ jQuery.event.handle.call( elem, event );
+ if ( event.isDefaultPrevented() ) {
+ args[ 0 ].preventDefault();
+ }
+}
+
+// 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;
+
+ jQuery.event.special[ fix ] = {
+ setup: function() {
+ if ( attaches++ === 0 ) {
+ document.addEventListener( orig, handler, true );
+ }
+ },
+ teardown: function() {
+ if ( --attaches === 0 ) {
+ document.removeEventListener( orig, handler, true );
+ }
+ }
+ };
+
+ function handler( donor ) {
+ // Donor event is always a native one; fix it and switch its type.
+ // Let focusin/out handler cancel the donor focus/blur event.
+ var e = jQuery.event.fix( donor );
+ e.type = fix;
+ e.originalEvent = {};
+ jQuery.event.trigger( e, null, e.target );
+ if ( e.isDefaultPrevented() ) {
+ donor.preventDefault();
+ }
+ }
+ });
+}
+
+jQuery.each(["bind", "one"], function( i, name ) {
+ jQuery.fn[ name ] = function( type, data, fn ) {
+ var handler;
+
+ // Handle object literals
+ if ( typeof type === "object" ) {
+ for ( var key in type ) {
+ this[ name ](key, data, type[key], fn);
+ }
+ return this;
+ }
+
+ if ( arguments.length === 2 || data === false ) {
+ fn = data;
+ data = undefined;
+ }
+
+ if ( name === "one" ) {
+ handler = function( event ) {
+ jQuery( this ).unbind( event, handler );
+ return fn.apply( this, arguments );
+ };
+ handler.guid = fn.guid || jQuery.guid++;
+ } else {
+ handler = fn;
+ }
+
+ if ( type === "unload" && name !== "one" ) {
+ this.one( type, data, fn );
+
+ } else {
+ for ( var i = 0, l = this.length; i < l; i++ ) {
+ jQuery.event.add( this[i], type, handler, data );
+ }
+ }
+
+ return this;
+ };
+});
+
+jQuery.fn.extend({
+ unbind: function( type, fn ) {
+ // Handle object literals
+ if ( typeof type === "object" && !type.preventDefault ) {
+ for ( var key in type ) {
+ this.unbind(key, type[key]);
+ }
+
+ } else {
+ for ( var i = 0, l = this.length; i < l; i++ ) {
+ jQuery.event.remove( this[i], type, fn );
+ }
+ }
+
+ return this;
+ },
+
+ delegate: function( selector, types, data, fn ) {
+ return this.live( types, data, fn, selector );
+ },
+
+ undelegate: function( selector, types, fn ) {
+ if ( arguments.length === 0 ) {
+ return this.unbind( "live" );
+
+ } else {
+ return this.die( types, null, fn, selector );
+ }
+ },
+
+ 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 );
+ }
+});
+
+var liveMap = {
+ focus: "focusin",
+ blur: "focusout",
+ mouseenter: "mouseover",
+ mouseleave: "mouseout"
+};
+
+jQuery.each(["live", "die"], function( i, name ) {
+ jQuery.fn[ name ] = function( types, data, fn, origSelector /* Internal Use Only */ ) {
+ var type, i = 0, match, namespaces, preType,
+ selector = origSelector || this.selector,
+ context = origSelector ? this : jQuery( this.context );
+
+ if ( typeof types === "object" && !types.preventDefault ) {
+ for ( var key in types ) {
+ context[ name ]( key, data, types[key], selector );
+ }
+
+ return this;
+ }
+
+ if ( name === "die" && !types &&
+ origSelector && origSelector.charAt(0) === "." ) {
+
+ context.unbind( origSelector );
+
+ return this;
+ }
+
+ if ( data === false || jQuery.isFunction( data ) ) {
+ fn = data || returnFalse;
+ data = undefined;
+ }
+
+ types = (types || "").split(" ");
+
+ while ( (type = types[ i++ ]) != null ) {
+ match = rnamespaces.exec( type );
+ namespaces = "";
+
+ if ( match ) {
+ namespaces = match[0];
+ type = type.replace( rnamespaces, "" );
+ }
+
+ if ( type === "hover" ) {
+ types.push( "mouseenter" + namespaces, "mouseleave" + namespaces );
+ continue;
+ }
+
+ preType = type;
+
+ if ( liveMap[ type ] ) {
+ types.push( liveMap[ type ] + namespaces );
+ type = type + namespaces;
+
+ } else {
+ type = (liveMap[ type ] || type) + namespaces;
+ }
+
+ if ( name === "live" ) {
+ // bind live handler
+ for ( var j = 0, l = context.length; j < l; j++ ) {
+ jQuery.event.add( context[j], "live." + liveConvert( type, selector ),
+ { data: data, selector: selector, handler: fn, origType: type, origHandler: fn, preType: preType } );
+ }
+
+ } else {
+ // unbind live handler
+ context.unbind( "live." + liveConvert( type, selector ), fn );
+ }
+ }
+
+ return this;
+ };
+});
+
+function liveHandler( event ) {
+ var stop, maxLevel, related, match, handleObj, elem, j, i, l, data, close, namespace, ret,
+ elems = [],
+ selectors = [],
+ events = jQuery._data( this, "events" );
+
+ // Make sure we avoid non-left-click bubbling in Firefox (#3861) and disabled elements in IE (#6911)
+ if ( event.liveFired === this || !events || !events.live || event.target.disabled || event.button && event.type === "click" ) {
+ return;
+ }
+
+ if ( event.namespace ) {
+ namespace = new RegExp("(^|\\.)" + event.namespace.split(".").join("\\.(?:.*\\.)?") + "(\\.|$)");
+ }
+
+ event.liveFired = this;
+
+ var live = events.live.slice(0);
+
+ for ( j = 0; j < live.length; j++ ) {
+ handleObj = live[j];
+
+ if ( handleObj.origType.replace( rnamespaces, "" ) === event.type ) {
+ selectors.push( handleObj.selector );
+
+ } else {
+ live.splice( j--, 1 );
+ }
+ }
+
+ match = jQuery( event.target ).closest( selectors, event.currentTarget );
+
+ for ( i = 0, l = match.length; i < l; i++ ) {
+ close = match[i];
+
+ for ( j = 0; j < live.length; j++ ) {
+ handleObj = live[j];
+
+ if ( close.selector === handleObj.selector && (!namespace || namespace.test( handleObj.namespace )) && !close.elem.disabled ) {
+ elem = close.elem;
+ related = null;
+
+ // Those two events require additional checking
+ if ( handleObj.preType === "mouseenter" || handleObj.preType === "mouseleave" ) {
+ event.type = handleObj.preType;
+ related = jQuery( event.relatedTarget ).closest( handleObj.selector )[0];
+
+ // Make sure not to accidentally match a child element with the same selector
+ if ( related && jQuery.contains( elem, related ) ) {
+ related = elem;
+ }
+ }
+
+ if ( !related || related !== elem ) {
+ elems.push({ elem: elem, handleObj: handleObj, level: close.level });
+ }
+ }
+ }
+ }
+
+ for ( i = 0, l = elems.length; i < l; i++ ) {
+ match = elems[i];
+
+ if ( maxLevel && match.level > maxLevel ) {
+ break;
+ }
+
+ event.currentTarget = match.elem;
+ event.data = match.handleObj.data;
+ event.handleObj = match.handleObj;
+
+ ret = match.handleObj.origHandler.apply( match.elem, arguments );
+
+ if ( ret === false || event.isPropagationStopped() ) {
+ maxLevel = match.level;
+
+ if ( ret === false ) {
+ stop = false;
+ }
+ if ( event.isImmediatePropagationStopped() ) {
+ break;
+ }
+ }
+ }
+
+ return stop;
+}
+
+function liveConvert( type, selector ) {
+ return (type && type !== "*" ? type + "." : "") + selector.replace(rperiod, "`").replace(rspaces, "&");
+}
+
+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").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.bind( name, data, fn ) :
+ this.trigger( name );
+ };
+
+ if ( jQuery.attrFn ) {
+ jQuery.attrFn[ name ] = true;
+ }
+});
+
+
+
+/*!
+ * Sizzle CSS Selector Engine
+ * Copyright 2011, The Dojo Foundation
+ * Released under the MIT, BSD, and GPL Licenses.
+ * More information: http://sizzlejs.com/
+ */
+(function(){
+
+var chunker = /((?:\((?:\([^()]+\)|[^()]+)+\)|\[(?:\[[^\[\]]*\]|['"][^'"]*['"]|[^\[\]'"]+)+\]|\\.|[^ >+~,(\[\\]+)+|[>+~])(\s*,\s*)?((?:.|\r|\n)*)/g,
+ done = 0,
+ toString = Object.prototype.toString,
+ hasDuplicate = false,
+ baseHasDuplicate = true,
+ rBackslash = /\\/g,
+ rNonWord = /\W/;
+
+// Here we check if the JavaScript engine is using some sort of
+// optimization where it does not always call our comparision
+// function. If that is the case, discard the hasDuplicate value.
+// Thus far that includes Google Chrome.
+[0, 0].sort(function() {
+ baseHasDuplicate = false;
+ return 0;
+});
+
+var Sizzle = function( selector, context, results, seed ) {
+ results = results || [];
+ context = context || document;
+
+ var origContext = context;
+
+ if ( context.nodeType !== 1 && context.nodeType !== 9 ) {
+ return [];
+ }
+
+ if ( !selector || typeof selector !== "string" ) {
+ return results;
+ }
+
+ var m, set, checkSet, extra, ret, cur, pop, i,
+ prune = true,
+ contextXML = Sizzle.isXML( context ),
+ parts = [],
+ soFar = selector;
+
+ // Reset the position of the chunker regexp (start from head)
+ do {
+ chunker.exec( "" );
+ m = chunker.exec( soFar );
+
+ if ( m ) {
+ soFar = m[3];
+
+ parts.push( m[1] );
+
+ if ( m[2] ) {
+ extra = m[3];
+ break;
+ }
+ }
+ } while ( m );
+
+ if ( parts.length > 1 && origPOS.exec( selector ) ) {
+
+ if ( parts.length === 2 && Expr.relative[ parts[0] ] ) {
+ set = posProcess( parts[0] + parts[1], context );
+
+ } else {
+ set = Expr.relative[ parts[0] ] ?
+ [ context ] :
+ Sizzle( parts.shift(), context );
+
+ while ( parts.length ) {
+ selector = parts.shift();
+
+ if ( Expr.relative[ selector ] ) {
+ selector += parts.shift();
+ }
+
+ set = posProcess( selector, set );
+ }
+ }
+
+ } else {
+ // Take a shortcut and set the context if the root selector is an ID
+ // (but not if it'll be faster if the inner selector is an ID)
+ if ( !seed && parts.length > 1 && context.nodeType === 9 && !contextXML &&
+ Expr.match.ID.test(parts[0]) && !Expr.match.ID.test(parts[parts.length - 1]) ) {
+
+ ret = Sizzle.find( parts.shift(), context, contextXML );
+ context = ret.expr ?
+ Sizzle.filter( ret.expr, ret.set )[0] :
+ ret.set[0];
+ }
+
+ if ( context ) {
+ ret = seed ?
+ { expr: parts.pop(), set: makeArray(seed) } :
+ Sizzle.find( parts.pop(), parts.length === 1 && (parts[0] === "~" || parts[0] === "+") && context.parentNode ? context.parentNode : context, contextXML );
+
+ set = ret.expr ?
+ Sizzle.filter( ret.expr, ret.set ) :
+ ret.set;
+
+ if ( parts.length > 0 ) {
+ checkSet = makeArray( set );
+
+ } else {
+ prune = false;
+ }
+
+ while ( parts.length ) {
+ cur = parts.pop();
+ pop = cur;
+
+ if ( !Expr.relative[ cur ] ) {
+ cur = "";
+ } else {
+ pop = parts.pop();
+ }
+
+ if ( pop == null ) {
+ pop = context;
+ }
+
+ Expr.relative[ cur ]( checkSet, pop, contextXML );
+ }
+
+ } else {
+ checkSet = parts = [];
+ }
+ }
+
+ if ( !checkSet ) {
+ checkSet = set;
+ }
+
+ if ( !checkSet ) {
+ Sizzle.error( cur || selector );
+ }
+
+ if ( toString.call(checkSet) === "[object Array]" ) {
+ if ( !prune ) {
+ results.push.apply( results, checkSet );
+
+ } else if ( context && context.nodeType === 1 ) {
+ for ( i = 0; checkSet[i] != null; i++ ) {
+ if ( checkSet[i] && (checkSet[i] === true || checkSet[i].nodeType === 1 && Sizzle.contains(context, checkSet[i])) ) {
+ results.push( set[i] );
+ }
+ }
+
+ } else {
+ for ( i = 0; checkSet[i] != null; i++ ) {
+ if ( checkSet[i] && checkSet[i].nodeType === 1 ) {
+ results.push( set[i] );
+ }
+ }
+ }
+
+ } else {
+ makeArray( checkSet, results );
+ }
+
+ if ( extra ) {
+ Sizzle( extra, origContext, results, seed );
+ Sizzle.uniqueSort( results );
+ }
+
+ return results;
+};
+
+Sizzle.uniqueSort = function( results ) {
+ if ( sortOrder ) {
+ hasDuplicate = baseHasDuplicate;
+ results.sort( sortOrder );
+
+ if ( hasDuplicate ) {
+ for ( var i = 1; i < results.length; i++ ) {
+ if ( results[i] === results[ i - 1 ] ) {
+ results.splice( i--, 1 );
+ }
+ }
+ }
+ }
+
+ return results;
+};
+
+Sizzle.matches = function( expr, set ) {
+ return Sizzle( expr, null, null, set );
+};
+
+Sizzle.matchesSelector = function( node, expr ) {
+ return Sizzle( expr, null, null, [node] ).length > 0;
+};
+
+Sizzle.find = function( expr, context, isXML ) {
+ var set;
+
+ if ( !expr ) {
+ return [];
+ }
+
+ for ( var i = 0, l = Expr.order.length; i < l; i++ ) {
+ var match,
+ type = Expr.order[i];
+
+ if ( (match = Expr.leftMatch[ type ].exec( expr )) ) {
+ var left = match[1];
+ match.splice( 1, 1 );
+
+ if ( left.substr( left.length - 1 ) !== "\\" ) {
+ match[1] = (match[1] || "").replace( rBackslash, "" );
+ set = Expr.find[ type ]( match, context, isXML );
+
+ if ( set != null ) {
+ expr = expr.replace( Expr.match[ type ], "" );
+ break;
+ }
+ }
+ }
+ }
+
+ if ( !set ) {
+ set = typeof context.getElementsByTagName !== "undefined" ?
+ context.getElementsByTagName( "*" ) :
+ [];
+ }
+
+ return { set: set, expr: expr };
+};
+
+Sizzle.filter = function( expr, set, inplace, not ) {
+ var match, anyFound,
+ old = expr,
+ result = [],
+ curLoop = set,
+ isXMLFilter = set && set[0] && Sizzle.isXML( set[0] );
+
+ while ( expr && set.length ) {
+ for ( var type in Expr.filter ) {
+ if ( (match = Expr.leftMatch[ type ].exec( expr )) != null && match[2] ) {
+ var found, item,
+ filter = Expr.filter[ type ],
+ left = match[1];
+
+ anyFound = false;
+
+ match.splice(1,1);
+
+ if ( left.substr( left.length - 1 ) === "\\" ) {
+ continue;
+ }
+
+ if ( curLoop === result ) {
+ result = [];
+ }
+
+ if ( Expr.preFilter[ type ] ) {
+ match = Expr.preFilter[ type ]( match, curLoop, inplace, result, not, isXMLFilter );
+
+ if ( !match ) {
+ anyFound = found = true;
+
+ } else if ( match === true ) {
+ continue;
+ }
+ }
+
+ if ( match ) {
+ for ( var i = 0; (item = curLoop[i]) != null; i++ ) {
+ if ( item ) {
+ found = filter( item, match, i, curLoop );
+ var pass = not ^ !!found;
+
+ if ( inplace && found != null ) {
+ if ( pass ) {
+ anyFound = true;
+
+ } else {
+ curLoop[i] = false;
+ }
+
+ } else if ( pass ) {
+ result.push( item );
+ anyFound = true;
+ }
+ }
+ }
+ }
+
+ if ( found !== undefined ) {
+ if ( !inplace ) {
+ curLoop = result;
+ }
+
+ expr = expr.replace( Expr.match[ type ], "" );
+
+ if ( !anyFound ) {
+ return [];
+ }
+
+ break;
+ }
+ }
+ }
+
+ // Improper expression
+ if ( expr === old ) {
+ if ( anyFound == null ) {
+ Sizzle.error( expr );
+
+ } else {
+ break;
+ }
+ }
+
+ old = expr;
+ }
+
+ return curLoop;
+};
+
+Sizzle.error = function( msg ) {
+ throw "Syntax error, unrecognized expression: " + msg;
+};
+
+var Expr = Sizzle.selectors = {
+ order: [ "ID", "NAME", "TAG" ],
+
+ match: {
+ ID: /#((?:[\w\u00c0-\uFFFF\-]|\\.)+)/,
+ CLASS: /\.((?:[\w\u00c0-\uFFFF\-]|\\.)+)/,
+ NAME: /\[name=['"]*((?:[\w\u00c0-\uFFFF\-]|\\.)+)['"]*\]/,
+ ATTR: /\[\s*((?:[\w\u00c0-\uFFFF\-]|\\.)+)\s*(?:(\S?=)\s*(?:(['"])(.*?)\3|(#?(?:[\w\u00c0-\uFFFF\-]|\\.)*)|)|)\s*\]/,
+ TAG: /^((?:[\w\u00c0-\uFFFF\*\-]|\\.)+)/,
+ CHILD: /:(only|nth|last|first)-child(?:\(\s*(even|odd|(?:[+\-]?\d+|(?:[+\-]?\d*)?n\s*(?:[+\-]\s*\d+)?))\s*\))?/,
+ POS: /:(nth|eq|gt|lt|first|last|even|odd)(?:\((\d*)\))?(?=[^\-]|$)/,
+ PSEUDO: /:((?:[\w\u00c0-\uFFFF\-]|\\.)+)(?:\((['"]?)((?:\([^\)]+\)|[^\(\)]*)+)\2\))?/
+ },
+
+ leftMatch: {},
+
+ attrMap: {
+ "class": "className",
+ "for": "htmlFor"
+ },
+
+ attrHandle: {
+ href: function( elem ) {
+ return elem.getAttribute( "href" );
+ },
+ type: function( elem ) {
+ return elem.getAttribute( "type" );
+ }
+ },
+
+ relative: {
+ "+": function(checkSet, part){
+ var isPartStr = typeof part === "string",
+ isTag = isPartStr && !rNonWord.test( part ),
+ isPartStrNotTag = isPartStr && !isTag;
+
+ if ( isTag ) {
+ part = part.toLowerCase();
+ }
+
+ for ( var i = 0, l = checkSet.length, elem; i < l; i++ ) {
+ if ( (elem = checkSet[i]) ) {
+ while ( (elem = elem.previousSibling) && elem.nodeType !== 1 ) {}
+
+ checkSet[i] = isPartStrNotTag || elem && elem.nodeName.toLowerCase() === part ?
+ elem || false :
+ elem === part;
+ }
+ }
+
+ if ( isPartStrNotTag ) {
+ Sizzle.filter( part, checkSet, true );
+ }
+ },
+
+ ">": function( checkSet, part ) {
+ var elem,
+ isPartStr = typeof part === "string",
+ i = 0,
+ l = checkSet.length;
+
+ if ( isPartStr && !rNonWord.test( part ) ) {
+ part = part.toLowerCase();
+
+ for ( ; i < l; i++ ) {
+ elem = checkSet[i];
+
+ if ( elem ) {
+ var parent = elem.parentNode;
+ checkSet[i] = parent.nodeName.toLowerCase() === part ? parent : false;
+ }
+ }
+
+ } else {
+ for ( ; i < l; i++ ) {
+ elem = checkSet[i];
+
+ if ( elem ) {
+ checkSet[i] = isPartStr ?
+ elem.parentNode :
+ elem.parentNode === part;
+ }
+ }
+
+ if ( isPartStr ) {
+ Sizzle.filter( part, checkSet, true );
+ }
+ }
+ },
+
+ "": function(checkSet, part, isXML){
+ var nodeCheck,
+ doneName = done++,
+ checkFn = dirCheck;
+
+ if ( typeof part === "string" && !rNonWord.test( part ) ) {
+ part = part.toLowerCase();
+ nodeCheck = part;
+ checkFn = dirNodeCheck;
+ }
+
+ checkFn( "parentNode", part, doneName, checkSet, nodeCheck, isXML );
+ },
+
+ "~": function( checkSet, part, isXML ) {
+ var nodeCheck,
+ doneName = done++,
+ checkFn = dirCheck;
+
+ if ( typeof part === "string" && !rNonWord.test( part ) ) {
+ part = part.toLowerCase();
+ nodeCheck = part;
+ checkFn = dirNodeCheck;
+ }
+
+ checkFn( "previousSibling", part, doneName, checkSet, nodeCheck, isXML );
+ }
+ },
+
+ find: {
+ ID: function( match, context, isXML ) {
+ if ( typeof context.getElementById !== "undefined" && !isXML ) {
+ var m = context.getElementById(match[1]);
+ // Check parentNode to catch when Blackberry 4.6 returns
+ // nodes that are no longer in the document #6963
+ return m && m.parentNode ? [m] : [];
+ }
+ },
+
+ NAME: function( match, context ) {
+ if ( typeof context.getElementsByName !== "undefined" ) {
+ var ret = [],
+ results = context.getElementsByName( match[1] );
+
+ for ( var i = 0, l = results.length; i < l; i++ ) {
+ if ( results[i].getAttribute("name") === match[1] ) {
+ ret.push( results[i] );
+ }
+ }
+
+ return ret.length === 0 ? null : ret;
+ }
+ },
+
+ TAG: function( match, context ) {
+ if ( typeof context.getElementsByTagName !== "undefined" ) {
+ return context.getElementsByTagName( match[1] );
+ }
+ }
+ },
+ preFilter: {
+ CLASS: function( match, curLoop, inplace, result, not, isXML ) {
+ match = " " + match[1].replace( rBackslash, "" ) + " ";
+
+ if ( isXML ) {
+ return match;
+ }
+
+ for ( var i = 0, elem; (elem = curLoop[i]) != null; i++ ) {
+ if ( elem ) {
+ if ( not ^ (elem.className && (" " + elem.className + " ").replace(/[\t\n\r]/g, " ").indexOf(match) >= 0) ) {
+ if ( !inplace ) {
+ result.push( elem );
+ }
+
+ } else if ( inplace ) {
+ curLoop[i] = false;
+ }
+ }
+ }
+
+ return false;
+ },
+
+ ID: function( match ) {
+ return match[1].replace( rBackslash, "" );
+ },
+
+ TAG: function( match, curLoop ) {
+ return match[1].replace( rBackslash, "" ).toLowerCase();
+ },
+
+ CHILD: function( match ) {
+ if ( match[1] === "nth" ) {
+ if ( !match[2] ) {
+ Sizzle.error( match[0] );
+ }
+
+ match[2] = match[2].replace(/^\+|\s*/g, '');
+
+ // parse equations like 'even', 'odd', '5', '2n', '3n+2', '4n-1', '-n+6'
+ var test = /(-?)(\d*)(?:n([+\-]?\d*))?/.exec(
+ match[2] === "even" && "2n" || match[2] === "odd" && "2n+1" ||
+ !/\D/.test( match[2] ) && "0n+" + match[2] || match[2]);
+
+ // calculate the numbers (first)n+(last) including if they are negative
+ match[2] = (test[1] + (test[2] || 1)) - 0;
+ match[3] = test[3] - 0;
+ }
+ else if ( match[2] ) {
+ Sizzle.error( match[0] );
+ }
+
+ // TODO: Move to normal caching system
+ match[0] = done++;
+
+ return match;
+ },
+
+ ATTR: function( match, curLoop, inplace, result, not, isXML ) {
+ var name = match[1] = match[1].replace( rBackslash, "" );
+
+ if ( !isXML && Expr.attrMap[name] ) {
+ match[1] = Expr.attrMap[name];
+ }
+
+ // Handle if an un-quoted value was used
+ match[4] = ( match[4] || match[5] || "" ).replace( rBackslash, "" );
+
+ if ( match[2] === "~=" ) {
+ match[4] = " " + match[4] + " ";
+ }
+
+ return match;
+ },
+
+ PSEUDO: function( match, curLoop, inplace, result, not ) {
+ if ( match[1] === "not" ) {
+ // If we're dealing with a complex expression, or a simple one
+ if ( ( chunker.exec(match[3]) || "" ).length > 1 || /^\w/.test(match[3]) ) {
+ match[3] = Sizzle(match[3], null, null, curLoop);
+
+ } else {
+ var ret = Sizzle.filter(match[3], curLoop, inplace, true ^ not);
+
+ if ( !inplace ) {
+ result.push.apply( result, ret );
+ }
+
+ return false;
+ }
+
+ } else if ( Expr.match.POS.test( match[0] ) || Expr.match.CHILD.test( match[0] ) ) {
+ return true;
+ }
+
+ return match;
+ },
+
+ POS: function( match ) {
+ match.unshift( true );
+
+ return match;
+ }
+ },
+
+ filters: {
+ enabled: function( elem ) {
+ return elem.disabled === false && elem.type !== "hidden";
+ },
+
+ disabled: function( elem ) {
+ return elem.disabled === true;
+ },
+
+ checked: function( elem ) {
+ return elem.checked === true;
+ },
+
+ selected: function( elem ) {
+ // Accessing this property makes selected-by-default
+ // options in Safari work properly
+ if ( elem.parentNode ) {
+ elem.parentNode.selectedIndex;
+ }
+
+ return elem.selected === true;
+ },
+
+ parent: function( elem ) {
+ return !!elem.firstChild;
+ },
+
+ empty: function( elem ) {
+ return !elem.firstChild;
+ },
+
+ has: function( elem, i, match ) {
+ return !!Sizzle( match[3], elem ).length;
+ },
+
+ header: function( elem ) {
+ return (/h\d/i).test( elem.nodeName );
+ },
+
+ text: function( elem ) {
+ var attr = elem.getAttribute( "type" ), type = elem.type;
+ // IE6 and 7 will map elem.type to 'text' for new HTML5 types (search, etc)
+ // use getAttribute instead to test this case
+ return elem.nodeName.toLowerCase() === "input" && "text" === type && ( attr === type || attr === null );
+ },
+
+ radio: function( elem ) {
+ return elem.nodeName.toLowerCase() === "input" && "radio" === elem.type;
+ },
+
+ checkbox: function( elem ) {
+ return elem.nodeName.toLowerCase() === "input" && "checkbox" === elem.type;
+ },
+
+ file: function( elem ) {
+ return elem.nodeName.toLowerCase() === "input" && "file" === elem.type;
+ },
+
+ password: function( elem ) {
+ return elem.nodeName.toLowerCase() === "input" && "password" === elem.type;
+ },
+
+ submit: function( elem ) {
+ var name = elem.nodeName.toLowerCase();
+ return (name === "input" || name === "button") && "submit" === elem.type;
+ },
+
+ image: function( elem ) {
+ return elem.nodeName.toLowerCase() === "input" && "image" === elem.type;
+ },
+
+ reset: function( elem ) {
+ var name = elem.nodeName.toLowerCase();
+ return (name === "input" || name === "button") && "reset" === elem.type;
+ },
+
+ button: function( elem ) {
+ var name = elem.nodeName.toLowerCase();
+ return name === "input" && "button" === elem.type || name === "button";
+ },
+
+ input: function( elem ) {
+ return (/input|select|textarea|button/i).test( elem.nodeName );
+ },
+
+ focus: function( elem ) {
+ return elem === elem.ownerDocument.activeElement;
+ }
+ },
+ setFilters: {
+ first: function( elem, i ) {
+ return i === 0;
+ },
+
+ last: function( elem, i, match, array ) {
+ return i === array.length - 1;
+ },
+
+ even: function( elem, i ) {
+ return i % 2 === 0;
+ },
+
+ odd: function( elem, i ) {
+ return i % 2 === 1;
+ },
+
+ lt: function( elem, i, match ) {
+ return i < match[3] - 0;
+ },
+
+ gt: function( elem, i, match ) {
+ return i > match[3] - 0;
+ },
+
+ nth: function( elem, i, match ) {
+ return match[3] - 0 === i;
+ },
+
+ eq: function( elem, i, match ) {
+ return match[3] - 0 === i;
+ }
+ },
+ filter: {
+ PSEUDO: function( elem, match, i, array ) {
+ var name = match[1],
+ filter = Expr.filters[ name ];
+
+ if ( filter ) {
+ return filter( elem, i, match, array );
+
+ } else if ( name === "contains" ) {
+ return (elem.textContent || elem.innerText || Sizzle.getText([ elem ]) || "").indexOf(match[3]) >= 0;
+
+ } else if ( name === "not" ) {
+ var not = match[3];
+
+ for ( var j = 0, l = not.length; j < l; j++ ) {
+ if ( not[j] === elem ) {
+ return false;
+ }
+ }
+
+ return true;
+
+ } else {
+ Sizzle.error( name );
+ }
+ },
+
+ CHILD: function( elem, match ) {
+ var type = match[1],
+ node = elem;
+
+ switch ( type ) {
+ case "only":
+ case "first":
+ while ( (node = node.previousSibling) ) {
+ if ( node.nodeType === 1 ) {
+ return false;
+ }
+ }
+
+ if ( type === "first" ) {
+ return true;
+ }
+
+ node = elem;
+
+ case "last":
+ while ( (node = node.nextSibling) ) {
+ if ( node.nodeType === 1 ) {
+ return false;
+ }
+ }
+
+ return true;
+
+ case "nth":
+ var first = match[2],
+ last = match[3];
+
+ if ( first === 1 && last === 0 ) {
+ return true;
+ }
+
+ var doneName = match[0],
+ parent = elem.parentNode;
+
+ if ( parent && (parent.sizcache !== doneName || !elem.nodeIndex) ) {
+ var count = 0;
+
+ for ( node = parent.firstChild; node; node = node.nextSibling ) {
+ if ( node.nodeType === 1 ) {
+ node.nodeIndex = ++count;
+ }
+ }
+
+ parent.sizcache = doneName;
+ }
+
+ var diff = elem.nodeIndex - last;
+
+ if ( first === 0 ) {
+ return diff === 0;
+
+ } else {
+ return ( diff % first === 0 && diff / first >= 0 );
+ }
+ }
+ },
+
+ ID: function( elem, match ) {
+ return elem.nodeType === 1 && elem.getAttribute("id") === match;
+ },
+
+ TAG: function( elem, match ) {
+ return (match === "*" && elem.nodeType === 1) || elem.nodeName.toLowerCase() === match;
+ },
+
+ CLASS: function( elem, match ) {
+ return (" " + (elem.className || elem.getAttribute("class")) + " ")
+ .indexOf( match ) > -1;
+ },
+
+ ATTR: function( elem, match ) {
+ var name = match[1],
+ result = Expr.attrHandle[ name ] ?
+ Expr.attrHandle[ name ]( elem ) :
+ elem[ name ] != null ?
+ elem[ name ] :
+ elem.getAttribute( name ),
+ value = result + "",
+ type = match[2],
+ check = match[4];
+
+ return result == null ?
+ type === "!=" :
+ type === "=" ?
+ value === check :
+ type === "*=" ?
+ value.indexOf(check) >= 0 :
+ type === "~=" ?
+ (" " + value + " ").indexOf(check) >= 0 :
+ !check ?
+ value && result !== false :
+ type === "!=" ?
+ value !== check :
+ type === "^=" ?
+ value.indexOf(check) === 0 :
+ type === "$=" ?
+ value.substr(value.length - check.length) === check :
+ type === "|=" ?
+ value === check || value.substr(0, check.length + 1) === check + "-" :
+ false;
+ },
+
+ POS: function( elem, match, i, array ) {
+ var name = match[2],
+ filter = Expr.setFilters[ name ];
+
+ if ( filter ) {
+ return filter( elem, i, match, array );
+ }
+ }
+ }
+};
+
+var origPOS = Expr.match.POS,
+ fescape = function(all, num){
+ return "\\" + (num - 0 + 1);
+ };
+
+for ( var type in Expr.match ) {
+ Expr.match[ type ] = new RegExp( Expr.match[ type ].source + (/(?![^\[]*\])(?![^\(]*\))/.source) );
+ Expr.leftMatch[ type ] = new RegExp( /(^(?:.|\r|\n)*?)/.source + Expr.match[ type ].source.replace(/\\(\d+)/g, fescape) );
+}
+
+var makeArray = function( array, results ) {
+ array = Array.prototype.slice.call( array, 0 );
+
+ if ( results ) {
+ results.push.apply( results, array );
+ return results;
+ }
+
+ return array;
+};
+
+// Perform a simple check to determine if the browser is capable of
+// converting a NodeList to an array using builtin methods.
+// Also verifies that the returned array holds DOM nodes
+// (which is not the case in the Blackberry browser)
+try {
+ Array.prototype.slice.call( document.documentElement.childNodes, 0 )[0].nodeType;
+
+// Provide a fallback method if it does not work
+} catch( e ) {
+ makeArray = function( array, results ) {
+ var i = 0,
+ ret = results || [];
+
+ if ( toString.call(array) === "[object Array]" ) {
+ Array.prototype.push.apply( ret, array );
+
+ } else {
+ if ( typeof array.length === "number" ) {
+ for ( var l = array.length; i < l; i++ ) {
+ ret.push( array[i] );
+ }
+
+ } else {
+ for ( ; array[i]; i++ ) {
+ ret.push( array[i] );
+ }
+ }
+ }
+
+ return ret;
+ };
+}
+
+var sortOrder, siblingCheck;
+
+if ( document.documentElement.compareDocumentPosition ) {
+ sortOrder = function( a, b ) {
+ if ( a === b ) {
+ hasDuplicate = true;
+ return 0;
+ }
+
+ if ( !a.compareDocumentPosition || !b.compareDocumentPosition ) {
+ return a.compareDocumentPosition ? -1 : 1;
+ }
+
+ return a.compareDocumentPosition(b) & 4 ? -1 : 1;
+ };
+
+} else {
+ sortOrder = function( a, b ) {
+ // The nodes are identical, we can exit early
+ if ( a === b ) {
+ hasDuplicate = true;
+ return 0;
+
+ // Fallback to using sourceIndex (in IE) if it's available on both nodes
+ } else if ( a.sourceIndex && b.sourceIndex ) {
+ return a.sourceIndex - b.sourceIndex;
+ }
+
+ var al, bl,
+ ap = [],
+ bp = [],
+ aup = a.parentNode,
+ bup = b.parentNode,
+ cur = aup;
+
+ // If the nodes are siblings (or identical) we can do a quick check
+ if ( aup === bup ) {
+ return siblingCheck( a, b );
+
+ // If no parents were found then the nodes are disconnected
+ } else if ( !aup ) {
+ return -1;
+
+ } else if ( !bup ) {
+ return 1;
+ }
+
+ // Otherwise they're somewhere else in the tree so we need
+ // to build up a full list of the parentNodes for comparison
+ while ( cur ) {
+ ap.unshift( cur );
+ cur = cur.parentNode;
+ }
+
+ cur = bup;
+
+ while ( cur ) {
+ bp.unshift( cur );
+ cur = cur.parentNode;
+ }
+
+ al = ap.length;
+ bl = bp.length;
+
+ // Start walking down the tree looking for a discrepancy
+ for ( var i = 0; i < al && i < bl; i++ ) {
+ if ( ap[i] !== bp[i] ) {
+ return siblingCheck( ap[i], bp[i] );
+ }
+ }
+
+ // We ended someplace up the tree so do a sibling check
+ return i === al ?
+ siblingCheck( a, bp[i], -1 ) :
+ siblingCheck( ap[i], b, 1 );
+ };
+
+ siblingCheck = function( a, b, ret ) {
+ if ( a === b ) {
+ return ret;
+ }
+
+ var cur = a.nextSibling;
+
+ while ( cur ) {
+ if ( cur === b ) {
+ return -1;
+ }
+
+ cur = cur.nextSibling;
+ }
+
+ return 1;
+ };
+}
+
+// Utility function for retreiving the text value of an array of DOM nodes
+Sizzle.getText = function( elems ) {
+ var ret = "", elem;
+
+ for ( var i = 0; elems[i]; i++ ) {
+ elem = elems[i];
+
+ // Get the text from text nodes and CDATA nodes
+ if ( elem.nodeType === 3 || elem.nodeType === 4 ) {
+ ret += elem.nodeValue;
+
+ // Traverse everything else, except comment nodes
+ } else if ( elem.nodeType !== 8 ) {
+ ret += Sizzle.getText( elem.childNodes );
+ }
+ }
+
+ return ret;
+};
+
+// Check to see if the browser returns elements by name when
+// querying by getElementById (and provide a workaround)
+(function(){
+ // We're going to inject a fake input element with a specified name
+ var form = document.createElement("div"),
+ id = "script" + (new Date()).getTime(),
+ root = document.documentElement;
+
+ form.innerHTML = "<a name='" + id + "'/>";
+
+ // Inject it into the root element, check its status, and remove it quickly
+ root.insertBefore( form, root.firstChild );
+
+ // The workaround has to do additional checks after a getElementById
+ // Which slows things down for other browsers (hence the branching)
+ if ( document.getElementById( id ) ) {
+ Expr.find.ID = function( match, context, isXML ) {
+ if ( typeof context.getElementById !== "undefined" && !isXML ) {
+ var m = context.getElementById(match[1]);
+
+ return m ?
+ m.id === match[1] || typeof m.getAttributeNode !== "undefined" && m.getAttributeNode("id").nodeValue === match[1] ?
+ [m] :
+ undefined :
+ [];
+ }
+ };
+
+ Expr.filter.ID = function( elem, match ) {
+ var node = typeof elem.getAttributeNode !== "undefined" && elem.getAttributeNode("id");
+
+ return elem.nodeType === 1 && node && node.nodeValue === match;
+ };
+ }
+
+ root.removeChild( form );
+
+ // release memory in IE
+ root = form = null;
+})();
+
+(function(){
+ // Check to see if the browser returns only elements
+ // when doing getElementsByTagName("*")
+
+ // Create a fake element
+ var div = document.createElement("div");
+ div.appendChild( document.createComment("") );
+
+ // Make sure no comments are found
+ if ( div.getElementsByTagName("*").length > 0 ) {
+ Expr.find.TAG = function( match, context ) {
+ var results = context.getElementsByTagName( match[1] );
+
+ // Filter out possible comments
+ if ( match[1] === "*" ) {
+ var tmp = [];
+
+ for ( var i = 0; results[i]; i++ ) {
+ if ( results[i].nodeType === 1 ) {
+ tmp.push( results[i] );
+ }
+ }
+
+ results = tmp;
+ }
+
+ return results;
+ };
+ }
+
+ // Check to see if an attribute returns normalized href attributes
+ div.innerHTML = "<a href='#'></a>";
+
+ if ( div.firstChild && typeof div.firstChild.getAttribute !== "undefined" &&
+ div.firstChild.getAttribute("href") !== "#" ) {
+
+ Expr.attrHandle.href = function( elem ) {
+ return elem.getAttribute( "href", 2 );
+ };
+ }
+
+ // release memory in IE
+ div = null;
+})();
+
+if ( document.querySelectorAll ) {
+ (function(){
+ var oldSizzle = Sizzle,
+ div = document.createElement("div"),
+ id = "__sizzle__";
+
+ div.innerHTML = "<p class='TEST'></p>";
+
+ // Safari can't handle uppercase or unicode characters when
+ // in quirks mode.
+ if ( div.querySelectorAll && div.querySelectorAll(".TEST").length === 0 ) {
+ return;
+ }
+
+ Sizzle = function( query, context, extra, seed ) {
+ context = context || document;
+
+ // Only use querySelectorAll on non-XML documents
+ // (ID selectors don't work in non-HTML documents)
+ if ( !seed && !Sizzle.isXML(context) ) {
+ // See if we find a selector to speed up
+ var match = /^(\w+$)|^\.([\w\-]+$)|^#([\w\-]+$)/.exec( query );
+
+ if ( match && (context.nodeType === 1 || context.nodeType === 9) ) {
+ // Speed-up: Sizzle("TAG")
+ if ( match[1] ) {
+ return makeArray( context.getElementsByTagName( query ), extra );
+
+ // Speed-up: Sizzle(".CLASS")
+ } else if ( match[2] && Expr.find.CLASS && context.getElementsByClassName ) {
+ return makeArray( context.getElementsByClassName( match[2] ), extra );
+ }
+ }
+
+ if ( context.nodeType === 9 ) {
+ // Speed-up: Sizzle("body")
+ // The body element only exists once, optimize finding it
+ if ( query === "body" && context.body ) {
+ return makeArray( [ context.body ], extra );
+
+ // Speed-up: Sizzle("#ID")
+ } else if ( match && match[3] ) {
+ var elem = context.getElementById( match[3] );
+
+ // 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[3] ) {
+ return makeArray( [ elem ], extra );
+ }
+
+ } else {
+ return makeArray( [], extra );
+ }
+ }
+
+ try {
+ return makeArray( context.querySelectorAll(query), extra );
+ } catch(qsaError) {}
+
+ // qSA works strangely on Element-rooted queries
+ // We can work around this by specifying an extra ID on the root
+ // and working up from there (Thanks to Andrew Dupont for the technique)
+ // IE 8 doesn't work on object elements
+ } else if ( context.nodeType === 1 && context.nodeName.toLowerCase() !== "object" ) {
+ var oldContext = context,
+ old = context.getAttribute( "id" ),
+ nid = old || id,
+ hasParent = context.parentNode,
+ relativeHierarchySelector = /^\s*[+~]/.test( query );
+
+ if ( !old ) {
+ context.setAttribute( "id", nid );
+ } else {
+ nid = nid.replace( /'/g, "\\$&" );
+ }
+ if ( relativeHierarchySelector && hasParent ) {
+ context = context.parentNode;
+ }
+
+ try {
+ if ( !relativeHierarchySelector || hasParent ) {
+ return makeArray( context.querySelectorAll( "[id='" + nid + "'] " + query ), extra );
+ }
+
+ } catch(pseudoError) {
+ } finally {
+ if ( !old ) {
+ oldContext.removeAttribute( "id" );
+ }
+ }
+ }
+ }
+
+ return oldSizzle(query, context, extra, seed);
+ };
+
+ for ( var prop in oldSizzle ) {
+ Sizzle[ prop ] = oldSizzle[ prop ];
+ }
+
+ // release memory in IE
+ div = null;
+ })();
+}
+
+(function(){
+ var html = document.documentElement,
+ matches = html.matchesSelector || html.mozMatchesSelector || html.webkitMatchesSelector || html.msMatchesSelector;
+
+ if ( matches ) {
+ // Check to see if it's possible to do matchesSelector
+ // on a disconnected node (IE 9 fails this)
+ var disconnectedMatch = !matches.call( document.createElement( "div" ), "div" ),
+ pseudoWorks = false;
+
+ try {
+ // This should fail with an exception
+ // Gecko does not error, returns false instead
+ matches.call( document.documentElement, "[test!='']:sizzle" );
+
+ } catch( pseudoError ) {
+ pseudoWorks = true;
+ }
+
+ Sizzle.matchesSelector = function( node, expr ) {
+ // Make sure that attribute selectors are quoted
+ expr = expr.replace(/\=\s*([^'"\]]*)\s*\]/g, "='$1']");
+
+ if ( !Sizzle.isXML( node ) ) {
+ try {
+ if ( pseudoWorks || !Expr.match.PSEUDO.test( expr ) && !/!=/.test( expr ) ) {
+ var ret = matches.call( node, expr );
+
+ // IE 9's matchesSelector returns false on disconnected nodes
+ if ( ret || !disconnectedMatch ||
+ // As well, disconnected nodes are said to be in a document
+ // fragment in IE 9, so check for that
+ node.document && node.document.nodeType !== 11 ) {
+ return ret;
+ }
+ }
+ } catch(e) {}
+ }
+
+ return Sizzle(expr, null, null, [node]).length > 0;
+ };
+ }
+})();
+
+(function(){
+ var div = document.createElement("div");
+
+ div.innerHTML = "<div class='test e'></div><div class='test'></div>";
+
+ // Opera can't find a second classname (in 9.6)
+ // Also, make sure that getElementsByClassName actually exists
+ if ( !div.getElementsByClassName || div.getElementsByClassName("e").length === 0 ) {
+ return;
+ }
+
+ // Safari caches class attributes, doesn't catch changes (in 3.2)
+ div.lastChild.className = "e";
+
+ if ( div.getElementsByClassName("e").length === 1 ) {
+ return;
+ }
+
+ Expr.order.splice(1, 0, "CLASS");
+ Expr.find.CLASS = function( match, context, isXML ) {
+ if ( typeof context.getElementsByClassName !== "undefined" && !isXML ) {
+ return context.getElementsByClassName(match[1]);
+ }
+ };
+
+ // release memory in IE
+ div = null;
+})();
+
+function dirNodeCheck( dir, cur, doneName, checkSet, nodeCheck, isXML ) {
+ for ( var i = 0, l = checkSet.length; i < l; i++ ) {
+ var elem = checkSet[i];
+
+ if ( elem ) {
+ var match = false;
+
+ elem = elem[dir];
+
+ while ( elem ) {
+ if ( elem.sizcache === doneName ) {
+ match = checkSet[elem.sizset];
+ break;
+ }
+
+ if ( elem.nodeType === 1 && !isXML ){
+ elem.sizcache = doneName;
+ elem.sizset = i;
+ }
+
+ if ( elem.nodeName.toLowerCase() === cur ) {
+ match = elem;
+ break;
+ }
+
+ elem = elem[dir];
+ }
+
+ checkSet[i] = match;
+ }
+ }
+}
+
+function dirCheck( dir, cur, doneName, checkSet, nodeCheck, isXML ) {
+ for ( var i = 0, l = checkSet.length; i < l; i++ ) {
+ var elem = checkSet[i];
+
+ if ( elem ) {
+ var match = false;
+
+ elem = elem[dir];
+
+ while ( elem ) {
+ if ( elem.sizcache === doneName ) {
+ match = checkSet[elem.sizset];
+ break;
+ }
+
+ if ( elem.nodeType === 1 ) {
+ if ( !isXML ) {
+ elem.sizcache = doneName;
+ elem.sizset = i;
+ }
+
+ if ( typeof cur !== "string" ) {
+ if ( elem === cur ) {
+ match = true;
+ break;
+ }
+
+ } else if ( Sizzle.filter( cur, [elem] ).length > 0 ) {
+ match = elem;
+ break;
+ }
+ }
+
+ elem = elem[dir];
+ }
+
+ checkSet[i] = match;
+ }
+ }
+}
+
+if ( document.documentElement.contains ) {
+ Sizzle.contains = function( a, b ) {
+ return a !== b && (a.contains ? a.contains(b) : true);
+ };
+
+} else if ( document.documentElement.compareDocumentPosition ) {
+ Sizzle.contains = function( a, b ) {
+ return !!(a.compareDocumentPosition(b) & 16);
+ };
+
+} else {
+ Sizzle.contains = function() {
+ return false;
+ };
+}
+
+Sizzle.isXML = function( elem ) {
+ // documentElement is verified for cases where it doesn't yet exist
+ // (such as loading iframes in IE - #4833)
+ var documentElement = (elem ? elem.ownerDocument || elem : 0).documentElement;
+
+ return documentElement ? documentElement.nodeName !== "HTML" : false;
+};
+
+var posProcess = function( selector, context ) {
+ var match,
+ tmpSet = [],
+ later = "",
+ root = context.nodeType ? [context] : context;
+
+ // Position selectors must be done after the filter
+ // And so must :not(positional) so we move all PSEUDOs to the end
+ while ( (match = Expr.match.PSEUDO.exec( selector )) ) {
+ later += match[0];
+ selector = selector.replace( Expr.match.PSEUDO, "" );
+ }
+
+ selector = Expr.relative[selector] ? selector + "*" : selector;
+
+ for ( var i = 0, l = root.length; i < l; i++ ) {
+ Sizzle( selector, root[i], tmpSet );
+ }
+
+ return Sizzle.filter( later, tmpSet );
+};
+
+// EXPOSE
+jQuery.find = Sizzle;
+jQuery.expr = Sizzle.selectors;
+jQuery.expr[":"] = jQuery.expr.filters;
+jQuery.unique = Sizzle.uniqueSort;
+jQuery.text = Sizzle.getText;
+jQuery.isXMLDoc = Sizzle.isXML;
+jQuery.contains = Sizzle.contains;
+
+
+})();
+
+
+var runtil = /Until$/,
+ rparentsprev = /^(?:parents|prevUntil|prevAll)/,
+ // Note: This RegExp should be improved, or likely pulled from Sizzle
+ rmultiselector = /,/,
+ isSimple = /^.[^:#\[\.,]*$/,
+ slice = Array.prototype.slice,
+ POS = jQuery.expr.match.POS,
+ // 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 self = this,
+ i, l;
+
+ 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;
+ }
+ }
+ });
+ }
+
+ var ret = this.pushStack( "", "find", selector ),
+ length, n, r;
+
+ 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 targets = jQuery( target );
+ return this.filter(function() {
+ for ( var i = 0, l = targets.length; i < l; 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" ?
+ jQuery.filter( selector, this ).length > 0 :
+ this.filter( selector ).length > 0 );
+ },
+
+ closest: function( selectors, context ) {
+ var ret = [], i, l, cur = this[0];
+
+ // Array
+ if ( jQuery.isArray( selectors ) ) {
+ var match, selector,
+ matches = {},
+ level = 1;
+
+ if ( cur && selectors.length ) {
+ for ( i = 0, l = selectors.length; i < l; i++ ) {
+ selector = selectors[i];
+
+ if ( !matches[ selector ] ) {
+ matches[ selector ] = POS.test( selector ) ?
+ jQuery( selector, context || this.context ) :
+ selector;
+ }
+ }
+
+ while ( cur && cur.ownerDocument && cur !== context ) {
+ for ( selector in matches ) {
+ match = matches[ selector ];
+
+ if ( match.jquery ? match.index( cur ) > -1 : jQuery( cur ).is( match ) ) {
+ ret.push({ selector: selector, elem: cur, level: level });
+ }
+ }
+
+ cur = cur.parentNode;
+ level++;
+ }
+ }
+
+ return ret;
+ }
+
+ // String
+ var pos = POS.test( selectors ) || typeof selectors !== "string" ?
+ jQuery( selectors, context || this.context ) :
+ 0;
+
+ for ( i = 0, l = this.length; i < l; i++ ) {
+ cur = this[i];
+
+ while ( cur ) {
+ if ( pos ? pos.index(cur) > -1 : jQuery.find.matchesSelector(cur, selectors) ) {
+ ret.push( cur );
+ break;
+
+ } else {
+ cur = cur.parentNode;
+ if ( !cur || !cur.ownerDocument || cur === context || cur.nodeType === 11 ) {
+ break;
+ }
+ }
+ }
+ }
+
+ 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 ) {
+ if ( !elem || typeof elem === "string" ) {
+ return jQuery.inArray( this[0],
+ // If it receives a string, the selector is used
+ // If it receives nothing, the siblings are used
+ elem ? jQuery( elem ) : this.parent().children() );
+ }
+ // 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 ) );
+ },
+
+ andSelf: function() {
+ return this.add( this.prevObject );
+ }
+});
+
+// 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;
+}
+
+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 jQuery.nth( elem, 2, "nextSibling" );
+ },
+ prev: function( elem ) {
+ return jQuery.nth( elem, 2, "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.makeArray( elem.childNodes );
+ }
+}, function( name, fn ) {
+ jQuery.fn[ name ] = function( until, selector ) {
+ var ret = jQuery.map( this, fn, until ),
+ // The variable 'args' was introduced in
+ // https://github.com/jquery/jquery/commit/52a0238
+ // to work around a bug in Chrome 10 (Dev) and should be removed when the bug is fixed.
+ // http://code.google.com/p/v8/issues/detail?id=1050
+ args = slice.call(arguments);
+
+ 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 || rmultiselector.test( selector )) && rparentsprev.test( name ) ) {
+ ret = ret.reverse();
+ }
+
+ return this.pushStack( ret, name, args.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;
+ },
+
+ nth: function( cur, result, dir, elem ) {
+ result = result || 1;
+ var num = 0;
+
+ for ( ; cur; cur = cur[dir] ) {
+ if ( cur.nodeType === 1 && ++num === result ) {
+ break;
+ }
+ }
+
+ return cur;
+ },
+
+ 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;
+ });
+}
+
+
+
+
+var rinlinejQuery = / jQuery\d+="(?:\d+|null)"/g,
+ rleadingWhitespace = /^\s+/,
+ rxhtmlTag = /<(?!area|br|col|embed|hr|img|input|link|meta|param)(([\w:]+)[^>]*)\/>/ig,
+ rtagName = /<([\w:]+)/,
+ rtbody = /<tbody/i,
+ rhtml = /<|&#?\w+;/,
+ rnocache = /<(?:script|object|embed|option|style)/i,
+ // checked="checked" or checked
+ rchecked = /checked\s*(?:[^=]|=\s*.checked.)/i,
+ rscriptType = /\/(java|ecma)script/i,
+ rcleanScript = /^\s*<!(?:\[CDATA\[|\-\-)/,
+ 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, "", "" ]
+ };
+
+wrapMap.optgroup = wrapMap.option;
+wrapMap.tbody = wrapMap.tfoot = wrapMap.colgroup = wrapMap.caption = wrapMap.thead;
+wrapMap.th = wrapMap.td;
+
+// IE can't serialize <link> and <script> tags normally
+if ( !jQuery.support.htmlSerialize ) {
+ wrapMap._default = [ 1, "div<div>", "</div>" ];
+}
+
+jQuery.fn.extend({
+ text: function( text ) {
+ if ( jQuery.isFunction(text) ) {
+ return this.each(function(i) {
+ var self = jQuery( this );
+
+ self.text( text.call(this, i, self.text()) );
+ });
+ }
+
+ if ( typeof text !== "object" && text !== undefined ) {
+ return this.empty().append( (this[0] && this[0].ownerDocument || document).createTextNode( text ) );
+ }
+
+ return jQuery.text( this );
+ },
+
+ 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 ) {
+ return this.each(function() {
+ jQuery( this ).wrapAll( 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.appendChild( elem );
+ }
+ });
+ },
+
+ prepend: function() {
+ return this.domManip(arguments, true, function( elem ) {
+ if ( this.nodeType === 1 ) {
+ this.insertBefore( elem, this.firstChild );
+ }
+ });
+ },
+
+ before: function() {
+ if ( this[0] && this[0].parentNode ) {
+ return this.domManip(arguments, false, function( elem ) {
+ this.parentNode.insertBefore( elem, this );
+ });
+ } else if ( arguments.length ) {
+ var set = jQuery(arguments[0]);
+ set.push.apply( set, this.toArray() );
+ return this.pushStack( set, "before", arguments );
+ }
+ },
+
+ after: function() {
+ if ( this[0] && this[0].parentNode ) {
+ return this.domManip(arguments, false, function( elem ) {
+ this.parentNode.insertBefore( elem, this.nextSibling );
+ });
+ } else if ( arguments.length ) {
+ var set = this.pushStack( this, "after", arguments );
+ set.push.apply( set, jQuery(arguments[0]).toArray() );
+ return set;
+ }
+ },
+
+ // keepData is for internal use only--do not document
+ remove: function( selector, keepData ) {
+ for ( var i = 0, elem; (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() {
+ for ( var i = 0, elem; (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 ) {
+ if ( value === undefined ) {
+ return this[0] && this[0].nodeType === 1 ?
+ this[0].innerHTML.replace(rinlinejQuery, "") :
+ null;
+
+ // See if we can take a shortcut and just use innerHTML
+ } else if ( typeof value === "string" && !rnocache.test( value ) &&
+ (jQuery.support.leadingWhitespace || !rleadingWhitespace.test( value )) &&
+ !wrapMap[ (rtagName.exec( value ) || ["", ""])[1].toLowerCase() ] ) {
+
+ value = value.replace(rxhtmlTag, "<$1></$2>");
+
+ try {
+ for ( var i = 0, l = this.length; i < l; i++ ) {
+ // Remove element nodes and prevent memory leaks
+ if ( this[i].nodeType === 1 ) {
+ jQuery.cleanData( this[i].getElementsByTagName("*") );
+ this[i].innerHTML = value;
+ }
+ }
+
+ // If using innerHTML throws an exception, use the fallback method
+ } catch(e) {
+ this.empty().append( value );
+ }
+
+ } else if ( jQuery.isFunction( value ) ) {
+ this.each(function(i){
+ var self = jQuery( this );
+
+ self.html( value.call(this, i, self.html()) );
+ });
+
+ } else {
+ this.empty().append( value );
+ }
+
+ return this;
+ },
+
+ replaceWith: function( value ) {
+ if ( this[0] && this[0].parentNode ) {
+ // 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 );
+ }
+ });
+ } else {
+ 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 ) {
+ var results, first, fragment, parent,
+ value = args[0],
+ scripts = [];
+
+ // We can't cloneNode fragments that contain checked, in WebKit
+ if ( !jQuery.support.checkClone && arguments.length === 3 && typeof value === "string" && rchecked.test( value ) ) {
+ return this.each(function() {
+ jQuery(this).domManip( args, table, callback, true );
+ });
+ }
+
+ 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] ) {
+ parent = value && value.parentNode;
+
+ // If we're in a fragment, just use that instead of building a new one
+ if ( jQuery.support.parentNode && parent && parent.nodeType === 11 && parent.childNodes.length === this.length ) {
+ results = { fragment: parent };
+
+ } else {
+ results = jQuery.buildFragment( args, this, scripts );
+ }
+
+ fragment = results.fragment;
+
+ if ( fragment.childNodes.length === 1 ) {
+ first = fragment = fragment.firstChild;
+ } else {
+ first = fragment.firstChild;
+ }
+
+ if ( first ) {
+ table = table && jQuery.nodeName( first, "tr" );
+
+ for ( var i = 0, l = this.length, lastIndex = l - 1; i < l; i++ ) {
+ callback.call(
+ table ?
+ root(this[i], first) :
+ this[i],
+ // Make sure that we do not leak memory by inadvertently discarding
+ // the original fragment (which might have attached data) instead of
+ // using it; in addition, use the original fragment object for the last
+ // item instead of first because it can end up being emptied incorrectly
+ // in certain situations (Bug #8070).
+ // Fragments from the fragment cache must always be cloned and never used
+ // in place.
+ results.cacheable || (l > 1 && i < lastIndex) ?
+ jQuery.clone( fragment, true, true ) :
+ fragment
+ );
+ }
+ }
+
+ if ( scripts.length ) {
+ jQuery.each( scripts, evalScript );
+ }
+ }
+
+ return this;
+ }
+});
+
+function root( elem, cur ) {
+ return jQuery.nodeName(elem, "table") ?
+ (elem.getElementsByTagName("tbody")[0] ||
+ elem.appendChild(elem.ownerDocument.createElement("tbody"))) :
+ elem;
+}
+
+function cloneCopyEvent( src, dest ) {
+
+ if ( dest.nodeType !== 1 || !jQuery.hasData( src ) ) {
+ return;
+ }
+
+ var internalKey = jQuery.expando,
+ oldData = jQuery.data( src ),
+ curData = jQuery.data( dest, oldData );
+
+ // Switch to use the internal data object, if it exists, for the next
+ // stage of data copying
+ if ( (oldData = oldData[ internalKey ]) ) {
+ var events = oldData.events;
+ curData = curData[ internalKey ] = jQuery.extend({}, oldData);
+
+ if ( events ) {
+ delete curData.handle;
+ curData.events = {};
+
+ for ( var type in events ) {
+ for ( var i = 0, l = events[ type ].length; i < l; i++ ) {
+ jQuery.event.add( dest, type + ( events[ type ][ i ].namespace ? "." : "" ) + events[ type ][ i ].namespace, events[ type ][ i ], events[ type ][ i ].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();
+
+ // IE6-8 fail to clone children inside object elements that use
+ // the proprietary classid attribute value (rather than the type
+ // attribute) to identify the type of content to display
+ if ( nodeName === "object" ) {
+ dest.outerHTML = src.outerHTML;
+
+ } else if ( nodeName === "input" && (src.type === "checkbox" || src.type === "radio") ) {
+ // 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
+ if ( src.checked ) {
+ 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;
+ }
+
+ // Event data gets referenced instead of copied if the expando
+ // gets copied too
+ dest.removeAttribute( jQuery.expando );
+}
+
+jQuery.buildFragment = function( args, nodes, scripts ) {
+ var fragment, cacheable, cacheresults, doc;
+
+ // nodes may contain either an explicit document object,
+ // a jQuery collection or context object.
+ // If nodes[0] contains a valid object to assign to doc
+ if ( nodes && nodes[0] ) {
+ doc = nodes[0].ownerDocument || nodes[0];
+ }
+
+ // Ensure that an attr object doesn't incorrectly stand in as a document object
+ // Chrome and Firefox seem to allow this to occur and will throw exception
+ // Fixes #8950
+ if ( !doc.createDocumentFragment ) {
+ doc = document;
+ }
+
+ // 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
+ if ( args.length === 1 && typeof args[0] === "string" && args[0].length < 512 && doc === document &&
+ args[0].charAt(0) === "<" && !rnocache.test( args[0] ) && (jQuery.support.checkClone || !rchecked.test( args[0] )) ) {
+
+ cacheable = true;
+
+ cacheresults = jQuery.fragments[ args[0] ];
+ if ( cacheresults && cacheresults !== 1 ) {
+ fragment = cacheresults;
+ }
+ }
+
+ if ( !fragment ) {
+ fragment = doc.createDocumentFragment();
+ jQuery.clean( args, doc, fragment, scripts );
+ }
+
+ if ( cacheable ) {
+ jQuery.fragments[ args[0] ] = cacheresults ? fragment : 1;
+ }
+
+ 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 ret = [],
+ insert = jQuery( selector ),
+ parent = this.length === 1 && this[0].parentNode;
+
+ if ( parent && parent.nodeType === 11 && parent.childNodes.length === 1 && insert.length === 1 ) {
+ insert[ original ]( this[0] );
+ return this;
+
+ } else {
+ for ( var i = 0, l = insert.length; i < l; i++ ) {
+ var 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 ( "getElementsByTagName" in elem ) {
+ return elem.getElementsByTagName( "*" );
+
+ } else if ( "querySelectorAll" in elem ) {
+ return elem.querySelectorAll( "*" );
+
+ } else {
+ return [];
+ }
+}
+
+// Used in clean, fixes the defaultChecked property
+function fixDefaultChecked( elem ) {
+ if ( elem.type === "checkbox" || elem.type === "radio" ) {
+ elem.defaultChecked = elem.checked;
+ }
+}
+// Finds all inputs and passes them to fixDefaultChecked
+function findInputs( elem ) {
+ if ( jQuery.nodeName( elem, "input" ) ) {
+ fixDefaultChecked( elem );
+ } else if ( "getElementsByTagName" in elem ) {
+ jQuery.grep( elem.getElementsByTagName("input"), fixDefaultChecked );
+ }
+}
+
+jQuery.extend({
+ clone: function( elem, dataAndEvents, deepDataAndEvents ) {
+ var clone = elem.cloneNode(true),
+ srcElements,
+ destElements,
+ i;
+
+ 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 ) {
+ 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 checkScriptType;
+
+ context = context || document;
+
+ // !context.createElement fails in IE with an error but returns typeof 'object'
+ if ( typeof context.createElement === "undefined" ) {
+ context = context.ownerDocument || context[0] && context[0].ownerDocument || document;
+ }
+
+ var ret = [], j;
+
+ for ( var i = 0, elem; (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 {
+ // Fix "XHTML"-style tags in all browsers
+ elem = elem.replace(rxhtmlTag, "<$1></$2>");
+
+ // Trim whitespace, otherwise indexOf won't work as expected
+ var tag = (rtagName.exec( elem ) || ["", ""])[1].toLowerCase(),
+ wrap = wrapMap[ tag ] || wrapMap._default,
+ depth = wrap[0],
+ div = context.createElement("div");
+
+ // Go to html and back, then peel off extra wrappers
+ 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>
+ var 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;
+ }
+ }
+
+ // Resets defaultChecked for any radios and checkboxes
+ // about to be appended to the DOM in IE 6/7 (#8060)
+ var len;
+ if ( !jQuery.support.appendChecked ) {
+ if ( elem[0] && typeof (len = elem.length) === "number" ) {
+ for ( j = 0; j < len; j++ ) {
+ findInputs( elem[j] );
+ }
+ } else {
+ findInputs( elem );
+ }
+ }
+
+ if ( elem.nodeType ) {
+ ret.push( elem );
+ } else {
+ ret = jQuery.merge( ret, elem );
+ }
+ }
+
+ if ( fragment ) {
+ checkScriptType = function( elem ) {
+ return !elem.type || rscriptType.test( elem.type );
+ };
+ for ( i = 0; ret[i]; i++ ) {
+ if ( scripts && jQuery.nodeName( ret[i], "script" ) && (!ret[i].type || ret[i].type.toLowerCase() === "text/javascript") ) {
+ scripts.push( ret[i].parentNode ? ret[i].parentNode.removeChild( ret[i] ) : ret[i] );
+
+ } else {
+ if ( ret[i].nodeType === 1 ) {
+ var jsTags = jQuery.grep( ret[i].getElementsByTagName( "script" ), checkScriptType );
+
+ ret.splice.apply( ret, [i + 1, 0].concat( jsTags ) );
+ }
+ fragment.appendChild( ret[i] );
+ }
+ }
+ }
+
+ return ret;
+ },
+
+ cleanData: function( elems ) {
+ var data, id, cache = jQuery.cache, internalKey = jQuery.expando, special = jQuery.event.special,
+ deleteExpando = jQuery.support.deleteExpando;
+
+ for ( var i = 0, elem; (elem = elems[i]) != null; i++ ) {
+ if ( elem.nodeName && jQuery.noData[elem.nodeName.toLowerCase()] ) {
+ continue;
+ }
+
+ id = elem[ jQuery.expando ];
+
+ if ( id ) {
+ data = cache[ id ] && cache[ id ][ internalKey ];
+
+ if ( data && data.events ) {
+ for ( var 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 );
+ }
+ }
+
+ // Null the DOM reference to avoid IE6/7/8 leak (#7054)
+ if ( data.handle ) {
+ data.handle.elem = null;
+ }
+ }
+
+ if ( deleteExpando ) {
+ delete elem[ jQuery.expando ];
+
+ } else if ( elem.removeAttribute ) {
+ elem.removeAttribute( jQuery.expando );
+ }
+
+ delete cache[ id ];
+ }
+ }
+ }
+});
+
+function evalScript( i, elem ) {
+ if ( elem.src ) {
+ jQuery.ajax({
+ url: elem.src,
+ async: false,
+ dataType: "script"
+ });
+ } else {
+ jQuery.globalEval( ( elem.text || elem.textContent || elem.innerHTML || "" ).replace( rcleanScript, "/*$0*/" ) );
+ }
+
+ if ( elem.parentNode ) {
+ elem.parentNode.removeChild( elem );
+ }
+}
+
+
+
+var ralpha = /alpha\([^)]*\)/i,
+ ropacity = /opacity=([^)]*)/,
+ // fixed for IE9, see #8346
+ rupper = /([A-Z]|^ms)/g,
+ rnumpx = /^-?\d+(?:px)?$/i,
+ rnum = /^-?\d/,
+ rrelNum = /^[+\-]=/,
+ rrelNumFilter = /[^+\-\.\de]+/g,
+
+ cssShow = { position: "absolute", visibility: "hidden", display: "block" },
+ cssWidth = [ "Left", "Right" ],
+ cssHeight = [ "Top", "Bottom" ],
+ curCSS,
+
+ getComputedStyle,
+ currentStyle;
+
+jQuery.fn.css = function( name, value ) {
+ // Setting 'undefined' is a no-op
+ if ( arguments.length === 2 && value === undefined ) {
+ return this;
+ }
+
+ return jQuery.access( this, name, value, true, function( elem, name, value ) {
+ return value !== undefined ?
+ jQuery.style( elem, name, value ) :
+ jQuery.css( elem, name );
+ });
+};
+
+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", "opacity" );
+ return ret === "" ? "1" : ret;
+
+ } else {
+ return elem.style.opacity;
+ }
+ }
+ }
+ },
+
+ // 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, origName = jQuery.camelCase( name ),
+ style = elem.style, hooks = jQuery.cssHooks[ origName ];
+
+ name = jQuery.cssProps[ origName ] || origName;
+
+ // Check if we're setting a value
+ if ( value !== undefined ) {
+ type = typeof value;
+
+ // Make sure that NaN and null values aren't set. See: #7116
+ if ( type === "number" && isNaN( value ) || value == null ) {
+ return;
+ }
+
+ // convert relative number strings (+= or -=) to relative numbers. #7345
+ if ( type === "string" && rrelNum.test( value ) ) {
+ value = +value.replace( rrelNumFilter, "" ) + parseFloat( jQuery.css( elem, name ) );
+ // Fixes bug #9237
+ type = "number";
+ }
+
+ // 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 )) !== 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, extra ) {
+ var ret, hooks;
+
+ // Make sure that we're working with the right name
+ name = jQuery.camelCase( name );
+ hooks = jQuery.cssHooks[ name ];
+ name = jQuery.cssProps[ name ] || name;
+
+ // cssFloat needs a special treatment
+ if ( name === "cssFloat" ) {
+ name = "float";
+ }
+
+ // If a hook was provided get the computed value from there
+ if ( hooks && "get" in hooks && (ret = hooks.get( elem, true, extra )) !== undefined ) {
+ return ret;
+
+ // Otherwise, if a way to get the computed value exists, use that
+ } else if ( curCSS ) {
+ return curCSS( elem, name );
+ }
+ },
+
+ // A method for quickly swapping in/out CSS properties to get correct calculations
+ swap: function( elem, options, callback ) {
+ var old = {};
+
+ // Remember the old values, and insert the new ones
+ for ( var name in options ) {
+ old[ name ] = elem.style[ name ];
+ elem.style[ name ] = options[ name ];
+ }
+
+ callback.call( elem );
+
+ // Revert the old values
+ for ( name in options ) {
+ elem.style[ name ] = old[ name ];
+ }
+ }
+});
+
+// DEPRECATED, Use jQuery.css() instead
+jQuery.curCSS = jQuery.css;
+
+jQuery.each(["height", "width"], function( i, name ) {
+ jQuery.cssHooks[ name ] = {
+ get: function( elem, computed, extra ) {
+ var val;
+
+ if ( computed ) {
+ if ( elem.offsetWidth !== 0 ) {
+ return getWH( elem, name, extra );
+ } else {
+ jQuery.swap( elem, cssShow, function() {
+ val = getWH( elem, name, extra );
+ });
+ }
+
+ return val;
+ }
+ },
+
+ set: function( elem, value ) {
+ if ( rnumpx.test( value ) ) {
+ // ignore negative width and height values #1599
+ value = parseFloat( value );
+
+ if ( value >= 0 ) {
+ return value + "px";
+ }
+
+ } else {
+ return value;
+ }
+ }
+ };
+});
+
+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) || "" ) ?
+ ( parseFloat( RegExp.$1 ) / 100 ) + "" :
+ computed ? "1" : "";
+ },
+
+ set: function( elem, value ) {
+ var style = elem.style,
+ currentStyle = elem.currentStyle;
+
+ // IE has trouble with opacity if it does not have layout
+ // Force it by setting the zoom level
+ style.zoom = 1;
+
+ // Set the alpha filter to set the opacity
+ var opacity = jQuery.isNaN( value ) ?
+ "" :
+ "alpha(opacity=" + value * 100 + ")",
+ filter = currentStyle && currentStyle.filter || style.filter || "";
+
+ style.filter = ralpha.test( filter ) ?
+ filter.replace( ralpha, opacity ) :
+ filter + " " + opacity;
+ }
+ };
+}
+
+jQuery(function() {
+ // This hook cannot be added until DOM ready because the support test
+ // for it is not run until after DOM ready
+ 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
+ var ret;
+ jQuery.swap( elem, { "display": "inline-block" }, function() {
+ if ( computed ) {
+ ret = curCSS( elem, "margin-right", "marginRight" );
+ } else {
+ ret = elem.style.marginRight;
+ }
+ });
+ return ret;
+ }
+ };
+ }
+});
+
+if ( document.defaultView && document.defaultView.getComputedStyle ) {
+ getComputedStyle = function( elem, name ) {
+ var ret, defaultView, computedStyle;
+
+ name = name.replace( rupper, "-$1" ).toLowerCase();
+
+ if ( !(defaultView = elem.ownerDocument.defaultView) ) {
+ return undefined;
+ }
+
+ if ( (computedStyle = defaultView.getComputedStyle( elem, null )) ) {
+ ret = computedStyle.getPropertyValue( name );
+ if ( ret === "" && !jQuery.contains( elem.ownerDocument.documentElement, elem ) ) {
+ ret = jQuery.style( elem, name );
+ }
+ }
+
+ return ret;
+ };
+}
+
+if ( document.documentElement.currentStyle ) {
+ currentStyle = function( elem, name ) {
+ var left,
+ ret = elem.currentStyle && elem.currentStyle[ name ],
+ rsLeft = elem.runtimeStyle && elem.runtimeStyle[ name ],
+ style = elem.style;
+
+ // 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
+ if ( !rnumpx.test( ret ) && rnum.test( ret ) ) {
+ // Remember the original values
+ left = style.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 || 0);
+ ret = style.pixelLeft + "px";
+
+ // Revert the changed values
+ style.left = left;
+ if ( rsLeft ) {
+ elem.runtimeStyle.left = rsLeft;
+ }
+ }
+
+ return ret === "" ? "auto" : ret;
+ };
+}
+
+curCSS = getComputedStyle || currentStyle;
+
+function getWH( elem, name, extra ) {
+
+ // Start with offset property
+ var val = name === "width" ? elem.offsetWidth : elem.offsetHeight,
+ which = name === "width" ? cssWidth : cssHeight;
+
+ if ( val > 0 ) {
+ if ( extra !== "border" ) {
+ jQuery.each( which, function() {
+ if ( !extra ) {
+ val -= parseFloat( jQuery.css( elem, "padding" + this ) ) || 0;
+ }
+ if ( extra === "margin" ) {
+ val += parseFloat( jQuery.css( elem, extra + this ) ) || 0;
+ } else {
+ val -= parseFloat( jQuery.css( elem, "border" + this + "Width" ) ) || 0;
+ }
+ });
+ }
+
+ return val + "px";
+ }
+
+ // Fall back to computed then uncomputed css if necessary
+ val = curCSS( elem, name, name );
+ if ( val < 0 || val == null ) {
+ val = elem.style[ name ] || 0;
+ }
+ // Normalize "", auto, and prepare for extra
+ val = parseFloat( val ) || 0;
+
+ // Add padding, border, margin
+ if ( extra ) {
+ jQuery.each( which, function() {
+ val += parseFloat( jQuery.css( elem, "padding" + this ) ) || 0;
+ if ( extra !== "padding" ) {
+ val += parseFloat( jQuery.css( elem, "border" + this + "Width" ) ) || 0;
+ }
+ if ( extra === "margin" ) {
+ val += parseFloat( jQuery.css( elem, extra + this ) ) || 0;
+ }
+ });
+ }
+
+ return val + "px";
+}
+
+if ( jQuery.expr && jQuery.expr.filters ) {
+ jQuery.expr.filters.hidden = function( elem ) {
+ var width = elem.offsetWidth,
+ height = elem.offsetHeight;
+
+ return (width === 0 && height === 0) || (!jQuery.support.reliableHiddenOffsets && (elem.style.display || jQuery.css( elem, "display" )) === "none");
+ };
+
+ jQuery.expr.filters.visible = function( elem ) {
+ return !jQuery.expr.filters.hidden( elem );
+ };
+}
+
+
+
+
+var r20 = /%20/g,
+ rbracket = /\[\]$/,
+ rCRLF = /\r?\n/g,
+ rhash = /#.*$/,
+ rheaders = /^(.*?):[ \t]*([^\r\n]*)\r?$/mg, // IE leaves an \r character at EOL
+ rinput = /^(?:color|date|datetime|email|hidden|month|number|password|range|search|tel|text|time|url|week)$/i,
+ // #7653, #8125, #8152: local protocol detection
+ rlocalProtocol = /^(?:about|app|app\-storage|.+\-extension|file|widget):$/,
+ rnoContent = /^(?:GET|HEAD)$/,
+ rprotocol = /^\/\//,
+ rquery = /\?/,
+ rscript = /<script\b[^<]*(?:(?!<\/script>)<[^<]*)*<\/script>/gi,
+ rselectTextarea = /^(?:select|textarea)/i,
+ rspacesAjax = /\s+/,
+ 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 = {},
+
+ // Document location
+ ajaxLocation,
+
+ // Document location segments
+ ajaxLocParts;
+
+// #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 = "*";
+ }
+
+ if ( jQuery.isFunction( func ) ) {
+ var dataTypes = dataTypeExpression.toLowerCase().split( rspacesAjax ),
+ i = 0,
+ length = dataTypes.length,
+ dataType,
+ list,
+ placeBefore;
+
+ // 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 list = structure[ dataType ],
+ i = 0,
+ length = list ? list.length : 0,
+ executeOnly = ( structure === prefilters ),
+ selection;
+
+ 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;
+}
+
+jQuery.fn.extend({
+ 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
+ } else if ( !this.length ) {
+ return this;
+ }
+
+ var off = url.indexOf( " " );
+ if ( off >= 0 ) {
+ var selector = url.slice( off, url.length );
+ url = url.slice( 0, off );
+ }
+
+ // Default to a GET request
+ var type = "GET";
+
+ // If the second parameter was provided
+ if ( params ) {
+ // 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 ( typeof params === "object" ) {
+ params = jQuery.param( params, jQuery.ajaxSettings.traditional );
+ type = "POST";
+ }
+ }
+
+ var self = this;
+
+ // Request the remote document
+ jQuery.ajax({
+ url: url,
+ type: type,
+ dataType: "html",
+ data: params,
+ // Complete callback (responseText is used internally)
+ complete: function( jqXHR, status, responseText ) {
+ // Store the response as specified by the jqXHR object
+ responseText = jqXHR.responseText;
+ // If successful, inject the HTML into all the matched elements
+ if ( jqXHR.isResolved() ) {
+ // #4825: Get the actual response in case
+ // a dataFilter is present in ajaxSettings
+ jqXHR.done(function( r ) {
+ responseText = r;
+ });
+ // 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 );
+ }
+
+ if ( callback ) {
+ self.each( callback, [ responseText, status, jqXHR ] );
+ }
+ }
+ });
+
+ return this;
+ },
+
+ 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();
+ }
+});
+
+// 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.bind( 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 ) {
+ // Only one parameter, we extend ajaxSettings
+ settings = target;
+ target = jQuery.extend( true, jQuery.ajaxSettings, settings );
+ } else {
+ // target was provided, we extend into it
+ jQuery.extend( true, target, jQuery.ajaxSettings, settings );
+ }
+ // Flatten fields we don't want deep extended
+ for( var field in { context: 1, url: 1 } ) {
+ if ( field in settings ) {
+ target[ field ] = settings[ field ];
+ } else if( field in jQuery.ajaxSettings ) {
+ target[ field ] = jQuery.ajaxSettings[ field ];
+ }
+ }
+ return target;
+ },
+
+ ajaxSettings: {
+ url: ajaxLocation,
+ isLocal: rlocalProtocol.test( ajaxLocParts[ 1 ] ),
+ global: true,
+ type: "GET",
+ contentType: "application/x-www-form-urlencoded",
+ processData: true,
+ async: true,
+ /*
+ timeout: 0,
+ data: null,
+ dataType: null,
+ username: null,
+ password: null,
+ cache: null,
+ traditional: false,
+ headers: {},
+ */
+
+ accepts: {
+ xml: "application/xml, text/xml",
+ html: "text/html",
+ text: "text/plain",
+ json: "application/json, text/javascript",
+ "*": "*/*"
+ },
+
+ 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
+ }
+ },
+
+ 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 // 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._Deferred(),
+ // Status-dependent callbacks
+ statusCode = s.statusCode || {},
+ // ifModified key
+ ifModifiedKey,
+ // Headers (they are sent all at once)
+ requestHeaders = {},
+ requestHeadersNames = {},
+ // Response headers
+ responseHeadersString,
+ responseHeaders,
+ // transport
+ transport,
+ // timeout handle
+ timeoutTimer,
+ // Cross-domain detection vars
+ parts,
+ // The jqXHR state
+ state = 0,
+ // To know if global events are to be dispatched
+ fireGlobals,
+ // Loop variable
+ i,
+ // 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 || "abort";
+ 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, statusText, responses, headers ) {
+
+ // 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 ? 4 : 0;
+
+ var isSuccess,
+ success,
+ error,
+ response = responses ? ajaxHandleResponses( s, jqXHR, responses ) : undefined,
+ lastModified,
+ etag;
+
+ // 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 ) {
+
+ if ( ( lastModified = jqXHR.getResponseHeader( "Last-Modified" ) ) ) {
+ jQuery.lastModified[ ifModifiedKey ] = lastModified;
+ }
+ if ( ( etag = jqXHR.getResponseHeader( "Etag" ) ) ) {
+ jQuery.etag[ ifModifiedKey ] = etag;
+ }
+ }
+
+ // If not modified
+ if ( status === 304 ) {
+
+ statusText = "notmodified";
+ isSuccess = true;
+
+ // If we have data
+ } else {
+
+ try {
+ success = ajaxConvert( s, response );
+ statusText = "success";
+ isSuccess = true;
+ } catch(e) {
+ // We have a parsererror
+ statusText = "parsererror";
+ error = e;
+ }
+ }
+ } 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 = 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.resolveWith( 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.done;
+
+ // 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.then( tmp, 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( rspacesAjax );
+
+ // Determine if a cross-domain request is in order
+ 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 prefiler, stop there
+ if ( state === 2 ) {
+ return false;
+ }
+
+ // 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;
+ }
+
+ // 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 ] !== "*" ? ", */*; 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
+ jqXHR.abort();
+ return false;
+
+ }
+
+ // 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 ( status < 2 ) {
+ done( -1, e );
+ // Simply rethrow otherwise
+ } else {
+ jQuery.error( e );
+ }
+ }
+ }
+
+ return jqXHR;
+ },
+
+ // Serialize an array of form elements or a set of
+ // key/values into a query string
+ param: function( a, traditional ) {
+ var s = [],
+ add = function( key, value ) {
+ // If value is a function, invoke it and return its value
+ value = jQuery.isFunction( value ) ? value() : value;
+ s[ s.length ] = encodeURIComponent( key ) + "=" + encodeURIComponent( value );
+ };
+
+ // Set traditional to true for jQuery <= 1.3.2 behavior.
+ if ( traditional === undefined ) {
+ traditional = 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 ( var prefix in a ) {
+ buildParams( prefix, a[ prefix ], traditional, add );
+ }
+ }
+
+ // Return the resulting serialization
+ return s.join( "&" ).replace( r20, "+" );
+ }
+});
+
+function buildParams( prefix, obj, traditional, add ) {
+ 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" || jQuery.isArray(v) ? i : "" ) + "]", v, traditional, add );
+ }
+ });
+
+ } else if ( !traditional && obj != null && typeof obj === "object" ) {
+ // Serialize object item.
+ for ( var name in obj ) {
+ buildParams( prefix + "[" + name + "]", obj[ name ], traditional, add );
+ }
+
+ } else {
+ // Serialize scalar item.
+ add( prefix, obj );
+ }
+}
+
+// This is still on the jQuery object... for now
+// Want to move this to jQuery.ajax some day
+jQuery.extend({
+
+ // 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 contents = s.contents,
+ dataTypes = s.dataTypes,
+ responseFields = s.responseFields,
+ ct,
+ type,
+ finalDataType,
+ firstDataType;
+
+ // 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 ) {
+
+ // Apply the dataFilter if provided
+ if ( s.dataFilter ) {
+ response = s.dataFilter( response, s.dataType );
+ }
+
+ var dataTypes = s.dataTypes,
+ converters = {},
+ i,
+ key,
+ length = dataTypes.length,
+ tmp,
+ // Current and previous dataTypes
+ current = dataTypes[ 0 ],
+ prev,
+ // Conversion expression
+ conversion,
+ // Conversion function
+ conv,
+ // Conversion functions (transitive conversion)
+ conv1,
+ conv2;
+
+ // For each dataType in the chain
+ for( i = 1; i < length; i++ ) {
+
+ // Create converters map
+ // with lowercased keys
+ if ( i === 1 ) {
+ for( key in s.converters ) {
+ if( typeof key === "string" ) {
+ converters[ key.toLowerCase() ] = s.converters[ key ];
+ }
+ }
+ }
+
+ // Get the dataTypes
+ prev = current;
+ current = dataTypes[ i ];
+
+ // If current is auto dataType, update it to prev
+ if( current === "*" ) {
+ current = prev;
+ // If no auto and dataTypes are actually different
+ } else if ( prev !== "*" && prev !== current ) {
+
+ // Get the converter
+ conversion = prev + " " + current;
+ conv = converters[ conversion ] || converters[ "* " + current ];
+
+ // If there is no direct converter, search transitively
+ if ( !conv ) {
+ conv2 = undefined;
+ for( conv1 in converters ) {
+ tmp = conv1.split( " " );
+ if ( tmp[ 0 ] === prev || tmp[ 0 ] === "*" ) {
+ conv2 = converters[ tmp[1] + " " + current ];
+ if ( conv2 ) {
+ conv1 = converters[ conv1 ];
+ if ( conv1 === true ) {
+ conv = conv2;
+ } else if ( conv2 === true ) {
+ conv = conv1;
+ }
+ break;
+ }
+ }
+ }
+ }
+ // If we found no converter, dispatch an error
+ if ( !( conv || conv2 ) ) {
+ jQuery.error( "No conversion from " + conversion.replace(" "," to ") );
+ }
+ // If found converter is not an equivalence
+ if ( conv !== true ) {
+ // Convert with 1 or 2 converters accordingly
+ response = conv ? conv( response ) : conv2( conv1(response) );
+ }
+ }
+ }
+ return response;
+}
+
+
+
+
+var jsc = jQuery.now(),
+ jsre = /(\=)\?(&|$)|\?\?/i;
+
+// Default jsonp settings
+jQuery.ajaxSetup({
+ jsonp: "callback",
+ jsonpCallback: function() {
+ return jQuery.expando + "_" + ( jsc++ );
+ }
+});
+
+// Detect, normalize options and install callbacks for jsonp requests
+jQuery.ajaxPrefilter( "json jsonp", function( s, originalSettings, jqXHR ) {
+
+ var inspectData = s.contentType === "application/x-www-form-urlencoded" &&
+ ( typeof s.data === "string" );
+
+ if ( s.dataTypes[ 0 ] === "jsonp" ||
+ s.jsonp !== false && ( jsre.test( s.url ) ||
+ inspectData && jsre.test( s.data ) ) ) {
+
+ var responseContainer,
+ jsonpCallback = s.jsonpCallback =
+ jQuery.isFunction( s.jsonpCallback ) ? s.jsonpCallback() : s.jsonpCallback,
+ previous = window[ jsonpCallback ],
+ url = s.url,
+ data = s.data,
+ replace = "$1" + jsonpCallback + "$2";
+
+ if ( s.jsonp !== false ) {
+ url = url.replace( jsre, replace );
+ if ( s.url === url ) {
+ if ( inspectData ) {
+ data = data.replace( jsre, replace );
+ }
+ if ( s.data === data ) {
+ // Add callback manually
+ url += (/\?/.test( url ) ? "&" : "?") + s.jsonp + "=" + jsonpCallback;
+ }
+ }
+ }
+
+ s.url = url;
+ s.data = data;
+
+ // Install callback
+ window[ jsonpCallback ] = function( response ) {
+ responseContainer = [ response ];
+ };
+
+ // Clean-up function
+ jqXHR.always(function() {
+ // Set callback back to previous value
+ window[ jsonpCallback ] = previous;
+ // Call if it was a function and we have a response
+ if ( responseContainer && jQuery.isFunction( previous ) ) {
+ window[ jsonpCallback ]( responseContainer[ 0 ] );
+ }
+ });
+
+ // Use data converter to retrieve json after script execution
+ s.converters["script json"] = function() {
+ if ( !responseContainer ) {
+ jQuery.error( jsonpCallback + " was not called" );
+ }
+ return responseContainer[ 0 ];
+ };
+
+ // force json dataType
+ s.dataTypes[ 0 ] = "json";
+
+ // 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 // #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,
+ xhrCallbacks;
+
+// 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 xhr = s.xhr(),
+ handle,
+ i;
+
+ // 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 occured
+ // 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;
+ }
+ responses.text = xhr.responseText;
+
+ // 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 we're in sync mode or it's in cache
+ // and has been retrieved directly (IE6 & IE7)
+ // we need to manually fire the callback
+ if ( !s.async || xhr.readyState === 4 ) {
+ callback();
+ } 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 elemdisplay = {},
+ iframe, iframeDoc,
+ rfxtypes = /^(?:toggle|show|hide)$/,
+ rfxnum = /^([+\-]=)?([\d+.\-]+)([a-z%]*)$/i,
+ timerId,
+ fxAttrs = [
+ // height animations
+ [ "height", "marginTop", "marginBottom", "paddingTop", "paddingBottom" ],
+ // width animations
+ [ "width", "marginLeft", "marginRight", "paddingLeft", "paddingRight" ],
+ // opacity animations
+ [ "opacity" ]
+ ],
+ fxNow,
+ requestAnimationFrame = window.webkitRequestAnimationFrame ||
+ window.mozRequestAnimationFrame ||
+ window.oRequestAnimationFrame;
+
+jQuery.fn.extend({
+ show: function( speed, easing, callback ) {
+ var elem, display;
+
+ if ( speed || speed === 0 ) {
+ return this.animate( genFx("show", 3), speed, easing, callback);
+
+ } else {
+ for ( var i = 0, j = this.length; i < j; i++ ) {
+ elem = this[i];
+
+ if ( elem.style ) {
+ display = elem.style.display;
+
+ // Reset the inline display of this element to learn if it is
+ // being hidden by cascaded rules or not
+ if ( !jQuery._data(elem, "olddisplay") && display === "none" ) {
+ display = 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 ( display === "" && jQuery.css( elem, "display" ) === "none" ) {
+ jQuery._data(elem, "olddisplay", defaultDisplay(elem.nodeName));
+ }
+ }
+ }
+
+ // Set the display of most of the elements in a second loop
+ // to avoid the constant reflow
+ for ( i = 0; i < j; i++ ) {
+ elem = this[i];
+
+ if ( elem.style ) {
+ display = elem.style.display;
+
+ if ( display === "" || display === "none" ) {
+ elem.style.display = jQuery._data(elem, "olddisplay") || "";
+ }
+ }
+ }
+
+ return this;
+ }
+ },
+
+ hide: function( speed, easing, callback ) {
+ if ( speed || speed === 0 ) {
+ return this.animate( genFx("hide", 3), speed, easing, callback);
+
+ } else {
+ for ( var i = 0, j = this.length; i < j; i++ ) {
+ if ( this[i].style ) {
+ var display = jQuery.css( this[i], "display" );
+
+ if ( display !== "none" && !jQuery._data( this[i], "olddisplay" ) ) {
+ jQuery._data( this[i], "olddisplay", display );
+ }
+ }
+ }
+
+ // Set the display of the elements in a second loop
+ // to avoid the constant reflow
+ for ( i = 0; i < j; i++ ) {
+ if ( this[i].style ) {
+ this[i].style.display = "none";
+ }
+ }
+
+ return this;
+ }
+ },
+
+ // Save the old toggle function
+ _toggle: jQuery.fn.toggle,
+
+ toggle: function( fn, fn2, callback ) {
+ var bool = typeof fn === "boolean";
+
+ if ( jQuery.isFunction(fn) && jQuery.isFunction(fn2) ) {
+ this._toggle.apply( this, arguments );
+
+ } else if ( fn == null || bool ) {
+ this.each(function() {
+ var state = bool ? fn : jQuery(this).is(":hidden");
+ jQuery(this)[ state ? "show" : "hide" ]();
+ });
+
+ } else {
+ this.animate(genFx("toggle", 3), fn, fn2, callback);
+ }
+
+ return this;
+ },
+
+ fadeTo: function( speed, to, easing, callback ) {
+ return this.filter(":hidden").css("opacity", 0).show().end()
+ .animate({opacity: to}, speed, easing, callback);
+ },
+
+ animate: function( prop, speed, easing, callback ) {
+ var optall = jQuery.speed(speed, easing, callback);
+
+ if ( jQuery.isEmptyObject( prop ) ) {
+ return this.each( optall.complete, [ false ] );
+ }
+
+ // Do not change referenced properties as per-property easing will be lost
+ prop = jQuery.extend( {}, prop );
+
+ return this[ optall.queue === false ? "each" : "queue" ](function() {
+ // XXX 'this' does not always have a nodeName when running the
+ // test suite
+
+ if ( optall.queue === false ) {
+ jQuery._mark( this );
+ }
+
+ var opt = jQuery.extend( {}, optall ),
+ isElement = this.nodeType === 1,
+ hidden = isElement && jQuery(this).is(":hidden"),
+ name, val, p,
+ display, e,
+ parts, start, end, unit;
+
+ // will store per property easing and be used to determine when an animation is complete
+ opt.animatedProperties = {};
+
+ for ( p in prop ) {
+
+ // property name normalization
+ name = jQuery.camelCase( p );
+ if ( p !== name ) {
+ prop[ name ] = prop[ p ];
+ delete prop[ p ];
+ }
+
+ val = prop[ name ];
+
+ // easing resolution: per property > opt.specialEasing > opt.easing > 'swing' (default)
+ if ( jQuery.isArray( val ) ) {
+ opt.animatedProperties[ name ] = val[ 1 ];
+ val = prop[ name ] = val[ 0 ];
+ } else {
+ opt.animatedProperties[ name ] = opt.specialEasing && opt.specialEasing[ name ] || opt.easing || 'swing';
+ }
+
+ if ( val === "hide" && hidden || val === "show" && !hidden ) {
+ return opt.complete.call( this );
+ }
+
+ if ( isElement && ( name === "height" || name === "width" ) ) {
+ // 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
+ opt.overflow = [ this.style.overflow, this.style.overflowX, this.style.overflowY ];
+
+ // Set display property to inline-block for height/width
+ // animations on inline elements that are having width/height
+ // animated
+ if ( jQuery.css( this, "display" ) === "inline" &&
+ jQuery.css( this, "float" ) === "none" ) {
+ if ( !jQuery.support.inlineBlockNeedsLayout ) {
+ this.style.display = "inline-block";
+
+ } else {
+ display = defaultDisplay( this.nodeName );
+
+ // inline-level elements accept inline-block;
+ // block-level elements need to be inline with layout
+ if ( display === "inline" ) {
+ this.style.display = "inline-block";
+
+ } else {
+ this.style.display = "inline";
+ this.style.zoom = 1;
+ }
+ }
+ }
+ }
+ }
+
+ if ( opt.overflow != null ) {
+ this.style.overflow = "hidden";
+ }
+
+ for ( p in prop ) {
+ e = new jQuery.fx( this, opt, p );
+ val = prop[ p ];
+
+ if ( rfxtypes.test(val) ) {
+ e[ val === "toggle" ? hidden ? "show" : "hide" : val ]();
+
+ } else {
+ parts = rfxnum.exec( val );
+ start = e.cur();
+
+ if ( parts ) {
+ end = parseFloat( parts[2] );
+ unit = parts[3] || ( jQuery.cssNumber[ p ] ? "" : "px" );
+
+ // We need to compute starting value
+ if ( unit !== "px" ) {
+ jQuery.style( this, p, (end || 1) + unit);
+ start = ((end || 1) / e.cur()) * start;
+ jQuery.style( this, p, start + unit);
+ }
+
+ // If a +=/-= token was provided, we're doing a relative animation
+ if ( parts[1] ) {
+ end = ( (parts[ 1 ] === "-=" ? -1 : 1) * end ) + start;
+ }
+
+ e.custom( start, end, unit );
+
+ } else {
+ e.custom( start, val, "" );
+ }
+ }
+ }
+
+ // For JS strict compliance
+ return true;
+ });
+ },
+
+ stop: function( clearQueue, gotoEnd ) {
+ if ( clearQueue ) {
+ this.queue([]);
+ }
+
+ this.each(function() {
+ var timers = jQuery.timers,
+ i = timers.length;
+ // clear marker counters if we know they won't be
+ if ( !gotoEnd ) {
+ jQuery._unmark( true, this );
+ }
+ while ( i-- ) {
+ if ( timers[i].elem === this ) {
+ if (gotoEnd) {
+ // force the next step to be the last
+ timers[i](true);
+ }
+
+ timers.splice(i, 1);
+ }
+ }
+ });
+
+ // start the next in the queue if the last step wasn't forced
+ if ( !gotoEnd ) {
+ this.dequeue();
+ }
+
+ return this;
+ }
+
+});
+
+// Animations created synchronously will run synchronously
+function createFxNow() {
+ setTimeout( clearFxNow, 0 );
+ return ( fxNow = jQuery.now() );
+}
+
+function clearFxNow() {
+ fxNow = undefined;
+}
+
+// Generate parameters to create a standard animation
+function genFx( type, num ) {
+ var obj = {};
+
+ jQuery.each( fxAttrs.concat.apply([], fxAttrs.slice(0,num)), function() {
+ obj[ this ] = type;
+ });
+
+ return obj;
+}
+
+// Generate shortcuts for custom animations
+jQuery.each({
+ slideDown: genFx("show", 1),
+ slideUp: genFx("hide", 1),
+ slideToggle: genFx("toggle", 1),
+ 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.extend({
+ 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;
+
+ // Queueing
+ opt.old = opt.complete;
+ opt.complete = function( noUnmark ) {
+ if ( jQuery.isFunction( opt.old ) ) {
+ opt.old.call( this );
+ }
+
+ if ( opt.queue !== false ) {
+ jQuery.dequeue( this );
+ } else if ( noUnmark !== false ) {
+ jQuery._unmark( this );
+ }
+ };
+
+ return opt;
+ },
+
+ easing: {
+ linear: function( p, n, firstNum, diff ) {
+ return firstNum + diff * p;
+ },
+ swing: function( p, n, firstNum, diff ) {
+ return ((-Math.cos(p*Math.PI)/2) + 0.5) * diff + firstNum;
+ }
+ },
+
+ timers: [],
+
+ fx: function( elem, options, prop ) {
+ this.options = options;
+ this.elem = elem;
+ this.prop = prop;
+
+ options.orig = options.orig || {};
+ }
+
+});
+
+jQuery.fx.prototype = {
+ // Simple function for setting a style value
+ update: function() {
+ if ( this.options.step ) {
+ this.options.step.call( this.elem, this.now, this );
+ }
+
+ (jQuery.fx.step[this.prop] || jQuery.fx.step._default)( this );
+ },
+
+ // Get the current size
+ cur: function() {
+ if ( this.elem[this.prop] != null && (!this.elem.style || this.elem.style[this.prop] == null) ) {
+ return this.elem[ this.prop ];
+ }
+
+ var parsed,
+ r = jQuery.css( this.elem, this.prop );
+ // Empty strings, null, undefined and "auto" are converted to 0,
+ // complex values such as "rotate(1rad)" are returned as is,
+ // simple values such as "10px" are parsed to Float.
+ return isNaN( parsed = parseFloat( r ) ) ? !r || r === "auto" ? 0 : r : parsed;
+ },
+
+ // Start an animation from one number to another
+ custom: function( from, to, unit ) {
+ var self = this,
+ fx = jQuery.fx,
+ raf;
+
+ this.startTime = fxNow || createFxNow();
+ this.start = from;
+ this.end = to;
+ this.unit = unit || this.unit || ( jQuery.cssNumber[ this.prop ] ? "" : "px" );
+ this.now = this.start;
+ this.pos = this.state = 0;
+
+ function t( gotoEnd ) {
+ return self.step(gotoEnd);
+ }
+
+ t.elem = this.elem;
+
+ if ( t() && jQuery.timers.push(t) && !timerId ) {
+ // Use requestAnimationFrame instead of setInterval if available
+ if ( requestAnimationFrame ) {
+ timerId = true;
+ raf = function() {
+ // When timerId gets set to null at any point, this stops
+ if ( timerId ) {
+ requestAnimationFrame( raf );
+ fx.tick();
+ }
+ };
+ requestAnimationFrame( raf );
+ } else {
+ timerId = setInterval( fx.tick, fx.interval );
+ }
+ }
+ },
+
+ // Simple 'show' function
+ show: function() {
+ // Remember where we started, so that we can go back to it later
+ this.options.orig[this.prop] = jQuery.style( this.elem, this.prop );
+ this.options.show = true;
+
+ // Begin the animation
+ // Make sure that we start at a small width/height to avoid any
+ // flash of content
+ this.custom(this.prop === "width" || this.prop === "height" ? 1 : 0, this.cur());
+
+ // Start by showing the element
+ jQuery( this.elem ).show();
+ },
+
+ // Simple 'hide' function
+ hide: function() {
+ // Remember where we started, so that we can go back to it later
+ this.options.orig[this.prop] = jQuery.style( this.elem, this.prop );
+ this.options.hide = true;
+
+ // Begin the animation
+ this.custom(this.cur(), 0);
+ },
+
+ // Each step of an animation
+ step: function( gotoEnd ) {
+ var t = fxNow || createFxNow(),
+ done = true,
+ elem = this.elem,
+ options = this.options,
+ i, n;
+
+ if ( gotoEnd || t >= options.duration + this.startTime ) {
+ this.now = this.end;
+ this.pos = this.state = 1;
+ this.update();
+
+ options.animatedProperties[ this.prop ] = true;
+
+ for ( i in options.animatedProperties ) {
+ if ( options.animatedProperties[i] !== true ) {
+ done = false;
+ }
+ }
+
+ if ( done ) {
+ // Reset the overflow
+ if ( options.overflow != null && !jQuery.support.shrinkWrapBlocks ) {
+
+ jQuery.each( [ "", "X", "Y" ], function (index, value) {
+ elem.style[ "overflow" + value ] = options.overflow[index];
+ });
+ }
+
+ // Hide the element if the "hide" operation was done
+ if ( options.hide ) {
+ jQuery(elem).hide();
+ }
+
+ // Reset the properties, if the item has been hidden or shown
+ if ( options.hide || options.show ) {
+ for ( var p in options.animatedProperties ) {
+ jQuery.style( elem, p, options.orig[p] );
+ }
+ }
+
+ // Execute the complete function
+ options.complete.call( elem );
+ }
+
+ return false;
+
+ } else {
+ // classical easing cannot be used with an Infinity duration
+ if ( options.duration == Infinity ) {
+ this.now = t;
+ } else {
+ n = t - this.startTime;
+ this.state = n / options.duration;
+
+ // Perform the easing function, defaults to swing
+ this.pos = jQuery.easing[ options.animatedProperties[ this.prop ] ]( this.state, n, 0, 1, options.duration );
+ this.now = this.start + ((this.end - this.start) * this.pos);
+ }
+ // Perform the next step of the animation
+ this.update();
+ }
+
+ return true;
+ }
+};
+
+jQuery.extend( jQuery.fx, {
+ tick: function() {
+ for ( var timers = jQuery.timers, i = 0 ; i < timers.length ; ++i ) {
+ if ( !timers[i]() ) {
+ timers.splice(i--, 1);
+ }
+ }
+
+ if ( !timers.length ) {
+ jQuery.fx.stop();
+ }
+ },
+
+ interval: 13,
+
+ stop: function() {
+ clearInterval( timerId );
+ timerId = null;
+ },
+
+ speeds: {
+ slow: 600,
+ fast: 200,
+ // Default speed
+ _default: 400
+ },
+
+ step: {
+ opacity: function( fx ) {
+ jQuery.style( fx.elem, "opacity", fx.now );
+ },
+
+ _default: function( fx ) {
+ if ( fx.elem.style && fx.elem.style[ fx.prop ] != null ) {
+ fx.elem.style[ fx.prop ] = (fx.prop === "width" || fx.prop === "height" ? Math.max(0, fx.now) : fx.now) + fx.unit;
+ } else {
+ fx.elem[ fx.prop ] = fx.now;
+ }
+ }
+ }
+});
+
+if ( jQuery.expr && jQuery.expr.filters ) {
+ jQuery.expr.filters.animated = function( elem ) {
+ return jQuery.grep(jQuery.timers, function( fn ) {
+ return elem === fn.elem;
+ }).length;
+ };
+}
+
+// Try to restore the default display value of an element
+function defaultDisplay( nodeName ) {
+
+ if ( !elemdisplay[ nodeName ] ) {
+
+ var body = document.body,
+ elem = jQuery( "<" + nodeName + ">" ).appendTo( 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 === "" ) {
+ // No iframe to use yet, so create it
+ if ( !iframe ) {
+ iframe = document.createElement( "iframe" );
+ iframe.frameBorder = iframe.width = iframe.height = 0;
+ }
+
+ body.appendChild( iframe );
+
+ // 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( ( document.compatMode === "CSS1Compat" ? "<!doctype html>" : "" ) + "<html><body>" );
+ iframeDoc.close();
+ }
+
+ elem = iframeDoc.createElement( nodeName );
+
+ iframeDoc.body.appendChild( elem );
+
+ display = jQuery.css( elem, "display" );
+
+ body.removeChild( iframe );
+ }
+
+ // Store the correct default display
+ elemdisplay[ nodeName ] = display;
+ }
+
+ return elemdisplay[ nodeName ];
+}
+
+
+
+
+var rtable = /^t(?:able|d|h)$/i,
+ rroot = /^(?:body|html)$/i;
+
+if ( "getBoundingClientRect" in document.documentElement ) {
+ jQuery.fn.offset = function( options ) {
+ var elem = this[0], box;
+
+ if ( options ) {
+ return this.each(function( i ) {
+ jQuery.offset.setOffset( this, options, i );
+ });
+ }
+
+ if ( !elem || !elem.ownerDocument ) {
+ return null;
+ }
+
+ if ( elem === elem.ownerDocument.body ) {
+ return jQuery.offset.bodyOffset( elem );
+ }
+
+ try {
+ box = elem.getBoundingClientRect();
+ } catch(e) {}
+
+ var doc = elem.ownerDocument,
+ docElem = doc.documentElement;
+
+ // Make sure we're not dealing with a disconnected DOM node
+ if ( !box || !jQuery.contains( docElem, elem ) ) {
+ return box ? { top: box.top, left: box.left } : { top: 0, left: 0 };
+ }
+
+ var body = doc.body,
+ win = getWindow(doc),
+ clientTop = docElem.clientTop || body.clientTop || 0,
+ clientLeft = docElem.clientLeft || body.clientLeft || 0,
+ scrollTop = win.pageYOffset || jQuery.support.boxModel && docElem.scrollTop || body.scrollTop,
+ scrollLeft = win.pageXOffset || jQuery.support.boxModel && docElem.scrollLeft || body.scrollLeft,
+ top = box.top + scrollTop - clientTop,
+ left = box.left + scrollLeft - clientLeft;
+
+ return { top: top, left: left };
+ };
+
+} else {
+ jQuery.fn.offset = function( options ) {
+ var elem = this[0];
+
+ if ( options ) {
+ return this.each(function( i ) {
+ jQuery.offset.setOffset( this, options, i );
+ });
+ }
+
+ if ( !elem || !elem.ownerDocument ) {
+ return null;
+ }
+
+ if ( elem === elem.ownerDocument.body ) {
+ return jQuery.offset.bodyOffset( elem );
+ }
+
+ jQuery.offset.initialize();
+
+ var computedStyle,
+ offsetParent = elem.offsetParent,
+ prevOffsetParent = elem,
+ doc = elem.ownerDocument,
+ docElem = doc.documentElement,
+ body = doc.body,
+ defaultView = doc.defaultView,
+ prevComputedStyle = defaultView ? defaultView.getComputedStyle( elem, null ) : elem.currentStyle,
+ top = elem.offsetTop,
+ left = elem.offsetLeft;
+
+ while ( (elem = elem.parentNode) && elem !== body && elem !== docElem ) {
+ if ( jQuery.offset.supportsFixedPosition && prevComputedStyle.position === "fixed" ) {
+ break;
+ }
+
+ computedStyle = defaultView ? defaultView.getComputedStyle(elem, null) : elem.currentStyle;
+ top -= elem.scrollTop;
+ left -= elem.scrollLeft;
+
+ if ( elem === offsetParent ) {
+ top += elem.offsetTop;
+ left += elem.offsetLeft;
+
+ if ( jQuery.offset.doesNotAddBorder && !(jQuery.offset.doesAddBorderForTableAndCells && rtable.test(elem.nodeName)) ) {
+ top += parseFloat( computedStyle.borderTopWidth ) || 0;
+ left += parseFloat( computedStyle.borderLeftWidth ) || 0;
+ }
+
+ prevOffsetParent = offsetParent;
+ offsetParent = elem.offsetParent;
+ }
+
+ if ( jQuery.offset.subtractsBorderForOverflowNotVisible && computedStyle.overflow !== "visible" ) {
+ top += parseFloat( computedStyle.borderTopWidth ) || 0;
+ left += parseFloat( computedStyle.borderLeftWidth ) || 0;
+ }
+
+ prevComputedStyle = computedStyle;
+ }
+
+ if ( prevComputedStyle.position === "relative" || prevComputedStyle.position === "static" ) {
+ top += body.offsetTop;
+ left += body.offsetLeft;
+ }
+
+ if ( jQuery.offset.supportsFixedPosition && prevComputedStyle.position === "fixed" ) {
+ top += Math.max( docElem.scrollTop, body.scrollTop );
+ left += Math.max( docElem.scrollLeft, body.scrollLeft );
+ }
+
+ return { top: top, left: left };
+ };
+}
+
+jQuery.offset = {
+ initialize: function() {
+ var body = document.body, container = document.createElement("div"), innerDiv, checkDiv, table, td, bodyMarginTop = parseFloat( jQuery.css(body, "marginTop") ) || 0,
+ html = "<div style='position:absolute;top:0;left:0;margin:0;border:5px solid #000;padding:0;width:1px;height:1px;'><div></div></div><table style='position:absolute;top:0;left:0;margin:0;border:5px solid #000;padding:0;width:1px;height:1px;' cellpadding='0' cellspacing='0'><tr><td></td></tr></table>";
+
+ jQuery.extend( container.style, { position: "absolute", top: 0, left: 0, margin: 0, border: 0, width: "1px", height: "1px", visibility: "hidden" } );
+
+ container.innerHTML = html;
+ body.insertBefore( container, body.firstChild );
+ innerDiv = container.firstChild;
+ checkDiv = innerDiv.firstChild;
+ td = innerDiv.nextSibling.firstChild.firstChild;
+
+ this.doesNotAddBorder = (checkDiv.offsetTop !== 5);
+ this.doesAddBorderForTableAndCells = (td.offsetTop === 5);
+
+ checkDiv.style.position = "fixed";
+ checkDiv.style.top = "20px";
+
+ // safari subtracts parent border width here which is 5px
+ this.supportsFixedPosition = (checkDiv.offsetTop === 20 || checkDiv.offsetTop === 15);
+ checkDiv.style.position = checkDiv.style.top = "";
+
+ innerDiv.style.overflow = "hidden";
+ innerDiv.style.position = "relative";
+
+ this.subtractsBorderForOverflowNotVisible = (checkDiv.offsetTop === -5);
+
+ this.doesNotIncludeMarginInBodyOffset = (body.offsetTop !== bodyMarginTop);
+
+ body.removeChild( container );
+ jQuery.offset.initialize = jQuery.noop;
+ },
+
+ bodyOffset: function( body ) {
+ var top = body.offsetTop,
+ left = body.offsetLeft;
+
+ jQuery.offset.initialize();
+
+ if ( jQuery.offset.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 null;
+ }
+
+ 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;
+ });
+ }
+});
+
+
+// Create scrollLeft and scrollTop methods
+jQuery.each( ["Left", "Top"], function( i, name ) {
+ var method = "scroll" + name;
+
+ jQuery.fn[ method ] = function( val ) {
+ var elem, win;
+
+ if ( val === undefined ) {
+ elem = this[ 0 ];
+
+ if ( !elem ) {
+ return null;
+ }
+
+ win = getWindow( elem );
+
+ // Return the scroll offset
+ return win ? ("pageXOffset" in win) ? win[ i ? "pageYOffset" : "pageXOffset" ] :
+ jQuery.support.boxModel && win.document.documentElement[ method ] ||
+ win.document.body[ method ] :
+ elem[ method ];
+ }
+
+ // Set the scroll offset
+ return this.each(function() {
+ win = getWindow( this );
+
+ if ( win ) {
+ win.scrollTo(
+ !i ? val : jQuery( win ).scrollLeft(),
+ i ? val : jQuery( win ).scrollTop()
+ );
+
+ } else {
+ this[ method ] = val;
+ }
+ });
+ };
+});
+
+function getWindow( elem ) {
+ return jQuery.isWindow( elem ) ?
+ elem :
+ elem.nodeType === 9 ?
+ elem.defaultView || elem.parentWindow :
+ false;
+}
+
+
+
+
+// Create width, height, innerHeight, innerWidth, outerHeight and outerWidth methods
+jQuery.each([ "Height", "Width" ], function( i, name ) {
+
+ var type = name.toLowerCase();
+
+ // innerHeight and innerWidth
+ jQuery.fn[ "inner" + name ] = function() {
+ var elem = this[0];
+ return elem && elem.style ?
+ parseFloat( jQuery.css( elem, type, "padding" ) ) :
+ null;
+ };
+
+ // outerHeight and outerWidth
+ jQuery.fn[ "outer" + name ] = function( margin ) {
+ var elem = this[0];
+ return elem && elem.style ?
+ parseFloat( jQuery.css( elem, type, margin ? "margin" : "border" ) ) :
+ null;
+ };
+
+ jQuery.fn[ type ] = function( size ) {
+ // Get window width or height
+ var elem = this[0];
+ if ( !elem ) {
+ return size == null ? null : this;
+ }
+
+ if ( jQuery.isFunction( size ) ) {
+ return this.each(function( i ) {
+ var self = jQuery( this );
+ self[ type ]( size.call( this, i, self[ type ]() ) );
+ });
+ }
+
+ if ( jQuery.isWindow( elem ) ) {
+ // Everyone else use document.documentElement or document.body depending on Quirks vs Standards mode
+ // 3rd condition allows Nokia support, as it supports the docElem prop but not CSS1Compat
+ var docElemProp = elem.document.documentElement[ "client" + name ];
+ return elem.document.compatMode === "CSS1Compat" && docElemProp ||
+ elem.document.body[ "client" + name ] || docElemProp;
+
+ // Get document width or height
+ } else if ( elem.nodeType === 9 ) {
+ // Either scroll[Width/Height] or offset[Width/Height], whichever is greater
+ return Math.max(
+ elem.documentElement["client" + name],
+ elem.body["scroll" + name], elem.documentElement["scroll" + name],
+ elem.body["offset" + name], elem.documentElement["offset" + name]
+ );
+
+ // Get or set width or height on the element
+ } else if ( size === undefined ) {
+ var orig = jQuery.css( elem, type ),
+ ret = parseFloat( orig );
+
+ return jQuery.isNaN( ret ) ? orig : ret;
+
+ // Set the width or height on the element (default to pixels if value is unitless)
+ } else {
+ return this.css( type, typeof size === "string" ? size : size + "px" );
+ }
+ };
+
+});
+
+
+// Expose jQuery to the global object
+window.jQuery = window.$ = jQuery;
+})(window);
diff --git a/lib/scripts/jquery/jquery.min.js b/lib/scripts/jquery/jquery.min.js
new file mode 100644
index 000000000..48590ecb9
--- /dev/null
+++ b/lib/scripts/jquery/jquery.min.js
@@ -0,0 +1,18 @@
+/*!
+ * jQuery JavaScript Library v1.6.2
+ * http://jquery.com/
+ *
+ * Copyright 2011, John Resig
+ * Dual licensed under the MIT or GPL Version 2 licenses.
+ * http://jquery.org/license
+ *
+ * Includes Sizzle.js
+ * http://sizzlejs.com/
+ * Copyright 2011, The Dojo Foundation
+ * Released under the MIT, BSD, and GPL Licenses.
+ *
+ * Date: Thu Jun 30 14:16:56 2011 -0400
+ */
+(function(a,b){function cv(a){return f.isWindow(a)?a:a.nodeType===9?a.defaultView||a.parentWindow:!1}function cs(a){if(!cg[a]){var b=c.body,d=f("<"+a+">").appendTo(b),e=d.css("display");d.remove();if(e==="none"||e===""){ch||(ch=c.createElement("iframe"),ch.frameBorder=ch.width=ch.height=0),b.appendChild(ch);if(!ci||!ch.createElement)ci=(ch.contentWindow||ch.contentDocument).document,ci.write((c.compatMode==="CSS1Compat"?"<!doctype html>":"")+"<html><body>"),ci.close();d=ci.createElement(a),ci.body.appendChild(d),e=f.css(d,"display"),b.removeChild(ch)}cg[a]=e}return cg[a]}function cr(a,b){var c={};f.each(cm.concat.apply([],cm.slice(0,b)),function(){c[this]=a});return c}function cq(){cn=b}function cp(){setTimeout(cq,0);return cn=f.now()}function cf(){try{return new a.ActiveXObject("Microsoft.XMLHTTP")}catch(b){}}function ce(){try{return new a.XMLHttpRequest}catch(b){}}function b$(a,c){a.dataFilter&&(c=a.dataFilter(c,a.dataType));var d=a.dataTypes,e={},g,h,i=d.length,j,k=d[0],l,m,n,o,p;for(g=1;g<i;g++){if(g===1)for(h in a.converters)typeof h=="string"&&(e[h.toLowerCase()]=a.converters[h]);l=k,k=d[g];if(k==="*")k=l;else if(l!=="*"&&l!==k){m=l+" "+k,n=e[m]||e["* "+k];if(!n){p=b;for(o in e){j=o.split(" ");if(j[0]===l||j[0]==="*"){p=e[j[1]+" "+k];if(p){o=e[o],o===!0?n=p:p===!0&&(n=o);break}}}}!n&&!p&&f.error("No conversion from "+m.replace(" "," to ")),n!==!0&&(c=n?n(c):p(o(c)))}}return c}function bZ(a,c,d){var e=a.contents,f=a.dataTypes,g=a.responseFields,h,i,j,k;for(i in g)i in d&&(c[g[i]]=d[i]);while(f[0]==="*")f.shift(),h===b&&(h=a.mimeType||c.getResponseHeader("content-type"));if(h)for(i in e)if(e[i]&&e[i].test(h)){f.unshift(i);break}if(f[0]in d)j=f[0];else{for(i in d){if(!f[0]||a.converters[i+" "+f[0]]){j=i;break}k||(k=i)}j=j||k}if(j){j!==f[0]&&f.unshift(j);return d[j]}}function bY(a,b,c,d){if(f.isArray(b))f.each(b,function(b,e){c||bC.test(a)?d(a,e):bY(a+"["+(typeof e=="object"||f.isArray(e)?b:"")+"]",e,c,d)});else if(!c&&b!=null&&typeof b=="object")for(var e in b)bY(a+"["+e+"]",b[e],c,d);else d(a,b)}function bX(a,c,d,e,f,g){f=f||c.dataTypes[0],g=g||{},g[f]=!0;var h=a[f],i=0,j=h?h.length:0,k=a===bR,l;for(;i<j&&(k||!l);i++)l=h[i](c,d,e),typeof l=="string"&&(!k||g[l]?l=b:(c.dataTypes.unshift(l),l=bX(a,c,d,e,l,g)));(k||!l)&&!g["*"]&&(l=bX(a,c,d,e,"*",g));return l}function bW(a){return function(b,c){typeof b!="string"&&(c=b,b="*");if(f.isFunction(c)){var d=b.toLowerCase().split(bN),e=0,g=d.length,h,i,j;for(;e<g;e++)h=d[e],j=/^\+/.test(h),j&&(h=h.substr(1)||"*"),i=a[h]=a[h]||[],i[j?"unshift":"push"](c)}}}function bA(a,b,c){var d=b==="width"?a.offsetWidth:a.offsetHeight,e=b==="width"?bv:bw;if(d>0){c!=="border"&&f.each(e,function(){c||(d-=parseFloat(f.css(a,"padding"+this))||0),c==="margin"?d+=parseFloat(f.css(a,c+this))||0:d-=parseFloat(f.css(a,"border"+this+"Width"))||0});return d+"px"}d=bx(a,b,b);if(d<0||d==null)d=a.style[b]||0;d=parseFloat(d)||0,c&&f.each(e,function(){d+=parseFloat(f.css(a,"padding"+this))||0,c!=="padding"&&(d+=parseFloat(f.css(a,"border"+this+"Width"))||0),c==="margin"&&(d+=parseFloat(f.css(a,c+this))||0)});return d+"px"}function bm(a,b){b.src?f.ajax({url:b.src,async:!1,dataType:"script"}):f.globalEval((b.text||b.textContent||b.innerHTML||"").replace(be,"/*$0*/")),b.parentNode&&b.parentNode.removeChild(b)}function bl(a){f.nodeName(a,"input")?bk(a):"getElementsByTagName"in a&&f.grep(a.getElementsByTagName("input"),bk)}function bk(a){if(a.type==="checkbox"||a.type==="radio")a.defaultChecked=a.checked}function bj(a){return"getElementsByTagName"in a?a.getElementsByTagName("*"):"querySelectorAll"in a?a.querySelectorAll("*"):[]}function bi(a,b){var c;if(b.nodeType===1){b.clearAttributes&&b.clearAttributes(),b.mergeAttributes&&b.mergeAttributes(a),c=b.nodeName.toLowerCase();if(c==="object")b.outerHTML=a.outerHTML;else if(c!=="input"||a.type!=="checkbox"&&a.type!=="radio"){if(c==="option")b.selected=a.defaultSelected;else if(c==="input"||c==="textarea")b.defaultValue=a.defaultValue}else a.checked&&(b.defaultChecked=b.checked=a.checked),b.value!==a.value&&(b.value=a.value);b.removeAttribute(f.expando)}}function bh(a,b){if(b.nodeType===1&&!!f.hasData(a)){var c=f.expando,d=f.data(a),e=f.data(b,d);if(d=d[c]){var g=d.events;e=e[c]=f.extend({},d);if(g){delete e.handle,e.events={};for(var h in g)for(var i=0,j=g[h].length;i<j;i++)f.event.add(b,h+(g[h][i].namespace?".":"")+g[h][i].namespace,g[h][i],g[h][i].data)}}}}function bg(a,b){return f.nodeName(a,"table")?a.getElementsByTagName("tbody")[0]||a.appendChild(a.ownerDocument.createElement("tbody")):a}function W(a,b,c){b=b||0;if(f.isFunction(b))return f.grep(a,function(a,d){var e=!!b.call(a,d,a);return e===c});if(b.nodeType)return f.grep(a,function(a,d){return a===b===c});if(typeof b=="string"){var d=f.grep(a,function(a){return a.nodeType===1});if(R.test(b))return f.filter(b,d,!c);b=f.filter(b,d)}return f.grep(a,function(a,d){return f.inArray(a,b)>=0===c})}function V(a){return!a||!a.parentNode||a.parentNode.nodeType===11}function N(a,b){return(a&&a!=="*"?a+".":"")+b.replace(z,"`").replace(A,"&")}function M(a){var b,c,d,e,g,h,i,j,k,l,m,n,o,p=[],q=[],r=f._data(this,"events");if(!(a.liveFired===this||!r||!r.live||a.target.disabled||a.button&&a.type==="click")){a.namespace&&(n=new RegExp("(^|\\.)"+a.namespace.split(".").join("\\.(?:.*\\.)?")+"(\\.|$)")),a.liveFired=this;var s=r.live.slice(0);for(i=0;i<s.length;i++)g=s[i],g.origType.replace(x,"")===a.type?q.push(g.selector):s.splice(i--,1);e=f(a.target).closest(q,a.currentTarget);for(j=0,k=e.length;j<k;j++){m=e[j];for(i=0;i<s.length;i++){g=s[i];if(m.selector===g.selector&&(!n||n.test(g.namespace))&&!m.elem.disabled){h=m.elem,d=null;if(g.preType==="mouseenter"||g.preType==="mouseleave")a.type=g.preType,d=f(a.relatedTarget).closest(g.selector)[0],d&&f.contains(h,d)&&(d=h);(!d||d!==h)&&p.push({elem:h,handleObj:g,level:m.level})}}}for(j=0,k=p.length;j<k;j++){e=p[j];if(c&&e.level>c)break;a.currentTarget=e.elem,a.data=e.handleObj.data,a.handleObj=e.handleObj,o=e.handleObj.origHandler.apply(e.elem,arguments);if(o===!1||a.isPropagationStopped()){c=e.level,o===!1&&(b=!1);if(a.isImmediatePropagationStopped())break}}return b}}function K(a,c,d){var e=f.extend({},d[0]);e.type=a,e.originalEvent={},e.liveFired=b,f.event.handle.call(c,e),e.isDefaultPrevented()&&d[0].preventDefault()}function E(){return!0}function D(){return!1}function m(a,c,d){var e=c+"defer",g=c+"queue",h=c+"mark",i=f.data(a,e,b,!0);i&&(d==="queue"||!f.data(a,g,b,!0))&&(d==="mark"||!f.data(a,h,b,!0))&&setTimeout(function(){!f.data(a,g,b,!0)&&!f.data(a,h,b,!0)&&(f.removeData(a,e,!0),i.resolve())},0)}function l(a){for(var b in a)if(b!=="toJSON")return!1;return!0}function k(a,c,d){if(d===b&&a.nodeType===1){var e="data-"+c.replace(j,"$1-$2").toLowerCase();d=a.getAttribute(e);if(typeof d=="string"){try{d=d==="true"?!0:d==="false"?!1:d==="null"?null:f.isNaN(d)?i.test(d)?f.parseJSON(d):d:parseFloat(d)}catch(g){}f.data(a,c,d)}else d=b}return d}var c=a.document,d=a.navigator,e=a.location,f=function(){function J(){if(!e.isReady){try{c.documentElement.doScroll("left")}catch(a){setTimeout(J,1);return}e.ready()}}var e=function(a,b){return new e.fn.init(a,b,h)},f=a.jQuery,g=a.$,h,i=/^(?:[^<]*(<[\w\W]+>)[^>]*$|#([\w\-]*)$)/,j=/\S/,k=/^\s+/,l=/\s+$/,m=/\d/,n=/^<(\w+)\s*\/?>(?:<\/\1>)?$/,o=/^[\],:{}\s]*$/,p=/\\(?:["\\\/bfnrt]|u[0-9a-fA-F]{4})/g,q=/"[^"\\\n\r]*"|true|false|null|-?\d+(?:\.\d*)?(?:[eE][+\-]?\d+)?/g,r=/(?:^|:|,)(?:\s*\[)+/g,s=/(webkit)[ \/]([\w.]+)/,t=/(opera)(?:.*version)?[ \/]([\w.]+)/,u=/(msie) ([\w.]+)/,v=/(mozilla)(?:.*? rv:([\w.]+))?/,w=/-([a-z])/ig,x=function(a,b){return b.toUpperCase()},y=d.userAgent,z,A,B,C=Object.prototype.toString,D=Object.prototype.hasOwnProperty,E=Array.prototype.push,F=Array.prototype.slice,G=String.prototype.trim,H=Array.prototype.indexOf,I={};e.fn=e.prototype={constructor:e,init:function(a,d,f){var g,h,j,k;if(!a)return this;if(a.nodeType){this.context=this[0]=a,this.length=1;return this}if(a==="body"&&!d&&c.body){this.context=c,this[0]=c.body,this.selector=a,this.length=1;return this}if(typeof a=="string"){a.charAt(0)!=="<"||a.charAt(a.length-1)!==">"||a.length<3?g=i.exec(a):g=[null,a,null];if(g&&(g[1]||!d)){if(g[1]){d=d instanceof e?d[0]:d,k=d?d.ownerDocument||d:c,j=n.exec(a),j?e.isPlainObject(d)?(a=[c.createElement(j[1])],e.fn.attr.call(a,d,!0)):a=[k.createElement(j[1])]:(j=e.buildFragment([g[1]],[k]),a=(j.cacheable?e.clone(j.fragment):j.fragment).childNodes);return e.merge(this,a)}h=c.getElementById(g[2]);if(h&&h.parentNode){if(h.id!==g[2])return f.find(a);this.length=1,this[0]=h}this.context=c,this.selector=a;return this}return!d||d.jquery?(d||f).find(a):this.constructor(d).find(a)}if(e.isFunction(a))return f.ready(a);a.selector!==b&&(this.selector=a.selector,this.context=a.context);return e.makeArray(a,this)},selector:"",jquery:"1.6.2",length:0,size:function(){return this.length},toArray:function(){return F.call(this,0)},get:function(a){return a==null?this.toArray():a<0?this[this.length+a]:this[a]},pushStack:function(a,b,c){var d=this.constructor();e.isArray(a)?E.apply(d,a):e.merge(d,a),d.prevObject=this,d.context=this.context,b==="find"?d.selector=this.selector+(this.selector?" ":"")+c:b&&(d.selector=this.selector+"."+b+"("+c+")");return d},each:function(a,b){return e.each(this,a,b)},ready:function(a){e.bindReady(),A.done(a);return this},eq:function(a){return a===-1?this.slice(a):this.slice(a,+a+1)},first:function(){return this.eq(0)},last:function(){return this.eq(-1)},slice:function(){return this.pushStack(F.apply(this,arguments),"slice",F.call(arguments).join(","))},map:function(a){return this.pushStack(e.map(this,function(b,c){return a.call(b,c,b)}))},end:function(){return this.prevObject||this.constructor(null)},push:E,sort:[].sort,splice:[].splice},e.fn.init.prototype=e.fn,e.extend=e.fn.extend=function(){var a,c,d,f,g,h,i=arguments[0]||{},j=1,k=arguments.length,l=!1;typeof i=="boolean"&&(l=i,i=arguments[1]||{},j=2),typeof i!="object"&&!e.isFunction(i)&&(i={}),k===j&&(i=this,--j);for(;j<k;j++)if((a=arguments[j])!=null)for(c in a){d=i[c],f=a[c];if(i===f)continue;l&&f&&(e.isPlainObject(f)||(g=e.isArray(f)))?(g?(g=!1,h=d&&e.isArray(d)?d:[]):h=d&&e.isPlainObject(d)?d:{},i[c]=e.extend(l,h,f)):f!==b&&(i[c]=f)}return i},e.extend({noConflict:function(b){a.$===e&&(a.$=g),b&&a.jQuery===e&&(a.jQuery=f);return e},isReady:!1,readyWait:1,holdReady:function(a){a?e.readyWait++:e.ready(!0)},ready:function(a){if(a===!0&&!--e.readyWait||a!==!0&&!e.isReady){if(!c.body)return setTimeout(e.ready,1);e.isReady=!0;if(a!==!0&&--e.readyWait>0)return;A.resolveWith(c,[e]),e.fn.trigger&&e(c).trigger("ready").unbind("ready")}},bindReady:function(){if(!A){A=e._Deferred();if(c.readyState==="complete")return setTimeout(e.ready,1);if(c.addEventListener)c.addEventListener("DOMContentLoaded",B,!1),a.addEventListener("load",e.ready,!1);else if(c.attachEvent){c.attachEvent("onreadystatechange",B),a.attachEvent("onload",e.ready);var b=!1;try{b=a.frameElement==null}catch(d){}c.documentElement.doScroll&&b&&J()}}},isFunction:function(a){return e.type(a)==="function"},isArray:Array.isArray||function(a){return e.type(a)==="array"},isWindow:function(a){return a&&typeof a=="object"&&"setInterval"in a},isNaN:function(a){return a==null||!m.test(a)||isNaN(a)},type:function(a){return a==null?String(a):I[C.call(a)]||"object"},isPlainObject:function(a){if(!a||e.type(a)!=="object"||a.nodeType||e.isWindow(a))return!1;if(a.constructor&&!D.call(a,"constructor")&&!D.call(a.constructor.prototype,"isPrototypeOf"))return!1;var c;for(c in a);return c===b||D.call(a,c)},isEmptyObject:function(a){for(var b in a)return!1;return!0},error:function(a){throw a},parseJSON:function(b){if(typeof b!="string"||!b)return null;b=e.trim(b);if(a.JSON&&a.JSON.parse)return a.JSON.parse(b);if(o.test(b.replace(p,"@").replace(q,"]").replace(r,"")))return(new Function("return "+b))();e.error("Invalid JSON: "+b)},parseXML:function(b,c,d){a.DOMParser?(d=new DOMParser,c=d.parseFromString(b,"text/xml")):(c=new ActiveXObject("Microsoft.XMLDOM"),c.async="false",c.loadXML(b)),d=c.documentElement,(!d||!d.nodeName||d.nodeName==="parsererror")&&e.error("Invalid XML: "+b);return c},noop:function(){},globalEval:function(b){b&&j.test(b)&&(a.execScript||function(b){a.eval.call(a,b)})(b)},camelCase:function(a){return a.replace(w,x)},nodeName:function(a,b){return a.nodeName&&a.nodeName.toUpperCase()===b.toUpperCase()},each:function(a,c,d){var f,g=0,h=a.length,i=h===b||e.isFunction(a);if(d){if(i){for(f in a)if(c.apply(a[f],d)===!1)break}else for(;g<h;)if(c.apply(a[g++],d)===!1)break}else if(i){for(f in a)if(c.call(a[f],f,a[f])===!1)break}else for(;g<h;)if(c.call(a[g],g,a[g++])===!1)break;return a},trim:G?function(a){return a==null?"":G.call(a)}:function(a){return a==null?"":(a+"").replace(k,"").replace(l,"")},makeArray:function(a,b){var c=b||[];if(a!=null){var d=e.type(a);a.length==null||d==="string"||d==="function"||d==="regexp"||e.isWindow(a)?E.call(c,a):e.merge(c,a)}return c},inArray:function(a,b){if(H)return H.call(b,a);for(var c=0,d=b.length;c<d;c++)if(b[c]===a)return c;return-1},merge:function(a,c){var d=a.length,e=0;if(typeof c.length=="number")for(var f=c.length;e<f;e++)a[d++]=c[e];else while(c[e]!==b)a[d++]=c[e++];a.length=d;return a},grep:function(a,b,c){var d=[],e;c=!!c;for(var f=0,g=a.length;f<g;f++)e=!!b(a[f],f),c!==e&&d.push(a[f]);return d},map:function(a,c,d){var f,g,h=[],i=0,j=a.length,k=a instanceof e||j!==b&&typeof j=="number"&&(j>0&&a[0]&&a[j-1]||j===0||e.isArray(a));if(k)for(;i<j;i++)f=c(a[i],i,d),f!=null&&(h[h.length]=f);else for(g in a)f=c(a[g],g,d),f!=null&&(h[h.length]=f);return h.concat.apply([],h)},guid:1,proxy:function(a,c){if(typeof c=="string"){var d=a[c];c=a,a=d}if(!e.isFunction(a))return b;var f=F.call(arguments,2),g=function(){return a.apply(c,f.concat(F.call(arguments)))};g.guid=a.guid=a.guid||g.guid||e.guid++;return g},access:function(a,c,d,f,g,h){var i=a.length;if(typeof c=="object"){for(var j in c)e.access(a,j,c[j],f,g,d);return a}if(d!==b){f=!h&&f&&e.isFunction(d);for(var k=0;k<i;k++)g(a[k],c,f?d.call(a[k],k,g(a[k],c)):d,h);return a}return i?g(a[0],c):b},now:function(){return(new Date).getTime()},uaMatch:function(a){a=a.toLowerCase();var b=s.exec(a)||t.exec(a)||u.exec(a)||a.indexOf("compatible")<0&&v.exec(a)||[];return{browser:b[1]||"",version:b[2]||"0"}},sub:function(){function a(b,c){return new a.fn.init(b,c)}e.extend(!0,a,this),a.superclass=this,a.fn=a.prototype=this(),a.fn.constructor=a,a.sub=this.sub,a.fn.init=function(d,f){f&&f instanceof e&&!(f instanceof a)&&(f=a(f));return e.fn.init.call(this,d,f,b)},a.fn.init.prototype=a.fn;var b=a(c);return a},browser:{}}),e.each("Boolean Number String Function Array Date RegExp Object".split(" "),function(a,b){I["[object "+b+"]"]=b.toLowerCase()}),z=e.uaMatch(y),z.browser&&(e.browser[z.browser]=!0,e.browser.version=z.version),e.browser.webkit&&(e.browser.safari=!0),j.test(" ")&&(k=/^[\s\xA0]+/,l=/[\s\xA0]+$/),h=e(c),c.addEventListener?B=function(){c.removeEventListener("DOMContentLoaded",B,!1),e.ready()}:c.attachEvent&&(B=function(){c.readyState==="complete"&&(c.detachEvent("onreadystatechange",B),e.ready())});return e}(),g="done fail isResolved isRejected promise then always pipe".split(" "),h=[].slice;f.extend({_Deferred:function(){var a=[],b,c,d,e={done:function(){if(!d){var c=arguments,g,h,i,j,k;b&&(k=b,b=0);for(g=0,h=c.length;g<h;g++)i=c[g],j=f.type(i),j==="array"?e.done.apply(e,i):j==="function"&&a.push(i);k&&e.resolveWith(k[0],k[1])}return this},resolveWith:function(e,f){if(!d&&!b&&!c){f=f||[],c=1;try{while(a[0])a.shift().apply(e,f)}finally{b=[e,f],c=0}}return this},resolve:function(){e.resolveWith(this,arguments);return this},isResolved:function(){return!!c||!!b},cancel:function(){d=1,a=[];return this}};return e},Deferred:function(a){var b=f._Deferred(),c=f._Deferred(),d;f.extend(b,{then:function(a,c){b.done(a).fail(c);return this},always:function(){return b.done.apply(b,arguments).fail.apply(this,arguments)},fail:c.done,rejectWith:c.resolveWith,reject:c.resolve,isRejected:c.isResolved,pipe:function(a,c){return f.Deferred(function(d){f.each({done:[a,"resolve"],fail:[c,"reject"]},function(a,c){var e=c[0],g=c[1],h;f.isFunction(e)?b[a](function(){h=e.apply(this,arguments),h&&f.isFunction(h.promise)?h.promise().then(d.resolve,d.reject):d[g](h)}):b[a](d[g])})}).promise()},promise:function(a){if(a==null){if(d)return d;d=a={}}var c=g.length;while(c--)a[g[c]]=b[g[c]];return a}}),b.done(c.cancel).fail(b.cancel),delete b.cancel,a&&a.call(b,b);return b},when:function(a){function i(a){return function(c){b[a]=arguments.length>1?h.call(arguments,0):c,--e||g.resolveWith(g,h.call(b,0))}}var b=arguments,c=0,d=b.length,e=d,g=d<=1&&a&&f.isFunction(a.promise)?a:f.Deferred();if(d>1){for(;c<d;c++)b[c]&&f.isFunction(b[c].promise)?b[c].promise().then(i(c),g.reject):--e;e||g.resolveWith(g,b)}else g!==a&&g.resolveWith(g,d?[a]:[]);return g.promise()}}),f.support=function(){var a=c.createElement("div"),b=c.documentElement,d,e,g,h,i,j,k,l,m,n,o,p,q,r,s,t,u;a.setAttribute("className","t"),a.innerHTML=" <link/><table></table><a href='/a' style='top:1px;float:left;opacity:.55;'>a</a><input type='checkbox'/>",d=a.getElementsByTagName("*"),e=a.getElementsByTagName("a")[0];if(!d||!d.length||!e)return{};g=c.createElement("select"),h=g.appendChild(c.createElement("option")),i=a.getElementsByTagName("input")[0],k={leadingWhitespace:a.firstChild.nodeType===3,tbody:!a.getElementsByTagName("tbody").length,htmlSerialize:!!a.getElementsByTagName("link").length,style:/top/.test(e.getAttribute("style")),hrefNormalized:e.getAttribute("href")==="/a",opacity:/^0.55$/.test(e.style.opacity),cssFloat:!!e.style.cssFloat,checkOn:i.value==="on",optSelected:h.selected,getSetAttribute:a.className!=="t",submitBubbles:!0,changeBubbles:!0,focusinBubbles:!1,deleteExpando:!0,noCloneEvent:!0,inlineBlockNeedsLayout:!1,shrinkWrapBlocks:!1,reliableMarginRight:!0},i.checked=!0,k.noCloneChecked=i.cloneNode(!0).checked,g.disabled=!0,k.optDisabled=!h.disabled;try{delete a.test}catch(v){k.deleteExpando=!1}!a.addEventListener&&a.attachEvent&&a.fireEvent&&(a.attachEvent("onclick",function(){k.noCloneEvent=!1}),a.cloneNode(!0).fireEvent("onclick")),i=c.createElement("input"),i.value="t",i.setAttribute("type","radio"),k.radioValue=i.value==="t",i.setAttribute("checked","checked"),a.appendChild(i),l=c.createDocumentFragment(),l.appendChild(a.firstChild),k.checkClone=l.cloneNode(!0).cloneNode(!0).lastChild.checked,a.innerHTML="",a.style.width=a.style.paddingLeft="1px",m=c.getElementsByTagName("body")[0],o=c.createElement(m?"div":"body"),p={visibility:"hidden",width:0,height:0,border:0,margin:0},m&&f.extend(p,{position:"absolute",left:-1e3,top:-1e3});for(t in p)o.style[t]=p[t];o.appendChild(a),n=m||b,n.insertBefore(o,n.firstChild),k.appendChecked=i.checked,k.boxModel=a.offsetWidth===2,"zoom"in a.style&&(a.style.display="inline",a.style.zoom=1,k.inlineBlockNeedsLayout=a.offsetWidth===2,a.style.display="",a.innerHTML="<div style='width:4px;'></div>",k.shrinkWrapBlocks=a.offsetWidth!==2),a.innerHTML="<table><tr><td style='padding:0;border:0;display:none'></td><td>t</td></tr></table>",q=a.getElementsByTagName("td"),u=q[0].offsetHeight===0,q[0].style.display="",q[1].style.display="none",k.reliableHiddenOffsets=u&&q[0].offsetHeight===0,a.innerHTML="",c.defaultView&&c.defaultView.getComputedStyle&&(j=c.createElement("div"),j.style.width="0",j.style.marginRight="0",a.appendChild(j),k.reliableMarginRight=(parseInt((c.defaultView.getComputedStyle(j,null)||{marginRight:0}).marginRight,10)||0)===0),o.innerHTML="",n.removeChild(o);if(a.attachEvent)for(t in{submit:1,change:1,focusin:1})s="on"+t,u=s in a,u||(a.setAttribute(s,"return;"),u=typeof a[s]=="function"),k[t+"Bubbles"]=u;o=l=g=h=m=j=a=i=null;return k}(),f.boxModel=f.support.boxModel;var i=/^(?:\{.*\}|\[.*\])$/,j=/([a-z])([A-Z])/g;f.extend({cache:{},uuid:0,expando:"jQuery"+(f.fn.jquery+Math.random()).replace(/\D/g,""),noData:{embed:!0,object:"clsid:D27CDB6E-AE6D-11cf-96B8-444553540000",applet:!0},hasData:function(a){a=a.nodeType?f.cache[a[f.expando]]:a[f.expando];return!!a&&!l(a)},data:function(a,c,d,e){if(!!f.acceptData(a)){var g=f.expando,h=typeof c=="string",i,j=a.nodeType,k=j?f.cache:a,l=j?a[f.expando]:a[f.expando]&&f.expando;if((!l||e&&l&&!k[l][g])&&h&&d===b)return;l||(j?a[f.expando]=l=++f.uuid:l=f.expando),k[l]||(k[l]={},j||(k[l].toJSON=f.noop));if(typeof c=="object"||typeof c=="function")e?k[l][g]=f.extend(k[l][g],c):k[l]=f.extend(k[l],c);i=k[l],e&&(i[g]||(i[g]={}),i=i[g]),d!==b&&(i[f.camelCase(c)]=d);if(c==="events"&&!i[c])return i[g]&&i[g].events;return h?i[f.camelCase(c)]||i[c]:i}},removeData:function(b,c,d){if(!!f.acceptData(b)){var e=f.expando,g=b.nodeType,h=g?f.cache:b,i=g?b[f.expando]:f.expando;if(!h[i])return;if(c){var j=d?h[i][e]:h[i];if(j){delete j[c];if(!l(j))return}}if(d){delete h[i][e];if(!l(h[i]))return}var k=h[i][e];f.support.deleteExpando||h!=a?delete h[i]:h[i]=null,k?(h[i]={},g||(h[i].toJSON=f.noop),h[i][e]=k):g&&(f.support.deleteExpando?delete b[f.expando]:b.removeAttribute?b.removeAttribute(f.expando):b[f.expando]=null)}},_data:function(a,b,c){return f.data(a,b,c,!0)},acceptData:function(a){if(a.nodeName){var b=f.noData[a.nodeName.toLowerCase()];if(b)return b!==!0&&a.getAttribute("classid")===b}return!0}}),f.fn.extend({data:function(a,c){var d=null;if(typeof a=="undefined"){if(this.length){d=f.data(this[0]);if(this[0].nodeType===1){var e=this[0].attributes,g;for(var h=0,i=e.length;h<i;h++)g=e[h].name,g.indexOf("data-")===0&&(g=f.camelCase(g.substring(5)),k(this[0],g,d[g]))}}return d}if(typeof a=="object")return this.each(function(){f.data(this,a)});var j=a.split(".");j[1]=j[1]?"."+j[1]:"";if(c===b){d=this.triggerHandler("getData"+j[1]+"!",[j[0]]),d===b&&this.length&&(d=f.data(this[0],a),d=k(this[0],a,d));return d===b&&j[1]?this.data(j[0]):d}return this.each(function(){var b=f(this),d=[j[0],c];b.triggerHandler("setData"+j[1]+"!",d),f.data(this,a,c),b.triggerHandler("changeData"+j[1]+"!",d)})},removeData:function(a){return this.each(function(){f.removeData(this,a)})}}),f.extend({_mark:function(a,c){a&&(c=(c||"fx")+"mark",f.data(a,c,(f.data(a,c,b,!0)||0)+1,!0))},_unmark:function(a,c,d){a!==!0&&(d=c,c=a,a=!1);if(c){d=d||"fx";var e=d+"mark",g=a?0:(f.data(c,e,b,!0)||1)-1;g?f.data(c,e,g,!0):(f.removeData(c,e,!0),m(c,d,"mark"))}},queue:function(a,c,d){if(a){c=(c||"fx")+"queue";var e=f.data(a,c,b,!0);d&&(!e||f.isArray(d)?e=f.data(a,c,f.makeArray(d),!0):e.push(d));return e||[]}},dequeue:function(a,b){b=b||"fx";var c=f.queue(a,b),d=c.shift(),e;d==="inprogress"&&(d=c.shift()),d&&(b==="fx"&&c.unshift("inprogress"),d.call(a,function(){f.dequeue(a,b)})),c.length||(f.removeData(a,b+"queue",!0),m(a,b,"queue"))}}),f.fn.extend({queue:function(a,c){typeof a!="string"&&(c=a,a="fx");if(c===b)return f.queue(this[0],a);return this.each(function(){var b=f.queue(this,a,c);a==="fx"&&b[0]!=="inprogress"&&f.dequeue(this,a)})},dequeue:function(a){return this.each(function(){f.dequeue(this,a)})},delay:function(a,b){a=f.fx?f.fx.speeds[a]||a:a,b=b||"fx";return this.queue(b,function(){var c=this;setTimeout(function(){f.dequeue(c,b)},a)})},clearQueue:function(a){return this.queue(a||"fx",[])},promise:function(a,c){function m(){--h||d.resolveWith(e,[e])}typeof a!="string"&&(c=a,a=b),a=a||"fx";var d=f.Deferred(),e=this,g=e.length,h=1,i=a+"defer",j=a+"queue",k=a+"mark",l;while(g--)if(l=f.data(e[g],i,b,!0)||(f.data(e[g],j,b,!0)||f.data(e[g],k,b,!0))&&f.data(e[g],i,f._Deferred(),!0))h++,l.done(m);m();return d.promise()}});var n=/[\n\t\r]/g,o=/\s+/,p=/\r/g,q=/^(?:button|input)$/i,r=/^(?:button|input|object|select|textarea)$/i,s=/^a(?:rea)?$/i,t=/^(?:autofocus|autoplay|async|checked|controls|defer|disabled|hidden|loop|multiple|open|readonly|required|scoped|selected)$/i,u=/\:|^on/,v,w;f.fn.extend({attr:function(a,b){return f.access(this,a,b,!0,f.attr)},removeAttr:function(a){return this.each(function(){f.removeAttr(this,a)})},prop:function(a,b){return f.access(this,a,b,!0,f.prop)},removeProp:function(a){a=f.propFix[a]||a;return this.each(function(){try{this[a]=b,delete this[a]}catch(c){}})},addClass:function(a){var b,c,d,e,g,h,i;if(f.isFunction(a))return this.each(function(b){f(this).addClass(a.call(this,b,this.className))});if(a&&typeof a=="string"){b=a.split(o);for(c=0,d=this.length;c<d;c++){e=this[c];if(e.nodeType===1)if(!e.className&&b.length===1)e.className=a;else{g=" "+e.className+" ";for(h=0,i=b.length;h<i;h++)~g.indexOf(" "+b[h]+" ")||(g+=b[h]+" ");e.className=f.trim(g)}}}return this},removeClass:function(a){var c,d,e,g,h,i,j;if(f.isFunction(a))return this.each(function(b){f(this).removeClass(a.call(this,b,this.className))});if(a&&typeof a=="string"||a===b){c=(a||"").split(o);for(d=0,e=this.length;d<e;d++){g=this[d];if(g.nodeType===1&&g.className)if(a){h=(" "+g.className+" ").replace(n," ");for(i=0,j=c.length;i<j;i++)h=h.replace(" "+c[i]+" "," ");g.className=f.trim(h)}else g.className=""}}return this},toggleClass:function(a,b){var c=typeof a,d=typeof b=="boolean";if(f.isFunction(a))return this.each(function(c){f(this).toggleClass(a.call(this,c,this.className,b),b)});return this.each(function(){if(c==="string"){var e,g=0,h=f(this),i=b,j=a.split(o);while(e=j[g++])i=d?i:!h.hasClass(e),h[i?"addClass":"removeClass"](e)}else if(c==="undefined"||c==="boolean")this.className&&f._data(this,"__className__",this.className),this.className=this.className||a===!1?"":f._data(this,"__className__")||""})},hasClass:function(a){var b=" "+a+" ";for(var c=0,d=this.length;c<d;c++)if((" "+this[c].className+" ").replace(n," ").indexOf(b)>-1)return!0;return!1},val:function(a){var c,d,e=this[0];if(!arguments.length){if(e){c=f.valHooks[e.nodeName.toLowerCase()]||f.valHooks[e.type];if(c&&"get"in c&&(d=c.get(e,"value"))!==b)return d;d=e.value;return typeof d=="string"?d.replace(p,""):d==null?"":d}return b}var g=f.isFunction(a);return this.each(function(d){var e=f(this),h;if(this.nodeType===1){g?h=a.call(this,d,e.val()):h=a,h==null?h="":typeof h=="number"?h+="":f.isArray(h)&&(h=f.map(h,function(a){return a==null?"":a+""})),c=f.valHooks[this.nodeName.toLowerCase()]||f.valHooks[this.type];if(!c||!("set"in c)||c.set(this,h,"value")===b)this.value=h}})}}),f.extend({valHooks:{option:{get:function(a){var b=a.attributes.value;return!b||b.specified?a.value:a.text}},select:{get:function(a){var b,c=a.selectedIndex,d=[],e=a.options,g=a.type==="select-one";if(c<0)return null;for(var h=g?c:0,i=g?c+1:e.length;h<i;h++){var j=e[h];if(j.selected&&(f.support.optDisabled?!j.disabled:j.getAttribute("disabled")===null)&&(!j.parentNode.disabled||!f.nodeName(j.parentNode,"optgroup"))){b=f(j).val();if(g)return b;d.push(b)}}if(g&&!d.length&&e.length)return f(e[c]).val();return d},set:function(a,b){var c=f.makeArray(b);f(a).find("option").each(function(){this.selected=f.inArray(f(this).val(),c)>=0}),c.length||(a.selectedIndex=-1);return c}}},attrFn:{val:!0,css:!0,html:!0,text:!0,data:!0,width:!0,height:!0,offset:!0},attrFix:{tabindex:"tabIndex"},attr:function(a,c,d,e){var g=a.nodeType;if(!a||g===3||g===8||g===2)return b;if(e&&c in f.attrFn)return f(a)[c](d);if(!("getAttribute"in a))return f.prop(a,c,d);var h,i,j=g!==1||!f.isXMLDoc(a);j&&(c=f.attrFix[c]||c,i=f.attrHooks[c],i||(t.test(c)?i=w:v&&c!=="className"&&(f.nodeName(a,"form")||u.test(c))&&(i=v)));if(d!==b){if(d===null){f.removeAttr(a,c);return b}if(i&&"set"in i&&j&&(h=i.set(a,d,c))!==b)return h;a.setAttribute(c,""+d);return d}if(i&&"get"in i&&j&&(h=i.get(a,c))!==null)return h;h=a.getAttribute(c);return h===null?b:h},removeAttr:function(a,b){var c;a.nodeType===1&&(b=f.attrFix[b]||b,f.support.getSetAttribute?a.removeAttribute(b):(f.attr(a,b,""),a.removeAttributeNode(a.getAttributeNode(b))),t.test(b)&&(c=f.propFix[b]||b)in a&&(a[c]=!1))},attrHooks:{type:{set:function(a,b){if(q.test(a.nodeName)&&a.parentNode)f.error("type property can't be changed");else if(!f.support.radioValue&&b==="radio"&&f.nodeName(a,"input")){var c=a.value;a.setAttribute("type",b),c&&(a.value=c);return b}}},tabIndex:{get:function(a){var c=a.getAttributeNode("tabIndex");return c&&c.specified?parseInt(c.value,10):r.test(a.nodeName)||s.test(a.nodeName)&&a.href?0:b}},value:{get:function(a,b){if(v&&f.nodeName(a,"button"))return v.get(a,b);return b in a?a.value:null},set:function(a,b,c){if(v&&f.nodeName(a,"button"))return v.set(a,b,c);a.value=b}}},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(a,c,d){var e=a.nodeType;if(!a||e===3||e===8||e===2)return b;var g,h,i=e!==1||!f.isXMLDoc(a);i&&(c=f.propFix[c]||c,h=f.propHooks[c]);return d!==b?h&&"set"in h&&(g=h.set(a,d,c))!==b?g:a[c]=d:h&&"get"in h&&(g=h.get(a,c))!==b?g:a[c]},propHooks:{}}),w={get:function(a,c){return f.prop(a,c)?c.toLowerCase():b},set:function(a,b,c){var d;b===!1?f.removeAttr(a,c):(d=f.propFix[c]||c,d in a&&(a[d]=!0),a.setAttribute(c,c.toLowerCase()));return c}},f.support.getSetAttribute||(f.attrFix=f.propFix,v=f.attrHooks.name=f.attrHooks.title=f.valHooks.button={get:function(a,c){var d;d=a.getAttributeNode(c);return d&&d.nodeValue!==""?d.nodeValue:b},set:function(a,b,c){var d=a.getAttributeNode(c);if(d){d.nodeValue=b;return b}}},f.each(["width","height"],function(a,b){f.attrHooks[b]=f.extend(f.attrHooks[b],{set:function(a,c){if(c===""){a.setAttribute(b,"auto");return c}}})})),f.support.hrefNormalized||f.each(["href","src","width","height"],function(a,c){f.attrHooks[c]=f.extend(f.attrHooks[c],{get:function(a){var d=a.getAttribute(c,2);return d===null?b:d}})}),f.support.style||(f.attrHooks.style={get:function(a){return a.style.cssText.toLowerCase()||b},set:function(a,b){return a.style.cssText=""+b}}),f.support.optSelected||(f.propHooks.selected=f.extend(f.propHooks.selected,{get:function(a){var b=a.parentNode;b&&(b.selectedIndex,b.parentNode&&b.parentNode.selectedIndex)}})),f.support.checkOn||f.each(["radio","checkbox"],function(){f.valHooks[this]={get:function(a){return a.getAttribute("value")===null?"on":a.value}}}),f.each(["radio","checkbox"],function(){f.valHooks[this]=f.extend(f.valHooks[this],{set:function(a,b){if(f.isArray(b))return a.checked=f.inArray(f(a).val(),b)>=0}})});var x=/\.(.*)$/,y=/^(?:textarea|input|select)$/i,z=/\./g,A=/ /g,B=/[^\w\s.|`]/g,C=function(a){return a.replace(B,"\\$&")};f.event={add:function(a,c,d,e){if(a.nodeType!==3&&a.nodeType!==8){if(d===!1)d=D;else if(!d)return;var g,h;d.handler&&(g=d,d=g.handler),d.guid||(d.guid=f.guid++);var i=f._data(a);if(!i)return;var j=i.events,k=i.handle;j||(i.events=j={}),k||(i.handle=k=function(a){return typeof f!="undefined"&&(!a||f.event.triggered!==a.type)?f.event.handle.apply(k.elem,arguments):b}),k.elem=a,c=c.split(" ");var l,m=0,n;while(l=c[m++]){h=g?f.extend({},g):{handler:d,data:e},l.indexOf(".")>-1?(n=l.split("."),l=n.shift(),h.namespace=n.slice(0).sort().join(".")):(n=[],h.namespace=""),h.type=l,h.guid||(h.guid=d.guid);var o=j[l],p=f.event.special[l]||{};if(!o){o=j[l]=[];if(!p.setup||p.setup.call(a,e,n,k)===!1)a.addEventListener?a.addEventListener(l,k,!1):a.attachEvent&&a.attachEvent("on"+l,k)}p.add&&(p.add.call(a,h),h.handler.guid||(h.handler.guid=d.guid)),o.push(h),f.event.global[l]=!0}a=null}},global:{},remove:function(a,c,d,e){if(a.nodeType!==3&&a.nodeType!==8){d===!1&&(d=D);var g,h,i,j,k=0,l,m,n,o,p,q,r,s=f.hasData(a)&&f._data(a),t=s&&s.events;if(!s||!t)return;c&&c.type&&(d=c.handler,c=c.type);if(!c||typeof c=="string"&&c.charAt(0)==="."){c=c||"";for(h in t)f.event.remove(a,h+c);return}c=c.split(" ");while(h=c[k++]){r=h,q=null,l=h.indexOf(".")<0,m=[],l||(m=h.split("."),h=m.shift(),n=new RegExp("(^|\\.)"+f.map(m.slice(0).sort(),C).join("\\.(?:.*\\.)?")+"(\\.|$)")),p=t[h];if(!p)continue;if(!d){for(j=0;j<p.length;j++){q=p[j];if(l||n.test(q.namespace))f.event.remove(a,r,q.handler,j),p.splice(j--,1)}continue}o=f.event.special[h]||{};for(j=e||0;j<p.length;j++){q=p[j];if(d.guid===q.guid){if(l||n.test(q.namespace))e==null&&p.splice(j--,1),o.remove&&o.remove.call(a,q);if(e!=null)break}}if(p.length===0||e!=null&&p.length===1)(!o.teardown||o.teardown.call(a,m)===!1)&&f.removeEvent(a,h,s.handle),g=null,delete t[h]}if(f.isEmptyObject(t)){var u=s.handle;u&&(u.elem=null),delete s.events,delete s.handle,f.isEmptyObject(s)&&f.removeData(a,b,!0)}}},customEvent:{getData:!0,setData:!0,changeData:!0},trigger:function(c,d,e,g){var h=c.type||c,i=[],j;h.indexOf("!")>=0&&(h=h.slice(0,-1),j=!0),h.indexOf(".")>=0&&(i=h.split("."),h=i.
+shift(),i.sort());if(!!e&&!f.event.customEvent[h]||!!f.event.global[h]){c=typeof c=="object"?c[f.expando]?c:new f.Event(h,c):new f.Event(h),c.type=h,c.exclusive=j,c.namespace=i.join("."),c.namespace_re=new RegExp("(^|\\.)"+i.join("\\.(?:.*\\.)?")+"(\\.|$)");if(g||!e)c.preventDefault(),c.stopPropagation();if(!e){f.each(f.cache,function(){var a=f.expando,b=this[a];b&&b.events&&b.events[h]&&f.event.trigger(c,d,b.handle.elem)});return}if(e.nodeType===3||e.nodeType===8)return;c.result=b,c.target=e,d=d!=null?f.makeArray(d):[],d.unshift(c);var k=e,l=h.indexOf(":")<0?"on"+h:"";do{var m=f._data(k,"handle");c.currentTarget=k,m&&m.apply(k,d),l&&f.acceptData(k)&&k[l]&&k[l].apply(k,d)===!1&&(c.result=!1,c.preventDefault()),k=k.parentNode||k.ownerDocument||k===c.target.ownerDocument&&a}while(k&&!c.isPropagationStopped());if(!c.isDefaultPrevented()){var n,o=f.event.special[h]||{};if((!o._default||o._default.call(e.ownerDocument,c)===!1)&&(h!=="click"||!f.nodeName(e,"a"))&&f.acceptData(e)){try{l&&e[h]&&(n=e[l],n&&(e[l]=null),f.event.triggered=h,e[h]())}catch(p){}n&&(e[l]=n),f.event.triggered=b}}return c.result}},handle:function(c){c=f.event.fix(c||a.event);var d=((f._data(this,"events")||{})[c.type]||[]).slice(0),e=!c.exclusive&&!c.namespace,g=Array.prototype.slice.call(arguments,0);g[0]=c,c.currentTarget=this;for(var h=0,i=d.length;h<i;h++){var j=d[h];if(e||c.namespace_re.test(j.namespace)){c.handler=j.handler,c.data=j.data,c.handleObj=j;var k=j.handler.apply(this,g);k!==b&&(c.result=k,k===!1&&(c.preventDefault(),c.stopPropagation()));if(c.isImmediatePropagationStopped())break}}return c.result},props:"altKey attrChange attrName bubbles button cancelable charCode clientX clientY ctrlKey currentTarget data detail eventPhase fromElement handler keyCode layerX layerY metaKey newValue offsetX offsetY pageX pageY prevValue relatedNode relatedTarget screenX screenY shiftKey srcElement target toElement view wheelDelta which".split(" "),fix:function(a){if(a[f.expando])return a;var d=a;a=f.Event(d);for(var e=this.props.length,g;e;)g=this.props[--e],a[g]=d[g];a.target||(a.target=a.srcElement||c),a.target.nodeType===3&&(a.target=a.target.parentNode),!a.relatedTarget&&a.fromElement&&(a.relatedTarget=a.fromElement===a.target?a.toElement:a.fromElement);if(a.pageX==null&&a.clientX!=null){var h=a.target.ownerDocument||c,i=h.documentElement,j=h.body;a.pageX=a.clientX+(i&&i.scrollLeft||j&&j.scrollLeft||0)-(i&&i.clientLeft||j&&j.clientLeft||0),a.pageY=a.clientY+(i&&i.scrollTop||j&&j.scrollTop||0)-(i&&i.clientTop||j&&j.clientTop||0)}a.which==null&&(a.charCode!=null||a.keyCode!=null)&&(a.which=a.charCode!=null?a.charCode:a.keyCode),!a.metaKey&&a.ctrlKey&&(a.metaKey=a.ctrlKey),!a.which&&a.button!==b&&(a.which=a.button&1?1:a.button&2?3:a.button&4?2:0);return a},guid:1e8,proxy:f.proxy,special:{ready:{setup:f.bindReady,teardown:f.noop},live:{add:function(a){f.event.add(this,N(a.origType,a.selector),f.extend({},a,{handler:M,guid:a.handler.guid}))},remove:function(a){f.event.remove(this,N(a.origType,a.selector),a)}},beforeunload:{setup:function(a,b,c){f.isWindow(this)&&(this.onbeforeunload=c)},teardown:function(a,b){this.onbeforeunload===b&&(this.onbeforeunload=null)}}}},f.removeEvent=c.removeEventListener?function(a,b,c){a.removeEventListener&&a.removeEventListener(b,c,!1)}:function(a,b,c){a.detachEvent&&a.detachEvent("on"+b,c)},f.Event=function(a,b){if(!this.preventDefault)return new f.Event(a,b);a&&a.type?(this.originalEvent=a,this.type=a.type,this.isDefaultPrevented=a.defaultPrevented||a.returnValue===!1||a.getPreventDefault&&a.getPreventDefault()?E:D):this.type=a,b&&f.extend(this,b),this.timeStamp=f.now(),this[f.expando]=!0},f.Event.prototype={preventDefault:function(){this.isDefaultPrevented=E;var a=this.originalEvent;!a||(a.preventDefault?a.preventDefault():a.returnValue=!1)},stopPropagation:function(){this.isPropagationStopped=E;var a=this.originalEvent;!a||(a.stopPropagation&&a.stopPropagation(),a.cancelBubble=!0)},stopImmediatePropagation:function(){this.isImmediatePropagationStopped=E,this.stopPropagation()},isDefaultPrevented:D,isPropagationStopped:D,isImmediatePropagationStopped:D};var F=function(a){var b=a.relatedTarget,c=!1,d=a.type;a.type=a.data,b!==this&&(b&&(c=f.contains(this,b)),c||(f.event.handle.apply(this,arguments),a.type=d))},G=function(a){a.type=a.data,f.event.handle.apply(this,arguments)};f.each({mouseenter:"mouseover",mouseleave:"mouseout"},function(a,b){f.event.special[a]={setup:function(c){f.event.add(this,b,c&&c.selector?G:F,a)},teardown:function(a){f.event.remove(this,b,a&&a.selector?G:F)}}}),f.support.submitBubbles||(f.event.special.submit={setup:function(a,b){if(!f.nodeName(this,"form"))f.event.add(this,"click.specialSubmit",function(a){var b=a.target,c=b.type;(c==="submit"||c==="image")&&f(b).closest("form").length&&K("submit",this,arguments)}),f.event.add(this,"keypress.specialSubmit",function(a){var b=a.target,c=b.type;(c==="text"||c==="password")&&f(b).closest("form").length&&a.keyCode===13&&K("submit",this,arguments)});else return!1},teardown:function(a){f.event.remove(this,".specialSubmit")}});if(!f.support.changeBubbles){var H,I=function(a){var b=a.type,c=a.value;b==="radio"||b==="checkbox"?c=a.checked:b==="select-multiple"?c=a.selectedIndex>-1?f.map(a.options,function(a){return a.selected}).join("-"):"":f.nodeName(a,"select")&&(c=a.selectedIndex);return c},J=function(c){var d=c.target,e,g;if(!!y.test(d.nodeName)&&!d.readOnly){e=f._data(d,"_change_data"),g=I(d),(c.type!=="focusout"||d.type!=="radio")&&f._data(d,"_change_data",g);if(e===b||g===e)return;if(e!=null||g)c.type="change",c.liveFired=b,f.event.trigger(c,arguments[1],d)}};f.event.special.change={filters:{focusout:J,beforedeactivate:J,click:function(a){var b=a.target,c=f.nodeName(b,"input")?b.type:"";(c==="radio"||c==="checkbox"||f.nodeName(b,"select"))&&J.call(this,a)},keydown:function(a){var b=a.target,c=f.nodeName(b,"input")?b.type:"";(a.keyCode===13&&!f.nodeName(b,"textarea")||a.keyCode===32&&(c==="checkbox"||c==="radio")||c==="select-multiple")&&J.call(this,a)},beforeactivate:function(a){var b=a.target;f._data(b,"_change_data",I(b))}},setup:function(a,b){if(this.type==="file")return!1;for(var c in H)f.event.add(this,c+".specialChange",H[c]);return y.test(this.nodeName)},teardown:function(a){f.event.remove(this,".specialChange");return y.test(this.nodeName)}},H=f.event.special.change.filters,H.focus=H.beforeactivate}f.support.focusinBubbles||f.each({focus:"focusin",blur:"focusout"},function(a,b){function e(a){var c=f.event.fix(a);c.type=b,c.originalEvent={},f.event.trigger(c,null,c.target),c.isDefaultPrevented()&&a.preventDefault()}var d=0;f.event.special[b]={setup:function(){d++===0&&c.addEventListener(a,e,!0)},teardown:function(){--d===0&&c.removeEventListener(a,e,!0)}}}),f.each(["bind","one"],function(a,c){f.fn[c]=function(a,d,e){var g;if(typeof a=="object"){for(var h in a)this[c](h,d,a[h],e);return this}if(arguments.length===2||d===!1)e=d,d=b;c==="one"?(g=function(a){f(this).unbind(a,g);return e.apply(this,arguments)},g.guid=e.guid||f.guid++):g=e;if(a==="unload"&&c!=="one")this.one(a,d,e);else for(var i=0,j=this.length;i<j;i++)f.event.add(this[i],a,g,d);return this}}),f.fn.extend({unbind:function(a,b){if(typeof a=="object"&&!a.preventDefault)for(var c in a)this.unbind(c,a[c]);else for(var d=0,e=this.length;d<e;d++)f.event.remove(this[d],a,b);return this},delegate:function(a,b,c,d){return this.live(b,c,d,a)},undelegate:function(a,b,c){return arguments.length===0?this.unbind("live"):this.die(b,null,c,a)},trigger:function(a,b){return this.each(function(){f.event.trigger(a,b,this)})},triggerHandler:function(a,b){if(this[0])return f.event.trigger(a,b,this[0],!0)},toggle:function(a){var b=arguments,c=a.guid||f.guid++,d=0,e=function(c){var e=(f.data(this,"lastToggle"+a.guid)||0)%d;f.data(this,"lastToggle"+a.guid,e+1),c.preventDefault();return b[e].apply(this,arguments)||!1};e.guid=c;while(d<b.length)b[d++].guid=c;return this.click(e)},hover:function(a,b){return this.mouseenter(a).mouseleave(b||a)}});var L={focus:"focusin",blur:"focusout",mouseenter:"mouseover",mouseleave:"mouseout"};f.each(["live","die"],function(a,c){f.fn[c]=function(a,d,e,g){var h,i=0,j,k,l,m=g||this.selector,n=g?this:f(this.context);if(typeof a=="object"&&!a.preventDefault){for(var o in a)n[c](o,d,a[o],m);return this}if(c==="die"&&!a&&g&&g.charAt(0)==="."){n.unbind(g);return this}if(d===!1||f.isFunction(d))e=d||D,d=b;a=(a||"").split(" ");while((h=a[i++])!=null){j=x.exec(h),k="",j&&(k=j[0],h=h.replace(x,""));if(h==="hover"){a.push("mouseenter"+k,"mouseleave"+k);continue}l=h,L[h]?(a.push(L[h]+k),h=h+k):h=(L[h]||h)+k;if(c==="live")for(var p=0,q=n.length;p<q;p++)f.event.add(n[p],"live."+N(h,m),{data:d,selector:m,handler:e,origType:h,origHandler:e,preType:l});else n.unbind("live."+N(h,m),e)}return this}}),f.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".split(" "),function(a,b){f.fn[b]=function(a,c){c==null&&(c=a,a=null);return arguments.length>0?this.bind(b,a,c):this.trigger(b)},f.attrFn&&(f.attrFn[b]=!0)}),function(){function u(a,b,c,d,e,f){for(var g=0,h=d.length;g<h;g++){var i=d[g];if(i){var j=!1;i=i[a];while(i){if(i.sizcache===c){j=d[i.sizset];break}if(i.nodeType===1){f||(i.sizcache=c,i.sizset=g);if(typeof b!="string"){if(i===b){j=!0;break}}else if(k.filter(b,[i]).length>0){j=i;break}}i=i[a]}d[g]=j}}}function t(a,b,c,d,e,f){for(var g=0,h=d.length;g<h;g++){var i=d[g];if(i){var j=!1;i=i[a];while(i){if(i.sizcache===c){j=d[i.sizset];break}i.nodeType===1&&!f&&(i.sizcache=c,i.sizset=g);if(i.nodeName.toLowerCase()===b){j=i;break}i=i[a]}d[g]=j}}}var a=/((?:\((?:\([^()]+\)|[^()]+)+\)|\[(?:\[[^\[\]]*\]|['"][^'"]*['"]|[^\[\]'"]+)+\]|\\.|[^ >+~,(\[\\]+)+|[>+~])(\s*,\s*)?((?:.|\r|\n)*)/g,d=0,e=Object.prototype.toString,g=!1,h=!0,i=/\\/g,j=/\W/;[0,0].sort(function(){h=!1;return 0});var k=function(b,d,f,g){f=f||[],d=d||c;var h=d;if(d.nodeType!==1&&d.nodeType!==9)return[];if(!b||typeof b!="string")return f;var i,j,n,o,q,r,s,t,u=!0,w=k.isXML(d),x=[],y=b;do{a.exec(""),i=a.exec(y);if(i){y=i[3],x.push(i[1]);if(i[2]){o=i[3];break}}}while(i);if(x.length>1&&m.exec(b))if(x.length===2&&l.relative[x[0]])j=v(x[0]+x[1],d);else{j=l.relative[x[0]]?[d]:k(x.shift(),d);while(x.length)b=x.shift(),l.relative[b]&&(b+=x.shift()),j=v(b,j)}else{!g&&x.length>1&&d.nodeType===9&&!w&&l.match.ID.test(x[0])&&!l.match.ID.test(x[x.length-1])&&(q=k.find(x.shift(),d,w),d=q.expr?k.filter(q.expr,q.set)[0]:q.set[0]);if(d){q=g?{expr:x.pop(),set:p(g)}:k.find(x.pop(),x.length===1&&(x[0]==="~"||x[0]==="+")&&d.parentNode?d.parentNode:d,w),j=q.expr?k.filter(q.expr,q.set):q.set,x.length>0?n=p(j):u=!1;while(x.length)r=x.pop(),s=r,l.relative[r]?s=x.pop():r="",s==null&&(s=d),l.relative[r](n,s,w)}else n=x=[]}n||(n=j),n||k.error(r||b);if(e.call(n)==="[object Array]")if(!u)f.push.apply(f,n);else if(d&&d.nodeType===1)for(t=0;n[t]!=null;t++)n[t]&&(n[t]===!0||n[t].nodeType===1&&k.contains(d,n[t]))&&f.push(j[t]);else for(t=0;n[t]!=null;t++)n[t]&&n[t].nodeType===1&&f.push(j[t]);else p(n,f);o&&(k(o,h,f,g),k.uniqueSort(f));return f};k.uniqueSort=function(a){if(r){g=h,a.sort(r);if(g)for(var b=1;b<a.length;b++)a[b]===a[b-1]&&a.splice(b--,1)}return a},k.matches=function(a,b){return k(a,null,null,b)},k.matchesSelector=function(a,b){return k(b,null,null,[a]).length>0},k.find=function(a,b,c){var d;if(!a)return[];for(var e=0,f=l.order.length;e<f;e++){var g,h=l.order[e];if(g=l.leftMatch[h].exec(a)){var j=g[1];g.splice(1,1);if(j.substr(j.length-1)!=="\\"){g[1]=(g[1]||"").replace(i,""),d=l.find[h](g,b,c);if(d!=null){a=a.replace(l.match[h],"");break}}}}d||(d=typeof b.getElementsByTagName!="undefined"?b.getElementsByTagName("*"):[]);return{set:d,expr:a}},k.filter=function(a,c,d,e){var f,g,h=a,i=[],j=c,m=c&&c[0]&&k.isXML(c[0]);while(a&&c.length){for(var n in l.filter)if((f=l.leftMatch[n].exec(a))!=null&&f[2]){var o,p,q=l.filter[n],r=f[1];g=!1,f.splice(1,1);if(r.substr(r.length-1)==="\\")continue;j===i&&(i=[]);if(l.preFilter[n]){f=l.preFilter[n](f,j,d,i,e,m);if(!f)g=o=!0;else if(f===!0)continue}if(f)for(var s=0;(p=j[s])!=null;s++)if(p){o=q(p,f,s,j);var t=e^!!o;d&&o!=null?t?g=!0:j[s]=!1:t&&(i.push(p),g=!0)}if(o!==b){d||(j=i),a=a.replace(l.match[n],"");if(!g)return[];break}}if(a===h)if(g==null)k.error(a);else break;h=a}return j},k.error=function(a){throw"Syntax error, unrecognized expression: "+a};var l=k.selectors={order:["ID","NAME","TAG"],match:{ID:/#((?:[\w\u00c0-\uFFFF\-]|\\.)+)/,CLASS:/\.((?:[\w\u00c0-\uFFFF\-]|\\.)+)/,NAME:/\[name=['"]*((?:[\w\u00c0-\uFFFF\-]|\\.)+)['"]*\]/,ATTR:/\[\s*((?:[\w\u00c0-\uFFFF\-]|\\.)+)\s*(?:(\S?=)\s*(?:(['"])(.*?)\3|(#?(?:[\w\u00c0-\uFFFF\-]|\\.)*)|)|)\s*\]/,TAG:/^((?:[\w\u00c0-\uFFFF\*\-]|\\.)+)/,CHILD:/:(only|nth|last|first)-child(?:\(\s*(even|odd|(?:[+\-]?\d+|(?:[+\-]?\d*)?n\s*(?:[+\-]\s*\d+)?))\s*\))?/,POS:/:(nth|eq|gt|lt|first|last|even|odd)(?:\((\d*)\))?(?=[^\-]|$)/,PSEUDO:/:((?:[\w\u00c0-\uFFFF\-]|\\.)+)(?:\((['"]?)((?:\([^\)]+\)|[^\(\)]*)+)\2\))?/},leftMatch:{},attrMap:{"class":"className","for":"htmlFor"},attrHandle:{href:function(a){return a.getAttribute("href")},type:function(a){return a.getAttribute("type")}},relative:{"+":function(a,b){var c=typeof b=="string",d=c&&!j.test(b),e=c&&!d;d&&(b=b.toLowerCase());for(var f=0,g=a.length,h;f<g;f++)if(h=a[f]){while((h=h.previousSibling)&&h.nodeType!==1);a[f]=e||h&&h.nodeName.toLowerCase()===b?h||!1:h===b}e&&k.filter(b,a,!0)},">":function(a,b){var c,d=typeof b=="string",e=0,f=a.length;if(d&&!j.test(b)){b=b.toLowerCase();for(;e<f;e++){c=a[e];if(c){var g=c.parentNode;a[e]=g.nodeName.toLowerCase()===b?g:!1}}}else{for(;e<f;e++)c=a[e],c&&(a[e]=d?c.parentNode:c.parentNode===b);d&&k.filter(b,a,!0)}},"":function(a,b,c){var e,f=d++,g=u;typeof b=="string"&&!j.test(b)&&(b=b.toLowerCase(),e=b,g=t),g("parentNode",b,f,a,e,c)},"~":function(a,b,c){var e,f=d++,g=u;typeof b=="string"&&!j.test(b)&&(b=b.toLowerCase(),e=b,g=t),g("previousSibling",b,f,a,e,c)}},find:{ID:function(a,b,c){if(typeof b.getElementById!="undefined"&&!c){var d=b.getElementById(a[1]);return d&&d.parentNode?[d]:[]}},NAME:function(a,b){if(typeof b.getElementsByName!="undefined"){var c=[],d=b.getElementsByName(a[1]);for(var e=0,f=d.length;e<f;e++)d[e].getAttribute("name")===a[1]&&c.push(d[e]);return c.length===0?null:c}},TAG:function(a,b){if(typeof b.getElementsByTagName!="undefined")return b.getElementsByTagName(a[1])}},preFilter:{CLASS:function(a,b,c,d,e,f){a=" "+a[1].replace(i,"")+" ";if(f)return a;for(var g=0,h;(h=b[g])!=null;g++)h&&(e^(h.className&&(" "+h.className+" ").replace(/[\t\n\r]/g," ").indexOf(a)>=0)?c||d.push(h):c&&(b[g]=!1));return!1},ID:function(a){return a[1].replace(i,"")},TAG:function(a,b){return a[1].replace(i,"").toLowerCase()},CHILD:function(a){if(a[1]==="nth"){a[2]||k.error(a[0]),a[2]=a[2].replace(/^\+|\s*/g,"");var b=/(-?)(\d*)(?:n([+\-]?\d*))?/.exec(a[2]==="even"&&"2n"||a[2]==="odd"&&"2n+1"||!/\D/.test(a[2])&&"0n+"+a[2]||a[2]);a[2]=b[1]+(b[2]||1)-0,a[3]=b[3]-0}else a[2]&&k.error(a[0]);a[0]=d++;return a},ATTR:function(a,b,c,d,e,f){var g=a[1]=a[1].replace(i,"");!f&&l.attrMap[g]&&(a[1]=l.attrMap[g]),a[4]=(a[4]||a[5]||"").replace(i,""),a[2]==="~="&&(a[4]=" "+a[4]+" ");return a},PSEUDO:function(b,c,d,e,f){if(b[1]==="not")if((a.exec(b[3])||"").length>1||/^\w/.test(b[3]))b[3]=k(b[3],null,null,c);else{var g=k.filter(b[3],c,d,!0^f);d||e.push.apply(e,g);return!1}else if(l.match.POS.test(b[0])||l.match.CHILD.test(b[0]))return!0;return b},POS:function(a){a.unshift(!0);return a}},filters:{enabled:function(a){return a.disabled===!1&&a.type!=="hidden"},disabled:function(a){return a.disabled===!0},checked:function(a){return a.checked===!0},selected:function(a){a.parentNode&&a.parentNode.selectedIndex;return a.selected===!0},parent:function(a){return!!a.firstChild},empty:function(a){return!a.firstChild},has:function(a,b,c){return!!k(c[3],a).length},header:function(a){return/h\d/i.test(a.nodeName)},text:function(a){var b=a.getAttribute("type"),c=a.type;return a.nodeName.toLowerCase()==="input"&&"text"===c&&(b===c||b===null)},radio:function(a){return a.nodeName.toLowerCase()==="input"&&"radio"===a.type},checkbox:function(a){return a.nodeName.toLowerCase()==="input"&&"checkbox"===a.type},file:function(a){return a.nodeName.toLowerCase()==="input"&&"file"===a.type},password:function(a){return a.nodeName.toLowerCase()==="input"&&"password"===a.type},submit:function(a){var b=a.nodeName.toLowerCase();return(b==="input"||b==="button")&&"submit"===a.type},image:function(a){return a.nodeName.toLowerCase()==="input"&&"image"===a.type},reset:function(a){var b=a.nodeName.toLowerCase();return(b==="input"||b==="button")&&"reset"===a.type},button:function(a){var b=a.nodeName.toLowerCase();return b==="input"&&"button"===a.type||b==="button"},input:function(a){return/input|select|textarea|button/i.test(a.nodeName)},focus:function(a){return a===a.ownerDocument.activeElement}},setFilters:{first:function(a,b){return b===0},last:function(a,b,c,d){return b===d.length-1},even:function(a,b){return b%2===0},odd:function(a,b){return b%2===1},lt:function(a,b,c){return b<c[3]-0},gt:function(a,b,c){return b>c[3]-0},nth:function(a,b,c){return c[3]-0===b},eq:function(a,b,c){return c[3]-0===b}},filter:{PSEUDO:function(a,b,c,d){var e=b[1],f=l.filters[e];if(f)return f(a,c,b,d);if(e==="contains")return(a.textContent||a.innerText||k.getText([a])||"").indexOf(b[3])>=0;if(e==="not"){var g=b[3];for(var h=0,i=g.length;h<i;h++)if(g[h]===a)return!1;return!0}k.error(e)},CHILD:function(a,b){var c=b[1],d=a;switch(c){case"only":case"first":while(d=d.previousSibling)if(d.nodeType===1)return!1;if(c==="first")return!0;d=a;case"last":while(d=d.nextSibling)if(d.nodeType===1)return!1;return!0;case"nth":var e=b[2],f=b[3];if(e===1&&f===0)return!0;var g=b[0],h=a.parentNode;if(h&&(h.sizcache!==g||!a.nodeIndex)){var i=0;for(d=h.firstChild;d;d=d.nextSibling)d.nodeType===1&&(d.nodeIndex=++i);h.sizcache=g}var j=a.nodeIndex-f;return e===0?j===0:j%e===0&&j/e>=0}},ID:function(a,b){return a.nodeType===1&&a.getAttribute("id")===b},TAG:function(a,b){return b==="*"&&a.nodeType===1||a.nodeName.toLowerCase()===b},CLASS:function(a,b){return(" "+(a.className||a.getAttribute("class"))+" ").indexOf(b)>-1},ATTR:function(a,b){var c=b[1],d=l.attrHandle[c]?l.attrHandle[c](a):a[c]!=null?a[c]:a.getAttribute(c),e=d+"",f=b[2],g=b[4];return d==null?f==="!=":f==="="?e===g:f==="*="?e.indexOf(g)>=0:f==="~="?(" "+e+" ").indexOf(g)>=0:g?f==="!="?e!==g:f==="^="?e.indexOf(g)===0:f==="$="?e.substr(e.length-g.length)===g:f==="|="?e===g||e.substr(0,g.length+1)===g+"-":!1:e&&d!==!1},POS:function(a,b,c,d){var e=b[2],f=l.setFilters[e];if(f)return f(a,c,b,d)}}},m=l.match.POS,n=function(a,b){return"\\"+(b-0+1)};for(var o in l.match)l.match[o]=new RegExp(l.match[o].source+/(?![^\[]*\])(?![^\(]*\))/.source),l.leftMatch[o]=new RegExp(/(^(?:.|\r|\n)*?)/.source+l.match[o].source.replace(/\\(\d+)/g,n));var p=function(a,b){a=Array.prototype.slice.call(a,0);if(b){b.push.apply(b,a);return b}return a};try{Array.prototype.slice.call(c.documentElement.childNodes,0)[0].nodeType}catch(q){p=function(a,b){var c=0,d=b||[];if(e.call(a)==="[object Array]")Array.prototype.push.apply(d,a);else if(typeof a.length=="number")for(var f=a.length;c<f;c++)d.push(a[c]);else for(;a[c];c++)d.push(a[c]);return d}}var r,s;c.documentElement.compareDocumentPosition?r=function(a,b){if(a===b){g=!0;return 0}if(!a.compareDocumentPosition||!b.compareDocumentPosition)return a.compareDocumentPosition?-1:1;return a.compareDocumentPosition(b)&4?-1:1}:(r=function(a,b){if(a===b){g=!0;return 0}if(a.sourceIndex&&b.sourceIndex)return a.sourceIndex-b.sourceIndex;var c,d,e=[],f=[],h=a.parentNode,i=b.parentNode,j=h;if(h===i)return s(a,b);if(!h)return-1;if(!i)return 1;while(j)e.unshift(j),j=j.parentNode;j=i;while(j)f.unshift(j),j=j.parentNode;c=e.length,d=f.length;for(var k=0;k<c&&k<d;k++)if(e[k]!==f[k])return s(e[k],f[k]);return k===c?s(a,f[k],-1):s(e[k],b,1)},s=function(a,b,c){if(a===b)return c;var d=a.nextSibling;while(d){if(d===b)return-1;d=d.nextSibling}return 1}),k.getText=function(a){var b="",c;for(var d=0;a[d];d++)c=a[d],c.nodeType===3||c.nodeType===4?b+=c.nodeValue:c.nodeType!==8&&(b+=k.getText(c.childNodes));return b},function(){var a=c.createElement("div"),d="script"+(new Date).getTime(),e=c.documentElement;a.innerHTML="<a name='"+d+"'/>",e.insertBefore(a,e.firstChild),c.getElementById(d)&&(l.find.ID=function(a,c,d){if(typeof c.getElementById!="undefined"&&!d){var e=c.getElementById(a[1]);return e?e.id===a[1]||typeof e.getAttributeNode!="undefined"&&e.getAttributeNode("id").nodeValue===a[1]?[e]:b:[]}},l.filter.ID=function(a,b){var c=typeof a.getAttributeNode!="undefined"&&a.getAttributeNode("id");return a.nodeType===1&&c&&c.nodeValue===b}),e.removeChild(a),e=a=null}(),function(){var a=c.createElement("div");a.appendChild(c.createComment("")),a.getElementsByTagName("*").length>0&&(l.find.TAG=function(a,b){var c=b.getElementsByTagName(a[1]);if(a[1]==="*"){var d=[];for(var e=0;c[e];e++)c[e].nodeType===1&&d.push(c[e]);c=d}return c}),a.innerHTML="<a href='#'></a>",a.firstChild&&typeof a.firstChild.getAttribute!="undefined"&&a.firstChild.getAttribute("href")!=="#"&&(l.attrHandle.href=function(a){return a.getAttribute("href",2)}),a=null}(),c.querySelectorAll&&function(){var a=k,b=c.createElement("div"),d="__sizzle__";b.innerHTML="<p class='TEST'></p>";if(!b.querySelectorAll||b.querySelectorAll(".TEST").length!==0){k=function(b,e,f,g){e=e||c;if(!g&&!k.isXML(e)){var h=/^(\w+$)|^\.([\w\-]+$)|^#([\w\-]+$)/.exec(b);if(h&&(e.nodeType===1||e.nodeType===9)){if(h[1])return p(e.getElementsByTagName(b),f);if(h[2]&&l.find.CLASS&&e.getElementsByClassName)return p(e.getElementsByClassName(h[2]),f)}if(e.nodeType===9){if(b==="body"&&e.body)return p([e.body],f);if(h&&h[3]){var i=e.getElementById(h[3]);if(!i||!i.parentNode)return p([],f);if(i.id===h[3])return p([i],f)}try{return p(e.querySelectorAll(b),f)}catch(j){}}else if(e.nodeType===1&&e.nodeName.toLowerCase()!=="object"){var m=e,n=e.getAttribute("id"),o=n||d,q=e.parentNode,r=/^\s*[+~]/.test(b);n?o=o.replace(/'/g,"\\$&"):e.setAttribute("id",o),r&&q&&(e=e.parentNode);try{if(!r||q)return p(e.querySelectorAll("[id='"+o+"'] "+b),f)}catch(s){}finally{n||m.removeAttribute("id")}}}return a(b,e,f,g)};for(var e in a)k[e]=a[e];b=null}}(),function(){var a=c.documentElement,b=a.matchesSelector||a.mozMatchesSelector||a.webkitMatchesSelector||a.msMatchesSelector;if(b){var d=!b.call(c.createElement("div"),"div"),e=!1;try{b.call(c.documentElement,"[test!='']:sizzle")}catch(f){e=!0}k.matchesSelector=function(a,c){c=c.replace(/\=\s*([^'"\]]*)\s*\]/g,"='$1']");if(!k.isXML(a))try{if(e||!l.match.PSEUDO.test(c)&&!/!=/.test(c)){var f=b.call(a,c);if(f||!d||a.document&&a.document.nodeType!==11)return f}}catch(g){}return k(c,null,null,[a]).length>0}}}(),function(){var a=c.createElement("div");a.innerHTML="<div class='test e'></div><div class='test'></div>";if(!!a.getElementsByClassName&&a.getElementsByClassName("e").length!==0){a.lastChild.className="e";if(a.getElementsByClassName("e").length===1)return;l.order.splice(1,0,"CLASS"),l.find.CLASS=function(a,b,c){if(typeof b.getElementsByClassName!="undefined"&&!c)return b.getElementsByClassName(a[1])},a=null}}(),c.documentElement.contains?k.contains=function(a,b){return a!==b&&(a.contains?a.contains(b):!0)}:c.documentElement.compareDocumentPosition?k.contains=function(a,b){return!!(a.compareDocumentPosition(b)&16)}:k.contains=function(){return!1},k.isXML=function(a){var b=(a?a.ownerDocument||a:0).documentElement;return b?b.nodeName!=="HTML":!1};var v=function(a,b){var c,d=[],e="",f=b.nodeType?[b]:b;while(c=l.match.PSEUDO.exec(a))e+=c[0],a=a.replace(l.match.PSEUDO,"");a=l.relative[a]?a+"*":a;for(var g=0,h=f.length;g<h;g++)k(a,f[g],d);return k.filter(e,d)};f.find=k,f.expr=k.selectors,f.expr[":"]=f.expr.filters,f.unique=k.uniqueSort,f.text=k.getText,f.isXMLDoc=k.isXML,f.contains=k.contains}();var O=/Until$/,P=/^(?:parents|prevUntil|prevAll)/,Q=/,/,R=/^.[^:#\[\.,]*$/,S=Array.prototype.slice,T=f.expr.match.POS,U={children:!0,contents:!0,next:!0,prev:!0};f.fn.extend({find:function(a){var b=this,c,d;if(typeof a!="string")return f(a).filter(function(){for(c=0,d=b.length;c<d;c++)if(f.contains(b[c],this))return!0});var e=this.pushStack("","find",a),g,h,i;for(c=0,d=this.length;c<d;c++){g=e.length,f.find(a,this[c],e);if(c>0)for(h=g;h<e.length;h++)for(i=0;i<g;i++)if(e[i]===e[h]){e.splice(h--,1);break}}return e},has:function(a){var b=f(a);return this.filter(function(){for(var a=0,c=b.length;a<c;a++)if(f.contains(this,b[a]))return!0})},not:function(a){return this.pushStack(W(this,a,!1),"not",a)},filter:function(a){return this.pushStack(W(this,a,!0),"filter",a)},is:function(a){return!!a&&(typeof a=="string"?f.filter(a,this).length>0:this.filter(a).length>0)},closest:function(a,b){var c=[],d,e,g=this[0];if(f.isArray(a)){var h,i,j={},k=1;if(g&&a.length){for(d=0,e=a.length;d<e;d++)i=a[d],j[i]||(j[i]=T.test(i)?f(i,b||this.context):i);while(g&&g.ownerDocument&&g!==b){for(i in j)h=j[i],(h.jquery?h.index(g)>-1:f(g).is(h))&&c.push({selector:i,elem:g,level:k});g=g.parentNode,k++}}return c}var l=T.test(a)||typeof a!="string"?f(a,b||this.context):0;for(d=0,e=this.length;d<e;d++){g=this[d];while(g){if(l?l.index(g)>-1:f.find.matchesSelector(g,a)){c.push(g);break}g=g.parentNode;if(!g||!g.ownerDocument||g===b||g.nodeType===11)break}}c=c.length>1?f.unique(c):c;return this.pushStack(c,"closest",a)},index:function(a){if(!a||typeof a=="string")return f.inArray(this[0],a?f(a):this.parent().children());return f.inArray(a.jquery?a[0]:a,this)},add:function(a,b){var c=typeof a=="string"?f(a,b):f.makeArray(a&&a.nodeType?[a]:a),d=f.merge(this.get(),c);return this.pushStack(V(c[0])||V(d[0])?d:f.unique(d))},andSelf:function(){return this.add(this.prevObject)}}),f.each({parent:function(a){var b=a.parentNode;return b&&b.nodeType!==11?b:null},parents:function(a){return f.dir(a,"parentNode")},parentsUntil:function(a,b,c){return f.dir(a,"parentNode",c)},next:function(a){return f.nth(a,2,"nextSibling")},prev:function(a){return f.nth(a,2,"previousSibling")},nextAll:function(a){return f.dir(a,"nextSibling")},prevAll:function(a){return f.dir(a,"previousSibling")},nextUntil:function(a,b,c){return f.dir(a,"nextSibling",c)},prevUntil:function(a,b,c){return f.dir(a,"previousSibling",c)},siblings:function(a){return f.sibling(a.parentNode.firstChild,a)},children:function(a){return f.sibling(a.firstChild)},contents:function(a){return f.nodeName(a,"iframe")?a.contentDocument||a.contentWindow.document:f.makeArray(a.childNodes)}},function(a,b){f.fn[a]=function(c,d){var e=f.map(this,b,c),g=S.call(arguments);O.test(a)||(d=c),d&&typeof d=="string"&&(e=f.filter(d,e)),e=this.length>1&&!U[a]?f.unique(e):e,(this.length>1||Q.test(d))&&P.test(a)&&(e=e.reverse());return this.pushStack(e,a,g.join(","))}}),f.extend({filter:function(a,b,c){c&&(a=":not("+a+")");return b.length===1?f.find.matchesSelector(b[0],a)?[b[0]]:[]:f.find.matches(a,b)},dir:function(a,c,d){var e=[],g=a[c];while(g&&g.nodeType!==9&&(d===b||g.nodeType!==1||!f(g).is(d)))g.nodeType===1&&e.push(g),g=g[c];return e},nth:function(a,b,c,d){b=b||1;var e=0;for(;a;a=a[c])if(a.nodeType===1&&++e===b)break;return a},sibling:function(a,b){var c=[];for(;a;a=a.nextSibling)a.nodeType===1&&a!==b&&c.push(a);return c}});var X=/ jQuery\d+="(?:\d+|null)"/g,Y=/^\s+/,Z=/<(?!area|br|col|embed|hr|img|input|link|meta|param)(([\w:]+)[^>]*)\/>/ig,$=/<([\w:]+)/,_=/<tbody/i,ba=/<|&#?\w+;/,bb=/<(?:script|object|embed|option|style)/i,bc=/checked\s*(?:[^=]|=\s*.checked.)/i,bd=/\/(java|ecma)script/i,be=/^\s*<!(?:\[CDATA\[|\-\-)/,bf={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,"",""]};bf.optgroup=bf.option,bf.tbody=bf.tfoot=bf.colgroup=bf.caption=bf.thead,bf.th=bf.td,f.support.htmlSerialize||(bf._default=[1,"div<div>","</div>"]),f.fn.extend({text:function(a){if(f.isFunction(a))return this.each(function(b){var c=f(this);c.text(a.call(this,b,c.text()))});if(typeof a!="object"&&a!==b)return this.empty().append((this[0]&&this[0].ownerDocument||c).createTextNode(a));return f.text(this)},wrapAll:function(a){if(f.isFunction(a))return this.each(function(b){f(this).wrapAll(a.call(this,b))});if(this[0]){var b=f(a,this[0].ownerDocument).eq(0).clone(!0);this[0].parentNode&&b.insertBefore(this[0]),b.map(function(){var a=this;while(a.firstChild&&a.firstChild.nodeType===1)a=a.firstChild;return a}).append(this)}return this},wrapInner:function(a){if(f.isFunction(a))return this.each(function(b){f(this).wrapInner(a.call(this,b))});return this.each(function(){var b=f(this),c=b.contents();c.length?c.wrapAll(a):b.append(a)})},wrap:function(a){return this.each(function(){f(this).wrapAll(a)})},unwrap:function(){return this.parent().each(function(){f.nodeName(this,"body")||f(this).replaceWith(this.childNodes)}).end()},append:function(){return this.domManip(arguments,!0,function(a){this.nodeType===1&&this.appendChild(a)})},prepend:function(){return this.domManip(arguments,!0,function(a){this.nodeType===1&&this.insertBefore(a,this.firstChild)})},before:function(){if(this[0]&&this[0].parentNode)return this.domManip(arguments,!1,function(a){this.parentNode.insertBefore(a,this)});if(arguments.length){var a=f(arguments[0]);a.push.apply(a,this.toArray());return this.pushStack(a,"before",arguments)}},after:function(){if(this[0]&&this[0].parentNode)return this.domManip(arguments,!1,function(a){this.parentNode.insertBefore(a,this.nextSibling)});if(arguments.length){var a=this.pushStack(this,"after",arguments);a.push.apply(a,f(arguments[0]).toArray());return a}},remove:function(a,b){for(var c=0,d;(d=this[c])!=null;c++)if(!a||f.filter(a,[d]).length)!b&&d.nodeType===1&&(f.cleanData(d.getElementsByTagName("*")),f.cleanData([d])),d.parentNode&&d.parentNode.removeChild(d);return this},empty:function(){for(var a=0,b;(b=this[a])!=null;a++){b.nodeType===1&&f.cleanData(b.getElementsByTagName("*"));while(b.firstChild)b.removeChild(b.firstChild)}return this},clone:function(a,b){a=a==null?!1:a,b=b==null?a:b;return this.map(function(){return f.clone(this,a,b)})},html:function(a){if(a===b)return this[0]&&this[0].nodeType===1?this[0].innerHTML.replace(X,""):null;if(typeof a=="string"&&!bb.test(a)&&(f.support.leadingWhitespace||!Y.test(a))&&!bf[($.exec(a)||["",""])[1].toLowerCase()]){a=a.replace(Z,"<$1></$2>");try{for(var c=0,d=this.length;c<d;c++)this[c].nodeType===1&&(f.cleanData(this[c].getElementsByTagName("*")),this[c].innerHTML=a)}catch(e){this.empty().append(a)}}else f.isFunction(a)?this.each(function(b){var c=f(this);c.html(a.call(this,b,c.html()))}):this.empty().append(a);return this},replaceWith:function(a){if(this[0]&&this[0].parentNode){if(f.isFunction(a))return this.each(function(b){var c=f(this),d=c.html();c.replaceWith(a.call(this,b,d))});typeof a!="string"&&(a=f(a).detach());return this.each(function(){var b=this.nextSibling,c=this.parentNode;f(this).remove(),b?f(b).before(a):f(c).append(a)})}return this.length?this.pushStack(f(f.isFunction(a)?a():a),"replaceWith",a):this},detach:function(a){return this.remove(a,!0)},domManip:function(a,c,d){var e,g,h,i,j=a[0],k=[];if(!f.support.checkClone&&arguments.length===3&&typeof j=="string"&&bc.test(j))return this.each(function(){f(this).domManip(a,c,d,!0)});if(f.isFunction(j))return this.each(function(e){var g=f(this);a[0]=j.call(this,e,c?g.html():b),g.domManip(a,c,d)});if(this[0]){i=j&&j.parentNode,f.support.parentNode&&i&&i.nodeType===11&&i.childNodes.length===this.length?e={fragment:i}:e=f.buildFragment(a,this,k),h=e.fragment,h.childNodes.length===1?g=h=h.firstChild:g=h.firstChild;if(g){c=c&&f.nodeName(g,"tr");for(var l=0,m=this.length,n=m-1;l<m;l++)d.call(c?bg(this[l],g):this[l],e.cacheable||m>1&&l<n?f.clone(h,!0,!0):h)}k.length&&f.each(k,bm)}return this}}),f.buildFragment=function(a,b,d){var e,g,h,i;b&&b[0]&&(i=b[0].ownerDocument||b[0]),i.createDocumentFragment||(i=c),a.length===1&&typeof a[0]=="string"&&a[0].length<512&&i===c&&a[0].charAt(0)==="<"&&!bb.test(a[0])&&(f.support.checkClone||!bc.test(a[0]))&&(g=!0,h=f.fragments[a[0]],h&&h!==1&&(e=h)),e||(e=i.createDocumentFragment(),f.clean(a,i,e,d)),g&&(f.fragments[a[0]]=h?e:1);return{fragment:e,cacheable:g}},f.fragments={},f.each({appendTo:"append",prependTo:"prepend",insertBefore:"before",insertAfter:"after",replaceAll:"replaceWith"},function(a,b){f.fn[a]=function(c){var d=[],e=f(c),g=this.length===1&&this[0].parentNode;if(g&&g.nodeType===11&&g.childNodes.length===1&&e.length===1){e[b](this[0]);return this}for(var h=0,i=e.length;h<i;h++){var j=(h>0?this.clone(!0):this).get();f(e[h])[b](j),d=d.concat(j
+)}return this.pushStack(d,a,e.selector)}}),f.extend({clone:function(a,b,c){var d=a.cloneNode(!0),e,g,h;if((!f.support.noCloneEvent||!f.support.noCloneChecked)&&(a.nodeType===1||a.nodeType===11)&&!f.isXMLDoc(a)){bi(a,d),e=bj(a),g=bj(d);for(h=0;e[h];++h)bi(e[h],g[h])}if(b){bh(a,d);if(c){e=bj(a),g=bj(d);for(h=0;e[h];++h)bh(e[h],g[h])}}e=g=null;return d},clean:function(a,b,d,e){var g;b=b||c,typeof b.createElement=="undefined"&&(b=b.ownerDocument||b[0]&&b[0].ownerDocument||c);var h=[],i;for(var j=0,k;(k=a[j])!=null;j++){typeof k=="number"&&(k+="");if(!k)continue;if(typeof k=="string")if(!ba.test(k))k=b.createTextNode(k);else{k=k.replace(Z,"<$1></$2>");var l=($.exec(k)||["",""])[1].toLowerCase(),m=bf[l]||bf._default,n=m[0],o=b.createElement("div");o.innerHTML=m[1]+k+m[2];while(n--)o=o.lastChild;if(!f.support.tbody){var p=_.test(k),q=l==="table"&&!p?o.firstChild&&o.firstChild.childNodes:m[1]==="<table>"&&!p?o.childNodes:[];for(i=q.length-1;i>=0;--i)f.nodeName(q[i],"tbody")&&!q[i].childNodes.length&&q[i].parentNode.removeChild(q[i])}!f.support.leadingWhitespace&&Y.test(k)&&o.insertBefore(b.createTextNode(Y.exec(k)[0]),o.firstChild),k=o.childNodes}var r;if(!f.support.appendChecked)if(k[0]&&typeof (r=k.length)=="number")for(i=0;i<r;i++)bl(k[i]);else bl(k);k.nodeType?h.push(k):h=f.merge(h,k)}if(d){g=function(a){return!a.type||bd.test(a.type)};for(j=0;h[j];j++)if(e&&f.nodeName(h[j],"script")&&(!h[j].type||h[j].type.toLowerCase()==="text/javascript"))e.push(h[j].parentNode?h[j].parentNode.removeChild(h[j]):h[j]);else{if(h[j].nodeType===1){var s=f.grep(h[j].getElementsByTagName("script"),g);h.splice.apply(h,[j+1,0].concat(s))}d.appendChild(h[j])}}return h},cleanData:function(a){var b,c,d=f.cache,e=f.expando,g=f.event.special,h=f.support.deleteExpando;for(var i=0,j;(j=a[i])!=null;i++){if(j.nodeName&&f.noData[j.nodeName.toLowerCase()])continue;c=j[f.expando];if(c){b=d[c]&&d[c][e];if(b&&b.events){for(var k in b.events)g[k]?f.event.remove(j,k):f.removeEvent(j,k,b.handle);b.handle&&(b.handle.elem=null)}h?delete j[f.expando]:j.removeAttribute&&j.removeAttribute(f.expando),delete d[c]}}}});var bn=/alpha\([^)]*\)/i,bo=/opacity=([^)]*)/,bp=/([A-Z]|^ms)/g,bq=/^-?\d+(?:px)?$/i,br=/^-?\d/,bs=/^[+\-]=/,bt=/[^+\-\.\de]+/g,bu={position:"absolute",visibility:"hidden",display:"block"},bv=["Left","Right"],bw=["Top","Bottom"],bx,by,bz;f.fn.css=function(a,c){if(arguments.length===2&&c===b)return this;return f.access(this,a,c,!0,function(a,c,d){return d!==b?f.style(a,c,d):f.css(a,c)})},f.extend({cssHooks:{opacity:{get:function(a,b){if(b){var c=bx(a,"opacity","opacity");return c===""?"1":c}return a.style.opacity}}},cssNumber:{fillOpacity:!0,fontWeight:!0,lineHeight:!0,opacity:!0,orphans:!0,widows:!0,zIndex:!0,zoom:!0},cssProps:{"float":f.support.cssFloat?"cssFloat":"styleFloat"},style:function(a,c,d,e){if(!!a&&a.nodeType!==3&&a.nodeType!==8&&!!a.style){var g,h,i=f.camelCase(c),j=a.style,k=f.cssHooks[i];c=f.cssProps[i]||i;if(d===b){if(k&&"get"in k&&(g=k.get(a,!1,e))!==b)return g;return j[c]}h=typeof d;if(h==="number"&&isNaN(d)||d==null)return;h==="string"&&bs.test(d)&&(d=+d.replace(bt,"")+parseFloat(f.css(a,c)),h="number"),h==="number"&&!f.cssNumber[i]&&(d+="px");if(!k||!("set"in k)||(d=k.set(a,d))!==b)try{j[c]=d}catch(l){}}},css:function(a,c,d){var e,g;c=f.camelCase(c),g=f.cssHooks[c],c=f.cssProps[c]||c,c==="cssFloat"&&(c="float");if(g&&"get"in g&&(e=g.get(a,!0,d))!==b)return e;if(bx)return bx(a,c)},swap:function(a,b,c){var d={};for(var e in b)d[e]=a.style[e],a.style[e]=b[e];c.call(a);for(e in b)a.style[e]=d[e]}}),f.curCSS=f.css,f.each(["height","width"],function(a,b){f.cssHooks[b]={get:function(a,c,d){var e;if(c){if(a.offsetWidth!==0)return bA(a,b,d);f.swap(a,bu,function(){e=bA(a,b,d)});return e}},set:function(a,b){if(!bq.test(b))return b;b=parseFloat(b);if(b>=0)return b+"px"}}}),f.support.opacity||(f.cssHooks.opacity={get:function(a,b){return bo.test((b&&a.currentStyle?a.currentStyle.filter:a.style.filter)||"")?parseFloat(RegExp.$1)/100+"":b?"1":""},set:function(a,b){var c=a.style,d=a.currentStyle;c.zoom=1;var e=f.isNaN(b)?"":"alpha(opacity="+b*100+")",g=d&&d.filter||c.filter||"";c.filter=bn.test(g)?g.replace(bn,e):g+" "+e}}),f(function(){f.support.reliableMarginRight||(f.cssHooks.marginRight={get:function(a,b){var c;f.swap(a,{display:"inline-block"},function(){b?c=bx(a,"margin-right","marginRight"):c=a.style.marginRight});return c}})}),c.defaultView&&c.defaultView.getComputedStyle&&(by=function(a,c){var d,e,g;c=c.replace(bp,"-$1").toLowerCase();if(!(e=a.ownerDocument.defaultView))return b;if(g=e.getComputedStyle(a,null))d=g.getPropertyValue(c),d===""&&!f.contains(a.ownerDocument.documentElement,a)&&(d=f.style(a,c));return d}),c.documentElement.currentStyle&&(bz=function(a,b){var c,d=a.currentStyle&&a.currentStyle[b],e=a.runtimeStyle&&a.runtimeStyle[b],f=a.style;!bq.test(d)&&br.test(d)&&(c=f.left,e&&(a.runtimeStyle.left=a.currentStyle.left),f.left=b==="fontSize"?"1em":d||0,d=f.pixelLeft+"px",f.left=c,e&&(a.runtimeStyle.left=e));return d===""?"auto":d}),bx=by||bz,f.expr&&f.expr.filters&&(f.expr.filters.hidden=function(a){var b=a.offsetWidth,c=a.offsetHeight;return b===0&&c===0||!f.support.reliableHiddenOffsets&&(a.style.display||f.css(a,"display"))==="none"},f.expr.filters.visible=function(a){return!f.expr.filters.hidden(a)});var bB=/%20/g,bC=/\[\]$/,bD=/\r?\n/g,bE=/#.*$/,bF=/^(.*?):[ \t]*([^\r\n]*)\r?$/mg,bG=/^(?:color|date|datetime|email|hidden|month|number|password|range|search|tel|text|time|url|week)$/i,bH=/^(?:about|app|app\-storage|.+\-extension|file|widget):$/,bI=/^(?:GET|HEAD)$/,bJ=/^\/\//,bK=/\?/,bL=/<script\b[^<]*(?:(?!<\/script>)<[^<]*)*<\/script>/gi,bM=/^(?:select|textarea)/i,bN=/\s+/,bO=/([?&])_=[^&]*/,bP=/^([\w\+\.\-]+:)(?:\/\/([^\/?#:]*)(?::(\d+))?)?/,bQ=f.fn.load,bR={},bS={},bT,bU;try{bT=e.href}catch(bV){bT=c.createElement("a"),bT.href="",bT=bT.href}bU=bP.exec(bT.toLowerCase())||[],f.fn.extend({load:function(a,c,d){if(typeof a!="string"&&bQ)return bQ.apply(this,arguments);if(!this.length)return this;var e=a.indexOf(" ");if(e>=0){var g=a.slice(e,a.length);a=a.slice(0,e)}var h="GET";c&&(f.isFunction(c)?(d=c,c=b):typeof c=="object"&&(c=f.param(c,f.ajaxSettings.traditional),h="POST"));var i=this;f.ajax({url:a,type:h,dataType:"html",data:c,complete:function(a,b,c){c=a.responseText,a.isResolved()&&(a.done(function(a){c=a}),i.html(g?f("<div>").append(c.replace(bL,"")).find(g):c)),d&&i.each(d,[c,b,a])}});return this},serialize:function(){return f.param(this.serializeArray())},serializeArray:function(){return this.map(function(){return this.elements?f.makeArray(this.elements):this}).filter(function(){return this.name&&!this.disabled&&(this.checked||bM.test(this.nodeName)||bG.test(this.type))}).map(function(a,b){var c=f(this).val();return c==null?null:f.isArray(c)?f.map(c,function(a,c){return{name:b.name,value:a.replace(bD,"\r\n")}}):{name:b.name,value:c.replace(bD,"\r\n")}}).get()}}),f.each("ajaxStart ajaxStop ajaxComplete ajaxError ajaxSuccess ajaxSend".split(" "),function(a,b){f.fn[b]=function(a){return this.bind(b,a)}}),f.each(["get","post"],function(a,c){f[c]=function(a,d,e,g){f.isFunction(d)&&(g=g||e,e=d,d=b);return f.ajax({type:c,url:a,data:d,success:e,dataType:g})}}),f.extend({getScript:function(a,c){return f.get(a,b,c,"script")},getJSON:function(a,b,c){return f.get(a,b,c,"json")},ajaxSetup:function(a,b){b?f.extend(!0,a,f.ajaxSettings,b):(b=a,a=f.extend(!0,f.ajaxSettings,b));for(var c in{context:1,url:1})c in b?a[c]=b[c]:c in f.ajaxSettings&&(a[c]=f.ajaxSettings[c]);return a},ajaxSettings:{url:bT,isLocal:bH.test(bU[1]),global:!0,type:"GET",contentType:"application/x-www-form-urlencoded",processData:!0,async:!0,accepts:{xml:"application/xml, text/xml",html:"text/html",text:"text/plain",json:"application/json, text/javascript","*":"*/*"},contents:{xml:/xml/,html:/html/,json:/json/},responseFields:{xml:"responseXML",text:"responseText"},converters:{"* text":a.String,"text html":!0,"text json":f.parseJSON,"text xml":f.parseXML}},ajaxPrefilter:bW(bR),ajaxTransport:bW(bS),ajax:function(a,c){function w(a,c,l,m){if(s!==2){s=2,q&&clearTimeout(q),p=b,n=m||"",v.readyState=a?4:0;var o,r,u,w=l?bZ(d,v,l):b,x,y;if(a>=200&&a<300||a===304){if(d.ifModified){if(x=v.getResponseHeader("Last-Modified"))f.lastModified[k]=x;if(y=v.getResponseHeader("Etag"))f.etag[k]=y}if(a===304)c="notmodified",o=!0;else try{r=b$(d,w),c="success",o=!0}catch(z){c="parsererror",u=z}}else{u=c;if(!c||a)c="error",a<0&&(a=0)}v.status=a,v.statusText=c,o?h.resolveWith(e,[r,c,v]):h.rejectWith(e,[v,c,u]),v.statusCode(j),j=b,t&&g.trigger("ajax"+(o?"Success":"Error"),[v,d,o?r:u]),i.resolveWith(e,[v,c]),t&&(g.trigger("ajaxComplete",[v,d]),--f.active||f.event.trigger("ajaxStop"))}}typeof a=="object"&&(c=a,a=b),c=c||{};var d=f.ajaxSetup({},c),e=d.context||d,g=e!==d&&(e.nodeType||e instanceof f)?f(e):f.event,h=f.Deferred(),i=f._Deferred(),j=d.statusCode||{},k,l={},m={},n,o,p,q,r,s=0,t,u,v={readyState:0,setRequestHeader:function(a,b){if(!s){var c=a.toLowerCase();a=m[c]=m[c]||a,l[a]=b}return this},getAllResponseHeaders:function(){return s===2?n:null},getResponseHeader:function(a){var c;if(s===2){if(!o){o={};while(c=bF.exec(n))o[c[1].toLowerCase()]=c[2]}c=o[a.toLowerCase()]}return c===b?null:c},overrideMimeType:function(a){s||(d.mimeType=a);return this},abort:function(a){a=a||"abort",p&&p.abort(a),w(0,a);return this}};h.promise(v),v.success=v.done,v.error=v.fail,v.complete=i.done,v.statusCode=function(a){if(a){var b;if(s<2)for(b in a)j[b]=[j[b],a[b]];else b=a[v.status],v.then(b,b)}return this},d.url=((a||d.url)+"").replace(bE,"").replace(bJ,bU[1]+"//"),d.dataTypes=f.trim(d.dataType||"*").toLowerCase().split(bN),d.crossDomain==null&&(r=bP.exec(d.url.toLowerCase()),d.crossDomain=!(!r||r[1]==bU[1]&&r[2]==bU[2]&&(r[3]||(r[1]==="http:"?80:443))==(bU[3]||(bU[1]==="http:"?80:443)))),d.data&&d.processData&&typeof d.data!="string"&&(d.data=f.param(d.data,d.traditional)),bX(bR,d,c,v);if(s===2)return!1;t=d.global,d.type=d.type.toUpperCase(),d.hasContent=!bI.test(d.type),t&&f.active++===0&&f.event.trigger("ajaxStart");if(!d.hasContent){d.data&&(d.url+=(bK.test(d.url)?"&":"?")+d.data),k=d.url;if(d.cache===!1){var x=f.now(),y=d.url.replace(bO,"$1_="+x);d.url=y+(y===d.url?(bK.test(d.url)?"&":"?")+"_="+x:"")}}(d.data&&d.hasContent&&d.contentType!==!1||c.contentType)&&v.setRequestHeader("Content-Type",d.contentType),d.ifModified&&(k=k||d.url,f.lastModified[k]&&v.setRequestHeader("If-Modified-Since",f.lastModified[k]),f.etag[k]&&v.setRequestHeader("If-None-Match",f.etag[k])),v.setRequestHeader("Accept",d.dataTypes[0]&&d.accepts[d.dataTypes[0]]?d.accepts[d.dataTypes[0]]+(d.dataTypes[0]!=="*"?", */*; q=0.01":""):d.accepts["*"]);for(u in d.headers)v.setRequestHeader(u,d.headers[u]);if(d.beforeSend&&(d.beforeSend.call(e,v,d)===!1||s===2)){v.abort();return!1}for(u in{success:1,error:1,complete:1})v[u](d[u]);p=bX(bS,d,c,v);if(!p)w(-1,"No Transport");else{v.readyState=1,t&&g.trigger("ajaxSend",[v,d]),d.async&&d.timeout>0&&(q=setTimeout(function(){v.abort("timeout")},d.timeout));try{s=1,p.send(l,w)}catch(z){status<2?w(-1,z):f.error(z)}}return v},param:function(a,c){var d=[],e=function(a,b){b=f.isFunction(b)?b():b,d[d.length]=encodeURIComponent(a)+"="+encodeURIComponent(b)};c===b&&(c=f.ajaxSettings.traditional);if(f.isArray(a)||a.jquery&&!f.isPlainObject(a))f.each(a,function(){e(this.name,this.value)});else for(var g in a)bY(g,a[g],c,e);return d.join("&").replace(bB,"+")}}),f.extend({active:0,lastModified:{},etag:{}});var b_=f.now(),ca=/(\=)\?(&|$)|\?\?/i;f.ajaxSetup({jsonp:"callback",jsonpCallback:function(){return f.expando+"_"+b_++}}),f.ajaxPrefilter("json jsonp",function(b,c,d){var e=b.contentType==="application/x-www-form-urlencoded"&&typeof b.data=="string";if(b.dataTypes[0]==="jsonp"||b.jsonp!==!1&&(ca.test(b.url)||e&&ca.test(b.data))){var g,h=b.jsonpCallback=f.isFunction(b.jsonpCallback)?b.jsonpCallback():b.jsonpCallback,i=a[h],j=b.url,k=b.data,l="$1"+h+"$2";b.jsonp!==!1&&(j=j.replace(ca,l),b.url===j&&(e&&(k=k.replace(ca,l)),b.data===k&&(j+=(/\?/.test(j)?"&":"?")+b.jsonp+"="+h))),b.url=j,b.data=k,a[h]=function(a){g=[a]},d.always(function(){a[h]=i,g&&f.isFunction(i)&&a[h](g[0])}),b.converters["script json"]=function(){g||f.error(h+" was not called");return g[0]},b.dataTypes[0]="json";return"script"}}),f.ajaxSetup({accepts:{script:"text/javascript, application/javascript, application/ecmascript, application/x-ecmascript"},contents:{script:/javascript|ecmascript/},converters:{"text script":function(a){f.globalEval(a);return a}}}),f.ajaxPrefilter("script",function(a){a.cache===b&&(a.cache=!1),a.crossDomain&&(a.type="GET",a.global=!1)}),f.ajaxTransport("script",function(a){if(a.crossDomain){var d,e=c.head||c.getElementsByTagName("head")[0]||c.documentElement;return{send:function(f,g){d=c.createElement("script"),d.async="async",a.scriptCharset&&(d.charset=a.scriptCharset),d.src=a.url,d.onload=d.onreadystatechange=function(a,c){if(c||!d.readyState||/loaded|complete/.test(d.readyState))d.onload=d.onreadystatechange=null,e&&d.parentNode&&e.removeChild(d),d=b,c||g(200,"success")},e.insertBefore(d,e.firstChild)},abort:function(){d&&d.onload(0,1)}}}});var cb=a.ActiveXObject?function(){for(var a in cd)cd[a](0,1)}:!1,cc=0,cd;f.ajaxSettings.xhr=a.ActiveXObject?function(){return!this.isLocal&&ce()||cf()}:ce,function(a){f.extend(f.support,{ajax:!!a,cors:!!a&&"withCredentials"in a})}(f.ajaxSettings.xhr()),f.support.ajax&&f.ajaxTransport(function(c){if(!c.crossDomain||f.support.cors){var d;return{send:function(e,g){var h=c.xhr(),i,j;c.username?h.open(c.type,c.url,c.async,c.username,c.password):h.open(c.type,c.url,c.async);if(c.xhrFields)for(j in c.xhrFields)h[j]=c.xhrFields[j];c.mimeType&&h.overrideMimeType&&h.overrideMimeType(c.mimeType),!c.crossDomain&&!e["X-Requested-With"]&&(e["X-Requested-With"]="XMLHttpRequest");try{for(j in e)h.setRequestHeader(j,e[j])}catch(k){}h.send(c.hasContent&&c.data||null),d=function(a,e){var j,k,l,m,n;try{if(d&&(e||h.readyState===4)){d=b,i&&(h.onreadystatechange=f.noop,cb&&delete cd[i]);if(e)h.readyState!==4&&h.abort();else{j=h.status,l=h.getAllResponseHeaders(),m={},n=h.responseXML,n&&n.documentElement&&(m.xml=n),m.text=h.responseText;try{k=h.statusText}catch(o){k=""}!j&&c.isLocal&&!c.crossDomain?j=m.text?200:404:j===1223&&(j=204)}}}catch(p){e||g(-1,p)}m&&g(j,k,m,l)},!c.async||h.readyState===4?d():(i=++cc,cb&&(cd||(cd={},f(a).unload(cb)),cd[i]=d),h.onreadystatechange=d)},abort:function(){d&&d(0,1)}}}});var cg={},ch,ci,cj=/^(?:toggle|show|hide)$/,ck=/^([+\-]=)?([\d+.\-]+)([a-z%]*)$/i,cl,cm=[["height","marginTop","marginBottom","paddingTop","paddingBottom"],["width","marginLeft","marginRight","paddingLeft","paddingRight"],["opacity"]],cn,co=a.webkitRequestAnimationFrame||a.mozRequestAnimationFrame||a.oRequestAnimationFrame;f.fn.extend({show:function(a,b,c){var d,e;if(a||a===0)return this.animate(cr("show",3),a,b,c);for(var g=0,h=this.length;g<h;g++)d=this[g],d.style&&(e=d.style.display,!f._data(d,"olddisplay")&&e==="none"&&(e=d.style.display=""),e===""&&f.css(d,"display")==="none"&&f._data(d,"olddisplay",cs(d.nodeName)));for(g=0;g<h;g++){d=this[g];if(d.style){e=d.style.display;if(e===""||e==="none")d.style.display=f._data(d,"olddisplay")||""}}return this},hide:function(a,b,c){if(a||a===0)return this.animate(cr("hide",3),a,b,c);for(var d=0,e=this.length;d<e;d++)if(this[d].style){var g=f.css(this[d],"display");g!=="none"&&!f._data(this[d],"olddisplay")&&f._data(this[d],"olddisplay",g)}for(d=0;d<e;d++)this[d].style&&(this[d].style.display="none");return this},_toggle:f.fn.toggle,toggle:function(a,b,c){var d=typeof a=="boolean";f.isFunction(a)&&f.isFunction(b)?this._toggle.apply(this,arguments):a==null||d?this.each(function(){var b=d?a:f(this).is(":hidden");f(this)[b?"show":"hide"]()}):this.animate(cr("toggle",3),a,b,c);return this},fadeTo:function(a,b,c,d){return this.filter(":hidden").css("opacity",0).show().end().animate({opacity:b},a,c,d)},animate:function(a,b,c,d){var e=f.speed(b,c,d);if(f.isEmptyObject(a))return this.each(e.complete,[!1]);a=f.extend({},a);return this[e.queue===!1?"each":"queue"](function(){e.queue===!1&&f._mark(this);var b=f.extend({},e),c=this.nodeType===1,d=c&&f(this).is(":hidden"),g,h,i,j,k,l,m,n,o;b.animatedProperties={};for(i in a){g=f.camelCase(i),i!==g&&(a[g]=a[i],delete a[i]),h=a[g],f.isArray(h)?(b.animatedProperties[g]=h[1],h=a[g]=h[0]):b.animatedProperties[g]=b.specialEasing&&b.specialEasing[g]||b.easing||"swing";if(h==="hide"&&d||h==="show"&&!d)return b.complete.call(this);c&&(g==="height"||g==="width")&&(b.overflow=[this.style.overflow,this.style.overflowX,this.style.overflowY],f.css(this,"display")==="inline"&&f.css(this,"float")==="none"&&(f.support.inlineBlockNeedsLayout?(j=cs(this.nodeName),j==="inline"?this.style.display="inline-block":(this.style.display="inline",this.style.zoom=1)):this.style.display="inline-block"))}b.overflow!=null&&(this.style.overflow="hidden");for(i in a)k=new f.fx(this,b,i),h=a[i],cj.test(h)?k[h==="toggle"?d?"show":"hide":h]():(l=ck.exec(h),m=k.cur(),l?(n=parseFloat(l[2]),o=l[3]||(f.cssNumber[i]?"":"px"),o!=="px"&&(f.style(this,i,(n||1)+o),m=(n||1)/k.cur()*m,f.style(this,i,m+o)),l[1]&&(n=(l[1]==="-="?-1:1)*n+m),k.custom(m,n,o)):k.custom(m,h,""));return!0})},stop:function(a,b){a&&this.queue([]),this.each(function(){var a=f.timers,c=a.length;b||f._unmark(!0,this);while(c--)a[c].elem===this&&(b&&a[c](!0),a.splice(c,1))}),b||this.dequeue();return this}}),f.each({slideDown:cr("show",1),slideUp:cr("hide",1),slideToggle:cr("toggle",1),fadeIn:{opacity:"show"},fadeOut:{opacity:"hide"},fadeToggle:{opacity:"toggle"}},function(a,b){f.fn[a]=function(a,c,d){return this.animate(b,a,c,d)}}),f.extend({speed:function(a,b,c){var d=a&&typeof a=="object"?f.extend({},a):{complete:c||!c&&b||f.isFunction(a)&&a,duration:a,easing:c&&b||b&&!f.isFunction(b)&&b};d.duration=f.fx.off?0:typeof d.duration=="number"?d.duration:d.duration in f.fx.speeds?f.fx.speeds[d.duration]:f.fx.speeds._default,d.old=d.complete,d.complete=function(a){f.isFunction(d.old)&&d.old.call(this),d.queue!==!1?f.dequeue(this):a!==!1&&f._unmark(this)};return d},easing:{linear:function(a,b,c,d){return c+d*a},swing:function(a,b,c,d){return(-Math.cos(a*Math.PI)/2+.5)*d+c}},timers:[],fx:function(a,b,c){this.options=b,this.elem=a,this.prop=c,b.orig=b.orig||{}}}),f.fx.prototype={update:function(){this.options.step&&this.options.step.call(this.elem,this.now,this),(f.fx.step[this.prop]||f.fx.step._default)(this)},cur:function(){if(this.elem[this.prop]!=null&&(!this.elem.style||this.elem.style[this.prop]==null))return this.elem[this.prop];var a,b=f.css(this.elem,this.prop);return isNaN(a=parseFloat(b))?!b||b==="auto"?0:b:a},custom:function(a,b,c){function h(a){return d.step(a)}var d=this,e=f.fx,g;this.startTime=cn||cp(),this.start=a,this.end=b,this.unit=c||this.unit||(f.cssNumber[this.prop]?"":"px"),this.now=this.start,this.pos=this.state=0,h.elem=this.elem,h()&&f.timers.push(h)&&!cl&&(co?(cl=!0,g=function(){cl&&(co(g),e.tick())},co(g)):cl=setInterval(e.tick,e.interval))},show:function(){this.options.orig[this.prop]=f.style(this.elem,this.prop),this.options.show=!0,this.custom(this.prop==="width"||this.prop==="height"?1:0,this.cur()),f(this.elem).show()},hide:function(){this.options.orig[this.prop]=f.style(this.elem,this.prop),this.options.hide=!0,this.custom(this.cur(),0)},step:function(a){var b=cn||cp(),c=!0,d=this.elem,e=this.options,g,h;if(a||b>=e.duration+this.startTime){this.now=this.end,this.pos=this.state=1,this.update(),e.animatedProperties[this.prop]=!0;for(g in e.animatedProperties)e.animatedProperties[g]!==!0&&(c=!1);if(c){e.overflow!=null&&!f.support.shrinkWrapBlocks&&f.each(["","X","Y"],function(a,b){d.style["overflow"+b]=e.overflow[a]}),e.hide&&f(d).hide();if(e.hide||e.show)for(var i in e.animatedProperties)f.style(d,i,e.orig[i]);e.complete.call(d)}return!1}e.duration==Infinity?this.now=b:(h=b-this.startTime,this.state=h/e.duration,this.pos=f.easing[e.animatedProperties[this.prop]](this.state,h,0,1,e.duration),this.now=this.start+(this.end-this.start)*this.pos),this.update();return!0}},f.extend(f.fx,{tick:function(){for(var a=f.timers,b=0;b<a.length;++b)a[b]()||a.splice(b--,1);a.length||f.fx.stop()},interval:13,stop:function(){clearInterval(cl),cl=null},speeds:{slow:600,fast:200,_default:400},step:{opacity:function(a){f.style(a.elem,"opacity",a.now)},_default:function(a){a.elem.style&&a.elem.style[a.prop]!=null?a.elem.style[a.prop]=(a.prop==="width"||a.prop==="height"?Math.max(0,a.now):a.now)+a.unit:a.elem[a.prop]=a.now}}}),f.expr&&f.expr.filters&&(f.expr.filters.animated=function(a){return f.grep(f.timers,function(b){return a===b.elem}).length});var ct=/^t(?:able|d|h)$/i,cu=/^(?:body|html)$/i;"getBoundingClientRect"in c.documentElement?f.fn.offset=function(a){var b=this[0],c;if(a)return this.each(function(b){f.offset.setOffset(this,a,b)});if(!b||!b.ownerDocument)return null;if(b===b.ownerDocument.body)return f.offset.bodyOffset(b);try{c=b.getBoundingClientRect()}catch(d){}var e=b.ownerDocument,g=e.documentElement;if(!c||!f.contains(g,b))return c?{top:c.top,left:c.left}:{top:0,left:0};var h=e.body,i=cv(e),j=g.clientTop||h.clientTop||0,k=g.clientLeft||h.clientLeft||0,l=i.pageYOffset||f.support.boxModel&&g.scrollTop||h.scrollTop,m=i.pageXOffset||f.support.boxModel&&g.scrollLeft||h.scrollLeft,n=c.top+l-j,o=c.left+m-k;return{top:n,left:o}}:f.fn.offset=function(a){var b=this[0];if(a)return this.each(function(b){f.offset.setOffset(this,a,b)});if(!b||!b.ownerDocument)return null;if(b===b.ownerDocument.body)return f.offset.bodyOffset(b);f.offset.initialize();var c,d=b.offsetParent,e=b,g=b.ownerDocument,h=g.documentElement,i=g.body,j=g.defaultView,k=j?j.getComputedStyle(b,null):b.currentStyle,l=b.offsetTop,m=b.offsetLeft;while((b=b.parentNode)&&b!==i&&b!==h){if(f.offset.supportsFixedPosition&&k.position==="fixed")break;c=j?j.getComputedStyle(b,null):b.currentStyle,l-=b.scrollTop,m-=b.scrollLeft,b===d&&(l+=b.offsetTop,m+=b.offsetLeft,f.offset.doesNotAddBorder&&(!f.offset.doesAddBorderForTableAndCells||!ct.test(b.nodeName))&&(l+=parseFloat(c.borderTopWidth)||0,m+=parseFloat(c.borderLeftWidth)||0),e=d,d=b.offsetParent),f.offset.subtractsBorderForOverflowNotVisible&&c.overflow!=="visible"&&(l+=parseFloat(c.borderTopWidth)||0,m+=parseFloat(c.borderLeftWidth)||0),k=c}if(k.position==="relative"||k.position==="static")l+=i.offsetTop,m+=i.offsetLeft;f.offset.supportsFixedPosition&&k.position==="fixed"&&(l+=Math.max(h.scrollTop,i.scrollTop),m+=Math.max(h.scrollLeft,i.scrollLeft));return{top:l,left:m}},f.offset={initialize:function(){var a=c.body,b=c.createElement("div"),d,e,g,h,i=parseFloat(f.css(a,"marginTop"))||0,j="<div style='position:absolute;top:0;left:0;margin:0;border:5px solid #000;padding:0;width:1px;height:1px;'><div></div></div><table style='position:absolute;top:0;left:0;margin:0;border:5px solid #000;padding:0;width:1px;height:1px;' cellpadding='0' cellspacing='0'><tr><td></td></tr></table>";f.extend(b.style,{position:"absolute",top:0,left:0,margin:0,border:0,width:"1px",height:"1px",visibility:"hidden"}),b.innerHTML=j,a.insertBefore(b,a.firstChild),d=b.firstChild,e=d.firstChild,h=d.nextSibling.firstChild.firstChild,this.doesNotAddBorder=e.offsetTop!==5,this.doesAddBorderForTableAndCells=h.offsetTop===5,e.style.position="fixed",e.style.top="20px",this.supportsFixedPosition=e.offsetTop===20||e.offsetTop===15,e.style.position=e.style.top="",d.style.overflow="hidden",d.style.position="relative",this.subtractsBorderForOverflowNotVisible=e.offsetTop===-5,this.doesNotIncludeMarginInBodyOffset=a.offsetTop!==i,a.removeChild(b),f.offset.initialize=f.noop},bodyOffset:function(a){var b=a.offsetTop,c=a.offsetLeft;f.offset.initialize(),f.offset.doesNotIncludeMarginInBodyOffset&&(b+=parseFloat(f.css(a,"marginTop"))||0,c+=parseFloat(f.css(a,"marginLeft"))||0);return{top:b,left:c}},setOffset:function(a,b,c){var d=f.css(a,"position");d==="static"&&(a.style.position="relative");var e=f(a),g=e.offset(),h=f.css(a,"top"),i=f.css(a,"left"),j=(d==="absolute"||d==="fixed")&&f.inArray("auto",[h,i])>-1,k={},l={},m,n;j?(l=e.position(),m=l.top,n=l.left):(m=parseFloat(h)||0,n=parseFloat(i)||0),f.isFunction(b)&&(b=b.call(a,c,g)),b.top!=null&&(k.top=b.top-g.top+m),b.left!=null&&(k.left=b.left-g.left+n),"using"in b?b.using.call(a,k):e.css(k)}},f.fn.extend({position:function(){if(!this[0])return null;var a=this[0],b=this.offsetParent(),c=this.offset(),d=cu.test(b[0].nodeName)?{top:0,left:0}:b.offset();c.top-=parseFloat(f.css(a,"marginTop"))||0,c.left-=parseFloat(f.css(a,"marginLeft"))||0,d.top+=parseFloat(f.css(b[0],"borderTopWidth"))||0,d.left+=parseFloat(f.css(b[0],"borderLeftWidth"))||0;return{top:c.top-d.top,left:c.left-d.left}},offsetParent:function(){return this.map(function(){var a=this.offsetParent||c.body;while(a&&!cu.test(a.nodeName)&&f.css(a,"position")==="static")a=a.offsetParent;return a})}}),f.each(["Left","Top"],function(a,c){var d="scroll"+c;f.fn[d]=function(c){var e,g;if(c===b){e=this[0];if(!e)return null;g=cv(e);return g?"pageXOffset"in g?g[a?"pageYOffset":"pageXOffset"]:f.support.boxModel&&g.document.documentElement[d]||g.document.body[d]:e[d]}return this.each(function(){g=cv(this),g?g.scrollTo(a?f(g).scrollLeft():c,a?c:f(g).scrollTop()):this[d]=c})}}),f.each(["Height","Width"],function(a,c){var d=c.toLowerCase();f.fn["inner"+c]=function(){var a=this[0];return a&&a.style?parseFloat(f.css(a,d,"padding")):null},f.fn["outer"+c]=function(a){var b=this[0];return b&&b.style?parseFloat(f.css(b,d,a?"margin":"border")):null},f.fn[d]=function(a){var e=this[0];if(!e)return a==null?null:this;if(f.isFunction(a))return this.each(function(b){var c=f(this);c[d](a.call(this,b,c[d]()))});if(f.isWindow(e)){var g=e.document.documentElement["client"+c];return e.document.compatMode==="CSS1Compat"&&g||e.document.body["client"+c]||g}if(e.nodeType===9)return Math.max(e.documentElement["client"+c],e.body["scroll"+c],e.documentElement["scroll"+c],e.body["offset"+c],e.documentElement["offset"+c]);if(a===b){var h=f.css(e,d),i=parseFloat(h);return f.isNaN(i)?h:i}return this.css(d,typeof a=="string"?a:a+"px")}}),a.jQuery=a.$=f})(window); \ No newline at end of file
diff --git a/lib/scripts/jquery/update.sh b/lib/scripts/jquery/update.sh
new file mode 100755
index 000000000..38f38bece
--- /dev/null
+++ b/lib/scripts/jquery/update.sh
@@ -0,0 +1,25 @@
+#!/bin/sh
+#
+# This script loads the latest jQuery and jQuery-UI 1.* versions from Google's CDN
+#
+# It also loads the 'smoothness' jQuery-UI theme and all referenced images.
+#
+# @author Andreas Gohr <andi@splitbrain.org>
+# @link https://code.google.com/apis/libraries/devguide.html#jquery
+
+# load jQuery
+wget -nv https://ajax.googleapis.com/ajax/libs/jquery/1/jquery.min.js -O jquery.min.js
+wget -nv https://ajax.googleapis.com/ajax/libs/jquery/1/jquery.js -O jquery.js
+
+# load jQuery-UI
+wget -nv https://ajax.googleapis.com/ajax/libs/jqueryui/1/jquery-ui.min.js -O jquery-ui.min.js
+wget -nv https://ajax.googleapis.com/ajax/libs/jqueryui/1/jquery-ui.js -O jquery-ui.js
+
+# load the smoothness theme
+mkdir -p jquery-ui-theme/images
+wget -nv https://ajax.googleapis.com/ajax/libs/jqueryui/1/themes/smoothness/jquery-ui.css -O jquery-ui-theme/smoothness.css
+images=`gawk 'match($0, /url\((images\/[^\)]+)\)/, m) { print m[1] }' jquery-ui-theme/smoothness.css`
+for img in $images
+do
+ wget -nv https://ajax.googleapis.com/ajax/libs/jqueryui/1/themes/smoothness/$img -O jquery-ui-theme/$img
+done
diff --git a/lib/scripts/linkwiz.js b/lib/scripts/linkwiz.js
index fec43ad5e..83653c9bb 100644
--- a/lib/scripts/linkwiz.js
+++ b/lib/scripts/linkwiz.js
@@ -1,58 +1,60 @@
+/*jslint sloppy: true, indent: 4, white: true, browser: true, eqeq: true */
+/*global jQuery, DOKU_BASE, LANG, DOKU_UHC, getSelection, pasteText */
+
+
/**
* The Link Wizard
*
* @author Andreas Gohr <gohr@cosmocode.de>
+ * @author Pierre Spring <pierre.spring@caillou.ch>
*/
-var linkwiz = {
- wiz: null,
- entry: null,
+var dw_linkwiz = {
+ $wiz: null,
+ entry: null,
result: null,
- timer: null,
- sack: null,
+ timer: null,
textArea: null,
- selected: -1,
+ selected: null,
selection: null,
/**
- * Initialize the linkwizard by creating the needed HTML
+ * Initialize the dw_linkwizard by creating the needed HTML
* and attaching the eventhandlers
*/
- init: function(textArea){
- // prepare AJAX object
- linkwiz.sack = new sack(DOKU_BASE + 'lib/exe/ajax.php');
- linkwiz.sack.AjaxFailedAlert = '';
- linkwiz.sack.encodeURIString = false;
+ init: function($editor){
+ // position relative to the text area
+ var pos = $editor.position();
// create HTML Structure
- linkwiz.wiz = document.createElement('div');
- linkwiz.wiz.id = 'link__wiz';
- linkwiz.wiz.className = 'picker';
- linkwiz.wiz.style.top = (findPosY(textArea)+20)+'px';
- linkwiz.wiz.style.left = (findPosX(textArea)+80)+'px';
- linkwiz.wiz.style.marginLeft = '-10000px';
- linkwiz.wiz.style.marginTop = '-10000px';
- linkwiz.wiz.style.position = 'absolute';
-
- linkwiz.wiz.innerHTML =
- '<div id="link__wiz_header">'+
- '<img src="'+DOKU_BASE+'lib/images/close.png" width="16" height="16" align="right" alt="" id="link__wiz_close" />'+
- LANG['linkwiz']+'</div>'+
- '<div>'+LANG['linkto']+' <input type="text" class="edit" id="link__wiz_entry" autocomplete="off" /></div>'+
- '<div id="link__wiz_result"></div>';
- $('dw__editform').parentNode.appendChild(linkwiz.wiz);
- linkwiz.textArea = textArea;
- linkwiz.result = $('link__wiz_result');
- linkwiz.entry = $('link__wiz_entry');
+ dw_linkwiz.$wiz = jQuery(document.createElement('div'))
+ .attr('id','link__wiz')
+ .css({
+ 'position': 'absolute',
+ 'top': (pos.top+20)+'px',
+ 'left': (pos.left+80)+'px',
+ 'margin-left': '-10000px',
+ 'margin-top': '-10000px'
+ })
+ .html(
+ '<div id="link__wiz_header">'+
+ '<img src="'+DOKU_BASE+'lib/images/close.png" width="16" height="16" align="right" alt="" id="link__wiz_close" />'+
+ LANG.linkwiz+'</div>'+
+ '<div>'+LANG.linkto+' <input type="text" class="edit" id="link__wiz_entry" autocomplete="off" /></div>'+
+ '<div id="link__wiz_result"></div>'
+ )
+ .addClass('picker');
+
+ $editor[0].form.parentNode.appendChild(dw_linkwiz.$wiz[0]);
+ dw_linkwiz.textArea = $editor[0];
+ dw_linkwiz.result = jQuery('#link__wiz_result')[0];
+ dw_linkwiz.entry = jQuery('#link__wiz_entry')[0];
// attach event handlers
- var obj;
- obj = $('link__wiz_close');
- obj.onclick = linkwiz.hide;
-
- linkwiz.sack.elementObj = linkwiz.result;
- addEvent(linkwiz.entry,'keyup',linkwiz.onEntry);
- addEvent(linkwiz.result,'click',linkwiz.onResultClick);
- drag.attach(linkwiz.wiz,$('link__wiz_header'));
+ jQuery('#link__wiz_close').click(dw_linkwiz.hide);
+ jQuery(dw_linkwiz.entry).keyup(dw_linkwiz.onEntry);
+ jQuery(dw_linkwiz.result).click(dw_linkwiz.onResultClick);
+
+ dw_linkwiz.$wiz.draggable({handle: '#link__wiz_header'});
},
/**
@@ -63,51 +65,50 @@ var linkwiz = {
return true; //ignore
}
if(e.keyCode == 27){
- linkwiz.hide();
+ dw_linkwiz.hide();
e.preventDefault();
e.stopPropagation();
return false;
}
if(e.keyCode == 38){ //Up
- linkwiz.select(linkwiz.selected -1);
+ dw_linkwiz.select(dw_linkwiz.selected -1);
e.preventDefault();
e.stopPropagation();
return false;
}
if(e.keyCode == 40){ //Down
- linkwiz.select(linkwiz.selected +1);
+ dw_linkwiz.select(dw_linkwiz.selected +1);
e.preventDefault();
e.stopPropagation();
return false;
}
if(e.keyCode == 13){ //Enter
- if(linkwiz.selected > -1){
- var obj = linkwiz.getResult(linkwiz.selected);
+ if(dw_linkwiz.selected > -1){
+ var obj = dw_linkwiz.getResult(dw_linkwiz.selected);
if(obj){
- var a = obj.getElementsByTagName('A')[0];
- linkwiz.resultClick(a);
+ var a = jQuery(obj).find('a')[0];
+ dw_linkwiz.resultClick(a);
}
- }else if(linkwiz.entry.value){
- linkwiz.insertLink(linkwiz.entry.value);
+ }else if(dw_linkwiz.entry.value){
+ dw_linkwiz.insertLink(dw_linkwiz.entry.value);
}
e.preventDefault();
e.stopPropagation();
return false;
}
- linkwiz.autocomplete();
+ dw_linkwiz.autocomplete();
},
/**
- * Get one of the result by index
+ * Get one of the results by index
*
* @param int result div to return
* @returns DOMObject or null
*/
getResult: function(num){
- var obj;
- var childs = linkwiz.result.getElementsByTagName('DIV');
- obj = childs[num];
+ var childs = jQuery(dw_linkwiz.result).find('div');
+ var obj = childs[num];
if(obj){
return obj;
}else{
@@ -120,29 +121,29 @@ var linkwiz = {
*/
select: function(num){
if(num < 0){
- linkwiz.deselect();
+ dw_linkwiz.deselect();
return;
}
- var obj = linkwiz.getResult(num);
+ var obj = dw_linkwiz.getResult(num);
if(obj){
- linkwiz.deselect();
+ dw_linkwiz.deselect();
obj.className += ' selected';
// make sure the item is viewable in the scroll view
// FIXME check IE compatibility
- if(obj.offsetTop > linkwiz.result.scrollTop + linkwiz.result.clientHeight){
- linkwiz.result.scrollTop += obj.clientHeight;
- }else if(obj.offsetTop - linkwiz.result.clientHeight < linkwiz.result.scrollTop){ // this works but isn't quite right, fixes welcome
- linkwiz.result.scrollTop -= obj.clientHeight;
+ if(obj.offsetTop > dw_linkwiz.result.scrollTop + dw_linkwiz.result.clientHeight){
+ dw_linkwiz.result.scrollTop += obj.clientHeight;
+ }else if(obj.offsetTop - dw_linkwiz.result.clientHeight < dw_linkwiz.result.scrollTop){ // this works but isn't quite right, fixes welcome
+ dw_linkwiz.result.scrollTop -= obj.clientHeight;
}
// now recheck - if still not in view, the user used the mouse to scroll
- if( (obj.offsetTop > linkwiz.result.scrollTop + linkwiz.result.clientHeight) ||
- (obj.offsetTop < linkwiz.result.scrollTop) ){
+ if( (obj.offsetTop > dw_linkwiz.result.scrollTop + dw_linkwiz.result.clientHeight) ||
+ (obj.offsetTop < dw_linkwiz.result.scrollTop) ){
obj.scrollIntoView();
}
- linkwiz.selected = num;
+ dw_linkwiz.selected = num;
}
},
@@ -150,13 +151,13 @@ var linkwiz = {
* deselect a result if any is selected
*/
deselect: function(){
- if(linkwiz.selected > -1){
- var obj = linkwiz.getResult(linkwiz.selected);
+ if(dw_linkwiz.selected > -1){
+ var obj = dw_linkwiz.getResult(dw_linkwiz.selected);
if(obj){
obj.className = obj.className.replace(/ ?selected/,'');
}
}
- linkwiz.selected = -1;
+ dw_linkwiz.selected = -1;
},
/**
@@ -167,7 +168,7 @@ var linkwiz = {
if(e.target.tagName != 'A') return;
e.stopPropagation();
e.preventDefault();
- linkwiz.resultClick(e.target);
+ dw_linkwiz.resultClick(e.target);
return false;
},
@@ -175,31 +176,34 @@ var linkwiz = {
* Handles the "click" on a given result anchor
*/
resultClick: function(a){
+ var L = dw_linkwiz;
var id = a.title;
if(id == '' || id.substr(id.length-1) == ':'){
- linkwiz.entry.value = id;
- linkwiz.autocomplete_exec();
+ L.entry.value = id;
+ L.autocomplete_exec();
}else{
- linkwiz.entry.value = id;
+ L.entry.value = id;
if(a.nextSibling && a.nextSibling.tagName == 'SPAN'){
- linkwiz.insertLink(a.nextSibling.innerHTML);
+ L.insertLink(a.nextSibling.innerHTML);
}else{
- linkwiz.insertLink('');
+ L.insertLink('');
}
}
},
/**
* Insert the id currently in the entry box to the textarea,
- * replacing the current selection or at the curso postion.
+ * replacing the current selection or at the cursor position.
* When no selection is available the given title will be used
* as link title instead
*/
insertLink: function(title){
- if(!linkwiz.entry.value) return;
+ var L = dw_linkwiz;
+ var E = L.entry;
+ if(!E.value) return;
- var sel = getSelection(linkwiz.textArea);
- if(sel.start == 0 && sel.end == 0) sel = linkwiz.selection;
+ var sel = getSelection(L.textArea);
+ if(sel.start == 0 && sel.end == 0) sel = L.selection;
var stxt = sel.getText();
@@ -212,22 +216,22 @@ var linkwiz = {
if(!stxt && !DOKU_UHC) stxt=title;
// prepend colon inside namespaces for non namespace pages
- if(linkwiz.textArea.form['id'].value.indexOf(':') != -1 &&
- linkwiz.entry.value.indexOf(':') == -1){
- linkwiz.entry.value = ':'+linkwiz.entry.value;
+ if(L.textArea.form['id'].value.indexOf(':') != -1 &&
+ E.value.indexOf(':') == -1){
+ E.value = ':'+E.value;
}
- var link = '[['+linkwiz.entry.value+'|';
+ var link = '[['+E.value+'|';
if(stxt) link += stxt;
link += ']]';
- var so = linkwiz.entry.value.length+3;
+ var so = E.value.length+3;
var eo = 2;
pasteText(sel,link,{startofs: so, endofs: eo});
- linkwiz.hide();
+ L.hide();
// reset the entry to the parent namespace and remove : at the beginning
- linkwiz.entry.value = linkwiz.entry.value.replace(/(^:)?[^:]*$/, '');
+ E.value = E.value.replace(/(^:)?[^:]*$/, '');
},
/**
@@ -236,60 +240,67 @@ var linkwiz = {
* Calls autocomplete_exec when the timer runs out
*/
autocomplete: function(){
- if(linkwiz.timer !== null){
- window.clearTimeout(linkwiz.timer);
- linkwiz.timer = null;
+ if(dw_linkwiz.timer !== null){
+ window.clearTimeout(dw_linkwiz.timer);
+ dw_linkwiz.timer = null;
}
- linkwiz.timer = window.setTimeout(linkwiz.autocomplete_exec,350);
+ dw_linkwiz.timer = window.setTimeout(dw_linkwiz.autocomplete_exec,350);
},
/**
* Executes the AJAX call for the page/namespace lookup
*/
autocomplete_exec: function(){
- linkwiz.deselect();
- linkwiz.result.innerHTML = '<img src="'+DOKU_BASE+'lib/images/throbber.gif" alt="" width="16" height="16" />';
- linkwiz.sack.runAJAX('call=linkwiz&q='+encodeURI(linkwiz.entry.value));
+ dw_linkwiz.deselect();
+ dw_linkwiz.result.innerHTML = '<img src="'+DOKU_BASE+'lib/images/throbber.gif" alt="" width="16" height="16" />';
+
+ // because we need to use POST, we
+ // can not use the .load() function.
+ jQuery.post(
+ DOKU_BASE + 'lib/exe/ajax.php',
+ {
+ call: 'linkwiz',
+ q: dw_linkwiz.entry.value
+ },
+ function (data) {
+ dw_linkwiz.result.innerHTML = data;
+ },
+ 'html'
+ );
},
/**
- * Clears the result area
- */
- clear: function(){
- linkwiz.result.innerHTML = 'Search for a matching page name above, or browse through the pages on the right';
- linkwiz.entry.value = '';
- },
-
- /**
- * Show the linkwizard
+ * Show the link wizard
*/
show: function(){
- linkwiz.selection = getSelection(linkwiz.textArea);
- linkwiz.wiz.style.marginLeft = '0px';
- linkwiz.wiz.style.marginTop = '0px';
- linkwiz.entry.focus();
- linkwiz.autocomplete();
+ var L = dw_linkwiz;
+ L.selection = getSelection(dw_linkwiz.textArea);
+ L.$wiz.css('marginLeft', '0');
+ L.$wiz.css('marginTop', '0');
+ L.entry.focus();
+ L.autocomplete();
},
/**
* Hide the link wizard
*/
hide: function(){
- linkwiz.wiz.style.marginLeft = '-10000px';
- linkwiz.wiz.style.marginTop = '-10000px';
- linkwiz.textArea.focus();
+ var L = dw_linkwiz;
+ L.$wiz.css('marginLeft', '-10000px');
+ L.$wiz.css('marginTop', '-10000px');
+ L.textArea.focus();
},
/**
* Toggle the link wizard
*/
toggle: function(){
- if(linkwiz.wiz.style.marginLeft == '-10000px'){
- linkwiz.show();
+ if(dw_linkwiz.$wiz.css('marginLeft') == '-10000px'){
+ dw_linkwiz.show();
}else{
- linkwiz.hide();
+ dw_linkwiz.hide();
}
}
-};
+};
diff --git a/lib/scripts/locktimer.js b/lib/scripts/locktimer.js
new file mode 100644
index 000000000..60508a8e7
--- /dev/null
+++ b/lib/scripts/locktimer.js
@@ -0,0 +1,110 @@
+/**
+* Class managing the timer to display a warning on a expiring lock
+*/
+var locktimer = {
+ sack: null,
+ timeout: 0,
+ timerID: null,
+ lasttime: null,
+ msg: '',
+ pageid: '',
+
+ init: function(timeout,msg,draft,edid){
+ var edit = $(edid);
+ if(!edit) return;
+ if(edit.readOnly) return;
+
+ // init values
+ this.timeout = timeout*1000;
+ this.msg = msg;
+ this.draft = draft;
+ this.lasttime = new Date();
+
+ if(jQuery('#dw__editform').length == 0) return;
+ this.pageid = jQuery('#dw__editform input[name=id]').val();
+ if(!this.pageid) return;
+
+ if(jQuery('#wiki__text').attr('readonly')) return;
+
+ // register refresh event
+ jQuery('#dw__editform').keypress(
+ function() {
+ locktimer.refresh();
+ }
+ );
+ // start timer
+ this.reset();
+ },
+
+ /**
+ * (Re)start the warning timer
+ */
+ reset: function(){
+ this.clear();
+ this.timerID = window.setTimeout("locktimer.warning()", this.timeout);
+ },
+
+ /**
+ * Display the warning about the expiring lock
+ */
+ warning: function(){
+ this.clear();
+ alert(this.msg);
+ },
+
+ /**
+ * Remove the current warning timer
+ */
+ clear: function(){
+ if(this.timerID !== null){
+ window.clearTimeout(this.timerID);
+ this.timerID = null;
+ }
+ },
+
+ /**
+ * Refresh the lock via AJAX
+ *
+ * Called on keypresses in the edit area
+ */
+ refresh: function(){
+ var now = new Date();
+ var params = {};
+ // refresh every minute only
+ if(now.getTime() - this.lasttime.getTime() > 30*1000){
+ params['call'] = 'lock';
+ params['id'] = locktimer.pageid;
+
+ if(locktimer.draft && jQuery('#dw__editform textarea[name=wikitext]').length > 0){
+ params['prefix'] = jQuery('#dw__editform input[name=prefix]').val();
+ params['wikitext'] = jQuery('#dw__editform textarea[name=wikitext]').val();
+ params['suffix'] = jQuery('#dw__editform input[name=suffix]').val();
+ if(jQuery('#dw__editform input[name=date]').length > 0) {
+ params['date'] = jQuery('#dw__editform input[name=id]').val();
+ }
+ }
+
+ jQuery.post(
+ DOKU_BASE + 'lib/exe/ajax.php',
+ params,
+ function (data) {
+ locktimer.refreshed(data);
+ },
+ 'html'
+ );
+ this.lasttime = now;
+ }
+ },
+
+ /**
+ * Callback. Resets the warning timer
+ */
+ refreshed: function(data){
+ var error = data.charAt(0);
+ data = data.substring(1);
+
+ jQuery('#draft__status').html(data);
+ if(error != '1') return; // locking failed
+ this.reset();
+ }
+};
diff --git a/lib/scripts/media.js b/lib/scripts/media.js
index b90f7047b..1402ad4bf 100644
--- a/lib/scripts/media.js
+++ b/lib/scripts/media.js
@@ -1,777 +1,524 @@
+/*jslint white: true, onevar: true, undef: true, nomen: true, eqeqeq: true, plusplus: true, bitwise: true, regexp: false, strict: true, newcap: true, immed: true, sloppy: true, browser: true */
+/*global jQuery, DOKU_BASE, LANG, bind, DokuCookie, opener, confirm*/
+
/**
* JavaScript functionality for the media management popup
*
* @author Andreas Gohr <andi@splitbrain.org>
+ * @author Pierre Spring <pierre.spring@caillou.ch>
*/
-var media_manager = {
+
+var dw_mediamanager = {
keepopen: false,
hide: false,
- align: false,
popup: false,
- id: false,
display: false,
- link: false,
- size: false,
ext: false,
+ $popup: null,
- /**
- * Attach event handlers to all "folders" below the given element
- *
- * @author Andreas Gohr <andi@splitbrain.org>
- */
- treeattach: function(obj){
- if(!obj) return;
-
- var items = obj.getElementsByTagName('li');
- for(var i=0; i<items.length; i++){
- var elem = items[i];
-
- // attach action to make the +/- clickable
- var clicky = elem.getElementsByTagName('img')[0];
- clicky.style.cursor = 'pointer';
- addEvent(clicky,'click',function(event){ return media_manager.toggle(event,this); });
-
- // attach action load folder list via AJAX
- var link = elem.getElementsByTagName('a')[0];
- link.style.cursor = 'pointer';
- addEvent(link,'click',function(event){ return media_manager.list(event,this); });
- }
+ // Image insertion opts
+ align: false,
+ link: false,
+ size: false,
+ forbidden_opts: {},
+
+ init: function () {
+ var $content, $tree;
+ $content = jQuery('#media__content');
+ $tree = jQuery('#media__tree');
+
+ dw_mediamanager.prepare_content($content);
+
+ dw_mediamanager.attachoptions();
+ dw_mediamanager.initpopup();
+
+ // add the action to autofill the "upload as" field
+ $content.delegate('#upload__file', 'change', dw_mediamanager.suggest)
+ // Attach the image selector action to all links
+ .delegate('a.select', 'click', dw_mediamanager.select)
+ // Attach deletion confirmation dialog to the delete buttons
+ .delegate('#media__content a.btn_media_delete', 'click',
+ dw_mediamanager.confirmattach);
+
+ $tree.dw_tree({toggle_selector: 'img',
+ load_data: function (show_sublist, $clicky) {
+ // get the enclosed link (is always the first one)
+ var $link = $clicky.parent().find('div.li a.idx_dir');
+
+ jQuery.post(
+ DOKU_BASE + 'lib/exe/ajax.php',
+ $link[0].search.substr(1) + '&call=medians',
+ show_sublist,
+ 'html'
+ );
+ },
+
+ toggle_display: function ($clicky, opening) {
+ $clicky.attr('src',
+ DOKU_BASE + 'lib/images/' +
+ (opening ? 'minus' : 'plus') + '.gif');
+ }});
+ $tree.delegate('a', 'click', dw_mediamanager.list);
},
/**
- * Attach the image selector action to all links below the given element
- * also add the action to autofill the "upload as" field
+ * build the popup window
*
- * @author Andreas Gohr <andi@splitbrain.org>
+ * @author Dominik Eckelmann <eckelmann@cosmocode.de>
*/
- selectorattach: function(obj){
- if(!obj) return;
-
- var items = getElementsByClass('select',obj,'a');
- for(var i=0; i<items.length; i++){
- var elem = items[i];
- elem.style.cursor = 'pointer';
- addEvent(elem,'click',function(event){ return media_manager.select(event,this); });
- }
+ initpopup: function () {
+ var opts, $insp, $insbtn;
+
+ dw_mediamanager.$popup = jQuery(document.createElement('div'))
+ .attr('id', 'media__popup_content')
+ .dialog({autoOpen: false, width: 280, modal: true,
+ draggable: true, title: LANG.mediatitle,
+ resizable: false});
+
+ opts = [{id: 'link', label: LANG.mediatarget,
+ btns: ['lnk', 'direct', 'nolnk', 'displaylnk']},
+ {id: 'align', label: LANG.mediaalign,
+ btns: ['noalign', 'left', 'center', 'right']},
+ {id: 'size', label: LANG.mediasize,
+ btns: ['small', 'medium', 'large', 'original']}
+ ];
+
+ jQuery.each(opts, function (_, opt) {
+ var $p, $l;
+ $p = jQuery(document.createElement('p'))
+ .attr('id', 'media__' + opt.id);
+
+ if (dw_mediamanager.display === "2") {
+ $p.hide();
+ }
- // hide syntax example
- items = getElementsByClass('example',obj,'div');
- for(var i=0; i<items.length; i++){
- elem = items[i];
- elem.style.display = 'none';
- }
+ $l = jQuery(document.createElement('label'))
+ .text(opt.label);
+ $p.append($l);
- var file = $('upload__file');
- if(!file) return;
- addEvent(file,'change',media_manager.suggest);
- },
+ jQuery.each(opt.btns, function (i, text) {
+ var $btn, $img;
+ $btn = jQuery(document.createElement('button'))
+ .addClass('button')
+ .attr('id', "media__" + opt.id + "btn" + (i + 1))
+ .attr('title', LANG['media' + text])
+ .click(bind(dw_mediamanager.setOpt, opt.id));
- /**
- * Attach deletion confirmation dialog to the delete buttons.
- *
- * Michael Klier <chi@chimeric.de>
- */
- confirmattach: function(obj){
- if(!obj) return;
-
- items = getElementsByClass('btn_media_delete',obj,'a');
- for(var i=0; i<items.length; i++){
- var elem = items[i];
- addEvent(elem,'click',function(e){
- if(e.target.tagName == 'IMG'){
- var name = e.target.parentNode.title;
- }else{
- var name = e.target.title;
- }
- if(!confirm(LANG['del_confirm'] + "\n" + name)) {
- e.preventDefault();
- return false;
- } else {
- return true;
- }
+ $img = jQuery(document.createElement('img'))
+ .attr('src', DOKU_BASE + 'lib/images/media_' +
+ opt.id + '_' + text + '.png');
+
+ $btn.append($img);
+ $p.append($btn);
});
- }
+
+ dw_mediamanager.$popup.append($p);
+ });
+
+ // insert button
+ $insp = jQuery(document.createElement('p'))
+ .addClass('btnlbl');
+ dw_mediamanager.$popup.append($insp);
+
+ $insbtn = jQuery(document.createElement('input'))
+ .attr('id', 'media__sendbtn')
+ .attr('type', 'button')
+ .addClass('button')
+ .val(LANG.mediainsert);
+ $insp.append($insbtn);
},
/**
- * Creates checkboxes for additional options
+ * Insert the clicked image into the opener's textarea
*
* @author Andreas Gohr <andi@splitbrain.org>
+ * @author Dominik Eckelmann <eckelmann@cosmocode.de>
+ * @author Pierre Spring <pierre.spring@caillou.ch>
*/
- attachoptions: function(obj){
- if(!obj) return;
+ insert: function (id) {
+ var opts, alignleft, alignright, edid, s;
- // keep open
- if(opener){
- var kobox = document.createElement('input');
- kobox.type = 'checkbox';
- kobox.id = 'media__keepopen';
- if(DokuCookie.getValue('keepopen')){
- kobox.checked = true;
- kobox.defaultChecked = true; //IE wants this
- media_manager.keepopen = true;
- }
- addEvent(kobox,'click',function(event){ return media_manager.togglekeepopen(event,this); });
+ // set syntax options
+ dw_mediamanager.$popup.dialog('close');
- var kolbl = document.createElement('label');
- kolbl.htmlFor = 'media__keepopen';
- kolbl.innerHTML = LANG['keepopen'];
+ opts = '';
+ alignleft = '';
+ alignright = '';
- var kobr = document.createElement('br');
+ if ({img: 1, swf: 1}[dw_mediamanager.ext] === 1) {
- obj.appendChild(kobox);
- obj.appendChild(kolbl);
- obj.appendChild(kobr);
- }
+ if (dw_mediamanager.link === '4') {
+ opts = '?linkonly';
+ } else {
- // hide details
- var hdbox = document.createElement('input');
- hdbox.type = 'checkbox';
- hdbox.id = 'media__hide';
- if(DokuCookie.getValue('hide')){
- hdbox.checked = true;
- hdbox.defaultChecked = true; //IE wants this
- media_manager.hide = true;
- }
- addEvent(hdbox,'click',function(event){ return media_manager.togglehide(event,this); });
+ if (dw_mediamanager.link === "3" && dw_mediamanager.ext === 'img') {
+ opts = '?nolink';
+ } else if (dw_mediamanager.link === "2" && dw_mediamanager.ext === 'img') {
+ opts = '?direct';
+ }
- var hdlbl = document.createElement('label');
- hdlbl.htmlFor = 'media__hide';
- hdlbl.innerHTML = LANG['hidedetails'];
+ s = parseInt(dw_mediamanager.size, 10);
- var hdbr = document.createElement('br');
+ if (s && s >= 1 && s < 4) {
+ opts += (opts.length)?'&':'?';
+ opts += dw_mediamanager.size + '00';
+ if (dw_mediamanager.ext === 'swf') {
+ switch (s) {
+ case 1:
+ opts += 'x62';
+ break;
+ case 2:
+ opts += 'x123';
+ break;
+ case 3:
+ opts += 'x185';
+ break;
+ }
+ }
+ }
+ alignleft = dw_mediamanager.align === '2' ? '' : ' ';
+ alignright = dw_mediamanager.align === '4' ? '' : ' ';
+ }
+ }
+ edid = String.prototype.match.call(document.location, /&edid=([^&]+)/);
+ opener.insertTags(edid ? edid[1] : 'wiki__text',
+ '{{'+alignleft+id+opts+alignright+'|','}}','');
- obj.appendChild(hdbox);
- obj.appendChild(hdlbl);
- obj.appendChild(hdbr);
- media_manager.updatehide();
+ if(!dw_mediamanager.keepopen) {
+ window.close();
+ }
+ opener.focus();
+ return false;
},
/**
- * Toggles the keep open state
+ * Prefills the wikiname.
*
* @author Andreas Gohr <andi@splitbrain.org>
*/
- togglekeepopen: function(event,cb){
- if(cb.checked){
- DokuCookie.setValue('keepopen',1);
- media_manager.keepopen = true;
- }else{
- DokuCookie.setValue('keepopen','');
- media_manager.keepopen = false;
+ suggest: function(){
+ var $file, $name, text;
+
+ $file = jQuery(this);
+ $name = jQuery('#upload__name');
+ if(!$file.length || !$name.length) {
+ return;
}
+
+ text = $file.val();
+ text = text.substr(text.lastIndexOf('/')+1);
+ text = text.substr(text.lastIndexOf('\\')+1);
+ $name.val(text);
},
/**
- * Toggles the hide details state
+ * list the content of a namespace using AJAX
*
* @author Andreas Gohr <andi@splitbrain.org>
+ * @author Pierre Spring <pierre.spring@caillou.ch>
*/
- togglehide: function(event,cb){
- if(cb.checked){
- DokuCookie.setValue('hide',1);
- media_manager.hide = true;
- }else{
- DokuCookie.setValue('hide','');
- media_manager.hide = false;
- }
- media_manager.updatehide();
+ list: function (event) {
+ var $link, $content;
+
+ event.preventDefault();
+
+ jQuery('div.success, div.info, div.error, div.notify').remove();
+
+ $link = jQuery(this);
+ $content = jQuery('#media__content');
+ $content.html('<img src="' + DOKU_BASE + 'lib/images/loading.gif" alt="..." class="load" />');
+
+ // fetch the subtree
+ jQuery.post(
+ DOKU_BASE + 'lib/exe/ajax.php',
+ $link[0].search.substr(1)+'&call=medialist',
+ function (data) {
+ $content.html(data);
+ dw_mediamanager.prepare_content($content);
+ dw_mediamanager.updatehide();
+ },
+ 'html'
+ );
},
- /**
- * Sets the visibility of the image details accordingly to the
- * chosen hide state
- *
- * @author Andreas Gohr <andi@splitbrain.org>
- */
- updatehide: function(){
- var obj = $('media__content');
- if(!obj) return;
- var details = getElementsByClass('detail',obj,'div');
- for(var i=0; i<details.length; i++){
- if(media_manager.hide){
- details[i].style.display = 'none';
- }else{
- details[i].style.display = '';
- }
- }
+ prepare_content: function ($content) {
+ // hide syntax example
+ $content.find('div.example:visible').hide();
+ dw_mediamanager.initFlashUpload();
},
/**
* shows the popup for a image link
*/
- select: function(event,link){
- var id = link.name.substr(2);
+ select: function(event){
+ var $link, id, dot, ext;
+
+ event.preventDefault();
+
+ $link = jQuery(this);
+ id = $link.attr('name').substr(2);
- media_manager.id = id;
if(!opener){
// if we don't run in popup display example
- var ex = $('ex'+id.replace(/:/g,'_'));
- if(ex.style.display == ''){
- ex.style.display = 'none';
- } else {
- ex.style.display = '';
- }
- return false;
+ // the id's are a bit wierd and jQuery('#ex_wiki_dokuwiki-128.png')
+ // will not be found by Sizzle (the CSS Selector Engine
+ // used by jQuery), hence the document.getElementById() call
+ jQuery(document.getElementById('ex_'+id.replace(/:/g,'_').replace(/^_/,''))).dw_toggle();
+ return;
}
- media_manager.ext = false;
- var dot = id.lastIndexOf(".");
- if (dot != -1) {
- var ext = id.substr(dot,id.length);
+ dw_mediamanager.ext = false;
+ dot = id.lastIndexOf(".");
- if (ext != '.jpg' && ext != '.jpeg' && ext != '.png' && ext != '.gif' && ext != '.swf') {
- media_manager.insert(null);
- return false;
- }
- } else {
- media_manager.insert(null);
- return false;
+ if (-1 === dot) {
+ dw_mediamanager.insert(id);
+ return;
}
- media_manager.popup.style.display = 'inline';
- media_manager.popup.style.left = event.pageX + 'px';
- media_manager.popup.style.top = event.pageY + 'px';
+ ext = id.substr(dot);
- // set all buttons to outset
- for (var i = 1; i < 5; i++) {
- media_manager.outSet('media__linkbtn' + i);
- media_manager.outSet('media__alignbtn' + i);
- media_manager.outSet('media__sizebtn' + i);
+ if ({'.jpg':1, '.jpeg':1, '.png':1, '.gif':1, '.swf':1}[ext] !== 1) {
+ dw_mediamanager.insert(id);
+ return;
}
- if (ext == '.swf') {
- media_manager.ext = 'swf';
-
- // disable display buttons for detail and linked image
- $('media__linkbtn1').style.display = 'none';
- $('media__linkbtn2').style.display = 'none';
-
- // set the link button to default
- if (media_manager.link !== false) {
- if ( media_manager.link == '2' || media_manager.link == '1') {
- media_manager.inSet('media__linkbtn3');
- media_manager.link = '3';
- DokuCookie.setValue('link','3');
- } else {
- media_manager.inSet('media__linkbtn'+media_manager.link);
- }
- } else if (DokuCookie.getValue('link')) {
- if ( DokuCookie.getValue('link') == '2' || DokuCookie.getValue('link') == '1') {
- // this options are not availible
- media_manager.inSet('media__linkbtn3');
- media_manager.link = '3';
- DokuCookie.setValue('link','3');
- } else {
- media_manager.inSet('media__linkbtn'+DokuCookie.getValue('link'));
- media_manager.link = DokuCookie.getValue('link');
- }
- } else {
- // default case
- media_manager.link = '3';
- media_manager.inSet('media__linkbtn3');
- DokuCookie.setValue('link','3');
- }
-
- // disable button for original size
- $('media__sizebtn4').style.display = 'none';
- if (media_manager.size == 4) {
- media_manager.size = 2;
- DokuCookie.setValue('size', '2');
- media_manager.inSet('media__sizebtn2');
- }
+ // remove old callback from the insert button and set the new one.
+ jQuery('#media__sendbtn').unbind().click(bind(dw_mediamanager.insert, id));
+ dw_mediamanager.unforbid('ext');
+ if (ext === '.swf') {
+ dw_mediamanager.ext = 'swf';
+ dw_mediamanager.forbid('ext', {link: ['1', '2'],
+ size: ['4']});
} else {
- media_manager.ext = 'img';
-
- // ensure that the display buttons are there
- $('media__linkbtn1').style.display = 'inline';
- $('media__linkbtn2').style.display = 'inline';
- $('media__sizebtn4').style.display = 'inline';
-
- // set the link button to default
- if (DokuCookie.getValue('link')) {
- media_manager.link = DokuCookie.getValue('link');
- }
- if (!media_manager.link) {
- // default case
- media_manager.link = '1';
- DokuCookie.setValue('link','1');
- }
- media_manager.inSet('media__linkbtn'+media_manager.link);
+ dw_mediamanager.ext = 'img';
}
- if (media_manager.link == '4') {
- media_manager.align = false;
- media_manager.size = false;
- $('media__align').style.display = 'none';
- $('media__size').style.display = 'none';
- } else {
- $('media__align').style.display = 'block';
- $('media__size').style.display = 'block';
-
- // set the align button to default
- if (media_manager.align !== false) {
- media_manager.inSet('media__alignbtn'+media_manager.align);
- } else if (DokuCookie.getValue('align')) {
- media_manager.inSet('media__alignbtn'+DokuCookie.getValue('align'));
- media_manager.align = DokuCookie.getValue('align');
- } else {
- // default case
- media_manager.align = '1';
- media_manager.inSet('media__alignbtn1');
- DokuCookie.setValue('align','1');
- }
+ // Set to defaults
+ dw_mediamanager.setOpt('link');
+ dw_mediamanager.setOpt('align');
+ dw_mediamanager.setOpt('size');
- // set the size button to default
- if (DokuCookie.getValue('size')) {
- media_manager.size = DokuCookie.getValue('size');
- }
- if (!media_manager.size || (media_manager.size === '4' && ext === '.swf')) {
- // default case
- media_manager.size = '2';
- DokuCookie.setValue('size','2');
- }
- media_manager.inSet('media__sizebtn'+media_manager.size);
+ // toggle buttons for detail and linked image, original size
+ jQuery('#media__linkbtn1, #media__linkbtn2, #media__sizebtn4')
+ .toggle(dw_mediamanager.ext === 'img');
- $('media__sendbtn').focus();
- }
+ dw_mediamanager.$popup.dialog('open');
- return false;
+ jQuery('#media__sendbtn').focus();
},
/**
- * build the popup window
+ * Deletion confirmation dialog to the delete buttons.
*
- * @author Dominik Eckelmann <eckelmann@cosmocode.de>
+ * @author Michael Klier <chi@chimeric.de>
+ * @author Pierre Spring <pierre.spring@caillou.ch>
*/
- initpopup: function() {
-
- media_manager.popup = document.createElement('div');
- media_manager.popup.setAttribute('id','media__popup');
- media_manager.popup.style.display = 'none';
-
- var root = document.getElementById('media__manager');
- if (root === null) return;
- root.appendChild(media_manager.popup);
-
- var headline = document.createElement('h1');
- headline.innerHTML = LANG.mediatitle;
- var headlineimg = document.createElement('img');
- headlineimg.src = DOKU_BASE + 'lib/images/close.png';
- headlineimg.id = 'media__closeimg';
- addEvent(headlineimg,'click',function(event){ return media_manager.closePopup(event,this); });
- headline.insertBefore(headlineimg, headline.firstChild);
- media_manager.popup.appendChild(headline);
- drag.attach(media_manager.popup,headline);
-
- // link
-
- var linkp = document.createElement('p');
-
- linkp.id = "media__linkstyle";
- if (media_manager.display == "2") {
- linkp.style.display = "none";
- }
-
- var linkl = document.createElement('label');
- linkl.innerHTML = LANG.mediatarget;
- linkp.appendChild(linkl);
-
- var linkbtns = ['lnk', 'direct', 'nolnk', 'displaylnk'];
- for (var i = 0 ; i < linkbtns.length ; ++i) {
- var linkbtn = document.createElement('button');
- linkbtn.className = 'button';
- linkbtn.id = "media__linkbtn" + (i+1);
- linkbtn.title = LANG['media' + linkbtns[i]];
- linkbtn.style.borderStyle = 'outset';
- addEvent(linkbtn,'click',function(event){ return media_manager.setlink(event,this); });
-
- var linkimg = document.createElement('img');
- linkimg.src = DOKU_BASE + 'lib/images/media_link_' + linkbtns[i] + '.png';
-
- linkbtn.appendChild(linkimg);
- linkp.appendChild(linkbtn);
+ confirmattach: function(e){
+ if(!confirm(LANG.del_confirm + "\n" + jQuery(this).attr('title'))) {
+ e.preventDefault();
}
+ },
- media_manager.popup.appendChild(linkp);
-
- // align
-
- var alignp = document.createElement('p');
- var alignl = document.createElement('label');
+ /**
+ * Creates checkboxes for additional options
+ *
+ * @author Andreas Gohr <andi@splitbrain.org>
+ * @author Pierre Spring <pierre.spring@caillou.ch>
+ */
+ attachoptions: function(){
+ var $obj, opts;
- alignp.appendChild(alignl);
- alignp.id = 'media__align';
- if (media_manager.display == "2") {
- alignp.style.display = "none";
+ $obj = jQuery('#media__opts');
+ if($obj.length === 0) {
+ return;
}
- alignl.innerHTML = LANG['mediaalign'];
-
- var alignbtns = ['noalign', 'left', 'center', 'right'];
- for (var n = 0 ; n < alignbtns.length ; ++n) {
- var alignbtn = document.createElement('button');
- var alignimg = document.createElement('img');
- alignimg.src = DOKU_BASE + 'lib/images/media_align_' + alignbtns[n] + '.png';
-
- alignbtn.id = "media__alignbtn" + (n+1);
- alignbtn.title = LANG['media' + alignbtns[n]];
- alignbtn.className = 'button';
- alignbtn.appendChild(alignimg);
- alignbtn.style.borderStyle = 'outset';
- addEvent(alignbtn,'click',function(event){ return media_manager.setalign(event,this); });
-
- alignp.appendChild(alignbtn);
- }
-
- media_manager.popup.appendChild(alignp);
-
- // size
-
- var sizep = document.createElement('p');
- var sizel = document.createElement('label');
- sizep.id = 'media__size';
- if (media_manager.display == "2") {
- sizep.style.display = "none";
- }
- sizep.appendChild(sizel);
- sizel.innerHTML = LANG['mediasize'];
-
- var sizebtns = ['small', 'medium', 'large', 'original'];
- for (var size = 0 ; size < sizebtns.length ; ++size) {
- var sizebtn = document.createElement('button');
- var sizeimg = document.createElement('img');
-
- sizep.appendChild(sizebtn);
- sizeimg.src = DOKU_BASE + 'lib/images/media_size_' + sizebtns[size] + '.png';
-
- sizebtn.className = 'button';
- sizebtn.appendChild(sizeimg);
- sizebtn.id = 'media__sizebtn' + (size + 1);
- sizebtn.title = LANG['media' + sizebtns[size]];
- sizebtn.style.borderStyle = 'outset';
- addEvent(sizebtn,'click',function(event){ return media_manager.setsize(event,this); });
+ opts = [];
+ // keep open
+ if(opener){
+ opts.push(['keepopen', 'keepopen']);
}
+ opts.push(['hide', 'hidedetails']);
+
+ jQuery.each(opts,
+ function(_, opt) {
+ var $box, $lbl;
+ $box = jQuery(document.createElement('input'))
+ .attr('type', 'checkbox')
+ .attr('id', 'media__' + opt[0])
+ .click(bind(dw_mediamanager.toggleOption,
+ opt[0]));
+
+ if(DokuCookie.getValue(opt[0])){
+ $box.prop('checked', true);
+ dw_mediamanager[opt[0]] = true;
+ }
- media_manager.popup.appendChild(sizep);
-
- // send and close button
+ $lbl = jQuery(document.createElement('label'))
+ .attr('for', 'media__' + opt[0])
+ .text(LANG[opt[1]]);
- var btnp = document.createElement('p');
- media_manager.popup.appendChild(btnp);
- btnp.setAttribute('class','btnlbl');
+ $obj.append($box, $lbl, document.createElement('br'));
+ });
- var btn = document.createElement('input');
- btn.type = 'button';
- btn.id = 'media__sendbtn';
- btn.setAttribute('class','button');
- btn.value = LANG['mediainsert'];
- btnp.appendChild(btn);
- addEvent(btn,'click',function(event){ return media_manager.insert(event); });
+ dw_mediamanager.updatehide();
},
/**
- * Insert the clicked image into the opener's textarea
+ * Generalized toggler
*
- * @author Andreas Gohr <andi@splitbrain.org>
- * @author Dominik Eckelmann <eckelmann@cosmocode.de>
+ * @author Pierre Spring <pierre.spring@caillou.ch>
*/
- insert: function(event){
- var id = media_manager.id;
- // set syntax options
- $('media__popup').style.display = 'none';
-
- var opts = '';
- var optsstart = '';
- var alignleft = '';
- var alignright = '';
-
- if (media_manager.ext == 'img' || media_manager.ext == 'swf') {
-
- if (media_manager.link == '4') {
- opts = '?linkonly';
- } else {
+ toggleOption: function (variable) {
+ if (jQuery(this).prop('checked')) {
+ DokuCookie.setValue(variable, 1);
+ dw_mediamanager[variable] = true;
+ } else {
+ DokuCookie.setValue(variable, '');
+ dw_mediamanager[variable] = false;
+ }
+ if (variable === 'hide') {
+ dw_mediamanager.updatehide();
+ }
+ },
- if (media_manager.link == "3" && media_manager.ext == 'img') {
- opts = '?nolink';
- optsstart = true;
- } else if (media_manager.link == "2" && media_manager.ext == 'img') {
- opts = '?direct';
- optsstart = true;
- }
+ initFlashUpload: function () {
+ var $oform, $oflash;
+ if(!hasFlash(8)) {
+ return;
+ }
- var s = parseInt(media_manager.size, 10);
+ $oform = jQuery('#dw__upload');
+ $oflash = jQuery('#dw__flashupload');
- if (s && s >= 1) {
- opts += (optsstart)?'&':'?';
- if (s=="1") {
- opts += '100';
- if (media_manager.ext == 'swf') {
- opts += 'x62';
- }
- } else if (s=="2") {
- opts += '200';
- if (media_manager.ext == 'swf') {
- opts += 'x123';
- }
- } else if (s=="3"){
- opts += '300';
- if (media_manager.ext == 'swf') {
- opts += 'x185';
- }
- }
- }
- if (media_manager.align == '2') {
- alignleft = '';
- alignright = ' ';
- }
- if (media_manager.align == '3') {
- alignleft = ' ';
- alignright = ' ';
- }
- if (media_manager.align == '4') {
- alignleft = ' ';
- alignright = '';
- }
- }
+ if(!$oform.length || !$oflash.length) {
+ return;
}
- opener.insertTags('wiki__text','{{'+alignleft+id+opts+alignright+'|','}}','');
- if(!media_manager.keepopen) window.close();
- opener.focus();
- return false;
+ jQuery(document.createElement('img'))
+ .attr('src', DOKU_BASE+'lib/images/multiupload.png')
+ .attr('title', LANG.mu_btn)
+ .attr('alt', LANG.mu_btn)
+ .css('cursor', 'pointer')
+ .click(
+ function () {
+ $oform.hide();
+ $oflash.show();
+ }
+ )
+ .appendTo($oform);
},
/**
- * list the content of a namespace using AJAX
+ * Sets the visibility of the image details accordingly to the
+ * chosen hide state
*
* @author Andreas Gohr <andi@splitbrain.org>
*/
- list: function(event,link){
- // prepare an AJAX call to fetch the subtree
- var ajax = new sack(DOKU_BASE + 'lib/exe/ajax.php');
- ajax.AjaxFailedAlert = '';
- ajax.encodeURIString = false;
- if(ajax.failed) return true;
-
- cleanMsgArea();
-
- var content = $('media__content');
- content.innerHTML = '<img src="'+DOKU_BASE+'lib/images/loading.gif" alt="..." class="load" />';
-
- ajax.elementObj = content;
- ajax.afterCompletion = function(){
- media_manager.selectorattach(content);
- media_manager.confirmattach(content);
- media_manager.updatehide();
- media_manager.initFlashUpload();
- };
- ajax.runAJAX(link.search.substr(1)+'&call=medialist');
- return false;
+ updatehide: function(){
+ jQuery('#media__content div.detail').dw_toggle(!dw_mediamanager.hide);
},
-
/**
- * Open or close a subtree using AJAX
+ * set media insertion option
*
- * @author Andreas Gohr <andi@splitbrain.org>
+ * @author Dominik Eckelmann <eckelmann@cosmocode.de>
*/
- toggle: function(event,clicky){
- var listitem = clicky.parentNode;
-
- // if already open, close by removing the sublist
- var sublists = listitem.getElementsByTagName('ul');
- if(sublists.length){
- listitem.removeChild(sublists[0]);
- clicky.src = DOKU_BASE+'lib/images/plus.gif';
- return false;
+ setOpt: function(opt, e){
+ var val, i;
+ if (typeof e !== 'undefined') {
+ val = this.id.substring(this.id.length - 1);
+ } else {
+ val = dw_mediamanager.getOpt(opt);
}
- // get the enclosed link (is always the first one)
- var link = listitem.getElementsByTagName('a')[0];
-
- // prepare an AJAX call to fetch the subtree
- var ajax = new sack(DOKU_BASE + 'lib/exe/ajax.php');
- ajax.AjaxFailedAlert = '';
- ajax.encodeURIString = false;
- if(ajax.failed) return true;
-
- //prepare the new ul
- var ul = document.createElement('ul');
- //fixme add classname here
- listitem.appendChild(ul);
- ajax.elementObj = ul;
- ajax.afterCompletion = function(){ media_manager.treeattach(ul); };
- ajax.runAJAX(link.search.substr(1)+'&call=medians');
- clicky.src = DOKU_BASE+'lib/images/minus.gif';
- return false;
- },
+ if (val === false) {
+ DokuCookie.setValue(opt,'');
+ dw_mediamanager[opt] = false;
+ return;
+ }
- /**
- * Prefills the wikiname.
- *
- * @author Andreas Gohr <andi@splitbrain.org>
- */
- suggest: function(){
- var file = $('upload__file');
- var name = $('upload__name');
- if(!file || !name) return;
+ if (opt === 'link') {
+ if (val !== '4' && dw_mediamanager.link === '4') {
+ dw_mediamanager.unforbid('linkonly');
+ dw_mediamanager.setOpt('align');
+ dw_mediamanager.setOpt('size');
+ } else if (val === '4') {
+ dw_mediamanager.forbid('linkonly', {align: false, size: false});
+ }
- var text = file.value;
- text = text.substr(text.lastIndexOf('/')+1);
- text = text.substr(text.lastIndexOf('\\')+1);
- name.value = text;
- },
+ jQuery("#media__size, #media__align").dw_toggle(val !== '4');
+ }
+ DokuCookie.setValue(opt, val);
+ dw_mediamanager[opt] = val;
- initFlashUpload: function(){
- if(!hasFlash(8)) return;
- var oform = $('dw__upload');
- var oflash = $('dw__flashupload');
- if(!oform || !oflash) return;
-
- var clicky = document.createElement('img');
- clicky.src = DOKU_BASE+'lib/images/multiupload.png';
- clicky.title = LANG['mu_btn'];
- clicky.alt = LANG['mu_btn'];
- clicky.style.cursor = 'pointer';
- clicky.onclick = function(){
- oform.style.display = 'none';
- oflash.style.display = '';
- };
- oform.appendChild(clicky);
+ for (i = 1; i <= 4; i++) {
+ jQuery("#media__" + opt + "btn" + i).removeClass('selected');
+ }
+ jQuery('#media__' + opt + 'btn' + val).addClass('selected');
},
- /**
- * closes the link type popup
- */
- closePopup: function(event) {
- $('media__popup').style.display = 'none';
+ unforbid: function (group) {
+ delete dw_mediamanager.forbidden_opts[group];
},
- /**
- * set the align
- *
- * @author Dominik Eckelmann <eckelmann@cosmocode.de>
- */
- setalign: function(event,cb){
-
- var id = cb.id.substring(cb.id.length -1);
- if(id){
- DokuCookie.setValue('align',id);
- media_manager.align = id;
- for (var i = 1; i<=4; i++) {
- media_manager.outSet("media__alignbtn" + i);
- }
- media_manager.inSet("media__alignbtn"+id);
- }else{
- DokuCookie.setValue('align','');
- media_manager.align = false;
- }
+ forbid: function (group, forbids) {
+ dw_mediamanager.forbidden_opts[group] = forbids;
},
- /**
- * set the link type
- *
- * @author Dominik Eckelmann <eckelmann@cosmocode.de>
- */
- setlink: function(event,cb){
- var id = cb.id.substring(cb.id.length -1);
- if(id){
- DokuCookie.setValue('link',id);
- for (var i = 1; i<=4; i++) {
- media_manager.outSet("media__linkbtn"+i);
- }
- media_manager.inSet("media__linkbtn"+id);
-
- var size = document.getElementById("media__size");
- var align = document.getElementById("media__align");
- if (id != '4') {
- size.style.display = "block";
- align.style.display = "block";
- if (media_manager.link == '4') {
- media_manager.align = '1';
- DokuCookie.setValue('align', '1');
- media_manager.inSet('media__alignbtn1');
-
- media_manager.size = '2';
- DokuCookie.setValue('size', '2');
- media_manager.inSet('media__sizebtn2');
- }
- } else {
- size.style.display = "none";
- align.style.display = "none";
- }
- media_manager.link = id;
- }else{
- DokuCookie.setValue('link','');
- media_manager.link = false;
- }
+ allowedOpt: function (opt, val) {
+ var ret = true;
+ jQuery.each(dw_mediamanager.forbidden_opts,
+ function (_, forbids) {
+ ret = forbids[opt] !== false &&
+ jQuery.inArray(val, forbids[opt]) === -1;
+ return ret;
+ });
+ return ret;
},
- /**
- * set the display type
- *
- * @author Dominik Eckelmann <eckelmann@cosmocode.de>
- */
- setdisplay: function(event,cb){
- if(cb.value){
- DokuCookie.setValue('display',cb.value);
- media_manager.display = cb.value;
- media_manager.outSet("media__displaybtn1");
- media_manager.outSet("media__displaybtn2");
- media_manager.inSet("media__displaybtn"+cb.value);
+ getOpt: function (opt) {
+ var allowed = bind(dw_mediamanager.allowedOpt, opt);
- }else{
- DokuCookie.setValue('display','');
- media_manager.align = false;
+ // Current value
+ if (dw_mediamanager[opt] !== false && allowed(dw_mediamanager[opt])) {
+ return dw_mediamanager[opt];
}
- },
- /**
- * sets the border to outset
- */
- outSet: function(id) {
- var ele = document.getElementById(id);
- if (ele == null) return;
- ele.style.borderStyle = "outset";
- },
- /**
- * sets the border to inset
- */
- inSet: function(id) {
- var ele = document.getElementById(id);
- if (ele == null) return;
- ele.style.borderStyle = "inset";
- },
+ // From cookie
+ if (DokuCookie.getValue(opt) && allowed(DokuCookie.getValue(opt))) {
+ return DokuCookie.getValue(opt);
+ }
- /**
- * set the image size
- *
- * @author Dominik Eckelmann <eckelmann@cosmocode.de>
- */
- setsize: function(event,cb){
- var id = cb.id.substring(cb.id.length -1);
- if (id) {
- DokuCookie.setValue('size',id);
- media_manager.size = id;
- for (var i = 1 ; i <=4 ; ++i) {
- media_manager.outSet("media__sizebtn" + i);
- }
- media_manager.inSet("media__sizebtn"+id);
- } else {
- DokuCookie.setValue('size','');
- media_manager.width = false;
+ // size default
+ if (opt === 'size' && allowed('2')) {
+ return '2';
}
+
+ // Whatever is allowed, and be it false
+ return jQuery.grep(['1', '2', '3', '4'], allowed)[0] || false;
}
};
-addInitEvent(function(){
- media_manager.treeattach($('media__tree'));
- media_manager.selectorattach($('media__content'));
- media_manager.confirmattach($('media__content'));
- media_manager.attachoptions($('media__opts'));
- media_manager.initpopup();
- media_manager.initFlashUpload();
-});
+// moved from helpers.js temporarily here
+/**
+ * Very simplistic Flash plugin check, probably works for Flash 8 and higher only
+ *
+ */
+function hasFlash(version){
+ var ver = 0, axo;
+ try{
+ if(navigator.plugins !== null && navigator.plugins.length > 0){
+ ver = navigator.plugins["Shockwave Flash"].description.split(' ')[2].split('.')[0];
+ }else{
+ axo = new ActiveXObject("ShockwaveFlash.ShockwaveFlash");
+ ver = axo.GetVariable("$version").split(' ')[1].split(',')[0];
+ }
+ }catch(e){ }
+
+ return ver >= version;
+}
+
+jQuery(dw_mediamanager.init);
diff --git a/lib/scripts/qsearch.js b/lib/scripts/qsearch.js
new file mode 100644
index 000000000..f83b7a5a1
--- /dev/null
+++ b/lib/scripts/qsearch.js
@@ -0,0 +1,149 @@
+/*jslint sloppy: true, plusplus: true, continue: true */
+/*global jQuery, DOKU_BASE, window, document, substr_replace */
+
+/**
+ * AJAX functions for the pagename quicksearch
+ *
+ * @license GPL2 (http://www.gnu.org/licenses/gpl.html)
+ * @author Andreas Gohr <andi@splitbrain.org>
+ * @author Adrian Lang <lang@cosmocode.de>
+ * @author Michal Rezler <m.rezler@centrum.cz>
+ */
+
+var dw_qsearch = {
+
+ $inObj: null,
+ $outObj: null,
+ timer: null,
+
+ /**
+ * initialize the quick search
+ *
+ * Attaches the event handlers
+ *
+ * @param input element (JQuery selector/DOM obj)
+ * @param output element (JQuery selector/DOM obj)
+ */
+ init: function (input, output) {
+ var do_qsearch;
+
+ dw_qsearch.$inObj = jQuery(input);
+ dw_qsearch.$outObj = jQuery(output);
+
+ // objects found?
+ if (dw_qsearch.$inObj.length === 0 ||
+ dw_qsearch.$outObj.length === 0) {
+ return;
+ }
+
+ // attach eventhandler to search field
+ do_qsearch = function () {
+ dw_qsearch.clear_results();
+ var value = dw_qsearch.$inObj.val();
+ if (value === '') {
+ return;
+ }
+ jQuery.post(
+ DOKU_BASE + 'lib/exe/ajax.php',
+ {
+ call: 'qsearch',
+ q: encodeURI(value)
+ },
+ dw_qsearch.onCompletion,
+ 'html'
+ );
+ };
+
+ dw_qsearch.$inObj.keyup(
+ function() {
+ if(dw_qsearch.timer){
+ window.clearTimeout(dw_qsearch.timer);
+ dw_qsearch.timer = null;
+ }
+ dw_qsearch.clear_results();
+ dw_qsearch.timer = window.setTimeout(do_qsearch, 500);
+ }
+ );
+
+ // attach eventhandler to output field
+ dw_qsearch.$outObj.click(dw_qsearch.clear_results);
+ },
+
+ /**
+ * Empty and hide the output div
+ */
+ clear_results: function(){
+ dw_qsearch.$outObj.hide();
+ dw_qsearch.$outObj.text('');
+ },
+
+ /**
+ * Callback. Reformat and display the results.
+ *
+ * Namespaces are shortened here to keep the results from overflowing
+ * or wrapping
+ *
+ * @param data The result HTML
+ */
+ onCompletion: function(data) {
+ var max, $links, too_big;
+
+ if (data === '') { return; }
+
+ dw_qsearch.$outObj
+ .html(data)
+ .show()
+ .css('white-space', 'nowrap');
+
+ // shorten namespaces if too long
+ max = dw_qsearch.$outObj[0].clientWidth;
+ $links = dw_qsearch.$outObj.find('a');
+ too_big = (document.documentElement.dir === 'rtl')
+ ? function (l) { return l.offsetLeft < 0; }
+ : function (l) { return l.offsetWidth + l.offsetLeft > max; };
+
+ $links.each(function () {
+ var start, length, replace, nsL, nsR, eli, runaway;
+
+ if (!too_big(this)) {
+ return;
+ }
+
+ nsL = this.innerText.indexOf('(');
+ nsR = this.innerText.indexOf(')');
+ eli = 0;
+ runaway = 0;
+
+ while((nsR - nsL > 3) && too_big(this) && runaway++ < 500) {
+ if(eli !== 0){
+ // elipsis already inserted
+ if( (eli - nsL) > (nsR - eli) ){
+ // cut left
+ start = eli - 2;
+ length = 2;
+ }else{
+ // cut right
+ start = eli + 1;
+ length = 1;
+ }
+ replace = '';
+ }else{
+ // replace middle with ellipsis
+ start = Math.floor( nsL + ((nsR-nsL)/2) );
+ length = 1;
+ replace = '…';
+ }
+ this.innerText = substr_replace(this.innerText,
+ replace, start, length);
+
+ eli = this.innerText.indexOf('…');
+ nsL = this.innerText.indexOf('(');
+ nsR = this.innerText.indexOf(')');
+ }
+ });
+ }
+};
+
+jQuery(function () {
+ dw_qsearch.init('#qsearch__in','#qsearch__out');
+});
diff --git a/lib/scripts/script.js b/lib/scripts/script.js
index c79c9b683..b44d95d6f 100644
--- a/lib/scripts/script.js
+++ b/lib/scripts/script.js
@@ -1,3 +1,51 @@
+// if jQuery was loaded, let's make it noConflict here.
+if ('function' === typeof jQuery && 'function' === typeof jQuery.noConflict) {
+ jQuery.noConflict();
+}
+
+/**
+ * Mark a JavaScript function as deprecated
+ *
+ * This will print a warning to the JavaScript console (if available) in
+ * Firebug and Chrome and a stack trace (if available) to easily locate the
+ * problematic function call.
+ *
+ * @param msg optional message to print
+ */
+function DEPRECATED(msg){
+ if(!window.console) return;
+ if(!msg) msg = '';
+
+ var func;
+ if(arguments.callee) func = arguments.callee.caller.name;
+ if(func) func = ' '+func+'()';
+ var line = 'DEPRECATED function call'+func+'. '+msg;
+
+ if(console.warn){
+ console.warn(line);
+ }else{
+ console.log(line);
+ }
+
+ if(console.trace) console.trace();
+}
+
+/**
+ * Construct a wrapper function for deprecated function names
+ *
+ * This function returns a wrapper function which just calls DEPRECATED
+ * and the new function.
+ *
+ * @param func The new function
+ * @param context Optional; The context (`this`) of the call
+ */
+function DEPRECATED_WRAP(func, context) {
+ return function () {
+ DEPRECATED();
+ return func.apply(context || this, arguments);
+ }
+}
+
/**
* Some of these scripts were taken from wikipedia.org and were modified for DokuWiki
*/
@@ -25,6 +73,8 @@ if (clientPC.indexOf('opera')!=-1) {
* @link http://prototype.conio.net/
*/
function $() {
+ DEPRECATED('Please use the JQuery() function instead.');
+
var elements = new Array();
for (var i = 0; i < arguments.length; i++) {
@@ -52,68 +102,20 @@ function isset(varname){
}
/**
- * Select elements by their class name
+ * Get the computed style of a node.
*
- * @author Dustin Diaz <dustin [at] dustindiaz [dot] com>
- * @link http://www.dustindiaz.com/getelementsbyclass/
+ * @link https://acidmartin.wordpress.com/2008/08/26/style-get-any-css-property-value-of-an-object/
+ * @link http://svn.dojotoolkit.org/src/dojo/trunk/_base/html.js
*/
-function getElementsByClass(searchClass,node,tag) {
- var classElements = new Array();
- if ( node == null )
- node = document;
- if ( tag == null )
- tag = '*';
- var els = node.getElementsByTagName(tag);
- var elsLen = els.length;
- var pattern = new RegExp("(^|\\s)"+searchClass+"(\\s|$)");
- for (var i = 0, j = 0; i < elsLen; i++) {
- if ( pattern.test(els[i].className) ) {
- classElements[j] = els[i];
- j++;
- }
+function gcs(node){
+ if(node.currentStyle){
+ return node.currentStyle;
+ }else{
+ return node.ownerDocument.defaultView.getComputedStyle(node, null);
}
- return classElements;
}
/**
- * Get the X offset of the top left corner of the given object
- *
- * @link http://www.quirksmode.org/js/findpos.html
- */
-function findPosX(object){
- var curleft = 0;
- var obj = $(object);
- if (obj.offsetParent){
- do {
- curleft += obj.offsetLeft;
- } while (obj = obj.offsetParent);
- }
- else if (obj.x){
- curleft += obj.x;
- }
- return curleft;
-} //end findPosX function
-
-/**
- * Get the Y offset of the top left corner of the given object
- *
- * @link http://www.quirksmode.org/js/findpos.html
- */
-function findPosY(object){
- var curtop = 0;
- var obj = $(object);
- if (obj.offsetParent){
- do {
- curtop += obj.offsetTop;
- } while (obj = obj.offsetParent);
- }
- else if (obj.y){
- curtop += obj.y;
- }
- return curtop;
-} //end findPosY function
-
-/**
* Escape special chars in JavaScript
*
* @author Andreas Gohr <andi@splitbrain.org>
@@ -145,19 +147,6 @@ function escapeQuotes(text) {
}
/**
- * Adds a node as the first childenode to the given parent
- *
- * @see appendChild()
- */
-function prependChild(parent,element) {
- if(!parent.firstChild){
- parent.appendChild(element);
- }else{
- parent.insertBefore(element,parent.firstChild);
- }
-}
-
-/**
* Prints a animated gif to show the search is performed
*
* Because we need to modify the DOM here before the document is loaded
@@ -191,47 +180,6 @@ function hideLoadBar(id){
if(obj) obj.style.display="none";
}
-/**
- * Adds the toggle switch to the TOC
- */
-function addTocToggle() {
- if(!document.getElementById) return;
- var header = $('toc__header');
- if(!header) return;
- var toc = $('toc__inside');
-
- var obj = document.createElement('span');
- obj.id = 'toc__toggle';
- obj.style.cursor = 'pointer';
- if (toc && toc.style.display == 'none') {
- obj.innerHTML = '<span>+</span>';
- obj.className = 'toc_open';
- } else {
- obj.innerHTML = '<span>&minus;</span>';
- obj.className = 'toc_close';
- }
-
- prependChild(header,obj);
- obj.parentNode.onclick = toggleToc;
- obj.parentNode.style.cursor = 'pointer';
-}
-
-/**
- * This toggles the visibility of the Table of Contents
- */
-function toggleToc() {
- var toc = $('toc__inside');
- var obj = $('toc__toggle');
- if(toc.style.display == 'none') {
- toc.style.display = '';
- obj.innerHTML = '<span>&minus;</span>';
- obj.className = 'toc_close';
- } else {
- toc.style.display = 'none';
- obj.innerHTML = '<span>+</span>';
- obj.className = 'toc_open';
- }
-}
/**
* Create JavaScript mouseover popup
@@ -260,10 +208,32 @@ function insitu_popup(target, popup_id) {
getElementsByClass('dokuwiki', document.body, 'div')[0].appendChild(fndiv);
}
+ var non_static_parent = fndiv.parentNode;
+ while (non_static_parent != document && gcs(non_static_parent)['position'] == 'static') {
+ non_static_parent = non_static_parent.parentNode;
+ }
+
+ var fixed_target_parent = target;
+ while (fixed_target_parent != document && gcs(fixed_target_parent)['position'] != 'fixed') {
+ fixed_target_parent = fixed_target_parent.parentNode;
+ }
+
// position the div and make it visible
- fndiv.style.position = 'absolute';
- fndiv.style.left = findPosX(target)+'px';
- fndiv.style.top = (findPosY(target)+target.offsetHeight * 1.5) + 'px';
+ if (fixed_target_parent != document) {
+ // the target has position fixed, that means the footnote needs to be fixed, too
+ fndiv.style.position = 'fixed';
+ } else {
+ fndiv.style.position = 'absolute';
+ }
+
+ if (fixed_target_parent != document || non_static_parent == document) {
+ fndiv.style.left = findPosX(target)+'px';
+ fndiv.style.top = (findPosY(target)+target.offsetHeight * 1.5) + 'px';
+ } else {
+ fndiv.style.left = (findPosX(target) - findPosX(non_static_parent)) +'px';
+ fndiv.style.top = (findPosY(target)+target.offsetHeight * 1.5 - findPosY(non_static_parent)) + 'px';
+ }
+
fndiv.style.display = '';
return fndiv;
}
@@ -307,127 +277,12 @@ addInitEvent(function(){
}
});
-/**
- * Add the edit window size controls
- */
-function initSizeCtl(ctlid,edid){
- if(!document.getElementById){ return; }
-
- var ctl = $(ctlid);
- var textarea = $(edid);
- if(!ctl || !textarea) return;
-
- var hgt = DokuCookie.getValue('sizeCtl');
- if(hgt){
- textarea.style.height = hgt;
- }else{
- textarea.style.height = '300px';
- }
-
- var wrp = DokuCookie.getValue('wrapCtl');
- if(wrp){
- setWrap(textarea, wrp);
- } // else use default value
-
- var l = document.createElement('img');
- var s = document.createElement('img');
- var w = document.createElement('img');
- l.src = DOKU_BASE+'lib/images/larger.gif';
- s.src = DOKU_BASE+'lib/images/smaller.gif';
- w.src = DOKU_BASE+'lib/images/wrap.gif';
- addEvent(l,'click',function(){sizeCtl(edid,100);});
- addEvent(s,'click',function(){sizeCtl(edid,-100);});
- addEvent(w,'click',function(){toggleWrap(edid);});
- ctl.appendChild(l);
- ctl.appendChild(s);
- ctl.appendChild(w);
-}
-
-/**
- * This sets the vertical size of the editbox
- */
-function sizeCtl(edid,val){
- var textarea = $(edid);
- var height = parseInt(textarea.style.height.substr(0,textarea.style.height.length-2));
- height += val;
- textarea.style.height = height+'px';
-
- DokuCookie.setValue('sizeCtl',textarea.style.height);
-}
-
-/**
- * Toggle the wrapping mode of a textarea
- */
-function toggleWrap(edid){
- var textarea = $(edid);
- var wrap = textarea.getAttribute('wrap');
- if(wrap && wrap.toLowerCase() == 'off'){
- setWrap(textarea, 'soft');
- }else{
- setWrap(textarea, 'off');
- }
-
- DokuCookie.setValue('wrapCtl',textarea.getAttribute('wrap'));
-}
-
-/**
- * Set the wrapping mode of a textarea
- *
- * @author Fluffy Convict <fluffyconvict@hotmail.com>
- * @author <shutdown@flashmail.com>
- * @link http://news.hping.org/comp.lang.javascript.archive/12265.html
- * @link https://bugzilla.mozilla.org/show_bug.cgi?id=41464
- */
-function setWrap(textarea, wrapAttrValue){
- textarea.setAttribute('wrap', wrapAttrValue);
-
- // Fix display for mozilla
- var parNod = textarea.parentNode;
- var nxtSib = textarea.nextSibling;
- parNod.removeChild(textarea);
- parNod.insertBefore(textarea, nxtSib);
-}
/**
* Handler to close all open Popups
*/
function closePopups(){
- if(!document.getElementById){ return; }
-
- var divs = document.getElementsByTagName('div');
- for(var i=0; i < divs.length; i++){
- if(divs[i].className.indexOf('JSpopup') != -1){
- divs[i].style.display = 'none';
- }
- }
-}
-
-/**
- * Looks for an element with the ID scroll__here at scrolls to it
- */
-function scrollToMarker(){
- var obj = $('scroll__here');
- if(obj) obj.scrollIntoView();
-}
-
-/**
- * Looks for an element with the ID focus__this at sets focus to it
- */
-function focusMarker(){
- var obj = $('focus__this');
- if(obj) obj.focus();
-}
-
-/**
- * Remove messages
- */
-function cleanMsgArea(){
- var elems = getElementsByClass('(success|info|error)',document,'div');
- if(elems){
- for(var i=0; i<elems.length; i++){
- elems[i].style.display = 'none';
- }
- }
+ jQuery('div.JSpopup').hide();
}
/**
@@ -459,50 +314,6 @@ addInitEvent(function(){
}
});
-/**
- * Add the event handler to the actiondropdown
- *
- * @author Andreas Gohr <andi@splitbrain.org>
- */
-addInitEvent(function(){
- var selector = $('action__selector');
- if(!selector) return;
-
- addEvent(selector,'change',function(e){
- this.form.submit();
- });
-
- $('action__selectorbtn').style.display = 'none';
-});
-
-/**
- * Display error for Windows Shares on browsers other than IE
- *
- * @author Michael Klier <chi@chimeric.de>
- */
-function checkWindowsShares() {
- if(!LANG['nosmblinks']) return true;
- if(document.all != null) return true;
-
- var elems = getElementsByClass('windows',document,'a');
- if(elems){
- for(var i=0; i<elems.length; i++){
- var share = elems[i];
- addEvent(share,'click',function(){
- alert(LANG['nosmblinks']);
- });
- }
- }
-}
-
-/**
- * Add the event handler for the Windows Shares check
- *
- * @author Michael Klier <chi@chimeric.de>
- */
-addInitEvent(function(){
- checkWindowsShares();
-});
/**
* Highlight the section when hovering over the appropriate section edit button
diff --git a/lib/scripts/subscriptions.js b/lib/scripts/subscriptions.js
deleted file mode 100644
index d701f258f..000000000
--- a/lib/scripts/subscriptions.js
+++ /dev/null
@@ -1,46 +0,0 @@
-/**
- * Hide list subscription style if target is a page
- *
- * @author Adrian Lang <lang@cosmocode.de>
- */
-
-addInitEvent(function () {
- var form = $('subscribe__form');
- if (!form) {
- return;
- }
-
- var styleradios = {};
-
- function update_state() {
- if (!this.checked) {
- return;
- }
- if (this.value.match(/:$/)) {
- styleradios.list.parentNode.style.display = '';
- } else {
- styleradios.list.parentNode.style.display = 'none';
- if (styleradios.list.checked) {
- styleradios.digest.checked = 'checked';
- }
- }
- }
-
- var cur_sel = null;
-
- var inputs = form.getElementsByTagName('input');
- for (var i = 0; i < inputs.length ; ++i) {
- switch (inputs[i].name) {
- case 'sub_target':
- addEvent(inputs[i], 'click', update_state);
- if (inputs[i].checked) {
- cur_sel = inputs[i];
- }
- break;
- case 'sub_style':
- styleradios[inputs[i].value] = inputs[i];
- break;
- }
- }
- update_state.call(cur_sel);
-});
diff --git a/lib/scripts/toolbar.js b/lib/scripts/toolbar.js
index 3f967448c..2306ef5db 100644
--- a/lib/scripts/toolbar.js
+++ b/lib/scripts/toolbar.js
@@ -12,47 +12,55 @@ var pickercounter=0;
* @author Andreas Gohr <andi@splitbrain.org>
*/
function initToolbar(tbid,edid,tb, allowblock){
- var toolbar = $(tbid);
- if(!toolbar) return;
- var edit = $(edid);
- if(!edit) return;
- if(edit.readOnly) return;
+ var $ = jQuery;
+ if (typeof tbid == 'string') {
+ var toolbar = $('#' + tbid);
+ } else {
+ var toolbar = $(tbid);
+ }
+
+ if(toolbar.length == 0) return;
+
+ var edit = $('#' + edid);
+ if(edit.length == 0) return;
+
+ if(edit.attr('readOnly')) return;
if (typeof allowblock === 'undefined') {
allowblock = true;
}
//empty the toolbar area:
- toolbar.innerHTML='';
+ toolbar.html('');
var cnt = tb.length;
+
for(var i=0; i<cnt; i++){
if (!allowblock && tb[i].block === true) {
continue;
}
var actionFunc;
- // create new button
- var btn = createToolButton(tb[i]['icon'],
+ // create new button (jQuery object)
+ var btn = $(createToolButton(tb[i]['icon'],
tb[i]['title'],
tb[i]['key'],
tb[i]['id'],
- tb[i]['class']);
-
+ tb[i]['class']));
// type is a tb function -> assign it as onclick
actionFunc = 'tb_'+tb[i]['type'];
- if( isFunction(window[actionFunc]) ){
- addEvent(btn,'click', bind(window[actionFunc],btn,tb[i],edid));
- toolbar.appendChild(btn);
+ if( $.isFunction(window[actionFunc]) ){
+ btn.bind('click', bind(window[actionFunc],btn,tb[i],edid) );
+ toolbar.append(btn);
continue;
}
// type is a init function -> execute it
actionFunc = 'addBtnAction'+tb[i]['type'].charAt(0).toUpperCase()+tb[i]['type'].substring(1);
- if( isFunction(window[actionFunc]) ){
+ if( $.isFunction(window[actionFunc]) ){
if(window[actionFunc](btn, tb[i], edid)){
- toolbar.appendChild(btn);
+ toolbar.append(btn);
}
continue;
}
@@ -153,7 +161,7 @@ function tb_insert(btn, props, edid) {
*/
function tb_mediapopup(btn, props, edid) {
window.open(
- DOKU_BASE+props['url']+encodeURIComponent(NS),
+ DOKU_BASE+props['url']+encodeURIComponent(NS)+'&edid='+encodeURIComponent(edid),
props['name'],
props['options']);
return false;
@@ -197,10 +205,14 @@ function tb_autohead(btn, props, edid){
function addBtnActionPicker(btn, props, edid) {
var pickerid = 'picker'+(pickercounter++);
createPicker(pickerid, props, edid);
- addEvent(btn,'click',function(){
- pickerToggle(pickerid,btn);
- return false;
- });
+
+ btn.click(
+ function() {
+ pickerToggle(pickerid,btn);
+ return false;
+ }
+ );
+
return true;
}
@@ -214,31 +226,33 @@ function addBtnActionPicker(btn, props, edid) {
* @author Andreas Gohr <gohr@cosmocode.de>
*/
function addBtnActionLinkwiz(btn, props, edid) {
- linkwiz.init($(edid));
- addEvent(btn,'click',function(){
- linkwiz.toggle();
+ dw_linkwiz.init(jQuery('#'+edid));
+ jQuery(btn).click(function(){
+ dw_linkwiz.toggle();
return false;
});
return true;
}
+
/**
* Show/Hide a previosly created picker window
*
* @author Andreas Gohr <andi@splitbrain.org>
*/
function pickerToggle(pickerid,btn){
- var picker = $(pickerid);
- if(picker.style.marginLeft == '-10000px'){
- var x = findPosX(btn);
- var y = findPosY(btn);
- picker.style.left = (x+3)+'px';
- picker.style.top = (y+btn.offsetHeight+3)+'px';
- picker.style.marginLeft = '0px';
- picker.style.marginTop = '0px';
- }else{
- picker.style.marginLeft = '-10000px';
- picker.style.marginTop = '-10000px';
+ var picker = jQuery('#' + pickerid);
+ if (picker.css('marginLeft') == '-10000px'){
+ var x = findPosX(btn[0]);
+ var y = findPosY(btn[0]);
+
+ picker.css('left',(x+3)+'px')
+ .css('top', (y+btn[0].offsetHeight+3)+'px')
+ .css('marginLeft', '0px')
+ .css('marginTop', '0px');
+ } else {
+ picker.css('marginLeft', '-10000px')
+ .css('marginTop', '-10000px');
}
}
@@ -248,10 +262,10 @@ function pickerToggle(pickerid,btn){
* @author Andreas Gohr <andi@splitbrain.org>
*/
function pickerClose(){
- var pobjs = getElementsByClass('picker');
+ var pobjs = jQuery('#picker');
for(var i=0; i<pobjs.length; i++){
- pobjs[i].style.marginLeft = '-10000px';
- pobjs[i].style.marginTop = '-10000px';
+ pobjs[i].css('marginLeft', '-10000px')
+ .css('marginTop', '-10000px');
}
}
diff --git a/lib/scripts/tree.js b/lib/scripts/tree.js
new file mode 100644
index 000000000..98d3f55d4
--- /dev/null
+++ b/lib/scripts/tree.js
@@ -0,0 +1,96 @@
+/*jslint white: true, onevar: true, undef: true, nomen: true, eqeqeq: true, plusplus: true, bitwise: true, regexp: false, newcap: true, immed: true, sloppy: true */
+/*global jQuery, window, DOKU_BASE, DEPRECATED, bind*/
+
+jQuery.fn.dw_tree = function(overrides) {
+ var dw_tree = {
+
+ /**
+ * Delay in ms before showing the throbber.
+ * Used to skip the throbber for fast AJAX calls.
+ */
+ throbber_delay: 500,
+
+ $obj: this,
+
+ toggle_selector: 'a.idx_dir',
+
+ init: function () {
+ this.$obj.delegate(this.toggle_selector, 'click', this,
+ this.toggle);
+ },
+
+ /**
+ * Open or close a subtree using AJAX
+ * The contents of subtrees are "cached" until the page is reloaded.
+ * A "loading" indicator is shown only when the AJAX call is slow.
+ *
+ * @author Andreas Gohr <andi@splitbrain.org>
+ * @author Ben Coburn <btcoburn@silicodon.net>
+ * @author Pierre Spring <pierre.spring@caillou.ch>
+ */
+ toggle: function (e) {
+ var $listitem, $sublist, timeout, $clicky, show_sublist, dw_tree, opening;
+
+ e.preventDefault();
+
+ dw_tree = e.data;
+ $clicky = jQuery(this);
+ $listitem = $clicky.closest('li');
+ $sublist = $listitem.find('ul').first();
+ opening = $listitem.hasClass('closed');
+ $listitem.toggleClass('open closed');
+ dw_tree.toggle_display($clicky, opening);
+
+ // if already open, close by hiding the sublist
+ if (!opening) {
+ $sublist.dw_hide();
+ return;
+ }
+
+ show_sublist = function (data) {
+ $sublist.hide();
+ if (typeof data !== 'undefined') {
+ $sublist.html(data);
+ }
+ if ($listitem.hasClass('open')) {
+ // Only show if user didn’t close the list since starting
+ // to load the content
+ $sublist.dw_show();
+ }
+ };
+
+ // just show if already loaded
+ if ($sublist.length > 0) {
+ show_sublist();
+ return;
+ }
+
+ //prepare the new ul
+ $sublist = jQuery('<ul class="idx"/>');
+ $listitem.append($sublist);
+
+ timeout = window.setTimeout(
+ bind(show_sublist, '<li><img src="' + DOKU_BASE + 'lib/images/throbber.gif" alt="loading..." title="loading..." /></li>'), dw_tree.throbber_delay);
+
+ dw_tree.load_data(function (data) {
+ window.clearTimeout(timeout);
+ show_sublist(data);
+ }, $clicky);
+ },
+
+ toggle_display: function ($clicky, opening) {
+ },
+
+ load_data: function (show_data, $clicky) {
+ show_data();
+ }
+ };
+
+ jQuery.extend(dw_tree, overrides);
+
+ if (!overrides.deferInit) {
+ dw_tree.init();
+ }
+
+ return dw_tree;
+};
diff --git a/lib/scripts/tw-sack.js b/lib/scripts/tw-sack.js
index b5a5c8861..cc988f5be 100644
--- a/lib/scripts/tw-sack.js
+++ b/lib/scripts/tw-sack.js
@@ -66,6 +66,8 @@ function sack(file){
};
this.runAJAX = function(urlstring){
+ DEPRECATED('Please use jQuery.post() or any other of jQuery\'s AJAX methods.');
+
this.responseStatus = new Array(2);
if(this.failed && this.AjaxFailedAlert){
alert(this.AjaxFailedAlert);
diff --git a/lib/styles/all.css b/lib/styles/all.css
new file mode 100644
index 000000000..915ced5d6
--- /dev/null
+++ b/lib/styles/all.css
@@ -0,0 +1,49 @@
+/**
+ * Basic styles. These styles are needed for basic DokuWiki functions
+ * regardless of the used template. Templates can override them of course
+ */
+
+div.clearer {
+ clear: both;
+ font-size: 0;
+ line-height: 0;
+ height: 0;
+ overflow: hidden;
+}
+
+div.no {
+ display: inline;
+ margin: 0;
+ padding: 0;
+}
+
+.hidden {
+ display: none;
+}
+
+/* image alignment */
+.medialeft {
+ float: left;
+}
+.mediaright {
+ float: right;
+}
+.mediacenter {
+ display: block;
+ margin-left: auto;
+ margin-right: auto;
+}
+
+/* table cell alignment */
+.leftalign { text-align: left; }
+.centeralign { text-align: center; }
+.rightalign { text-align: right; }
+
+/* underline */
+em.u {
+ font-style: normal;
+ text-decoration: underline;
+}
+em em.u {
+ font-style: italic;
+}
diff --git a/lib/styles/print.css b/lib/styles/print.css
new file mode 100644
index 000000000..76bc6d3bc
--- /dev/null
+++ b/lib/styles/print.css
@@ -0,0 +1,23 @@
+/**
+ * Basic styles. These styles are needed for basic DokuWiki functions
+ * regardless of the used template. Templates can override them of course
+ */
+
+/* messages with msg() */
+div.error,
+div.info,
+div.success,
+div.notify {
+ display: none;
+}
+
+/* section edit button */
+.secedit {
+ display: none;
+}
+
+/* modal windows */
+.JSpopup,
+#link__wiz {
+ display: none;
+}
diff --git a/lib/styles/style.css b/lib/styles/screen.css
index 395f82b78..80a161f19 100644
--- a/lib/styles/style.css
+++ b/lib/styles/screen.css
@@ -3,23 +3,6 @@
* regardless of the used template. Templates can override them of course
*/
-div.clearer {
- clear: both;
- line-height: 0;
- height: 0;
- overflow: hidden;
-}
-
-div.no {
- display: inline;
- margin: 0;
- padding: 0;
-}
-
-.hidden {
- display: none;
-}
-
/* messages with msg() */
div.error,
div.info,
@@ -59,38 +42,9 @@ div.notify {
border-bottom-color: #ffa;
}
-
-/* image alignment */
-.medialeft {
- float: left;
-}
-.mediaright {
- float: right;
-}
-.mediacenter {
- display: block;
- margin-left: auto;
- margin-right: auto;
-}
-
-/* table cell alignment */
-.leftalign { text-align: left; }
-.centeralign { text-align: center; }
-.rightalign { text-align: right; }
-
-/* underline */
-em.u {
- font-style: normal;
- text-decoration: underline;
-}
-em em.u {
- font-style: italic;
-}
-
/* modal windows */
.JSpopup,
-#link__wiz,
-#media__popup {
+#link__wiz {
position: absolute;
background-color: #fff;
color: #000;
@@ -98,6 +52,16 @@ em em.u {
overflow: hidden;
}
+/* media manager popup toggle buttons */
+
+#media__popup_content button.button {
+ border-style: outset;
+}
+
+#media__popup_content button.selected {
+ border-style: inset;
+}
+
/* syntax highlighting code */
.code .br0 { color: #66cc66; }
diff --git a/lib/tpl/default/_linkwiz.css b/lib/tpl/default/_linkwiz.css
index 060707377..fd40a0019 100644
--- a/lib/tpl/default/_linkwiz.css
+++ b/lib/tpl/default/_linkwiz.css
@@ -16,6 +16,7 @@
background-color: __background_alt__;
height: 16px;
margin-bottom: 5px;
+ cursor: move;
}
#link__wiz_close {
diff --git a/lib/tpl/default/_mediaoptions.css b/lib/tpl/default/_mediaoptions.css
index 19e2c4853..68a5b9fa7 100644
--- a/lib/tpl/default/_mediaoptions.css
+++ b/lib/tpl/default/_mediaoptions.css
@@ -1,24 +1,6 @@
/* --- popup --- */
-#media__popup {
- background-color:__background__;
- display:none;
- border: 1px solid __border__;
- position: absolute;
- width:280px;
-}
-
-#media__popup h1 {
- text-align:center;
- font-weight:normal;
- background-color: __background_alt__;
- height: 16px;
- margin-bottom: 5px;
- font-size:12px;
- border-bottom: 0;
-}
-
-#media__popup p {
+#media__popup_content p {
display:block;
line-height:14pt;
margin:0.5em;
@@ -28,28 +10,24 @@
padding:4px 0;
}
-#media__popup label {
+#media__popup_content label {
float:left;
width:9em;
}
-#media__popup .button {
+#media__popup_content .button {
margin-left:auto;
margin-right:auto;
}
-#media__popup .btnlbl {
+#media__popup_content .btnlbl {
text-align:center;
}
-#media__popup .btnlbl input {
+#media__popup_content .btnlbl input {
margin:0 1em;
}
-#media__closeimg {
- float:right;
-}
-
/* --- display options --- */
#media__linkopts label,
diff --git a/lib/tpl/default/design.css b/lib/tpl/default/design.css
index 09a9ecf01..1fdf2bfac 100644
--- a/lib/tpl/default/design.css
+++ b/lib/tpl/default/design.css
@@ -85,8 +85,10 @@ div.dokuwiki fieldset {
}
div.dokuwiki textarea.edit {
- font-family: monospace;
- font-size: 14px;
+ font-family: monospace, serif;
+ /* second generic font fixes problem with font-size, see
+ http://meyerweb.com/eric/thoughts/2010/02/12/fixed-monospace-sizing/ */
+ font-size: 100%;
color: __text__;
background-color: __background__;
border: 1px solid __border__;
@@ -464,9 +466,14 @@ div.dokuwiki blockquote {
padding-left: 3px;
}
+div.dokuwiki pre,
+div.dokuwiki code {
+ font-family: monospace, serif;
+ /* second generic font fixes problem with font-size, see
+ http://meyerweb.com/eric/thoughts/2010/02/12/fixed-monospace-sizing/ */
+ font-size: 100%;
+}
div.dokuwiki pre {
- font-family: monospace;
- font-size: 120%;
padding: 0.5em;
border: 1px dashed __border__;
color: __text__;
@@ -519,11 +526,6 @@ div.dokuwiki dl.file dt {
}
-/* inline code words */
-div.dokuwiki code {
- font-size: 120%;
-}
-
/* inline tables */
div.dokuwiki table.inline {
background-color: __background__;
@@ -652,10 +654,12 @@ div.dokuwiki table.diff td {
font-family: monospace;
font-size: 100%;
}
-div.dokuwiki td.diff-addedline {
+div.dokuwiki td.diff-addedline,
+div.dokuwiki span.diff-addedline {
background-color: #ddffdd;
}
-div.dokuwiki td.diff-deletedline {
+div.dokuwiki td.diff-deletedline,
+div.dokuwiki span.diff-deletedline {
background-color: #ffffbb;
}
div.dokuwiki td.diff-context {
diff --git a/lib/tpl/default/images/UWEB.png b/lib/tpl/default/images/UWEB.png
index ea03aec94..292ade4ed 100644
--- a/lib/tpl/default/images/UWEB.png
+++ b/lib/tpl/default/images/UWEB.png
Binary files differ
diff --git a/lib/tpl/default/images/UWEBshadow.png b/lib/tpl/default/images/UWEBshadow.png
index 212444f0e..8c4e5f829 100644
--- a/lib/tpl/default/images/UWEBshadow.png
+++ b/lib/tpl/default/images/UWEBshadow.png
Binary files differ
diff --git a/lib/tpl/default/images/apple-touch-icon.png b/lib/tpl/default/images/apple-touch-icon.png
new file mode 100644
index 000000000..45fa4e7b0
--- /dev/null
+++ b/lib/tpl/default/images/apple-touch-icon.png
Binary files differ
diff --git a/lib/tpl/default/images/button-cc.gif b/lib/tpl/default/images/button-cc.gif
index 5861d637f..c7a403a9e 100644
--- a/lib/tpl/default/images/button-cc.gif
+++ b/lib/tpl/default/images/button-cc.gif
Binary files differ
diff --git a/lib/tpl/default/images/button-dw.png b/lib/tpl/default/images/button-dw.png
index 39d5f56a9..97272d968 100644
--- a/lib/tpl/default/images/button-dw.png
+++ b/lib/tpl/default/images/button-dw.png
Binary files differ
diff --git a/lib/tpl/default/images/button-rss.png b/lib/tpl/default/images/button-rss.png
index b036f7152..f2438043f 100644
--- a/lib/tpl/default/images/button-rss.png
+++ b/lib/tpl/default/images/button-rss.png
Binary files differ
diff --git a/lib/tpl/default/images/buttonshadow.png b/lib/tpl/default/images/buttonshadow.png
index f60be309f..b96ebf759 100644
--- a/lib/tpl/default/images/buttonshadow.png
+++ b/lib/tpl/default/images/buttonshadow.png
Binary files differ
diff --git a/lib/tpl/default/images/inputshadow.png b/lib/tpl/default/images/inputshadow.png
index d286beb22..480044986 100644
--- a/lib/tpl/default/images/inputshadow.png
+++ b/lib/tpl/default/images/inputshadow.png
Binary files differ
diff --git a/lib/tpl/default/images/link_icon.gif b/lib/tpl/default/images/link_icon.gif
index 815ccb1b1..d0a92f2fa 100644
--- a/lib/tpl/default/images/link_icon.gif
+++ b/lib/tpl/default/images/link_icon.gif
Binary files differ
diff --git a/lib/tpl/default/images/mail_icon.gif b/lib/tpl/default/images/mail_icon.gif
index 50a87a9a0..437d28fe1 100644
--- a/lib/tpl/default/images/mail_icon.gif
+++ b/lib/tpl/default/images/mail_icon.gif
Binary files differ
diff --git a/lib/tpl/default/images/tocdot2.gif b/lib/tpl/default/images/tocdot2.gif
index 3d39c2e73..e2b5f15cb 100644
--- a/lib/tpl/default/images/tocdot2.gif
+++ b/lib/tpl/default/images/tocdot2.gif
Binary files differ
diff --git a/lib/tpl/default/images/windows.gif b/lib/tpl/default/images/windows.gif
index 4f12acce1..64dfeb6fb 100644
--- a/lib/tpl/default/images/windows.gif
+++ b/lib/tpl/default/images/windows.gif
Binary files differ
diff --git a/lib/tpl/default/main.php b/lib/tpl/default/main.php
index 754a6e482..26e84fde6 100644
--- a/lib/tpl/default/main.php
+++ b/lib/tpl/default/main.php
@@ -28,8 +28,7 @@ if (!defined('DOKU_INC')) die();
</title>
<?php tpl_metaheaders()?>
-
- <link rel="shortcut icon" href="<?php echo tpl_getFavicon() ?>" />
+ <?php echo tpl_favicon(array('favicon', 'mobile')) ?>
<?php /*old includehook*/ @include(dirname(__FILE__).'/meta.html')?>
</head>
@@ -92,7 +91,7 @@ if (!defined('DOKU_INC')) die();
<!-- wikipage stop -->
</div>
- <div class="clearer">&nbsp;</div>
+ <div class="clearer"></div>
<?php tpl_flush()?>
diff --git a/lib/tpl/default/media.css b/lib/tpl/default/media.css
index d412fd9cf..7b558a80b 100644
--- a/lib/tpl/default/media.css
+++ b/lib/tpl/default/media.css
@@ -32,6 +32,10 @@
margin-bottom: 0.5em;
}
+#media__manager a.select {
+ cursor: pointer;
+}
+
/* --- Tree formatting --- */
#media__tree img {
diff --git a/lib/tpl/default/print.css b/lib/tpl/default/print.css
index 15c6dad29..45b60aad2 100644
--- a/lib/tpl/default/print.css
+++ b/lib/tpl/default/print.css
@@ -33,23 +33,10 @@ div.meta {
text-align: right;
}
-
-div.notify,
-div.info,
-div.success,
-div.error,
-div.breadcrumbs,
-div.secedit {
+div.breadcrumbs {
display: none;
}
-div.clearer {
- clear: both;
- line-height: 0;
- height: 0;
- overflow: hidden;
-}
-
/* --------------------- Text formating -------------------------------- */
@@ -110,31 +97,15 @@ img.media {
margin: 3px;
}
+/* the styles for media images are already in
+ lib/styles/all.css, these are additional styles */
img.medialeft {
- border: 0;
- float: left;
margin: 0 1.5em 0 0;
}
-
img.mediaright {
- border: 0;
- float: right;
margin: 0 0 0 1.5em;
}
-
img.mediacenter {
- display: block;
- margin-left: auto;
- margin-right: auto;
-}
-
-/* underline */
-em.u {
- font-style: normal;
- text-decoration: underline;
-}
-em em.u {
- font-style: italic;
}
/* unordered lists */
@@ -253,17 +224,5 @@ table.inline td {
border: 1px solid #000000;
}
-.leftalign {
- text-align: left;
-}
-
-.centeralign {
- text-align: center;
-}
-
-.rightalign {
- text-align: right;
-}
-
.toc, .footerinc, .header, .bar, .user { display: none; }
diff --git a/lib/tpl/default/rtl.css b/lib/tpl/default/rtl.css
index e40dd966d..82c85839b 100644
--- a/lib/tpl/default/rtl.css
+++ b/lib/tpl/default/rtl.css
@@ -55,8 +55,7 @@ div.dokuwiki li ol {
div.dokuwiki a.urlextern,
div.dokuwiki a.interwiki,
div.dokuwiki a.windows,
-div.dokuwiki a.mail,
-div.dokuwiki a.mail.JSnocheck {
+div.dokuwiki a.mail {
/* should work but doesn't - so we just disable icons here*/
/*
background-position: right 1px;
diff --git a/lib/tpl/index.php b/lib/tpl/index.php
index a55081738..0273e5678 100644
--- a/lib/tpl/index.php
+++ b/lib/tpl/index.php
@@ -8,6 +8,9 @@
* @author Andreas Gohr <andi@splitbrain.org>
* @author Anika Henke <anika@selfthinker.org>
*/
+if(!defined('DOKU_INC')) define('DOKU_INC',dirname(__FILE__).'/../../');
+if(!defined('NOSESSION')) define('NOSESSION',1);
+require_once(DOKU_INC.'inc/init.php');
?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
@@ -41,9 +44,6 @@
</head>
<body>
<?php
-if(!defined('DOKU_INC')) define('DOKU_INC',dirname(__FILE__).'/../../');
-require_once(DOKU_INC.'inc/init.php');
-
$ini = @parse_ini_file($conf['template'].'/style.ini',true);
if ($ini) {
echo '<table>';