From c8b0b3939daf4fcb271b5d613d2d9540c2847ec0 Mon Sep 17 00:00:00 2001 From: chevereto Date: Sat, 20 Apr 2024 15:54:04 +0000 Subject: [PATCH] Automatic push 4.1.0 --- .github/workflows/release.yml | 12 +- .package/4.0.12.txt | 14 - .package/4.1.0.txt | 30 + .package/README.txt | 4 +- README.md | 2 + app/composer.json | 3 +- app/composer.lock | 239 +++----- app/legacy/install/installer.php | 43 +- app/legacy/install/template/finished.php | 4 +- app/legacy/install/template/ready.php | 2 +- app/legacy/load/app.php | 4 +- app/legacy/load/web.php | 18 +- app/legacy/routes/account.php | 8 +- app/legacy/routes/album.php | 3 +- app/legacy/routes/api.php | 3 +- app/legacy/routes/dashboard.php | 198 ++++-- app/legacy/routes/explore.php | 3 + app/legacy/routes/image.php | 160 ++--- app/legacy/routes/json.php | 4 +- app/legacy/routes/login.php | 3 +- app/legacy/routes/oembed.php | 14 +- app/legacy/routes/signup.php | 2 +- app/legacy/routes/user.php | 5 +- app/schemas/mysql-5/images.sql | 14 +- app/schemas/mysql-5/storages.sql | 1 + app/schemas/mysql-8/images.sql | 16 +- app/schemas/mysql-8/storages.sql | 3 +- app/src/Legacy/Classes/Album.php | 12 +- app/src/Legacy/Classes/DB.php | 6 +- app/src/Legacy/Classes/Fonts.php | 76 +++ app/src/Legacy/Classes/Image.php | 274 +++++---- app/src/Legacy/Classes/Listing.php | 14 +- app/src/Legacy/Classes/Settings.php | 4 +- app/src/Legacy/Classes/Upload.php | 68 ++- app/src/Legacy/Classes/User.php | 2 +- app/src/Legacy/G/DB.php | 6 +- app/src/Legacy/G/functions.php | 44 ++ app/src/Legacy/functions-render.php | 57 +- app/src/Legacy/functions.php | 12 +- app/upgrading.php | 20 +- .../system/chevereto-ultimate-remix.png | Bin 0 -> 174252 bytes content/legacy/system/style.css | 10 + content/legacy/system/style.min.css | 2 +- content/legacy/themes/Peafowl/head.php | 1 + content/legacy/themes/Peafowl/header.php | 30 +- .../legacy/themes/Peafowl/lib/chevereto.js | 564 +++++++++++------- .../themes/Peafowl/lib/chevereto.min.js | 8 +- .../legacy/themes/Peafowl/lib/js/scripts.js | 3 + .../themes/Peafowl/lib/js/scripts.min.js | 10 +- content/legacy/themes/Peafowl/lib/peafowl.css | 40 +- content/legacy/themes/Peafowl/lib/peafowl.js | 12 +- .../legacy/themes/Peafowl/lib/peafowl.min.css | 2 +- .../legacy/themes/Peafowl/lib/peafowl.min.js | 8 +- .../Peafowl/snippets/anywhere_upload.php | 30 +- .../legacy/themes/Peafowl/snippets/embed.php | 115 ++-- .../themes/Peafowl/snippets/footer.js.php | 5 +- .../themes/Peafowl/snippets/image.js.php | 2 + .../legacy/themes/Peafowl/snippets/tabs.php | 1 - .../Peafowl/snippets/theme_colors.css.php | 18 - .../Peafowl/snippets/theme_fonts.css.php | 22 + .../Peafowl/snippets/viewer_template.php | 15 +- content/legacy/themes/Peafowl/style.css | 175 ++++-- content/legacy/themes/Peafowl/style.min.css | 2 +- .../themes/Peafowl/tpl_list_item/album.php | 4 +- .../Peafowl/tpl_list_item/album/image.php | 4 +- .../Peafowl/tpl_list_item/album_password.php | 2 +- .../themes/Peafowl/tpl_list_item/image.php | 1 + .../tpl_list_item/image_description_guest.php | 4 +- .../tpl_list_item/image_description_owner.php | 4 +- .../image_description_private.php | 4 +- .../tpl_list_item/image_description_user.php | 4 +- .../Peafowl/tpl_list_item/image_plain.php | 1 + .../tpl_list_item/item_duration_time.php | 1 + .../themes/Peafowl/tpl_list_item/user.php | 2 +- .../Peafowl/tpl_list_item/user/album.php | 4 +- .../Peafowl/tpl_list_item/user/user.php | 4 +- content/legacy/themes/Peafowl/views/album.php | 2 +- .../views/dashboard/settings/content.php | 17 +- .../{image-upload.php => file-upload.php} | 32 +- .../views/dashboard/settings/languages.php | 12 +- .../views/dashboard/settings/theme.php | 16 + .../views/dashboard/settings/tools.php | 15 +- .../views/dashboard/settings/website.php | 29 +- .../themes/Peafowl/views/dashboard/stats.php | 150 ++--- .../views/dashboard/top-sub-bar/settings.php | 2 +- content/legacy/themes/Peafowl/views/image.php | 34 +- content/legacy/themes/Peafowl/views/index.php | 4 +- .../themes/Peafowl/views/settings/account.php | 2 +- content/legacy/themes/Peafowl/views/user.php | 2 +- sdk/pup.js | 57 +- sdk/pup.min.js | 2 +- 91 files changed, 1743 insertions(+), 1154 deletions(-) delete mode 100644 .package/4.0.12.txt create mode 100644 .package/4.1.0.txt create mode 100644 app/src/Legacy/Classes/Fonts.php create mode 100644 content/legacy/system/chevereto-ultimate-remix.png create mode 100644 content/legacy/themes/Peafowl/snippets/theme_fonts.css.php create mode 100644 content/legacy/themes/Peafowl/tpl_list_item/item_duration_time.php rename content/legacy/themes/Peafowl/views/dashboard/settings/{image-upload.php => file-upload.php} (91%) diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml index 07edf1c..52fa484 100644 --- a/.github/workflows/release.yml +++ b/.github/workflows/release.yml @@ -15,7 +15,6 @@ jobs: env: tools: composer ini-values: default_charset='UTF-8' - key: cache-1633608016315 name: Release on PHP ${{ matrix.php-versions }} ${{ matrix.operating-system }} steps: - name: Checkout @@ -58,20 +57,12 @@ jobs: mkdir importing/{parse-users,parse-albums,no-parse} mv .package .. ls -la ../.package - - name: Archive lite - uses: thedoctor0/zip-release@master - with: - directory: "." - type: "zip" - filename: "${{ github.ref_name}}-lite.zip" - exclusions: "/*app/vendor/*" - name: Archive release uses: thedoctor0/zip-release@master with: directory: "." type: "zip" filename: "${{ github.ref_name}}.zip" - exclusions: "${{ github.ref_name}}-lite.zip" - name: Upload artifacts uses: ncipollo/release-action@v1 with: @@ -80,6 +71,5 @@ jobs: bodyFile: "../.package/${{ github.ref_name}}.txt" artifacts: > ../.package/${{ github.ref_name}}.txt, - ${{ github.ref_name}}.zip, - ${{ github.ref_name}}-lite.zip + ${{ github.ref_name}}.zip token: ${{ secrets.GITHUB_TOKEN }} diff --git a/.package/4.0.12.txt b/.package/4.0.12.txt deleted file mode 100644 index 1108a05..0000000 --- a/.package/4.0.12.txt +++ /dev/null @@ -1,14 +0,0 @@ -Chevereto 4.0.12 (2024-03-12) - -- ✅ Added cipher (encryption) to album password -- ✅ Added hidden (click to show) album password -- 🐞 Fixed bug in `entrypoints/index.php` -- 🐞 Fixed bug in API route -- 🐞 Fixed bug in Dashboard route -- 🐞 Fixed bug in Settings route -- 🐞 Fixed bug in Signup route -- 🐞 Fixed bug in G\Handler -- 🐞 Fixed bug in `app/upgrading.php` -- 🐞 Fixed bug in empty search string -- 💅 Improved license key handling (mobile) at Dashboard -- 🆙 Updated dependencies diff --git a/.package/4.1.0.txt b/.package/4.1.0.txt new file mode 100644 index 0000000..9e4bf0a --- /dev/null +++ b/.package/4.1.0.txt @@ -0,0 +1,30 @@ +Chevereto 4.1.0 (2024-04-20) + +- 🎥 Added support for video files +- 🎥 Added frame image size for video uploads +- 🎥 Added oEmbed support for video +- 🎥 Added video support for anywhere uploader +- 🎥 Added video support for embed codes +- 🎥 Added Video to Discovery (Explore) +- ✅ Added display_title media property +- ✅ Added enabled file type options for External Storage +- ✅ Improved support for PUP.js for SMF 2.1+ +- ✅ Unified embed codes display +- 💅 Added display_title to full screen listing viewer +- 💅 Added edition name at installation details +- 💅 Added one-click theme font configuration +- 💅 Added over effect to display_title on listings +- 💅 Added video duration on listing items +- 💅 Changed "image" references to "file" +- 💅 Changed Trending icon +- 💅 Improved listing icons for like and share +- 💅 Improved password display helper when using Safari +- 💅 Improved uploader size limit display +- 💅 Stop preventing list-item-desc link behavior +- ⏲️ Added button to manually run CRON +- 💬 Added link to Chevereto discord at Dashboard +- 🤚 Added welcome message on new installation +- 🐞 Fixed bug in homepage delete cover action +- 🐞 Fixed bug on upload route +- 🐞 Fixed bug with password protected albums +- 🐞 Fixed unwanted scroll hide top-bar in Safari diff --git a/.package/README.txt b/.package/README.txt index cf50934..65b7aa0 100755 --- a/.package/README.txt +++ b/.package/README.txt @@ -15,6 +15,8 @@ trusting our work. This software exists thanks to your ongoing support. ~ + Rodolfo Berrios A. + https://rodolfoberrios.com/ - GRACIAS + GRACIAS! (Thank you!) diff --git a/README.md b/README.md index 66d774d..147a265 100644 --- a/README.md +++ b/README.md @@ -28,6 +28,8 @@ Chevereto is so **feature-rich**, mature and robust that we need three layers of - [User manual](https://v4-user.chevereto.com/) - [Admin manual](https://v4-admin.chevereto.com/) +## Compare features + **Note:** This is the repository for Chevereto free edition. This software is intended for **personal usage** as it doesn't contain [all the features](https://chevereto.com/features) of commercial editions. This is a short, not exhaustive, list of features available on Chevereto editions. Feel free to request a free demo of the pro edition at [chevereto.com](https://chevereto.com) to see all the features in action. | Feature | Free | Pro | diff --git a/app/composer.json b/app/composer.json index 4444acb..ccccaaf 100644 --- a/app/composer.json +++ b/app/composer.json @@ -44,7 +44,8 @@ "chillerlan/php-qrcode": "^4.3", "firebase/php-jwt": "^6.3", "lychee-org/php-exif": "^0.7.14", - "php-ds/php-ds": "^1.4" + "php-ds/php-ds": "^1.4", + "php-ffmpeg/php-ffmpeg": "^1.2" }, "autoload": { "files": [ diff --git a/app/composer.lock b/app/composer.lock index 235c81c..15ad497 100644 --- a/app/composer.lock +++ b/app/composer.lock @@ -4,20 +4,20 @@ "Read more about it at https://getcomposer.org/doc/01-basic-usage.md#installing-dependencies", "This file is @generated automatically" ], - "content-hash": "64b1e901d23988eeee99248e4f08a229", + "content-hash": "0bbc3dd1b9244ce1f02d783e5b5ff001", "packages": [ { "name": "amphp/amp", - "version": "v2.6.2", + "version": "v2.6.4", "source": { "type": "git", "url": "https://github.com/amphp/amp.git", - "reference": "9d5100cebffa729aaffecd3ad25dc5aeea4f13bb" + "reference": "ded3d9be08f526089eb7ee8d9f16a9768f9dec2d" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/amphp/amp/zipball/9d5100cebffa729aaffecd3ad25dc5aeea4f13bb", - "reference": "9d5100cebffa729aaffecd3ad25dc5aeea4f13bb", + "url": "https://api.github.com/repos/amphp/amp/zipball/ded3d9be08f526089eb7ee8d9f16a9768f9dec2d", + "reference": "ded3d9be08f526089eb7ee8d9f16a9768f9dec2d", "shasum": "" }, "require": { @@ -29,8 +29,8 @@ "ext-json": "*", "jetbrains/phpstorm-stubs": "^2019.3", "phpunit/phpunit": "^7 | ^8 | ^9", - "psalm/phar": "^3.11@dev", - "react/promise": "^2" + "react/promise": "^2", + "vimeo/psalm": "^3.12" }, "type": "library", "extra": { @@ -85,7 +85,7 @@ "support": { "irc": "irc://irc.freenode.org/amphp", "issues": "https://github.com/amphp/amp/issues", - "source": "https://github.com/amphp/amp/tree/v2.6.2" + "source": "https://github.com/amphp/amp/tree/v2.6.4" }, "funding": [ { @@ -93,20 +93,20 @@ "type": "github" } ], - "time": "2022-02-20T17:52:18+00:00" + "time": "2024-03-21T18:52:26+00:00" }, { "name": "amphp/byte-stream", - "version": "v1.8.1", + "version": "v1.8.2", "source": { "type": "git", "url": "https://github.com/amphp/byte-stream.git", - "reference": "acbd8002b3536485c997c4e019206b3f10ca15bd" + "reference": "4f0e968ba3798a423730f567b1b50d3441c16ddc" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/amphp/byte-stream/zipball/acbd8002b3536485c997c4e019206b3f10ca15bd", - "reference": "acbd8002b3536485c997c4e019206b3f10ca15bd", + "url": "https://api.github.com/repos/amphp/byte-stream/zipball/4f0e968ba3798a423730f567b1b50d3441c16ddc", + "reference": "4f0e968ba3798a423730f567b1b50d3441c16ddc", "shasum": "" }, "require": { @@ -122,11 +122,6 @@ "psalm/phar": "^3.11.4" }, "type": "library", - "extra": { - "branch-alias": { - "dev-master": "1.x-dev" - } - }, "autoload": { "files": [ "lib/functions.php" @@ -150,7 +145,7 @@ } ], "description": "A stream abstraction to make working with non-blocking I/O simple.", - "homepage": "http://amphp.org/byte-stream", + "homepage": "https://amphp.org/byte-stream", "keywords": [ "amp", "amphp", @@ -160,9 +155,8 @@ "stream" ], "support": { - "irc": "irc://irc.freenode.org/amphp", "issues": "https://github.com/amphp/byte-stream/issues", - "source": "https://github.com/amphp/byte-stream/tree/v1.8.1" + "source": "https://github.com/amphp/byte-stream/tree/v1.8.2" }, "funding": [ { @@ -170,7 +164,7 @@ "type": "github" } ], - "time": "2021-03-30T17:13:30+00:00" + "time": "2024-04-13T18:00:56+00:00" }, { "name": "amphp/parallel", @@ -248,16 +242,16 @@ }, { "name": "amphp/parser", - "version": "v1.1.0", + "version": "v1.1.1", "source": { "type": "git", "url": "https://github.com/amphp/parser.git", - "reference": "ff1de4144726c5dad5fab97f66692ebe8de3e151" + "reference": "3cf1f8b32a0171d4b1bed93d25617637a77cded7" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/amphp/parser/zipball/ff1de4144726c5dad5fab97f66692ebe8de3e151", - "reference": "ff1de4144726c5dad5fab97f66692ebe8de3e151", + "url": "https://api.github.com/repos/amphp/parser/zipball/3cf1f8b32a0171d4b1bed93d25617637a77cded7", + "reference": "3cf1f8b32a0171d4b1bed93d25617637a77cded7", "shasum": "" }, "require": { @@ -298,7 +292,7 @@ ], "support": { "issues": "https://github.com/amphp/parser/issues", - "source": "https://github.com/amphp/parser/tree/v1.1.0" + "source": "https://github.com/amphp/parser/tree/v1.1.1" }, "funding": [ { @@ -306,26 +300,26 @@ "type": "github" } ], - "time": "2022-12-30T18:08:47+00:00" + "time": "2024-03-21T19:16:53+00:00" }, { "name": "amphp/process", - "version": "v1.1.5", + "version": "v1.1.7", "source": { "type": "git", "url": "https://github.com/amphp/process.git", - "reference": "04b4517bbfe436ab822b853d511165dafbfe115a" + "reference": "1949d85b6d71af2818ff68144304a98495628f19" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/amphp/process/zipball/04b4517bbfe436ab822b853d511165dafbfe115a", - "reference": "04b4517bbfe436ab822b853d511165dafbfe115a", + "url": "https://api.github.com/repos/amphp/process/zipball/1949d85b6d71af2818ff68144304a98495628f19", + "reference": "1949d85b6d71af2818ff68144304a98495628f19", "shasum": "" }, "require": { "amphp/amp": "^2", "amphp/byte-stream": "^1.4", - "php": ">=7" + "php": ">=7.1" }, "require-dev": { "amphp/php-cs-fixer-config": "dev-master", @@ -363,7 +357,7 @@ "homepage": "https://github.com/amphp/process", "support": { "issues": "https://github.com/amphp/process/issues", - "source": "https://github.com/amphp/process/tree/v1.1.5" + "source": "https://github.com/amphp/process/tree/v1.1.7" }, "funding": [ { @@ -371,7 +365,7 @@ "type": "github" } ], - "time": "2024-02-24T21:06:11+00:00" + "time": "2024-04-19T03:00:28+00:00" }, { "name": "amphp/serialization", @@ -1155,28 +1149,28 @@ }, { "name": "composer/ca-bundle", - "version": "1.4.1", + "version": "1.5.0", "source": { "type": "git", "url": "https://github.com/composer/ca-bundle.git", - "reference": "3ce240142f6d59b808dd65c1f52f7a1c252e6cfd" + "reference": "0c5ccfcfea312b5c5a190a21ac5cef93f74baf99" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/composer/ca-bundle/zipball/3ce240142f6d59b808dd65c1f52f7a1c252e6cfd", - "reference": "3ce240142f6d59b808dd65c1f52f7a1c252e6cfd", + "url": "https://api.github.com/repos/composer/ca-bundle/zipball/0c5ccfcfea312b5c5a190a21ac5cef93f74baf99", + "reference": "0c5ccfcfea312b5c5a190a21ac5cef93f74baf99", "shasum": "" }, "require": { "ext-openssl": "*", "ext-pcre": "*", - "php": "^5.3.2 || ^7.0 || ^8.0" + "php": "^7.2 || ^8.0" }, "require-dev": { - "phpstan/phpstan": "^0.12.55", + "phpstan/phpstan": "^1.10", "psr/log": "^1.0", "symfony/phpunit-bridge": "^4.2 || ^5", - "symfony/process": "^2.5 || ^3.0 || ^4.0 || ^5.0 || ^6.0 || ^7.0" + "symfony/process": "^4.0 || ^5.0 || ^6.0 || ^7.0" }, "type": "library", "extra": { @@ -1211,7 +1205,7 @@ "support": { "irc": "irc://irc.freenode.org/composer", "issues": "https://github.com/composer/ca-bundle/issues", - "source": "https://github.com/composer/ca-bundle/tree/1.4.1" + "source": "https://github.com/composer/ca-bundle/tree/1.5.0" }, "funding": [ { @@ -1227,7 +1221,7 @@ "type": "tidelift" } ], - "time": "2024-02-23T10:16:52+00:00" + "time": "2024-03-15T14:00:32+00:00" }, { "name": "evenement/evenement", @@ -3595,16 +3589,16 @@ }, { "name": "react/http", - "version": "v1.9.0", + "version": "v1.10.0", "source": { "type": "git", "url": "https://github.com/reactphp/http.git", - "reference": "bb3154dbaf2dfe3f0467f956a05f614a69d5f1d0" + "reference": "8111281ee57f22b7194f5dba225e609ba7ce4d20" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/reactphp/http/zipball/bb3154dbaf2dfe3f0467f956a05f614a69d5f1d0", - "reference": "bb3154dbaf2dfe3f0467f956a05f614a69d5f1d0", + "url": "https://api.github.com/repos/reactphp/http/zipball/8111281ee57f22b7194f5dba225e609ba7ce4d20", + "reference": "8111281ee57f22b7194f5dba225e609ba7ce4d20", "shasum": "" }, "require": { @@ -3615,14 +3609,13 @@ "react/event-loop": "^1.2", "react/promise": "^3 || ^2.3 || ^1.2.1", "react/socket": "^1.12", - "react/stream": "^1.2", - "ringcentral/psr7": "^1.2" + "react/stream": "^1.2" }, "require-dev": { "clue/http-proxy-react": "^1.8", "clue/reactphp-ssh-proxy": "^1.4", "clue/socks-react": "^1.4", - "phpunit/phpunit": "^9.5 || ^5.7 || ^4.8.35", + "phpunit/phpunit": "^9.6 || ^5.7 || ^4.8.36", "react/async": "^4 || ^3 || ^2", "react/promise-stream": "^1.4", "react/promise-timer": "^1.9" @@ -3675,7 +3668,7 @@ ], "support": { "issues": "https://github.com/reactphp/http/issues", - "source": "https://github.com/reactphp/http/tree/v1.9.0" + "source": "https://github.com/reactphp/http/tree/v1.10.0" }, "funding": [ { @@ -3683,7 +3676,7 @@ "type": "open_collective" } ], - "time": "2023-04-26T10:29:24+00:00" + "time": "2024-03-27T17:20:46+00:00" }, { "name": "react/promise", @@ -3916,67 +3909,6 @@ ], "time": "2023-06-16T10:52:11+00:00" }, - { - "name": "ringcentral/psr7", - "version": "1.3.0", - "source": { - "type": "git", - "url": "https://github.com/ringcentral/psr7.git", - "reference": "360faaec4b563958b673fb52bbe94e37f14bc686" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/ringcentral/psr7/zipball/360faaec4b563958b673fb52bbe94e37f14bc686", - "reference": "360faaec4b563958b673fb52bbe94e37f14bc686", - "shasum": "" - }, - "require": { - "php": ">=5.3", - "psr/http-message": "~1.0" - }, - "provide": { - "psr/http-message-implementation": "1.0" - }, - "require-dev": { - "phpunit/phpunit": "~4.0" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "1.0-dev" - } - }, - "autoload": { - "files": [ - "src/functions_include.php" - ], - "psr-4": { - "RingCentral\\Psr7\\": "src/" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Michael Dowling", - "email": "mtdowling@gmail.com", - "homepage": "https://github.com/mtdowling" - } - ], - "description": "PSR-7 message implementation", - "keywords": [ - "http", - "message", - "stream", - "uri" - ], - "support": { - "source": "https://github.com/ringcentral/psr7/tree/master" - }, - "time": "2018-05-29T20:21:04+00:00" - }, { "name": "rodber/php-sse-react", "version": "0.1.0", @@ -4151,16 +4083,16 @@ }, { "name": "symfony/cache", - "version": "v5.4.36", + "version": "v5.4.38", "source": { "type": "git", "url": "https://github.com/symfony/cache.git", - "reference": "a30f316214d908cf5874f700f3f3fb29ceee91ba" + "reference": "223c3afac82e003a76931b71d77db408636a0de8" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/cache/zipball/a30f316214d908cf5874f700f3f3fb29ceee91ba", - "reference": "a30f316214d908cf5874f700f3f3fb29ceee91ba", + "url": "https://api.github.com/repos/symfony/cache/zipball/223c3afac82e003a76931b71d77db408636a0de8", + "reference": "223c3afac82e003a76931b71d77db408636a0de8", "shasum": "" }, "require": { @@ -4228,7 +4160,7 @@ "psr6" ], "support": { - "source": "https://github.com/symfony/cache/tree/v5.4.36" + "source": "https://github.com/symfony/cache/tree/v5.4.38" }, "funding": [ { @@ -4244,20 +4176,20 @@ "type": "tidelift" } ], - "time": "2024-02-19T13:08:14+00:00" + "time": "2024-03-19T09:55:32+00:00" }, { "name": "symfony/cache-contracts", - "version": "v2.5.2", + "version": "v2.5.3", "source": { "type": "git", "url": "https://github.com/symfony/cache-contracts.git", - "reference": "64be4a7acb83b6f2bf6de9a02cee6dad41277ebc" + "reference": "fee6db04d913094e2fb55ff8e7db5685a8134463" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/cache-contracts/zipball/64be4a7acb83b6f2bf6de9a02cee6dad41277ebc", - "reference": "64be4a7acb83b6f2bf6de9a02cee6dad41277ebc", + "url": "https://api.github.com/repos/symfony/cache-contracts/zipball/fee6db04d913094e2fb55ff8e7db5685a8134463", + "reference": "fee6db04d913094e2fb55ff8e7db5685a8134463", "shasum": "" }, "require": { @@ -4307,7 +4239,7 @@ "standards" ], "support": { - "source": "https://github.com/symfony/cache-contracts/tree/v2.5.2" + "source": "https://github.com/symfony/cache-contracts/tree/v2.5.3" }, "funding": [ { @@ -4323,7 +4255,7 @@ "type": "tidelift" } ], - "time": "2022-01-02T09:53:40+00:00" + "time": "2024-01-23T13:51:25+00:00" }, { "name": "symfony/deprecation-contracts", @@ -5211,21 +5143,21 @@ }, { "name": "nikic/php-parser", - "version": "v4.18.0", + "version": "v4.19.1", "source": { "type": "git", "url": "https://github.com/nikic/PHP-Parser.git", - "reference": "1bcbb2179f97633e98bbbc87044ee2611c7d7999" + "reference": "4e1b88d21c69391150ace211e9eaf05810858d0b" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/nikic/PHP-Parser/zipball/1bcbb2179f97633e98bbbc87044ee2611c7d7999", - "reference": "1bcbb2179f97633e98bbbc87044ee2611c7d7999", + "url": "https://api.github.com/repos/nikic/PHP-Parser/zipball/4e1b88d21c69391150ace211e9eaf05810858d0b", + "reference": "4e1b88d21c69391150ace211e9eaf05810858d0b", "shasum": "" }, "require": { "ext-tokenizer": "*", - "php": ">=7.0" + "php": ">=7.1" }, "require-dev": { "ircmaxell/php-yacc": "^0.0.7", @@ -5261,9 +5193,9 @@ ], "support": { "issues": "https://github.com/nikic/PHP-Parser/issues", - "source": "https://github.com/nikic/PHP-Parser/tree/v4.18.0" + "source": "https://github.com/nikic/PHP-Parser/tree/v4.19.1" }, - "time": "2023-12-10T21:03:43+00:00" + "time": "2024-03-17T08:10:35+00:00" }, { "name": "phar-io/manifest", @@ -5385,16 +5317,16 @@ }, { "name": "phpstan/phpstan", - "version": "1.10.60", + "version": "1.10.67", "source": { "type": "git", "url": "https://github.com/phpstan/phpstan.git", - "reference": "95dcea7d6c628a3f2f56d091d8a0219485a86bbe" + "reference": "16ddbe776f10da6a95ebd25de7c1dbed397dc493" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/phpstan/phpstan/zipball/95dcea7d6c628a3f2f56d091d8a0219485a86bbe", - "reference": "95dcea7d6c628a3f2f56d091d8a0219485a86bbe", + "url": "https://api.github.com/repos/phpstan/phpstan/zipball/16ddbe776f10da6a95ebd25de7c1dbed397dc493", + "reference": "16ddbe776f10da6a95ebd25de7c1dbed397dc493", "shasum": "" }, "require": { @@ -5437,13 +5369,9 @@ { "url": "https://github.com/phpstan", "type": "github" - }, - { - "url": "https://tidelift.com/funding/github/packagist/phpstan/phpstan", - "type": "tidelift" } ], - "time": "2024-03-07T13:30:19+00:00" + "time": "2024-04-16T07:22:02+00:00" }, { "name": "phpunit/php-code-coverage", @@ -5766,16 +5694,16 @@ }, { "name": "phpunit/phpunit", - "version": "9.6.17", + "version": "9.6.19", "source": { "type": "git", "url": "https://github.com/sebastianbergmann/phpunit.git", - "reference": "1a156980d78a6666721b7e8e8502fe210b587fcd" + "reference": "a1a54a473501ef4cdeaae4e06891674114d79db8" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/phpunit/zipball/1a156980d78a6666721b7e8e8502fe210b587fcd", - "reference": "1a156980d78a6666721b7e8e8502fe210b587fcd", + "url": "https://api.github.com/repos/sebastianbergmann/phpunit/zipball/a1a54a473501ef4cdeaae4e06891674114d79db8", + "reference": "a1a54a473501ef4cdeaae4e06891674114d79db8", "shasum": "" }, "require": { @@ -5849,7 +5777,7 @@ "support": { "issues": "https://github.com/sebastianbergmann/phpunit/issues", "security": "https://github.com/sebastianbergmann/phpunit/security/policy", - "source": "https://github.com/sebastianbergmann/phpunit/tree/9.6.17" + "source": "https://github.com/sebastianbergmann/phpunit/tree/9.6.19" }, "funding": [ { @@ -5865,7 +5793,7 @@ "type": "tidelift" } ], - "time": "2024-02-23T13:14:51+00:00" + "time": "2024-04-05T04:35:58+00:00" }, { "name": "psy/psysh", @@ -6809,16 +6737,16 @@ }, { "name": "sebastian/resource-operations", - "version": "3.0.3", + "version": "3.0.4", "source": { "type": "git", "url": "https://github.com/sebastianbergmann/resource-operations.git", - "reference": "0f4443cb3a1d92ce809899753bc0d5d5a8dd19a8" + "reference": "05d5692a7993ecccd56a03e40cd7e5b09b1d404e" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/resource-operations/zipball/0f4443cb3a1d92ce809899753bc0d5d5a8dd19a8", - "reference": "0f4443cb3a1d92ce809899753bc0d5d5a8dd19a8", + "url": "https://api.github.com/repos/sebastianbergmann/resource-operations/zipball/05d5692a7993ecccd56a03e40cd7e5b09b1d404e", + "reference": "05d5692a7993ecccd56a03e40cd7e5b09b1d404e", "shasum": "" }, "require": { @@ -6830,7 +6758,7 @@ "type": "library", "extra": { "branch-alias": { - "dev-master": "3.0-dev" + "dev-main": "3.0-dev" } }, "autoload": { @@ -6851,8 +6779,7 @@ "description": "Provides a list of PHP built-in functions that operate on resources", "homepage": "https://www.github.com/sebastianbergmann/resource-operations", "support": { - "issues": "https://github.com/sebastianbergmann/resource-operations/issues", - "source": "https://github.com/sebastianbergmann/resource-operations/tree/3.0.3" + "source": "https://github.com/sebastianbergmann/resource-operations/tree/3.0.4" }, "funding": [ { @@ -6860,7 +6787,7 @@ "type": "github" } ], - "time": "2020-09-28T06:45:17+00:00" + "time": "2024-03-14T16:00:52+00:00" }, { "name": "sebastian/type", diff --git a/app/legacy/install/installer.php b/app/legacy/install/installer.php index 5c3fddc..506d58b 100644 --- a/app/legacy/install/installer.php +++ b/app/legacy/install/installer.php @@ -480,7 +480,7 @@ $settings_updates = [ ], '3.13.5' => null, '3.14.0' => [ - 'upload_enabled_image_formats' => 'jpg,png,bmp,gif,webp', + // 'upload_enabled_image_formats' => 'jpg,png,bmp,gif,webp', ], '3.14.1' => null, '3.15.0' => [ @@ -596,6 +596,11 @@ $settings_updates = [ ], '4.0.11' => null, '4.0.12' => null, + '4.1.0' => [ + 'twitter_account' => '', + 'theme_font' => '0', + 'upload_enabled_image_formats' => 'jpg,png,bmp,gif,webp,mp4,webm', + ], ]; $cheveretoFreeMap = [ '1.0.0' => '3.8.3', @@ -1827,6 +1832,42 @@ ALTER TABLE `%table_prefix%users` CONVERT TO CHARACTER SET utf8mb4 COLLATE utf8m ], ] ], + '4.1.0' => [ + 'storages' => [ + 'storage_type_chain' => [ + 'op' => 'ADD', + 'type' => 'tinyint(3) UNSIGNED NOT NULL', + 'prop' => 'DEFAULT "1"', + ] + ], + 'images' => [ + 'image_size' => [ + 'op' => 'MODIFY', + 'type' => 'bigint(11)', + 'prop' => "UNSIGNED NOT NULL", + ], + 'image_frame_size' => [ + 'op' => 'ADD', + 'type' => 'int(11)', + 'prop' => "NOT NULL DEFAULT '0'", + ], + 'image_duration' => [ + 'op' => 'ADD', + 'type' => 'int(11)', + 'prop' => "NOT NULL DEFAULT '0'", + ], + 'image_type' => [ + 'op' => 'ADD', + 'type' => 'tinyint(3) UNSIGNED', + 'prop' => "as (case + when `image_extension` in ('pdf', 'doc', 'md') then 4 + when `image_extension` in ('mp3', 'm4a', 'wav') then 3 + when `image_extension` in ('mp4', 'webm') then 2 + when `image_extension` in ('jpg', 'jpeg', 'gif', 'png', 'webp') then 1 + else 0 end) stored" + ], + ] + ], ]; $sql_update = []; if (!$maintenance) { diff --git a/app/legacy/install/template/finished.php b/app/legacy/install/template/finished.php index ec02992..f4a98f8 100644 --- a/app/legacy/install/template/finished.php +++ b/app/legacy/install/template/finished.php @@ -7,9 +7,9 @@ if (!defined('ACCESS') || !ACCESS) { die('This file cannot be directly accessed.'); } ?>

Installation complete

-

admin dashboard and configure your website.', ['%s' => get_chevereto_version(true), '%u' => get_base_url('dashboard')]); ?>

+

admin dashboard and configure your website.', ['%s' => get_chevereto_version(true), '%u' => get_base_url('dashboard/?welcome')]); ?>

- Dashboard + Dashboard Website
diff --git a/app/legacy/install/template/ready.php b/app/legacy/install/template/ready.php index 6cdf326..335eeab 100644 --- a/app/legacy/install/template/ready.php +++ b/app/legacy/install/template/ready.php @@ -25,7 +25,7 @@ if (!defined('ACCESS') || !ACCESS) {
- +
diff --git a/app/legacy/load/app.php b/app/legacy/load/app.php index 165db39..dd7d18d 100644 --- a/app/legacy/load/app.php +++ b/app/legacy/load/app.php @@ -9,5 +9,5 @@ * file that was distributed with this source code. */ -const APP_VERSION = '4.0.12'; -const APP_VERSION_AKA = 'macanudo'; +const APP_VERSION = '4.1.0'; +const APP_VERSION_AKA = 'pulento'; diff --git a/app/legacy/load/web.php b/app/legacy/load/web.php index cc2023a..adc2cc9 100644 --- a/app/legacy/load/web.php +++ b/app/legacy/load/web.php @@ -12,6 +12,7 @@ use Chevereto\Config\Config; use function Chevereto\Legacy\badgePaid; use Chevereto\Legacy\Classes\DB; +use Chevereto\Legacy\Classes\Fonts; use Chevereto\Legacy\Classes\Image; use Chevereto\Legacy\Classes\IpBan; use Chevereto\Legacy\Classes\L10n; @@ -21,6 +22,7 @@ use Chevereto\Legacy\Classes\Palettes; use Chevereto\Legacy\Classes\RequestLog; use Chevereto\Legacy\Classes\Settings; use Chevereto\Legacy\Classes\User; +use function Chevereto\Legacy\editionCombo; use function Chevereto\Legacy\G\get_base_url; use function Chevereto\Legacy\G\get_current_url; use Chevereto\Legacy\G\Handler; @@ -130,10 +132,10 @@ $hook_before = function (Handler $handler) { if ($handler::cond('content_manager')) { $moderateLink = get_base_url('moderate'); $moderateLabel = _s('Moderate'); - if (!(bool) env()['CHEVERETO_ENABLE_MODERATION']) { + if (!in_array('pro', editionCombo()[env()['CHEVERETO_EDITION']])) { if ((bool) env()['CHEVERETO_ENABLE_EXPOSE_PAID_FEATURES']) { $moderateLink = 'https://chevereto.com/pricing'; - $moderateLabel .= ' ' . badgePaid(); + $moderateLabel .= ' ' . badgePaid('pro'); } else { $showContentManager = false; } @@ -160,6 +162,10 @@ $hook_before = function (Handler $handler) { $handler::setVar('canonical', null); $palettes = new Palettes(); $handler::setVar('palettes', $palettes); + $fonts = new Fonts(); + $handler::setVar('fonts', $fonts); + $fontId = intval(getSetting('theme_font') ?? 0); + $handler::setVar('theme_font', $fontId); if (in_array($handler->request_array()[0], ['login', 'signup', 'account'])) { $paletteId = 0; } else { @@ -353,12 +359,16 @@ $hook_before = function (Handler $handler) { ], 'trending' => [ 'label' => _s('Trending'), - 'icon' => 'fas fa-poll', + 'icon' => 'fas fa-chart-simple', ], 'popular' => [ 'label' => _s('Popular'), 'icon' => 'fas fa-heart', ], + 'videos' => [ + 'label' => _s('Videos'), + 'icon' => 'fas fa-video', + ], 'animated' => [ 'label' => _s('Animated'), 'icon' => 'fas fa-play', @@ -370,7 +380,7 @@ $hook_before = function (Handler $handler) { if (!getSetting('enable_likes')) { unset($explore_semantics['popular']); } - if (!in_array('gif', Image::getEnabledImageFormats())) { + if (!in_array('gif', Image::getEnabledImageExtensions())) { unset($explore_semantics['animated']); } foreach ($explore_semantics as $k => &$v) { diff --git a/app/legacy/routes/account.php b/app/legacy/routes/account.php index 1daeaaf..8d38cb8 100644 --- a/app/legacy/routes/account.php +++ b/app/legacy/routes/account.php @@ -111,7 +111,7 @@ return function (Handler $handler) { $keysToCheck = array_keys($keysToCheck); if (in_array($doing, $keysToCheck)) { $request_log = RequestLog::getCounts($request_db_field, 'fail'); - $captcha_needed = getSettings()['captcha'] + $captcha_needed = (getSetting('captcha') ?? false) ? must_use_captcha($request_log['day']) : false; } @@ -264,7 +264,7 @@ return function (Handler $handler) { 'type' => $request_db_field, 'user_id' => $user['id'] ?? null ]); - if (getSettings()['captcha'] + if ((getSetting('captcha') ?? false) && isset($request_log) && must_use_captcha($request_log['day'] + 1)) { $captcha_needed = true; @@ -463,7 +463,7 @@ return function (Handler $handler) { 'user_id' => $user['id'] ?? null ] ); - if (getSettings()['captcha'] + if ((getSetting('captcha') ?? false) && isset($request_log) && must_use_captcha($request_log['day'] + 1)) { $captcha_needed = true; @@ -501,7 +501,7 @@ return function (Handler $handler) { 'result' => 'fail', 'user_id' => $logged_user['id'] ]); - if (getSettings()['captcha'] + if ((getSetting('captcha') ?? false) && isset($request_log) && must_use_captcha($request_log['day'] + 1)) { $captcha_needed = true; diff --git a/app/legacy/routes/album.php b/app/legacy/routes/album.php index 550d2a8..73bec6e 100644 --- a/app/legacy/routes/album.php +++ b/app/legacy/routes/album.php @@ -24,7 +24,6 @@ use function Chevereto\Legacy\G\url_to_relative; use function Chevereto\Legacy\get_share_links; use function Chevereto\Legacy\getIdFromURLComponent; use function Chevereto\Legacy\getSetting; -use function Chevereto\Legacy\getSettings; use function Chevereto\Legacy\is_max_invalid_request; use function Chevereto\Legacy\isShowEmbedContent; use function Chevereto\Legacy\must_use_captcha; @@ -149,7 +148,7 @@ return function (Handler $handler) { $handler::setCond('error', $is_error); $handler::setVar('error', $error_message); if ($is_error) { - if (getSettings()['captcha'] && must_use_captcha($failed_access_requests['day'] + 1)) { + if ((getSetting('captcha') ?? false) && must_use_captcha($failed_access_requests['day'] + 1)) { $captcha_needed = true; } $handler::setCond('captcha_needed', $captcha_needed); diff --git a/app/legacy/routes/api.php b/app/legacy/routes/api.php index 06c02a4..a9b69de 100644 --- a/app/legacy/routes/api.php +++ b/app/legacy/routes/api.php @@ -164,6 +164,7 @@ return function (Handler $handler) { 'title' => $REQUEST['title'] ?? $REQUEST['name'] ?? null, 'width' => $REQUEST['width'] ?? null, 'expiration' => $expiration, + 'mimetype' => $REQUEST['mimetype'] ?? 'image/jpeg', ]; $params = array_filter($params); if (!$handler::cond('content_manager') && getSetting('akismet')) { @@ -188,7 +189,7 @@ return function (Handler $handler) { $json_array['status'] = $json_array['status_code']; $image['id'] = $image['id_encoded']; } - $json_array['success'] = ['message' => 'image uploaded', 'code' => 200]; + $json_array['success'] = ['message' => 'file uploaded', 'code' => 200]; $json_array[$isImgBBSpec ? 'data' : 'image'] = $image; if ($version == 1) { diff --git a/app/legacy/routes/dashboard.php b/app/legacy/routes/dashboard.php index 0f2b9f5..7ddf3f6 100644 --- a/app/legacy/routes/dashboard.php +++ b/app/legacy/routes/dashboard.php @@ -15,6 +15,7 @@ use function Chevereto\Encryption\hasEncryption; use function Chevereto\Legacy\badgePaid; use Chevereto\Legacy\Classes\Akismet; use Chevereto\Legacy\Classes\Arachnid; +use Chevereto\Legacy\Classes\AssetStorage; use Chevereto\Legacy\Classes\DB; use Chevereto\Legacy\Classes\Image; use Chevereto\Legacy\Classes\L10n; @@ -26,7 +27,9 @@ use Chevereto\Legacy\Classes\Settings; use Chevereto\Legacy\Classes\Stat; use Chevereto\Legacy\Classes\Upload; use Chevereto\Legacy\Classes\User; +use function Chevereto\Legacy\editionCombo; use function Chevereto\Legacy\G\abbreviate_number; +use function Chevereto\Legacy\G\absolute_to_relative; use function Chevereto\Legacy\G\absolute_to_url; use function Chevereto\Legacy\G\check_value; use function Chevereto\Legacy\G\datetime_diff; @@ -122,44 +125,47 @@ return function (Handler $handler) { $route_prefix = 'dashboard'; $routes = [ 'stats' => _s('Home'), - 'images' => _s('Images'), + 'images' => _n('File', 'Files', 20), 'albums' => _n('Album', 'Albums', 20), 'users' => _n('User', 'Users', 20), 'bulk-importer' => _s('Bulk importer'), 'settings' => _s('Settings'), + 'run-cron' => _s('Run cron'), ]; $routesLinkLabels = $routes; $paidRoutes = []; $paidRoutesEnv = [ - 'images' => 'CHEVERETO_ENABLE_USERS', - 'albums' => 'CHEVERETO_ENABLE_USERS', - 'users' => 'CHEVERETO_ENABLE_USERS', - 'bulk-importer' => 'CHEVERETO_ENABLE_BULK_IMPORTER', + 'albums' => ['lite', 'CHEVERETO_ENABLE_USERS'], + 'bulk-importer' => ['pro', 'CHEVERETO_ENABLE_BULK_IMPORTER'], + 'images' => ['lite', 'CHEVERETO_ENABLE_USERS'], + 'users' => ['lite', 'CHEVERETO_ENABLE_USERS'], ]; foreach ($paidRoutesEnv as $k => $v) { - if (!(bool) env()['CHEVERETO_ENABLE_EXPOSE_PAID_FEATURES'] && !(bool) env()[$v]) { + $isEnabled = in_array($v[0], editionCombo()[env()['CHEVERETO_EDITION']]); + if (!(bool) env()['CHEVERETO_ENABLE_EXPOSE_PAID_FEATURES'] && !$isEnabled) { unset($routes[$k]); continue; } - if (!(bool) env()[$v]) { + if (!$isEnabled) { array_push($paidRoutes, $k); - $routes[$k] .= ' ' . badgePaid(); + $routes[$k] .= ' ' . badgePaid($v[0]); } } $icons = [ - 'stats' => 'fas fa-home', - 'images' => 'fas fa-image', 'albums' => 'fas fa-images', - 'users' => 'fas fa-users', - 'settings' => 'fas fa-cog', 'bulk-importer' => 'fas fa-layer-group', + 'images' => 'fas fa-photo-film', + 'run-cron' => 'fas fa-bolt', + 'settings' => 'fas fa-cog', + 'stats' => 'fas fa-home', + 'users' => 'fas fa-users', ]; $settings_sections = [ 'website' => _s('Website'), 'content' => _s('Content'), 'listings' => _s('Listings'), - 'image-upload' => _s('Image upload'), + 'file-upload' => _s('File upload'), 'semantics' => _s('Semantics'), 'categories' => _s('Categories'), 'theme' => _s('Theme'), @@ -168,24 +174,23 @@ return function (Handler $handler) { 'email' => _s('Email'), 'tools' => _s('Tools'), 'logo' => _s('Logo'), - 'external-storage' => _s('External storage'), 'homepage' => _s('Homepage'), 'pages' => _s('Pages'), + 'upload-plugin' => _s('Upload plugin'), + 'consent-screen' => _s('Consent screen'), + 'users' => _n('User', 'Users', 20), + 'guest-api' => _s('Guests %s', 'API'), + 'external-storage' => _s('External storage'), 'routing' => _s('Routing'), 'external-services' => _s('External services'), 'login-providers' => _s('Login providers'), - 'upload-plugin' => _s('Upload plugin'), 'cookie-compliance' => _s('Cookie compliance'), - 'consent-screen' => _s('Consent screen'), 'flood-protection' => _s('Flood protection'), 'banners' => _s('Banners'), 'ip-bans' => _s('IP bans'), - 'users' => _n('User', 'Users', 20), - 'guest-api' => _s('Guests %s', 'API'), 'watermarks' => _s('Watermarks'), ]; $settings_sections_icons = [ - 'upload-plugin' => 'fas fa-plus', 'banners' => 'fas fa-scroll', 'categories' => 'fas fa-columns', 'consent-screen' => 'fas fa-desktop', @@ -194,43 +199,43 @@ return function (Handler $handler) { 'email' => 'fas fa-at', 'external-services' => 'fas fa-concierge-bell', 'external-storage' => 'fas fa-hdd', + 'file-upload' => 'fas fa-cloud-upload-alt', 'flood-protection' => 'fas fa-faucet', 'guest-api' => 'fas fa-project-diagram', 'homepage' => 'fas fa-home', - 'image-upload' => 'fas fa-cloud-upload-alt', - 'semantics' => 'fas fa-sign-hanging', 'ip-bans' => 'fas fa-ban', 'languages' => 'fas fa-language', 'listings' => 'fas fa-th-list', - 'logo' => 'fas fa-gem', 'login-providers' => 'fas fa-right-to-bracket', + 'logo' => 'fas fa-gem', 'pages' => 'fas fa-file', 'routing' => 'fas fa-route', + 'semantics' => 'fas fa-sign-hanging', 'system' => 'fas fa-server', 'theme' => 'fas fa-paint-brush', 'tools' => 'fas fa-tools', - 'users' => 'fas fa-users-cog', - 'website' => 'fas fa-globe', 'upload-plugin' => 'fas fa-plug', + 'users' => 'fas fa-users-cog', 'watermarks' => 'fas fa-tint', + 'website' => 'fas fa-globe', ]; $paidSettingsEnv = [ - 'banners' => 'CHEVERETO_ENABLE_BANNERS', - 'consent-screen' => 'CHEVERETO_ENABLE_CONSENT_SCREEN', - 'cookie-compliance' => 'CHEVERETO_ENABLE_COOKIE_COMPLIANCE', - 'external-services' => 'CHEVERETO_ENABLE_EXTERNAL_SERVICES', - 'external-storage' => 'CHEVERETO_ENABLE_EXTERNAL_STORAGE', - 'flood-protection' => 'CHEVERETO_ENABLE_UPLOAD_FLOOD_PROTECTION', - 'guest-api' => 'CHEVERETO_ENABLE_API_GUEST', - 'homepage' => 'CHEVERETO_ENABLE_USERS', - 'ip-bans' => 'CHEVERETO_ENABLE_IP_BANS', - 'logo' => 'CHEVERETO_ENABLE_LOGO', - 'login-providers' => 'CHEVERETO_ENABLE_LOGIN_PROVIDERS', - 'pages' => 'CHEVERETO_ENABLE_PAGES', - 'routing' => 'CHEVERETO_ENABLE_ROUTING', - 'upload-plugin' => 'CHEVERETO_ENABLE_UPLOAD_PLUGIN', - 'users' => 'CHEVERETO_ENABLE_USERS', - 'watermarks' => 'CHEVERETO_ENABLE_UPLOAD_WATERMARK', + 'banners' => ['pro', 'CHEVERETO_ENABLE_BANNERS'], + 'consent-screen' => ['lite', 'CHEVERETO_ENABLE_CONSENT_SCREEN'], + 'cookie-compliance' => ['pro', 'CHEVERETO_ENABLE_COOKIE_COMPLIANCE'], + 'external-services' => ['pro', 'CHEVERETO_ENABLE_EXTERNAL_SERVICES'], + 'external-storage' => ['pro', 'CHEVERETO_ENABLE_EXTERNAL_STORAGE'], + 'flood-protection' => ['pro', 'CHEVERETO_ENABLE_UPLOAD_FLOOD_PROTECTION'], + 'guest-api' => ['lite', 'CHEVERETO_ENABLE_API_GUEST'], + 'homepage' => ['lite', 'CHEVERETO_ENABLE_USERS'], + 'ip-bans' => ['pro', 'CHEVERETO_ENABLE_IP_BANS'], + 'login-providers' => ['pro', 'CHEVERETO_ENABLE_LOGIN_PROVIDERS'], + 'logo' => ['lite', 'CHEVERETO_ENABLE_LOGO'], + 'pages' => ['lite', 'CHEVERETO_ENABLE_PAGES'], + 'routing' => ['pro', 'CHEVERETO_ENABLE_ROUTING'], + 'upload-plugin' => ['lite', 'CHEVERETO_ENABLE_UPLOAD_PLUGIN'], + 'users' => ['lite', 'CHEVERETO_ENABLE_USERS'], + 'watermarks' => ['pro', 'CHEVERETO_ENABLE_UPLOAD_WATERMARK'], ]; $paidSettings = []; $default_route = 'stats'; @@ -261,6 +266,8 @@ return function (Handler $handler) { $handler::setVar('docsBaseUrl', 'https://v4-docs.chevereto.com/'); $handler::setVar('adminDocsBaseUrl', 'https://v4-admin.chevereto.com/'); $handler::setVar('userDocsBaseUrl', 'https://v4-user.chevereto.com/'); + // hidden routes + unset($route_menu['run-cron'], $routes['run-cron'], $routesLinkLabels['run-cron']); $handler::setVar($route_prefix . '_menu', $route_menu); $handler::setVar('tabs', $route_menu); $is_error = false; @@ -273,7 +280,33 @@ return function (Handler $handler) { if (in_array($doing, $paidRoutes)) { $handler->issueError(404); } + switch ($doing) { + case 'run-cron': + if (!$handler::checkAuthToken(request()['auth_token'] ?? '')) { + $handler->issueError(403); + + return; + } + ini_set('log_errors', true); + ini_set('display_errors', true); + ignore_user_abort(true); + @set_time_limit(0); + ini_set('default_charset', 'utf-8'); + setlocale(LC_ALL, 'en_US.UTF8'); + ini_set('output_buffering', 'off'); + ini_set('zlib.output_compression', false); + echo << + Trigger cron tasks (HTTP API) + -- + + PLAIN; + require_once PATH_APP_LEGACY . 'commands/cron.php'; + echo ''; + die(0); + + break; case 'stats': if (version_compare(getSetting('chevereto_version_installed'), '3.7.0', '<')) { $totals = []; @@ -364,7 +397,12 @@ return function (Handler $handler) { } $install_update_button = ''; $version_check = ''; - $cronRemark = ''; + $cronRemark = '' + . _s('Run cron') + . ' '; $errorLogRemark = ''; $cron_last_ran = Settings::get('cron_last_ran'); if (env()['CHEVERETO_CONTEXT'] !== 'saas') { @@ -387,9 +425,9 @@ return function (Handler $handler) { 'chv_version' => [ 'label' => '
', 'content' => '
' - . '

' + . '

' . $chv_version['files'] - . '' . APP_VERSION_AKA . '

' + . '' . APP_VERSION_AKA . '

' . $install_update_button . '
' . $version_check . $linksButtons . '
' @@ -403,7 +441,7 @@ return function (Handler $handler) { ], 'rebuild_stats' => [ 'label' => _s('Stats'), - 'content' => ' ' . _s('Rebuild stats') . '' + 'content' => '' . _s('Rebuild stats') . '' ], 'connecting_ip' => [ 'label' => _s('Connecting IP'), @@ -413,9 +451,18 @@ return function (Handler $handler) { 'label' => _s('Encryption'), 'content' => ' ' . (hasEncryption() ? _s('Enabled') : _s('Disabled')) ], + 'meta' => [ + 'label' => _s('Meta'), + 'content' => 'CheverexrDebug' + ], ]; $cheveretoLinks = [ + [ + 'label' => _s('Blog'), + 'icon' => 'fas fa-blog', + 'href' => 'https://blog.chevereto.com' + ], [ 'label' => _s('Docs'), 'icon' => 'fas fa-book', @@ -431,6 +478,11 @@ return function (Handler $handler) { 'icon' => 'fas fa-medkit', 'href' => 'https://chevereto.com/support' ], + [ + 'label' => _s('Chat'), + 'icon' => 'fas fa-comments', + 'href' => 'https://chevereto.com/go/discord' + ], [ 'label' => _s('Community'), 'icon' => 'fas fa-users', @@ -474,20 +526,30 @@ return function (Handler $handler) { ], 'server' => [ 'label' => _s('Server'), - 'content' => ' ' . ((server()['SERVER_SOFTWARE'] ?? '🐍') . ' ~ ' . gethostname() . ' ' . PHP_OS . '/' . PHP_SAPI . ((env()['CHEVERETO_SERVICING'] ?? null) === 'docker' ? ' Docker' : '')) + 'content' => ' ' + . ( + (server()['SERVER_SOFTWARE'] ?? '🐍') + . ' ~ ' . gethostname() + . '
' + . PHP_OS + . '/' + . PHP_SAPI + . ((env()['CHEVERETO_SERVICING'] ?? null) === 'docker' + ? ' Docker' + : '') + ) ], - 'mysql_version' => [ - 'label' => _s('MySQL version'), - 'content' => ' ' . $mysqlVersion - ], - 'mysql_server_info' => [ - 'label' => _s('MySQL server info'), - 'content' => ' ' . $mysqlServerInfo + 'mysql' => [ + 'label' => 'MySQL', + 'content' => ' ' + . $mysqlVersion + . '
' + . $mysqlServerInfo ], 'file_uploads' => [ 'label' => _s('File uploads'), 'content' => (int) ini_get('file_uploads') == 1 - ? ' ' . _s('Enabled') + ? ' ' . _s('Enabled') : ' ' . _s('Disabled') ], 'max_execution_time' => [ @@ -538,9 +600,10 @@ return function (Handler $handler) { $settingsSectionsTitles = $settings_sections; if ((bool) env()['CHEVERETO_ENABLE_EXPOSE_PAID_FEATURES']) { foreach ($paidSettingsEnv as $k => $v) { - if (!(bool) env()[$v]) { + $isEnabled = in_array($v[0], editionCombo()[env()['CHEVERETO_EDITION']]); + if (!$isEnabled) { array_push($paidSettings, $k); - $settings_sections[$k] .= ' ' . badgePaid(); + $settings_sections[$k] .= ' ' . badgePaid($v[0]); } } } @@ -576,10 +639,17 @@ return function (Handler $handler) { if (in_array($requestSetting, $paidSettings)) { $requestSetting = ''; $handler->issueError(404); + + return; } switch ($requestSetting) { case 'homepage': if ((get()['action'] ?? '') == 'delete-cover' && isset(get()['cover'])) { + if (!$handler::checkAuthToken(request()['auth_token'] ?? '')) { + $handler->issueError(403); + + return; + } $cover_index = get()['cover'] - 1; $homecovers = getSetting('homepage_cover_images'); $cover_target = $homecovers[$cover_index]; @@ -595,7 +665,8 @@ return function (Handler $handler) { // Try to delete the image (disk) if (!starts_with('default/', $cover_target['basename'])) { $cover_file = PATH_PUBLIC_CONTENT_IMAGES_SYSTEM . $cover_target['basename']; - unlinkIfExists($cover_file); + $storagePath = ltrim(absolute_to_relative($cover_file), '/'); + AssetStorage::deleteFiles(['key' => $storagePath]); } unset($homecovers[$cover_index]); $homecovers = array_values($homecovers); @@ -960,6 +1031,14 @@ return function (Handler $handler) { 'validate' => empty($POST['theme_logo_height']) ? (true) : is_integer($POST['theme_logo_height']), 'error_msg' => _s('Invalid value') ], + 'theme_font' => + [ + 'validate' => isset($POST['theme_font']) && in_array( + $POST['theme_font'], + array_keys($handler::var('fonts')->get()) + ), + 'error_msg' => _s('Invalid %s', _s('font')) + ], 'theme_palette' => [ 'validate' => isset($POST['theme_palette']) && in_array( @@ -1573,9 +1652,10 @@ return function (Handler $handler) { $is_changed = true; $reset_notices = false; $settings_to_vars = [ - 'website_doctitle' => 'doctitle', - 'website_description' => 'meta_description', - ]; + 'website_doctitle' => 'doctitle', + 'website_description' => 'meta_description', + 'theme_font' => 'theme_font' + ]; foreach (array_keys($update_settings) as $k) { if ($k == 'maintenance') { $reset_notices = true; diff --git a/app/legacy/routes/explore.php b/app/legacy/routes/explore.php index 249d18d..d6e67b9 100644 --- a/app/legacy/routes/explore.php +++ b/app/legacy/routes/explore.php @@ -65,6 +65,9 @@ return function (Handler $handler) { if ($doing == 'animated') { $listingParams['params_hidden']['is_animated'] = 1; } + if ($doing == 'videos') { + $listingParams['params_hidden']['is_video'] = 1; + } $getParams = Listing::getParams(request()); $tabs = Listing::getTabs($listingParams, $getParams, true); $currentKey = $tabs['currentKey']; diff --git a/app/legacy/routes/image.php b/app/legacy/routes/image.php index 962bc65..6eb81db 100644 --- a/app/legacy/routes/image.php +++ b/app/legacy/routes/image.php @@ -16,8 +16,9 @@ use Chevereto\Legacy\Classes\Login; use Chevereto\Legacy\Classes\User; use function Chevereto\Legacy\encodeID; use function Chevereto\Legacy\G\get_current_url; +use function Chevereto\Legacy\G\get_global; use Chevereto\Legacy\G\Handler; -use function Chevereto\Legacy\G\html_to_bbcode; +use function Chevereto\Legacy\G\include_theme_file; use function Chevereto\Legacy\G\is_animated_image; use function Chevereto\Legacy\G\redirect; use function Chevereto\Legacy\G\safe_html; @@ -55,7 +56,6 @@ return function (Handler $handler) { if (!isset(session()['image_view_stock'])) { sessionVar()->put('image_view_stock', []); } - $logged_user = Login::getUser(); User::statusRedirect($logged_user['status'] ?? null); $image = Image::getSingle($id, !in_array($id, session()['image_view_stock']), true, $logged_user); @@ -149,7 +149,7 @@ return function (Handler $handler) { : $image_safe_html['name'] . '.' . $image['extension'] . ' hosted at ' . getSetting('website_name'); $tabs = []; $tabs[] = [ - 'icon' => 'fas fa-image', + 'icon' => 'fas fa-list-ul', 'label' => _s('About'), 'id' => 'tab-about', 'current' => true, @@ -273,124 +273,46 @@ return function (Handler $handler) { } $handler::setVar('share_links_array', get_share_links()); $handler::setVar('privacy', $image['album']['privacy'] ?? ''); + include_theme_file('snippets/embed'); + $embed_share_tpl = get_global('embed_share_tpl'); + $sharing = [ + '%URL_VIEWER%' => $image['url_viewer'], + '%URL%' => $image['url'], + '%DISPLAY_URL%' => $image['display_url'], + '%DISPLAY_TITLE%' => $image['display_title'], + '%URL_FRAME%' => $image['url_frame'], + '%THUMB_URL%' => $image['thumb']['url'], + '%MEDIUM_URL%' => $image['medium']['url'] ?? '', + ]; $embed = []; - $embed['direct-links'] = [ - 'label' => _s('Direct links'), - 'entries' => [ - [ - 'label' => _s('Image link'), - 'value' => $image['url_short'], - ], - [ - 'label' => _s('Image URL'), - 'value' => $image['url'], - ], - [ - 'label' => _s('Thumbnail URL'), - 'value' => $image['thumb']['url'] ?? '', - ], - ], - ]; - if (isset($image['medium'])) { - $embed['direct-links']['entries'][] = [ - 'label' => _s('Medium URL'), - 'value' => $image['medium']['url'] ?? '', - ]; - } - $image_full = [ - 'html' => '' . $image['filename'] . '', - 'markdown' => '![' . $image['filename'] . '](' . $image['url'] . ')', - ]; - $image_full['bbcode'] = html_to_bbcode($image_full['html']); - $embed['full-image'] = [ - 'label' => _s('Full image'), - 'entries' => [ - [ - 'label' => 'HTML', - 'value' => htmlentities($image_full['html']), - ], - [ - 'label' => 'BBCode', - 'value' => $image_full['bbcode'], - ], - [ - 'label' => 'Markdown', - 'value' => $image_full['markdown'], - ], - ], - ]; - $embed_full_linked['html'] = '' . $image_full['html'] . ''; - $embed_full_linked['bbcode'] = html_to_bbcode($embed_full_linked['html']); - $embed_full_linked['markdown'] = '[![' . $image['filename'] . '](' . $image['url'] . ')](' . $image['url_short'] . ')'; - $embed['full-linked'] = [ - 'label' => _s('Full image (linked)'), - 'entries' => [ - [ - 'label' => 'HTML', - 'value' => htmlentities($embed_full_linked['html']), - ], - [ - 'label' => 'BBCode', - 'value' => $embed_full_linked['bbcode'], - ], - [ - 'label' => 'Markdown', - 'value' => $embed_full_linked['markdown'], - ], - ], - ]; - if (isset($image['medium'])) { - $embed_medium_linked = [ - 'html' => '' . $image['filename'] . '', - ]; - $embed_medium_linked['bbcode'] = html_to_bbcode($embed_medium_linked['html']); - $embed_medium_linked['markdown'] = '[![' . $image['medium']['filename'] . '](' . $image['medium']['url'] . ')](' . $image['url_short'] . ')'; - $embed['medium-linked'] = [ - 'label' => _s('Medium image (linked)'), - 'entries' => [ - [ - 'label' => 'HTML', - 'value' => htmlentities($embed_medium_linked['html']), - ], - [ - 'label' => 'BBCode', - 'value' => $embed_medium_linked['bbcode'], - ], - [ - 'label' => 'Markdown', - 'value' => $embed_medium_linked['markdown'], - ], - ], - ]; - } - $embed_thumb_linked = [ - 'html' => '' . $image['filename'] . '', - ]; - $embed_thumb_linked['bbcode'] = html_to_bbcode($embed_thumb_linked['html']); - $embed_thumb_linked['markdown'] = '[![' . $image['thumb']['filename'] . '](' . $image['thumb']['url'] . ')](' . $image['url_short'] . ')'; - $embed['thumb-linked'] = [ - 'label' => _s('Thumbnail image (linked)'), - 'entries' => [ - [ - 'label' => 'HTML', - 'value' => htmlentities($embed_thumb_linked['html']), - ], - [ - 'label' => 'BBCode', - 'value' => $embed_thumb_linked['bbcode'], - ], - [ - 'label' => 'Markdown', - 'value' => $embed_thumb_linked['markdown'], - ], - ], - ]; - $embed_id = 1; - foreach ($embed as &$v) { - foreach ($v['entries'] as &$entry) { - $entry['id'] = 'embed-code-' . $embed_id; - ++$embed_id; + foreach ($embed_share_tpl as $code => $group) { + $entries = []; + $groupLabel = $group['label']; + foreach ($group['options'] as $option => $optionValue) { + $value = $optionValue['template']; + if (is_array($value)) { + $value = $value[$image['type']]; + } + $value = strtr($value, $sharing); + if ($value === '') { + continue; + } + if (str_contains($option, 'html')) { + $value = htmlentities($value); + } + $label = $optionValue['label']; + $label = str_ireplace($groupLabel, '', $label); + $label = ucfirst(trim($label)); + $entries[] = [ + 'label' => $label, + 'value' => $value, + 'id' => $option + ]; } + $embed[$code] = [ + 'label' => $group['label'], + 'entries' => $entries + ]; } $handler::setVar('embed', $embed); $addValue = session()['image_view_stock'] ?? []; diff --git a/app/legacy/routes/json.php b/app/legacy/routes/json.php index b3827a9..efcbdb5 100644 --- a/app/legacy/routes/json.php +++ b/app/legacy/routes/json.php @@ -130,7 +130,7 @@ return function (Handler $handler) { } $uploaded_id = intval($uploadToWebsite[0]); $json_array['status_code'] = 200; - $json_array['success'] = ['message' => 'image uploaded', 'code' => 200]; + $json_array['success'] = ['message' => 'file uploaded', 'code' => 200]; $image = Image::getSingle($uploaded_id); if ($image === []) { throw new LogicException( @@ -421,7 +421,7 @@ return function (Handler $handler) { 'image' => ['category_id', 'title', 'description', 'album_id', 'nsfw'], 'album' => ['name', 'privacy', 'album_id', 'description', 'password'], 'category' => ['name', 'description', 'url_key'], - 'storage' => ['name', 'bucket', 'region', 'url', 'server', 'capacity', 'is_https', 'is_active', 'api_id', 'key', 'secret', 'account_id', 'account_name'], + 'storage' => ['name', 'bucket', 'region', 'url', 'server', 'capacity', 'is_https', 'is_active', 'api_id', 'key', 'secret', 'account_id', 'account_name', 'type_chain'], 'ip_ban' => ['ip', 'expires', 'message'], ]; if (Handler::cond('content_manager')) { diff --git a/app/legacy/routes/login.php b/app/legacy/routes/login.php index 266668a..0f4a509 100644 --- a/app/legacy/routes/login.php +++ b/app/legacy/routes/login.php @@ -17,7 +17,6 @@ use Chevereto\Legacy\Classes\User; use Chevereto\Legacy\G\Handler; use function Chevereto\Legacy\G\redirect; use function Chevereto\Legacy\getSetting; -use function Chevereto\Legacy\getSettings; use function Chevereto\Legacy\must_use_captcha; use function Chevereto\Vars\env; use function Chevereto\Vars\post; @@ -111,7 +110,7 @@ return function (Handler $handler) { $request_log_insert['result'] = 'fail'; RequestLog::insert($request_log_insert); $error_message = _s('Wrong Username/Email password combination'); - if (getSettings()['captcha'] && must_use_captcha($failed_access_requests['day'] + 1)) { + if ((getSetting('captcha') ?? false) && must_use_captcha($failed_access_requests['day'] + 1)) { $captcha_needed = true; } } diff --git a/app/legacy/routes/oembed.php b/app/legacy/routes/oembed.php index bba1689..e5fa878 100644 --- a/app/legacy/routes/oembed.php +++ b/app/legacy/routes/oembed.php @@ -63,15 +63,25 @@ return function (Handler $handler) { } $data = [ 'version' => '1.0', - 'type' => 'photo', 'provider_name' => safe_html(Settings::get('website_name')), 'provider_url' => get_public_url(), 'title' => safe_html($image['title']), - 'url' => $image['display_url'], 'web_page' => $image['url_viewer'], 'width' => $image['width'], 'height' => $image['height'], ]; + switch ($image['type']) { + case 'video': + $data['html'] = ''; + $data['type'] = 'video'; + + break; + case 'image': + $data['url'] = $image['display_url']; + $data['type'] = 'photo'; + + break; + } if (isset($image['user'])) { $data = array_merge($data, [ 'author_name' => safe_html($image['user']['username']), diff --git a/app/legacy/routes/signup.php b/app/legacy/routes/signup.php index 812bb86..fddbd3d 100644 --- a/app/legacy/routes/signup.php +++ b/app/legacy/routes/signup.php @@ -226,7 +226,7 @@ return function (Handler $handler) { 'result' => 'fail' ]); $error_message = $error_message ?? _s('Check the errors in the form to continue.'); - if (getSettings()['captcha'] && must_use_captcha($failed_access_requests['day'] + 1)) { + if ((getSetting('captcha') ?? false) && must_use_captcha($failed_access_requests['day'] + 1)) { $captcha_needed = true; } } diff --git a/app/legacy/routes/user.php b/app/legacy/routes/user.php index 2f390bb..f78756c 100644 --- a/app/legacy/routes/user.php +++ b/app/legacy/routes/user.php @@ -104,7 +104,7 @@ return function (Handler $handler) { $user_routes = []; $user_views = [ 'images' => [ - 'title' => _s("%t by %s", ['%t' => _s('Images')]), + 'title' => _s("%t by %s", ['%t' => _s('Media')]), 'title_short' => _s("Images"), ], 'albums' => [ @@ -270,9 +270,8 @@ return function (Handler $handler) { break; } - $icon = 'fas fa-id-card'; $icon = [ - 'images' => 'fas fa-id-card', + 'images' => 'fas fa-photo-film', 'albums' => 'fas fa-images', 'liked' => 'fas fa-heart', 'following' => 'fas fa-rss', diff --git a/app/schemas/mysql-5/images.sql b/app/schemas/mysql-5/images.sql index 14b785d..624ab19 100644 --- a/app/schemas/mysql-5/images.sql +++ b/app/schemas/mysql-5/images.sql @@ -3,7 +3,7 @@ CREATE TABLE `%table_prefix%images` ( `image_id` bigint(32) NOT NULL AUTO_INCREMENT, `image_name` varchar(255) NOT NULL, `image_extension` varchar(255) NOT NULL, - `image_size` int(11) NOT NULL, + `image_size` bigint(11) UNSIGNED NOT NULL, `image_width` int(11) NOT NULL, `image_height` int(11) NOT NULL, `image_date` datetime NOT NULL, @@ -23,14 +23,22 @@ CREATE TABLE `%table_prefix%images` ( `image_original_exifdata` longtext, `image_views` bigint(32) NOT NULL DEFAULT '0', `image_category_id` bigint(32) DEFAULT NULL, - `image_chain` tinyint(128) NOT NULL, + `image_chain` tinyint(3) NOT NULL, `image_thumb_size` int(11) NOT NULL, `image_medium_size` int(11) NOT NULL DEFAULT '0', + `image_frame_size` int(11) NOT NULL DEFAULT '0', `image_expiration_date_gmt` datetime DEFAULT NULL, `image_likes` bigint(32) NOT NULL DEFAULT '0', `image_is_animated` tinyint(1) NOT NULL DEFAULT '0', `image_is_approved` tinyint(1) NOT NULL DEFAULT '1', `image_is_360` tinyint(1) NOT NULL DEFAULT '0', + `image_duration` int(11) NOT NULL DEFAULT '0', + `image_type` tinyint(3) UNSIGNED as (case + when `image_extension` in ('pdf', 'doc', 'md') then 4 + when `image_extension` in ('mp3', 'm4a', 'wav') then 3 + when `image_extension` in ('mp4', 'webm') then 2 + when `image_extension` in ('jpg', 'jpeg', 'gif', 'png', 'webp') then 1 + else 0 end) stored, PRIMARY KEY (`image_id`), KEY `image_name` (`image_name`), KEY `image_extension` (`image_extension`), @@ -56,5 +64,7 @@ CREATE TABLE `%table_prefix%images` ( KEY `image_is_approved` (`image_is_approved`), KEY `image_is_360` (`image_is_360`), KEY `image_album_id_image_id` (`image_album_id`, `image_id`), + KEY `image_duration` (`image_duration`), + KEY `image_type` (`image_type`), FULLTEXT KEY `searchindex` (`image_name`,`image_title`,`image_description`,`image_original_filename`) ) ENGINE=%table_engine% DEFAULT CHARSET=utf8mb4 ROW_FORMAT=DYNAMIC; diff --git a/app/schemas/mysql-5/storages.sql b/app/schemas/mysql-5/storages.sql index f6e3c1b..85ca51e 100644 --- a/app/schemas/mysql-5/storages.sql +++ b/app/schemas/mysql-5/storages.sql @@ -16,6 +16,7 @@ CREATE TABLE `%table_prefix%storages` ( `storage_is_active` tinyint(1) NOT NULL DEFAULT '0', `storage_capacity` bigint(32) DEFAULT NULL, `storage_space_used` bigint(32) DEFAULT '0', + `storage_type_chain` tinyint(3) NOT NULL DEFAULT '1', PRIMARY KEY (`storage_id`), KEY `storage_api_id` (`storage_api_id`), KEY `storage_is_active` (`storage_is_active`) diff --git a/app/schemas/mysql-8/images.sql b/app/schemas/mysql-8/images.sql index 0c8f5f0..8572b63 100644 --- a/app/schemas/mysql-8/images.sql +++ b/app/schemas/mysql-8/images.sql @@ -3,7 +3,7 @@ CREATE TABLE `%table_prefix%images` ( `image_id` bigint(32) NOT NULL AUTO_INCREMENT, `image_name` varchar(255) NOT NULL, `image_extension` varchar(255) NOT NULL, - `image_size` int(11) NOT NULL, + `image_size` bigint(11) UNSIGNED NOT NULL, `image_width` int(11) NOT NULL, `image_height` int(11) NOT NULL, `image_date` datetime NOT NULL, @@ -23,14 +23,22 @@ CREATE TABLE `%table_prefix%images` ( `image_original_exifdata` longtext, `image_views` bigint(32) NOT NULL DEFAULT '0', `image_category_id` bigint(32) DEFAULT NULL, - `image_chain` tinyint(128) NOT NULL, + `image_chain` tinyint(3) NOT NULL, `image_thumb_size` int(11) NOT NULL, `image_medium_size` int(11) NOT NULL DEFAULT '0', + `image_frame_size` int(11) NOT NULL DEFAULT '0', `image_expiration_date_gmt` datetime DEFAULT NULL, `image_likes` bigint(32) NOT NULL DEFAULT '0', `image_is_animated` tinyint(1) NOT NULL DEFAULT '0', `image_is_approved` tinyint(1) NOT NULL DEFAULT '1', `image_is_360` tinyint(1) NOT NULL DEFAULT '0', + `image_duration` int(11) NOT NULL DEFAULT '0', + `image_type` tinyint(3) UNSIGNED as (case + when `image_extension` in ('pdf', 'doc', 'md') then 4 + when `image_extension` in ('mp3', 'm4a', 'wav') then 3 + when `image_extension` in ('mp4', 'webm') then 2 + when `image_extension` in ('jpg', 'jpeg', 'gif', 'png', 'webp') then 1 + else 0 end) stored, PRIMARY KEY (`image_id`), KEY `image_name` (`image_name`), KEY `image_extension` (`image_extension`), @@ -56,5 +64,7 @@ CREATE TABLE `%table_prefix%images` ( KEY `image_is_approved` (`image_is_approved`), KEY `image_is_360` (`image_is_360`), KEY `image_album_id_image_id` (`image_album_id`, `image_id`), + KEY `image_duration` (`image_duration`), + KEY `image_type` (`image_type`), FULLTEXT KEY `searchindex` (`image_name`,`image_title`,`image_description`,`image_original_filename`) -) ENGINE=%table_engine% DEFAULT CHARSET=utf8mb4; \ No newline at end of file +) ENGINE=%table_engine% DEFAULT CHARSET=utf8mb4; diff --git a/app/schemas/mysql-8/storages.sql b/app/schemas/mysql-8/storages.sql index f300bbb..152e7d0 100644 --- a/app/schemas/mysql-8/storages.sql +++ b/app/schemas/mysql-8/storages.sql @@ -16,7 +16,8 @@ CREATE TABLE `%table_prefix%storages` ( `storage_is_active` tinyint(1) NOT NULL DEFAULT '0', `storage_capacity` bigint(32) DEFAULT NULL, `storage_space_used` bigint(32) DEFAULT '0', + `storage_type_chain` tinyint(3) NOT NULL DEFAULT '1', PRIMARY KEY (`storage_id`), KEY `storage_api_id` (`storage_api_id`), KEY `storage_is_active` (`storage_is_active`) -) ENGINE=%table_engine% DEFAULT CHARSET=utf8mb4; \ No newline at end of file +) ENGINE=%table_engine% DEFAULT CHARSET=utf8mb4; diff --git a/app/src/Legacy/Classes/Album.php b/app/src/Legacy/Classes/Album.php index 86f863e..48afabe 100644 --- a/app/src/Legacy/Classes/Album.php +++ b/app/src/Legacy/Classes/Album.php @@ -88,7 +88,11 @@ class Album } $return = $album_db; if (isset($return['album_password']) && hasEncryption()) { - $return['album_password'] = decrypt($return['album_password']); + try { + $return['album_password'] = decrypt($return['album_password']); + } catch (Throwable) { + $return['album_password'] = $return['album_password']; + } } return $pretty @@ -114,7 +118,11 @@ class Album if (hasEncryption()) { foreach ($db_rows as &$row) { if (isset($row['album_password'])) { - $row['album_password'] = decrypt($row['album_password']); + try { + $row['album_password'] = decrypt($row['album_password']); + } catch (Throwable) { + $row['album_password'] = $row['album_password']; + } } } } diff --git a/app/src/Legacy/Classes/DB.php b/app/src/Legacy/Classes/DB.php index ea1f82c..851de82 100644 --- a/app/src/Legacy/Classes/DB.php +++ b/app/src/Legacy/Classes/DB.php @@ -81,13 +81,15 @@ class DB extends GDB string $clause = 'AND', array $sort = [], int $limit = null, - int $fetch_style = PDO::FETCH_ASSOC + int $fetch_style = PDO::FETCH_ASSOC, + array $valuesOperators = [] ): mixed { $prefix = self::getFieldPrefix($table); $values = self::getPrefixedValues($prefix, $values); + $valuesOperators = self::getPrefixedValues($prefix, $valuesOperators); $sort = self::getPrefixedSort($prefix, $sort); - return GDB::get($table, $values, $clause, $sort, $limit, $fetch_style); + return GDB::get($table, $values, $clause, $sort, $limit, $fetch_style, $valuesOperators); } public static function update( diff --git a/app/src/Legacy/Classes/Fonts.php b/app/src/Legacy/Classes/Fonts.php new file mode 100644 index 0000000..7a0d86b --- /dev/null +++ b/app/src/Legacy/Classes/Fonts.php @@ -0,0 +1,76 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Chevereto\Legacy\Classes; + +class Fonts +{ + private array $handles = [ + 0 => 'Helvetica, Arial, sans-serif', + 1 => '"Times New Roman", Times, serif', + 2 => 'Georgia, serif', + 3 => 'Tahoma, Verdana, sans-serif', + 4 => '"Trebuchet MS", Helvetica, sans-serif', + 5 => 'Geneva, Verdana, sans-serif', + 6 => '"Courier New", Courier, monospace', + 7 => '"Brush Script MT", cursive', + 8 => 'Copperplate, Papyrus, fantasy', + ]; + + private array $names = [ + 0 => 'Helvetica, Arial, sans-serif', + 1 => 'Times New Roman, Times, serif', + 2 => 'Georgia, serif', + 3 => 'Tahoma, Verdana, sans-serif', + 4 => 'Trebuchet MS, Helvetica, sans-serif', + 5 => 'Geneva, Verdana, sans-serif', + 6 => 'Courier New, Courier, monospace', + 7 => 'Brush Script MT, cursive', + 8 => 'Copperplate, Papyrus, fantasy', + ]; + + private array $get = []; + + private array $handlesToId = []; + + public function __construct() + { + $this->handlesToId = array_flip($this->handles); + foreach ($this->handles as $id => $handle) { + $this->get[$id] = [$handle, $this->names[$id]]; + } + } + + public function handlesToId(): array + { + return $this->handlesToId; + } + + public function get(): array + { + return $this->get; + } + + public function getHandle(int $id): string + { + return $this->get()[$id][0] ?? ''; + } + + public function getName(int $id): string + { + return $this->get()[$id][1] ?? ''; + } + + public function getIdForHandle(string $handle): int + { + return $this->handlesToId[$handle] ?? 0; + } +} diff --git a/app/src/Legacy/Classes/Image.php b/app/src/Legacy/Classes/Image.php index 3d6a63d..89a714d 100644 --- a/app/src/Legacy/Classes/Image.php +++ b/app/src/Legacy/Classes/Image.php @@ -43,7 +43,7 @@ use function Chevereto\Legacy\G\starts_with; use function Chevereto\Legacy\G\truncate; use function Chevereto\Legacy\G\unlinkIfExists; use function Chevereto\Legacy\G\url_to_relative; -use function Chevereto\Legacy\get_image_fileinfo; +use function Chevereto\Legacy\get_fileinfo; use function Chevereto\Legacy\getSetting; use function Chevereto\Legacy\system_notification_email; use function Chevereto\Legacy\time_elapsed_string; @@ -52,6 +52,8 @@ use function Chevereto\Vars\session; use function Chevereto\Vars\sessionVar; use DateTimeZone; use Exception; +use FFMpeg\Coordinate\TimeCode; +use FFMpeg\FFMpeg; use Intervention\Image\ImageManagerStatic; use PHPExif\Exif; use function Safe\password_hash; @@ -82,12 +84,15 @@ class Image 'chain', 'thumb_size', 'medium_size', + 'frame_size', 'title', 'expiration_date_gmt', 'likes', 'is_animated', 'is_approved', 'is_360', + 'duration', + 'type' ]; protected static array $expirations = [ @@ -116,7 +121,19 @@ class Image ['year', 1, 31536000], ]; - public static array $chain_sizes = ['original', 'image', 'medium', 'thumb']; + public static array $types = [ + 1 => 'image', + 2 => 'video', + 3 => 'audio', + ]; + + public static array $chain_sizes = [ + 'frame', // 2^4 + 'original', // 2^3 + 'image', // 2^2 + 'medium', // 2^1 + 'thumb', // 2^0 + ]; public static function getSingle( int $id, @@ -285,36 +302,37 @@ class Image return $slice; } - public static function getSrcTargetSingle(array $filearray, bool $prefix = true): array + public static function getSrcTargetSingle(array $fileArray, bool $prefix = true): array { $prefix = $prefix ? 'image_' : null; $folder = CHV_PATH_IMAGES; - $pretty = !isset($filearray['image_id']); - $mode = $filearray[$prefix . 'storage_mode']; + $pretty = !isset($fileArray['image_id']); + $mode = $fileArray[$prefix . 'storage_mode']; $chain_mask = str_split( (string) str_pad( - decbin((int) ($filearray[$pretty ? 'chain' : 'image_chain'])), - 4, + decbin((int) ($fileArray[$pretty ? 'chain' : 'image_chain'])), + 5, '0', STR_PAD_LEFT ) ); - $chain_to_sufix = [ + $chain_to_suffix = [ 'image' => '.', + 'frame' => '.fr.', + 'medium' => '.md.', 'thumb' => '.th.', - 'medium' => '.md.' ]; if ($pretty) { - $type = isset($filearray['storage']['id']) ? 'url' : 'path'; + $type = isset($fileArray['storage']['id']) ? 'url' : 'path'; } else { - $type = isset($filearray['storage_id']) ? 'url' : 'path'; + $type = isset($fileArray['storage_id']) ? 'url' : 'path'; } - if ($type == 'url') { // URL resource folder - $folder = add_ending_slash($pretty ? $filearray['storage']['url'] : $filearray['storage_url']); + if ($type == 'url') { + $folder = add_ending_slash($pretty ? $fileArray['storage']['url'] : $fileArray['storage_url']); } switch ($mode) { case 'datefolder': - $datetime = $filearray[$prefix . 'date']; + $datetime = $fileArray[$prefix . 'date']; $datefolder = preg_replace('/(.*)(\s.*)/', '$1', str_replace('-', '/', $datetime)); $folder .= add_ending_slash($datefolder); // Y/m/d/ @@ -327,20 +345,25 @@ class Image // use direct $folder break; case 'path': - $folder = add_ending_slash($filearray['path']); + $folder = add_ending_slash($fileArray['path']); break; } $targets = [ 'type' => $type, 'chain' => [ + 'frame' => null, 'image' => null, 'thumb' => null, 'medium' => null ] ]; foreach (array_keys($targets['chain']) as $k) { - $targets['chain'][$k] = $folder . $filearray[$prefix . 'name'] . $chain_to_sufix[$k] . $filearray[$prefix . 'extension']; + $extension = $fileArray[$prefix . 'extension']; + if ($k !== 'image' && in_array($extension, ['mp4', 'webm'])) { + $extension = 'jpeg'; + } + $targets['chain'][$k] = $folder . $fileArray[$prefix . 'name'] . $chain_to_suffix[$k] . $extension; } if ($type == 'path') { foreach ($targets['chain'] as $k => $v) { @@ -557,7 +580,7 @@ class Image // Mostly for people uploading two times the same image to test or just bug you // $mixed => $_FILES or md5 string - public static function isDuplicatedUpload(array|string $source, string $time_frame = 'P1D'): bool + public static function isDuplicatedUpload(array|string $source, string $timePeriod = 'P1D'): bool { if (is_array($source) && isset($source['tmp_name'])) { $filename = $source['tmp_name']; @@ -576,7 +599,7 @@ class Image $db->query('SELECT * FROM ' . DB::getTable('images') . ' WHERE (image_md5=:md5 OR image_source_md5=:md5) AND image_uploader_ip=:ip AND image_date_gmt > :date_gmt'); $db->bind(':md5', $md5_file); $db->bind(':ip', get_client_ip()); - $db->bind(':date_gmt', datetime_sub(datetimegmt(), $time_frame)); + $db->bind(':date_gmt', datetime_sub(datetimegmt(), $timePeriod)); $db->exec(); return (bool) $db->fetchColumn(); @@ -591,7 +614,7 @@ class Image ): array { $params['use_file_date'] = $params['use_file_date'] ?? false; nullify_string($params['album_id']); - $datefolder = ''; + $dateFolder = ''; try { if ($user !== [] @@ -605,8 +628,20 @@ class Image throw new Exception(_s('Duplicated upload'), 101); } $storage_id = null; + $upload_types = [ + 'image' => 1, + 'video' => 2, + // 'audio' => 4, + // 'document' => 8, + // 'other' => 16, + ]; + $mimetype = strtok($params['mimetype'], '/'); + $type_chain = $upload_types[$mimetype] ?? 1; $get_active_storages = env()['CHEVERETO_ENABLE_EXTERNAL_STORAGE'] - ? Storage::get(['is_active' => 1]) + ? Storage::get([ + 'is_active' => 1, + 'type_chain' => $type_chain + ]) : []; if ($get_active_storages !== []) { if (count($get_active_storages) > 1) { @@ -659,14 +694,14 @@ class Image 'date' => $stockDate, 'date_gmt' => $stockDateGmt, ]; - $datefolder = date('Y/m/d/', strtotime($datefolder_stock['date'])); - $upload_path = CHV_PATH_IMAGES . $datefolder; + $dateFolder = date('Y/m/d/', strtotime($datefolder_stock['date'])); + $upload_path = CHV_PATH_IMAGES . $dateFolder; break; } - $filenaming = getSetting('upload_filenaming'); - if ($filenaming !== 'id' && in_array($params['privacy'] ?? '', ['password', 'private', 'private_but_link'])) { - $filenaming = 'random'; + $fileNaming = getSetting('upload_filenaming'); + if ($fileNaming !== 'id' && in_array($params['privacy'] ?? '', ['password', 'private', 'private_but_link'])) { + $fileNaming = 'random'; } $upload_options = [ 'max_size' => get_bytes(getSetting('upload_max_filesize_mb') . ' MB'), @@ -674,7 +709,7 @@ class Image ? $user['image_keep_exif'] : getSetting('upload_image_exif'), ]; - if ($filenaming == 'id') { + if ($fileNaming == 'id') { try { $dummy = [ 'name' => '', @@ -691,27 +726,29 @@ class Image 'chain' => 0, 'thumb_size' => 0, 'medium_size' => 0, + 'frame_size' => 0, + 'duration' => 0, ]; $dummy_insert = DB::insert('images', $dummy); DB::delete('images', ['id' => $dummy_insert]); $target_id = $dummy_insert; } catch (Throwable $e) { - $filenaming = 'original'; + $fileNaming = 'original'; } } - $upload_options['filenaming'] = $filenaming; - $upload_options['allowed_formats'] = self::getEnabledImageFormats(); + $upload_options['filenaming'] = $fileNaming; + $upload_options['allowed_formats'] = self::getEnabledImageExtensions(); $image_upload = self::upload( $source, $upload_path, - ($filenaming == 'id' && isset($target_id)) + ($fileNaming == 'id' && isset($target_id)) ? encodeID((int) $target_id) : null, $upload_options, $storage_id, $guestSessionHandle ); - $chain_mask = [0, 1, 0, 1]; // original image medium thumb + $chain_mask = [0, 0, 1, 0, 1]; // frame, original, image, medium, thumb if ($do_dupe_check && self::isDuplicatedUpload($image_upload['uploaded']['fileinfo']['md5'])) { throw new Exception(_s('Duplicated upload'), 102); } @@ -751,6 +788,14 @@ class Image if (is_animated_image($image_upload['uploaded']['file'])) { $must_resize = false; } + $resizeSourceImage = $image_upload['uploaded']['file']; + $uploadDir = dirname($resizeSourceImage); + if ($image_upload['source']['type'] === 'video') { + $frameImage = $uploadDir . '/' . $image_upload['uploaded']['name'] . '.fr.jpeg'; + rename($image_upload['uploaded']['frame'], $frameImage); + $resizeSourceImage = $frameImage; + $chain_mask[0] = 1; + } if ($must_resize) { $source_md5 = $image_upload['uploaded']['fileinfo']['md5']; if ($do_dupe_check && self::isDuplicatedUpload($source_md5)) { @@ -766,8 +811,8 @@ class Image $image_resize_options = ['width' => $params['width']]; } $image_upload['uploaded'] = self::resize( - $image_upload['uploaded']['file'], - dirname($image_upload['uploaded']['file']), + $resizeSourceImage, + dirname($resizeSourceImage), null, $image_resize_options ); @@ -784,8 +829,8 @@ class Image $medium_fixed_dimension = getSetting('upload_medium_fixed_dimension'); $is_animated_image = is_animated_image($image_upload['uploaded']['file']); $image_thumb = self::resize( - source: $image_upload['uploaded']['file'], - destination: dirname($image_upload['uploaded']['file']), + source: $resizeSourceImage, + destination: $uploadDir, filename: $image_upload['uploaded']['name'] . '.th', options: $image_thumb_options ); @@ -814,8 +859,8 @@ class Image $apply_watermark = false; } } - if ($apply_watermark && self::watermark($image_upload['uploaded']['file'])) { - $image_upload['uploaded']['fileinfo'] = GGet_image_fileinfo($image_upload['uploaded']['file']); // Remake the fileinfo array, new full array file info (todo: faster!) + if ($apply_watermark && self::watermark($resizeSourceImage)) { + $image_upload['uploaded']['fileinfo'] = GGet_image_fileinfo($resizeSourceImage); // Remake the fileinfo array, new full array file info (todo: faster!) $image_upload['uploaded']['fileinfo']['md5'] = $original_md5; // Preserve original MD5 for watermarked images } if ($image_upload['uploaded']['fileinfo'][$medium_fixed_dimension] > $medium_size || $is_animated_image) { @@ -826,12 +871,12 @@ class Image $image_medium_options[$medium_fixed_dimension] = min($image_medium_options[$medium_fixed_dimension], $image_upload['uploaded']['fileinfo'][$medium_fixed_dimension]); } $image_medium = self::resize( - $image_upload['uploaded']['file'], - dirname($image_upload['uploaded']['file']), + $resizeSourceImage, + $uploadDir, $image_upload['uploaded']['name'] . '.md', $image_medium_options ); - $chain_mask[2] = 1; + $chain_mask[3] = 1; } $chain_value = bindec((string) implode('', $chain_mask)); $disk_space_needed = $image_upload['uploaded']['fileinfo']['size']; @@ -894,8 +939,9 @@ class Image if (!($image_medium ?? false)) { unset($chain_props['medium']); } + $dirChain = dirname($image_upload['uploaded']['file']); foreach ($chain_props as $k => $v) { - $chain_file = add_ending_slash(dirname($image_upload['uploaded']['file'])) . $image_upload['uploaded']['name'] . '.' . $v['suffix'] . '.' . ${"image_$k"}['fileinfo']['extension']; + $chain_file = add_ending_slash($dirChain) . $image_upload['uploaded']['name'] . '.' . $v['suffix'] . '.' . ${"image_$k"}['fileinfo']['extension']; try { $renamed_chain = rename(${"image_$k"}['file'], $chain_file); @@ -926,9 +972,11 @@ class Image 'chain' => $chain_value, 'thumb_size' => $image_thumb['fileinfo']['size'] ?? 0, 'medium_size' => $image_medium['fileinfo']['size'] ?? 0, + 'frame_size' => $image_upload['uploaded']['frameinfo']['size'] ?? 0, 'is_animated' => $is_animated_image, 'source_md5' => $source_md5 ?? null, - 'is_360' => $is_360 + 'is_360' => $is_360, + 'duration' => $image_upload['uploaded']['fileinfo']['duration'] ?? 0, ]; if (isset($datefolder_stock)) { foreach ($datefolder_stock as $k => $v) { @@ -964,6 +1012,14 @@ class Image case 'image': $prop = $image_upload['uploaded']; + break; + case 'frame': + $prop = [ + 'file' => $frameImage, + 'filename' => basename($frameImage), + 'fileinfo' => $image_upload['uploaded']['frameinfo'] + ]; + break; default: $prop = ${"image_$v"}; @@ -978,7 +1034,7 @@ class Image } Storage::uploadFiles($toStorage, $storage, [ 'keyprefix' => $storage_mode == 'datefolder' - ? $datefolder + ? $dateFolder : null ]); } @@ -1009,7 +1065,7 @@ class Image } } $image_insert_values['title'] = $image_title; - if ($filenaming == 'id' && isset($target_id)) { // Insert as a reserved ID + if ($fileNaming == 'id' && isset($target_id)) { // Insert as a reserved ID $image_insert_values['id'] = $target_id; } $image_insert_values['title'] = mb_substr($image_insert_values['title'] ?? '', 0, 100, 'UTF-8'); @@ -1028,7 +1084,7 @@ class Image DB::insert('images_hash', ['image_id' => $uploaded_id, 'hash' => $deleteHash]); if (isset($toStorage)) { foreach ($toStorage as $k => $v) { - unlinkIfExists($v['file']); // Remove the source image + unlinkIfExists($v['file']); // Remove files from local when doing external storage } } $privacyTargets = ['private', 'private_but_link']; @@ -1085,16 +1141,29 @@ class Image } } - public static function getEnabledImageFormats(): array + public static function getEnabledImageExtensions(): array { $formats = explode(',', Settings::get('upload_enabled_image_formats')); - if (in_array('jpg', $formats)) { + if (in_array('jpg', $formats) && !in_array('jpeg', $formats)) { $formats[] = 'jpeg'; } return $formats; } + public static function getEnabledImageAcceptAttribute(): string + { + $extensions = self::getEnabledImageExtensions(); + $accept = []; + $videos = ['mp4', 'webm']; + foreach ($extensions as $extension) { + $type = in_array($extension, $videos) ? 'video' : 'image'; + $accept[] = "$type/$extension"; + } + + return implode(',', $accept); + } + public static function resize( string $source, ?string $destination, @@ -1210,7 +1279,10 @@ class Image $values['is_approved'] = 1; } $insert = DB::insert('images', $values); - $disk_space_used = $values['size'] + $values['thumb_size'] + $values['medium_size']; + $disk_space_used = $values['size'] + + $values['thumb_size'] + + $values['medium_size'] + + $values['frame_size']; Stat::track([ 'action' => 'insert', 'table' => 'images', @@ -1255,7 +1327,10 @@ class Image public static function delete(int $id, bool $update_user = true): int { $image = self::getSingle(id: $id, pretty: true); - $disk_space_used = $image['size'] + ($image['thumb']['size'] ?? 0) + ($image['medium']['size'] ?? 0); + $disk_space_used = $image['size'] + + $image['thumb_size'] + + $image['medium_size'] + + $image['frame_size']; if ($image['file_resource']['type'] == 'path') { foreach ($image['file_resource']['chain'] as $file_delete) { if (file_exists($file_delete) && !unlinkIfExists($file_delete)) { @@ -1375,60 +1450,13 @@ class Image $medium_size = getSetting('upload_medium_size'); $medium_fixed_dimension = getSetting('upload_medium_fixed_dimension'); if ($targets['type'] == 'path') { - if ($image['size'] == 0) { - $get_image_fileinfo = GGet_image_fileinfo($targets['chain']['image']); - $update_missing_values = [ - 'width' => $get_image_fileinfo['width'], - 'height' => $get_image_fileinfo['height'], - 'size' => $get_image_fileinfo['size'], - ]; - foreach (['thumb', 'medium'] as $k) { - if (!array_key_exists($k, $targets['chain'])) { - continue; - } - if ($image[$k . '_size'] == 0) { - $update_missing_values[$k . '_size'] = GGet_image_fileinfo($targets['chain'][$k])['size']; - } - } - self::update($image['id'], $update_missing_values); - $image = array_merge($image, $update_missing_values); - } - $is_animated = isset($targets['chain']['image']) && is_animated_image($targets['chain']['image']); - if (count($targets['chain']) > 0 && !isset($targets['chain']['thumb'])) { - try { - $targets['chain']['thumb'] = self::resize( - $targets['chain']['image'], - pathinfo($targets['chain']['image'], PATHINFO_DIRNAME), - $image['name'] . '.th', - [ - 'width' => getSetting('upload_thumb_width'), - 'height' => getSetting('upload_thumb_height'), - 'forced' => $image['extension'] == 'gif' && $is_animated - ] - )['file']; - } catch (Exception $e) { - } - } - if ($image[$medium_fixed_dimension] > $medium_size - && count($targets['chain']) > 0 - && !isset($targets['chain']['medium']) - ) { - try { - $targets['chain']['medium'] = self::resize( - $targets['chain']['image'], - pathinfo($targets['chain']['image'], PATHINFO_DIRNAME), - $image['name'] . '.md', - [ - $medium_fixed_dimension => $medium_size, - 'forced' => $image['extension'] == 'gif' && $is_animated - ] - )['file']; - } catch (Throwable $e) { - } + $is_animated = $image['is_animated']; + if (!$is_animated) { + $is_animated = isset($targets['chain']['image']) && is_animated_image($targets['chain']['image']); } if (count($targets['chain']) > 0) { $original_md5 = $image['md5']; - $image = array_merge($image, get_image_fileinfo($targets['chain']['image'])); + $image = array_merge($image, get_fileinfo($targets['chain']['image'])); $image['md5'] = $original_md5; } if ($is_animated && !$image['is_animated']) { @@ -1441,8 +1469,10 @@ class Image 'size' => (int) $image['size'], 'size_formatted' => format_bytes($image['size']) ]; - $image = array_merge($image, get_image_fileinfo($targets['chain']['image']), $image_fileinfo); + + $image = array_merge($image, get_fileinfo($targets['chain']['image']), $image_fileinfo); } + $image['file_resource'] = $targets; $image['url_viewer'] = self::getUrlViewer( $image['id_encoded'], @@ -1454,14 +1484,17 @@ class Image $image['url_short'] = self::getUrlViewer($image['id_encoded']); foreach ($targets['chain'] as $k => $v) { if ($targets['type'] == 'path') { - $image[$k] = file_exists($v) ? get_image_fileinfo($v) : null; + $image[$k] = file_exists($v) ? get_fileinfo($v) : null; } else { - $image[$k] = get_image_fileinfo($v); + $image[$k] = get_fileinfo($v); } $image[$k]['size'] = $image[($k == 'image' ? '' : $k . '_') . 'size']; } + $image['url_frame'] = $image['frame']['url'] ?? ''; $image['size_formatted'] = format_bytes($image['size']); - $display_url = $image['url'] ?? ''; + $display_url = $image['frame']['url'] + ?? $image['url'] + ?? ''; $display_width = $image['width']; $display_height = $image['height']; if (!empty($image['medium'])) { @@ -1479,15 +1512,24 @@ class Image break; } - // if (!$image["is_animated"]) { - // // $display_url = $image['url'] ?? ''; - // } - } elseif ($image['size'] > get_bytes('200 KB')) { + } elseif ( + $image['size'] > get_bytes('200 KB') + && $image['type'] === 1 + ) { $display_url = $image['thumb']['url'] ?? ''; $display_width = getSetting('upload_thumb_width'); $display_height = getSetting('upload_thumb_height'); } - + $image['duration'] = (int) ($image['duration'] ?? 0); + $seconds = $image['duration'] ?? 0; + if ($seconds > 0) { + $minutes = floor($seconds / 60); + $duration_time = sprintf('%02d', $minutes) . ':' . sprintf('%02d', $seconds % 60); + } else { + $duration_time = ''; + } + $image['duration_time'] = $duration_time; + $image['type'] = self::$types[$image['type']]; $image['display_url'] = $display_url; $image['display_width'] = $display_width; $image['display_height'] = $display_height; @@ -1500,6 +1542,8 @@ class Image $image['title_truncated'] = truncate($image['title'] ?? '', 28); $image['title_truncated_html'] = safe_html($image['title_truncated']); $image['is_use_loader'] = getSetting('image_load_max_filesize_mb') !== '' ? ($image['size'] > get_bytes(getSetting('image_load_max_filesize_mb') . 'MB')) : false; + $image['display_title'] = $image['title'] + ?? ($image['name'] . '.' . $image['extension']); } public static function formatArray(array $dbRow, bool $safe = false): array @@ -1530,4 +1574,16 @@ class Image return $output; } + + public static function getVideoFrame(string $file, int $time): string + { + $frameFile = Upload::getTempNam(sys_get_temp_dir()); + $ffmpeg = FFMpeg::create(); + $video = $ffmpeg->open($file); + $video + ->frame(TimeCode::fromSeconds($time)) + ->save($frameFile); + + return $frameFile; + } } diff --git a/app/src/Legacy/Classes/Listing.php b/app/src/Legacy/Classes/Listing.php index 68dd03b..ec75c3d 100644 --- a/app/src/Legacy/Classes/Listing.php +++ b/app/src/Legacy/Classes/Listing.php @@ -328,6 +328,10 @@ class Listing } if ($this->type == 'images' && isset($this->params_hidden['is_animated']) && $this->params_hidden['is_animated'] == 1) { $whereClauses[] = 'image_is_animated = 1'; + $whereClauses[] = 'image_type = 1'; + } + if ($this->type == 'images' && isset($this->params_hidden['is_video']) && $this->params_hidden['is_video'] == 1) { + $whereClauses[] = 'image_type = 2'; } if (!empty($whereClauses)) { $whereClauses = implode(' AND ', $whereClauses); @@ -646,7 +650,7 @@ class Listing 'sort' => 'date_desc', ], 'trending' => [ - 'icon' => 'fas fa-poll', + 'icon' => 'fas fa-chart-simple', 'label' => _s('Trending'), 'content' => 'all', 'sort' => 'views_desc', @@ -736,8 +740,8 @@ class Listing 'content' => 'users', ], 'images' => [ - 'icon' => 'fas fa-image', - 'label' => _s('Images'), + 'icon' => 'fas fa-photo-film', + 'label' => _n('File', 'Files', 20), 'content' => 'images', ], 'albums' => [ @@ -763,11 +767,11 @@ class Listing $contents = [ 'images' => [ 'icon' => $listings['images']['icon'], - 'label' => _s('Images'), + 'label' => $listings['images']['label'], ], 'albums' => [ 'icon' => $listings['albums']['icon'], - 'label' => _n('Album', 'Albums', 20), + 'label' => $listings['albums']['label'], ], ]; if ((bool) env()['CHEVERETO_ENABLE_USERS']) { diff --git a/app/src/Legacy/Classes/Settings.php b/app/src/Legacy/Classes/Settings.php index e724271..68a101f 100644 --- a/app/src/Legacy/Classes/Settings.php +++ b/app/src/Legacy/Classes/Settings.php @@ -176,7 +176,7 @@ class Settings 'enable_powered_by' => true, 'akismet' => false, 'stopforumspam' => false, - 'upload_enabled_image_formats' => 'jpg,png,bmp,gif,webp', + 'upload_enabled_image_formats' => 'jpg,png,bmp,gif,webp,mp4,webm', 'hostname' => null, 'theme_show_embed_content_for' => 'all', 'moderatecontent' => false, @@ -249,7 +249,7 @@ class Settings 'listing_safe_count' => 100, 'image_title_max_length' => 100, 'album_name_max_length' => 100, - 'upload_available_image_formats' => 'jpg,jpeg,png,bmp,gif,webp', + 'upload_available_image_formats' => 'jpg,jpeg,png,bmp,gif,webp,mp4,webm', ]); if (!array_key_exists('active_storage', $settings)) { $settings['active_storage'] = null; diff --git a/app/src/Legacy/Classes/Upload.php b/app/src/Legacy/Classes/Upload.php index 077426e..bc10c11 100644 --- a/app/src/Legacy/Classes/Upload.php +++ b/app/src/Legacy/Classes/Upload.php @@ -26,6 +26,7 @@ use function Chevereto\Legacy\G\get_file_extension; use function Chevereto\Legacy\G\get_filename; use function Chevereto\Legacy\G\get_image_fileinfo; use function Chevereto\Legacy\G\get_public_url; +use function Chevereto\Legacy\G\get_video_fileinfo; use function Chevereto\Legacy\G\is_animated_webp; use function Chevereto\Legacy\G\is_image_url; use function Chevereto\Legacy\G\is_url; @@ -90,6 +91,8 @@ class Upload 'ftp' ]; + public string $mediaType = 'image'; + public function uploaded(): array { return $this->uploaded; @@ -256,7 +259,9 @@ class Upload * External storage will be allocated to the temp directory */ if (isset($this->storage_id)) { - $this->uploaded_file = forward_slash(dirname($this->downstream)) . '/' . Storage::getStorageValidFilename($this->fixed_filename, $this->storage_id, $this->options['filenaming'], $this->destination); + $this->uploaded_file = forward_slash(dirname($this->downstream)) + . '/' + . Storage::getStorageValidFilename($this->fixed_filename, $this->storage_id, $this->options['filenaming'], $this->destination); } else { $this->uploaded_file = name_unique_file($this->destination, $this->fixed_filename, $this->options['filenaming']); } @@ -265,7 +270,8 @@ class Upload 'filename' => $this->source_filename, // file.ext 'name' => $this->source_name, // file 'image_exif' => $this->source_image_exif, - 'fileinfo' => get_image_fileinfo($this->downstream), + 'type' => $this->mediaType, + 'fileinfo' => $this->source_image_fileinfo, ]; if (stream_resolve_include_path($this->downstream) == false) { throw new Exception('Concurrency: Downstream gone, aborting operation', 666); @@ -291,16 +297,28 @@ class Upload } catch (Throwable $e) { } } - $fileInfo = get_image_fileinfo($this->uploaded_file); + $fileInfo = $this->mediaType === 'video' + ? get_video_fileinfo($this->uploaded_file) + : get_image_fileinfo($this->uploaded_file); if ($fileInfo === []) { throw new Exception("Can't get uploaded info", 610); } $fileInfo['is_360'] = $is_360; + $frameFile = null; + if ($this->mediaType === 'video') { + $frameFile = Image::getVideoFrame( + $this->uploaded_file, + (int) ($fileInfo['duration'] / 4) + ); + } $this->uploaded = [ 'file' => $this->uploaded_file, 'filename' => get_filename($this->uploaded_file), 'name' => get_basename_without_extension($this->uploaded_file), + 'type' => $this->mediaType, 'fileinfo' => $fileInfo, + 'frame' => $frameFile, + 'frameinfo' => $frameFile ? get_image_fileinfo($frameFile) : [], ]; } @@ -311,9 +329,16 @@ class Upload return explode(',', $formats); } - public static function getEnabledImageFormats(): array + public static function getAvailableTypes(): array { - return Image::getEnabledImageFormats(); + // 0: all + return [ + 'image', // 2^0 + 'video', // 2^1 + // 'audio', // 2^2 + // 'document', // 2^3 + // 'other' // 2^4 + ]; } /** @@ -395,7 +420,7 @@ class Upload throw new Exception(sprintf('Unwanted extension for %s', $filename), 600); } $extension = get_file_extension($filename); - if (!in_array($extension, self::getEnabledImageFormats())) { + if (!in_array($extension, Image::getEnabledImageExtensions())) { throw new Exception(sprintf('Unable to handle upload for %s', $filename), 600); } } @@ -463,7 +488,10 @@ class Upload if (!file_exists($this->downstream)) { throw new Exception("Can't fetch target upload source (downstream)", 600); } - $this->source_image_fileinfo = get_image_fileinfo($this->downstream); + $this->mediaType = str_starts_with($this->source['type'], 'video/') ? 'video' : 'image'; + $this->source_image_fileinfo = $this->mediaType === 'video' + ? get_video_fileinfo($this->downstream) + : get_image_fileinfo($this->downstream); if ($this->source_image_fileinfo === []) { throw new Exception("Can't get target upload source info", 610); } @@ -476,8 +504,8 @@ class Upload if (!in_array($this->source_image_fileinfo['extension'], $this->options['allowed_formats'])) { throw new Exception(sprintf('Disabled image format (%s)', $this->source_image_fileinfo['extension']), 614); } - if (!$this->isValidImageMime($this->source_image_fileinfo['mime'])) { - throw new Exception('Invalid image mimetype', 612); + if (!$this->isValidMime($this->source_image_fileinfo['mime'])) { + throw new Exception('Invalid mimetype', 612); } if (!$this->options['max_size']) { $this->options['max_size'] = self::getDefaultOptions()['max_size']; @@ -497,6 +525,10 @@ class Upload throw new Exception('Animated WebP is not supported', 400); } + if ($this->mediaType === 'video') { + return; + } + if (Settings::get('arachnid')) { $arachnid = new Arachnid( authorization: Settings::get('arachnid_key'), @@ -594,11 +626,29 @@ class Upload return []; } + protected function isValidMime(string $mime): bool + { + if (str_starts_with($mime, 'video/')) { + return $this->isValidVideoMime($mime); + } + + return $this->isValidImageMime($mime); + } + protected function isValidImageMime(string $mime): bool { + if (str_starts_with($mime, 'video/')) { + return $this->isValidVideoMime($mime); + } + return preg_match("#image\/(gif|pjpeg|jpeg|png|x-png|bmp|x-ms-bmp|x-windows-bmp|webp)$#", $mime) === 1; } + protected function isValidVideoMime(string $mime): bool + { + return preg_match("#video\/(mp4|webm)$#", $mime) === 1; + } + protected function isValidNamingOption(string $string): bool { return in_array($string, ['mixed', 'random', 'original']); diff --git a/app/src/Legacy/Classes/User.php b/app/src/Legacy/Classes/User.php index 1d33eb6..0bade8d 100644 --- a/app/src/Legacy/Classes/User.php +++ b/app/src/Legacy/Classes/User.php @@ -189,7 +189,7 @@ class User public static function getStreamName(string $username): string { - return _s("%t by %s", ['%t' => _s('Images'), '%s' => $username]); + return _s("%t by %s", ['%t' => _s('Media'), '%s' => $username]); } public static function getUrl(array|string $handle) diff --git a/app/src/Legacy/G/DB.php b/app/src/Legacy/G/DB.php index c17659c..44fe4de 100644 --- a/app/src/Legacy/G/DB.php +++ b/app/src/Legacy/G/DB.php @@ -258,7 +258,8 @@ class DB string $clause = 'AND', array $sort = [], int $limit = null, - int $fetch_style = PDO::FETCH_ASSOC + int $fetch_style = PDO::FETCH_ASSOC, + array $valuesOperators = [] ): mixed { if (!is_array($values) && $values !== 'all') { throw new Exception('Expecting array values, ' . gettype($values) . ' given'); @@ -279,7 +280,8 @@ class DB if (is_null($v)) { $query .= '`' . $k . '` IS :' . $k . ' ' . $clause . ' '; } else { - $query .= '`' . $k . '`=:' . $k . ' ' . $clause . ' '; + $operator = $valuesOperators[$k] ?? '='; + $query .= '`' . $k . '`' . $operator . ':' . $k . ' ' . $clause . ' '; } } } diff --git a/app/src/Legacy/G/functions.php b/app/src/Legacy/G/functions.php index 7c09a43..28ebd8d 100644 --- a/app/src/Legacy/G/functions.php +++ b/app/src/Legacy/G/functions.php @@ -19,6 +19,7 @@ use CurlHandle; use DateInterval; use ErrorException; use Exception; +use FFMpeg\FFProbe; use GdImage; use LogicException; use function Safe\curl_exec; @@ -1933,6 +1934,8 @@ function mime_to_extension(string $mime): string 'image/x-icon' => 'ico', 'image/vnd.microsoft.icon' => 'ico', 'image/webp' => 'webp', + 'video/mp4' => 'mp4', + 'video/webm' => 'webm', ][$mime] ?? ''; } @@ -1947,9 +1950,50 @@ function extension_to_mime(string $ext): string 'tiff' => 'image/tiff', 'ico' => 'image/vnd.microsoft.icon', 'webp' => 'image/webp', + 'mp4' => 'video/mp4', + 'webm' => 'video/webm', ][$ext] ?? ''; } +function get_video_fileinfo(string $file): array +{ + clearstatcache(true, $file); + $ffprobe = FFProbe::create(); + if (!$ffprobe->isValid($file)) { + throw new Exception("Invalid video file provided", 610); + } + $all = $ffprobe + ->streams($file) + ->videos() + ->first() + ->all(); + $codecLong = strtolower($all['codec_long_name'] ?? ''); + $extension = str_contains($codecLong, 'mpeg-4') ? 'mp4' : 'webm'; + $filesize = filesize($file); + $duration = $all['duration'] ?? null; + if ($duration === null) { + $format = $ffprobe->format($file)->all(); + $duration = $format['duration'] ?? null; + } + + return [ + 'filename' => basename($file), + 'name' => basename($file, '.' . $extension), + 'width' => $all['width'], + 'height' => $all['height'], + 'ratio' => $all['width'] / $all['height'], + 'size' => intval($filesize), + 'size_formatted' => format_bytes($filesize), + 'mime' => 'video/' . $extension, + 'extension' => $extension, + 'bits' => $all['bits_per_raw_sample'] ?? 0, + 'channels' => '', + 'url' => absolute_to_url($file), + 'md5' => md5_file($file), + 'duration' => (int) $duration, + ]; +} + function get_image_fileinfo(string $file): array { clearstatcache(true, $file); diff --git a/app/src/Legacy/functions-render.php b/app/src/Legacy/functions-render.php index ad6c8fe..f86da16 100644 --- a/app/src/Legacy/functions-render.php +++ b/app/src/Legacy/functions-render.php @@ -93,14 +93,16 @@ function theme_file_exists($var) function get_html_tags() { $palette = Handler::var('theme_palette_handle'); + $font = Handler::var('theme_font'); $device = 'device-' . (Handler::cond('mobile_device') ? 'mobile' : 'nonmobile'); $nsfwBlur = 'unsafe-blur-' . (getSetting('theme_nsfw_blur') ? 'on' : 'off'); $classes = strtr( - '%device %palette %nsfwBlur', + '%device %palette %nsfwBlur %font', [ '%device' => $device, '%palette' => 'palette-' . $palette, '%nsfwBlur' => $nsfwBlur, + '%font' => 'font-' . $font, ] ); if (getSetting('captcha')) { @@ -168,7 +170,7 @@ function get_captcha_invisible_html() .then(function(token) { fetch(recaptchaLocal + "/?action=" + recaptchaAction + "&token="+token).then(function(response) { response.json().then(function(data) { - console.log(data); + // console.log(data); }); }); }); @@ -514,14 +516,18 @@ function get_peafowl_item_list($item, $template, $tools, $tpl = 'image', array $ $show_admin_tools = true; } } + if (($item['duration_time'] ?? '') === '') { + $template['tpl_list_item/item_duration_time'] = null; + } + $stock_tpl_lower = strtolower($stock_tpl); if (!$show_item_public_tools) { - $template['tpl_list_item/item_' . strtolower($stock_tpl) . '_public_tools'] = null; + $template['tpl_list_item/item_' . $stock_tpl_lower . '_public_tools'] = null; } if (!$show_item_edit_tools) { - $template['tpl_list_item/item_' . strtolower($stock_tpl) . '_edit_tools'] = null; + $template['tpl_list_item/item_' . $stock_tpl_lower . '_edit_tools'] = null; } if (!$show_admin_tools) { - $template['tpl_list_item/item_' . strtolower($stock_tpl) . '_admin_tools'] = null; + $template['tpl_list_item/item_' . $stock_tpl_lower . '_admin_tools'] = null; } foreach ($conditional_replaces as $k => $v) { $template[$k] = $v; @@ -552,7 +558,7 @@ function get_peafowl_item_list($item, $template, $tools, $tpl = 'image', array $ $placeholder = $stock_tpl == 'IMAGE' ? 'IMAGE_FLAG' : 'ALBUM_COVER_FLAG'; $replacements[$placeholder] = $nsfw ? 'unsafe' : 'safe'; } - $object = array_filter_array($item, ['id_encoded', 'image', 'medium', 'thumb', 'name', 'title', 'display_url', 'extension', 'filename', 'height', 'how_long_ago', 'size_formatted', 'url', 'path_viewer', 'url_viewer', 'url_short', 'width', 'is_360']); + $object = array_filter_array($item, ['id_encoded', 'image', 'medium', 'thumb', 'name', 'title', 'display_url', 'display_title', 'extension', 'filename', 'height', 'how_long_ago', 'size_formatted', 'url', 'path_viewer', 'url_viewer', 'url_frame', 'url_short', 'width', 'is_360', 'type']); if (isset($item['user'])) { $object['user'] = []; foreach (['avatar', 'url', 'username', 'name_short_html'] as $k) { @@ -1034,26 +1040,41 @@ function getThemeLogo(): string } } -function badgePaid(bool $isPaid = true): string +function badgePaid(string $edition): string { - if (!(bool) env()['CHEVERETO_ENABLE_EXPOSE_PAID_FEATURES'] || $isPaid === false) { + if (!(bool) env()['CHEVERETO_ENABLE_EXPOSE_PAID_FEATURES']) { + return ''; + } + if (in_array($edition, editionCombo()[env()['CHEVERETO_EDITION']])) { return ''; } - return sprintf(' %s', _s('Pro')); + return sprintf(' %s', $edition); } -function echoBadgePaid(bool $isPaid = true): void +function linkPaid(string $edition): ?string { - echo badgePaid($isPaid); -} - -function echoInputDisabledPaid(bool $disabled = true): void -{ - if ($disabled === false) { - return; + if (!(bool) env()['CHEVERETO_ENABLE_EXPOSE_PAID_FEATURES']) { + return null; } - echo ' disabled="disabled" title="' . _s('This is a paid feature') . '"'; + if (in_array($edition, editionCombo()[env()['CHEVERETO_EDITION']])) { + return null; + } + + return 'https://chevereto.com/pricing'; +} + +function inputDisabledPaid(string $edition): string +{ + if (in_array($edition, editionCombo()[env()['CHEVERETO_EDITION']])) { + return ''; + } + + return ' disabled="disabled" title="' + . _s('This is a paid feature (%s edition)', $edition) + . '"' + . ' rel="tooltip"' + . ' data-tiptip="right"'; } function getIpButtonsArray(array $bannedIp, string $ip): array diff --git a/app/src/Legacy/functions.php b/app/src/Legacy/functions.php index 8742aac..f17b123 100644 --- a/app/src/Legacy/functions.php +++ b/app/src/Legacy/functions.php @@ -650,7 +650,7 @@ function get_users_image_url(string $filename): string return get_content_url('images/users/' . $filename); } -function get_image_fileinfo(string $file): array +function get_fileinfo(string $file): array { $extension = get_file_extension($file); $return = [ @@ -1330,3 +1330,13 @@ function getLicenseKey(): string return $licenseKey; } + +function editionCombo(): array +{ + return [ + 'free' => ['free'], + 'lite' => ['free', 'lite'], + 'pro' => ['free', 'lite', 'pro'], + 'enterprise' => ['free', 'lite', 'pro', 'enterprise'], + ]; +} diff --git a/app/upgrading.php b/app/upgrading.php index 6cecb13..8780800 100644 --- a/app/upgrading.php +++ b/app/upgrading.php @@ -51,17 +51,15 @@ $workingDir = __DIR__ . '/.upgrading'; if (is_file($workingDir)) { unlink($workingDir); } -$runtimeTable = [ - 'log_errors' => ini_set('log_errors', true), - 'display_errors' => ini_set('display_errors', true), - 'error_log' => ini_set('error_log', $workingDir . '/error.log'), - 'ignore_user_abort' => ignore_user_abort(true), - 'time_limit' => @set_time_limit(0), - 'ini_set' => ini_set('default_charset', 'utf-8'), - 'setlocale' => setlocale(LC_ALL, 'en_US.UTF8'), - 'output_buffering' => ini_set('output_buffering', 'off'), - 'zlib.output_compression' => ini_set('zlib.output_compression', false), -]; +ini_set('log_errors', true); +ini_set('display_errors', true); +ini_set('error_log', $workingDir . '/error.log'); +ignore_user_abort(true); +@set_time_limit(0); +ini_set('default_charset', 'utf-8'); +setlocale(LC_ALL, 'en_US.UTF8'); +ini_set('output_buffering', 'off'); +ini_set('zlib.output_compression', false); $logProcess = $workingDir . '/process.log'; $lockUpgrading = $workingDir . '/upgrading.lock'; $lockDownloading = $workingDir . '/downloading.lock'; diff --git a/content/legacy/system/chevereto-ultimate-remix.png b/content/legacy/system/chevereto-ultimate-remix.png new file mode 100644 index 0000000000000000000000000000000000000000..e884c8cad14b0b0ea324991712be29c817430ef9 GIT binary patch literal 174252 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

E2e}zS4b=1Z7=MNRRxWm|dTbc%G;V z5rcGKTx&!8R=j9Z`xV%fY^;fb1O58M0+`>MNLWr=>h6?=c_pLlzyagKM^l=R68KeS zm`E@guwWK~h_NEPjCKc3Ha!i2K}uD3)V^)+S^XC{eE0-JvNxpsfYD$fJe+^?2**5l zrtCP+p)+7=OZoua_1RJpnnch8bAISFFU;KKwlw$xA> z3Hi%4?kZ#oPOv8tpiT4UT5 z&h|zX@GLjlgy|eyJ_RcF3KnE7`zV~ZRTBt)!Cdwt8~;qrcVoqlCtIj$;#2P26AI<0joa3m zW8z1vsMnzd1}J1;(!cMKMLj} zxFdk{$NDvQ$2H0fi=}7HNsAu)^fds@Kl#~OG_imexv1(xm;Poo(Y1IqVF`bdqcPf| z&uM0jfUEG8&ihNh1i(>#a>)Ae&?jo~J|VP1Ng?>_gRXJr0nVW_(ROOUOBd@H=TqID zh6BP|Ry*V~KQ>)@T+n>&IWwyj4v`nrR3LzHoZ%BvL<&O}ZILwQu+wbWrbGAJK6i+* zd?jfZpJjM3-453{&;mxaoep;>l74xjCtw@7nFb?Hk0ElB9R!fO3lt@XsCEM3Li>st z13O68PSiqJJ<@hJrhq002P;fH>SoU1M=Dtdxcycn^aJnPuL5;~Gjh9;*)o9G{LeMFcR-F1V;mr~(}R%w zv`tQLk~vR)LNDadyx7e|uj}r0+jYyw_OtJ$IhOr5@!>OjBK_jx{L|1SBaiL!5`jOH z-dK8dy&S!I_tulld-RzT^L-Wxl(icEdehka*5|TE>u(y;gP3vBaw;74(nsl)FNhOq zuKnqR0AY(kPb=92W32&25>DQpL-_MjI;QrAo2PnMQ~$M_~M3>Apa|Ar6K93_Vj4P{LhJz64?ZO zc86)ebp~(hTf#f`HOJAU)uIDDfVZyn=tqSzX%(aNE)i9BqhAJAA$iVsJ`ZwnPse8> zJ)f$rFQ`TC`G?Gx)8$M39E-auB83yRe%xri#H0o)r2VEUK@zmiPI_I`@c~i8iE!dk zRG?e!L^2+xCUwxc%|~@`5HG_~LyM|pM}LnK$82DDieNUm^W(KS&FAsZVLToOhl|wu zXvT{4e}pWnpj=wb#5&wt^Q1@~Ux-KDE@R4{5l=uHOSGvga}ZZ^G8;&|r9tv9g5vdw z{lH7%Dh(i%wKzvk<>Y>~j_2Gnea#(rr?A;s+LX|~v8t`6?DwPIf1C7-Czt|vDAD)5 z#k^{+9F1^Z->^Hdtu477^|5C0P3D(?`-|J!8|%ii4IBM;9&PAAcVT1BYv~1!i47#t zT!q7&U)q@otGW0J1lgH=7USJ?BK4evP8yKi;K3O9&%N1M?eSWegR@i#h<1Hab-Te1 zt&~Q`S~1uz@1&nsKrpKQKygw)XSy?%e)$JB6Qp$^@-ZWdX@4JtVD$5qvCQmDpid%0Ai=wUouLW2=ry>zk8?HdS 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 z6X~pZZk71!2div{width:630px}.main--stack{width:100%;max-width:900px}*{-ms-box-sizing:border-box;box-sizing:border-box;outline:0}a{color:#3498db;outline:0;text-decoration:none}a:hover{text-decoration:underline}p,ul>li{line-height:140%}.soft-hidden{display:none}.p{margin-top:20px;margin-bottom:20px}.alert,.highlight,.log{font-size:.9em;padding:1em}.alert:empty,.highlight:empty{display:none}.highlight{background:rgba(255,255,255,.5);border-inline-start:4px solid #8e44ad}.alert{position:relative;background:rgba(241,196,15,.3);border-inline-start:4px solid #f1c40f;padding-inline-end:2em}.alert pre{overflow:auto}.alert code,.alert pre{background:rgba(241,196,15,.3)}.alert pre code{background:0 0}.shake{-webkit-animation:shake .5s cubic-bezier(.36,.07,.19,.97) both;animation:shake .5s cubic-bezier(.36,.07,.19,.97) both;transform:translate3d(0,0,0);-webkit-backface-visibility:hidden;backface-visibility:hidden;perspective:1000px}.alert-close{cursor:pointer;position:absolute;inset-inline-end:1em;top:1em;width:1em;height:1em;opacity:.3}.alert-close:hover{opacity:1}.alert-close:after,.alert-close:before{position:absolute;inset-inline-start:7.5px;content:' ';height:16px;width:2px;background-color:#333}.alert-close:before{transform:rotate(45deg)}.alert-close:after{transform:rotate(-45deg)}.button,button,input,select{font-family:Helvetica,Arial,sans-serif;padding:10px;color:#000}input{border:1px solid rgba(0,0,0,.1);background:0 0;border-top-color:transparent;border-left-color:transparent;border-right-color:transparent;padding-inline-start:0;transition:border-width 1s linear}input:focus,select:focus{border-bottom-color:#3498db}input:-webkit-autofill,input:-webkit-autofill:focus input:-webkit-autofill,input:-webkit-autofill:hover,select:-webkit-autofill,select:-webkit-autofill:focus,select:-webkit-autofill:hover,textarea:-webkit-autofill,textarea:-webkit-autofill:hover textarea:-webkit-autofill:focus{-webkit-text-fill-color:inherit;-webkit-box-shadow:0 0 0 1000px transparent inset;-webkit-transition:background-color 5000s ease-in-out 0s;transition:background-color 5000s ease-in-out 0s}.button,button{display:inline-block;font-size:.83em;font-weight:700;padding-inline-end:15px;padding-inline-start:15px;line-height:.83em;outline:0;cursor:pointer;text-shadow:1px 1px 0 rgba(255,255,255,.1);text-decoration:none;border:0;background-color:rgba(0,0,0,.05);box-shadow:inset 0 2px 5px transparent}.button:hover,button:hover{text-decoration:none}.button:active,button:active{box-shadow:inset 0 2px 5px rgba(0,0,0,.3)}.button.action,button.action{text-shadow:1px 1px 0 rgba(0,0,0,.05);color:#fff;background:#3498db}.button.action:hover,button.action:hover{background:#2980b9}button[disabled],input[disabled]{cursor:wait}input[data-disabled]{cursor:not-allowed}.input-label label{font-size:.9em;display:block;font-weight:700}h1{line-height:1em}code{font-size:.9em;font-family:monospace;background:rgba(0,0,0,.1)}.pre{display:block;background-color:rgba(0,0,0,.1);overflow:auto;height:180px;font-size:.9em;white-space:nowrap;width:100%;resize:none;border:none;margin:1em 0;-moz-tab-size:4;-o-tab-size:4;tab-size:4}@-webkit-keyframes spin{0%{transform:rotate(0)}100%{transform:rotate(360deg)}}@keyframes spin{0%{transform:rotate(0)}100%{transform:rotate(360deg)}}.flex-box .loader{display:inline-block;border:.15em solid rgb(52 152 219 / 20%);border-top:.15em solid #3498db;border-radius:50%;width:1em;height:1em;-webkit-animation:spin 2s linear infinite;animation:spin 2s linear infinite;z-index:1;font-size:32px;position:absolute;top:20px;inset-inline-end:20px;margin:0;opacity:0}.flex-box .loader--show,body.body--installing .flex-box .loader{opacity:1}.animate{transition:all .2s ease}.animate--slow{transition-duration:.8s}.text-align-center{text-align:center}.flex{display:flex}.flex--full{min-height:100%;overflow:hidden}.screen{margin:auto;flex-wrap:wrap;flex-direction:row;justify-content:center;display:flex;visibility:visible}.screen--error{opacity:1;display:flex;transform:scale(1)}@-webkit-keyframes fadeInFromNone{0%{display:none;opacity:0}100%{opacity:1;transform:scale(1)}}@keyframes fadeInFromNone{0%{display:none;opacity:0}100%{opacity:1;transform:scale(1)}}.flex-item{flex:1 0 100%;justify-content:center}.flex-box{background:rgba(255,255,255,.8);-webkit-backdrop-filter:blur(10px);backdrop-filter:blur(10px);background-size:cover;background-position:center;border-radius:10px;min-width:270px;position:relative;margin:20px;flex:1 0 0}.flex-box>div{margin:20px}.flex-box+.flex-box{margin-top:0}.log{background:rgba(255,255,255,.1);overflow:auto;max-height:10em;margin:0;padding:0}.log:empty{display:none}.log p{margin:0;padding:5px}.log p:nth-child(even){background:rgba(255,255,255,.25)}.radius{border-radius:3px}.error-box{background:0 0;box-shadow:none}.error-box a{font-weight:400;text-decoration:none}.error-box a:hover{-webkit-text-decoration-style:solid;text-decoration-style:solid;-webkit-text-decoration-color:#000;text-decoration-color:#000}.error-box-code{opacity:.4;font-size:.9em;border-top:1px solid rgba(0,0,0,.2);padding-top:10px}@media (min-width:680px){.col-8{width:310px}.col-width{width:630px}.flex-box+.flex-box{margin-top:20px;margin-inline-start:0}}.width-100p{width:100%}.header img,.header svg{height:40px;width:auto;max-height:100%;margin:20px auto;display:block}.header img path,.header svg path{fill:#fff}.install-details{font-size:.9em;font-family:monospace}.install-details pre{margin:0;font-family:inherit}@-webkit-keyframes shake{10%,90%{transform:translate3d(-1px,0,0)}20%,80%{transform:translate3d(2px,0,0)}30%,50%,70%{transform:translate3d(-4px,0,0)}40%,60%{transform:translate3d(4px,0,0)}}@keyframes shake{10%,90%{transform:translate3d(-1px,0,0)}20%,80%{transform:translate3d(2px,0,0)}30%,50%,70%{transform:translate3d(-4px,0,0)}40%,60%{transform:translate3d(4px,0,0)}}.display-block{display:block}.input-warning{position:absolute;inset-inline-end:0;top:0;font-size:80%}.red-warning{color:#d74634}.input-password{position:relative}.input-password .input-password-strength{position:absolute;inset-inline-end:0;top:50%;margin-top:5px}.input-password-strength{background:rgba(0,0,0,.1)}.input-password-strength,.input-password-strength span{display:block;width:50px;height:8px}.input-password-strength span{width:0%;background-color:transparent}.input-password-strength [data-veredict=very-weak]{background-color:#e74c3c}.input-password-strength [data-veredict=weak]{background-color:#e67e22}.input-password-strength [data-veredict=average],.input-password-strength [data-veredict=strong],.input-password-strength [data-veredict=stronger]{background-color:#2ecc71}.description-meta:empty{display:none} \ No newline at end of file +body,html{height:100%}body{margin:0;background:#3498db;background:linear-gradient(to bottom,#3498db 0,#8e44ad 100%)}html#error body{background:#ecf0f1}html{color:#000;font:16px Helvetica,Arial,sans-serif;line-height:1.3}.body--block{margin:20px}.body--flex{margin:0;display:flex;flex-direction:column}.user-select-none{-webkit-touch-callout:none;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}.force-select{-webkit-user-select:all;-moz-user-select:all;-ms-user-select:all;user-select:all}main{width:100%;height:100%;padding:0;margin:0;border:0;display:flex;align-items:center;justify-content:center;overflow-y:auto;flex:1}@media (min-width:768px){main{padding:20px}}main>div{width:630px}.main--stack{width:100%;max-width:900px}*{-ms-box-sizing:border-box;box-sizing:border-box;outline:0}a{color:#3498db;outline:0;text-decoration:none}a:hover{text-decoration:underline}p,ul>li{line-height:140%}.soft-hidden{display:none}.p{margin-top:20px;margin-bottom:20px}.alert,.highlight,.log{font-size:.9em;padding:1em}.alert:empty,.highlight:empty{display:none}.highlight{background:rgba(255,255,255,.5);border-inline-start:4px solid #8e44ad}.alert{position:relative;background:rgba(241,196,15,.3);border-inline-start:4px solid #f1c40f;padding-inline-end:2em}.alert pre{overflow:auto}.alert code,.alert pre{background:rgba(241,196,15,.3)}.alert pre code{background:0 0}.shake{-webkit-animation:shake .5s cubic-bezier(.36,.07,.19,.97) both;animation:shake .5s cubic-bezier(.36,.07,.19,.97) both;transform:translate3d(0,0,0);-webkit-backface-visibility:hidden;backface-visibility:hidden;perspective:1000px}.alert-close{cursor:pointer;position:absolute;inset-inline-end:1em;top:1em;width:1em;height:1em;opacity:.3}.alert-close:hover{opacity:1}.alert-close:after,.alert-close:before{position:absolute;inset-inline-start:7.5px;content:' ';height:16px;width:2px;background-color:#333}.alert-close:before{transform:rotate(45deg)}.alert-close:after{transform:rotate(-45deg)}.button,button,input,select{font-family:Helvetica,Arial,sans-serif;padding:10px;color:#000}input{border:1px solid rgba(0,0,0,.1);background:0 0;border-top-color:transparent;border-left-color:transparent;border-right-color:transparent;padding-inline-start:0;transition:border-width 1s linear}input:focus,select:focus{border-bottom-color:#3498db}input:-webkit-autofill,input:-webkit-autofill:focus input:-webkit-autofill,input:-webkit-autofill:hover,select:-webkit-autofill,select:-webkit-autofill:focus,select:-webkit-autofill:hover,textarea:-webkit-autofill,textarea:-webkit-autofill:hover textarea:-webkit-autofill:focus{-webkit-text-fill-color:inherit;-webkit-box-shadow:0 0 0 1000px transparent inset;-webkit-transition:background-color 5000s ease-in-out 0s;transition:background-color 5000s ease-in-out 0s}.button,button{display:inline-block;font-size:.83em;font-weight:700;padding-inline-end:15px;padding-inline-start:15px;line-height:.83em;outline:0;cursor:pointer;text-shadow:1px 1px 0 rgba(255,255,255,.1);text-decoration:none;border:0;background-color:rgba(0,0,0,.05);box-shadow:inset 0 2px 5px transparent}.button:hover,button:hover{text-decoration:none}.button:active,button:active{box-shadow:inset 0 2px 5px rgba(0,0,0,.3)}.button.action,button.action{text-shadow:1px 1px 0 rgba(0,0,0,.05);color:#fff;background:#3498db}.button.action:hover,button.action:hover{background:#2980b9}button[disabled],input[disabled]{cursor:wait}input[data-disabled]{cursor:not-allowed}.input-label label{font-size:.9em;display:block;font-weight:700}h1{line-height:1em}code{font-size:.9em;font-family:monospace;background:rgba(0,0,0,.1)}.pre{display:block;background-color:rgba(0,0,0,.1);overflow:auto;height:180px;font-size:.9em;white-space:nowrap;width:100%;resize:none;border:none;margin:1em 0;-moz-tab-size:4;-o-tab-size:4;tab-size:4}@-webkit-keyframes spin{0%{transform:rotate(0)}100%{transform:rotate(360deg)}}@keyframes spin{0%{transform:rotate(0)}100%{transform:rotate(360deg)}}.flex-box .loader{display:inline-block;border:.15em solid rgb(52 152 219 / 20%);border-top:.15em solid #3498db;border-radius:50%;width:1em;height:1em;-webkit-animation:spin 2s linear infinite;animation:spin 2s linear infinite;z-index:1;font-size:32px;position:absolute;top:20px;inset-inline-end:20px;margin:0;opacity:0}.flex-box form input{font-size:.83em}.flex-box .loader--show,body.body--installing .flex-box .loader{opacity:1}.animate{transition:all .2s ease}.animate--slow{transition-duration:.8s}.text-align-center{text-align:center}.flex{display:flex}.flex--full{min-height:100%;overflow:hidden}.screen{margin:auto;flex-wrap:wrap;flex-direction:row;justify-content:center;display:flex;visibility:visible}.screen--error{opacity:1;display:flex;transform:scale(1)}@-webkit-keyframes fadeInFromNone{0%{display:none;opacity:0}100%{opacity:1;transform:scale(1)}}@keyframes fadeInFromNone{0%{display:none;opacity:0}100%{opacity:1;transform:scale(1)}}.flex-item{flex:1 0 100%;justify-content:center}.flex-box{background:rgba(255,255,255,.8);-webkit-backdrop-filter:blur(10px);backdrop-filter:blur(10px);background-size:cover;background-position:center;border-radius:10px;min-width:270px;position:relative;margin:20px;flex:1 0 0}.flex-box>div{margin:20px}.flex-box+.flex-box{margin-top:0}.log{background:rgba(255,255,255,.1);overflow:auto;max-height:10em;margin:0;padding:0}.log:empty{display:none}.log p{margin:0;padding:5px}.log p:nth-child(even){background:rgba(255,255,255,.25)}.radius{border-radius:3px}.error-box{background:0 0;box-shadow:none}.error-box a{font-weight:400;text-decoration:none}.error-box a:hover{-webkit-text-decoration-style:solid;text-decoration-style:solid;-webkit-text-decoration-color:#000;text-decoration-color:#000}.error-box-code{opacity:.4;font-size:.9em;border-top:1px solid rgba(0,0,0,.2);padding-top:10px}@media (min-width:680px){.col-8{width:310px}.col-width{width:630px}.flex-box+.flex-box{margin-top:20px;margin-inline-start:0}}.width-100p{width:100%}.header img,.header svg{height:40px;width:auto;max-height:100%;margin:20px auto;display:block}.header img path,.header svg path{fill:#fff}.install-details{font-size:.9em;font-family:monospace}.install-details pre{margin:0;font-family:inherit}@-webkit-keyframes shake{10%,90%{transform:translate3d(-1px,0,0)}20%,80%{transform:translate3d(2px,0,0)}30%,50%,70%{transform:translate3d(-4px,0,0)}40%,60%{transform:translate3d(4px,0,0)}}@keyframes shake{10%,90%{transform:translate3d(-1px,0,0)}20%,80%{transform:translate3d(2px,0,0)}30%,50%,70%{transform:translate3d(-4px,0,0)}40%,60%{transform:translate3d(4px,0,0)}}.display-block{display:block}.input-warning{position:absolute;inset-inline-end:0;top:0;font-size:80%}.red-warning{color:#d74634}.input-password input[type=password]{-webkit-padding-end:55px;padding-inline-end:55px}.input-password{position:relative}.input-password .input-password-strength{position:absolute;inset-inline-end:0;top:50%;margin-top:5px;z-index:-1}.input-password-strength{background:rgba(0,0,0,.1)}.input-password-strength,.input-password-strength span{display:block;width:50px;height:8px}.input-password-strength span{width:0%;background-color:transparent}.input-password-strength [data-veredict=very-weak]{background-color:#e74c3c}.input-password-strength [data-veredict=weak]{background-color:#e67e22}.input-password-strength [data-veredict=average],.input-password-strength [data-veredict=strong],.input-password-strength [data-veredict=stronger]{background-color:#2ecc71}.description-meta:empty{display:none} \ No newline at end of file diff --git a/content/legacy/themes/Peafowl/head.php b/content/legacy/themes/Peafowl/head.php index b18bdb1..d86d7c7 100644 --- a/content/legacy/themes/Peafowl/head.php +++ b/content/legacy/themes/Peafowl/head.php @@ -186,6 +186,7 @@ if (!defined('ACCESS') || !ACCESS) { diff --git a/content/legacy/themes/Peafowl/header.php b/content/legacy/themes/Peafowl/header.php index a77cb9a..edbc8db 100644 --- a/content/legacy/themes/Peafowl/header.php +++ b/content/legacy/themes/Peafowl/header.php @@ -1,5 +1,6 @@

    -
  • -
  • - -
  • - - -
  • -
  • -
  • +
  • +
  • + +
  • + + +
  • +
  • +
  • diff --git a/content/legacy/themes/Peafowl/lib/chevereto.js b/content/legacy/themes/Peafowl/lib/chevereto.js index 47c873b..d610d2a 100644 --- a/content/legacy/themes/Peafowl/lib/chevereto.js +++ b/content/legacy/themes/Peafowl/lib/chevereto.js @@ -22,7 +22,7 @@ $(function () { CHV.fn.listingViewer.placeholderSizing(); prevWidth = $(window).width(); prevHeight = $(window).height(); - }, 250); + }, 10); }); if (window.opener) { @@ -330,7 +330,6 @@ $(function () { ); } - // $(document).on("keyup change", "[data-action=resize-combo-input]", function ( e ) { @@ -349,7 +348,6 @@ $(function () { } }); - // Edit item from queue $(document).on( "click", anywhere_upload_queue + " [data-action=edit]", @@ -357,12 +355,10 @@ $(function () { var $item = $(this).closest("li"), $queue = $item.closest("ul"), id = $item.data("id"), - file = CHV.fn.uploader.files[id]; - + file = CHV.fn.uploader.files[id] + media = file.type.substring(0, file.type.indexOf("/")); var modal = PF.obj.modal.selectors.root; var queueObject = $.extend({}, file.formValues || file.parsedMeta); - - // Inject global upload options if needed var injectKeys = ["album_id", "category_id", "nsfw"]; for (var i = 0; i < injectKeys.length; i++) { var key = injectKeys[i]; @@ -381,12 +377,11 @@ $(function () { value; } } - - // Resize before upload PF.fn.modal.call({ type: "html", template: $("#anywhere-upload-edit-item").html(), callback: function () { + $("[data-content=icon]", modal).addClass('fa-file-' + media); var imageMaxCfg = { width: CHV.obj.config.image.max_width != 0 ? CHV.obj.config.image.max_width : queueObject.width, @@ -435,6 +430,11 @@ $(function () { .prop("max", value) .data("initial", file.parsedMeta[i]) .prop("value", value); + if(media !== "image") { + $input + .prop("disabled", true) + .closest("[data-action=resize-combo-input]").hide(); + } } }); @@ -447,9 +447,7 @@ $(function () { class: "canvas checkered-background", }) ); - var source_canvas = $( - ".queue-item[data-id=" + id + "] .preview .canvas" - )[0]; + var source_canvas = $(".queue-item[data-id=" + id + "] .preview .canvas")[0]; var target_canvas = $(".image-preview .canvas", modal)[0]; target_canvas.width = source_canvas.width; target_canvas.height = source_canvas.height; @@ -695,6 +693,9 @@ $(function () { $(document) .on("click", CHV.obj.image_viewer.container + " img", function (e) { + if($(CHV.obj.image_viewer.loader).exists()) { + $(CHV.obj.image_viewer.loader).trigger("click"); + } if (!( $(this).hasClass("cursor-zoom-in") || $(this).hasClass("cursor-zoom-out") @@ -703,6 +704,7 @@ $(function () { } var zoom_in = $(this).hasClass("cursor-zoom-in"); $(this).removeClass("cursor-zoom-in cursor-zoom-out"); + if (zoom_in) { var width = $(this).attr('width'), height = $(this).attr('height'), @@ -902,7 +904,7 @@ $(function () { if ($list_item.exists()) { modal_tpl = CHV.fn.modal.getTemplateWithPreview(modal_sel, $list_item); if (typeof $list_item.attr("data-type") === "undefined") { - console.log("Error: data-type not defined"); + console.error("Error: data-type not defined"); return; } link = $list_item.find('.list-item-desc-title-link').first(); @@ -959,7 +961,7 @@ $(function () { if (typeof $list_item.attr("data-type") !== "undefined") { dealing_with = $list_item.attr("data-type"); } else { - console.log("Error: data-type not defined"); + console.error("Error: data-type not defined"); return; } @@ -1364,7 +1366,7 @@ $(function () { if (typeof $content_listing.data("list") !== "undefined") { dealing_with = $content_listing.data("list"); } else { - console.log("Error: data-list not defined"); + console.error("Error: data-list not defined"); return; } @@ -2204,6 +2206,12 @@ $(function () { if (typeof PF.fn.get_url_var("license") !== typeof undefined) { $("[data-action='license']").trigger("click"); } + if (typeof PF.fn.get_url_var("welcome") !== typeof undefined) { + PF.fn.modal.call({ + template: $("[data-modal=welcome]").html(), + buttons: false, + }); + } if (typeof PF.fn.get_url_var("installed") !== typeof undefined) { PF.fn.modal.simple({ title: ' ' + PF.fn._s("Chevereto v%s installed", CHV.obj.system_info.version), @@ -2713,14 +2721,13 @@ $(function () { PF.fn.keyFeedback.spawn(e); e.preventDefault(); e.stopPropagation(); - } var selectableItemSelector = PF.obj.listing.selectors.list_item + ", .image-container"; $(document).on("contextmenu click", selectableItemSelector, function (e) { if (!$(".list-selection:visible").exists() + || $(e.target).closest(".list-item-desc").exists() || $(this).closest(CHV.fn.listingViewer.selectors.root).exists() - || e.type == "click" - && !(e.ctrlKey || e.metaKey) + || (e.type == "click" && !(e.ctrlKey || e.metaKey)) ) { return; } @@ -3320,6 +3327,15 @@ CHV.fn.listingViewer = { var srcHtml = this.getEl("src").parent().html(); var $src = $(srcHtml).attr("src", this.object.image.url); $src.insertBefore(this.getEl("src")); + var mediaTarget = $src.eq(0); + if(mediaTarget.attr('data-type') === 'video') { + mediaTarget.replaceWith( + '' + ); + mediaTarget.src = this.object.image.url; + } else { + mediaTarget.attr("src", this.object.image.url); + } $src.imagesLoaded(function () { $src.next().remove(); }); @@ -3465,36 +3481,43 @@ CHV.fn.viewerLoadImage = function () { autoLoad: true, type: "equirectangular", panorama: CHV.obj.image_viewer.image.url, - preview: CHV.obj.image_viewer.$container.find("img").eq(0).attr("src"), + preview: CHV.obj.image_viewer.$container.find(".media").eq(0).attr("src"), pitch: 2.3, yaw: -135.4, hfov: 120 }); $("#image-viewer-360").removeClass("soft-hidden"); - CHV.obj.image_viewer.$container.find("img").eq(0).remove(); + CHV.obj.image_viewer.$container.find(".media").eq(0).remove(); return; } - CHV.obj.image_viewer.image.html = CHV.obj.image_viewer.$container.html(); - CHV.obj.image_viewer.$container.prepend( - $(CHV.obj.image_viewer.image.html).css({ - top: 0, - zIndex: 0, - opacity: 0, - position: "absolute" - }) - ); - CHV.obj.image_viewer.$container.find("img").eq(0).css("zIndex", 1); CHV.obj.image_viewer.$container - .find("img") - .eq(1) - .attr("src", CHV.obj.image_viewer.image.url); - CHV.obj.image_viewer.$container - .find("img") - .eq(1) + .css("height", CHV.obj.image_viewer.$container.height()) + .prepend( + $(CHV.obj.image_viewer.image.html).css({ + top: 0, + zIndex: 0, + opacity: 0, + position: "absolute" + }) + ); + CHV.obj.image_viewer.$container.find(".media").eq(0).css("zIndex", 1); + var mediaTarget = CHV.obj.image_viewer.$container.find(".media").eq(1); + var width = mediaTarget.css("width"); + var height = mediaTarget.css("height"); + if(mediaTarget.attr('data-type') === 'video') { + mediaTarget.replaceWith( + '' + ); + mediaTarget.src = CHV.obj.image_viewer.image.url; + } else { + mediaTarget.attr("src", CHV.obj.image_viewer.image.url); + } + mediaTarget .imagesLoaded(function () { - CHV.obj.image_viewer.$container.find("img").eq(1).css({ position: "", display: "" }); - CHV.obj.image_viewer.$container.find("img").eq(0).remove(); + CHV.obj.image_viewer.$container.find(".media").eq(1).css({ position: "", display: "", opacity: 1}); + CHV.obj.image_viewer.$container.find(".media").eq(0).remove(); + $(CHV.obj.image_viewer.container).css('height', ''); PF.fn.loading.destroy(CHV.obj.image_viewer.$loading); }); }; @@ -3769,7 +3792,7 @@ CHV.fn.uploader = { "overflow-y": "scroll", "overflow-x": "auto", }); - $("body").addClass("overflow-hidden"); + $("html").addClass("overflow-hidden"); } else { $(this.selectors.root).css("overflow-y", ""); } @@ -3807,9 +3830,10 @@ CHV.fn.uploader = { if (items) { const files = new Array(); const urls = new Array(); + const regex = new RegExp("^(image|video)/", "i"); let uploaderIsVisible = $(CHV.fn.uploader.selectors.root).data("shown"); for (var i = 0; i < items.length; i++) { - if (items[i].type.indexOf("image") !== -1) { + if (regex.test(items[i].type)) { let file = items[i].getAsFile(); files.push(file); } else if (items[i].kind == 'string') { @@ -3858,9 +3882,8 @@ CHV.fn.uploader = { return false; } - $fileinput = $(this.selectors.file); - $fileinput.replaceWith(($fileinput = $fileinput.clone(true))); - + var $file_input = $(this.selectors.file); + $file_input.replaceWith(($file_input = $file_input.clone(true))); var item_queue_template = $(this.selectors.upload_item_template).html(); let files = []; let directories = []; @@ -3947,13 +3970,16 @@ CHV.fn.uploader = { .substr(file.name.lastIndexOf(".") + 1) .toLowerCase(); } else { - image_type_str = file.type.replace("image/", ""); + image_type_str = file.type + .replace("image/", "") + .replace("video/", ""); } // Size filter if (file.size > CHV.obj.config.image.max_filesize.getBytes()) { failed_files.push({ uid: i, name: file.name.truncate_middle() + " - " + PF.fn._s("File too big."), + error: 'MEDIA_ERR_FILE_SIZE', }); continue; } @@ -3967,6 +3993,7 @@ CHV.fn.uploader = { name: file.name.truncate_middle() + " - " + PF.fn._s("Invalid or unsupported file format."), + error: 'MEDIA_ERR_FILETYPE', }); continue; } @@ -3976,12 +4003,10 @@ CHV.fn.uploader = { file.fromClipboard = e.clipboard == true; file.uid = i; } - for (var i = 0; i < failed_files.length; i++) { var failed_file = failed_files[i]; files.splice(failed_file.id, 1); } - if (failed_files.length > 0 && files.length == 0) { var failed_message = ""; for (var i = 0; i < failed_files.length; i++) { @@ -4026,17 +4051,17 @@ CHV.fn.uploader = { * This is basic but is the quickest way to do it * Note: it doesn't work on iOS for local files http://stackoverflow.com/questions/18412774/get-real-file-name-in-ios-6-x-filereader */ - var currentfiles = []; + var current_files = []; for (var key in this.files) { if ( typeof this.files[key] == "undefined" || typeof this.files[key] == "function" ) continue; - currentfiles.push(encodeURI(this.files[key].name)); + current_files.push(encodeURI(this.files[key].name)); } files = $.map(files, function (file, i) { - if ($.inArray(encodeURI(file.name), currentfiles) != -1) { + if ($.inArray(encodeURI(file.name), current_files) != -1) { return null; } file.uid = CHV.fn.uploader.filesAddId; @@ -4072,18 +4097,14 @@ CHV.fn.uploader = { if (typeof i == typeof undefined) { var i = 0; } - if (!(i in files)) { PF.fn.loading.destroy("fullscreen"); return; } - var file = files[i]; - if (directories.includes(file.name)) { return; } - $( CHV.fn.uploader.selectors.queue_item + ":not([data-id]) .load-url", CHV.fn.uploader.selectors.queue @@ -4100,174 +4121,237 @@ CHV.fn.uploader = { .closest("li") .attr("data-id", file.uid); - // Load the image (async) - loadImage( - file.url ? file.url : file, - function (img) { - ++j; + function getQueueItem(uid) { + return $( + CHV.fn.uploader.selectors.queue_item + + "[data-id=" + uid +"]", + CHV.fn.uploader.selectors.queue + ); + } - var $queue_item = $( - CHV.fn.uploader.selectors.queue_item + - "[data-id=" + - file.uid + - "]", - CHV.fn.uploader.selectors.queue + function displayQueueIfNotVisible() { + if (!$( + "[data-group=upload-queue]", + CHV.fn.uploader.selectors.root + ).is(":visible")) { + $( + "[data-group=upload-queue]", + CHV.fn.uploader.selectors.root + ).css("display", "block"); + } + } + + function getTitle(file) { + var title = null; + if (typeof file.name !== typeof undefined) { + var basename = PF.fn.baseName(file.name); + title = $.trim( + basename + .substring(0, 100) + .capitalizeFirstLetter() ); + } + return title; + } - if ( - img.type === - "error" /* || typeof data.imageHead == typeof undefined*/ - ) { - // image parse error (png always return undefined data) - failed_files.push({ - uid: file.uid, - name: file.name.truncate_middle(), - }); - } else { - if (!$( - "[data-group=upload-queue]", - CHV.fn.uploader.selectors.root - ).is(":visible")) { - $( - "[data-group=upload-queue]", - CHV.fn.uploader.selectors.root - ).css("display", "block"); - } - - // Detect true mimetype - var mimetype = "image/jpeg"; // Default unknown mimetype - - if (typeof data.buffer !== typeof undefined) { - var buffer = new Uint8Array(data.buffer).subarray(0, 4); - var header = ""; - for (var i = 0; i < buffer.length; i++) { - header += buffer[i].toString(16); - } - var header_to_mime = { - "89504e47": "image/png", - "47494638": "image/gif", - ffd8ffe0: "image/jpeg", - }; - $.each(["ffd8ffe1", "ffd8ffe2"], function (i, v) { - header_to_mime[v] = header_to_mime["ffd8ffe0"]; - }); - if (typeof header_to_mime[header] !== typeof undefined) { - mimetype = header_to_mime[header]; - } - } - - var title = null; - if (typeof file.name !== typeof undefined) { - var basename = PF.fn.baseName(file.name); - title = $.trim( - basename - .substring(0, 100) - .capitalizeFirstLetter() /*.replace(/\.[^/.]+$/g, "").replace(/[\W_]+/g, " ")*/ - ); - } - - // Set source image data - CHV.fn.uploader.files[file.uid].parsedMeta = { - title: title, - width: img.originalWidth, - height: img.originalHeight, - mimetype: mimetype, - }; - - $queue_item.show(); - - $(CHV.fn.uploader.selectors.root) - .addClass("queueReady") - .removeClass("queueEmpty"); - - $( - "[data-group=upload-queue-ready]", - CHV.fn.uploader.selectors.root - ).show(); - $("[data-group=upload]", CHV.fn.uploader.selectors.root).hide(); - - $queue_item.find(".load-url").remove(); - $queue_item - .find(".preview") - .removeClass("soft-hidden") - .show() - .append(img); - - $img = $queue_item.find(".preview").find("img,canvas"); - $img.attr("class", "canvas"); - - queue_item_h = $queue_item.height(); - queue_item_w = $queue_item.width(); - - var img_w = parseInt($img.attr("width")) || $img.width(); - var img_h = parseInt($img.attr("height")) || $img.height(); - var img_r = img_w / img_h; - - $img.hide(); - - if (img_w > img_h || img_w == img_h) { - // Landscape - var queue_img_h = img_h < queue_item_h ? img_h : queue_item_h; - if (img_w > img_h) { - $img.height(queue_img_h).width(queue_img_h * img_r); - } - } - if (img_w < img_h || img_w == img_h) { - // Portrait - var queue_img_w = img_w < queue_item_w ? img_w : queue_item_w; - if (img_w < img_h) { - $img.width(queue_img_w).height(queue_img_w / img_r); - } - } - if (img_w == img_h) { - $img.height(queue_img_h).width(queue_img_w); - } - - $img - .css({ - marginTop: -$img.height() / 2, - marginLeft: -$img.width() / 2, - }) - .show(); - - CHV.fn.uploader.boxSizer(); + function loadVideo(url, callback) { + const video = document.createElement("video"); + video.addEventListener("loadedmetadata", function () { + const seek = video.duration / 4; + setTimeout(() => { + video.currentTime = seek; + }, 100); + video.addEventListener("seeked", () => { + const canvas = document.createElement("canvas"); + canvas.width = video.videoWidth; + canvas.height = video.videoHeight; + const ctx = canvas.getContext("2d"); + ctx.drawImage(video, 0, 0, canvas.width, canvas.height); + ctx.canvas.toBlob( + blob => { + callback(video, canvas) + }, + "image/jpeg", + 0.90 + ); + }, false); + }); + video.onerror = (e) => { + const videoError = { + 1: "MEDIA_ERR_ABORTED", + 2: "MEDIA_ERR_NETWORK", + 3: "MEDIA_ERR_DECODE", + 4: "MEDIA_ERR_SRC_NOT_SUPPORTED", } + var error = videoError[video.error.code]; + callback({ type: "error", error: error }) + console.error("Error loading video", error) + } + video.src = url; + } - // Last one - if (j == files.length) { - if (typeof failed_before !== "undefined") { - failed_files = failed_files.concat(failed_before); - } + function setQueueReady($queue_item, img) { + $queue_item.show(); + $(CHV.fn.uploader.selectors.root) + .addClass("queueReady") + .removeClass("queueEmpty"); + $("[data-group=upload-queue-ready]", CHV.fn.uploader.selectors.root).show(); + $("[data-group=upload]", CHV.fn.uploader.selectors.root).hide(); + $queue_item.find(".load-url").remove(); + $queue_item + .find(".preview") + .removeClass("soft-hidden") + .show() + .append(img); + $img = $queue_item.find(".preview").find("img,canvas"); + $img.attr("class", "canvas"); + queue_item_h = $queue_item.height(); + queue_item_w = $queue_item.width(); + var img_w = parseInt($img.attr("width")) || $img.width(); + var img_h = parseInt($img.attr("height")) || $img.height(); + var img_r = img_w / img_h; + $img.hide(); + if (img_w > img_h || img_w == img_h) { + // Landscape + var queue_img_h = img_h < queue_item_h ? img_h : queue_item_h; + if (img_w > img_h) { + $img.height(queue_img_h).width(queue_img_h * img_r); + } + } + if (img_w < img_h || img_w == img_h) { + // Portrait + var queue_img_w = img_w < queue_item_w ? img_w : queue_item_w; + if (img_w < img_h) { + $img.width(queue_img_w).height(queue_img_w / img_r); + } + } + if (img_w == img_h) { + $img.height(queue_img_h).width(queue_img_w); + } + $img + .css({ + marginTop: -$img.height() / 2, + marginLeft: -$img.width() / 2, + }) + .show(); + displayQueueIfNotVisible(); + CHV.fn.uploader.boxSizer(); + } - PF.fn.loading.destroy("fullscreen"); - if (failed_files.length > 0) { - var failed_message = ""; - for (var i = 0; i < failed_files.length; i++) { - failed_message += - "
  • " + PF.fn.htmlEncode(failed_files[i].name) + "
  • "; - delete CHV.fn.uploader.files[failed_files[i].uid]; - $( - "li[data-id=" + failed_files[i].uid + "]", - CHV.fn.uploader.selectors.queue - ) - .find("[data-action=cancel]") - .click(); - } - PF.fn.modal.simple({ - title: PF.fn._s("Some files couldn't be added"), - message: "
      " + failed_message + "
    ", + function someFilesFailed(j, files, failed_files) { + if (j !== files.length) { + return; + } + if (typeof failed_before !== "undefined") { + failed_files = failed_files.concat(failed_before); + } + PF.fn.loading.destroy("fullscreen"); + if (failed_files.length > 0) { + var failed_message = ""; + for (var i = 0; i < failed_files.length; i++) { + failed_message += + "
  • " + + PF.fn.htmlEncode(failed_files[i].name) + + " - " + + PF.fn.htmlEncode(failed_files[i].error) + + "
  • "; + delete CHV.fn.uploader.files[failed_files[i].uid]; + $( + "li[data-id=" + failed_files[i].uid + "]", + CHV.fn.uploader.selectors.queue + ) + .find("[data-action=cancel]") + .click(); + } + PF.fn.modal.simple({ + title: PF.fn._s("Some files couldn't be loaded"), + message: "
      " + failed_message + "
    ", + }); + } else { + CHV.fn.uploader.focus(); + } + CHV.fn.uploader.boxSizer(); + } + + // Load the image (async) + if(typeof file.type !== "undefined" && file.type.startsWith('video/')) { + var $queue_item = getQueueItem(file.uid); + var title = getTitle(file); + var videoUrl = URL.createObjectURL(file); + loadVideo( + videoUrl, + function(video, canvas) { + ++j; + // var $queue_item = getQueueItem(file.uid); + if (video.type === "error") { + failed_files.push({ + uid: file.uid, + name: file.name.truncate_middle(), + error: video.error }); } else { - CHV.fn.uploader.focus(); + CHV.fn.uploader.files[file.uid].parsedMeta = { + title: title, + width: video.videoWidth, + height: video.videoHeight, + mimetype: file.type, + }; + setQueueReady($queue_item, canvas); } - - CHV.fn.uploader.boxSizer(); + someFilesFailed(j, files, failed_files); } - }, - $.extend({}, default_options, { - orientation: data.exif ? data.exif.get("Orientation") : 1, - }) - ); + ) + } else { + loadImage( + file.url ? file.url : file, + function (img) { + ++j; + var $queue_item = getQueueItem(file.uid); + if (img.type === "error") { + failed_files.push({ + uid: file.uid, + name: file.name.truncate_middle(), + error: 'MEDIA_ERR_SRC_FORMAT' + }); + } else { + displayQueueIfNotVisible(); + // Detect true mimetype + var mimetype = "image/jpeg"; // Default unknown mimetype + if (typeof data.buffer !== typeof undefined) { + var buffer = new Uint8Array(data.buffer).subarray(0, 4); + var header = ""; + for (var i = 0; i < buffer.length; i++) { + header += buffer[i].toString(16); + } + var header_to_mime = { + "89504e47": "image/png", + "47494638": "image/gif", + "ffd8ffe0": "image/jpeg", + "ffd8ffe1": "image/jpeg", + "ffd8ffe2": "image/jpeg", + "ffd8ffe3": "image/jpeg", + "ffd8ffe8": "image/jpeg" + }; + if (typeof header_to_mime[header] !== typeof undefined) { + mimetype = header_to_mime[header]; + } + } + var title = getTitle(file); + CHV.fn.uploader.files[file.uid].parsedMeta = { + title: title, + width: img.originalWidth, + height: img.originalHeight, + mimetype: mimetype, + }; + setQueueReady($queue_item, img); + } + someFilesFailed(j, files, failed_files); + }, + $.extend({}, default_options, { + orientation: data.exif ? data.exif.get("Orientation") : 1, + }) + ); + } // Next one setTimeout(function () { @@ -4277,10 +4361,7 @@ CHV.fn.uploader = { } PF.fn.loading.fullscreen(); - - // Load all the target images starting from zero (null in this case, yeah I like to fuck around just because reasons) CHVLoadImage(); - this.queueSize(); }, @@ -4352,7 +4433,6 @@ CHV.fn.uploader = { this.isUploading = true; - // HTML5 form var form = new FormData(); var formData = { source: null, @@ -4366,6 +4446,7 @@ CHV.fn.uploader = { nsfw: $("[name=upload-nsfw]", this.selectors.root).prop("checked") ? 1 : 0, album_id: $("[name=upload-album-id]", this.selectors.root).val() || null, + mimetype: f.type }; // Append URL BLOB source @@ -4710,13 +4791,11 @@ CHV.fn.fillEmbedCodes = function (elements, parent, fn) { fn = "val"; } var embed_tpl = CHV.fn.uploader.selectors.root == parent ? "embed_upload_tpl" : "embed_share_tpl"; + var hasVideo = false; $.each(elements, function (key, value) { if (typeof value == typeof undefined) return; - var image = "id_encoded" in value ? value : value.image; - if (!image.medium) { - // Medium doesn't exists image.medium = {}; var imageProp = [ "filename", @@ -4731,15 +4810,26 @@ CHV.fn.fillEmbedCodes = function (elements, parent, fn) { for (var i = 0; i < imageProp.length; i++) { image.medium[imageProp[i]] = image[imageProp[i]]; } + if(image.type === 'video') { + image.medium.url = image.url_frame; + } } - var flatten_image = Object.flatten(image); - $.each(CHV.obj[embed_tpl], function (key, value) { $.each(value.options, function (k, v) { var embed = v, $embed = $("textarea[name=" + k + "]", parent), - template = embed.template; + template = v.template; + if(typeof template === 'object' && template.hasOwnProperty(flatten_image["type"]) + ) { + template = template[flatten_image["type"]] + } + if(flatten_image["type"] === "video") { + hasVideo = true; + } + if(flatten_image["type"] !== "video") { + template = template.replaceAll("%URL_FRAME%", ""); + } for (var i in flatten_image) { if (!flatten_image.hasOwnProperty(i)) { continue; @@ -4757,6 +4847,7 @@ CHV.fn.fillEmbedCodes = function (elements, parent, fn) { }); }); }); + $("option[value=frame-links]", parent).prop("hidden", !hasVideo); $.each(CHV.obj[embed_tpl], function (key, value) { $.each(value.options, function (k, v) { var $embed = $("textarea[name=" + k + "]", parent); @@ -5454,6 +5545,14 @@ CHV.fn.storage = { "url", "account_id", "account_name", + "type_chain" + ], + chain: [ + "other", + "document", + "audio", + "video", + "image", ], calling: false, validateForm: function () { @@ -5514,7 +5613,6 @@ CHV.fn.storage = { return false; } } - if ( /^https?:\/\/.+$/.test($("[name=form-storage-url]", modal).val()) == false ) { @@ -5614,9 +5712,20 @@ CHV.fn.storage = { } $input.attr("value", v); } + if(i === "form-storage-type_chain") { + let chain = (parseInt(v) >>> 0) + .toString(2) + .paddingLeft( + "0".repeat(CHV.fn.storage.chain.length) + ) + .split(""); + CHV.fn.storage.chain.forEach(function(key, i) { + $('#storage_type_enable_'+key, modal_source) + .removeAttr("checked") + .attr("checked", chain[i] == 1); + }); + } }); - - // Co-combo breaker $("[data-combo-value]").addClass("soft-hidden"); $(combo).removeClass("soft-hidden"); }, @@ -5628,7 +5737,6 @@ CHV.fn.storage = { if (!CHV.fn.storage.validateForm()) { return false; } - PF.obj.modal.form_data = { action: "edit", edit: "storage", @@ -5642,6 +5750,10 @@ CHV.fn.storage = { } PF.obj.modal.form_data.editing[v] = $(sel, modal).val(); }); + let chain = CHV.fn.storage.chain.map(function(key) { + return $('#storage_type_enable_'+key, modal).prop("checked") ? 1 : 0; + }); + PF.obj.modal.form_data.editing.type_chain = parseInt(chain.join(""), 2); return true; }, @@ -6380,7 +6492,7 @@ CHV.fn.import = { "readyState" in CHV.obj.import.working[id].stats && CHV.obj.import.working[id].stats.readyState != 4 ) { - console.log( + console.error( "Aborting stats timeout call (previous call is still not ready)" ); return; diff --git a/content/legacy/themes/Peafowl/lib/chevereto.min.js b/content/legacy/themes/Peafowl/lib/chevereto.min.js index c3c3183..21df36b 100644 --- a/content/legacy/themes/Peafowl/lib/chevereto.min.js +++ b/content/legacy/themes/Peafowl/lib/chevereto.min.js @@ -1,4 +1,4 @@ -$(function(){function e(e){e=e.originalEvent;var t=!1;if(e.dataTransfer.types)for(var a=0;ae&&(a.height(e),a.closest(".antiscroll-wrap").antiscroll())}}function a(e){e.addClass("list-item-play-gif--loading");var t=e.closest(PF.obj.listing.selectors.list_item),a=$(".image-container",t),o=$("img",a),i=o.attr("src"),n=".md",s=i.lastIndexOf(n);if(-1==s)n=".th",s=i.lastIndexOf(n);var r=i.substr(0,s)+i.substr(s+n.length,i.length);a.append(a.html()),$load=t.find(".image-container img").eq(1).attr("src",r).addClass("hidden"),$load.imagesLoaded(function(){e.remove(),o.remove(),$("img",a).show(),$(this.elements).removeClass("hidden")})}function o(e,t){var a=$(e).closest(PF.obj.listing.selectors.list_item);CHV.fn.list_editor.blink(a),CHV.fn.list_editor.toggleSelectItem(a),PF.fn.keyFeedback.spawn(t),t.preventDefault(),t.stopPropagation()}var i,n=$(window).width();$(window).height();if($(window).resize(function(e){clearTimeout(i),i=setTimeout(function(){$("body#image").exists()&&n!=$(window).width()&&CHV.fn.image_viewer_full_fix(),CHV.fn.uploader.boxSizer(),CHV.fn.bindSelectableItems(),CHV.fn.listingViewer.placeholderSizing(),n=$(window).width(),$(window).height()},250)}),window.opener&&($(window).on("load",function(e){window.opener.postMessage({id:window.name,requestAction:"postSettings"},"*")}),$(window).on("message",function(e){var t=e.originalEvent.data;void 0!==t.id&&void 0!==t.settings&&window.name===t.id&&(CHV.obj.opener.uploadPlugin[t.id]=t.settings)})),$("#home-cover, #maintenance-wrapper, #login").exists()){var s=$("#maintenance-wrapper").exists()?$("#maintenance-wrapper").css("background-image").slice(4,-1).replace(/^\"|\"$/g,""):$(".home-cover-img","#home-cover-slideshow").first().attr("data-src");function r(){$("body").addClass("load"),$("#maintenance-wrapper").exists()||$(".home-cover-img","#home-cover-slideshow").first().css("background-image","url("+s+")").addClass("animate-in--alt").removeAttr("data-src"),setTimeout(function(){setTimeout(function(){$("body").addClass("loaded")},1200),setTimeout(function(){d()},7e3)},600)}var l=function(){setTimeout(function(){d()},8e3)};function d(){var e=$(".home-cover-img[data-src]","#home-cover-slideshow").first(),t=$(".home-cover-img","#home-cover-slideshow");if(0==e.length){if(1==t.length)return;t.first().removeClass("animate-in"),$("#home-cover-slideshow").append(t.first()),setTimeout(function(){$(".home-cover-img:last","#home-cover-slideshow").addClass("animate-in")},20),setTimeout(function(){$(".home-cover-img:not(:last)","#home-cover-slideshow").removeClass("animate-in")},4e3),l()}else{var a=e.attr("data-src");$("").attr("src",a).on("load error",function(){$(this).remove(),e.css("background-image","url("+a+")").addClass("animate-in").removeAttr("data-src"),setTimeout(function(){$(".home-cover-img:not(:last)","#home-cover-slideshow").removeClass("animate-end animate-in--alt")},2e3),l()})}}s?$("").attr("src",s).on("load error",function(){$(this).remove(),r()}):r()}var c,u=CHV.fn.uploader.selectors.root,m=CHV.fn.uploader.selectors.queue,f=$(u),p=$(m);if($(document).on("click","[data-action=top-bar-upload]",function(e){$("body").is("#upload")||"js"!==$(this).data("link")||CHV.fn.uploader.toggle({reset:!1}),"page"!==$(this).data("link")&&(e.preventDefault(),e.stopPropagation())}),$(document).on("click mouseover mouseout","[data-action=palette]",function(e){clearTimeout(c),e.preventDefault();var t=$(this).data("palette");switch(e.type){case"mouseover":c=setTimeout(function(){CHV.fn.Palettes.preview(t)},1e3);break;case"mouseout":t=$("html").attr("data-palette")||"",CHV.fn.Palettes.set(t);break;case"click":e.stopPropagation(),$("[data-action=palette]","[data-content=palettes]").removeClass("current"),$(this).addClass("current"),CHV.fn.Palettes.set(t),CHV.fn.Palettes.save()}}),$(document).on("change","#palettes",function(e){CHV.fn.Palettes.set(this.value),CHV.fn.Palettes.save()}),$("[data-action=close-upload]",f).click(function(){f.is(":animated")||$("[data-action=top-bar-upload]","#top-bar").trigger("click")}),$("[data-action=reset-upload]",f).click(function(){CHV.fn.uploader.isUploading&&$("[data-action=cancel-upload-remaining], [data-action=cancel-upload]",f).trigger("click"),CHV.fn.uploader.reset()}),$("[data-action=cancel-upload-remaining], [data-action=cancel-upload]",f).click(function(){CHV.fn.uploader.isUploading=!1,$("[data-action=cancel]",p).click(),Object.size(CHV.fn.uploader.results.success)>0?CHV.fn.uploader.displayResults():CHV.fn.uploader.reset()}),$(document).on("click","[data-action=upload-privacy]:not(disabled)",function(e){e.isDefaultPrevented()||(current_privacy=$(this).data("privacy"),target_privacy="public"==current_privacy?"private":"public",this_lock=$(".icon",this).data("lock"),this_unlock=$(".icon",this).data("unlock"),$(".icon",this).removeClass(this_lock+" "+this_unlock).addClass("public"==current_privacy?this_lock:this_unlock),$(this).data("privacy",target_privacy),$("[data-action=upload-privacy-copy]").html($("[data-action=upload-privacy]").html()),$upload_button=$("[data-action=upload]",f),$upload_button.text($upload_button.data(target_privacy)),$(this).tipTip("hide"))}),$(CHV.fn.uploader.selectors.file+", "+CHV.fn.uploader.selectors.camera).on("change",function(e){$(CHV.fn.uploader.selectors.root).data("shown")?CHV.fn.uploader.add(e):CHV.fn.uploader.toggle({callback:function(e){CHV.fn.uploader.add(e)}},e)}).on("click",function(e){!$(this).data("login-needed")||PF.fn.is_user_logged()}),$(CHV.fn.uploader.selectors.root).exists()&&($("body").on({dragenter:function(t){if(t.preventDefault(),!e(t))return!1;$(CHV.fn.uploader.selectors.dropzone).exists()||$("body").append($('
    ').css({width:"100%",height:"100%",position:"fixed",zIndex:1e3,left:0,top:0}))}}),$(document).on({dragover:function(t){if(t.preventDefault(),!e(t))return!1;$(CHV.fn.uploader.selectors.root).data("shown")||CHV.fn.uploader.toggle({reset:!1})},dragleave:function(e){$(CHV.fn.uploader.selectors.dropzone).remove(),$.isEmptyObject(CHV.fn.uploader.files)&&CHV.fn.uploader.toggle()},drop:function(e){e.preventDefault(),CHV.fn.uploader.add(e),$(CHV.fn.uploader.selectors.dropzone).remove()}},CHV.fn.uploader.selectors.dropzone)),$(document).on("keyup change","[data-action=resize-combo-input]",function(e){var t=$(this).closest("[data-action=resize-combo-input]"),a=$("[name=form-width]",t),o=$("[name=form-height]",t),i=a.data("initial")/o.data("initial"),n={width:Math.round(a.prop("value")/i),height:Math.round(o.prop("value")*i)};$(e.target).is(a)?o.prop("value",Math.round(n.width)):a.prop("value",Math.round(n.height))}),$(document).on("click",m+" [data-action=edit]",function(){for(var e=$(this).closest("li"),t=(e.closest("ul"),e.data("id")),a=CHV.fn.uploader.files[t],o=PF.obj.modal.selectors.root,i=$.extend({},a.formValues||a.parsedMeta),n=["album_id","category_id","nsfw"],s=0;se.height&&(n.height=e.height,n.width=Math.round(n.height*s)),n.width>e.width&&(n.width=e.width,n.height=Math.round(n.width/s)),$.each(i,function(e,t){var i="[name=form-"+e.replace(/_/g,"-")+"]",s=$(i,o);if(!s.exists())return!0;if(s.is(":checkbox"))s.prop("checked",s.attr("value")==t);else if(s.is("select")){var r=s.find("[value="+t+"]");r.exists()||(r=s.find("option:first")),r.prop("selected",!0)}else s.prop("value",t);if("width"==e||"height"==e){var l=n[e],d=a.parsedMeta[e]>l?l:a.parsedMeta[e];s.prop("max",d).data("initial",a.parsedMeta[e]).prop("value",d)}}),"image/gif"!==a.parsedMeta.mimetype&&$("[ data-content=animated-gif-warning]",o).remove(),$(".image-preview",o).append($("",{class:"canvas checkered-background"}));var r=$(".queue-item[data-id="+t+"] .preview .canvas")[0],l=$(".image-preview .canvas",o)[0];l.width=r.width,l.height=r.height;var d=l.getContext("2d");d.drawImage(r,0,0)},confirm:function(){if(PF.fn.form_modal_has_changed()){var e=!1;return $.each(["width","height"],function(t,a){var i=$("[name=form-"+a+"]",o),n=parseInt(i.val()),s=parseInt(i.attr("min")),r=parseInt(i.attr("max"));if(n>r||n-1&&CHV.fn.uploader.clipboardImages.splice(s,1)}delete CHV.fn.uploader.files[a],CHV.fn.uploader.queueSize(),0==Object.size(CHV.fn.uploader.files)?"success"in CHV.fn.uploader&&"results"in CHV.fn.uploader&&(0!=Object.size(CHV.fn.uploader.results.success)||0!=Object.size(CHV.fn.uploader.results.error))||CHV.fn.uploader.reset():i&&0!==$("li.waiting",t).first().length&&CHV.fn.uploader.upload($("li.waiting",t).first())}}),$(document).on("click","[data-action=upload]",function(){void 0!==CHV.obj.logged_user||!1!==$("#upload-tos").prop("checked")?($("[data-group=upload], [data-group=upload-queue-ready]",f).hide(),f.removeClass("queueReady").addClass("queueUploading").find("[data-group=uploading]").show(),CHV.fn.uploader.queueSize(),CHV.fn.uploader.canAdd=!1,$queue_items=$("li",p),$queue_items.addClass("uploading waiting"),CHV.fn.uploader.timestamp=(new Date).getTime(),CHV.fn.uploader.upload($queue_items.first("li"))):PF.fn.growl.call("You must agree to the terms and privacy policy")}),$("body#user").exists()&&PF.obj.listing.query_string.page>1){var g=History.getState();if(g.data&&void 0!==g.data.scrollTop)$(window).scrollTop()!==g.data.scrollTop&&$(window).scrollTop(g.data.scrollTop);else{var h=$("#background-cover").height()-160;$("html, body").animate({scrollTop:h},0)}}$("#top-bar-shade").exists()&&$("#top-bar-shade").css("opacity")&&$("#top-bar-shade").data("initial-opacity",Number($("#top-bar-shade").css("opacity"))),CHV.fn.bindSelectableItems(),$("body#image").exists()&&($(CHV.obj.image_viewer.selector+" [data-load=full]").length>0&&($(document).on("click",CHV.obj.image_viewer.loader,function(e){CHV.fn.viewerLoadImage()}),$(CHV.obj.image_viewer.loader).data("size")>CHV.obj.config.image.load_max_filesize.getBytes()?$(CHV.obj.image_viewer.loader).css("display","block"):CHV.fn.viewerLoadImage()),new MutationObserver(()=>{$("html").height()>$(window).innerHeight()&&!$("html").hasClass("scrollbar-y")&&($("html").addClass("scrollbar-y"),$(document).data({width:$(this).width(),height:$(this).height()}))}).observe(document,{childList:!0}),$(document).on("keyup",function(e){var t=$(e.target),a=e.originalEvent;if(!t.is(":input")&&CHV.obj.image_viewer.$navigation.exists()&&("ArrowLeft"==a.key||"ArrowRight"==a.key)){var o=$("[data-action="+("ArrowLeft"==a.key?"prev":"next")+"]",CHV.obj.image_viewer.$navigation).attr("href");void 0!==o&&""!==o&&(window.location=$("[data-action="+("ArrowLeft"==a.key?"prev":"next")+"]",CHV.obj.image_viewer.$navigation).attr("href"))}})),$(document).on("click",CHV.obj.image_viewer.container+" img",function(e){if($(this).hasClass("cursor-zoom-in")||$(this).hasClass("cursor-zoom-out")){var t=$(this).hasClass("cursor-zoom-in");if($(this).removeClass("cursor-zoom-in cursor-zoom-out"),t){var a,o=$(this).attr("width"),i=$(this).attr("height"),n=o/i;o>$(window).width()?($(this).css("width","100%"),a=$(this).width(),$(this).css("width",o)):a=$(this).attr("width"),$(this).addClass("cursor-zoom-out").css({width:a,height:a/n+"px"}),$("#image-viewer-container").css("height","")}else $(this).addClass("cursor-zoom-in"),image_viewer_full_fix();e.preventDefault()}}).on("contextmenu",CHV.obj.image_viewer.container,function(e){if(!CHV.obj.config.image.right_click)return e.preventDefault(),!1}),$(document).on("contextmenu","html.device-mobile a.image-container",function(e){e.preventDefault(),e.stopPropagation()}),$(document).on("keyup","input[data-dashboard-tool]",function(e){if(13==e.keyCode){var t=$("[data-action="+$(this).data("dashboard-tool")+"]");t.click()}}),$(document).on("click","[data-action=dashboardTool]",function(e){e.preventDefault();var t=$(this).data("tool"),a=$(this).data("data"),o=$.extend({},a),i={};for(var n in o){var s=$(o[n]).val();if($(o[n]).prop("disabled")||!s)return;i[n]=$(o[n]),o[n]=s}o.action=t;var r={type:"GET",cache:!1};r.data=o;var l,d=$(this).closest(".input-label"),c=!0;if(0!=c){for(var n in i);PF.fn.loading.inline($(".loading",d),{size:"small",valign:"middle"}),d.find(".btn .text").hide(),$.ajax(r).complete(function(e){var t=e.responseJSON;$(".loading",d).empty(),d.find(".btn .text").show(),200!=t.status_code||void 0===t.success.redirURL?PF.fn.growl.call(t[200==t.status_code?"success":"error"].message):window.location.href=t.success.redirURL})}else PF.fn.growl.expirable(l)}),$(document).on("click","[data-action=openerPostMessage]",function(e){if(window.opener){e.preventDefault();var t="data-action-target",a=$($(this).is("["+t+"]")?$(this).attr(t):this),o=a[a.is(":input")?"val":"html"]();window.opener.postMessage({id:window.name,message:o},"*")}}),$(document).on("click","[data-action=list-tools] [data-action]",function(e){var t=$(e.target),a=t.closest("[data-id]");a&&a.find("[data-action=select]").exists()&&(e.ctrlKey||e.metaKey)&&e.altKey&&(CHV.fn.list_editor.toggleSelectItem(a,!a.hasClass("selected")),e.preventDefault(),e.stopPropagation())}),PF.fn.listing.ajax.callback=function(e){200===e.status&&CHV.fn.list_editor.listMassActionSet("select")},$(document).on("click","[data-action=list-select-all]",function(e){if($(this).closest(".disabled").exists())return!1;CHV.fn.list_editor.selectAll(e)}),$(document).on("click","[data-action=list-clear-all]",function(){CHV.fn.list_editor.clearSelection()}),$(document).on("click","[data-action=share]",function(e){if(!$(PF.obj.modal.selectors.box).exists()){var t,a,o,i,n,s;t=$(".viewer:visible").exists()?$(PF.obj.listing.selectors.list_item+"[data-id="+$(".viewer").attr("data-id")+"]",".content-listing").first():$(this).closest(PF.obj.listing.selectors.list_item).first();var r="#modal-share";if(t.exists()){if(s=CHV.fn.modal.getTemplateWithPreview(r,t),void 0===t.attr("data-type"))return void console.log("Error: data-type not defined");n=t.find(".list-item-desc-title-link").first(),o=t.find(".image-container img").first().attr("src"),a=t.attr("data-url-short")}else s=$(r).html(),dealing_with=CHV.obj.resource.type,a=window.location.href,o=$("#image-viewer-container").find("img").first().attr("src"),n=$(".header > h1 > a");i=PF.fn.htmlEncode(n.text());var l=t.data("privacy")||CHV.obj.resource.privacy,d="";switch(l){case"private_but_link":d=PF.fn._s("Note: This content is private but anyone with the link will be able to see this.");break;case"password":d=PF.fn._s("Note: This content is password protected. Remember to pass the content password to share.");break;case"private":d=PF.fn._s('Note: This content is private. Change privacy to "public" to share.')}s=s.replaceAll("__url__",a).replaceAll("__image__",o).replaceAll("__title__",i).replaceAll("__privacy__",l).replaceAll("__privacy_notes__",d),PF.fn.modal.call({type:"html",buttons:!1,template:s})}}),$(document).on("click","[data-action=list-tools] [data-action]",function(e){if(e.isPropagationStopped())return!1;var t;t=$(".viewer:visible").exists()?$(PF.obj.listing.selectors.list_item+"[data-id="+$(".viewer").attr("data-id")+"]",".content-listing").first():$(this).closest(PF.obj.listing.selectors.list_item).first();var a=t.attr("data-id");if(void 0!==t.attr("data-type")){o=t.attr("data-type");var o,i=$("[data-type="+o+"][data-id="+a+"]");switch($(this).data("action")){case"select":CHV.fn.list_editor.toggleSelectItem(t,!t.hasClass("selected"));break;case"edit":var n="[data-modal=form-edit-single]";switch(o){case"image":$("[name=form-image-title]",n).attr({value:t.attr("data-title"),autocomplete:"off"}),$("[name=form-image-description]",n).html(PF.fn.htmlEncode(t.data("description"))),$("[name=form-album-id]",n).find("option").removeAttr("selected"),$("[name=form-album-id]",n).find("[value="+t.data("image"==o?"album-id":"id")+"]").attr("selected",!0),$("[name=form-category-id]",n).find("option").removeAttr("selected"),$("[name=form-category-id]",n).find("[value="+t.data("category-id")+"]").attr("selected",!0),$("[name=form-nsfw]",n).attr("checked","unsafe"==t.data("flag")),$("[name=form-album-name]",n).attr({value:"",autocomplete:"off"}),$("[name=form-album-description]",n).html(""),$("[name=form-privacy]",n).find("option").removeAttr("selected");break;case"album":$("[data-action=album-switch]",n).remove(),$("[name=form-album-name]",n).attr({value:t.data("name"),autocomplete:"off"}),$("[name=form-album-description]",n).html(PF.fn.htmlEncode(t.data("description"))),$("[name=form-privacy]",n).find("option").removeAttr("selected"),$("[name=form-privacy]",n).find("[value="+t.data("privacy")+"]").attr("selected",!0),"password"==t.data("privacy")?($("[data-combo-value=password]").show(),$("[name=form-album-password]",n).attr("value",t.data("password"))):($("[data-combo-value=password]").hide(),$("[name=form-album-password]",n).attr("value",""))}PF.fn.modal.call({type:"html",template:CHV.fn.modal.getTemplateWithPreview(n,t),ajax:{url:PF.obj.config.json_api,deferred:{success:function(e){CHV.fn.list_editor.updateItem("[data-type="+o+"][data-id="+a+"]",e.responseJSON[o],"edit")}}},confirm:function(){var e=$(PF.obj.modal.selectors.root);if(("image"==o||"album"==o)&&$("[data-content=form-new-album]",e).is(":visible")&&""==$("[name=form-album-name]",e).val())return PF.fn.growl.call(PF.fn._s("You must enter the album name.")),$("[name=form-album-name]",e).highlight(),!1;if(PF.fn.form_modal_has_changed()){switch(PF.obj.modal.form_data={action:"edit",edit:t.data("type"),single:!0,owner:CHV.obj.resource.user.id,editing:{id:a,description:$("[name=form-"+o+"-description]",e).val()}},o){case"image":PF.obj.modal.form_data.editing.title=$("[name=form-image-title]",e).val(),PF.obj.modal.form_data.editing.category_id=$("[name=form-category-id]",e).val()||null,PF.obj.modal.form_data.editing.nsfw=$("[name=form-nsfw]",e).prop("checked")?1:0;break;case"album":PF.obj.modal.form_data.editing.name=$("[name=form-album-name]",e).val(),PF.obj.modal.form_data.editing.privacy=$("[name=form-privacy]",e).val(),"password"==PF.obj.modal.form_data.editing.privacy&&(PF.obj.modal.form_data.editing.password=$("[name=form-album-password]",e).val())}return PF.obj.modal.form_data.editing.new_album=$("[data-content=form-new-album]",e).is(":visible"),PF.obj.modal.form_data.editing.new_album?(PF.obj.modal.form_data.editing.album_name=$("[name=form-album-name]",e).val(),PF.obj.modal.form_data.editing.album_privacy=$("[name=form-privacy]",e).val(),"password"==PF.obj.modal.form_data.editing.album_privacy&&(PF.obj.modal.form_data.editing.album_password=$("[name=form-album-password]",e).val()),PF.obj.modal.form_data.editing.album_description=$("[name=form-album-description]",e).val()):PF.obj.modal.form_data.editing.album_id=$("[name=form-album-id]",e).val(),!0}PF.fn.modal.close()}});break;case"create-album":case"move":var s="move"==$(this).data("action")?"form-move-single":"form-create-album";n="[data-modal="+s+"]";$("[name=form-album-id]",n).find("option").removeAttr("selected"),$("[name=form-album-id]",n).find("[value="+t.data("image"==o?"album-id":"id")+"]").attr("selected",!0),$("[name=form-album-name]",n).attr({value:"",autocomplete:"off"}),$("[name=form-album-description]",n).html(""),$("[name=form-privacy]",n).find("option").removeAttr("selected"),PF.fn.modal.call({type:"html",template:CHV.fn.modal.getTemplateWithPreview(n,i),ajax:{url:PF.obj.config.json_api,deferred:{success:function(e){CHV.fn.list_editor.updateMoveItemLists(e.responseJSON,o,i)}}},load:function(){},confirm:function(){var e=$(PF.obj.modal.selectors.root);return $("[data-content=form-new-album]",e).is(":visible")&&""==$("[name=form-album-name]",e).val()?(PF.fn.growl.call(PF.fn._s("You must enter the album name.")),$("[name=form-album-name]",e).highlight(),!1):PF.fn.form_modal_has_changed()?(PF.obj.modal.form_data={action:"edit",edit:t.data("type"),single:!0,owner:CHV.obj.resource.user.id,editing:{id:a}},PF.obj.modal.form_data.editing.new_album=$("[data-content=form-new-album]",e).is(":visible"),PF.obj.modal.form_data.editing.new_album?(PF.obj.modal.form_data.editing.album_name=$("[name=form-album-name]",e).val(),PF.obj.modal.form_data.editing.album_privacy=$("[name=form-privacy]",e).val(),"password"==PF.obj.modal.form_data.editing.album_privacy&&(PF.obj.modal.form_data.editing.album_password=$("[name=form-album-password]",e).val()),PF.obj.modal.form_data.editing.album_description=$("[name=form-album-description]",e).val()):PF.obj.modal.form_data.editing.album_id=$("[name=form-album-id]",e).val(),!0):void PF.fn.modal.close()}});break;case"approve":PF.fn.modal.call({type:"html",template:CHV.fn.modal.getTemplateWithPreview("[data-modal=form-approve-single]",t),button_submit:PF.fn._s("Confirm"),ajax:{url:PF.obj.config.json_api,deferred:{success:function(e){CHV.fn.list_editor.removeFromList(t,PF.fn._s("The content has been approved."))}}},confirm:function(){return PF.obj.modal.form_data={action:"approve",single:!0,approve:t.data("type"),approving:{id:a}},!0}});break;case"delete":PF.fn.modal.call({type:"html",template:CHV.fn.modal.getTemplateWithPreview("[data-modal=form-delete-single]",t),button_submit:PF.fn._s("Confirm"),ajax:{url:PF.obj.config.json_api,deferred:{success:function(e){"album"==o&&($("[name=form-album-id]","[data-modal]").find("[value="+a+"]").remove(),CHV.fn.list_editor.updateUserCounters("image",e.responseJSON.success.affected,"-")),CHV.fn.list_editor.deleteFromList(t),CHV.fn.listingViewer.close()}}},confirm:function(){return PF.obj.modal.form_data={action:"delete",single:!0,delete:t.data("type"),deleting:{id:a}},!0}});break;case"flag":$.ajax({type:"POST",data:{action:"edit",edit:"image",single:!0,editing:{id:a,nsfw:"unsafe"==t.data("flag")?0:1}}}).complete(function(e){var t=e.responseJSON;if(200==t.status_code){var a=1==t.image.nsfw?"unsafe":"safe";i.attr("data-flag",a).data("flag",a)}else PF.fn.growl.call(t.error.message);CHV.fn.list_editor.selectionCount()})}}else console.log("Error: data-type not defined")}),$(".pop-box-menu a","[data-content=list-selection]").click(function(e){var t=$(PF.obj.listing.selectors.content_listing_visible);if(void 0!==t.data("list")){dealing_with=t.data("list");var a=$(PF.obj.listing.selectors.list_item+".selected",t),o=$.map(a,function(e,t){return $(e).data("id")});switch(PF.fn.close_pops(),"list-select-all"!==$(this).data("action")&&e.stopPropagation(),$(this).data("action")){case"get-embed-codes":var i="[data-modal=form-embed-codes]",n=[];$("textarea",i).html(""),a.each(function(){var e={image:JSON.parse(decodeURIComponent($(this).data("object")))};"url"in e.image&&n.push(e)}),CHV.fn.fillEmbedCodes(n,i,"html"),PF.fn.modal.call({type:"html",template:CHV.fn.modal.getTemplateWithPreviews(i,a),buttons:!1});break;case"clear":CHV.fn.list_editor.clearSelection();break;case"list-select-all":CHV.fn.list_editor.selectAll(e);break;case"move":case"create-album":i="move"==$(this).data("action")?"form-move-multiple":"form-create-album";var s="[data-modal="+i+"]",r=/image/.test(dealing_with)?"album-id":"id";$("[name=form-album-id]",s).find("[value=null]").remove(),$("[name=form-album-id]",s).find("option").removeAttr("selected"),$("[name=form-album-name]",s).attr({value:"",autocomplete:"off"}),$("[name=form-album-description]",s).html(""),$("[name=form-privacy]",s).find("option").removeAttr("selected");var l=a.first().data(r),d=!0;a.each(function(){if($(this).data(r)!==l)return d=!1,!1}),d||$("[name=form-album-id]",s).prepend('"),$("[name=form-album-id]",s).find("[value="+(d?a.first().data(r):"null")+"]").attr("selected",!0),PF.fn.modal.call({type:"html",template:CHV.fn.modal.getTemplateWithPreviews(s,a),ajax:{url:PF.obj.config.json_api,deferred:{success:function(e){CHV.fn.list_editor.updateMoveItemLists(e.responseJSON,dealing_with,a)}}},load:function(){},confirm:function(){var e=$(PF.obj.modal.selectors.root),t=!1;if($("[data-content=form-new-album]",e).is(":visible")&&""==$("[name=form-album-name]",e).val())return PF.fn.growl.call(PF.fn._s("You must enter the album name.")),$("[name=form-album-name]",e).highlight(),!1;if($("[data-content=form-new-album]",e).is(":visible")&&(t=!0),PF.fn.form_modal_has_changed()){return PF.obj.modal.form_data={action:t?"create-album":"move",type:dealing_with,owner:CHV.obj.resource.user.id,multiple:!0,album:{ids:o,new:t}},t?(PF.obj.modal.form_data.album.name=$("[name=form-album-name]",e).val(),PF.obj.modal.form_data.album.privacy=$("[name=form-privacy]",e).val(),"password"==PF.obj.modal.form_data.album.privacy&&(PF.obj.modal.form_data.album.password=$("[name=form-album-password]",e).val()),PF.obj.modal.form_data.album.description=$("[name=form-album-description]",e).val()):PF.obj.modal.form_data.album.id=$("[name=form-album-id]",e).val(),!0}PF.fn.modal.close()}});break;case"approve":PF.fn.modal.call({template:CHV.fn.modal.getTemplateWithPreviews("[data-modal=form-approve-multiple]",a),button_submit:PF.fn._s("Confirm"),ajax:{url:PF.obj.config.json_api,deferred:{success:function(e){CHV.fn.list_editor.removeFromList(a,PF.fn._s("The content has been approved."))}}},confirm:function(){return PF.obj.modal.form_data={action:"approve",from:"list",approve:dealing_with,multiple:!0,approving:{ids:o}},!0}});break;case"delete":PF.fn.modal.call({template:CHV.fn.modal.getTemplateWithPreviews("[data-modal=form-delete-multiple]",a),button_submit:PF.fn._s("Confirm"),ajax:{url:PF.obj.config.json_api,deferred:{success:function(e){"albums"==dealing_with&&(a.each(function(){$("[name=form-album-id]","[data-modal]").find("[value="+$(this).data("id")+"]").remove()}),CHV.fn.list_editor.updateUserCounters("image",e.responseJSON.success.affected,"-")),CHV.fn.list_editor.deleteFromList(a)}}},confirm:function(){return PF.obj.modal.form_data={action:"delete",from:"list",delete:dealing_with,multiple:!0,deleting:{ids:o}},!0}});break;case"assign-category":var c=a.first().data("category-id"),u=!0;a.each(function(){if($(this).data("category-id")!==c)return u=!1,!1}),PF.fn.modal.call({type:"html",template:CHV.fn.modal.getTemplateWithPreviews("[data-modal=form-assign-category]",a),forced:!0,ajax:{url:PF.obj.config.json_api,deferred:{success:function(e){a.each(function(){var t=e.responseJSON;$(this).data("category-id",t.category_id)}),CHV.fn.list_editor.clearSelection()}}},confirm:function(){var e=$(PF.obj.modal.selectors.root),t=$("[name=form-category-id]",e).val()||null;return u&&c==t?(PF.fn.modal.close(function(){CHV.fn.list_editor.clearSelection()}),!1):(PF.obj.modal.form_data={action:"edit-category",from:"list",multiple:!0,editing:{ids:o,category_id:t}},!0)}});break;case"flag-safe":case"flag-unsafe":var m=$(this).data("action"),f="flag-safe"==m?"safe":"unsafe";PF.fn.modal.call({template:CHV.fn.modal.getTemplateWithPreviews("[data-modal=form-"+m+"]",a),button_submit:PF.fn._s("Confirm"),ajax:{url:PF.obj.config.json_api,deferred:{success:function(e){a.each(function(){$(this).removeClass("safe unsafe").addClass(f).removeAttr("data-flag").attr("data-flag",f).data("flag",f)}),CHV.fn.list_editor.clearSelection()}}},confirm:function(){return PF.obj.modal.form_data={action:m,from:"list",multiple:!0,editing:{ids:o,nsfw:"flag-safe"==m?0:1}},!0}})}return!PF.fn.isDevice(["phone","phablet"])&&void 0}console.log("Error: data-list not defined")}),$(document).on("click","[data-action=disconnect]",function(){var e=$(this),t=e.data("connection");PF.fn.modal.confirm({message:e.data("confirm-message"),ajax:{data:{action:"disconnect",disconnect:t,user_id:CHV.obj.resource.user.id},deferred:{success:function(e){var a=e.responseJSON;$("[data-connection="+t+"]").fadeOut(function(){$($("[data-connect="+t+"]")).fadeIn(),$(this).remove(),0==$("[data-connection]").length&&$("[data-content=empty-message]").show(),PF.fn.growl.expirable(a.success.message)}),""!==a.success.redirect&&(window.location.href=a.success.redirect)},error:function(e){var t=e.responseJSON;PF.fn.growl.call(t.error.message)}}}})}),$(document).on("click","[data-action=delete-avatar]",function(){var e=$(".user-settings-avatar"),t=$(".loading-placeholder",e),a=$("#top-bar");t.removeClass("hidden"),PF.fn.loading.inline(t,{center:!0}),$.ajax({type:"POST",data:{action:"delete",delete:"avatar",owner:CHV.obj.resource.user.id}}).complete(function(o){t.addClass("hidden").empty(),200==o.status?(CHV.obj.logged_user.id==CHV.obj.resource.user.id&&($("img.user-image",a).hide(),$(".default-user-image",a).removeClass("hidden")),$(".default-user-image",e).removeClass("hidden").css({opacity:0}),$('[data-action="delete-avatar"]',e).parent().addClass("soft-hidden"),$("img.user-image",e).fadeOut(function(){$(".default-user-image",e).animate({opacity:1})})):PF.fn.growl.expirable(PF.fn._s("An error occurred. Please try again later."))})}),$(document).on("change","[data-content=user-avatar-upload-input]",function(e){e.preventDefault(),e.stopPropagation();var t=$(this),a=$(".user-settings-avatar"),o=$(".loading-placeholder",".user-settings-avatar"),i=$("#top-bar"),n=$(this)[0].files[0];if(!t.data("uploading"))if(0!=/^image\/.*$/.test(n.type))if(n.size>CHV.obj.config.user.avatar_max_filesize.getBytes())PF.fn.growl.call(PF.fn._s("Please select a picture of at most %s size.",CHV.obj.config.user.avatar_max_filesize));else{var s=$('[data-action="delete-avatar"]');o.removeClass("hidden"),PF.fn.loading.inline(o,{center:!0}),t.data("uploading",!0);var r=new FormData;r.append("source",n),r.append("action","upload"),r.append("type","file"),r.append("what","avatar"),r.append("owner",CHV.obj.resource.user.id),r.append("auth_token",PF.obj.config.auth_token),avatarXHR=new XMLHttpRequest,avatarXHR.open("POST",PF.obj.config.json_api,!0),avatarXHR.send(r),avatarXHR.onreadystatechange=function(){if(4==this.readyState){var e="json"!==this.responseType?JSON.parse(this.response):this.response,n=e.success.image;o.addClass("hidden").empty(),200==this.status?(change_avatar=function(e){s.parent().removeClass("soft-hidden"),$("img.user-image",e).attr("src",n.url).removeClass("hidden").show()},hide_default=function(e){ -$(".default-user-image",e).addClass("hidden")},hide_default(a),$(".btn-alt",a).closest("div").show(),change_avatar(a),CHV.obj.logged_user.id==CHV.obj.resource.user.id&&(change_avatar(i),hide_default(i)),PF.fn.growl.expirable(PF.fn._s("Profile image updated."))):PF.fn.growl.expirable(PF.fn._s("An error occurred. Please try again later.")),t.data("uploading",!1)}}}else PF.fn.growl.call(PF.fn._s("Please select a valid image file type."))}),$(document).on("change","[data-content=user-background-upload-input]",function(e){e.preventDefault(),e.stopPropagation();var t=$(this),a=$("[data-content=user-background-cover]"),o=$("[data-content=user-background-cover-src]"),i=$(".loading-placeholder",a),n=($("#top-bar"),$(this)[0].files[0]);if(!t.data("uploading"))if(0!=/^image\/.*$/.test(n.type))if(n.size>CHV.obj.config.user.background_max_filesize.getBytes())PF.fn.growl.call(PF.fn._s("Please select a picture of at most %s size.",CHV.obj.config.user.background_max_filesize));else{i.removeClass("hidden"),PF.fn.loading.inline(i,{center:!0,size:"big",color:"#FFF"}),t.data("uploading",!0);var s=new FormData;s.append("source",n),s.append("action","upload"),s.append("type","file"),s.append("what","background"),s.append("owner",CHV.obj.resource.user.id),s.append("auth_token",PF.obj.config.auth_token),avatarXHR=new XMLHttpRequest,avatarXHR.open("POST",PF.obj.config.json_api,!0),avatarXHR.send(s),avatarXHR.onreadystatechange=function(){if(4==this.readyState){var e="json"!==this.responseType?JSON.parse(this.response):this.response,n=e.success.image;if(200==this.status){var s=$("");s.attr("src",n.url).imagesLoaded(function(){i.addClass("hidden").empty(),o.css("background-image","url("+n.url+")").hide().fadeIn(),$("[data-content=user-change-background]",a).removeClass("hidden"),$(a).removeClass("no-background"),$(".top-user").removeClass("no-background"),$("[data-content=user-upload-background]").hide(),$("[data-content=user-change-background]").show(),PF.fn.growl.expirable(PF.fn._s("Profile background image updated.")),s.remove()})}else i.addClass("hidden").empty(),PF.fn.growl.expirable(PF.fn._s("An error occurred. Please try again later."));t.data("uploading",!1)}}}else PF.fn.growl.call(PF.fn._s("Please select a valid image file type."))}),CHV.fn.user_background={delete:{submit:function(){return PF.obj.modal.form_data={action:"delete",delete:"background",owner:CHV.obj.resource.user.id},!0},deferred:{success:{before:function(e){$("[data-content=user-background-cover-src]").css("background-image","none"),$("[data-content=user-background-cover], .top-user").addClass("no-background"),$("[data-content=user-background-cover]").height(""),$("[data-content=user-upload-background]").removeClass("hidden").show(),$("[data-content=user-change-background]").hide()},done:function(e){PF.fn.modal.close(function(){PF.fn.growl.expirable(PF.fn._s("Profile background image deleted."))})}},error:function(e){PF.fn.growl.expirable(PF.fn._s("Error deleting profile background image."))}}}},CHV.fn.user_api={delete:{submit:function(){return PF.obj.modal.form_data={action:"delete",delete:"api_key",owner:CHV.obj.resource.user.id},!0},deferred:{success:{before:function(e){},done:function(e){PF.fn.modal.close(function(){location.reload()})}},error:function(e){PF.fn.growl.expirable(e.responseJSON.error.message)}}}},CHV.fn.user_two_factor={delete:{submit:function(){return PF.obj.modal.form_data={action:"delete",delete:"two_factor",owner:CHV.obj.resource.user.id},!0},deferred:{success:{before:function(e){},done:function(e){PF.fn.modal.close(function(){location.reload()})}},error:function(e){PF.fn.growl.expirable(e.responseJSON.error.message)}}}},CHV.str.mainform="[data-content=main-form]",CHV.obj.timezone={selector:"[data-content=timezone]",input:"#timezone-region"},$(document).on("keyup change",CHV.str.mainform+" :input",function(){$(this).is("[name=username]")&&$("[data-text=username]").text($(this).val())}),$(document).on("change",CHV.obj.timezone.input,function(){var e=$(this).val(),t=$("#timezone-combo-"+e);t.find("option:first").prop("selected",!0),$(CHV.obj.timezone.selector).val(t.val()).change()}),$(document).on("change","[id^=timezone-combo-]",function(){var e=$(this).val();$(CHV.obj.timezone.selector).val(e).change()}),$(document).on("keyup change blur","[name^=new-password]",function(){var e=$("[name=new-password]"),t=$("[name=new-password-confirm]"),a=e.val()==t.val(),o=t.closest(".input-password").find(".input-warning");0==o.exists()&&(o=$("[data-message=new-password-confirm]")),$(this).is(t)&&t.data("touched",!0),t.data("touched")&&o.text(a?"":o.data("text"))[a?"addClass":"removeClass"]("hidden-visibility")}),$(document).on("submit",CHV.obj.mainform,function(){switch($(this).data("type")){case"password":var e=$("[name=new-password]",this),t=$("[name=new-password-confirm]",this);if((""!==e.val()||""!==t.val())&&e.val()!==t.val())return e.highlight(),t.highlight(),PF.fn.growl.expirable(PF.fn._s("Passwords don't match")),!1}}),$(document).on("click","[data-action=check-for-updates]",function(){PF.fn.loading.fullscreen(),CHV.fn.system.checkUpdates(function(e){if(PF.fn.loading.destroy("fullscreen"),200===e.status){var t=e.responseJSON.software;-1==PF.fn.versionCompare(CHV.obj.system_info.version,t.current_version)?PF.fn.modal.simple({title:' '+PF.fn._s("Chevereto v%s available",t.current_version),message:"

    "+PF.fn._s("There is a new Chevereto version available with the following release notes.")+" "+PF.fn._s("Check %s for a complete changelog since you last upgrade.",''+CHV.obj.system_info.version+'')+'

    "+PF.fn._s("Check the %s for alternative update methods.",''+PF.fn._s("documentation")+"")+'

    ",html:!0}):PF.fn.growl.call(PF.fn._s("This website is running latest %s version",CHEVERETO.edition))}else PF.fn.growl.call(PF.fn._s("An error occurred. Please try again later."))})}),void 0!==PF.fn.get_url_var("checkUpdates")&&$("[data-action=check-for-updates]").trigger("click"),void 0!==PF.fn.get_url_var("upgrade")&&$("[data-action=upgrade]").trigger("click"),void 0!==PF.fn.get_url_var("license")&&$("[data-action='license']").trigger("click"),void 0!==PF.fn.get_url_var("installed")&&PF.fn.modal.simple({title:' '+PF.fn._s("Chevereto v%s installed",CHV.obj.system_info.version),message:"

    "+PF.fn._s('Usage of Chevereto Software must be in compliance with the software license terms known as "The Chevereto License".')+'

    ",html:!0}),$(document).on("click","[data-action=system-update]",function(e){if(!$("input#system-update").prop("checked"))return PF.fn.growl.call(PF.fn._s("Please review the system requirements before proceeding")),void e.preventDefault()}),$(document).on("click","[data-action=toggle-storage-https]",function(){CHV.fn.storage.toggleHttps($(this).closest("[data-content=storage]").data("storage-id"))}),$(document).on("click","[data-action=toggle-storage-active]",function(){CHV.fn.storage.toggleActive($(this).closest("[data-content=storage]").data("storage-id"))}),$(CHV.fn.uploader.selectors.root).exists()&&(CHV.fn.uploader.$pasteCatcher=$("
    ",{contenteditable:"true",id:CHV.fn.uploader.selectors.paste.replace(/#/,"")}),$("body").append(CHV.fn.uploader.$pasteCatcher),$(document).on("keydown",function(e){!e.ctrlKey&&!e.metaKey||"KeyV"!=e.originalEvent.code||$(e.target).is(":input")||(PF.fn.keyFeedback.spawn(e),CHV.fn.uploader.$pasteCatcher.focus(e))}),document.addEventListener("dragover",function(e){e.preventDefault()}),document.addEventListener("drop",function(e){if(CHV.obj.config.upload.url){e.preventDefault();var t,a=e.dataTransfer.getData("text/html"),o=/src="?([^"\s]+)"?\s*/;t=o.exec(a),t&&(CHV.fn.uploader.toggle({show:!0}),CHV.fn.uploader.add({},t[1]))}}),window.addEventListener("paste",CHV.fn.uploader.pasteImageHandler)),$(document).on("click","[data-action=like]",function(){if(PF.fn.is_user_logged()){var e=$(this);if(!e.data("XHR")){e.data("XHR",!0);var t=$(this).is("[data-liked]")?$(this):$(this).closest("[data-liked]"),a=!t.closest("[data-list], .viewer").exists()&&void 0!==CHV.obj.resource,o=t.is("[data-liked=1]"),i=o?"dislike":"like",n={id:a?CHV.obj.resource.id:$(this).closest("[data-id]").attr("data-id"),type:a?CHV.obj.resource.type:$(this).closest("[data-type]").attr("data-type")},s=a?e:$("[data-type="+n.type+"][data-id="+n.id+"]"),r={type:"POST",data:{action:i},cache:!1};r.data[i]={object:n.type,id:n.id},$.ajax(r).complete(function(t){var i=t.responseJSON;e.data("XHR",!1),200===i.status_code?(a&&void 0!==i.content&&$("[data-text=likes-count]").html(i.content.likes),s.closest("[data-liked]").attr("data-liked",o?0:1)):PF.fn.growl.expirable(PF.fn._s("An error occurred. Please try again later."))})}}else window.location.href=CHV.obj.vars.urls.login}),$(document).on("click","[data-action=album-cover]",function(){var e=$(this);if(!e.data("XHR")){e.data("XHR",!0);var t=$(this).is("[data-cover]")?$(this):$(this).closest("[data-cover]"),a=t.is("[data-cover=1]"),o=a?"album-cover-unset":"album-cover-set",i=(CHV.obj.resource.id,e.closest("[data-cover]")),n={type:"POST",data:{action:o},cache:!1};n.data[o]={album_id:i.data("album-id"),image_id:i.data("id")},$.ajax(n).complete(function(t){var o=t.responseJSON;e.data("XHR",!1),200===o.status_code?i.attr("data-cover",a?0:1):PF.fn.growl.expirable(PF.fn._s("An error occurred. Please try again later."))})}}),$(document).on("click","[data-action=follow]",function(){if(PF.fn.is_user_logged()){var e=$(this);if(!e.data("XHR")){e.data("XHR",!0);var t=$(this).is("[data-followed]")?$(this):$(this).closest("[data-followed]"),a=void 0!==CHV.obj.resource,o=t.is("[data-followed=1]"),i=o?"unfollow":"follow",n={id:a?CHV.obj.resource.id:$(this).closest("[data-id]").data("id"),type:a?CHV.obj.resource.type:$(this).closest("[data-type]").data("type")},s={type:"POST",data:{action:i},cache:!1};s.data[i]={object:n.type,id:n.id},$.ajax(s).complete(function(i){var n=i.responseJSON;if(e.data("XHR",!1),200===n.status_code){if(a&&void 0!==n.user_followed){var s=$("[data-text=followers-label]"),r={single:s.data("label-single"),plural:s.data("label-plural")};$("[data-text=followers-count]").html(n.user_followed.followers),s.html(PF.fn._n(r.single,r.plural,n.user_followed.followers))}t.attr("data-followed",o?0:1)}else PF.fn.growl.expirable(PF.fn._s("An error occurred. Please try again later."))})}}else PF.fn.modal.call({type:"login"})}),$(document).on("click","[data-action=user_ban],[data-action=user_unban]",function(){var e=$(this);if(!e.data("XHR")){e.data("XHR",!0);var t=$(this).closest("[data-banned]"),a=!0,o=t.is("[data-banned=1]"),i=e.attr("data-action"),n={id:a?CHV.obj.resource.id:$(this).closest("[data-id]").data("id"),type:a?CHV.obj.resource.type:$(this).closest("[data-type]").data("type")},s={type:"POST",data:{action:i},cache:!1};s.data[i]={user_id:n.id},$.ajax(s).complete(function(a){var i=a.responseJSON;e.data("XHR",!1),200===i.status_code?t.attr("data-banned",o?0:1):PF.fn.growl.expirable(PF.fn._s("An error occurred. Please try again later."))})}}),$(document).on("click","[data-action=top-bar-notifications]",function(e){var a=this,o=$(this),i=$(".top-bar-notifications-container",o),n=$(".top-bar-notifications-list",o),s=$("ul",n),r=$(".loading",i);o.data("XHR")||(r.removeClass("hidden"),PF.fn.loading.inline(r,{size:"small",message:PF.fn._s("loading")}),$.ajax({type:"POST",data:{action:"notifications"},cache:!1}).complete(function(e){var l=e.responseJSON;if(200!==l.status_code)return PF.fn.growl.expirable(PF.fn._s("An error occurred. Please try again later.")),o.data("XHR",!1),void r.addClass("hidden").html("");if(o.data("XHR",!0),r.remove(),l.html){n.removeClass("hidden"),s.html(l.html),t();var d=$("li.new",s);d.addClass("transition"),setTimeout(function(){d.removeClass("new"),$("[data-content=notifications-counter]",a).removeClass("on").html("0"),setTimeout(function(){d.removeClass("transition")},150)},1500)}else $(".empty",i).removeClass("hidden")}))}),$("#g-recaptcha").is(":empty")&&CHV.obj.config.captcha.enabled&&CHV.obj.config.captcha.sitekey&&("3"!=CHV.obj.config.captcha.version&&CHV.obj.config.captcha.isNeeded||$('label[for="recaptcha_response_field"]').remove()),$(document).on("click",PF.obj.listing.selectors.list_item+" a.image-container",function(e){var t=$(this).closest(PF.obj.listing.selectors.list_item),o=t.find("[data-action=load-image]");o.length>0&&(a(o),e.preventDefault())}),$(document).on("click",PF.obj.listing.selectors.list_item+" [data-action=load-image]",function(e){a($(this)),e.preventDefault(),e.stopPropagation()}),$(document).on("click","#album [data-tab=tab-embeds]",function(e){e.preventDefault,CHV.fn.album.showEmbedCodes()}),$("body").is("#upload")&&CHV.fn.uploader.toggle({show:!0}),$(document).on("keyup",function(e){if(!($(e.target).is(":input")||e.ctrlKey||e.metaKey||e.altKey)){var t=$("#fullscreen-modal:visible").exists(),a=$(".viewer"),o=$(".list-selection:visible"),i=o.find("[data-content=pop-selection]:visible:not(.disabled)"),n=$("body").hasClass("--viewer-shown"),s=$(CHV.fn.uploader.selectors.root+CHV.fn.uploader.selectors.show).exists(),r=e.originalEvent.code;if("Escape"===e.originalEvent.code){if(t)return;s&&CHV.fn.uploader.toggle({reset:!1})}if(a.exists()&&n){if(r in CHV.fn.listingViewer.keys){var l=["KeyW","Escape","ArrowLeft","ArrowRight"],d=CHV.fn.listingViewer.keys[r];-1==l.indexOf(r)?$("[data-action="+d+"]",CHV.fn.listingViewer.selectors.root).click():d in CHV.fn.listingViewer&&CHV.fn.listingViewer[d](),PF.fn.keyFeedback.spawn(e)}}else{var c,u={Period:"list-select-all",KeyK:"get-embed-codes",KeyZ:"clear",KeyA:"create-album",KeyM:"move",KeyO:"approve",Delete:"delete",KeyC:"assign-category",KeyV:"flag-safe",KeyF:"flag-unsafe",KeyH:"album-cover"},m={KeyE:"edit",KeyL:"like",KeyS:"share",KeyJ:"sub-album",KeyP:"upload-to-album"};d=u[r]||m[r];void 0!==d&&(o.exists()&&(n||t||parseInt($("[data-text=selection-count]:visible",i).text())>0&&(c=$("[data-action="+d+"]",o.closest(".list-selection")))),void 0===c&&(c=$("[data-action="+d+"]:visible").not("#content-listing-tabs *")),c instanceof jQuery&&c.length>0&&(c.first().trigger("click"),PF.fn.keyFeedback.spawn(e)))}}}),$(document).on("click",CHV.fn.listingViewer.selectors.root+" [data-action^=viewer-]",function(){var e=$(this).data("action").substring("viewer-".length);e in CHV.fn.listingViewer&&CHV.fn.listingViewer[e]()}),$(document).on("click","a[data-href]:not([rel=popup-link]):not(.popup-link)",function(){var e=$(this).attr("data-href"),t=$(this).attr("href");(e||t)&&(location.href=t||e)});var b,v=PF.obj.listing.selectors.list_item+", .image-container";($(document).on("contextmenu click",v,function(e){$(".list-selection:visible").exists()&&!$(this).closest(CHV.fn.listingViewer.selectors.root).exists()&&("click"!=e.type||e.ctrlKey||e.metaKey)&&o(this,e)}),navigator.userAgent.match(/(iPad|iPhone|iPod)/i))&&$(document).on("mouseup mousemove",v,function(e){return clearTimeout(b),!1}).on("mousedown",v,function(e){var t=this,a=e;return b=window.setTimeout(function(){$(".list-selection:visible").exists()&&!$(t).closest(CHV.fn.listingViewer.selectors.root).exists()&&o(t,a)},500),!1});void 0!==CHV.obj.config&&CHV.obj.config.listing.viewer&&$(document).on("click",PF.obj.listing.selectors.list_item+"[data-type=image] .image-container",function(e){if(e.preventDefault(),e.stopPropagation(),0!==e.clientX||0!==e.clientY){var t=$(this).closest(PF.obj.listing.selectors.list_item);t.exists()&&(e.ctrlKey||e.metaKey||CHV.fn.listingViewer.open(t))}else PF.fn.keyFeedback.spawn(e)}),$(document).on("contextmenu",CHV.fn.listingViewer.selectors.root,function(e){return e.preventDefault(),CHV.fn.listingViewer.zoom(),PF.fn.keyFeedback.spawn(e),!1});var _,w=PF.fn.deparam(window.location.search);if(w&&"viewer"in w){var C=$(PF.obj.listing.selectors.content_listing_visible);if("images"==C.data("list")){var P=$(PF.obj.listing.selectors.list_item,C)["next"==w.viewer?"first":"last"]();CHV.fn.listingViewer.open(P)}}$(window).on("DOMContentLoaded load resize scroll",function(){clearTimeout(_),_=setTimeout(function(){$(PF.obj.listing.selectors.list_item+":visible").each(function(){var e=$(this).find('[data-action="load-image"]').first(),t=PF.fn.deparam($(PF.obj.listing.selectors.list_item+"[data-id="+$(this).attr("data-id")+"]").closest(".content-listing").data("params-hidden")),o=t&&"is_animated"in t?t.is_animated:$(this).data("size")<=CHV.obj.config.image.load_max_filesize.getBytes();e.exists()&&o&&$(this).is_within_viewport(50)&&a(e)})},1e3)}),$(document).on("click","[data-action=logout]",function(){let e=$("form#form-logout");e.submit()}),Boolean(window.navigator.vibrate)&&$(document).on("click","button, .btn, .pop-btn, .top-btn-el, [data-action], .content-tabs a, .top-bar-logo a, .login-provider-button, .panel-share-networks li a, #image-viewer-loader",function(e){$(this).is("[data-action=top-bar-menu-full]")||(window.navigator.vibrate(0),window.navigator.vibrate(15))}),$(document).on("change keyup",CHV.fn.ctaForm.selectors.rows+" input[name^='cta-']",function(){CHV.fn.ctaForm.update($(this))}),$(document).on("click",CHV.fn.ctaForm.selectors.rows+" [data-action=cta-add]",function(){CHV.fn.ctaForm.insert($(this))}),$(document).on("click",CHV.fn.ctaForm.selectors.rows+" [data-action=cta-remove]",function(){CHV.fn.ctaForm.remove($(this)),0==CHV.fn.ctaForm.array.length&&$(CHV.fn.ctaForm.selectors.root+" "+CHV.fn.ctaForm.selectors.enable).prop("checked",!1).trigger("change")}),$(document).on("change",CHV.fn.ctaForm.selectors.root+" "+CHV.fn.ctaForm.selectors.enable,function(){let e=$(CHV.fn.ctaForm.selectors.combo,CHV.fn.ctaForm.selectors.root),t=$(this).is(":checked");e.toggleClass("soft-hidden",!t),t&&(0==CHV.fn.ctaForm.array.length&&CHV.fn.ctaForm.add(),CHV.fn.ctaForm.render()),CHV.fn.ctaForm.setEnable(t?1:0)}),$(document).on("change keyup",CHV.fn.ctaForm.selectors.root+" input[name^='cta-icon_']",function(){let e=CHV.fn.ctaForm.getRow($(this)),t=e.find("label[for^='cta-icon_'] [data-content=icon]");t.removeClass();let a=CHV.fn.ctaForm.getIconClass($(this).val());t.addClass(a)}),$(document).on("click","[href^='https://chevereto.com/']",function(e){let t=$(this).find(".badge--paid").exists();if(!t)return;let a=$(this).attr("href"),o=PF.fn._s("Get a license from %s to unlock all features and support.",'chevereto.com'),i=PF.fn._s("You can enter your license key in the dashboard panel.");e.preventDefault(),e.stopPropagation(),PF.fn.modal.simple({html:!0,title:' Upgrade Chevereto',message:"

    "+o+" "+i+'

    "})}),$(document).on("focus","input[name='form-album-password']",function(){$(this).get(0).type="text"}),$(document).on("blur","input[name='form-album-password']",function(){$(this).get(0).type="password"})}),"undefined"==typeof CHV&&(CHV={obj:{},fn:{},str:{}}),window.opener&&(CHV.obj.opener={uploadPlugin:{}}),CHV.fn.ctaButtons={selectors:{container:"[data-contains=cta-album]"},render:function(e=""){$(this.selectors.container).each(function(){$(this).html(e)})}},CHV.fn.ctaForm={enable:0,array:[],selectors:{root:"#cta-form",rows:"#cta-rows",enable:"#cta-enable",template:"#cta-row-template",combo:"#cta-combo",row:".cta-row"},update:function(e){let t=this.getPos(e),a=e.attr("name").match(/cta-(.*)?_\d+/)[1];this.array[t-1][a]=e.val()},add:function(e="",t="",a=""){this.array.push(this.getRowObject(e,t,a)),this.render()},insert:function(e){let t=this.getPos(e);this.array.splice(t,0,this.getRowObject()),this.render()},remove:function(e){let t=this.getPos(e);this.array.splice(t-1,1),this.render()},getRowObject:function(e="",t="",a=""){return{label:e,icon:t,href:a}},getIconClass:function(e){return/\s/g.test(e)?e:"fa-solid fa-"+e},getRow:function(e){return e.closest(this.selectors.row)},getPos:function(e){return this.getRow(e).data("pos")},getTemplateHtml:function(){return $(this.selectors.template).html()},getRowHtml:function(e,t){return this.getTemplateHtml().replaceAll(/%pos%/g,e).replaceAll(/%label%/g,t.label).replaceAll(/%href%/g,t.href).replaceAll(/%icon%/g,t.icon).replaceAll(/%iconClass%/g,this.getIconClass(t.icon))},render:function(){let e=$(this.selectors.root),t=e.find(this.selectors.rows),a=this;this.destroy(),$.each(this.array,function(e,o){t.append(a.getRowHtml(e+1,o))}),this.setEnable(this.enable),t.sortable({cursor:"grabbing",axis:"y",update:function(){let e=[];$(this).find(a.selectors.row).each(function(){let t=a.getPos($(this));e.push(a.array[t-1])}),a.array=e,a.render()}})},setEnable:function(e){let t=$(this.selectors.rows,this.selectors.root);this.enable=e;let a=1===this.enable;$("input[data-required]",t).each(function(){$(this).attr("required",a)})},destroy:function(){let e=$(this.selectors.root),t=e.find(this.selectors.rows);try{t.sortable("destroy")}catch(e){}t.empty()}},CHV.fn.album={showEmbedCodes:function(){var e=$(".content-listing-loading","#tab-embeds");if(e.exists()){var t=$("#embed-codes");$.ajax({url:PF.obj.config.json_api,type:"POST",dataType:"json",data:{action:"get-album-contents",albumid:CHV.obj.resource.id,auth_token:PF.obj.config.auth_token},cache:!1}).always(function(a){PF.fn.loading.destroy(e),200==a.status_code&&(CHV.fn.fillEmbedCodes(a.contents,"#tab-embeds"),$("#tab-embeds").addClass("visible"),t.removeClass("soft-hidden"))})}}},CHV.fn.modal={getTemplateWithPreview:function(e,t){var a=$(e).html(),o=$("
    "),i="",n=t.find(".image-container img").attr("src");return void 0!==n&&(i+='';var e=$(this).find(".image-container img");e.exists()?n+='':(n+='',n+=''),n+="",s++}),i.html(o).find(".image-preview").html(n),i.html()}},CHV.fn.listingViewer={selectors:{bodyShown:".--viewer-shown",content:".viewer-content",template:"#viewer-template",root:".viewer",rootShow:".viewer--show",rootHide:".viewer--hide",rootZero:".viewer--zero",rootNavPrev:".viewer--nav-prev",rootNavNext:".viewer--nav-next",src:".viewer-src",tools:".viewer-tools",loader:".viewer-loader",owner:".viewer-owner",ownerGuest:".viewer-owner--guest",ownerUser:".viewer-owner--user",inputMap:".viewer-kb-input"},keys:{ArrowLeft:"prev",ArrowRight:"next",Delete:"delete",Escape:"close",KeyA:"create-album",KeyE:"edit",KeyF:"flag",KeyL:"like",KeyM:"move",KeyO:"approve",KeyS:"share",KeyW:"zoom",Period:"select"},keymap:{"create-album":["A",PF.fn._s("Create album")],approve:["O",PF.fn._s("Approve")],close:["Esc",PF.fn._s("Close")],delete:["Del",PF.fn._s("Delete")],edit:["E",PF.fn._s("Edit")],flag:["F",PF.fn._s("Toggle flag")],like:["L",PF.fn._s("Like")],move:["M",PF.fn._n("Move")],next:["►",PF.fn._s("Next")],prev:["◄",PF.fn._s("Previous")],select:[".",PF.fn._s("Toggle select")],share:["S",PF.fn._s("Share")],zoom:["W",PF.fn._s("Zoom")]},loading:null,idleTimer:0,$item:null,show:function(){PF.fn.deparam(this.$item.closest(PF.obj.listing.selectors.content_listing_visible).data("params-hidden"));this.getEl("root").removeClass(this.selectors.rootHide.substring(1)).addClass(this.selectors.rootShow.substring(1)),$("body").addClass(this.selectors.bodyShown.substring(1));var e=new Hammer($(CHV.fn.listingViewer.selectors.root).get(0),{direction:Hammer.DIRECTION_VERTICAL});e.on("swipeleft swiperight",function(e){var t="left"==e.type.substring("swipe".length)?"next":"prev";CHV.fn.listingViewer[t]()}),this.getEl("root")[(PF.fn.isDevice(["phone","phablet"])?"add":"remove")+"Class"]("--over")},getItem:function(){return this.$item},getEl:function(e){var t=!e.startsWith("template")&&!e.startsWith("root")&&this.selectors.root;return t?$(this.selectors[e],t):$(this.selectors[e])},getObject:function(e){if(e||void 0===this.object){var t=decodeURIComponent(this.getItem().attr("data-object"));this.object=JSON&&JSON.parse(t)||$.parseJSON(t)}return this.object},placeholderSizing:function(){if(this.getEl("root").exists()){var e=Math.max(document.documentElement.clientWidth,window.innerWidth||0),t=Math.max(document.documentElement.clientHeight,window.innerHeight||0),a=e/t,o=this.getEl("src")[0],i=o.getAttribute("width"),n=o.getAttribute("height"),s=i/n,r=a0?"add":t.getItem()[o]().exists()?"add":"remove";a[n+"Class"](i.substring(1))}),$.each(this.getItem().get(0).attributes,function(e,t){if(!t.name.startsWith("data-"))return!0;a.attr(t.name,t.value)});var n=void 0===this.object.user?"user":"guest";n="owner"+(n.charAt(0).toUpperCase()+n.slice(1).toLowerCase()),this.getEl(n).remove(),void 0!==this.object.user&&$(this.object.user.avatar?".default-user-image":"img.user-image",this.getEl("ownerUser")).remove();var s=this.getItem().find(".list-item-image-tools[data-action='list-tools']");this.getEl("tools").append(s.html());let r=this;this.getEl("tools").find(".list-tool[data-action]").each(function(){$(this).attr("title",$(this).attr("title")+" ("+r.keymap[$(this).attr("data-action")][0]+")")}),this.placeholderSizing(),this.trickyLoad()},zoom:function(){this.getEl("root").attr("data-cover","1"==this.getEl("root").attr("data-cover")?"0":"1")},remove:function(){this.getEl("root").remove()},getParsedTemplate:function(){var e=this.getObject(!0),t=this.getEl("template").html(),a=t.match(/%(\S+)%/g);return a&&$.each(a,function(a,o){var i,n=o.slice(1,-1).split(".");n.map(function(t){var a=i||e;t in a&&(i=a[t])});var s=new RegExp(o,"g");i=void 0===i?"":i,t=t.replace(s,i)}),t},insertEl:function(){var e=this.getParsedTemplate();this.getEl("rootZero").remove(),$(e).appendTo("body")},toggleIdle:function(e,t){var a=this;t=void 0===t||t;$("html")[(e?"add":"remove")+"Class"]("--idle"),e||(clearTimeout(a.idleTimer),t&&(a.idleTimer=setTimeout(function(){var e=$(".fullscreen"),t=a.getEl("root");a.toggleIdle(t.length>0&&0==e.length)},5e3)))},open:function(e){if(e.exists()){this.setItem(e),this.insertEl(),this.filler(),this.show(),this.toggleIdle(!1);var t=this;this.getEl("root").on("mousemove mouseout",function(){t.toggleIdle(!1)})}else this.getEl("rootZero").remove()},setItem:function(e){this.$item=e},trickyLoad:function(){if(this.object.image.url!=this.object.display_url){var e=this.getEl("src").parent().html(),t=$(e).attr("src",this.object.image.url);t.insertBefore(this.getEl("src")),t.imagesLoaded(function(){t.next().remove()})}},close:function(){var e=this;$(this.selectors.root).removeClass(this.selectors.rootShow.substring(1)).addClass(this.selectors.rootHide.substring(1)),$("body").removeClass(this.selectors.bodyShown.substring(1)),this.toggleIdle(!1,!1),null!==this.getItem()&&$(window).scrollTop(this.getItem().offset().top);var t=$("#top-bar, .follow-scroll");t.attr("data-scroll-lock","1"),setTimeout(function(){e.remove()},250),setTimeout(function(){t.removeAttr("data-scroll-lock")},300)},browse:function(e){var t=this.getItem()[e]();if(t.exists()){this.setItem(t),this.filler(!0);var a=$(PF.obj.listing.selectors.content_listing_visible).find("[data-action=load-more]"),o=t[e+"All"]().length;a.length>0&&o<=5&&!PF.obj.listing.calling&&"next"==e&&$("[data-action=load-more]").click()}else{var i=$("[data-pagination="+e+"]",PF.obj.listing.selectors.content_listing_pagination+":visible"),n=i.attr("href");if(!n)return;PF.fn.deparam(window.location.search);window.location.href=n+"&viewer="+e}},prev:function(){this.browse("prev")},next:function(){this.browse("next")}},CHV.obj.image_viewer={selector:"#image-viewer",container:"#image-viewer-container",navigation:".image-viewer-navigation",loading:"#image-viewer-loading",loader:"#image-viewer-loader"},CHV.obj.image_viewer.$container=$(CHV.obj.image_viewer.container),CHV.obj.image_viewer.$navigation=$(CHV.obj.image_viewer.navigation),CHV.obj.image_viewer.$loading=$(CHV.obj.image_viewer.loading),CHV.fn.system={checkUpdates:function(e){$.ajax({url:CHEVERETO.api.get.info+"/",data:{id:CHEVERETO.id},cache:!1}).always(function(t,a,o){"function"==typeof e&&e(o)})}},("MacIntel"===navigator.platform&&navigator.maxTouchPoints>0||"iPad"===navigator.platform)&&$("html").removeClass("device-nonmobile"),CHV.fn.bindSelectableItems=function(){var e="content-listing-wrapper",t="#"+e;$(t).exists()?$(t).hasClass("ui-selectable")&&$(t).selectable("destroy"):$("#content-listing-tabs").wrap("
    "),$("[data-content=list-selection]").exists()&&$("html.device-nonmobile "+t).selectable({delay:150,filter:PF.obj.listing.selectors.list_item,cancel:".content-empty, .header, #tab-share, #tab-info, .viewer-title, .header-link, .top-bar, .content-listing-pagination *, #fullscreen-modal, #top-user, #background-cover, .list-item-desc, .list-item-image-tools, [data-action=load-image], #tab-embeds",classes:{"ui-selected":"selected"},selected:function(e,t){$(t.selected).removeClass("ui-selected")},selecting:function(e,t){var a=$(t.selecting),o=a.hasClass("selected");CHV.fn.list_editor[(o?"unselect":"select")+"Item"](a)},unselecting:function(e,t){CHV.fn.list_editor.unselectItem($(t.unselecting))}})},CHV.fn.isCachedImage=function(e){var t=new Image;return t.src=e,t.complete||t.width+t.height>0},CHV.fn.viewerLoadImage=function(){if(CHV.obj.image_viewer.$loading.exists()&&(CHV.obj.image_viewer.$loading.removeClass("soft-hidden").css({zIndex:2}),PF.fn.loading.inline(CHV.obj.image_viewer.$loading,{color:"white",size:"small",center:!0,valign:!0}),CHV.obj.image_viewer.$loading.hide().fadeIn("slow")),$(CHV.obj.image_viewer.loader).remove(),CHV.obj.image_viewer.image.is_360)return PF.fn.loading.destroy(CHV.obj.image_viewer.$loading),pannellum.viewer("image-viewer-360",{autoLoad:!0,type:"equirectangular",panorama:CHV.obj.image_viewer.image.url,preview:CHV.obj.image_viewer.$container.find("img").eq(0).attr("src"),pitch:2.3,yaw:-135.4,hfov:120}),$("#image-viewer-360").removeClass("soft-hidden"),void CHV.obj.image_viewer.$container.find("img").eq(0).remove();CHV.obj.image_viewer.image.html=CHV.obj.image_viewer.$container.html(),CHV.obj.image_viewer.$container.prepend($(CHV.obj.image_viewer.image.html).css({top:0,zIndex:0,opacity:0, -position:"absolute"})),CHV.obj.image_viewer.$container.find("img").eq(0).css("zIndex",1),CHV.obj.image_viewer.$container.find("img").eq(1).attr("src",CHV.obj.image_viewer.image.url),CHV.obj.image_viewer.$container.find("img").eq(1).imagesLoaded(function(){CHV.obj.image_viewer.$container.find("img").eq(1).css({position:"",display:""}),CHV.obj.image_viewer.$container.find("img").eq(0).remove(),PF.fn.loading.destroy(CHV.obj.image_viewer.$loading)})},CHV.obj.embed_share_tpl={},CHV.obj.embed_upload_tpl={},CHV.obj.topBar={transparencyScrollToggle:function(){var e=$(window).scrollTop();$("#top-bar")[(e>0?"remove":"add")+"Class"]("transparent")}},CHV.obj.uploaderReset={isUploading:!1,canAdd:!0,queueStatus:"ready",uploadThreads:0,uploadParsedIds:[],uploadProcessedIds:[],files:{},results:{success:{},error:{}},toggleWorking:0,filesAddId:0,clipboardImages:[]},CHV.fn.uploader={files:{},selectors:{root:"#anywhere-upload",show:".upload-box--show",queue:"#anywhere-upload-queue",queue_complete:".queue-complete",queue_item:".queue-item",close_cancel:"[data-button=close-cancel]",file:"#anywhere-upload-input",camera:"#anywhere-upload-input-camera",upload_item_template:"#anywhere-upload-item-template",item_progress_bar:"[data-content=progress-bar]",failed_result:"[data-content=failed-upload-result]",fullscreen_mask:"#fullscreen-uploader-mask",dropzone:"#uploader-dropzone",paste:"#anywhere-upload-paste",input:"[data-action=anywhere-upload-input]"},toggle:function(e,t){this.queueSize();var a=$("[data-action=top-bar-upload]",".top-bar"),o=!$(CHV.fn.uploader.selectors.root).data("shown");e=$.extend({callback:null,reset:!0},e);if(void 0!==e.show&&e.show&&(o=!0),PF.fn.growl.close(!0),PF.fn.close_pops(),!(1==this.toggleWorking||$(CHV.fn.uploader.selectors.root).is(":animated")||CHV.fn.uploader.isUploading||a.data("login-needed")&&!PF.fn.is_user_logged())){this.toggleWorking=1;var i={time:500,easing:null},n=function(){!o&&e.reset&&CHV.fn.uploader.reset(),PF.fn.topMenu.hide(),"function"==typeof e.callback&&e.callback(t),CHV.fn.uploader.boxSizer(),CHV.fn.uploader.toggleWorking=0};if($(CHV.fn.uploader.selectors.root)[(o?"add":"remove")+"Class"](this.selectors.show.substring(1)),o){if($("html").data({"followed-scroll":$("html").hasClass("followed-scroll"),"top-bar-box-shadow-prevent":!0}).removeClass("followed-scroll").addClass("overflow-hidden top-bar-box-shadow-none"),$("#top-bar").data({stock_classes:$("#top-bar").attr("class")}).addClass("scroll-up"),$(".current[data-nav]",".top-bar").each(function(){$(this).is("[data-action=top-bar-menu-full]")||$(this).removeClass("current").attr("data-current",1)}),PF.fn.isDevice("mobile")){var s=$(".upload-box-heading",$(CHV.fn.uploader.selectors.root));s.css({position:"relative",top:.5*($(window).height()-s.height())+"px"})}CHV.fn.uploader.focus(function(){setTimeout(function(){n()},i.time)})}else{$("#top-bar")[0].className=$("#top-bar").data("stock_classes"),$("[data-nav][data-current=1]",".top-bar").each(function(){$(this).addClass("current")}),setTimeout(function(){$(CHV.fn.uploader.selectors.fullscreen_mask).css({opacity:0})},.1*i.time),setTimeout(function(){$(CHV.fn.uploader.selectors.fullscreen_mask).remove()},i.time);var r=$(CHV.fn.uploader.selectors.root).outerHeight(),l=r-parseInt($(CHV.fn.uploader.selectors.root).data("initial-height"))+"px";$(CHV.fn.uploader.selectors.root).css({transform:"translate(0,-"+l+")"}),setTimeout(function(){$(CHV.fn.uploader.selectors.root).css({top:""}),n(),$("html,body").removeClass("overflow-hidden").data({"top-bar-box-shadow-prevent":!1}),$("#top-bar *").trigger("blur")},i.time)}$(CHV.fn.uploader.selectors.root).data("shown",o),a.toggleClass("current").removeClass("opened")}},reset:function(){$.extend(this,$.extend(!0,{},CHV.obj.uploaderReset)),$("li",this.selectors.queue).remove(),$(this.selectors.root).height("").css({"overflow-y":"","overflow-x":""}),$(this.selectors.queue).addClass("queueEmpty").removeClass(this.selectors.queue_complete.substring(1)),$(this.selectors.input,this.selectors.root).each(function(){$(this).prop("value",null)}),$("[data-group=upload-result] textarea",this.selectors.root).prop("value",""),$.each(["upload-queue-ready","uploading","upload-result","upload-queue-ready","upload-queue"],function(e,t){$("[data-group="+t+"]").hide()}),$("[data-group=upload]",this.selectors.root).show(),$("[name=upload-album-id]",this.selectors.root).prop("value",function(){var e=$("option[selected]",this);if(e.exists())return e.attr("value")}),$(this.selectors.root).removeClass("queueCompleted queueReady queueHasResults").addClass("queueEmpty").attr("data-queue-size",0),$("[name=upload-category-id]",this.selectors.root).prop("value",""),$("[name=upload-nsfw]",this.selectors.root).prop("checked",this.defaultChecked),this.boxSizer(!0)},focus:function(e){$(this.selectors.fullscreen_mask).exists()||($("body").is("#upload")||$("body").append($("
    ",{id:this.selectors.fullscreen_mask.replace("#",""),class:"fullscreen black"}).css({top:PF.fn.isDevice("phone")?0:$(CHV.fn.uploader.selectors.root).data("top")})),setTimeout(function(){$("body").is("#upload")||$(CHV.fn.uploader.selectors.fullscreen_mask).css({opacity:1}),setTimeout(function(){"function"==typeof e&&e()},PF.fn.isDevice(["phone","phablet"])?0:250)},1))},boxSizer:function(e){var t=$(this.selectors.root).is(this.selectors.show),a=t||e;t&&$("html").addClass("overflow-hidden"),a&&($(this.selectors.root).height(""),!$("body").is("#upload")&&$(this.selectors.root).height()>$(window).height()?($(this.selectors.root).height($(window).height()-$("#top-bar").height()).css({"overflow-y":"scroll","overflow-x":"auto"}),$("body").addClass("overflow-hidden")):$(this.selectors.root).css("overflow-y",""))},pasteURL:function(){var e=$("[name=urls]",PF.obj.modal.selectors.root),t=e.val();t&&(CHV.fn.uploader.toggle({show:!0}),CHV.fn.uploader.add({},t))},pasteImageHandler:function(e){if(!$(e.target).is(":input")){if(void 0!==e.clipboardData&&e.clipboardData.items)var t=e.clipboardData.items;else setTimeout(function(){return e.clipboardData={},e.clipboardData.items=[],$.each($("img",CHV.fn.uploader.$pasteCatcher),function(t,a){e.clipboardData.items.push(PF.fn.dataURItoBlob($(this).attr("src")))}),$(CHV.fn.uploader.selectors.paste).html(""),CHV.fn.uploader.pasteImageHandler(e)},1);if(t){const e=new Array,i=new Array;let n=$(CHV.fn.uploader.selectors.root).data("shown");for(var a=0;ap||f==p){var h=pp&&$img.height(h).width(h*g)}if(f0){var v="";for(l=0;l"+PF.fn.htmlEncode(m[l].name)+"",delete CHV.fn.uploader.files[m[l].uid],$("li[data-id="+m[l].uid+"]",CHV.fn.uploader.selectors.queue).find("[data-action=cancel]").click();PF.fn.modal.simple({title:PF.fn._s("Some files couldn't be added"),message:"
      "+v+"
    "})}else CHV.fn.uploader.focus();CHV.fn.uploader.boxSizer()}},$.extend({},C,{orientation:a.exif?a.exif.get("Orientation"):1})),setTimeout(function(){o(e+1)},25)}))}else PF.fn.loading.destroy("fullscreen")}var i;if(!this.canAdd){e=e.originalEvent;return e.preventDefault(),e.stopPropagation(),!1}$fileinput=$(this.selectors.file),$fileinput.replaceWith($fileinput=$fileinput.clone(!0));var n=$(this.selectors.upload_item_template).html();let s=[],r=[];if(void 0===t){e=e.originalEvent;e.preventDefault(),e.stopPropagation();var l=e.dataTransfer||e.target;if("items"in l)for(var d=l.items,c=0;cCHV.obj.config.image.max_filesize.getBytes()?m.push({uid:c,name:p.name.truncate_middle()+" - "+PF.fn._s("File too big.")}):-1!=CHV.obj.config.upload.image_types.indexOf(f)||0!=/android/i.test(navigator.userAgent)?(i&&(p.md5=i),p.fromClipboard=1==e.clipboard,p.uid=c):m.push({uid:c,name:p.name.truncate_middle()+" - "+PF.fn._s("Invalid or unsupported file format.")})}for(c=0;c0&&0==s.length){var h="";for(c=0;c"+PF.fn.htmlEncode(m[c].name)+"";return void PF.fn.modal.simple({title:PF.fn._s("Some files couldn't be added"),message:"
    • "+h+"
    "})}if(0==s.length)return}else{if(t=t.replace(/(<([^>]+)>)/g,"").replace(/(\[([^\]]+)\])/g,""),s=t.match_urls(),!s)return;s=s.array_unique(),s=$.map(s,function(e,t){return{uid:t,name:e,url:e}})}if($.isEmptyObject(this.files))for(c=0;c0){var i=[];for(var o in this.results.error)"object"==typeof this.results.error[o]&&(i[o]=this.results.error[o].error.message);i.length>0&&$(this.selectors.failed_result).html("
  • "+i.join("
  • ")+"
  • ")}else $(a.error,this.selectors.root).hide();if(!window.opener&&0==CHV.obj.config.upload.moderation&&CHV.obj.config.upload.redirect_single_upload&&1==Object.size(this.results.success)&&0==Object.size(this.results.error))return window.location.href=this.results.success[Object.keys(this.results.success)[0]].image.path_viewer,!1;if($("[data-text=queue-progress]",this.selectors.root).text(100),$("[data-group=uploading]",this.selectors.root).hide(),$(this.selectors.root).removeClass("queueUploading queueHasResults").addClass("queueCompleted"),$(this.selectors.queue).addClass(this.selectors.queue_complete.substring(1)),Object.size(this.results.success)>0&&$("[data-group=upload-result] textarea",this.selectors.root).exists()&&CHV.fn.fillEmbedCodes(this.results.success,CHV.fn.uploader.selectors.root,"val"),Object.size(this.results.success)>0&&Object.size(this.results.error)>0?$(a.mixed+", "+a.success,this.selectors.root).show():Object.size(this.results.success)>0?$(a.success,this.selectors.root).show():Object.size(this.results.error)>0&&$(a.error,this.selectors.root).show(),$(a.success,this.selectors.root).is(":visible")){$(a.success,this.selectors.root).find("[data-group^=user], [data-group=guest]").hide(),$(a.success,this.selectors.root).find("[data-group="+(PF.fn.is_user_logged()?"user":"guest")+"]").show();var n=Object.keys(this.results.success)[0];if(void 0!==this.results.success[n].image.album){var s=[];for(var r in this.results.success){var l=this.results.success[r].image;l.album&&l.album.id_encoded&&-1==s.indexOf(l.album.id_encoded)&&s.push(l.album.id_encoded)}var d={link:null,text:null};if(s.length<=1?(d.link=this.results.success[n].image.album.url,d.text=this.results.success[n].image.album.name):(d.link=this.results.success[n].image.user.url_albums,d.text=PF.fn._s("%s's Albums",this.results.success[n].image.user.name_short_html)),$("[data-text=upload-target]",this.selectors.root).text(d.text),$("[data-link=upload-target]",this.selectors.root).attr("href",d.link),PF.fn.is_user_logged()){var c=s.length>0?"album":"stream";$("[data-group=user-"+c+"]",this.selectors.root).show()}}}if(this.boxSizer(),this.queueStatus="done",window.opener&&void 0!==CHV.obj.opener.uploadPlugin[window.name]){if($('[data-action="copy"]',this.selectors.root).remove(),CHV.obj.opener.uploadPlugin[window.name].hasOwnProperty("autoInsert")&&CHV.obj.opener.uploadPlugin[window.name].autoInsert){var u=$(':input[name="'+CHV.obj.opener.uploadPlugin[window.name].autoInsert+'"]',CHV.fn.uploader.selectors.root),m=u.val();if(m)return window.opener.postMessage({id:window.name,message:m},"*"),void window.close()}}else $('[data-action="openerPostMessage"]',this.selectors.root).remove()}},$.extend(CHV.fn.uploader,$.extend(!0,{},CHV.obj.uploaderReset)),CHV.fn.fillEmbedCodes=function(e,t,a){void 0===a&&(a="val");var o=CHV.fn.uploader.selectors.root==t?"embed_upload_tpl":"embed_share_tpl";$.each(e,function(e,i){if(void 0!==i){var n="id_encoded"in i?i:i.image;if(!n.medium){n.medium={};for(var s=["filename","name","width","height","extension","size","size_formatted","url"],r=0;r0&&$.each(CHV.obj.categories,function(o,i){return void 0!==e&&i.id==e||(i.url_key==$("[name=form-category-url_key]",t).val()?(a=!0,!1):void 0)}),!a||(PF.fn.growl.call(PF.fn._s("Category URL key already being used.")),$("[name=form-category-url_key]",t).highlight(),!1)))},edit:{before:function(e){var t=$(e.target),a=t.data("category-id"),o=CHV.obj.categories[a],i="[data-modal="+t.data("target")+"]";$.each(CHV.fn.category.formFields,function(e,t){e="form-category-"+t,t=o[t];var a=$("[name="+e+"]",i);a.is("textarea")?a.html(PF.fn.htmlEncode(t)):a.attr("value",t)})},submit:function(){var e=PF.obj.modal.selectors.root,t=$("[name=form-category-id]",e).val();return!!CHV.fn.category.validateForm(t)&&(PF.obj.modal.form_data={action:"edit",edit:"category",editing:{}},$.each(CHV.fn.category.formFields,function(t,a){PF.obj.modal.form_data.editing[a]=$("[name=form-category-"+a+"]",e).val()}),!0)},complete:{success:function(e){var t=e.responseJSON.category,a="[data-content=category][data-category-id="+t.id+"]";$.each(t,function(e,t){$("[data-content=category-"+e+"]",a).html(PF.fn.htmlEncode(t))}),$("[data-link=category-url]").attr("href",t.url),CHV.obj.categories[t.id]=t,PF.fn.growl.expirable(PF.fn._s("The content has been edited."))}}},delete:{before:function(e){var t=$(e.target),a=t.data("category-id"),o=CHV.obj.categories[a];t.attr("data-confirm",t.attr("data-confirm").replace("%s",'"'+o.name+'"'))},submit:function(e){return PF.obj.modal.form_data={action:"delete",delete:"category",deleting:{id:e}},!0},complete:{success:function(e){PF.fn.growl.expirable(PF.fn._s("Category successfully deleted."));var t=e.responseJSON.request.deleting.id;$("[data-content=category][data-category-id="+t+"]").remove(),delete CHV.obj.categories[t]}}},add:{submit:function(){var e=PF.obj.modal.selectors.root;return!!CHV.fn.category.validateForm()&&(PF.obj.modal.form_data={action:"add-category",category:{}},$.each(CHV.fn.category.formFields,function(t,a){"id"!=a&&(PF.obj.modal.form_data.category[a]=$("[name=form-category-"+a+"]",e).val())}),!0)},complete:{success:function(e){var t=e.responseJSON.category,a="[data-content=dashboard-categories-list]",o=$("[data-content=category-dashboard-template]").html();$.each(t,function(e,t){o=o.replace(new RegExp("%"+e.toUpperCase()+"%","g"),t||"")}),$(a).append(o),0==Object.size(CHV.obj.categories)&&(CHV.obj.categories={}),CHV.obj.categories[t.id]=t,PF.fn.growl.call(PF.fn._s("Category %s added.",'"'+t.name+'"'))}}}},CHV.fn.ip_ban={formFields:["id","ip","expires","message"],validateForm:function(e){var t=PF.obj.modal.selectors.root,a=!1,o=$("[name=form-ip_ban-ip]",t).val();return!!CHV.fn.common.validateForm(t)&&(""!==$("[name=form-ip_ban-expires]",t).val()&&0==/^\d{4}-\d{2}-\d{2} \d{2}:\d{2}:\d{2}$/.test($("[name=form-ip_ban-expires]",t).val())?(PF.fn.growl.call(PF.fn._s("Invalid expiration date.")),$("[name=form-ip_ban-expires]",t).highlight(),!1):(Object.size(CHV.obj.ip_bans)>0&&$.each(CHV.obj.ip_bans,function(t,i){return void 0!==e&&i.id==e||(i.ip==o?(a=!0,!1):void 0)}),!a||(PF.fn.growl.call(PF.fn._s("IP %s already banned.",o)),$("[name=form-ip_ban-ip]",t).highlight(),!1)))},add:{submit:function(){var e=PF.obj.modal.selectors.root;return!!CHV.fn.ip_ban.validateForm()&&(PF.obj.modal.form_data={action:"add-ip_ban",ip_ban:{}},$.each(CHV.fn.ip_ban.formFields,function(t,a){"id"!=a&&(PF.obj.modal.form_data.ip_ban[a]=$("[name=form-ip_ban-"+a+"]",e).val())}),!0)},complete:{success:function(e){var t=e.responseJSON.ip_ban,a="[data-content=dashboard-ip_bans-list]",o=$("[data-content=ip_ban-dashboard-template]").html();void 0!==o&&($.each(t,function(e,t){o=o.replace(new RegExp("%"+e.toUpperCase()+"%","g"),t||"")}),$(a).append(o)),0==Object.size(CHV.obj.ip_bans)&&(CHV.obj.ip_bans={}),CHV.obj.ip_bans[t.id]=t,$("[data-content=ban_ip]").addClass("hidden"),$("[data-content=banned_ip]").removeClass("hidden"),PF.fn.growl.call(PF.fn._s("IP %s banned.",t.ip))},error:function(e){var t=e.responseJSON.error;PF.fn.growl.call(PF.fn._s(t.message))}}},edit:{before:function(e){var t=$(e.target),a=t.data("ip_ban-id"),o=CHV.obj.ip_bans[a],i="[data-modal="+t.data("target")+"]";$.each(CHV.fn.ip_ban.formFields,function(e,t){e="form-ip_ban-"+t,t=o[t];var a=$("[name="+e+"]",i);a.is("textarea")?a.html(PF.fn.htmlEncode(t)):a.attr("value",t)})},submit:function(){var e=PF.obj.modal.selectors.root,t=$("[name=form-ip_ban-id]",e).val();return!!CHV.fn.ip_ban.validateForm(t)&&(PF.obj.modal.form_data={action:"edit",edit:"ip_ban", -editing:{}},$.each(CHV.fn.ip_ban.formFields,function(t,a){PF.obj.modal.form_data.editing[a]=$("[name=form-ip_ban-"+a+"]",e).val()}),!0)},complete:{success:function(e){var t=e.responseJSON.ip_ban,a="[data-content=ip_ban][data-ip_ban-id="+t.id+"]";$.each(t,function(e,t){$("[data-content=ip_ban-"+e+"]",a).html(PF.fn.htmlEncode(t))}),CHV.obj.ip_bans[t.id]=t},error:function(e){var t=e.responseJSON.error;PF.fn.growl.call(PF.fn._s(t.message))}}},delete:{before:function(e){var t=$(e.target),a=t.data("ip_ban-id"),o=CHV.obj.ip_bans[a];t.attr("data-confirm",t.attr("data-confirm").replace("%s",o.ip))},submit:function(e){return PF.obj.modal.form_data={action:"delete",delete:"ip_ban",deleting:{id:e}},!0},complete:{success:function(e){PF.fn.growl.expirable(PF.fn._s("IP ban successfully deleted."));var t=e.responseJSON.request.deleting.id;$("[data-content=ip_ban][data-ip_ban-id="+t+"]").remove(),delete CHV.obj.ip_bans[t]}}}},CHV.fn.storage={formFields:["id","name","api_id","bucket","server","service","capacity","region","key","secret","url","account_id","account_name"],calling:!1,validateForm:function(){var e=PF.obj.modal.selectors.root,t=$("[name=form-storage-id]",e).val(),a=!0;if($.each($(":input",e),function(e,t){$(this).is(":hidden")?$(this).attr("required")&&$(this).removeAttr("required").attr("data-required",1):1==$(this).attr("data-required")&&$(this).attr("required","required"),$(this).is(":visible")&&""==$(this).val()&&$(this).attr("required")&&($(this).highlight(),a=!1)}),!a)return PF.fn.growl.call(PF.fn._s("Please fill all the required fields.")),!1;var o,i=$("[name=form-storage-capacity]",e),n=i.val();return""!==n&&(0==/^[\d\.]+\s*[A-Za-z]{2}$/.test(n)||void 0===n.getBytes()?o=PF.fn._s("Invalid storage capacity value. Make sure to use a valid format."):void 0!==CHV.obj.storages[t]&&n.getBytes()0&&(t=String(t).formatBytes(2)),r.attr("value",t))}),$("[data-combo-value]").addClass("soft-hidden"),$(n).removeClass("soft-hidden")},submit:function(){var e=PF.obj.modal.selectors.root;$("[name=form-storage-id]",e).val();return!!CHV.fn.storage.validateForm()&&(PF.obj.modal.form_data={action:"edit",edit:"storage",editing:{}},$.each(CHV.fn.storage.formFields,function(t,a){var o;o="[name=form-storage-"+a+"]","hidden"!==$(o,e).attr("type")&&(o+=":visible"),PF.obj.modal.form_data.editing[a]=$(o,e).val()}),!0)},complete:{success:function(e){var t=e.responseJSON.storage,a="[data-content=storage][data-storage-id="+t.id+"]",o=$("[data-action=toggle-storage-https]",a);$.each(t,function(e,t){$("[data-content=storage-"+e+"]",a).html(PF.fn.htmlEncode(t))}),CHV.obj.storages[t.id]=t,CHV.fn.storage.toggleBoolDisplay(o,1==t.is_https)},error:function(e){var t=e.responseJSON,a=t.error.message;PF.fn.growl.call(a)}}},add:{submit:function(){if(!CHV.fn.storage.validateForm())return!1;var e=PF.obj.modal.selectors.root;return PF.obj.modal.form_data={action:"add-storage",storage:{}},$.each(CHV.fn.storage.formFields,function(t,a){var o;"id"!=a&&(o="[name=form-storage-"+a+"]","hidden"!==$(o,e).attr("type")&&(o+=":visible"),PF.obj.modal.form_data.storage[a]=$(o,e).val())}),!0},complete:{success:function(e){var t=e.responseJSON.storage,a="[data-content=dashboard-storages-list]",o=$("[data-content=storage-dashboard-template]").html();$.each(t,function(e,t){var a=e.toUpperCase();if("is_https"==e||"is_active"==e)t=CHV.obj.storageTemplate.icon.replace("%TITLE%",CHV.obj.storageTemplate.messages[e]).replace("%ICON%",CHV.obj.storageTemplate.checkboxes[t]).replace("%PROP%",e.replace("is_",""));o=o.replace(new RegExp("%"+a+"%","g"),t||"")}),$(a).append(o),PF.fn.bindtipTip($("[data-storage-id="+t.id+"]")),0==CHV.obj.storages.length&&(CHV.obj.storages={}),CHV.obj.storages[t.id]=t},error:function(e){var t=e.responseJSON,a=t.error.message;PF.fn.growl.call(a)}}},toggleBoolDisplay:function(e,t){var a={0:e.data("unchecked-icon"),1:e.data("checked-icon")};e.removeClass(a[0]+" "+a[1]).addClass(a[t?1:0])}},CHV.fn.common={validateForm:function(e){if(void 0===e)e=PF.obj.modal.selectors.root;var t=!0;return $.each($(":input:visible",e),function(e,a){""==$(this).val()&&$(this).attr("required")&&($(this).highlight(),t=!1)}),!!t||(PF.fn.growl.call(PF.fn._s("Please fill all the required fields.")),!1)},updateDoctitle:function(e){void 0!==CHV.obj.page_info&&(CHV.obj.page_info.pre_doctitle=e,CHV.obj.page_info.doctitle=CHV.obj.page_info.pre_doctitle+CHV.obj.page_info.pos_doctitle,document.title=CHV.obj.page_info.doctitle)}},CHV.fn.user={add:{submit:function(){var e=$(PF.obj.modal.selectors.root),t=!0;return $.each($(":input",e),function(e,a){""==$(this).val()&&$(this).attr("required")&&($(this).highlight(),t=!1)}),t?(PF.obj.modal.form_data={action:"add-user",user:{username:$("[name=form-username]",e).val(),email:$("[name=form-email]",e).val(),password:$("[name=form-password]",e).val(),role:$("[name=form-role]",e).val()}},!0):(PF.fn.growl.call(PF.fn._s("Please fill all the required fields.")),!1)},complete:{success:function(e){e.responseJSON;PF.fn.growl.expirable(PF.fn._s("%s added successfully.",PF.fn._n("User","Users",1)))},error:function(e){var t=e.responseJSON;PF.fn.growl.call(PF.fn._s(t.error.message))}}},delete:{submit:function(){return PF.obj.modal.form_data={action:"delete",delete:"user",owner:CHV.obj.resource.user.id,deleting:CHV.obj.resource.user},!0}},ban:{submit:function(){return PF.obj.modal.form_data={action:"ban",ban:"user",banning:CHV.obj.resource.user.id},!0},success:function(){}}},CHV.fn.submit_resource_approve=function(){return PF.obj.modal.form_data={action:"approve",approve:CHV.obj.resource.type,from:"resource",owner:void 0!==CHV.obj.resource.user?CHV.obj.resource.user.id:null,approving:CHV.obj.resource},!0},CHV.fn.complete_resource_approve={success:function(e){e.responseJSON;$("body").fadeOut("normal",function(){redir=CHV.obj.resource.url,window.location=redir})}},CHV.fn.submit_resource_delete=function(){return PF.obj.modal.form_data={action:"delete",delete:CHV.obj.resource.type,from:"resource",owner:void 0!==CHV.obj.resource.user?CHV.obj.resource.user.id:null,deleting:CHV.obj.resource},!0},CHV.fn.complete_resource_delete={success:function(e){e.responseJSON;$("body").fadeOut("normal",function(){var e;e="album"==CHV.obj.resource.type||"image"==CHV.obj.resource.type?CHV.obj.resource.parent_url:CHV.obj.resource.user?CHV.obj.resource.user.url:CHV.obj.resource.url,void 0!==e&&(window.location=e.replace(/\/?$/,"/")+"?deleted")})}},CHV.fn.list_editor={blink:function(e){e.addClass("ui-selecting"),setTimeout(function(){e.removeClass("ui-selecting")},200)},selectionCount:function(){var e=$(PF.obj.listing.selectors.content_listing);e.each(function(){var t=$("[data-content=pop-selection]","[data-content=list-selection][data-tab="+$(this).attr("id")+"]"),a=$(PF.obj.listing.selectors.list_item+".selected",this).length;if(all_count=$(PF.obj.listing.selectors.list_item,this).length,t.toggleClass("disabled",0==a),$("[data-text=selection-count]",t).text(a>0?a:""),"images"==e.data("list")&&a>0){var o=$(PF.obj.listing.selectors.list_item+".selected[data-flag=safe]",this).length>0,i=$(PF.obj.listing.selectors.list_item+".selected[data-flag=unsafe]",this).length>0;$("[data-action=flag-safe]",t)[(i?"remove":"add")+"Class"]("hidden"),$("[data-action=flag-unsafe]",t)[(o?"remove":"add")+"Class"]("hidden")}$(this).is(":visible")&&($("body").toggleClass("--has-selection",a>0),CHV.fn.list_editor.listMassActionSet(all_count==a?"clear":"select"))})},removeFromList:function(e,t){if(void 0!==e){e=e instanceof jQuery==0?$(e):e;var a=$(PF.obj.listing.selectors.content_listing_visible),o=e.length;e.fadeOut("fast");var i=e.first().data("type"),n=parseInt($("[data-text="+i+"-count]").text())-o;CHV.fn.list_editor.updateUserCounters(e.first().data("type"),o,"-"),e.promise().done(function(){$(document).removeClass(CHV.fn.listingViewer.selectors.bodyShown.substr(1));var i={};if(e.each(function(){$("[data-id="+$(this).data("id")+"]").each(function(){var e=$(this).closest(PF.obj.listing.selectors.content_listing).attr("id");i[e]||(i[e]=0),i[e]+=1})}),1==o?$("[data-id="+$(this).data("id")+"]").remove():e.each(function(){$("[data-id="+$(this).data("id")+"]").remove()}),PF.fn.listing.columnizerQueue(),PF.fn.listing.refresh(),CHV.fn.list_editor.selectionCount(),void 0!==t&&"string"==typeof t&&PF.fn.growl.expirable(t),$(PF.obj.listing.selectors.content_listing_pagination,a).exists()||0!=$(PF.obj.listing.selectors.list_item,a).length||(n=0),0==n)a.html(PF.obj.listing.template.empty),$(PF.obj.listing.selectors.content_listing+":not("+PF.obj.listing.selectors.content_listing_visible+")").data({empty:null,load:"ajax"}),$("[data-content=list-selection][data-tab="+a.attr("id")+"]").addClass("disabled");else if(0==$(PF.obj.listing.selectors.list_item,a).length){if($(PF.obj.listing.selectors.pad_content).height(0),$("[data-action=load-more]",a).exists())return $(PF.obj.listing.selectors.content_listing_visible).data("page",0),$("[data-action=load-more]",a).click(),void(PF.obj.listing.recolumnize=!0);var s=$("[data-pagination=next]",a);if(s.exists()){var r=s.attr("href"),l=PF.fn.deparam(r);return"page"in l&&l.page>1&&(r=r.changeURLParameterValue("page",l.page-1)),void(window.location=r)}}})}},deleteFromList:function(e){if(void 0===t)var t=!0;e=e instanceof jQuery==0?$(e):e;this.removeFromList(e,t?PF.fn._s("The content has been deleted."):null)},moveFromList:function(e,t){if(void 0===t)t=!0;e=e instanceof jQuery==0?$(e):e;this.removeFromList(e,t?PF.fn._s("The content has been moved."):null)},toggleSelectItem:function(e,t){if("boolean"!=typeof t)t=!e.hasClass("selected");var a,o,i,n=$(".viewer").is(":visible")?$("[data-type=image][data-id="+e.attr("data-id")+"]"):e,s=$("[data-action=select] .btn-icon",n);n.hasClass("unselect")||(n.addClass("unselect"),t?(Boolean(window.navigator.vibrate)&&window.navigator.vibrate([15,125,25]),n.addClass("selected"),a=s.data("icon-selected"),o=s.data("icon-unselected"),i=PF.fn._s("Unselect")):(n.removeClass("selected ui-selected"),a=s.data("icon-unselected"),o=s.data("icon-selected"),i=PF.fn._s("Select")),s.removeClass(o).addClass(a),setTimeout(function(){n.removeClass("unselect")},350),$("[data-action=select] .label",n).text(i),CHV.fn.list_editor.selectionCount())},selectItem:function(e){this.toggleSelectItem(e,!0)},unselectItem:function(e){this.toggleSelectItem(e,!1),e.removeClass("selected")},selectAll:function(e){this.selectItem($(PF.obj.listing.selectors.list_item+":visible:not(.selected)")),this.listMassActionSet("clear"),e.stopPropagation()},clearSelection:function(e){var t=$(PF.obj.listing.selectors.list_item+".selected",PF.obj.listing.selectors[e?"content_listing":"content_listing_visible"]);this.unselectItem(t),this.listMassActionSet("select")},listMassActionSet:function(e){var t="select"==e?"clear":"select",a=$("[data-text-select-all][data-action=list-"+t+"-all]:visible"),o=a.data("text-"+e+"-all");a.text(o).attr("data-action","list-"+e+"-all"),PF.fn.close_pops()},updateItem:function(e,t,a,o){if(e instanceof jQuery==0)e=$(e);var i=e.data("type"),n="image"==i?t.album:t;if(this.addAlbumtoModals(n),$("option[value="+n.id_encoded+"]","[name=form-album-id]").html(PF.fn.htmlEncode(n.name_with_privacy_readable_html)),void 0===a)a="edit";if("edit"==a||"move"==a){if("move"==a&&"album"==CHV.obj.resource.type)return void CHV.fn.list_editor.moveFromList(e,o);e.attr("data-description",t.description),"image"==i?(void 0!==t.title&&(e.attr("data-title",t.title),e.find("[title]").attr("title",t.title),$("[data-text=image-title]",e).text(PF.fn.htmlEncode(t.title))),void 0!==t.title_truncated&&$("[data-text=image-title-truncated]",e).html(PF.fn.htmlEncode(t.title_truncated)),void 0!==t.category_id&&e.attr("data-category-id",t.category_id),e.attr({"data-album-id":n.id_encoded,"data-flag":1==t.nsfw?"unsafe":"safe"}),$("[data-content=album-link]",e).attr("href",n.url)):e.attr({"data-privacy":n.privacy,"data-password":n.password,"data-name":n.name}),e.attr("data-privacy",n.privacy),$("[data-text=album-name]",e).html(PF.fn.htmlEncode(n.name)),PF.fn.growl.expirable("edit"==a?PF.fn._s("The content has been edited."):PF.fn._s("The content has been moved."))}},addAlbumtoModals:function(e){var t=!1;$("[name=form-album-id]","[data-modal]").each(function(){e.id_encoded&&!$("option[value="+e.id_encoded+"]",this).exists()&&($(this).append('"),t=!0)}),t&&CHV.fn.list_editor.updateUserCounters("album",1,"+")},updateAlbum:function(e){$("[data-id="+e.id_encoded+"]").each(function(){""!==e.html&&($(this).after(e.html),$(this).remove())})},updateUserCounters:function(e,t,a){if(void 0===a)a="+";var o,i,n=$("[data-text="+e+"-count]"),s=$("[data-text="+e+"-label]"),r=(t=parseInt(t),parseInt(n.html()));switch(a){case"+":o=r+t;break;case"-":o=r-t;break;case"=":o=t}i=o-r;var l=$("[data-text=total-"+n.data("text")+"]"),d=$("[data-text="+l.data("text")+"-label]"),c=parseInt(l.html()),u=c+i;n.text(o),l.text(u),s.text(s.data(1==o?"label-single":"label-plural")),d.text(s.data(1==u?"label-single":"label-plural"))},updateMoveItemLists:function(e,t,a){if(CHV.fn.list_editor.clearSelection(),/image/.test(t))"image"==t?CHV.fn.list_editor.updateItem("[data-type=image][data-id="+a.data("id")+"]",e.image,"move"):(a.each(function(){CHV.fn.list_editor.updateItem("[data-type=image][data-id="+$(this).data("id")+"]",e,"move",!1)}),PF.fn.growl.expirable(PF.fn._s("The content has been moved.")));else{if(CHV.fn.list_editor.moveFromList(a,!1),PF.fn.growl.expirable(PF.fn._s("The content has been moved.")),e.album)if(void 0!==e.albums_old?"true"==e.request.album.new:"true"==e.request.editing.new_album){CHV.fn.list_editor.addAlbumtoModals(e.album);var o=parseInt($("[data-text=album-count]").text())-1;$(PF.obj.listing.selectors.pad_content).each(function(){var t=$(this).find(PF.obj.listing.selectors.list_item).length;if(0!=t){var a=PF.fn.deparam($(this).closest(PF.obj.listing.selectors.content_listing).data("params"));"date_desc"!=a.sort&&o!=t||$(this)["date_desc"==a.sort?"prepend":"append"](e.album.html)}})}else CHV.fn.list_editor.updateAlbum(e.album);PF.fn.listing.columnizerQueue(),PF.fn.listing.refresh(0)}}},CHV.fn.import={errorHandler:function(e){PF.fn.growl.call(e.error.message)},reset:function(e){e=parseInt(e);CHV.obj.import.working[e].stats=$.ajax({type:"POST",data:{action:"importReset",id:e}}),CHV.obj.import.working[e].stats.complete(function(t){var a=t.responseJSON;if(a){var o=CHV.fn.import.parseTemplate(a.import);$("[data-id="+a.import.id+"]",CHV.obj.import.sel.root).replaceWith(o),"working"!=a.import.status&&clearInterval(CHV.obj.import.working[e].interval)}})},updateStats:function(e){e=parseInt(e);"readyState"in CHV.obj.import.working[e].stats&&4!=CHV.obj.import.working[e].stats.readyState?console.log("Aborting stats timeout call (previous call is still not ready)"):(CHV.obj.import.working[e].stats=$.ajax({type:"POST",data:{action:"importStats",id:e}}),CHV.obj.import.working[e].stats.complete(function(t){var a=t.responseJSON;if(a){var o=CHV.fn.import.parseTemplate(a.import);$("[data-id="+a.import.id+"]",CHV.obj.import.sel.root).replaceWith(o),"working"!=a.import.status&&clearInterval(CHV.obj.import.working[e].interval)}}))},delete:{submit:function(e){return PF.obj.modal.form_data={action:"importDelete",id:e},!0},deferred:{success:function(e){var t=e.responseJSON;PF.fn.growl.call(PF.fn._s("Import ID %s removed",t.import.id)),$("[data-id="+t.import.id+"]",CHV.obj.import.sel.root).remove(),1==$("li",CHV.obj.import.sel.root).size()&&$(CHV.obj.import.sel.root).addClass("hidden")},error:function(e){CHV.fn.import.errorHandler(e.responseJSON)}}},parseTemplate:function(e,t){var a=CHV.obj.import.rowTpl;for(var o in CHV.obj.import.importTr)void 0!==e[o]&&(a=a.replaceAll("%"+o+"%",e[o]));a=a.replaceAll("%parse%",e.options.root),a=a.replaceAll("%shortParse%",e.options.root.charAt(0)),a=a.replaceAll("%displayStatus%",CHV.obj.import.statusesDisplay[e.status]);var i=$($.parseHTML(a)).attr("data-object",JSON.stringify(e));return i}},CHV.fn.Palettes={timeout:{},get:function(){return($("html").get(0).className.match(/(^|\s)palette-\S+/g)||[]).join(" ")},set:function(e){$("html").attr("data-palette",e).removeClass(this.get()).addClass("palette-"+e)},preview:function(e){$("html").removeClass(this.get()).addClass("palette-"+e)},save:function(){clearTimeout(this.timeout),this.timeout=setTimeout(function(){$.ajax({type:"POST",data:{action:"paletteSet",palette_id:CHV.obj.config.palettesId[$("html").attr("data-palette")]},cache:!1})},400)}},CHV.fn.license={set:{submit:function(){var e=$(PF.obj.modal.selectors.root),t=!0;return $.each($(":input",e),function(e,a){""==$(this).val()&&$(this).attr("required")&&($(this).highlight(),t=!1)}),t?(PF.obj.modal.form_data={action:"set-license-key",key:$("[name=chevereto-license-key]",e).val()},!0):(PF.fn.growl.call(PF.fn._s("Please fill all the required fields.")),!1)},complete:{success:function(e){let t=e.responseJSON,a=$("[data-action=upgrade]");if("free"===CHV.obj.system_info.edition)return a.removeClass("hidden"),void a.trigger("click");PF.fn.growl.call(PF.fn._s(t.success.message))},error:function(e){var t=e.responseJSON;PF.fn.growl.call(PF.fn._s(t.error.message))}}}}; \ No newline at end of file +$(function(){function e(e){e=e.originalEvent;var t=!1;if(e.dataTransfer.types)for(var a=0;ae&&(a.height(e),a.closest(".antiscroll-wrap").antiscroll())}}function a(e){e.addClass("list-item-play-gif--loading");var t=e.closest(PF.obj.listing.selectors.list_item),a=$(".image-container",t),o=$("img",a),i=o.attr("src"),n=".md",r=i.lastIndexOf(n);if(-1==r)n=".th",r=i.lastIndexOf(n);var s=i.substr(0,r)+i.substr(r+n.length,i.length);a.append(a.html()),$load=t.find(".image-container img").eq(1).attr("src",s).addClass("hidden"),$load.imagesLoaded(function(){e.remove(),o.remove(),$("img",a).show(),$(this.elements).removeClass("hidden")})}function o(e,t){var a=$(e).closest(PF.obj.listing.selectors.list_item);CHV.fn.list_editor.blink(a),CHV.fn.list_editor.toggleSelectItem(a),PF.fn.keyFeedback.spawn(t),t.preventDefault(),t.stopPropagation()}var i,n=$(window).width();$(window).height();if($(window).resize(function(e){clearTimeout(i),i=setTimeout(function(){$("body#image").exists()&&n!=$(window).width()&&CHV.fn.image_viewer_full_fix(),CHV.fn.uploader.boxSizer(),CHV.fn.bindSelectableItems(),CHV.fn.listingViewer.placeholderSizing(),n=$(window).width(),$(window).height()},10)}),window.opener&&($(window).on("load",function(e){window.opener.postMessage({id:window.name,requestAction:"postSettings"},"*")}),$(window).on("message",function(e){var t=e.originalEvent.data;void 0!==t.id&&void 0!==t.settings&&window.name===t.id&&(CHV.obj.opener.uploadPlugin[t.id]=t.settings)})),$("#home-cover, #maintenance-wrapper, #login").exists()){var r=$("#maintenance-wrapper").exists()?$("#maintenance-wrapper").css("background-image").slice(4,-1).replace(/^\"|\"$/g,""):$(".home-cover-img","#home-cover-slideshow").first().attr("data-src");function s(){$("body").addClass("load"),$("#maintenance-wrapper").exists()||$(".home-cover-img","#home-cover-slideshow").first().css("background-image","url("+r+")").addClass("animate-in--alt").removeAttr("data-src"),setTimeout(function(){setTimeout(function(){$("body").addClass("loaded")},1200),setTimeout(function(){d()},7e3)},600)}var l=function(){setTimeout(function(){d()},8e3)};function d(){var e=$(".home-cover-img[data-src]","#home-cover-slideshow").first(),t=$(".home-cover-img","#home-cover-slideshow");if(0==e.length){if(1==t.length)return;t.first().removeClass("animate-in"),$("#home-cover-slideshow").append(t.first()),setTimeout(function(){$(".home-cover-img:last","#home-cover-slideshow").addClass("animate-in")},20),setTimeout(function(){$(".home-cover-img:not(:last)","#home-cover-slideshow").removeClass("animate-in")},4e3),l()}else{var a=e.attr("data-src");$("").attr("src",a).on("load error",function(){$(this).remove(),e.css("background-image","url("+a+")").addClass("animate-in").removeAttr("data-src"),setTimeout(function(){$(".home-cover-img:not(:last)","#home-cover-slideshow").removeClass("animate-end animate-in--alt")},2e3),l()})}}r?$("").attr("src",r).on("load error",function(){$(this).remove(),s()}):s()}var c,u=CHV.fn.uploader.selectors.root,m=CHV.fn.uploader.selectors.queue,f=$(u),p=$(m);if($(document).on("click","[data-action=top-bar-upload]",function(e){$("body").is("#upload")||"js"!==$(this).data("link")||CHV.fn.uploader.toggle({reset:!1}),"page"!==$(this).data("link")&&(e.preventDefault(),e.stopPropagation())}),$(document).on("click mouseover mouseout","[data-action=palette]",function(e){clearTimeout(c),e.preventDefault();var t=$(this).data("palette");switch(e.type){case"mouseover":c=setTimeout(function(){CHV.fn.Palettes.preview(t)},1e3);break;case"mouseout":t=$("html").attr("data-palette")||"",CHV.fn.Palettes.set(t);break;case"click":e.stopPropagation(),$("[data-action=palette]","[data-content=palettes]").removeClass("current"),$(this).addClass("current"),CHV.fn.Palettes.set(t),CHV.fn.Palettes.save()}}),$(document).on("change","#palettes",function(e){CHV.fn.Palettes.set(this.value),CHV.fn.Palettes.save()}),$("[data-action=close-upload]",f).click(function(){f.is(":animated")||$("[data-action=top-bar-upload]","#top-bar").trigger("click")}),$("[data-action=reset-upload]",f).click(function(){CHV.fn.uploader.isUploading&&$("[data-action=cancel-upload-remaining], [data-action=cancel-upload]",f).trigger("click"),CHV.fn.uploader.reset()}),$("[data-action=cancel-upload-remaining], [data-action=cancel-upload]",f).click(function(){CHV.fn.uploader.isUploading=!1,$("[data-action=cancel]",p).click(),Object.size(CHV.fn.uploader.results.success)>0?CHV.fn.uploader.displayResults():CHV.fn.uploader.reset()}),$(document).on("click","[data-action=upload-privacy]:not(disabled)",function(e){e.isDefaultPrevented()||(current_privacy=$(this).data("privacy"),target_privacy="public"==current_privacy?"private":"public",this_lock=$(".icon",this).data("lock"),this_unlock=$(".icon",this).data("unlock"),$(".icon",this).removeClass(this_lock+" "+this_unlock).addClass("public"==current_privacy?this_lock:this_unlock),$(this).data("privacy",target_privacy),$("[data-action=upload-privacy-copy]").html($("[data-action=upload-privacy]").html()),$upload_button=$("[data-action=upload]",f),$upload_button.text($upload_button.data(target_privacy)),$(this).tipTip("hide"))}),$(CHV.fn.uploader.selectors.file+", "+CHV.fn.uploader.selectors.camera).on("change",function(e){$(CHV.fn.uploader.selectors.root).data("shown")?CHV.fn.uploader.add(e):CHV.fn.uploader.toggle({callback:function(e){CHV.fn.uploader.add(e)}},e)}).on("click",function(e){!$(this).data("login-needed")||PF.fn.is_user_logged()}),$(CHV.fn.uploader.selectors.root).exists()&&($("body").on({dragenter:function(t){if(t.preventDefault(),!e(t))return!1;$(CHV.fn.uploader.selectors.dropzone).exists()||$("body").append($('
    ').css({width:"100%",height:"100%",position:"fixed",zIndex:1e3,left:0,top:0}))}}),$(document).on({dragover:function(t){if(t.preventDefault(),!e(t))return!1;$(CHV.fn.uploader.selectors.root).data("shown")||CHV.fn.uploader.toggle({reset:!1})},dragleave:function(e){$(CHV.fn.uploader.selectors.dropzone).remove(),$.isEmptyObject(CHV.fn.uploader.files)&&CHV.fn.uploader.toggle()},drop:function(e){e.preventDefault(),CHV.fn.uploader.add(e),$(CHV.fn.uploader.selectors.dropzone).remove()}},CHV.fn.uploader.selectors.dropzone)),$(document).on("keyup change","[data-action=resize-combo-input]",function(e){var t=$(this).closest("[data-action=resize-combo-input]"),a=$("[name=form-width]",t),o=$("[name=form-height]",t),i=a.data("initial")/o.data("initial"),n={width:Math.round(a.prop("value")/i),height:Math.round(o.prop("value")*i)};$(e.target).is(a)?o.prop("value",Math.round(n.width)):a.prop("value",Math.round(n.height))}),$(document).on("click",m+" [data-action=edit]",function(){var e=$(this).closest("li"),t=(e.closest("ul"),e.data("id")),a=CHV.fn.uploader.files[t];media=a.type.substring(0,a.type.indexOf("/"));for(var o=PF.obj.modal.selectors.root,i=$.extend({},a.formValues||a.parsedMeta),n=["album_id","category_id","nsfw"],r=0;re.height&&(n.height=e.height,n.width=Math.round(n.height*r)),n.width>e.width&&(n.width=e.width,n.height=Math.round(n.width/r)),$.each(i,function(e,t){var i="[name=form-"+e.replace(/_/g,"-")+"]",r=$(i,o);if(!r.exists())return!0;if(r.is(":checkbox"))r.prop("checked",r.attr("value")==t);else if(r.is("select")){var s=r.find("[value="+t+"]");s.exists()||(s=r.find("option:first")),s.prop("selected",!0)}else r.prop("value",t);if("width"==e||"height"==e){var l=n[e],d=a.parsedMeta[e]>l?l:a.parsedMeta[e];r.prop("max",d).data("initial",a.parsedMeta[e]).prop("value",d),"image"!==media&&r.prop("disabled",!0).closest("[data-action=resize-combo-input]").hide()}}),"image/gif"!==a.parsedMeta.mimetype&&$("[ data-content=animated-gif-warning]",o).remove(),$(".image-preview",o).append($("",{class:"canvas checkered-background"}));var s=$(".queue-item[data-id="+t+"] .preview .canvas")[0],l=$(".image-preview .canvas",o)[0];l.width=s.width,l.height=s.height;var d=l.getContext("2d");d.drawImage(s,0,0)},confirm:function(){if(PF.fn.form_modal_has_changed()){var e=!1;return $.each(["width","height"],function(t,a){var i=$("[name=form-"+a+"]",o),n=parseInt(i.val()),r=parseInt(i.attr("min")),s=parseInt(i.attr("max"));if(n>s||n-1&&CHV.fn.uploader.clipboardImages.splice(r,1)}delete CHV.fn.uploader.files[a],CHV.fn.uploader.queueSize(),0==Object.size(CHV.fn.uploader.files)?"success"in CHV.fn.uploader&&"results"in CHV.fn.uploader&&(0!=Object.size(CHV.fn.uploader.results.success)||0!=Object.size(CHV.fn.uploader.results.error))||CHV.fn.uploader.reset():i&&0!==$("li.waiting",t).first().length&&CHV.fn.uploader.upload($("li.waiting",t).first())}}),$(document).on("click","[data-action=upload]",function(){void 0!==CHV.obj.logged_user||!1!==$("#upload-tos").prop("checked")?($("[data-group=upload], [data-group=upload-queue-ready]",f).hide(),f.removeClass("queueReady").addClass("queueUploading").find("[data-group=uploading]").show(),CHV.fn.uploader.queueSize(),CHV.fn.uploader.canAdd=!1,$queue_items=$("li",p),$queue_items.addClass("uploading waiting"),CHV.fn.uploader.timestamp=(new Date).getTime(),CHV.fn.uploader.upload($queue_items.first("li"))):PF.fn.growl.call("You must agree to the terms and privacy policy")}),$("body#user").exists()&&PF.obj.listing.query_string.page>1){var g=History.getState();if(g.data&&void 0!==g.data.scrollTop)$(window).scrollTop()!==g.data.scrollTop&&$(window).scrollTop(g.data.scrollTop);else{var h=$("#background-cover").height()-160;$("html, body").animate({scrollTop:h},0)}}$("#top-bar-shade").exists()&&$("#top-bar-shade").css("opacity")&&$("#top-bar-shade").data("initial-opacity",Number($("#top-bar-shade").css("opacity"))),CHV.fn.bindSelectableItems(),$("body#image").exists()&&($(CHV.obj.image_viewer.selector+" [data-load=full]").length>0&&($(document).on("click",CHV.obj.image_viewer.loader,function(e){CHV.fn.viewerLoadImage()}),$(CHV.obj.image_viewer.loader).data("size")>CHV.obj.config.image.load_max_filesize.getBytes()?$(CHV.obj.image_viewer.loader).css("display","block"):CHV.fn.viewerLoadImage()),new MutationObserver(()=>{$("html").height()>$(window).innerHeight()&&!$("html").hasClass("scrollbar-y")&&($("html").addClass("scrollbar-y"),$(document).data({width:$(this).width(),height:$(this).height()}))}).observe(document,{childList:!0}),$(document).on("keyup",function(e){var t=$(e.target),a=e.originalEvent;if(!t.is(":input")&&CHV.obj.image_viewer.$navigation.exists()&&("ArrowLeft"==a.key||"ArrowRight"==a.key)){var o=$("[data-action="+("ArrowLeft"==a.key?"prev":"next")+"]",CHV.obj.image_viewer.$navigation).attr("href");void 0!==o&&""!==o&&(window.location=$("[data-action="+("ArrowLeft"==a.key?"prev":"next")+"]",CHV.obj.image_viewer.$navigation).attr("href"))}})),$(document).on("click",CHV.obj.image_viewer.container+" img",function(e){if($(CHV.obj.image_viewer.loader).exists()&&$(CHV.obj.image_viewer.loader).trigger("click"),$(this).hasClass("cursor-zoom-in")||$(this).hasClass("cursor-zoom-out")){var t=$(this).hasClass("cursor-zoom-in");if($(this).removeClass("cursor-zoom-in cursor-zoom-out"),t){var a,o=$(this).attr("width"),i=$(this).attr("height"),n=o/i;o>$(window).width()?($(this).css("width","100%"),a=$(this).width(),$(this).css("width",o)):a=$(this).attr("width"),$(this).addClass("cursor-zoom-out").css({width:a,height:a/n+"px"}),$("#image-viewer-container").css("height","")}else $(this).addClass("cursor-zoom-in"),image_viewer_full_fix();e.preventDefault()}}).on("contextmenu",CHV.obj.image_viewer.container,function(e){if(!CHV.obj.config.image.right_click)return e.preventDefault(),!1}),$(document).on("contextmenu","html.device-mobile a.image-container",function(e){e.preventDefault(),e.stopPropagation()}),$(document).on("keyup","input[data-dashboard-tool]",function(e){if(13==e.keyCode){var t=$("[data-action="+$(this).data("dashboard-tool")+"]");t.click()}}),$(document).on("click","[data-action=dashboardTool]",function(e){e.preventDefault();var t=$(this).data("tool"),a=$(this).data("data"),o=$.extend({},a),i={};for(var n in o){var r=$(o[n]).val();if($(o[n]).prop("disabled")||!r)return;i[n]=$(o[n]),o[n]=r}o.action=t;var s={type:"GET",cache:!1};s.data=o;var l,d=$(this).closest(".input-label"),c=!0;if(0!=c){for(var n in i);PF.fn.loading.inline($(".loading",d),{size:"small",valign:"middle"}),d.find(".btn .text").hide(),$.ajax(s).complete(function(e){var t=e.responseJSON;$(".loading",d).empty(),d.find(".btn .text").show(),200!=t.status_code||void 0===t.success.redirURL?PF.fn.growl.call(t[200==t.status_code?"success":"error"].message):window.location.href=t.success.redirURL})}else PF.fn.growl.expirable(l)}),$(document).on("click","[data-action=openerPostMessage]",function(e){if(window.opener){e.preventDefault();var t="data-action-target",a=$($(this).is("["+t+"]")?$(this).attr(t):this),o=a[a.is(":input")?"val":"html"]();window.opener.postMessage({id:window.name,message:o},"*")}}),$(document).on("click","[data-action=list-tools] [data-action]",function(e){var t=$(e.target),a=t.closest("[data-id]");a&&a.find("[data-action=select]").exists()&&(e.ctrlKey||e.metaKey)&&e.altKey&&(CHV.fn.list_editor.toggleSelectItem(a,!a.hasClass("selected")),e.preventDefault(),e.stopPropagation())}),PF.fn.listing.ajax.callback=function(e){200===e.status&&CHV.fn.list_editor.listMassActionSet("select")},$(document).on("click","[data-action=list-select-all]",function(e){if($(this).closest(".disabled").exists())return!1;CHV.fn.list_editor.selectAll(e)}),$(document).on("click","[data-action=list-clear-all]",function(){CHV.fn.list_editor.clearSelection()}),$(document).on("click","[data-action=share]",function(e){if(!$(PF.obj.modal.selectors.box).exists()){var t,a,o,i,n,r;t=$(".viewer:visible").exists()?$(PF.obj.listing.selectors.list_item+"[data-id="+$(".viewer").attr("data-id")+"]",".content-listing").first():$(this).closest(PF.obj.listing.selectors.list_item).first();var s="#modal-share";if(t.exists()){if(r=CHV.fn.modal.getTemplateWithPreview(s,t),void 0===t.attr("data-type"))return void console.error("Error: data-type not defined");n=t.find(".list-item-desc-title-link").first(),o=t.find(".image-container img").first().attr("src"),a=t.attr("data-url-short")}else r=$(s).html(),dealing_with=CHV.obj.resource.type,a=window.location.href,o=$("#image-viewer-container").find("img").first().attr("src"),n=$(".header > h1 > a");i=PF.fn.htmlEncode(n.text());var l=t.data("privacy")||CHV.obj.resource.privacy,d="";switch(l){case"private_but_link":d=PF.fn._s("Note: This content is private but anyone with the link will be able to see this.");break;case"password":d=PF.fn._s("Note: This content is password protected. Remember to pass the content password to share.");break;case"private":d=PF.fn._s('Note: This content is private. Change privacy to "public" to share.')}r=r.replaceAll("__url__",a).replaceAll("__image__",o).replaceAll("__title__",i).replaceAll("__privacy__",l).replaceAll("__privacy_notes__",d),PF.fn.modal.call({type:"html",buttons:!1,template:r})}}),$(document).on("click","[data-action=list-tools] [data-action]",function(e){if(e.isPropagationStopped())return!1;var t;t=$(".viewer:visible").exists()?$(PF.obj.listing.selectors.list_item+"[data-id="+$(".viewer").attr("data-id")+"]",".content-listing").first():$(this).closest(PF.obj.listing.selectors.list_item).first();var a=t.attr("data-id");if(void 0!==t.attr("data-type")){o=t.attr("data-type");var o,i=$("[data-type="+o+"][data-id="+a+"]");switch($(this).data("action")){case"select":CHV.fn.list_editor.toggleSelectItem(t,!t.hasClass("selected"));break;case"edit":var n="[data-modal=form-edit-single]";switch(o){case"image":$("[name=form-image-title]",n).attr({value:t.attr("data-title"),autocomplete:"off"}),$("[name=form-image-description]",n).html(PF.fn.htmlEncode(t.data("description"))),$("[name=form-album-id]",n).find("option").removeAttr("selected"),$("[name=form-album-id]",n).find("[value="+t.data("image"==o?"album-id":"id")+"]").attr("selected",!0),$("[name=form-category-id]",n).find("option").removeAttr("selected"),$("[name=form-category-id]",n).find("[value="+t.data("category-id")+"]").attr("selected",!0),$("[name=form-nsfw]",n).attr("checked","unsafe"==t.data("flag")),$("[name=form-album-name]",n).attr({value:"",autocomplete:"off"}),$("[name=form-album-description]",n).html(""),$("[name=form-privacy]",n).find("option").removeAttr("selected");break;case"album":$("[data-action=album-switch]",n).remove(),$("[name=form-album-name]",n).attr({value:t.data("name"),autocomplete:"off"}),$("[name=form-album-description]",n).html(PF.fn.htmlEncode(t.data("description"))),$("[name=form-privacy]",n).find("option").removeAttr("selected"),$("[name=form-privacy]",n).find("[value="+t.data("privacy")+"]").attr("selected",!0),"password"==t.data("privacy")?($("[data-combo-value=password]").show(),$("[name=form-album-password]",n).attr("value",t.data("password"))):($("[data-combo-value=password]").hide(),$("[name=form-album-password]",n).attr("value",""))}PF.fn.modal.call({type:"html",template:CHV.fn.modal.getTemplateWithPreview(n,t),ajax:{url:PF.obj.config.json_api,deferred:{success:function(e){CHV.fn.list_editor.updateItem("[data-type="+o+"][data-id="+a+"]",e.responseJSON[o],"edit")}}},confirm:function(){var e=$(PF.obj.modal.selectors.root);if(("image"==o||"album"==o)&&$("[data-content=form-new-album]",e).is(":visible")&&""==$("[name=form-album-name]",e).val())return PF.fn.growl.call(PF.fn._s("You must enter the album name.")),$("[name=form-album-name]",e).highlight(),!1;if(PF.fn.form_modal_has_changed()){switch(PF.obj.modal.form_data={action:"edit",edit:t.data("type"),single:!0,owner:CHV.obj.resource.user.id,editing:{id:a,description:$("[name=form-"+o+"-description]",e).val()}},o){case"image":PF.obj.modal.form_data.editing.title=$("[name=form-image-title]",e).val(),PF.obj.modal.form_data.editing.category_id=$("[name=form-category-id]",e).val()||null,PF.obj.modal.form_data.editing.nsfw=$("[name=form-nsfw]",e).prop("checked")?1:0;break;case"album":PF.obj.modal.form_data.editing.name=$("[name=form-album-name]",e).val(),PF.obj.modal.form_data.editing.privacy=$("[name=form-privacy]",e).val(),"password"==PF.obj.modal.form_data.editing.privacy&&(PF.obj.modal.form_data.editing.password=$("[name=form-album-password]",e).val())}return PF.obj.modal.form_data.editing.new_album=$("[data-content=form-new-album]",e).is(":visible"),PF.obj.modal.form_data.editing.new_album?(PF.obj.modal.form_data.editing.album_name=$("[name=form-album-name]",e).val(),PF.obj.modal.form_data.editing.album_privacy=$("[name=form-privacy]",e).val(),"password"==PF.obj.modal.form_data.editing.album_privacy&&(PF.obj.modal.form_data.editing.album_password=$("[name=form-album-password]",e).val()),PF.obj.modal.form_data.editing.album_description=$("[name=form-album-description]",e).val()):PF.obj.modal.form_data.editing.album_id=$("[name=form-album-id]",e).val(),!0}PF.fn.modal.close()}});break;case"create-album":case"move":var r="move"==$(this).data("action")?"form-move-single":"form-create-album";n="[data-modal="+r+"]";$("[name=form-album-id]",n).find("option").removeAttr("selected"),$("[name=form-album-id]",n).find("[value="+t.data("image"==o?"album-id":"id")+"]").attr("selected",!0),$("[name=form-album-name]",n).attr({value:"",autocomplete:"off"}),$("[name=form-album-description]",n).html(""),$("[name=form-privacy]",n).find("option").removeAttr("selected"),PF.fn.modal.call({type:"html",template:CHV.fn.modal.getTemplateWithPreview(n,i),ajax:{url:PF.obj.config.json_api,deferred:{success:function(e){CHV.fn.list_editor.updateMoveItemLists(e.responseJSON,o,i)}}},load:function(){},confirm:function(){var e=$(PF.obj.modal.selectors.root);return $("[data-content=form-new-album]",e).is(":visible")&&""==$("[name=form-album-name]",e).val()?(PF.fn.growl.call(PF.fn._s("You must enter the album name.")),$("[name=form-album-name]",e).highlight(),!1):PF.fn.form_modal_has_changed()?(PF.obj.modal.form_data={action:"edit",edit:t.data("type"),single:!0,owner:CHV.obj.resource.user.id,editing:{id:a}},PF.obj.modal.form_data.editing.new_album=$("[data-content=form-new-album]",e).is(":visible"),PF.obj.modal.form_data.editing.new_album?(PF.obj.modal.form_data.editing.album_name=$("[name=form-album-name]",e).val(),PF.obj.modal.form_data.editing.album_privacy=$("[name=form-privacy]",e).val(),"password"==PF.obj.modal.form_data.editing.album_privacy&&(PF.obj.modal.form_data.editing.album_password=$("[name=form-album-password]",e).val()),PF.obj.modal.form_data.editing.album_description=$("[name=form-album-description]",e).val()):PF.obj.modal.form_data.editing.album_id=$("[name=form-album-id]",e).val(),!0):void PF.fn.modal.close()}});break;case"approve":PF.fn.modal.call({type:"html",template:CHV.fn.modal.getTemplateWithPreview("[data-modal=form-approve-single]",t),button_submit:PF.fn._s("Confirm"),ajax:{url:PF.obj.config.json_api,deferred:{success:function(e){CHV.fn.list_editor.removeFromList(t,PF.fn._s("The content has been approved."))}}},confirm:function(){return PF.obj.modal.form_data={action:"approve",single:!0,approve:t.data("type"),approving:{id:a}},!0}});break;case"delete":PF.fn.modal.call({type:"html",template:CHV.fn.modal.getTemplateWithPreview("[data-modal=form-delete-single]",t),button_submit:PF.fn._s("Confirm"),ajax:{url:PF.obj.config.json_api,deferred:{success:function(e){"album"==o&&($("[name=form-album-id]","[data-modal]").find("[value="+a+"]").remove(),CHV.fn.list_editor.updateUserCounters("image",e.responseJSON.success.affected,"-")),CHV.fn.list_editor.deleteFromList(t),CHV.fn.listingViewer.close()}}},confirm:function(){return PF.obj.modal.form_data={action:"delete",single:!0,delete:t.data("type"),deleting:{id:a}},!0}});break;case"flag":$.ajax({type:"POST",data:{action:"edit",edit:"image",single:!0,editing:{id:a,nsfw:"unsafe"==t.data("flag")?0:1}}}).complete(function(e){var t=e.responseJSON;if(200==t.status_code){var a=1==t.image.nsfw?"unsafe":"safe";i.attr("data-flag",a).data("flag",a)}else PF.fn.growl.call(t.error.message);CHV.fn.list_editor.selectionCount()})}}else console.error("Error: data-type not defined")}),$(".pop-box-menu a","[data-content=list-selection]").click(function(e){var t=$(PF.obj.listing.selectors.content_listing_visible);if(void 0!==t.data("list")){dealing_with=t.data("list");var a=$(PF.obj.listing.selectors.list_item+".selected",t),o=$.map(a,function(e,t){return $(e).data("id")});switch(PF.fn.close_pops(),"list-select-all"!==$(this).data("action")&&e.stopPropagation(),$(this).data("action")){case"get-embed-codes":var i="[data-modal=form-embed-codes]",n=[];$("textarea",i).html(""),a.each(function(){var e={image:JSON.parse(decodeURIComponent($(this).data("object")))};"url"in e.image&&n.push(e)}),CHV.fn.fillEmbedCodes(n,i,"html"),PF.fn.modal.call({type:"html",template:CHV.fn.modal.getTemplateWithPreviews(i,a),buttons:!1});break;case"clear":CHV.fn.list_editor.clearSelection();break;case"list-select-all":CHV.fn.list_editor.selectAll(e);break;case"move":case"create-album":i="move"==$(this).data("action")?"form-move-multiple":"form-create-album";var r="[data-modal="+i+"]",s=/image/.test(dealing_with)?"album-id":"id";$("[name=form-album-id]",r).find("[value=null]").remove(),$("[name=form-album-id]",r).find("option").removeAttr("selected"),$("[name=form-album-name]",r).attr({value:"",autocomplete:"off"}),$("[name=form-album-description]",r).html(""),$("[name=form-privacy]",r).find("option").removeAttr("selected");var l=a.first().data(s),d=!0;a.each(function(){if($(this).data(s)!==l)return d=!1,!1}),d||$("[name=form-album-id]",r).prepend('"),$("[name=form-album-id]",r).find("[value="+(d?a.first().data(s):"null")+"]").attr("selected",!0),PF.fn.modal.call({type:"html",template:CHV.fn.modal.getTemplateWithPreviews(r,a),ajax:{url:PF.obj.config.json_api,deferred:{success:function(e){CHV.fn.list_editor.updateMoveItemLists(e.responseJSON,dealing_with,a)}}},load:function(){},confirm:function(){var e=$(PF.obj.modal.selectors.root),t=!1;if($("[data-content=form-new-album]",e).is(":visible")&&""==$("[name=form-album-name]",e).val())return PF.fn.growl.call(PF.fn._s("You must enter the album name.")),$("[name=form-album-name]",e).highlight(),!1;if($("[data-content=form-new-album]",e).is(":visible")&&(t=!0),PF.fn.form_modal_has_changed()){return PF.obj.modal.form_data={action:t?"create-album":"move",type:dealing_with,owner:CHV.obj.resource.user.id,multiple:!0,album:{ids:o,new:t}},t?(PF.obj.modal.form_data.album.name=$("[name=form-album-name]",e).val(),PF.obj.modal.form_data.album.privacy=$("[name=form-privacy]",e).val(),"password"==PF.obj.modal.form_data.album.privacy&&(PF.obj.modal.form_data.album.password=$("[name=form-album-password]",e).val()),PF.obj.modal.form_data.album.description=$("[name=form-album-description]",e).val()):PF.obj.modal.form_data.album.id=$("[name=form-album-id]",e).val(),!0}PF.fn.modal.close()}});break;case"approve":PF.fn.modal.call({template:CHV.fn.modal.getTemplateWithPreviews("[data-modal=form-approve-multiple]",a),button_submit:PF.fn._s("Confirm"),ajax:{url:PF.obj.config.json_api,deferred:{success:function(e){CHV.fn.list_editor.removeFromList(a,PF.fn._s("The content has been approved."))}}},confirm:function(){return PF.obj.modal.form_data={action:"approve",from:"list",approve:dealing_with,multiple:!0,approving:{ids:o}},!0}});break;case"delete":PF.fn.modal.call({template:CHV.fn.modal.getTemplateWithPreviews("[data-modal=form-delete-multiple]",a),button_submit:PF.fn._s("Confirm"),ajax:{url:PF.obj.config.json_api,deferred:{success:function(e){"albums"==dealing_with&&(a.each(function(){$("[name=form-album-id]","[data-modal]").find("[value="+$(this).data("id")+"]").remove()}),CHV.fn.list_editor.updateUserCounters("image",e.responseJSON.success.affected,"-")),CHV.fn.list_editor.deleteFromList(a)}}},confirm:function(){return PF.obj.modal.form_data={action:"delete",from:"list",delete:dealing_with,multiple:!0,deleting:{ids:o}},!0}});break;case"assign-category":var c=a.first().data("category-id"),u=!0;a.each(function(){if($(this).data("category-id")!==c)return u=!1,!1}),PF.fn.modal.call({type:"html",template:CHV.fn.modal.getTemplateWithPreviews("[data-modal=form-assign-category]",a),forced:!0,ajax:{url:PF.obj.config.json_api,deferred:{success:function(e){a.each(function(){var t=e.responseJSON;$(this).data("category-id",t.category_id)}),CHV.fn.list_editor.clearSelection()}}},confirm:function(){var e=$(PF.obj.modal.selectors.root),t=$("[name=form-category-id]",e).val()||null;return u&&c==t?(PF.fn.modal.close(function(){CHV.fn.list_editor.clearSelection()}),!1):(PF.obj.modal.form_data={action:"edit-category",from:"list",multiple:!0,editing:{ids:o,category_id:t}},!0)}});break;case"flag-safe":case"flag-unsafe":var m=$(this).data("action"),f="flag-safe"==m?"safe":"unsafe";PF.fn.modal.call({template:CHV.fn.modal.getTemplateWithPreviews("[data-modal=form-"+m+"]",a),button_submit:PF.fn._s("Confirm"),ajax:{url:PF.obj.config.json_api,deferred:{success:function(e){a.each(function(){$(this).removeClass("safe unsafe").addClass(f).removeAttr("data-flag").attr("data-flag",f).data("flag",f)}),CHV.fn.list_editor.clearSelection()}}},confirm:function(){return PF.obj.modal.form_data={action:m,from:"list",multiple:!0,editing:{ids:o,nsfw:"flag-safe"==m?0:1}},!0}})}return!PF.fn.isDevice(["phone","phablet"])&&void 0}console.error("Error: data-list not defined")}),$(document).on("click","[data-action=disconnect]",function(){var e=$(this),t=e.data("connection");PF.fn.modal.confirm({message:e.data("confirm-message"),ajax:{data:{action:"disconnect",disconnect:t,user_id:CHV.obj.resource.user.id},deferred:{success:function(e){var a=e.responseJSON;$("[data-connection="+t+"]").fadeOut(function(){$($("[data-connect="+t+"]")).fadeIn(),$(this).remove(),0==$("[data-connection]").length&&$("[data-content=empty-message]").show(),PF.fn.growl.expirable(a.success.message)}),""!==a.success.redirect&&(window.location.href=a.success.redirect)},error:function(e){var t=e.responseJSON;PF.fn.growl.call(t.error.message)}}}})}),$(document).on("click","[data-action=delete-avatar]",function(){var e=$(".user-settings-avatar"),t=$(".loading-placeholder",e),a=$("#top-bar");t.removeClass("hidden"),PF.fn.loading.inline(t,{center:!0}),$.ajax({type:"POST",data:{action:"delete",delete:"avatar",owner:CHV.obj.resource.user.id}}).complete(function(o){t.addClass("hidden").empty(),200==o.status?(CHV.obj.logged_user.id==CHV.obj.resource.user.id&&($("img.user-image",a).hide(),$(".default-user-image",a).removeClass("hidden")),$(".default-user-image",e).removeClass("hidden").css({opacity:0}),$('[data-action="delete-avatar"]',e).parent().addClass("soft-hidden"),$("img.user-image",e).fadeOut(function(){$(".default-user-image",e).animate({opacity:1})})):PF.fn.growl.expirable(PF.fn._s("An error occurred. Please try again later."))})}),$(document).on("change","[data-content=user-avatar-upload-input]",function(e){e.preventDefault(),e.stopPropagation();var t=$(this),a=$(".user-settings-avatar"),o=$(".loading-placeholder",".user-settings-avatar"),i=$("#top-bar"),n=$(this)[0].files[0];if(!t.data("uploading"))if(0!=/^image\/.*$/.test(n.type))if(n.size>CHV.obj.config.user.avatar_max_filesize.getBytes())PF.fn.growl.call(PF.fn._s("Please select a picture of at most %s size.",CHV.obj.config.user.avatar_max_filesize));else{var r=$('[data-action="delete-avatar"]');o.removeClass("hidden"),PF.fn.loading.inline(o,{center:!0}),t.data("uploading",!0);var s=new FormData;s.append("source",n),s.append("action","upload"),s.append("type","file"),s.append("what","avatar"),s.append("owner",CHV.obj.resource.user.id),s.append("auth_token",PF.obj.config.auth_token),avatarXHR=new XMLHttpRequest,avatarXHR.open("POST",PF.obj.config.json_api,!0),avatarXHR.send(s),avatarXHR.onreadystatechange=function(){if(4==this.readyState){ +var e="json"!==this.responseType?JSON.parse(this.response):this.response,n=e.success.image;o.addClass("hidden").empty(),200==this.status?(change_avatar=function(e){r.parent().removeClass("soft-hidden"),$("img.user-image",e).attr("src",n.url).removeClass("hidden").show()},hide_default=function(e){$(".default-user-image",e).addClass("hidden")},hide_default(a),$(".btn-alt",a).closest("div").show(),change_avatar(a),CHV.obj.logged_user.id==CHV.obj.resource.user.id&&(change_avatar(i),hide_default(i)),PF.fn.growl.expirable(PF.fn._s("Profile image updated."))):PF.fn.growl.expirable(PF.fn._s("An error occurred. Please try again later.")),t.data("uploading",!1)}}}else PF.fn.growl.call(PF.fn._s("Please select a valid image file type."))}),$(document).on("change","[data-content=user-background-upload-input]",function(e){e.preventDefault(),e.stopPropagation();var t=$(this),a=$("[data-content=user-background-cover]"),o=$("[data-content=user-background-cover-src]"),i=$(".loading-placeholder",a),n=($("#top-bar"),$(this)[0].files[0]);if(!t.data("uploading"))if(0!=/^image\/.*$/.test(n.type))if(n.size>CHV.obj.config.user.background_max_filesize.getBytes())PF.fn.growl.call(PF.fn._s("Please select a picture of at most %s size.",CHV.obj.config.user.background_max_filesize));else{i.removeClass("hidden"),PF.fn.loading.inline(i,{center:!0,size:"big",color:"#FFF"}),t.data("uploading",!0);var r=new FormData;r.append("source",n),r.append("action","upload"),r.append("type","file"),r.append("what","background"),r.append("owner",CHV.obj.resource.user.id),r.append("auth_token",PF.obj.config.auth_token),avatarXHR=new XMLHttpRequest,avatarXHR.open("POST",PF.obj.config.json_api,!0),avatarXHR.send(r),avatarXHR.onreadystatechange=function(){if(4==this.readyState){var e="json"!==this.responseType?JSON.parse(this.response):this.response,n=e.success.image;if(200==this.status){var r=$("");r.attr("src",n.url).imagesLoaded(function(){i.addClass("hidden").empty(),o.css("background-image","url("+n.url+")").hide().fadeIn(),$("[data-content=user-change-background]",a).removeClass("hidden"),$(a).removeClass("no-background"),$(".top-user").removeClass("no-background"),$("[data-content=user-upload-background]").hide(),$("[data-content=user-change-background]").show(),PF.fn.growl.expirable(PF.fn._s("Profile background image updated.")),r.remove()})}else i.addClass("hidden").empty(),PF.fn.growl.expirable(PF.fn._s("An error occurred. Please try again later."));t.data("uploading",!1)}}}else PF.fn.growl.call(PF.fn._s("Please select a valid image file type."))}),CHV.fn.user_background={delete:{submit:function(){return PF.obj.modal.form_data={action:"delete",delete:"background",owner:CHV.obj.resource.user.id},!0},deferred:{success:{before:function(e){$("[data-content=user-background-cover-src]").css("background-image","none"),$("[data-content=user-background-cover], .top-user").addClass("no-background"),$("[data-content=user-background-cover]").height(""),$("[data-content=user-upload-background]").removeClass("hidden").show(),$("[data-content=user-change-background]").hide()},done:function(e){PF.fn.modal.close(function(){PF.fn.growl.expirable(PF.fn._s("Profile background image deleted."))})}},error:function(e){PF.fn.growl.expirable(PF.fn._s("Error deleting profile background image."))}}}},CHV.fn.user_api={delete:{submit:function(){return PF.obj.modal.form_data={action:"delete",delete:"api_key",owner:CHV.obj.resource.user.id},!0},deferred:{success:{before:function(e){},done:function(e){PF.fn.modal.close(function(){location.reload()})}},error:function(e){PF.fn.growl.expirable(e.responseJSON.error.message)}}}},CHV.fn.user_two_factor={delete:{submit:function(){return PF.obj.modal.form_data={action:"delete",delete:"two_factor",owner:CHV.obj.resource.user.id},!0},deferred:{success:{before:function(e){},done:function(e){PF.fn.modal.close(function(){location.reload()})}},error:function(e){PF.fn.growl.expirable(e.responseJSON.error.message)}}}},CHV.str.mainform="[data-content=main-form]",CHV.obj.timezone={selector:"[data-content=timezone]",input:"#timezone-region"},$(document).on("keyup change",CHV.str.mainform+" :input",function(){$(this).is("[name=username]")&&$("[data-text=username]").text($(this).val())}),$(document).on("change",CHV.obj.timezone.input,function(){var e=$(this).val(),t=$("#timezone-combo-"+e);t.find("option:first").prop("selected",!0),$(CHV.obj.timezone.selector).val(t.val()).change()}),$(document).on("change","[id^=timezone-combo-]",function(){var e=$(this).val();$(CHV.obj.timezone.selector).val(e).change()}),$(document).on("keyup change blur","[name^=new-password]",function(){var e=$("[name=new-password]"),t=$("[name=new-password-confirm]"),a=e.val()==t.val(),o=t.closest(".input-password").find(".input-warning");0==o.exists()&&(o=$("[data-message=new-password-confirm]")),$(this).is(t)&&t.data("touched",!0),t.data("touched")&&o.text(a?"":o.data("text"))[a?"addClass":"removeClass"]("hidden-visibility")}),$(document).on("submit",CHV.obj.mainform,function(){switch($(this).data("type")){case"password":var e=$("[name=new-password]",this),t=$("[name=new-password-confirm]",this);if((""!==e.val()||""!==t.val())&&e.val()!==t.val())return e.highlight(),t.highlight(),PF.fn.growl.expirable(PF.fn._s("Passwords don't match")),!1}}),$(document).on("click","[data-action=check-for-updates]",function(){PF.fn.loading.fullscreen(),CHV.fn.system.checkUpdates(function(e){if(PF.fn.loading.destroy("fullscreen"),200===e.status){var t=e.responseJSON.software;-1==PF.fn.versionCompare(CHV.obj.system_info.version,t.current_version)?PF.fn.modal.simple({title:' '+PF.fn._s("Chevereto v%s available",t.current_version),message:"

    "+PF.fn._s("There is a new Chevereto version available with the following release notes.")+" "+PF.fn._s("Check %s for a complete changelog since you last upgrade.",''+CHV.obj.system_info.version+'')+'

    "+PF.fn._s("Check the %s for alternative update methods.",''+PF.fn._s("documentation")+"")+'

    ",html:!0}):PF.fn.growl.call(PF.fn._s("This website is running latest %s version",CHEVERETO.edition))}else PF.fn.growl.call(PF.fn._s("An error occurred. Please try again later."))})}),void 0!==PF.fn.get_url_var("checkUpdates")&&$("[data-action=check-for-updates]").trigger("click"),void 0!==PF.fn.get_url_var("upgrade")&&$("[data-action=upgrade]").trigger("click"),void 0!==PF.fn.get_url_var("license")&&$("[data-action='license']").trigger("click"),void 0!==PF.fn.get_url_var("welcome")&&PF.fn.modal.call({template:$("[data-modal=welcome]").html(),buttons:!1}),void 0!==PF.fn.get_url_var("installed")&&PF.fn.modal.simple({title:' '+PF.fn._s("Chevereto v%s installed",CHV.obj.system_info.version),message:"

    "+PF.fn._s('Usage of Chevereto Software must be in compliance with the software license terms known as "The Chevereto License".')+'

    ",html:!0}),$(document).on("click","[data-action=system-update]",function(e){if(!$("input#system-update").prop("checked"))return PF.fn.growl.call(PF.fn._s("Please review the system requirements before proceeding")),void e.preventDefault()}),$(document).on("click","[data-action=toggle-storage-https]",function(){CHV.fn.storage.toggleHttps($(this).closest("[data-content=storage]").data("storage-id"))}),$(document).on("click","[data-action=toggle-storage-active]",function(){CHV.fn.storage.toggleActive($(this).closest("[data-content=storage]").data("storage-id"))}),$(CHV.fn.uploader.selectors.root).exists()&&(CHV.fn.uploader.$pasteCatcher=$("
    ",{contenteditable:"true",id:CHV.fn.uploader.selectors.paste.replace(/#/,"")}),$("body").append(CHV.fn.uploader.$pasteCatcher),$(document).on("keydown",function(e){!e.ctrlKey&&!e.metaKey||"KeyV"!=e.originalEvent.code||$(e.target).is(":input")||(PF.fn.keyFeedback.spawn(e),CHV.fn.uploader.$pasteCatcher.focus(e))}),document.addEventListener("dragover",function(e){e.preventDefault()}),document.addEventListener("drop",function(e){if(CHV.obj.config.upload.url){e.preventDefault();var t,a=e.dataTransfer.getData("text/html"),o=/src="?([^"\s]+)"?\s*/;t=o.exec(a),t&&(CHV.fn.uploader.toggle({show:!0}),CHV.fn.uploader.add({},t[1]))}}),window.addEventListener("paste",CHV.fn.uploader.pasteImageHandler)),$(document).on("click","[data-action=like]",function(){if(PF.fn.is_user_logged()){var e=$(this);if(!e.data("XHR")){e.data("XHR",!0);var t=$(this).is("[data-liked]")?$(this):$(this).closest("[data-liked]"),a=!t.closest("[data-list], .viewer").exists()&&void 0!==CHV.obj.resource,o=t.is("[data-liked=1]"),i=o?"dislike":"like",n={id:a?CHV.obj.resource.id:$(this).closest("[data-id]").attr("data-id"),type:a?CHV.obj.resource.type:$(this).closest("[data-type]").attr("data-type")},r=a?e:$("[data-type="+n.type+"][data-id="+n.id+"]"),s={type:"POST",data:{action:i},cache:!1};s.data[i]={object:n.type,id:n.id},$.ajax(s).complete(function(t){var i=t.responseJSON;e.data("XHR",!1),200===i.status_code?(a&&void 0!==i.content&&$("[data-text=likes-count]").html(i.content.likes),r.closest("[data-liked]").attr("data-liked",o?0:1)):PF.fn.growl.expirable(PF.fn._s("An error occurred. Please try again later."))})}}else window.location.href=CHV.obj.vars.urls.login}),$(document).on("click","[data-action=album-cover]",function(){var e=$(this);if(!e.data("XHR")){e.data("XHR",!0);var t=$(this).is("[data-cover]")?$(this):$(this).closest("[data-cover]"),a=t.is("[data-cover=1]"),o=a?"album-cover-unset":"album-cover-set",i=(CHV.obj.resource.id,e.closest("[data-cover]")),n={type:"POST",data:{action:o},cache:!1};n.data[o]={album_id:i.data("album-id"),image_id:i.data("id")},$.ajax(n).complete(function(t){var o=t.responseJSON;e.data("XHR",!1),200===o.status_code?i.attr("data-cover",a?0:1):PF.fn.growl.expirable(PF.fn._s("An error occurred. Please try again later."))})}}),$(document).on("click","[data-action=follow]",function(){if(PF.fn.is_user_logged()){var e=$(this);if(!e.data("XHR")){e.data("XHR",!0);var t=$(this).is("[data-followed]")?$(this):$(this).closest("[data-followed]"),a=void 0!==CHV.obj.resource,o=t.is("[data-followed=1]"),i=o?"unfollow":"follow",n={id:a?CHV.obj.resource.id:$(this).closest("[data-id]").data("id"),type:a?CHV.obj.resource.type:$(this).closest("[data-type]").data("type")},r={type:"POST",data:{action:i},cache:!1};r.data[i]={object:n.type,id:n.id},$.ajax(r).complete(function(i){var n=i.responseJSON;if(e.data("XHR",!1),200===n.status_code){if(a&&void 0!==n.user_followed){var r=$("[data-text=followers-label]"),s={single:r.data("label-single"),plural:r.data("label-plural")};$("[data-text=followers-count]").html(n.user_followed.followers),r.html(PF.fn._n(s.single,s.plural,n.user_followed.followers))}t.attr("data-followed",o?0:1)}else PF.fn.growl.expirable(PF.fn._s("An error occurred. Please try again later."))})}}else PF.fn.modal.call({type:"login"})}),$(document).on("click","[data-action=user_ban],[data-action=user_unban]",function(){var e=$(this);if(!e.data("XHR")){e.data("XHR",!0);var t=$(this).closest("[data-banned]"),a=!0,o=t.is("[data-banned=1]"),i=e.attr("data-action"),n={id:a?CHV.obj.resource.id:$(this).closest("[data-id]").data("id"),type:a?CHV.obj.resource.type:$(this).closest("[data-type]").data("type")},r={type:"POST",data:{action:i},cache:!1};r.data[i]={user_id:n.id},$.ajax(r).complete(function(a){var i=a.responseJSON;e.data("XHR",!1),200===i.status_code?t.attr("data-banned",o?0:1):PF.fn.growl.expirable(PF.fn._s("An error occurred. Please try again later."))})}}),$(document).on("click","[data-action=top-bar-notifications]",function(e){var a=this,o=$(this),i=$(".top-bar-notifications-container",o),n=$(".top-bar-notifications-list",o),r=$("ul",n),s=$(".loading",i);o.data("XHR")||(s.removeClass("hidden"),PF.fn.loading.inline(s,{size:"small",message:PF.fn._s("loading")}),$.ajax({type:"POST",data:{action:"notifications"},cache:!1}).complete(function(e){var l=e.responseJSON;if(200!==l.status_code)return PF.fn.growl.expirable(PF.fn._s("An error occurred. Please try again later.")),o.data("XHR",!1),void s.addClass("hidden").html("");if(o.data("XHR",!0),s.remove(),l.html){n.removeClass("hidden"),r.html(l.html),t();var d=$("li.new",r);d.addClass("transition"),setTimeout(function(){d.removeClass("new"),$("[data-content=notifications-counter]",a).removeClass("on").html("0"),setTimeout(function(){d.removeClass("transition")},150)},1500)}else $(".empty",i).removeClass("hidden")}))}),$("#g-recaptcha").is(":empty")&&CHV.obj.config.captcha.enabled&&CHV.obj.config.captcha.sitekey&&("3"!=CHV.obj.config.captcha.version&&CHV.obj.config.captcha.isNeeded||$('label[for="recaptcha_response_field"]').remove()),$(document).on("click",PF.obj.listing.selectors.list_item+" a.image-container",function(e){var t=$(this).closest(PF.obj.listing.selectors.list_item),o=t.find("[data-action=load-image]");o.length>0&&(a(o),e.preventDefault())}),$(document).on("click",PF.obj.listing.selectors.list_item+" [data-action=load-image]",function(e){a($(this)),e.preventDefault(),e.stopPropagation()}),$(document).on("click","#album [data-tab=tab-embeds]",function(e){e.preventDefault,CHV.fn.album.showEmbedCodes()}),$("body").is("#upload")&&CHV.fn.uploader.toggle({show:!0}),$(document).on("keyup",function(e){if(!($(e.target).is(":input")||e.ctrlKey||e.metaKey||e.altKey)){var t=$("#fullscreen-modal:visible").exists(),a=$(".viewer"),o=$(".list-selection:visible"),i=o.find("[data-content=pop-selection]:visible:not(.disabled)"),n=$("body").hasClass("--viewer-shown"),r=$(CHV.fn.uploader.selectors.root+CHV.fn.uploader.selectors.show).exists(),s=e.originalEvent.code;if("Escape"===e.originalEvent.code){if(t)return;r&&CHV.fn.uploader.toggle({reset:!1})}if(a.exists()&&n){if(s in CHV.fn.listingViewer.keys){var l=["KeyW","Escape","ArrowLeft","ArrowRight"],d=CHV.fn.listingViewer.keys[s];-1==l.indexOf(s)?$("[data-action="+d+"]",CHV.fn.listingViewer.selectors.root).click():d in CHV.fn.listingViewer&&CHV.fn.listingViewer[d](),PF.fn.keyFeedback.spawn(e)}}else{var c,u={Period:"list-select-all",KeyK:"get-embed-codes",KeyZ:"clear",KeyA:"create-album",KeyM:"move",KeyO:"approve",Delete:"delete",KeyC:"assign-category",KeyV:"flag-safe",KeyF:"flag-unsafe",KeyH:"album-cover"},m={KeyE:"edit",KeyL:"like",KeyS:"share",KeyJ:"sub-album",KeyP:"upload-to-album"};d=u[s]||m[s];void 0!==d&&(o.exists()&&(n||t||parseInt($("[data-text=selection-count]:visible",i).text())>0&&(c=$("[data-action="+d+"]",o.closest(".list-selection")))),void 0===c&&(c=$("[data-action="+d+"]:visible").not("#content-listing-tabs *")),c instanceof jQuery&&c.length>0&&(c.first().trigger("click"),PF.fn.keyFeedback.spawn(e)))}}}),$(document).on("click",CHV.fn.listingViewer.selectors.root+" [data-action^=viewer-]",function(){var e=$(this).data("action").substring("viewer-".length);e in CHV.fn.listingViewer&&CHV.fn.listingViewer[e]()}),$(document).on("click","a[data-href]:not([rel=popup-link]):not(.popup-link)",function(){var e=$(this).attr("data-href"),t=$(this).attr("href");(e||t)&&(location.href=t||e)});var v,b=PF.obj.listing.selectors.list_item+", .image-container";($(document).on("contextmenu click",b,function(e){!$(".list-selection:visible").exists()||$(e.target).closest(".list-item-desc").exists()||$(this).closest(CHV.fn.listingViewer.selectors.root).exists()||"click"==e.type&&!e.ctrlKey&&!e.metaKey||o(this,e)}),navigator.userAgent.match(/(iPad|iPhone|iPod)/i))&&$(document).on("mouseup mousemove",b,function(e){return clearTimeout(v),!1}).on("mousedown",b,function(e){var t=this,a=e;return v=window.setTimeout(function(){$(".list-selection:visible").exists()&&!$(t).closest(CHV.fn.listingViewer.selectors.root).exists()&&o(t,a)},500),!1});void 0!==CHV.obj.config&&CHV.obj.config.listing.viewer&&$(document).on("click",PF.obj.listing.selectors.list_item+"[data-type=image] .image-container",function(e){if(e.preventDefault(),e.stopPropagation(),0!==e.clientX||0!==e.clientY){var t=$(this).closest(PF.obj.listing.selectors.list_item);t.exists()&&(e.ctrlKey||e.metaKey||CHV.fn.listingViewer.open(t))}else PF.fn.keyFeedback.spawn(e)}),$(document).on("contextmenu",CHV.fn.listingViewer.selectors.root,function(e){return e.preventDefault(),CHV.fn.listingViewer.zoom(),PF.fn.keyFeedback.spawn(e),!1});var _,w=PF.fn.deparam(window.location.search);if(w&&"viewer"in w){var C=$(PF.obj.listing.selectors.content_listing_visible);if("images"==C.data("list")){var P=$(PF.obj.listing.selectors.list_item,C)["next"==w.viewer?"first":"last"]();CHV.fn.listingViewer.open(P)}}$(window).on("DOMContentLoaded load resize scroll",function(){clearTimeout(_),_=setTimeout(function(){$(PF.obj.listing.selectors.list_item+":visible").each(function(){var e=$(this).find('[data-action="load-image"]').first(),t=PF.fn.deparam($(PF.obj.listing.selectors.list_item+"[data-id="+$(this).attr("data-id")+"]").closest(".content-listing").data("params-hidden")),o=t&&"is_animated"in t?t.is_animated:$(this).data("size")<=CHV.obj.config.image.load_max_filesize.getBytes();e.exists()&&o&&$(this).is_within_viewport(50)&&a(e)})},1e3)}),$(document).on("click","[data-action=logout]",function(){let e=$("form#form-logout");e.submit()}),Boolean(window.navigator.vibrate)&&$(document).on("click","button, .btn, .pop-btn, .top-btn-el, [data-action], .content-tabs a, .top-bar-logo a, .login-provider-button, .panel-share-networks li a, #image-viewer-loader",function(e){$(this).is("[data-action=top-bar-menu-full]")||(window.navigator.vibrate(0),window.navigator.vibrate(15))}),$(document).on("change keyup",CHV.fn.ctaForm.selectors.rows+" input[name^='cta-']",function(){CHV.fn.ctaForm.update($(this))}),$(document).on("click",CHV.fn.ctaForm.selectors.rows+" [data-action=cta-add]",function(){CHV.fn.ctaForm.insert($(this))}),$(document).on("click",CHV.fn.ctaForm.selectors.rows+" [data-action=cta-remove]",function(){CHV.fn.ctaForm.remove($(this)),0==CHV.fn.ctaForm.array.length&&$(CHV.fn.ctaForm.selectors.root+" "+CHV.fn.ctaForm.selectors.enable).prop("checked",!1).trigger("change")}),$(document).on("change",CHV.fn.ctaForm.selectors.root+" "+CHV.fn.ctaForm.selectors.enable,function(){let e=$(CHV.fn.ctaForm.selectors.combo,CHV.fn.ctaForm.selectors.root),t=$(this).is(":checked");e.toggleClass("soft-hidden",!t),t&&(0==CHV.fn.ctaForm.array.length&&CHV.fn.ctaForm.add(),CHV.fn.ctaForm.render()),CHV.fn.ctaForm.setEnable(t?1:0)}),$(document).on("change keyup",CHV.fn.ctaForm.selectors.root+" input[name^='cta-icon_']",function(){let e=CHV.fn.ctaForm.getRow($(this)),t=e.find("label[for^='cta-icon_'] [data-content=icon]");t.removeClass();let a=CHV.fn.ctaForm.getIconClass($(this).val());t.addClass(a)}),$(document).on("click","[href^='https://chevereto.com/']",function(e){let t=$(this).find(".badge--paid").exists();if(!t)return;let a=$(this).attr("href"),o=PF.fn._s("Get a license from %s to unlock all features and support.",'chevereto.com'),i=PF.fn._s("You can enter your license key in the dashboard panel.");e.preventDefault(),e.stopPropagation(),PF.fn.modal.simple({html:!0,title:' Upgrade Chevereto',message:"

    "+o+" "+i+'

    "})}),$(document).on("focus","input[name='form-album-password']",function(){$(this).get(0).type="text"}),$(document).on("blur","input[name='form-album-password']",function(){$(this).get(0).type="password"})}),"undefined"==typeof CHV&&(CHV={obj:{},fn:{},str:{}}),window.opener&&(CHV.obj.opener={uploadPlugin:{}}),CHV.fn.ctaButtons={selectors:{container:"[data-contains=cta-album]"},render:function(e=""){$(this.selectors.container).each(function(){$(this).html(e)})}},CHV.fn.ctaForm={enable:0,array:[],selectors:{root:"#cta-form",rows:"#cta-rows",enable:"#cta-enable",template:"#cta-row-template",combo:"#cta-combo",row:".cta-row"},update:function(e){let t=this.getPos(e),a=e.attr("name").match(/cta-(.*)?_\d+/)[1];this.array[t-1][a]=e.val()},add:function(e="",t="",a=""){this.array.push(this.getRowObject(e,t,a)),this.render()},insert:function(e){let t=this.getPos(e);this.array.splice(t,0,this.getRowObject()),this.render()},remove:function(e){let t=this.getPos(e);this.array.splice(t-1,1),this.render()},getRowObject:function(e="",t="",a=""){return{label:e,icon:t,href:a}},getIconClass:function(e){return/\s/g.test(e)?e:"fa-solid fa-"+e},getRow:function(e){return e.closest(this.selectors.row)},getPos:function(e){return this.getRow(e).data("pos")},getTemplateHtml:function(){return $(this.selectors.template).html()},getRowHtml:function(e,t){return this.getTemplateHtml().replaceAll(/%pos%/g,e).replaceAll(/%label%/g,t.label).replaceAll(/%href%/g,t.href).replaceAll(/%icon%/g,t.icon).replaceAll(/%iconClass%/g,this.getIconClass(t.icon))},render:function(){let e=$(this.selectors.root),t=e.find(this.selectors.rows),a=this;this.destroy(),$.each(this.array,function(e,o){t.append(a.getRowHtml(e+1,o))}),this.setEnable(this.enable),t.sortable({cursor:"grabbing",axis:"y",update:function(){let e=[];$(this).find(a.selectors.row).each(function(){let t=a.getPos($(this));e.push(a.array[t-1])}),a.array=e,a.render()}})},setEnable:function(e){let t=$(this.selectors.rows,this.selectors.root);this.enable=e;let a=1===this.enable;$("input[data-required]",t).each(function(){$(this).attr("required",a)})},destroy:function(){let e=$(this.selectors.root),t=e.find(this.selectors.rows);try{t.sortable("destroy")}catch(e){}t.empty()}},CHV.fn.album={showEmbedCodes:function(){var e=$(".content-listing-loading","#tab-embeds");if(e.exists()){var t=$("#embed-codes");$.ajax({url:PF.obj.config.json_api,type:"POST",dataType:"json",data:{action:"get-album-contents",albumid:CHV.obj.resource.id,auth_token:PF.obj.config.auth_token},cache:!1}).always(function(a){PF.fn.loading.destroy(e),200==a.status_code&&(CHV.fn.fillEmbedCodes(a.contents,"#tab-embeds"),$("#tab-embeds").addClass("visible"),t.removeClass("soft-hidden"))})}}},CHV.fn.modal={getTemplateWithPreview:function(e,t){var a=$(e).html(),o=$("
    "),i="",n=t.find(".image-container img").attr("src");return void 0!==n&&(i+='';var e=$(this).find(".image-container img");e.exists()?n+='':(n+='',n+=''),n+="",r++}),i.html(o).find(".image-preview").html(n),i.html()}},CHV.fn.listingViewer={selectors:{bodyShown:".--viewer-shown",content:".viewer-content",template:"#viewer-template",root:".viewer",rootShow:".viewer--show",rootHide:".viewer--hide",rootZero:".viewer--zero",rootNavPrev:".viewer--nav-prev",rootNavNext:".viewer--nav-next",src:".viewer-src",tools:".viewer-tools",loader:".viewer-loader",owner:".viewer-owner",ownerGuest:".viewer-owner--guest",ownerUser:".viewer-owner--user",inputMap:".viewer-kb-input"},keys:{ArrowLeft:"prev",ArrowRight:"next",Delete:"delete",Escape:"close",KeyA:"create-album",KeyE:"edit",KeyF:"flag",KeyL:"like",KeyM:"move",KeyO:"approve",KeyS:"share",KeyW:"zoom",Period:"select"},keymap:{"create-album":["A",PF.fn._s("Create album")],approve:["O",PF.fn._s("Approve")],close:["Esc",PF.fn._s("Close")],delete:["Del",PF.fn._s("Delete")],edit:["E",PF.fn._s("Edit")],flag:["F",PF.fn._s("Toggle flag")],like:["L",PF.fn._s("Like")],move:["M",PF.fn._n("Move")],next:["►",PF.fn._s("Next")],prev:["◄",PF.fn._s("Previous")],select:[".",PF.fn._s("Toggle select")],share:["S",PF.fn._s("Share")],zoom:["W",PF.fn._s("Zoom")]},loading:null,idleTimer:0,$item:null,show:function(){PF.fn.deparam(this.$item.closest(PF.obj.listing.selectors.content_listing_visible).data("params-hidden"));this.getEl("root").removeClass(this.selectors.rootHide.substring(1)).addClass(this.selectors.rootShow.substring(1)),$("body").addClass(this.selectors.bodyShown.substring(1));var e=new Hammer($(CHV.fn.listingViewer.selectors.root).get(0),{direction:Hammer.DIRECTION_VERTICAL});e.on("swipeleft swiperight",function(e){var t="left"==e.type.substring("swipe".length)?"next":"prev";CHV.fn.listingViewer[t]()}),this.getEl("root")[(PF.fn.isDevice(["phone","phablet"])?"add":"remove")+"Class"]("--over")},getItem:function(){return this.$item},getEl:function(e){var t=!e.startsWith("template")&&!e.startsWith("root")&&this.selectors.root;return t?$(this.selectors[e],t):$(this.selectors[e])},getObject:function(e){if(e||void 0===this.object){var t=decodeURIComponent(this.getItem().attr("data-object"));this.object=JSON&&JSON.parse(t)||$.parseJSON(t)}return this.object},placeholderSizing:function(){if(this.getEl("root").exists()){var e=Math.max(document.documentElement.clientWidth,window.innerWidth||0),t=Math.max(document.documentElement.clientHeight,window.innerHeight||0),a=e/t,o=this.getEl("src")[0],i=o.getAttribute("width"),n=o.getAttribute("height"),r=i/n,s=a0?"add":t.getItem()[o]().exists()?"add":"remove";a[n+"Class"](i.substring(1))}),$.each(this.getItem().get(0).attributes,function(e,t){if(!t.name.startsWith("data-"))return!0;a.attr(t.name,t.value)});var n=void 0===this.object.user?"user":"guest";n="owner"+(n.charAt(0).toUpperCase()+n.slice(1).toLowerCase()),this.getEl(n).remove(),void 0!==this.object.user&&$(this.object.user.avatar?".default-user-image":"img.user-image",this.getEl("ownerUser")).remove();var r=this.getItem().find(".list-item-image-tools[data-action='list-tools']");this.getEl("tools").append(r.html());let s=this;this.getEl("tools").find(".list-tool[data-action]").each(function(){$(this).attr("title",$(this).attr("title")+" ("+s.keymap[$(this).attr("data-action")][0]+")")}),this.placeholderSizing(),this.trickyLoad()},zoom:function(){this.getEl("root").attr("data-cover","1"==this.getEl("root").attr("data-cover")?"0":"1")},remove:function(){this.getEl("root").remove()},getParsedTemplate:function(){var e=this.getObject(!0),t=this.getEl("template").html(),a=t.match(/%(\S+)%/g);return a&&$.each(a,function(a,o){var i,n=o.slice(1,-1).split(".");n.map(function(t){var a=i||e;t in a&&(i=a[t])});var r=new RegExp(o,"g");i=void 0===i?"":i,t=t.replace(r,i)}),t},insertEl:function(){var e=this.getParsedTemplate();this.getEl("rootZero").remove(),$(e).appendTo("body")},toggleIdle:function(e,t){var a=this;t=void 0===t||t;$("html")[(e?"add":"remove")+"Class"]("--idle"),e||(clearTimeout(a.idleTimer),t&&(a.idleTimer=setTimeout(function(){var e=$(".fullscreen"),t=a.getEl("root");a.toggleIdle(t.length>0&&0==e.length)},5e3)))},open:function(e){if(e.exists()){this.setItem(e),this.insertEl(),this.filler(),this.show(),this.toggleIdle(!1);var t=this;this.getEl("root").on("mousemove mouseout",function(){t.toggleIdle(!1)})}else this.getEl("rootZero").remove()},setItem:function(e){this.$item=e},trickyLoad:function(){if(this.object.image.url!=this.object.display_url){var e=this.getEl("src").parent().html(),t=$(e).attr("src",this.object.image.url);t.insertBefore(this.getEl("src"));var a=t.eq(0);"video"===a.attr("data-type")?(a.replaceWith(''),a.src=this.object.image.url):a.attr("src",this.object.image.url),t.imagesLoaded(function(){t.next().remove()})}},close:function(){var e=this;$(this.selectors.root).removeClass(this.selectors.rootShow.substring(1)).addClass(this.selectors.rootHide.substring(1)),$("body").removeClass(this.selectors.bodyShown.substring(1)),this.toggleIdle(!1,!1),null!==this.getItem()&&$(window).scrollTop(this.getItem().offset().top);var t=$("#top-bar, .follow-scroll");t.attr("data-scroll-lock","1"),setTimeout(function(){e.remove()},250),setTimeout(function(){t.removeAttr("data-scroll-lock")},300)},browse:function(e){var t=this.getItem()[e]();if(t.exists()){this.setItem(t),this.filler(!0);var a=$(PF.obj.listing.selectors.content_listing_visible).find("[data-action=load-more]"),o=t[e+"All"]().length;a.length>0&&o<=5&&!PF.obj.listing.calling&&"next"==e&&$("[data-action=load-more]").click()}else{var i=$("[data-pagination="+e+"]",PF.obj.listing.selectors.content_listing_pagination+":visible"),n=i.attr("href");if(!n)return;PF.fn.deparam(window.location.search);window.location.href=n+"&viewer="+e}},prev:function(){this.browse("prev")},next:function(){this.browse("next")}},CHV.obj.image_viewer={selector:"#image-viewer",container:"#image-viewer-container",navigation:".image-viewer-navigation",loading:"#image-viewer-loading",loader:"#image-viewer-loader"},CHV.obj.image_viewer.$container=$(CHV.obj.image_viewer.container),CHV.obj.image_viewer.$navigation=$(CHV.obj.image_viewer.navigation),CHV.obj.image_viewer.$loading=$(CHV.obj.image_viewer.loading),CHV.fn.system={checkUpdates:function(e){$.ajax({url:CHEVERETO.api.get.info+"/",data:{id:CHEVERETO.id},cache:!1}).always(function(t,a,o){"function"==typeof e&&e(o)})}},("MacIntel"===navigator.platform&&navigator.maxTouchPoints>0||"iPad"===navigator.platform)&&$("html").removeClass("device-nonmobile"),CHV.fn.bindSelectableItems=function(){var e="content-listing-wrapper",t="#"+e;$(t).exists()?$(t).hasClass("ui-selectable")&&$(t).selectable("destroy"):$("#content-listing-tabs").wrap("
    "),$("[data-content=list-selection]").exists()&&$("html.device-nonmobile "+t).selectable({delay:150,filter:PF.obj.listing.selectors.list_item,cancel:".content-empty, .header, #tab-share, #tab-info, .viewer-title, .header-link, .top-bar, .content-listing-pagination *, #fullscreen-modal, #top-user, #background-cover, .list-item-desc, .list-item-image-tools, [data-action=load-image], #tab-embeds",classes:{"ui-selected":"selected"},selected:function(e,t){$(t.selected).removeClass("ui-selected")},selecting:function(e,t){var a=$(t.selecting),o=a.hasClass("selected");CHV.fn.list_editor[(o?"unselect":"select")+"Item"](a)},unselecting:function(e,t){CHV.fn.list_editor.unselectItem($(t.unselecting))}})},CHV.fn.isCachedImage=function(e){var t=new Image;return t.src=e,t.complete||t.width+t.height>0},CHV.fn.viewerLoadImage=function(){if(CHV.obj.image_viewer.$loading.exists()&&(CHV.obj.image_viewer.$loading.removeClass("soft-hidden").css({zIndex:2}),PF.fn.loading.inline(CHV.obj.image_viewer.$loading,{color:"white",size:"small",center:!0,valign:!0}), +CHV.obj.image_viewer.$loading.hide().fadeIn("slow")),$(CHV.obj.image_viewer.loader).remove(),CHV.obj.image_viewer.image.is_360)return PF.fn.loading.destroy(CHV.obj.image_viewer.$loading),pannellum.viewer("image-viewer-360",{autoLoad:!0,type:"equirectangular",panorama:CHV.obj.image_viewer.image.url,preview:CHV.obj.image_viewer.$container.find(".media").eq(0).attr("src"),pitch:2.3,yaw:-135.4,hfov:120}),$("#image-viewer-360").removeClass("soft-hidden"),void CHV.obj.image_viewer.$container.find(".media").eq(0).remove();CHV.obj.image_viewer.image.html=CHV.obj.image_viewer.$container.html(),CHV.obj.image_viewer.$container.css("height",CHV.obj.image_viewer.$container.height()).prepend($(CHV.obj.image_viewer.image.html).css({top:0,zIndex:0,opacity:0,position:"absolute"})),CHV.obj.image_viewer.$container.find(".media").eq(0).css("zIndex",1);var e=CHV.obj.image_viewer.$container.find(".media").eq(1),t=e.css("width"),a=e.css("height");"video"===e.attr("data-type")?(e.replaceWith(''),e.src=CHV.obj.image_viewer.image.url):e.attr("src",CHV.obj.image_viewer.image.url),e.imagesLoaded(function(){CHV.obj.image_viewer.$container.find(".media").eq(1).css({position:"",display:"",opacity:1}),CHV.obj.image_viewer.$container.find(".media").eq(0).remove(),$(CHV.obj.image_viewer.container).css("height",""),PF.fn.loading.destroy(CHV.obj.image_viewer.$loading)})},CHV.obj.embed_share_tpl={},CHV.obj.embed_upload_tpl={},CHV.obj.topBar={transparencyScrollToggle:function(){var e=$(window).scrollTop();$("#top-bar")[(e>0?"remove":"add")+"Class"]("transparent")}},CHV.obj.uploaderReset={isUploading:!1,canAdd:!0,queueStatus:"ready",uploadThreads:0,uploadParsedIds:[],uploadProcessedIds:[],files:{},results:{success:{},error:{}},toggleWorking:0,filesAddId:0,clipboardImages:[]},CHV.fn.uploader={files:{},selectors:{root:"#anywhere-upload",show:".upload-box--show",queue:"#anywhere-upload-queue",queue_complete:".queue-complete",queue_item:".queue-item",close_cancel:"[data-button=close-cancel]",file:"#anywhere-upload-input",camera:"#anywhere-upload-input-camera",upload_item_template:"#anywhere-upload-item-template",item_progress_bar:"[data-content=progress-bar]",failed_result:"[data-content=failed-upload-result]",fullscreen_mask:"#fullscreen-uploader-mask",dropzone:"#uploader-dropzone",paste:"#anywhere-upload-paste",input:"[data-action=anywhere-upload-input]"},toggle:function(e,t){this.queueSize();var a=$("[data-action=top-bar-upload]",".top-bar"),o=!$(CHV.fn.uploader.selectors.root).data("shown");e=$.extend({callback:null,reset:!0},e);if(void 0!==e.show&&e.show&&(o=!0),PF.fn.growl.close(!0),PF.fn.close_pops(),!(1==this.toggleWorking||$(CHV.fn.uploader.selectors.root).is(":animated")||CHV.fn.uploader.isUploading||a.data("login-needed")&&!PF.fn.is_user_logged())){this.toggleWorking=1;var i={time:500,easing:null},n=function(){!o&&e.reset&&CHV.fn.uploader.reset(),PF.fn.topMenu.hide(),"function"==typeof e.callback&&e.callback(t),CHV.fn.uploader.boxSizer(),CHV.fn.uploader.toggleWorking=0};if($(CHV.fn.uploader.selectors.root)[(o?"add":"remove")+"Class"](this.selectors.show.substring(1)),o){if($("html").data({"followed-scroll":$("html").hasClass("followed-scroll"),"top-bar-box-shadow-prevent":!0}).removeClass("followed-scroll").addClass("overflow-hidden top-bar-box-shadow-none"),$("#top-bar").data({stock_classes:$("#top-bar").attr("class")}).addClass("scroll-up"),$(".current[data-nav]",".top-bar").each(function(){$(this).is("[data-action=top-bar-menu-full]")||$(this).removeClass("current").attr("data-current",1)}),PF.fn.isDevice("mobile")){var r=$(".upload-box-heading",$(CHV.fn.uploader.selectors.root));r.css({position:"relative",top:.5*($(window).height()-r.height())+"px"})}CHV.fn.uploader.focus(function(){setTimeout(function(){n()},i.time)})}else{$("#top-bar")[0].className=$("#top-bar").data("stock_classes"),$("[data-nav][data-current=1]",".top-bar").each(function(){$(this).addClass("current")}),setTimeout(function(){$(CHV.fn.uploader.selectors.fullscreen_mask).css({opacity:0})},.1*i.time),setTimeout(function(){$(CHV.fn.uploader.selectors.fullscreen_mask).remove()},i.time);var s=$(CHV.fn.uploader.selectors.root).outerHeight(),l=s-parseInt($(CHV.fn.uploader.selectors.root).data("initial-height"))+"px";$(CHV.fn.uploader.selectors.root).css({transform:"translate(0,-"+l+")"}),setTimeout(function(){$(CHV.fn.uploader.selectors.root).css({top:""}),n(),$("html,body").removeClass("overflow-hidden").data({"top-bar-box-shadow-prevent":!1}),$("#top-bar *").trigger("blur")},i.time)}$(CHV.fn.uploader.selectors.root).data("shown",o),a.toggleClass("current").removeClass("opened")}},reset:function(){$.extend(this,$.extend(!0,{},CHV.obj.uploaderReset)),$("li",this.selectors.queue).remove(),$(this.selectors.root).height("").css({"overflow-y":"","overflow-x":""}),$(this.selectors.queue).addClass("queueEmpty").removeClass(this.selectors.queue_complete.substring(1)),$(this.selectors.input,this.selectors.root).each(function(){$(this).prop("value",null)}),$("[data-group=upload-result] textarea",this.selectors.root).prop("value",""),$.each(["upload-queue-ready","uploading","upload-result","upload-queue-ready","upload-queue"],function(e,t){$("[data-group="+t+"]").hide()}),$("[data-group=upload]",this.selectors.root).show(),$("[name=upload-album-id]",this.selectors.root).prop("value",function(){var e=$("option[selected]",this);if(e.exists())return e.attr("value")}),$(this.selectors.root).removeClass("queueCompleted queueReady queueHasResults").addClass("queueEmpty").attr("data-queue-size",0),$("[name=upload-category-id]",this.selectors.root).prop("value",""),$("[name=upload-nsfw]",this.selectors.root).prop("checked",this.defaultChecked),this.boxSizer(!0)},focus:function(e){$(this.selectors.fullscreen_mask).exists()||($("body").is("#upload")||$("body").append($("
    ",{id:this.selectors.fullscreen_mask.replace("#",""),class:"fullscreen black"}).css({top:PF.fn.isDevice("phone")?0:$(CHV.fn.uploader.selectors.root).data("top")})),setTimeout(function(){$("body").is("#upload")||$(CHV.fn.uploader.selectors.fullscreen_mask).css({opacity:1}),setTimeout(function(){"function"==typeof e&&e()},PF.fn.isDevice(["phone","phablet"])?0:250)},1))},boxSizer:function(e){var t=$(this.selectors.root).is(this.selectors.show),a=t||e;t&&$("html").addClass("overflow-hidden"),a&&($(this.selectors.root).height(""),!$("body").is("#upload")&&$(this.selectors.root).height()>$(window).height()?($(this.selectors.root).height($(window).height()-$("#top-bar").height()).css({"overflow-y":"scroll","overflow-x":"auto"}),$("html").addClass("overflow-hidden")):$(this.selectors.root).css("overflow-y",""))},pasteURL:function(){var e=$("[name=urls]",PF.obj.modal.selectors.root),t=e.val();t&&(CHV.fn.uploader.toggle({show:!0}),CHV.fn.uploader.add({},t))},pasteImageHandler:function(e){if(!$(e.target).is(":input")){if(void 0!==e.clipboardData&&e.clipboardData.items)var t=e.clipboardData.items;else setTimeout(function(){return e.clipboardData={},e.clipboardData.items=[],$.each($("img",CHV.fn.uploader.$pasteCatcher),function(t,a){e.clipboardData.items.push(PF.fn.dataURItoBlob($(this).attr("src")))}),$(CHV.fn.uploader.selectors.paste).html(""),CHV.fn.uploader.pasteImageHandler(e)},1);if(t){const e=new Array,i=new Array,n=new RegExp("^(image|video)/","i");let r=$(CHV.fn.uploader.selectors.root).data("shown");for(var a=0;a{a.currentTime=e},100),a.addEventListener("seeked",()=>{const e=document.createElement("canvas");e.width=a.videoWidth,e.height=a.videoHeight;const o=e.getContext("2d");o.drawImage(a,0,0,e.width,e.height),o.canvas.toBlob(o=>{t(a,e)},"image/jpeg",.9)},!1)}),a.onerror=(e=>{const o={1:"MEDIA_ERR_ABORTED",2:"MEDIA_ERR_NETWORK",3:"MEDIA_ERR_DECODE",4:"MEDIA_ERR_SRC_NOT_SUPPORTED"};var i=o[a.error.code];t({type:"error",error:i}),console.error("Error loading video",i)}),a.src=e}function d(e,t){e.show(),$(CHV.fn.uploader.selectors.root).addClass("queueReady").removeClass("queueEmpty"),$("[data-group=upload-queue-ready]",CHV.fn.uploader.selectors.root).show(),$("[data-group=upload]",CHV.fn.uploader.selectors.root).hide(),e.find(".load-url").remove(),e.find(".preview").removeClass("soft-hidden").show().append(t),$img=e.find(".preview").find("img,canvas"),$img.attr("class","canvas"),queue_item_h=e.height(),queue_item_w=e.width();var a=parseInt($img.attr("width"))||$img.width(),o=parseInt($img.attr("height"))||$img.height(),i=a/o;if($img.hide(),a>o||a==o){var r=oo&&$img.height(r).width(r*i)}if(a0){for(var o="",i=0;i"+PF.fn.htmlEncode(a[i].name)+" - "+PF.fn.htmlEncode(a[i].error)+"",delete CHV.fn.uploader.files[a[i].uid],$("li[data-id="+a[i].uid+"]",CHV.fn.uploader.selectors.queue).find("[data-action=cancel]").click();PF.fn.modal.simple({title:PF.fn._s("Some files couldn't be loaded"),message:"
      "+o+"
    "})}else CHV.fn.uploader.focus();CHV.fn.uploader.boxSizer()}}if($(CHV.fn.uploader.selectors.queue_item+":not([data-id]) .preview:empty",CHV.fn.uploader.selectors.queue).first().closest("li").attr("data-id",t.uid),void 0!==t.type&&t.type.startsWith("video/")){var u=i(t.uid),m=r(t),p=URL.createObjectURL(t);l(p,function(e,a){++C,"error"===e.type?f.push({uid:t.uid,name:t.name.truncate_middle(),error:e.error}):(CHV.fn.uploader.files[t.uid].parsedMeta={title:m,width:e.videoWidth,height:e.videoHeight,mimetype:t.type},d(u,a)),c(C,s,f)})}else loadImage(t.url?t.url:t,function(e){++C;var o=i(t.uid);if("error"===e.type)f.push({uid:t.uid,name:t.name.truncate_middle(),error:"MEDIA_ERR_SRC_FORMAT"});else{n();var l="image/jpeg";if(void 0!==a.buffer){for(var u=new Uint8Array(a.buffer).subarray(0,4),m="",p=0;pCHV.obj.config.image.max_filesize.getBytes()?f.push({uid:u,name:g.name.truncate_middle()+" - "+PF.fn._s("File too big."),error:"MEDIA_ERR_FILE_SIZE"}):-1!=CHV.obj.config.upload.image_types.indexOf(p)||0!=/android/i.test(navigator.userAgent)?(i&&(g.md5=i),g.fromClipboard=1==e.clipboard,g.uid=u):f.push({uid:u,name:g.name.truncate_middle()+" - "+PF.fn._s("Invalid or unsupported file format."),error:"MEDIA_ERR_FILETYPE"})}for(u=0;u0&&0==s.length){var v="";for(u=0;u"+PF.fn.htmlEncode(f[u].name)+"";return void PF.fn.modal.simple({title:PF.fn._s("Some files couldn't be added"),message:"
    • "+v+"
    "})}if(0==s.length)return}else{if(t=t.replace(/(<([^>]+)>)/g,"").replace(/(\[([^\]]+)\])/g,""),s=t.match_urls(),!s)return;s=s.array_unique(),s=$.map(s,function(e,t){return{uid:t,name:e,url:e}})}if($.isEmptyObject(this.files))for(u=0;u0){var i=[];for(var o in this.results.error)"object"==typeof this.results.error[o]&&(i[o]=this.results.error[o].error.message);i.length>0&&$(this.selectors.failed_result).html("
  • "+i.join("
  • ")+"
  • ")}else $(a.error,this.selectors.root).hide();if(!window.opener&&0==CHV.obj.config.upload.moderation&&CHV.obj.config.upload.redirect_single_upload&&1==Object.size(this.results.success)&&0==Object.size(this.results.error))return window.location.href=this.results.success[Object.keys(this.results.success)[0]].image.path_viewer,!1;if($("[data-text=queue-progress]",this.selectors.root).text(100),$("[data-group=uploading]",this.selectors.root).hide(),$(this.selectors.root).removeClass("queueUploading queueHasResults").addClass("queueCompleted"),$(this.selectors.queue).addClass(this.selectors.queue_complete.substring(1)),Object.size(this.results.success)>0&&$("[data-group=upload-result] textarea",this.selectors.root).exists()&&CHV.fn.fillEmbedCodes(this.results.success,CHV.fn.uploader.selectors.root,"val"),Object.size(this.results.success)>0&&Object.size(this.results.error)>0?$(a.mixed+", "+a.success,this.selectors.root).show():Object.size(this.results.success)>0?$(a.success,this.selectors.root).show():Object.size(this.results.error)>0&&$(a.error,this.selectors.root).show(),$(a.success,this.selectors.root).is(":visible")){$(a.success,this.selectors.root).find("[data-group^=user], [data-group=guest]").hide(),$(a.success,this.selectors.root).find("[data-group="+(PF.fn.is_user_logged()?"user":"guest")+"]").show();var n=Object.keys(this.results.success)[0];if(void 0!==this.results.success[n].image.album){var r=[];for(var s in this.results.success){var l=this.results.success[s].image;l.album&&l.album.id_encoded&&-1==r.indexOf(l.album.id_encoded)&&r.push(l.album.id_encoded)}var d={link:null,text:null};if(r.length<=1?(d.link=this.results.success[n].image.album.url,d.text=this.results.success[n].image.album.name):(d.link=this.results.success[n].image.user.url_albums,d.text=PF.fn._s("%s's Albums",this.results.success[n].image.user.name_short_html)),$("[data-text=upload-target]",this.selectors.root).text(d.text),$("[data-link=upload-target]",this.selectors.root).attr("href",d.link),PF.fn.is_user_logged()){var c=r.length>0?"album":"stream";$("[data-group=user-"+c+"]",this.selectors.root).show()}}}if(this.boxSizer(),this.queueStatus="done",window.opener&&void 0!==CHV.obj.opener.uploadPlugin[window.name]){if($('[data-action="copy"]',this.selectors.root).remove(),CHV.obj.opener.uploadPlugin[window.name].hasOwnProperty("autoInsert")&&CHV.obj.opener.uploadPlugin[window.name].autoInsert){var u=$(':input[name="'+CHV.obj.opener.uploadPlugin[window.name].autoInsert+'"]',CHV.fn.uploader.selectors.root),m=u.val();if(m)return window.opener.postMessage({id:window.name,message:m},"*"),void window.close()}}else $('[data-action="openerPostMessage"]',this.selectors.root).remove()}},$.extend(CHV.fn.uploader,$.extend(!0,{},CHV.obj.uploaderReset)),CHV.fn.fillEmbedCodes=function(e,t,a){void 0===a&&(a="val");var o=CHV.fn.uploader.selectors.root==t?"embed_upload_tpl":"embed_share_tpl",i=!1;$.each(e,function(e,n){if(void 0!==n){var r="id_encoded"in n?n:n.image;if(!r.medium){r.medium={};for(var s=["filename","name","width","height","extension","size","size_formatted","url"],l=0;l0&&$.each(CHV.obj.categories,function(o,i){return void 0!==e&&i.id==e||(i.url_key==$("[name=form-category-url_key]",t).val()?(a=!0,!1):void 0)}),!a||(PF.fn.growl.call(PF.fn._s("Category URL key already being used.")),$("[name=form-category-url_key]",t).highlight(),!1)))},edit:{before:function(e){var t=$(e.target),a=t.data("category-id"),o=CHV.obj.categories[a],i="[data-modal="+t.data("target")+"]";$.each(CHV.fn.category.formFields,function(e,t){e="form-category-"+t,t=o[t];var a=$("[name="+e+"]",i);a.is("textarea")?a.html(PF.fn.htmlEncode(t)):a.attr("value",t)})},submit:function(){var e=PF.obj.modal.selectors.root,t=$("[name=form-category-id]",e).val();return!!CHV.fn.category.validateForm(t)&&(PF.obj.modal.form_data={action:"edit",edit:"category",editing:{}},$.each(CHV.fn.category.formFields,function(t,a){PF.obj.modal.form_data.editing[a]=$("[name=form-category-"+a+"]",e).val()}),!0)},complete:{success:function(e){var t=e.responseJSON.category,a="[data-content=category][data-category-id="+t.id+"]";$.each(t,function(e,t){$("[data-content=category-"+e+"]",a).html(PF.fn.htmlEncode(t))}),$("[data-link=category-url]").attr("href",t.url),CHV.obj.categories[t.id]=t,PF.fn.growl.expirable(PF.fn._s("The content has been edited."))}}},delete:{before:function(e){var t=$(e.target),a=t.data("category-id"),o=CHV.obj.categories[a];t.attr("data-confirm",t.attr("data-confirm").replace("%s",'"'+o.name+'"'))},submit:function(e){return PF.obj.modal.form_data={action:"delete",delete:"category",deleting:{id:e}},!0},complete:{success:function(e){PF.fn.growl.expirable(PF.fn._s("Category successfully deleted."));var t=e.responseJSON.request.deleting.id;$("[data-content=category][data-category-id="+t+"]").remove(),delete CHV.obj.categories[t]}}},add:{submit:function(){var e=PF.obj.modal.selectors.root;return!!CHV.fn.category.validateForm()&&(PF.obj.modal.form_data={action:"add-category",category:{}}, +$.each(CHV.fn.category.formFields,function(t,a){"id"!=a&&(PF.obj.modal.form_data.category[a]=$("[name=form-category-"+a+"]",e).val())}),!0)},complete:{success:function(e){var t=e.responseJSON.category,a="[data-content=dashboard-categories-list]",o=$("[data-content=category-dashboard-template]").html();$.each(t,function(e,t){o=o.replace(new RegExp("%"+e.toUpperCase()+"%","g"),t||"")}),$(a).append(o),0==Object.size(CHV.obj.categories)&&(CHV.obj.categories={}),CHV.obj.categories[t.id]=t,PF.fn.growl.call(PF.fn._s("Category %s added.",'"'+t.name+'"'))}}}},CHV.fn.ip_ban={formFields:["id","ip","expires","message"],validateForm:function(e){var t=PF.obj.modal.selectors.root,a=!1,o=$("[name=form-ip_ban-ip]",t).val();return!!CHV.fn.common.validateForm(t)&&(""!==$("[name=form-ip_ban-expires]",t).val()&&0==/^\d{4}-\d{2}-\d{2} \d{2}:\d{2}:\d{2}$/.test($("[name=form-ip_ban-expires]",t).val())?(PF.fn.growl.call(PF.fn._s("Invalid expiration date.")),$("[name=form-ip_ban-expires]",t).highlight(),!1):(Object.size(CHV.obj.ip_bans)>0&&$.each(CHV.obj.ip_bans,function(t,i){return void 0!==e&&i.id==e||(i.ip==o?(a=!0,!1):void 0)}),!a||(PF.fn.growl.call(PF.fn._s("IP %s already banned.",o)),$("[name=form-ip_ban-ip]",t).highlight(),!1)))},add:{submit:function(){var e=PF.obj.modal.selectors.root;return!!CHV.fn.ip_ban.validateForm()&&(PF.obj.modal.form_data={action:"add-ip_ban",ip_ban:{}},$.each(CHV.fn.ip_ban.formFields,function(t,a){"id"!=a&&(PF.obj.modal.form_data.ip_ban[a]=$("[name=form-ip_ban-"+a+"]",e).val())}),!0)},complete:{success:function(e){var t=e.responseJSON.ip_ban,a="[data-content=dashboard-ip_bans-list]",o=$("[data-content=ip_ban-dashboard-template]").html();void 0!==o&&($.each(t,function(e,t){o=o.replace(new RegExp("%"+e.toUpperCase()+"%","g"),t||"")}),$(a).append(o)),0==Object.size(CHV.obj.ip_bans)&&(CHV.obj.ip_bans={}),CHV.obj.ip_bans[t.id]=t,$("[data-content=ban_ip]").addClass("hidden"),$("[data-content=banned_ip]").removeClass("hidden"),PF.fn.growl.call(PF.fn._s("IP %s banned.",t.ip))},error:function(e){var t=e.responseJSON.error;PF.fn.growl.call(PF.fn._s(t.message))}}},edit:{before:function(e){var t=$(e.target),a=t.data("ip_ban-id"),o=CHV.obj.ip_bans[a],i="[data-modal="+t.data("target")+"]";$.each(CHV.fn.ip_ban.formFields,function(e,t){e="form-ip_ban-"+t,t=o[t];var a=$("[name="+e+"]",i);a.is("textarea")?a.html(PF.fn.htmlEncode(t)):a.attr("value",t)})},submit:function(){var e=PF.obj.modal.selectors.root,t=$("[name=form-ip_ban-id]",e).val();return!!CHV.fn.ip_ban.validateForm(t)&&(PF.obj.modal.form_data={action:"edit",edit:"ip_ban",editing:{}},$.each(CHV.fn.ip_ban.formFields,function(t,a){PF.obj.modal.form_data.editing[a]=$("[name=form-ip_ban-"+a+"]",e).val()}),!0)},complete:{success:function(e){var t=e.responseJSON.ip_ban,a="[data-content=ip_ban][data-ip_ban-id="+t.id+"]";$.each(t,function(e,t){$("[data-content=ip_ban-"+e+"]",a).html(PF.fn.htmlEncode(t))}),CHV.obj.ip_bans[t.id]=t},error:function(e){var t=e.responseJSON.error;PF.fn.growl.call(PF.fn._s(t.message))}}},delete:{before:function(e){var t=$(e.target),a=t.data("ip_ban-id"),o=CHV.obj.ip_bans[a];t.attr("data-confirm",t.attr("data-confirm").replace("%s",o.ip))},submit:function(e){return PF.obj.modal.form_data={action:"delete",delete:"ip_ban",deleting:{id:e}},!0},complete:{success:function(e){PF.fn.growl.expirable(PF.fn._s("IP ban successfully deleted."));var t=e.responseJSON.request.deleting.id;$("[data-content=ip_ban][data-ip_ban-id="+t+"]").remove(),delete CHV.obj.ip_bans[t]}}}},CHV.fn.storage={formFields:["id","name","api_id","bucket","server","service","capacity","region","key","secret","url","account_id","account_name","type_chain"],chain:["other","document","audio","video","image"],calling:!1,validateForm:function(){var e=PF.obj.modal.selectors.root,t=$("[name=form-storage-id]",e).val(),a=!0;if($.each($(":input",e),function(e,t){$(this).is(":hidden")?$(this).attr("required")&&$(this).removeAttr("required").attr("data-required",1):1==$(this).attr("data-required")&&$(this).attr("required","required"),$(this).is(":visible")&&""==$(this).val()&&$(this).attr("required")&&($(this).highlight(),a=!1)}),!a)return PF.fn.growl.call(PF.fn._s("Please fill all the required fields.")),!1;var o,i=$("[name=form-storage-capacity]",e),n=i.val();return""!==n&&(0==/^[\d\.]+\s*[A-Za-z]{2}$/.test(n)||void 0===n.getBytes()?o=PF.fn._s("Invalid storage capacity value. Make sure to use a valid format."):void 0!==CHV.obj.storages[t]&&n.getBytes()0&&(t=String(t).formatBytes(2)),s.attr("value",t)),"form-storage-type_chain"===e){let e=(parseInt(t)>>>0).toString(2).paddingLeft("0".repeat(CHV.fn.storage.chain.length)).split("");CHV.fn.storage.chain.forEach(function(t,a){$("#storage_type_enable_"+t,i).removeAttr("checked").attr("checked",1==e[a])})}}),$("[data-combo-value]").addClass("soft-hidden"),$(n).removeClass("soft-hidden")},submit:function(){var e=PF.obj.modal.selectors.root;$("[name=form-storage-id]",e).val();if(!CHV.fn.storage.validateForm())return!1;PF.obj.modal.form_data={action:"edit",edit:"storage",editing:{}},$.each(CHV.fn.storage.formFields,function(t,a){var o;o="[name=form-storage-"+a+"]","hidden"!==$(o,e).attr("type")&&(o+=":visible"),PF.obj.modal.form_data.editing[a]=$(o,e).val()});let t=CHV.fn.storage.chain.map(function(t){return $("#storage_type_enable_"+t,e).prop("checked")?1:0});return PF.obj.modal.form_data.editing.type_chain=parseInt(t.join(""),2),!0},complete:{success:function(e){var t=e.responseJSON.storage,a="[data-content=storage][data-storage-id="+t.id+"]",o=$("[data-action=toggle-storage-https]",a);$.each(t,function(e,t){$("[data-content=storage-"+e+"]",a).html(PF.fn.htmlEncode(t))}),CHV.obj.storages[t.id]=t,CHV.fn.storage.toggleBoolDisplay(o,1==t.is_https)},error:function(e){var t=e.responseJSON,a=t.error.message;PF.fn.growl.call(a)}}},add:{submit:function(){if(!CHV.fn.storage.validateForm())return!1;var e=PF.obj.modal.selectors.root;return PF.obj.modal.form_data={action:"add-storage",storage:{}},$.each(CHV.fn.storage.formFields,function(t,a){var o;"id"!=a&&(o="[name=form-storage-"+a+"]","hidden"!==$(o,e).attr("type")&&(o+=":visible"),PF.obj.modal.form_data.storage[a]=$(o,e).val())}),!0},complete:{success:function(e){var t=e.responseJSON.storage,a="[data-content=dashboard-storages-list]",o=$("[data-content=storage-dashboard-template]").html();$.each(t,function(e,t){var a=e.toUpperCase();if("is_https"==e||"is_active"==e)t=CHV.obj.storageTemplate.icon.replace("%TITLE%",CHV.obj.storageTemplate.messages[e]).replace("%ICON%",CHV.obj.storageTemplate.checkboxes[t]).replace("%PROP%",e.replace("is_",""));o=o.replace(new RegExp("%"+a+"%","g"),t||"")}),$(a).append(o),PF.fn.bindtipTip($("[data-storage-id="+t.id+"]")),0==CHV.obj.storages.length&&(CHV.obj.storages={}),CHV.obj.storages[t.id]=t},error:function(e){var t=e.responseJSON,a=t.error.message;PF.fn.growl.call(a)}}},toggleBoolDisplay:function(e,t){var a={0:e.data("unchecked-icon"),1:e.data("checked-icon")};e.removeClass(a[0]+" "+a[1]).addClass(a[t?1:0])}},CHV.fn.common={validateForm:function(e){if(void 0===e)e=PF.obj.modal.selectors.root;var t=!0;return $.each($(":input:visible",e),function(e,a){""==$(this).val()&&$(this).attr("required")&&($(this).highlight(),t=!1)}),!!t||(PF.fn.growl.call(PF.fn._s("Please fill all the required fields.")),!1)},updateDoctitle:function(e){void 0!==CHV.obj.page_info&&(CHV.obj.page_info.pre_doctitle=e,CHV.obj.page_info.doctitle=CHV.obj.page_info.pre_doctitle+CHV.obj.page_info.pos_doctitle,document.title=CHV.obj.page_info.doctitle)}},CHV.fn.user={add:{submit:function(){var e=$(PF.obj.modal.selectors.root),t=!0;return $.each($(":input",e),function(e,a){""==$(this).val()&&$(this).attr("required")&&($(this).highlight(),t=!1)}),t?(PF.obj.modal.form_data={action:"add-user",user:{username:$("[name=form-username]",e).val(),email:$("[name=form-email]",e).val(),password:$("[name=form-password]",e).val(),role:$("[name=form-role]",e).val()}},!0):(PF.fn.growl.call(PF.fn._s("Please fill all the required fields.")),!1)},complete:{success:function(e){e.responseJSON;PF.fn.growl.expirable(PF.fn._s("%s added successfully.",PF.fn._n("User","Users",1)))},error:function(e){var t=e.responseJSON;PF.fn.growl.call(PF.fn._s(t.error.message))}}},delete:{submit:function(){return PF.obj.modal.form_data={action:"delete",delete:"user",owner:CHV.obj.resource.user.id,deleting:CHV.obj.resource.user},!0}},ban:{submit:function(){return PF.obj.modal.form_data={action:"ban",ban:"user",banning:CHV.obj.resource.user.id},!0},success:function(){}}},CHV.fn.submit_resource_approve=function(){return PF.obj.modal.form_data={action:"approve",approve:CHV.obj.resource.type,from:"resource",owner:void 0!==CHV.obj.resource.user?CHV.obj.resource.user.id:null,approving:CHV.obj.resource},!0},CHV.fn.complete_resource_approve={success:function(e){e.responseJSON;$("body").fadeOut("normal",function(){redir=CHV.obj.resource.url,window.location=redir})}},CHV.fn.submit_resource_delete=function(){return PF.obj.modal.form_data={action:"delete",delete:CHV.obj.resource.type,from:"resource",owner:void 0!==CHV.obj.resource.user?CHV.obj.resource.user.id:null,deleting:CHV.obj.resource},!0},CHV.fn.complete_resource_delete={success:function(e){e.responseJSON;$("body").fadeOut("normal",function(){var e;e="album"==CHV.obj.resource.type||"image"==CHV.obj.resource.type?CHV.obj.resource.parent_url:CHV.obj.resource.user?CHV.obj.resource.user.url:CHV.obj.resource.url,void 0!==e&&(window.location=e.replace(/\/?$/,"/")+"?deleted")})}},CHV.fn.list_editor={blink:function(e){e.addClass("ui-selecting"),setTimeout(function(){e.removeClass("ui-selecting")},200)},selectionCount:function(){var e=$(PF.obj.listing.selectors.content_listing);e.each(function(){var t=$("[data-content=pop-selection]","[data-content=list-selection][data-tab="+$(this).attr("id")+"]"),a=$(PF.obj.listing.selectors.list_item+".selected",this).length;if(all_count=$(PF.obj.listing.selectors.list_item,this).length,t.toggleClass("disabled",0==a),$("[data-text=selection-count]",t).text(a>0?a:""),"images"==e.data("list")&&a>0){var o=$(PF.obj.listing.selectors.list_item+".selected[data-flag=safe]",this).length>0,i=$(PF.obj.listing.selectors.list_item+".selected[data-flag=unsafe]",this).length>0;$("[data-action=flag-safe]",t)[(i?"remove":"add")+"Class"]("hidden"),$("[data-action=flag-unsafe]",t)[(o?"remove":"add")+"Class"]("hidden")}$(this).is(":visible")&&($("body").toggleClass("--has-selection",a>0),CHV.fn.list_editor.listMassActionSet(all_count==a?"clear":"select"))})},removeFromList:function(e,t){if(void 0!==e){e=e instanceof jQuery==0?$(e):e;var a=$(PF.obj.listing.selectors.content_listing_visible),o=e.length;e.fadeOut("fast");var i=e.first().data("type"),n=parseInt($("[data-text="+i+"-count]").text())-o;CHV.fn.list_editor.updateUserCounters(e.first().data("type"),o,"-"),e.promise().done(function(){$(document).removeClass(CHV.fn.listingViewer.selectors.bodyShown.substr(1));var i={};if(e.each(function(){$("[data-id="+$(this).data("id")+"]").each(function(){var e=$(this).closest(PF.obj.listing.selectors.content_listing).attr("id");i[e]||(i[e]=0),i[e]+=1})}),1==o?$("[data-id="+$(this).data("id")+"]").remove():e.each(function(){$("[data-id="+$(this).data("id")+"]").remove()}),PF.fn.listing.columnizerQueue(),PF.fn.listing.refresh(),CHV.fn.list_editor.selectionCount(),void 0!==t&&"string"==typeof t&&PF.fn.growl.expirable(t),$(PF.obj.listing.selectors.content_listing_pagination,a).exists()||0!=$(PF.obj.listing.selectors.list_item,a).length||(n=0),0==n)a.html(PF.obj.listing.template.empty),$(PF.obj.listing.selectors.content_listing+":not("+PF.obj.listing.selectors.content_listing_visible+")").data({empty:null,load:"ajax"}),$("[data-content=list-selection][data-tab="+a.attr("id")+"]").addClass("disabled");else if(0==$(PF.obj.listing.selectors.list_item,a).length){if($(PF.obj.listing.selectors.pad_content).height(0),$("[data-action=load-more]",a).exists())return $(PF.obj.listing.selectors.content_listing_visible).data("page",0),$("[data-action=load-more]",a).click(),void(PF.obj.listing.recolumnize=!0);var r=$("[data-pagination=next]",a);if(r.exists()){var s=r.attr("href"),l=PF.fn.deparam(s);return"page"in l&&l.page>1&&(s=s.changeURLParameterValue("page",l.page-1)),void(window.location=s)}}})}},deleteFromList:function(e){if(void 0===t)var t=!0;e=e instanceof jQuery==0?$(e):e;this.removeFromList(e,t?PF.fn._s("The content has been deleted."):null)},moveFromList:function(e,t){if(void 0===t)t=!0;e=e instanceof jQuery==0?$(e):e;this.removeFromList(e,t?PF.fn._s("The content has been moved."):null)},toggleSelectItem:function(e,t){if("boolean"!=typeof t)t=!e.hasClass("selected");var a,o,i,n=$(".viewer").is(":visible")?$("[data-type=image][data-id="+e.attr("data-id")+"]"):e,r=$("[data-action=select] .btn-icon",n);n.hasClass("unselect")||(n.addClass("unselect"),t?(Boolean(window.navigator.vibrate)&&window.navigator.vibrate([15,125,25]),n.addClass("selected"),a=r.data("icon-selected"),o=r.data("icon-unselected"),i=PF.fn._s("Unselect")):(n.removeClass("selected ui-selected"),a=r.data("icon-unselected"),o=r.data("icon-selected"),i=PF.fn._s("Select")),r.removeClass(o).addClass(a),setTimeout(function(){n.removeClass("unselect")},350),$("[data-action=select] .label",n).text(i),CHV.fn.list_editor.selectionCount())},selectItem:function(e){this.toggleSelectItem(e,!0)},unselectItem:function(e){this.toggleSelectItem(e,!1),e.removeClass("selected")},selectAll:function(e){this.selectItem($(PF.obj.listing.selectors.list_item+":visible:not(.selected)")),this.listMassActionSet("clear"),e.stopPropagation()},clearSelection:function(e){var t=$(PF.obj.listing.selectors.list_item+".selected",PF.obj.listing.selectors[e?"content_listing":"content_listing_visible"]);this.unselectItem(t),this.listMassActionSet("select")},listMassActionSet:function(e){var t="select"==e?"clear":"select",a=$("[data-text-select-all][data-action=list-"+t+"-all]:visible"),o=a.data("text-"+e+"-all");a.text(o).attr("data-action","list-"+e+"-all"),PF.fn.close_pops()},updateItem:function(e,t,a,o){if(e instanceof jQuery==0)e=$(e);var i=e.data("type"),n="image"==i?t.album:t;if(this.addAlbumtoModals(n),$("option[value="+n.id_encoded+"]","[name=form-album-id]").html(PF.fn.htmlEncode(n.name_with_privacy_readable_html)),void 0===a)a="edit";if("edit"==a||"move"==a){if("move"==a&&"album"==CHV.obj.resource.type)return void CHV.fn.list_editor.moveFromList(e,o);e.attr("data-description",t.description),"image"==i?(void 0!==t.title&&(e.attr("data-title",t.title),e.find("[title]").attr("title",t.title),$("[data-text=image-title]",e).text(PF.fn.htmlEncode(t.title))),void 0!==t.title_truncated&&$("[data-text=image-title-truncated]",e).html(PF.fn.htmlEncode(t.title_truncated)),void 0!==t.category_id&&e.attr("data-category-id",t.category_id),e.attr({"data-album-id":n.id_encoded,"data-flag":1==t.nsfw?"unsafe":"safe"}),$("[data-content=album-link]",e).attr("href",n.url)):e.attr({"data-privacy":n.privacy,"data-password":n.password,"data-name":n.name}),e.attr("data-privacy",n.privacy),$("[data-text=album-name]",e).html(PF.fn.htmlEncode(n.name)),PF.fn.growl.expirable("edit"==a?PF.fn._s("The content has been edited."):PF.fn._s("The content has been moved."))}},addAlbumtoModals:function(e){var t=!1;$("[name=form-album-id]","[data-modal]").each(function(){e.id_encoded&&!$("option[value="+e.id_encoded+"]",this).exists()&&($(this).append('"),t=!0)}),t&&CHV.fn.list_editor.updateUserCounters("album",1,"+")},updateAlbum:function(e){$("[data-id="+e.id_encoded+"]").each(function(){""!==e.html&&($(this).after(e.html),$(this).remove())})},updateUserCounters:function(e,t,a){if(void 0===a)a="+";var o,i,n=$("[data-text="+e+"-count]"),r=$("[data-text="+e+"-label]"),s=(t=parseInt(t),parseInt(n.html()));switch(a){case"+":o=s+t;break;case"-":o=s-t;break;case"=":o=t}i=o-s;var l=$("[data-text=total-"+n.data("text")+"]"),d=$("[data-text="+l.data("text")+"-label]"),c=parseInt(l.html()),u=c+i;n.text(o),l.text(u),r.text(r.data(1==o?"label-single":"label-plural")),d.text(r.data(1==u?"label-single":"label-plural"))},updateMoveItemLists:function(e,t,a){if(CHV.fn.list_editor.clearSelection(),/image/.test(t))"image"==t?CHV.fn.list_editor.updateItem("[data-type=image][data-id="+a.data("id")+"]",e.image,"move"):(a.each(function(){CHV.fn.list_editor.updateItem("[data-type=image][data-id="+$(this).data("id")+"]",e,"move",!1)}),PF.fn.growl.expirable(PF.fn._s("The content has been moved.")));else{if(CHV.fn.list_editor.moveFromList(a,!1),PF.fn.growl.expirable(PF.fn._s("The content has been moved.")),e.album)if(void 0!==e.albums_old?"true"==e.request.album.new:"true"==e.request.editing.new_album){CHV.fn.list_editor.addAlbumtoModals(e.album);var o=parseInt($("[data-text=album-count]").text())-1;$(PF.obj.listing.selectors.pad_content).each(function(){var t=$(this).find(PF.obj.listing.selectors.list_item).length;if(0!=t){var a=PF.fn.deparam($(this).closest(PF.obj.listing.selectors.content_listing).data("params"));"date_desc"!=a.sort&&o!=t||$(this)["date_desc"==a.sort?"prepend":"append"](e.album.html)}})}else CHV.fn.list_editor.updateAlbum(e.album);PF.fn.listing.columnizerQueue(),PF.fn.listing.refresh(0)}}},CHV.fn.import={errorHandler:function(e){PF.fn.growl.call(e.error.message)},reset:function(e){e=parseInt(e);CHV.obj.import.working[e].stats=$.ajax({type:"POST",data:{action:"importReset",id:e}}),CHV.obj.import.working[e].stats.complete(function(t){var a=t.responseJSON;if(a){var o=CHV.fn.import.parseTemplate(a.import);$("[data-id="+a.import.id+"]",CHV.obj.import.sel.root).replaceWith(o),"working"!=a.import.status&&clearInterval(CHV.obj.import.working[e].interval)}})},updateStats:function(e){e=parseInt(e);"readyState"in CHV.obj.import.working[e].stats&&4!=CHV.obj.import.working[e].stats.readyState?console.error("Aborting stats timeout call (previous call is still not ready)"):(CHV.obj.import.working[e].stats=$.ajax({type:"POST",data:{action:"importStats",id:e}}),CHV.obj.import.working[e].stats.complete(function(t){var a=t.responseJSON;if(a){var o=CHV.fn.import.parseTemplate(a.import);$("[data-id="+a.import.id+"]",CHV.obj.import.sel.root).replaceWith(o),"working"!=a.import.status&&clearInterval(CHV.obj.import.working[e].interval)}}))},delete:{submit:function(e){return PF.obj.modal.form_data={action:"importDelete",id:e},!0},deferred:{success:function(e){var t=e.responseJSON;PF.fn.growl.call(PF.fn._s("Import ID %s removed",t.import.id)),$("[data-id="+t.import.id+"]",CHV.obj.import.sel.root).remove(),1==$("li",CHV.obj.import.sel.root).size()&&$(CHV.obj.import.sel.root).addClass("hidden")},error:function(e){CHV.fn.import.errorHandler(e.responseJSON)}}},parseTemplate:function(e,t){var a=CHV.obj.import.rowTpl;for(var o in CHV.obj.import.importTr)void 0!==e[o]&&(a=a.replaceAll("%"+o+"%",e[o]));a=a.replaceAll("%parse%",e.options.root),a=a.replaceAll("%shortParse%",e.options.root.charAt(0)),a=a.replaceAll("%displayStatus%",CHV.obj.import.statusesDisplay[e.status]);var i=$($.parseHTML(a)).attr("data-object",JSON.stringify(e));return i}},CHV.fn.Palettes={timeout:{},get:function(){return($("html").get(0).className.match(/(^|\s)palette-\S+/g)||[]).join(" ")},set:function(e){$("html").attr("data-palette",e).removeClass(this.get()).addClass("palette-"+e)},preview:function(e){$("html").removeClass(this.get()).addClass("palette-"+e)},save:function(){clearTimeout(this.timeout),this.timeout=setTimeout(function(){$.ajax({type:"POST",data:{action:"paletteSet",palette_id:CHV.obj.config.palettesId[$("html").attr("data-palette")]},cache:!1})},400)}},CHV.fn.license={set:{submit:function(){var e=$(PF.obj.modal.selectors.root),t=!0;return $.each($(":input",e),function(e,a){""==$(this).val()&&$(this).attr("required")&&($(this).highlight(),t=!1)}),t?(PF.obj.modal.form_data={action:"set-license-key",key:$("[name=chevereto-license-key]",e).val()},!0):(PF.fn.growl.call(PF.fn._s("Please fill all the required fields.")),!1)},complete:{success:function(e){let t=e.responseJSON,a=$("[data-action=upgrade]");if("free"===CHV.obj.system_info.edition)return a.removeClass("hidden"),void a.trigger("click");PF.fn.growl.call(PF.fn._s(t.success.message))},error:function(e){var t=e.responseJSON;PF.fn.growl.call(PF.fn._s(t.error.message))}}}}; \ No newline at end of file diff --git a/content/legacy/themes/Peafowl/lib/js/scripts.js b/content/legacy/themes/Peafowl/lib/js/scripts.js index a2eaf2b..fa4b41e 100644 --- a/content/legacy/themes/Peafowl/lib/js/scripts.js +++ b/content/legacy/themes/Peafowl/lib/js/scripts.js @@ -82,3 +82,6 @@ case"float":return"Float";default:throw"invalid parseType"}}function generateReg * Copyright (c) 2016 Jorik Tangelder; * Licensed under the MIT license */ !function(a,b,c,d){"use strict";function e(a,b,c){return setTimeout(j(a,c),b)}function f(a,b,c){return Array.isArray(a)?(g(a,c[b],c),!0):!1}function g(a,b,c){var e;if(a)if(a.forEach)a.forEach(b,c);else if(a.length!==d)for(e=0;e\s*\(/gm,"{anonymous}()@"):"Unknown Stack Trace",f=a.console&&(a.console.warn||a.console.log);return f&&f.call(a.console,e,d),b.apply(this,arguments)}}function i(a,b,c){var d,e=b.prototype;d=a.prototype=Object.create(e),d.constructor=a,d._super=e,c&&la(d,c)}function j(a,b){return function(){return a.apply(b,arguments)}}function k(a,b){return typeof a==oa?a.apply(b?b[0]||d:d,b):a}function l(a,b){return a===d?b:a}function m(a,b,c){g(q(b),function(b){a.addEventListener(b,c,!1)})}function n(a,b,c){g(q(b),function(b){a.removeEventListener(b,c,!1)})}function o(a,b){for(;a;){if(a==b)return!0;a=a.parentNode}return!1}function p(a,b){return a.indexOf(b)>-1}function q(a){return a.trim().split(/\s+/g)}function r(a,b,c){if(a.indexOf&&!c)return a.indexOf(b);for(var d=0;dc[b]}):d.sort()),d}function u(a,b){for(var c,e,f=b[0].toUpperCase()+b.slice(1),g=0;g1&&!c.firstMultiple?c.firstMultiple=D(b):1===e&&(c.firstMultiple=!1);var f=c.firstInput,g=c.firstMultiple,h=g?g.center:f.center,i=b.center=E(d);b.timeStamp=ra(),b.deltaTime=b.timeStamp-f.timeStamp,b.angle=I(h,i),b.distance=H(h,i),B(c,b),b.offsetDirection=G(b.deltaX,b.deltaY);var j=F(b.deltaTime,b.deltaX,b.deltaY);b.overallVelocityX=j.x,b.overallVelocityY=j.y,b.overallVelocity=qa(j.x)>qa(j.y)?j.x:j.y,b.scale=g?K(g.pointers,d):1,b.rotation=g?J(g.pointers,d):0,b.maxPointers=c.prevInput?b.pointers.length>c.prevInput.maxPointers?b.pointers.length:c.prevInput.maxPointers:b.pointers.length,C(c,b);var k=a.element;o(b.srcEvent.target,k)&&(k=b.srcEvent.target),b.target=k}function B(a,b){var c=b.center,d=a.offsetDelta||{},e=a.prevDelta||{},f=a.prevInput||{};b.eventType!==Ea&&f.eventType!==Ga||(e=a.prevDelta={x:f.deltaX||0,y:f.deltaY||0},d=a.offsetDelta={x:c.x,y:c.y}),b.deltaX=e.x+(c.x-d.x),b.deltaY=e.y+(c.y-d.y)}function C(a,b){var c,e,f,g,h=a.lastInterval||b,i=b.timeStamp-h.timeStamp;if(b.eventType!=Ha&&(i>Da||h.velocity===d)){var j=b.deltaX-h.deltaX,k=b.deltaY-h.deltaY,l=F(i,j,k);e=l.x,f=l.y,c=qa(l.x)>qa(l.y)?l.x:l.y,g=G(j,k),a.lastInterval=b}else c=h.velocity,e=h.velocityX,f=h.velocityY,g=h.direction;b.velocity=c,b.velocityX=e,b.velocityY=f,b.direction=g}function D(a){for(var b=[],c=0;ce;)c+=a[e].clientX,d+=a[e].clientY,e++;return{x:pa(c/b),y:pa(d/b)}}function F(a,b,c){return{x:b/a||0,y:c/a||0}}function G(a,b){return a===b?Ia:qa(a)>=qa(b)?0>a?Ja:Ka:0>b?La:Ma}function H(a,b,c){c||(c=Qa);var d=b[c[0]]-a[c[0]],e=b[c[1]]-a[c[1]];return Math.sqrt(d*d+e*e)}function I(a,b,c){c||(c=Qa);var d=b[c[0]]-a[c[0]],e=b[c[1]]-a[c[1]];return 180*Math.atan2(e,d)/Math.PI}function J(a,b){return I(b[1],b[0],Ra)+I(a[1],a[0],Ra)}function K(a,b){return H(b[0],b[1],Ra)/H(a[0],a[1],Ra)}function L(){this.evEl=Ta,this.evWin=Ua,this.pressed=!1,x.apply(this,arguments)}function M(){this.evEl=Xa,this.evWin=Ya,x.apply(this,arguments),this.store=this.manager.session.pointerEvents=[]}function N(){this.evTarget=$a,this.evWin=_a,this.started=!1,x.apply(this,arguments)}function O(a,b){var c=s(a.touches),d=s(a.changedTouches);return b&(Ga|Ha)&&(c=t(c.concat(d),"identifier",!0)),[c,d]}function P(){this.evTarget=bb,this.targetIds={},x.apply(this,arguments)}function Q(a,b){var c=s(a.touches),d=this.targetIds;if(b&(Ea|Fa)&&1===c.length)return d[c[0].identifier]=!0,[c,c];var e,f,g=s(a.changedTouches),h=[],i=this.target;if(f=c.filter(function(a){return o(a.target,i)}),b===Ea)for(e=0;e-1&&d.splice(a,1)};setTimeout(e,cb)}}function U(a){for(var b=a.srcEvent.clientX,c=a.srcEvent.clientY,d=0;d=f&&db>=g)return!0}return!1}function V(a,b){this.manager=a,this.set(b)}function W(a){if(p(a,jb))return jb;var b=p(a,kb),c=p(a,lb);return b&&c?jb:b||c?b?kb:lb:p(a,ib)?ib:hb}function X(){if(!fb)return!1;var b={},c=a.CSS&&a.CSS.supports;return["auto","manipulation","pan-y","pan-x","pan-x pan-y","none"].forEach(function(d){b[d]=c?a.CSS.supports("touch-action",d):!0}),b}function Y(a){this.options=la({},this.defaults,a||{}),this.id=v(),this.manager=null,this.options.enable=l(this.options.enable,!0),this.state=nb,this.simultaneous={},this.requireFail=[]}function Z(a){return a&sb?"cancel":a&qb?"end":a&pb?"move":a&ob?"start":""}function $(a){return a==Ma?"down":a==La?"up":a==Ja?"left":a==Ka?"right":""}function _(a,b){var c=b.manager;return c?c.get(a):a}function aa(){Y.apply(this,arguments)}function ba(){aa.apply(this,arguments),this.pX=null,this.pY=null}function ca(){aa.apply(this,arguments)}function da(){Y.apply(this,arguments),this._timer=null,this._input=null}function ea(){aa.apply(this,arguments)}function fa(){aa.apply(this,arguments)}function ga(){Y.apply(this,arguments),this.pTime=!1,this.pCenter=!1,this._timer=null,this._input=null,this.count=0}function ha(a,b){return b=b||{},b.recognizers=l(b.recognizers,ha.defaults.preset),new ia(a,b)}function ia(a,b){this.options=la({},ha.defaults,b||{}),this.options.inputTarget=this.options.inputTarget||a,this.handlers={},this.session={},this.recognizers=[],this.oldCssProps={},this.element=a,this.input=y(this),this.touchAction=new V(this,this.options.touchAction),ja(this,!0),g(this.options.recognizers,function(a){var b=this.add(new a[0](a[1]));a[2]&&b.recognizeWith(a[2]),a[3]&&b.requireFailure(a[3])},this)}function ja(a,b){var c=a.element;if(c.style){var d;g(a.options.cssProps,function(e,f){d=u(c.style,f),b?(a.oldCssProps[d]=c.style[d],c.style[d]=e):c.style[d]=a.oldCssProps[d]||""}),b||(a.oldCssProps={})}}function ka(a,c){var d=b.createEvent("Event");d.initEvent(a,!0,!0),d.gesture=c,c.target.dispatchEvent(d)}var la,ma=["","webkit","Moz","MS","ms","o"],na=b.createElement("div"),oa="function",pa=Math.round,qa=Math.abs,ra=Date.now;la="function"!=typeof Object.assign?function(a){if(a===d||null===a)throw new TypeError("Cannot convert undefined or null to object");for(var b=Object(a),c=1;ch&&(b.push(a),h=b.length-1):e&(Ga|Ha)&&(c=!0),0>h||(b[h]=a,this.callback(this.manager,e,{pointers:b,changedPointers:[a],pointerType:f,srcEvent:a}),c&&b.splice(h,1))}});var Za={touchstart:Ea,touchmove:Fa,touchend:Ga,touchcancel:Ha},$a="touchstart",_a="touchstart touchmove touchend touchcancel";i(N,x,{handler:function(a){var b=Za[a.type];if(b===Ea&&(this.started=!0),this.started){var c=O.call(this,a,b);b&(Ga|Ha)&&c[0].length-c[1].length===0&&(this.started=!1),this.callback(this.manager,b,{pointers:c[0],changedPointers:c[1],pointerType:za,srcEvent:a})}}});var ab={touchstart:Ea,touchmove:Fa,touchend:Ga,touchcancel:Ha},bb="touchstart touchmove touchend touchcancel";i(P,x,{handler:function(a){var b=ab[a.type],c=Q.call(this,a,b);c&&this.callback(this.manager,b,{pointers:c[0],changedPointers:c[1],pointerType:za,srcEvent:a})}});var cb=2500,db=25;i(R,x,{handler:function(a,b,c){var d=c.pointerType==za,e=c.pointerType==Ba;if(!(e&&c.sourceCapabilities&&c.sourceCapabilities.firesTouchEvents)){if(d)S.call(this,b,c);else if(e&&U.call(this,c))return;this.callback(a,b,c)}},destroy:function(){this.touch.destroy(),this.mouse.destroy()}});var eb=u(na.style,"touchAction"),fb=eb!==d,gb="compute",hb="auto",ib="manipulation",jb="none",kb="pan-x",lb="pan-y",mb=X();V.prototype={set:function(a){a==gb&&(a=this.compute()),fb&&this.manager.element.style&&mb[a]&&(this.manager.element.style[eb]=a),this.actions=a.toLowerCase().trim()},update:function(){this.set(this.manager.options.touchAction)},compute:function(){var a=[];return g(this.manager.recognizers,function(b){k(b.options.enable,[b])&&(a=a.concat(b.getTouchAction()))}),W(a.join(" "))},preventDefaults:function(a){var b=a.srcEvent,c=a.offsetDirection;if(this.manager.session.prevented)return void b.preventDefault();var d=this.actions,e=p(d,jb)&&!mb[jb],f=p(d,lb)&&!mb[lb],g=p(d,kb)&&!mb[kb];if(e){var h=1===a.pointers.length,i=a.distance<2,j=a.deltaTime<250;if(h&&i&&j)return}return g&&f?void 0:e||f&&c&Na||g&&c&Oa?this.preventSrc(b):void 0},preventSrc:function(a){this.manager.session.prevented=!0,a.preventDefault()}};var nb=1,ob=2,pb=4,qb=8,rb=qb,sb=16,tb=32;Y.prototype={defaults:{},set:function(a){return la(this.options,a),this.manager&&this.manager.touchAction.update(),this},recognizeWith:function(a){if(f(a,"recognizeWith",this))return this;var b=this.simultaneous;return a=_(a,this),b[a.id]||(b[a.id]=a,a.recognizeWith(this)),this},dropRecognizeWith:function(a){return f(a,"dropRecognizeWith",this)?this:(a=_(a,this),delete this.simultaneous[a.id],this)},requireFailure:function(a){if(f(a,"requireFailure",this))return this;var b=this.requireFail;return a=_(a,this),-1===r(b,a)&&(b.push(a),a.requireFailure(this)),this},dropRequireFailure:function(a){if(f(a,"dropRequireFailure",this))return this;a=_(a,this);var b=r(this.requireFail,a);return b>-1&&this.requireFail.splice(b,1),this},hasRequireFailures:function(){return this.requireFail.length>0},canRecognizeWith:function(a){return!!this.simultaneous[a.id]},emit:function(a){function b(b){c.manager.emit(b,a)}var c=this,d=this.state;qb>d&&b(c.options.event+Z(d)),b(c.options.event),a.additionalEvent&&b(a.additionalEvent),d>=qb&&b(c.options.event+Z(d))},tryEmit:function(a){return this.canEmit()?this.emit(a):void(this.state=tb)},canEmit:function(){for(var a=0;af?Ja:Ka,c=f!=this.pX,d=Math.abs(a.deltaX)):(e=0===g?Ia:0>g?La:Ma,c=g!=this.pY,d=Math.abs(a.deltaY))),a.direction=e,c&&d>b.threshold&&e&b.direction},attrTest:function(a){return aa.prototype.attrTest.call(this,a)&&(this.state&ob||!(this.state&ob)&&this.directionTest(a))},emit:function(a){this.pX=a.deltaX,this.pY=a.deltaY;var b=$(a.direction);b&&(a.additionalEvent=this.options.event+b),this._super.emit.call(this,a)}}),i(ca,aa,{defaults:{event:"pinch",threshold:0,pointers:2},getTouchAction:function(){return[jb]},attrTest:function(a){return this._super.attrTest.call(this,a)&&(Math.abs(a.scale-1)>this.options.threshold||this.state&ob)},emit:function(a){if(1!==a.scale){var b=a.scale<1?"in":"out";a.additionalEvent=this.options.event+b}this._super.emit.call(this,a)}}),i(da,Y,{defaults:{event:"press",pointers:1,time:251,threshold:9},getTouchAction:function(){return[hb]},process:function(a){var b=this.options,c=a.pointers.length===b.pointers,d=a.distanceb.time;if(this._input=a,!d||!c||a.eventType&(Ga|Ha)&&!f)this.reset();else if(a.eventType&Ea)this.reset(),this._timer=e(function(){this.state=rb,this.tryEmit()},b.time,this);else if(a.eventType&Ga)return rb;return tb},reset:function(){clearTimeout(this._timer)},emit:function(a){this.state===rb&&(a&&a.eventType&Ga?this.manager.emit(this.options.event+"up",a):(this._input.timeStamp=ra(),this.manager.emit(this.options.event,this._input)))}}),i(ea,aa,{defaults:{event:"rotate",threshold:0,pointers:2},getTouchAction:function(){return[jb]},attrTest:function(a){return this._super.attrTest.call(this,a)&&(Math.abs(a.rotation)>this.options.threshold||this.state&ob)}}),i(fa,aa,{defaults:{event:"swipe",threshold:10,velocity:.3,direction:Na|Oa,pointers:1},getTouchAction:function(){return ba.prototype.getTouchAction.call(this)},attrTest:function(a){var b,c=this.options.direction;return c&(Na|Oa)?b=a.overallVelocity:c&Na?b=a.overallVelocityX:c&Oa&&(b=a.overallVelocityY),this._super.attrTest.call(this,a)&&c&a.offsetDirection&&a.distance>this.options.threshold&&a.maxPointers==this.options.pointers&&qa(b)>this.options.velocity&&a.eventType&Ga},emit:function(a){var b=$(a.offsetDirection);b&&this.manager.emit(this.options.event+b,a),this.manager.emit(this.options.event,a)}}),i(ga,Y,{defaults:{event:"tap",pointers:1,taps:1,interval:300,time:250,threshold:9,posThreshold:10},getTouchAction:function(){return[ib]},process:function(a){var b=this.options,c=a.pointers.length===b.pointers,d=a.distance',t,""].join(""),c.id=v,(h?c:u).innerHTML+=o,u.appendChild(c),h||(u.style.background="",u.style.overflow="hidden",l=m.style.overflow,m.style.overflow="hidden",m.appendChild(u)),r=i(c,t),h?c.parentNode.removeChild(c):(u.parentNode.removeChild(u),m.style.overflow=l),!!r},A=function(){function t(t,s){s=s||e.createElement(n[t]||"div"),t="on"+t;var r=t in s;return r||(s.setAttribute||(s=e.createElement("div")),s.setAttribute&&s.removeAttribute&&(s.setAttribute(t,""),r=o(s[t],"function"),o(s[t],"undefined")||(s[t]=i),s.removeAttribute(t))),s=null,r}var n={select:"input",change:"input",submit:"form",reset:"form",error:"img",load:"img",abort:"img"};return t}(),W={}.hasOwnProperty;for(var M in p=o(W,"undefined")||o(W.call,"undefined")?function(t,e){return e in t&&o(t.constructor.prototype[e],"undefined")}:function(t,e){return W.call(t,e)},Function.prototype.bind||(Function.prototype.bind=function(t){var e=this;if("function"!=typeof e)throw new TypeError;var i=I.call(arguments,1),n=function(){if(this instanceof n){var s=function(){};s.prototype=e.prototype;var o=new s,r=e.apply(o,i.concat(I.call(arguments)));return Object(r)===r?r:o}return e.apply(t,i.concat(I.call(arguments)))};return n}),N.flexbox=function(){return c("flexWrap")},N.flexboxlegacy=function(){return c("boxDirection")},N.canvas=function(){var t=e.createElement("canvas");return!!t.getContext&&!!t.getContext("2d")},N.canvastext=function(){return!!d.canvas&&!!o(e.createElement("canvas").getContext("2d").fillText,"function")},N.webgl=function(){return!!t.WebGLRenderingContext},N.touch=function(){var i;return"ontouchstart"in t||t.DocumentTouch&&e instanceof DocumentTouch?i=!0:z(["@media (",C.join("touch-enabled),("),v,")","{#modernizr{top:9px;position:absolute}}"].join(""),function(t){i=9===t.offsetTop}),i},N.geolocation=function(){return"geolocation"in navigator},N.postmessage=function(){return!!t.postMessage},N.websqldatabase=function(){return!!t.openDatabase},N.indexedDB=function(){return!!c("indexedDB",t)},N.hashchange=function(){return A("hashchange",t)&&(e.documentMode===i||e.documentMode>7)},N.history=function(){return!!t.history&&!!history.pushState},N.draganddrop=function(){var t=e.createElement("div");return"draggable"in t||"ondragstart"in t&&"ondrop"in t},N.websockets=function(){return"WebSocket"in t||"MozWebSocket"in t},N.rgba=function(){return n("background-color:rgba(150,255,150,.5)"),r(b.backgroundColor,"rgba")},N.hsla=function(){return n("background-color:hsla(120,40%,100%,.5)"),r(b.backgroundColor,"rgba")||r(b.backgroundColor,"hsla")},N.multiplebgs=function(){return n("background:url(https://),url(https://),red url(https://)"),/(url\s*\(.*?){3}/.test(b.background)},N.backgroundsize=function(){return c("backgroundSize")},N.borderimage=function(){return c("borderImage")},N.borderradius=function(){return c("borderRadius")},N.boxshadow=function(){return c("boxShadow")},N.textshadow=function(){return""===e.createElement("div").style.textShadow},N.opacity=function(){return s("opacity:.55"),/^0.55$/.test(b.opacity)},N.cssanimations=function(){return c("animationName")},N.csscolumns=function(){return c("columnCount")},N.cssgradients=function(){var t="background-image:",e="gradient(linear,left top,right bottom,from(#9f9),to(white));",i="linear-gradient(left top,#9f9, white);";return n((t+"-webkit- ".split(" ").join(e+t)+C.join(i+t)).slice(0,-t.length)),r(b.backgroundImage,"gradient")},N.cssreflections=function(){return c("boxReflect")},N.csstransforms=function(){return!!c("transform")},N.csstransforms3d=function(){var t=!!c("perspective");return t&&"webkitPerspective"in m.style&&z("@media (transform-3d),(-webkit-transform-3d){#modernizr{left:9px;position:absolute;height:3px;}}",function(e,i){t=9===e.offsetLeft&&3===e.offsetHeight}),t},N.csstransitions=function(){return c("transition")},N.fontface=function(){var t;return z('@font-face {font-family:"font";src:url("https://")}',function(i,n){var s=e.getElementById("smodernizr"),o=s.sheet||s.styleSheet,r=o?o.cssRules&&o.cssRules[0]?o.cssRules[0].cssText:o.cssText||"":"";t=/src/i.test(r)&&0===r.indexOf(n.split(" ")[0])}),t},N.generatedcontent=function(){var t;return z(["#",v,"{font:0/0 a}#",v,':after{content:"',x,'";visibility:hidden;font:3px/1 a}'].join(""),function(e){t=e.offsetHeight>=3}),t},N.video=function(){var t=e.createElement("video"),i=!1;try{(i=!!t.canPlayType)&&(i=new Boolean(i),i.ogg=t.canPlayType('video/ogg; codecs="theora"').replace(/^no$/,""),i.h264=t.canPlayType('video/mp4; codecs="avc1.42E01E"').replace(/^no$/,""),i.webm=t.canPlayType('video/webm; codecs="vp8, vorbis"').replace(/^no$/,""))}catch(t){}return i},N.audio=function(){var t=e.createElement("audio"),i=!1;try{(i=!!t.canPlayType)&&(i=new Boolean(i),i.ogg=t.canPlayType('audio/ogg; codecs="vorbis"').replace(/^no$/,""),i.mp3=t.canPlayType("audio/mpeg;").replace(/^no$/,""),i.wav=t.canPlayType('audio/wav; codecs="1"').replace(/^no$/,""),i.m4a=(t.canPlayType("audio/x-m4a;")||t.canPlayType("audio/aac;")).replace(/^no$/,""))}catch(t){}return i},N.localstorage=function(){try{return localStorage.setItem(v,v),localStorage.removeItem(v),!0}catch(t){return!1}},N.sessionstorage=function(){try{return sessionStorage.setItem(v,v),sessionStorage.removeItem(v),!0}catch(t){return!1}},N.webworkers=function(){return!!t.Worker},N.applicationcache=function(){return!!t.applicationCache},N.svg=function(){return!!e.createElementNS&&!!e.createElementNS(P.svg,"svg").createSVGRect},N.inlinesvg=function(){var t=e.createElement("div");return t.innerHTML="",(t.firstChild&&t.firstChild.namespaceURI)==P.svg},N.smil=function(){return!!e.createElementNS&&/SVGAnimate/.test(_.call(e.createElementNS(P.svg,"animate")))},N.svgclippaths=function(){return!!e.createElementNS&&/SVGClipPath/.test(_.call(e.createElementNS(P.svg,"clipPath")))},N)p(N,M)&&(u=M.toLowerCase(),d[u]=N[M](),D.push((d[u]?"":"no-")+u));return d.input||h(),d.addTest=function(t,e){if("object"==typeof t)for(var n in t)p(t,n)&&d.addTest(n,t[n]);else{if(t=t.toLowerCase(),d[t]!==i)return d;e="function"==typeof e?e():e,void 0!==g&&g&&(m.className+=" "+(e?"":"no-")+t),d[t]=e}return d},n(""),y=w=null,function(t,e){function i(t,e){var i=t.createElement("p"),n=t.getElementsByTagName("head")[0]||t.documentElement;return i.innerHTML="x",n.insertBefore(i.lastChild,n.firstChild)}function n(){var t=v.elements;return"string"==typeof t?t.split(" "):t}function s(t){var e=m[t[d]];return e||(e={},g++,t[d]=g,m[g]=e),e}function o(t,i,n){return i||(i=e),h?i.createElement(t):(n||(n=s(i)),o=n.cache[t]?n.cache[t].cloneNode():f.test(t)?(n.cache[t]=n.createElem(t)).cloneNode():n.createElem(t),o.canHaveChildren&&!p.test(t)?n.frag.appendChild(o):o);var o}function r(t,i){if(t||(t=e),h)return t.createDocumentFragment();i=i||s(t);for(var o=i.frag.cloneNode(),r=0,a=n(),l=a.length;r",c="hidden"in t,h=1==t.childNodes.length||function(){e.createElement("a");var t=e.createDocumentFragment();return void 0===t.cloneNode||void 0===t.createDocumentFragment||void 0===t.createElement}()}catch(t){c=!0,h=!0}})();var v={elements:u.elements||"abbr article aside audio bdi canvas data datalist details figcaption figure footer header hgroup mark meter nav output progress section summary time video",shivCSS:!1!==u.shivCSS,supportsUnknownElements:h,shivMethods:!1!==u.shivMethods,type:"default",shivDocument:l,createElement:o,createDocumentFragment:r};t.html5=v,l(e)}(this,e),d._version=f,d._prefixes=C,d._domPrefixes=E,d._cssomPrefixes=S,d.hasEvent=A,d.testProp=function(t){return a([t])},d.testAllProps=c,d.testStyles=z,m.className=m.className.replace(/(^|\s)no-js(\s|$)/,"$1$2")+(g?" js "+D.join(" "):""),d}(this,this.document),function(t,e,i){function n(t){return"[object Function]"==m.call(t)}function s(t){return"string"==typeof t}function o(){}function r(t){return!t||"loaded"==t||"complete"==t||"uninitialized"==t}function a(){var t=v.shift();y=1,t?t.t?d(function(){("c"==t.t?p.injectCss:p.injectJs)(t.s,0,t.a,t.x,t.e,1)},0):(t(),a()):y=0}function l(t,i,n,s,o,l,c){function h(e){if(!f&&r(u.readyState)&&(b.r=f=1,!y&&a(),u.onload=u.onreadystatechange=null,e))for(var n in"img"!=t&&d(function(){x.removeChild(u)},50),E[i])E[i].hasOwnProperty(n)&&E[i][n].onload()}c=c||p.errorTimeout;var u=e.createElement(t),f=0,m=0,b={t:n,s:i,e:o,a:l,x:c};1===E[i]&&(m=1,E[i]=[]),"object"==t?u.data=i:(u.src=i,u.type=t),u.width=u.height="0",u.onerror=u.onload=u.onreadystatechange=function(){h.call(this,m)},v.splice(s,0,b),"img"!=t&&(m||2===E[i]?(x.insertBefore(u,w?null:g),d(h,c)):E[i].push(u))}function c(t,e,i,n,o){return y=0,e=e||"j",s(t)?l("c"==e?C:_,t,e,this.i++,i,n,o):(v.splice(this.i++,0,t),1==v.length&&a()),this}function h(){var t=p;return t.loader={load:c,i:0},t}var u,p,f=e.documentElement,d=t.setTimeout,g=e.getElementsByTagName("script")[0],m={}.toString,v=[],y=0,b="MozAppearance"in f.style,w=b&&!!e.createRange().compareNode,x=w?f:g.parentNode,_=(f=t.opera&&"[object Opera]"==m.call(t.opera),f=!!e.attachEvent&&!f,b?"object":f?"script":"img"),C=f?"script":_,T=Array.isArray||function(t){return"[object Array]"==m.call(t)},S=[],E={},P={timeout:function(t,e){return e.length&&(t.timeout=e[0]),t}};p=function(t){function e(t){t=t.split("!");var e,i,n,s=S.length,o=t.pop(),r=t.length;o={url:o,origUrl:o,prefixes:t};for(i=0;i0&&e-1 in t)))}function n(t){var e=St[t]={};return ht.each(t.match(pt)||[],function(t,i){e[i]=!0}),e}function s(t,i,n,s){if(ht.acceptData(t)){var o,r,a=ht.expando,l=t.nodeType,c=l?ht.cache:t,h=l?t[a]:t[a]&&a;if(h&&c[h]&&(s||c[h].data)||n!==e||"string"!=typeof i)return h||(h=l?t[a]=et.pop()||ht.guid++:a),c[h]||(c[h]=l?{}:{toJSON:ht.noop}),("object"==typeof i||"function"==typeof i)&&(s?c[h]=ht.extend(c[h],i):c[h].data=ht.extend(c[h].data,i)),r=c[h],s||(r.data||(r.data={}),r=r.data),n!==e&&(r[ht.camelCase(i)]=n),"string"==typeof i?(o=r[i],null==o&&(o=r[ht.camelCase(i)])):o=r,o}}function o(t,e,i){if(ht.acceptData(t)){var n,s,o=t.nodeType,r=o?ht.cache:t,l=o?t[ht.expando]:ht.expando;if(r[l]){if(e&&(n=i?r[l]:r[l].data)){ht.isArray(e)?e=e.concat(ht.map(e,ht.camelCase)):e in n?e=[e]:(e=ht.camelCase(e),e=e in n?[e]:e.split(" ")),s=e.length;for(;s--;)delete n[e[s]];if(i?!a(n):!ht.isEmptyObject(n))return}(i||(delete r[l].data,a(r[l])))&&(o?ht.cleanData([t],!0):ht.support.deleteExpando||r!=r.window?delete r[l]:r[l]=null)}}}function r(t,i,n){if(n===e&&1===t.nodeType){var s="data-"+i.replace(Pt,"-$1").toLowerCase();if(n=t.getAttribute(s),"string"==typeof n){try{n="true"===n||"false"!==n&&("null"===n?null:+n+""===n?+n:Et.test(n)?ht.parseJSON(n):n)}catch(t){}ht.data(t,i,n)}else n=e}return n}function a(t){var e;for(e in t)if(("data"!==e||!ht.isEmptyObject(t[e]))&&"toJSON"!==e)return!1;return!0}function l(){return!0}function c(){return!1}function h(){try{return Q.activeElement}catch(t){}}function u(t,e){do{t=t[e]}while(t&&1!==t.nodeType);return t}function p(t,e,i){if(ht.isFunction(e))return ht.grep(t,function(t,n){return!!e.call(t,n,t)!==i});if(e.nodeType)return ht.grep(t,function(t){return t===e!==i});if("string"==typeof e){if(Bt.test(e))return ht.filter(e,t,i);e=ht.filter(e,t)}return ht.grep(t,function(t){return ht.inArray(t,e)>=0!==i})}function f(t){var e=Yt.split("|"),i=t.createDocumentFragment();if(i.createElement)for(;e.length;)i.createElement(e.pop());return i}function d(t,e){return ht.nodeName(t,"table")&&ht.nodeName(1===e.nodeType?e:e.firstChild,"tr")?t.getElementsByTagName("tbody")[0]||t.appendChild(t.ownerDocument.createElement("tbody")):t}function g(t){return t.type=(null!==ht.find.attr(t,"type"))+"/"+t.type,t}function m(t){var e=se.exec(t.type);return e?t.type=e[1]:t.removeAttribute("type"),t}function v(t,e){for(var i,n=0;null!=(i=t[n]);n++)ht._data(i,"globalEval",!e||ht._data(e[n],"globalEval"))}function y(t,e){if(1===e.nodeType&&ht.hasData(t)){var i,n,s,o=ht._data(t),r=ht._data(e,o),a=o.events;if(a)for(i in delete r.handle,r.events={},a)for(n=0,s=a[i].length;s>n;n++)ht.event.add(e,i,a[i][n]);r.data&&(r.data=ht.extend({},r.data))}}function b(t,e){var i,n,s;if(1===e.nodeType){if(i=e.nodeName.toLowerCase(),!ht.support.noCloneEvent&&e[ht.expando]){for(n in s=ht._data(e),s.events)ht.removeEvent(e,n,s.handle);e.removeAttribute(ht.expando)}"script"===i&&e.text!==t.text?(g(e).text=t.text,m(e)):"object"===i?(e.parentNode&&(e.outerHTML=t.outerHTML),ht.support.html5Clone&&t.innerHTML&&!ht.trim(e.innerHTML)&&(e.innerHTML=t.innerHTML)):"input"===i&&ee.test(t.type)?(e.defaultChecked=e.checked=t.checked,e.value!==t.value&&(e.value=t.value)):"option"===i?e.defaultSelected=e.selected=t.defaultSelected:("input"===i||"textarea"===i)&&(e.defaultValue=t.defaultValue)}}function w(t,i){var n,s,o=0,r=typeof t.getElementsByTagName!==V?t.getElementsByTagName(i||"*"):typeof t.querySelectorAll!==V?t.querySelectorAll(i||"*"):e;if(!r)for(r=[],n=t.childNodes||t;null!=(s=n[o]);o++)!i||ht.nodeName(s,i)?r.push(s):ht.merge(r,w(s,i));return i===e||i&&ht.nodeName(t,i)?ht.merge([t],r):r}function x(t){ee.test(t.type)&&(t.defaultChecked=t.checked)}function _(t,e){if(e in t)return e;for(var i=e.charAt(0).toUpperCase()+e.slice(1),n=e,s=Te.length;s--;)if(e=Te[s]+i,e in t)return e;return n}function C(t,e){return t=e||t,"none"===ht.css(t,"display")||!ht.contains(t.ownerDocument,t)}function T(t,e){for(var i,n,s,o=[],r=0,a=t.length;a>r;r++)n=t[r],n.style&&(o[r]=ht._data(n,"olddisplay"),i=n.style.display,e?(o[r]||"none"!==i||(n.style.display=""),""===n.style.display&&C(n)&&(o[r]=ht._data(n,"olddisplay",N(n.nodeName)))):o[r]||(s=C(n),(i&&"none"!==i||!s)&&ht._data(n,"olddisplay",s?i:ht.css(n,"display"))));for(r=0;a>r;r++)n=t[r],n.style&&(e&&"none"!==n.style.display&&""!==n.style.display||(n.style.display=e?o[r]||"":"none"));return t}function S(t,e,i){var n=ve.exec(e);return n?Math.max(0,n[1]-(i||0))+(n[2]||"px"):e}function E(t,e,i,n,s){for(var o=i===(n?"border":"content")?4:"width"===e?1:0,r=0;4>o;o+=2)"margin"===i&&(r+=ht.css(t,i+Ce[o],!0,s)),n?("content"===i&&(r-=ht.css(t,"padding"+Ce[o],!0,s)),"margin"!==i&&(r-=ht.css(t,"border"+Ce[o]+"Width",!0,s))):(r+=ht.css(t,"padding"+Ce[o],!0,s),"padding"!==i&&(r+=ht.css(t,"border"+Ce[o]+"Width",!0,s)));return r}function P(t,e,i){var n=!0,s="width"===e?t.offsetWidth:t.offsetHeight,o=he(t),r=ht.support.boxSizing&&"border-box"===ht.css(t,"boxSizing",!1,o);if(0>=s||null==s){if(s=ue(t,e,o),(0>s||null==s)&&(s=t.style[e]),ye.test(s))return s;n=r&&(ht.support.boxSizingReliable||s===t.style[e]),s=parseFloat(s)||0}return s+E(t,e,i||(r?"border":"content"),n,o)+"px"}function N(t){var e=Q,i=we[t];return i||(i=k(t,e),"none"!==i&&i||(ce=(ce||ht("').bind("load",function(){var e,r=t.isArray(n.paramName)?n.paramName:[n.paramName];o.unbind("load").bind("load",function(){var e;try{if(e=o.contents(),!e.length||!e[0].firstChild)throw new Error}catch(t){e=void 0}s(200,"success",{iframe:e}),t('').appendTo(i),window.setTimeout(function(){i.remove()},0)}),i.prop("target",o.prop("name")).prop("action",n.url).prop("method",n.type),n.formData&&t.each(n.formData,function(e,n){t('').prop("name",n.name).val(n.value).appendTo(i)}),n.fileInput&&n.fileInput.length&&"POST"===n.type&&(e=n.fileInput.clone(),n.fileInput.after(function(t){return e[t]}),n.paramName&&n.fileInput.each(function(e){t(this).prop("name",r[e]||n.paramName)}),i.append(n.fileInput).prop("enctype","multipart/form-data").prop("encoding","multipart/form-data")),i.submit(),e&&e.length&&n.fileInput.each(function(n,i){var o=t(e[n]);t(i).prop("name",o.prop("name")),o.replaceWith(i)})}),i.append(o).appendTo(document.body)},abort:function(){o&&o.unbind("load").prop("src","javascript".concat(":false;")),i&&i.remove()}}}),t.ajaxSetup({converters:{"iframe text":function(e){return e&&t(e[0].body).text()},"iframe json":function(e){return e&&t.parseJSON(t(e[0].body).text())},"iframe html":function(e){return e&&t(e[0].body).html()},"iframe xml":function(e){var n=e&&e[0];return n&&t.isXMLDoc(n)?n:t.parseXML(n.XMLDocument&&n.XMLDocument.xml||t(n.body).html())},"iframe script":function(e){return e&&t.globalEval(t(e[0].body).text())}}})}),function(t,e){"object"==typeof exports?module.exports=e():"function"==typeof define&&define.amd?define(e):t.Spinner=e()}(this,function(){function t(t,e){var n,i=document.createElement(t||"div");for(n in e)i[n]=e[n];return i}function e(t){for(var e=1,n=arguments.length;e',n)}p.addRule(".spin-vml","behavior:url(#default#VML)"),l.prototype.lines=function(t,i){function r(){return o(n("group",{coordsize:u+" "+u,coordorigin:-c+" "+-c}),{width:u,height:u})}function a(t,a,l){e(h,e(o(r(),{rotation:360/i.lines*t+"deg",left:~~a}),e(o(n("roundrect",{arcsize:i.corners}),{width:c,height:i.width,left:i.radius,top:-i.width>>1,filter:l}),n("fill",{color:s(i.color,t),opacity:i.opacity}),n("stroke",{opacity:0}))))}var l,c=i.length+i.width,u=2*c,d=2*-(i.width+i.length)+"px",h=o(r(),{position:"absolute",top:d,left:d});if(i.shadow)for(l=1;l<=i.lines;l++)a(l,-2,"progid:DXImageTransform.Microsoft.Blur(pixelradius=2,makeshadow=1,shadowopacity=.3)");for(l=1;l<=i.lines;l++)a(l);return e(t,h)},l.prototype.opacity=function(t,e,n,i){var o=t.firstChild;i=i.shadow&&i.lines||0,o&&e+i>1):parseInt(s.left,10)+c)+"px",top:("auto"==s.top?i.y-n.y+(e.offsetHeight>>1):parseInt(s.top,10)+c)+"px"})),l.setAttribute("role","progressbar"),r.lines(l,r.opts),!u){var d,h=0,f=(s.lines-1)*(1-s.direction)/2,p=s.fps,g=p/s.speed,m=(1-s.opacity)/(g*s.trail/100),b=g/s.lines;(function t(){h++;for(var e=0;e>1)+"px"})}for(var l,c=0,d=(r.lines-1)*(1-r.direction)/2;ce.clientHeight,t.horizontal=e.scrollWidth>e.clientWidth,t}}(jQuery),function(t){function e(e,n){this.el=t(e),this.options=n||{},this.x=!1!==this.options.x||this.options.forceHorizontal,this.y=!1!==this.options.y||this.options.forceVertical,this.autoHide=!1!==this.options.autoHide,this.padding=null==this.options.padding?2:this.options.padding,this.inner=this.el.find(".antiscroll-inner"),this.inner.css({width:"+="+(this.y?o():0),height:"+="+(this.x?o():0)}),this.refresh()}function n(e){this.pane=e,this.pane.el.append(this.el),this.innerEl=this.pane.inner.get(0),this.dragging=!1,this.enter=!1,this.shown=!1,this.pane.el.mouseenter(t.proxy(this,"mouseenter")),this.pane.el.mouseleave(t.proxy(this,"mouseleave")),this.el.mousedown(t.proxy(this,"mousedown")),this.innerPaneScrollListener=t.proxy(this,"scroll"),this.pane.inner.scroll(this.innerPaneScrollListener),this.innerPaneMouseWheelListener=t.proxy(this,"mousewheel"),this.pane.inner.bind("mousewheel",this.innerPaneMouseWheelListener);var n=this.pane.options.initialDisplay;!1!==n&&(this.show(),this.pane.autoHide&&(this.hiding=setTimeout(t.proxy(this,"hide"),parseInt(n,10)||3e3)))}function i(t,e){function n(){}n.prototype=e.prototype,t.prototype=new n}function o(){if(void 0===r){var e=t('
    ');t("body").append(e);var n=t(e).innerWidth(),i=t("div",e).innerWidth();t(e).remove(),r=n-i}return r}var r;t.fn.antiscroll=function(e){return this.each(function(){t(this).data("antiscroll")&&t(this).data("antiscroll").destroy(),t(this).data("antiscroll",new t.Antiscroll(this,e))})},t.Antiscroll=e,e.prototype.refresh=function(){var t=this.inner.get(0).scrollWidth>this.el.width()+(this.y?o():0),e=this.inner.get(0).scrollHeight>this.el.height()+(this.x?o():0);this.x&&(!this.horizontal&&t?this.horizontal=new n.Horizontal(this):this.horizontal&&!t?(this.horizontal.destroy(),this.horizontal=null):this.horizontal&&this.horizontal.update()),this.y&&(!this.vertical&&e?this.vertical=new n.Vertical(this):this.vertical&&!e?(this.vertical.destroy(),this.vertical=null):this.vertical&&this.vertical.update())},e.prototype.destroy=function(){return this.horizontal&&(this.horizontal.destroy(),this.horizontal=null),this.vertical&&(this.vertical.destroy(),this.vertical=null),this},e.prototype.rebuild=function(){return this.destroy(),this.inner.attr("style",""),e.call(this,this.el,this.options),this},n.prototype.destroy=function(){return this.el.remove(),this.pane.inner.unbind("scroll",this.innerPaneScrollListener),this.pane.inner.unbind("mousewheel",this.innerPaneMouseWheelListener),this},n.prototype.mouseenter=function(){this.enter=!0,this.show()},n.prototype.mouseleave=function(){this.enter=!1,this.dragging||this.pane.autoHide&&this.hide()},n.prototype.scroll=function(){this.shown||(this.show(),this.enter||this.dragging||this.pane.autoHide&&(this.hiding=setTimeout(t.proxy(this,"hide"),1500))),this.update()},n.prototype.mousedown=function(e){e.preventDefault(),this.dragging=!0,this.startPageY=e.pageY-parseInt(this.el.css("top"),10),this.startPageX=e.pageX-parseInt(this.el.css("left"),10),this.el[0].ownerDocument.onselectstart=function(){return!1};this.pane;var n=t.proxy(this,"mousemove"),i=this;t(this.el[0].ownerDocument).mousemove(n).mouseup(function(){i.dragging=!1,this.onselectstart=null,t(this).unbind("mousemove",n),i.enter||i.hide()})},n.prototype.show=function(t){!this.shown&&this.update()&&(this.el.addClass("antiscroll-scrollbar-shown"),this.hiding&&(clearTimeout(this.hiding),this.hiding=null),this.shown=!0)},n.prototype.hide=function(){!1!==this.pane.autoHide&&this.shown&&(this.el.removeClass("antiscroll-scrollbar-shown"),this.shown=!1)},n.Horizontal=function(e){this.el=t('
    ',e.el),n.call(this,e)},i(n.Horizontal,n),n.Horizontal.prototype.update=function(){var t=this.pane.el.width(),e=t-2*this.pane.padding,n=this.pane.inner.get(0);return this.el.css("width",e*t/n.scrollWidth).css("left",e*n.scrollLeft/n.scrollWidth),t0&&this.innerEl.scrollLeft+Math.ceil(this.pane.el.width())==this.innerEl.scrollWidth)return t.preventDefault(),!1},n.Vertical=function(e){this.el=t('
    ',e.el),n.call(this,e)},i(n.Vertical,n),n.Vertical.prototype.update=function(){var t=this.pane.el.height(),e=t-2*this.pane.padding,n=this.innerEl,i=e*t/n.scrollHeight;i=i<20?20:i;var o=e*n.scrollTop/n.scrollHeight;if(o+i>e){var r=o+i-e;o=o-r-3}return this.el.css("height",i).css("top",o),t0&&0==this.innerEl.scrollTop||i<0&&this.innerEl.scrollTop+Math.ceil(this.pane.el.height())==this.innerEl.scrollHeight)return t.preventDefault(),!1}}(jQuery),function(t){"function"==typeof define&&define.amd?define(["jquery"],t):"object"==typeof exports?module.exports=t:t(jQuery)}(function(t){function e(e){var o,r=e||window.event,a=[].slice.call(arguments,1),s=0,l=0,c=0,u=0,d=0;return e=t.event.fix(r),e.type="mousewheel",r.wheelDelta&&(s=r.wheelDelta),r.detail&&(s=-1*r.detail),r.deltaY&&(c=-1*r.deltaY,s=c),r.deltaX&&(l=r.deltaX,s=-1*l),void 0!==r.wheelDeltaY&&(c=r.wheelDeltaY),void 0!==r.wheelDeltaX&&(l=-1*r.wheelDeltaX),u=Math.abs(s),(!n||u0?"floor":"ceil",s=Math[o](s/n),l=Math[o](l/i),c=Math[o](c/i),a.unshift(e,s,l,c),(t.event.dispatch||t.event.handle).apply(this,a)}var n,i,o=["wheel","mousewheel","DOMMouseScroll","MozMousePixelScroll"],r="onwheel"in document||document.documentMode>=9?["wheel"]:["mousewheel","DomMouseScroll","MozMousePixelScroll"];if(t.event.fixHooks)for(var a=o.length;a;)t.event.fixHooks[o[--a]]=t.event.mouseHooks;t.event.special.mousewheel={setup:function(){if(this.addEventListener)for(var t=r.length;t;)this.addEventListener(r[--t],e,!1);else this.onmousewheel=e},teardown:function(){if(this.removeEventListener)for(var t=r.length;t;)this.removeEventListener(r[--t],e,!1);else this.onmousewheel=null}},t.fn.extend({mousewheel:function(t){return t?this.bind("mousewheel",t):this.trigger("mousewheel")},unmousewheel:function(t){return this.unbind("mousewheel",t)}})}),function(t){t.fn.delayedAction=function(e){var n=t.extend({},{delayedAction:function(){},cancelledAction:function(){},hoverTime:1e3},e);return this.each(function(){var e=t(this);e.hover(function(){e.data("timerId",setTimeout(function(){e.data("hover",!1),n.delayedAction(e)},n.hoverTime)),e.data("hover",!0)},function(){e.data("hover")&&(clearTimeout(e.data("timerId")),n.cancelledAction(e)),e.data("hover",!1)})})}}(jQuery),function(t){if("object"==typeof exports)module.exports=t();else if("function"==typeof define&&define.amd)define(t);else{var e;try{e=window}catch(t){e=self}e.SparkMD5=t()}}(function(t){"use strict";function e(t,e,n,i,o,r){return e=v(v(e,t),v(i,r)),v(e<>>32-o,n)}function n(t,n,i,o,r,a,s){return e(n&i|~n&o,t,n,r,a,s)}function i(t,n,i,o,r,a,s){return e(n&o|i&~o,t,n,r,a,s)}function o(t,n,i,o,r,a,s){return e(n^i^o,t,n,r,a,s)}function r(t,n,i,o,r,a,s){return e(i^(n|~o),t,n,r,a,s)}function a(t,e){var a=t[0],s=t[1],l=t[2],c=t[3];a=n(a,s,l,c,e[0],7,-680876936),c=n(c,a,s,l,e[1],12,-389564586),l=n(l,c,a,s,e[2],17,606105819),s=n(s,l,c,a,e[3],22,-1044525330),a=n(a,s,l,c,e[4],7,-176418897),c=n(c,a,s,l,e[5],12,1200080426),l=n(l,c,a,s,e[6],17,-1473231341),s=n(s,l,c,a,e[7],22,-45705983),a=n(a,s,l,c,e[8],7,1770035416),c=n(c,a,s,l,e[9],12,-1958414417),l=n(l,c,a,s,e[10],17,-42063),s=n(s,l,c,a,e[11],22,-1990404162),a=n(a,s,l,c,e[12],7,1804603682),c=n(c,a,s,l,e[13],12,-40341101),l=n(l,c,a,s,e[14],17,-1502002290),s=n(s,l,c,a,e[15],22,1236535329),a=i(a,s,l,c,e[1],5,-165796510),c=i(c,a,s,l,e[6],9,-1069501632),l=i(l,c,a,s,e[11],14,643717713),s=i(s,l,c,a,e[0],20,-373897302),a=i(a,s,l,c,e[5],5,-701558691),c=i(c,a,s,l,e[10],9,38016083),l=i(l,c,a,s,e[15],14,-660478335),s=i(s,l,c,a,e[4],20,-405537848),a=i(a,s,l,c,e[9],5,568446438),c=i(c,a,s,l,e[14],9,-1019803690),l=i(l,c,a,s,e[3],14,-187363961),s=i(s,l,c,a,e[8],20,1163531501),a=i(a,s,l,c,e[13],5,-1444681467),c=i(c,a,s,l,e[2],9,-51403784),l=i(l,c,a,s,e[7],14,1735328473),s=i(s,l,c,a,e[12],20,-1926607734),a=o(a,s,l,c,e[5],4,-378558),c=o(c,a,s,l,e[8],11,-2022574463),l=o(l,c,a,s,e[11],16,1839030562),s=o(s,l,c,a,e[14],23,-35309556),a=o(a,s,l,c,e[1],4,-1530992060),c=o(c,a,s,l,e[4],11,1272893353),l=o(l,c,a,s,e[7],16,-155497632),s=o(s,l,c,a,e[10],23,-1094730640),a=o(a,s,l,c,e[13],4,681279174),c=o(c,a,s,l,e[0],11,-358537222),l=o(l,c,a,s,e[3],16,-722521979),s=o(s,l,c,a,e[6],23,76029189),a=o(a,s,l,c,e[9],4,-640364487),c=o(c,a,s,l,e[12],11,-421815835),l=o(l,c,a,s,e[15],16,530742520),s=o(s,l,c,a,e[2],23,-995338651),a=r(a,s,l,c,e[0],6,-198630844),c=r(c,a,s,l,e[7],10,1126891415),l=r(l,c,a,s,e[14],15,-1416354905),s=r(s,l,c,a,e[5],21,-57434055),a=r(a,s,l,c,e[12],6,1700485571),c=r(c,a,s,l,e[3],10,-1894986606),l=r(l,c,a,s,e[10],15,-1051523),s=r(s,l,c,a,e[1],21,-2054922799),a=r(a,s,l,c,e[8],6,1873313359),c=r(c,a,s,l,e[15],10,-30611744),l=r(l,c,a,s,e[6],15,-1560198380),s=r(s,l,c,a,e[13],21,1309151649),a=r(a,s,l,c,e[4],6,-145523070),c=r(c,a,s,l,e[11],10,-1120210379),l=r(l,c,a,s,e[2],15,718787259),s=r(s,l,c,a,e[9],21,-343485551),t[0]=v(a,t[0]),t[1]=v(s,t[1]),t[2]=v(l,t[2]),t[3]=v(c,t[3])}function s(t){var e,n=[];for(e=0;e<64;e+=4)n[e>>2]=t.charCodeAt(e)+(t.charCodeAt(e+1)<<8)+(t.charCodeAt(e+2)<<16)+(t.charCodeAt(e+3)<<24);return n}function l(t){var e,n=[];for(e=0;e<64;e+=4)n[e>>2]=t[e]+(t[e+1]<<8)+(t[e+2]<<16)+(t[e+3]<<24);return n}function c(t){var e,n,i,o,r,l,c=t.length,u=[1732584193,-271733879,-1732584194,271733878];for(e=64;e<=c;e+=64)a(u,s(t.substring(e-64,e)));for(t=t.substring(e-64),n=t.length,i=[0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0],e=0;e>2]|=t.charCodeAt(e)<<(e%4<<3);if(i[e>>2]|=128<<(e%4<<3),e>55)for(a(u,i),e=0;e<16;e+=1)i[e]=0;return o=8*c,o=o.toString(16).match(/(.*?)(.{0,8})$/),r=parseInt(o[2],16),l=parseInt(o[1],16)||0,i[14]=r,i[15]=l,a(u,i),u}function u(t){var e,n,i,o,r,s,c=t.length,u=[1732584193,-271733879,-1732584194,271733878];for(e=64;e<=c;e+=64)a(u,l(t.subarray(e-64,e)));for(t=e-64>2]|=t[e]<<(e%4<<3);if(i[e>>2]|=128<<(e%4<<3),e>55)for(a(u,i),e=0;e<16;e+=1)i[e]=0;return o=8*c,o=o.toString(16).match(/(.*?)(.{0,8})$/),r=parseInt(o[2],16),s=parseInt(o[1],16)||0,i[14]=r,i[15]=s,a(u,i),u}function d(t){var e,n="";for(e=0;e<4;e+=1)n+=y[t>>8*e+4&15]+y[t>>8*e&15];return n}function h(t){var e;for(e=0;e>16)+(e>>16)+(n>>16);return i<<16|65535&n}),b.prototype.append=function(t){return this.appendBinary(f(t)),this},b.prototype.appendBinary=function(t){this._buff+=t,this._length+=t.length;var e,n=this._buff.length;for(e=64;e<=n;e+=64)a(this._hash,s(this._buff.substring(e-64,e)));return this._buff=this._buff.substring(e-64),this},b.prototype.end=function(t){var e,n,i=this._buff,o=i.length,r=[0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0];for(e=0;e>2]|=i.charCodeAt(e)<<(e%4<<3);return this._finish(r,o),n=t?this._hash:h(this._hash),this.reset(),n},b.prototype.reset=function(){return this._buff="",this._length=0,this._hash=[1732584193,-271733879,-1732584194,271733878],this},b.prototype.getState=function(){return{buff:this._buff,length:this._length,hash:this._hash}},b.prototype.setState=function(t){return this._buff=t.buff,this._length=t.length,this._hash=t.hash,this},b.prototype.destroy=function(){delete this._hash,delete this._buff,delete this._length},b.prototype._finish=function(t,e){var n,i,o,r=e;if(t[r>>2]|=128<<(r%4<<3),r>55)for(a(this._hash,t),r=0;r<16;r+=1)t[r]=0;n=8*this._length,n=n.toString(16).match(/(.*?)(.{0,8})$/),i=parseInt(n[2],16),o=parseInt(n[1],16)||0,t[14]=i,t[15]=o,a(this._hash,t)},b.hash=function(t,e){return b.hashBinary(f(t),e)},b.hashBinary=function(t,e){var n=c(t);return e?n:h(n)},b.ArrayBuffer=function(){this.reset()},b.ArrayBuffer.prototype.append=function(t){var e,n=m(this._buff.buffer,t,!0),i=n.length;for(this._length+=t.byteLength,e=64;e<=i;e+=64)a(this._hash,l(n.subarray(e-64,e)));return this._buff=e-64>2]|=i[e]<<(e%4<<3);return this._finish(r,o),n=t?this._hash:h(this._hash),this.reset(),n},b.ArrayBuffer.prototype.reset=function(){return this._buff=new Uint8Array(0),this._length=0,this._hash=[1732584193,-271733879,-1732584194,271733878],this},b.ArrayBuffer.prototype.getState=function(){var t=b.prototype.getState.call(this);return t.buff=g(t.buff),t},b.ArrayBuffer.prototype.setState=function(t){return t.buff=p(t.buff,!0),b.prototype.setState.call(this,t)},b.ArrayBuffer.prototype.destroy=b.prototype.destroy,b.ArrayBuffer.prototype._finish=b.prototype._finish,b.ArrayBuffer.hash=function(t,e){var n=u(new Uint8Array(t));return e?n:h(n)},b}),function(t){if("object"==typeof exports&&"undefined"!=typeof module)module.exports=t();else if("function"==typeof define&&define.amd)define([],t);else{var e;e="undefined"!=typeof window?window:"undefined"!=typeof global?global:"undefined"!=typeof self?self:this,e.Clipboard=t()}}(function(){return function t(e,n,i){function o(a,s){if(!n[a]){if(!e[a]){var l="function"==typeof require&&require;if(!s&&l)return l(a,!0);if(r)return r(a,!0);var c=new Error("Cannot find module '"+a+"'");throw c.code="MODULE_NOT_FOUND",c}var u=n[a]={exports:{}};e[a][0].call(u.exports,function(t){var n=e[a][1][t];return o(n||t)},u,u.exports,t,e,n,i)}return n[a].exports}for(var r="function"==typeof require&&require,a=0;ai;i++)n[i].fn.apply(n[i].ctx,e);return this},off:function(t,e){var n=this.e||(this.e={}),i=n[t],o=[];if(i&&e)for(var r=0,a=i.length;a>r;r++)i[r].fn!==e&&i[r].fn._!==e&&o.push(i[r]);return o.length?n[t]=o:delete n[t],this}},e.exports=i},{}],8:[function(t,e,n){"use strict";function i(t){return t&&t.__esModule?t:{default:t}}function o(t,e){if(!(t instanceof e))throw new TypeError("Cannot call a class as a function")}n.__esModule=!0;var r=function(){function t(t,e){for(var n=0;n
    -
    -
    +
    +
    '; $iconUrl = ''; @@ -45,7 +45,7 @@ if (Login::isLoggedUser()) { : _s('You can also %s.'); $you_can_add_two_tr = [ '%i' => '' . $iconBrowse . _s('browse from your computer') . '', - '%u' => '' . $iconUrl . _s('add image URLs') . '', + '%u' => '' . $iconUrl . _s('add %s URLs', _s('media')) . '', ]; $you_can_add_two_tr['%s'] = $you_can_add_two_tr['%i']; $you_can_add_three = getSetting('enable_uploads_url') @@ -55,13 +55,15 @@ if (Login::isLoggedUser()) {
    -
    +
    @@ -137,7 +139,7 @@ if (Login::isLoggedUser()) {
    data-login-needed="true" class="hidden-visibility" type="file" accept="image/*, " multiple> + } ?> class="hidden-visibility" type="file" accept="" multiple> data-login-needed="true" class="hidden-visibility" type="file" capture="camera" accept="image/*"> @@ -295,7 +297,7 @@ if (Login::isLoggedUser()) {
    - +