From b457d808883f583c00ec7867874dedce4bac1084 Mon Sep 17 00:00:00 2001 From: chevereto Date: Tue, 12 Mar 2024 12:58:03 +0000 Subject: [PATCH] Automatic push 4.0.12 --- .github/workflows/docker.yml | 39 ++-- .package/4.0.11.txt | 8 - .package/4.0.12.txt | 14 ++ README.md | 40 +++- app/composer.lock | 171 +++++++++--------- app/legacy/commands/cipher.php | 18 ++ app/legacy/entrypoints/index.php | 2 +- app/legacy/install/installer.php | 1 + app/legacy/load/app.php | 2 +- app/legacy/routes/album.php | 4 +- app/legacy/routes/api.php | 9 +- app/legacy/routes/dashboard.php | 24 ++- app/legacy/routes/settings.php | 19 +- app/legacy/routes/signup.php | 4 +- app/src/Legacy/Classes/Album.php | 46 +++-- app/src/Legacy/Classes/Search.php | 18 +- app/src/Legacy/G/Handler.php | 2 +- app/src/Legacy/functions.php | 6 +- app/upgrading.php | 7 +- .../legacy/themes/Peafowl/lib/chevereto.js | 8 +- .../themes/Peafowl/lib/chevereto.min.js | 6 +- .../themes/Peafowl/snippets/form_album.php | 3 +- .../Peafowl/snippets/form_sub_album.php | 2 +- .../themes/Peafowl/views/dashboard/stats.php | 8 +- 24 files changed, 296 insertions(+), 165 deletions(-) delete mode 100644 .package/4.0.11.txt create mode 100644 .package/4.0.12.txt diff --git a/.github/workflows/docker.yml b/.github/workflows/docker.yml index 7dd69d7..d17f143 100644 --- a/.github/workflows/docker.yml +++ b/.github/workflows/docker.yml @@ -14,11 +14,11 @@ jobs: strategy: matrix: os: [ubuntu-latest] - php: ["8.1"] + php: ["8.2"] name: Build on PHP ${{ matrix.php }} ${{ matrix.os }} steps: - name: Checkout - uses: actions/checkout@v3 + uses: actions/checkout@v4 with: fetch-depth: 0 - name: Get current branch @@ -29,25 +29,32 @@ jobs: - run: echo ${{ steps.get-branch.outputs.branch }} - name: Docker meta id: meta - uses: docker/metadata-action@v4 + uses: docker/metadata-action@v5 with: images: | + chevereto/chevereto ${{ env.GHCR_SLUG }} tags: | type=ref,event=branch type=ref,event=pr type=semver,pattern={{version}} type=semver,pattern={{major}}.{{minor}} + type=semver,pattern={{major}} labels: | org.opencontainers.image.title=Chevereto V4 - org.opencontainers.image.description=Ultimate image sharing software 🦄 + org.opencontainers.image.description=Ultimate image sharing software org.opencontainers.image.vendor=Chevereto - name: Set up QEMU - uses: docker/setup-qemu-action@v2 + uses: docker/setup-qemu-action@v3 - name: Set up Docker Buildx - uses: docker/setup-buildx-action@v2 + uses: docker/setup-buildx-action@v3 + - name: Login to Docker Hub + uses: docker/login-action@v3 + with: + username: ${{ secrets.DOCKERHUB_USERNAME }} + password: ${{ secrets.DOCKERHUB_TOKEN }} - name: Login to GHCR - uses: docker/login-action@v2 + uses: docker/login-action@v3 with: registry: ghcr.io username: ${{ github.repository_owner }} @@ -83,19 +90,17 @@ jobs: run: | cp -a ./. ../docker/chevereto/ ls -la ../docker/chevereto - - name: Build - uses: docker/bake-action@v2 + - name: Build and push + uses: docker/build-push-action@v5 with: - workdir: ../docker - set: build.args.PHP=${{ matrix.php }} - files: | - ./docker-bake.hcl - ${{ steps.meta.outputs.bake-file }} - targets: build + context: ../docker + platforms: linux/amd64,linux/arm64 push: true + provenance: false + tags: ${{ steps.meta.outputs.tags }} + labels: ${{ steps.meta.outputs.labels }} - name: Check manifest - run: | - docker buildx imagetools inspect ${{ env.GHCR_SLUG }}:${{ steps.meta.outputs.version }} + run: docker buildx imagetools inspect ${{ env.GHCR_SLUG }}:${{ steps.meta.outputs.version }} - name: Inspect image run: | docker pull ${{ env.GHCR_SLUG }}:${{ steps.meta.outputs.version }} diff --git a/.package/4.0.11.txt b/.package/4.0.11.txt deleted file mode 100644 index d0cb3e1..0000000 --- a/.package/4.0.11.txt +++ /dev/null @@ -1,8 +0,0 @@ -Chevereto 4.0.11 (2024-02-21) - -- ✅ Added one-click upgrade system -- ✅ Added license key configuration -- ✅ Added /dashboard/?license -- ✅ Added /dashboard/?installed -- ✅ Added /dashboard/?upgrade -- 💅 Improved software version at dashboard diff --git a/.package/4.0.12.txt b/.package/4.0.12.txt new file mode 100644 index 0000000..1108a05 --- /dev/null +++ b/.package/4.0.12.txt @@ -0,0 +1,14 @@ +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/README.md b/README.md index 7f456ec..f0e0876 100644 --- a/README.md +++ b/README.md @@ -8,21 +8,51 @@ [![CHUISS](.github/banner/chevereto-ultimate-remix.png)](https://chevereto.com) -[![Community](https://img.shields.io/badge/chv.to-community-blue?style=flat-square)](https://chv.to/community) +[![Community](https://img.shields.io/badge/chv.to-community-blue?style=flat-square)](https://chevereto.com/community) [![AGPL-3.0-only](https://img.shields.io/github/license/chevereto/chevereto?style=flat-square)](LICENSE) [![Awesome F/OSS](https://img.shields.io/badge/Awesome_F%2FOSS-Certified-black?colorA=&colorB=874efe&style=flat-square)](https://awsmfoss.com/chevereto/) -Chevereto enables to create an image sharing website on your own server. It's your hosting and your rules, say goodbye to closures and restrictions. +Chevereto enables to create an image sharing website on your own server. It's your hosting and your rules, say goodbye to closures and restrictions. ⭐️ [Live demo](https://demo.chevereto.com) ![screen](.github/screen/user-profile.jpeg) +**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 the commercial edition. + +This edition doesn't include the following features: + +- Multiple users +- Advanced search +- Manage banners +- Consent screen (age gate) +- Bulk content importer +- Custom homepage +- Custom logo +- Custom pages +- Custom routing +- Cookie consent +- User followers +- Like system +- Guest API +- IP banning +- ModerateContent integration +- Notifications +- Queue handling +- StopForumSpam integration +- Upload moderation +- Upload plugin +- Watermarks +- External Storage (AWS S3, Google Cloud Storage, SFTP, etc.) +- External services (reCAPTCHA, Akismet, etc.) +- Project Arachnid integration (CSAM) +- Social login (OAuth2) + ## Documentation We provide several layers of documentation covering all aspects of our software. Chevereto documentation is Open Source and your contribution is highly appreciated. -* Software [v4-docs.chevereto.com](https://v4-docs.chevereto.com) -* Admin [v4-admin.chevereto.com](https://v4-admin.chevereto.com) -* User [v4-user.chevereto.com](https://v4-user.chevereto.com) +- Software [v4-docs.chevereto.com](https://v4-docs.chevereto.com) +- Admin [v4-admin.chevereto.com](https://v4-admin.chevereto.com) +- User [v4-user.chevereto.com](https://v4-user.chevereto.com) ## License diff --git a/app/composer.lock b/app/composer.lock index a3ebc33..235c81c 100644 --- a/app/composer.lock +++ b/app/composer.lock @@ -310,16 +310,16 @@ }, { "name": "amphp/process", - "version": "v1.1.4", + "version": "v1.1.5", "source": { "type": "git", "url": "https://github.com/amphp/process.git", - "reference": "76e9495fd6818b43a20167cb11d8a67f7744ee0f" + "reference": "04b4517bbfe436ab822b853d511165dafbfe115a" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/amphp/process/zipball/76e9495fd6818b43a20167cb11d8a67f7744ee0f", - "reference": "76e9495fd6818b43a20167cb11d8a67f7744ee0f", + "url": "https://api.github.com/repos/amphp/process/zipball/04b4517bbfe436ab822b853d511165dafbfe115a", + "reference": "04b4517bbfe436ab822b853d511165dafbfe115a", "shasum": "" }, "require": { @@ -363,7 +363,7 @@ "homepage": "https://github.com/amphp/process", "support": { "issues": "https://github.com/amphp/process/issues", - "source": "https://github.com/amphp/process/tree/v1.1.4" + "source": "https://github.com/amphp/process/tree/v1.1.5" }, "funding": [ { @@ -371,7 +371,7 @@ "type": "github" } ], - "time": "2022-07-06T23:50:12+00:00" + "time": "2024-02-24T21:06:11+00:00" }, { "name": "amphp/serialization", @@ -1155,16 +1155,16 @@ }, { "name": "composer/ca-bundle", - "version": "1.4.0", + "version": "1.4.1", "source": { "type": "git", "url": "https://github.com/composer/ca-bundle.git", - "reference": "b66d11b7479109ab547f9405b97205640b17d385" + "reference": "3ce240142f6d59b808dd65c1f52f7a1c252e6cfd" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/composer/ca-bundle/zipball/b66d11b7479109ab547f9405b97205640b17d385", - "reference": "b66d11b7479109ab547f9405b97205640b17d385", + "url": "https://api.github.com/repos/composer/ca-bundle/zipball/3ce240142f6d59b808dd65c1f52f7a1c252e6cfd", + "reference": "3ce240142f6d59b808dd65c1f52f7a1c252e6cfd", "shasum": "" }, "require": { @@ -1211,7 +1211,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.0" + "source": "https://github.com/composer/ca-bundle/tree/1.4.1" }, "funding": [ { @@ -1227,7 +1227,7 @@ "type": "tidelift" } ], - "time": "2023-12-18T12:05:55+00:00" + "time": "2024-02-23T10:16:52+00:00" }, { "name": "evenement/evenement", @@ -2485,16 +2485,16 @@ }, { "name": "phpseclib/bcmath_compat", - "version": "2.0.1", + "version": "2.0.2", "source": { "type": "git", "url": "https://github.com/phpseclib/bcmath_compat.git", - "reference": "2ffea8bfe1702b4535a7b3c2649c4301968e9a3c" + "reference": "29bbf07a7039ff65ce7daa44502ba34baf1512ec" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/phpseclib/bcmath_compat/zipball/2ffea8bfe1702b4535a7b3c2649c4301968e9a3c", - "reference": "2ffea8bfe1702b4535a7b3c2649c4301968e9a3c", + "url": "https://api.github.com/repos/phpseclib/bcmath_compat/zipball/29bbf07a7039ff65ce7daa44502ba34baf1512ec", + "reference": "29bbf07a7039ff65ce7daa44502ba34baf1512ec", "shasum": "" }, "require": { @@ -2543,20 +2543,20 @@ "issues": "https://github.com/phpseclib/bcmath_compat/issues", "source": "https://github.com/phpseclib/bcmath_compat" }, - "time": "2021-12-16T02:35:52+00:00" + "time": "2024-02-21T10:30:36+00:00" }, { "name": "phpseclib/phpseclib", - "version": "3.0.35", + "version": "3.0.37", "source": { "type": "git", "url": "https://github.com/phpseclib/phpseclib.git", - "reference": "4b1827beabce71953ca479485c0ae9c51287f2fe" + "reference": "cfa2013d0f68c062055180dd4328cc8b9d1f30b8" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/phpseclib/phpseclib/zipball/4b1827beabce71953ca479485c0ae9c51287f2fe", - "reference": "4b1827beabce71953ca479485c0ae9c51287f2fe", + "url": "https://api.github.com/repos/phpseclib/phpseclib/zipball/cfa2013d0f68c062055180dd4328cc8b9d1f30b8", + "reference": "cfa2013d0f68c062055180dd4328cc8b9d1f30b8", "shasum": "" }, "require": { @@ -2637,7 +2637,7 @@ ], "support": { "issues": "https://github.com/phpseclib/phpseclib/issues", - "source": "https://github.com/phpseclib/phpseclib/tree/3.0.35" + "source": "https://github.com/phpseclib/phpseclib/tree/3.0.37" }, "funding": [ { @@ -2653,7 +2653,7 @@ "type": "tidelift" } ], - "time": "2023-12-29T01:59:53+00:00" + "time": "2024-03-03T02:14:58+00:00" }, { "name": "pragmarx/google2fa", @@ -4151,16 +4151,16 @@ }, { "name": "symfony/cache", - "version": "v5.4.35", + "version": "v5.4.36", "source": { "type": "git", "url": "https://github.com/symfony/cache.git", - "reference": "db1adb004e2da984085d0178964eb6f319d3cba1" + "reference": "a30f316214d908cf5874f700f3f3fb29ceee91ba" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/cache/zipball/db1adb004e2da984085d0178964eb6f319d3cba1", - "reference": "db1adb004e2da984085d0178964eb6f319d3cba1", + "url": "https://api.github.com/repos/symfony/cache/zipball/a30f316214d908cf5874f700f3f3fb29ceee91ba", + "reference": "a30f316214d908cf5874f700f3f3fb29ceee91ba", "shasum": "" }, "require": { @@ -4228,7 +4228,7 @@ "psr6" ], "support": { - "source": "https://github.com/symfony/cache/tree/v5.4.35" + "source": "https://github.com/symfony/cache/tree/v5.4.36" }, "funding": [ { @@ -4244,7 +4244,7 @@ "type": "tidelift" } ], - "time": "2024-01-23T13:51:25+00:00" + "time": "2024-02-19T13:08:14+00:00" }, { "name": "symfony/cache-contracts", @@ -5267,20 +5267,21 @@ }, { "name": "phar-io/manifest", - "version": "2.0.3", + "version": "2.0.4", "source": { "type": "git", "url": "https://github.com/phar-io/manifest.git", - "reference": "97803eca37d319dfa7826cc2437fc020857acb53" + "reference": "54750ef60c58e43759730615a392c31c80e23176" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/phar-io/manifest/zipball/97803eca37d319dfa7826cc2437fc020857acb53", - "reference": "97803eca37d319dfa7826cc2437fc020857acb53", + "url": "https://api.github.com/repos/phar-io/manifest/zipball/54750ef60c58e43759730615a392c31c80e23176", + "reference": "54750ef60c58e43759730615a392c31c80e23176", "shasum": "" }, "require": { "ext-dom": "*", + "ext-libxml": "*", "ext-phar": "*", "ext-xmlwriter": "*", "phar-io/version": "^3.0.1", @@ -5321,9 +5322,15 @@ "description": "Component for reading phar.io manifest information from a PHP Archive (PHAR)", "support": { "issues": "https://github.com/phar-io/manifest/issues", - "source": "https://github.com/phar-io/manifest/tree/2.0.3" + "source": "https://github.com/phar-io/manifest/tree/2.0.4" }, - "time": "2021-07-20T11:28:43+00:00" + "funding": [ + { + "url": "https://github.com/theseer", + "type": "github" + } + ], + "time": "2024-03-03T12:33:53+00:00" }, { "name": "phar-io/version", @@ -5378,16 +5385,16 @@ }, { "name": "phpstan/phpstan", - "version": "1.10.59", + "version": "1.10.60", "source": { "type": "git", "url": "https://github.com/phpstan/phpstan.git", - "reference": "e607609388d3a6d418a50a49f7940e8086798281" + "reference": "95dcea7d6c628a3f2f56d091d8a0219485a86bbe" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/phpstan/phpstan/zipball/e607609388d3a6d418a50a49f7940e8086798281", - "reference": "e607609388d3a6d418a50a49f7940e8086798281", + "url": "https://api.github.com/repos/phpstan/phpstan/zipball/95dcea7d6c628a3f2f56d091d8a0219485a86bbe", + "reference": "95dcea7d6c628a3f2f56d091d8a0219485a86bbe", "shasum": "" }, "require": { @@ -5436,20 +5443,20 @@ "type": "tidelift" } ], - "time": "2024-02-20T13:59:13+00:00" + "time": "2024-03-07T13:30:19+00:00" }, { "name": "phpunit/php-code-coverage", - "version": "9.2.30", + "version": "9.2.31", "source": { "type": "git", "url": "https://github.com/sebastianbergmann/php-code-coverage.git", - "reference": "ca2bd87d2f9215904682a9cb9bb37dda98e76089" + "reference": "48c34b5d8d983006bd2adc2d0de92963b9155965" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/php-code-coverage/zipball/ca2bd87d2f9215904682a9cb9bb37dda98e76089", - "reference": "ca2bd87d2f9215904682a9cb9bb37dda98e76089", + "url": "https://api.github.com/repos/sebastianbergmann/php-code-coverage/zipball/48c34b5d8d983006bd2adc2d0de92963b9155965", + "reference": "48c34b5d8d983006bd2adc2d0de92963b9155965", "shasum": "" }, "require": { @@ -5506,7 +5513,7 @@ "support": { "issues": "https://github.com/sebastianbergmann/php-code-coverage/issues", "security": "https://github.com/sebastianbergmann/php-code-coverage/security/policy", - "source": "https://github.com/sebastianbergmann/php-code-coverage/tree/9.2.30" + "source": "https://github.com/sebastianbergmann/php-code-coverage/tree/9.2.31" }, "funding": [ { @@ -5514,7 +5521,7 @@ "type": "github" } ], - "time": "2023-12-22T06:47:57+00:00" + "time": "2024-03-02T06:37:42+00:00" }, { "name": "phpunit/php-file-iterator", @@ -5759,16 +5766,16 @@ }, { "name": "phpunit/phpunit", - "version": "9.6.16", + "version": "9.6.17", "source": { "type": "git", "url": "https://github.com/sebastianbergmann/phpunit.git", - "reference": "3767b2c56ce02d01e3491046f33466a1ae60a37f" + "reference": "1a156980d78a6666721b7e8e8502fe210b587fcd" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/phpunit/zipball/3767b2c56ce02d01e3491046f33466a1ae60a37f", - "reference": "3767b2c56ce02d01e3491046f33466a1ae60a37f", + "url": "https://api.github.com/repos/sebastianbergmann/phpunit/zipball/1a156980d78a6666721b7e8e8502fe210b587fcd", + "reference": "1a156980d78a6666721b7e8e8502fe210b587fcd", "shasum": "" }, "require": { @@ -5842,7 +5849,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.16" + "source": "https://github.com/sebastianbergmann/phpunit/tree/9.6.17" }, "funding": [ { @@ -5858,7 +5865,7 @@ "type": "tidelift" } ], - "time": "2024-01-19T07:03:14+00:00" + "time": "2024-02-23T13:14:51+00:00" }, { "name": "psy/psysh", @@ -6002,16 +6009,16 @@ }, { "name": "sebastian/cli-parser", - "version": "1.0.1", + "version": "1.0.2", "source": { "type": "git", "url": "https://github.com/sebastianbergmann/cli-parser.git", - "reference": "442e7c7e687e42adc03470c7b668bc4b2402c0b2" + "reference": "2b56bea83a09de3ac06bb18b92f068e60cc6f50b" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/cli-parser/zipball/442e7c7e687e42adc03470c7b668bc4b2402c0b2", - "reference": "442e7c7e687e42adc03470c7b668bc4b2402c0b2", + "url": "https://api.github.com/repos/sebastianbergmann/cli-parser/zipball/2b56bea83a09de3ac06bb18b92f068e60cc6f50b", + "reference": "2b56bea83a09de3ac06bb18b92f068e60cc6f50b", "shasum": "" }, "require": { @@ -6046,7 +6053,7 @@ "homepage": "https://github.com/sebastianbergmann/cli-parser", "support": { "issues": "https://github.com/sebastianbergmann/cli-parser/issues", - "source": "https://github.com/sebastianbergmann/cli-parser/tree/1.0.1" + "source": "https://github.com/sebastianbergmann/cli-parser/tree/1.0.2" }, "funding": [ { @@ -6054,7 +6061,7 @@ "type": "github" } ], - "time": "2020-09-28T06:08:49+00:00" + "time": "2024-03-02T06:27:43+00:00" }, { "name": "sebastian/code-unit", @@ -6300,16 +6307,16 @@ }, { "name": "sebastian/diff", - "version": "4.0.5", + "version": "4.0.6", "source": { "type": "git", "url": "https://github.com/sebastianbergmann/diff.git", - "reference": "74be17022044ebaaecfdf0c5cd504fc9cd5a7131" + "reference": "ba01945089c3a293b01ba9badc29ad55b106b0bc" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/diff/zipball/74be17022044ebaaecfdf0c5cd504fc9cd5a7131", - "reference": "74be17022044ebaaecfdf0c5cd504fc9cd5a7131", + "url": "https://api.github.com/repos/sebastianbergmann/diff/zipball/ba01945089c3a293b01ba9badc29ad55b106b0bc", + "reference": "ba01945089c3a293b01ba9badc29ad55b106b0bc", "shasum": "" }, "require": { @@ -6354,7 +6361,7 @@ ], "support": { "issues": "https://github.com/sebastianbergmann/diff/issues", - "source": "https://github.com/sebastianbergmann/diff/tree/4.0.5" + "source": "https://github.com/sebastianbergmann/diff/tree/4.0.6" }, "funding": [ { @@ -6362,7 +6369,7 @@ "type": "github" } ], - "time": "2023-05-07T05:35:17+00:00" + "time": "2024-03-02T06:30:58+00:00" }, { "name": "sebastian/environment", @@ -6429,16 +6436,16 @@ }, { "name": "sebastian/exporter", - "version": "4.0.5", + "version": "4.0.6", "source": { "type": "git", "url": "https://github.com/sebastianbergmann/exporter.git", - "reference": "ac230ed27f0f98f597c8a2b6eb7ac563af5e5b9d" + "reference": "78c00df8f170e02473b682df15bfcdacc3d32d72" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/exporter/zipball/ac230ed27f0f98f597c8a2b6eb7ac563af5e5b9d", - "reference": "ac230ed27f0f98f597c8a2b6eb7ac563af5e5b9d", + "url": "https://api.github.com/repos/sebastianbergmann/exporter/zipball/78c00df8f170e02473b682df15bfcdacc3d32d72", + "reference": "78c00df8f170e02473b682df15bfcdacc3d32d72", "shasum": "" }, "require": { @@ -6494,7 +6501,7 @@ ], "support": { "issues": "https://github.com/sebastianbergmann/exporter/issues", - "source": "https://github.com/sebastianbergmann/exporter/tree/4.0.5" + "source": "https://github.com/sebastianbergmann/exporter/tree/4.0.6" }, "funding": [ { @@ -6502,20 +6509,20 @@ "type": "github" } ], - "time": "2022-09-14T06:03:37+00:00" + "time": "2024-03-02T06:33:00+00:00" }, { "name": "sebastian/global-state", - "version": "5.0.6", + "version": "5.0.7", "source": { "type": "git", "url": "https://github.com/sebastianbergmann/global-state.git", - "reference": "bde739e7565280bda77be70044ac1047bc007e34" + "reference": "bca7df1f32ee6fe93b4d4a9abbf69e13a4ada2c9" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/global-state/zipball/bde739e7565280bda77be70044ac1047bc007e34", - "reference": "bde739e7565280bda77be70044ac1047bc007e34", + "url": "https://api.github.com/repos/sebastianbergmann/global-state/zipball/bca7df1f32ee6fe93b4d4a9abbf69e13a4ada2c9", + "reference": "bca7df1f32ee6fe93b4d4a9abbf69e13a4ada2c9", "shasum": "" }, "require": { @@ -6558,7 +6565,7 @@ ], "support": { "issues": "https://github.com/sebastianbergmann/global-state/issues", - "source": "https://github.com/sebastianbergmann/global-state/tree/5.0.6" + "source": "https://github.com/sebastianbergmann/global-state/tree/5.0.7" }, "funding": [ { @@ -6566,7 +6573,7 @@ "type": "github" } ], - "time": "2023-08-02T09:26:13+00:00" + "time": "2024-03-02T06:35:11+00:00" }, { "name": "sebastian/lines-of-code", @@ -7448,16 +7455,16 @@ }, { "name": "theseer/tokenizer", - "version": "1.2.2", + "version": "1.2.3", "source": { "type": "git", "url": "https://github.com/theseer/tokenizer.git", - "reference": "b2ad5003ca10d4ee50a12da31de12a5774ba6b96" + "reference": "737eda637ed5e28c3413cb1ebe8bb52cbf1ca7a2" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/theseer/tokenizer/zipball/b2ad5003ca10d4ee50a12da31de12a5774ba6b96", - "reference": "b2ad5003ca10d4ee50a12da31de12a5774ba6b96", + "url": "https://api.github.com/repos/theseer/tokenizer/zipball/737eda637ed5e28c3413cb1ebe8bb52cbf1ca7a2", + "reference": "737eda637ed5e28c3413cb1ebe8bb52cbf1ca7a2", "shasum": "" }, "require": { @@ -7486,7 +7493,7 @@ "description": "A small library for converting tokenized PHP source code into XML and potentially other formats", "support": { "issues": "https://github.com/theseer/tokenizer/issues", - "source": "https://github.com/theseer/tokenizer/tree/1.2.2" + "source": "https://github.com/theseer/tokenizer/tree/1.2.3" }, "funding": [ { @@ -7494,7 +7501,7 @@ "type": "github" } ], - "time": "2023-11-20T00:12:19+00:00" + "time": "2024-03-03T12:36:25+00:00" } ], "aliases": [], diff --git a/app/legacy/commands/cipher.php b/app/legacy/commands/cipher.php index c65f9d8..4034f06 100644 --- a/app/legacy/commands/cipher.php +++ b/app/legacy/commands/cipher.php @@ -11,6 +11,7 @@ use Chevereto\Encryption\EncryptionInstance; use Chevereto\Encryption\Interfaces\EncryptionInterface; +use Chevereto\Legacy\Classes\Album; use Chevereto\Legacy\Classes\DB; use Chevereto\Legacy\Classes\Login; use Chevereto\Legacy\Classes\Settings; @@ -111,3 +112,20 @@ foreach ($connections as $connection) { $tokenString = serialize($token); feedback("- token: $tokenString"); } +feedbackSeparator(); +feedbackStep($doing, 'albums password'); +$albumsPassword = DB::queryFetchAll('SELECT album_id id, album_password password FROM ' . DB::getTable('albums') . ' WHERE album_password IS NOT NULL;'); +foreach ($albumsPassword as $album) { + new EncryptionInstance($fromEncryption); + feedback("> Album id #" . $album['id']); + new EncryptionInstance($toEncryption); + $password = $album['password']; + $values = [ + 'password' => $password, + ]; + Album::update( + id: (int) $album['id'], + values: $values, + ); + feedback("- password: $password"); +} diff --git a/app/legacy/entrypoints/index.php b/app/legacy/entrypoints/index.php index 0d78619..91e7359 100644 --- a/app/legacy/entrypoints/index.php +++ b/app/legacy/entrypoints/index.php @@ -18,7 +18,7 @@ $loadDir = __DIR__ . '/../load'; require_once $loadDir . '/php-boot.php'; $uri = $_SERVER['REQUEST_URI'] ?? ''; $parseUri = parse_url($uri); -if (in_array($parseUri['path'], ['/upgrading', '/upgrading/']) +if (in_array($parseUri['path'] ?? null, ['/upgrading', '/upgrading/']) && file_exists($appDir . '/.upgrading/upgrading.lock')) { require $appDir . '/upgrading.php'; exit; diff --git a/app/legacy/install/installer.php b/app/legacy/install/installer.php index f5465b7..5c3fddc 100644 --- a/app/legacy/install/installer.php +++ b/app/legacy/install/installer.php @@ -595,6 +595,7 @@ $settings_updates = [ 'listing_viewer' => 0, ], '4.0.11' => null, + '4.0.12' => null, ]; $cheveretoFreeMap = [ '1.0.0' => '3.8.3', diff --git a/app/legacy/load/app.php b/app/legacy/load/app.php index 069c236..165db39 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.11'; +const APP_VERSION = '4.0.12'; const APP_VERSION_AKA = 'macanudo'; diff --git a/app/legacy/routes/album.php b/app/legacy/routes/album.php index acf8352..550d2a8 100644 --- a/app/legacy/routes/album.php +++ b/app/legacy/routes/album.php @@ -132,8 +132,8 @@ return function (Handler $handler) { } } if (!$is_error) { - if (isset(post()['content-password']) && Album::checkPassword($album['password'], post()['content-password'])) { - Album::storeUserPasswordHash($album['id'], post()['content-password']); + if (isset(post()['content-password']) && hash_equals($album['password'], post()['content-password'])) { + Album::storeUserPassword($album['id'], post()['content-password']); } elseif (!Album::checkSessionPassword($album)) { $is_error = true; if (isset(post()['content-password'])) { diff --git a/app/legacy/routes/api.php b/app/legacy/routes/api.php index 2e8f093..06c02a4 100644 --- a/app/legacy/routes/api.php +++ b/app/legacy/routes/api.php @@ -62,10 +62,12 @@ return function (Handler $handler) { if (!(bool) env()['CHEVERETO_ENABLE_API_GUEST']) { throw new Exception("Guest API is disabled.", 400); } - if ((getSetting('api_v1_key') ?? '') == '') { + $apiV1Key = (string) (getSetting('api_v1_key') ?? ''); + if ($apiV1Key == '') { throw new Exception("API V1 public key can't be null. Go to your dashboard and set the Guest API key.", 0); } - if (!hash_equals(getSetting('api_v1_key'), $key)) { + // @var string $key + if (!hash_equals($apiV1Key, $key)) { throw new Exception("Invalid guest API key.", 100); } } else { @@ -123,7 +125,8 @@ return function (Handler $handler) { throw new Exception('Upload using base64 source must be done using POST method.', 130); } $source = trim(preg_replace('/\s+/', '', $source)); - if (!hash_equals(base64_encode(base64_decode($source)), $source)) { + $base64source = base64_encode(base64_decode($source)); + if (!hash_equals($base64source, $source)) { throw new Exception('Invalid base64 string.', 120); } $api_temp_file = tempnam(sys_get_temp_dir(), 'chvtemp'); diff --git a/app/legacy/routes/dashboard.php b/app/legacy/routes/dashboard.php index b1d87b5..0f2b9f5 100644 --- a/app/legacy/routes/dashboard.php +++ b/app/legacy/routes/dashboard.php @@ -11,6 +11,7 @@ use function Chevere\String\randomString; use Chevereto\Config\Config; +use function Chevereto\Encryption\hasEncryption; use function Chevereto\Legacy\badgePaid; use Chevereto\Legacy\Classes\Akismet; use Chevereto\Legacy\Classes\Arachnid; @@ -370,7 +371,7 @@ return function (Handler $handler) { if (version_compare($chv_version['files'], $chv_version['db'], '>')) { $install_update_button = $chv_version['db'] . ' DB ' . _s('install update') . ''; } - $version_check .= ' ' . _s("Check upgrades") . ''; + $version_check .= ' ' . _s("Check upgrades") . ''; if (datetime_diff($cron_last_ran, null, 'm') > 5) { $cronRemark .= ' — ' . _s('not running') . ''; } @@ -408,6 +409,10 @@ return function (Handler $handler) { 'label' => _s('Connecting IP'), 'content' => ' ' . get_client_ip() . ' ' . _s('Not your IP?') . '' ], + 'is_encrypted' => [ + 'label' => _s('Encryption'), + 'content' => ' ' . (hasEncryption() ? _s('Enabled') : _s('Disabled')) + ], ]; $cheveretoLinks = [ @@ -435,7 +440,7 @@ return function (Handler $handler) { $cheveretoLinksButtons = ''; foreach ($cheveretoLinks as $link) { $attr = $link['attr'] ?? 'href="%href%" target="_blank"'; - $cheveretoLinksButtons .= strtr('%label%', [ + $cheveretoLinksButtons .= strtr('%label%', [ '%href%' => $link['href'] ?? '', '%icon%' => $link['icon'], '%label%' => $link['label'], @@ -1468,7 +1473,10 @@ return function (Handler $handler) { if (isset($page['id']) && $page['id'] == $v['page_id']) { continue; // Skip on same thing } - if (hash_equals($v[$kk], $POST[$kk])) { + if (hash_equals( + (string) $v[$kk], + (string) $POST[$kk] + )) { $input_errors[$kk] = sprintf($vv, $v['page_id']); } } @@ -1483,7 +1491,10 @@ return function (Handler $handler) { try { Page::writePage(['file_path' => $POST['page_file_path'], 'code' => $page_write_code]); - if ($handler->request()[2] == 'edit' && isset($page['file_path']) && !hash_equals($page['file_path'], $POST['page_file_path'])) { + if ($handler->request()[2] == 'edit' + && isset($page['file_path']) + && !hash_equals((string) $page['file_path'], (string) $POST['page_file_path']) + ) { unlinkIfExists(Page::getPath($page['file_path'])); } if (isset($page['id'])) { @@ -1501,7 +1512,10 @@ return function (Handler $handler) { foreach ($page_fields as $v) { $postPage = $POST['page_' . $v]; if ($handler->request()[2] == 'edit') { - if (hash_equals($page[$v] ?? '', $postPage ?? '')) { + if (hash_equals( + (string) ($page[$v] ?? ''), + (string) ($postPage ?? '') + )) { continue; } // Skip not updated values } diff --git a/app/legacy/routes/settings.php b/app/legacy/routes/settings.php index 4f20aae..18ef4bc 100644 --- a/app/legacy/routes/settings.php +++ b/app/legacy/routes/settings.php @@ -250,12 +250,14 @@ return function (Handler $handler) { continue; } } - if (hash_equals($row['user_username'], $POST['username']) and $user['username'] !== $row['user_username']) { + if (hash_equals((string) $row['user_username'], (string) $POST['username']) + && $user['username'] !== $row['user_username'] + ) { $input_errors['username'] = 'Username already being used'; } - if ( - !empty($POST['email']) && hash_equals($row['user_email'], $POST['email']) && - $user['email'] !== $row['user_email'] + if (!empty($POST['email']) + && hash_equals((string) $row['user_email'], (string) $POST['email']) + && $user['email'] !== $row['user_email'] ) { $input_errors['email'] = _s('Email already being used'); } @@ -265,7 +267,14 @@ return function (Handler $handler) { } } } - if (!$is_error && $is_email_required && !empty($POST['email']) && !hash_equals($user['email'] ?? '', $POST['email'])) { + if (!$is_error + && $is_email_required + && !empty($POST['email']) + && !hash_equals( + (string) ($user['email'] ?? ''), + (string) $POST['email'] + ) + ) { Confirmation::delete(['type' => 'account-change-email', 'user_id' => $user['id']]); $hashed_token = generate_hashed_token((int) $user['id']); Confirmation::insert([ diff --git a/app/legacy/routes/signup.php b/app/legacy/routes/signup.php index 39d75d4..812bb86 100644 --- a/app/legacy/routes/signup.php +++ b/app/legacy/routes/signup.php @@ -135,10 +135,10 @@ return function (Handler $handler) { continue; } } - if (hash_equals($row['user_username'], $POST['username'])) { + if (hash_equals((string) $row['user_username'], (string) $POST['username'])) { $input_errors['username'] = 'Username already being used'; } - if (hash_equals($row['user_email'], $POST['email'])) { + if (hash_equals((string) $row['user_email'], (string) $POST['email'])) { $input_errors['email'] = _s('Email already being used'); } if (!$show_resend_activation) { diff --git a/app/src/Legacy/Classes/Album.php b/app/src/Legacy/Classes/Album.php index ed13841..86f863e 100644 --- a/app/src/Legacy/Classes/Album.php +++ b/app/src/Legacy/Classes/Album.php @@ -11,6 +11,10 @@ namespace Chevereto\Legacy\Classes; +use function Chevereto\Encryption\decrypt; +use function Chevereto\Encryption\encrypt; +use function Chevereto\Encryption\encryptValues; +use function Chevereto\Encryption\hasEncryption; use function Chevereto\Legacy\assertNotStopWords; use function Chevereto\Legacy\encodeID; use function Chevereto\Legacy\G\check_value; @@ -35,8 +39,8 @@ use Throwable; class Album { - public const HASHED_NAMES = [ - 'password', + public const ENCRYPTED_NAMES = [ + 'password' ]; public static function getSingle( @@ -83,6 +87,9 @@ class Album $album_db['album_liked'] = (bool) $album_db['like_user_id']; } $return = $album_db; + if (isset($return['album_password']) && hasEncryption()) { + $return['album_password'] = decrypt($return['album_password']); + } return $pretty ? self::formatArray($return) @@ -104,6 +111,13 @@ class Album $db = DB::getInstance(); $db->query($query); $db_rows = $db->fetchAll(); + if (hasEncryption()) { + foreach ($db_rows as &$row) { + if (isset($row['album_password'])) { + $row['album_password'] = decrypt($row['album_password']); + } + } + } if ($pretty) { $return = []; foreach ($db_rows as $k => $v) { @@ -165,7 +179,9 @@ class Album if (!check_value($values['password'])) { throw new Exception('Missing album password', 100); } - $values['password'] = password_hash($values['password'], PASSWORD_BCRYPT); + if (hasEncryption()) { + $values = encryptValues(self::ENCRYPTED_NAMES, $values); + } } $flood = self::handleFlood(); if ($flood !== []) { @@ -292,11 +308,8 @@ class Album nullify_string($values['description']); } assertNotStopWords($values['name'] ?? '', $values['description'] ?? ''); - if (($values['privacy'] ?? null) !== 'password') { - $values['password'] = null; - } - if (isset($values['password'])) { - $values['password'] = password_hash($values['password'], PASSWORD_BCRYPT); + if (isset($values['password']) && hasEncryption()) { + $values = encryptValues(self::ENCRYPTED_NAMES, $values); } return DB::update('albums', $values, ['id' => $id]); @@ -518,22 +531,23 @@ class Album return $output; } - public static function checkPassword(string $hash, string $user_password): bool - { - return password_verify($user_password, $hash); - } - - public static function storeUserPasswordHash($album_id, $user_password): void + public static function storeUserPassword($album_id, $user_password): void { $addValue = session()['password']; + if (hasEncryption()) { + $user_password = encrypt($user_password); + } $addValue['album'][$album_id] = $user_password; sessionVar()->put('password', $addValue); } public static function checkSessionPassword($album = []): bool { - $user_password_hash = session()['password']['album'][$album['id']] ?? null; - if (!isset($user_password_hash) || !password_verify($user_password_hash, $album['password'])) { + $session_password = session()['password']['album'][$album['id']] ?? null; + if (isset($session_password) && hasEncryption()) { + $session_password = decrypt($session_password); + } + if (!isset($session_password) || !hash_equals($session_password, $album['password'])) { $removeValue = session()['password'] ?? null; unset($removeValue['album'][$album['id']]); sessionVar()->put('password', $removeValue); diff --git a/app/src/Legacy/Classes/Search.php b/app/src/Legacy/Classes/Search.php index 01d1b50..06aa773 100644 --- a/app/src/Legacy/Classes/Search.php +++ b/app/src/Legacy/Classes/Search.php @@ -24,7 +24,7 @@ class Search public string $wheres; - public string $q; + public string $q = ''; public string $type; @@ -64,13 +64,25 @@ class Search $this->q .= implode(' ', $operator) . ' '; } if (isset($this->q)) { - $this->q = preg_replace('/\s+/', ' ', trim($this->q)); + $this->q = trim($this->q); + $this->q = preg_replace( + '/\s+/', + ' ', + trim($this->q) + ) ?? ''; } + $this->q ??= ''; $q_match = $this->q; $search_binds = []; $search_op_wheres = []; foreach ($search_op['named'] as $v) { - $q_match = trim(preg_replace('/\s+/', ' ', str_replace($v, '', $q_match))); + $q_match = trim( + preg_replace( + '/\s+/', + ' ', + str_replace($v, '', $q_match) + ) + ); if ($q_match === '') { $q_match = null; } diff --git a/app/src/Legacy/G/Handler.php b/app/src/Legacy/G/Handler.php index 98cfbb8..bba32f5 100644 --- a/app/src/Legacy/G/Handler.php +++ b/app/src/Legacy/G/Handler.php @@ -424,7 +424,7 @@ class Handler return false; } - return hash_equals(session()['G_auth_token'], $token); + return hash_equals((string) session()['G_auth_token'], $token); } public static function setVar(string $var, mixed $value): void diff --git a/app/src/Legacy/functions.php b/app/src/Legacy/functions.php index 0a75ef2..8742aac 100644 --- a/app/src/Legacy/functions.php +++ b/app/src/Legacy/functions.php @@ -164,9 +164,13 @@ function send_mail($to, $subject, $body): bool } else { $from = [getSettings()['email_from_email'], getSettings()['email_from_name']]; $reply_to = null; + $fromEmail = $from[0]; + if (str_ends_with($fromEmail, '@chevereto.com')) { + throw new Exception('Forbidden to send email from ' . $fromEmail, 600); + } } if (!filter_var($to, FILTER_VALIDATE_EMAIL)) { - throw new Exception('Invalid email', 100); + throw new Exception('Invalid to email', 100); } foreach (['email_from_email', 'email_from_name'] as $v) { if (!getSettings()[$v]) { diff --git a/app/upgrading.php b/app/upgrading.php index 7ddb32b..6cecb13 100644 --- a/app/upgrading.php +++ b/app/upgrading.php @@ -123,12 +123,15 @@ if (PHP_SAPI === 'cli') { } } else { $singleStep = false; - $action = $_GET['action'] ?? ''; - $token = $_GET['token'] ?? ''; + $action = (string) ($_GET['action'] ?? ''); + $token = (string) ($_GET['token'] ?? ''); if (!file_exists($lockUpgrading)) { abort('[!] Upgrade is not expected', 403); } $upgradeToken = file_get_contents($lockUpgrading); + if ($upgradeToken === false) { + abort('[!] Invalid token file', 403); + } if (!hash_equals($upgradeToken, $token)) { abort('[!] Invalid token', 403); } diff --git a/content/legacy/themes/Peafowl/lib/chevereto.js b/content/legacy/themes/Peafowl/lib/chevereto.js index ccad89c..47c873b 100644 --- a/content/legacy/themes/Peafowl/lib/chevereto.js +++ b/content/legacy/themes/Peafowl/lib/chevereto.js @@ -2886,7 +2886,13 @@ $(function () { ' ' + '', }); - }) + }); + $(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"; + }); }); if (typeof CHV == "undefined") { diff --git a/content/legacy/themes/Peafowl/lib/chevereto.min.js b/content/legacy/themes/Peafowl/lib/chevereto.min.js index 15744e4..c3c3183 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+'

"})})}),"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 +$(".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 diff --git a/content/legacy/themes/Peafowl/snippets/form_album.php b/content/legacy/themes/Peafowl/snippets/form_album.php index 4e1ec59..e561a96 100644 --- a/content/legacy/themes/Peafowl/snippets/form_album.php +++ b/content/legacy/themes/Peafowl/snippets/form_album.php @@ -88,8 +88,7 @@ if (!defined('ACCESS') || !ACCESS) {
    -

    - > + >
    diff --git a/content/legacy/themes/Peafowl/snippets/form_sub_album.php b/content/legacy/themes/Peafowl/snippets/form_sub_album.php index a27f903..d7d103a 100644 --- a/content/legacy/themes/Peafowl/snippets/form_sub_album.php +++ b/content/legacy/themes/Peafowl/snippets/form_sub_album.php @@ -46,7 +46,7 @@ if (!defined('ACCESS') || !ACCESS) {
    - +
    diff --git a/content/legacy/themes/Peafowl/views/dashboard/stats.php b/content/legacy/themes/Peafowl/views/dashboard/stats.php index 5abbb35..700963e 100644 --- a/content/legacy/themes/Peafowl/views/dashboard/stats.php +++ b/content/legacy/themes/Peafowl/views/dashboard/stats.php @@ -16,17 +16,17 @@ if (!defined('ACCESS') || !ACCESS) {