Compare commits

...

356 commits

Author SHA1 Message Date
Heiko August
e1515c1b84 Fix: replace the obsolete column name "filename" with the new name "pathname" 2025-04-03 22:00:57 +02:00
Heiko August
e99a16c489 Change: add the new version number to the files index.php and config/VERSION 2025-03-23 18:51:59 +01:00
Heiko August
5c81c0d144 Change: add the changes since 20241215.1 to the changelog 2025-03-23 18:51:59 +01:00
Heiko August
2b6abc25d4 Change: add the files to replace to the upgrade script 2025-03-23 18:51:59 +01:00
Heiko August
c86fa13cd3 Change: correct date and time formats for Arabic language
According to https://en.wikipedia.org/wiki/Date_and_time_notation_in_Bahrain
2025-03-17 23:38:17 +01:00
Heiko August
eb9d9a00a0 Change: correct date and time formats for Simplified Chinese language
According to https://en.wikipedia.org/wiki/Date_and_time_notation_in_Asia#Greater_China
2025-03-17 23:38:17 +01:00
Heiko August
26222f0efc Change: correct date and time formats for Traditional Chinese language
According to https://en.wikipedia.org/wiki/Date_and_time_notation_in_Asia#Greater_China
2025-03-17 23:38:17 +01:00
Heiko August
11744f257e Change: correct date and time formats for Croatian language
According to https://en.wikipedia.org/wiki/Date_and_time_notation_in_Croatia
2025-03-17 23:38:17 +01:00
Heiko August
fbdc08d133 Change: enclosing the date and time format schemes in Danish language with single quotes
According to https://en.wikipedia.org/wiki/Date_and_time_notation_in_Denmark
2025-03-17 23:38:17 +01:00
Heiko August
5e2f007ed5 Change: add correct date and tme formats to French language
According to https://en.wikipedia.org/wiki/Date_and_time_notation_in_France
2025-03-17 23:38:17 +01:00
Heiko August
fafdf876f8 Change: enclose German language date and time schemes in single quotes 2025-03-17 23:38:17 +01:00
Heiko August
e2499bb981 Change: add the correct date and time format for Italian language
According to https://en.wikipedia.org/wiki/Date_and_time_notation_in_Italy
2025-03-17 23:38:17 +01:00
Heiko August
b5d9b7cc15 Change: enclose date and time formatting schemes and correct short date for Norwegian language
According to https://en.wikipedia.org/wiki/Date_and_time_notation_in_Norway
2025-03-17 23:38:17 +01:00
Heiko August
bd0d5d3cda Change: correct date and time format for Russian language
According to https://en.wikipedia.org/wiki/Date_and_time_notation_in_Russia
2025-03-17 23:38:17 +01:00
Heiko August
96bac06cf6 Change: enclose date and time formatting schemes for Spanish language
Check also https://en.wikipedia.org/wiki/Date_and_time_notation_in_Spain
2025-03-17 23:38:17 +01:00
Heiko August
ccfcfc4232 Change: add the correct date and time format to Swedish language
According to https://en.wikipedia.org/wiki/Date_and_time_notation_in_Sweden
2025-03-17 23:38:17 +01:00
Heiko August
5159c8b8e0 Change: Tamil tome format is unknown to me, add am/pm to 12h-time format 2025-03-17 23:38:17 +01:00
Heiko August
3010ed8c42 Change: add the correct date and time format to the Turkish language
According to https://en.wikipedia.org/wiki/Date_and_time_notation_in_Turkey
2025-03-17 23:38:17 +01:00
Heiko August
59967e28e0 Fix: add am/pm to the date format definition for English language 2025-03-17 23:38:17 +01:00
Michael Lösler
b64c634090
Blank (#802)
- no-break space added to the checkbox elements data_privacy_agreement and terms_of_use_agree  so that the boxes match show_signature and email_notification
2025-03-12 20:27:03 +01:00
Heiko August
a333233418 Change: add a furter level of indentation 2025-03-12 18:29:01 +01:00
Heiko August
065435d1dd Change: replace class .small with .normalform, this increases the font size a bit 2025-03-12 18:29:01 +01:00
Heiko August
82b57f2f40 Change: move the link to the password-forgotten form to the buttonbar of the login form 2025-03-12 18:29:01 +01:00
Heiko August
9f798aae51 Change: add a link to the login to the registration form 2025-03-12 18:29:01 +01:00
Heiko August
db08605c3e Change: add class .buttonbar to the divs containing the form button(s) and link(s) 2025-03-12 18:29:01 +01:00
Heiko August
0b51685ac2 Change: move the explanations for logging in and registering into the card to its top 2025-03-12 18:29:01 +01:00
Heiko August
a8a313170b Change: add #card around the forms to make them appear similar 2025-03-12 18:29:01 +01:00
Heiko August
9c04c5f971 Fix: add the attributes autofocus and required to the e-mail input field 2025-03-12 16:55:24 +01:00
Heiko August
d6525285a2 Fix: change the type of the input field from "text" to "email" 2025-03-12 16:55:24 +01:00
Heiko August
feec4b7160 Fix: correct a spelling mistake that distorts the meaning (reaktiviert versus deaktiviert) 2025-03-12 16:31:29 +01:00
Heiko August
87eadebd85 Fix: use the correct column name for searching for the images database entry 2025-03-11 20:00:09 +01:00
Heiko August
e8c48891ad Fix: mark an image as not managed also if there is no entry in the uploads table …
… not only if there are entries but not for the current image.
2025-03-11 20:00:09 +01:00
Heiko August
6541b2bf5b Change: make mlf2_entries.pid, .tid, .category and .views unsigned in the installation and upgrade script 2025-03-10 21:53:46 +01:00
Heiko August
b98c007113 Change: add the changes to unsigned integer columns to the upgrade block for version 20241215.1 2025-03-10 21:53:46 +01:00
Heiko August
3442d08140 Change: add a foreign key that points to mlf2_userdata.user_id when altering the table mlf2_uploads 2025-03-10 21:53:46 +01:00
Heiko August
5f35c9d8b5 Change: add a foreign key that points to mlf2_userdata.user_id when creating the table mlf2_uploads
If a user gets deleted, the matching value in the column "uploader" automatically will be changed to NULL.
2025-03-10 21:53:46 +01:00
Heiko August
a30c0df76c Change: determine the table name prefix for all upgrade cases at once 2025-03-10 21:53:46 +01:00
Heiko August
dbfc617615 Change: add line to set the table prefix into constraint names
Those are necessary in example for foreign keys. We prefix Constraint names with "smbl_" followed by the table prefix to make them unique in the database.
2025-03-10 21:53:46 +01:00
Heiko August
bcf3781022 Change: add a bottom/end margin to the image list 2025-03-10 21:53:46 +01:00
Heiko August
a2d0ee16a9 Fix: always display the filter form, not only with displayed images 2025-03-10 21:53:46 +01:00
Heiko August
a942b95763 Fix: use the altered column name pathname instead the obsolete filename 2025-03-10 21:53:46 +01:00
Heiko August
4b9692666e Change: mark MLF version 20241215.1 to be an upgrade target 2025-03-10 21:53:46 +01:00
Heiko August
7dd2b3af0a Change: add the files to update when upgrading from version 20241215.1 2025-03-10 21:53:46 +01:00
Heiko August
783658994b Fix: remove the alter statement
It only repeats the charset conversion from the CREATE statement in the same upgrade step
2025-03-10 21:53:46 +01:00
Heiko August
1b30324722 Change: adapt the changes in the uploads table to the installation and the other upgrade steps 2025-03-10 21:53:46 +01:00
Heiko August
5c1366668f Fix: it makes no sense to allow NULL values if the column gets a unique index afterwards 2025-03-10 21:53:46 +01:00
Heiko August
d6ca049f5e Change: alter the uploads table when updating MLF 20241215.1
- delete duplicate file name entries (keep first entry)
- enlarge the column filename and rename it to pathname
- add unique index pathname to column pathname, if it not exists
2025-03-10 21:53:46 +01:00
Heiko August
1b295cf13b Change: new structure for updating MLF version 20241215.1 2025-03-10 21:53:46 +01:00
Heiko August
1b47cb6af4 Change: add the new styles also to style.css 2025-03-10 21:53:46 +01:00
Heiko August
b9de68d59c Change: add the filter to the management form if present and use it in the redirect afterwards 2025-03-10 21:53:46 +01:00
Heiko August
8e1f1a13b6 Change: offer the filter value to smarty and use it in the paginations 2025-03-10 21:53:46 +01:00
Heiko August
75560da8e6 Change: move the filter form method from POST to GET 2025-03-10 21:53:46 +01:00
Heiko August
b671e25f0c Change: server side of the filter mechanism for managing uploaded images 2025-03-10 21:53:46 +01:00
Heiko August
4f0d3c2fd0 Change: UI for filtering of uploads according to whether they already have a database entry or not 2025-03-10 21:53:46 +01:00
Heiko August
cb903ec37f Cleanup: another code style thingamabop 2025-03-10 21:53:46 +01:00
Heiko August
a3149deb8d Fix: if we find no user-ID set the ID as Null but do it as string while in PHP
The query including the word NULL is a string in PHP and NULL will only become a boolean when executing the query on the database server.
2025-03-10 21:53:46 +01:00
Heiko August
b4f623ae44 Cleanup: code style thingamabop 2025-03-10 21:53:46 +01:00
Heiko August
cc72db8d29 Change: redirect to the uploads list at the end of the recording 2025-03-10 21:53:46 +01:00
Heiko August
d786396836 Change: delete the database entry for the image before deleting it from the file system 2025-03-10 21:53:46 +01:00
Heiko August
e2108444aa Cleanup: remove obsolete array variable $unlisted 2025-03-10 21:53:46 +01:00
Heiko August
ecc1e640e9 Change: resize mlf2_uploads.filename from 64 to 128 bytes, add a unique key to the column 2025-03-10 21:53:46 +01:00
Heiko August
4eee73dfc3 Change: put the values blocks into the query to generate database entries and run the query 2025-03-10 21:53:46 +01:00
Heiko August
5e3b26bcb1 Change: reintroduce $rec_row and generate the values block of one image for the query 2025-03-10 21:53:46 +01:00
Heiko August
2e9f149c82 Change: move the code for generating database entries for images in front of the block for listing the uploaded images 2025-03-10 21:53:46 +01:00
Heiko August
247c414eb5 Change: move the code for deleting uploaded images in front of the block for displaying the uploaded images 2025-03-10 21:53:46 +01:00
Heiko August
9dc11cfa84 Change: remove testing code of the development stage 2025-03-10 21:53:46 +01:00
Heiko August
805ca07d46 Change: add the block for generating upload entries in database and determine the uploader if registered 2025-03-10 21:53:46 +01:00
Heiko August
22cf1f6c7c Change: add a button to call the function to add database entries for unmanaged uploaded images 2025-03-10 21:53:46 +01:00
Heiko August
e71f90ddd4 Change: add icons to show if there is a database entry for an uploaded image 2025-03-10 21:53:46 +01:00
Heiko August
574e09bc62 Change: formatting thingamabob for unified displaying of the variable initialisation 2025-03-10 21:53:46 +01:00
Heiko August
94b492c968 Change: join the initialisation of the variables into one section 2025-03-10 21:53:46 +01:00
Heiko August
b40bac6ada Change: add the status to the array elements of an entry in $image 2025-03-10 21:53:46 +01:00
Heiko August
f957b60365 Change: make mlf2_useronline.user_id unsigned in the installation and upgrade scripts 2025-03-10 20:51:38 +01:00
Heiko August
15b89b3ece Change: make mlf2_tags.id unsigned in the installation and upgrade scripts 2025-03-10 20:51:38 +01:00
Heiko August
e6df1416a4 Change: make mlf2_smilies.id unsigned in the installation and upgrade scripts 2025-03-10 20:51:38 +01:00
Heiko August
5230c55f9c Change: make mlf2_pages.id unsigned in the installation and upgrade scripts 2025-03-10 20:51:38 +01:00
Heiko August
a62336c381 Change: make mlf2_categories.id unsigned in the installation and upgrade scripts 2025-03-10 20:51:38 +01:00
Heiko August
26d0db86dc Change: make mlf2_bookmarks.id, .user_id and .posting_id unsigned in the installation and upgrade scripts 2025-03-10 20:51:38 +01:00
Heiko August
a8e22e937c Change: make mlf2_entries.id, .edited_by and .user_id unsigned in the installation and upgrade scripts 2025-03-10 20:51:38 +01:00
Heiko August
e305782f72 Change: make mlf2_userdata.user_id unsigned in the installation and upgrade scripts
Attention: When upgrading from 2.4.x it must be done before creating the new tables.
2025-03-10 20:51:38 +01:00
Michael Lösler
05bedc1c25
Permission (#795)
- Depending on the user type, the view of the thread list is restricted, #794
- https://mylittleforum.net/forum/index.php?id=18870
2025-03-05 21:58:41 +01:00
Michael Lösler
d17f2542b9 Update main.min.js
This is just a new compressed version of the main.js (using https://www.toptal.com/developers/javascript-minifier).
2025-02-17 20:31:35 +01:00
Heiko August
1b6f4f7892 Change: remove the function setFocusToContentForm and its call in main.min.js 2025-02-17 20:31:35 +01:00
Heiko August
56a1be1287 Change: remove the JS-function setFocusToContentForm
There is the HTML-attribute autofocus nowadays.
2025-02-17 20:31:35 +01:00
Michael Lösler
00a2a07198
Remove function setDefaultInputValue (#792)
- function `setDefaultInputValue` removed as proposed in #791
2025-02-15 14:56:38 +01:00
Heiko August
875577a7e3 Fix: add missing strings to the Arabic translation
Those was untranslated because of the non existing arabic translation at the time of adding them to the other languages.
2025-01-13 22:09:04 +01:00
Heiko August
d158bf8fca Fix: the value of the checkbox has to be the path/filename, not the counter 2025-01-13 21:50:12 +01:00
Heiko August
51ffcb6410 Fix: move the counter only when an image was found 2025-01-13 21:39:18 +01:00
Heiko August
625b2d0cf8 Change: replace the submit-input with a button 2025-01-13 21:39:18 +01:00
Heiko August
f45d811f02 Change: repurpose the managing checkbox, adapt the variable name, add a counter to the image array 2025-01-13 21:39:18 +01:00
Heiko August
a4d33000ce Change: the management container should be a list, not a paragraph 2025-01-13 21:39:18 +01:00
Heiko August
97d81f95ce Change: first attempt to display a list unrecorded uploads 2025-01-13 21:39:18 +01:00
Heiko August
4cd51a114c Change: add strings for the UI to check for uploads, missing in the uploads 2025-01-13 21:39:18 +01:00
Heiko August
e38de7753c Change: reformat the category options list to be more clearly arranged 2025-01-09 21:37:19 +01:00
Heiko August
b2b508d08c Fix: display the content of user.homepage and user.email as alternative text
A section thread_entry does not exist in the language files.
2025-01-09 21:37:19 +01:00
Heiko August
f35a60fed5 Fix: provide date and time of a posting in a time element in the posting preview 2025-01-09 21:37:19 +01:00
Heiko August
5626becae7 Fix: syntax error in the HTML-code in div.wrapper of the preview 2025-01-09 21:37:19 +01:00
Michael Lösler
9916a2729c
Access v2.0 (#785)
- depending on the forum settings, access to the user area is restricted
- https://mylittleforum.net/forum/index.php?id=18808
- (more) corrected version of #783
2024-12-30 20:22:35 +01:00
Michael Lösler
24f8b677cf
Revert "Access (#783)" (#784)
This reverts commit 9452c2fe0f.
2024-12-30 20:10:13 +01:00
Michael Lösler
9452c2fe0f
Access (#783)
- depending on the forum settings, access to the user area is restricted
- if-condition removed, which is fulfilled in every case (by surrounding global if-condition)
- https://mylittleforum.net/forum/index.php?id=18808
2024-12-30 11:51:06 +01:00
Heiko August
762f3acad3 Change: remove selectors with empty blocks which are not present in style.min.css 2024-12-29 18:04:12 +01:00
Heiko August
7221027151 Change: add missing spaces between properties and their values 2024-12-29 18:04:12 +01:00
Heiko August
e85d0147d6 Change: reformat style.css, one selector per line 2024-12-29 18:04:12 +01:00
Heiko August
8a23bea227 Change: reformat style.css, one property per line 2024-12-29 18:04:12 +01:00
Heiko August
a247742b84 Change: repeat the changes of style.min.css in style.css 2024-12-28 13:33:55 +01:00
Michael Lösler
a7877adace Toggle icon removed
- tiny toggle icon for the sidebar removed in table view
2024-12-28 13:33:55 +01:00
Michael Lösler
4c9cd99a95 JavaScript-Minification
- minificated/compressed version added (https://www.toptal.com/developers/javascript-minifier)
2024-12-28 13:33:55 +01:00
Heiko August
01e834eaed Change: small adjustments for the positions of the icon and the link text 2024-12-28 13:33:55 +01:00
Heiko August
f290498d47 Change: new icons for the sidebar toggle for narrow and wide viewports 2024-12-28 13:33:55 +01:00
Heiko August
1253769da2 Change: unitless line height, padding "0" and font weight "bold" for h2 in the sidebar 2024-12-28 13:33:55 +01:00
Heiko August
77927ea6e9 Change: replace the loop over the link collection with code for the one specific link 2024-12-28 13:33:55 +01:00
Heiko August
a2ce83f8f4 Change: remove variable icon for the removed toggle icon 2024-12-28 13:33:55 +01:00
Heiko August
f29d015dd1 Change: replace keyword var with const 2024-12-28 13:33:55 +01:00
Heiko August
75a97d9499 Change: remove the tiny toggle icon for the sidebar 2024-12-28 13:33:55 +01:00
Heiko August
7e9371323c Fix: configure the MySQL error reporting 2024-12-22 14:24:54 +01:00
Heiko August
a5704d99b9 Fix: use the exception object to display MySQL error information 2024-12-22 14:24:54 +01:00
Heiko August
ec0ea66e2c Change: add the changelogfor version 20241215.1 2024-12-15 23:01:28 +01:00
Heiko August
4e07a27020 Change: add the new version number to the files index.php and config/VERSION 2024-12-15 23:01:28 +01:00
Heiko August
7f21bc79ff Fix: correct the name of the language key for the reenabling-forum message 2024-12-15 23:01:28 +01:00
Heiko August
47e146061c Change: add the version 20240827.1 to the list of upgradable versions 2024-12-15 23:01:28 +01:00
Heiko August
8263af3bf2 Change: add date handling with NULL values to the upgrade blocks for 20240729.1 and 20240827.1
There was errors in some cases. This steps excludes the last error possibilities
2024-12-15 23:01:28 +01:00
Heiko August
b8640b3615 Change<. adapt the entries for files ti upgrade to the blocks for the previous versions 2024-12-15 23:01:28 +01:00
Heiko August
794a8470a3 Change: add the block for upgrading from version 20240827.1 2024-12-15 23:01:28 +01:00
Heiko August
3151626297 Fix: comparison of posting time and registration time was the wrong way round (> versus <) 2024-12-13 17:55:46 +01:00
Heiko August
54cfd3ae3e Change: provide only a Unix timestamp and let MySQL do the datetime magic
This makes it unnecessary to add an additional test for $posting_time being a proper formatted datetime value.
2024-12-13 17:55:46 +01:00
Heiko August
94eb3d8db8 Change: add a second clause in where to take into account the date of the posting in the check for a user name collision 2024-12-13 17:55:46 +01:00
Heiko August
c238f822bb Change: generate $posting_time with the current time for a new and initial saving time of a posting for an edited posting 2024-12-13 17:55:46 +01:00
Heiko August
0d988fb66c Fix: remove the type attribute from the script element, text/javascript is already the default value 2024-12-10 21:25:37 +01:00
Heiko August
570d6b7650 Cleanup: remove the empty line between style and script elements in the avatar template 2024-12-10 21:25:37 +01:00
Heiko August
3fb9541b87 Fix: remove the unnecessary comment markers from the style element 2024-12-10 21:25:37 +01:00
Heiko August
7b369f1708 Changr: add the close window button also to the upload form …
… and make it invisible when submitting the image to upload.
2024-12-10 21:01:55 +01:00
Heiko August
7ed5491bfb Change: add JS and CSS code to make the spinning "throbber" gif visible 2024-12-10 21:01:55 +01:00
Heiko August
5fd65373fc Change: make the rules for the image upload template and the avatar template equal 2024-12-10 21:01:55 +01:00
Heiko August
3bcc4ab511 Change: remove CSS-rules for .delete and its children, element was removed 2024-12-10 21:01:55 +01:00
Heiko August
06b9ab308e Change: set margin-block for p.instruction and p.small 2024-12-10 21:01:55 +01:00
Heiko August
af4f3d7848 Change: set the font size for p.instruction to 0.82em 2024-12-10 21:01:55 +01:00
Heiko August
d2903cb71e Cleanup: remove the empty {literal} at the end of the JS-script block 2024-12-10 21:01:55 +01:00
Heiko August
b218f96bce Change: styling of system message headings (h2) 2024-12-10 21:01:55 +01:00
Heiko August
3968216730 Change: rewrite the JS-code to close the popup window with a button 2024-12-10 21:01:55 +01:00
Heiko August
d1f3f21089 Change: rename setPictureToProfil to setPictureToProfile and reformat the code 2024-12-10 21:01:55 +01:00
Heiko August
3affd55e55 Change: formatting of lists, especially the one item list to display the avatar image 2024-12-10 21:01:55 +01:00
Heiko August
00fe9979dc Change: formatting of the main form elements 2024-12-10 21:01:55 +01:00
Heiko August
a0da7ed990 Change: replace the partially JS generated steering elements for viewing a present avatar with form buttons 2024-12-10 21:01:55 +01:00
Heiko August
4df17d0a30 Change: add styling of the elements header and main 2024-12-10 21:01:55 +01:00
Heiko August
38d1f24ffb Change: reformatting of image displaying and the downsizing message 2024-12-10 21:01:55 +01:00
Heiko August
49588649cf Change: add element main to the default view of an existing or just uploaded avatar 2024-12-10 21:01:55 +01:00
Heiko August
785c95d98d Change: add class .instruction for the paragraph, naming the requirements 2024-12-10 21:01:55 +01:00
Heiko August
e2b33f6b1c Change: reformatting of the upload success section 2024-12-10 21:01:55 +01:00
Heiko August
315b7f1a2a Change: reformatting of the upload error section 2024-12-10 21:01:55 +01:00
Heiko August
b0e1f4acb7 Change: put the heading for showing or deleting the uploaded avatar image into element header 2024-12-10 21:01:55 +01:00
Heiko August
80f3317dbc Change: put the heading (h1) for the upload form into a header element 2024-12-10 21:01:55 +01:00
Heiko August
0686c7280d Change: reformatting the upload avatar form to use the same structure as the upload image form 2024-12-10 21:01:55 +01:00
Heiko August
2903f0309a Change: reformatting the HTML-source of the message block in case of disabled feature 2024-12-10 21:01:55 +01:00
Heiko August
50f376f72d Change: apply the properties for a:hover also to a:focus 2024-12-10 21:01:55 +01:00
Heiko August
45e1d8a427 Change: use the same values for link properties as in the upload image template 2024-12-10 21:01:55 +01:00
Heiko August
9bb8e12316 Change: unify the properties of a:link and a:visited into a, use shorthand for text colour 2024-12-10 21:01:55 +01:00
Heiko August
ad9e67f5d7 Change: remove obsolete line height definition from .small 2024-12-10 21:01:55 +01:00
Heiko August
f48068a975 Change: adjust the font size to the same value as in the image upload form 2024-12-10 21:01:55 +01:00
Heiko August
cfd56463a6 Change: adjust the text color for message boxes 2024-12-10 21:01:55 +01:00
Heiko August
6dad642fa7 Change: restructure the CSS properties for message boxes 2024-12-10 21:01:55 +01:00
Heiko August
cec62006a3 Change: apply the same rules for h1 as in the template for image upload 2024-12-10 21:01:55 +01:00
Heiko August
24817297dc Change: apply the box model border-box to all elements of the document 2024-12-10 21:01:55 +01:00
Heiko August
80c4bb0d2e Change: remove redundant rules, those are already defined for body 2024-12-10 21:01:55 +01:00
Heiko August
73d2033acf Change use shorthands, relative units and same values like for the upload image template 2024-12-10 21:01:55 +01:00
Heiko August
be43c2f1d5 Change: reformatting of the CSS properties without any functional change 2024-12-10 21:01:55 +01:00
Heiko August
d211dde44b Change: remove the CDATA-comments 2024-12-10 21:01:55 +01:00
Heiko August
6c09ebf7c8 Change: reorder the positions of the Smarty-tags {literal} and {/literal} 2024-12-10 21:01:55 +01:00
Heiko August
c705139cae Change: formatting of #imgtab list items as flexboxes 2024-12-08 22:49:46 +01:00
Heiko August
4b749ffd09 Change: give the list #imgtab a minimal and maximal width and center it 2024-12-08 22:49:46 +01:00
Heiko August
bfc48ae4bb Change: use unobstrusive JS to fade in the spinning 'throbber' image 2024-12-08 22:49:46 +01:00
Heiko August
f328c30466 Change: reformatting of the return on invalid state orders 2024-12-08 22:49:46 +01:00
Heiko August
535d06b6f5 Cleanup: remove comment markers from the style block, that's an completely outdated techique 2024-12-08 22:49:46 +01:00
Heiko August
32e7b2482b Change: formatting of the insert image description elements 2024-12-08 22:49:46 +01:00
Heiko August
c9ee28e9a7 Change: add text-decoration to a:active for better visibility
and a bit of experimenting with the sub features of text-decoration.
2024-12-08 22:49:46 +01:00
Heiko August
c205022b7b Change: use the shorthand notation for link text colours 2024-12-08 22:49:46 +01:00
Heiko August
e6468df376 Change: summarise the rules for a:link and a:visited into a 2024-12-08 22:49:46 +01:00
Heiko August
8a239c6795 Change: apply CSS-rules for a:hover also to a:focus 2024-12-08 22:49:46 +01:00
Heiko August
515e1d3c66 Change: reformatting of the CSS rules for links (elements a) 2024-12-08 22:49:46 +01:00
Heiko August
fbc0ece19e Change: replace elements div#header with header elements 2024-12-08 22:49:46 +01:00
Heiko August
4d47314177 Change: replace elements div#wrapper with main elements 2024-12-08 22:49:46 +01:00
Heiko August
e3ef91d4f2 Change: display all visible elements centered in the form #del-upload-form 2024-12-08 22:49:46 +01:00
Heiko August
59ae06121f Change: adjust the position of the cross in .deletelink to match better the new font size definition 2024-12-08 22:49:46 +01:00
Heiko August
b3993b723f Change: use the same font size for .insert-desc and .deletelink as for .small 2024-12-08 22:49:46 +01:00
Heiko August
090214af03 Change: use a slightly smaller font size for .small 2024-12-08 22:49:46 +01:00
Heiko August
2a97654a34 Change: formulate the selector less specific to applying not only to divs 2024-12-08 22:49:46 +01:00
Heiko August
86cb084a76 Change: show buttons without background and border when inside #imgtab and containing an image 2024-12-08 22:49:46 +01:00
Heiko August
13759ed784 change: show the cursor as hand when hovering a button 2024-12-08 22:49:46 +01:00
Heiko August
1bc42f6c9d Change: run the function insertCode when finding clicked buttons in ul#imgtab 2024-12-08 22:49:46 +01:00
Heiko August
7dd0876009 Change: rewrite JS-function insertCode for general use with buttons around the images 2024-12-08 22:49:46 +01:00
Heiko August
c426105c52 Change: remove the type attribute because "text/javascript" already is the default value 2024-12-08 22:49:46 +01:00
Heiko August
4bacdf1dc3 Change: remove the code enclosing CDATA comment
It's not necessary in HTML(5).
2024-12-08 22:49:46 +01:00
Heiko August
74489dda22 Change: remove the JS inline code to insert the just now uploaded image 2024-12-08 22:49:46 +01:00
Heiko August
f59caf585a Change: add the link to the uploaded image gallery also to the upload success view 2024-12-08 22:49:46 +01:00
Heiko August
97a75fb03e Change: reformatting of the downsizing notice 2024-12-08 22:49:46 +01:00
Heiko August
3afcf7e368 Change: replace the non-JS insert image instruction with the JS one 2024-12-08 22:49:46 +01:00
Heiko August
7f4543f0dc Change: add insert image instruction also to the image browsing view 2024-12-08 22:49:46 +01:00
Heiko August
5c1b529076 Change: rewrite the insert image instruction for an uploaded image without inline JS 2024-12-08 22:49:46 +01:00
Heiko August
4391964824 Change: put the images into button if they should be clickable, remove JS-code 2024-12-08 22:49:46 +01:00
Heiko August
3146ca0452 Change: rename the ids of the upload and the delete image forms for distinction 2024-12-08 22:49:46 +01:00
Heiko August
ed4373f95a Change: reformatting of the image upload from 2024-12-08 22:49:46 +01:00
Heiko August
6ffd766094 Change: reformatting of the HTML-source of the information about no present uploaded images 2024-12-08 22:49:46 +01:00
Heiko August
5b93a3ca3c Change: reformatting of the HTML-source of the deleting confirmation form 2024-12-08 22:49:46 +01:00
Heiko August
2c460eb5b0 Cleanup: remove unnecessary CSS-rules 2024-12-08 22:49:46 +01:00
Heiko August
c1fc1b4a71 Change: reformatting of the properties of elements with class .deletelink 2024-12-08 22:49:46 +01:00
Heiko August
3aa680981c Fix: add missing font family monospace 2024-12-08 22:49:46 +01:00
Heiko August
eefcbed5eb Change: reformatting of the properties for the element code 2024-12-08 22:49:46 +01:00
Heiko August
85f5a58d3c Change: make the cursor a pointer only in the upload galery but not …
… in the views of newly uploaded images and for image deleting confirmation.
2024-12-08 22:49:46 +01:00
Heiko August
0210f1cec0 Change: move the centering of images from img to #imgtab img 2024-12-08 22:49:46 +01:00
Heiko August
9e4c2d9e00 Change: formatting of the upload form similar to the rest of the MLF-forms 2024-12-08 22:49:46 +01:00
Heiko August
4f0bae3be4 Change: replace pixel-based value for font size with an em-based value 2024-12-08 22:49:46 +01:00
Heiko August
3cabe244b9 Change: remove redundant line-height, is already defined for body 2024-12-08 22:49:46 +01:00
Heiko August
3053a8f8c6 Change: reformatting of the properties of elements with class .small 2024-12-08 22:49:46 +01:00
Heiko August
2699f7b9e8 Change: remove the now obsolete class .browse
The CSS-rules was applied to img and #imgtab img instead
2024-12-08 22:49:46 +01:00
Heiko August
b5f47f1cf1 Change: reuse the code for the image galery with a shrinked image size 2024-12-08 22:49:46 +01:00
Heiko August
aa322fcb12 Change: rework the galery of uploaded images
- replace the table with a list
- add CSS-rules to set the size of the images without JavaScript
- remove the now obsolete JS-function getMaxWidth
2024-12-08 22:49:46 +01:00
Heiko August
9d4a57f6dd Change: fix the page header in all possible views 2024-12-08 22:49:46 +01:00
Heiko August
c01ed5a4f7 Change: reformatting of the already existing div#header 2024-12-08 22:49:46 +01:00
Heiko August
5d8a9ac52f Change: add div#header where it has been missing, put h1 into div#header 2024-12-08 22:49:46 +01:00
Heiko August
b8f03a249d Change: reformatting of div#wrapper, adding it, where it's missing 2024-12-08 22:49:46 +01:00
Heiko August
cb89119ef4 Change: restructuring of error and success messages
Put the messages into dedicated divs with a heading (h2) and their optional additional text into the matching elements.
2024-12-08 22:49:46 +01:00
Heiko August
7a0c228d4f Change: reduce the font size for h1 2024-12-08 22:49:46 +01:00
Heiko August
168e50ad69 Change: set box-sizing: border-box for all elements 2024-12-08 22:49:46 +01:00
Heiko August
5f8e739bc8 Change: join identical properties and values for .ok and .caution into one block 2024-12-08 22:49:46 +01:00
Heiko August
c4aa95a138 Change: green text colour for .ok, darker red for .caution 2024-12-08 22:49:46 +01:00
Heiko August
1848a10237 Change. remove the separate formatting for #wrapper
… use the default page settings for all direct childs of body instead
2024-12-08 22:49:46 +01:00
Heiko August
bf013f7f18 Change: reformatting of the properties for .caution and .ok 2024-12-08 22:49:46 +01:00
Heiko August
1dd05148d1 Change: remove definitions for element p because everything necessary is set elsewhere 2024-12-08 22:49:46 +01:00
Heiko August
c6dab07b51 Change: remove font-family because of redundance, set size in unit em instead of px 2024-12-08 22:49:46 +01:00
Heiko August
8c1ae75f23 Change: reformatting of the CSS properties for the elements h1 2024-12-08 22:49:46 +01:00
Heiko August
8b4dfa83db Change: replace the float contruction for the childs of #header with a flexbox 2024-12-08 22:49:46 +01:00
Heiko August
455f08a257 Change: remove font size definition because they only repeats the properties of body 2024-12-08 22:49:46 +01:00
Heiko August
6c71b95e0f Change: reformatting of the CSS-properties of the element #header 2024-12-08 22:49:46 +01:00
Heiko August
834bc48589 Change: redefinition of the font size for the document 2024-12-08 22:49:46 +01:00
Heiko August
7883477ab6 Change: reformatting of the CSS-properties for element body 2024-12-08 22:49:46 +01:00
Michael Lösler
a30281839a
User id (#771)
- check whether the user id is present in the session array to avoid incomplete queries
- add mysqli_real_escape_string for security reasons
- details: https://mylittleforum.net/forum/index.php?id=18760
2024-12-01 11:07:49 +01:00
Heiko August
3c5992e26d
Make WebP images appear in the uploaded-images browsing view (#769)
* Fix: add webp and svg to file types and collect all file types in one regex

* Change: allow file ending .jpeg also in the uploads listing of the admin area
2024-11-27 22:41:11 +01:00
Michael Lösler
7c578c3c7a
File filter (#768)
- WEBP file extension added, cf. #766
2024-11-27 21:45:15 +01:00
Michael Lösler
cfde25b39e
ISO-timestamps (#767)
According to #758, #761 timestamps should be formatted by HTML time elements, but entry date and edit date are still not formatted correctly. Time element is added to thread-view and linear thread-view as well as table-view.
2024-11-27 21:34:16 +01:00
Michael Lösler
3b54474b2a
Code cleaning (#765)
- redundant code parts reduced
2024-11-26 23:03:09 +01:00
Michael Lösler
1fd5a0aec4
Scope of statement (#764)
- Change scope of ‘$pid_result_sql’ statement to be available in conditions
2024-11-26 17:44:07 +01:00
Michael Lösler
ef576dba70
eid vs. id in SQL stmt (#763)
- SQL statement corrected as reported and analysed by https://mylittleforum.net/forum/index.php?id=18724 , i.e. `eid` vs. `id`
- To avoid side effects with entry.inc.php, where `$spam_sql_and` is also used, the column `eid` is renamed in the stmt by `id`
2024-11-26 10:25:11 +01:00
Michael Lösler
a812ecca3e
Date (#762)
- WHERE clause `= '0000-00-00 00:00:00'` replaced by `<= STR_TO_DATE('1900-01-01','%Y-%d-%m')`
2024-11-25 21:39:47 +01:00
Michael Lösler
f0063b73ea
ISO-timestamps (#761)
According to #758, timestamps should be formatted by HTML time elements, but entry date and edit date are still not formatted correctly
2024-11-24 13:33:23 +01:00
Heiko August
49401587cc Change: some formatting foo in the avatar template 2024-11-19 22:46:01 +01:00
Heiko August
736f0ad4a0 Change: add the meta element viewport which makes the document responsive in a mobile device (avatar.tpl) 2024-11-19 22:46:01 +01:00
Heiko August
5bc23c35bf Change: set the documents charset according to the rules of HTML 5 (avatar.tpl) 2024-11-19 22:46:01 +01:00
Heiko August
f14371ac36 Change: move the HTML from XHTML 1.0 strict to HTML 5 (avatar.tpl) 2024-11-19 22:46:01 +01:00
Heiko August
cfc8076b23 Change: some formatting foo in the upload template 2024-11-19 22:46:01 +01:00
Heiko August
eb73b75194 Change: add the meta element viewport which makes the document responsive in a mobile device 2024-11-19 22:46:01 +01:00
Heiko August
0015525048 Change: set the documents charset according to the rules of HTML 5 2024-11-19 22:46:01 +01:00
Heiko August
18298d3131 Change: move the HTML from XHTML 1.0 strict to HTML 5
This commit affects naming the doctype and the remving of the XML namespace and the naming of the document language according to the rules of HTML 5
2024-11-19 22:46:01 +01:00
Heiko August
fa89d768f2 Fix: add the time element and the ISO-formatted timestamp to the flag ham page 2024-11-19 22:09:00 +01:00
Heiko August
6d9ab8d3f5 Fix: add the ISO-formatted timestamp to the time element in the report spam page 2024-11-19 22:09:00 +01:00
Heiko August
9eb86358ae Fix: add the rules of the previous two commits to style.css 2024-11-19 21:31:08 +01:00
Heiko August
eafa51b6e3 Fix: add forgotten CSS-rule for links in a buttonbar 2024-11-19 21:31:08 +01:00
Heiko August
5160e13e8f Fix: add forgotten styling rule for labels of class "main" 2024-11-19 21:31:08 +01:00
Heiko August
003f3150a3 Change: general reformatting of the posting form template 2024-11-17 23:37:05 +01:00
Heiko August
43b2e87f1c Change: remove tabindex, because it caused weird tab order 2024-11-17 23:37:05 +01:00
Heiko August
c9bef69929 Change: code indentation in the search form template 2024-11-17 23:37:05 +01:00
Heiko August
e6116134c7 Change: labels for the search term field and the category selection 2024-11-17 23:37:05 +01:00
Heiko August
70c857c379 Change: put the search selection on top of the submit button 2024-11-17 23:37:05 +01:00
Heiko August
e73b8b0d46 Change: reformatting a few form templates 2024-11-17 23:37:05 +01:00
Heiko August
d1457f2105 Change: attribute required for contact form fields 2024-11-17 23:37:05 +01:00
Heiko August
06a7c1dec5 Change: add attribute required to the author name and subject fields 2024-11-17 23:37:05 +01:00
Heiko August
187e1f6f24 Change: add attribute required to the input fields in the login form 2024-11-17 23:37:05 +01:00
Heiko August
f7c370a653 Change: reformat several forms 2024-11-17 23:37:05 +01:00
Heiko August
22f17d797c Change: set input type to email for the senders e-mail address 2024-11-17 23:37:05 +01:00
Heiko August
a1c375a7f7 Change: replace input type submit/reset with buttons in several forms 2024-11-17 23:37:05 +01:00
Heiko August
c19e421ac7 Change: set type number for inputs, reformatting 2024-11-17 23:37:05 +01:00
Heiko August
d5811d5b76 Change: replace input type submit with button 2024-11-17 23:37:05 +01:00
Heiko August
5adcb0002b Change: reformat templates for flagging postings as spam or ham 2024-11-17 23:37:05 +01:00
Heiko August
56b8ccb8d1 Change: remove inactive, commented code 2024-11-17 23:37:05 +01:00
Heiko August
45a6512fc7 Change: matching input types for homepage url and birthday date 2024-11-17 23:37:05 +01:00
Heiko August
e3eebaf41e Cleanup: further corrections of HTML-code indentation 2024-11-17 23:37:05 +01:00
Heiko August
ca60c3c740 Change: replace input of type submit with a button 2024-11-17 23:37:05 +01:00
Heiko August
dabc7f84e4 Cleanup: remove the attribute tabindex because the values are reflecting only the natural order of the inputs 2024-11-17 23:37:05 +01:00
Heiko August
927859a476 Change: add proper types in the input fields, new attributes autofocus, required 2024-11-17 23:37:05 +01:00
Heiko August
2d5f33812d Cleanup: reformat email edit form 2024-11-17 23:37:05 +01:00
Heiko August
37c5d14438 Change: replace input submit with a button 2024-11-17 23:37:05 +01:00
Heiko August
2927fc931d Change: new attribute required for the password field
Replace the enclosing paragraph with div
2024-11-17 23:37:05 +01:00
Heiko August
9a74cb8a35 Change: set type "email" for the input fields, New atttributes: autofocus, required
Replace the enclosing paragraphs with divs
2024-11-17 23:37:05 +01:00
Heiko August
cfcfe75fcf Cleanup: code nesting, forgotten div 2024-11-17 23:37:05 +01:00
Heiko August
d4787abb71 Change: replace the strong element with a label for the new password field
New attribute: required
2024-11-17 23:37:05 +01:00
Heiko August
b82979798d Change: replace the strong element with a label for the old password field
New attributes: autofocus, required
2024-11-17 23:37:05 +01:00
Heiko August
dca2018056 Change: remove form elements enclosing div 2024-11-17 23:37:05 +01:00
Heiko August
42774f9183 Change: button to submit the password edit form 2024-11-17 23:37:05 +01:00
Heiko August
ced3fec8e5 Change: reformat the remove account form 2024-11-17 23:37:05 +01:00
Heiko August
aa2003c748 Change: replace the paragraph with a div and reformat the code 2024-11-17 23:37:05 +01:00
Heiko August
868a3a16b6 Change: remove the form enclosing div 2024-11-17 23:37:05 +01:00
Heiko August
4898b22769 Cleanup: partially reformatting of the template 2024-11-17 23:37:05 +01:00
Heiko August
40bf39a2dd Change: add attributes autofocus and required in the password input of the remove account form 2024-11-17 23:37:05 +01:00
Heiko August
60158bdb26 Change: replace inputs of types submit with buttons in the remove account form 2024-11-17 23:37:05 +01:00
Heiko August
81ed9ddc73 Fix: use background-position for inḿage in .a.internal, add missing rules to style.css 2024-10-28 22:38:22 +01:00
Heiko August
2033f905ba Change: unifiy common rules, use only background-position for images in rtl-languages 2024-10-28 22:38:22 +01:00
Heiko August
dbc01b85fa Change: apply the changes of the latest commit in style.min.css to style.css 2024-10-28 22:38:22 +01:00
Heiko August
4261dd0e42 Change: unify all common and often repeated rules for the thread tree subject link under .subject 2024-10-28 22:38:22 +01:00
Michael Lösler
3c93022020
user name (#752)
- add missing style definition defined in #749
2024-10-25 20:35:24 +02:00
Michael Lösler
3c61d31bc5
Existing username (#751)
- exclude the check for existing usernames when the admin/mod edits the post
- https://github.com/My-Little-Forum/mylittleforum/issues/750
2024-10-25 20:28:52 +02:00
Heiko August
7000bf6329 Change: replace the element <strong> for the user or author name with a <span> 2024-10-22 10:20:37 +02:00
Michael Lösler
d075a0a518
el.getAttribute("id") vs. el.id (#748)
If an element `el` does not have an `id`, `el.id` returns an (empty) string but `el.getAttribute("id")` returns `null` (at least in Opera), cf. #741
A condition has been added to catch errors (when using image or code without any attribute).
2024-10-07 21:23:26 +02:00
Michael Lösler
5cf8e52fa3 JavaScript-Minifikation
- compressed version of the main javascript
2024-09-29 13:02:35 +00:00
Heiko August
1f7ef6353d Revert "Change: adapt the changes in main.js to main.min.js"
This reverts commit 02a6a5c6be.
2024-09-29 13:02:35 +00:00
Heiko August
ea1542dc6f Change: adapt the changes in main.js to main.min.js 2024-09-29 13:02:35 +00:00
Heiko August
f093edcdb2 Cleanup: correct a few formatting issues (trailing tabs) 2024-09-29 13:02:35 +00:00
Heiko August
f5b42822fa Change: access no-text-icon with querySelector 2024-09-29 13:02:35 +00:00
Heiko August
3069b8baeb Change: add class .subject to subject links in thread trees, adapt access in JS 2024-09-29 13:02:35 +00:00
Heiko August
02c46a2f23 Change: add element time for the posting time and provide the machine readable timestamp 2024-09-29 13:02:35 +00:00
Heiko August
13a9d645a7 Change: move the icon for empty postings from after the subject to the metadata section 2024-09-29 13:02:35 +00:00
Heiko August
155846563c Change: split the author name and the tail with the metadata in the source code 2024-09-29 13:02:35 +00:00
Heiko August
a7e8562fd1 Fix: remove the separator behind the subject, was replaced with a CSS rule before 2024-09-29 13:02:35 +00:00
Heiko August
e47eb5d406 Change: split the codeline into two parts, one for subject and one for the metadata 2024-09-29 13:02:35 +00:00
Heiko August
88fa688743 Change: split the thread tree item line between swubject and metadata including the authors name 2024-09-29 13:02:35 +00:00
Heiko August
322609d1ae Fix: add the changed definition of sidebar width in wider viewports to style.css 2024-09-29 13:02:35 +00:00
Heiko August
e3948b34c6 Fix: restrict the content width to the width of element main 2024-09-29 13:02:35 +00:00
Heiko August
1ac8f1eef6 Change: add new attribute "writingsuggestions" with value "false"
This prevents AI based suggestions (exposure to the web based AI-service) for the password, if the password is shown as plaintext.
2024-09-15 12:35:35 +02:00
Michael Lösler
4fd0696bb6
JS Compression (#743)
c- mpressed main.js using https://www.toptal.com/developers/javascript-minifier
2024-09-15 12:12:48 +02:00
Michael Lösler
8b419931cb
CSS (#742)
- ltr <--> rtl corrected
- remove class `.checkbox`
2024-09-15 12:00:10 +02:00
Heiko August
f64d8d7c93 Change: remove class .checkbox to move the checkbox to the start of the line 2024-09-15 11:54:53 +02:00
Heiko August
2fcbe466a1 Change: move the help texts from behind the input into the label 2024-09-15 11:54:53 +02:00
Heiko August
7d0a88e6f0 Change: formatting of the bb-code and smilies formatting help 2024-09-15 11:54:53 +02:00
Heiko August
e488fb4a57 Change: add the strings for the instruction heading and the skip link to the template and the language files 2024-09-15 11:54:53 +02:00
Heiko August
2305068128 Cleanup: remove trailing spaces/tabs (again) 2024-09-15 11:54:53 +02:00
Heiko August
72daabbd12 Change: set margin to 0 because (at least) in Firefox a textarea has a small margin 2024-09-15 11:54:53 +02:00
Heiko August
dc858a2788 Change: restrict the bottom margin to all fieldsets except the last one 2024-09-15 11:54:53 +02:00
Heiko August
e61a92d3d8 Change: restrict the width of the posting form to 60em 2024-09-15 11:54:53 +02:00
Heiko August
2211d7d8eb Cleanup: remove the definitions for #more-smilies and its children elements
This ID was replaced with #additional-smilies a longer time ago.
2024-09-15 11:54:53 +02:00
Heiko August
5e763375c2 Change: remove the class .more-smilies from the button definition
The class is not needed anymore. It was used to format the button twice the width than the smiley buttons of class .default.
2024-09-15 11:54:53 +02:00
Heiko August
73f4f53996 Change: a bit of reformatting and correctiion of a phrasing error 2024-09-15 11:54:53 +02:00
Heiko August
c70532d177 Change: redefine the width and height of the posting textarea and remove the definitions for float 2024-09-15 11:54:53 +02:00
Heiko August
6b16cc2bc2 Change: define the maximal width of div#entry-input and text based input fields in #postingform 2024-09-15 11:54:53 +02:00
Heiko August
e57b0cf05f Change: unify the rules for images in buttons in #smiley-bar and #additional-smilies 2024-09-15 11:54:53 +02:00
Heiko August
dc6de3a392 Change: adapt the rules of #additional-smilies to the new HTML-structure of a list with buttons 2024-09-15 11:54:53 +02:00
Heiko August
c679782a73 Change: remove formatting of buttons in #smiley-bar
Was replaced by formatting of buttons in #format-bar.
2024-09-15 11:54:53 +02:00
Heiko August
779919c595 Fix: remove the float-based formatting for #format-bar amd #smiley-bar 2024-09-15 11:54:53 +02:00
Heiko August
5e21e13251 Change: add joint rules for bb-code buttons and smiley buttons 2024-09-15 11:54:53 +02:00
Heiko August
da86e8e9ab Change: replace formatting for #bbcode-bar with the more general formatting of #format-bar
This includes also general formatting of #smiley-bar.
2024-09-15 11:54:53 +02:00
Heiko August
87a3172f9e Change: make input.checkbox writing direction aware 2024-09-15 11:54:53 +02:00
Heiko August
a5e22b346f Change: add necessary margins to button#insert-quote and make it writing direction aware 2024-09-15 11:54:53 +02:00
Heiko August
3079ea9084 Change: add a bottom margin to label.textarea 2024-09-15 11:54:53 +02:00
Heiko August
55f70de068 Change: target all direct childs of fieldsets instead all div in #postingform 2024-09-15 11:54:53 +02:00
Heiko August
5785a0ba1f Change: format sticky selection, remove bullets, margin and padding 2024-09-15 11:54:53 +02:00
Heiko August
469af94fe6 Fix: remove the last added class "input", this label should not use display:block; 2024-09-15 11:54:53 +02:00
Heiko August
fd0328a92f Change: create the bb-code-buttons with the new HTML-structure of the instructions
The instruction items are now capsuled in an additional div. The JS-code has to respect this change.
2024-09-15 11:54:53 +02:00
Heiko August
049c131264 Change: create the buttons of smilies with the new HTML-structure of the instructions
The instruction items are now capsuled in an additional div. The JS-code has to respect this change.
2024-09-15 11:54:53 +02:00
Heiko August
a1af9b5215 Change: read the value for insertion of an additional smiley from the button value 2024-09-15 11:54:53 +02:00
Heiko August
da6be2bb72 Change: replace links with a list with buttons in the list of additional smilies 2024-09-15 11:54:53 +02:00
Heiko August
704b2f3937 Cleanup: remove trailing spaces/tabs, add spaces for better readability 2024-09-15 11:54:53 +02:00
Heiko August
33408247f2 Change: hide the complete div#formatting-help instead the both instruction blocks 2024-09-15 11:54:53 +02:00
Heiko August
2ea363ce1c Change: reorder the elements in fieldset#message
This is part of the preparation to place the button bars above the textarea.
2024-09-15 11:54:53 +02:00
Heiko August
696de3ed9d Change: determine the length once instead of with each loop pass 2024-09-15 11:54:53 +02:00
Heiko August
93edd1d979 Change: replace search for label in tag collection with a query selector 2024-09-15 11:54:53 +02:00
Heiko August
94eca06a09 Change: put the labels of the posting form above the inputs 2024-09-15 11:54:53 +02:00
Heiko August
8ea8d28afd Change: replace p with div in entry form, there are no paragraphs (p) 2024-09-15 11:54:53 +02:00
Heiko August
5613f33a9d Change: add the input description as suffix to the label
A description how to input something makes no sense *behind* the input field.
2024-09-15 11:54:53 +02:00
Heiko August
273eb53e7a Change: use the proper input types instead type text 2024-09-15 11:54:53 +02:00
Heiko August
449569e77b Change: replace input type=button with buttons 2024-09-15 11:54:53 +02:00
72 changed files with 5563 additions and 2001 deletions

View file

@ -1,6 +1,41 @@
my little forum changelog
-------------------------
20250323.1 (2025-03-23)
-----------------------
- feature: add database entries for uploaded images that was uploaded before the upload management was introduced, add new icons for it as SVG
- change: change the appearance of the sidebar toggle in its heading, add new icons for it as SVG
- change: replace a few occurences of JS-based focus setting to form fields with the corresponding HTML attributes
- change: all index columns and columns, that stores indexes as foreign keys are unsigned now, this doubles their value range
- change: new appearance of the templates for login, registration and sending forgotten passwords
- fix: added INTL time format strings to all language files according the languages own rules when known
- fix: remove the emtying of a search field when setting the focus to the field
- fix: display MySQL errors in the upgrade script, was broken before
- fix: a user list, restricted to logged-in users, was still displayed after users logout
- fix: several errors in the HTML structure in the posting form template
20241215.1 (2024-12-15)
-----------------------
- change: use modern form elements and field types, where it is appropriate
- change: set autofocus into the first input element of a form after loading the page, where it is appropriate
- change: add attribute required for form fields, that must be completed, this might prevent unnecessarily sending form contents
- change: rearrange the text input field and the formatting buttons in the posting form
- change: make the posting form behaviour better on mobile devices and for screen-reader programs
- change: rework of the popups for uploading images for use in postings and also the form for uploading avatar images
- change: reformatting of the thread tree items with breaking points to behave better in narrow viewports
- change: move the no-text icon from the end of the subject to the icon list after the metadata (author and date)
- change: set the posting date into a time element, enhances the machine readability
- fix: broken SQL query for selecting the postings of a specified category on a thread overview page
- fix: make images of type WebP appear in the uploaded images gallery in the upload images popup
- fix: restrict the sidebar in narrow viewports to its width
- fix: prevent the use of unhidden passwords for the AI training of browser vendors
- fix: added forgotten writing direction aware formatting for form elements
- fix: take the time of a posting and the time of registration of a user into account, when checking for a username collision
- fix: do not check for a username collision when an administrator or moderatior edits a posting of an unregistered forum user
- fix: remove tabindex attributes from form elements which caused a weird tab order on the posting form page
20240827.1 (2024-08-27)
-----------------------

View file

@ -1 +1 @@
20240827.1
20250323.1

View file

@ -948,19 +948,123 @@ if (isset($_SESSION[$settings['session_prefix'].'user_id']) && isset($_SESSION[$
die();
}
if (isset($_POST['delete_selected_uploads']) && isset($_POST['csrf_token']) && $_POST['csrf_token'] === $_SESSION['csrf_token']) {
if (isset($_POST['manage_uploads'])) {
$selected = $_POST['manage_uploads'];
$selected_uploads_count = count($selected);
for ($x=0; $x<$selected_uploads_count; $x++) {
$selected_uploads[$x]['name'] = htmlspecialchars($selected[$x]);
}
$action = 'delete_uploads';
}
else $action = 'list_uploads';
}
if (isset($_POST['delete_uploads_confirmed']) && isset($_POST['csrf_token']) && $_POST['csrf_token'] === $_SESSION['csrf_token']) {
if (isset($_POST['selected_confirmed'])) {
foreach ($_POST['selected_confirmed'] as $upload_rm) {
$qDelUploadEntry = "DELETE FROM ". $db_settings['uploads_table'] ."
WHERE pathname = '". mysqli_real_escape_string($connid, $upload_rm) ."'";
$rDelUploadEntry = mysqli_query($connid, $qDelUploadEntry);
if ($rDelUploadEntry !== false) {
$path_rm = 'images/uploaded/'. $upload_rm;
if (file_exists($path_rm)) {
@chmod($path_rm, 0777);
@unlink($path_rm);
}
}
}
}
header("location: index.php?mode=admin&action=list_uploads");
die();
}
if (isset($_POST['record_selected_uploads']) && isset($_POST['csrf_token']) && $_POST['csrf_token'] === $_SESSION['csrf_token']) {
if (isset($_POST['manage_uploads'])) {
$selected = $_POST['manage_uploads'];
$selected_uploads_count = count($selected);
$rec_row = [];
for ($x = 0; $x < $selected_uploads_count; $x++) {
// search for the first occurence of the image in a posting,
// determine the ID of the posting author,
// assume that it's the uploader
$qUploadName = "SELECT
user_id
FROM ". $db_settings['forum_table'] ."
WHERE text LIKE '%". mysqli_real_escape_string($connid, $selected[$x]) ."%'
ORDER BY time ASC
LIMIT 1";
$rUploadName = mysqli_query($connid, $qUploadName);
if ($rUploadName !== false && mysqli_num_rows($rUploadName) == 1) {
$row = mysqli_fetch_assoc($rUploadName);
$uploadAuthor = intval($row['user_id']);
if ($uploadAuthor <= 0)
$uploadAuthor = "Null";
} else {
$uploadAuthor = "Null";
}
// generate a row insert block for use in a statement to inserting multiple rows at once
$tstamp_temp = substr($selected[$x], 0, 14);
$tstamp = substr($tstamp_temp, 0, 4) ."-". substr($tstamp_temp, 4, 2) ."-". substr($tstamp_temp, 6, 2) ." ". substr($tstamp_temp, 8, 2) .":". substr($tstamp_temp, 10, 2) .":" .substr($tstamp_temp, 12, 2);
$rec_row[] = "(". $uploadAuthor .", '". mysqli_real_escape_string($connid, $selected[$x]) ."', '". mysqli_real_escape_string($connid, $tstamp) ."')";
}
$qInsertUploadData = "INSERT INTO `". $db_settings['uploads_table'] ."` (`uploader`, `pathname`, `tstamp`)
VALUES ". join(",\n", $rec_row) ."
ON DUPLICATE KEY UPDATE `pathname` = `pathname`";
$rInsertUploadData = mysqli_query($connid, $qInsertUploadData);
}
$filterString = (isset($_POST['filter']) && in_array($_POST['filter'], ['not-managed-images', 'managed-images'])) ? '&filter='. urlencode($_POST['filter']) : '';
header("location: index.php?mode=admin&action=list_uploads". $filterString);
die();
}
if (isset($_GET['action']) and $_GET['action'] == 'list_uploads') {
$images = [];
$listed = [];
$rUploadList = mysqli_query($connid, "SELECT pathname FROM ". $db_settings['uploads_table']);
if ($rUploadList !== false && mysqli_num_rows($rUploadList) > 0) {
while ($row = mysqli_fetch_assoc($rUploadList)) {
$listed[] = $row['pathname'];
}
}
$uploaded_images_path = 'images/uploaded/';
$images = array();
$browse_images = (isset($_GET['browse_images']) && $_GET['browse_images'] > 0) ? intval($_GET['browse_images']) : 1;
$i = 0;
$handle = opendir($uploaded_images_path);
while ($file = readdir($handle)) {
if (preg_match('/\.(gif|png|jpg|svg|webp)$/i', $file)) {
$images[] = $file;
if (preg_match('/\.(gif|png|jpe?g|svg|webp)$/i', $file)) {
$images[$i]['number'] = $i;
$images[$i]['pathname'] = $file;
if (empty($listed) || (!empty($listed) && !in_array($file, $listed))) {
$images[$i]['status'] = 0;
} else {
$images[$i]['status'] = 1;
}
$i++;
}
}
closedir($handle);
unset($i, $listed);
if ($images) {
rsort($images);
if (isset($_GET['filter']) && in_array($_GET['filter'], ['not-managed-images', 'managed-images'])) {
if ($_GET['filter'] == 'not-managed-images') {
$liveFilter['criterium'] = 'status';
$liveFilter['value'] = 0;
} else {
$liveFilter['criterium'] = 'status';
$liveFilter['value'] = 1;
}
$filter = $_GET['filter'];
$images = filter2DArrayWithKeyNValue($images, $liveFilter['criterium'], $liveFilter['value']);
}
$sort_array = [];
foreach ($images as $image) {
$sort_array[] = $image['pathname'];
}
array_multisort($sort_array, SORT_DESC, $images);
unset($sort_array);
$page_browse['total_items'] = count($images);
$page_browse['items_per_page'] = $settings['uploads_per_page'];
$total_pages = ceil($page_browse['total_items'] / $page_browse['items_per_page']);
@ -980,32 +1084,6 @@ if (isset($_SESSION[$settings['session_prefix'].'user_id']) && isset($_SESSION[$
$action = 'list_uploads';
}
if (isset($_POST['delete_selected_uploads']) && isset($_POST['csrf_token']) && $_POST['csrf_token'] === $_SESSION['csrf_token']) {
if (isset($_POST['uploads_remove'])) {
$selected = $_POST['uploads_remove'];
$selected_uploads_count = count($selected);
for ($x=0; $x<$selected_uploads_count; $x++) {
$selected_uploads[$x]['name'] = htmlspecialchars($selected[$x]);
}
$action = 'delete_uploads';
}
else $action = 'list_uploads';
}
if (isset($_POST['delete_uploads_confirmed']) && isset($_POST['csrf_token']) && $_POST['csrf_token'] === $_SESSION['csrf_token']) {
if (isset($_POST['selected_confirmed'])) {
foreach ($_POST['selected_confirmed'] as $upload_rm) {
$path_rm = 'images/uploaded/'. $upload_rm;
if (file_exists($path_rm)) {
@chmod($path_rm, 0777);
@unlink($path_rm);
}
}
}
header("location: index.php?mode=admin&action=list_uploads");
die();
}
if (empty($action)) $action='main';
$smarty->assign('action', $action);
@ -1724,6 +1802,7 @@ if (isset($_SESSION[$settings['session_prefix'].'user_id']) && isset($_SESSION[$
$smarty->assign('images_per_page', $page_browse['items_per_page']);
$smarty->assign('images', $images);
if (isset($start)) $smarty->assign('start', $start);
if (isset($filter)) $smarty->assign('filter', $filter);
}
break;
case 'delete_uploads':

View file

@ -12,7 +12,7 @@ if ($settings['avatars'] > 0 && isset($_SESSION[$settings['session_prefix'].'use
$filename = $avatarInfo === false ? false : $avatarInfo[1];
// remove existing avatar
if (isset($_GET['delete'])) {
if (isset($_POST['delete'])) {
if ($filename !== false && file_exists($uploaded_images_path.$filename)) {
@chmod($uploaded_images_path.$filename, 0777);
@unlink($uploaded_images_path.$filename);

View file

@ -32,7 +32,7 @@
if (isset($id) && $id > 0) {
$result = @mysqli_query($connid, "SELECT ft.id, ft.pid, ft.tid, ft.user_id, UNIX_TIMESTAMP(ft.time + INTERVAL " . $time_difference . " MINUTE) AS disp_time,
UNIX_TIMESTAMP(ft.time) AS time, UNIX_TIMESTAMP(edited + INTERVAL " . $time_difference . " MINUTE) AS edit_time,
UNIX_TIMESTAMP(ft.time) AS time, UNIX_TIMESTAMP(edited) as etime, UNIX_TIMESTAMP(edited + INTERVAL " . $time_difference . " MINUTE) AS edit_time,
UNIX_TIMESTAMP(edited - INTERVAL " . $settings['edit_delay'] . " MINUTE) AS edited_diff, edited_by, name, email,
subject, hp, location, ip, text, cache_text, show_signature, category, locked, views, edit_key,
user_name, user_type, user_email, email_contact, user_hp, user_location, signature, cache_signature, rst.user_id AS req_user,
@ -51,6 +51,8 @@
$entrydata = mysqli_fetch_array($result);
mysqli_free_result($result);
$entrydata['ISO_time'] = format_time('YYYY-MM-dd HH:mm:ss', $entrydata['time']);
$entrydata['edit_ISO_time'] = format_time('YYYY-MM-dd HH:mm:ss', $entrydata['etime']);
$entrydata['formated_time'] = format_time($lang['time_format_full'], $entrydata['disp_time']);
$entrydata['tags'] = getEntryTags($id);
@ -156,8 +158,10 @@
$data['name'] = htmlspecialchars($data['user_name']);
} else
$data['name'] = htmlspecialchars($data['name']);
$data['subject'] = htmlspecialchars($data['subject']);
$data['formated_time'] = format_time($lang['time_format'], $data['disp_time']);
$data['ISO_time'] = format_time('YYYY-MM-dd HH:mm:ss', $data['time']);
// set read or new status of messages
$data = getMessageStatus($data, $last_visit);
@ -246,6 +250,7 @@
$smarty->assign('user_type', htmlspecialchars($entrydata['user_type']));
$smarty->assign('disp_time', htmlspecialchars($entrydata['disp_time']));
$smarty->assign('ISO_time', htmlspecialchars($entrydata['ISO_time']));
$smarty->assign('formated_time', htmlspecialchars($entrydata['formated_time']));
$smarty->assign('locked', htmlspecialchars($entrydata['locked']));
@ -300,6 +305,7 @@
if ($entrydata["edited_diff"] > 0 && $entrydata["edited_diff"] > $entrydata["time"] && $settings['show_if_edited'] == 1) {
$smarty->assign('edited', true);
$smarty->assign('edit_time', htmlspecialchars($entrydata['edit_time']));
$smarty->assign('edit_ISO_time', htmlspecialchars($entrydata['edit_ISO_time']));
$entrydata['formated_edit_time'] = format_time($lang['time_format_full'], $entrydata['edit_time']);
$smarty->assign('formated_edit_time', htmlspecialchars($entrydata['formated_edit_time']));

View file

@ -1108,14 +1108,23 @@ function smilies($string) {
*/
function user_online($user_online_period = 10) {
global $connid, $db_settings, $settings;
if (isset($_SESSION[$settings['session_prefix'].'user_id'])) $user_id = $_SESSION[$settings['session_prefix'].'user_id']; else $user_id = 0;
if (isset($_SESSION[$settings['session_prefix'].'user_id']) && is_numeric($_SESSION[$settings['session_prefix'].'user_id'])) {
$user_id = $_SESSION[$settings['session_prefix'].'user_id'];
$ip = "uid_" . $user_id;
}
else {
$user_id = 0;
$ip = $_SERVER['REMOTE_ADDR'];
}
$diff = TIMESTAMP-($user_online_period * 60);
if (isset($_SESSION[$settings['session_prefix'].'user_id'])) $ip = "uid_".$_SESSION[$settings['session_prefix'].'user_id'];
else $ip = $_SERVER['REMOTE_ADDR'];
@mysqli_query($connid, "DELETE FROM ".$db_settings['useronline_table']." WHERE time < ".$diff);
list($is_online) = @mysqli_fetch_row(@mysqli_query($connid, "SELECT COUNT(*) FROM ".$db_settings['useronline_table']." WHERE ip= '".$ip."'"));
if ($is_online > 0) @mysqli_query($connid, "UPDATE ".$db_settings['useronline_table']." SET time='".TIMESTAMP."', user_id='".$user_id."' WHERE ip='".$ip."'");
else @mysqli_query($connid, "INSERT INTO ".$db_settings['useronline_table']." SET time='".TIMESTAMP."', ip='".$ip."', user_id='".$user_id."'");
list($is_online) = @mysqli_fetch_row(@mysqli_query($connid, "SELECT COUNT(*) FROM ".$db_settings['useronline_table']." WHERE ip= '".mysqli_real_escape_string($connid, $ip)."'"));
if ($is_online > 0)
@mysqli_query($connid, "UPDATE ".$db_settings['useronline_table']." SET time='".TIMESTAMP."', user_id='".intval($user_id)."' WHERE ip='".mysqli_real_escape_string($connid, $ip)."'");
else
@mysqli_query($connid, "INSERT INTO ".$db_settings['useronline_table']." SET time='".TIMESTAMP."', ip='".mysqli_real_escape_string($connid, $ip)."', user_id='".intval($user_id)."'");
}
/**
@ -1756,6 +1765,29 @@ function my_strpos($haystack, $needle, $offset = 0, $encoding = 'utf-8') {
}
}
/**
* remove array elements of a twodimensional array with a specific value of a specified key
*
* based on the code from @link https://stackoverflow.com/questions/4466159/delete-element-from-multidimensional-array-based-on-value
*
* @param array $array
* @param string $key
* @param mixed $value
* @return array $temp
*/
function filter2DArrayWithKeyNValue($array, $key, $value) {
// create array $temp
$temp = [];
foreach ($array as $item) {
if ($item[$key] == $value) {
// push the element to the array $temp
// if the value of $key is not equal to $value
array_push($temp, $item);
}
}
return $temp;
}
/**
* encodes sender or recipient name
*

View file

@ -45,43 +45,46 @@ $_SESSION[$settings['session_prefix'].'usersettings']['current_page'] = $page;
$descasc = "DESC";
$ul = ($page - 1) * $settings['threads_per_page'];
// database request
// database request
if ($categories == false) {
// no categories defined
$page_threads_and = "";
} elseif (is_array($categories) && $category <= 0) {
// there are categories and all categories or category selection should be shown
$pid_result_sql =
"SELECT COUNT(*) FROM " . $db_settings['forum_table'] . " AS ft
LEFT JOIN (SELECT eid FROM " . $db_settings['akismet_rating_table'] . " WHERE " . $db_settings['akismet_rating_table'] . ".spam = 1 UNION SELECT eid FROM " . $db_settings['b8_rating_table'] . " WHERE " . $db_settings['b8_rating_table'] . ".spam = 1) AS spam_list ON spam_list.eid = ft.id
WHERE pid = 0";
if (isset($category_selection_query) && $category == -1) {
// category selection
$category_ids_query = $category_selection_query;
$page_threads_and = " AND (sticky = 2 OR category IN (". $category_ids_query .")) ";
$display_pid_result = $pid_result_sql . $spam_sql_and . $page_threads_and;
$pid_result = mysqli_query($connid, $display_pid_result);
list($total_threads) = mysqli_fetch_row($pid_result);
mysqli_free_result($pid_result);
}
} elseif (is_array($categories) && $category > 0) {
// there are categories and only one category should be shown
if (in_array($category, $category_ids)) {
// how many entries?
$page_threads_and = " AND (sticky = 2 OR category = '". mysqli_real_escape_string($connid, $category) ."') ";
$display_pid_result = $pid_result_sql . $spam_sql_and . $page_threads_and;
$pid_result = mysqli_query($connid, $display_pid_result);
list($total_threads) = mysqli_fetch_row($pid_result);
mysqli_free_result($pid_result);
}
elseif (is_array($categories)) {
$page_threads_and = "";
} else {
if ($category > 0 && !in_array($category, $category_ids)) { // $category_ids defined in main.inc.php
// invalid category
header('Location: index.php');
exit;
}
// there are categories and only one category should be shown
elseif ($category > 0 && in_array($category, $category_ids)) {
// how many entries?
$page_threads_and = " AND (sticky = 2 OR category = '". mysqli_real_escape_string($connid, $category) ."') ";
}
// there are categories and all categories or category selection should be shown
elseif ($category == -1 && isset($category_selection_query)) { // $category_selection_query defined in main.inc.php
// category selection
$category_ids_query = $category_selection_query; // overwrite $category_ids_query, originally defined in main.inc.php
$page_threads_and = " AND (sticky = 2 OR category IN (". mysqli_real_escape_string($connid, $category_ids_query) .")) ";
}
elseif ($category == 0 && isset($category_ids_query)) { // $category_ids_query defined in main.inc.php
// show all categories (restricted to user type)
$page_threads_and = " AND (sticky = 2 OR category IN (". mysqli_real_escape_string($connid, $category_ids_query) .")) ";
}
if (!empty($page_threads_and)) {
$pid_result_sql =
"SELECT COUNT(*) FROM " . $db_settings['forum_table'] . " AS ft
LEFT JOIN (SELECT eid AS id FROM " . $db_settings['akismet_rating_table'] . " WHERE " . $db_settings['akismet_rating_table'] . ".spam = 1 UNION SELECT eid AS id FROM " . $db_settings['b8_rating_table'] . " WHERE " . $db_settings['b8_rating_table'] . ".spam = 1) AS spam_list ON spam_list.id = ft.id
WHERE pid = 0";
$display_pid_result = $pid_result_sql . $spam_sql_and . $page_threads_and; // $spam_sql_and defined in main.inc.php
$pid_result = mysqli_query($connid, $display_pid_result);
list($total_threads) = mysqli_fetch_row($pid_result);
mysqli_free_result($pid_result);
}
}
$display_page_threads =
@ -140,6 +143,7 @@ if ($result_count > 0) {
$data = getMessageStatus($data, $last_visit, $fold_threads);
// convert formated time to a utf-8:
$data['formated_time'] = format_time($lang['time_format'], $data['timestamp']);
$data['ISO_time'] = format_time('YYYY-MM-dd HH:mm:ss', $data['time']);
// set key 'not_classified_spam_ham' to decide, if an mod or admin should get notified about need of classification with an icon
if ((isset($_SESSION[$settings['session_prefix'].'user_id']) && isset($_SESSION[$settings['session_prefix'].'user_type']) && $_SESSION[$settings['session_prefix'].'user_type'] >= 1) && (($settings['akismet_entry_check'] == 1 && $data['akismet_checked'] == 0) || ($settings['b8_entry_check'] == 1 && $data['b8_checked'] == 0))) {
$data['not_classified_spam_ham'] = 1;
@ -170,7 +174,7 @@ if ($settings['latest_postings'] > 0) {
if ($category > 0) {
$latest_postings_category_sql = " AND category = " . intval($category);
} else {
$latest_postings_category_sql = " AND category IN (". $category_ids_query .")";
$latest_postings_category_sql = " AND category IN (". mysqli_real_escape_string($connid, $category_ids_query) .")";
}
}
$latest_postings_sql = $latest_postings_body_sql . $latest_postings_category_sql . $latest_postings_order_by_sql;

View file

@ -780,18 +780,27 @@ switch ($action) {
if ($id == 0 && $categories != false && empty($categories[$p_category]))
$errors[] = 'error_invalid_category';
// name reserved?
$result = mysqli_query($connid, "SELECT user_id, user_name FROM " . $db_settings['userdata_table'] . " WHERE lower(user_name) = '" . mysqli_real_escape_string($connid, my_strtolower($name, $lang['charset'])) . "'") or raise_error('database_error', mysqli_error($connid));
if (mysqli_num_rows($result) > 0) {
if (empty($_SESSION[$settings['session_prefix'] . 'user_id'])) {
$errors[] = 'error_name_reserved';
} elseif (isset($_SESSION[$settings['session_prefix'] . 'user_id'])) {
$data = mysqli_fetch_array($result);
if (isset($posting_user_id) && $data['user_id'] != $posting_user_id)
$errors[] = 'error_name_reserved';
}
if ($posting_mode == 1 && !empty($field['time'])) {
$posting_time = intval($field['time']);
} else {
$posting_time = time();
}
if (!$isModOrAdmin) {
// name reserved?
$result = mysqli_query($connid, "SELECT user_id, user_name FROM " . $db_settings['userdata_table'] . "
WHERE lower(user_name) = '" . mysqli_real_escape_string($connid, my_strtolower($name, $lang['charset'])) . "'
AND registered < FROM_UNIXTIME(". $posting_time .")") or raise_error('database_error', mysqli_error($connid));
if (mysqli_num_rows($result) > 0) {
if (empty($_SESSION[$settings['session_prefix'] . 'user_id'])) {
$errors[] = 'error_name_reserved';
} elseif (isset($_SESSION[$settings['session_prefix'] . 'user_id'])) {
$data = mysqli_fetch_array($result);
if (isset($posting_user_id) && $data['user_id'] != $posting_user_id)
$errors[] = 'error_name_reserved';
}
}
mysqli_free_result($result);
}
mysqli_free_result($result);
// check for not accepted words:
$joined_message = my_strtolower($name . ' ' . $email . ' ' . $hp . ' ' . $location . ' ' . $subject . ' ' . $text, $lang['charset']);
@ -1201,7 +1210,9 @@ switch ($action) {
// current time:
list($preview_time) = mysqli_fetch_row(mysqli_query($connid, "SELECT UNIX_TIMESTAMP(NOW() + INTERVAL " . $time_difference . " MINUTE)"));
$smarty->assign('preview_timestamp', $preview_time);
$preview_formated_time = format_time($lang['time_format_full'], $preview_time);
$preview_ISO_time = format_time('YYYY-MM-dd HH:mm:ss', $posting_time);
$smarty->assign('preview_ISO_time', $preview_ISO_time);
$preview_formated_time = format_time($lang['time_format_full'], $posting_time);
$smarty->assign('preview_formated_time', $preview_formated_time);
$smarty->assign('uniqid', htmlspecialchars($uniqid));
$smarty->assign('posting_mode', intval($posting_mode));
@ -1616,7 +1627,7 @@ switch ($action) {
break;
case 'report_spam':
$id = intval($_GET['report_spam']);
$result = mysqli_query($connid, "SELECT tid, pid, UNIX_TIMESTAMP(time + INTERVAL " . $time_difference . " MINUTE) AS disp_time,
$result = mysqli_query($connid, "SELECT tid, pid, UNIX_TIMESTAMP(time) AS time, UNIX_TIMESTAMP(time + INTERVAL " . $time_difference . " MINUTE) AS disp_time,
user_id, name, subject, category,
" . $db_settings['akismet_rating_table'] . ".spam AS akismet_spam, spam_check_status,
" . $db_settings['b8_rating_table'] . ".spam AS b8_spam, training_type
@ -1640,7 +1651,7 @@ switch ($action) {
$smarty->assign('pid', intval($field['pid']));
$smarty->assign('name', htmlspecialchars($field['name']));
$smarty->assign('subject', htmlspecialchars($field['subject']));
$smarty->assign('disp_time', htmlspecialchars($field['disp_time']));
$smarty->assign('ISO_time', htmlspecialchars(format_time('YYYY-MM-dd HH:mm:ss', $field['time'])));
$smarty->assign('formated_time', htmlspecialchars(format_time($lang['time_format_full'], $field['disp_time'])));
$smarty->assign('akismet_spam', intval($field['akismet_spam']));
$smarty->assign('akismet_spam_check_status', intval($field['spam_check_status']));
@ -1744,7 +1755,7 @@ switch ($action) {
break;
case 'flag_ham':
$id = intval($_GET['flag_ham']);
$result = mysqli_query($connid, "SELECT tid, pid, UNIX_TIMESTAMP(time + INTERVAL " . $time_difference . " MINUTE) AS disp_time,
$result = mysqli_query($connid, "SELECT tid, pid, UNIX_TIMESTAMP(time) AS time, UNIX_TIMESTAMP(time + INTERVAL " . $time_difference . " MINUTE) AS disp_time,
user_id, name, subject, category,
" . $db_settings['akismet_rating_table'] . ".spam AS akismet_spam, spam_check_status,
" . $db_settings['b8_rating_table'] . ".spam AS b8_spam, training_type
@ -1769,7 +1780,7 @@ switch ($action) {
$smarty->assign('pid', intval($field['pid']));
$smarty->assign('name', htmlspecialchars($field['name']));
$smarty->assign('subject', htmlspecialchars($field['subject']));
$smarty->assign('disp_time', htmlspecialchars($field['disp_time']));
$smarty->assign('ISO_time', htmlspecialchars(format_time('YYYY-MM-dd HH:mm:ss', $field['time'])));
$smarty->assign('formated_time', htmlspecialchars(format_time($lang['time_format_full'], $field['disp_time'])));
$smarty->assign('akismet_spam', intval($field['akismet_spam']));
$smarty->assign('akismet_spam_check_status', intval($field['spam_check_status']));

View file

@ -78,7 +78,7 @@ if (is_array($category_ids) && !in_array($data['category'], $category_ids)) {
$thread_sql =
"SELECT ft.id, ft.pid, ft.tid, ft.user_id, UNIX_TIMESTAMP(ft.time + INTERVAL " . intval($time_difference) . " MINUTE) AS disp_time,
UNIX_TIMESTAMP(last_reply + INTERVAL " . intval($time_difference) . " MINUTE) AS last_reply,
UNIX_TIMESTAMP(ft.time) AS time, UNIX_TIMESTAMP(edited + INTERVAL " . intval($time_difference) . " MINUTE) AS e_time,
UNIX_TIMESTAMP(ft.time) AS time, UNIX_TIMESTAMP(edited) AS edited_time, UNIX_TIMESTAMP(edited + INTERVAL " . intval($time_difference) . " MINUTE) AS e_time,
UNIX_TIMESTAMP(edited - INTERVAL " . $settings['edit_delay'] . " MINUTE) AS edited_diff, edited_by, name, email,
subject, hp, location, ip, text, cache_text, show_signature, views, category, locked, ip,
user_name, user_type, user_email, email_contact, user_hp, user_location, signature, cache_signature, edit_key, rst.user_id AS req_user,
@ -117,6 +117,8 @@ if (is_array($category_ids) && !in_array($data['category'], $category_ids)) {
$data['tags'] = $tags_array;
}
$data['formated_time'] = format_time($lang['time_format_full'], $data['disp_time']);
$data['ISO_time'] = format_time('YYYY-MM-dd HH:mm:ss', $data['time']);
$ago['days'] = floor((TIMESTAMP - $data['time']) / 86400);
$ago['hours'] = floor(((TIMESTAMP - $data['time']) / 3600) - ($ago['days'] * 24));
$ago['minutes'] = floor(((TIMESTAMP - $data['time']) / 60) - ($ago['hours'] * 60 + $ago['days'] * 1440));
@ -166,6 +168,7 @@ if (is_array($category_ids) && !in_array($data['category'], $category_ids)) {
if ($data['edited_diff'] > 0 && $data["edited_diff"] > $data["time"] && $settings['show_if_edited'] == 1) {
$data['edited'] = true;
$data['formated_edit_time'] = format_time($lang['time_format_full'], $data['e_time']);
$data['ISO_edit_time'] = format_time('YYYY-MM-dd HH:mm:ss', $data['edited_time']);
if ($data['user_id'] == $data['edited_by'])
$data['edited_by'] = $data['name'];
else {

View file

@ -93,7 +93,7 @@ if (($settings['upload_images'] == 1 && isset($_SESSION[$settings['session_prefi
@chmod($uploaded_images_path.$filename, 0644);
// $user_id can be NULL (see around line #15), because of that do not handle it with intval()
// see therefore variable definition of $user_id around line 15 of this script
$qSetUpload = "INSERT INTO " . $db_settings['uploads_table'] . " (uploader, filename, tstamp) VALUES (". $user_id .", '" . mysqli_real_escape_string($connid, $filename) . "', NOW())";
$qSetUpload = "INSERT INTO " . $db_settings['uploads_table'] . " (uploader, pathname, tstamp) VALUES (". $user_id .", '" . mysqli_real_escape_string($connid, $filename) . "', NOW())";
mysqli_query($connid, $qSetUpload);
$smarty->assign('uploaded_file', $filename);
} else {
@ -127,7 +127,7 @@ if (($settings['upload_images'] == 1 && isset($_SESSION[$settings['session_prefi
if ($browse_images < 1) $browse_images = 1;
$handle = opendir($uploaded_images_path);
while ($file = readdir($handle)) {
if (preg_match('/\.jpg$/i', $file) || preg_match('/\.png$/i', $file) || preg_match('/\.gif$/i', $file)) {
if (preg_match('/\.(gif|png|jpe?g|svg|webp)$/i', $file)) {
$images[] = $file;
}
}

View file

@ -31,101 +31,107 @@ $isUser = isset($_SESSION[$settings['session_prefix'].'user_type']) && isset($_S
$isModOrAdmin = $isUser && ($_SESSION[$settings['session_prefix'].'user_type'] == 1 || $_SESSION[$settings['session_prefix'].'user_type'] == 2);
// on action event main *AND* only team members ($settings['user_area_access'] = 0) or registered users ($settings['user_area_access'] = 1) have access to this section or the user area is public ($settings['user_area_access'] = 2):
$hasUserAreaAccess = $action == 'main' && ($settings['user_area_access'] == 2 || ($settings['user_area_access'] == 1 && $isUser) || ($settings['user_area_access'] == 2 && $isModOrAdmin));
$hasUserAreaAccess = $action == 'main' && ($settings['user_area_access'] == 2 || ($settings['user_area_access'] == 1 && $isUser) || $isModOrAdmin);
if (isset($_SESSION[$settings['session_prefix'].'user_id']) || $hasUserAreaAccess) {
if ($isUser || $hasUserAreaAccess) {
switch($action) {
case 'main':
if (isset($_GET['search_user']) && trim($_GET['search_user']) != '') $search_user = trim($_GET['search_user']);
// count users and pages:
if (isset($search_user)) {
$user_count_result = mysqli_query($connid, "SELECT COUNT(*) FROM ".$db_settings['userdata_table']." WHERE activate_code = '' AND lower(user_name) LIKE '%". mysqli_real_escape_string($connid, my_strtolower($search_user, $lang['charset'])) ."%'");
} else {
$user_count_result = mysqli_query($connid, "SELECT COUNT(*) FROM ".$db_settings['userdata_table']." WHERE activate_code = ''");
}
list($total_users) = mysqli_fetch_row($user_count_result);
mysqli_free_result($user_count_result);
$total_pages = ceil($total_users / $settings['users_per_page']);
// who is online:
if ($settings['count_users_online'] > 0) {
$useronline_result = mysqli_query($connid, "SELECT ".$db_settings['userdata_table'].".user_name COLLATE utf8mb4_general_ci AS user_name, ".$db_settings['useronline_table'].".user_id
FROM ".$db_settings['useronline_table']."
LEFT JOIN ".$db_settings['userdata_table']." ON ".$db_settings['userdata_table'].".user_id = ".$db_settings['useronline_table'].".user_id
WHERE ".$db_settings['useronline_table'].".user_id > 0
ORDER BY user_name ASC") or raise_error('database_error', mysqli_error($connid));
if ($hasUserAreaAccess) {
if (isset($_GET['search_user']) && trim($_GET['search_user']) != '') $search_user = trim($_GET['search_user']);
// count users and pages:
if (isset($search_user)) {
$user_count_result = mysqli_query($connid, "SELECT COUNT(*) FROM ".$db_settings['userdata_table']." WHERE activate_code = '' AND lower(user_name) LIKE '%". mysqli_real_escape_string($connid, my_strtolower($search_user, $lang['charset'])) ."%'");
} else {
$user_count_result = mysqli_query($connid, "SELECT COUNT(*) FROM ".$db_settings['userdata_table']." WHERE activate_code = ''");
}
list($total_users) = mysqli_fetch_row($user_count_result);
mysqli_free_result($user_count_result);
$total_pages = ceil($total_users / $settings['users_per_page']);
// who is online:
if ($settings['count_users_online'] > 0) {
$useronline_result = mysqli_query($connid, "SELECT ".$db_settings['userdata_table'].".user_name COLLATE utf8mb4_general_ci AS user_name, ".$db_settings['useronline_table'].".user_id
FROM ".$db_settings['useronline_table']."
LEFT JOIN ".$db_settings['userdata_table']." ON ".$db_settings['userdata_table'].".user_id = ".$db_settings['useronline_table'].".user_id
WHERE ".$db_settings['useronline_table'].".user_id > 0
ORDER BY user_name ASC") or raise_error('database_error', mysqli_error($connid));
$i = 0;
while($uid_field = mysqli_fetch_array($useronline_result)) {
$useronline_array[] = intval($uid_field['user_id']);
$users_online[$i]['id'] = intval($uid_field['user_id']);
$users_online[$i]['name'] = htmlspecialchars($uid_field['user_name']);
++$i;
}
mysqli_free_result($useronline_result);
}
if (isset($users_online)) $smarty->assign('users_online', $users_online);
if (isset($_GET['page'])) $page = intval($_GET['page']); else $page = 1;
if ($page > $total_pages) $page = $total_pages;
if ($page < 1) $page = 1;
if (isset($_GET['order'])) $order = $_GET['order']; else $order='user_name';
if ($order != 'user_id' && $order != 'user_name' && $order != 'user_email' && $order != 'user_type' && $order != 'registered' && $order != 'logins' && $order != 'last_login' && $order != 'user_lock' && $order != 'user_hp' && $order != 'email_contact' && $order != 'online') $order = 'user_name';
if ($order == 'user_lock' && (empty($_SESSION[$settings['session_prefix'].'user_type']) || isset($_SESSION[$settings['session_prefix'].'user_type']) && $_SESSION[$settings['session_prefix'].'user_type'] < 1)) $order = 'user_name';
if (isset($_GET['descasc'])) $descasc = $_GET['descasc']; else $descasc = "ASC";
if ($descasc != 'DESC' && $descasc != 'ASC') $descasc = 'ASC';
$ul = ($page - 1) * $settings['users_per_page'];
// get userdata:
$category_query_add = '';
if (isset($search_user)) {
$result = @mysqli_query($connid, "SELECT ".$db_settings['userdata_table'].".user_id, user_name COLLATE utf8mb4_general_ci AS user_name, user_type, user_email, email_contact, user_hp, user_lock
FROM ".$db_settings['userdata_table']."
WHERE activate_code = ''". $category_query_add ." AND lower(user_name) LIKE '%". mysqli_real_escape_string($connid, my_strtolower($search_user, $lang['charset'])) ."%'
ORDER BY ". $order ." ". $descasc ." LIMIT ". intval($ul) .", ". intval($settings['users_per_page'])) or raise_error('database_error', mysqli_error($connid));
} else {
$result = @mysqli_query($connid, "SELECT ".$db_settings['userdata_table'].".user_id, user_name COLLATE utf8mb4_general_ci AS user_name, user_type, user_email, email_contact, user_hp, user_lock
FROM ".$db_settings['userdata_table']."
WHERE activate_code = ''". $category_query_add ."
ORDER BY ". $order ." ". $descasc ." LIMIT ". intval($ul) .", ". intval($settings['users_per_page'])) or raise_error('database_error', mysqli_error($connid));
}
$i = 0;
while($uid_field = mysqli_fetch_array($useronline_result)) {
$useronline_array[] = intval($uid_field['user_id']);
$users_online[$i]['id'] = intval($uid_field['user_id']);
$users_online[$i]['name'] = htmlspecialchars($uid_field['user_name']);
++$i;
while ($row = mysqli_fetch_array($result)) {
$userdata[$i]['user_id'] = intval($row['user_id']);
$userdata[$i]['user_name'] = htmlspecialchars($row['user_name']);
if ($isModOrAdmin || $isUser && $row['email_contact'] > 0 || $row['email_contact'] == 2)
$userdata[$i]['user_email'] = TRUE;
$userdata[$i]['user_hp'] = htmlspecialchars($row['user_hp']);
if (!empty($userdata[$i]['user_hp']) && trim($userdata[$i]['user_hp']) != '') {
$userdata[$i]['user_hp'] = add_http_if_no_protocol($userdata[$i]['user_hp']);
}
$userdata[$i]['user_type'] = intval($row['user_type']);
$userdata[$i]['user_lock'] = $row['user_lock'];
$i++;
}
mysqli_free_result($useronline_result);
}
if (isset($users_online)) $smarty->assign('users_online', $users_online);
if (isset($_GET['page'])) $page = intval($_GET['page']); else $page = 1;
if ($page > $total_pages) $page = $total_pages;
if ($page < 1) $page = 1;
if (isset($_GET['order'])) $order = $_GET['order']; else $order='user_name';
if ($order != 'user_id' && $order != 'user_name' && $order != 'user_email' && $order != 'user_type' && $order != 'registered' && $order != 'logins' && $order != 'last_login' && $order != 'user_lock' && $order != 'user_hp' && $order != 'email_contact' && $order != 'online') $order = 'user_name';
if ($order == 'user_lock' && (empty($_SESSION[$settings['session_prefix'].'user_type']) || isset($_SESSION[$settings['session_prefix'].'user_type']) && $_SESSION[$settings['session_prefix'].'user_type'] < 1)) $order = 'user_name';
if (isset($_GET['descasc'])) $descasc = $_GET['descasc']; else $descasc = "ASC";
if ($descasc != 'DESC' && $descasc != 'ASC') $descasc = 'ASC';
$ul = ($page - 1) * $settings['users_per_page'];
// get userdata:
$category_query_add = '';
if (isset($search_user)) {
$result = @mysqli_query($connid, "SELECT ".$db_settings['userdata_table'].".user_id, user_name COLLATE utf8mb4_general_ci AS user_name, user_type, user_email, email_contact, user_hp, user_lock
FROM ".$db_settings['userdata_table']."
WHERE activate_code = ''". $category_query_add ." AND lower(user_name) LIKE '%". mysqli_real_escape_string($connid, my_strtolower($search_user, $lang['charset'])) ."%'
ORDER BY ". $order ." ". $descasc ." LIMIT ". intval($ul) .", ". intval($settings['users_per_page'])) or raise_error('database_error', mysqli_error($connid));
} else {
$result = @mysqli_query($connid, "SELECT ".$db_settings['userdata_table'].".user_id, user_name COLLATE utf8mb4_general_ci AS user_name, user_type, user_email, email_contact, user_hp, user_lock
FROM ".$db_settings['userdata_table']."
WHERE activate_code = ''". $category_query_add ."
ORDER BY ". $order ." ". $descasc ." LIMIT ". intval($ul) .", ". intval($settings['users_per_page'])) or raise_error('database_error', mysqli_error($connid));
}
$i = 0;
while ($row = mysqli_fetch_array($result)) {
$userdata[$i]['user_id'] = intval($row['user_id']);
$userdata[$i]['user_name'] = htmlspecialchars($row['user_name']);
if ($isModOrAdmin || $isUser && $row['email_contact'] > 0 || $row['email_contact'] == 2)
$userdata[$i]['user_email'] = TRUE;
$userdata[$i]['user_hp'] = htmlspecialchars($row['user_hp']);
if (!empty($userdata[$i]['user_hp']) && trim($userdata[$i]['user_hp']) != '') {
$userdata[$i]['user_hp'] = add_http_if_no_protocol($userdata[$i]['user_hp']);
mysqli_free_result($result);
$smarty->assign('pagination', pagination($total_pages, $page, 3));
if (isset($userdata)) $smarty->assign('userdata', $userdata);
$smarty->assign('total_users',$total_users);
if (isset($search_user)) {
$smarty->assign('search_user', htmlspecialchars($search_user));
$smarty->assign('search_user_encoded', urlencode($search_user));
}
$userdata[$i]['user_type'] = intval($row['user_type']);
$userdata[$i]['user_lock'] = $row['user_lock'];
$i++;
$smarty->assign('order', $order);
$smarty->assign('descasc', $descasc);
$smarty->assign('ul', $ul);
$smarty->assign('page', $page);
$smarty->assign('subnav_location', 'subnav_userarea');
$smarty->assign('subtemplate', 'user.inc.tpl');
$template = 'main.tpl';
}
mysqli_free_result($result);
$smarty->assign('pagination', pagination($total_pages, $page, 3));
if (isset($userdata)) $smarty->assign('userdata', $userdata);
$smarty->assign('total_users',$total_users);
if (isset($search_user)) {
$smarty->assign('search_user', htmlspecialchars($search_user));
$smarty->assign('search_user_encoded', urlencode($search_user));
else {
header("Location: index.php");
exit;
}
$smarty->assign('order', $order);
$smarty->assign('descasc', $descasc);
$smarty->assign('ul', $ul);
$smarty->assign('page', $page);
$smarty->assign('subnav_location', 'subnav_userarea');
$smarty->assign('subtemplate', 'user.inc.tpl');
$template = 'main.tpl';
break;
case 'user_lock':
if (isset($_GET['page'])) {
@ -320,7 +326,7 @@ if (isset($_SESSION[$settings['session_prefix'].'user_id']) || $hasUserAreaAcces
$template = 'main.tpl';
break;
case 'edit_profile':
if (isset($_SESSION[$settings['session_prefix'].'user_id'])) {
if ($isUser) {
$id = $_SESSION[$settings['session_prefix'].'user_id'];
$result = mysqli_query($connid, "SELECT user_id, user_name, user_real_name, gender, birthday, user_email, email_contact, user_hp, user_location, signature, profile, new_posting_notification, new_user_notification, browser_window_target, auto_login_code, language, time_zone, time_difference, theme FROM ".$db_settings['userdata_table']." WHERE user_id = ". intval($id) ." LIMIT 1") or raise_error('database_error', mysqli_error($connid));
$row = mysqli_fetch_array($result);
@ -431,7 +437,7 @@ if (isset($_SESSION[$settings['session_prefix'].'user_id']) || $hasUserAreaAcces
}
break;
case 'edit_userdata':
if (isset($_SESSION[$settings['session_prefix'].'user_id']) && isset($_POST['csrf_token']) && $_POST['csrf_token'] === $_SESSION['csrf_token']){
if ($isUser && isset($_POST['csrf_token']) && $_POST['csrf_token'] === $_SESSION['csrf_token']){
$id = $_SESSION[$settings['session_prefix'].'user_id'];
if (isset($_POST['email_contact']))
$email_contact = intval($_POST['email_contact']);
@ -681,7 +687,7 @@ if (isset($_SESSION[$settings['session_prefix'].'user_id']) || $hasUserAreaAcces
}
break;
case 'remove_account':
if (isset($_SESSION[$settings['session_prefix'].'user_id'])) {
if ($isUser) {
$user_id = $_SESSION[$settings['session_prefix'].'user_id'];
$result = mysqli_query($connid, "SELECT `user_name` FROM `".$db_settings['userdata_table']."` WHERE `user_id` = ". intval($user_id) ." LIMIT 1") or raise_error('database_error', mysqli_error($connid));
if (mysqli_num_rows($result) == 1) {
@ -700,7 +706,7 @@ if (isset($_SESSION[$settings['session_prefix'].'user_id']) || $hasUserAreaAcces
}
break;
case 'remove_account_submitted':
if (isset($_SESSION[$settings['session_prefix'].'user_id']) && isset($_POST['csrf_token']) && $_POST['csrf_token'] === $_SESSION['csrf_token']) {
if ($isUser && isset($_POST['csrf_token']) && $_POST['csrf_token'] === $_SESSION['csrf_token']) {
$user_id = $_SESSION[$settings['session_prefix'].'user_id'];
$result = @mysqli_query($connid, "SELECT `user_name`, `user_pw` FROM `".$db_settings['userdata_table']."` WHERE `user_id` = ". intval($user_id) ." LIMIT 1") or raise_error('database_error', mysqli_error($connid));
if (mysqli_num_rows($result) == 1) {
@ -738,7 +744,7 @@ if (isset($_SESSION[$settings['session_prefix'].'user_id']) || $hasUserAreaAcces
}
break;
case 'edit_pw':
if (isset($_SESSION[$settings['session_prefix'].'user_id'])) {
if ($isUser) {
$breadcrumbs[0]['link'] = 'index.php?mode=user';
$breadcrumbs[0]['linkname'] = 'subnav_userarea';
$breadcrumbs[1]['link'] = 'index.php?mode=user&amp;action=edit_profile';
@ -750,7 +756,7 @@ if (isset($_SESSION[$settings['session_prefix'].'user_id']) || $hasUserAreaAcces
}
break;
case 'edit_pw_submitted':
if (isset($_SESSION[$settings['session_prefix'].'user_id']) && isset($_POST['csrf_token']) && $_POST['csrf_token'] === $_SESSION['csrf_token']) {
if ($isUser && isset($_POST['csrf_token']) && $_POST['csrf_token'] === $_SESSION['csrf_token']) {
$user_id = $_SESSION[$settings['session_prefix'].'user_id'];
$pw_result = mysqli_query($connid, "SELECT user_pw FROM ".$db_settings['userdata_table']." WHERE user_id = ". intval($user_id) ." LIMIT 1") or raise_error('database_error', mysqli_error($connid));
$field = mysqli_fetch_array($pw_result);
@ -806,7 +812,7 @@ if (isset($_SESSION[$settings['session_prefix'].'user_id']) || $hasUserAreaAcces
}
break;
case 'edit_email':
if (isset($_SESSION[$settings['session_prefix'].'user_id'])) {
if ($isUser) {
$breadcrumbs[0]['link'] = 'index.php?mode=user';
$breadcrumbs[0]['linkname'] = 'subnav_userarea';
$breadcrumbs[1]['link'] = 'index.php?mode=user&amp;action=edit_profile';
@ -818,7 +824,7 @@ if (isset($_SESSION[$settings['session_prefix'].'user_id']) || $hasUserAreaAcces
}
break;
case 'edit_email_submit':
if (isset($_SESSION[$settings['session_prefix'].'user_id']) && isset($_POST['csrf_token']) && $_POST['csrf_token'] === $_SESSION['csrf_token']) {
if ($isUser && isset($_POST['csrf_token']) && $_POST['csrf_token'] === $_SESSION['csrf_token']) {
$new_email = (!empty($_POST['new_email'])) ? trim($_POST['new_email']) : '';
$new_email_confirm = (!empty($_POST['new_email_confirm'])) ? trim($_POST['new_email_confirm']) : '';
$pw_new_email = $_POST['pw_new_email'];

View file

@ -6,8 +6,8 @@
* @author Mark Alexander Hoschek < alex at mylittleforum dot net >
* @author Michael Lösler (https://github.com/loesler)
* @author Heiko August (https://github.com/auge8472)
* @copyright 2006-2024 Mark Alexander Hoschek
* @version 20240827.1 (2024-08-27)
* @copyright 2006-2025 Mark Alexander Hoschek
* @version 20250323.1 (2025-03-23)
* @link https://mylittleforum.net/
*
* This program is free software: you can redistribute it and/or modify

View file

@ -282,6 +282,7 @@ if (isset($_POST['install_submit'])) {
$cleared_lines = array();
foreach ($lines as $line) {
$line = str_replace(' mlf2_', ' '.$_POST['table_prefix'], $line);
$line = str_replace('`smbl_mlf2_', '`smbl_'.$_POST['table_prefix'], $line);
$line = trim($line);
if (my_substr($line, -1, my_strlen($line, $lang['default']['charset']), $lang['default']['charset']) == ';')
$line = my_substr($line,0,-1,$lang['default']['charset']);

View file

@ -1,27 +1,27 @@
# note: the installation script expects one query per line!
CREATE TABLE mlf2_banlists (name varchar(255) NOT NULL, list text NOT NULL, PRIMARY KEY (name)) ENGINE=InnoDB CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci;
CREATE TABLE mlf2_categories (id int(11) NOT NULL AUTO_INCREMENT, order_id int(11) NOT NULL default '0', category varchar(255) NOT NULL default '', description varchar(255) NOT NULL default '',accession tinyint(4) NOT NULL default '0', PRIMARY KEY (id)) ENGINE=InnoDB CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci;
CREATE TABLE mlf2_entries (id int(11) NOT NULL AUTO_INCREMENT, pid int(11) NOT NULL default '0', tid int(11) NOT NULL default '0', uniqid varchar(255) NOT NULL default '', time timestamp NOT NULL default CURRENT_TIMESTAMP, last_reply timestamp NULL DEFAULT NULL, edited timestamp NULL DEFAULT NULL, edited_by int(11) default NULL, user_id int(11) default '0', name varchar(255) NOT NULL default '', subject varchar(255) NOT NULL default '',category int(11) NOT NULL default '0', email varchar(255) NOT NULL default '', hp varchar(255) NOT NULL default '', location varchar(255) NOT NULL default '', ip varchar(128) NOT NULL default '', text text NOT NULL, show_signature tinyint(4) default '0', marked tinyint(4) default '0', locked tinyint(4) default '0', sticky tinyint(4) default '0', views int(11) default '0', edit_key varchar(255) NOT NULL default '', PRIMARY KEY (id), UNIQUE KEY id (id), KEY tid (tid),KEY category (category), KEY pid (pid), KEY sticky (sticky), KEY user_id (user_id), KEY time (time), KEY last_reply (last_reply)) ENGINE=InnoDB CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci;
CREATE TABLE mlf2_categories (id int(11) UNSIGNED NOT NULL AUTO_INCREMENT, order_id int(11) NOT NULL default '0', category varchar(255) NOT NULL default '', description varchar(255) NOT NULL default '', accession tinyint(4) NOT NULL default '0', PRIMARY KEY (id)) ENGINE=InnoDB CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci;
CREATE TABLE mlf2_entries (id int(11) UNSIGNED NOT NULL AUTO_INCREMENT, pid int(11) UNSIGNED NOT NULL default '0', tid int(11) UNSIGNED NOT NULL default '0', uniqid varchar(255) NOT NULL default '', time timestamp NOT NULL default CURRENT_TIMESTAMP, last_reply timestamp NULL DEFAULT NULL, edited timestamp NULL DEFAULT NULL, edited_by int(11) UNSIGNED default NULL, user_id int(11) UNSIGNED default '0', name varchar(255) NOT NULL default '', subject varchar(255) NOT NULL default '',category int(11) UNSIGNED NOT NULL default '0', email varchar(255) NOT NULL default '', hp varchar(255) NOT NULL default '', location varchar(255) NOT NULL default '', ip varchar(128) NOT NULL default '', text text NOT NULL, show_signature tinyint(4) default '0', marked tinyint(4) default '0', locked tinyint(4) default '0', sticky tinyint(4) default '0', views int(11) UNSIGNED default '0', edit_key varchar(255) NOT NULL default '', PRIMARY KEY (id), UNIQUE KEY id (id), KEY tid (tid),KEY category (category), KEY pid (pid), KEY sticky (sticky), KEY user_id (user_id), KEY time (time), KEY last_reply (last_reply)) ENGINE=InnoDB CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci;
CREATE TABLE mlf2_settings (name varchar(255) NOT NULL, value varchar(255) NOT NULL default '', PRIMARY KEY (name)) ENGINE=InnoDB CHARSET=utf8mb4 COLLATE=utf8mb4_bin;
CREATE TABLE mlf2_smilies (id int(11) NOT NULL AUTO_INCREMENT, order_id int(11) NOT NULL default '0', file varchar(100) NOT NULL default '', code_1 varchar(50) NOT NULL default '', code_2 varchar(50) NOT NULL default '', code_3 varchar(50) NOT NULL default '', code_4 varchar(50) NOT NULL default '', code_5 varchar(50) NOT NULL default '', title varchar(255) NOT NULL default '', PRIMARY KEY (id)) ENGINE=InnoDB CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci;
CREATE TABLE mlf2_userdata (user_id int(11) NOT NULL AUTO_INCREMENT, user_type tinyint(4) NOT NULL default '0', user_name varchar(128) NOT NULL COLLATE utf8mb4_bin, user_real_name varchar(255) NOT NULL default '', gender tinyint(4) NOT NULL default '0', birthday date NULL default NULL, user_pw varchar(255) NOT NULL default '', user_email varchar(255) NOT NULL, email_contact tinyint(4) default '0', user_hp varchar(255) NOT NULL default '', user_location varchar(255) NOT NULL default '', signature varchar(255) NOT NULL default '', profile text NOT NULL, logins int(11) NOT NULL default '0', last_login timestamp NULL default CURRENT_TIMESTAMP, last_logout timestamp NULL DEFAULT NULL, user_ip varchar(128) NOT NULL default '', registered timestamp NULL DEFAULT NULL, category_selection varchar(255) DEFAULT NULL, thread_order tinyint(4) NOT NULL default '0', user_view tinyint(4) NOT NULL default '0', sidebar tinyint(4) NOT NULL default '1', fold_threads tinyint(4) NOT NULL default '0', thread_display tinyint(4) NOT NULL default '0', new_posting_notification tinyint(4) default '0', new_user_notification tinyint(4) default '0', user_lock tinyint(4) default '0', browser_window_target tinyint(4) NOT NULL default '0', auto_login_code varchar(50) NOT NULL default '', pwf_code varchar(50) NOT NULL, activate_code varchar(50) NOT NULL default '', language VARCHAR(255) NOT NULL DEFAULT '', time_zone VARCHAR(255) NOT NULL DEFAULT '', time_difference smallint(4) default '0', theme VARCHAR(255) NOT NULL DEFAULT '', tou_accepted DATETIME NULL DEFAULT NULL, dps_accepted DATETIME NULL DEFAULT NULL, inactivity_notification BOOLEAN NOT NULL DEFAULT FALSE, PRIMARY KEY (user_id), KEY key_user_type (user_type), UNIQUE KEY key_user_name (user_name), UNIQUE KEY key_user_email (user_email)) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci;
CREATE TABLE mlf2_pages (id int(11) NOT NULL AUTO_INCREMENT,order_id int(11) NOT NULL, title varchar(255) NOT NULL default '', content text NOT NULL, menu_linkname varchar(255) NOT NULL default '', access tinyint(4) NOT NULL default '0', PRIMARY KEY (id)) ENGINE=InnoDB CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci;
CREATE TABLE mlf2_useronline (ip varchar(128) NOT NULL default '', time int(14) NOT NULL default '0', user_id int(11) default '0') ENGINE=InnoDB CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci;
CREATE TABLE mlf2_smilies (id int(11) UNSIGNED NOT NULL AUTO_INCREMENT, order_id int(11) NOT NULL default '0', file varchar(100) NOT NULL default '', code_1 varchar(50) NOT NULL default '', code_2 varchar(50) NOT NULL default '', code_3 varchar(50) NOT NULL default '', code_4 varchar(50) NOT NULL default '', code_5 varchar(50) NOT NULL default '', title varchar(255) NOT NULL default '', PRIMARY KEY (id)) ENGINE=InnoDB CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci;
CREATE TABLE mlf2_userdata (user_id int(11) UNSIGNED NOT NULL AUTO_INCREMENT, user_type tinyint(4) NOT NULL default '0', user_name varchar(128) NOT NULL COLLATE utf8mb4_bin, user_real_name varchar(255) NOT NULL default '', gender tinyint(4) NOT NULL default '0', birthday date NULL default NULL, user_pw varchar(255) NOT NULL default '', user_email varchar(255) NOT NULL, email_contact tinyint(4) default '0', user_hp varchar(255) NOT NULL default '', user_location varchar(255) NOT NULL default '', signature varchar(255) NOT NULL default '', profile text NOT NULL, logins int(11) NOT NULL default '0', last_login timestamp NULL default CURRENT_TIMESTAMP, last_logout timestamp NULL DEFAULT NULL, user_ip varchar(128) NOT NULL default '', registered timestamp NULL DEFAULT NULL, category_selection varchar(255) DEFAULT NULL, thread_order tinyint(4) NOT NULL default '0', user_view tinyint(4) NOT NULL default '0', sidebar tinyint(4) NOT NULL default '1', fold_threads tinyint(4) NOT NULL default '0', thread_display tinyint(4) NOT NULL default '0', new_posting_notification tinyint(4) default '0', new_user_notification tinyint(4) default '0', user_lock tinyint(4) default '0', browser_window_target tinyint(4) NOT NULL default '0', auto_login_code varchar(50) NOT NULL default '', pwf_code varchar(50) NOT NULL, activate_code varchar(50) NOT NULL default '', language VARCHAR(255) NOT NULL DEFAULT '', time_zone VARCHAR(255) NOT NULL DEFAULT '', time_difference smallint(4) default '0', theme VARCHAR(255) NOT NULL DEFAULT '', tou_accepted DATETIME NULL DEFAULT NULL, dps_accepted DATETIME NULL DEFAULT NULL, inactivity_notification BOOLEAN NOT NULL DEFAULT FALSE, PRIMARY KEY (user_id), KEY key_user_type (user_type), UNIQUE KEY key_user_name (user_name), UNIQUE KEY key_user_email (user_email)) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci;
CREATE TABLE mlf2_pages (id int(11) UNSIGNED NOT NULL AUTO_INCREMENT, order_id int(11) NOT NULL, title varchar(255) NOT NULL default '', content text NOT NULL, menu_linkname varchar(255) NOT NULL default '', access tinyint(4) NOT NULL default '0', PRIMARY KEY (id)) ENGINE=InnoDB CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci;
CREATE TABLE mlf2_useronline (ip varchar(128) NOT NULL default '', time int(14) NOT NULL default '0', user_id int(11) UNSIGNED default '0') ENGINE=InnoDB CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci;
CREATE TABLE mlf2_logincontrol (time timestamp NOT NULL default CURRENT_TIMESTAMP, ip varchar(128) NOT NULL default '', logins int(11) NOT NULL default '0') ENGINE=InnoDB CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci;
CREATE TABLE mlf2_entries_cache (cache_id int(11) NOT NULL, cache_text mediumtext NOT NULL, PRIMARY KEY (cache_id)) ENGINE=InnoDB CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci;
CREATE TABLE mlf2_userdata_cache (cache_id int(11) NOT NULL, cache_signature text NOT NULL, cache_profile text NOT NULL, PRIMARY KEY (cache_id)) ENGINE=InnoDB CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci;
CREATE TABLE mlf2_bookmarks (id int(11) NOT NULL AUTO_INCREMENT, user_id int(11) NOT NULL, posting_id int(11) NOT NULL, time timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP, subject varchar(255) NOT NULL, order_id int(11) NOT NULL DEFAULT '0', PRIMARY KEY (id), UNIQUE KEY UNIQUE_uid_pid (user_id,posting_id)) ENGINE=InnoDB CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci;
CREATE TABLE mlf2_bookmarks (id int(11) UNSIGNED NOT NULL AUTO_INCREMENT, user_id int(11) UNSIGNED NOT NULL, posting_id int(11) UNSIGNED NOT NULL, time timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP, subject varchar(255) NOT NULL, order_id int(11) NOT NULL DEFAULT '0', PRIMARY KEY (id), UNIQUE KEY UNIQUE_uid_pid (user_id,posting_id)) ENGINE=InnoDB CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci;
CREATE TABLE mlf2_read_entries (user_id int(11) UNSIGNED NOT NULL, posting_id int(11) UNSIGNED NOT NULL, time timestamp NOT NULL, PRIMARY KEY (user_id, posting_id), KEY `user_id` (`user_id`), KEY `posting_id` (`posting_id`)) ENGINE=InnoDB CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci;
CREATE TABLE mlf2_temp_infos (name varchar(50) NOT NULL, value varchar(255) NOT NULL, time timestamp NULL DEFAULT NULL, PRIMARY KEY (name)) ENGINE=InnoDB CHARSET=utf8mb4 COLLATE=utf8mb4_bin;
CREATE TABLE mlf2_entry_tags (`bid` int(11) NOT NULL, `tid` int(11) NOT NULL, PRIMARY KEY (`bid`,`tid`)) ENGINE=InnoDB CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci;
CREATE TABLE mlf2_bookmark_tags (`bid` int(11) NOT NULL, `tid` int(11) NOT NULL, PRIMARY KEY (`bid`,`tid`)) ENGINE=InnoDB CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci;
CREATE TABLE mlf2_tags (`id` int(11) NOT NULL AUTO_INCREMENT, `tag` varchar(128) NOT NULL, PRIMARY KEY (`id`), UNIQUE KEY `tag` (`tag`)) ENGINE=InnoDB CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci;
CREATE TABLE mlf2_tags (`id` int(11) UNSIGNED NOT NULL AUTO_INCREMENT, `tag` varchar(128) NOT NULL, PRIMARY KEY (`id`), UNIQUE KEY `tag` (`tag`)) ENGINE=InnoDB CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci;
CREATE TABLE mlf2_subscriptions (`user_id` int(12) UNSIGNED NULL, `eid` int(12) UNSIGNED NOT NULL, `unsubscribe_code` varchar(36) NOT NULL, `tstamp` datetime DEFAULT NULL, UNIQUE `user_thread` (`user_id`, `eid`) USING HASH, INDEX `hash` (`unsubscribe_code`)) ENGINE = InnoDB CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci;
CREATE TABLE mlf2_b8_rating (`eid` int(11) NOT NULL, `spam` tinyint(1) NOT NULL DEFAULT '0', `training_type` tinyint(1) NOT NULL DEFAULT '0', PRIMARY KEY (`eid`), KEY `b8_spam` (`spam`), KEY `B8_training_type` (`training_type`)) ENGINE=InnoDB CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci;
CREATE TABLE mlf2_akismet_rating (`eid` int(11) NOT NULL, `spam` tinyint(1) NOT NULL DEFAULT '0', `spam_check_status` tinyint(1) NOT NULL DEFAULT '0', PRIMARY KEY (`eid`), KEY `akismet_spam` (`spam`), KEY spam_check_status (spam_check_status)) ENGINE=InnoDB CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci;
CREATE TABLE mlf2_b8_wordlist (`token` varchar(255) NOT NULL, `count_ham` int unsigned default NULL, `count_spam` int unsigned default NULL, PRIMARY KEY (`token`)) ENGINE=InnoDB CHARSET=utf8mb4 COLLATE=utf8mb4_bin;
CREATE TABLE mlf2_uploads (`id` int(10) UNSIGNED NOT NULL AUTO_INCREMENT, `uploader` int(10) UNSIGNED NULL, `filename` varchar(64) NULL, `tstamp` datetime NULL, PRIMARY KEY (id)) ENGINE=InnoDB CHARSET=utf8mb4 COLLATE=utf8mb4_bin;
CREATE TABLE mlf2_uploads (`id` int(10) UNSIGNED NOT NULL AUTO_INCREMENT, `uploader` int(10) UNSIGNED NULL, `pathname` varchar(128) NOT NULL, `tstamp` datetime NULL, PRIMARY KEY (id), UNIQUE KEY `pathname` (`pathname`), CONSTRAINT `smbl_mlf2_uploader` FOREIGN KEY `fk_uploader` (`uploader`) REFERENCES mlf2_userdata(`user_id`) ON UPDATE CASCADE ON DELETE SET NULL) ENGINE=InnoDB CHARSET=utf8mb4 COLLATE=utf8mb4_bin;
INSERT INTO mlf2_banlists VALUES ('user_agents', '');
INSERT INTO mlf2_banlists VALUES ('ips', '');

View file

@ -98,8 +98,9 @@ if (window.Node && Node.prototype && !Node.prototype.contains) {
document.createElementWithAttributes = function(tagName, attributes, parentElement) {
var el = document.createElement(tagName);
for (var attribute in attributes)
el[attribute] = attributes[attribute]; //el.setAttribute(attribute, attributes[attribute]); cannot used because function are evaluated in attributes e.g. {"onclick": function(e) { return false; }}
for (const attribute in attributes) {
el[attribute] = attributes[attribute]; //el.setAttribute(attribute, attributes[attribute]); cannot be used because function are evaluated in attributes e.g. {"onclick": function(e) { return false; }}
}
if (parentElement)
parentElement.appendChild(el);
@ -510,40 +511,29 @@ function DragAndDropTable(table,mode,queryKey) {
*/
function Sidebar(templatePath) {
templatePath = templatePath || "";
var main = document.getElementById("sidebar") || document.getElementById("bottombar") || false;
var icon = document.getElementById("sidebartoggle");
var self = this;
if (!main || !icon)
const main = document.getElementById("sidebar") || document.getElementById("bottombar") || false;
const self = this;
if (!main)
return;
this.setVisible = function(visible) {
if (visible) {
main.classList.remove("js-display-fold");
icon.src = templatePath + settings["hide_sidebar_image"];
icon.classList.remove("show-sidebar");
icon.classList.add("hide-sidebar");
}
else {
main.classList.add("js-display-fold");
icon.src = templatePath + settings["show_sidebar_image"];
icon.classList.remove("hide-sidebar");
icon.classList.add("show-sidebar");
}
};
this.isVisible = function() {
return !main.classList.contains("js-display-fold");
};
var links = main.getElementsByTagName("a");
for (var i=0; i<links.length; i++) {
if (links[i].href.search(/toggle_sidebar/) != -1) {
links[i].onclick = function(e) {
self.setVisible(!self.isVisible());
new Request("index.php", "POST", new Query("toggle_sidebar", true));
return false;
}
}
const link = main.querySelector(".sidebar a");
link.onclick = function(e) {
self.setVisible(!self.isVisible());
new Request("index.php", "POST", new Query("toggle_sidebar", true));
return false;
}
};
/**
* Thread object, which is created by an UL element or the numerical ID of the UL element,
* which is used to collapse the tree
@ -1155,12 +1145,13 @@ function DragAndDropTable(table,mode,queryKey) {
return;
initThreadFoldingInSubMenu();
for (var i=0; i<els.length; i++) {
var el = els[i];
var li = el.parentNode;
var pLink = document.getFirstChildByElement(li, "a", ["ap", "reply", "thread", "replynew", "threadnew", "thread-sticky", "threadnew-sticky", "reply-search", "thread-search", "thread-locked"]);
var pEmpty = !!document.getFirstChildByElement(li, "img", ["no-text"]);
var li = el.closest("li");
var pLink = li.querySelector(":scope > a.subject");
var pEmptyEl = li.querySelector(":scope > .metadata .tail img.no-text");
var pEmpty = (pEmptyEl !== null) ? true: false;
var pid = parseInt( el.id.substring(1) );
if (!pid)
continue;
@ -1174,7 +1165,7 @@ function DragAndDropTable(table,mode,queryKey) {
self.selectPosting( this.pid );
this.blur();
return false;
};
};
}
else if (links[j].href.search(/delete_posting/) != -1) {
links[j].onclick = function(e) {
@ -1184,8 +1175,8 @@ function DragAndDropTable(table,mode,queryKey) {
this.blur();
return confirmed;
};
}
}
}
}
}
if (!pEmpty && pLink && ajaxPreviewWindow) {
if (links.length >= 1) {
@ -1215,11 +1206,11 @@ function DragAndDropTable(table,mode,queryKey) {
var confirmed = window.confirm( lang["delete_posting_confirm"] );
if (confirmed)
this.href += '&delete_posting_confirm=true';
return confirmed;
return confirmed;
};
break;
}
}
}
}
}
}
}
@ -1228,43 +1219,6 @@ function DragAndDropTable(table,mode,queryKey) {
pEls = pEls.length>0?pEls:document.getElementsByClassName("thread-posting");
new FullSizeImage(pEls);
};
/**
* Set the default value to an INPUT element
*/
var setDefaultInputValue = function(id) {
var inp = document.getElementById(id);
if (!inp)
return;
var value = (inp.alt) ? inp.alt : inp.value;
inp.onfocus = function(e) {
if (this.value == value)
this.value="";
};
inp.onblur = function(e) {
if(this.value.trim() == "")
this.value = value;
};
};
/**
* Set focus to first INPUT element on the page, if exists
*/
var setFocusToContentForm = function() {
var par = document.getElementById("content");
if (par) {
var f = par.getElementsByTagName("form");
if (f && f.length>0) {
for (var i=0; i<f[0].elements.length; i++) {
if (f[0].elements[i].type == "text" && f[0].elements[i].name != "search_user" && f[0].elements[i].name != "smiley_code" && f[0].elements[i].name != "new_category") {
f[0].elements[i].focus();
break;
}
}
}
}
};
/**
* Add a checkbox to a INPUT element of type PASSWORD to show/hid the entered password
@ -1475,9 +1429,6 @@ function DragAndDropTable(table,mode,queryKey) {
*/
this.init = function( ajaxPreviewStructure ) {
ajaxPreviewStructure = ajaxPreviewStructure || false;
setFocusToContentForm();
setDefaultInputValue("search-input");
setDefaultInputValue("search-user");
templatePath = this.getTemplatePath();
if (ajaxPreviewStructure)
ajaxPreviewWindow = new AjaxPreviewWindow( ajaxPreviewStructure, templatePath );

4
js/main.min.js vendored

File diff suppressed because one or more lines are too long

View file

@ -66,7 +66,7 @@ function BBCodeButton(el) {
this.setHTMLElement = function(el) {
htmlEl = el;
htmlEl.onclick = function(e) {
self.insertCode(this);
self.insertCode(this);
return false;
}
};
@ -107,7 +107,7 @@ function BBCodeLinkButton(el) {
txtarea.insertTextRange( "["+link_bb_code+"]" + insert_link + "[/"+link_bb_code+"]" );
}
}, 150);
};
};
};
/**
@ -178,10 +178,10 @@ function BBCodeColorChooserButton(el) {
this.insertOptionCode = function(obj) {
if (!this.canInsert())
return;
var buttonGroup = this.getButtonGroup();
var buttonGroup = this.getButtonGroup();
var txtarea = buttonGroup.getTextArea();
var code = this.getCode();
txtarea.insertTextRange( "[" + code + obj.extension + "]" + txtarea.getSelection() + "[/" + code + "]" );
txtarea.insertTextRange( "[" + code + obj.extension + "]" + txtarea.getSelection() + "[/" + code + "]" );
buttonGroup.getAdditionalOptionsWindow().enableOptionList(false);
};
@ -191,7 +191,7 @@ function BBCodeColorChooserButton(el) {
var buttonGroup = this.getButtonGroup();
var objPos = document.getElementPoSi(obj);
buttonGroup.getAdditionalOptionsWindow().setOptionList(colorTable);
buttonGroup.getAdditionalOptionsWindow().enableOptionList(true, objPos);
buttonGroup.getAdditionalOptionsWindow().enableOptionList(true, objPos);
};
};
@ -222,16 +222,17 @@ function BBCodeOptionButton(el, list, quest, par) {
return;
var buttonGroup = this.getButtonGroup();
// Ausnahme INLINECODE
var codestart = this.getCode(), codeend = this.getCode();
var codestart = this.getCode(), codeend = this.getCode();
window.setTimeout(function(){
var txtarea = buttonGroup.getTextArea();
var selectionRange = txtarea.getSelection();
if (obj.attribute.toLowerCase() == "inlinecode") {
codestart = codeend = obj.attribute;
if (obj.attribute != null && obj.attribute.trim() != "") {
if (obj.attribute.trim().toLowerCase() == "inlinecode")
codestart = codeend = obj.attribute;
else
codestart += "=" + obj.attribute;
}
if (obj.attribute.trim() && obj.attribute.toLowerCase() != "inlinecode")
codestart += "=" + obj.attribute;
if (quest && selectionRange == "") {
var p = window.prompt(quest, par);
@ -248,10 +249,10 @@ function BBCodeOptionButton(el, list, quest, par) {
this.insertCode = function(obj) {
if (!this.canInsert())
return;
var buttonGroup = this.getButtonGroup();
var buttonGroup = this.getButtonGroup();
var objPos = document.getElementPoSi(obj);
buttonGroup.getAdditionalOptionsWindow().setOptionList(optionList);
buttonGroup.getAdditionalOptionsWindow().enableOptionList(true, objPos);
buttonGroup.getAdditionalOptionsWindow().enableOptionList(true, objPos);
};
};
@ -264,7 +265,7 @@ function BBCodeListButton(el) {
this.insertCode = function(obj) {
if (!this.canInsert())
return;
var buttonGroup = this.getButtonGroup();
var buttonGroup = this.getButtonGroup();
var txtarea = buttonGroup.getTextArea();
var selectionRange = txtarea.getSelection();
var listStr = "";
@ -288,7 +289,7 @@ function BBCodeSingleSmilieButton(el) {
this.insertCode = function(obj) {
if (!this.canInsert())
return;
var buttonGroup = this.getButtonGroup();
var buttonGroup = this.getButtonGroup();
var txtarea = buttonGroup.getTextArea();
var selectionRange = txtarea.getSelection();
@ -304,32 +305,31 @@ function BBCodeSingleSmilieButton(el) {
function BBCodeSmilieButton(el, list) {
this.constructor(el, list);
var self = this;
//var smilies = document.createElement("div");
var smilies = document.createElementWithAttributes("div", {"id": "additional-smilies"}, null);
var smilies = document.createElementWithAttributes("ul", {"id": "additional-smilies"}, null);
for (var i=0; i<list.length; i++) {
var link = document.createElementWithAttributes("a", {"href": "#", "title": list[i].title, "code": list[i].code, "onclick": function(e) { self.insertOptionCode(this); return false; } }, smilies);
link.appendChild( list[i].label );
let item = document.createElementWithAttributes("li",{}, smilies);
let btn = document.createElementWithAttributes("button",{"type": "button", "title": list[i].title, "value": list[i].code, "onclick": function(e) { self.insertButtonCode(this); return false; }}, item);
btn.appendChild( list[i].label);
}
this.insertOptionCode = function(obj) {
if (!this.canInsert())
return;
var buttonGroup = this.getButtonGroup();
this.insertButtonCode = function(obj) {
if (!this.canInsert()) return;
var buttonGroup = this.getButtonGroup();
var txtarea = buttonGroup.getTextArea();
var code = obj.code;
txtarea.insertTextRange( txtarea.getSelection() +code + " " );
const val = event.target.closest("button").getAttribute("value");
txtarea.insertTextRange( txtarea.getSelection() + val + " " );
buttonGroup.getAdditionalOptionsWindow().enableOptionList(false);
}
this.insertCode = function(obj) {
if (!this.canInsert())
return;
var buttonGroup = this.getButtonGroup();
var buttonGroup = this.getButtonGroup();
var objPos = document.getElementPoSi(obj);
buttonGroup.getAdditionalOptionsWindow().setOptionList(smilies);
buttonGroup.getAdditionalOptionsWindow().enableOptionList(true, objPos);
};
buttonGroup.getAdditionalOptionsWindow().enableOptionList(true, objPos);
};
};
/**
@ -421,46 +421,53 @@ function ButtonGroup(f) {
if (!document.getElementById("smiley-bar"))
return;
var buttonBar = document.getElementById("smiley-bar");
if (document.getElementById("smiley-instructions")) {
var el = document.getElementById("smiley-instructions").firstChild;
let elems = document.getElementById("smiley-instructions").querySelectorAll("div");
var obj = null;
var list = [];
while (el != null) {
if (el.nodeName && el.nodeName.toLowerCase() == "dt") {
for (const el of elems) {
const term = el.querySelector("dt");
const desc = el.querySelectorAll("dd");
if (term) {
obj = {
code : el.firstChild.nodeValue,
title : el.title,
classes : el.className,
code : term.textContent,
title : term.getAttribute("title"),
classes : term.getAttribute("class"),
isSmilie: true,
childs : []
};
}
else if (obj && el.nodeName && el.nodeName.toLowerCase() == "dd") {
obj.label = el.firstChild;
if (obj.classes.search(/default/) != -1)
createSingleButton(obj, buttonBar);
else
list.push(obj);
obj = null;
}
el = el.nextSibling;
if (obj && desc) {
for (const d of desc) {
obj.label = d.firstChild;
if (obj.classes.search(/default/) != -1)
createSingleButton(obj, buttonBar);
else
list.push(obj);
obj = null;
}
}
}
if (list && list.length > 0) {
obj = {
code : "",
title : lang["more_smilies_title"],
label : lang["more_smilies_label"],
classes : "more-smilies",
classes : "",
isSmilie: true,
childs : list
};
createSingleButton(obj, buttonBar);
if (obj)
createSingleButton(obj, buttonBar);
}
}
}
/**
* WTransform introduction (for adding source code) into button elements
* Transform introduction (for adding source code) into button elements
*/
var convertInstructionsToButton = function() {
if (!document.getElementById("bbcode-bar"))
@ -468,32 +475,33 @@ function ButtonGroup(f) {
var buttonBar = document.getElementById("bbcode-bar");
if (document.getElementById("bbcode-instructions")) {
var el = document.getElementById("bbcode-instructions").firstChild;
let elems = document.getElementById("bbcode-instructions").querySelectorAll("div");
var obj = null;
while (el != null) {
if (el.nodeName && el.nodeName.toLowerCase() == "dt") {
if (obj)
createSingleButton(obj, buttonBar);
for (const el of elems) {
const term = el.querySelector("dt");
const desc = el.querySelectorAll("dd");
if (term) {
obj = {
code : el.id,
label : el.title,
title : el.firstChild.nodeValue,
classes : el.className,
code : term.getAttribute("id"),
label : term.getAttribute("title"),
title : term.textContent,
classes : term.getAttribute("class"),
childs : []
};
}
else if (obj && el.nodeName && el.nodeName.toLowerCase() == "dd") {
var attChild = {
attribute : el.id,
label : el.title
if (obj && desc) {
for (const d of desc) {
var attChild = {
attribute : d.getAttribute("id"),
label : d.getAttribute("title")
}
obj.childs.push(attChild);
}
obj.childs.push( attChild );
}
el = el.nextSibling;
if (obj)
createSingleButton(obj, buttonBar);
}
if (obj)
createSingleButton(obj, buttonBar);
}
};
@ -554,8 +562,7 @@ function ButtonGroup(f) {
*/
var createBBCodeButton = function(button, list) {
var bbCodeButton = null;
var bname=button&&button.name?button.name.toLowerCase():"";
//switch(button.name.toLowerCase()) {
var bname = button && button.name ? button.name.toLowerCase() : "";
switch(bname) {
case "link":
bbCodeButton = new BBCodeLinkButton( button );
@ -564,7 +571,7 @@ function ButtonGroup(f) {
if (list && list.length > 1)
bbCodeButton = new BBCodeOptionButton(button, list, lang["bbcode_image_url"], "https://" );
else
bbCodeButton = new BBCodePromtButton( button, lang["bbcode_image_url"], "https://" );
bbCodeButton = new BBCodePromtButton( button, lang["bbcode_image_url"], "https://" );
break;
case "color":
bbCodeButton = new BBCodeColorChooserButton( button );
@ -573,10 +580,10 @@ function ButtonGroup(f) {
bbCodeButton = new BBCodeListButton( button );
break;
case "upload":
bbCodeButton = new BBCodePopUpButton( button, "index.php?mode=upload_image", settings["upload_popup_width"], settings["upload_popup_height"]);
bbCodeButton = new BBCodePopUpButton( button, "index.php?mode=upload_image", settings["upload_popup_width"], settings["upload_popup_height"]);
break;
case "tex":
bbCodeButton = new BBCodePromtButton( button, lang["bbcode_tex_code"] );
bbCodeButton = new BBCodePromtButton( button, lang["bbcode_tex_code"] );
break;
default:
if (button.isSmilie && list && list.length > 0)
@ -591,8 +598,8 @@ function ButtonGroup(f) {
}
return bbCodeButton;
};
/**
/**
* Creates a window to show further options of the clicked button
* @return win
*/
@ -625,10 +632,10 @@ function ButtonGroup(f) {
else
content.replaceChild(list, content.firstChild);
};
w.enableOptionList = function(enable, pos) {
if (pos) {
this.style.left = pos.left + "px";
this.style.left = pos.left + "px";
this.style.top = pos.top + "px";
}
if (enable)
@ -638,13 +645,13 @@ function ButtonGroup(f) {
};
var oldOnKeyPressFunc = window.document.onmousedown;
window.document.onkeypress = function(e) {
window.document.onkeypress = function(e) {
if (e.key == "Esc")
self.enableOptionList(false);
self.enableOptionList(false);
if (typeof oldOnKeyPressFunc == "function")
oldOnKeyPressFunc(e);
}
}
return w;
};
@ -656,17 +663,18 @@ function ButtonGroup(f) {
var initUserBBCodeButtons = function(isSmilie) {
isSmilie = isSmilie || false;
hasUserButtons = false;
var id = isSmilie?"smiley-bar":"bbcode-bar";
var id = isSmilie ? "smiley-bar" : "bbcode-bar";
if (!document.getElementById(id))
return;
var userButtons = document.getElementById(id).getElementsByTagName("button");
if (userButtons && userButtons.length > 0) {
for (var i=0; i<userButtons.length; i++) {
var j = userButtons.length;
for (var i=0; i<j; i++) {
hasUserButtons = true;
userButtons[i].isSmilie = isSmilie;
addButton(createBBCodeButton(userButtons[i], null), true);
}
}
}
};
/**
@ -679,27 +687,20 @@ function ButtonGroup(f) {
textarea.quote = textarea.value;
textarea.value = "";
}
textarea.getQuote = function() {
return textarea.quote.trim();
}
// Zitieren-Link einfuegen
// insert the quotation-link
if (textarea.getQuote() != "" && document.getElementById("message")) {
var labels = document.getElementById("message").getElementsByTagName("label");
var label = null;
for (var i=0; i<labels.length; i++) {
if (labels[i].className.search(/textarea/) != -1) {
label = labels[i];
break;
}
}
var label = document.querySelector('label[for="text"]');
if (label) {
var quoteButton = document.createElementWithAttributes("button", {"type": "button", "id": "insert-quote", "title": lang["quote_title"], "tabIndex": -1});
quoteButton.onclick = function(e) {
textarea.value = textarea.getQuote() + "\r\n\r\n" + textarea.value;
this.classList.add("js-display-none");
textarea.focus();
textarea.value = textarea.getQuote() + "\r\n\r\n" + textarea.value;
this.classList.add("js-display-none");
textarea.focus();
return false;
};
quoteButton.appendChild( document.createTextNode(lang["quote_label"]) )
@ -748,7 +749,7 @@ function ButtonGroup(f) {
*/
this.getTextArea = function() {
return textarea;
};
};
/**
* Returns the property window of the button
@ -766,19 +767,15 @@ function ButtonGroup(f) {
link.onclick = function(e) {
document.cookie = settings["session_prefix"]+'userdata=; expires=Thu, 01-Jan-70 00:00:01 GMT;';
span.innerHTML = "";
if(f.elements["setcookie"]) f.elements["setcookie"].checked = false;
if(f.elements["setcookie"]) f.elements["setcookie"].checked = false;
return false;
};
};
};
var removeIntroductionElements = function() {
if (document.getElementById("bbcode-instructions")) {
var el = document.getElementById("bbcode-instructions");
el.parentNode.removeChild(el);
}
if (document.getElementById("smiley-instructions")) {
var el = document.getElementById("smiley-instructions");
el.parentNode.removeChild(el);
if (document.getElementById("formatting-help")) {
var el = document.getElementById("formatting-help");
el.classList.add('js-display-none');
}
};

2
js/posting.min.js vendored

File diff suppressed because one or more lines are too long

View file

@ -27,8 +27,8 @@ locale = ar
locale_charset = utf-8
word_delimiters = ' '
dir = rtl
time_format = dd/mm/YYYY, HH:mm
time_format_full = EEEE، dd F YYYY، HH:mm
time_format = 'dd/MM/YYYY, HH:mm'
time_format_full = 'EEEE، dd/MMMM/YYYY، HH:mm'
forum_time = 'وقت المنتدى×: [time]'
forum_time_with_time_zone = 'توقيت المنتدى:× [time] ([time_zone])'
unknown_user = 'مستخدم غير معروف'
@ -53,8 +53,8 @@ next_page_link = '&raquo;'
previous_page_link = '&laquo;'
next_page_link_title = 'الصفحة التالية'
previous_page_link_title = 'الصفحة السابقة'
posted_by = 'بواسطة× <strong>[name]</strong>[email_hp]<span class="interpunction">, </span>[time]'
posted_by_location = 'بواسطة× <strong>[name]</strong>[email_hp]<span class="interpunction">, </span>[location]<span class="interpunction">, </span>[time]'
posted_by = 'بواسطة× [name][email_hp]<span class="interpunction">, </span>'
posted_by_location = 'بواسطة× [name][email_hp]<span class="interpunction">, </span>[location]<span class="interpunction">, </span>'
original_posting_linktitle = 'انقر لتذهب إلى المنشور الأصلي لــ ×[name]'
error_headline = 'خطأ!'
no_authorisation = 'لا مفوّضين!'
@ -217,6 +217,8 @@ more_smilies_label = 'مزيد...'
more_smilies_title = 'وجوه تعبيريّة أخرى'
close = 'إغلاق'
no_postings_user = 'لا منشورات.'
search_term = '<!-- TODO -->Search term'
search_category = '<!-- TODO -->Search in category'
search_submit_button = 'بحث'
search_fulltext = 'نَص كامل'
search_tags = 'وسوم'
@ -312,7 +314,7 @@ error_bookmark_word_too_long = 'الكلمة× "[word]" ×طويلة جدًّ
error_bookmark_tags_limit_reached = 'وسوم العلامات المرجعيّة قد بلغ الحد الممكن'
[entry]
edited_by = 'تم تعديله بواسطة× [name], [time]'
edited_by = 'تم تعديله بواسطة× [name]<span class="interpunction">, </span>'
tags_marking = 'وسوم:'
one_view = 'مشاهدة واحدة'
several_views = '[views] ×مشاهدات'
@ -369,6 +371,8 @@ subject_marking = 'عنوان:'
message_marking = 'رسالة:'
tags_marking = 'وسوم:'
tags_note = '(اختياري, مفصول بفاصلة)'
bbcode_help_heading = '<!-- TODO -->Formatting help'
bbcode_help_skip_link = '<!-- TODO -->skip to input'
bbcode_bold_label = 'عريض'
bbcode_bold_title = 'تنسيق النص عريض'
bbcode_bold_instruction = '[b]×خط عريض×[/b]'
@ -699,6 +703,7 @@ register_user_email = 'تسجيل بريد المستخدم:'
register_pw = 'تسجيل كلمة السر:'
register_honeypot_field = 'اترك هذا الحقل فارغًا:'
register_only_by_admin = 'لا يمكن تسجيل المستخدمين إلا من قبل مسؤول المنتدى.'
register_link_to_login = '<!-- TODO -->Go to login'
registered = ' <strong>[var]</strong> تم تسجيل الحساب وإرسال مفتاح التفعيل إليه. يجب تفعيل الحساب خلال يوم واحد'
registered_send_error = 'تم تسجيل الحساب ولكن تعذر إرسال مفتاح التنشيط (خادم البريد غير متوفر). برجاء الاتصال بمسؤول المنتدى وطلب تفعيل الحساب يدويًا.'
activation_failed = 'تنشيط الحساب قد فشل.'
@ -970,9 +975,18 @@ no_users_in_selection = 'لا يوجد مستخدمون في التح
# upload management
upload_administration = 'إدارة الرفع والتحميل'
mark_upload_for_removal = 'علامة للإزالة'
mark_upload_for_managing = '<!-- TODO -->mark for managing'
no_uploads_found = 'لم يتم العثور على أي ملفات مرفوعة.'
delete_upload_confirmation = 'هل أنت متأكد أنك تريد حذف هذا التحميل؟'
delete_uploads_confirmation = 'هل أنت متأكد أنك تريد حذف التحميلات التالية؟'
check_for_unrecorded_uploads = '<!-- TODO -->record uploads'
check_for_unrecorded_uploads_desc = '<!-- TODO -->Check whether there are any uploads that are not yet included in the list of uploads. If any are found, they are entered in the list.'
upload_add_db_entry_button = '<!-- TODO -->record to database'
upload_database_entry_alt = '<!-- TODO -->There is a database entry for this image'
upload_database_no_entry_alt = '<!-- TODO -->There is no database entry for this image'
upload_filter_not_managed_images ='<!-- TODO -->not managed images'
upload_filter_managed_images = '<!-- TODO -->managed images'
upload_filter_all_images = '<!-- TODO -->all images'
# spam protection:
captcha = 'الصورة الإختباريّة'

View file

@ -30,8 +30,8 @@ locale = zh
locale_charset = utf-8
word_delimiters = ' 、,。;“”!?'
dir = ltr
time_format = YYYY-MM-dd, hh:mm
time_format_full = EEEE, MMMM dd, YYYY, hh:mm
time_format = 'YYYY-MM-dd, HH:mm'
time_format_full = 'YYYY\'年\'MM\'月\'dd\'日\' (EEEE), HH\'时\'mm\'分\''
forum_time = '论坛时间:[time]'
forum_time_with_time_zone = '论坛时间:[time] ([time_zone])'
unknown_user = '游客'
@ -56,8 +56,8 @@ next_page_link = '&raquo;'
previous_page_link = '&laquo;'
next_page_link_title = '下一页'
previous_page_link_title = '上一页'
posted_by = '<!-- TODO -->by <strong>[name]</strong>[email_hp]<span class="interpunction">, </span>[time]'
posted_by_location = '<!-- TODO -->by <strong>[name]</strong>[email_hp]<span class="interpunction">, </span>[location]<span class="interpunction">, </span>[time]'
posted_by = '<!-- TODO -->by [name][email_hp]<span class="interpunction">, </span>'
posted_by_location = '<!-- TODO -->by [name][email_hp]<span class="interpunction">, </span>[location]<span class="interpunction">, </span>'
original_posting_linktitle = '点击前往原始帖子 by [name]'
error_headline = '错误!'
no_authorisation = '没有权限!'
@ -220,6 +220,8 @@ more_smilies_label = '更多…'
more_smilies_title = '更多表情'
close = '关闭'
no_postings_user = '目前还没有帖子。'
search_term = '<!-- TODO -->Search term'
search_category = '<!-- TODO -->Search in category'
search_submit_button = '搜索'
search_fulltext = '全文'
search_tags = '标签'
@ -315,7 +317,7 @@ error_bookmark_word_too_long = '词汇 "[word]" 过长'
error_bookmark_tags_limit_reached = '标签数量已达到书签的上限'
[entry]
edited_by = '编辑 by [name], [time]'
edited_by = '编辑 by [name]<span class="interpunction">, </span>'
tags_marking = '标签:'
one_view = '1 次浏览'
several_views = '[views] 次浏览'
@ -372,6 +374,8 @@ subject_marking = '主题:'
message_marking = '内容:'
tags_marking = '标签:'
tags_note = '(选填,以逗号区隔)'
bbcode_help_heading = '<!-- TODO -->Formatting help'
bbcode_help_skip_link = '<!-- TODO -->skip to input'
bbcode_bold_label = '粗体'
bbcode_bold_title = '粗体文字'
bbcode_bold_instruction = '[b]粗体文字[/b]'
@ -702,6 +706,7 @@ register_user_email = '邮箱:'
register_pw = '密码:'
register_honeypot_field = '将此栏留空:'
register_only_by_admin = '目前只有管理员可以注册用户。'
register_link_to_login = '<!-- TODO -->Go to login'
registered = '帐号已注册,启用码已寄至 <strong>[var]</strong>。<strong>帐号必须在一天内启用。</strong>'
registered_send_error = '帐号已注册,但无法寄出启用码 (邮箱服务器无法使用)。请与管理员联系并请求协助启用帐号。'
activation_failed = '帐号启用失败。'
@ -973,9 +978,18 @@ no_users_in_selection = '尚未选择用户'
# upload management
upload_administration = '<!-- TODO -->Upload management'
mark_upload_for_removal = '<!-- TODO -->mark for removal'
mark_upload_for_managing = '<!-- TODO -->mark for managing'
no_uploads_found = '<!-- TODO -->Found no uploaded files.'
delete_upload_confirmation = '<!-- TODO -->Are you sure you want to delete this upload?'
delete_uploads_confirmation = '<!-- TODO -->Are you sure you want to delete the following uploads?'
check_for_unrecorded_uploads = '<!-- TODO -->record uploads'
check_for_unrecorded_uploads_desc = '<!-- TODO -->Check whether there are any uploads that are not yet included in the list of uploads. If any are found, they are entered in the list.'
upload_add_db_entry_button = '<!-- TODO -->record to database'
upload_database_entry_alt = '<!-- TODO -->There is a database entry for this image'
upload_database_no_entry_alt = '<!-- TODO -->There is no database entry for this image'
upload_filter_not_managed_images ='<!-- TODO -->not managed images'
upload_filter_managed_images = '<!-- TODO -->managed images'
upload_filter_all_images = '<!-- TODO -->all images'
# spam protection:
captcha = 'CAPTCHA'

View file

@ -30,8 +30,8 @@ locale = zh
locale_charset = utf-8
word_delimiters = ' 、,。;“”!?'
dir = ltr
time_format = YYYY-MM-dd, hh:mm
time_format_full = EEEE, MMMM dd, YYYY, hh:mm
time_format = 'YYYY-MM-dd, HH:mm'
time_format_full = 'YYYY\'年\'MM\'月\'dd\'日\' (EEEE), HH\'時\'mm\'分\''
forum_time = '論壇時間:[time]'
forum_time_with_time_zone = '論壇時間:[time] ([time_zone])'
unknown_user = '訪客'
@ -56,8 +56,8 @@ next_page_link = '&raquo;'
previous_page_link = '&laquo;'
next_page_link_title = '下一頁'
previous_page_link_title = '上一頁'
posted_by = 'by <strong>[name]</strong>[email_hp]<span class="interpunction">, </span>[time]'
posted_by_location = 'by <strong>[name]</strong>[email_hp]<span class="interpunction">, </span>[location]<span class="interpunction">, </span>[time]'
posted_by = 'by [name][email_hp]<span class="interpunction">, </span>'
posted_by_location = 'by [name][email_hp]<span class="interpunction">, </span>[location]<span class="interpunction">, </span>'
original_posting_linktitle = '點擊前往原始文章 by [name]'
error_headline = '錯誤!'
no_authorisation = '沒有權限!'
@ -220,6 +220,8 @@ more_smilies_label = '更多…'
more_smilies_title = '更多表情'
close = '關閉'
no_postings_user = '目前還沒有文章。'
search_term = '<!-- TODO -->Search term'
search_category = '<!-- TODO -->Search in category'
search_submit_button = '搜尋'
search_fulltext = '全文'
search_tags = '標籤'
@ -315,7 +317,7 @@ error_bookmark_word_too_long = '詞彙 "[word]" 過長'
error_bookmark_tags_limit_reached = '標籤數量已達到書籤的上限'
[entry]
edited_by = '編輯 by [name], [time]'
edited_by = '編輯 by [name]<span class="interpunction">, </span>'
tags_marking = '標籤:'
one_view = '1 次瀏覽'
several_views = '[views] 次瀏覽'
@ -372,6 +374,8 @@ subject_marking = '主題:'
message_marking = '內容:'
tags_marking = '標籤:'
tags_note = '(選填,以逗號區隔)'
bbcode_help_heading = '<!-- TODO -->Formatting help'
bbcode_help_skip_link = '<!-- TODO -->skip to input'
bbcode_bold_label = '粗體'
bbcode_bold_title = '粗體文字'
bbcode_bold_instruction = '[b]粗體文字[/b]'
@ -702,6 +706,7 @@ register_user_email = '信箱:'
register_pw = '密碼:'
register_honeypot_field = '將此欄留空:'
register_only_by_admin = '目前只有管理員可以註冊用戶。'
register_link_to_login = '<!-- TODO -->Go to login'
registered = '帳號已註冊,啟用碼已寄至 <strong>[var]</strong>。<strong>帳號必須在一天內啟用。</strong>'
registered_send_error = '帳號已註冊,但無法寄出啟用碼 (信箱伺服器無法使用)。請與管理員聯繫並請求協助啟用帳號。'
activation_failed = '帳號啟用失敗。'
@ -973,9 +978,18 @@ no_users_in_selection = '尚未選擇用戶'
# upload management
upload_administration = '<!-- TODO -->Upload management'
mark_upload_for_removal = '<!-- TODO -->mark for removal'
mark_upload_for_managing = '<!-- TODO -->mark for managing'
no_uploads_found = '<!-- TODO -->Found no uploaded files.'
delete_upload_confirmation = '<!-- TODO -->Are you sure you want to delete this upload?'
delete_uploads_confirmation = '<!-- TODO -->Are you sure you want to delete the following uploads?'
check_for_unrecorded_uploads = '<!-- TODO -->record uploads'
check_for_unrecorded_uploads_desc = '<!-- TODO -->Check whether there are any uploads that are not yet included in the list of uploads. If any are found, they are entered in the list.'
upload_add_db_entry_button = '<!-- TODO -->record to database'
upload_database_entry_alt = '<!-- TODO -->There is a database entry for this image'
upload_database_no_entry_alt = '<!-- TODO -->There is no database entry for this image'
upload_filter_not_managed_images ='<!-- TODO -->not managed images'
upload_filter_managed_images = '<!-- TODO -->managed images'
upload_filter_all_images = '<!-- TODO -->all images'
# spam protection:
captcha = 'CAPTCHA'

View file

@ -30,8 +30,8 @@ locale = hr
locale_charset = utf-8
word_delimiters = ' '
dir = ltr
time_format = dd/MM/YYYY, hh:mm
time_format_full = EEEE dd MMMM YYYY, hh:mm
time_format = 'dd.\'&nbsp;\'MM.\'&nbsp;\'YYYY, HH:mm'
time_format_full = 'EEEE d MMMM YYYY, H:mm'
forum_time = 'Vrijeme na forumu: [time]'
forum_time_with_time_zone = 'Vrijeme na forumu: [time] ([time_zone])'
unknown_user = 'nepoznat'
@ -56,8 +56,8 @@ next_page_link = 'Sljedeća stranica &raquo;'
previous_page_link = '&laquo; Prethodna stranica'
next_page_link_title = 'sljedeća stranica'
previous_page_link_title = 'prethodna stranica'
posted_by = 'od <strong>[name]</strong>[email_hp]<span class="interpunction">, </span>[time]'
posted_by_location = 'od <strong>[name]</strong>[email_hp]<span class="interpunction">, </span>[location]<span class="interpunction">, </span>[time]'
posted_by = 'od [name][email_hp]<span class="interpunction">, </span>'
posted_by_location = 'od [name][email_hp]<span class="interpunction">, </span>[location]<span class="interpunction">, </span>'
original_posting_linktitle = 'klikni za otvaranje početne poruke od [name]'
error_headline = 'Greška!'
no_authorisation = 'Nemate dopuštenje!'
@ -220,6 +220,8 @@ more_smilies_label = 'više...'
more_smilies_title = 'više smajlića'
close = 'zatvori'
no_postings_user = 'Nema poruka.'
search_term = '<!-- TODO -->Search term'
search_category = '<!-- TODO -->Search in category'
search_submit_button = 'Traži'
search_fulltext = 'izraz'
search_tags = 'oznake'
@ -315,7 +317,7 @@ error_bookmark_word_too_long = '<!-- TODO -->The word "[word]" is too long'
error_bookmark_tags_limit_reached = '<!-- TODO -->Tags limit reached for bookmark'
[entry]
edited_by = 'Ispravio [name], [time]'
edited_by = 'Ispravio [name]<span class="interpunction">, </span>'
tags_marking = 'Oznake:'
one_view = '1 otvaranje'
several_views = '[views] otvaranja'
@ -372,6 +374,8 @@ subject_marking = 'Tema:'
message_marking = 'Poruka:'
tags_marking = 'Oznake:'
tags_note = '(nije obavezno, razdvojeno zarezima)'
bbcode_help_heading = '<!-- TODO -->Formatting help'
bbcode_help_skip_link = '<!-- TODO -->skip to input'
bbcode_bold_label = 'podebljano'
bbcode_bold_title = 'Podebljaj tekst'
bbcode_bold_instruction = '[b]Tekst[/b]'
@ -702,6 +706,7 @@ register_user_email = 'E-mail:'
register_pw = 'Lozinka:'
register_honeypot_field = '<!-- TODO -->Leave this field empty:'
register_only_by_admin = 'Samo administrator može registrirati nove korisnike.'
register_link_to_login = '<!-- TODO -->Go to login'
registered = 'Korisnički račun je registriran i aktivacijski ključ je poslan na <strong>[var]</strong>. Korsnički račun mora biti aktiviran unutar jednog dana.'
registered_send_error = 'Korisnički račun je registriran ali aktivacijski ključ nije poslan zbog problema sa mail poslužiteljem. Kontaktirajte administratora i zatražite ručnu aktivaciju.'
activation_failed = 'Aktivacija korisničkog računa nije uspjela.'
@ -973,9 +978,18 @@ no_users_in_selection = 'Nema korisnika koji zadovoljavaju postavljene
# upload management
upload_administration = '<!-- TODO -->Upload management'
mark_upload_for_removal = '<!-- TODO -->mark for removal'
mark_upload_for_managing = '<!-- TODO -->mark for managing'
no_uploads_found = '<!-- TODO -->Found no uploaded files.'
delete_upload_confirmation = '<!-- TODO -->Are you sure you want to delete this upload?'
delete_uploads_confirmation = '<!-- TODO -->Are you sure you want to delete the following uploads?'
check_for_unrecorded_uploads = '<!-- TODO -->record uploads'
check_for_unrecorded_uploads_desc = '<!-- TODO -->Check whether there are any uploads that are not yet included in the list of uploads. If any are found, they are entered in the list.'
upload_add_db_entry_button = '<!-- TODO -->record to database'
upload_database_entry_alt = '<!-- TODO -->There is a database entry for this image'
upload_database_no_entry_alt = '<!-- TODO -->There is no database entry for this image'
upload_filter_not_managed_images ='<!-- TODO -->not managed images'
upload_filter_managed_images = '<!-- TODO -->managed images'
upload_filter_all_images = '<!-- TODO -->all images'
# spam protection:
captcha = 'CAPTCHA'

View file

@ -30,8 +30,8 @@ locale = da_DK
locale_charset = utf-8
word_delimiters = ' '
dir = ltr
time_format = d/M YYYY, HH:mm
time_format_full = EEEE d. MMMM, YYYY, HH:mm
time_format = 'd/M YYYY, HH:mm'
time_format_full = 'EEEE, \'den\' d. MMMM YYYY, HH:mm'
forum_time = 'Forumtid: [time]'
forum_time_with_time_zone = 'Forumtid: [time] ([time_zone])'
unknown_user = 'ukendt'
@ -56,8 +56,8 @@ next_page_link = 'Næste side &raquo;'
previous_page_link = '&laquo; Forrige side'
next_page_link_title = 'næste side'
previous_page_link_title = 'forrige side'
posted_by = 'af <strong>[name]</strong>[email_hp]<span class="interpunction">, </span>[time]'
posted_by_location = 'af <strong>[name]</strong>[email_hp]<span class="interpunction">, </span>[location]<span class="interpunction">, </span>[time]'
posted_by = 'af [name][email_hp]<span class="interpunction">, </span>'
posted_by_location = 'af [name][email_hp]<span class="interpunction">, </span>[location]<span class="interpunction">, </span>'
original_posting_linktitle = 'klik for at gå til det originale indlæg af [name]'
error_headline = 'Fejl!'
no_authorisation = 'Ingen autoritet!'
@ -220,6 +220,8 @@ more_smilies_label = 'flere …'
more_smilies_title = 'flere smilies'
close = 'luk'
no_postings_user = 'Ingen indlæg.'
search_term = '<!-- TODO -->Search term'
search_category = '<!-- TODO -->Search in category'
search_submit_button = 'Søg'
search_fulltext = 'fuld tekst'
search_tags = 'tags'
@ -315,7 +317,7 @@ error_bookmark_word_too_long = 'Ordet "[word]" er for langt'
error_bookmark_tags_limit_reached = 'Taggrænsen for bogmærker er nået'
[entry]
edited_by = 'redigeret af [name], [time]'
edited_by = 'redigeret af [name]<span class="interpunction">, </span>'
tags_marking = 'Tags:'
one_view = '1 visning'
several_views = '[views] visninger'
@ -372,6 +374,8 @@ subject_marking = 'Emne:'
message_marking = 'Besked:'
tags_marking = 'Tags:'
tags_note = '(valgfri, adskil med komma)'
bbcode_help_heading = '<!-- TODO -->Formatting help'
bbcode_help_skip_link = '<!-- TODO -->skip to input'
bbcode_bold_label = 'fed'
bbcode_bold_title = 'Fed tekst'
bbcode_bold_instruction = '[b]Tekst[/b]'
@ -702,6 +706,7 @@ register_user_email = 'E-mail:'
register_pw = 'Kodeord:'
register_honeypot_field = 'Lad dette felt være tomt:'
register_only_by_admin = 'Brugere kan kun blive registreret af forum administratoren.'
register_link_to_login = '<!-- TODO -->Go to login'
registered = 'Kontoen er registreret og aktiverings nøglen er sendt til <strong>[var]</strong>. Kontoen skal aktiveres indenfor det næste døgn.'
registered_send_error = 'Kontoen er registreret men aktiverings nøglen kunne ikke sendes (mailserver ikke tilgængelig). Kontakt venligst forum administratoren og spørg efter en manuel konto aktivering.'
activation_failed = 'Aktiveringen af kontoen fejlede.'
@ -973,9 +978,18 @@ no_users_in_selection = 'Ingen brugere fundet'
# upload management
upload_administration = 'Uploadstyring'
mark_upload_for_removal = 'Markér til sletning'
mark_upload_for_managing = '<!-- TODO -->mark for managing'
no_uploads_found = 'Ingen uploadede filer fundet.'
delete_upload_confirmation = 'Er du sikker på, du vil slette denne upload?'
delete_uploads_confirmation = 'Er du sikker på, du vil slette disse upload?'
check_for_unrecorded_uploads = '<!-- TODO -->record uploads'
check_for_unrecorded_uploads_desc = '<!-- TODO -->Check whether there are any uploads that are not yet included in the list of uploads. If any are found, they are entered in the list.'
upload_add_db_entry_button = '<!-- TODO -->record to database'
upload_database_entry_alt = '<!-- TODO -->There is a database entry for this image'
upload_database_no_entry_alt = '<!-- TODO -->There is no database entry for this image'
upload_filter_not_managed_images ='<!-- TODO -->not managed images'
upload_filter_managed_images = '<!-- TODO -->managed images'
upload_filter_all_images = '<!-- TODO -->all images'
# spam protection:
captcha = 'CAPTCHA'

View file

@ -27,8 +27,8 @@ locale = en
locale_charset = utf-8
word_delimiters = ' '
dir = ltr
time_format = YYYY-MM-dd, hh:mm
time_format_full = EEEE, MMMM dd, YYYY, hh:mm
time_format = 'YYYY-MM-dd, hh:mm a'
time_format_full = 'EEEE, MMMM dd, YYYY, hh:mm a'
forum_time = 'Forum time: [time]'
forum_time_with_time_zone = 'Forum time: [time] ([time_zone])'
unknown_user = 'unknown'
@ -53,8 +53,8 @@ next_page_link = '&raquo;'
previous_page_link = '&laquo;'
next_page_link_title = 'next page'
previous_page_link_title = 'previous page'
posted_by = 'by <strong>[name]</strong>[email_hp]<span class="interpunction">, </span>[time]'
posted_by_location = 'by <strong>[name]</strong>[email_hp]<span class="interpunction">, </span>[location]<span class="interpunction">, </span>[time]'
posted_by = 'by [name][email_hp]<span class="interpunction">, </span>'
posted_by_location = 'by [name][email_hp]<span class="interpunction">, </span>[location]<span class="interpunction">, </span>'
original_posting_linktitle = 'click to go to the original posting by [name]'
error_headline = 'Error!'
no_authorisation = 'No authorisation!'
@ -217,6 +217,8 @@ more_smilies_label = 'more...'
more_smilies_title = 'more smilies'
close = 'close'
no_postings_user = 'No postings.'
search_term = 'Search term'
search_category = 'Search in category'
search_submit_button = 'Search'
search_fulltext = 'full text'
search_tags = 'tags'
@ -312,7 +314,7 @@ error_bookmark_word_too_long = 'The word "[word]" is too long'
error_bookmark_tags_limit_reached = 'Tags limit reached for bookmark'
[entry]
edited_by = 'edited by [name], [time]'
edited_by = 'edited by [name]<span class="interpunction">, </span>'
tags_marking = 'Tags:'
one_view = '1 view'
several_views = '[views] views'
@ -369,6 +371,8 @@ subject_marking = 'Subject:'
message_marking = 'Message:'
tags_marking = 'Tags:'
tags_note = '(optional, separated by comma)'
bbcode_help_heading = 'Formatting help'
bbcode_help_skip_link = 'skip to input'
bbcode_bold_label = 'bold'
bbcode_bold_title = 'format text bold'
bbcode_bold_instruction = '[b]bold text[/b]'
@ -699,6 +703,7 @@ register_user_email = 'E-mail:'
register_pw = 'Password:'
register_honeypot_field = 'Leave this field empty:'
register_only_by_admin = 'Users can only be registered by the admin of the forum.'
register_link_to_login = 'Go to login'
registered = 'The account has been registered and the activation key has been sent to <strong>[var]</strong>. The account has to be activated within one day.'
registered_send_error = 'The account has been registered but the activation key could not been sent (mail server not available). Please contact the forum administrator and ask for manual account activation.'
activation_failed = 'The activation of the account failed.'
@ -970,9 +975,18 @@ no_users_in_selection = 'No users in selection'
# upload management
upload_administration = 'Upload management'
mark_upload_for_removal = 'mark for removal'
mark_upload_for_managing = 'mark for managing'
no_uploads_found = 'Found no uploaded files.'
delete_upload_confirmation = 'Are you sure you want to delete this upload?'
delete_uploads_confirmation = 'Are you sure you want to delete the following uploads?'
check_for_unrecorded_uploads = 'record uploads'
check_for_unrecorded_uploads_desc = 'Check whether there are any uploads that are not yet included in the list of uploads. If any are found, they are entered in the list.'
upload_add_db_entry_button = 'record to database'
upload_database_entry_alt = 'There is a database entry for this image'
upload_database_no_entry_alt = 'There is no database entry for this image'
upload_filter_not_managed_images ='not managed images'
upload_filter_managed_images = 'managed images'
upload_filter_all_images = 'all images'
# spam protection:
captcha = 'CAPTCHA'

View file

@ -34,8 +34,8 @@ locale = fr
locale_charset = utf-8
word_delimiters = ' '
dir = ltr
time_format = dd/MM/YYYY, hh:mm
time_format_full = EEEE dd MMMM YYYY, hh:mm
time_format = 'dd/MM/YYYY, HH:mm'
time_format_full = 'EEEE dd MMMM YYYY, HH \'h\' mm'
forum_time = 'Temps actuel sur le forum : [time]'
forum_time_with_time_zone = 'Temps actuel sur le forum : [time] ([time_zone])'
unknown_user = 'inconnu'
@ -60,8 +60,8 @@ next_page_link = '&raquo;'
previous_page_link = '&laquo;'
next_page_link_title = 'page suivante'
previous_page_link_title = 'page précédente'
posted_by = 'par <strong>[name]</strong>[email_hp]<span class="interpunction">, </span>[time]'
posted_by_location = 'par <strong>[name]</strong>[email_hp]<span class="interpunction">, </span>[location]<span class="interpunction">, </span>[time]'
posted_by = 'par [name][email_hp]<span class="interpunction">, </span>'
posted_by_location = 'par [name][email_hp]<span class="interpunction">, </span>[location]<span class="interpunction">, </span>'
original_posting_linktitle = 'Cliquer pour aller au message de base posté par [name]'
error_headline = 'Erreur !'
no_authorisation = 'Pas d\'autorisation !'
@ -224,6 +224,8 @@ more_smilies_label = 'plus...'
more_smilies_title = 'plus de smileys'
close = 'fermer'
no_postings_user = 'Pas de messages.'
search_term = '<!-- TODO -->Search term'
search_category = '<!-- TODO -->Search in category'
search_submit_button = 'Rechercher'
search_fulltext = 'texte entier'
search_tags = 'Mots-clés'
@ -319,7 +321,7 @@ error_bookmark_word_too_long = 'Le mot "[word]" est trop long'
error_bookmark_tags_limit_reached = 'Il y a trop de tags'
[entry]
edited_by = 'édité par [name], [time]'
edited_by = 'édité par [name]<span class="interpunction">, </span>'
tags_marking = 'Mots-clés :'
one_view = '1 vue'
several_views = '[views] vues'
@ -376,6 +378,8 @@ subject_marking = 'Sujet :'
message_marking = 'Message :'
tags_marking = 'Mots-clés :'
tags_note = '(en option, séparé par une virgule)'
bbcode_help_heading = '<!-- TODO -->Formatting help'
bbcode_help_skip_link = '<!-- TODO -->skip to input'
bbcode_bold_label = 'gras'
bbcode_bold_title = 'Format texte gras'
bbcode_bold_instruction = '[b]Texte[/b]'
@ -706,6 +710,7 @@ register_user_email = 'Email :'
register_pw = 'Mot de passe :'
register_honeypot_field = 'Si vous voyez ce champs, ne le remplissez pas :'
register_only_by_admin = 'Les utilisateurs ne peuvent être enregistrés que par l\'administrateur du forum.'
register_link_to_login = '<!-- TODO -->Go to login'
registered = 'Le compte a été enregistré et la clef d\'activation a été envoyée à <strong>[var]</strong>. Ce compte doit être activé dans les 24 heures.'
registered_send_error = 'Le compte a été enregistré mais la clef d\'activation n\'a pas pu être envoyée (le serveur de email est inaccessible). Veuillez contacter l\'administrateur du forum et demander une activation manuelle du compte.'
activation_failed = 'La validation du compte a échoué.'
@ -977,9 +982,18 @@ no_users_in_selection = 'Aucun utilisateur dans la sélection'
# upload management
upload_administration = 'Gérer les téléchargements'
mark_upload_for_removal = 'À supprimer'
mark_upload_for_managing = '<!-- TODO -->mark for managing'
no_uploads_found = 'Aucun téléchargement trouvé'
delete_upload_confirmation = 'Êtes-vous sûr de vouloir supprimer ce téléchargement ?'
delete_uploads_confirmation = 'Êtes-vous sûr de vouloir supprimer ces téléchargements ?'
check_for_unrecorded_uploads = '<!-- TODO -->record uploads'
check_for_unrecorded_uploads_desc = '<!-- TODO -->Check whether there are any uploads that are not yet included in the list of uploads. If any are found, they are entered in the list.'
upload_add_db_entry_button = '<!-- TODO -->record to database'
upload_database_entry_alt = '<!-- TODO -->There is a database entry for this image'
upload_database_no_entry_alt = '<!-- TODO -->There is no database entry for this image'
upload_filter_not_managed_images ='<!-- TODO -->not managed images'
upload_filter_managed_images = '<!-- TODO -->managed images'
upload_filter_all_images = '<!-- TODO -->all images'
# spam protection:
captcha = 'PROTECTION'

View file

@ -31,8 +31,8 @@ locale = de
locale_charset = utf-8
word_delimiters = ' '
dir = ltr
time_format = dd.MM.YYYY, HH:mm
time_format_full = EEEE, dd. MMMM YYYY, HH:mm
time_format = 'dd.MM.YYYY, HH:mm'
time_format_full = 'EEEE, dd. MMMM YYYY, HH:mm'
forum_time = 'Forumszeit: [time]'
forum_time_with_time_zone = 'Forumszeit: [time] ([time_zone])'
unknown_user = 'unbekannt'
@ -57,8 +57,8 @@ next_page_link = '&raquo;'
previous_page_link = '&laquo;'
next_page_link_title = 'nächste Seite'
previous_page_link_title = 'vorige Seite'
posted_by = '<strong>[name]</strong>[email_hp]<span class="interpunction">, </span>[time]'
posted_by_location = '<strong>[name]</strong>[email_hp]<span class="interpunction">, </span>[location]<span class="interpunction">, </span>[time]'
posted_by = '[name][email_hp]<span class="interpunction">, </span>'
posted_by_location = '[name][email_hp]<span class="interpunction">, </span>[location]<span class="interpunction">, </span>'
original_posting_linktitle = 'Klicken, um zum Originalposting von [name] zu gelangen'
error_headline = 'Fehler!'
no_authorisation = 'Keine Berechtigung!'
@ -221,6 +221,8 @@ more_smilies_label = 'mehr…'
more_smilies_title = 'mehr Smilies'
close = 'schließen'
no_postings_user = 'keine Einträge'
search_term = 'Suchbegriff'
search_category = 'in Kategorie suchen'
search_submit_button = 'Suche'
search_fulltext = 'Volltext'
search_tags = 'Tags'
@ -316,7 +318,7 @@ error_bookmark_word_too_long = 'das Wort "[word]" ist zu lang'
error_bookmark_tags_limit_reached = 'Maximale Anzahl an Tags pro Lesezeichen überschritten'
[entry]
edited_by = 'bearbeitet von [name], [time]'
edited_by = 'bearbeitet von [name]<span class="interpunction">, </span>'
tags_marking = 'Tags:'
one_view = 'ein View'
several_views = '[views] Views'
@ -373,6 +375,8 @@ subject_marking = 'Betreff:'
message_marking = 'Nachricht:'
tags_marking = 'Tags:'
tags_note = '(optional, durch Komma getrennt)'
bbcode_help_heading = 'Formatierungshilfe'
bbcode_help_skip_link = 'zur Eingabe springen'
bbcode_bold_label = 'fett'
bbcode_bold_title = 'Text fett formatieren'
bbcode_bold_instruction = '[b]fetter Text[/b]'
@ -703,6 +707,7 @@ register_user_email = 'E-Mail:'
register_pw = 'Passwort:'
register_honeypot_field = 'Dieses Feld bitte unausgefüllt lassen:'
register_only_by_admin = 'Neue Benutzer können nur vom Administrator registriert werden.'
register_link_to_login = 'zum Login'
registered = 'Das Benutzerkonto wurde eingerichtet und der Aktivierungslink wurde an <strong>[var]</strong> gesendet. Bitte das Konto innerhalb eines Tages aktivieren.'
registered_send_error = 'Das Benutzerkonto wurde eingerichtet aber der Aktivierungslink konnte nicht gesendet werden (Mailserver-Fehler). Bitte den Administrator kontaktieren um das Konto manuell zu aktivieren.'
activation_failed = 'Aktivierung fehlgeschlagen!'
@ -974,9 +979,19 @@ no_users_in_selection = 'keine Benutzer in der Auswahl'
# Uploadverwaltung
upload_administration = 'Verwaltung der Uploads'
mark_upload_for_removal = 'zum löschen vormerken'
mark_upload_for_managing = 'für Verwaltung markieren'
no_uploads_found = 'Es wurden keine hochgeladenen Dateien gefunden.'
delete_upload_confirmation = 'Sicher, dass dieser Upload gelöscht werden soll?'
delete_uploads_confirmation = 'Sicher, dass diese Uploads gelöscht werden sollen?'
check_for_unrecorded_uploads = 'erfasse Uploads'
check_for_unrecorded_uploads_desc = 'Prüfe, ob Uploads vorhanden sind, die noch nicht in der Liste der Uploads erfasst sind. Falls welche gefunden werden, werden sie in der Liste eingetragen.'
upload_add_db_entry_button = 'in der Datenbank aufnehmen'
upload_database_entry_alt = 'Für dieses Bild existiert ein Datenbankeintrag'
upload_database_no_entry_alt = 'Für dieses Bild existiert kein Datenbankeintrag'
upload_filter_not_managed_images ='nicht verwaltete Bilder'
upload_filter_managed_images = 'verwaltete Bilder'
upload_filter_all_images = 'alle Bilder'
# Spamschutz:
captcha = 'CAPTCHA'
@ -1052,7 +1067,7 @@ update_submit = 'OK Update ausführen'
update_successful = 'Die Datenbank wurde erfolgreich aktualisiert.'
update_items_note = 'Bitte jetzt die folgenden Dateien/Verzeichnisse der neuen Version ([version]) hochladen:'
update_download = 'Falls nicht verfügbar, können diese Dateien [[hier]] heruntergeladen werden.'
update_reenabling_notice = 'Bitte zu beachten, dass das Forum aktuell reaktiviert ist und <a href="index.php?mode=admin&action=settings">in den Einstellungen</a> wieder eingeschaltet werden muss.'
update_reenabling_notice = 'Bitte zu beachten, dass das Forum aktuell deaktiviert ist und <a href="index.php?mode=admin&action=settings">in den Einstellungen</a> wieder eingeschaltet werden muss.'
[emails]
email_subject = 'Antwort auf "[original_subject]"'

View file

@ -31,8 +31,8 @@ locale = ita
locale_charset = utf-8
word_delimiters = ' '
dir = ltr
time_format = YYYY-MM-dd, hh:mm
time_format_full = EEEE, MMMM dd, YYYY, hh:mm
time_format = 'dd/MM/YYYY, HH.mm'
time_format_full = 'EEEE dd MMMM YYYY, H.mm'
forum_time = 'Orario: [time]'
forum_time_with_time_zone = 'Orario: [time] ([time_zone])'
unknown_user = 'sconosciuto'
@ -57,8 +57,8 @@ next_page_link = '&raquo;'
previous_page_link = '&laquo;'
next_page_link_title = 'prossima pagina'
previous_page_link_title = 'pagina precedente'
posted_by = 'Inviato da <strong>[name]</strong>[email_hp]<span class="interpunction">, </span>[time]'
posted_by_location = 'Inviato da <strong>[name]</strong>[email_hp]<span class="interpunction">, </span>[location]<span class="interpunction">, </span>[time]'
posted_by = 'Inviato da [name][email_hp]<span class="interpunction">, </span>'
posted_by_location = 'Inviato da [name][email_hp]<span class="interpunction">, </span>[location]<span class="interpunction">, </span>'
original_posting_linktitle = 'clicca per andare al posting originale di [name]'
error_headline = 'Errore!'
no_authorisation = 'Non si dispone dell\'autorizzazione necessaria!'
@ -221,6 +221,8 @@ more_smilies_label = 'altro ...'
more_smilies_title = 'altri smilies'
close = 'chiudi'
no_postings_user = 'Nessun messaggio'
search_term = '<!-- TODO -->Search term'
search_category = '<!-- TODO -->Search in category'
search_submit_button = 'Ricerca'
search_fulltext = 'tutto il testo'
search_tags = 'tags'
@ -316,7 +318,7 @@ error_bookmark_word_too_long = '<!-- TODO -->The word "[word]" is too long'
error_bookmark_tags_limit_reached = '<!-- TODO -->Tags limit reached for bookmark'
[entry]
edited_by = 'modificato da [name], [time]'
edited_by = 'modificato da [name]<span class="interpunction">, </span>'
tags_marking = 'Tags:'
one_view = '1 vista'
several_views = '[views] viste'
@ -373,6 +375,8 @@ subject_marking = 'Oggetto:'
message_marking = 'Messaggio:'
tags_marking = 'Tags:'
tags_note = '(opzionali, separati dalla virgola)'
bbcode_help_heading = '<!-- TODO -->Formatting help'
bbcode_help_skip_link = '<!-- TODO -->skip to input'
bbcode_bold_label = 'grosseto'
bbcode_bold_title = 'Impostare il testo in grosseto'
bbcode_bold_instruction = '[b]Esempio[/b]'
@ -703,6 +707,7 @@ register_user_email = 'E-mail:'
register_pw = 'Password:'
register_honeypot_field = '<!-- TODO -->Leave this field empty:'
register_only_by_admin = 'Gli utenti possono essere registrati esclusivamente dall\'amministratore del forum.'
register_link_to_login = '<!-- TODO -->Go to login'
registered = 'L\'account è stato registrato con successo e la sua chiave d\'attivazione è stata spedita a <strong>[var]</strong>. L\'account deve essere attivato entro un giorno.'
registered_send_error = '<!-- TODO -->The account has been registered but the activation key could not been sent (mail server not available). Please contact the forum administrator and ask for manual account activation.'
activation_failed = 'L\'attivazione dell\'account è fallita.'
@ -974,9 +979,18 @@ no_users_in_selection = 'Nessun utente selezionato'
# upload management
upload_administration = '<!-- TODO -->Upload management'
mark_upload_for_removal = '<!-- TODO -->mark for removal'
mark_upload_for_managing = '<!-- TODO -->mark for managing'
no_uploads_found = '<!-- TODO -->Found no uploaded files.'
delete_upload_confirmation = '<!-- TODO -->Are you sure you want to delete this upload?'
delete_uploads_confirmation = '<!-- TODO -->Are you sure you want to delete the following uploads?'
check_for_unrecorded_uploads = '<!-- TODO -->record uploads'
check_for_unrecorded_uploads_desc = '<!-- TODO -->Check whether there are any uploads that are not yet included in the list of uploads. If any are found, they are entered in the list.'
upload_add_db_entry_button = '<!-- TODO -->record to database'
upload_database_entry_alt = '<!-- TODO -->There is a database entry for this image'
upload_database_no_entry_alt = '<!-- TODO -->There is no database entry for this image'
upload_filter_not_managed_images ='<!-- TODO -->not managed images'
upload_filter_managed_images = '<!-- TODO -->managed images'
upload_filter_all_images = '<!-- TODO -->all images'
# spam protection:
captcha = 'CAPTCHA'

View file

@ -28,8 +28,8 @@ locale = nor
locale_charset = utf-8
word_delimiters = ' '
dir = ltr
time_format = dd.MM.YYYY, hh:mm
time_format_full = EEEE d. MMMM YYYY, 'kl.' hh:mm
time_format = 'dd.MM.YYYY, HH:mm'
time_format_full = 'EEEE d. MMMM YYYY, \'kl.\' HH:mm'
forum_time = 'Forumtid: [time]'
forum_time_with_time_zone = 'Forumtid: [time] ([time_zone])'
unknown_user = 'ukjent'
@ -54,8 +54,8 @@ next_page_link = '&raquo;'
previous_page_link = '&laquo;'
next_page_link_title = 'neste side'
previous_page_link_title = 'forrige side'
posted_by = 'av <strong>[name]</strong>[email_hp]<span class="interpunction">, </span>[time]'
posted_by_location = 'av <strong>[name]</strong>[email_hp]<span class="interpunction">, </span>[location]<span class="interpunction">, </span>[time]'
posted_by = 'av [name][email_hp]<span class="interpunction">, </span>'
posted_by_location = 'av [name][email_hp]<span class="interpunction">, </span>[location]<span class="interpunction">, </span>'
original_posting_linktitle = 'klikk for å se den originale meldingen skrevet av [name]'
error_headline = 'Feil!'
no_authorisation = 'Ingen tillatelse!'
@ -218,6 +218,8 @@ more_smilies_label = 'mer …'
more_smilies_title = 'flere smil'
close = 'lukk'
no_postings_user = 'Ingen innlegg.'
search_term = '<!-- TODO -->Search term'
search_category = '<!-- TODO -->Search in category'
search_submit_button = 'Søk'
search_fulltext = 'fulltekst'
search_tags = 'merkelapper'
@ -313,7 +315,7 @@ error_bookmark_word_too_long = 'Ordet "[word]" er for langt'
error_bookmark_tags_limit_reached = 'Tagg-grensen nådd for favoritt'
[entry]
edited_by = 'redigert av [name], [time]'
edited_by = 'redigert av [name]<span class="interpunction">, </span>'
tags_marking = 'Merkelapper:'
one_view = '1 visning'
several_views = '[views] visninger'
@ -370,6 +372,8 @@ subject_marking = 'Emne:'
message_marking = 'Melding:'
tags_marking = 'Merkelapper:'
tags_note = '(valgfritt, separer merkelappene med komma)'
bbcode_help_heading = '<!-- TODO -->Formatting help'
bbcode_help_skip_link = '<!-- TODO -->skip to input'
bbcode_bold_label = 'fet'
bbcode_bold_title = 'Fet tekstformatering'
bbcode_bold_instruction = '[b]Tekst[/b]'
@ -700,6 +704,7 @@ register_user_email = 'E-post:'
register_pw = 'Passord:'
register_honeypot_field = 'La dette feltet være tomt:'
register_only_by_admin = 'Brukere kan bare registreres av forumadministratoren.'
register_link_to_login = '<!-- TODO -->Go to login'
registered = 'Kontoen ble registrert og aktiveringsnøkkelen er sendt til <strong>[var]</strong>. Kontoen må aktiveres innen én dag.'
registered_send_error = 'Kontoen ble registrert, men aktiveringsnøkkelen kunne ikke sendes (e-postserveren var ikke tilgjengelig). Kontakt forumadministratoren for å få kontoen aktivert manuelt.'
activation_failed = 'Aktivering av kontoen mislykted.'
@ -974,9 +979,18 @@ no_users_in_selection = 'Ingen brukere i utvalget'
# upload management
upload_administration = 'Administrer opplastninger'
mark_upload_for_removal = 'marker for fjerning'
mark_upload_for_managing = '<!-- TODO -->mark for managing'
no_uploads_found = 'Fant ingen opplastede filer.'
delete_upload_confirmation = 'Er du sikker på at du vil slette denne opplastingen?'
delete_uploads_confirmation = 'Er du sikker på at du vil slette følgende opplastinger?'
check_for_unrecorded_uploads = '<!-- TODO -->record uploads'
check_for_unrecorded_uploads_desc = '<!-- TODO -->Check whether there are any uploads that are not yet included in the list of uploads. If any are found, they are entered in the list.'
upload_add_db_entry_button = '<!-- TODO -->record to database'
upload_database_entry_alt = '<!-- TODO -->There is a database entry for this image'
upload_database_no_entry_alt = '<!-- TODO -->There is no database entry for this image'
upload_filter_not_managed_images ='<!-- TODO -->not managed images'
upload_filter_managed_images = '<!-- TODO -->managed images'
upload_filter_all_images = '<!-- TODO -->all images'
# spam protection:
captcha = 'CAPTCHA'

View file

@ -40,8 +40,8 @@ locale = rus
locale_charset = utf-8
word_delimiters = ' '
dir = ltr
time_format = YYYY-MM-dd, hh:mm
time_format_full = YYYY-MM-dd, hh:mm
time_format = 'dd.MM.YYYY, H:mm'
time_format_full = 'EEEE, dd MMMM YYYY, H:mm'
forum_time = 'Время форума: [time]'
forum_time_with_time_zone = 'Время форума: [time] ([time_zone])'
unknown_user = 'неизвестный'
@ -66,8 +66,8 @@ next_page_link = '&raquo;'
previous_page_link = '&laquo;'
next_page_link_title = 'следующая страница'
previous_page_link_title = 'предыдущая страница'
posted_by = 'написал <strong>[name]</strong>[email_hp]<span class="interpunction">, </span>[time]'
posted_by_location = 'написал <strong>[name]</strong>[email_hp]<span class="interpunction">, </span>[location]<span class="interpunction">, </span>[time]'
posted_by = 'написал [name][email_hp]<span class="interpunction">, </span>'
posted_by_location = 'написал [name][email_hp]<span class="interpunction">, </span>[location]<span class="interpunction">, </span>'
original_posting_linktitle = 'кликните, чтобы перейти к посту, который написал [name]'
error_headline = 'Ошибочка!'
no_authorisation = 'Не автоирзован!'
@ -230,6 +230,8 @@ more_smilies_label = 'ещё'
more_smilies_title = 'ещё смайлики'
close = 'закрыть'
no_postings_user = 'Нет сообщений.'
search_term = '<!-- TODO -->Search term'
search_category = '<!-- TODO -->Search in category'
search_submit_button = 'Поиск'
search_fulltext = 'весь текст'
#search_fulltext_or = 'весь текст (или)'
@ -326,7 +328,7 @@ error_bookmark_word_too_long = 'Слово "[word]" слишком длинн
error_bookmark_tags_limit_reached = 'Превышен лимит тэгов для закладки'
[entry]
edited_by = 'исправил [name], в [time]'
edited_by = 'исправил [name]<span class="interpunction">, </span>'
tags_marking = 'Тэги:'
one_view = '1 просмотр'
several_views = '[views] просмотров'
@ -383,6 +385,8 @@ subject_marking = 'Тема:'
message_marking = 'Сообщение:'
tags_marking = 'Тэги:'
tags_note = '(не обязательно, разделяются запятыми)'
bbcode_help_heading = '<!-- TODO -->Formatting help'
bbcode_help_skip_link = '<!-- TODO -->skip to input'
bbcode_bold_label = 'жирный'
bbcode_bold_title = 'Выделить текст жирным'
bbcode_bold_instruction = '[b]жирный текст[/b]'
@ -714,6 +718,7 @@ register_user_email = 'E-mail:'
register_pw = 'Пароль:'
register_honeypot_field = 'Оставьте это поле пустым:'
register_only_by_admin = 'Пользователь может быть зарегистрирован только Администратором форума.'
register_link_to_login = '<!-- TODO -->Go to login'
registered = 'Учётная запись была зарегистрирована и ключ активации выслан на <strong>[var]</strong>. Учётная запись должна быть активирована в течение суток.'
registered_send_error = 'Учётная запись была зарегистрирована, но ключ активации не может быть выслан (почтовый сервер недоступен). Пожалуйста, свяжитесь с Администратором форума и попросите его вручную активировать вашу учётную запись.'
activation_failed = 'Не получилось активировать учётную запись.'
@ -986,9 +991,18 @@ no_users_in_selection = 'Пользователи не выбраны'
# upload management
upload_administration = 'Управление загрузкой'
mark_upload_for_removal = 'отметить для удаления'
mark_upload_for_managing = '<!-- TODO -->mark for managing'
no_uploads_found = 'Загруженных файлов не найдено.'
delete_upload_confirmation = 'Вы уверены в том, что хотите удалить эту загрузку?'
delete_uploads_confirmation = 'Вы уверены в том, что хотите удалить следующие загрузки?'
check_for_unrecorded_uploads = '<!-- TODO -->record uploads'
check_for_unrecorded_uploads_desc = '<!-- TODO -->Check whether there are any uploads that are not yet included in the list of uploads. If any are found, they are entered in the list.'
upload_add_db_entry_button = '<!-- TODO -->record to database'
upload_database_entry_alt = '<!-- TODO -->There is a database entry for this image'
upload_database_no_entry_alt = '<!-- TODO -->There is no database entry for this image'
upload_filter_not_managed_images ='<!-- TODO -->not managed images'
upload_filter_managed_images = '<!-- TODO -->managed images'
upload_filter_all_images = '<!-- TODO -->all images'
# защита от спама:
captcha = 'КАПЧА'

View file

@ -32,8 +32,8 @@ locale = sp
locale_charset = utf-8
word_delimiters = ' '
dir = ltr
time_format = dd-MM-YYYY, hh:mm
time_format_full = EEEE, dd 'de' MMMM 'de' YYYY, hh:mm
time_format = 'dd-MM-YYYY, HH:mm'
time_format_full = 'EEEE, dd \'de\' MMMM \'de\' YYYY, hh:mm'
forum_time = 'Hora del foro: [time]'
forum_time_with_time_zone = 'Hora del foro: [time] ([time_zone])'
unknown_user = 'desconocido'
@ -58,8 +58,8 @@ next_page_link = '&raquo;'
previous_page_link = '&laquo;'
next_page_link_title = 'siguiente página'
previous_page_link_title = 'página previa'
posted_by = 'Escrito por <strong>[name]</strong>[email_hp]<span class="interpunction">, </span>[time]'
posted_by_location = 'Escrito por <strong>[name]</strong>[email_hp]<span class="interpunction">, </span>[location]<span class="interpunction">, </span>[time]'
posted_by = 'Escrito por [name][email_hp]<span class="interpunction">, </span>'
posted_by_location = 'Escrito por [name][email_hp]<span class="interpunction">, </span>[location]<span class="interpunction">, </span>'
original_posting_linktitle = 'click para ir al mensaje original escrito por [name]'
error_headline = 'Error!'
no_authorisation = 'No tienes permiso para hacer eso!'
@ -222,6 +222,8 @@ more_smilies_label = 'más …'
more_smilies_title = 'más emoticonos'
close = 'cerrar'
no_postings_user = 'No hay mensajes.'
search_term = '<!-- TODO -->Search term'
search_category = '<!-- TODO -->Search in category'
search_submit_button = 'Búsqueda'
search_fulltext = 'texto completo'
search_tags = 'Etiquetas'
@ -317,7 +319,7 @@ error_bookmark_word_too_long = 'La palabra "[word]" es demasiado larga'
error_bookmark_tags_limit_reached = 'Alcanzado el límite de etiquetas por marcador'
[entry]
edited_by = 'editado por [name], [time]'
edited_by = 'editado por [name]<span class="interpunction">, </span>'
tags_marking = 'Etiquetas:'
one_view = '1 vista'
several_views = '[views] vistas'
@ -374,6 +376,8 @@ subject_marking = 'Asunto:'
message_marking = 'Mensaje:'
tags_marking = 'Etiquetas:'
tags_note = '(opcional, separados por una coma)'
bbcode_help_heading = '<!-- TODO -->Formatting help'
bbcode_help_skip_link = '<!-- TODO -->skip to input'
bbcode_bold_label = 'negrita'
bbcode_bold_title = 'Formato de texto en negrita'
bbcode_bold_instruction = '[b]texto en negrita[/b]'
@ -704,6 +708,7 @@ register_user_email = 'E-mail:'
register_pw = 'Contraseña:'
register_honeypot_field = 'Dejar este campo vacío:'
register_only_by_admin = 'Los usuarios solo pueden ser registrados por el administrador del foro.'
register_link_to_login = '<!-- TODO -->Go to login'
registered = 'La cuenta ha sido registrada y la clave de activación ha sido enviada a <strong>[var]</strong>. La cuenta tiene que ser activada en plazo de un día!!!.'
registered_send_error = 'La cuenta ha sido registrada, pero la clave de activación no se ha enviado (el servidor de correos no está disponible). Ponte en contacto con el administrador del foro y solicita la activación de la cuenta manualmente.'
activation_failed = 'La activación de la cuenta ha fallado'
@ -975,9 +980,18 @@ no_users_in_selection = 'No hay usuarios en la selección'
# upload management
upload_administration = 'Gestionar las subidas'
mark_upload_for_removal = 'marcar para eliminación'
mark_upload_for_managing = '<!-- TODO -->mark for managing'
no_uploads_found = 'No se han encontrado archivos subidos.'
delete_upload_confirmation = '¿Estas seguro que quieres eliminar esta subida?'
delete_uploads_confirmation = '¿Estás seguro que quieres eliminar las siguientes subidas?'
check_for_unrecorded_uploads = '<!-- TODO -->record uploads'
check_for_unrecorded_uploads_desc = '<!-- TODO -->Check whether there are any uploads that are not yet included in the list of uploads. If any are found, they are entered in the list.'
upload_add_db_entry_button = '<!-- TODO -->record to database'
upload_database_entry_alt = '<!-- TODO -->There is a database entry for this image'
upload_database_no_entry_alt = '<!-- TODO -->There is no database entry for this image'
upload_filter_not_managed_images ='<!-- TODO -->not managed images'
upload_filter_managed_images = '<!-- TODO -->managed images'
upload_filter_all_images = '<!-- TODO -->all images'
# spam protection:
captcha = 'CAPTCHA'

View file

@ -31,8 +31,8 @@ locale = sv
locale_charset = utf-8
word_delimiters = ' '
dir = ltr
time_format = YYYY-MM-dd, hh:mm
time_format_full = EEEE, MMMM dd, YYYY, hh:mm
time_format = 'YYYY-MM-dd, HH.mm'
time_format_full = 'EEEE, dd MMMM YYYY, HH.mm'
forum_time = 'Forum tid: [time]'
forum_time_with_time_zone = 'Forum tidszon: [time] ([time_zone])'
unknown_user = 'Okänd'
@ -57,8 +57,8 @@ next_page_link = 'Nästa sida &raquo;'
previous_page_link = '&laquo; Föregående sida'
next_page_link_title = 'Nästa sida'
previous_page_link_title = 'Föregående sida'
posted_by = 'av <strong>[name]</strong>[email_hp]<span class="interpunction">, </span>[time]'
posted_by_location = 'av <strong>[name]</strong>[email_hp]<span class="interpunction">, </span>[location]<span class="interpunction">, </span>[time]'
posted_by = 'av [name][email_hp]<span class="interpunction">, </span>'
posted_by_location = 'av [name][email_hp]<span class="interpunction">, </span>[location]<span class="interpunction">, </span>'
original_posting_linktitle = 'Klicka för att komma till ursprungsinlägget av: [name]'
error_headline = 'Fel!'
no_authorisation = 'Ej behörig!'
@ -221,6 +221,8 @@ more_smilies_label = 'Fler …'
more_smilies_title = 'Fler smajlisar'
close = 'Stäng'
no_postings_user = 'Inga inlägg.'
search_term = '<!-- TODO -->Search term'
search_category = '<!-- TODO -->Search in category'
search_submit_button = 'Sök'
search_fulltext = 'Fulltext'
search_tags = 'Sökord'
@ -316,7 +318,7 @@ error_bookmark_word_too_long = 'Ordet "[word]" för för långt'
error_bookmark_tags_limit_reached = 'Övre gränsen för antal taggar har nåtts för bokmärke'
[entry]
edited_by = 'Redigerad av [name], [time]'
edited_by = 'Redigerad av [name]<span class="interpunction">, </span>'
tags_marking = 'Sökord:'
one_view = '1 visning'
several_views = '[views] visningar'
@ -373,6 +375,8 @@ subject_marking = 'Ämne:'
message_marking = 'Inlägg:'
tags_marking = 'Sökord:'
tags_note = '(valfritt, separera med kommatecken)'
bbcode_help_heading = '<!-- TODO -->Formatting help'
bbcode_help_skip_link = '<!-- TODO -->skip to input'
bbcode_bold_label = 'Fet'
bbcode_bold_title = 'Fetstil'
bbcode_bold_instruction = '[b]Text[/b]'
@ -703,6 +707,7 @@ register_user_email = 'E-post:'
register_pw = 'Lösenord:'
register_honeypot_field = 'Lämna detta fältet tomt:'
register_only_by_admin = 'Nya användare kan bara registreras av forumets administratörer.'
register_link_to_login = '<!-- TODO -->Go to login'
registered = 'Kontot har blivit registrerat och en aktiveringsnyckel har blivit skickad till <strong>[var]</strong>. Kontot måste aktiveras inom ett dygn.'
registered_send_error = 'Kontot har blivit registrerat men aktiveringsnyckeln kunde inte skickas (mail server är inte tillgänglig). Vänligen kontakta forumets administratör och be om manuell aktivering av kontot.'
activation_failed = 'Aktivering av kontot misslyckades.'
@ -974,9 +979,18 @@ no_users_in_selection = 'Inga användare finns i detta urval'
# upload management
upload_administration = 'Hantering av uppladdade filer'
mark_upload_for_removal = 'Märk för borttagning'
mark_upload_for_managing = '<!-- TODO -->mark for managing'
no_uploads_found = 'Hittade inga uppladdade filer.'
delete_upload_confirmation = 'Är du säker på att du vill radera den här uppladdade filen?'
delete_uploads_confirmation = 'Är du säker på att du vill radera de följande uppladdade filerna?'
check_for_unrecorded_uploads = '<!-- TODO -->record uploads'
check_for_unrecorded_uploads_desc = '<!-- TODO -->Check whether there are any uploads that are not yet included in the list of uploads. If any are found, they are entered in the list.'
upload_add_db_entry_button = '<!-- TODO -->record to database'
upload_database_entry_alt = '<!-- TODO -->There is a database entry for this image'
upload_database_no_entry_alt = '<!-- TODO -->There is no database entry for this image'
upload_filter_not_managed_images ='<!-- TODO -->not managed images'
upload_filter_managed_images = '<!-- TODO -->managed images'
upload_filter_all_images = '<!-- TODO -->all images'
# spam protection:
captcha = 'CAPTCHA'

View file

@ -27,8 +27,8 @@ locale = ta
locale_charset = utf-8
word_delimiters = ' '
dir = ltr
time_format = YYYY-MM-dd, hh:mm
time_format_full = EEEE, MMMM dd, YYYY, hh:mm
time_format = 'YYYY-MM-dd, hh:mm a'
time_format_full = 'EEEE, MMMM dd, YYYY, hh:mm a'
forum_time = 'கருத்தரங்கின் நேரம்: [time]'
forum_time_with_time_zone = 'கருத்தரங்கின் நேரம்: [time] ([time_zone])'
unknown_user = 'தெரியாதவர்'
@ -53,8 +53,8 @@ next_page_link = '&raquo;'
previous_page_link = '&laquo;'
next_page_link_title = 'அடுத்த பக்கம்'
previous_page_link_title = 'முந்தய பக்கம்'
posted_by = 'இப்படிக்கு <strong>[name]</strong>[email_hp]<span class="interpunction">,</span> [time]'
posted_by_location = 'இப்படிக்கு <strong>[name]</strong>[email_hp]<span class="interpunction">, </span>[location]<span class="interpunction">, </span>[time]'
posted_by = 'இப்படிக்கு [name][email_hp]<span class="interpunction">, </span>'
posted_by_location = 'இப்படிக்கு [name][email_hp]<span class="interpunction">, </span>[location]<span class="interpunction">, </span>'
original_posting_linktitle = '[name]னுடைய அசல் தகவலுக்கு செல்ல'
error_headline = 'தவரு!'
no_authorisation = 'அங்கிகாரம் இல்லை!'
@ -217,6 +217,8 @@ more_smilies_label = 'மேலும்...'
more_smilies_title = 'மேலும் சிரிப்பு முகங்கள்'
close = 'மூடு'
no_postings_user = 'போஸ்டிங்ஸ் இல்லை.'
search_term = '<!-- TODO -->Search term'
search_category = '<!-- TODO -->Search in category'
search_submit_button = 'தேடு'
search_fulltext = 'முழு உரை'
search_tags = 'அடையாள முத்திரை'
@ -312,7 +314,7 @@ error_bookmark_word_too_long = '<!-- TODO -->The word "[word]" is too long'
error_bookmark_tags_limit_reached = '<!-- TODO -->Tags limit reached for bookmark'
[entry]
edited_by = 'புதுப்பித்தவர் [name], [time]'
edited_by = 'புதுப்பித்தவர் [name]<span class="interpunction">, </span>'
tags_marking = 'அடையாள முத்திரை:'
one_view = '1 காட்ச்சி'
several_views = '[views] காட்ச்சிகள்'
@ -369,6 +371,8 @@ subject_marking = 'பாடம்:'
message_marking = 'தகவல்:'
tags_marking = 'அடையாள முத்திரை:'
tags_note = '(விரும்பினால், "," வைத்து பிரிக்கவும்)'
bbcode_help_heading = '<!-- TODO -->Formatting help'
bbcode_help_skip_link = '<!-- TODO -->skip to input'
bbcode_bold_label = 'தடிப்பமாக'
bbcode_bold_title = 'தடிப்பமான உரை நடை'
bbcode_bold_instruction = '[b]உரை[/b]'
@ -699,6 +703,7 @@ register_user_email = 'மின்-அசல்:'
register_pw = 'மறைவு சொல்:'
register_honeypot_field = '<!-- TODO -->Leave this field empty:'
register_only_by_admin = 'பொது மன்ற நிர்வாகியின் மூலமே பயன் படுத்துபவர் சேர முடியும்.'
register_link_to_login = '<!-- TODO -->Go to login'
registered = 'உங்கள் கணக்கு உருவாக்கப்பட்டுவிட்டது மறறும் அதற்கான செயல்படுத்தும் சாவி இணைப்பை உங்கள் <strong>[var]</strong> அநுப்பப்பட்டுவிட்டது. மேலும் உங்கள் பொது மன்ற கணக்கு ஒரு நாளுக்குள் செயல்பாட்டிற்கு கொண்டுவரப்படவேண்டும்.'
registered_send_error = 'உங்கள் கணக்கு உருவாக்கப்பட்டுவிட்டது மறறும் அதற்கான செயல்படுத்தும் சாவி இணைப்பை உங்களுக்கு அநுப்பப்பமுடியவில்லை (அஞ்சல் சேவை மைய்யம் இயங்கவில்லை). கணக்கை செயல்பாட்டிற்கு கொண்டுவரப்படவேண்டுமானால் தயவு செய்து பொது மன்ற நிர்வாகியை அநுகவும்.'
activation_failed = 'கணக்கை செயல்பாட்டிற்கு கொண்டுவர முடியவில்லை.'
@ -970,9 +975,18 @@ no_users_in_selection = 'தெரிவு செய்யப்ப
# upload management
upload_administration = '<!-- TODO -->Upload management'
mark_upload_for_removal = '<!-- TODO -->mark for removal'
mark_upload_for_managing = '<!-- TODO -->mark for managing'
no_uploads_found = '<!-- TODO -->Found no uploaded files.'
delete_upload_confirmation = '<!-- TODO -->Are you sure you want to delete this upload?'
delete_uploads_confirmation = '<!-- TODO -->Are you sure you want to delete the following uploads?'
check_for_unrecorded_uploads = '<!-- TODO -->record uploads'
check_for_unrecorded_uploads_desc = '<!-- TODO -->Check whether there are any uploads that are not yet included in the list of uploads. If any are found, they are entered in the list.'
upload_add_db_entry_button = '<!-- TODO -->record to database'
upload_database_entry_alt = '<!-- TODO -->There is a database entry for this image'
upload_database_no_entry_alt = '<!-- TODO -->There is no database entry for this image'
upload_filter_not_managed_images ='<!-- TODO -->not managed images'
upload_filter_managed_images = '<!-- TODO -->managed images'
upload_filter_all_images = '<!-- TODO -->all images'
# spam protection:
captcha = 'CAPTCHA'

View file

@ -31,8 +31,8 @@ charset = utf-8
locale_charset = utf-8
word_delimiters = ' '
dir = ltr
time_format = dd-MM-YYYY, hh:mm
time_format_full = EEEE, MMMM dd, YYYY, hh:mm
time_format = 'dd.MM.YYYY, HH:mm'
time_format_full = 'dd MMMM YYYY, HH:mm'
forum_time = 'Forum zamanı: [time]'
forum_time_with_time_zone = 'Forum zamanı: [time] ([time_zone])'
unknown_user = 'bilinmeyen'
@ -57,8 +57,8 @@ next_page_link = 'Sonraki sayfa &raquo;'
previous_page_link = '&laquo; Önceki sayfa'
next_page_link_title = 'sonraki sayfa'
previous_page_link_title = 'önceki sayfa'
posted_by = 'gönderen: <strong>[name]</strong>[email_hp]<span class="interpunction">, </span>[time]'
posted_by_location = 'gönderen: <strong>[name]</strong>[email_hp]<span class="interpunction">, </span>[location]<span class="interpunction">, </span>[time]'
posted_by = 'gönderen: [name][email_hp]<span class="interpunction">, </span>'
posted_by_location = 'gönderen: [name][email_hp]<span class="interpunction">, </span>[location]<span class="interpunction">, </span>'
original_posting_linktitle = 'asıl [name] orijinal izlenime geçmek için tıklayınız'
error_headline = 'Hata!'
no_authorisation = 'Yetki yok!'
@ -221,6 +221,8 @@ more_smilies_label = 'daha...'
more_smilies_title = 'daha fazla simgeler'
close = 'kapat'
no_postings_user = 'Gönderim yok.'
search_term = '<!-- TODO -->Search term'
search_category = '<!-- TODO -->Search in category'
search_submit_button = 'Ara'
search_fulltext = 'tüm metin'
search_tags = 'konular'
@ -316,7 +318,7 @@ error_bookmark_word_too_long = '<!-- TODO -->The word "[word]" is too long'
error_bookmark_tags_limit_reached = '<!-- TODO -->Tags limit reached for bookmark'
[entry]
edited_by = '[name] tarafından, [time] tarihinde düzenlendi'
edited_by = '[name] tarafından<span class="interpunction">, </span>'
tags_marking = 'Konular:'
one_view = '1 kez okundu'
several_views = '[views] kez okundu'
@ -373,6 +375,8 @@ subject_marking = 'Konu:'
message_marking = 'Mesaj:'
tags_marking = 'Konular:'
tags_note = '(opsiyonel, virgül ile ayrılmış biçimde)'
bbcode_help_heading = '<!-- TODO -->Formatting help'
bbcode_help_skip_link = '<!-- TODO -->skip to input'
bbcode_bold_label = 'koyu'
bbcode_bold_title = 'Metni koyu biçimlendir'
bbcode_bold_instruction = '[b]bold text[/b]'
@ -703,6 +707,7 @@ register_user_email = 'E-posta:'
register_pw = 'Şifre:'
register_honeypot_field = '<!-- TODO -->Leave this field empty:'
register_only_by_admin = 'Kullanıcılar sadece forum yöneticileri tarafından kayıt edilebilir.'
register_link_to_login = '<!-- TODO -->Go to login'
registered = 'Hesabınız kaydedildi ve <strong>[var]</strong> adresine aktivasyon iletisi gönderildi. Lütfen hesabınızı en geç bir gün içinde aktif ediniz.'
registered_send_error = 'Hesabınız kaydedildi fakat aktivasyon anahtarı gönderilemedi. (mail sunucusu mevcut değil). Lütfen forum yöneticisiyle irtibata geçip hesabınızı manüel olarak aktif ettiriniz.'
activation_failed = 'Hesabın aktivasyonu başarısız.'
@ -974,9 +979,18 @@ no_users_in_selection = 'Belirli bir kullanıcı yok'
# upload management
upload_administration = '<!-- TODO -->Upload management'
mark_upload_for_removal = '<!-- TODO -->mark for removal'
mark_upload_for_managing = '<!-- TODO -->mark for managing'
no_uploads_found = '<!-- TODO -->Found no uploaded files.'
delete_upload_confirmation = '<!-- TODO -->Are you sure you want to delete this upload?'
delete_uploads_confirmation = '<!-- TODO -->Are you sure you want to delete the following uploads?'
check_for_unrecorded_uploads = '<!-- TODO -->record uploads'
check_for_unrecorded_uploads_desc = '<!-- TODO -->Check whether there are any uploads that are not yet included in the list of uploads. If any are found, they are entered in the list.'
upload_add_db_entry_button = '<!-- TODO -->record to database'
upload_database_entry_alt = '<!-- TODO -->There is a database entry for this image'
upload_database_no_entry_alt = '<!-- TODO -->There is no database entry for this image'
upload_filter_not_managed_images ='<!-- TODO -->not managed images'
upload_filter_managed_images = '<!-- TODO -->managed images'
upload_filter_all_images = '<!-- TODO -->all images'
# spam protection:
captcha = 'CAPTCHA'

View file

@ -1,87 +1,266 @@
{config_load file=$language_file section="general"}{config_load file=$language_file section="avatar"}<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="{#language#}">
<head>
<title>{$settings.forum_name}{if $page_title} - {$page_title}{elseif $subnav_location} - {$subnav_location}{/if}</title>
<meta http-equiv="content-type" content="text/html; charset={#charset#}" />
<meta http-equiv="cache-control" content="no-cache">
{config_load file=$language_file section="general"}{config_load file=$language_file section="avatar"}<!DOCTYPE html>
<html lang="{#language#}">
<head>
<meta charset="{#charset#}" />
<title>{$settings.forum_name}{if $page_title} - {$page_title}{elseif $subnav_location} - {$subnav_location}{/if}</title>
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
<meta http-equiv="cache-control" content="no-cache">
<style type="text/css">
{literal}
<style type="text/css">
<!--
body { color: #000000; background: #ffffff; margin: 20px; padding: 0px; font-family: verdana, arial, sans-serif; font-size: 13px; }
h1 { font-family: verdana, arial, sans-serif; font-size: 18px; font-weight: bold; }
p { font-family: verdana, arial, sans-serif; font-size: 13px; line-height: 19px; }
.caution { padding: 0px 0px 0px 20px; color: red; font-weight: bold; background-image:url({/literal}{$THEMES_DIR}/{$settings.theme}{literal}/images/caution.png); background-repeat:no-repeat; background-position: left; }
.ok { padding: 0px 0px 0px 20px; font-weight:bold; color:red; background-image:url({/literal}{$THEMES_DIR}/{$settings.theme}{literal}/images/tick.png); background-repeat:no-repeat; background-position: left; }
img.uploaded { border: 1px solid #000; cursor:pointer; }
.small { font-size:11px; line-height:16px; }
.delete a { text-decoration:none !important; }
.delete a:hover span { text-decoration:underline; }
.delete a img { border:none; margin:0px 5px -3px 0px; padding:0px; }
a:link { color: #0000cc; text-decoration: none; }
a:visited { color: #0000cc; text-decoration: none; }
a:hover { color: #0000ff; text-decoration: underline; }
a:active { color: #ff0000; text-decoration: none; }
-->
</style>
<script type="text/javascript">/* <![CDATA[ */
function setPictureToProfil(src) {
if (opener && opener.document.getElementById("avatar_wrapper")) {
var avatarWrapper = opener.document.getElementById("avatar_wrapper")
if (src) {
var img = new Image();
img.src = src;
avatarWrapper.innerHTML = '';
avatarWrapper.appendChild(img);
}
else {
avatarWrapper.innerHTML = '';
}
}
*,
::before,
::after {
box-sizing: border-box;
}
body {
color: #000;
background: #fff;
margin: 0;
padding: 0;
font-family: verdana, arial, sans-serif;
font-size: 1em;
font-size: 1rem;
line-height: 1.5;
}
body > * {
padding-block: 0;
padding-inline: 0.5em;
}
header {
margin: 0;
background: #f9f9f9;
border-bottom: 1px solid #bacbdf;
display: flex;
justify-content: space-between;
position: sticky;
top: 0;
left: 0;
width: 100%;
}
header > * {
margin:0;
padding:0;
}
main {
margin-inline: 0;
margin-block: 0.5em;
}
h1 {
font-size: 1em;
font-weight: bold;
}
.caution,
.ok {
margin-block: 0.5em;
padding: 0 0 0 24px;
background-repeat:no-repeat;
background-position: 2px 3px;
}
.caution h2,
.ok h2 {
font-size: 1em;
margin: 0 0 0.5em 0;
}
.caution {
color: #cc0000;
font-weight: bold;
background-image:url({/literal}{$THEMES_DIR}/{$settings.theme}{literal}/images/caution.png);
}
.ok {
font-weight:bold;
color:green;
background-image:url({/literal}{$THEMES_DIR}/{$settings.theme}{literal}/images/tick.png);
}
img.uploaded {
border: 1px solid #000;
cursor:pointer;
}
.instruction,
.small {
font-size: 0.82em;
}
.instruction,
p.small {
margin-block:0.5em;
}
a {
color: #00c;
text-decoration: none;
}
a:focus,
a:hover {
color:#00f;
text-decoration: underline dotted 9% #45f;
}
a:active {
color:#f00;
text-decoration: underline solid 7% #d00;
}
form > div:not(:last-child) {
margin-block-end: .75em;
}
ul {
list-style:none;
margin-block:0.5em;
padding: 0;
}
#imgtab {
display:flex;
flex-direction:column;
gap:0.75em;
min-width: 20em;
max-width: 40em;
margin-inline: auto;
}
#del-upload-form {
text-align:center;
}
#imgtab li {
display: flex;
flex-direction: column;
gap: 0.5em;
align-items: center;
width: 100%;
}
li > *:last-child {
align-content:center;
}
img {
border:none;
display: block;
}
#imgtab img {
max-width: 100%;
margin-inline: auto;
}
#imgtab:not(.shrinked) img {
cursor: pointer;
}
#imgtab.shrinked img {
max-width: 50%;
height: auto;
}
.buttonbar {
display: flex;
flex-wrap: wrap;
gap: 0.3em;
}
button {
cursor: pointer;
}
#imgtab li button:has(> img) {
background: transparent;
border: none;
padding: 0;
}
.invisible {
visibility: hidden;
}
{/literal}
</style>
<script>{literal}
function setPictureToProfile(src) {
if (opener && opener.document.getElementById("avatar_wrapper")) {
const avatarWrapper = opener.document.getElementById("avatar_wrapper")
if (src) {
const img = new Image();
img.src = src;
avatarWrapper.innerHTML = '';
avatarWrapper.appendChild(img);
} else {
avatarWrapper.innerHTML = '';
}
}
};
{/literal}
{if $avatar_uploaded}
setPictureToProfil('{$avatar}');
setPictureToProfile('{$avatar}');
{elseif $avatar_deleted}
setPictureToProfil('');
setPictureToProfile('');
{/if}
{literal}
/* ]]> */</script>
{/literal}
</head>
<body>
window.addEventListener('DOMContentLoaded', function() {
if (document.querySelector('button[name="close-form"]')) {
document.querySelector('button[name="close-form"]').addEventListener('click', function() {
window.close();
});
}
if (document.querySelector('button[name="upload_img"]')) {
document.querySelector('button[name="upload_img"]').addEventListener('click', function() {
const close_btn = document.querySelector('button[name="close-form"]');
const throbber = document.getElementById('throbber-submit');
close_btn.addAttribute('hidden');
if (throbber.classList.contains('invisible')) {
throbber.classList.remove('invisible');
}
});
}
});
</script>
</head>
<body>
{if $avatar}
<h1>{#avatar_hl#}</h1>
<header>
<h1>{#avatar_hl#}</h1>
</header>
<main>
{if $avatar_uploaded}
<p class="ok">{#upload_successful#}</p>
<div class="ok">
<h2>{#upload_successful#}</h2>
</div>
{/if}
<p><img src="{$avatar}" alt="" /></p>
{if $image_downsized}<p class="small">{$smarty.config.image_downsized|replace:"[width]":$new_width|replace:"[height]":$new_height|replace:"[filesize]":$new_filesize}</p>{/if}
<ul id="imgtab" class="shrinked">
<li><img src="{$avatar}" alt="" /></li>
</ul>
{if $image_downsized} <p class="small">{$smarty.config.image_downsized|replace:"[width]":$new_width|replace:"[height]":$new_height|replace:"[filesize]":$new_filesize}</p>{/if}
<form id="del-upload-form" action="index.php" method="post" accept-charset="{#charset#}">
<input type="hidden" name="mode" value="avatar" />
{if $avatar_uploaded}
<script type="text/javascript">/* <![CDATA[ */ document.write('<p><button onclick=\"window.close()\">{#close_window#}</button><\/p>'); /* ]]> */</script>
<div>
<button type="button" name="close-form">{#close_window#}</button>
</div>
{else}
<p class="delete"><a href="index.php?mode=avatar&amp;delete=true"><img src="{$THEMES_DIR}/{$settings.theme}/images/delete.png" alt="" width="16" height="16" /><span>{#delete_avatar#}</span></a></p>
<div>
<button name="delete" value="{#delete_avatar#}">{#delete_avatar#}</button>
<button type="button" name="close-form">{#close_window#}</button>
</div>
{/if}
</form>
</main>
{elseif $upload}
<h1>{#upload_avatar_hl#}</h1>
<p>{#upload_avatar_notes#|replace:"[width]":$settings.avatar_max_width|replace:"[height]":$settings.avatar_max_width|replace:"[filesize]":$settings.avatar_max_filesize}</p>
<header>
<h1>{#upload_avatar_hl#}</h1>
</header>
<main>
<p class="instruction">{#upload_avatar_notes#|replace:"[width]":$settings.avatar_max_width|replace:"[height]":$settings.avatar_max_width|replace:"[filesize]":$settings.avatar_max_filesize}</p>
{if $errors}
<p class="caution">{#error_headline#}</p>
<ul>
<div class="caution">
<h2>{#error_headline#}</h2>
<ul>
{section name=mysec loop=$errors}
<li>{assign var="error" value=$errors[mysec]}{$smarty.config.$error|replace:"[width]":$width|replace:"[height]":$height|replace:"[filesize]":$filesize|replace:"[max_width]":$max_width|replace:"[max_height]":$max_height|replace:"[max_filesize]":$max_filesize|replace:"[server_max_filesize]":$server_max_filesize}</li>
<li>{assign var="error" value=$errors[mysec]}{$smarty.config.$error|replace:"[width]":$width|replace:"[height]":$height|replace:"[filesize]":$filesize|replace:"[max_width]":$max_width|replace:"[max_height]":$max_height|replace:"[max_filesize]":$max_filesize|replace:"[server_max_filesize]":$server_max_filesize}</li>
{/section}
</ul>
</ul>
</div>
{/if}
<form id="uploadform" action="index.php" method="post" enctype="multipart/form-data" accept-charset="{#charset#}">
<div>
<input type="hidden" name="mode" value="avatar" />
<p><input type="file" name="probe" size="17" /></p>
<p><input type="submit" name="" value="{#upload_image_button#}" onclick="document.getElementById('throbber-submit').style.visibility='visible'" /> <img id="throbber-submit" style="visibility:hidden;" src="{$THEMES_DIR}/{$settings.template}/images/throbber_submit.gif" alt="" width="16" height="16" /></p>
</div>
</form>
<form id="uploadform" action="index.php" method="post" enctype="multipart/form-data" accept-charset="{#charset#}">
<input type="hidden" name="mode" value="avatar" />
<div>
<input type="file" name="probe" size="17" />
</div>
<div class="buttonbar">
<button name="upload_img" value="{#upload_image_button#}">{#upload_image_button#}</button>
<button type="button" name="close-form">{#close_window#}</button>
<img id="throbber-submit" class="invisible" src="{$THEMES_DIR}/{$theme}/images/throbber_submit.gif" alt="" width="16" height="16" />
</div>
</form>
</main>
{else}
<p class="caution">{#avatars_disabled#}</p>
<main>
<div class="caution">
<h2>{#avatars_disabled#}</h2>
</div>
</main>
{/if}
</body>
</html>

View file

@ -0,0 +1,47 @@
<?xml version="1.0" standalone="yes"?>
<svg xmlns="http://www.w3.org/2000/svg" xmlns:xhtml="http://www.w3.org/1999/xhtml" width="264" height="264" viewBox="0 0 264 264">
<defs>
<linearGradient id="cyl" x1="0%" y1="0%" x2="100%" y2="0%">
<stop offset="0%" stop-color="#7f99b9" />
<stop offset="46%" stop-color="#a2bfdf" />
<stop offset="66%" stop-color="#bae8fa" />
<stop offset="86%" stop-color="#a4c6ed" />
<stop offset="100%" stop-color="#98bcde" />
</linearGradient>
</defs>
<style type="text/css">
<![CDATA[
#contour { fill: none; stroke-width: 5; stroke: #7894b2; }
#frontcontour { fill: none; stroke-width: 3.5; stroke: #9abfe4; stroke-linecap: round; }
#front { fill: url(#cyl); stroke: none; }
#cross { stroke-width: 38; stroke: #f80800; stroke-linecap: round; }
.gradient {
width: 100%;
height: 100%;
background: repeating-conic-gradient(
from -90deg,
#8f9fbc 0deg,
#a2bfdf 25.2deg,
#bae8fa 60deg,
#a4c6ed 94.8deg,
#8f9fbc 180deg
);
}
]]>
</style>
<symbol id="disc">
<clipPath id="top">
<path d="M 28 108 A 104 48 180 0 1 236 108 A 104 48 180 0 1 28 108 z" />
</clipPath>
<foreignObject x="0" y="60" width="264" height="100" clip-path="url(#top)">
<xhtml:div class="gradient" />
</foreignObject>
<path id="front" d="M 28 108 A 104 48 180 0 0 236 108 l 0 40 A 104 48 180 0 1 28 148 z" />
<path id="frontcontour" d="M 28 108 A 104 48 180 0 0 236 108" />
<path id="contour" d="M 28 108 A 104 48 180 0 1 236 108 l 0 40 A 104 48 180 0 1 28 148 z" />
</symbol>
<use href="#disc" x="0" y="63" />
<use href="#disc" x="0" y="3" />
<use href="#disc" x="0" y="-57" />
<path id="cross" d="M 32 32, 232 232 M 232 32, 32 232" />
</svg>

After

Width:  |  Height:  |  Size: 1.7 KiB

View file

@ -0,0 +1,45 @@
<?xml version="1.0" standalone="yes"?>
<svg xmlns="http://www.w3.org/2000/svg" xmlns:xhtml="http://www.w3.org/1999/xhtml" width="264" height="264" viewBox="0 0 264 264">
<defs>
<linearGradient id="cyl" x1="0%" y1="0%" x2="100%" y2="0%">
<stop offset="0%" stop-color="#7f99b9" />
<stop offset="46%" stop-color="#a2bfdf" />
<stop offset="66%" stop-color="#bae8fa" />
<stop offset="86%" stop-color="#a4c6ed" />
<stop offset="100%" stop-color="#98bcde" />
</linearGradient>
</defs>
<style type="text/css">
<![CDATA[
.contour { fill: none; stroke-width: 5; stroke: #7894b2; }
.frontcontour { fill: none; stroke-width: 3.5; stroke: #9abfe4; stroke-linecap: round; }
.front { fill: url(#cyl); stroke: none; }
.gradient {
width: 100%;
height: 100%;
background: repeating-conic-gradient(
from -90deg,
#8f9fbc 0deg,
#a2bfdf 25.2deg,
#bae8fa 60deg,
#a4c6ed 94.8deg,
#8f9fbc 180deg
);
}
]]>
</style>
<symbol id="disc">
<clipPath id="top">
<path d="M 28 108 A 104 48 180 0 1 236 108 A 104 48 180 0 1 28 108 z" />
</clipPath>
<foreignObject x="0" y="60" width="264" height="100" clip-path="url(#top)">
<xhtml:div class="gradient" />
</foreignObject>
<path class="front" d="M 28 108 A 104 48 180 0 0 236 108 l 0 40 A 104 48 180 0 1 28 148 z" />
<path class="frontcontour" d="M 28 108 A 104 48 180 0 0 236 108" />
<path class="contour" d="M 28 108 A 104 48 180 0 1 236 108 l 0 40 A 104 48 180 0 1 28 148 z" />
</symbol>
<use href="#disc" x="0" y="63" />
<use href="#disc" x="0" y="3" />
<use href="#disc" x="0" y="-57" />
</svg>

After

Width:  |  Height:  |  Size: 1.6 KiB

View file

@ -0,0 +1,11 @@
<?xml version="1.0" standalone="yes"?>
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 128 128">
<style type="text/css">
<![CDATA[
svg { background: transparent; }
path { fill: #a8afbb; stroke-width: 10; stroke: #a8afbb; stroke-linejoin: round; }
]]>
</style>
<path d="M 64,118 8,42 120,42 z" />
</svg>

After

Width:  |  Height:  |  Size: 320 B

View file

@ -0,0 +1,11 @@
<?xml version="1.0" standalone="yes"?>
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 128 128">
<style type="text/css">
<![CDATA[
svg { background: transparent; }
path { fill: #a8afbb; stroke-width: 10; stroke: #a8afbb; stroke-linejoin: round; }
]]>
</style>
<path d="M10,64 86,120 86,8 z" />
</svg>

After

Width:  |  Height:  |  Size: 318 B

View file

@ -0,0 +1,11 @@
<?xml version="1.0" standalone="yes"?>
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 128 128">
<style type="text/css">
<![CDATA[
svg { background: transparent; }
path { fill: #a8afbb; stroke-width: 10; stroke: #a8afbb; stroke-linejoin: round; }
]]>
</style>
<path d="M118,64 42,120 42,8 z" />
</svg>

After

Width:  |  Height:  |  Size: 319 B

View file

@ -0,0 +1,11 @@
<?xml version="1.0" standalone="yes"?>
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 128 128">
<style type="text/css">
<![CDATA[
svg { background: transparent; }
path { fill: #a8afbb; stroke-width: 10; stroke: #a8afbb; stroke-linejoin: round; }
]]>
</style>
<path d="M 64,10 120,86 8,86 z" />
</svg>

After

Width:  |  Height:  |  Size: 319 B

File diff suppressed because it is too large Load diff

View file

@ -77,7 +77,7 @@ html[dir="rtl"] a.rss{background-position-x:calc(100% + 4px)}
p.right a.rss{padding-inline-start:15px}
input.small,select.small{font-family:verdana,arial,sans-serif;font-size:.82em}
#content{margin:0;padding:1em;padding:1rem;line-height:1.5;background:#fff;flex:1;overflow:auto}
#content p,#content ul,#content td{font-size:.82em;max-width:60em}
#content p,#content ul,#content td,#postingform{font-size:.82em;max-width:60em}
#content li,#content ul ul{font-size:1em}
#content .xsmall{font-size:.69em;line-height:1.19em;color:gray;font-weight:400}
#content .small{font-size:.69em;line-height:1.19em;font-weight:400}
@ -95,15 +95,16 @@ html[dir="ltr"] #footermenu a.go-to-top-link{background:url(images/arrow_up.png)
html[dir="rtl"] #footermenu a.go-to-top-link{background:url(images/arrow_up.png) no-repeat 100% 0 / auto 90%}
#pbmlf{text-align:center;font-size:.69em;color:gray;grid-area:projectlink}
#pbmlf a{color:gray;text-decoration:none}
#main-grid{display:grid;grid-template-columns:1fr;grid-template-rows:auto auto;gap:.75em;grid-template-areas:"sidebar" "threadlist"}
#main-grid{display:grid;grid-template-columns:calc(100vw - 2em);grid-template-rows:auto auto;gap:.75em;grid-template-areas:"sidebar" "threadlist"}
#threadlist{grid-area:threadlist;}
#sidebar{grid-area:sidebar;position:relative;margin:0;padding:0}
#sidebar div{position:relative;z-index:2}
#sidebarcontent div:not(:last-child){margin: 0 0 .75em 0}
h2.sidebar{font-size:.82em;line-height:1.7em;font-weight:700;margin-block:0 .75em;margin-inline:0;padding-block:0;padding-inline:.375em 17px;background:#d2ddea;background:linear-gradient(to bottom, rgb(210, 222, 236) 0, rgb(237, 242, 245) 100%);border:1px solid #bacbdf;z-index:1}
h2.sidebar a{color:#000;text-decoration:none;z-index:2}
h2.sidebar{font-size:.82em;line-height:1.7;font-weight:bold;margin-block:0 .75em;margin-inline:0;padding:0;background:#d2ddea;background:linear-gradient(to bottom, rgb(210, 222, 236) 0, rgb(237, 242, 245) 100%);border:1px solid #bacbdf;z-index:1}
h2.sidebar a{display:block;color:#000;padding-inline:1.625em .375em;background:url("images/triangle-top.svg") 0.375em calc(50% + .075em)/0.9em 0.9em no-repeat;text-decoration:none}
.js-display-fold h2.sidebar a{background:url("images/triangle-bottom.svg") 0.375em calc(50% - .075em)/0.9em 0.9em no-repeat}
h2.sidebar a:focus,h2.sidebar a:hover,h2.sidebar a:active{text-decoration:underline}
.js-display-fold h2.sidebar {margin-block:0}
#sidebartoggle{position:absolute;top:7px;inset-inline-end:4px;margin:0;padding:0;z-index:3}
#sidebarcontent div h3{font-size:.82em;line-height:1.7;font-weight:400;margin:0;padding:0 .375em;background:#d2ddea;background:linear-gradient(to bottom, rgb(210, 222, 236) 0, rgb(237, 242, 245) 100%)}
#latest-postings{background:#f9f9f9;border:1px solid #bacbdf;padding:0}
#latest-postings a.hide-sidebar{position:absolute;top:2px;right:4px;margin:0;padding:0;line-height:11px}
@ -243,7 +244,11 @@ span.userdata{margin:0;padding:0}
.underline{text-decoration:underline}
ins {font-style:italic}
del,s {color:#555}
label.main{font-weight:700}
#card {border:1px solid #bacbdf;border-radius:.375em;padding-inline:.5em;padding-block:.5em;margin-inline:auto;min-width:16em;max-width:24em}
#card > * {margin-inline: 0;margin-block:0 .75rem}
#card > *:last-child {margin-block:0}
#card form > *:not(:last-child) {margin-block:0 .375rem}
label.main{font-weight:bold;display:block}
label.active{color:#000}
label.inactive{color:gray!important}
label.inactive input{color:gray}
@ -260,6 +265,7 @@ ul.filelist{list-style-type:none;padding-left:0;margin-left:0;font-size:.82em;li
ul.filelist img{margin:0 5px -3px 0;padding:0}
ul.thread span.mod,ul.thread span.admin,td span.admin,td span.mod{cursor:help}
.registered_user::after{content:" \00AE"}
.author-name{font-weight:bold}
#captcha{margin:0;padding:0}
#captcha p{font-size:1em}
#captcha img,img.captcha{border:1px solid #000}
@ -287,22 +293,26 @@ p.userdata{margin:0}
.normalform{font-size:.82em;margin:0}
.normalform:not(:first-child){margin:1em 0 0}
.inline{display:inline}
#postingform fieldset{border:none;margin:0 0 1em}
#postingform p{font-size:1em;margin:0 0 5px;padding:0}
#postingform label.input{display:block;float:left;float:inline-start;width:8em;font-weight:700}
#postingform label.textarea{font-weight:700}
#postingform input.checkbox{margin-left:8em}
#postingform #insert-quote{margin:0 0 0 .5em;font-weight:400;font-size:.82em;padding:0 0 0 14px;background:url(images/quote_message.png) no-repeat left center transparent;border:none;color:#00c}
#postingform fieldset{border:none;margin-inline:0;}
#postingform fieldset:not(:last-child){margin-block:0 1em}
#postingform fieldset > *{font-size:1em;margin:0;padding:0}
#postingform fieldset > *:not(:last-child){margin-block-end:.75em}
#postingform #sticky-selection{padding-inline:0;list-style:none}
#postingform label.input{display:block;font-weight:700;margin-inline:0;margin-block:0 .25em}
#postingform label.textarea{font-weight:700;margin-block:0 .25em; margin-inline:0}
div#entry-input,#postingform input[type="text"],#postingform input[type="email"],#postingform input[type="url"],#postingform input[type="tel"]{max-width:calc(100vw - 4em)}
#postingform #insert-quote{margin-block:0 .25em;margin-inline:.75em 0;font-weight:400;font-size:.82em;padding-block:0;padding-inline:14px 0;background:url(images/quote_message.png) no-repeat left center transparent;border:none;color:#00c}
html[dir="rtl"] #postingform #insert-quote{background-position-x:right}
#postingform #insert-quote:focus,#postingform #insert-quote:hover{color:#00f}
#postingform #text{width:700px;height:400px;float:left;float:inline-start}
#postingform #format-bar{margin-left:720px}
#postingform{font-size:.82em}
#postingform #text{margin:0;width:100%;height:24em}
#postingform .small,#postingform .xsmall{font-size:.82em}
#delete_cookie{font-size:.82em}
#delete_cookie a{padding-left:13px;background:url(images/bg_sprite_3.png) no-repeat 0 -47px}
#bbcode-bar{margin:0 0 10px;width:62px}
#bbcode-bar button{width:62px;font-size:11px;margin:0 0 3px;padding:0}
#bbcode-bar button span{line-height:1.4em}
div#format-bar{margin:0 !important;padding:.375em;background:#f2f2f2}
#postingform #format-bar > *{display:flex;flex-wrap:wrap;gap:.125em}
#postingform #format-bar > *:not(:last-child){margin-block-end:.375em}
#format-bar button{font-size:.82em;min-height:2.4em;margin:0;padding-block:.25em;padding-inline:1em}
#format-bar button span{display:block;line-height:1.4em}
#bbcodebutton-b span{font-weight:700}
#bbcodebutton-i span{font-style:italic}
#bbcodebutton-link span{color:#00c;text-decoration:underline}
@ -322,19 +332,16 @@ p.userdata{margin:0}
#bbcode-options table td{width:15px!important;height:15px!important;margin:0;padding:0}
#bbcode-options table a{margin:0;padding:0;border:1px solid #bbb;width:15px;height:15px}
#bbcode-options table a:focus,#bbcode-options table a:hover{border:1px solid #fff;text-decoration:none}
#smiley-bar{width:70px}
#smiley-bar button.default{margin:0 1px 1px 0;padding:0;width:30px}
#smiley-bar button.default span{display:block;line-height:1px;margin:0;padding:0}
#smiley-bar button.default img{margin:0;padding:0}
#smiley-bar button.more-smilies{width:62px;font-size:11px;margin:0 0 3px;padding:0}
#smiley-bar button span{line-height:1.4em}
#additional-smilies{border:none!important;margin:0;padding:7px 0 0 7px !important;max-width:200px}
#additional-smilies img{margin:0 7px 7px 0}
#bbcode-instructions{margin:0;padding:0;font-size:.82em}
#bbcode-instructions dt{font-weight:700}
#bbcode-instructions dd{margin-left:0}
#smiley-instructions dt{float:left;float:inline-start}
#smiley-instructions dd{clear:right;clear:inline-end}
#additional-smilies{max-width:200px;display:flex;flex-wrap:wrap;align-items:self-start;align-content:stretch;gap:.125em}
#additional-smilies button{font-size:.82em;min-height:2.4em;margin:0;padding-block:.25em;padding-inline:1em;background:transparent;border:none}
#smiley-bar button img,#additional-smilies button img{display:block;width:1.2em;height:auto;margin:0;padding:0}
#formatting-help > *{margin-block:0 .75em;margin-block:0 .75rem;padding:0}
#formatting-help dl > div:not(:last-child){margin-block:0 .375em}
#formatting-help dt{font-weight:bold}
#formatting-help dd{margin-left:0}
#formatting-help dd img{display:block}
#smiley-instructions div{display:flex;gap:.5em}
#smiley-instructions dt{flex:0 0 6em}
button.insert-smiley{margin:0;padding:0;font-size:11px;font-weight:400}
#smilies li{display:inline-block;min-width:50px;padding:0 10px 10px 0;white-space:nowrap}
ul.pagination{margin:.75em 0;padding:0;list-style-type:none}
@ -343,12 +350,6 @@ ul.pagination{margin:.75em 0;padding:0;list-style-type:none}
ul.pagination a,ul.pagination span{border:1px solid #bacbdf;background:#f9f9f9;padding:1px 6px}
ul.pagination a:focus,ul.pagination a:hover{border:1px solid #00c;background:#efefef;text-decoration:none}
ul.pagination .current{border:1px solid #bacbdf;color:red;font-weight:700}
#more-smilies{position:absolute;width:200px;background:#ffc;border:1px solid silver;display:none}
#more-smilies .close{position:absolute;top:0;right:0;padding:0}
#more-smilies-body{overflow:auto}
#more-smilies-content{max-height:300px}
#more-smilies-content p{padding:10px}
#more-smilies-content img{padding:5px}
#colorpicker{position:absolute;background:#bbb;border:1px solid #bbb;display:none}
#colorpicker table{margin:0;padding:0;line-height:10px}
#colorpicker table img{margin:0;padding:0;border:1px solid #bbb}
@ -361,8 +362,10 @@ ul.pagination .current{border:1px solid #bacbdf;color:red;font-weight:700}
#codepicker ul{list-style-type:none;margin:0;padding:0}
#codepicker ul a{color:#000;display:block;text-decoration:none;padding:1px 5px}
#codepicker ul a:focus,#codepicker ul a:hover{background:#e0e0e0}
.buttonbar{display:flex; flex-wrap:wrap; gap:.3em}
.buttonbar{display:flex; flex-wrap:wrap; gap:.3em;align-items:baseline}
.buttonbar > *{margin-block:0}
.buttonbar button{padding:.3em}
.buttonbar a{display:inline-block;text-align:center;align-content:center;padding:.3em}
#admin-main-menu{display:grid;grid-template-areas:"infoboxes" "mainmenu";grid-template-columns:1fr;grid-template-rows:auto auto;gap:.75em}
#admin-main-menu > *{margin:0;padding:0}
.additional-admin-info{grid-area:infoboxes}
@ -384,79 +387,61 @@ main > .adminmenu{margin-block:1em;margin-inline:0;padding:0}
h2#admin_header{margin:0 0 .5em 0}
.manage-postings{border:1px solid #bacbdf;margin-top:25px;background:#f9f9f9}
.manage-postings legend{font-size:.82em;font-weight:700}
ul#uploadlist{list-style:none;margin:0;padding:0;max-width:100%;display:flex;flex-wrap:wrap;gap:.75em}
#uploadlist li{width:18.5em;margin:0;padding:0;border:1px solid #bacbdf;background:#f9f9f9}
ul#uploadlist{list-style:none;margin-inline:0;margin-block:0 .75em;padding:0;max-width:100%;display:flex;flex-wrap:wrap;gap:.75em}
#uploadlist > li{width:18.5em;margin:0;padding:0;border:1px solid #bacbdf;background:#f9f9f9}
#uploadlist .image_container{padding:.5em;height:21.5em;width:100%;margin:0 0 .25em 0;text-align:center}
#uploadlist img{max-width:100%;max-height:100%}
#uploadlist .management_container{margin:0;padding:.25em 0}
#uploadlist .management_container{margin:0;padding:.25em 0;list-style:none}
#uploadlist .management_container > li{margin:0;padding-block:.125em;padding-inline:.25em}
#uploadlist .management_container input{margin:0 .125em}
#uploadlist + p{margin-block:.75em 1em}
#uploadlist .information{display:flex;}
#uploadlist .information > img{display:block;}
.confirm-selection{list-style:none;padding:0;border-top:1px solid #bacbdf}
.confirm-selection li{min-height:2.5em;margin:0 0 .25em 0;padding:.25em .5em;border-bottom:1px solid #bacbdf}
.confirm-selection .item{margin:0 0 .25em 0}
.confirm-selection .info{font-weight:bold;margin:0}
a.thread,a.thread:link{padding-inline-start:18px;color:#00c;text-decoration:none;font-weight:700;background:url(images/bg_sprite_1.png) no-repeat 0 -148px}
html[dir="rtl"] a.thread,html[dir="rtl"] a.thread:link{background:url(images/bg_sprite_1.png) no-repeat 100% -148px}
a.thread:visited{color:#007}
a.thread:focus,a.thread:hover{color:#00f;text-decoration:underline}
a.thread:active{color:red}
a.thread-sticky,a.thread-sticky:link{padding-inline-start:18px;color:#00c;text-decoration:none;font-weight:700;background:url(images/bg_sprite_1.png) no-repeat 0 -250px}
html[dir="rtl"] a.thread-sticky,html[dir="rtl"] a.thread-sticky:link{background:url(images/bg_sprite_1.png) no-repeat 100% -250px}
a.thread-sticky:visited{color:#007}
a.thread-sticky:focus,a.thread-sticky:hover{color:#00f;text-decoration:underline}
a.thread-sticky:active{color:red}
a.thread-sticky-locked,a.thread-sticky-locked:link{padding-inline-start:18px;color:#00c;text-decoration:none;font-weight:700;background:url(images/bg_sprite_1.png) no-repeat 0 -1210px}
html[dir="rtl"] a.thread-sticky-locked,html[dir="rtl"] a.thread-sticky-locked:link{background:url(images/bg_sprite_1.png) no-repeat 100% -1210px}
a.thread-sticky-locked:visited{color:#007}
a.thread-sticky-locked:focus,a.thread-sticky-locked:hover{color:#00f;text-decoration:underline}
a.thread-sticky-locked:active{color:red}
a.thread-locked,a.thread-locked:link{padding-inline-start:18px;color:#00c;text-decoration:none;font-weight:700;background:url(images/bg_sprite_1.png) no-repeat 0 -1109px}
html[dir="rtl"] a.thread-locked,html[dir="rtl"] a.thread-locked:link{background:url(images/bg_sprite_1.png) no-repeat 100% -1109px}
a.thread-locked:visited{color:#007}
a.thread-locked:focus,a.thread-locked:hover{color:#00f;text-decoration:underline}
a.thread-locked:active{color:red}
a.threadnew-sticky,a.threadnew-sticky:link{padding-inline-start:18px;color:#00c;text-decoration:none;font-weight:700;background:url(images/bg_sprite_1.png) no-repeat 0 -300px}
html[dir="rtl"] a.threadnew-sticky,html[dir="rtl"] a.threadnew-sticky:link{background:url(images/bg_sprite_1.png) no-repeat 100% -300px}
a.threadnew-sticky:visited{color:#007}
a.threadnew-sticky:focus,a.threadnew-sticky:hover{color:#00f;text-decoration:underline}
a.threadnew-sticky:active{color:red}
a.threadnew-sticky-locked,a.threadnew-sticky-locked:link{padding-inline-start:18px;color:#00c;text-decoration:none;font-weight:700;background:url(images/bg_sprite_1.png) no-repeat 0 -1260px}
html[dir="rtl"] a.threadnew-sticky-locked,html[dir="rtl"] a.threadnew-sticky-locked:link{background:url(images/bg_sprite_1.png) no-repeat 100% -1260px}
a.threadnew-sticky-locked:visited{color:#007}
a.threadnew-sticky-locked:focus,a.threadnew-sticky-locked:hover{color:#00f;text-decoration:underline}
a.threadnew-sticky-locked:active{color:red}
a.threadnew-locked,a.threadnew-locked:link{padding-inline-start:18px;color:#00c;text-decoration:none;font-weight:700;background:url(images/bg_sprite_1.png) no-repeat 0 -1160px}
html[dir="rtl"] a.threadnew-locked,html[dir="rtl"] a.threadnew-locked:link{background:url(images/bg_sprite_1.png) no-repeat 100% -1160px}
a.threadnew-locked:visited{color:#007}
a.threadnew-locked:focus,a.threadnew-locked:hover{color:#00f;text-decoration:underline}
a.threadnew-locked:active{color:red}
a.threadnew,a.threadnew:link{padding-inline-start:18px;color:#00c;text-decoration:none;font-weight:700;background:url(images/bg_sprite_1.png) no-repeat 0 -198px}
html[dir="rtl"] a.threadnew,html[dir="rtl"] a.threadnew:link{background:url(images/bg_sprite_1.png) no-repeat 100% -198px}
a.threadnew:visited{color:#007}
a.threadnew:focus,a.threadnew:hover{color:#00f;text-decoration:underline}
a.threadnew:active{color:red}
a.reply,a.reply:link{padding-inline-start:16px;color:#00c;text-decoration:none;font-weight:400;background:url(images/bg_sprite_1.png) no-repeat 0 -348px}
html[dir="rtl"] a.reply,html[dir="rtl"] a.reply:link{background:url(images/bg_sprite_1.png) no-repeat 100% -1408px}
a.reply:visited{color:#007}
a.reply:focus,a.reply:hover{color:#00f;text-decoration:underline}
a.reply:active{color:red}
a.replynew,a.replynew:link{padding-inline-start:16px;color:#00c;text-decoration:none;font-weight:400;background:url(images/bg_sprite_1.png) no-repeat 0 -398px}
html[dir="rtl"] a.replynew,html[dir="rtl"] a.replynew:link{background:url(images/bg_sprite_1.png) no-repeat 100% -1458px}
a.replynew:visited{color:#007}
a.replynew:focus,a.replynew:hover{color:#00f;text-decoration:underline}
a.replynew:active{color:red}
span.subject,a.subject,a.subject:link{text-decoration:none;font-weight:bold}
a.subject,a.subject:link{color:#00c}
a.subject:visited{color:#007}
a.subject:focus,a.subject:hover{color:#00f;text-decoration:underline}
a.subject:active{color:red}
a.thread,a.thread:link{padding-inline-start:18px;background:url(images/bg_sprite_1.png) no-repeat 0 -148px}
html[dir="rtl"] a.thread,html[dir="rtl"] a.thread:link{background-position-x:100%}
a.thread-sticky,a.thread-sticky:link{padding-inline-start:18px;background:url(images/bg_sprite_1.png) no-repeat 0 -250px}
html[dir="rtl"] a.thread-sticky,html[dir="rtl"] a.thread-sticky:link{background-position-x:100%}
a.thread-sticky-locked,a.thread-sticky-locked:link{padding-inline-start:18px;background:url(images/bg_sprite_1.png) no-repeat 0 -1210px}
html[dir="rtl"] a.thread-sticky-locked,html[dir="rtl"] a.thread-sticky-locked:link{background-position-x:100%}
a.thread-locked,a.thread-locked:link{padding-inline-start:18px;background:url(images/bg_sprite_1.png) no-repeat 0 -1109px}
html[dir="rtl"] a.thread-locked,html[dir="rtl"] a.thread-locked:link{background-position-x:100%}
a.threadnew-sticky,a.threadnew-sticky:link{padding-inline-start:18px;background:url(images/bg_sprite_1.png) no-repeat 0 -300px}
html[dir="rtl"] a.threadnew-sticky,html[dir="rtl"] a.threadnew-sticky:link{background-position-x:100%}
a.threadnew-sticky-locked,a.threadnew-sticky-locked:link{padding-inline-start:18px;background:url(images/bg_sprite_1.png) no-repeat 0 -1260px}
html[dir="rtl"] a.threadnew-sticky-locked,html[dir="rtl"] a.threadnew-sticky-locked:link{background-position-x:100%}
a.threadnew-locked,a.threadnew-locked:link{padding-inline-start:18px;background:url(images/bg_sprite_1.png) no-repeat 0 -1160px}
html[dir="rtl"] a.threadnew-locked,html[dir="rtl"] a.threadnew-locked:link{background-position-x:100%}
a.threadnew,a.threadnew:link{padding-inline-start:18px;background:url(images/bg_sprite_1.png) no-repeat 0 -198px}
html[dir="rtl"] a.threadnew,html[dir="rtl"] a.threadnew:link{background-position-x:100%}
a.reply,a.reply:link{padding-inline-start:16px;font-weight:normal;background:url(images/bg_sprite_1.png) no-repeat 0 -348px}
html[dir="rtl"] a.reply,html[dir="rtl"] a.reply:link{background-position:100% -1408px}
a.replynew,a.replynew:link{padding-inline-start:16px;font-weight:normal;background:url(images/bg_sprite_1.png) no-repeat 0 -398px}
html[dir="rtl"] a.replynew,html[dir="rtl"] a.replynew:link{background-position:100% -1458px}
a.read,a.read:link,a.read:visited,#latest-postings li a span.read{color:#007}
a.read:focus,a.read:hover{color:#00f}
a.read:active{color:red}
.currentthread{padding-inline-start:18px;color:red;font-weight:700;background:url(images/bg_sprite_1.png) no-repeat 0 -148px}
html[dir="rtl"] .currentthread{background:url(images/bg_sprite_1.png) no-repeat 100% -148px}
.currentthreadnew{padding-inline-start:18px;color:red;font-weight:700;background:url(images/bg_sprite_1.png) no-repeat 0 -198px}
html[dir="rtl"] .currentthreadnew{background:url(images/bg_sprite_1.png) no-repeat 100% -198px}
.currentreply{padding-inline-start:16px;color:red;font-weight:700;background:url(images/bg_sprite_1.png) no-repeat 0 -348px}
html[dir="rtl"] .currentreply{background:url(images/bg_sprite_1.png) no-repeat 100% -1408px}
.currentreplynew{padding-inline-start:16px;color:red;font-weight:700;background:url(images/bg_sprite_1.png) no-repeat 0 -398px}
html[dir="rtl"] .currentreplynew{background:url(images/bg_sprite_1.png) no-repeat 100% -1458px}
ul.thread li > a,ul.thread li .currentreply,ul.thread li > .metadata{text-wrap:nowrap}
main:not(:has(table#threadlist)) ul.thread li > a::after{content:" - "}
.currentthread,.currentthreadnew,.currentreply,.currentreplynew{color:#ff0000;font-weight:bold}
.currentthread{padding-inline-start:18px;background:url(images/bg_sprite_1.png) no-repeat 0 -148px}
html[dir="rtl"] .currentthread{background-position-x:100%}
.currentthreadnew{padding-inline-start:18px;background:url(images/bg_sprite_1.png) no-repeat 0 -198px}
html[dir="rtl"] .currentthreadnew{background-position-x:100%}
.currentreply{padding-inline-start:16px;background:url(images/bg_sprite_1.png) no-repeat 0 -348px}
html[dir="rtl"] .currentreply{background-position:100% -1408px}
.currentreplynew{padding-inline-start:16px;background:url(images/bg_sprite_1.png) no-repeat 0 -398px}
html[dir="rtl"] .currentreplynew{background-position:100% -1458px}
a.internal,a.internal:link{padding-inline-start:18px;color:#00c;text-decoration:none;background:url(images/bg_sprite_1.png) no-repeat 0 -148px}
html[dir="rtl"] a.internal,html[dir="rtl"] a.internal:link{background:url(images/bg_sprite_1.png) no-repeat 100% -148px}
html[dir="rtl"] a.internal,html[dir="rtl"] a.internal:link{background-position-x:100%}
a.internal:focus,a.internal:hover{color:#00f;text-decoration:underline}
a.internal:active{color:red}
ul.thread{margin:0 0 1.5em;padding:0;list-style-type:none;max-width:100%!important}
@ -522,7 +507,7 @@ img.right{float:right;float:inline-end;margin:0 0 10px 10px}
.js-cursor-move{cursor:move}
.js-display-fold .wrapper,.js-display-fold #sidebarcontent{display:none}
.js-display-fold img.avatar{width:1.6em;height:1.6em}
form p.hp{display:none}
form .hp{display:none}
@media screen and (min-width:38em) {
#top {flex-direction:row;justify-content:space-between}
#usermenu{justify-content:flex-end}
@ -532,6 +517,10 @@ form p.hp{display:none}
#admin-main-menu{grid-template-areas:"infoboxes mainmenu";grid-template-columns:18em auto;grid-template-rows:auto}
#main-grid.threaded {grid-template-areas:"threadlist sidebar";grid-template-columns:auto 18em;grid-template-rows:auto}
#main-grid.threaded:has(div.js-display-fold){grid-template-columns:auto 8.5em}
h2.sidebar a{padding-inline:1.25em .375em;background:url("images/triangle-right.svg") 0.175em center/0.9em 0.9em no-repeat}
.js-display-fold h2.sidebar a{background:url("images/triangle-left.svg") 0.325em center/0.9em 0.9em no-repeat}
html[dir="rtl"] h2.sidebar a{background:url("images/triangle-left.svg") calc(100% - 0.175em) center/0.9em 0.9em no-repeat}
html[dir="rtl"] .js-display-fold h2.sidebar a{background:url("images/triangle-right.svg") calc(100% - 0.175em) center/0.9em 0.9em no-repeat}
}
@media screen and (min-width:48em) {
#logo h1{font-size:1.6em}

View file

@ -427,7 +427,7 @@
{cycle values="a,b" assign=c}
<tr class="{$c}">
<td style="width:10px;"><input type="checkbox" name="selected[]" value="{$userdata[row].user_id}" /></td>
<td>{if $userdata[row].inactive}<span title="{#user_inactive#}" style="font-weight:bold;color:red;">{$userdata[row].user_name}</span>{else}<a href="index.php?mode=user&amp;show_user={$userdata[row].user_id}" title="{#show_userdata_linktitle#|replace:"[user]":$userdata[row].user_name}"><strong>{$userdata[row].user_name}</strong></a>{/if}</td>
<td>{if $userdata[row].inactive}<span class="author-name inactive-user" title="{#user_inactive#}">{$userdata[row].user_name}</span>{else}<a href="index.php?mode=user&amp;show_user={$userdata[row].user_id}" title="{#show_userdata_linktitle#|replace:"[user]":$userdata[row].user_name}"><span class="author-name">{$userdata[row].user_name}</span></a>{/if}</td>
<td><span class="small"><a href="mailto:{$userdata[row].user_email}" title="{#mailto_user_lt#|replace:"[user]":$userdata[row].user_name}">{$userdata[row].user_email}</a></span></td>
<td><span class="small">{if $userdata[row].user_type==2}{#admin#}{elseif $userdata[row].user_type==1}{#mod#}{else}{#user#}{/if}</span></td>
<td><span class="small">{$userdata[row].registered_time}</span></td>
@ -647,7 +647,7 @@
<p><label for="ar_email" class="main">{#register_email#}</label><br />
<input id="ar_email" type="text" size="25" name="ar_email" value="{$ar_email|default:''}" maxlength="{$settings.email_maxlength}" /></p>
<p><label for="ar_pw" class="main">{#register_pw#}</label><br />
<input id="ar_pw" type="password" spellcheck="false" autocomplete="off" size="25" name="ar_pw" maxlength="50" /></p>
<input id="ar_pw" type="password" spellcheck="false" autocomplete="off" writingsuggestions="false" size="25" name="ar_pw" maxlength="50" /></p>
<p><input id="ar_send_userdata" type="checkbox" name="ar_send_userdata" value="true"{if $ar_send_userdata} checked="checked"{/if} /> <label for="ar_send_userdata">{#register_send_userdata#}</label></p>
<p><input type="submit" name="register_submit" value="{#submit_button_ok#}" /></p>
</div>
@ -832,7 +832,7 @@
<p><input id="delete_postings" type="checkbox" name="delete_postings" value="true" /><label for="delete_postings"> {#delete_postings#}</label></p>
<p><input id="delete_userdata" type="checkbox" name="delete_userdata" value="true" /><label for="delete_userdata"> {#delete_userdata#}</label></p>
<p>{#admin_confirm_password#}<br />
<input type="password" spellcheck="false" autocomplete="off" size="20" name="confirm_pw" /> <input type="submit" name="reset_forum_confirmed" value="{#reset_forum_submit#}" /></p>
<input type="password" spellcheck="false" autocomplete="off" writingsuggestions="false" size="20" name="confirm_pw" /> <input type="submit" name="reset_forum_confirmed" value="{#reset_forum_submit#}" /></p>
</div>
</form>
@ -845,7 +845,7 @@
<input type="hidden" name="mode" value="admin" />
<input type="hidden" name="csrf_token" value="{$CSRF_TOKEN}" />
<p>{#reset_uninstall_conf_pw#}<br />
<input type="password" spellcheck="false" autocomplete="off" size="20" name="confirm_pw" /> <input type="submit" name="uninstall_forum_confirmed" value="{#uninstall_forum_submit#}" /></p>
<input type="password" spellcheck="false" autocomplete="off" writingsuggestions="false" size="20" name="confirm_pw" /> <input type="submit" name="uninstall_forum_confirmed" value="{#uninstall_forum_submit#}" /></p>
</div>
</form>
{elseif $action=='update'}
@ -881,7 +881,7 @@
<input type="hidden" name="mode" value="admin" />
<input type="hidden" name="update_file_submit" value="{$update_file}" />
<input type="hidden" name="csrf_token" value="{$CSRF_TOKEN}" />
<p>{#admin_confirm_password#}<br /><input type="password" name="update_password" spellcheck="false" autocomplete="off" size="25"/></p>
<p>{#admin_confirm_password#}<br /><input type="password" name="update_password" spellcheck="false" autocomplete="off" writingsuggestions="false" size="25"/></p>
<p><input type="submit" name="update_submit" value="{#update_submit#}" onclick="document.getElementById('throbber-submit').style.visibility = 'visible';" /> <img id="throbber-submit" style="visibility:hidden;" src="{$THEMES_DIR}/{$theme}/images/throbber_submit.gif" alt="" width="16" height="16" /></p>
</div>
</form>
@ -905,7 +905,7 @@
{/foreach}
</ul>
{/if}
<p>{#update_reenable_notice#}</p>
<p>{#update_reenabling_notice#}</p>
{if $update_download_url}<p class="small">{#update_download#|replace:"[[":"<a href=\"$update_download_url\">"|replace:"]]":"</a>"}</p>{/if}
{if $update_message}{$update_message}{/if}
{elseif $action == 'email_list'}
@ -1047,37 +1047,59 @@
{elseif $action=='list_uploads'}
<h2 id="admin_header">{#upload_administration#}</h2>
{if $images}
<div>
<form action="index.php" method="get" accept-charset="{#charset#}">
<input type="hidden" name="mode" value="admin" />
<input type="hidden" name="action" value="list_uploads" />
<div>
<button name="filter" value="not-managed-images">{#upload_filter_not_managed_images#}</button>
<button name="filter" value="managed-images">{#upload_filter_managed_images#}</button>
<button name="filter" value="all-images" class="active-filter">{#upload_filter_all_images#}</button>
</div>
</form>
</div>
{if $images}
{if $pagination}
<ul class="pagination">
{if $pagination.previous}<li><a href="index.php?mode={$mode}{if $action}&amp;action={$action}{/if}{if $search_user_encoded}&amp;search_user={$search_user_encoded}{/if}{if $method && $method!='fulltext'}&amp;method={$method}{/if}{if $id}&amp;id={$id}{/if}{if $pagination.previous>1}&amp;page={$pagination.previous}{/if}{if $p_category && $p_category>0}&amp;p_category={$p_category}{/if}{if $order}&amp;order={$order}{/if}{if $descasc}&amp;descasc={$descasc}{/if}" title="{#previous_page_link_title#}">{#previous_page_link#}</a></li>{/if}
{if $pagination.previous}<li><a href="index.php?mode={$mode}{if $action}&amp;action={$action}{/if}{if $search_user_encoded}&amp;search_user={$search_user_encoded}{/if}{if $method && $method!='fulltext'}&amp;method={$method}{/if}{if $id}&amp;id={$id}{/if}{if $pagination.previous>1}&amp;page={$pagination.previous}{/if}{if $p_category && $p_category>0}&amp;p_category={$p_category}{/if}{if $order}&amp;order={$order}{/if}{if $descasc}&amp;descasc={$descasc}{/if}{if $filter}&amp;filter={$filter}{/if}" title="{#previous_page_link_title#}">{#previous_page_link#}</a></li>{/if}
{foreach from=$pagination.items item=item}
{if $item==0}<li>&hellip;</li>{elseif $item==$pagination.current}<li><span class="current">{$item}</span></li>{else}<li><a href="index.php?mode={$mode}{if $action}&amp;action={$action}{/if}{if $search_user_encoded}&amp;search_user={$search_user_encoded}{/if}{if $method && $method!='fulltext'}&amp;method={$method}{/if}{if $id}&amp;id={$id}{/if}&amp;page={$item}{if $p_category && $p_category>0}&amp;p_category={$p_category}{/if}{if $order}&amp;order={$order}{/if}{if $descasc}&amp;descasc={$descasc}{/if}">{$item}</a></li>{/if}
{if $item==0}<li>&hellip;</li>{elseif $item==$pagination.current}<li><span class="current">{$item}</span></li>{else}<li><a href="index.php?mode={$mode}{if $action}&amp;action={$action}{/if}{if $search_user_encoded}&amp;search_user={$search_user_encoded}{/if}{if $method && $method!='fulltext'}&amp;method={$method}{/if}{if $id}&amp;id={$id}{/if}&amp;page={$item}{if $p_category && $p_category>0}&amp;p_category={$p_category}{/if}{if $order}&amp;order={$order}{/if}{if $descasc}&amp;descasc={$descasc}{/if}{if $filter}&amp;filter={$filter}{/if}">{$item}</a></li>{/if}
{/foreach}
{if $pagination.next}<li><a href="index.php?mode={$mode}{if $action}&amp;action={$action}{/if}{if $search_user_encoded}&amp;search_user={$search_user_encoded}{/if}{if $method && $method!='fulltext'}&amp;method={$method}{/if}{if $id}&amp;id={$id}{/if}&amp;page={$pagination.next}{if $p_category && $p_category>0}&amp;p_category={$p_category}{/if}{if $order}&amp;order={$order}{/if}{if $descasc}&amp;descasc={$descasc}{/if}" title="{#next_page_link_title#}">{#next_page_link#}</a></li>{/if}
{if $pagination.next}<li><a href="index.php?mode={$mode}{if $action}&amp;action={$action}{/if}{if $search_user_encoded}&amp;search_user={$search_user_encoded}{/if}{if $method && $method!='fulltext'}&amp;method={$method}{/if}{if $id}&amp;id={$id}{/if}&amp;page={$pagination.next}{if $p_category && $p_category>0}&amp;p_category={$p_category}{/if}{if $order}&amp;order={$order}{/if}{if $descasc}&amp;descasc={$descasc}{/if}{if $filter}&amp;filter={$filter}{/if}" title="{#next_page_link_title#}">{#next_page_link#}</a></li>{/if}
</ul>
{/if}
<form action="index.php" method="post" accept-charset="{#charset#}">
<input type="hidden" name="mode" value="admin" />
<input type="hidden" name="csrf_token" value="{$CSRF_TOKEN}" />
{if $filter}
<input type="hidden" name="filter" value="{$filter}" />
{/if}
<ul id="uploadlist">
{section name=nr loop=$images start=$start max=$images_per_page}
<li><p class="image_container"><img src="images/uploaded/{$images[nr]}" alt="{$images[nr]}" /></p>
<p class="management_container"><input type="checkbox" id="{$images[nr]}" name="uploads_remove[]" value="{$images[nr]}" /><label for="{$images[nr]}">{#mark_upload_for_removal#}</label></p></li>
<li>
<p class="image_container"><img src="images/uploaded/{$images[nr].pathname}" alt="{$images[nr].pathname}" /></p>
<ul class="management_container">
<li class="information">{if $images[nr].status == 1}<img src="themes/{$settings.theme}/images/database.svg" alt="{#upload_database_entry_alt#}" width="16" height="16">{else}<img src="themes/{$settings.theme}/images/database-no.svg" alt="{#upload_database_no_entry_alt#}" width="16" height="16">{/if}</li>
<li><input type="checkbox" id="id-{$images[nr].number}" name="manage_uploads[]" value="{$images[nr].pathname}" /><label for="id-{$images[nr].number}">{#mark_upload_for_managing#}</label></li>
</ul>
</li>
{/section}
</ul>
<p><input type="submit" name="delete_selected_uploads" value="{#delete#}" /></p>
<div>
<button name="record_selected_uploads" value="record">{#upload_add_db_entry_button#}</button>
<button name="delete_selected_uploads" value="{#delete#}">{#delete#}</button>
</div>
</form>
{if $pagination}
<ul class="pagination">
{if $pagination.previous}<li><a href="index.php?mode={$mode}{if $action}&amp;action={$action}{/if}{if $search_user_encoded}&amp;search_user={$search_user_encoded}{/if}{if $method && $method!='fulltext'}&amp;method={$method}{/if}{if $id}&amp;id={$id}{/if}{if $pagination.previous>1}&amp;page={$pagination.previous}{/if}{if $p_category && $p_category>0}&amp;p_category={$p_category}{/if}{if $order}&amp;order={$order}{/if}{if $descasc}&amp;descasc={$descasc}{/if}" title="{#previous_page_link_title#}">{#previous_page_link#}</a></li>{/if}
{if $pagination.previous}<li><a href="index.php?mode={$mode}{if $action}&amp;action={$action}{/if}{if $search_user_encoded}&amp;search_user={$search_user_encoded}{/if}{if $method && $method!='fulltext'}&amp;method={$method}{/if}{if $id}&amp;id={$id}{/if}{if $pagination.previous>1}&amp;page={$pagination.previous}{/if}{if $p_category && $p_category>0}&amp;p_category={$p_category}{/if}{if $order}&amp;order={$order}{/if}{if $descasc}&amp;descasc={$descasc}{/if}{if $filter}&amp;filter={$filter}{/if}" title="{#previous_page_link_title#}">{#previous_page_link#}</a></li>{/if}
{foreach from=$pagination.items item=item}
{if $item==0}<li>&hellip;</li>{elseif $item==$pagination.current}<li><span class="current">{$item}</span></li>{else}<li><a href="index.php?mode={$mode}{if $action}&amp;action={$action}{/if}{if $search_user_encoded}&amp;search_user={$search_user_encoded}{/if}{if $method && $method!='fulltext'}&amp;method={$method}{/if}{if $id}&amp;id={$id}{/if}&amp;page={$item}{if $p_category && $p_category>0}&amp;p_category={$p_category}{/if}{if $order}&amp;order={$order}{/if}{if $descasc}&amp;descasc={$descasc}{/if}">{$item}</a></li>{/if}
{if $item==0}<li>&hellip;</li>{elseif $item==$pagination.current}<li><span class="current">{$item}</span></li>{else}<li><a href="index.php?mode={$mode}{if $action}&amp;action={$action}{/if}{if $search_user_encoded}&amp;search_user={$search_user_encoded}{/if}{if $method && $method!='fulltext'}&amp;method={$method}{/if}{if $id}&amp;id={$id}{/if}&amp;page={$item}{if $p_category && $p_category>0}&amp;p_category={$p_category}{/if}{if $order}&amp;order={$order}{/if}{if $descasc}&amp;descasc={$descasc}{/if}{if $filter}&amp;filter={$filter}{/if}">{$item}</a></li>{/if}
{/foreach}
{if $pagination.next}<li><a href="index.php?mode={$mode}{if $action}&amp;action={$action}{/if}{if $search_user_encoded}&amp;search_user={$search_user_encoded}{/if}{if $method && $method!='fulltext'}&amp;method={$method}{/if}{if $id}&amp;id={$id}{/if}&amp;page={$pagination.next}{if $p_category && $p_category>0}&amp;p_category={$p_category}{/if}{if $order}&amp;order={$order}{/if}{if $descasc}&amp;descasc={$descasc}{/if}" title="{#next_page_link_title#}">{#next_page_link#}</a></li>{/if}
{if $pagination.next}<li><a href="index.php?mode={$mode}{if $action}&amp;action={$action}{/if}{if $search_user_encoded}&amp;search_user={$search_user_encoded}{/if}{if $method && $method!='fulltext'}&amp;method={$method}{/if}{if $id}&amp;id={$id}{/if}&amp;page={$pagination.next}{if $p_category && $p_category>0}&amp;p_category={$p_category}{/if}{if $order}&amp;order={$order}{/if}{if $descasc}&amp;descasc={$descasc}{/if}{if $filter}&amp;filter={$filter}{/if}" title="{#next_page_link_title#}">{#next_page_link#}</a></li>{/if}
</ul>
{/if}
{else}

View file

@ -18,7 +18,7 @@
{cycle values="a,b" assign=c}
<tr id="id_{$row.bid}" class="{$c}">
<td><a href="index.php?id={$row.id}" title="{$row.subject}"><strong>{$row.subject}</strong></a></td>
<td>{if $row.user_id > 0}<a href="index.php?mode=user&amp;show_user={$row.user_id}" title="{#show_userdata_linktitle#|replace:"[user]":$row.user_name}">{/if}<strong>{$row.user_name}</strong>{if $row.user_id > 0}</a>{/if}</td>
<td>{if $row.user_id > 0}<a href="index.php?mode=user&amp;show_user={$row.user_id}" title="{#show_userdata_linktitle#|replace:"[user]":$row.user_name}">{/if}<span class="author-name">{$row.user_name}</span>{if $row.user_id > 0}</a>{/if}</td>
<td><span class="small">{$row.bookmark_time}</span></td>
<td><span class="small">{$row.posting_time}</span></td>

View file

@ -15,30 +15,49 @@
{/section}
</ul>
{/if}
<form action="index.php" method="post" accept-charset="{#charset#}">
<div>
<input type="hidden" name="mode" value="contact" />
{if $id}<input type="hidden" name="id" value="{$id}" />{/if}
{if $recipient_user_id}<input type="hidden" name="recipient_user_id" value="{$recipient_user_id}" />{/if}
{if $session}<input type="hidden" name="{$session.name}" value="{$session.id}" />{/if}
{if not $user_id}<p><label for="sender_email">{#sender_address_caption#}</label><br />
<input id="sender_email" type="text" name="sender_email" value="" size="50" /></p>{/if}
<p><label for="subject">{#subject_caption#}</label><br />
<input id="subject" type="text" name="subject" value="{$subject|default:""}" size="50" maxlength="{$settings.email_subject_maxlength}" /></p>
<p><label for="message">{#message_caption#}</label><br />
<textarea id="message" name="text" rows="20" cols="80">{$text|default:""}</textarea></p>
<form action="index.php" method="post" accept-charset="{#charset#}">
<input type="hidden" name="mode" value="contact" />
{if $id} <input type="hidden" name="id" value="{$id}" />{/if}
{if $recipient_user_id} <input type="hidden" name="recipient_user_id" value="{$recipient_user_id}" />{/if}
{if $session} <input type="hidden" name="{$session.name}" value="{$session.id}" />{/if}
{if not $user_id}
<div>
<label for="sender_email">{#sender_address_caption#}</label>
<input id="sender_email" type="email" name="sender_email" value="" size="50" required />
</div>
{/if}
<div>
<label for="subject">{#subject_caption#}</label>
<input id="subject" type="text" name="subject" value="{$subject|default:""}" size="50" maxlength="{$settings.email_subject_maxlength}" required />
</div>
<div>
<label for="message">{#message_caption#}</label>
<textarea id="message" name="text" rows="20" cols="80" required>{$text|default:""}</textarea>
</div>
{if $captcha}
{if $captcha.type==2}
<p><strong>{#captcha_marking#}</strong><br />
<img class="captcha" src="modules/captcha/captcha_image.php?{$session.name}={$session.id}" alt="{#captcha_image_alt#}" width="180" height="40" /><br />
<label for="captcha_code">{#captcha_expl_image#}</label> <input id="captcha_code" type="text" name="captcha_code" value="" size="10" /></p>
<div>
<span class="label-like">{#captcha_marking#}</span><br />
<img class="captcha" src="modules/captcha/captcha_image.php?{$session.name}={$session.id}" alt="{#captcha_image_alt#}" width="180" height="40" /><br />
<label for="captcha_code">{#captcha_expl_image#}</label>
<input id="captcha_code" type="text" name="captcha_code" value="" size="10" />
</div>
{else}
<p><strong>{#captcha_marking#}</strong><br />
<label for="captcha_code">{#captcha_expl_math#} {$captcha.number_1} + {$captcha.number_2} = </label><input id="captcha_code" type="text" name="captcha_code" value="" size="5" /></p>
<div>
<span class="label-like">{#captcha_marking#}</span><br />
<label for="captcha_code">{#captcha_expl_math#} {$captcha.number_1} + {$captcha.number_2} = </label>
<input id="captcha_code" type="text" name="captcha_code" value="" size="5" />
</div>
{/if}
{/if}
{if $user_id}<p><input id="confirmation_email" type="checkbox" name="confirmation_email" value="1" />&nbsp;<label for="confirmation_email">{#sender_confirmation_caption#}</label></p>{/if}
<p><input type="submit" name="message_submit" value="{#message_submit_caption#}" onclick="document.getElementById('throbber-submit').classList.remove('js-visibility-hidden');" /> <img id="throbber-submit" class="js-visibility-hidden" src="{$THEMES_DIR}/{$theme}/images/throbber_submit.gif" alt="" width="16" height="16" /></p>
</div>
</form>
{if $user_id}
<div>
<input id="confirmation_email" type="checkbox" name="confirmation_email" value="1" /><label for="confirmation_email">{#sender_confirmation_caption#}</label>
</div>
{/if}
<div>
<input type="submit" name="message_submit" value="{#message_submit_caption#}" onclick="document.getElementById('throbber-submit').classList.remove('js-visibility-hidden');" />
<img id="throbber-submit" class="js-visibility-hidden" src="{$THEMES_DIR}/{$theme}/images/throbber_submit.gif" alt="" width="16" height="16" />
</div>
</form>
{/if}

View file

@ -12,14 +12,14 @@
{/if}
{if $user_type==2}
{assign var=admin_title value=$smarty.config.administrator_title}
{assign var=name value="<span class=\"admin registered_user\" title=\"$admin_title\">$name</span>"}
{assign var=name value="<span class=\"author-name admin registered_user\" title=\"$admin_title\">$name</span>"}
{elseif $user_type==1}
{assign var=mod_title value=$smarty.config.moderator_title}
{assign var=name value="<span class=\"mod registered_user\" title=\"$mod_title\">$name</span>"}
{assign var=name value="<span class=\"author-name mod registered_user\" title=\"$mod_title\">$name</span>"}
{elseif $posting_user_id>0}
{assign var=name value="<span class=\"registered_user\">$name</span>"}
{assign var=name value="<span class=\"author-name registered_user\">$name</span>"}
{else}
{assign var=name value="$name"}
{assign var=name value="<span class=\"author-name\">$name</span>"}
{/if}
{if (($settings.user_area_access == 0 and ($admin or $mod)) or ($settings.user_area_access == 1 and $user) or $settings.user_area_access == 2) && $posting_user_id>0}
{assign var=name value="<a href=\"index.php?mode=user&amp;show_user=$posting_user_id\">$name</a>"}
@ -28,8 +28,9 @@
<header class="header">{if $spam}<p class="notice spam">{#spam_note#}</p>{/if}
{if $avatar}<img class="avatar" src="{$avatar.image}" alt="{#avatar_img_alt#}" width="{$avatar.width}" height="{$avatar.height}" />{/if}
<h1>{$subject}{if $category_name} <span class="category">({$category_name})</span>{/if}</h1>
<p class="author">{*{assign var=formated_time value=$disp_time|date_format:#time_format_full#}*}{if $location}{#posted_by_location#|replace:"[name]":$name|replace:"[email_hp]":$email_hp|replace:"[location]":$location|replace:"[time]":$formated_time}{else}{#posted_by#|replace:"[name]":$name|replace:"[email_hp]":$email_hp|replace:"[time]":$formated_time}{/if} <span class="ago">({if $ago.days>1}{#posting_several_days_ago#|replace:"[days]":$ago.days_rounded}{else}{if $ago.days==0 && $ago.hours==0}{#posting_minutes_ago#|replace:"[minutes]":$ago.minutes}{elseif $ago.days==0 && $ago.hours!=0}{#posting_hours_ago#|replace:"[hours]":$ago.hours|replace:"[minutes]":$ago.minutes}{else}{#posting_one_day_ago#|replace:"[hours]":$ago.hours|replace:"[minutes]":$ago.minutes}{/if}{/if})</span>{if $admin && $ip} <span class="ip">({$ip})</span>{/if}{if $pid!=0} <span class="op-link"><a href="index.php?id={$pid}" title="{#original_posting_linktitle#|replace:"[name]":$data.$pid.name}">@ {$data.$pid.name}</a></span>{/if}{if $edited}{*{assign var=formated_edit_time value=$edit_time|date_format:#time_format_full#}*}<br />
<span class="edited">{#edited_by#|replace:"[name]":$edited_by|replace:"[time]":$formated_edit_time}</span>{/if}</p>
<p class="author">{if $location}{#posted_by_location#|replace:"[name]":$name|replace:"[email_hp]":$email_hp|replace:"[location]":$location}{else}{#posted_by#|replace:"[name]":$name|replace:"[email_hp]":$email_hp}{/if} <time datetime="{$ISO_time}">{*{assign var=formated_time value=$disp_time|date_format:#time_format_full#}*}{$formated_time}</time> <span class="ago">({if $ago.days>1}{#posting_several_days_ago#|replace:"[days]":$ago.days_rounded}{else}{if $ago.days==0 && $ago.hours==0}{#posting_minutes_ago#|replace:"[minutes]":$ago.minutes}{elseif $ago.days==0 && $ago.hours!=0}{#posting_hours_ago#|replace:"[hours]":$ago.hours|replace:"[minutes]":$ago.minutes}{else}{#posting_one_day_ago#|replace:"[hours]":$ago.hours|replace:"[minutes]":$ago.minutes}{/if}{/if})</span>{if $admin && $ip} <span class="ip">({$ip})</span>{/if}{if $pid!=0} <span class="op-link"><a href="index.php?id={$pid}" title="{#original_posting_linktitle#|replace:"[name]":$data.$pid.name}">@ {$data.$pid.name}</a></span>{/if}
{if $edited}{*{assign var=formated_edit_time value=$edit_time|date_format:#time_format_full#}*}<br />
<span class="edited">{#edited_by#|replace:"[name]":$edited_by}, <time datetime="{$edit_ISO_time}">{$formated_edit_time}</time></span>{/if}</p>
</header>
<div class="wrapper">
<div class="body">
@ -76,19 +77,24 @@
<ul class="thread openthread">
{function name=tree level=0}
<li>{if $data.$element.id!=$id}<a class="{if $data.$element.pid==0&&$data.$element.new}threadnew{elseif $data.$element.pid==0}thread{elseif $data.$element.pid!=0&&$data.$element.new}replynew{else}reply{/if}{if $data.$element.is_read} read{/if}" href="index.php?id={$data.$element.id}">{$data.$element.subject}</a>{else}<span class="{if $data.$element.pid==0}{if $data.$element.new}currentthreadnew{else}currentthread{/if}{else}{if $data.$element.new}currentreplynew{else}currentreply{/if}{/if}">{$data.$element.subject}</span>{/if}{if $data.$element.no_text} <img class="no-text" src="{$THEMES_DIR}/{$theme}/images/no_text.png" title="{#no_text_title#}" alt="[ {#no_text_alt#} ]" width="11" height="9" />{/if} -
<li>{if $data.$element.id!=$id}<a class="subject {if $data.$element.pid==0&&$data.$element.new}threadnew{elseif $data.$element.pid==0}thread{elseif $data.$element.pid!=0&&$data.$element.new}replynew{else}reply{/if}{if $data.$element.is_read} read{/if}" href="index.php?id={$data.$element.id}">{$data.$element.subject}</a>{else}<span class="{if $data.$element.pid==0}{if $data.$element.new}currentthreadnew{else}currentthread{/if}{else}{if $data.$element.new}currentreplynew{else}currentreply{/if}{/if}">{$data.$element.subject}</span>{/if}
<span class="metadata">
{if $data.$element.user_type==2}
<strong class="admin registered_user">{$data.$element.name}</strong>,
<span class="author-name admin registered_user" title="{#administrator_title#}">{$data.$element.name}</span>
{elseif $data.$element.user_type==1}
<strong class="mod registered_user">{$data.$element.name}</strong>,
<span class="author-name mod registered_user" title="{#moderator_title#}">{$data.$element.name}</span>
{elseif $data.$element.user_id>0}
<strong class="registered_user">{$data.$element.name}</strong>,
<span class="author-name registered_user">{$data.$element.name}</span>
{else}
<strong>{$data.$element.name}</strong>,
<span class="author-name">{$data.$element.name}</span>
{/if}
<span id="p{$data.$element.id}" class="tail">{$data.$element.formated_time}{if $data.$element.pid==0} <a href="index.php?mode=thread&amp;id={$data.$element.id}" title="{#open_whole_thread#}"><img src="{$THEMES_DIR}/{$theme}/images/complete_thread.png" title="{#open_whole_thread#}" alt="[*]" width="11" height="11" /></a>{/if}{if $admin || $mod} {if $data.$element.not_classified_spam_ham==1}<a><img src="{$THEMES_DIR}/{$theme}/images/keep_eye_on.png" title="{#unclassified_linktitle#}" alt="[!]" width="14" height="11" /></a>{/if} <a id="marklink_{$data.$element.id}" href="index.php?mode=posting&amp;mark={$data.$element.id}&amp;back={$id}" title="{#mark_linktitle#}" onclick="mark({$data.$element.id},'{$THEMES_DIR}/{$theme}/images/marked.png','{$THEMES_DIR}/{$theme}/images/unmarked.png','{$THEMES_DIR}/{$theme}/images/mark_process.png','{#mark_linktitle#}','{#unmark_linktitle#}'); return false">{if $data.$element.marked==0}<img id="markimg_{$data.$element.id}" src="{$THEMES_DIR}/{$theme}/images/unmarked.png" title="{#mark_linktitle#}" alt="[○]" width="11" height="11" />{else}<img id="markimg_{$data.$element.id}" src="{$THEMES_DIR}/{$theme}/images/marked.png" title="{#unmark_linktitle#}" alt="[●]" width="11" height="11" title="{#unmark_linktitle#}" />{/if}</a> <a href="index.php?mode=posting&amp;delete_posting={$data.$element.id}&amp;csrf_token={$CSRF_TOKEN}&amp;back=entry" title="{#delete_posting_title#}" onclick="return delete_posting_confirm(this, '{$smarty.config.delete_posting_confirm|escape:"url"}')"><img src="{$THEMES_DIR}/{$theme}/images/delete_posting.png" alt="[x]" width="9" height="9" /></a>{/if}</span>
<span id="p{$data.$element.id}" class="tail">
<time datetime="{$data.$element.ISO_time}">{$data.$element.formated_time}</time>
{if $data.$element.no_text} <img class="no-text" src="{$THEMES_DIR}/{$theme}/images/no_text.png" title="{#no_text_title#}" alt="[ {#no_text_alt#} ]" width="11" height="9" />{/if}{if $data.$element.pid==0} <a href="index.php?mode=thread&amp;id={$data.$element.id}" title="{#open_whole_thread#}"><img src="{$THEMES_DIR}/{$theme}/images/complete_thread.png" title="{#open_whole_thread#}" alt="[*]" width="11" height="11" /></a>{/if}{if $admin || $mod} {if $data.$element.not_classified_spam_ham==1}<a><img src="{$THEMES_DIR}/{$theme}/images/keep_eye_on.png" title="{#unclassified_linktitle#}" alt="[!]" width="14" height="11" /></a>{/if} <a id="marklink_{$data.$element.id}" href="index.php?mode=posting&amp;mark={$data.$element.id}&amp;back={$id}" title="{#mark_linktitle#}" onclick="mark({$data.$element.id},'{$THEMES_DIR}/{$theme}/images/marked.png','{$THEMES_DIR}/{$theme}/images/unmarked.png','{$THEMES_DIR}/{$theme}/images/mark_process.png','{#mark_linktitle#}','{#unmark_linktitle#}'); return false">{if $data.$element.marked==0}<img id="markimg_{$data.$element.id}" src="{$THEMES_DIR}/{$theme}/images/unmarked.png" title="{#mark_linktitle#}" alt="[○]" width="11" height="11" />{else}<img id="markimg_{$data.$element.id}" src="{$THEMES_DIR}/{$theme}/images/marked.png" title="{#unmark_linktitle#}" alt="[●]" width="11" height="11" title="{#unmark_linktitle#}" />{/if}</a> <a href="index.php?mode=posting&amp;delete_posting={$data.$element.id}&amp;csrf_token={$CSRF_TOKEN}&amp;back=entry" title="{#delete_posting_title#}" onclick="return delete_posting_confirm(this, '{$smarty.config.delete_posting_confirm|escape:"url"}')"><img src="{$THEMES_DIR}/{$theme}/images/delete_posting.png" alt="[x]" width="9" height="9" /></a>{/if}
</span>
</span>
{if is_array($child_array[$element])}
<ul class="{if $level<$settings.deep_reply}reply{elseif $level>=$settings.deep_reply&&$level<$settings.very_deep_reply}deep-reply{else}very-deep-reply{/if}">{foreach from=$child_array[$element] item=child}{tree element=$child level=$level+1}{/foreach}</ul>{/if}</li>
{/function}

View file

@ -1,7 +1,7 @@
<p class="notice caution">{#error_headline#}</p>
<ul>
<p class="notice caution">{#error_headline#}</p>
<ul>
{section name=mysec loop=$errors}
{assign var="error" value=$errors[mysec]}
<li>{$smarty.config.$error}</li>
<li>{$smarty.config.$error}</li>
{/section}
</ul>
</ul>

View file

@ -1,7 +1,6 @@
{if $tag_cloud || $latest_postings || $admin || $mod}
<div id="main-grid" class="threaded">
<div id="sidebar"{if $usersettings.sidebar==0} class="js-display-fold"{/if}>
<a href="index.php?toggle_sidebar=true"><img id="sidebartoggle" class="{if $usersettings.sidebar==0}show-sidebar{else}hide-sidebar{/if}" src="{$THEMES_DIR}/{$theme}/images/plain.png" title="{#toggle_sidebar#}" alt="[+/-]" width="9" height="9" /></a>
<h2 class="sidebar"><a href="index.php?toggle_sidebar=true" title="{#toggle_sidebar#}">{#sidebar#}</a></h2>
<div id="sidebarcontent">
{if $latest_postings}
@ -43,8 +42,25 @@
{foreach from=$threads item=thread}
<ul id="thread-{$thread}" class="thread {if $fold_threads==1}folded{else}expanded{/if}">
{function name=tree level=0}
<li><a class="{if $data.$element.pid==0 && $data.$element.new}{if $data.$element.sticky>0 && $data.$element.locked==1}threadnew-sticky-locked{elseif $data.$element.sticky>0}threadnew-sticky{elseif $data.$element.locked==1}threadnew-locked{else}threadnew{/if}{elseif $data.$element.pid==0}{if $data.$element.sticky>0 && $data.$element.locked==1}thread-sticky-locked{elseif $data.$element.sticky>0}thread-sticky{elseif $data.$element.locked==1}thread-locked{else}thread{/if}{elseif $data.$element.pid!=0 && $data.$element.new}replynew{else}reply{/if}{if $data.$element.is_read} read{/if}" href="index.php?id={$data.$element.id}"{if $data.$element.spam==1} title="{#spam#}"{/if}>{if $data.$element.spam==1}<span class="spam">{$data.$element.subject}</span>{else}{$data.$element.subject}{/if}</a>{if $data.$element.no_text} <img class="no-text" src="{$THEMES_DIR}/{$theme}/images/no_text.png" title="{#no_text_title#}" alt="{#no_text_alt#}" width="11" height="9" />{/if} - <strong>{if $data.$element.user_type==2}<span class="admin registered_user" title="{#administrator_title#}">{$data.$element.name}</span>{elseif $data.$element.user_type==1}<span class="mod registered_user" title="{#moderator_title#}">{$data.$element.name}</span>{elseif $data.$element.user_id>0}<span class="registered_user">{$data.$element.name}</span>{else}{$data.$element.name}{/if}</strong>, <span id="p{$data.$element.id}" class="tail">{$data.$element.formated_time}{if $data.$element.pid==0} <a href="index.php?mode=thread&amp;id={$data.$element.id}" title="{#open_whole_thread#}"><img src="{$THEMES_DIR}/{$theme}/images/complete_thread.png" title="{#open_whole_thread#}" alt="[*]" width="11" height="11" /></a>{/if}{if $admin || $mod} {if $data.$element.not_classified_spam_ham==1}<a><img src="{$THEMES_DIR}/{$theme}/images/keep_eye_on.png" title="{#unclassified_linktitle#}" alt="[!]" width="14" height="11" /></a>{/if} <a id="marklink_{$data.$element.id}" href="index.php?mode=posting&amp;mark={$data.$element.id}" title="{#mark_linktitle#}">{if $data.$element.marked==0}<img id="markimg_{$data.$element.id}" src="{$THEMES_DIR}/{$theme}/images/unmarked.png" title="{#mark_linktitle#}" alt="[○]" width="11" height="11" />{else}<img id="markimg_{$data.$element.id}" src="{$THEMES_DIR}/{$theme}/images/marked.png" title="{#unmark_linktitle#}" alt="[●]" width="11" height="11" />{/if}</a> <a href="index.php?mode=posting&amp;delete_posting={$data.$element.id}&amp;csrf_token={$CSRF_TOKEN}&amp;back=index" title="{#delete_posting_title#}"><img src="{$THEMES_DIR}/{$theme}/images/delete_posting.png" title="{#delete_posting_title#}" alt="[x]" width="9" height="9" /></a>{/if}
{if $data.$element.category_name && $data.$element.pid==0 && $category<=0} <a href="index.php?mode=index&amp;category={$data.$element.category}" title="{#change_category_link#|replace:"[category]":$data.$element.category_name|escape:"html"}"><span class="category">({$data.$element.category_name})</span></a>{/if}{if $fold_threads==1 && $data.$element.pid==0 && $replies.$thread>0} <span class="replies" title="{*{if $replies.$thread==0}{#no_replies#}*}{if $replies.$thread==1}{#one_reply#}{else}{$smarty.config.several_replies|replace:"[replies]":$replies.$thread}{/if}">({$replies.$thread})</span>{/if}</span>
<li><a class="subject {if $data.$element.pid==0 && $data.$element.new}{if $data.$element.sticky>0 && $data.$element.locked==1}threadnew-sticky-locked{elseif $data.$element.sticky>0}threadnew-sticky{elseif $data.$element.locked==1}threadnew-locked{else}threadnew{/if}{elseif $data.$element.pid==0}{if $data.$element.sticky>0 && $data.$element.locked==1}thread-sticky-locked{elseif $data.$element.sticky>0}thread-sticky{elseif $data.$element.locked==1}thread-locked{else}thread{/if}{elseif $data.$element.pid!=0 && $data.$element.new}replynew{else}reply{/if}{if $data.$element.is_read} read{/if}" href="index.php?id={$data.$element.id}"{if $data.$element.spam==1} title="{#spam#}"{/if}>{if $data.$element.spam==1}<span class="spam">{$data.$element.subject}</span>{else}{$data.$element.subject}{/if}</a>
<span class="metadata">
{if $data.$element.user_type==2}
<span class="author-name admin registered_user" title="{#administrator_title#}">{$data.$element.name}</span>
{elseif $data.$element.user_type==1}
<span class="author-name mod registered_user" title="{#moderator_title#}">{$data.$element.name}</span>
{elseif $data.$element.user_id>0}
<span class="author-name registered_user">{$data.$element.name}</span>
{else}
<span class="author-name">{$data.$element.name}</span>
{/if}
<span id="p{$data.$element.id}" class="tail">
<time datetime="{$data.$element.ISO_time}">{$data.$element.formated_time}</time>
{if $data.$element.no_text} <img class="no-text" src="{$THEMES_DIR}/{$theme}/images/no_text.png" title="{#no_text_title#}" alt="{#no_text_alt#}" width="11" height="9" />{/if}{if $data.$element.pid==0} <a href="index.php?mode=thread&amp;id={$data.$element.id}" title="{#open_whole_thread#}"><img src="{$THEMES_DIR}/{$theme}/images/complete_thread.png" title="{#open_whole_thread#}" alt="[*]" width="11" height="11" /></a>{/if}{if $admin || $mod} {if $data.$element.not_classified_spam_ham==1}<a><img src="{$THEMES_DIR}/{$theme}/images/keep_eye_on.png" title="{#unclassified_linktitle#}" alt="[!]" width="14" height="11" /></a>{/if} <a id="marklink_{$data.$element.id}" href="index.php?mode=posting&amp;mark={$data.$element.id}" title="{#mark_linktitle#}">{if $data.$element.marked==0}<img id="markimg_{$data.$element.id}" src="{$THEMES_DIR}/{$theme}/images/unmarked.png" title="{#mark_linktitle#}" alt="[○]" width="11" height="11" />{else}<img id="markimg_{$data.$element.id}" src="{$THEMES_DIR}/{$theme}/images/marked.png" title="{#unmark_linktitle#}" alt="[●]" width="11" height="11" />{/if}</a> <a href="index.php?mode=posting&amp;delete_posting={$data.$element.id}&amp;csrf_token={$CSRF_TOKEN}&amp;back=index" title="{#delete_posting_title#}"><img src="{$THEMES_DIR}/{$theme}/images/delete_posting.png" title="{#delete_posting_title#}" alt="[x]" width="9" height="9" /></a>{/if}
{if $data.$element.category_name && $data.$element.pid==0 && $category<=0} <a href="index.php?mode=index&amp;category={$data.$element.category}" title="{#change_category_link#|replace:"[category]":$data.$element.category_name|escape:"html"}"><span class="category">({$data.$element.category_name})</span></a>{/if}{if $fold_threads==1 && $data.$element.pid==0 && $replies.$thread>0} <span class="replies" title="{*{if $replies.$thread==0}{#no_replies#}*}{if $replies.$thread==1}{#one_reply#}{else}{$smarty.config.several_replies|replace:"[replies]":$replies.$thread}{/if}">({$replies.$thread})</span>{/if}
</span>
</span>
{if is_array($child_array[$element])}
<ul class="{if $level<$settings.deep_reply}reply{elseif $level>=$settings.deep_reply&&$level<$settings.very_deep_reply}deep-reply{else}very-deep-reply{/if}{if $fold_threads==1} js-display-none{/if}">{foreach from=$child_array[$element] item=child}{tree element=$child level=$level+1}{/foreach}</ul>{/if}</li>{/function}
{tree element=$thread}

View file

@ -20,15 +20,20 @@
<td class="subject">
<ul id="thread-{$thread}" class="thread {if $fold_threads==1}folded{else}expanded{/if}">
{function name=tree level=0}
<li><a class="{if $data.$element.pid==0 && $data.$element.new}{if $data.$element.sticky>0 && $data.$element.locked==1}threadnew-sticky-locked{elseif $data.$element.sticky>0}threadnew-sticky{elseif $data.$element.locked==1}threadnew-locked{else}threadnew{/if}{elseif $data.$element.pid==0}{if $data.$element.sticky>0 && $data.$element.locked==1}thread-sticky-locked{elseif $data.$element.sticky>0}thread-sticky{elseif $data.$element.locked==1}thread-locked{else}thread{/if}{elseif $data.$element.pid!=0 && $data.$element.new}replynew{else}reply{/if}{if $data.$element.is_read} read{/if}" href="index.php?mode=thread&amp;id={$data.$element.tid}{if $data.$element.pid!=0}#p{$data.$element.id}{/if}" title="{$data.$element.name}, {$data.$element.formated_time}">{if $data.$element.spam==1}<span class="spam">{$data.$element.subject}</span>{else}{$data.$element.subject}{/if}</a>{if $data.$element.no_text} <img class="no-text" src="{$THEMES_DIR}/{$theme}/images/no_text.png" title="{#no_text_title#}" alt="[ {#no_text_alt#} ]" width="11" height="9" />{/if}<span id="p{$data.$element.id}" class="tail">{if $admin || $mod} {if $data.$element.not_classified_spam_ham==1}<a><img src="{$THEMES_DIR}/{$theme}/images/keep_eye_on.png" title="{#unclassified_linktitle#}" alt="[!]" width="14" height="11" /></a>{/if} <a id="marklink_{$data.$element.id}" href="index.php?mode=posting&amp;mark={$data.$element.id}" title="{#mark_linktitle#}">{if $data.$element.marked==0}<img id="markimg_{$data.$element.id}" src="{$THEMES_DIR}/{$theme}/images/unmarked.png" title="{#mark_linktitle#}" alt="[○]" width="11" height="11" />{else}<img id="markimg_{$data.$element.id}" src="{$THEMES_DIR}/{$theme}/images/marked.png" title="{#unmark_linktitle#}" alt="[●]" width="11" height="11" />{/if}</a> <a href="index.php?mode=posting&amp;delete_posting={$data.$element.id}&amp;csrf_token={$CSRF_TOKEN}&amp;back=index" title="{#delete_posting_title#}"><img src="{$THEMES_DIR}/{$theme}/images/delete_posting.png" title="{#delete_posting_title#}" alt="[x]" width="9" height="9" /></a>{/if}</span>
<li><a class="subject {if $data.$element.pid==0 && $data.$element.new}{if $data.$element.sticky>0 && $data.$element.locked==1}threadnew-sticky-locked{elseif $data.$element.sticky>0}threadnew-sticky{elseif $data.$element.locked==1}threadnew-locked{else}threadnew{/if}{elseif $data.$element.pid==0}{if $data.$element.sticky>0 && $data.$element.locked==1}thread-sticky-locked{elseif $data.$element.sticky>0}thread-sticky{elseif $data.$element.locked==1}thread-locked{else}thread{/if}{elseif $data.$element.pid!=0 && $data.$element.new}replynew{else}reply{/if}{if $data.$element.is_read} read{/if}" href="index.php?mode=thread&amp;id={$data.$element.tid}{if $data.$element.pid!=0}#p{$data.$element.id}{/if}" title="{$data.$element.name}, {$data.$element.formated_time}">{if $data.$element.spam==1}<span class="spam">{$data.$element.subject}</span>{else}{$data.$element.subject}{/if}</a>
<span class="metadata">
<span id="p{$data.$element.id}" class="tail">
{if $data.$element.no_text}<a><img class="no-text" src="{$THEMES_DIR}/{$theme}/images/no_text.png" title="{#no_text_title#}" alt="[ {#no_text_alt#} ]" width="11" height="9" /></a>{/if}{if $admin || $mod} {if $data.$element.not_classified_spam_ham==1}<a><img src="{$THEMES_DIR}/{$theme}/images/keep_eye_on.png" title="{#unclassified_linktitle#}" alt="[!]" width="14" height="11" /></a>{/if} <a id="marklink_{$data.$element.id}" href="index.php?mode=posting&amp;mark={$data.$element.id}" title="{#mark_linktitle#}">{if $data.$element.marked==0}<img id="markimg_{$data.$element.id}" src="{$THEMES_DIR}/{$theme}/images/unmarked.png" title="{#mark_linktitle#}" alt="[○]" width="11" height="11" />{else}<img id="markimg_{$data.$element.id}" src="{$THEMES_DIR}/{$theme}/images/marked.png" title="{#unmark_linktitle#}" alt="[●]" width="11" height="11" />{/if}</a> <a href="index.php?mode=posting&amp;delete_posting={$data.$element.id}&amp;csrf_token={$CSRF_TOKEN}&amp;back=index" title="{#delete_posting_title#}"><img src="{$THEMES_DIR}/{$theme}/images/delete_posting.png" title="{#delete_posting_title#}" alt="[x]" width="9" height="9" /></a>{/if}</span>
</span>
{if is_array($child_array[$element])}
<ul class="{if $level<$settings.deep_reply}reply{elseif $level>=$settings.deep_reply&&$level<$settings.very_deep_reply}deep-reply{else}very-deep-reply{/if}{if $fold_threads==1} js-display-none{/if}">{foreach from=$child_array[$element] item=child}{tree element=$child level=$level+1}{/foreach}</ul>{/if}</li>
{/function}
{tree element=$thread}
</ul>
</td>
<td><span class="small nowrap">{if $data.$thread.user_type==2}<span class="admin registered_user" title="{#administrator_title#}">{$data.$thread.name}</span>{elseif $data.$thread.user_type==1}<span class="mod registered_user" title="{#moderator_title#}">{$data.$thread.name}</span>{elseif $data.$thread.user_id>0}<span class="registered_user">{$data.$thread.name}</span>{else}{$data.$thread.name}{/if}</span></td>
<td><span class="small nowrap">{$data.$thread.formated_time}</span></td>
<td><span class="small nowrap">{if $data.$thread.user_type==2}<span class="author-name admin registered_user" title="{#administrator_title#}">{$data.$thread.name}</span>{elseif $data.$thread.user_type==1}<span class="author-name mod registered_user" title="{#moderator_title#}">{$data.$thread.name}</span>{elseif $data.$thread.user_id>0}<span class="author-name registered_user">{$data.$thread.name}</span>{else}<span class="author-name">{$data.$thread.name}</span>{/if}</span></td>
<td><span class="small nowrap"><time datetime="{$data.$thread.ISO_time}">{$data.$thread.formated_time}</time></span></td>
{if $settings.count_views}<td><span class="small">{$total_views.$thread}</span></td>{/if}
<td><span class="small">{$replies.$thread}</span></td>
{if $categories && $category<=0}<td>{if $data.$thread.category_name}<a href="index.php?mode=index&amp;category={$data.$thread.category}" title="{#change_category_link#|replace:"[category]":$data.$thread.category_name|escape:"html"}"><span class="category nowrap">{$data.$thread.category_name}</span></a>{else}&nbsp;{/if}</td>{/if}
@ -50,7 +55,6 @@
{if $tag_cloud || $latest_postings || $admin || $mod}
<div id="sidebar"{if $usersettings.sidebar==0} class="js-display-fold"{/if}>
<a href="index.php?toggle_sidebar=true"><img id="sidebartoggle" class="{if $usersettings.sidebar==0}show-sidebar{else}hide-sidebar{/if}" src="{$THEMES_DIR}/{$theme}/images/plain.png" title="{#toggle_sidebar#}" alt="[+/-]" width="9" height="9" /></a>
<h2 class="sidebar"><a href="index.php?toggle_sidebar=true" title="{#toggle_sidebar#}">{#sidebar#}</a></h2>
<div id="sidebarcontent">
{if $latest_postings}

View file

@ -1,6 +1,6 @@
{if $lang_section}{config_load file=$language_file section=$lang_section}{/if}
{if $custom_message}
<p>{$custom_message}</p>
<p>{$custom_message}</p>
{elseif $message}
<p>{$smarty.config.$message|replace:"[var]":$var}</p>
<p>{$smarty.config.$message|replace:"[var]":$var}</p>
{/if}

View file

@ -1,24 +1,34 @@
{config_load file=$language_file section="login"}
{if $ip_temporarily_blocked}
{#login_message#}
<p class="notice caution">{#login_ip_temp_blocked#}</p>
<p class="notice caution">{#login_ip_temp_blocked#}</p>
{else}
{if $login_message && $smarty.config.$login_message}
<p class="notice {if $login_message=='account_activated' || $login_message=='mail_sent' || $login_message=='pw_sent'}ok{else}caution{/if}">{$smarty.config.$login_message}</p>
<p class="notice {if $login_message=='account_activated' || $login_message=='mail_sent' || $login_message=='pw_sent'}ok{else}caution{/if}">{$smarty.config.$login_message}</p>
{/if}
<form action="index.php" method="post" accept-charset="{#charset#}">
<div>
<input type="hidden" name="mode" value="{$mode}" />
{if $back}<input type="hidden" name="back" value="{$back}" />{/if}
{if $id}<input type="hidden" name="id" value="{$id}" />{/if}
<p><label for="login" class="main">{#login_username#}</label><br /><input id="login" class="login" type="text" name="username" size="25" /></p>
<p><label for="password" class="main">{#login_password#}</label><br /><input id="password" class="login" type="password" name="userpw" spellcheck="false" autocomplete="off" size="25" /></p>
<div id="card">
<p>{#login_advice#}</p>
<form action="index.php" method="post" accept-charset="{#charset#}">
<input type="hidden" name="mode" value="{$mode}" />
{if $back} <input type="hidden" name="back" value="{$back}" />{/if}
{if $id} <input type="hidden" name="id" value="{$id}" />{/if}
<div>
<label for="login" class="main">{#login_username#}</label>
<input id="login" class="login" type="text" name="username" size="25" required />
</div>
<div>
<label for="password" class="main">{#login_password#}</label>
<input id="password" class="login" type="password" name="userpw" spellcheck="false" autocomplete="off" writingsuggestions="false" size="25" required />
</div>
{if $settings.autologin==1}
<p class="small"><input id="autologin" type="checkbox" name="autologin_checked" value="true" /> <label for="autologin">{#login_auto#}</label></p>
<div class="normalform">
<input id="autologin" type="checkbox" name="autologin_checked" value="true" /><label for="autologin">{#login_auto#}</label>
</div>
{/if}
<p><input type="submit" value="{#login_submit#}" /></p>
</div>
</form>
<p class="small">{#login_advice#}</p>
<p class="small"><a href="index.php?mode=login&amp;action=pw_forgotten">{#pw_forgotten_link#}</a></p>
<div class="buttonbar">
<button value="{#login_submit#}">{#login_submit#}</button>
<p><a href="index.php?mode=login&amp;action=pw_forgotten">{#pw_forgotten_link#}</a></p>
</div>
</form>
</div>
{/if}

View file

@ -1,9 +1,14 @@
{config_load file=$language_file section="pw_forgotten"}
<p>{#pw_forgotten_exp#}</p>
<form action="index.php" method="post" accept-charset="{#charset#}">
<div>
<input type="hidden" name="mode" value="login" />
<p><label for="pwf_email" class="main">{#pwf_email#}</label><br />
<input id="pwf_email" type="text" name="pwf_email" size="30" /> <input type="submit" name="pwf_submit" value="{#submit_button_ok#}" /></p>
</div>
</form>
<div id="card">
<p>{#pw_forgotten_exp#}</p>
<form action="index.php" method="post" accept-charset="{#charset#}">
<input type="hidden" name="mode" value="login" />
<div>
<label for="pwf_email" class="main">{#pwf_email#}</label>
<input id="pwf_email" type="email" name="pwf_email" size="30" autofocus required />
</div>
<div class="buttonbar">
<button name="pwf_submit" value="{#submit_button_ok#}">{#submit_button_ok#}</button>
</div>
</form>
</div>

View file

@ -1,5 +1,5 @@
{config_load file=$language_file section="posting"}
{config_load file=$language_file section="thread_entry"}
{config_load file=$language_file section="user"}
{if $captcha}{config_load file=$language_file section="captcha"}{/if}
{if $no_authorisation}
<p class="notice caution">{$smarty.config.$no_authorisation|replace:"[minutes]":$settings.edit_period}</p>
@ -16,7 +16,7 @@
<p class="notice caution">{#error_headline#}</p>
<ul style="margin-bottom:25px;">
{section name=mysec loop=$errors}
<li>{assign var="error" value=$errors[mysec]}{$smarty.config.$error|replace:"[text_length]":$text_length|replace:"[text_maxlength]":$settings.text_maxlength|replace:"[word]":$word|replace:"[minutes]":$minutes|replace:"[not_accepted_word]":$not_accepted_word|replace:"[not_accepted_words]":$not_accepted_words}</li>
<li>{assign var="error" value=$errors[mysec]}{$smarty.config.$error|replace:"[text_length]":$text_length|replace:"[text_maxlength]":$settings.text_maxlength|replace:"[word]":$word|replace:"[minutes]":$minutes|replace:"[not_accepted_word]":$not_accepted_word|replace:"[not_accepted_words]":$not_accepted_words}</li>
{/section}
</ul>
{elseif isset($minutes_left_to_edit)}
@ -25,11 +25,11 @@
{if $preview}
{if $preview_hp && !$email}
{assign var=email_hp value=" <a href=\"$preview_hp\"><img src=\"$THEMES_DIR/$theme/images/homepage.png\" alt=\"$homepage_alt\" width=\"13\" height=\"13\" /></a>"}
{assign var=email_hp value=" <a href=\"$preview_hp\"><img src=\"$THEMES_DIR/$theme/images/homepage.png\" alt=\"{#homepage#}\" width=\"13\" height=\"13\" /></a>"}
{elseif !$preview_hp && $email}
{assign var=email_hp value=" <a href=\"index.php?mode=contact&amp;id=$id\"><img src=\"$THEMES_DIR/$theme/images/email.png\" alt=\"$email_alt\" width=\"13\" height=\"10\" /></a>"}
{assign var=email_hp value=" <a href=\"index.php?mode=contact&amp;id=$id\"><img src=\"$THEMES_DIR/$theme/images/email.png\" alt=\"{#email#}\" width=\"13\" height=\"10\" /></a>"}
{elseif $preview_hp && $email}
{assign var=email_hp value=" <a href=\"$preview_hp\"><img src=\"$THEMES_DIR/$theme/images/homepage.png\" alt=\"$homepage_alt\" width=\"13\" height=\"13\" /></a> <a href=\"index.php?mode=contact&amp;id=$id\"><img src=\"$THEMES_DIR/$theme/images/email.png\" alt=\"$email_alt\" width=\"13\" height=\"10\" /></a>"}
{assign var=email_hp value=" <a href=\"$preview_hp\"><img src=\"$THEMES_DIR/$theme/images/homepage.png\" alt=\"{#homepage#}\" width=\"13\" height=\"13\" /></a> <a href=\"index.php?mode=contact&amp;id=$id\"><img src=\"$THEMES_DIR/$theme/images/email.png\" alt=\"{#email#}\" width=\"13\" height=\"10\" /></a>"}
{else}
{assign var=email_hp value=""}
{/if}
@ -38,9 +38,9 @@
<div class="posting">
<div class="header">
<h1 class="postingheadline">{$preview_subject}{if $category_name} <span class="category">({$category_name})</span>{/if}</h1>
<p class="author">{if $preview_location}{#posted_by_location#|replace:"[name]":$preview_name|replace:"[email_hp]":$email_hp|replace:"[location]":$preview_location|replace:"[time]":$preview_formated_time}{else}{#posted_by#|replace:"[name]":$preview_name|replace:"[email_hp]":$email_hp|replace:"[time]":$preview_formated_time}{/if}</p>
<p class="author">{if $preview_location}{#posted_by_location#|replace:"[name]":$preview_name|replace:"[email_hp]":$email_hp|replace:"[location]":$preview_location}{else}{#posted_by#|replace:"[name]":$preview_name|replace:"[email_hp]":$email_hp}{/if}<time datetime="{$preview_ISO_time}">{$preview_formated_time}</time></p>
</div>
<div class=""wrapper">
<div class="wrapper">
<div class="body">{if $preview_text}{$preview_text}{else}<p>{#no_text#}</p>{/if}</div>
{if $preview_signature && $show_signature==1}
<div class="signature"><p>---<br />
@ -52,91 +52,82 @@
</div>
{/if}
<form action="index.php" method="post" id="postingform" accept-charset="{#charset#}">
<div>
<input type="hidden" name="csrf_token" value="{$CSRF_TOKEN}" />
<input type="hidden" name="back" value="{$back}" />
<input type="hidden" name="mode" value="{$mode}" />
<input type="hidden" name="id" value="{$id}" />
<input type="hidden" name="uniqid" value="{$uniqid}" />
<input type="hidden" name="posting_mode" value="{$posting_mode}" />
{if $session}
<input type="hidden" name="{$session.name}" value="{$session.id}" />
{/if}
<input type="hidden" name="csrf_token" value="{$CSRF_TOKEN}" />
<input type="hidden" name="back" value="{$back}" />
<input type="hidden" name="mode" value="{$mode}" />
<input type="hidden" name="id" value="{$id}" />
<input type="hidden" name="uniqid" value="{$uniqid}" />
<input type="hidden" name="posting_mode" value="{$posting_mode}" />
{if $session} <input type="hidden" name="{$session.name}" value="{$session.id}" />{/if}
{if $quote}
<input type="hidden" id="quote" value="true" />
{/if}
{if $form_type==0}
<input type="hidden" id="name_required" value="true" />
{/if}
{if !$settings.empty_postings_possible}
<input type="hidden" id="text_required" value="true" />
{/if}
{if $terms_of_use_agreement}
<input type="hidden" id="terms_of_use_required" value="true" />
{/if}
{if $data_privacy_agreement}
<input type="hidden" id="data_privacy_agreement_required" value="true" />
{/if}
{if $quote} <input type="hidden" id="quote" value="true" />{/if}
{if $form_type==0} <input type="hidden" id="name_required" value="true" />{/if}
{if !$settings.empty_postings_possible} <input type="hidden" id="text_required" value="true" />{/if}
{if $terms_of_use_agreement} <input type="hidden" id="terms_of_use_required" value="true" />{/if}
{if $data_privacy_agreement} <input type="hidden" id="data_privacy_agreement_required" value="true" />{/if}
{if $form_type==0}
<fieldset>
<fieldset>
<p>
<label for="name" class="input">{#name_marking#}</label>
<input id="name" type="text" size="40" name="{$fld_user_name}" value="{if $name}{$name}{/if}" maxlength="{$settings.username_maxlength}" tabindex="1" />
</p>
<div>
<label for="name" class="input">{#name_marking#}</label>
<input id="name" type="text" size="40" name="{$fld_user_name}" value="{if $name}{$name}{/if}" maxlength="{$settings.username_maxlength}" required />
</div>
<p>
<label for="email" class="input">{#email_marking#}</label>
<input id="email" type="text" size="40" name="{$fld_user_email}" value="{if $email}{$email}{/if}" maxlength="{$settings.email_maxlength}" tabindex="2" />&nbsp;<span class="xsmall">{#optional_email#}</span>
</p>
<div>
<label for="email" class="input">{#email_marking#} <span class="xsmall">{#optional_email#}</span></label>
<input id="email" type="email" size="40" name="{$fld_user_email}" value="{if $email}{$email}{/if}" maxlength="{$settings.email_maxlength}" />
</div>
<p class="hp">
<label for="repeat_email" class="main">{#honeypot_field_marking#}</label>
<input id="repeat_email" type="text" size="40" name="{$fld_repeat_email}" value="{if $honey_pot_email}{$honey_pot_email}{/if}" maxlength="{$settings.email_maxlength}" tabindex="-1" />
</p>
<div class="hp">
<label for="repeat_email" class="main">{#honeypot_field_marking#}</label>
<input id="repeat_email" type="email" size="40" name="{$fld_repeat_email}" value="{if $honey_pot_email}{$honey_pot_email}{/if}" maxlength="{$settings.email_maxlength}" tabindex="-1" />
</div>
<p>
<label for="hp" class="input">{#hp_marking#}</label>
<input id="hp" type="text" size="40" name="{$fld_hp}" value="{if $hp}{$hp}{/if}" maxlength="{$settings.hp_maxlength}" tabindex="3" />&nbsp;<span class="xsmall">{#optional#}</span>
</p>
<div>
<label for="hp" class="input">{#hp_marking#} <span class="xsmall">{#optional#}</span></label>
<input id="hp" type="url" size="40" name="{$fld_hp}" value="{if $hp}{$hp}{/if}" maxlength="{$settings.hp_maxlength}" />
</div>
<p class="hp">
<label for="phone" class="main">{#honeypot_field_marking#}</label>
<input id="phone" class="login" type="text" size="30" name="{$fld_phone}" value="{if $honey_pot_phone}{$honey_pot_phone}{/if}" maxlength="35" tabindex="-1" />
</p>
<div class="hp">
<label for="phone" class="main">{#honeypot_field_marking#}</label>
<input id="phone" class="login" type="tel" size="30" name="{$fld_phone}" value="{if $honey_pot_phone}{$honey_pot_phone}{/if}" maxlength="35" />
</div>
<p>
<label for="location" class="input">{#location_marking#}</label>
<input id="location" type="text" size="40" name="{$fld_location}" value="{if $location}{$location}{/if}" maxlength="{$settings.location_maxlength}" tabindex="4" />&nbsp;<span class="xsmall">{#optional#}</span>
</p>
<div>
<label for="location" class="input">{#location_marking#} <span class="xsmall">{#optional#}</span></label>
<input id="location" type="text" size="40" name="{$fld_location}" value="{if $location}{$location}{/if}" maxlength="{$settings.location_maxlength}" />
</div>
{if $settings.remember_userdata == 1 && $posting_mode==0 && !$user}
<p>
<input id="setcookie" class="checkbox" type="checkbox" name="setcookie" value="1"{if $setcookie} checked="checked"{/if} />&nbsp;<label for="setcookie">{#remember_userdata_marking#}</label>{if $cookie} &nbsp;<span id="delete_cookie"><a href="index.php?mode=delete_cookie">{#delete_cookie_linkname#}</a></span>{/if}
</p>
<div>
<input id="setcookie" type="checkbox" name="setcookie" value="1"{if $setcookie} checked="checked"{/if} /><label for="setcookie">{#remember_userdata_marking#}</label>{if $cookie} <span id="delete_cookie"><a href="index.php?mode=delete_cookie">{#delete_cookie_linkname#}</a></span>{/if}
</div>
{/if}
</fieldset>
</fieldset>
{/if}
<fieldset>
<fieldset>
{if $categories}
<p><label for="p_category" class="input">{#category_marking#}</label>
<select id="p_category" size="1" name="p_category" tabindex="5"{if $posting_mode==0 && $id>0 || $posting_mode==1 && $pid>0} disabled="disabled"{/if}>
{foreach key=key item=val from=$categories}
{if $key!=0}<option value="{$key}"{if $key==$p_category} selected="selected"{/if}>{$val}</option>{/if}
{/foreach}
</select></p>
{if $posting_mode==0 && $id>0 || $posting_mode==1 && $pid>0}
<input type="hidden" name="p_category" value="{$p_category}" />
{/if}
<div>
<label for="p_category" class="input">{#category_marking#}</label>
<select id="p_category" size="1" name="p_category" {if $posting_mode==0 && $id>0 || $posting_mode==1 && $pid>0} disabled="disabled"{/if}>
{foreach key=key item=val from=$categories}
{if $key!=0} <option value="{$key}"{if $key==$p_category} selected="selected"{/if}>{$val}</option>
{/if}
{/foreach}
</select>
</div>
{if $posting_mode==0 && $id>0 || $posting_mode==1 && $pid>0}
<input type="hidden" name="p_category" value="{$p_category}" />
{/if}
{/if}
<p><label for="subject" class="input">{#subject_marking#}</label>
<input id="subject" type="text" size="50" name="{$fld_subject}" value="{if $subject}{$subject}{/if}" maxlength="{$settings.subject_maxlength}" tabindex="6" />
</p>
<div>
<label for="subject" class="input">{#subject_marking#}</label>
<input id="subject" type="text" size="50" name="{$fld_subject}" value="{if $subject}{$subject}{/if}" maxlength="{$settings.subject_maxlength}" required />
</div>
{* Tags
0 == Off
@ -145,158 +136,196 @@
3 == everyone
*}
{if $settings.tags > 0 && ( ($settings.tags == 1 && ($admin || $mod)) || ($settings.tags == 2 && ($user_type === 0 || $admin || $mod)) || $settings.tags > 2 )}
<p>
<label for="tags" class="input">{#tags_marking#}</label>
<input id="tags" type="text" size="50" name="tags" value="{$tags|default:""}" maxlength="253" tabindex="-1" />&nbsp;<span class="xsmall">{#tags_note#}</span>
</p>
<div>
<label for="tags" class="input">{#tags_marking#} <span class="xsmall">{#tags_note#}</span></label>
<input id="tags" type="text" size="50" name="tags" value="{$tags|default:""}" maxlength="253" tabindex="-1" />
</div>
{/if}
</fieldset>
</fieldset>
<fieldset id="message">
<label for="text" class="textarea">{#message_marking#}</label><br />
<fieldset id="message">
<textarea id="text" cols="80" rows="21" name="text" tabindex="7">{if $text}{$text}{/if}</textarea>
<div id="formatting-help">
<h3>{#bbcode_help_heading#}</h3>
<p><a href="#entry-input">{#bbcode_help_skip_link#}</a></p>
{*<!--
This list is read out to generte the default BBCode buttons or displayed if
JavaScript isn't available.
-->*}
<dl id="bbcode-instructions">
<div>
<dt id="b" title="{#bbcode_bold_label#}">{#bbcode_bold_title#}</dt>
<dd>{#bbcode_bold_instruction#}</dd>
</div>
<div>
<dt id="i" title="{#bbcode_italic_label#}">{#bbcode_italic_title#}</dt>
<dd>{#bbcode_italic_instruction#}</dd>
</div>
<div>
<dt id="link" title="{#bbcode_link_label#}">{#bbcode_link_title#}</dt>
<dd>{#bbcode_link_instruction#}</dd>
</div>
{if $settings.bbcode_color}
<div>
<dt id="color" title="{#bbcode_color_label#}">{#bbcode_color_title#}</dt>
<dd>{#bbcode_color_instruction#}</dd>
</div>
{/if}
{if $settings.bbcode_size}
<div>
<dt id="size" title="{#bbcode_size_label#}">{#bbcode_size_title#}</dt>
<dd id="small" title="{#bbcode_size_label_small#}">{#bbcode_size_instruction_small#}</dd>
<dd id="large" title="{#bbcode_size_label_large#}">{#bbcode_size_instruction_large#}</dd>
</div>
{/if}
<div>
<dt id="list" title="{#bbcode_list_label#}">{#bbcode_list_title#}</dt>
<dd>{#bbcode_list_instruction#}</dd>
</div>
{if $settings.bbcode_img}
<div>
<dt id="img" title="{#bbcode_image_label#}">{#bbcode_image_title#}</dt>
<dd title="{#bbcode_image_label_default#}">{#bbcode_image_instr_default#}</dd>
<dd id="left" title="{#bbcode_image_label_left#}">{#bbcode_image_instr_left#}</dd>
<dd id="right" title="{#bbcode_image_label_right#}">{#bbcode_image_instr_right#}</dd>
<dd id="thumbnail" title="{#bbcode_image_label_thumb#}">{#bbcode_image_instr_thumb#}</dd>
<dd id="thumbnail-left" title="{#bbcode_image_label_thumb_left#}">{#bbcode_image_instr_thumb_left#}</dd>
<dd id="thumbnail-right" title="{#bbcode_image_label_thumb_right#}">{#bbcode_image_instr_thumb_right#}</dd>
</div>
{/if}
{if $upload_images}
<div>
<dt id="upload" title="{#bbcode_upload_label#}">{#bbcode_upload_title#}</dt>
<dd><a href="index.php?mode=upload_image">{#bbcode_upload_instruction#}</a></dd>
</div>
{/if}
{if $settings.bbcode_latex && $settings.bbcode_latex_uri}
<div>
<dt id="tex" title="{#bbcode_tex_label#}">{#bbcode_tex_title#}</dt>
<dd>{#bbcode_tex_instruction#}</dd>
</div>
{/if}
{if $settings.bbcode_code}
<div>
<dt id="code" title="{#bbcode_code_label#}">{#bbcode_code_title#}</dt>
<dd id="inlinecode" title="{#bbcode_code_label_inline#}">{#bbcode_code_instruction_inline#}</dd>
<dd title="{#bbcode_code_label_general#}">{#bbcode_code_instruction_general#}</dd>
{if $code_languages}
{foreach from=$code_languages item=code_language}
<dd id="{$code_language}" title="{#bbcode_code_label_specific#|replace:"[language]":$code_language}">{#bbcode_code_instruction_spec#|replace:"[language]":$code_language}</dd>
{/foreach}
{/if}
</div>
{/if}
</dl>
{/if}
<div id="format-bar">
{if $settings.smilies && $smilies}
<dl id="smiley-instructions">
{foreach name="smilies" from=$smilies item=smiley}
<div>
<dt class="{if $smarty.foreach.smilies.index<6}default{else}additional{/if}" title="{#insert_smiley_title#}">{$smiley.code}</dt>
<dd><img src="images/smilies/{$smiley.file}" alt="{$smiley.code}" /></dd>
</div>
{/foreach}
</dl>
{/if}
</div>
<div id="entry-input">
<label for="text" class="textarea">{#message_marking#}</label>
<div>
<div id="format-bar">
{if $settings.bbcode}
<div id="bbcode-bar">
<div id="bbcode-bar">
{*<!--
Here you can insert custom BBCode buttons. If you leave this div empty
the default buttons will be inserted. Example button:
<button title="Foo bar!" name="foo">Foo</button>
-->*}
</div>
</div>
{if $settings.smilies && $smilies}
<div id="smiley-bar">
<div id="smiley-bar">
{*<!--
Like custom BBCode buttons, example:
<button title="Insert smiley" name=":-)"><img src="..." /></button>
-->*}
</div>
</div>
{/if}
{*<!--
This list is read out to generte the default BBCode buttons or displayed if
JavaScript isn't available.
-->*}
<dl id="bbcode-instructions">
<dt id="b" title="{#bbcode_bold_label#}">{#bbcode_bold_title#}</dt>
<dd>{#bbcode_bold_instruction#}</dd>
<dt id="i" title="{#bbcode_italic_label#}">{#bbcode_italic_title#}</dt>
<dd>{#bbcode_italic_instruction#}</dd>
<dt id="link" title="{#bbcode_link_label#}">{#bbcode_link_title#}</dt>
<dd>{#bbcode_link_instruction#}</dd>
{if $settings.bbcode_color}
<dt id="color" title="{#bbcode_color_label#}">{#bbcode_color_title#}</dt>
<dd>{#bbcode_color_instruction#}</dd>
{/if}
{if $settings.bbcode_size}
<dt id="size" title="{#bbcode_size_label#}">{#bbcode_size_title#}</dt>
<dd id="small" title="{#bbcode_size_label_small#}">{#bbcode_size_instruction_small#}</dd>
<dd id="large" title="{#bbcode_size_label_large#}">{#bbcode_size_instruction_large#}</dd>
{/if}
<dt id="list" title="{#bbcode_list_label#}">{#bbcode_list_title#}</dt>
<dd>{#bbcode_list_instruction#}</dd>
{if $settings.bbcode_img}
<dt id="img" title="{#bbcode_image_label#}">{#bbcode_image_title#}</dt>
<dd title="{#bbcode_image_label_default#}">{#bbcode_image_instr_default#}</dd>
<dd id="left" title="{#bbcode_image_label_left#}">{#bbcode_image_instr_left#}</dd>
<dd id="right" title="{#bbcode_image_label_right#}">{#bbcode_image_instr_right#}</dd>
<dd id="thumbnail" title="{#bbcode_image_label_thumb#}">{#bbcode_image_instr_thumb#}</dd>
<dd id="thumbnail-left" title="{#bbcode_image_label_thumb_left#}">{#bbcode_image_instr_thumb_left#}</dd>
<dd id="thumbnail-right" title="{#bbcode_image_label_thumb_right#}">{#bbcode_image_instr_thumb_right#}</dd>
{/if}
{if $upload_images}
<dt id="upload" title="{#bbcode_upload_label#}">{#bbcode_upload_title#}</dt>
<dd><a href="index.php?mode=upload_image">{#bbcode_upload_instruction#}</a></dd>
{/if}
{if $settings.bbcode_latex && $settings.bbcode_latex_uri}
<dt id="tex" title="{#bbcode_tex_label#}">{#bbcode_tex_title#}</dt>
<dd>{#bbcode_tex_instruction#}</dd>
{/if}
{if $settings.bbcode_code}
<dt id="code" title="{#bbcode_code_label#}">{#bbcode_code_title#}</dt>
<dd id="inlinecode" title="{#bbcode_code_label_inline#}">{#bbcode_code_instruction_inline#}</dd>
<dd title="{#bbcode_code_label_general#}">{#bbcode_code_instruction_general#}</dd>
{if $code_languages}
{foreach from=$code_languages item=code_language}
<dd id="{$code_language}" title="{#bbcode_code_label_specific#|replace:"[language]":$code_language}">{#bbcode_code_instruction_spec#|replace:"[language]":$code_language}</dd>
{/foreach}
{/if}
{/if}
</dl>
{/if}
</div>
{if $settings.smilies && $smilies}
<dl id="smiley-instructions">
{foreach name="smilies" from=$smilies item=smiley}
<dt class="{if $smarty.foreach.smilies.index<6}default{else}additional{/if}" title="{#insert_smiley_title#}">{$smiley.code}</dt>
<dd><img src="images/smilies/{$smiley.file}" alt="{$smiley.code}" /></dd>
{/foreach}
</dl>
{/if}
<textarea id="text" cols="80" rows="21" name="text">{if $text}{$text}{/if}</textarea>
</div>
</fieldset>
</div>
</div>
</fieldset>
{if $signature || $provide_email_notification || $provide_sticky || $terms_of_use_agreement || $data_privacy_agreement}
<fieldset>
<fieldset>
{if $signature}
<p>
<input id="show_signature" type="checkbox" name="show_signature" value="1"{if $show_signature && $show_signature==1} checked="checked"{/if} />&nbsp;<label for="show_signature">{#show_signature_marking#}</label>
</p>
<div>
<input id="show_signature" type="checkbox" name="show_signature" value="1"{if $show_signature && $show_signature==1} checked="checked"{/if} />&nbsp;<label for="show_signature">{#show_signature_marking#}</label>
</div>
{/if}
{if $provide_email_notification}
<p>
<input id="email_notification" type="checkbox" name="email_notification" value="1"{if $email_notification && $email_notification==1} checked="checked"{/if} />&nbsp;<label for="email_notification">{if $id==0}{#email_notific_reply_thread#}{else}{#email_notific_reply_post#}{/if}</label>
</p>
<div>
<input id="email_notification" type="checkbox" name="email_notification" value="1"{if $email_notification && $email_notification==1} checked="checked"{/if} />&nbsp;<label for="email_notification">{if $id==0}{#email_notific_reply_thread#}{else}{#email_notific_reply_post#}{/if}</label>
</div>
{/if}
{if $provide_sticky}
<ul>
<li><input id="sticky_none" type="radio" name="sticky" value="0"{if !$sticky or ($sticky && $sticky==0)} checked="checked"{/if} />&nbsp;<label for="sticky_none">{#sticky_none#}</label></li>
<ul id="sticky-selection">
<li><input id="sticky_none" type="radio" name="sticky" value="0"{if !$sticky or ($sticky && $sticky==0)} checked="checked"{/if} /><label for="sticky_none">{#sticky_none#}</label></li>
{if $categories}
<li><input id="sticky_cat" type="radio" name="sticky" value="1"{if $sticky && $sticky==1} checked="checked"{/if} />&nbsp;<label for="sticky_cat">{#sticky_single_cat#}</label></li>
<li><input id="sticky_all" type="radio" name="sticky" value="2"{if $sticky && $sticky==2} checked="checked"{/if} />&nbsp;<label for="sticky_all">{#sticky_all_cats#}</label></li>
<li><input id="sticky_cat" type="radio" name="sticky" value="1"{if $sticky && $sticky==1} checked="checked"{/if} /><label for="sticky_cat">{#sticky_single_cat#}</label></li>
<li><input id="sticky_all" type="radio" name="sticky" value="2"{if $sticky && $sticky==2} checked="checked"{/if} /><label for="sticky_all">{#sticky_all_cats#}</label></li>
{else}
<li><input id="sticky_nocat" type="radio" name="sticky" value="1"{if $sticky && $sticky==1} checked="checked"{/if} />&nbsp;<label for="sticky_nocat">{#sticky_thread#}</label></li>
<li><input id="sticky_nocat" type="radio" name="sticky" value="1"{if $sticky && $sticky==1} checked="checked"{/if} /><label for="sticky_nocat">{#sticky_thread#}</label></li>
{/if}
</ul>
</ul>
{/if}
{if $terms_of_use_agreement}
{assign var=terms_of_use_url value=$settings.terms_of_use_url}
<p>
<input id="terms_of_use_agree" tabindex="8" type="checkbox" name="terms_of_use_agree" value="1"{if $terms_of_use_agree && $terms_of_use_agree==1} checked="checked"{/if} />&nbsp;<label for="terms_of_use_agree">{if $terms_of_use_url}{#terms_of_use_agreement#|replace:"[[":"<a id=\"terms_of_use\" href=\"$terms_of_use_url\">"|replace:"]]":"</a>"}{else}{#terms_of_use_agreement#|replace:"[[":""|replace:"]]":""}{/if}</label>
</p>
<div>
<input id="terms_of_use_agree" type="checkbox" name="terms_of_use_agree" value="1"{if $terms_of_use_agree && $terms_of_use_agree==1} checked="checked"{/if} />&nbsp;<label for="terms_of_use_agree">{if $terms_of_use_url}{#terms_of_use_agreement#|replace:"[[":"<a id=\"terms_of_use\" href=\"$terms_of_use_url\">"|replace:"]]":"</a>"}{else}{#terms_of_use_agreement#|replace:"[[":""|replace:"]]":""}{/if}</label>
</div>
{/if}
{if $data_privacy_agreement}
{assign var=data_privacy_statement_url value=$settings.data_privacy_statement_url}
<p>
<input id="data_privacy_statement_agree" tabindex="9" type="checkbox" name="data_privacy_statement_agree" value="1"{if $data_privacy_statement_agree && $data_privacy_statement_agree==1} checked="checked"{/if} />&nbsp;<label for="data_privacy_statement_agree">{if $data_privacy_statement_url}{#data_privacy_agreement#|replace:"[[":"<a id=\"data_privacy_statement\" href=\"$data_privacy_statement_url\">"|replace:"]]":"</a>"}{else}{#data_privacy_agreement#|replace:"[[":""|replace:"]]":""}{/if}</label>
</p>
<div>
<input id="data_privacy_statement_agree" type="checkbox" name="data_privacy_statement_agree" value="1"{if $data_privacy_statement_agree && $data_privacy_statement_agree==1} checked="checked"{/if} />&nbsp;<label for="data_privacy_statement_agree">{if $data_privacy_statement_url}{#data_privacy_agreement#|replace:"[[":"<a id=\"data_privacy_statement\" href=\"$data_privacy_statement_url\">"|replace:"]]":"</a>"}{else}{#data_privacy_agreement#|replace:"[[":""|replace:"]]":""}{/if}</label>
</div>
{/if}
</fieldset>
</fieldset>
{/if}
{if $captcha}
<fieldset>
<legend>{#captcha_marking#}</legend>
<fieldset>
<legend>{#captcha_marking#}</legend>
{if $captcha.type==2}
<p><img class="captcha" src="modules/captcha/captcha_image.php?{$session.name}={$session.id}" alt="{#captcha_image_alt#}" width="180" height="40" /><br />
<label for="captcha_code">{#captcha_expl_image#}</label><br />
<input id="captcha_code" type="text" name="captcha_code" value="" size="10" tabindex="9" /></p>
<p><img class="captcha" src="modules/captcha/captcha_image.php?{$session.name}={$session.id}" alt="{#captcha_image_alt#}" width="180" height="40" /><br />
<label for="captcha_code">{#captcha_expl_image#}</label><br />
<input id="captcha_code" type="text" name="captcha_code" value="" size="10" /></p>
{else}
<p><label for="captcha_code">{#captcha_expl_math#} {$captcha.number_1} + {$captcha.number_2} = </label><input id="captcha_code" type="text" name="captcha_code" value="" size="5" maxlength="5" tabindex="10" /></p>
<div>
<label for="captcha_code">{#captcha_expl_math#} {$captcha.number_1} + {$captcha.number_2} = </label>
<input id="captcha_code" type="text" name="captcha_code" value="" size="5" maxlength="5" />
</div>
{/if}
</fieldset>
</fieldset>
{/if}
<fieldset>
<p><input type="submit" name="save_entry" value="{#message_submit_button#}" title="{#message_submit_title#}" tabindex="11" />&nbsp;<input type="submit" name="preview" value="{#message_preview_button#}" title="{#message_preview_title#}" tabindex="11" /> <img id="throbber-submit" class="js-visibility-hidden" src="{$THEMES_DIR}/{$theme}/images/throbber_submit.gif" alt="" width="16" height="16" /></p>
</fieldset>
</div>
<fieldset>
<div>
<button name="save_entry" value="{#message_submit_button#}" title="{#message_submit_title#}">{#message_submit_button#}</button>
<button name="preview" value="{#message_preview_button#}" title="{#message_preview_title#}">{#message_preview_button#}</button>
<img id="throbber-submit" class="js-visibility-hidden" src="{$THEMES_DIR}/{$theme}/images/throbber_submit.gif" alt="" width="16" height="16" />
</div>
</fieldset>
</form>
{/if}

View file

@ -1,20 +1,20 @@
{config_load file=$language_file section="delete_posting"}
{if $no_authorisation}
<p class="notice caution">{$smarty.config.$no_authorisation}</p>
<p class="notice caution">{$smarty.config.$no_authorisation}</p>
{else}
<h1>{#delete_postings_hl#}</h1>
<p class="notice caution">{#caution#}</p>
<p>{if $admin||$mod}{#delete_posting_replies_confirm#}{else}{#delete_posting_confirm#}{/if}</p>
<p><strong>{$subject}</strong> - <strong>{$name}</strong>, {$formated_time}</p>
<form action="index.php" method="post" accept-charset="{#charset#}">
<div>
<input type="hidden" name="mode" value="posting" />
<input type="hidden" name="delete_posting" value="{$id}" />
<input type="hidden" name="csrf_token" value="{$CSRF_TOKEN}" />
{if $back}<input type="hidden" name="back" value="{$back}" />{/if}
{if $page}<input type="hidden" name="page" value="{$page}" />{/if}
{if $category}<input type="hidden" name="category" value="{$category}" />{/if}
<input type="submit" name="delete_posting_confirm" value="{#delete_posting_submit#}" />
</div>
</form>
<h1>{#delete_postings_hl#}</h1>
<p class="notice caution">{#caution#}</p>
<p>{if $admin||$mod}{#delete_posting_replies_confirm#}{else}{#delete_posting_confirm#}{/if}</p>
<p><strong>{$subject}</strong> - <strong>{$name}</strong>, {$formated_time}</p>
<form action="index.php" method="post" accept-charset="{#charset#}">
<input type="hidden" name="mode" value="posting" />
<input type="hidden" name="delete_posting" value="{$id}" />
<input type="hidden" name="csrf_token" value="{$CSRF_TOKEN}" />
{if $back} <input type="hidden" name="back" value="{$back}" />{/if}
{if $page} <input type="hidden" name="page" value="{$page}" />{/if}
{if $category} <input type="hidden" name="category" value="{$category}" />{/if}
<div>
<button name="delete_posting_confirm" value="{#delete_posting_submit#}">{#delete_posting_submit#}</button>
</div>
</form>
{/if}

View file

@ -1,15 +1,15 @@
{config_load file=$language_file section="delete_posting"}
{if $no_authorisation}
<p class="notice caution">{$smarty.config.$no_authorisation}</p>
<p class="notice caution">{$smarty.config.$no_authorisation}</p>
{else}
<h1>{#delete_marked_hl#}</h1>
<p class="notice caution">{#caution#}</p>
<p>{#delete_marked_confirm#}</p>
<form action="index.php" method="post" accept-charset="{#charset#}">
<div>
<input type="hidden" name="mode" value="posting" />
<input type="hidden" name="csrf_token" value="{$CSRF_TOKEN}" />
<input type="submit" name="delete_marked_submit" value="{#delete_posting_submit#}" />
</div>
</form>
<h1>{#delete_marked_hl#}</h1>
<p class="notice caution">{#caution#}</p>
<p>{#delete_marked_confirm#}</p>
<form action="index.php" method="post" accept-charset="{#charset#}">
<input type="hidden" name="mode" value="posting" />
<input type="hidden" name="csrf_token" value="{$CSRF_TOKEN}" />
<div>
<button name="delete_marked_submit" value="{#delete_posting_submit#}">{#delete_posting_submit#}</button>
</div>
</form>
{/if}

View file

@ -1,15 +1,15 @@
{config_load file=$language_file section="delete_posting"}
{if $no_authorisation}
<p class="notice caution">{#no_authorisation#}</p>
<p class="notice caution">{#no_authorisation#}</p>
{else}
<h1>{#delete_spam_hl#}</h1>
<p class="notice caution">{#caution#}</p>
<p>{#delete_spam_confirm#}</p>
<form action="index.php" method="post" accept-charset="{#charset#}">
<div>
<input type="hidden" name="mode" value="posting" />
<input type="hidden" name="csrf_token" value="{$CSRF_TOKEN}" />
<input type="submit" name="delete_spam_submit" value="{#delete_posting_submit#}" />
</div>
</form>
<h1>{#delete_spam_hl#}</h1>
<p class="notice caution">{#caution#}</p>
<p>{#delete_spam_confirm#}</p>
<form action="index.php" method="post" accept-charset="{#charset#}">
<input type="hidden" name="mode" value="posting" />
<input type="hidden" name="csrf_token" value="{$CSRF_TOKEN}" />
<div>
<button name="delete_spam_submit" value="{#delete_posting_submit#}">{#delete_posting_submit#}</button>
</div>
</form>
{/if}

View file

@ -1,24 +1,24 @@
{config_load file=$language_file section="delete_posting"}
{if $no_authorisation}
<p class="notice caution">{#no_authorisation#}</p>
<p class="notice caution">{#no_authorisation#}</p>
{else}
<h1>{#flag_ham_hl#}</h1>
{if !$id}
{#postings_doesnt_exist#}
{elseif $akismet_spam == 0 && $akismet_spam_check_status == 1 && $b8_spam == 0 && $b8_training_type == 1}
{#posting_not_flagged_as_spam#}
{else}
<p class="notice caution">{#caution#}</p>
<p>{#flag_ham_warning#}</p>
<p><strong>{$subject}</strong> - <strong>{$name}</strong>, {$formated_time}</p>
<form action="index.php" method="post" accept-charset="{#charset#}">
<input type="hidden" name="mode" value="posting" />
<input type="hidden" name="id" value="{$id}" />
<input type="hidden" name="csrf_token" value="{$CSRF_TOKEN}" />
<div class="buttonbar">
<button name="report_flag_ham_submit" value="{#report_flag_ham_submit#}">{#report_flag_ham_submit#}</button>
<button name="flag_ham_submit" value="{#flag_ham_submit#}">{#flag_ham_submit#}</button>
</div>
</form>
{/if}
<h1>{#flag_ham_hl#}</h1>
{if !$id}
{#postings_doesnt_exist#}
{elseif $akismet_spam == 0 && $akismet_spam_check_status == 1 && $b8_spam == 0 && $b8_training_type == 1}
{#posting_not_flagged_as_spam#}
{else}
<p class="notice caution">{#caution#}</p>
<p>{#flag_ham_warning#}</p>
<p><span class="subject">{$subject}</span> - <span class="metadata"><span class="author-name">{$name}</span>, <span class="tail"><time datetime="{$ISO_time}">{$formated_time}</time></span></span></p>
<form action="index.php" method="post" accept-charset="{#charset#}">
<input type="hidden" name="mode" value="posting" />
<input type="hidden" name="id" value="{$id}" />
<input type="hidden" name="csrf_token" value="{$CSRF_TOKEN}" />
<div class="buttonbar">
<button name="report_flag_ham_submit" value="{#report_flag_ham_submit#}">{#report_flag_ham_submit#}</button>
<button name="flag_ham_submit" value="{#flag_ham_submit#}">{#flag_ham_submit#}</button>
</div>
</form>
{/if}
{/if}

View file

@ -1,29 +1,37 @@
{config_load file=$language_file section="manage_postings"}
{if $no_authorisation}
<p class="notice caution">{$smarty.config.$no_authorisation}</p>
<p class="notice caution">{$smarty.config.$no_authorisation}</p>
{else}
{assign var='input_days' value='</label><input type="text" name="days" value="" size="5" />'}
<h1>{#manage_postings_hl#}</h1>
<form action="index.php" method="post" accept-charset="{#charset#}">
<fieldset class="manage-postings">
<legend><img src="{$THEMES_DIR}/{$theme}/images/marked.png" width="11" height="11" alt="" /> {#mark_postings#}</legend>
<input type="hidden" name="mode" value="posting" />
<p><input id="mark_mode_1" type="radio" name="mark_mode" value="1" /><label for="mark_mode_1">{$smarty.config.mark_old_threads|replace:"[days]":$input_days}<br />
<input id="mark_mode_2" type="radio" name="mark_mode" value="2" /><label for="mark_mode_2">{#mark_all_postings#}</label><br />
<input id="mark_mode_3" type="radio" name="mark_mode" value="3" /><label for="mark_mode_3">{#unmark_all_postings#}</label></p>
<p><input type="submit" name="mark_submit" value="{#submit_button_ok#}" /></p>
</fieldset>
</form>
<h1>{#manage_postings_hl#}</h1>
<form action="index.php" method="post" accept-charset="{#charset#}">
<input type="hidden" name="mode" value="posting" />
<fieldset class="manage-postings">
<legend><img src="{$THEMES_DIR}/{$theme}/images/marked.png" width="11" height="11" alt="" />&nbsp;{#mark_postings#}</legend>
<ul>
<li><input id="mark_mode_1" type="radio" name="mark_mode" value="1" /><label for="mark_mode_1">{$smarty.config.mark_old_threads|replace:"[days]":$input_days}</li>
<li><input id="mark_mode_2" type="radio" name="mark_mode" value="2" /><label for="mark_mode_2">{#mark_all_postings#}</label></li>
<li><input id="mark_mode_3" type="radio" name="mark_mode" value="3" /><label for="mark_mode_3">{#unmark_all_postings#}</label></li>
</ul>
<div>
<button name="mark_submit" value="{#submit_button_ok#}">{#submit_button_ok#}</button>
</div>
</fieldset>
</form>
<form action="index.php" method="post" accept-charset="{#charset#}">
<fieldset class="manage-postings">
<legend><img src="{$THEMES_DIR}/{$theme}/images/locked.png" width="14" height="12" alt="" /> {#lock_postings#}</legend>
<input type="hidden" name="mode" value="posting" />
<input type="hidden" name="csrf_token" value="{$CSRF_TOKEN}" />
<p><input id="lock_mode_1" type="radio" name="lock_mode" value="1" /><label for="lock_mode_1">{$smarty.config.lock_old_threads|replace:"[days]":$input_days}<br />
<input id="lock_mode_2" type="radio" name="lock_mode" value="2" /><label for="lock_mode_2">{#lock_all_postings#}</label><br />
<input id="lock_mode_3" type="radio" name="lock_mode" value="3" /><label for="lock_mode_3">{#unlock_all_postings#}</label></p>
<p><input type="submit" name="lock_submit" value="{#submit_button_ok#}" /></p>
</fieldset>
</form>
<form action="index.php" method="post" accept-charset="{#charset#}">
<input type="hidden" name="mode" value="posting" />
<input type="hidden" name="csrf_token" value="{$CSRF_TOKEN}" />
<fieldset class="manage-postings">
<legend><img src="{$THEMES_DIR}/{$theme}/images/locked.png" width="14" height="12" alt="" />&nbsp;{#lock_postings#}</legend>
<ul>
<li><input id="lock_mode_1" type="radio" name="lock_mode" value="1" /><label for="lock_mode_1">{$smarty.config.lock_old_threads|replace:"[days]":$input_days}</li>
<li><input id="lock_mode_2" type="radio" name="lock_mode" value="2" /><label for="lock_mode_2">{#lock_all_postings#}</label></li>
<li><input id="lock_mode_3" type="radio" name="lock_mode" value="3" /><label for="lock_mode_3">{#unlock_all_postings#}</label></li>
</ul>
<div>
<button name="lock_submit" value="{#submit_button_ok#}">{#submit_button_ok#}</button>
</div>
</fieldset>
</form>
{/if}

View file

@ -1,27 +1,29 @@
{config_load file=$language_file section="move_posting"}
{if $no_authorisation}
<p class="notice caution">{$smarty.config.$no_authorisation}</p>
<p class="notice caution">{$smarty.config.$no_authorisation}</p>
{else}
{assign var="input_move_to" value="<input type=\"text\" name=\"move_to\" value=\"\" size=\"5\" onclick=\"document.getElementById('move_mode_1').checked=false; document.getElementById('move_mode_1').checked='checked'; \" />"}
<h1>{#move_posting_hl#}</h1>
{assign var="input_move_to" value="<input type=\"number\" inputmode=\"decimal\" name=\"move_to\" value=\"\" size=\"5\" onclick=\"document.getElementById('move_mode_1').checked=false; document.getElementById('move_mode_1').checked='checked'; \" />"}
<h1>{#move_posting_hl#}</h1>
{if $errors}{include file="$theme/subtemplates/errors.inc.tpl"}{/if}
<p><strong>{$subject}</strong> - <strong>{$name}</strong>, {$formated_time}</p>
<form action="index.php" method="post" accept-charset="{#charset#}">
<div>
<input type="hidden" name="mode" value="posting" />
<input type="hidden" name="move_posting" value="{$move_posting}" />
<input type="hidden" name="back" value="{$back}" />
<input type="hidden" name="csrf_token" value="{$CSRF_TOKEN}" />
<p><span class="subject">{$subject}</span> - <span class="metadata"><span class="author-name">{$name}</span>, <span class="tail"><time datetime="">{$formated_time}</time></span></span></p>
<form action="index.php" method="post" accept-charset="{#charset#}">
<input type="hidden" name="mode" value="posting" />
<input type="hidden" name="move_posting" value="{$move_posting}" />
<input type="hidden" name="back" value="{$back}" />
<input type="hidden" name="csrf_token" value="{$CSRF_TOKEN}" />
{if $posting_type==0}
{assign var="input_move_to" value="<input type=\"text\" name=\"move_to\" value=\"\" size=\"5\" />"}
<input type="hidden" name="move_mode" value="1" />
<p>{#move_posting#|replace:"[number]":$input_move_to}</p>
{assign var="input_move_to" value="<input type=\"number\" inputmode=\"decimal\" name=\"move_to\" value=\"\" size=\"5\" />"}
<input type="hidden" name="move_mode" value="1" />
<p>{#move_posting#|replace:"[number]":$input_move_to}</p>
{else}
{assign var="input_move_to" value="<input type=\"text\" name=\"move_to\" value=\"\" size=\"5\" onclick=\"document.getElementById('move_mode_1').checked=false; document.getElementById('move_mode_1').checked='checked'; \" />"}
<p><input id="move_mode_0" type="radio" name="move_mode" value="0" checked="checked" /> <!--<label for="move_mode_0">-->{#move_posting_new_thread#}<!--</label>--><br />
<input id="move_mode_1" type="radio" name="move_mode" value="1" /> <!--<label for="move_mode_1">-->{#move_posting#|replace:"[number]":$input_move_to}<!--</label>--></p>
{assign var="input_move_to" value="<input type=\"number\" inputmode=\"decimal\" name=\"move_to\" value=\"\" size=\"5\" onclick=\"document.getElementById('move_mode_0').checked=false; document.getElementById('move_mode_1').checked='checked'; \" />"}
<ul>
<li><input id="move_mode_0" type="radio" name="move_mode" value="0" checked="checked" /> <label for="move_mode_0">{#move_posting_new_thread#}</label></li>
<li><input id="move_mode_1" type="radio" name="move_mode" value="1" /> <label for="move_mode_1">{#move_posting#|replace:"[number]":$input_move_to}</label></li>
</ul>
{/if}
<p><input type="submit" name="move_posting_submit" value="{#move_posting_submit#}" /></p>
</div>
</form>
<div>
<button name="move_posting_submit" value="{#move_posting_submit#}">{#move_posting_submit#}</button>
</div>
</form>
{/if}

View file

@ -1,33 +1,33 @@
{config_load file=$language_file section="delete_posting"}
{if $no_authorisation}
<p class="notice caution">{#no_authorisation#}</p>
<p class="notice caution">{#no_authorisation#}</p>
{else}
<h1>{#report_spam_hl#}</h1>
{if !$id}
{#postings_doesnt_exist#}
{elseif $akismet_spam == 1 && $akismet_spam_check_status == 1 && $b8_spam == 1 && $b8_training_type == 2}
{#posting_already_spam#}
{else}
<p class="notice caution">{#caution#}</p>
<p>{#report_spam_warning#}</p>
<p>{if $akismet_spam_check_status==2}{#spamcheck_akismet_timeout_error#}{/if}</p>
<p>{if $akismet_spam_check_status==3}{#spamcheck_akismet_api_error#}{/if}</p>
<p><strong>{$subject}</strong> - <strong>{$name}</strong>, {$formated_time}</p>
<form action="index.php" method="post" accept-charset="{#charset#}">
<input type="hidden" name="mode" value="posting" />
<input type="hidden" name="id" value="{$id}" />
<input type="hidden" name="csrf_token" value="{$CSRF_TOKEN}" />
{if $back}<input type="hidden" name="back" value="{$back}" />{/if}
{if $page}<input type="hidden" name="page" value="{$page}" />{/if}
{if $order}<input type="hidden" name="order" value="{$order}" />{/if}
{if $descasc}<input type="hidden" name="descasc" value="{$descasc}" />{/if}
{if $category}<input type="hidden" name="category" value="{$category}" />{/if}
<div class="buttonbar">
<button name="report_spam_delete_submit" value="{#report_spam_delete_submit#}">{#report_spam_delete_submit#}</button>
<button name="report_spam_submit" value="{#report_spam_submit#}">{#report_spam_submit#}</button>
<button name="delete_submit" value="{#delete_only_submit#}">{#delete_only_submit#}</button>
</div>
</form>
{/if}
<h1>{#report_spam_hl#}</h1>
{if !$id}
{#postings_doesnt_exist#}
{elseif $akismet_spam == 1 && $akismet_spam_check_status == 1 && $b8_spam == 1 && $b8_training_type == 2}
{#posting_already_spam#}
{else}
<p class="notice caution">{#caution#}</p>
<p>{#report_spam_warning#}</p>
{if $akismet_spam_check_status==2} <p>{#spamcheck_akismet_timeout_error#}</p>{/if}
{if $akismet_spam_check_status==3} <p>{#spamcheck_akismet_api_error#}</p>{/if}
<p><span class="subject">{$subject}</span> - <span class="metadata"><span class="author-name">{$name}</span>, <span class="tail"><time datetime="{$ISO_time}">{$formated_time}</time></span></span></p>
<form action="index.php" method="post" accept-charset="{#charset#}">
<input type="hidden" name="mode" value="posting" />
<input type="hidden" name="id" value="{$id}" />
<input type="hidden" name="csrf_token" value="{$CSRF_TOKEN}" />
{if $back} <input type="hidden" name="back" value="{$back}" />{/if}
{if $page} <input type="hidden" name="page" value="{$page}" />{/if}
{if $order} <input type="hidden" name="order" value="{$order}" />{/if}
{if $descasc} <input type="hidden" name="descasc" value="{$descasc}" />{/if}
{if $category} <input type="hidden" name="category" value="{$category}" />{/if}
<div class="buttonbar">
<button name="report_spam_delete_submit" value="{#report_spam_delete_submit#}">{#report_spam_delete_submit#}</button>
<button name="report_spam_submit" value="{#report_spam_submit#}">{#report_spam_submit#}</button>
<button name="delete_submit" value="{#delete_only_submit#}">{#delete_only_submit#}</button>
</div>
</form>
{/if}
{/if}

View file

@ -1,6 +1,5 @@
{config_load file=$language_file section="register"}
{if $captcha}{config_load file=$language_file section="captcha"}{/if}
<p class="normal">{#register_exp#}</p>
{if $errors}
<p class="notice caution">{#error_headline#}</p>
<ul>
@ -10,46 +9,69 @@
{/section}
</ul>
{/if}
<form action="index.php" method="post" accept-charset="{#charset#}">
<div>
<input type="hidden" name="mode" value="register" />
<input type="hidden" name="csrf_token" value="{$CSRF_TOKEN}" />
{if $captcha}<input type="hidden" name="{$captcha.session_name}" value="{$captcha.session_id}" />{/if}
<div id="card">
<p>{#register_exp#}</p>
<form action="index.php" method="post" accept-charset="{#charset#}">
<input type="hidden" name="mode" value="register" />
<input type="hidden" name="csrf_token" value="{$CSRF_TOKEN}" />
{if $captcha} <input type="hidden" name="{$captcha.session_name}" value="{$captcha.session_id}" />{/if}
<p><label for="new_user_name" class="main">{#register_username#}</label><br />
<input id="new_user_name" class="login" type="text" size="30" name="{$fld_user_name}" value="{$new_user_name|default:''}" maxlength="{$settings.username_maxlength}" tabindex="1" /></p>
<div>
<label for="new_user_name" class="main">{#register_username#}</label>
<input id="new_user_name" class="login" type="text" size="30" name="{$fld_user_name}" value="{$new_user_name|default:''}" maxlength="{$settings.username_maxlength}" autofocus required />
</div>
<p><label for="reg_pw" class="main">{#register_pw#}</label><br />
<input id="reg_pw" class="login" type="password" spellcheck="false" autocomplete="off" size="30" name="{$fld_pword}" maxlength="255" tabindex="2" /></p>
<div>
<label for="reg_pw" class="main">{#register_pw#}</label>
<input id="reg_pw" class="login" type="password" spellcheck="false" autocomplete="off" writingsuggestions="false" size="30" name="{$fld_pword}" maxlength="255" required />
</div>
<p class="hp"><label for="phone" class="main">{#register_honeypot_field#}</label><br />
<input id="phone" class="login" type="text" size="30" name="{$fld_phone}" value="{$honey_pot_phone|default:''}" maxlength="35" tabindex="-1" /></p>
<div class="hp">
<label for="phone" class="main">{#register_honeypot_field#}</label>
<input id="phone" class="login" type="tel" size="30" name="{$fld_phone}" value="{$honey_pot_phone|default:''}" maxlength="35" tabindex="-1" />
</div>
<p><label for="new_user_email" class="main">{#register_user_email#}</label><br />
<input id="new_user_email" class="login" type="text" size="30" name="{$fld_user_email}" value="{$new_user_email|default:''}" maxlength="{$settings.email_maxlength}" tabindex="3" /></p>
<div>
<label for="new_user_email" class="main">{#register_user_email#}</label>
<input id="new_user_email" class="login" type="email" size="30" name="{$fld_user_email}" value="{$new_user_email|default:''}" maxlength="{$settings.email_maxlength}" required />
</div>
<p class="hp"><label for="repeat_email" class="main">{#register_honeypot_field#}</label><br />
<input id="repeat_email" class="login" type="text" size="30" name="{$fld_repeat_email}" value="{$honey_pot_email|default:''}" maxlength="{$settings.email_maxlength}" tabindex="-1" /></p>
<div class="hp">
<label for="repeat_email" class="main">{#register_honeypot_field#}</label>
<input id="repeat_email" class="login" type="email" size="30" name="{$fld_repeat_email}" value="{$honey_pot_email|default:''}" maxlength="{$settings.email_maxlength}" tabindex="-1" />
</div>
{if $terms_of_use_agreement}
{assign var=terms_of_use_url value=$settings.terms_of_use_url}
<p><input tabindex="4" id="terms_of_use_agree" type="checkbox" name="terms_of_use_agree" value="1"{if $terms_of_use_agree && $terms_of_use_agree==1} checked="checked"{/if} />&nbsp;<label for="terms_of_use_agree">{if $terms_of_use_url}{#terms_of_use_agreement#|replace:"[[":"<a id=\"terms_of_use\" href=\"$terms_of_use_url\">"|replace:"]]":"</a>"}{else}{#terms_of_use_agreement#|replace:"[[":""|replace:"]]":""}{/if}</label></p>
<div>
<input id="terms_of_use_agree" type="checkbox" name="terms_of_use_agree" value="1"{if $terms_of_use_agree && $terms_of_use_agree==1} checked="checked"{/if} />&nbsp;<label for="terms_of_use_agree">{if $terms_of_use_url}{#terms_of_use_agreement#|replace:"[[":"<a id=\"terms_of_use\" href=\"$terms_of_use_url\">"|replace:"]]":"</a>"}{else}{#terms_of_use_agreement#|replace:"[[":""|replace:"]]":""}{/if}</label>
</div>
{/if}
{if $data_privacy_agreement}
{assign var=data_privacy_statement_url value=$settings.data_privacy_statement_url}
<p><input tabindex="5" id="data_privacy_statement_agree" type="checkbox" name="data_privacy_statement_agree" value="1"{if $data_privacy_statement_agree && $data_privacy_statement_agree==1} checked="checked"{/if} />&nbsp;<label for="data_privacy_statement_agree">{if $data_privacy_statement_url}{#data_privacy_agreement#|replace:"[[":"<a id=\"data_priv_declaration\" href=\"$data_privacy_statement_url\">"|replace:"]]":"</a>"}{else}{#data_privacy_agreement#|replace:"[[":""|replace:"]]":""}{/if}</label></p>
<div>
<input id="data_privacy_statement_agree" type="checkbox" name="data_privacy_statement_agree" value="1"{if $data_privacy_statement_agree && $data_privacy_statement_agree==1} checked="checked"{/if} />&nbsp;<label for="data_privacy_statement_agree">{if $data_privacy_statement_url}{#data_privacy_agreement#|replace:"[[":"<a id=\"data_priv_declaration\" href=\"$data_privacy_statement_url\">"|replace:"]]":"</a>"}{else}{#data_privacy_agreement#|replace:"[[":""|replace:"]]":""}{/if}</label>
</div>
{/if}
{if $captcha}
{if $captcha.type==2}
<p><strong>{#captcha_marking#}</strong><br />
<img class="captcha" src="modules/captcha/captcha_image.php?{$captcha.session_name}={$captcha.session_id}" alt="{#captcha_image_alt_reg#}" width="180" height="40" /><br />
<label for="captcha_code">{#captcha_expl_image#}</label><br />
<input id="captcha_code" type="text" name="captcha_code" value="" size="10" tabindex="6" /></p>
<div>
<strong class="label-like">{#captcha_marking#}</span><br />
<img class="captcha" src="modules/captcha/captcha_image.php?{$captcha.session_name}={$captcha.session_id}" alt="{#captcha_image_alt_reg#}" width="180" height="40" /><br />
<label for="captcha_code">{#captcha_expl_image#}</label>
<input id="captcha_code" type="text" name="captcha_code" value="" size="10" required />
</div>
{else}
<p><strong>{#captcha_marking#}</strong><br />
<label for="captcha_code">{#captcha_expl_math#} {$captcha.number_1} + {$captcha.number_2} = </label><input id="captcha_code" type="text" name="captcha_code" value="" size="5" tabindex="7" /></p>
<div>
<strong>{#captcha_marking#}</strong><br />
<label for="captcha_code">{#captcha_expl_math#} {$captcha.number_1} + {$captcha.number_2} = </label>
<input id="captcha_code" type="text" name="captcha_code" value="" size="5" required />
</div>
{/if}
{/if}
<p><input type="submit" name="register_submit" value="{#submit_button_ok#}" tabindex="8" /></p>
</div>
</form>
<div class="buttonbar">
<button name="register_submit" value="{#submit_button_ok#}">{#submit_button_ok#}</button>
<p><a href="index.php?mode=login">{#register_link_to_login#}</a></p>
</div>
</form>
</div>

View file

@ -1,26 +1,46 @@
{if !$list_spam}
<form action="index.php" method="get" accept-charset="{#charset#}">
<div style="margin-bottom:20px;">
<input type="hidden" name="mode" value="search" />
<input type="text" name="search" value="{$search|default:""}" size="30" />
<input type="hidden" name="mode" value="search" />
<div>
<label for="search_term">{#search_term#}</label>
<input type="search" name="search" id="searchterm" value="{$search|default:""}" size="30" />
</div>
{if $categories}
<select size="1" name="p_category">
<option value="0"{if $category==0} selected="selected"{/if}>{#all_categories#}</option>
<div>
<label for="search-category">{#search_category#}</label>
<select size="1" name="p_category" id="search-category">
<option value="0"{if $category==0} selected="selected"{/if}>{#all_categories#}</option>
{foreach key=key item=val from=$categories}
{if $key!=0}<option value="{$key}"{if $key==$p_category} selected="selected"{/if}>{$val}</option>{/if}
{if $key!=0} <option value="{$key}"{if $key==$p_category} selected="selected"{/if}>{$val}</option>{/if}
{/foreach}
</select>
{/if}
<input type="submit" name="search_submit" value="{#search_submit_button#}" />{if $settings.tags>0}<br />
<span class="small"><input id="searchfulltext" type="radio" name="method" value="0"{if $method == 'fulltext'} checked="checked"{/if} /><label for="searchfulltext">{#search_fulltext#}</label> <input id="searchtags" type="radio" class="search-radio" name="method" value="tags"{if $method == 'tags'} checked="checked"{/if} /><label for="searchtags">{#search_tags#}</label></span>{/if}
</div></form>
</select>
</div>{/if}
{if $settings.tags>0}
<ul>
<li><input id="searchfulltext" type="radio" name="method" value="0"{if $method == 'fulltext'} checked="checked"{/if} /><label for="searchfulltext">{#search_fulltext#}</label></li>
<li><input id="searchtags" type="radio" class="search-radio" name="method" value="tags"{if $method == 'tags'} checked="checked"{/if} /><label for="searchtags">{#search_tags#}</label></li>
</ul>{/if}
<div>
<button name="search_submit" value="{#search_submit_button#}">{#search_submit_button#}</button>
</div>
</form>
{/if}
{if $search || $list_spam}
{if $search_results}
<p>{if $search_results_count>1}{$smarty.config.several_postings_found|replace:"[number]":$search_results_count}{else}{#one_posting_found#}{/if}</p>
<ul class="searchresults">
{section name=result loop=$search_results}
<li><a class="{if $search_results[result].pid==0}thread-search{else}reply-search{/if}{if $search_results[result].is_read} read{/if}" href="index.php?id={$search_results[result].id}">{$search_results[result].subject}</a>{if $search_results[result].no_text} <img class="no-text" src="{$THEMES_DIR}/{$theme}/images/no_text.png" title="{#no_text_title#}" alt="{#no_text_alt#}" width="11" height="9" />{/if} - <strong>{$search_results[result].name}</strong>, <span id="p{$search_results[result].id}" class="tail">{$search_results[result].formated_time} <a href="index.php?mode=thread&amp;id={$search_results[result].id}" title="{#open_whole_thread#}"><img src="{$THEMES_DIR}/{$theme}/images/complete_thread.png" alt="{#open_whole_thread#}" width="11" height="11" /></a> {if $search_results[result].category}<a href="index.php?mode=index&amp;category={$search_results[result].category}"><span class="category">({$search_results[result].category_name})</span></a>{/if}</span></li>
<li><a class="subject {if $search_results[result].pid==0}thread-search{else}reply-search{/if}{if $search_results[result].is_read} read{/if}" href="index.php?id={$search_results[result].id}">{$search_results[result].subject}</a>
<span class="metadata">
<span class="author-name">{$search_results[result].name}</span>
<span id="p{$search_results[result].id}" class="tail">
{$search_results[result].formated_time}
{if $search_results[result].no_text}<img class="no-text" src="{$THEMES_DIR}/{$theme}/images/no_text.png" title="{#no_text_title#}" alt="{#no_text_alt#}" width="11" height="9" />{/if}
<a href="index.php?mode=thread&amp;id={$search_results[result].id}" title="{#open_whole_thread#}"><img src="{$THEMES_DIR}/{$theme}/images/complete_thread.png" alt="{#open_whole_thread#}" width="11" height="11" /></a>
{if $search_results[result].category}<a href="index.php?mode=index&amp;category={$search_results[result].category}"><span class="category">({$search_results[result].category_name})</span></a>{/if}
</span>
</span>
</li>
{/section}
</ul>
{if $page_browse && $page_browse.total_items > $page_browse.items_per_page}

View file

@ -20,16 +20,17 @@
{if $data.$element.user_type==2}
{assign var=admin_name value=$data.$element.name}
{assign var=admin_title value=$smarty.config.administrator_title}
{assign var=name value="<span class=\"admin registered_user\" title=\"$admin_title\">$admin_name</span>"}
{assign var=name value="<span class=\"author-name admin registered_user\" title=\"$admin_title\">$admin_name</span>"}
{elseif $data.$element.user_type==1}
{assign var=mod_name value=$data.$element.name}
{assign var=mod_title value=$smarty.config.moderator_title}
{assign var=name value="<span class=\"mod registered_user\" title=\"$mod_title\">$mod_name</span>"}
{assign var=name value="<span class=\"author-name mod registered_user\" title=\"$mod_title\">$mod_name</span>"}
{elseif $data.$element.user_id>0}
{assign var=user_name value=$data.$element.name}
{assign var=name value="<span class=\"registered_user\">$user_name</span>"}
{assign var=name value="<span class=\"author-name registered_user\">$user_name</span>"}
{else}
{assign var=name value=$data.$element.name}
{assign var=visitor_name value=$data.$element.name}
{assign var=name value="<span class=\"author-name\">$visitor_name</span>"}
{/if}
{if (($settings.user_area_access == 0 and ($admin or $mod)) or ($settings.user_area_access == 1 and $user) or $settings.user_area_access == 2) && $data.$element.user_id>0}
@ -40,8 +41,8 @@
<header class="header">
{if $data.$element.avatar}<img id="avatar-{$data.$element.id}" class="avatar" src="{$data.$element.avatar.image}" alt="{#avatar_img_alt#}" width="{$data.$element.avatar.width}" height="{$data.$element.avatar.height}" />{/if}
<h{if $data.$element.pid==0}1{else}2{/if} id="headline-{$data.$element.id}">{$data.$element.subject}{if $data.$element.pid==0 && $category_name} <span class="category">({$category_name})</span>{/if}</h{if $data.$element.pid==0}1{else}2{/if}>
<p class="author">{if $data.$element.location}{#posted_by_location#|replace:"[name]":$name|replace:"[email_hp]":$email_hp|replace:"[location]":$data.$element.location|replace:"[time]":$data.$element.formated_time}{else}{#posted_by#|replace:"[name]":$name|replace:"[email_hp]":$email_hp|replace:"[time]":$data.$element.formated_time}{/if} <span class="ago">({if $data.$element.ago.days>1}{#posting_several_days_ago#|replace:"[days]":$data.$element.ago.days_rounded}{else}{if $data.$element.ago.days==0 && $data.$element.ago.hours==0}{#posting_minutes_ago#|replace:"[minutes]":$data.$element.ago.minutes}{elseif $data.$element.ago.days==0 && $data.$element.ago.hours!=0}{#posting_hours_ago#|replace:"[hours]":$data.$element.ago.hours|replace:"[minutes]":$data.$element.ago.minutes}{else}{#posting_one_day_ago#|replace:"[hours]":$data.$element.ago.hours|replace:"[minutes]":$data.$element.ago.minutes}{/if}{/if})</span>{if $admin && $data.$element.ip} <span class="ip">({$data.$element.ip})</span>{/if}{if $data.$element.pid!=0}{assign var="parent_posting" value=$data.$element.pid} <span class="op-link"><a href="#p{$data.$element.pid}" title="{#original_posting_linktitle#|replace:"[name]":$data.$parent_posting.name}">@ {$data.$parent_posting.name}</a></span>{/if}{if $data.$element.edited}<br />
<span class="edited">{#edited_by#|replace:"[name]":$data.$element.edited_by|replace:"[time]":$data.$element.formated_edit_time}</span>{/if}</p>
<p class="author">{if $data.$element.location}{#posted_by_location#|replace:"[name]":$name|replace:"[email_hp]":$email_hp|replace:"[location]":$data.$element.location}{else}{#posted_by#|replace:"[name]":$name|replace:"[email_hp]":$email_hp}{/if}<time datetime="{$data.$element.ISO_time}">{$data.$element.formated_time}</time> <span class="ago">({if $data.$element.ago.days>1}{#posting_several_days_ago#|replace:"[days]":$data.$element.ago.days_rounded}{else}{if $data.$element.ago.days==0 && $data.$element.ago.hours==0}{#posting_minutes_ago#|replace:"[minutes]":$data.$element.ago.minutes}{elseif $data.$element.ago.days==0 && $data.$element.ago.hours!=0}{#posting_hours_ago#|replace:"[hours]":$data.$element.ago.hours|replace:"[minutes]":$data.$element.ago.minutes}{else}{#posting_one_day_ago#|replace:"[hours]":$data.$element.ago.hours|replace:"[minutes]":$data.$element.ago.minutes}{/if}{/if})</span>{if $admin && $data.$element.ip} <span class="ip">({$data.$element.ip})</span>{/if}{if $data.$element.pid!=0}{assign var="parent_posting" value=$data.$element.pid} <span class="op-link"><a href="#p{$data.$element.pid}" title="{#original_posting_linktitle#|replace:"[name]":$data.$parent_posting.name}">@ {$data.$parent_posting.name}</a></span>{/if}
{if $data.$element.edited}<br /><span class="edited">{#edited_by#|replace:"[name]":$data.$element.edited_by}<time datetime="{$data.$element.ISO_edit_time}">{$data.$element.formated_edit_time}</time></span>{/if}</p>
</header>
<div class="wrapper" id="posting-{$data.$element.id}">
<div class="body">

View file

@ -20,16 +20,17 @@
{if $element.user_type==2}
{assign var=admin_name value=$element.name}
{assign var=admin_title value=$smarty.config.administrator_title}
{assign var=name value="<span class=\"admin registered_user\" title=\"$admin_title\">$admin_name</span>"}
{assign var=name value="<span class=\"author-name admin registered_user\" title=\"$admin_title\">$admin_name</span>"}
{elseif $element.user_type==1}
{assign var=mod_name value=$element.name}
{assign var=mod_title value=$smarty.config.moderator_title}
{assign var=name value="<span class=\"mod registered_user\" title=\"$mod_title\">$mod_name</span>"}
{assign var=name value="<span class=\"author-name mod registered_user\" title=\"$mod_title\">$mod_name</span>"}
{elseif $element.user_id>0}
{assign var=user_name value=$element.name}
{assign var=name value="<span class=\"registered_user\">$user_name</span>"}
{assign var=name value="<span class=\"author-name registered_user\">$user_name</span>"}
{else}
{assign var=name value=$element.name}
{assign var=visitor_name value=$element.name}
{assign var=name value="<span class=\"author-name\">$visitor_name</span>"}
{/if}
{if (($settings.user_area_access == 0 and ($admin or $mod)) or ($settings.user_area_access == 1 and $user) or $settings.user_area_access == 2) &&$element.user_id>0}
@ -40,8 +41,8 @@
<header class="header">
{if $element.avatar}<img id="avatar-{$element.id}" class="avatar" src="{$element.avatar.image}" alt="{#avatar_img_alt#}" width="{$element.avatar.width}" height="{$element.avatar.height}" />{/if}
<h{if $element.pid==0}1{else}2{/if} id="headline-{$element.id}">{$element.subject}{if $element.pid==0 && $category_name} <span class="category">({$category_name})</span>{/if}</h{if $element.pid==0}1{else}2{/if}>
<p class="author">{if $element.location}{#posted_by_location#|replace:"[name]":$name|replace:"[email_hp]":$email_hp|replace:"[location]":$element.location|replace:"[time]":$element.formated_time}{else}{#posted_by#|replace:"[name]":$name|replace:"[email_hp]":$email_hp|replace:"[time]":$element.formated_time}{/if} <span class="ago">({if $element.ago.days>1}{#posting_several_days_ago#|replace:"[days]":$element.ago.days_rounded}{else}{if $element.ago.days==0 && $element.ago.hours==0}{#posting_minutes_ago#|replace:"[minutes]":$element.ago.minutes}{elseif $element.ago.days==0 && $element.ago.hours!=0}{#posting_hours_ago#|replace:"[hours]":$element.ago.hours|replace:"[minutes]":$element.ago.minutes}{else}{#posting_one_day_ago#|replace:"[hours]":$element.ago.hours|replace:"[minutes]":$element.ago.minutes}{/if}{/if})</span>{if $admin && $element.ip} <span class="ip">({$element.ip})</span>{/if}{if $element.pid!=0}{assign var="parent_posting" value=$element.pid} <span class="op-link"><a href="#p{$element.pid}" title="{#original_posting_linktitle#|replace:"[name]":$data.$parent_posting.name}">@ {$data.$parent_posting.name}</a></span>{/if}{if $element.edited}<br />
<span class="edited">{#edited_by#|replace:"[name]":$element.edited_by|replace:"[time]":$element.formated_edit_time}</span>{/if}</p>
<p class="author">{if $element.location}{#posted_by_location#|replace:"[name]":$name|replace:"[email_hp]":$email_hp|replace:"[location]":$element.location}{else}{#posted_by#|replace:"[name]":$name|replace:"[email_hp]":$email_hp}{/if}<time datetime="{$element.ISO_time}">{$element.formated_time}</time> <span class="ago">({if $element.ago.days>1}{#posting_several_days_ago#|replace:"[days]":$element.ago.days_rounded}{else}{if $element.ago.days==0 && $element.ago.hours==0}{#posting_minutes_ago#|replace:"[minutes]":$element.ago.minutes}{elseif $element.ago.days==0 && $element.ago.hours!=0}{#posting_hours_ago#|replace:"[hours]":$element.ago.hours|replace:"[minutes]":$element.ago.minutes}{else}{#posting_one_day_ago#|replace:"[hours]":$element.ago.hours|replace:"[minutes]":$element.ago.minutes}{/if}{/if})</span>{if $admin && $element.ip} <span class="ip">({$element.ip})</span>{/if}{if $element.pid!=0}{assign var="parent_posting" value=$element.pid} <span class="op-link"><a href="#p{$element.pid}" title="{#original_posting_linktitle#|replace:"[name]":$data.$parent_posting.name}">@ {$data.$parent_posting.name}</a></span>{/if}
{if $element.edited}<br /><span class="edited">{#edited_by#|replace:"[name]":$element.edited_by}<time datetime="{$element.ISO_edit_time}">{$element.formated_edit_time}</time></span>{/if}</p>
</header>
<div class="wrapper" id="posting-{$element.id}">
<div class="body">

View file

@ -37,7 +37,7 @@
{foreach from=$userdata item=row}
{cycle values="a,b" assign=c}
<tr class="{$c}">
<td><a href="index.php?mode=user&amp;show_user={$row.user_id}" title="{#show_userdata_linktitle#|replace:"[user]":$row.user_name}"><strong>{$row.user_name}</strong></a></td>
<td><a href="index.php?mode=user&amp;show_user={$row.user_id}" title="{#show_userdata_linktitle#|replace:"[user]":$row.user_name}"><span class="author-name">{$row.user_name}</span></a></td>
<td><span class="small">{if $row.user_type==2}{#admin#}{elseif $row.user_type==1}{#mod#}{else}{#user#}{/if}</span></td>
<td><span class="small">{if $row.user_hp!=''}<a href="{$row.user_hp}" title="{$row.user_hp}"><img src="{$THEMES_DIR}/{$theme}/images/homepage.png" alt="{#homepage#}" width="13" height="13" /></a>{else}&nbsp;{/if}</span></td>
<td><span class="small">{if $row.user_email}<a href="index.php?mode=contact&amp;recipient_user_id={$row.user_id}" title="{#mailto_user#|replace:"[user]":$row.user_name}"><img src="{$THEMES_DIR}/{$theme}/images/email.png" alt="{#email#}" width="13" height="10" /></a>{else}&nbsp;{/if}</span></td>

View file

@ -44,7 +44,7 @@
</tr>
<tr>
<td class="c"><label for="user_hp"><strong>{#edit_user_hp#}</strong></label></td>
<td class="d"><input id="user_hp" type="text" size="40" name="user_hp" value="{$user_hp}" maxlength="{$settings.hp_maxlength}" /></td>
<td class="d"><input id="user_hp" type="url" size="40" name="user_hp" value="{$user_hp}" maxlength="{$settings.hp_maxlength}" /></td>
</tr>
<tr>
<td class="c"><label for="user_real_name"><strong>{#edit_user_real_name#}</strong></label></td>
@ -59,7 +59,7 @@
</tr>
<tr>
<td class="c"><label for="user_birthday"><strong>{#edit_user_birthday#}</strong></label></td>
<td class="d"><input id="user_birthday" type="text" size="40" name="user_birthday" value="{$user_birthday}" /> <span class="small">({#birthday_format#})</span></td>
<td class="d"><input id="user_birthday" type="date" size="40" name="user_birthday" value="{$user_birthday}" /> <span class="small">({#birthday_format#})</span></td>
</tr>
<tr>
<td class="c"><label for="user_location"><strong>{#edit_user_location#}</strong></label></td>
@ -77,11 +77,6 @@
<tr>
<td class="c"><strong>{#edit_user_cat_selection#}</strong></td>
<td class="d">
{*<select id="category_selection" name="category_selection[]" multiple="multiple" size="{if $number_of_categories>10}10{else}{$number_of_categories}{/if}">
{foreach key=key item=val from=$categories}
{if $key!=0}<option value="{$key}"{if isset($category_selection) && in_array($key,$category_selection)} selected="selected"{/if}>{$val}</option>{/if}
{/foreach}
</select>*}
<ul class="checkboxlist">
{foreach key=key item=val from=$categories}
{if $key!=0}<li><input id="category_{$key}" type="checkbox" name="category_selection[]" value="{$key}"{if isset($category_selection) && in_array($key,$category_selection)} checked="checked"{/if} /><label for="category_{$key}">{$val}</label></li>{/if}

View file

@ -6,20 +6,26 @@
<ul>
{section name=mysec loop=$errors}
{assign var="error" value=$errors[mysec]}
<li>{$smarty.config.$error}</li>
<li>{$smarty.config.$error}</li>
{/section}
</ul>
{/if}
<form action="index.php" method="post" accept-charset="{#charset#}">
<div>
<input type="hidden" name="csrf_token" value="{$CSRF_TOKEN}" />
<input type="hidden" name="mode" value="user" />
<p><label for="new_email" class="main">{#edit_email_new#}</label><br />
<input id="new_email" type="text" size="25" name="new_email" value="{$new_user_email|default:''}" maxlength="{$settings.email_maxlength}" /></p>
<p><label for="new_email_confirm" class="main">{#edit_email_new_confirm#}</label><br />
<input id="new_email_confirm" type="text" size="25" name="new_email_confirm" value="" maxlength="{$settings.email_maxlength}" /></p>
<p><label for="pw_new_email" class="main">{#edit_email_pw#}</label><br />
<input id="pw_new_email" type="password" spellcheck="false" autocomplete="off" size="25" name="pw_new_email" /></p>
<p><input type="submit" name="edit_email_submit" value="{#submit_button_ok#}" /></p>
</div>
<input type="hidden" name="csrf_token" value="{$CSRF_TOKEN}" />
<input type="hidden" name="mode" value="user" />
<div>
<label for="new_email" class="main">{#edit_email_new#}</label>
<input id="new_email" type="email" size="25" name="new_email" value="{$new_user_email|default:''}" maxlength="{$settings.email_maxlength}" autofocus required />
</div>
<div>
<label for="new_email_confirm" class="main">{#edit_email_new_confirm#}</label>
<input id="new_email_confirm" type="email" size="25" name="new_email_confirm" value="" maxlength="{$settings.email_maxlength}" required />
</div>
<div>
<label for="pw_new_email" class="main">{#edit_email_pw#}</label>
<input id="pw_new_email" type="password" spellcheck="false" autocomplete="off" writingsuggestions="false" size="25" name="pw_new_email" required />
</div>
<div>
<button name="edit_email_submit" value="{#submit_button_ok#}">{#submit_button_ok#}</button>
</div>
</form>

View file

@ -4,18 +4,22 @@
<ul>
{section name=mysec loop=$errors}
{assign var="error" value=$errors[mysec]}
<li>{$smarty.config.$error|replace:"[characters]":$settings.min_pw_length|replace:"[digits]":$settings.min_pw_digits|replace:"[lowercase_letters]":$settings.min_pw_lowercase_letters|replace:"[uppercase_letters]":$settings.min_pw_uppercase_letters|replace:"[special_characters]":$settings.min_pw_special_characters}</li>
<li>{$smarty.config.$error|replace:"[characters]":$settings.min_pw_length|replace:"[digits]":$settings.min_pw_digits|replace:"[lowercase_letters]":$settings.min_pw_lowercase_letters|replace:"[uppercase_letters]":$settings.min_pw_uppercase_letters|replace:"[special_characters]":$settings.min_pw_special_characters}</li>
{/section}
</ul>
{/if}
<form action="index.php" method="post" accept-charset="{#charset#}">
<div>
<input type="hidden" name="csrf_token" value="{$CSRF_TOKEN}" />
<input type="hidden" name="mode" value="user" />
<p><strong>{#edit_pw_old#}</strong><br />
<input type="password" spellcheck="false" autocomplete="off" size="25" name="old_pw" /></p>
<p><strong>{#edit_pw_new#}</strong><br />
<input type="password" spellcheck="false" autocomplete="off" size="25" name="new_pw" maxlength="255" /></p>
<p><input type="submit" name="edit_pw_submit" value="{#submit_button_ok#}" /></p>
</div>
<input type="hidden" name="csrf_token" value="{$CSRF_TOKEN}" />
<input type="hidden" name="mode" value="user" />
<div>
<label for="old-pw">{#edit_pw_old#}</label>
<input type="password" spellcheck="false" autocomplete="off" writingsuggestions="false" size="25" name="old_pw" id="old-pw" autofocus required />
</div>
<div>
<label for="new-pw">{#edit_pw_new#}</label>
<input type="password" spellcheck="false" autocomplete="off" writingsuggestions="false" size="25" name="new_pw" id="new-pw" maxlength="255" required />
</div>
<div>
<button name="edit_pw_submit" value="{#submit_button_ok#}">{#submit_button_ok#}</button>
</div>
</form>

View file

@ -13,7 +13,17 @@
<p>{if $user_postings_count>1}{$smarty.config.several_postings_by_user|replace:"[number]":$user_postings_count}{else}{#one_posting_by_user#}{/if}</p>
<ul class="searchresults">
{section name=ix loop=$user_postings_data}
<li><a class="{if $user_postings_data[ix].pid==0}thread-search{else}reply-search{/if} {if $visited && in_array($user_postings_data[ix].id,$visited)} visited{/if}" href="index.php?mode=entry&amp;id={$user_postings_data[ix].id}">{$user_postings_data[ix].subject}</a> - <strong>{$user_postings_data[ix].name}</strong>, <span id="p{$user_postings_data[ix].id}" class="tail"><time>{$user_postings_data[ix].disp_time}</time> <a href="index.php?mode=thread&amp;id={$user_postings_data[ix].id}" title="{#open_whole_thread#}"><img src="{$THEMES_DIR}/{$theme}/images/complete_thread.png" alt="{#open_whole_thread#}" width="11" height="11" /></a> {if $user_postings_data[ix].category}<a href="index.php?mode=index&amp;category={$user_postings_data[ix].category}"><span class="category">({$user_postings_data[ix].category_name})</span></a>{/if}</span></li>
<li>
<a class="subject {if $user_postings_data[ix].pid==0}thread-search{else}reply-search{/if} {if $visited && in_array($user_postings_data[ix].id,$visited)} visited{/if}" href="index.php?mode=entry&amp;id={$user_postings_data[ix].id}">{$user_postings_data[ix].subject}</a>
<span class="metadata">
<span class="author-name">{$user_postings_data[ix].name}</span>
<span id="p{$user_postings_data[ix].id}" class="tail">
{$user_postings_data[ix].disp_time}
<a href="index.php?mode=thread&amp;id={$user_postings_data[ix].id}" title="{#open_whole_thread#}"><img src="{$THEMES_DIR}/{$theme}/images/complete_thread.png" alt="{#open_whole_thread#}" width="11" height="11" /></a>
{if $user_postings_data[ix].category}<a href="index.php?mode=index&amp;category={$user_postings_data[ix].category}"><span class="category">({$user_postings_data[ix].category_name})</span></a>{/if}
</span>
</span>
</li>
{/section}
</ul>

View file

@ -5,18 +5,21 @@
<p class="notice caution">{#error_headline#}</p>
<ul>
{section name=mysec loop=$errors}
{assign var="error" value=$errors[mysec]}
<li>{$smarty.config.$error}</li>
{assign var="error" value=$errors[mysec]}
<li>{$smarty.config.$error}</li>
{/section}
</ul>
{/if}
<div>
<form action="index.php" method="post" accept-charset="{#charset#}">
<input type="hidden" name="csrf_token" value="{$CSRF_TOKEN}" />
<input type="hidden" name="mode" value="user" />
<input type="hidden" name="action" value="edit_profile" />
<p><strong><label for="password">{#remove_user_confirm_password#}</label></strong><br /><input id="password" type="password" name="user_password" spellcheck="false" autocomplete="off" size="25" /></p>
<input type="submit" name="remove_account_submit" value="{#submit_button_ok#}" />
<input type="submit" value="{#submit_button_cancel#}">
</form>
</div>
<form action="index.php" method="post" accept-charset="{#charset#}">
<input type="hidden" name="csrf_token" value="{$CSRF_TOKEN}" />
<input type="hidden" name="mode" value="user" />
<input type="hidden" name="action" value="edit_profile" />
<div>
<label for="password">{#remove_user_confirm_password#}</label>
<input id="password" type="password" name="user_password" spellcheck="false" autocomplete="off" writingsuggestions="false" size="25" autofocus required />
</div>
<div>
<button name="remove_account_submit" value="{#submit_button_ok#}">{#submit_button_ok#}</button>
<button type="reset" value="{#submit_button_cancel#}">{#submit_button_cancel#}</button>
</div>
</form>

View file

@ -1,139 +1,318 @@
{config_load file=$language_file section="general"}{config_load file=$language_file section="upload_image"}<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="{#language#}">
<head>
<title>{$settings.forum_name}{if $page_title} - {$page_title}{elseif $subnav_location} - {$subnav_location}{/if}</title>
<meta http-equiv="content-type" content="text/html; charset={#charset#}" />
<style type="text/css">
{config_load file=$language_file section="general"}{config_load file=$language_file section="upload_image"}<!DOCTYPE html>
<html lang="{#language#}">
<head>
<meta charset="{#charset#}" />
<title>{$settings.forum_name}{if $page_title} - {$page_title}{elseif $subnav_location} - {$subnav_location}{/if}</title>
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
<style type="text/css">
{literal}
<!--
body { color: #000000; background: #ffffff; margin:0; padding:0; font-family: verdana, arial, sans-serif; font-size: 13px; }
img { border:none; }
#header { margin:0; padding:0; background:#f9f9f9; border-bottom: 1px solid #bacbdf; height:24px; font-size:13px; line-height:22px; }
#nav-1 { margin:0; padding:0 0 0 5px; float:left; }
#nav-2 { margin:0; padding:0 5px 0 0; float:right; }
#wrapper { margin:0; padding:20px; }
h1 { font-family: verdana, arial, sans-serif; font-size: 18px; font-weight: bold; }
p { font-family: verdana, arial, sans-serif; font-size: 13px; line-height: 19px; }
.caution { padding: 0px 0px 0px 20px; color: red; font-weight: bold; background-image:url({/literal}{$THEMES_DIR}/{$settings.theme}{literal}/images/caution.png); background-repeat:no-repeat; background-position: left; }
.ok { padding: 0px 0px 0px 20px; font-weight:bold; color:red; background-image:url({/literal}{$THEMES_DIR}/{$settings.theme}{literal}/images/tick.png); background-repeat:no-repeat; background-position: left; }
img.delete { max-width:300px; max-height:150px; }
img.uploaded { max-width:300px; max-height:110px; /*cursor:pointer;*/ }
img.browse { max-width:320px; cursor:pointer; }
.deletelink { font-size:11px; padding-left:13px; background:url({/literal}{$THEMES_DIR}/{$settings.theme}{literal}/images/bg_sprite_3.png) no-repeat 0 -47px; }
.small { font-size:11px; line-height:16px; }
code { font-family:"courier new", courier; color:#000080; }
a:link { color:#0000cc; text-decoration: none; }
a:visited { color:#0000cc; text-decoration: none; }
a:hover { color:#0000ff; text-decoration: underline; }
a:active { color:#ff0000; text-decoration: none; }
table { width:100%; margin:5px 0 0 0; padding:0; }
td { text-align:center; }
-->
{/literal}
</style>
<script type="text/javascript">{literal}/* <![CDATA[ */
function insertCode(image_url) {
if (opener && opener.mlfBBCodeButton) {
var bbcodeButton = opener.mlfBBCodeButton;
if (!bbcodeButton.canInsert())
return;
var buttonGroup = bbcodeButton.getButtonGroup();
var txtarea = buttonGroup.getTextArea();
txtarea.insertTextRange( txtarea.getSelection() + "[img]" + image_url + "[/img]" );
}
//self.close();
*,
::before,
::after {
box-sizing: border-box;
}
/* ]]> */{/literal}</script>
{if $browse_images}
<script type="text/javascript">{literal}/* <![CDATA[ */
function getMaxWidth()
{
if(document.getElementById('imgtab'))
{
var maxWidth = document.getElementById('imgtab').offsetWidth-20;
var obj=getElementsByClassName('browse');
for(i=0;i<obj.length;i++)
{
obj[i].style.maxWidth=maxWidth+'px';
}
}
}
window.onload = getMaxWidth;
window.onresize = getMaxWidth;
/* ]]> */{/literal}</script>
{/if}
</head>
<body>
body {
color: #000;
background: #fff;
margin: 0;
padding: 0;
font-family: verdana, arial, sans-serif;
font-size: 1em;
font-size: 1rem;
line-height: 1.5;
}
body > * {
padding-block: 0;
padding-inline: 0.5em;
}
header {
margin: 0;
background: #f9f9f9;
border-bottom: 1px solid #bacbdf;
display: flex;
justify-content: space-between;
position: sticky;
top: 0;
left: 0;
width: 100%;
}
header > * {
margin:0;
padding:0;
}
main {
margin-inline: 0;
margin-block: 0.5em;
}
h1 {
font-size: 1em;
font-weight: bold;
}
.caution,
.ok {
margin-block: 0.5em;
padding: 0 0 0 24px;
background-repeat:no-repeat;
background-position: 2px 3px;
}
.caution h2,
.ok h2 {
font-size: 1em;
margin: 0 0 0.5em 0;
}
.caution {
color: #cc0000;
background-image:url({/literal}{$THEMES_DIR}/{$settings.theme}{literal}/images/caution.png);
}
.ok {
color:green;
background-image:url({/literal}{$THEMES_DIR}/{$settings.theme}{literal}/images/tick.png);
}
.deletelink {
padding-left:13px;
background:url({/literal}{$THEMES_DIR}/{$settings.theme}{literal}/images/bg_sprite_3.png) no-repeat 1px -45px;
}
.insert-desc,
.deletelink,
.small {
font-size: 0.82em;
}
code {
font-family:"courier new", courier, monospace;
color:#000080;
}
.insert-desc > * {
margin-block: 0 0.25em;
}
.insert-desc > *:last-child {
margin-block: 0;
}
a {
color:#00c;
text-decoration: none;
}
a:focus,
a:hover {
color:#00f;
text-decoration: underline dotted 9% #45f;
}
a:active {
color:#f00;
text-decoration: underline solid 7% #d00;
}
form > div:not(:last-child) {
margin-block-end: .75em;
}
ul {
list-style:none;
margin-block:0.5em;
padding: 0;
}
#imgtab {
display:flex;
flex-direction:column;
gap:0.75em;
min-width: 20em;
max-width: 40em;
margin-inline: auto;
}
#del-upload-form {
text-align:center;
}
#imgtab li {
display: flex;
flex-direction: column;
gap: 0.5em;
align-items: center;
width: 100%;
}
li > *:last-child {
align-content:center;
}
img {
border:none;
display: block;
}
#imgtab img {
max-width: 100%;
margin-inline: auto;
}
#imgtab:not(.shrinked) img {
cursor: pointer;
}
#imgtab.shrinked img {
max-width: 50%;
height: auto;
}
.buttonbar {
display: flex;
flex-wrap: wrap;
gap: 0.3em;
}
button {
cursor: pointer;
}
#imgtab li button:has(> img) {
background: transparent;
border: none;
padding: 0;
}
.invisible {
visibility: hidden;
}
{/literal}
</style>
<script>{literal}
/**
* function for inserting uploaded images into
* a posting from the uploaded images gallery
*/
function insertCode() {
const clickedButton = event.target.closest('button');
if (clickedButton === null)
return false;
const imagePath = clickedButton.querySelector('img').getAttribute('src');
if (opener && opener.mlfBBCodeButton) {
const bbcodeButton = opener.mlfBBCodeButton;
if (!bbcodeButton.canInsert())
return false;
const buttonGroup = bbcodeButton.getButtonGroup();
const txtarea = buttonGroup.getTextArea();
txtarea.insertTextRange( txtarea.getSelection() + "[img]" + imagePath + "[/img]" );
}
//self.close();
}
window.addEventListener('DOMContentLoaded', function() {
if (document.querySelector('#imgtab button')) {
document.querySelector('#imgtab').addEventListener('click', insertCode);
}
if (document.querySelector('button[name="upload_img"]')) {
document.querySelector('button[name="upload_img"]').addEventListener('click', function() {
const throbber = document.getElementById('throbber-submit');
if (throbber.classList.contains('invisible')) {
throbber.classList.remove('invisible');
}
});
}
if (document.querySelector('div.insert-desc')) {
const descriptors = document.querySelectorAll('div.insert-desc');
descriptors.forEach(function (descriptor) {
const description = document.createElement('p');
description.textContent = '{/literal}{#insert_image_exp#|escape:quotes}{literal}';
descriptor.replaceChildren(description);
});
}
});
{/literal}</script>
</head>
<body>
{if $form}
<div id="wrapper">
<h1>{#upload_image_hl#}</h1>
<header>
<h1>{#upload_image_hl#}</h1>
</header>
<main>
{if $errors}
<p class="caution">{#error_headline#}</p>
<ul>
<div class="caution">
<h2>{#error_headline#}</h2>
<ul>
{section name=mysec loop=$errors}
<li>{assign var="error" value=$errors[mysec]}{$smarty.config.$error|replace:"[width]":$width|replace:"[height]":$height|replace:"[filesize]":$filesize|replace:"[max_width]":$max_width|replace:"[max_height]":$max_height|replace:"[max_filesize]":$max_filesize|replace:"[server_max_filesize]":$server_max_filesize}</li>
<li>{assign var="error" value=$errors[mysec]}{$smarty.config.$error|replace:"[width]":$width|replace:"[height]":$height|replace:"[filesize]":$filesize|replace:"[max_width]":$max_width|replace:"[max_height]":$max_height|replace:"[max_filesize]":$max_filesize|replace:"[server_max_filesize]":$server_max_filesize}</li>
{/section}
</ul>
</ul>
</div>
{/if}
<form id="uploadform" action="index.php" method="post" enctype="multipart/form-data" accept-charset="{#charset#}">
<div>
<input type="hidden" name="mode" value="upload_image" />
<p><input type="file" name="probe" size="17" /></p>
<p><input type="submit" name="" value="{#upload_image_button#}" onclick="document.getElementById('throbber-submit').style.visibility='visible'" /> <img id="throbber-submit" style="visibility:hidden;" src="{$THEMES_DIR}/{$theme}/images/throbber_submit.gif" alt="" width="16" height="16" /></p>
</div>
</form>
<p class="small"><a href="index.php?mode=upload_image&amp;browse_images=1">{#browse_uploaded_images#}</a></p>
</div>
<form id="upload-form" action="index.php" method="post" enctype="multipart/form-data" accept-charset="{#charset#}">
<input type="hidden" name="mode" value="upload_image" />
<div>
<input type="file" name="probe" size="17" />
</div>
<div class="buttonbar">
<button name="upload_img" value="{#upload_image_button#}">{#upload_image_button#}</button>
<img id="throbber-submit" class="invisible" src="{$THEMES_DIR}/{$theme}/images/throbber_submit.gif" alt="" width="16" height="16" />
</div>
</form>
<p class="small"><a href="index.php?mode=upload_image&amp;browse_images=1">{#browse_uploaded_images#}</a></p>
</main>
{elseif $uploaded_file}
<div id="wrapper">
<h1>{#upload_image_hl#}</h1>
<p class="ok">{#upload_successful#}</p>
{*<script type="text/javascript">/* <![CDATA[ */document.write('<p>{#insert_image_exp#|escape:quotes}<\/p>'); /* ]]> */</script>*}
<noscript><p>{#insert_image_exp_no_js#}</p>
<p><code>[img]images/uploaded/{$uploaded_file}[/img]</code></p></noscript>
<img class="uploaded" src="images/uploaded/{$uploaded_file}" title="{#insert_image#}" {*onclick="insertCode('images/uploaded/{$uploaded_file}'); return false;" *}alt="{#insert_image#}" />
{if $image_downsized}<p class="small">{$smarty.config.image_downsized|replace:"[width]":$new_width|replace:"[height]":$new_height|replace:"[filesize]":$new_filesize}</p>{/if}
</div>
<script type="text/javascript">/* <![CDATA[ */ insertCode('images/uploaded/{$uploaded_file}'); /* ]]> */</script>
<header>
<h1>{#upload_image_hl#}</h1>
</header>
<main>
<div class="ok">
<h2>{#upload_successful#}</h2>
</div>
<ul id="imgtab" class="shrinked">
<li>
<div>
<button type="button">
<img src="images/uploaded/{$uploaded_file}" title="{#insert_image#}" alt="{#insert_image#}" />
</button>
</div>
<div class="insert-desc">
<p>{#insert_image_exp_no_js#}</p>
<p><code>[img]images/uploaded/{$uploaded_file}[/img]</code></p>
</div>
</li>
</ul>
{if $image_downsized} <p class="small">{$smarty.config.image_downsized|replace:"[width]":$new_width|replace:"[height]":$new_height|replace:"[filesize]":$new_filesize}</p>{/if}
<p class="small"><a href="index.php?mode=upload_image&amp;browse_images=1">{#browse_uploaded_images#}</a></p>
</main>
{elseif $browse_images}
<div id="header">
<div id="nav-1"><a href="index.php?mode=upload_image">{#back#}</a></div>
<div id="nav-2">{if $previous}[ <a href="index.php?mode=upload_image&amp;browse_images={$previous}" title="{#previous_page_link_title#}">&laquo;</a> ]{/if}{if $previous && next} {/if}{if $next}[ <a href="index.php?mode=upload_image&amp;browse_images={$next}" title="{#next_page_link_title#}">&raquo;</a> ]{/if}</div>
</div>
<header>
<div id="nav-1"><a href="index.php?mode=upload_image">{#back#}</a></div>
<div id="nav-2">{if $previous}[ <a href="index.php?mode=upload_image&amp;browse_images={$previous}" title="{#previous_page_link_title#}">&laquo;</a> ]{/if}{if $previous && next} {/if}{if $next}[ <a href="index.php?mode=upload_image&amp;browse_images={$next}" title="{#next_page_link_title#}">&raquo;</a> ]{/if}</div>
</header>
{if $images}
<table id="imgtab" border="0" cellpadding="5" cellspacing="1">
<main>
<ul id="imgtab">
{section name=nr loop=$images start=$start max=$images_per_page}
{cycle values="odd,even" assign=c}
<tr class="{$c}">
<td><img class="browse" src="images/uploaded/{$images[nr]}" title="{#insert_image#}" onclick="insertCode('images/uploaded/{$images[nr]}'); self.close();" alt="{#insert_image#}" />{if $admin || $mod}<br /><a class="deletelink" href="index.php?mode=upload_image&amp;delete={$images[nr]}&amp;current={$current}">{#delete#}</a>{/if}</td>
</tr>
<li>
<div>
<button type="button">
<img src="images/uploaded/{$images[nr]}" title="{#insert_image#}" alt="{#insert_image#}" />
</button>
</div>
<div class="insert-desc">
<p>{#insert_image_exp_no_js#}</p>
<p><code>[img]images/uploaded/{$images[nr]}[/img]</code></p>
</div>
{if $admin || $mod} <div><a class="deletelink" href="index.php?mode=upload_image&amp;delete={$images[nr]}&amp;current={$current}">{#delete#}</a></div>
{/if}
</li>
{/section}
</table>
</ul>
</main>
{else}
<div id="wrapper">
<p>{#no_images#}</p>
</div>
<main>
<p>{#no_images#}</p>
</main>
{/if}
{elseif $delete_confirm}
<div id="header">
<div id="nav-1"><a href="index.php?mode=upload_image&amp;browse_images={$current|default:'1'}">{#back#}</a></div>
</div>
<div id="wrapper">
<p class="caution">{#delete_image_confirm#}</p>
<p><img class="delete" src="images/uploaded/{$delete}" alt="{$delete}" /></p>
<form id="uploadform" action="index.php" method="post" accept-charset="{#charset#}">
<div>
<input type="hidden" name="mode" value="upload_image" />
<input type="hidden" name="delete" value="{$delete}" />
{if $current}<input type="hidden" name="current" value="{$current}" />{/if}
<input type="submit" name="delete_confirm" value="{#delete_image_button#}" />
</div>
</form>
</div>
<header>
<div id="nav-1"><a href="index.php?mode=upload_image&amp;browse_images={$current|default:'1'}">{#back#}</a></div>
</header>
<main>
<div class="caution">
<h2>{#delete_image_confirm#}</h2>
</div>
<ul id="imgtab" class="shrinked">
<li><img src="images/uploaded/{$delete}" alt="{$delete}" /></li>
</ul>
<form id="del-upload-form" action="index.php" method="post" accept-charset="{#charset#}">
<input type="hidden" name="mode" value="upload_image" />
<input type="hidden" name="delete" value="{$delete}" />
{if $current} <input type="hidden" name="current" value="{$current}" />{/if}
<div>
<button name="delete_confirm" value="{#delete_image_button#}">{#delete_image_button#}</button>
</div>
</form>
</main>
{else}
<div id="wrapper">
<p class="caution">{#image_upload_not_enabled#}</p>
</div>
<main>
<div class="caution">
<h2>{#image_upload_not_enabled#}</h2>
</div>
</main>
{/if}
</body>
</html>

File diff suppressed because it is too large Load diff