From 2dad3a218cab34b863570faecb6198b7a9188c09 Mon Sep 17 00:00:00 2001 From: Madeline <46743919+MaddyUnderStars@users.noreply.github.com> Date: Tue, 24 Sep 2024 00:06:19 +0000 Subject: [PATCH 1/4] fix: don't include email in generated pw reset link The email param was never used when checking if the pw reset link was valid, so it can be safely removed --- system/modules/auth/actions/forgotpassword.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/system/modules/auth/actions/forgotpassword.php b/system/modules/auth/actions/forgotpassword.php index e19a26f12..8e24aa166 100755 --- a/system/modules/auth/actions/forgotpassword.php +++ b/system/modules/auth/actions/forgotpassword.php @@ -39,7 +39,7 @@ function forgotpassword_POST(Web $w) // Send email $message = "Hello {$user->getFullName()},\n
"; $message .= "Please go to this link to reset your password:
\n"; - $message .= "email}&token={$user->password_reset_token}\">https://" + $message .= "password_reset_token}\">https://" . $_SERVER["HTTP_HOST"] . "/auth/resetpassword?token={$user->password_reset_token}\n
You have 24 hours to reset your password.

"; $message .= "Thank you,\n
". Config::get('main.company_name', 'Cosine'); From d7890df7da4deffbca5242aba5aa25809183947b Mon Sep 17 00:00:00 2001 From: Madeline <46743919+MaddyUnderStars@users.noreply.github.com> Date: Tue, 24 Sep 2024 00:25:05 +0000 Subject: [PATCH 2/4] feat: configurable password reset token expiry --- system/modules/auth/actions/forgotpassword.php | 8 +++++++- system/modules/auth/actions/resetpassword.php | 10 ++++++++-- system/modules/auth/config.php | 3 ++- 3 files changed, 17 insertions(+), 4 deletions(-) diff --git a/system/modules/auth/actions/forgotpassword.php b/system/modules/auth/actions/forgotpassword.php index 8e24aa166..b9f01a678 100755 --- a/system/modules/auth/actions/forgotpassword.php +++ b/system/modules/auth/actions/forgotpassword.php @@ -1,5 +1,7 @@ dt_password_reset_at = time(); $user->update(); + // default 30 minutes + $expiry = Config::get("auth.login.password.reset_token_expiry", 30 * 60); + $readable_expiry = CarbonInterval::seconds($expiry)->cascade()->forHumans(); + // Send email $message = "Hello {$user->getFullName()},\n
"; $message .= "Please go to this link to reset your password:
\n"; $message .= "password_reset_token}\">https://" - . $_SERVER["HTTP_HOST"] . "/auth/resetpassword?token={$user->password_reset_token}\n
You have 24 hours to reset your password.

"; + . $_SERVER["HTTP_HOST"] . "/auth/resetpassword?token={$user->password_reset_token}\n
You have {$readable_expiry} to reset your password.

"; $message .= "Thank you,\n
". Config::get('main.company_name', 'Cosine'); $result = MailService::getInstance($w)->sendMail($user_contact->email, $support_email, Config::get("main.application_name") . " password reset", $message); diff --git a/system/modules/auth/actions/resetpassword.php b/system/modules/auth/actions/resetpassword.php index 39e041a47..f8aa079bb 100755 --- a/system/modules/auth/actions/resetpassword.php +++ b/system/modules/auth/actions/resetpassword.php @@ -1,5 +1,6 @@ id)) { // Check that the password reset hasn't expired LogService::getInstance($w)->setLogger("AUTH")->debug("USER: " . $user->id . " TIME: " . time() . " USER_RESET: " . $user->dt_password_reset_at . " RESULT: " . (time() - $user->dt_password_reset_at)); - if ((time() - $user->dt_password_reset_at) > 86400) { - $w->msg("Your token has expired (max 24 hours), please submit for a new one", "/auth/forgotpassword"); + + // default 30 minutes + $expiry = Config::get("auth.login.password.reset_token_expiry", 30 * 60); + $readable_expiry = CarbonInterval::seconds($expiry)->cascade()->forHumans(); + + if ((time() - $user->dt_password_reset_at) > $expiry) { + $w->msg("Your token has expired (max {$readable_expiry}), please submit for a new one", "/auth/forgotpassword"); return; } diff --git a/system/modules/auth/config.php b/system/modules/auth/config.php index 716a6a5ed..eb1d7bc48 100755 --- a/system/modules/auth/config.php +++ b/system/modules/auth/config.php @@ -16,7 +16,8 @@ 'login' => [ 'password' => [ 'enforce_length' => false, - 'min_length' => 8 + 'min_length' => 8, + "reset_token_expiry" => 30 * 60 // 30 minutes ], 'attempts' => [ 'track_attempts' => false, From a8b80ac9ebe0f69b616eb537934f34c38f082d8d Mon Sep 17 00:00:00 2001 From: iceaxeliehne Date: Thu, 26 Sep 2024 13:40:30 +1000 Subject: [PATCH 3/4] chore: merge main into develop (#374) * Fix/timezone fix (#366) * Fix timezone issue once and for all * improved timezone testing * Update ci.yml set locale so that dates are formatted correctly when running tests * Update ci.yml trying another way * Update ci.yml trying for timelog tests * Try global env --------- Co-authored-by: Matt Bell * Fix: CI for day/month date tests (#377) * Logging of testrun context, with explicit locale setting * Stepwise check for yml typos * Fix yml indent --------- Co-authored-by: Derek Crannaford * Fix: Change to mount instead of install (#378) * Change to mount instead of install * Improve source code details section * Less output from GIT log --------- Co-authored-by: Adam Buckley Co-authored-by: Matt Bell Co-authored-by: DerekCrannaford <43056286+DerekCrannaford@users.noreply.github.com> Co-authored-by: Derek Crannaford --- .github/workflows/ci.yml | 32 +++++++++++++++++-- .../acceptance/playwright/timelog.test.ts | 6 ++-- .../acceptance/playwright/timelog.utils.ts | 5 +++ system/web.php | 8 +++-- 4 files changed, 43 insertions(+), 8 deletions(-) diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index f9c4c5c3e..f855e5283 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -14,6 +14,7 @@ env: DB_PASSWORD: cmfive_test DB_DATABASE: cmfive_test PLAYWRIGHT_MODULES: "admin channel form tag report task timelog" + LANG: en_AU.UTF-8 jobs: # Lint @@ -128,11 +129,11 @@ jobs: -v ${{ github.workspace }}/boilerplate/.codepipeline/test_agent/configs/test_agent-config.php:/var/www/html/config.php:rw \ -v ${{ github.workspace }}/boilerplate/test:/var/www/html/test:rw \ -v ${{ github.workspace }}/boilerplate/storage:/var/www/html/storage:rw \ + -v ${{ github.workspace }}/core/system:/var/www/html/system:rw \ -e DB_HOST=mysql-8 \ -e DB_USERNAME=$DB_USERNAME \ -e DB_PASSWORD=$DB_PASSWORD \ -e DB_DATABASE=$DB_DATABASE \ - -e INSTALL_CORE_BRANCH=$CORE_BRANCH \ -e ENVIRONMENT=development \ --network=cmfive \ $BOILERPLATE_IMAGE @@ -150,6 +151,23 @@ jobs: fi done + - name: Get source code details + if: ${{ failure() }} || ${{ success() }} + run: | + echo ">> CONTAINER LABELS (BOILERPLATE) <<" + echo "====================================" + docker inspect --format='{{range $key, $value := .Config.Labels}}{{$key}}={{$value}}{{println}}{{end}}' cmfive + echo "" + echo "" + echo ">> CORE COMMIT DETAILS <<" + echo "=========================" + echo "VENDOR DIRECTORY: (should be unused)" + docker exec -u cmfive cmfive sh -c "cd composer/vendor/2pisoftware/cmfive-core && git log -1 --pretty=format:"CORE_HASH=\"%H\"%nCORE_COMMIT_MSG=\"%s\"%nCORE_REF=\"%D\""" + echo "" + echo "MOUNTED CORE: (should be used, this is mounted to /system)" + pushd core + git log -1 --pretty=format:"CORE_HASH=\"%H\"%nCORE_COMMIT_MSG=\"%s\"%nCORE_REF=\"%D\"" + - name: Compile the theme run: | # Copy the theme from the docker container @@ -164,6 +182,16 @@ jobs: - name: Setup cmfive Test Environment run: | docker exec -t cmfive sh -c "chmod -R ugo=rwX /var/www/html*" + sudo locale-gen en_AU.UTF-8 + sudo update-locale en_AU.UTF-8 + LANG=en_AU.UTF-8 + LC_ALL=en_AU.UTF-8 + echo "Test Execution context:" + echo "Runner locale info" + date + locale + echo "Web host timezone" + docker exec -t cmfive sh -c "date" - name: Inject configs into cmfive Test Environment run: | @@ -269,7 +297,7 @@ jobs: if [ $? -gt 0 ]; then echo "Timelog module tests failed" fi - + - name: Get container logs if: ${{ failure() }} || ${{ success() }} run: | diff --git a/system/modules/timelog/tests/acceptance/playwright/timelog.test.ts b/system/modules/timelog/tests/acceptance/playwright/timelog.test.ts index 0483e17f4..f2e0dc162 100644 --- a/system/modules/timelog/tests/acceptance/playwright/timelog.test.ts +++ b/system/modules/timelog/tests/acceptance/playwright/timelog.test.ts @@ -21,8 +21,8 @@ test("You can create a Timelog using Timer" , async ({page, isMobile}) => { const taskID = await TaskHelper.createTask(page, isMobile, task, taskgroup, "Software Development"); const timelog = CmfiveHelper.randomID("timelog_"); - await TimelogHelper.createTimelogFromTimer(page, isMobile, timelog, task, taskID); - + const start_time = new DateTime('now').minus({hours: 1}).toFormat("HH:mm"); + await TimelogHelper.createTimelogFromTimer(page, isMobile, timelog, task, taskID, start_time); await TimelogHelper.deleteTimelog(page, isMobile, timelog, task, taskID); await TaskHelper.deleteTask(page, isMobile, task, taskID); await TaskHelper.deleteTaskGroup(page, isMobile, taskgroup, taskgroupID); @@ -49,7 +49,7 @@ test("You can create a Timelog using Add Timelog" , async ({page, isMobile}) => timelog, task, taskID, - DateTime.fromFormat("1/1/2021", "d/M/yyyy"), + DateTime.fromFormat("1/2/2021", "d/M/yyyy"), "10:00", "11:00", ); diff --git a/system/modules/timelog/tests/acceptance/playwright/timelog.utils.ts b/system/modules/timelog/tests/acceptance/playwright/timelog.utils.ts index 3153feb07..8f4abd86e 100644 --- a/system/modules/timelog/tests/acceptance/playwright/timelog.utils.ts +++ b/system/modules/timelog/tests/acceptance/playwright/timelog.utils.ts @@ -28,6 +28,8 @@ export class TimelogHelper { await page.getByRole("link", {name: "Time Log"}).click(); await page.reload(); await expect(page.getByText(timelog)).toBeVisible(); + //check timelog date and time values + await expect(page.getByText(new DateTime('now').toFormat("dd-LL-yyyy") + ' ' + start_time)).toBeVisible(); } static async createTimelog(page: Page, isMobile: boolean, timelog: string, taskName: string, taskID: string, date: DateTime, start_time: string, end_time: string, check_duplicate: boolean = false) @@ -71,6 +73,9 @@ export class TimelogHelper { await expect(page.getByText(timelog)).toBeHidden(); else await expect(page.getByText(timelog)).toBeVisible(); + //check timelog date and time values + await expect(page.getByText(date.toFormat("dd-LL-yyyy") + ' ' + start_time)).toBeVisible(); + await expect(page.getByText(date.toFormat("dd-LL-yyyy") + ' ' + end_time)).toBeVisible(); } static async editTimelog(page: Page, isMobile: boolean, timelog: string, taskName: string, taskID: string, date: DateTime, start_time: string, end_time: string) diff --git a/system/web.php b/system/web.php index 74ce8af70..d50caf08d 100755 --- a/system/web.php +++ b/system/web.php @@ -546,9 +546,7 @@ public function start($init_database = true) $this->ctx('error', "An error occoured, if this message persists please contact your administrator."); }); } - if ($init_database) { - $this->initDB(); - } + // Set the timezone from Config $timezone = Config::get('system.timezone'); @@ -557,6 +555,10 @@ public function start($init_database = true) } date_default_timezone_set($timezone); + if ($init_database) { + $this->initDB(); + } + //check config for 'gc_maxlifetime' for the session $gc_maxlifetime = Config::get('system.gc_maxlifetime'); //Checks include is greater than 1 hour (3600 sec) is less than 1 month (2628000 sec) From e3ee3c74ad75217ff07e07e0d8c4deb899610ab3 Mon Sep 17 00:00:00 2001 From: Adam Buckley Date: Wed, 6 Nov 2024 10:00:39 +1100 Subject: [PATCH 4/4] feat: removed old and/or unused packages (#324) * feat: removed old and/or unused packages * fix: missed a file in the commit --------- Co-authored-by: iceaxeliehne --- .../migration/layout-pretext.tpl.php | 1 - system/templates/js/boxover.js | 372 - system/templates/js/chart-js/.codeclimate.yml | 19 - system/templates/js/chart-js/.editorconfig | 10 - system/templates/js/chart-js/.eslintignore | 1 - system/templates/js/chart-js/.eslintrc | 224 - .../js/chart-js/.github/ISSUE_TEMPLATE.md | 40 - .../chart-js/.github/PULL_REQUEST_TEMPLATE.md | 9 - system/templates/js/chart-js/.gitignore | 12 - system/templates/js/chart-js/.npmignore | 13 - system/templates/js/chart-js/.travis.yml | 61 - system/templates/js/chart-js/CONTRIBUTING.md | 64 - system/templates/js/chart-js/MAINTAINING.md | 36 - system/templates/js/chart-js/bower.json | 16 - system/templates/js/chart-js/component.json | 11 - system/templates/js/chart-js/composer.json | 26 - system/templates/js/chart-js/config.jshintrc | 5 - .../js/chart-js/docs/00-Getting-Started.md | 126 - .../chart-js/docs/01-Chart-Configuration.md | 518 - .../templates/js/chart-js/docs/02-Scales.md | 369 - .../js/chart-js/docs/03-Line-Chart.md | 187 - .../js/chart-js/docs/04-Bar-Chart.md | 174 - .../js/chart-js/docs/05-Radar-Chart.md | 125 - .../js/chart-js/docs/06-Polar-Area-Chart.md | 109 - .../js/chart-js/docs/07-Pie-Doughnut-Chart.md | 115 - .../js/chart-js/docs/08-Bubble-Chart.md | 100 - .../templates/js/chart-js/docs/09-Advanced.md | 465 - system/templates/js/chart-js/docs/10-Notes.md | 115 - system/templates/js/chart-js/docs/Chart.js | 1443 -- system/templates/js/chart-js/docs/index.html | 766 - .../templates/js/chart-js/docs/prettify.css | 38 - system/templates/js/chart-js/docs/prettify.js | 28 - .../templates/js/chart-js/docs/prettify.less | 33 - system/templates/js/chart-js/docs/styles.css | 263 - system/templates/js/chart-js/docs/styles.less | 185 - system/templates/js/chart-js/gulpfile.js | 249 - system/templates/js/chart-js/karma.conf.ci.js | 25 - system/templates/js/chart-js/karma.conf.js | 14 - .../js/chart-js/karma.coverage.conf.js | 43 - system/templates/js/chart-js/package.json | 52 - system/templates/js/chart-js/readme.md | 54 - .../samples/animation/progress-bar.html | 96 - system/templates/js/chart-js/samples/bar.html | 39 - .../chart-js/samples/bar/bar-horizontal.html | 149 - .../chart-js/samples/bar/bar-multi-axis.html | 108 - .../samples/bar/bar-stacked-group.html | 105 - .../js/chart-js/samples/bar/bar-stacked.html | 102 - .../js/chart-js/samples/bar/bar.html | 144 - .../templates/js/chart-js/samples/bubble.html | 191 - .../js/chart-js/samples/combo-bar-line.html | 101 - .../js/chart-js/samples/data_labelling.html | 132 - .../js/chart-js/samples/doughnut.html | 144 - .../chart-js/samples/legend/pointstyle.html | 116 - .../js/chart-js/samples/legend/positions.html | 121 - .../templates/js/chart-js/samples/line.html | 43 - .../samples/line/different-point-sizes.html | 130 - .../samples/line/interpolation-modes.html | 103 - .../samples/line/line-multi-axis.html | 104 - .../samples/line/line-skip-points.html | 95 - .../samples/line/line-stacked-area.html | 183 - .../chart-js/samples/line/line-stepped.html | 93 - .../js/chart-js/samples/line/line-styles.html | 111 - .../js/chart-js/samples/line/line.html | 163 - .../chart-js/samples/line/point-styles.html | 96 - system/templates/js/chart-js/samples/pie.html | 97 - .../js/chart-js/samples/polar-area.html | 117 - .../js/chart-js/samples/polarArea.html | 44 - .../templates/js/chart-js/samples/radar.html | 43 - .../samples/radar/radar-skip-points.html | 109 - .../js/chart-js/samples/radar/radar.html | 146 - .../samples/scales/display-settings.html | 124 - .../samples/scales/filtering-labels.html | 93 - .../js/chart-js/samples/scales/gridlines.html | 69 - .../samples/scales/line-non-numeric-y.html | 73 - .../scales/linear/min-max-settings.html | 64 - .../samples/scales/linear/step-size.html | 175 - .../linear/suggested-min-max-settings.html | 67 - .../scales/logarithmic/line-logarithmic.html | 97 - .../scales/logarithmic/scatter-logX.html | 171 - .../samples/scales/multiline-labels.html | 86 - .../samples/scales/time/combo-time-scale.html | 175 - .../scales/time/line-time-point-data.html | 149 - .../samples/scales/time/line-time-scale.html | 207 - .../samples/scatter/scatter-multi-axis.html | 139 - .../js/chart-js/samples/scatter/scatter.html | 107 - .../templates/js/chart-js/samples/sixup.html | 155 - .../tooltips/dataPoints-customTooltips.html | 125 - .../samples/tooltips/interaction-modes.html | 125 - .../samples/tooltips/line-customTooltips.html | 165 - .../samples/tooltips/pie-customTooltips.html | 146 - .../samples/tooltips/position-modes.html | 86 - .../samples/tooltips/tooltip-callbacks.html | 107 - system/templates/js/chart-js/samples/utils.js | 13 - .../templates/js/chart-js/scripts/release.sh | 29 - .../js/chart-js/site/assets/6charts.png | Bin 79923 -> 0 bytes .../js/chart-js/site/assets/Chart.js | 1443 -- .../js/chart-js/site/assets/effects.js | 320 - .../js/chart-js/site/assets/excanvas.js | 1416 -- .../js/chart-js/site/assets/html.png | Bin 83653 -> 0 bytes .../js/chart-js/site/assets/simple.png | Bin 48416 -> 0 bytes system/templates/js/chart-js/site/index.html | 141 - system/templates/js/chart-js/site/styles.css | 205 - system/templates/js/chart-js/src/chart.js | 52 - .../js/chart-js/src/charts/Chart.Bar.js | 11 - .../js/chart-js/src/charts/Chart.Bubble.js | 10 - .../js/chart-js/src/charts/Chart.Doughnut.js | 11 - .../js/chart-js/src/charts/Chart.Line.js | 11 - .../js/chart-js/src/charts/Chart.PolarArea.js | 11 - .../js/chart-js/src/charts/Chart.Radar.js | 11 - .../js/chart-js/src/charts/Chart.Scatter.js | 47 - .../src/controllers/controller.bar.js | 540 - .../src/controllers/controller.bubble.js | 122 - .../src/controllers/controller.doughnut.js | 303 - .../src/controllers/controller.line.js | 339 - .../src/controllers/controller.polarArea.js | 215 - .../src/controllers/controller.radar.js | 181 - .../js/chart-js/src/core/core.animation.js | 139 - .../chart-js/src/core/core.canvasHelpers.js | 124 - .../js/chart-js/src/core/core.controller.js | 752 - .../src/core/core.datasetController.js | 309 - .../js/chart-js/src/core/core.element.js | 96 - .../js/chart-js/src/core/core.helpers.js | 969 -- .../js/chart-js/src/core/core.interaction.js | 312 - system/templates/js/chart-js/src/core/core.js | 56 - .../chart-js/src/core/core.layoutService.js | 369 - .../js/chart-js/src/core/core.legend.js | 536 - .../js/chart-js/src/core/core.plugin.js | 325 - .../js/chart-js/src/core/core.scale.js | 759 - .../js/chart-js/src/core/core.scaleService.js | 40 - .../js/chart-js/src/core/core.ticks.js | 208 - .../js/chart-js/src/core/core.title.js | 220 - .../js/chart-js/src/core/core.tooltip.js | 880 -- .../js/chart-js/src/elements/element.arc.js | 104 - .../js/chart-js/src/elements/element.line.js | 184 - .../js/chart-js/src/elements/element.point.js | 100 - .../src/elements/element.rectangle.js | 208 - .../js/chart-js/src/platforms/platform.dom.js | 277 - .../js/chart-js/src/platforms/platform.js | 69 - .../js/chart-js/src/scales/scale.category.js | 125 - .../js/chart-js/src/scales/scale.linear.js | 184 - .../chart-js/src/scales/scale.linearbase.js | 98 - .../chart-js/src/scales/scale.logarithmic.js | 244 - .../chart-js/src/scales/scale.radialLinear.js | 513 - .../js/chart-js/src/scales/scale.time.js | 456 - .../js/chart-js/test/controller.bar.tests.js | 1410 -- .../chart-js/test/controller.bubble.tests.js | 432 - .../test/controller.doughnut.tests.js | 352 - .../js/chart-js/test/controller.line.tests.js | 775 - .../test/controller.polarArea.tests.js | 357 - .../chart-js/test/controller.radar.tests.js | 472 - .../js/chart-js/test/core.controller.tests.js | 656 - .../test/core.datasetController.tests.js | 188 - .../js/chart-js/test/core.element.tests.js | 45 - .../js/chart-js/test/core.helpers.tests.js | 920 -- .../chart-js/test/core.interaction.tests.js | 797 - .../chart-js/test/core.layoutService.tests.js | 393 - .../js/chart-js/test/core.legend.tests.js | 432 - .../js/chart-js/test/core.plugin.tests.js | 344 - .../chart-js/test/core.scaleService.tests.js | 29 - .../js/chart-js/test/core.title.tests.js | 272 - .../js/chart-js/test/core.tooltip.tests.js | 677 - .../js/chart-js/test/defaultConfig.tests.js | 296 - .../js/chart-js/test/element.arc.tests.js | 216 - .../js/chart-js/test/element.line.tests.js | 2583 ---- .../js/chart-js/test/element.point.tests.js | 528 - .../chart-js/test/element.rectangle.tests.js | 337 - .../templates/js/chart-js/test/mockContext.js | 352 - .../js/chart-js/test/platform.dom.tests.js | 369 - .../js/chart-js/test/scale.category.tests.js | 386 - .../js/chart-js/test/scale.linear.tests.js | 804 - .../chart-js/test/scale.logarithmic.tests.js | 780 - .../chart-js/test/scale.radialLinear.tests.js | 444 - .../js/chart-js/test/scale.time.tests.js | 552 - system/templates/js/chart-js/thankyou.md | 3 - .../js/codemirror-4.4/.gitattributes | 8 - .../templates/js/codemirror-4.4/.travis.yml | 3 - system/templates/js/codemirror-4.4/AUTHORS | 368 - .../js/codemirror-4.4/CONTRIBUTING.md | 76 - system/templates/js/codemirror-4.4/README.md | 11 - .../js/codemirror-4.4/bin/authors.sh | 6 - .../templates/js/codemirror-4.4/bin/compress | 92 - system/templates/js/codemirror-4.4/bin/lint | 16 - .../templates/js/codemirror-4.4/bin/release | 46 - .../js/codemirror-4.4/bin/source-highlight | 51 - system/templates/js/codemirror-4.4/bower.json | 16 - .../js/codemirror-4.4/demo/activeline.html | 78 - .../js/codemirror-4.4/demo/anywordhint.html | 79 - .../js/codemirror-4.4/demo/bidi.html | 74 - .../js/codemirror-4.4/demo/btree.html | 85 - .../js/codemirror-4.4/demo/buffers.html | 109 - .../js/codemirror-4.4/demo/changemode.html | 58 - .../js/codemirror-4.4/demo/closebrackets.html | 52 - .../js/codemirror-4.4/demo/closetag.html | 41 - .../js/codemirror-4.4/demo/complete.html | 79 - .../js/codemirror-4.4/demo/emacs.html | 75 - .../js/codemirror-4.4/demo/folding.html | 95 - .../js/codemirror-4.4/demo/fullscreen.html | 83 - .../js/codemirror-4.4/demo/hardwrap.html | 72 - .../js/codemirror-4.4/demo/html5complete.html | 56 - .../js/codemirror-4.4/demo/indentwrap.html | 59 - .../js/codemirror-4.4/demo/lint.html | 171 - .../js/codemirror-4.4/demo/loadmode.html | 49 - .../js/codemirror-4.4/demo/marker.html | 52 - .../js/codemirror-4.4/demo/markselection.html | 45 - .../codemirror-4.4/demo/matchhighlighter.html | 47 - .../js/codemirror-4.4/demo/matchtags.html | 48 - .../js/codemirror-4.4/demo/merge.html | 107 - .../js/codemirror-4.4/demo/multiplex.html | 75 - .../js/codemirror-4.4/demo/mustache.html | 68 - .../js/codemirror-4.4/demo/placeholder.html | 45 - .../js/codemirror-4.4/demo/preview.html | 87 - .../js/codemirror-4.4/demo/resize.html | 58 - .../js/codemirror-4.4/demo/rulers.html | 49 - .../js/codemirror-4.4/demo/runmode.html | 62 - .../js/codemirror-4.4/demo/search.html | 87 - .../demo/spanaffectswrapping_shim.html | 85 - .../js/codemirror-4.4/demo/sublime.html | 79 - .../js/codemirror-4.4/demo/tern.html | 131 - .../js/codemirror-4.4/demo/theme.html | 126 - .../js/codemirror-4.4/demo/trailingspace.html | 48 - .../codemirror-4.4/demo/variableheight.html | 67 - .../templates/js/codemirror-4.4/demo/vim.html | 99 - .../js/codemirror-4.4/demo/visibletabs.html | 62 - .../js/codemirror-4.4/demo/widget.html | 85 - .../js/codemirror-4.4/demo/xmlcomplete.html | 119 - .../js/codemirror-4.4/doc/activebookmark.js | 57 - .../js/codemirror-4.4/doc/compress.html | 285 - .../templates/js/codemirror-4.4/doc/docs.css | 232 - .../js/codemirror-4.4/doc/internals.html | 503 - .../templates/js/codemirror-4.4/doc/logo.png | Bin 12003 -> 0 bytes .../templates/js/codemirror-4.4/doc/logo.svg | 147 - .../js/codemirror-4.4/doc/manual.html | 2911 ---- .../js/codemirror-4.4/doc/realworld.html | 158 - .../js/codemirror-4.4/doc/releases.html | 908 -- .../js/codemirror-4.4/doc/reporting.html | 61 - .../js/codemirror-4.4/doc/upgrade_v2.2.html | 96 - .../js/codemirror-4.4/doc/upgrade_v3.html | 230 - .../js/codemirror-4.4/doc/upgrade_v4.html | 144 - system/templates/js/codemirror-4.4/index.html | 199 - .../templates/js/codemirror-4.4/package.json | 20 - .../js/codemirror-4.4/test/comment_test.js | 100 - .../js/codemirror-4.4/test/doc_test.js | 371 - .../js/codemirror-4.4/test/driver.js | 138 - .../js/codemirror-4.4/test/emacs_test.js | 138 - .../js/codemirror-4.4/test/index.html | 231 - .../js/codemirror-4.4/test/lint/acorn.js | 1782 --- .../js/codemirror-4.4/test/lint/lint.js | 166 - .../js/codemirror-4.4/test/lint/walk.js | 313 - .../js/codemirror-4.4/test/mode_test.css | 23 - .../js/codemirror-4.4/test/mode_test.js | 192 - .../js/codemirror-4.4/test/multi_test.js | 285 - .../js/codemirror-4.4/test/phantom_driver.js | 31 - .../templates/js/codemirror-4.4/test/run.js | 38 - .../js/codemirror-4.4/test/search_test.js | 62 - .../js/codemirror-4.4/test/sublime_test.js | 303 - .../templates/js/codemirror-4.4/test/test.js | 2025 --- .../js/codemirror-4.4/test/vim_test.js | 3427 ----- system/templates/js/colorbox/README | 298 - .../colorbox-old/jquery.colorbox-min.js | 2 - .../colorbox/colorbox-old/jquery.colorbox.js | 752 - .../templates/js/colorbox/colorbox/README.md | 527 - .../templates/js/colorbox/colorbox/bower.json | 31 - .../js/colorbox/colorbox/colorbox.ai | 1811 --- .../js/colorbox/colorbox/colorbox.css | 70 - .../js/colorbox/colorbox/colorbox.jquery.json | 30 - .../js/colorbox/colorbox/content/ajax.html | 11 - .../js/colorbox/colorbox/content/daisy.jpg | Bin 106088 -> 0 bytes .../js/colorbox/colorbox/content/daisy@2x.jpg | Bin 354739 -> 0 bytes .../js/colorbox/colorbox/content/homer.jpg | Bin 8917 -> 0 bytes .../js/colorbox/colorbox/content/marylou.jpg | Bin 55125 -> 0 bytes .../js/colorbox/colorbox/content/ohoopee1.jpg | Bin 74827 -> 0 bytes .../js/colorbox/colorbox/content/ohoopee2.jpg | Bin 117411 -> 0 bytes .../js/colorbox/colorbox/content/ohoopee3.jpg | Bin 71514 -> 0 bytes .../colorbox/colorbox/example1/colorbox.css | 70 - .../colorbox/example1/images/border.png | Bin 112 -> 0 bytes .../colorbox/example1/images/controls.png | Bin 2893 -> 0 bytes .../colorbox/example1/images/loading.gif | Bin 9427 -> 0 bytes .../example1/images/loading_background.png | Bin 157 -> 0 bytes .../colorbox/example1/images/overlay.png | Bin 182 -> 0 bytes .../js/colorbox/colorbox/example1/index.html | 95 - .../colorbox/colorbox/example2/colorbox.css | 50 - .../colorbox/example2/images/controls.png | Bin 570 -> 0 bytes .../colorbox/example2/images/loading.gif | Bin 9427 -> 0 bytes .../js/colorbox/colorbox/example2/index.html | 95 - .../colorbox/colorbox/example3/colorbox.css | 45 - .../colorbox/example3/images/controls.png | Bin 1633 -> 0 bytes .../colorbox/example3/images/loading.gif | Bin 9427 -> 0 bytes .../js/colorbox/colorbox/example3/index.html | 95 - .../colorbox/colorbox/example4/colorbox.css | 66 - .../colorbox/example4/images/border1.png | Bin 1057 -> 0 bytes .../colorbox/example4/images/border2.png | Bin 170 -> 0 bytes .../colorbox/example4/images/loading.gif | Bin 9427 -> 0 bytes .../js/colorbox/colorbox/example4/index.html | 95 - .../colorbox/colorbox/example5/colorbox.css | 58 - .../colorbox/example5/images/border.png | Bin 163 -> 0 bytes .../colorbox/example5/images/controls.png | Bin 2033 -> 0 bytes .../colorbox/example5/images/loading.gif | Bin 9427 -> 0 bytes .../example5/images/loading_background.png | Bin 166 -> 0 bytes .../js/colorbox/colorbox/example5/index.html | 95 - .../colorbox/i18n/jquery.colorbox-ar.js | 15 - .../colorbox/i18n/jquery.colorbox-bg.js | 16 - .../colorbox/i18n/jquery.colorbox-ca.js | 13 - .../colorbox/i18n/jquery.colorbox-cs.js | 16 - .../colorbox/i18n/jquery.colorbox-da.js | 16 - .../colorbox/i18n/jquery.colorbox-de.js | 15 - .../colorbox/i18n/jquery.colorbox-es.js | 13 - .../colorbox/i18n/jquery.colorbox-et.js | 15 - .../colorbox/i18n/jquery.colorbox-fa.js | 18 - .../colorbox/i18n/jquery.colorbox-fi.js | 15 - .../colorbox/i18n/jquery.colorbox-fr.js | 15 - .../colorbox/i18n/jquery.colorbox-gl.js | 13 - .../colorbox/i18n/jquery.colorbox-he.js | 16 - .../colorbox/i18n/jquery.colorbox-hr.js | 15 - .../colorbox/i18n/jquery.colorbox-hu.js | 15 - .../colorbox/i18n/jquery.colorbox-id.js | 15 - .../colorbox/i18n/jquery.colorbox-it.js | 15 - .../colorbox/i18n/jquery.colorbox-ja.js | 15 - .../colorbox/i18n/jquery.colorbox-kr.js | 15 - .../colorbox/i18n/jquery.colorbox-lv.js | 16 - .../colorbox/i18n/jquery.colorbox-nl.js | 15 - .../colorbox/i18n/jquery.colorbox-no.js | 16 - .../colorbox/i18n/jquery.colorbox-pl.js | 16 - .../colorbox/i18n/jquery.colorbox-pt-br.js | 15 - .../colorbox/i18n/jquery.colorbox-ro.js | 15 - .../colorbox/i18n/jquery.colorbox-ru.js | 16 - .../colorbox/i18n/jquery.colorbox-si.js | 15 - .../colorbox/i18n/jquery.colorbox-sk.js | 15 - .../colorbox/i18n/jquery.colorbox-sr.js | 15 - .../colorbox/i18n/jquery.colorbox-sv.js | 15 - .../colorbox/i18n/jquery.colorbox-tr.js | 19 - .../colorbox/i18n/jquery.colorbox-uk.js | 16 - .../colorbox/i18n/jquery.colorbox-zh-CN.js | 15 - .../colorbox/i18n/jquery.colorbox-zh-TW.js | 15 - .../js/colorbox/colorbox/images/border.png | Bin 112 -> 0 bytes .../js/colorbox/colorbox/images/controls.png | Bin 2893 -> 0 bytes .../js/colorbox/colorbox/images/loading.gif | Bin 9427 -> 0 bytes .../colorbox/images/loading_background.png | Bin 157 -> 0 bytes .../js/colorbox/colorbox/images/overlay.png | Bin 182 -> 0 bytes .../colorbox/colorbox/jquery.colorbox-min.js | 7 - .../js/colorbox/colorbox/jquery.colorbox.js | 1084 -- system/templates/js/date.js | 502 - system/templates/js/es6-promise.auto.js | 1185 -- .../development-bundle/AUTHORS.txt | 260 - .../development-bundle/Gruntfile.js | 240 - .../development-bundle/MIT-LICENSE.txt | 26 - .../development-bundle/README.md | 96 - .../external/globalize.culture.de-DE.js | 81 - .../external/globalize.culture.ja-JP.js | 100 - .../development-bundle/external/globalize.js | 1585 -- .../external/jquery.mousewheel.js | 101 - .../development-bundle/external/jshint.js | 4835 ------ .../development-bundle/external/qunit.css | 244 - .../development-bundle/external/qunit.js | 2152 --- .../development-bundle/jquery-1.10.2.js | 9789 ------------ .../development-bundle/package.json | 73 - .../themes/base/images/animated-overlay.gif | Bin 1738 -> 0 bytes .../images/ui-bg_flat_0_aaaaaa_40x100.png | Bin 180 -> 0 bytes .../images/ui-bg_flat_75_ffffff_40x100.png | Bin 178 -> 0 bytes .../images/ui-bg_glass_55_fbf9ee_1x400.png | Bin 120 -> 0 bytes .../images/ui-bg_glass_65_ffffff_1x400.png | Bin 105 -> 0 bytes .../images/ui-bg_glass_75_dadada_1x400.png | Bin 111 -> 0 bytes .../images/ui-bg_glass_75_e6e6e6_1x400.png | Bin 110 -> 0 bytes .../images/ui-bg_glass_95_fef1ec_1x400.png | Bin 119 -> 0 bytes .../ui-bg_highlight-soft_75_cccccc_1x100.png | Bin 101 -> 0 bytes .../base/images/ui-icons_222222_256x240.png | Bin 4369 -> 0 bytes .../base/images/ui-icons_2e83ff_256x240.png | Bin 4369 -> 0 bytes .../base/images/ui-icons_454545_256x240.png | Bin 4369 -> 0 bytes .../base/images/ui-icons_888888_256x240.png | Bin 4369 -> 0 bytes .../base/images/ui-icons_cd0a0a_256x240.png | Bin 4369 -> 0 bytes .../themes/base/jquery-ui.css | 1177 -- .../themes/base/jquery.ui.accordion.css | 38 - .../themes/base/jquery.ui.all.css | 12 - .../themes/base/jquery.ui.autocomplete.css | 16 - .../themes/base/jquery.ui.base.css | 25 - .../themes/base/jquery.ui.button.css | 114 - .../themes/base/jquery.ui.core.css | 93 - .../themes/base/jquery.ui.datepicker.css | 175 - .../themes/base/jquery.ui.dialog.css | 70 - .../themes/base/jquery.ui.menu.css | 79 - .../themes/base/jquery.ui.progressbar.css | 28 - .../themes/base/jquery.ui.resizable.css | 76 - .../themes/base/jquery.ui.selectable.css | 13 - .../themes/base/jquery.ui.slider.css | 73 - .../themes/base/jquery.ui.spinner.css | 65 - .../themes/base/jquery.ui.tabs.css | 51 - .../themes/base/jquery.ui.theme.css | 410 - .../themes/base/jquery.ui.tooltip.css | 21 - .../base/minified/images/animated-overlay.gif | Bin 1738 -> 0 bytes .../images/ui-bg_flat_0_aaaaaa_40x100.png | Bin 180 -> 0 bytes .../images/ui-bg_flat_75_ffffff_40x100.png | Bin 178 -> 0 bytes .../images/ui-bg_glass_55_fbf9ee_1x400.png | Bin 120 -> 0 bytes .../images/ui-bg_glass_65_ffffff_1x400.png | Bin 105 -> 0 bytes .../images/ui-bg_glass_75_dadada_1x400.png | Bin 111 -> 0 bytes .../images/ui-bg_glass_75_e6e6e6_1x400.png | Bin 110 -> 0 bytes .../images/ui-bg_glass_95_fef1ec_1x400.png | Bin 119 -> 0 bytes .../ui-bg_highlight-soft_75_cccccc_1x100.png | Bin 101 -> 0 bytes .../images/ui-icons_222222_256x240.png | Bin 4369 -> 0 bytes .../images/ui-icons_2e83ff_256x240.png | Bin 4369 -> 0 bytes .../images/ui-icons_454545_256x240.png | Bin 4369 -> 0 bytes .../images/ui-icons_888888_256x240.png | Bin 4369 -> 0 bytes .../images/ui-icons_cd0a0a_256x240.png | Bin 4369 -> 0 bytes .../themes/base/minified/jquery-ui.min.css | 7 - .../base/minified/jquery.ui.accordion.min.css | 5 - .../minified/jquery.ui.autocomplete.min.css | 5 - .../base/minified/jquery.ui.button.min.css | 5 - .../base/minified/jquery.ui.core.min.css | 5 - .../minified/jquery.ui.datepicker.min.css | 5 - .../base/minified/jquery.ui.dialog.min.css | 5 - .../base/minified/jquery.ui.menu.min.css | 5 - .../minified/jquery.ui.progressbar.min.css | 5 - .../base/minified/jquery.ui.resizable.min.css | 5 - .../minified/jquery.ui.selectable.min.css | 5 - .../base/minified/jquery.ui.slider.min.css | 5 - .../base/minified/jquery.ui.spinner.min.css | 5 - .../base/minified/jquery.ui.tabs.min.css | 5 - .../base/minified/jquery.ui.theme.min.css | 5 - .../base/minified/jquery.ui.tooltip.min.css | 5 - .../smoothness/images/animated-overlay.gif | Bin 1738 -> 0 bytes .../images/ui-bg_flat_0_aaaaaa_40x100.png | Bin 212 -> 0 bytes .../images/ui-bg_flat_75_ffffff_40x100.png | Bin 208 -> 0 bytes .../images/ui-bg_glass_55_fbf9ee_1x400.png | Bin 335 -> 0 bytes .../images/ui-bg_glass_65_ffffff_1x400.png | Bin 207 -> 0 bytes .../images/ui-bg_glass_75_dadada_1x400.png | Bin 262 -> 0 bytes .../images/ui-bg_glass_75_e6e6e6_1x400.png | Bin 262 -> 0 bytes .../images/ui-bg_glass_95_fef1ec_1x400.png | Bin 332 -> 0 bytes .../ui-bg_highlight-soft_75_cccccc_1x100.png | Bin 280 -> 0 bytes .../images/ui-icons_222222_256x240.png | Bin 6922 -> 0 bytes .../images/ui-icons_2e83ff_256x240.png | Bin 4549 -> 0 bytes .../images/ui-icons_454545_256x240.png | Bin 6992 -> 0 bytes .../images/ui-icons_888888_256x240.png | Bin 6999 -> 0 bytes .../images/ui-icons_cd0a0a_256x240.png | Bin 4549 -> 0 bytes .../themes/smoothness/jquery-ui.css | 1178 -- .../themes/smoothness/jquery.ui.accordion.css | 38 - .../themes/smoothness/jquery.ui.all.css | 12 - .../smoothness/jquery.ui.autocomplete.css | 16 - .../themes/smoothness/jquery.ui.base.css | 25 - .../themes/smoothness/jquery.ui.button.css | 114 - .../themes/smoothness/jquery.ui.core.css | 93 - .../smoothness/jquery.ui.datepicker.css | 175 - .../themes/smoothness/jquery.ui.dialog.css | 70 - .../themes/smoothness/jquery.ui.menu.css | 79 - .../smoothness/jquery.ui.progressbar.css | 28 - .../themes/smoothness/jquery.ui.resizable.css | 76 - .../smoothness/jquery.ui.selectable.css | 13 - .../themes/smoothness/jquery.ui.slider.css | 73 - .../themes/smoothness/jquery.ui.spinner.css | 65 - .../themes/smoothness/jquery.ui.tabs.css | 51 - .../themes/smoothness/jquery.ui.theme.css | 410 - .../themes/smoothness/jquery.ui.tooltip.css | 21 - .../minified/images/animated-overlay.gif | Bin 1738 -> 0 bytes .../images/ui-bg_flat_0_aaaaaa_40x100.png | Bin 212 -> 0 bytes .../images/ui-bg_flat_75_ffffff_40x100.png | Bin 208 -> 0 bytes .../images/ui-bg_glass_55_fbf9ee_1x400.png | Bin 335 -> 0 bytes .../images/ui-bg_glass_65_ffffff_1x400.png | Bin 207 -> 0 bytes .../images/ui-bg_glass_75_dadada_1x400.png | Bin 262 -> 0 bytes .../images/ui-bg_glass_75_e6e6e6_1x400.png | Bin 262 -> 0 bytes .../images/ui-bg_glass_95_fef1ec_1x400.png | Bin 332 -> 0 bytes .../ui-bg_highlight-soft_75_cccccc_1x100.png | Bin 280 -> 0 bytes .../images/ui-icons_222222_256x240.png | Bin 6922 -> 0 bytes .../images/ui-icons_2e83ff_256x240.png | Bin 4549 -> 0 bytes .../images/ui-icons_454545_256x240.png | Bin 6992 -> 0 bytes .../images/ui-icons_888888_256x240.png | Bin 6999 -> 0 bytes .../images/ui-icons_cd0a0a_256x240.png | Bin 4549 -> 0 bytes .../smoothness/minified/jquery-ui.min.css | 7 - .../minified/jquery.ui.accordion.min.css | 5 - .../minified/jquery.ui.autocomplete.min.css | 5 - .../minified/jquery.ui.button.min.css | 5 - .../minified/jquery.ui.core.min.css | 5 - .../minified/jquery.ui.datepicker.min.css | 5 - .../minified/jquery.ui.dialog.min.css | 5 - .../minified/jquery.ui.menu.min.css | 5 - .../minified/jquery.ui.progressbar.min.css | 5 - .../minified/jquery.ui.resizable.min.css | 5 - .../minified/jquery.ui.selectable.min.css | 5 - .../minified/jquery.ui.slider.min.css | 5 - .../minified/jquery.ui.spinner.min.css | 5 - .../minified/jquery.ui.tabs.min.css | 5 - .../minified/jquery.ui.theme.min.css | 5 - .../minified/jquery.ui.tooltip.min.css | 5 - .../ui.accordion.jquery.json | 67 - .../ui.autocomplete.jquery.json | 69 - .../development-bundle/ui.button.jquery.json | 66 - .../development-bundle/ui.core.jquery.json | 61 - .../ui.datepicker.jquery.json | 66 - .../development-bundle/ui.dialog.jquery.json | 70 - .../ui.draggable.jquery.json | 66 - .../ui.droppable.jquery.json | 67 - .../development-bundle/ui.menu.jquery.json | 66 - .../development-bundle/ui.mouse.jquery.json | 64 - .../ui.position.jquery.json | 66 - .../ui.progressbar.jquery.json | 65 - .../ui.resizable.jquery.json | 65 - .../ui.selectable.jquery.json | 65 - .../development-bundle/ui.slider.jquery.json | 67 - .../ui.sortable.jquery.json | 66 - .../development-bundle/ui.spinner.jquery.json | 68 - .../development-bundle/ui.tabs.jquery.json | 67 - .../development-bundle/ui.tooltip.jquery.json | 64 - .../development-bundle/ui.widget.jquery.json | 64 - .../ui/i18n/jquery-ui-i18n.js | 1645 -- .../ui/i18n/jquery.ui.datepicker-af.js | 23 - .../ui/i18n/jquery.ui.datepicker-ar-DZ.js | 23 - .../ui/i18n/jquery.ui.datepicker-ar.js | 23 - .../ui/i18n/jquery.ui.datepicker-az.js | 23 - .../ui/i18n/jquery.ui.datepicker-be.js | 23 - .../ui/i18n/jquery.ui.datepicker-bg.js | 24 - .../ui/i18n/jquery.ui.datepicker-bs.js | 23 - .../ui/i18n/jquery.ui.datepicker-ca.js | 23 - .../ui/i18n/jquery.ui.datepicker-cs.js | 23 - .../ui/i18n/jquery.ui.datepicker-cy-GB.js | 23 - .../ui/i18n/jquery.ui.datepicker-da.js | 23 - .../ui/i18n/jquery.ui.datepicker-de.js | 23 - .../ui/i18n/jquery.ui.datepicker-el.js | 23 - .../ui/i18n/jquery.ui.datepicker-en-AU.js | 23 - .../ui/i18n/jquery.ui.datepicker-en-GB.js | 23 - .../ui/i18n/jquery.ui.datepicker-en-NZ.js | 23 - .../ui/i18n/jquery.ui.datepicker-eo.js | 23 - .../ui/i18n/jquery.ui.datepicker-es.js | 23 - .../ui/i18n/jquery.ui.datepicker-et.js | 23 - .../ui/i18n/jquery.ui.datepicker-eu.js | 23 - .../ui/i18n/jquery.ui.datepicker-fa.js | 59 - .../ui/i18n/jquery.ui.datepicker-fi.js | 23 - .../ui/i18n/jquery.ui.datepicker-fo.js | 23 - .../ui/i18n/jquery.ui.datepicker-fr-CA.js | 23 - .../ui/i18n/jquery.ui.datepicker-fr-CH.js | 23 - .../ui/i18n/jquery.ui.datepicker-fr.js | 25 - .../ui/i18n/jquery.ui.datepicker-gl.js | 23 - .../ui/i18n/jquery.ui.datepicker-he.js | 23 - .../ui/i18n/jquery.ui.datepicker-hi.js | 23 - .../ui/i18n/jquery.ui.datepicker-hr.js | 23 - .../ui/i18n/jquery.ui.datepicker-hu.js | 23 - .../ui/i18n/jquery.ui.datepicker-hy.js | 23 - .../ui/i18n/jquery.ui.datepicker-id.js | 23 - .../ui/i18n/jquery.ui.datepicker-is.js | 23 - .../ui/i18n/jquery.ui.datepicker-it.js | 23 - .../ui/i18n/jquery.ui.datepicker-ja.js | 23 - .../ui/i18n/jquery.ui.datepicker-ka.js | 21 - .../ui/i18n/jquery.ui.datepicker-kk.js | 23 - .../ui/i18n/jquery.ui.datepicker-km.js | 23 - .../ui/i18n/jquery.ui.datepicker-ko.js | 23 - .../ui/i18n/jquery.ui.datepicker-ky.js | 24 - .../ui/i18n/jquery.ui.datepicker-lb.js | 23 - .../ui/i18n/jquery.ui.datepicker-lt.js | 23 - .../ui/i18n/jquery.ui.datepicker-lv.js | 23 - .../ui/i18n/jquery.ui.datepicker-mk.js | 23 - .../ui/i18n/jquery.ui.datepicker-ml.js | 23 - .../ui/i18n/jquery.ui.datepicker-ms.js | 23 - .../ui/i18n/jquery.ui.datepicker-nb.js | 22 - .../ui/i18n/jquery.ui.datepicker-nl-BE.js | 23 - .../ui/i18n/jquery.ui.datepicker-nl.js | 23 - .../ui/i18n/jquery.ui.datepicker-nn.js | 22 - .../ui/i18n/jquery.ui.datepicker-no.js | 23 - .../ui/i18n/jquery.ui.datepicker-pl.js | 23 - .../ui/i18n/jquery.ui.datepicker-pt-BR.js | 23 - .../ui/i18n/jquery.ui.datepicker-pt.js | 22 - .../ui/i18n/jquery.ui.datepicker-rm.js | 21 - .../ui/i18n/jquery.ui.datepicker-ro.js | 26 - .../ui/i18n/jquery.ui.datepicker-ru.js | 23 - .../ui/i18n/jquery.ui.datepicker-sk.js | 23 - .../ui/i18n/jquery.ui.datepicker-sl.js | 24 - .../ui/i18n/jquery.ui.datepicker-sq.js | 23 - .../ui/i18n/jquery.ui.datepicker-sr-SR.js | 23 - .../ui/i18n/jquery.ui.datepicker-sr.js | 23 - .../ui/i18n/jquery.ui.datepicker-sv.js | 23 - .../ui/i18n/jquery.ui.datepicker-ta.js | 23 - .../ui/i18n/jquery.ui.datepicker-th.js | 23 - .../ui/i18n/jquery.ui.datepicker-tj.js | 23 - .../ui/i18n/jquery.ui.datepicker-tr.js | 23 - .../ui/i18n/jquery.ui.datepicker-uk.js | 24 - .../ui/i18n/jquery.ui.datepicker-vi.js | 23 - .../ui/i18n/jquery.ui.datepicker-zh-CN.js | 23 - .../ui/i18n/jquery.ui.datepicker-zh-HK.js | 23 - .../ui/i18n/jquery.ui.datepicker-zh-TW.js | 23 - .../development-bundle/ui/jquery-ui.custom.js | 12752 ---------------- .../ui/jquery.ui.accordion.js | 570 - .../ui/jquery.ui.autocomplete.js | 606 - .../development-bundle/ui/jquery.ui.button.js | 395 - .../development-bundle/ui/jquery.ui.core.js | 320 - .../ui/jquery.ui.datepicker.js | 2038 --- .../development-bundle/ui/jquery.ui.dialog.js | 823 - .../ui/jquery.ui.draggable.js | 958 -- .../ui/jquery.ui.droppable.js | 389 - .../development-bundle/ui/jquery.ui.menu.js | 627 - .../development-bundle/ui/jquery.ui.mouse.js | 169 - .../ui/jquery.ui.position.js | 501 - .../ui/jquery.ui.progressbar.js | 145 - .../ui/jquery.ui.resizable.js | 978 -- .../ui/jquery.ui.selectable.js | 277 - .../development-bundle/ui/jquery.ui.slider.js | 676 - .../ui/jquery.ui.sortable.js | 1289 -- .../ui/jquery.ui.spinner.js | 497 - .../development-bundle/ui/jquery.ui.tabs.js | 849 - .../ui/jquery.ui.tooltip.js | 402 - .../development-bundle/ui/jquery.ui.widget.js | 521 - .../ui/minified/i18n/jquery-ui-i18n.min.js | 7 - .../i18n/jquery.ui.datepicker-af.min.js | 5 - .../i18n/jquery.ui.datepicker-ar-DZ.min.js | 5 - .../i18n/jquery.ui.datepicker-ar.min.js | 5 - .../i18n/jquery.ui.datepicker-az.min.js | 5 - .../i18n/jquery.ui.datepicker-be.min.js | 5 - .../i18n/jquery.ui.datepicker-bg.min.js | 5 - .../i18n/jquery.ui.datepicker-bs.min.js | 5 - .../i18n/jquery.ui.datepicker-ca.min.js | 5 - .../i18n/jquery.ui.datepicker-cs.min.js | 5 - .../i18n/jquery.ui.datepicker-cy-GB.min.js | 5 - .../i18n/jquery.ui.datepicker-da.min.js | 5 - .../i18n/jquery.ui.datepicker-de.min.js | 5 - .../i18n/jquery.ui.datepicker-el.min.js | 5 - .../i18n/jquery.ui.datepicker-en-AU.min.js | 5 - .../i18n/jquery.ui.datepicker-en-GB.min.js | 5 - .../i18n/jquery.ui.datepicker-en-NZ.min.js | 5 - .../i18n/jquery.ui.datepicker-eo.min.js | 5 - .../i18n/jquery.ui.datepicker-es.min.js | 5 - .../i18n/jquery.ui.datepicker-et.min.js | 5 - .../i18n/jquery.ui.datepicker-eu.min.js | 5 - .../i18n/jquery.ui.datepicker-fa.min.js | 5 - .../i18n/jquery.ui.datepicker-fi.min.js | 5 - .../i18n/jquery.ui.datepicker-fo.min.js | 5 - .../i18n/jquery.ui.datepicker-fr-CA.min.js | 5 - .../i18n/jquery.ui.datepicker-fr-CH.min.js | 5 - .../i18n/jquery.ui.datepicker-fr.min.js | 5 - .../i18n/jquery.ui.datepicker-gl.min.js | 5 - .../i18n/jquery.ui.datepicker-he.min.js | 5 - .../i18n/jquery.ui.datepicker-hi.min.js | 5 - .../i18n/jquery.ui.datepicker-hr.min.js | 5 - .../i18n/jquery.ui.datepicker-hu.min.js | 5 - .../i18n/jquery.ui.datepicker-hy.min.js | 5 - .../i18n/jquery.ui.datepicker-id.min.js | 5 - .../i18n/jquery.ui.datepicker-is.min.js | 5 - .../i18n/jquery.ui.datepicker-it.min.js | 5 - .../i18n/jquery.ui.datepicker-ja.min.js | 5 - .../i18n/jquery.ui.datepicker-ka.min.js | 5 - .../i18n/jquery.ui.datepicker-kk.min.js | 5 - .../i18n/jquery.ui.datepicker-km.min.js | 5 - .../i18n/jquery.ui.datepicker-ko.min.js | 5 - .../i18n/jquery.ui.datepicker-ky.min.js | 5 - .../i18n/jquery.ui.datepicker-lb.min.js | 5 - .../i18n/jquery.ui.datepicker-lt.min.js | 5 - .../i18n/jquery.ui.datepicker-lv.min.js | 5 - .../i18n/jquery.ui.datepicker-mk.min.js | 5 - .../i18n/jquery.ui.datepicker-ml.min.js | 5 - .../i18n/jquery.ui.datepicker-ms.min.js | 5 - .../i18n/jquery.ui.datepicker-nb.min.js | 5 - .../i18n/jquery.ui.datepicker-nl-BE.min.js | 5 - .../i18n/jquery.ui.datepicker-nl.min.js | 5 - .../i18n/jquery.ui.datepicker-nn.min.js | 5 - .../i18n/jquery.ui.datepicker-no.min.js | 5 - .../i18n/jquery.ui.datepicker-pl.min.js | 5 - .../i18n/jquery.ui.datepicker-pt-BR.min.js | 5 - .../i18n/jquery.ui.datepicker-pt.min.js | 5 - .../i18n/jquery.ui.datepicker-rm.min.js | 5 - .../i18n/jquery.ui.datepicker-ro.min.js | 5 - .../i18n/jquery.ui.datepicker-ru.min.js | 5 - .../i18n/jquery.ui.datepicker-sk.min.js | 5 - .../i18n/jquery.ui.datepicker-sl.min.js | 5 - .../i18n/jquery.ui.datepicker-sq.min.js | 5 - .../i18n/jquery.ui.datepicker-sr-SR.min.js | 5 - .../i18n/jquery.ui.datepicker-sr.min.js | 5 - .../i18n/jquery.ui.datepicker-sv.min.js | 5 - .../i18n/jquery.ui.datepicker-ta.min.js | 5 - .../i18n/jquery.ui.datepicker-th.min.js | 5 - .../i18n/jquery.ui.datepicker-tj.min.js | 5 - .../i18n/jquery.ui.datepicker-tr.min.js | 5 - .../i18n/jquery.ui.datepicker-uk.min.js | 5 - .../i18n/jquery.ui.datepicker-vi.min.js | 5 - .../i18n/jquery.ui.datepicker-zh-CN.min.js | 5 - .../i18n/jquery.ui.datepicker-zh-HK.min.js | 5 - .../i18n/jquery.ui.datepicker-zh-TW.min.js | 5 - .../ui/minified/jquery-ui.custom.min.js | 7 - .../ui/minified/jquery.ui.accordion.min.js | 5 - .../ui/minified/jquery.ui.autocomplete.min.js | 5 - .../ui/minified/jquery.ui.button.min.js | 5 - .../ui/minified/jquery.ui.core.min.js | 5 - .../ui/minified/jquery.ui.datepicker.min.js | 6 - .../ui/minified/jquery.ui.dialog.min.js | 5 - .../ui/minified/jquery.ui.draggable.min.js | 5 - .../ui/minified/jquery.ui.droppable.min.js | 5 - .../ui/minified/jquery.ui.menu.min.js | 5 - .../ui/minified/jquery.ui.mouse.min.js | 5 - .../ui/minified/jquery.ui.position.min.js | 5 - .../ui/minified/jquery.ui.progressbar.min.js | 5 - .../ui/minified/jquery.ui.resizable.min.js | 5 - .../ui/minified/jquery.ui.selectable.min.js | 5 - .../ui/minified/jquery.ui.slider.min.js | 5 - .../ui/minified/jquery.ui.sortable.min.js | 5 - .../ui/minified/jquery.ui.spinner.min.js | 5 - .../ui/minified/jquery.ui.tabs.min.js | 5 - .../ui/minified/jquery.ui.tooltip.min.js | 5 - .../ui/minified/jquery.ui.widget.min.js | 5 - .../js/jquery-ui-1.10.4.custom/index.html | 450 - system/templates/js/jquery-ui-new/index.html | 367 - system/templates/js/livevalidation.js | 940 -- system/templates/js/slideout-1.0.1/.gitignore | 4 - system/templates/js/slideout-1.0.1/.jshintrc | 22 - .../templates/js/slideout-1.0.1/.travis.yml | 5 - .../js/slideout-1.0.1/CONTRIBUTING.md | 29 - system/templates/js/slideout-1.0.1/README.md | 477 - system/templates/js/slideout-1.0.1/bower.json | 35 - .../templates/js/slideout-1.0.1/browserify.js | 14 - .../js/slideout-1.0.1/component.json | 23 - .../templates/js/slideout-1.0.1/package.json | 51 - .../js/slideout-1.0.1/test/assets/menu.png | Bin 296 -> 0 bytes .../js/slideout-1.0.1/test/index.html | 108 - .../js/slideout-1.0.1/test/index.right.html | 106 - .../templates/js/slideout-1.0.1/test/test.css | 206 - .../templates/js/slideout-1.0.1/test/test.js | 198 - system/templates/layout-foundation.tpl.php | 5 - 707 files changed, 128445 deletions(-) delete mode 100755 system/templates/js/boxover.js delete mode 100644 system/templates/js/chart-js/.codeclimate.yml delete mode 100644 system/templates/js/chart-js/.editorconfig delete mode 100644 system/templates/js/chart-js/.eslintignore delete mode 100644 system/templates/js/chart-js/.eslintrc delete mode 100644 system/templates/js/chart-js/.github/ISSUE_TEMPLATE.md delete mode 100644 system/templates/js/chart-js/.github/PULL_REQUEST_TEMPLATE.md delete mode 100644 system/templates/js/chart-js/.gitignore delete mode 100644 system/templates/js/chart-js/.npmignore delete mode 100644 system/templates/js/chart-js/.travis.yml delete mode 100644 system/templates/js/chart-js/CONTRIBUTING.md delete mode 100644 system/templates/js/chart-js/MAINTAINING.md delete mode 100644 system/templates/js/chart-js/bower.json delete mode 100755 system/templates/js/chart-js/component.json delete mode 100644 system/templates/js/chart-js/composer.json delete mode 100644 system/templates/js/chart-js/config.jshintrc delete mode 100644 system/templates/js/chart-js/docs/00-Getting-Started.md delete mode 100644 system/templates/js/chart-js/docs/01-Chart-Configuration.md delete mode 100644 system/templates/js/chart-js/docs/02-Scales.md delete mode 100644 system/templates/js/chart-js/docs/03-Line-Chart.md delete mode 100644 system/templates/js/chart-js/docs/04-Bar-Chart.md delete mode 100644 system/templates/js/chart-js/docs/05-Radar-Chart.md delete mode 100644 system/templates/js/chart-js/docs/06-Polar-Area-Chart.md delete mode 100644 system/templates/js/chart-js/docs/07-Pie-Doughnut-Chart.md delete mode 100644 system/templates/js/chart-js/docs/08-Bubble-Chart.md delete mode 100644 system/templates/js/chart-js/docs/09-Advanced.md delete mode 100644 system/templates/js/chart-js/docs/10-Notes.md delete mode 100755 system/templates/js/chart-js/docs/Chart.js delete mode 100755 system/templates/js/chart-js/docs/index.html delete mode 100755 system/templates/js/chart-js/docs/prettify.css delete mode 100755 system/templates/js/chart-js/docs/prettify.js delete mode 100755 system/templates/js/chart-js/docs/prettify.less delete mode 100755 system/templates/js/chart-js/docs/styles.css delete mode 100755 system/templates/js/chart-js/docs/styles.less delete mode 100644 system/templates/js/chart-js/gulpfile.js delete mode 100644 system/templates/js/chart-js/karma.conf.ci.js delete mode 100644 system/templates/js/chart-js/karma.conf.js delete mode 100644 system/templates/js/chart-js/karma.coverage.conf.js delete mode 100644 system/templates/js/chart-js/package.json delete mode 100755 system/templates/js/chart-js/readme.md delete mode 100644 system/templates/js/chart-js/samples/animation/progress-bar.html delete mode 100755 system/templates/js/chart-js/samples/bar.html delete mode 100644 system/templates/js/chart-js/samples/bar/bar-horizontal.html delete mode 100644 system/templates/js/chart-js/samples/bar/bar-multi-axis.html delete mode 100644 system/templates/js/chart-js/samples/bar/bar-stacked-group.html delete mode 100644 system/templates/js/chart-js/samples/bar/bar-stacked.html delete mode 100644 system/templates/js/chart-js/samples/bar/bar.html delete mode 100644 system/templates/js/chart-js/samples/bubble.html delete mode 100644 system/templates/js/chart-js/samples/combo-bar-line.html delete mode 100644 system/templates/js/chart-js/samples/data_labelling.html delete mode 100644 system/templates/js/chart-js/samples/doughnut.html delete mode 100644 system/templates/js/chart-js/samples/legend/pointstyle.html delete mode 100644 system/templates/js/chart-js/samples/legend/positions.html delete mode 100755 system/templates/js/chart-js/samples/line.html delete mode 100644 system/templates/js/chart-js/samples/line/different-point-sizes.html delete mode 100644 system/templates/js/chart-js/samples/line/interpolation-modes.html delete mode 100644 system/templates/js/chart-js/samples/line/line-multi-axis.html delete mode 100644 system/templates/js/chart-js/samples/line/line-skip-points.html delete mode 100644 system/templates/js/chart-js/samples/line/line-stacked-area.html delete mode 100644 system/templates/js/chart-js/samples/line/line-stepped.html delete mode 100644 system/templates/js/chart-js/samples/line/line-styles.html delete mode 100644 system/templates/js/chart-js/samples/line/line.html delete mode 100644 system/templates/js/chart-js/samples/line/point-styles.html delete mode 100644 system/templates/js/chart-js/samples/pie.html delete mode 100644 system/templates/js/chart-js/samples/polar-area.html delete mode 100755 system/templates/js/chart-js/samples/polarArea.html delete mode 100755 system/templates/js/chart-js/samples/radar.html delete mode 100644 system/templates/js/chart-js/samples/radar/radar-skip-points.html delete mode 100644 system/templates/js/chart-js/samples/radar/radar.html delete mode 100644 system/templates/js/chart-js/samples/scales/display-settings.html delete mode 100644 system/templates/js/chart-js/samples/scales/filtering-labels.html delete mode 100644 system/templates/js/chart-js/samples/scales/gridlines.html delete mode 100644 system/templates/js/chart-js/samples/scales/line-non-numeric-y.html delete mode 100644 system/templates/js/chart-js/samples/scales/linear/min-max-settings.html delete mode 100644 system/templates/js/chart-js/samples/scales/linear/step-size.html delete mode 100644 system/templates/js/chart-js/samples/scales/linear/suggested-min-max-settings.html delete mode 100644 system/templates/js/chart-js/samples/scales/logarithmic/line-logarithmic.html delete mode 100644 system/templates/js/chart-js/samples/scales/logarithmic/scatter-logX.html delete mode 100644 system/templates/js/chart-js/samples/scales/multiline-labels.html delete mode 100644 system/templates/js/chart-js/samples/scales/time/combo-time-scale.html delete mode 100644 system/templates/js/chart-js/samples/scales/time/line-time-point-data.html delete mode 100644 system/templates/js/chart-js/samples/scales/time/line-time-scale.html delete mode 100644 system/templates/js/chart-js/samples/scatter/scatter-multi-axis.html delete mode 100644 system/templates/js/chart-js/samples/scatter/scatter.html delete mode 100755 system/templates/js/chart-js/samples/sixup.html delete mode 100644 system/templates/js/chart-js/samples/tooltips/dataPoints-customTooltips.html delete mode 100644 system/templates/js/chart-js/samples/tooltips/interaction-modes.html delete mode 100644 system/templates/js/chart-js/samples/tooltips/line-customTooltips.html delete mode 100644 system/templates/js/chart-js/samples/tooltips/pie-customTooltips.html delete mode 100644 system/templates/js/chart-js/samples/tooltips/position-modes.html delete mode 100644 system/templates/js/chart-js/samples/tooltips/tooltip-callbacks.html delete mode 100644 system/templates/js/chart-js/samples/utils.js delete mode 100755 system/templates/js/chart-js/scripts/release.sh delete mode 100755 system/templates/js/chart-js/site/assets/6charts.png delete mode 100755 system/templates/js/chart-js/site/assets/Chart.js delete mode 100755 system/templates/js/chart-js/site/assets/effects.js delete mode 100755 system/templates/js/chart-js/site/assets/excanvas.js delete mode 100755 system/templates/js/chart-js/site/assets/html.png delete mode 100755 system/templates/js/chart-js/site/assets/simple.png delete mode 100755 system/templates/js/chart-js/site/index.html delete mode 100755 system/templates/js/chart-js/site/styles.css delete mode 100644 system/templates/js/chart-js/src/chart.js delete mode 100644 system/templates/js/chart-js/src/charts/Chart.Bar.js delete mode 100644 system/templates/js/chart-js/src/charts/Chart.Bubble.js delete mode 100644 system/templates/js/chart-js/src/charts/Chart.Doughnut.js delete mode 100644 system/templates/js/chart-js/src/charts/Chart.Line.js delete mode 100644 system/templates/js/chart-js/src/charts/Chart.PolarArea.js delete mode 100644 system/templates/js/chart-js/src/charts/Chart.Radar.js delete mode 100644 system/templates/js/chart-js/src/charts/Chart.Scatter.js delete mode 100644 system/templates/js/chart-js/src/controllers/controller.bar.js delete mode 100644 system/templates/js/chart-js/src/controllers/controller.bubble.js delete mode 100644 system/templates/js/chart-js/src/controllers/controller.doughnut.js delete mode 100644 system/templates/js/chart-js/src/controllers/controller.line.js delete mode 100644 system/templates/js/chart-js/src/controllers/controller.polarArea.js delete mode 100644 system/templates/js/chart-js/src/controllers/controller.radar.js delete mode 100644 system/templates/js/chart-js/src/core/core.animation.js delete mode 100644 system/templates/js/chart-js/src/core/core.canvasHelpers.js delete mode 100644 system/templates/js/chart-js/src/core/core.controller.js delete mode 100644 system/templates/js/chart-js/src/core/core.datasetController.js delete mode 100644 system/templates/js/chart-js/src/core/core.element.js delete mode 100644 system/templates/js/chart-js/src/core/core.helpers.js delete mode 100644 system/templates/js/chart-js/src/core/core.interaction.js delete mode 100755 system/templates/js/chart-js/src/core/core.js delete mode 100644 system/templates/js/chart-js/src/core/core.layoutService.js delete mode 100644 system/templates/js/chart-js/src/core/core.legend.js delete mode 100644 system/templates/js/chart-js/src/core/core.plugin.js delete mode 100644 system/templates/js/chart-js/src/core/core.scale.js delete mode 100644 system/templates/js/chart-js/src/core/core.scaleService.js delete mode 100644 system/templates/js/chart-js/src/core/core.ticks.js delete mode 100644 system/templates/js/chart-js/src/core/core.title.js delete mode 100755 system/templates/js/chart-js/src/core/core.tooltip.js delete mode 100644 system/templates/js/chart-js/src/elements/element.arc.js delete mode 100644 system/templates/js/chart-js/src/elements/element.line.js delete mode 100644 system/templates/js/chart-js/src/elements/element.point.js delete mode 100644 system/templates/js/chart-js/src/elements/element.rectangle.js delete mode 100644 system/templates/js/chart-js/src/platforms/platform.dom.js delete mode 100644 system/templates/js/chart-js/src/platforms/platform.js delete mode 100644 system/templates/js/chart-js/src/scales/scale.category.js delete mode 100644 system/templates/js/chart-js/src/scales/scale.linear.js delete mode 100644 system/templates/js/chart-js/src/scales/scale.linearbase.js delete mode 100644 system/templates/js/chart-js/src/scales/scale.logarithmic.js delete mode 100644 system/templates/js/chart-js/src/scales/scale.radialLinear.js delete mode 100755 system/templates/js/chart-js/src/scales/scale.time.js delete mode 100644 system/templates/js/chart-js/test/controller.bar.tests.js delete mode 100644 system/templates/js/chart-js/test/controller.bubble.tests.js delete mode 100644 system/templates/js/chart-js/test/controller.doughnut.tests.js delete mode 100644 system/templates/js/chart-js/test/controller.line.tests.js delete mode 100644 system/templates/js/chart-js/test/controller.polarArea.tests.js delete mode 100644 system/templates/js/chart-js/test/controller.radar.tests.js delete mode 100644 system/templates/js/chart-js/test/core.controller.tests.js delete mode 100644 system/templates/js/chart-js/test/core.datasetController.tests.js delete mode 100644 system/templates/js/chart-js/test/core.element.tests.js delete mode 100644 system/templates/js/chart-js/test/core.helpers.tests.js delete mode 100644 system/templates/js/chart-js/test/core.interaction.tests.js delete mode 100644 system/templates/js/chart-js/test/core.layoutService.tests.js delete mode 100644 system/templates/js/chart-js/test/core.legend.tests.js delete mode 100644 system/templates/js/chart-js/test/core.plugin.tests.js delete mode 100644 system/templates/js/chart-js/test/core.scaleService.tests.js delete mode 100644 system/templates/js/chart-js/test/core.title.tests.js delete mode 100755 system/templates/js/chart-js/test/core.tooltip.tests.js delete mode 100644 system/templates/js/chart-js/test/defaultConfig.tests.js delete mode 100644 system/templates/js/chart-js/test/element.arc.tests.js delete mode 100644 system/templates/js/chart-js/test/element.line.tests.js delete mode 100644 system/templates/js/chart-js/test/element.point.tests.js delete mode 100644 system/templates/js/chart-js/test/element.rectangle.tests.js delete mode 100644 system/templates/js/chart-js/test/mockContext.js delete mode 100644 system/templates/js/chart-js/test/platform.dom.tests.js delete mode 100644 system/templates/js/chart-js/test/scale.category.tests.js delete mode 100644 system/templates/js/chart-js/test/scale.linear.tests.js delete mode 100644 system/templates/js/chart-js/test/scale.logarithmic.tests.js delete mode 100644 system/templates/js/chart-js/test/scale.radialLinear.tests.js delete mode 100755 system/templates/js/chart-js/test/scale.time.tests.js delete mode 100644 system/templates/js/chart-js/thankyou.md delete mode 100755 system/templates/js/codemirror-4.4/.gitattributes delete mode 100755 system/templates/js/codemirror-4.4/.travis.yml delete mode 100755 system/templates/js/codemirror-4.4/AUTHORS delete mode 100755 system/templates/js/codemirror-4.4/CONTRIBUTING.md delete mode 100755 system/templates/js/codemirror-4.4/README.md delete mode 100755 system/templates/js/codemirror-4.4/bin/authors.sh delete mode 100755 system/templates/js/codemirror-4.4/bin/compress delete mode 100755 system/templates/js/codemirror-4.4/bin/lint delete mode 100755 system/templates/js/codemirror-4.4/bin/release delete mode 100755 system/templates/js/codemirror-4.4/bin/source-highlight delete mode 100755 system/templates/js/codemirror-4.4/bower.json delete mode 100755 system/templates/js/codemirror-4.4/demo/activeline.html delete mode 100755 system/templates/js/codemirror-4.4/demo/anywordhint.html delete mode 100755 system/templates/js/codemirror-4.4/demo/bidi.html delete mode 100755 system/templates/js/codemirror-4.4/demo/btree.html delete mode 100755 system/templates/js/codemirror-4.4/demo/buffers.html delete mode 100755 system/templates/js/codemirror-4.4/demo/changemode.html delete mode 100755 system/templates/js/codemirror-4.4/demo/closebrackets.html delete mode 100755 system/templates/js/codemirror-4.4/demo/closetag.html delete mode 100755 system/templates/js/codemirror-4.4/demo/complete.html delete mode 100755 system/templates/js/codemirror-4.4/demo/emacs.html delete mode 100755 system/templates/js/codemirror-4.4/demo/folding.html delete mode 100755 system/templates/js/codemirror-4.4/demo/fullscreen.html delete mode 100755 system/templates/js/codemirror-4.4/demo/hardwrap.html delete mode 100755 system/templates/js/codemirror-4.4/demo/html5complete.html delete mode 100755 system/templates/js/codemirror-4.4/demo/indentwrap.html delete mode 100755 system/templates/js/codemirror-4.4/demo/lint.html delete mode 100755 system/templates/js/codemirror-4.4/demo/loadmode.html delete mode 100755 system/templates/js/codemirror-4.4/demo/marker.html delete mode 100755 system/templates/js/codemirror-4.4/demo/markselection.html delete mode 100755 system/templates/js/codemirror-4.4/demo/matchhighlighter.html delete mode 100755 system/templates/js/codemirror-4.4/demo/matchtags.html delete mode 100755 system/templates/js/codemirror-4.4/demo/merge.html delete mode 100755 system/templates/js/codemirror-4.4/demo/multiplex.html delete mode 100755 system/templates/js/codemirror-4.4/demo/mustache.html delete mode 100755 system/templates/js/codemirror-4.4/demo/placeholder.html delete mode 100755 system/templates/js/codemirror-4.4/demo/preview.html delete mode 100755 system/templates/js/codemirror-4.4/demo/resize.html delete mode 100755 system/templates/js/codemirror-4.4/demo/rulers.html delete mode 100755 system/templates/js/codemirror-4.4/demo/runmode.html delete mode 100755 system/templates/js/codemirror-4.4/demo/search.html delete mode 100755 system/templates/js/codemirror-4.4/demo/spanaffectswrapping_shim.html delete mode 100755 system/templates/js/codemirror-4.4/demo/sublime.html delete mode 100755 system/templates/js/codemirror-4.4/demo/tern.html delete mode 100755 system/templates/js/codemirror-4.4/demo/theme.html delete mode 100755 system/templates/js/codemirror-4.4/demo/trailingspace.html delete mode 100755 system/templates/js/codemirror-4.4/demo/variableheight.html delete mode 100755 system/templates/js/codemirror-4.4/demo/vim.html delete mode 100755 system/templates/js/codemirror-4.4/demo/visibletabs.html delete mode 100755 system/templates/js/codemirror-4.4/demo/widget.html delete mode 100755 system/templates/js/codemirror-4.4/demo/xmlcomplete.html delete mode 100755 system/templates/js/codemirror-4.4/doc/activebookmark.js delete mode 100755 system/templates/js/codemirror-4.4/doc/compress.html delete mode 100755 system/templates/js/codemirror-4.4/doc/docs.css delete mode 100755 system/templates/js/codemirror-4.4/doc/internals.html delete mode 100755 system/templates/js/codemirror-4.4/doc/logo.png delete mode 100755 system/templates/js/codemirror-4.4/doc/logo.svg delete mode 100755 system/templates/js/codemirror-4.4/doc/manual.html delete mode 100755 system/templates/js/codemirror-4.4/doc/realworld.html delete mode 100755 system/templates/js/codemirror-4.4/doc/releases.html delete mode 100755 system/templates/js/codemirror-4.4/doc/reporting.html delete mode 100755 system/templates/js/codemirror-4.4/doc/upgrade_v2.2.html delete mode 100755 system/templates/js/codemirror-4.4/doc/upgrade_v3.html delete mode 100755 system/templates/js/codemirror-4.4/doc/upgrade_v4.html delete mode 100755 system/templates/js/codemirror-4.4/index.html delete mode 100755 system/templates/js/codemirror-4.4/package.json delete mode 100755 system/templates/js/codemirror-4.4/test/comment_test.js delete mode 100755 system/templates/js/codemirror-4.4/test/doc_test.js delete mode 100755 system/templates/js/codemirror-4.4/test/driver.js delete mode 100755 system/templates/js/codemirror-4.4/test/emacs_test.js delete mode 100755 system/templates/js/codemirror-4.4/test/index.html delete mode 100755 system/templates/js/codemirror-4.4/test/lint/acorn.js delete mode 100755 system/templates/js/codemirror-4.4/test/lint/lint.js delete mode 100755 system/templates/js/codemirror-4.4/test/lint/walk.js delete mode 100755 system/templates/js/codemirror-4.4/test/mode_test.css delete mode 100755 system/templates/js/codemirror-4.4/test/mode_test.js delete mode 100755 system/templates/js/codemirror-4.4/test/multi_test.js delete mode 100755 system/templates/js/codemirror-4.4/test/phantom_driver.js delete mode 100755 system/templates/js/codemirror-4.4/test/run.js delete mode 100755 system/templates/js/codemirror-4.4/test/search_test.js delete mode 100755 system/templates/js/codemirror-4.4/test/sublime_test.js delete mode 100755 system/templates/js/codemirror-4.4/test/test.js delete mode 100755 system/templates/js/codemirror-4.4/test/vim_test.js delete mode 100755 system/templates/js/colorbox/README delete mode 100755 system/templates/js/colorbox/colorbox-old/jquery.colorbox-min.js delete mode 100755 system/templates/js/colorbox/colorbox-old/jquery.colorbox.js delete mode 100755 system/templates/js/colorbox/colorbox/README.md delete mode 100755 system/templates/js/colorbox/colorbox/bower.json delete mode 100755 system/templates/js/colorbox/colorbox/colorbox.ai delete mode 100755 system/templates/js/colorbox/colorbox/colorbox.css delete mode 100755 system/templates/js/colorbox/colorbox/colorbox.jquery.json delete mode 100755 system/templates/js/colorbox/colorbox/content/ajax.html delete mode 100755 system/templates/js/colorbox/colorbox/content/daisy.jpg delete mode 100755 system/templates/js/colorbox/colorbox/content/daisy@2x.jpg delete mode 100755 system/templates/js/colorbox/colorbox/content/homer.jpg delete mode 100755 system/templates/js/colorbox/colorbox/content/marylou.jpg delete mode 100755 system/templates/js/colorbox/colorbox/content/ohoopee1.jpg delete mode 100755 system/templates/js/colorbox/colorbox/content/ohoopee2.jpg delete mode 100755 system/templates/js/colorbox/colorbox/content/ohoopee3.jpg delete mode 100755 system/templates/js/colorbox/colorbox/example1/colorbox.css delete mode 100755 system/templates/js/colorbox/colorbox/example1/images/border.png delete mode 100755 system/templates/js/colorbox/colorbox/example1/images/controls.png delete mode 100755 system/templates/js/colorbox/colorbox/example1/images/loading.gif delete mode 100755 system/templates/js/colorbox/colorbox/example1/images/loading_background.png delete mode 100755 system/templates/js/colorbox/colorbox/example1/images/overlay.png delete mode 100755 system/templates/js/colorbox/colorbox/example1/index.html delete mode 100755 system/templates/js/colorbox/colorbox/example2/colorbox.css delete mode 100755 system/templates/js/colorbox/colorbox/example2/images/controls.png delete mode 100755 system/templates/js/colorbox/colorbox/example2/images/loading.gif delete mode 100755 system/templates/js/colorbox/colorbox/example2/index.html delete mode 100755 system/templates/js/colorbox/colorbox/example3/colorbox.css delete mode 100755 system/templates/js/colorbox/colorbox/example3/images/controls.png delete mode 100755 system/templates/js/colorbox/colorbox/example3/images/loading.gif delete mode 100755 system/templates/js/colorbox/colorbox/example3/index.html delete mode 100755 system/templates/js/colorbox/colorbox/example4/colorbox.css delete mode 100755 system/templates/js/colorbox/colorbox/example4/images/border1.png delete mode 100755 system/templates/js/colorbox/colorbox/example4/images/border2.png delete mode 100755 system/templates/js/colorbox/colorbox/example4/images/loading.gif delete mode 100755 system/templates/js/colorbox/colorbox/example4/index.html delete mode 100755 system/templates/js/colorbox/colorbox/example5/colorbox.css delete mode 100755 system/templates/js/colorbox/colorbox/example5/images/border.png delete mode 100755 system/templates/js/colorbox/colorbox/example5/images/controls.png delete mode 100755 system/templates/js/colorbox/colorbox/example5/images/loading.gif delete mode 100755 system/templates/js/colorbox/colorbox/example5/images/loading_background.png delete mode 100755 system/templates/js/colorbox/colorbox/example5/index.html delete mode 100755 system/templates/js/colorbox/colorbox/i18n/jquery.colorbox-ar.js delete mode 100755 system/templates/js/colorbox/colorbox/i18n/jquery.colorbox-bg.js delete mode 100755 system/templates/js/colorbox/colorbox/i18n/jquery.colorbox-ca.js delete mode 100755 system/templates/js/colorbox/colorbox/i18n/jquery.colorbox-cs.js delete mode 100755 system/templates/js/colorbox/colorbox/i18n/jquery.colorbox-da.js delete mode 100755 system/templates/js/colorbox/colorbox/i18n/jquery.colorbox-de.js delete mode 100755 system/templates/js/colorbox/colorbox/i18n/jquery.colorbox-es.js delete mode 100755 system/templates/js/colorbox/colorbox/i18n/jquery.colorbox-et.js delete mode 100755 system/templates/js/colorbox/colorbox/i18n/jquery.colorbox-fa.js delete mode 100755 system/templates/js/colorbox/colorbox/i18n/jquery.colorbox-fi.js delete mode 100755 system/templates/js/colorbox/colorbox/i18n/jquery.colorbox-fr.js delete mode 100755 system/templates/js/colorbox/colorbox/i18n/jquery.colorbox-gl.js delete mode 100755 system/templates/js/colorbox/colorbox/i18n/jquery.colorbox-he.js delete mode 100755 system/templates/js/colorbox/colorbox/i18n/jquery.colorbox-hr.js delete mode 100755 system/templates/js/colorbox/colorbox/i18n/jquery.colorbox-hu.js delete mode 100755 system/templates/js/colorbox/colorbox/i18n/jquery.colorbox-id.js delete mode 100755 system/templates/js/colorbox/colorbox/i18n/jquery.colorbox-it.js delete mode 100755 system/templates/js/colorbox/colorbox/i18n/jquery.colorbox-ja.js delete mode 100755 system/templates/js/colorbox/colorbox/i18n/jquery.colorbox-kr.js delete mode 100755 system/templates/js/colorbox/colorbox/i18n/jquery.colorbox-lv.js delete mode 100755 system/templates/js/colorbox/colorbox/i18n/jquery.colorbox-nl.js delete mode 100755 system/templates/js/colorbox/colorbox/i18n/jquery.colorbox-no.js delete mode 100755 system/templates/js/colorbox/colorbox/i18n/jquery.colorbox-pl.js delete mode 100755 system/templates/js/colorbox/colorbox/i18n/jquery.colorbox-pt-br.js delete mode 100755 system/templates/js/colorbox/colorbox/i18n/jquery.colorbox-ro.js delete mode 100755 system/templates/js/colorbox/colorbox/i18n/jquery.colorbox-ru.js delete mode 100755 system/templates/js/colorbox/colorbox/i18n/jquery.colorbox-si.js delete mode 100755 system/templates/js/colorbox/colorbox/i18n/jquery.colorbox-sk.js delete mode 100755 system/templates/js/colorbox/colorbox/i18n/jquery.colorbox-sr.js delete mode 100755 system/templates/js/colorbox/colorbox/i18n/jquery.colorbox-sv.js delete mode 100755 system/templates/js/colorbox/colorbox/i18n/jquery.colorbox-tr.js delete mode 100755 system/templates/js/colorbox/colorbox/i18n/jquery.colorbox-uk.js delete mode 100755 system/templates/js/colorbox/colorbox/i18n/jquery.colorbox-zh-CN.js delete mode 100755 system/templates/js/colorbox/colorbox/i18n/jquery.colorbox-zh-TW.js delete mode 100755 system/templates/js/colorbox/colorbox/images/border.png delete mode 100755 system/templates/js/colorbox/colorbox/images/controls.png delete mode 100755 system/templates/js/colorbox/colorbox/images/loading.gif delete mode 100755 system/templates/js/colorbox/colorbox/images/loading_background.png delete mode 100755 system/templates/js/colorbox/colorbox/images/overlay.png delete mode 100755 system/templates/js/colorbox/colorbox/jquery.colorbox-min.js delete mode 100755 system/templates/js/colorbox/colorbox/jquery.colorbox.js delete mode 100755 system/templates/js/date.js delete mode 100644 system/templates/js/es6-promise.auto.js delete mode 100755 system/templates/js/jquery-ui-1.10.4.custom/development-bundle/AUTHORS.txt delete mode 100755 system/templates/js/jquery-ui-1.10.4.custom/development-bundle/Gruntfile.js delete mode 100755 system/templates/js/jquery-ui-1.10.4.custom/development-bundle/MIT-LICENSE.txt delete mode 100755 system/templates/js/jquery-ui-1.10.4.custom/development-bundle/README.md delete mode 100755 system/templates/js/jquery-ui-1.10.4.custom/development-bundle/external/globalize.culture.de-DE.js delete mode 100755 system/templates/js/jquery-ui-1.10.4.custom/development-bundle/external/globalize.culture.ja-JP.js delete mode 100755 system/templates/js/jquery-ui-1.10.4.custom/development-bundle/external/globalize.js delete mode 100755 system/templates/js/jquery-ui-1.10.4.custom/development-bundle/external/jquery.mousewheel.js delete mode 100755 system/templates/js/jquery-ui-1.10.4.custom/development-bundle/external/jshint.js delete mode 100755 system/templates/js/jquery-ui-1.10.4.custom/development-bundle/external/qunit.css delete mode 100755 system/templates/js/jquery-ui-1.10.4.custom/development-bundle/external/qunit.js delete mode 100755 system/templates/js/jquery-ui-1.10.4.custom/development-bundle/jquery-1.10.2.js delete mode 100644 system/templates/js/jquery-ui-1.10.4.custom/development-bundle/package.json delete mode 100755 system/templates/js/jquery-ui-1.10.4.custom/development-bundle/themes/base/images/animated-overlay.gif delete mode 100755 system/templates/js/jquery-ui-1.10.4.custom/development-bundle/themes/base/images/ui-bg_flat_0_aaaaaa_40x100.png delete mode 100755 system/templates/js/jquery-ui-1.10.4.custom/development-bundle/themes/base/images/ui-bg_flat_75_ffffff_40x100.png delete mode 100755 system/templates/js/jquery-ui-1.10.4.custom/development-bundle/themes/base/images/ui-bg_glass_55_fbf9ee_1x400.png delete mode 100755 system/templates/js/jquery-ui-1.10.4.custom/development-bundle/themes/base/images/ui-bg_glass_65_ffffff_1x400.png delete mode 100755 system/templates/js/jquery-ui-1.10.4.custom/development-bundle/themes/base/images/ui-bg_glass_75_dadada_1x400.png delete mode 100755 system/templates/js/jquery-ui-1.10.4.custom/development-bundle/themes/base/images/ui-bg_glass_75_e6e6e6_1x400.png delete mode 100755 system/templates/js/jquery-ui-1.10.4.custom/development-bundle/themes/base/images/ui-bg_glass_95_fef1ec_1x400.png delete mode 100755 system/templates/js/jquery-ui-1.10.4.custom/development-bundle/themes/base/images/ui-bg_highlight-soft_75_cccccc_1x100.png delete mode 100755 system/templates/js/jquery-ui-1.10.4.custom/development-bundle/themes/base/images/ui-icons_222222_256x240.png delete mode 100755 system/templates/js/jquery-ui-1.10.4.custom/development-bundle/themes/base/images/ui-icons_2e83ff_256x240.png delete mode 100755 system/templates/js/jquery-ui-1.10.4.custom/development-bundle/themes/base/images/ui-icons_454545_256x240.png delete mode 100755 system/templates/js/jquery-ui-1.10.4.custom/development-bundle/themes/base/images/ui-icons_888888_256x240.png delete mode 100755 system/templates/js/jquery-ui-1.10.4.custom/development-bundle/themes/base/images/ui-icons_cd0a0a_256x240.png delete mode 100755 system/templates/js/jquery-ui-1.10.4.custom/development-bundle/themes/base/jquery-ui.css delete mode 100755 system/templates/js/jquery-ui-1.10.4.custom/development-bundle/themes/base/jquery.ui.accordion.css delete mode 100755 system/templates/js/jquery-ui-1.10.4.custom/development-bundle/themes/base/jquery.ui.all.css delete mode 100755 system/templates/js/jquery-ui-1.10.4.custom/development-bundle/themes/base/jquery.ui.autocomplete.css delete mode 100755 system/templates/js/jquery-ui-1.10.4.custom/development-bundle/themes/base/jquery.ui.base.css delete mode 100755 system/templates/js/jquery-ui-1.10.4.custom/development-bundle/themes/base/jquery.ui.button.css delete mode 100755 system/templates/js/jquery-ui-1.10.4.custom/development-bundle/themes/base/jquery.ui.core.css delete mode 100755 system/templates/js/jquery-ui-1.10.4.custom/development-bundle/themes/base/jquery.ui.datepicker.css delete mode 100755 system/templates/js/jquery-ui-1.10.4.custom/development-bundle/themes/base/jquery.ui.dialog.css delete mode 100755 system/templates/js/jquery-ui-1.10.4.custom/development-bundle/themes/base/jquery.ui.menu.css delete mode 100755 system/templates/js/jquery-ui-1.10.4.custom/development-bundle/themes/base/jquery.ui.progressbar.css delete mode 100755 system/templates/js/jquery-ui-1.10.4.custom/development-bundle/themes/base/jquery.ui.resizable.css delete mode 100755 system/templates/js/jquery-ui-1.10.4.custom/development-bundle/themes/base/jquery.ui.selectable.css delete mode 100755 system/templates/js/jquery-ui-1.10.4.custom/development-bundle/themes/base/jquery.ui.slider.css delete mode 100755 system/templates/js/jquery-ui-1.10.4.custom/development-bundle/themes/base/jquery.ui.spinner.css delete mode 100755 system/templates/js/jquery-ui-1.10.4.custom/development-bundle/themes/base/jquery.ui.tabs.css delete mode 100755 system/templates/js/jquery-ui-1.10.4.custom/development-bundle/themes/base/jquery.ui.theme.css delete mode 100755 system/templates/js/jquery-ui-1.10.4.custom/development-bundle/themes/base/jquery.ui.tooltip.css delete mode 100755 system/templates/js/jquery-ui-1.10.4.custom/development-bundle/themes/base/minified/images/animated-overlay.gif delete mode 100755 system/templates/js/jquery-ui-1.10.4.custom/development-bundle/themes/base/minified/images/ui-bg_flat_0_aaaaaa_40x100.png delete mode 100755 system/templates/js/jquery-ui-1.10.4.custom/development-bundle/themes/base/minified/images/ui-bg_flat_75_ffffff_40x100.png delete mode 100755 system/templates/js/jquery-ui-1.10.4.custom/development-bundle/themes/base/minified/images/ui-bg_glass_55_fbf9ee_1x400.png delete mode 100755 system/templates/js/jquery-ui-1.10.4.custom/development-bundle/themes/base/minified/images/ui-bg_glass_65_ffffff_1x400.png delete mode 100755 system/templates/js/jquery-ui-1.10.4.custom/development-bundle/themes/base/minified/images/ui-bg_glass_75_dadada_1x400.png delete mode 100755 system/templates/js/jquery-ui-1.10.4.custom/development-bundle/themes/base/minified/images/ui-bg_glass_75_e6e6e6_1x400.png delete mode 100755 system/templates/js/jquery-ui-1.10.4.custom/development-bundle/themes/base/minified/images/ui-bg_glass_95_fef1ec_1x400.png delete mode 100755 system/templates/js/jquery-ui-1.10.4.custom/development-bundle/themes/base/minified/images/ui-bg_highlight-soft_75_cccccc_1x100.png delete mode 100755 system/templates/js/jquery-ui-1.10.4.custom/development-bundle/themes/base/minified/images/ui-icons_222222_256x240.png delete mode 100755 system/templates/js/jquery-ui-1.10.4.custom/development-bundle/themes/base/minified/images/ui-icons_2e83ff_256x240.png delete mode 100755 system/templates/js/jquery-ui-1.10.4.custom/development-bundle/themes/base/minified/images/ui-icons_454545_256x240.png delete mode 100755 system/templates/js/jquery-ui-1.10.4.custom/development-bundle/themes/base/minified/images/ui-icons_888888_256x240.png delete mode 100755 system/templates/js/jquery-ui-1.10.4.custom/development-bundle/themes/base/minified/images/ui-icons_cd0a0a_256x240.png delete mode 100755 system/templates/js/jquery-ui-1.10.4.custom/development-bundle/themes/base/minified/jquery-ui.min.css delete mode 100755 system/templates/js/jquery-ui-1.10.4.custom/development-bundle/themes/base/minified/jquery.ui.accordion.min.css delete mode 100755 system/templates/js/jquery-ui-1.10.4.custom/development-bundle/themes/base/minified/jquery.ui.autocomplete.min.css delete mode 100755 system/templates/js/jquery-ui-1.10.4.custom/development-bundle/themes/base/minified/jquery.ui.button.min.css delete mode 100755 system/templates/js/jquery-ui-1.10.4.custom/development-bundle/themes/base/minified/jquery.ui.core.min.css delete mode 100755 system/templates/js/jquery-ui-1.10.4.custom/development-bundle/themes/base/minified/jquery.ui.datepicker.min.css delete mode 100755 system/templates/js/jquery-ui-1.10.4.custom/development-bundle/themes/base/minified/jquery.ui.dialog.min.css delete mode 100755 system/templates/js/jquery-ui-1.10.4.custom/development-bundle/themes/base/minified/jquery.ui.menu.min.css delete mode 100755 system/templates/js/jquery-ui-1.10.4.custom/development-bundle/themes/base/minified/jquery.ui.progressbar.min.css delete mode 100755 system/templates/js/jquery-ui-1.10.4.custom/development-bundle/themes/base/minified/jquery.ui.resizable.min.css delete mode 100755 system/templates/js/jquery-ui-1.10.4.custom/development-bundle/themes/base/minified/jquery.ui.selectable.min.css delete mode 100755 system/templates/js/jquery-ui-1.10.4.custom/development-bundle/themes/base/minified/jquery.ui.slider.min.css delete mode 100755 system/templates/js/jquery-ui-1.10.4.custom/development-bundle/themes/base/minified/jquery.ui.spinner.min.css delete mode 100755 system/templates/js/jquery-ui-1.10.4.custom/development-bundle/themes/base/minified/jquery.ui.tabs.min.css delete mode 100755 system/templates/js/jquery-ui-1.10.4.custom/development-bundle/themes/base/minified/jquery.ui.theme.min.css delete mode 100755 system/templates/js/jquery-ui-1.10.4.custom/development-bundle/themes/base/minified/jquery.ui.tooltip.min.css delete mode 100755 system/templates/js/jquery-ui-1.10.4.custom/development-bundle/themes/smoothness/images/animated-overlay.gif delete mode 100755 system/templates/js/jquery-ui-1.10.4.custom/development-bundle/themes/smoothness/images/ui-bg_flat_0_aaaaaa_40x100.png delete mode 100755 system/templates/js/jquery-ui-1.10.4.custom/development-bundle/themes/smoothness/images/ui-bg_flat_75_ffffff_40x100.png delete mode 100755 system/templates/js/jquery-ui-1.10.4.custom/development-bundle/themes/smoothness/images/ui-bg_glass_55_fbf9ee_1x400.png delete mode 100755 system/templates/js/jquery-ui-1.10.4.custom/development-bundle/themes/smoothness/images/ui-bg_glass_65_ffffff_1x400.png delete mode 100755 system/templates/js/jquery-ui-1.10.4.custom/development-bundle/themes/smoothness/images/ui-bg_glass_75_dadada_1x400.png delete mode 100755 system/templates/js/jquery-ui-1.10.4.custom/development-bundle/themes/smoothness/images/ui-bg_glass_75_e6e6e6_1x400.png delete mode 100755 system/templates/js/jquery-ui-1.10.4.custom/development-bundle/themes/smoothness/images/ui-bg_glass_95_fef1ec_1x400.png delete mode 100755 system/templates/js/jquery-ui-1.10.4.custom/development-bundle/themes/smoothness/images/ui-bg_highlight-soft_75_cccccc_1x100.png delete mode 100755 system/templates/js/jquery-ui-1.10.4.custom/development-bundle/themes/smoothness/images/ui-icons_222222_256x240.png delete mode 100755 system/templates/js/jquery-ui-1.10.4.custom/development-bundle/themes/smoothness/images/ui-icons_2e83ff_256x240.png delete mode 100755 system/templates/js/jquery-ui-1.10.4.custom/development-bundle/themes/smoothness/images/ui-icons_454545_256x240.png delete mode 100755 system/templates/js/jquery-ui-1.10.4.custom/development-bundle/themes/smoothness/images/ui-icons_888888_256x240.png delete mode 100755 system/templates/js/jquery-ui-1.10.4.custom/development-bundle/themes/smoothness/images/ui-icons_cd0a0a_256x240.png delete mode 100755 system/templates/js/jquery-ui-1.10.4.custom/development-bundle/themes/smoothness/jquery-ui.css delete mode 100755 system/templates/js/jquery-ui-1.10.4.custom/development-bundle/themes/smoothness/jquery.ui.accordion.css delete mode 100755 system/templates/js/jquery-ui-1.10.4.custom/development-bundle/themes/smoothness/jquery.ui.all.css delete mode 100755 system/templates/js/jquery-ui-1.10.4.custom/development-bundle/themes/smoothness/jquery.ui.autocomplete.css delete mode 100755 system/templates/js/jquery-ui-1.10.4.custom/development-bundle/themes/smoothness/jquery.ui.base.css delete mode 100755 system/templates/js/jquery-ui-1.10.4.custom/development-bundle/themes/smoothness/jquery.ui.button.css delete mode 100755 system/templates/js/jquery-ui-1.10.4.custom/development-bundle/themes/smoothness/jquery.ui.core.css delete mode 100755 system/templates/js/jquery-ui-1.10.4.custom/development-bundle/themes/smoothness/jquery.ui.datepicker.css delete mode 100755 system/templates/js/jquery-ui-1.10.4.custom/development-bundle/themes/smoothness/jquery.ui.dialog.css delete mode 100755 system/templates/js/jquery-ui-1.10.4.custom/development-bundle/themes/smoothness/jquery.ui.menu.css delete mode 100755 system/templates/js/jquery-ui-1.10.4.custom/development-bundle/themes/smoothness/jquery.ui.progressbar.css delete mode 100755 system/templates/js/jquery-ui-1.10.4.custom/development-bundle/themes/smoothness/jquery.ui.resizable.css delete mode 100755 system/templates/js/jquery-ui-1.10.4.custom/development-bundle/themes/smoothness/jquery.ui.selectable.css delete mode 100755 system/templates/js/jquery-ui-1.10.4.custom/development-bundle/themes/smoothness/jquery.ui.slider.css delete mode 100755 system/templates/js/jquery-ui-1.10.4.custom/development-bundle/themes/smoothness/jquery.ui.spinner.css delete mode 100755 system/templates/js/jquery-ui-1.10.4.custom/development-bundle/themes/smoothness/jquery.ui.tabs.css delete mode 100755 system/templates/js/jquery-ui-1.10.4.custom/development-bundle/themes/smoothness/jquery.ui.theme.css delete mode 100755 system/templates/js/jquery-ui-1.10.4.custom/development-bundle/themes/smoothness/jquery.ui.tooltip.css delete mode 100755 system/templates/js/jquery-ui-1.10.4.custom/development-bundle/themes/smoothness/minified/images/animated-overlay.gif delete mode 100755 system/templates/js/jquery-ui-1.10.4.custom/development-bundle/themes/smoothness/minified/images/ui-bg_flat_0_aaaaaa_40x100.png delete mode 100755 system/templates/js/jquery-ui-1.10.4.custom/development-bundle/themes/smoothness/minified/images/ui-bg_flat_75_ffffff_40x100.png delete mode 100755 system/templates/js/jquery-ui-1.10.4.custom/development-bundle/themes/smoothness/minified/images/ui-bg_glass_55_fbf9ee_1x400.png delete mode 100755 system/templates/js/jquery-ui-1.10.4.custom/development-bundle/themes/smoothness/minified/images/ui-bg_glass_65_ffffff_1x400.png delete mode 100755 system/templates/js/jquery-ui-1.10.4.custom/development-bundle/themes/smoothness/minified/images/ui-bg_glass_75_dadada_1x400.png delete mode 100755 system/templates/js/jquery-ui-1.10.4.custom/development-bundle/themes/smoothness/minified/images/ui-bg_glass_75_e6e6e6_1x400.png delete mode 100755 system/templates/js/jquery-ui-1.10.4.custom/development-bundle/themes/smoothness/minified/images/ui-bg_glass_95_fef1ec_1x400.png delete mode 100755 system/templates/js/jquery-ui-1.10.4.custom/development-bundle/themes/smoothness/minified/images/ui-bg_highlight-soft_75_cccccc_1x100.png delete mode 100755 system/templates/js/jquery-ui-1.10.4.custom/development-bundle/themes/smoothness/minified/images/ui-icons_222222_256x240.png delete mode 100755 system/templates/js/jquery-ui-1.10.4.custom/development-bundle/themes/smoothness/minified/images/ui-icons_2e83ff_256x240.png delete mode 100755 system/templates/js/jquery-ui-1.10.4.custom/development-bundle/themes/smoothness/minified/images/ui-icons_454545_256x240.png delete mode 100755 system/templates/js/jquery-ui-1.10.4.custom/development-bundle/themes/smoothness/minified/images/ui-icons_888888_256x240.png delete mode 100755 system/templates/js/jquery-ui-1.10.4.custom/development-bundle/themes/smoothness/minified/images/ui-icons_cd0a0a_256x240.png delete mode 100755 system/templates/js/jquery-ui-1.10.4.custom/development-bundle/themes/smoothness/minified/jquery-ui.min.css delete mode 100755 system/templates/js/jquery-ui-1.10.4.custom/development-bundle/themes/smoothness/minified/jquery.ui.accordion.min.css delete mode 100755 system/templates/js/jquery-ui-1.10.4.custom/development-bundle/themes/smoothness/minified/jquery.ui.autocomplete.min.css delete mode 100755 system/templates/js/jquery-ui-1.10.4.custom/development-bundle/themes/smoothness/minified/jquery.ui.button.min.css delete mode 100755 system/templates/js/jquery-ui-1.10.4.custom/development-bundle/themes/smoothness/minified/jquery.ui.core.min.css delete mode 100755 system/templates/js/jquery-ui-1.10.4.custom/development-bundle/themes/smoothness/minified/jquery.ui.datepicker.min.css delete mode 100755 system/templates/js/jquery-ui-1.10.4.custom/development-bundle/themes/smoothness/minified/jquery.ui.dialog.min.css delete mode 100755 system/templates/js/jquery-ui-1.10.4.custom/development-bundle/themes/smoothness/minified/jquery.ui.menu.min.css delete mode 100755 system/templates/js/jquery-ui-1.10.4.custom/development-bundle/themes/smoothness/minified/jquery.ui.progressbar.min.css delete mode 100755 system/templates/js/jquery-ui-1.10.4.custom/development-bundle/themes/smoothness/minified/jquery.ui.resizable.min.css delete mode 100755 system/templates/js/jquery-ui-1.10.4.custom/development-bundle/themes/smoothness/minified/jquery.ui.selectable.min.css delete mode 100755 system/templates/js/jquery-ui-1.10.4.custom/development-bundle/themes/smoothness/minified/jquery.ui.slider.min.css delete mode 100755 system/templates/js/jquery-ui-1.10.4.custom/development-bundle/themes/smoothness/minified/jquery.ui.spinner.min.css delete mode 100755 system/templates/js/jquery-ui-1.10.4.custom/development-bundle/themes/smoothness/minified/jquery.ui.tabs.min.css delete mode 100755 system/templates/js/jquery-ui-1.10.4.custom/development-bundle/themes/smoothness/minified/jquery.ui.theme.min.css delete mode 100755 system/templates/js/jquery-ui-1.10.4.custom/development-bundle/themes/smoothness/minified/jquery.ui.tooltip.min.css delete mode 100755 system/templates/js/jquery-ui-1.10.4.custom/development-bundle/ui.accordion.jquery.json delete mode 100755 system/templates/js/jquery-ui-1.10.4.custom/development-bundle/ui.autocomplete.jquery.json delete mode 100755 system/templates/js/jquery-ui-1.10.4.custom/development-bundle/ui.button.jquery.json delete mode 100755 system/templates/js/jquery-ui-1.10.4.custom/development-bundle/ui.core.jquery.json delete mode 100755 system/templates/js/jquery-ui-1.10.4.custom/development-bundle/ui.datepicker.jquery.json delete mode 100755 system/templates/js/jquery-ui-1.10.4.custom/development-bundle/ui.dialog.jquery.json delete mode 100755 system/templates/js/jquery-ui-1.10.4.custom/development-bundle/ui.draggable.jquery.json delete mode 100755 system/templates/js/jquery-ui-1.10.4.custom/development-bundle/ui.droppable.jquery.json delete mode 100755 system/templates/js/jquery-ui-1.10.4.custom/development-bundle/ui.menu.jquery.json delete mode 100755 system/templates/js/jquery-ui-1.10.4.custom/development-bundle/ui.mouse.jquery.json delete mode 100755 system/templates/js/jquery-ui-1.10.4.custom/development-bundle/ui.position.jquery.json delete mode 100755 system/templates/js/jquery-ui-1.10.4.custom/development-bundle/ui.progressbar.jquery.json delete mode 100755 system/templates/js/jquery-ui-1.10.4.custom/development-bundle/ui.resizable.jquery.json delete mode 100755 system/templates/js/jquery-ui-1.10.4.custom/development-bundle/ui.selectable.jquery.json delete mode 100755 system/templates/js/jquery-ui-1.10.4.custom/development-bundle/ui.slider.jquery.json delete mode 100755 system/templates/js/jquery-ui-1.10.4.custom/development-bundle/ui.sortable.jquery.json delete mode 100755 system/templates/js/jquery-ui-1.10.4.custom/development-bundle/ui.spinner.jquery.json delete mode 100755 system/templates/js/jquery-ui-1.10.4.custom/development-bundle/ui.tabs.jquery.json delete mode 100755 system/templates/js/jquery-ui-1.10.4.custom/development-bundle/ui.tooltip.jquery.json delete mode 100755 system/templates/js/jquery-ui-1.10.4.custom/development-bundle/ui.widget.jquery.json delete mode 100755 system/templates/js/jquery-ui-1.10.4.custom/development-bundle/ui/i18n/jquery-ui-i18n.js delete mode 100755 system/templates/js/jquery-ui-1.10.4.custom/development-bundle/ui/i18n/jquery.ui.datepicker-af.js delete mode 100755 system/templates/js/jquery-ui-1.10.4.custom/development-bundle/ui/i18n/jquery.ui.datepicker-ar-DZ.js delete mode 100755 system/templates/js/jquery-ui-1.10.4.custom/development-bundle/ui/i18n/jquery.ui.datepicker-ar.js delete mode 100755 system/templates/js/jquery-ui-1.10.4.custom/development-bundle/ui/i18n/jquery.ui.datepicker-az.js delete mode 100755 system/templates/js/jquery-ui-1.10.4.custom/development-bundle/ui/i18n/jquery.ui.datepicker-be.js delete mode 100755 system/templates/js/jquery-ui-1.10.4.custom/development-bundle/ui/i18n/jquery.ui.datepicker-bg.js delete mode 100755 system/templates/js/jquery-ui-1.10.4.custom/development-bundle/ui/i18n/jquery.ui.datepicker-bs.js delete mode 100755 system/templates/js/jquery-ui-1.10.4.custom/development-bundle/ui/i18n/jquery.ui.datepicker-ca.js delete mode 100755 system/templates/js/jquery-ui-1.10.4.custom/development-bundle/ui/i18n/jquery.ui.datepicker-cs.js delete mode 100755 system/templates/js/jquery-ui-1.10.4.custom/development-bundle/ui/i18n/jquery.ui.datepicker-cy-GB.js delete mode 100755 system/templates/js/jquery-ui-1.10.4.custom/development-bundle/ui/i18n/jquery.ui.datepicker-da.js delete mode 100755 system/templates/js/jquery-ui-1.10.4.custom/development-bundle/ui/i18n/jquery.ui.datepicker-de.js delete mode 100755 system/templates/js/jquery-ui-1.10.4.custom/development-bundle/ui/i18n/jquery.ui.datepicker-el.js delete mode 100755 system/templates/js/jquery-ui-1.10.4.custom/development-bundle/ui/i18n/jquery.ui.datepicker-en-AU.js delete mode 100755 system/templates/js/jquery-ui-1.10.4.custom/development-bundle/ui/i18n/jquery.ui.datepicker-en-GB.js delete mode 100755 system/templates/js/jquery-ui-1.10.4.custom/development-bundle/ui/i18n/jquery.ui.datepicker-en-NZ.js delete mode 100755 system/templates/js/jquery-ui-1.10.4.custom/development-bundle/ui/i18n/jquery.ui.datepicker-eo.js delete mode 100755 system/templates/js/jquery-ui-1.10.4.custom/development-bundle/ui/i18n/jquery.ui.datepicker-es.js delete mode 100755 system/templates/js/jquery-ui-1.10.4.custom/development-bundle/ui/i18n/jquery.ui.datepicker-et.js delete mode 100755 system/templates/js/jquery-ui-1.10.4.custom/development-bundle/ui/i18n/jquery.ui.datepicker-eu.js delete mode 100755 system/templates/js/jquery-ui-1.10.4.custom/development-bundle/ui/i18n/jquery.ui.datepicker-fa.js delete mode 100755 system/templates/js/jquery-ui-1.10.4.custom/development-bundle/ui/i18n/jquery.ui.datepicker-fi.js delete mode 100755 system/templates/js/jquery-ui-1.10.4.custom/development-bundle/ui/i18n/jquery.ui.datepicker-fo.js delete mode 100755 system/templates/js/jquery-ui-1.10.4.custom/development-bundle/ui/i18n/jquery.ui.datepicker-fr-CA.js delete mode 100755 system/templates/js/jquery-ui-1.10.4.custom/development-bundle/ui/i18n/jquery.ui.datepicker-fr-CH.js delete mode 100755 system/templates/js/jquery-ui-1.10.4.custom/development-bundle/ui/i18n/jquery.ui.datepicker-fr.js delete mode 100755 system/templates/js/jquery-ui-1.10.4.custom/development-bundle/ui/i18n/jquery.ui.datepicker-gl.js delete mode 100755 system/templates/js/jquery-ui-1.10.4.custom/development-bundle/ui/i18n/jquery.ui.datepicker-he.js delete mode 100755 system/templates/js/jquery-ui-1.10.4.custom/development-bundle/ui/i18n/jquery.ui.datepicker-hi.js delete mode 100755 system/templates/js/jquery-ui-1.10.4.custom/development-bundle/ui/i18n/jquery.ui.datepicker-hr.js delete mode 100755 system/templates/js/jquery-ui-1.10.4.custom/development-bundle/ui/i18n/jquery.ui.datepicker-hu.js delete mode 100755 system/templates/js/jquery-ui-1.10.4.custom/development-bundle/ui/i18n/jquery.ui.datepicker-hy.js delete mode 100755 system/templates/js/jquery-ui-1.10.4.custom/development-bundle/ui/i18n/jquery.ui.datepicker-id.js delete mode 100755 system/templates/js/jquery-ui-1.10.4.custom/development-bundle/ui/i18n/jquery.ui.datepicker-is.js delete mode 100755 system/templates/js/jquery-ui-1.10.4.custom/development-bundle/ui/i18n/jquery.ui.datepicker-it.js delete mode 100755 system/templates/js/jquery-ui-1.10.4.custom/development-bundle/ui/i18n/jquery.ui.datepicker-ja.js delete mode 100755 system/templates/js/jquery-ui-1.10.4.custom/development-bundle/ui/i18n/jquery.ui.datepicker-ka.js delete mode 100755 system/templates/js/jquery-ui-1.10.4.custom/development-bundle/ui/i18n/jquery.ui.datepicker-kk.js delete mode 100755 system/templates/js/jquery-ui-1.10.4.custom/development-bundle/ui/i18n/jquery.ui.datepicker-km.js delete mode 100755 system/templates/js/jquery-ui-1.10.4.custom/development-bundle/ui/i18n/jquery.ui.datepicker-ko.js delete mode 100755 system/templates/js/jquery-ui-1.10.4.custom/development-bundle/ui/i18n/jquery.ui.datepicker-ky.js delete mode 100755 system/templates/js/jquery-ui-1.10.4.custom/development-bundle/ui/i18n/jquery.ui.datepicker-lb.js delete mode 100755 system/templates/js/jquery-ui-1.10.4.custom/development-bundle/ui/i18n/jquery.ui.datepicker-lt.js delete mode 100755 system/templates/js/jquery-ui-1.10.4.custom/development-bundle/ui/i18n/jquery.ui.datepicker-lv.js delete mode 100755 system/templates/js/jquery-ui-1.10.4.custom/development-bundle/ui/i18n/jquery.ui.datepicker-mk.js delete mode 100755 system/templates/js/jquery-ui-1.10.4.custom/development-bundle/ui/i18n/jquery.ui.datepicker-ml.js delete mode 100755 system/templates/js/jquery-ui-1.10.4.custom/development-bundle/ui/i18n/jquery.ui.datepicker-ms.js delete mode 100755 system/templates/js/jquery-ui-1.10.4.custom/development-bundle/ui/i18n/jquery.ui.datepicker-nb.js delete mode 100755 system/templates/js/jquery-ui-1.10.4.custom/development-bundle/ui/i18n/jquery.ui.datepicker-nl-BE.js delete mode 100755 system/templates/js/jquery-ui-1.10.4.custom/development-bundle/ui/i18n/jquery.ui.datepicker-nl.js delete mode 100755 system/templates/js/jquery-ui-1.10.4.custom/development-bundle/ui/i18n/jquery.ui.datepicker-nn.js delete mode 100755 system/templates/js/jquery-ui-1.10.4.custom/development-bundle/ui/i18n/jquery.ui.datepicker-no.js delete mode 100755 system/templates/js/jquery-ui-1.10.4.custom/development-bundle/ui/i18n/jquery.ui.datepicker-pl.js delete mode 100755 system/templates/js/jquery-ui-1.10.4.custom/development-bundle/ui/i18n/jquery.ui.datepicker-pt-BR.js delete mode 100755 system/templates/js/jquery-ui-1.10.4.custom/development-bundle/ui/i18n/jquery.ui.datepicker-pt.js delete mode 100755 system/templates/js/jquery-ui-1.10.4.custom/development-bundle/ui/i18n/jquery.ui.datepicker-rm.js delete mode 100755 system/templates/js/jquery-ui-1.10.4.custom/development-bundle/ui/i18n/jquery.ui.datepicker-ro.js delete mode 100755 system/templates/js/jquery-ui-1.10.4.custom/development-bundle/ui/i18n/jquery.ui.datepicker-ru.js delete mode 100755 system/templates/js/jquery-ui-1.10.4.custom/development-bundle/ui/i18n/jquery.ui.datepicker-sk.js delete mode 100755 system/templates/js/jquery-ui-1.10.4.custom/development-bundle/ui/i18n/jquery.ui.datepicker-sl.js delete mode 100755 system/templates/js/jquery-ui-1.10.4.custom/development-bundle/ui/i18n/jquery.ui.datepicker-sq.js delete mode 100755 system/templates/js/jquery-ui-1.10.4.custom/development-bundle/ui/i18n/jquery.ui.datepicker-sr-SR.js delete mode 100755 system/templates/js/jquery-ui-1.10.4.custom/development-bundle/ui/i18n/jquery.ui.datepicker-sr.js delete mode 100755 system/templates/js/jquery-ui-1.10.4.custom/development-bundle/ui/i18n/jquery.ui.datepicker-sv.js delete mode 100755 system/templates/js/jquery-ui-1.10.4.custom/development-bundle/ui/i18n/jquery.ui.datepicker-ta.js delete mode 100755 system/templates/js/jquery-ui-1.10.4.custom/development-bundle/ui/i18n/jquery.ui.datepicker-th.js delete mode 100755 system/templates/js/jquery-ui-1.10.4.custom/development-bundle/ui/i18n/jquery.ui.datepicker-tj.js delete mode 100755 system/templates/js/jquery-ui-1.10.4.custom/development-bundle/ui/i18n/jquery.ui.datepicker-tr.js delete mode 100755 system/templates/js/jquery-ui-1.10.4.custom/development-bundle/ui/i18n/jquery.ui.datepicker-uk.js delete mode 100755 system/templates/js/jquery-ui-1.10.4.custom/development-bundle/ui/i18n/jquery.ui.datepicker-vi.js delete mode 100755 system/templates/js/jquery-ui-1.10.4.custom/development-bundle/ui/i18n/jquery.ui.datepicker-zh-CN.js delete mode 100755 system/templates/js/jquery-ui-1.10.4.custom/development-bundle/ui/i18n/jquery.ui.datepicker-zh-HK.js delete mode 100755 system/templates/js/jquery-ui-1.10.4.custom/development-bundle/ui/i18n/jquery.ui.datepicker-zh-TW.js delete mode 100755 system/templates/js/jquery-ui-1.10.4.custom/development-bundle/ui/jquery-ui.custom.js delete mode 100755 system/templates/js/jquery-ui-1.10.4.custom/development-bundle/ui/jquery.ui.accordion.js delete mode 100755 system/templates/js/jquery-ui-1.10.4.custom/development-bundle/ui/jquery.ui.autocomplete.js delete mode 100755 system/templates/js/jquery-ui-1.10.4.custom/development-bundle/ui/jquery.ui.button.js delete mode 100755 system/templates/js/jquery-ui-1.10.4.custom/development-bundle/ui/jquery.ui.core.js delete mode 100755 system/templates/js/jquery-ui-1.10.4.custom/development-bundle/ui/jquery.ui.datepicker.js delete mode 100755 system/templates/js/jquery-ui-1.10.4.custom/development-bundle/ui/jquery.ui.dialog.js delete mode 100755 system/templates/js/jquery-ui-1.10.4.custom/development-bundle/ui/jquery.ui.draggable.js delete mode 100755 system/templates/js/jquery-ui-1.10.4.custom/development-bundle/ui/jquery.ui.droppable.js delete mode 100755 system/templates/js/jquery-ui-1.10.4.custom/development-bundle/ui/jquery.ui.menu.js delete mode 100755 system/templates/js/jquery-ui-1.10.4.custom/development-bundle/ui/jquery.ui.mouse.js delete mode 100755 system/templates/js/jquery-ui-1.10.4.custom/development-bundle/ui/jquery.ui.position.js delete mode 100755 system/templates/js/jquery-ui-1.10.4.custom/development-bundle/ui/jquery.ui.progressbar.js delete mode 100755 system/templates/js/jquery-ui-1.10.4.custom/development-bundle/ui/jquery.ui.resizable.js delete mode 100755 system/templates/js/jquery-ui-1.10.4.custom/development-bundle/ui/jquery.ui.selectable.js delete mode 100755 system/templates/js/jquery-ui-1.10.4.custom/development-bundle/ui/jquery.ui.slider.js delete mode 100755 system/templates/js/jquery-ui-1.10.4.custom/development-bundle/ui/jquery.ui.sortable.js delete mode 100755 system/templates/js/jquery-ui-1.10.4.custom/development-bundle/ui/jquery.ui.spinner.js delete mode 100755 system/templates/js/jquery-ui-1.10.4.custom/development-bundle/ui/jquery.ui.tabs.js delete mode 100755 system/templates/js/jquery-ui-1.10.4.custom/development-bundle/ui/jquery.ui.tooltip.js delete mode 100755 system/templates/js/jquery-ui-1.10.4.custom/development-bundle/ui/jquery.ui.widget.js delete mode 100755 system/templates/js/jquery-ui-1.10.4.custom/development-bundle/ui/minified/i18n/jquery-ui-i18n.min.js delete mode 100755 system/templates/js/jquery-ui-1.10.4.custom/development-bundle/ui/minified/i18n/jquery.ui.datepicker-af.min.js delete mode 100755 system/templates/js/jquery-ui-1.10.4.custom/development-bundle/ui/minified/i18n/jquery.ui.datepicker-ar-DZ.min.js delete mode 100755 system/templates/js/jquery-ui-1.10.4.custom/development-bundle/ui/minified/i18n/jquery.ui.datepicker-ar.min.js delete mode 100755 system/templates/js/jquery-ui-1.10.4.custom/development-bundle/ui/minified/i18n/jquery.ui.datepicker-az.min.js delete mode 100755 system/templates/js/jquery-ui-1.10.4.custom/development-bundle/ui/minified/i18n/jquery.ui.datepicker-be.min.js delete mode 100755 system/templates/js/jquery-ui-1.10.4.custom/development-bundle/ui/minified/i18n/jquery.ui.datepicker-bg.min.js delete mode 100755 system/templates/js/jquery-ui-1.10.4.custom/development-bundle/ui/minified/i18n/jquery.ui.datepicker-bs.min.js delete mode 100755 system/templates/js/jquery-ui-1.10.4.custom/development-bundle/ui/minified/i18n/jquery.ui.datepicker-ca.min.js delete mode 100755 system/templates/js/jquery-ui-1.10.4.custom/development-bundle/ui/minified/i18n/jquery.ui.datepicker-cs.min.js delete mode 100755 system/templates/js/jquery-ui-1.10.4.custom/development-bundle/ui/minified/i18n/jquery.ui.datepicker-cy-GB.min.js delete mode 100755 system/templates/js/jquery-ui-1.10.4.custom/development-bundle/ui/minified/i18n/jquery.ui.datepicker-da.min.js delete mode 100755 system/templates/js/jquery-ui-1.10.4.custom/development-bundle/ui/minified/i18n/jquery.ui.datepicker-de.min.js delete mode 100755 system/templates/js/jquery-ui-1.10.4.custom/development-bundle/ui/minified/i18n/jquery.ui.datepicker-el.min.js delete mode 100755 system/templates/js/jquery-ui-1.10.4.custom/development-bundle/ui/minified/i18n/jquery.ui.datepicker-en-AU.min.js delete mode 100755 system/templates/js/jquery-ui-1.10.4.custom/development-bundle/ui/minified/i18n/jquery.ui.datepicker-en-GB.min.js delete mode 100755 system/templates/js/jquery-ui-1.10.4.custom/development-bundle/ui/minified/i18n/jquery.ui.datepicker-en-NZ.min.js delete mode 100755 system/templates/js/jquery-ui-1.10.4.custom/development-bundle/ui/minified/i18n/jquery.ui.datepicker-eo.min.js delete mode 100755 system/templates/js/jquery-ui-1.10.4.custom/development-bundle/ui/minified/i18n/jquery.ui.datepicker-es.min.js delete mode 100755 system/templates/js/jquery-ui-1.10.4.custom/development-bundle/ui/minified/i18n/jquery.ui.datepicker-et.min.js delete mode 100755 system/templates/js/jquery-ui-1.10.4.custom/development-bundle/ui/minified/i18n/jquery.ui.datepicker-eu.min.js delete mode 100755 system/templates/js/jquery-ui-1.10.4.custom/development-bundle/ui/minified/i18n/jquery.ui.datepicker-fa.min.js delete mode 100755 system/templates/js/jquery-ui-1.10.4.custom/development-bundle/ui/minified/i18n/jquery.ui.datepicker-fi.min.js delete mode 100755 system/templates/js/jquery-ui-1.10.4.custom/development-bundle/ui/minified/i18n/jquery.ui.datepicker-fo.min.js delete mode 100755 system/templates/js/jquery-ui-1.10.4.custom/development-bundle/ui/minified/i18n/jquery.ui.datepicker-fr-CA.min.js delete mode 100755 system/templates/js/jquery-ui-1.10.4.custom/development-bundle/ui/minified/i18n/jquery.ui.datepicker-fr-CH.min.js delete mode 100755 system/templates/js/jquery-ui-1.10.4.custom/development-bundle/ui/minified/i18n/jquery.ui.datepicker-fr.min.js delete mode 100755 system/templates/js/jquery-ui-1.10.4.custom/development-bundle/ui/minified/i18n/jquery.ui.datepicker-gl.min.js delete mode 100755 system/templates/js/jquery-ui-1.10.4.custom/development-bundle/ui/minified/i18n/jquery.ui.datepicker-he.min.js delete mode 100755 system/templates/js/jquery-ui-1.10.4.custom/development-bundle/ui/minified/i18n/jquery.ui.datepicker-hi.min.js delete mode 100755 system/templates/js/jquery-ui-1.10.4.custom/development-bundle/ui/minified/i18n/jquery.ui.datepicker-hr.min.js delete mode 100755 system/templates/js/jquery-ui-1.10.4.custom/development-bundle/ui/minified/i18n/jquery.ui.datepicker-hu.min.js delete mode 100755 system/templates/js/jquery-ui-1.10.4.custom/development-bundle/ui/minified/i18n/jquery.ui.datepicker-hy.min.js delete mode 100755 system/templates/js/jquery-ui-1.10.4.custom/development-bundle/ui/minified/i18n/jquery.ui.datepicker-id.min.js delete mode 100755 system/templates/js/jquery-ui-1.10.4.custom/development-bundle/ui/minified/i18n/jquery.ui.datepicker-is.min.js delete mode 100755 system/templates/js/jquery-ui-1.10.4.custom/development-bundle/ui/minified/i18n/jquery.ui.datepicker-it.min.js delete mode 100755 system/templates/js/jquery-ui-1.10.4.custom/development-bundle/ui/minified/i18n/jquery.ui.datepicker-ja.min.js delete mode 100755 system/templates/js/jquery-ui-1.10.4.custom/development-bundle/ui/minified/i18n/jquery.ui.datepicker-ka.min.js delete mode 100755 system/templates/js/jquery-ui-1.10.4.custom/development-bundle/ui/minified/i18n/jquery.ui.datepicker-kk.min.js delete mode 100755 system/templates/js/jquery-ui-1.10.4.custom/development-bundle/ui/minified/i18n/jquery.ui.datepicker-km.min.js delete mode 100755 system/templates/js/jquery-ui-1.10.4.custom/development-bundle/ui/minified/i18n/jquery.ui.datepicker-ko.min.js delete mode 100755 system/templates/js/jquery-ui-1.10.4.custom/development-bundle/ui/minified/i18n/jquery.ui.datepicker-ky.min.js delete mode 100755 system/templates/js/jquery-ui-1.10.4.custom/development-bundle/ui/minified/i18n/jquery.ui.datepicker-lb.min.js delete mode 100755 system/templates/js/jquery-ui-1.10.4.custom/development-bundle/ui/minified/i18n/jquery.ui.datepicker-lt.min.js delete mode 100755 system/templates/js/jquery-ui-1.10.4.custom/development-bundle/ui/minified/i18n/jquery.ui.datepicker-lv.min.js delete mode 100755 system/templates/js/jquery-ui-1.10.4.custom/development-bundle/ui/minified/i18n/jquery.ui.datepicker-mk.min.js delete mode 100755 system/templates/js/jquery-ui-1.10.4.custom/development-bundle/ui/minified/i18n/jquery.ui.datepicker-ml.min.js delete mode 100755 system/templates/js/jquery-ui-1.10.4.custom/development-bundle/ui/minified/i18n/jquery.ui.datepicker-ms.min.js delete mode 100755 system/templates/js/jquery-ui-1.10.4.custom/development-bundle/ui/minified/i18n/jquery.ui.datepicker-nb.min.js delete mode 100755 system/templates/js/jquery-ui-1.10.4.custom/development-bundle/ui/minified/i18n/jquery.ui.datepicker-nl-BE.min.js delete mode 100755 system/templates/js/jquery-ui-1.10.4.custom/development-bundle/ui/minified/i18n/jquery.ui.datepicker-nl.min.js delete mode 100755 system/templates/js/jquery-ui-1.10.4.custom/development-bundle/ui/minified/i18n/jquery.ui.datepicker-nn.min.js delete mode 100755 system/templates/js/jquery-ui-1.10.4.custom/development-bundle/ui/minified/i18n/jquery.ui.datepicker-no.min.js delete mode 100755 system/templates/js/jquery-ui-1.10.4.custom/development-bundle/ui/minified/i18n/jquery.ui.datepicker-pl.min.js delete mode 100755 system/templates/js/jquery-ui-1.10.4.custom/development-bundle/ui/minified/i18n/jquery.ui.datepicker-pt-BR.min.js delete mode 100755 system/templates/js/jquery-ui-1.10.4.custom/development-bundle/ui/minified/i18n/jquery.ui.datepicker-pt.min.js delete mode 100755 system/templates/js/jquery-ui-1.10.4.custom/development-bundle/ui/minified/i18n/jquery.ui.datepicker-rm.min.js delete mode 100755 system/templates/js/jquery-ui-1.10.4.custom/development-bundle/ui/minified/i18n/jquery.ui.datepicker-ro.min.js delete mode 100755 system/templates/js/jquery-ui-1.10.4.custom/development-bundle/ui/minified/i18n/jquery.ui.datepicker-ru.min.js delete mode 100755 system/templates/js/jquery-ui-1.10.4.custom/development-bundle/ui/minified/i18n/jquery.ui.datepicker-sk.min.js delete mode 100755 system/templates/js/jquery-ui-1.10.4.custom/development-bundle/ui/minified/i18n/jquery.ui.datepicker-sl.min.js delete mode 100755 system/templates/js/jquery-ui-1.10.4.custom/development-bundle/ui/minified/i18n/jquery.ui.datepicker-sq.min.js delete mode 100755 system/templates/js/jquery-ui-1.10.4.custom/development-bundle/ui/minified/i18n/jquery.ui.datepicker-sr-SR.min.js delete mode 100755 system/templates/js/jquery-ui-1.10.4.custom/development-bundle/ui/minified/i18n/jquery.ui.datepicker-sr.min.js delete mode 100755 system/templates/js/jquery-ui-1.10.4.custom/development-bundle/ui/minified/i18n/jquery.ui.datepicker-sv.min.js delete mode 100755 system/templates/js/jquery-ui-1.10.4.custom/development-bundle/ui/minified/i18n/jquery.ui.datepicker-ta.min.js delete mode 100755 system/templates/js/jquery-ui-1.10.4.custom/development-bundle/ui/minified/i18n/jquery.ui.datepicker-th.min.js delete mode 100755 system/templates/js/jquery-ui-1.10.4.custom/development-bundle/ui/minified/i18n/jquery.ui.datepicker-tj.min.js delete mode 100755 system/templates/js/jquery-ui-1.10.4.custom/development-bundle/ui/minified/i18n/jquery.ui.datepicker-tr.min.js delete mode 100755 system/templates/js/jquery-ui-1.10.4.custom/development-bundle/ui/minified/i18n/jquery.ui.datepicker-uk.min.js delete mode 100755 system/templates/js/jquery-ui-1.10.4.custom/development-bundle/ui/minified/i18n/jquery.ui.datepicker-vi.min.js delete mode 100755 system/templates/js/jquery-ui-1.10.4.custom/development-bundle/ui/minified/i18n/jquery.ui.datepicker-zh-CN.min.js delete mode 100755 system/templates/js/jquery-ui-1.10.4.custom/development-bundle/ui/minified/i18n/jquery.ui.datepicker-zh-HK.min.js delete mode 100755 system/templates/js/jquery-ui-1.10.4.custom/development-bundle/ui/minified/i18n/jquery.ui.datepicker-zh-TW.min.js delete mode 100755 system/templates/js/jquery-ui-1.10.4.custom/development-bundle/ui/minified/jquery-ui.custom.min.js delete mode 100755 system/templates/js/jquery-ui-1.10.4.custom/development-bundle/ui/minified/jquery.ui.accordion.min.js delete mode 100755 system/templates/js/jquery-ui-1.10.4.custom/development-bundle/ui/minified/jquery.ui.autocomplete.min.js delete mode 100755 system/templates/js/jquery-ui-1.10.4.custom/development-bundle/ui/minified/jquery.ui.button.min.js delete mode 100755 system/templates/js/jquery-ui-1.10.4.custom/development-bundle/ui/minified/jquery.ui.core.min.js delete mode 100755 system/templates/js/jquery-ui-1.10.4.custom/development-bundle/ui/minified/jquery.ui.datepicker.min.js delete mode 100755 system/templates/js/jquery-ui-1.10.4.custom/development-bundle/ui/minified/jquery.ui.dialog.min.js delete mode 100755 system/templates/js/jquery-ui-1.10.4.custom/development-bundle/ui/minified/jquery.ui.draggable.min.js delete mode 100755 system/templates/js/jquery-ui-1.10.4.custom/development-bundle/ui/minified/jquery.ui.droppable.min.js delete mode 100755 system/templates/js/jquery-ui-1.10.4.custom/development-bundle/ui/minified/jquery.ui.menu.min.js delete mode 100755 system/templates/js/jquery-ui-1.10.4.custom/development-bundle/ui/minified/jquery.ui.mouse.min.js delete mode 100755 system/templates/js/jquery-ui-1.10.4.custom/development-bundle/ui/minified/jquery.ui.position.min.js delete mode 100755 system/templates/js/jquery-ui-1.10.4.custom/development-bundle/ui/minified/jquery.ui.progressbar.min.js delete mode 100755 system/templates/js/jquery-ui-1.10.4.custom/development-bundle/ui/minified/jquery.ui.resizable.min.js delete mode 100755 system/templates/js/jquery-ui-1.10.4.custom/development-bundle/ui/minified/jquery.ui.selectable.min.js delete mode 100755 system/templates/js/jquery-ui-1.10.4.custom/development-bundle/ui/minified/jquery.ui.slider.min.js delete mode 100755 system/templates/js/jquery-ui-1.10.4.custom/development-bundle/ui/minified/jquery.ui.sortable.min.js delete mode 100755 system/templates/js/jquery-ui-1.10.4.custom/development-bundle/ui/minified/jquery.ui.spinner.min.js delete mode 100755 system/templates/js/jquery-ui-1.10.4.custom/development-bundle/ui/minified/jquery.ui.tabs.min.js delete mode 100755 system/templates/js/jquery-ui-1.10.4.custom/development-bundle/ui/minified/jquery.ui.tooltip.min.js delete mode 100755 system/templates/js/jquery-ui-1.10.4.custom/development-bundle/ui/minified/jquery.ui.widget.min.js delete mode 100755 system/templates/js/jquery-ui-1.10.4.custom/index.html delete mode 100755 system/templates/js/jquery-ui-new/index.html delete mode 100755 system/templates/js/livevalidation.js delete mode 100644 system/templates/js/slideout-1.0.1/.gitignore delete mode 100644 system/templates/js/slideout-1.0.1/.jshintrc delete mode 100644 system/templates/js/slideout-1.0.1/.travis.yml delete mode 100644 system/templates/js/slideout-1.0.1/CONTRIBUTING.md delete mode 100644 system/templates/js/slideout-1.0.1/README.md delete mode 100644 system/templates/js/slideout-1.0.1/bower.json delete mode 100644 system/templates/js/slideout-1.0.1/browserify.js delete mode 100644 system/templates/js/slideout-1.0.1/component.json delete mode 100644 system/templates/js/slideout-1.0.1/package.json delete mode 100644 system/templates/js/slideout-1.0.1/test/assets/menu.png delete mode 100644 system/templates/js/slideout-1.0.1/test/index.html delete mode 100644 system/templates/js/slideout-1.0.1/test/index.right.html delete mode 100644 system/templates/js/slideout-1.0.1/test/test.css delete mode 100644 system/templates/js/slideout-1.0.1/test/test.js diff --git a/system/modules/admin/templates/migration/layout-pretext.tpl.php b/system/modules/admin/templates/migration/layout-pretext.tpl.php index c3955d438..c7cc5a8bb 100644 --- a/system/modules/admin/templates/migration/layout-pretext.tpl.php +++ b/system/modules/admin/templates/migration/layout-pretext.tpl.php @@ -34,7 +34,6 @@ $w->enqueueScript(array("name" => "livevalidation.js", "uri" => "/system/templates/js/livevalidation.js", "weight" => 940)); $w->enqueueScript(array("name" => "main.js", "uri" => "/system/templates/js/main.js", "weight" => 995)); $w->enqueueScript(array("name" => "jquery.asmselect.js", "uri" => "/system/templates/js/jquery.asmselect.js", "weight" => 920)); - $w->enqueueScript(array("name" => "boxover.js", "uri" => "/system/templates/js/boxover.js", "weight" => 910)); $w->enqueueScript(array("name" => "ckeditor.js", "uri" => "/system/templates/js/ckeditor/ckeditor.js", "weight" => 900)); $w->enqueueScript(array("name" => "Chart.js", "uri" => "/system/templates/js/chart-js/dist/Chart.min.js", "weight" => 890)); diff --git a/system/templates/js/boxover.js b/system/templates/js/boxover.js deleted file mode 100755 index b9cb869a9..000000000 --- a/system/templates/js/boxover.js +++ /dev/null @@ -1,372 +0,0 @@ -/* --- BoxOver --- -/* --- v 2.1 17th June 2006 -By Oliver Bryant with help of Matthew Tagg -http://boxover.swazz.org */ - -if (typeof document.attachEvent!='undefined') { - window.attachEvent('onload',init); - document.attachEvent('onmousemove',moveMouse); - document.attachEvent('onclick',checkMove); } -else { - window.addEventListener('load',init,false); - document.addEventListener('mousemove',moveMouse,false); - document.addEventListener('click',checkMove,false); -} - -var oDv=document.createElement("div"); -var dvHdr=document.createElement("div"); -var dvBdy=document.createElement("div"); -var windowlock,boxMove,fixposx,fixposy,lockX,lockY,fixx,fixy,ox,oy,boxLeft,boxRight,boxTop,boxBottom,evt,mouseX,mouseY,boxOpen,totalScrollTop,totalScrollLeft; -boxOpen=false; -ox=10; -oy=10; -lockX=0; -lockY=0; - -function init() { - oDv.appendChild(dvHdr); - oDv.appendChild(dvBdy); - oDv.style.position="absolute"; - oDv.style.visibility='hidden'; - document.body.appendChild(oDv); -} - -function defHdrStyle() { - dvHdr.innerHTML='  '+dvHdr.innerHTML; - dvHdr.style.fontWeight='bold'; - dvHdr.style.width='150px'; - dvHdr.style.fontFamily='arial'; - dvHdr.style.border='1px solid #A5CFE9'; - dvHdr.style.padding='3'; - dvHdr.style.fontSize='11'; - dvHdr.style.color='#4B7A98'; - dvHdr.style.background='#D5EBF9'; - dvHdr.style.filter='alpha(opacity=85)'; // IE - dvHdr.style.opacity='0.85'; // FF -} - -function defBdyStyle() { - dvBdy.style.borderBottom='1px solid #A5CFE9'; - dvBdy.style.borderLeft='1px solid #A5CFE9'; - dvBdy.style.borderRight='1px solid #A5CFE9'; - dvBdy.style.width='150px'; - dvBdy.style.fontFamily='arial'; - dvBdy.style.fontSize='11'; - dvBdy.style.padding='3'; - dvBdy.style.color='#1B4966'; - dvBdy.style.background='#FFFFFF'; - dvBdy.style.filter='alpha(opacity=85)'; // IE - dvBdy.style.opacity='0.85'; // FF -} - -function checkElemBO(txt) { -if (!txt || typeof(txt) != 'string') return false; -if ((txt.indexOf('header')>-1)&&(txt.indexOf('body')>-1)&&(txt.indexOf('[')>-1)&&(txt.indexOf('[')>-1)) - return true; -else - return false; -} - -function scanBO(curNode) { - if (checkElemBO(curNode.title)) { - curNode.boHDR=getParam('header',curNode.title); - curNode.boBDY=getParam('body',curNode.title); - curNode.boCSSBDY=getParam('cssbody',curNode.title); - curNode.boCSSHDR=getParam('cssheader',curNode.title); - curNode.IEbugfix=(getParam('hideselects',curNode.title)=='on')?true:false; - curNode.fixX=parseInt(getParam('fixedrelx',curNode.title)); - curNode.fixY=parseInt(getParam('fixedrely',curNode.title)); - curNode.absX=parseInt(getParam('fixedabsx',curNode.title)); - curNode.absY=parseInt(getParam('fixedabsy',curNode.title)); - curNode.offY=(getParam('offsety',curNode.title)!='')?parseInt(getParam('offsety',curNode.title)):10; - curNode.offX=(getParam('offsetx',curNode.title)!='')?parseInt(getParam('offsetx',curNode.title)):10; - curNode.fade=(getParam('fade',curNode.title)=='on')?true:false; - curNode.fadespeed=(getParam('fadespeed',curNode.title)!='')?getParam('fadespeed',curNode.title):0.04; - curNode.delay=(getParam('delay',curNode.title)!='')?parseInt(getParam('delay',curNode.title)):0; - if (getParam('requireclick',curNode.title)=='on') { - curNode.requireclick=true; - document.all?curNode.attachEvent('onclick',showHideBox):curNode.addEventListener('click',showHideBox,false); - document.all?curNode.attachEvent('onmouseover',hideBox):curNode.addEventListener('mouseover',hideBox,false); - } - else {// Note : if requireclick is on the stop clicks are ignored - if (getParam('doubleclickstop',curNode.title)!='off') { - document.all?curNode.attachEvent('ondblclick',pauseBox):curNode.addEventListener('dblclick',pauseBox,false); - } - if (getParam('singleclickstop',curNode.title)=='on') { - document.all?curNode.attachEvent('onclick',pauseBox):curNode.addEventListener('click',pauseBox,false); - } - } - curNode.windowLock=getParam('windowlock',curNode.title).toLowerCase()=='off'?false:true; - curNode.title=''; - curNode.hasbox=1; - } - else - curNode.hasbox=2; -} - - -function getParam(param,list) { - var reg = new RegExp('([^a-zA-Z]' + param + '|^' + param + ')\\s*=\\s*\\[\\s*(((\\[\\[)|(\\]\\])|([^\\]\\[]))*)\\s*\\]'); - var res = reg.exec(list); - var returnvar; - if(res) - return res[2].replace('[[','[').replace(']]',']'); - else - return ''; -} - -function Left(elem){ - var x=0; - if (elem.calcLeft) - return elem.calcLeft; - var oElem=elem; - while(elem){ - if ((elem.currentStyle)&& (!isNaN(parseInt(elem.currentStyle.borderLeftWidth)))&&(x!=0)) - x+=parseInt(elem.currentStyle.borderLeftWidth); - x+=elem.offsetLeft; - elem=elem.offsetParent; - } - oElem.calcLeft=x; - return x; - } - -function Top(elem){ - var x=0; - if (elem.calcTop) - return elem.calcTop; - var oElem=elem; - while(elem){ - if ((elem.currentStyle)&& (!isNaN(parseInt(elem.currentStyle.borderTopWidth)))&&(x!=0)) - x+=parseInt(elem.currentStyle.borderTopWidth); - x+=elem.offsetTop; - elem=elem.offsetParent; - } - oElem.calcTop=x; - return x; - -} - -var ah,ab; -function applyStyles() { - if(ab) - oDv.removeChild(dvBdy); - if (ah) - oDv.removeChild(dvHdr); - dvHdr=document.createElement("div"); - dvBdy=document.createElement("div"); - CBE.boCSSBDY?dvBdy.className=CBE.boCSSBDY:defBdyStyle(); - CBE.boCSSHDR?dvHdr.className=CBE.boCSSHDR:defHdrStyle(); - dvHdr.innerHTML=CBE.boHDR; - dvBdy.innerHTML=CBE.boBDY; - ah=false; - ab=false; - if (CBE.boHDR!='') { - oDv.appendChild(dvHdr); - ah=true; - } - if (CBE.boBDY!=''){ - oDv.appendChild(dvBdy); - ab=true; - } -} - -var CSE,iterElem,LSE,CBE,LBE, totalScrollLeft, totalScrollTop, width, height ; -var ini=false; - -// Customised function for inner window dimension -function SHW() { - if (document.body && (document.body.clientWidth !=0)) { - width=document.body.clientWidth; - height=document.body.clientHeight; - } - if (document.documentElement && (document.documentElement.clientWidth!=0) && (document.body.clientWidth + 20 >= document.documentElement.clientWidth)) { - width=document.documentElement.clientWidth; - height=document.documentElement.clientHeight; - } - return [width,height]; -} - - -var ID=null; -function moveMouse(e) { - //boxMove=true; - e?evt=e:evt=event; - - CSE=evt.target?evt.target:evt.srcElement; - - if (!CSE.hasbox) { - // Note we need to scan up DOM here, some elements like TR don't get triggered as srcElement - iElem=CSE; - while ((iElem.parentNode) && (!iElem.hasbox)) { - scanBO(iElem); - iElem=iElem.parentNode; - } - } - - if ((CSE!=LSE)&&(!isChild(CSE,dvHdr))&&(!isChild(CSE,dvBdy))){ - if (!CSE.boxItem) { - iterElem=CSE; - while ((iterElem.hasbox==2)&&(iterElem.parentNode)) - iterElem=iterElem.parentNode; - CSE.boxItem=iterElem; - } - iterElem=CSE.boxItem; - if (CSE.boxItem&&(CSE.boxItem.hasbox==1)) { - LBE=CBE; - CBE=iterElem; - if (CBE!=LBE) { - applyStyles(); - if (!CBE.requireclick) - if (CBE.fade) { - if (ID!=null) - clearTimeout(ID); - ID=setTimeout("fadeIn("+CBE.fadespeed+")",CBE.delay); - } - else { - if (ID!=null) - clearTimeout(ID); - COL=1; - ID=setTimeout("oDv.style.visibility='visible';ID=null;",CBE.delay); - } - if (CBE.IEbugfix) {hideSelects();} - fixposx=!isNaN(CBE.fixX)?Left(CBE)+CBE.fixX:CBE.absX; - fixposy=!isNaN(CBE.fixY)?Top(CBE)+CBE.fixY:CBE.absY; - lockX=0; - lockY=0; - boxMove=true; - ox=CBE.offX?CBE.offX:10; - oy=CBE.offY?CBE.offY:10; - } - } - else if (!isChild(CSE,dvHdr) && !isChild(CSE,dvBdy) && (boxMove)) { - // The conditional here fixes flickering between tables cells. - if ((!isChild(CBE,CSE)) || (CSE.tagName!='TABLE')) { - CBE=null; - if (ID!=null) - clearTimeout(ID); - fadeOut(); - showSelects(); - } - } - LSE=CSE; - } - else if (((isChild(CSE,dvHdr) || isChild(CSE,dvBdy))&&(boxMove))) { - totalScrollLeft=0; - totalScrollTop=0; - - iterElem=CSE; - while(iterElem) { - if(!isNaN(parseInt(iterElem.scrollTop))) - totalScrollTop+=parseInt(iterElem.scrollTop); - if(!isNaN(parseInt(iterElem.scrollLeft))) - totalScrollLeft+=parseInt(iterElem.scrollLeft); - iterElem=iterElem.parentNode; - } - if (CBE!=null) { - boxLeft=Left(CBE)-totalScrollLeft; - boxRight=parseInt(Left(CBE)+CBE.offsetWidth)-totalScrollLeft; - boxTop=Top(CBE)-totalScrollTop; - boxBottom=parseInt(Top(CBE)+CBE.offsetHeight)-totalScrollTop; - doCheck(); - } - } - - if (boxMove&&CBE) { - // This added to alleviate bug in IE6 w.r.t DOCTYPE - bodyScrollTop=document.documentElement&&document.documentElement.scrollTop?document.documentElement.scrollTop:document.body.scrollTop; - bodyScrollLet=document.documentElement&&document.documentElement.scrollLeft?document.documentElement.scrollLeft:document.body.scrollLeft; - mouseX=evt.pageX?evt.pageX-bodyScrollLet:evt.clientX-document.body.clientLeft; - mouseY=evt.pageY?evt.pageY-bodyScrollTop:evt.clientY-document.body.clientTop; - if ((CBE)&&(CBE.windowLock)) { - mouseY < -oy?lockY=-mouseY-oy:lockY=0; - mouseX < -ox?lockX=-mouseX-ox:lockX=0; - mouseY > (SHW()[1]-oDv.offsetHeight-oy)?lockY=-mouseY+SHW()[1]-oDv.offsetHeight-oy:lockY=lockY; - mouseX > (SHW()[0]-dvBdy.offsetWidth-ox)?lockX=-mouseX-ox+SHW()[0]-dvBdy.offsetWidth:lockX=lockX; - } - oDv.style.left=((fixposx)||(fixposx==0))?fixposx:bodyScrollLet+mouseX+ox+lockX+"px"; - oDv.style.top=((fixposy)||(fixposy==0))?fixposy:bodyScrollTop+mouseY+oy+lockY+"px"; - - } -} - -function doCheck() { - if ( (mouseX < boxLeft) || (mouseX >boxRight) || (mouseY < boxTop) || (mouseY > boxBottom)) { - if (!CBE.requireclick) - fadeOut(); - if (CBE.IEbugfix) {showSelects();} - CBE=null; - } -} - -function pauseBox(e) { - e?evt=e:evt=event; - boxMove=false; - evt.cancelBubble=true; -} - -function showHideBox(e) { - oDv.style.visibility=(oDv.style.visibility!='visible')?'visible':'hidden'; -} - -function hideBox(e) { - oDv.style.visibility='hidden'; -} - -var COL=0; -var stopfade=false; -function fadeIn(fs) { - ID=null; - COL=0; - oDv.style.visibility='visible'; - fadeIn2(fs); -} - -function fadeIn2(fs) { - COL=COL+fs; - COL=(COL>1)?1:COL; - oDv.style.filter='alpha(opacity='+parseInt(100*COL)+')'; - oDv.style.opacity=COL; - if (COL<1) - setTimeout("fadeIn2("+fs+")",20); -} - - -function fadeOut() { - oDv.style.visibility='hidden'; - -} - -function isChild(s,d) { - while(s) { - if (s==d) - return true; - s=s.parentNode; - } - return false; -} - -var cSrc; -function checkMove(e) { - e?evt=e:evt=event; - cSrc=evt.target?evt.target:evt.srcElement; - if ((!boxMove)&&(!isChild(cSrc,oDv))) { - fadeOut(); - if (CBE&&CBE.IEbugfix) {showSelects();} - boxMove=true; - CBE=null; - } -} - -function showSelects(){ - var elements = document.getElementsByTagName("select"); - for (i=0;i< elements.length;i++){ - elements[i].style.visibility='visible'; - } -} - -function hideSelects(){ - var elements = document.getElementsByTagName("select"); - for (i=0;i< elements.length;i++){ - elements[i].style.visibility='hidden'; - } -} \ No newline at end of file diff --git a/system/templates/js/chart-js/.codeclimate.yml b/system/templates/js/chart-js/.codeclimate.yml deleted file mode 100644 index ee3a5fdac..000000000 --- a/system/templates/js/chart-js/.codeclimate.yml +++ /dev/null @@ -1,19 +0,0 @@ -engines: - duplication: - enabled: true - config: - languages: - - javascript - eslint: - enabled: true - channel: "eslint-3" - fixme: - enabled: true -ratings: - paths: - - "src/**/*.js" -exclude_paths: -- dist/**/* -- node_modules/**/* -- test/**/* -- coverage/**/* diff --git a/system/templates/js/chart-js/.editorconfig b/system/templates/js/chart-js/.editorconfig deleted file mode 100644 index 4e0d877ef..000000000 --- a/system/templates/js/chart-js/.editorconfig +++ /dev/null @@ -1,10 +0,0 @@ -# http://editorconfig.org -root = true - -[*] -indent_style = tab -indent_size = 4 -end_of_line = lf -charset = utf-8 -trim_trailing_whitespace = true -insert_final_newline = false diff --git a/system/templates/js/chart-js/.eslintignore b/system/templates/js/chart-js/.eslintignore deleted file mode 100644 index 96212a359..000000000 --- a/system/templates/js/chart-js/.eslintignore +++ /dev/null @@ -1 +0,0 @@ -**/*{.,-}min.js diff --git a/system/templates/js/chart-js/.eslintrc b/system/templates/js/chart-js/.eslintrc deleted file mode 100644 index 7acbf600a..000000000 --- a/system/templates/js/chart-js/.eslintrc +++ /dev/null @@ -1,224 +0,0 @@ -ecmaFeatures: - modules: true - jsx: true - -env: - amd: true - browser: true - es6: true - jquery: true - node: true - -# http://eslint.org/docs/rules/ -rules: - # Possible Errors - no-cond-assign: 2 - no-console: [2, {allow: [warn, error]}] - no-constant-condition: 2 - no-control-regex: 2 - no-debugger: 2 - no-dupe-args: 2 - no-dupe-keys: 2 - no-duplicate-case: 2 - no-empty: 2 - no-empty-character-class: 2 - no-ex-assign: 2 - no-extra-boolean-cast: 2 - no-extra-parens: [2, functions] - no-extra-semi: 2 - no-func-assign: 2 - no-inner-declarations: [2, functions] - no-invalid-regexp: 2 - no-irregular-whitespace: 2 - no-negated-in-lhs: 2 - no-obj-calls: 2 - no-regex-spaces: 2 - no-sparse-arrays: 2 - no-unexpected-multiline: 2 - no-unreachable: 2 - use-isnan: 2 - valid-jsdoc: 0 - valid-typeof: 2 - - # Best Practices - accessor-pairs: 2 - array-callback-return: 0 - block-scoped-var: 0 - complexity: [2, 6] - consistent-return: 0 - curly: [2, all] - default-case: 2 - dot-location: 0 - dot-notation: 2 - eqeqeq: 2 - guard-for-in: 2 - no-alert: 2 - no-caller: 2 - no-case-declarations: 2 - no-div-regex: 2 - no-else-return: 2 - no-empty-pattern: 2 - no-eq-null: 2 - no-eval: 2 - no-extend-native: 2 - no-extra-bind: 2 - no-fallthrough: 2 - no-floating-decimal: 2 - no-implicit-coercion: 0 - no-implied-eval: 2 - no-invalid-this: 0 - no-iterator: 2 - no-labels: 2 - no-lone-blocks: 2 - no-loop-func: 2 - no-magic-number: 0 - no-multi-spaces: 2 - no-multi-str: 2 - no-native-reassign: 2 - no-new-func: 2 - no-new-wrappers: 2 - no-new: 2 - no-octal-escape: 2 - no-octal: 2 - no-proto: 2 - no-redeclare: 2 - no-return-assign: 2 - no-script-url: 2 - no-self-compare: 2 - no-sequences: 2 - no-throw-literal: 0 - no-unused-expressions: 2 - no-useless-call: 2 - no-useless-concat: 2 - no-void: 2 - no-warning-comments: 0 - no-with: 2 - radix: 2 - vars-on-top: 0 - wrap-iife: 2 - yoda: [1, never] - - # Strict - strict: 0 - - # Variables - init-declarations: 0 - no-catch-shadow: 2 - no-delete-var: 2 - no-label-var: 2 - no-shadow-restricted-names: 2 - no-shadow: 2 - no-undef-init: 2 - no-undef: 2 - no-undefined: 0 - no-unused-vars: 2 - no-use-before-define: 2 - - # Node.js and CommonJS - callback-return: 2 - global-require: 2 - handle-callback-err: 2 - no-mixed-requires: 0 - no-new-require: 0 - no-path-concat: 2 - no-process-exit: 2 - no-restricted-modules: 0 - no-sync: 0 - - # Stylistic Issues - array-bracket-spacing: [2, never] - block-spacing: 0 - brace-style: [2, 1tbs] - camelcase: 2 - comma-dangle: [2, only-multiline] - comma-spacing: 2 - comma-style: [2, last] - computed-property-spacing: [2, never] - consistent-this: [2, me] - eol-last: 2 - func-call-spacing: 0 - func-names: [2, never] - func-style: 0 - id-length: 0 - id-match: 0 - indent: [2, tab] - jsx-quotes: 0 - key-spacing: 2 - keyword-spacing: 2 - linebreak-style: 0 - lines-around-comment: 0 - max-depth: 0 - max-len: 0 - max-lines: 0 - max-nested-callbacks: 0 - max-params: 0 - max-statements-per-line: 0 - max-statements: [2, 30] - multiline-ternary: 0 - new-cap: 0 - new-parens: 2 - newline-after-var: 0 - newline-before-return: 0 - newline-per-chained-call: 0 - no-array-constructor: 0 - no-bitwise: 0 - no-continue: 0 - no-inline-comments: 0 - no-lonely-if: 2 - no-mixed-operators: 0 - no-mixed-spaces-and-tabs: 2 - no-multiple-empty-lines: [2, {max: 2}] - no-negated-condition: 0 - no-nested-ternary: 0 - no-new-object: 0 - no-plusplus: 0 - no-restricted-syntax: 0 - no-spaced-func: 0 - no-ternary: 0 - no-trailing-spaces: 2 - no-underscore-dangle: 0 - no-unneeded-ternary: 0 - no-whitespace-before-property: 2 - object-curly-newline: 0 - object-curly-spacing: [2, never] - object-property-newline: 0 - one-var-declaration-per-line: 2 - one-var: 0 - operator-assignment: 0 - operator-linebreak: 0 - padded-blocks: 0 - quote-props: [2, as-needed] - quotes: [2, single, {avoidEscape: true}] - require-jsdoc: 0 - semi-spacing: 2 - semi: [2, always] - sort-keys: 0 - sort-vars: 0 - space-before-blocks: [2, always] - space-before-function-paren: [2, never] - space-in-parens: [2, never] - space-infix-ops: 0 - space-unary-ops: 0 - spaced-comment: [2, always] - unicode-bom: 0 - wrap-regex: 2 - - # ECMAScript 6 - arrow-body-style: 0 - arrow-parens: 0 - arrow-spacing: 0 - constructor-super: 0 - generator-star-spacing: 0 - no-arrow-condition: 0 - no-class-assign: 0 - no-const-assign: 0 - no-dupe-class-members: 0 - no-this-before-super: 0 - no-var: 0 - object-shorthand: 0 - prefer-arrow-callback: 0 - prefer-const: 0 - prefer-reflect: 0 - prefer-spread: 0 - prefer-template: 0 - require-yield: 0 diff --git a/system/templates/js/chart-js/.github/ISSUE_TEMPLATE.md b/system/templates/js/chart-js/.github/ISSUE_TEMPLATE.md deleted file mode 100644 index 7d57bbd0c..000000000 --- a/system/templates/js/chart-js/.github/ISSUE_TEMPLATE.md +++ /dev/null @@ -1,40 +0,0 @@ - - - - -## Expected Behavior - - - -## Current Behavior - - - -## Possible Solution - - - -## Steps to Reproduce (for bugs) - - -1. -2. -3. -4. - -## Context - - - -## Environment - -* Chart.js version: -* Browser name and version: -* Link to your project: diff --git a/system/templates/js/chart-js/.github/PULL_REQUEST_TEMPLATE.md b/system/templates/js/chart-js/.github/PULL_REQUEST_TEMPLATE.md deleted file mode 100644 index b57d497ec..000000000 --- a/system/templates/js/chart-js/.github/PULL_REQUEST_TEMPLATE.md +++ /dev/null @@ -1,9 +0,0 @@ -Please consider the following before submitting a pull request: - -Guidelines for contributing: https://github.com/chartjs/Chart.js/blob/master/CONTRIBUTING.md - -Example of changes on an interactive website such as the following: -- http://jsbin.com/ -- http://jsfiddle.net/ -- http://codepen.io/pen/ -- Premade template: http://codepen.io/pen?template=JXVYzq \ No newline at end of file diff --git a/system/templates/js/chart-js/.gitignore b/system/templates/js/chart-js/.gitignore deleted file mode 100644 index 172413437..000000000 --- a/system/templates/js/chart-js/.gitignore +++ /dev/null @@ -1,12 +0,0 @@ -/coverage -/custom -/dist -/docs/index.md -/node_modules - -.DS_Store -.idea -.vscode -bower.json - -*.swp diff --git a/system/templates/js/chart-js/.npmignore b/system/templates/js/chart-js/.npmignore deleted file mode 100644 index 47b4948ed..000000000 --- a/system/templates/js/chart-js/.npmignore +++ /dev/null @@ -1,13 +0,0 @@ -/.git -/.github -/coverage -/custom -/dist/*.zip -/docs/index.md -/node_modules - -.codeclimate.yml -.DS_Store -.gitignore -.idea -.travis.yml diff --git a/system/templates/js/chart-js/.travis.yml b/system/templates/js/chart-js/.travis.yml deleted file mode 100644 index 2df4a4cd7..000000000 --- a/system/templates/js/chart-js/.travis.yml +++ /dev/null @@ -1,61 +0,0 @@ -language: node_js -node_js: - - "5.10" - -before_install: - - "export CHROME_BIN=/usr/bin/google-chrome" - - "export DISPLAY=:99.0" - - "sh -e /etc/init.d/xvfb start" - -before_script: - - npm install - -script: - - gulp build - - gulp test - - gulp coverage - - gulp package - - gulp bower - - cat ./coverage/lcov.info | ./node_modules/.bin/coveralls - -notifications: - slack: chartjs:pcfCZR6ugg5TEcaLtmIfQYuA - -sudo: required -dist: trusty - -addons: - firefox: latest - apt: - sources: - - google-chrome - packages: - - google-chrome-stable - -deploy: -# Creates a tag containing dist files and bower.json -# Requires GITHUB_AUTH_TOKEN and GITHUB_AUTH_EMAIL environment variables -# IMPORTANT: the script has to be set executable in the Git repository (error 127) -# https://github.com/travis-ci/travis-ci/issues/5538#issuecomment-225025939 -- provider: script - script: ./scripts/release.sh - skip_cleanup: true - on: - branch: release -- provider: releases - api_key: $GITHUB_AUTH_TOKEN - file: - - "./dist/Chart.bundle.js" - - "./dist/Chart.bundle.min.js" - - "./dist/Chart.js" - - "./dist/Chart.min.js" - - "./dist/Chart.js.zip" - skip_cleanup: true - on: - tags: true -- provider: npm - email: $NPM_AUTH_EMAIL - api_key: $NPM_AUTH_TOKEN - skip_cleanup: true - on: - tags: true diff --git a/system/templates/js/chart-js/CONTRIBUTING.md b/system/templates/js/chart-js/CONTRIBUTING.md deleted file mode 100644 index 6ec102439..000000000 --- a/system/templates/js/chart-js/CONTRIBUTING.md +++ /dev/null @@ -1,64 +0,0 @@ -Contributing to Chart.js -======================== - -Contributions to Chart.js are welcome and encouraged, but please have a look through the guidelines in this document before raising an issue, or writing code for the project. - - -Using issues ------------- - -The [issue tracker](https://github.com/chartjs/Chart.js/issues) is the preferred channel for reporting bugs, requesting new features and submitting pull requests. - -If you're suggesting a new chart type, please take a look at [writing new chart types](https://github.com/chartjs/Chart.js/blob/master/docs/09-Advanced.md#writing-new-chart-types) in the documentation or consider [creating a plugin](https://github.com/chartjs/Chart.js/blob/master/docs/09-Advanced.md#creating-plugins). - -To keep the library lightweight for everyone, it's unlikely we'll add many more chart types to the core of Chart.js, but issues are a good medium to design and spec out how new chart types could work and look. - -Please do not use issues for support requests. For help using Chart.js, please take a look at the [`chartjs`](http://stackoverflow.com/questions/tagged/chartjs) tag on Stack Overflow. - - -Reporting bugs --------------- - -Well structured, detailed bug reports are hugely valuable for the project. - -Guidelines for reporting bugs: - - - Check the issue search to see if it has already been reported - - Isolate the problem to a simple test case - - Please include a demonstration of the bug on a website such as [JS Bin](http://jsbin.com/), [JS Fiddle](http://jsfiddle.net/), or [Codepen](http://codepen.io/pen/). ([Template](http://codepen.io/pen?template=JXVYzq)) - -Please provide any additional details associated with the bug, if it's browser or screen density specific, or only happens with a certain configuration or data. - - -Local development ------------------ - -Run `npm install` to install all the libraries, then run `gulp dev --test` to build and run tests as you make changes. - - -Pull requests -------------- - -Clear, concise pull requests are excellent at continuing the project's community driven growth. But please review [these guidelines](https://github.com/blog/1943-how-to-write-the-perfect-pull-request) and the guidelines below before starting work on the project. - -Be advised that **Chart.js 1.0.2 is in feature-complete status**. Pull requests adding new features to the 1.x branch will be disregarded. - -Guidelines: - - - Please create an issue first and/or talk with a team member: - - For bugs, we can discuss the fixing approach - - For enhancements, we can discuss if it is within the project scope and avoid duplicate effort - - Please make changes to the files in [`/src`](https://github.com/chartjs/Chart.js/tree/master/src), not `Chart.js` or `Chart.min.js` in the repo root directory, this avoids merge conflicts - - Tabs for indentation, not spaces please - - If adding new functionality, please also update the relevant `.md` file in [`/docs`](https://github.com/chartjs/Chart.js/tree/master/docs) - - Please make your commits in logical sections with clear commit messages - -Joining the project -------------- - - Active committers and contributors are invited to introduce yourself and request commit access to this project. Please send an email to hello@nickdownie.com or file an issue. - - We have a very active Slack community that you can join [here](https://chart-js-automation.herokuapp.com/). If you think you can help, we'd love to have you! - -License -------- - -By contributing your code, you agree to license your contribution under the [MIT license](https://github.com/chartjs/Chart.js/blob/master/LICENSE.md). diff --git a/system/templates/js/chart-js/MAINTAINING.md b/system/templates/js/chart-js/MAINTAINING.md deleted file mode 100644 index 5e34f433c..000000000 --- a/system/templates/js/chart-js/MAINTAINING.md +++ /dev/null @@ -1,36 +0,0 @@ -# Maintaining -## Release Process -Chart.js relies on [Travis CI](https://travis-ci.org/) to automate the library [releases](https://github.com/chartjs/Chart.js/releases). - -### Releasing a New Version - -1. draft release notes on [GitHub](https://github.com/chartjs/Chart.js/releases/new) for the upcoming tag -1. update `master` `package.json` version using [semver](http://semver.org/) semantic -1. merge `master` into the `release` branch -1. follow the build process on [Travis CI](https://travis-ci.org/chartjs/Chart.js) - -> **Note:** if `master` is merged in `release` with a `package.json` version that already exists, the tag -creation fails and the release process is aborted. - -### Automated Tasks -Merging into the `release` branch kicks off the automated release process: - -* build of the `dist/*.js` files -* `bower.json` is generated from `package.json` -* `dist/*.js` and `bower.json` are added to a detached branch -* a tag is created from the `package.json` version -* tag (with dist files) is pushed to GitHub - -Creation of this tag triggers a new build: - -* `Chart.js.zip` package is generated, containing dist files and examples -* `dist/*.js` and `Chart.js.zip` are attached to the GitHub release (downloads) -* a new npm package is published on [npmjs](https://www.npmjs.com/package/chart.js) - -Finally, [cdnjs](https://cdnjs.com/libraries/Chart.js) is automatically updated from the npm release. - -### Further Reading - -* [Travis GitHub releases](https://github.com/chartjs/Chart.js/pull/2555) -* [Bower support and dist/* files](https://github.com/chartjs/Chart.js/issues/3033) -* [cdnjs npm auto update](https://github.com/cdnjs/cdnjs/pull/8401) diff --git a/system/templates/js/chart-js/bower.json b/system/templates/js/chart-js/bower.json deleted file mode 100644 index 8cea44e2e..000000000 --- a/system/templates/js/chart-js/bower.json +++ /dev/null @@ -1,16 +0,0 @@ -{ - "name": "chart.js", - "description": "Simple HTML5 charts using the canvas element.", - "homepage": "http://www.chartjs.org", - "license": "MIT", - "version": "2.5.0", - "main": "./dist/Chart.js", - "ignore": [ - ".github", - ".codeclimate.yml", - ".gitignore", - ".npmignore", - ".travis.yml", - "scripts" - ] -} \ No newline at end of file diff --git a/system/templates/js/chart-js/component.json b/system/templates/js/chart-js/component.json deleted file mode 100755 index 11e11c790..000000000 --- a/system/templates/js/chart-js/component.json +++ /dev/null @@ -1,11 +0,0 @@ -{ - "name": "Chart.js", - "version": "0.2.0", - "description": "Simple HTML5 Charts using the canvas element", - "keywords": ["charts"], - "homepage": "https://github.com/nnnick/Chart.js", - "author": "nnnick", - "main": ["Chart.min.js"], - "dependencies": { - } -} \ No newline at end of file diff --git a/system/templates/js/chart-js/composer.json b/system/templates/js/chart-js/composer.json deleted file mode 100644 index 48d05b8dc..000000000 --- a/system/templates/js/chart-js/composer.json +++ /dev/null @@ -1,26 +0,0 @@ -{ - "name": "nnnick/chartjs", - "type": "library", - "description": "Simple HTML5 charts using the canvas element.", - "keywords": [ - "chart", - "js" - ], - "homepage": "http://www.chartjs.org/", - "license": "MIT", - "authors": [ - { - "name": "NICK DOWNIE", - "email": "hello@nickdownie.com" - } - ], - "require": { - "php": ">=5.3.3" - }, - "minimum-stability": "stable", - "extra": { - "branch-alias": { - "release/2.0": "v2.0-dev" - } - } -} diff --git a/system/templates/js/chart-js/config.jshintrc b/system/templates/js/chart-js/config.jshintrc deleted file mode 100644 index 00b42024f..000000000 --- a/system/templates/js/chart-js/config.jshintrc +++ /dev/null @@ -1,5 +0,0 @@ -{ - "node": true, - "unused": true, - "predef": [ "require", "module" ] -} \ No newline at end of file diff --git a/system/templates/js/chart-js/docs/00-Getting-Started.md b/system/templates/js/chart-js/docs/00-Getting-Started.md deleted file mode 100644 index 81e03c0a9..000000000 --- a/system/templates/js/chart-js/docs/00-Getting-Started.md +++ /dev/null @@ -1,126 +0,0 @@ ---- -title: Getting started -anchor: getting-started ---- - -### Download Chart.js - -You can download the latest version of [Chart.js on GitHub](https://github.com/chartjs/Chart.js/releases/latest) or just use these [Chart.js CDN](https://cdnjs.com/libraries/Chart.js) links. -If you download or clone the repository, you must run `gulp build` to generate the dist files. Chart.js no longer comes with prebuilt release versions, so an alternative option to downloading the repo is **strongly** advised. - -### Installation - -#### npm - -```bash -npm install chart.js --save -``` - -#### bower - -```bash -bower install chart.js --save -``` - -### Selecting the Correct Build - -Chart.js provides two different builds that are available for your use. The `Chart.js` and `Chart.min.js` files include Chart.js and the accompanying color parsing library. If this version is used and you require the use of the time axis, [Moment.js](http://momentjs.com/) will need to be included before Chart.js. - -The `Chart.bundle.js` and `Chart.bundle.min.js` builds include Moment.js in a single file. This version should be used if you require time axes and want a single file to include, select this version. Do not use this build if your application already includes Moment.js. If you do, Moment.js will be included twice, increasing the page load time and potentially introducing version issues. - -### Usage - -To import Chart.js using an old-school script tag: - -```html - - -``` - -To import Chart.js using an awesome module loader: - -```javascript - -// Using CommonJS -var Chart = require('chart.js') -var myChart = new Chart({...}) - -// ES6 -import Chart from 'chart.js' -let myChart = new Chart({...}) - -// Using requirejs -require(['path/to/Chartjs'], function(Chart){ - var myChart = new Chart({...}) -}) - -``` - -### Creating a Chart - -To create a chart, we need to instantiate the `Chart` class. To do this, we need to pass in the node, jQuery instance, or 2d context of the canvas of where we want to draw the chart. Here's an example. - -```html - -``` - -```javascript -// Any of the following formats may be used -var ctx = document.getElementById("myChart"); -var ctx = document.getElementById("myChart").getContext("2d"); -var ctx = $("#myChart"); -var ctx = "myChart"; -``` - -Once you have the element or context, you're ready to instantiate a pre-defined chart-type or create your own! - -The following example instantiates a bar chart showing the number of votes for different colors and the y-axis starting at 0. - -```html - - -``` - -It's that easy to get started using Chart.js! From here you can explore the many options that can help you customise your charts with scales, tooltips, labels, colors, custom actions, and much more. - -There are many examples of Chart.js that are available in the `/samples` folder of `Chart.js.zip` that is attatched to every [release](https://github.com/chartjs/Chart.js/releases). diff --git a/system/templates/js/chart-js/docs/01-Chart-Configuration.md b/system/templates/js/chart-js/docs/01-Chart-Configuration.md deleted file mode 100644 index 865a75583..000000000 --- a/system/templates/js/chart-js/docs/01-Chart-Configuration.md +++ /dev/null @@ -1,518 +0,0 @@ ---- -title: Chart Configuration -anchor: chart-configuration ---- - -Chart.js provides a number of options for changing the behaviour of created charts. These configuration options can be changed on a per chart basis by passing in an options object when creating the chart. Alternatively, the global configuration can be changed which will be used by all charts created after that point. - -### Chart Data - -To display data, the chart must be passed a data object that contains all of the information needed by the chart. The data object can contain the following parameters - -Name | Type | Description ---- | --- | ---- -datasets | Array[object] | Contains data for each dataset. See the documentation for each chart type to determine the valid options that can be attached to the dataset -labels | Array[string] | Optional parameter that is used with the [category axis](#scales-category-scale). -xLabels | Array[string] | Optional parameter that is used with the category axis and is used if the axis is horizontal -yLabels | Array[string] | Optional parameter that is used with the category axis and is used if the axis is vertical - -### Creating a Chart with Options - -To create a chart with configuration options, simply pass an object containing your configuration to the constructor. In the example below, a line chart is created and configured to not be responsive. - -```javascript -var chartInstance = new Chart(ctx, { - type: 'line', - data: data, - options: { - responsive: false - } -}); -``` - -### Global Configuration - -This concept was introduced in Chart.js 1.0 to keep configuration [DRY](https://en.wikipedia.org/wiki/Don%27t_repeat_yourself), and allow for changing options globally across chart types, avoiding the need to specify options for each instance, or the default for a particular chart type. - -Chart.js merges the options object passed to the chart with the global configuration using chart type defaults and scales defaults appropriately. This way you can be as specific as you would like in your individual chart configuration, while still changing the defaults for all chart types where applicable. The global general options are defined in `Chart.defaults.global`. The defaults for each chart type are discussed in the documentation for that chart type. - -The following example would set the hover mode to 'nearest' for all charts where this was not overridden by the chart type defaults or the options passed to the constructor on creation. - -```javascript -Chart.defaults.global.hover.mode = 'nearest'; - -// Hover mode is set to nearest because it was not overridden here -var chartInstanceHoverModeNearest = new Chart(ctx, { - type: 'line', - data: data, -}); - -// This chart would have the hover mode that was passed in -var chartInstanceDifferentHoverMode = new Chart(ctx, { - type: 'line', - data: data, - options: { - hover: { - // Overrides the global setting - mode: 'index' - } - } -}) -``` - -#### Global Font Settings - -There are 4 special global settings that can change all of the fonts on the chart. These options are in `Chart.defaults.global`. - -Name | Type | Default | Description ---- | --- | --- | --- -defaultFontColor | Color | '#666' | Default font color for all text -defaultFontFamily | String | "'Helvetica Neue', 'Helvetica', 'Arial', sans-serif" | Default font family for all text -defaultFontSize | Number | 12 | Default font size (in px) for text. Does not apply to radialLinear scale point labels -defaultFontStyle | String | 'normal' | Default font style. Does not apply to tooltip title or footer. Does not apply to chart title - -### Common Chart Configuration - -The following options are applicable to all charts. The can be set on the [global configuration](#chart-configuration-global-configuration), or they can be passed to the chart constructor. - -Name | Type | Default | Description ---- | --- | --- | --- -responsive | Boolean | true | Resizes the chart canvas when its container does. -responsiveAnimationDuration | Number | 0 | Duration in milliseconds it takes to animate to new size after a resize event. -maintainAspectRatio | Boolean | true | Maintain the original canvas aspect ratio `(width / height)` when resizing -events | Array[String] | `["mousemove", "mouseout", "click", "touchstart", "touchmove", "touchend"]` | Events that the chart should listen to for tooltips and hovering -onClick | Function | null | Called if the event is of type 'mouseup' or 'click'. Called in the context of the chart and passed the event and an array of active elements -legendCallback | Function | ` function (chart) { }` | Function to generate a legend. Receives the chart object to generate a legend from. Default implementation returns an HTML string. -onResize | Function | null | Called when a resize occurs. Gets passed two arguments: the chart instance and the new size. - -### Layout Configuration - -The layout configuration is passed into the `options.layout` namespace. The global options for the chart layout is defined in `Chart.defaults.global.layout`. - -Name | Type | Default | Description ---- | --- | --- | --- -padding | Number or Object | 0 | The padding to add inside the chart. If this value is a number, it is applied to all sides of the chart (left, top, right, bottom). If this value is an object, the `left` property defines the left padding. Similarly the `right`, `top`, and `bottom` properties can also be specified. - - -### Title Configuration - -The title configuration is passed into the `options.title` namespace. The global options for the chart title is defined in `Chart.defaults.global.title`. - -Name | Type | Default | Description ---- | --- | --- | --- -display | Boolean | false | Display the title block -position | String | 'top' | Position of the title. Possible values are 'top', 'left', 'bottom' and 'right'. -fullWidth | Boolean | true | Marks that this box should take the full width of the canvas (pushing down other boxes) -fontSize | Number | 12 | Font size inherited from global configuration -fontFamily | String | "'Helvetica Neue', 'Helvetica', 'Arial', sans-serif" | Font family inherited from global configuration -fontColor | Color | "#666" | Font color inherited from global configuration -fontStyle | String | 'bold' | Font styling of the title. -padding | Number | 10 | Number of pixels to add above and below the title text -text | String | '' | Title text - -#### Example Usage - -The example below would enable a title of 'Custom Chart Title' on the chart that is created. - -```javascript -var chartInstance = new Chart(ctx, { - type: 'line', - data: data, - options: { - title: { - display: true, - text: 'Custom Chart Title' - } - } -}) -``` - -### Legend Configuration - -The legend configuration is passed into the `options.legend` namespace. The global options for the chart legend is defined in `Chart.defaults.global.legend`. - -Name | Type | Default | Description ---- | --- | --- | --- -display | Boolean | true | Is the legend displayed -position | String | 'top' | Position of the legend. Possible values are 'top', 'left', 'bottom' and 'right'. -fullWidth | Boolean | true | Marks that this box should take the full width of the canvas (pushing down other boxes) -onClick | Function | `function(event, legendItem) {}` | A callback that is called when a 'click' event is registered on top of a label item -onHover | Function | `function(event, legendItem) {}` | A callback that is called when a 'mousemove' event is registered on top of a label item -labels |Object|-| See the [Legend Label Configuration](#chart-configuration-legend-label-configuration) section below. -reverse | Boolean | false | Legend will show datasets in reverse order - -#### Legend Label Configuration - -The legend label configuration is nested below the legend configuration using the `labels` key. - -Name | Type | Default | Description ---- | --- | --- | --- -boxWidth | Number | 40 | Width of coloured box -fontSize | Number | 12 | Font size inherited from global configuration -fontStyle | String | "normal" | Font style inherited from global configuration -fontColor | Color | "#666" | Font color inherited from global configuration -fontFamily | String | "'Helvetica Neue', 'Helvetica', 'Arial', sans-serif" | Font family inherited from global configuration -padding | Number | 10 | Padding between rows of colored boxes -generateLabels: | Function | `function(chart) { }` | Generates legend items for each thing in the legend. Default implementation returns the text + styling for the color box. See [Legend Item](#chart-configuration-legend-item-interface) for details. -filter | Function | null | Filters legend items out of the legend. Receives 2 parameters, a [Legend Item](#chart-configuration-legend-item-interface) and the chart data -usePointStyle | Boolean | false | Label style will match corresponding point style (size is based on fontSize, boxWidth is not used in this case). - -#### Legend Item Interface - -Items passed to the legend `onClick` function are the ones returned from `labels.generateLabels`. These items must implement the following interface. - -```javascript -{ - // Label that will be displayed - text: String, - - // Fill style of the legend box - fillStyle: Color, - - // If true, this item represents a hidden dataset. Label will be rendered with a strike-through effect - hidden: Boolean, - - // For box border. See https://developer.mozilla.org/en/docs/Web/API/CanvasRenderingContext2D/lineCap - lineCap: String, - - // For box border. See https://developer.mozilla.org/en-US/docs/Web/API/CanvasRenderingContext2D/setLineDash - lineDash: Array[Number], - - // For box border. See https://developer.mozilla.org/en-US/docs/Web/API/CanvasRenderingContext2D/lineDashOffset - lineDashOffset: Number, - - // For box border. See https://developer.mozilla.org/en-US/docs/Web/API/CanvasRenderingContext2D/lineJoin - lineJoin: String, - - // Width of box border - lineWidth: Number, - - // Stroke style of the legend box - strokeStyle: Color - - // Point style of the legend box (only used if usePointStyle is true) - pointStyle: String -} -``` - -#### Example - -The following example will create a chart with the legend enabled and turn all of the text red in color. - -```javascript -var chartInstance = new Chart(ctx, { - type: 'bar', - data: data, - options: { - legend: { - display: true, - labels: { - fontColor: 'rgb(255, 99, 132)' - } - } -} -}); -``` - -### Tooltip Configuration - -The tooltip configuration is passed into the `options.tooltips` namespace. The global options for the chart tooltips is defined in `Chart.defaults.global.tooltips`. - -Name | Type | Default | Description ---- | --- | --- | --- -enabled | Boolean | true | Are tooltips enabled -custom | Function | null | See [section](#advanced-usage-external-tooltips) below -mode | String | 'nearest' | Sets which elements appear in the tooltip. See [Interaction Modes](#interaction-modes) for details -intersect | Boolean | true | if true, the tooltip mode applies only when the mouse position intersects with an element. If false, the mode will be applied at all times. -position | String | 'average' | The mode for positioning the tooltip. 'average' mode will place the tooltip at the average position of the items displayed in the tooltip. 'nearest' will place the tooltip at the position of the element closest to the event position. New modes can be defined by adding functions to the Chart.Tooltip.positioners map. -itemSort | Function | undefined | Allows sorting of [tooltip items](#chart-configuration-tooltip-item-interface). Must implement at minimum a function that can be passed to [Array.prototype.sort](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/sort). This function can also accept a third parameter that is the data object passed to the chart. -filter | Function | undefined | Allows filtering of [tooltip items](#chart-configuration-tooltip-item-interface). Must implement at minimum a function that can be passed to [Array.prototype.filter](https://developer.mozilla.org/en/docs/Web/JavaScript/Reference/Global_Objects/Array/filter). This function can also accept a second parameter that is the data object passed to the chart. -backgroundColor | Color | 'rgba(0,0,0,0.8)' | Background color of the tooltip -titleFontFamily | String | "'Helvetica Neue', 'Helvetica', 'Arial', sans-serif" | Font family for tooltip title inherited from global font family -titleFontSize | Number | 12 | Font size for tooltip title inherited from global font size -titleFontStyle | String | "bold" | -titleFontColor | Color | "#fff" | Font color for tooltip title -titleSpacing | Number | 2 | Spacing to add to top and bottom of each title line. -titleMarginBottom | Number | 6 | Margin to add on bottom of title section -bodyFontFamily | String | "'Helvetica Neue', 'Helvetica', 'Arial', sans-serif" | Font family for tooltip items inherited from global font family -bodyFontSize | Number | 12 | Font size for tooltip items inherited from global font size -bodyFontStyle | String | "normal" | -bodyFontColor | Color | "#fff" | Font color for tooltip items. -bodySpacing | Number | 2 | Spacing to add to top and bottom of each tooltip item -footerFontFamily | String | "'Helvetica Neue', 'Helvetica', 'Arial', sans-serif" | Font family for tooltip footer inherited from global font family. -footerFontSize | Number | 12 | Font size for tooltip footer inherited from global font size. -footerFontStyle | String | "bold" | Font style for tooltip footer. -footerFontColor | Color | "#fff" | Font color for tooltip footer. -footerSpacing | Number | 2 | Spacing to add to top and bottom of each footer line. -footerMarginTop | Number | 6 | Margin to add before drawing the footer -xPadding | Number | 6 | Padding to add on left and right of tooltip -yPadding | Number | 6 | Padding to add on top and bottom of tooltip -caretSize | Number | 5 | Size, in px, of the tooltip arrow -cornerRadius | Number | 6 | Radius of tooltip corner curves -multiKeyBackground | Color | "#fff" | Color to draw behind the colored boxes when multiple items are in the tooltip -displayColors | Boolean | true | if true, color boxes are shown in the tooltip -callbacks | Object | | See the [callbacks section](#chart-configuration-tooltip-callbacks) below - -#### Tooltip Callbacks - -The tooltip label configuration is nested below the tooltip configuration using the `callbacks` key. The tooltip has the following callbacks for providing text. For all functions, 'this' will be the tooltip object created from the Chart.Tooltip constructor. - -All functions are called with the same arguments: a [tooltip item](#chart-configuration-tooltip-item-interface) and the data object passed to the chart. All functions must return either a string or an array of strings. Arrays of strings are treated as multiple lines of text. - -Callback | Arguments | Description ---- | --- | --- -beforeTitle | `Array[tooltipItem], data` | Text to render before the title -title | `Array[tooltipItem], data` | Text to render as the title -afterTitle | `Array[tooltipItem], data` | Text to render after the title -beforeBody | `Array[tooltipItem], data` | Text to render before the body section -beforeLabel | `tooltipItem, data` | Text to render before an individual label -label | `tooltipItem, data` | Text to render for an individual item in the tooltip -labelColor | `tooltipItem, chartInstance` | Returns the colors to render for the tooltip item. Return as an object containing two parameters: `borderColor` and `backgroundColor`. -afterLabel | `tooltipItem, data` | Text to render after an individual label -afterBody | `Array[tooltipItem], data` | Text to render after the body section -beforeFooter | `Array[tooltipItem], data` | Text to render before the footer section -footer | `Array[tooltipItem], data` | Text to render as the footer -afterFooter | `Array[tooltipItem], data` | Text to render after the footer section -dataPoints | `Array[tooltipItem]` | List of matching point informations. - -#### Tooltip Item Interface - -The tooltip items passed to the tooltip callbacks implement the following interface. - -```javascript -{ - // X Value of the tooltip as a string - xLabel: String, - - // Y value of the tooltip as a string - yLabel: String, - - // Index of the dataset the item comes from - datasetIndex: Number, - - // Index of this data item in the dataset - index: Number, - - // X position of matching point - x: Number, - - // Y position of matching point - y: Number, -} -``` - -### Hover Configuration - -The hover configuration is passed into the `options.hover` namespace. The global hover configuration is at `Chart.defaults.global.hover`. - -Name | Type | Default | Description ---- | --- | --- | --- -mode | String | 'nearest' | Sets which elements appear in the tooltip. See [Interaction Modes](#interaction-modes) for details -intersect | Boolean | true | if true, the hover mode only applies when the mouse position intersects an item on the chart -animationDuration | Number | 400 | Duration in milliseconds it takes to animate hover style changes -onHover | Function | null | Called when any of the events fire. Called in the context of the chart and passed the event and an array of active elements (bars, points, etc) - -### Interaction Modes -When configuring interaction with the graph via hover or tooltips, a number of different modes are available. - -The following table details the modes and how they behave in conjunction with the `intersect` setting - -Mode | Behaviour ---- | --- -point | Finds all of the items that intersect the point -nearest | Gets the item that is nearest to the point. The nearest item is determined based on the distance to the center of the chart item (point, bar). If 2 or more items are at the same distance, the one with the smallest area is used. If `intersect` is true, this is only triggered when the mouse position intersects an item in the graph. This is very useful for combo charts where points are hidden behind bars. -single (deprecated) | Finds the first item that intersects the point and returns it. Behaves like 'nearest' mode with intersect = true. -label (deprecated) | See `'index'` mode -index | Finds item at the same index. If the `intersect` setting is true, the first intersecting item is used to determine the index in the data. If `intersect` false the nearest item is used to determine the index. -x-axis (deprecated) | Behaves like `'index'` mode with `intersect = false` -dataset | Finds items in the same dataset. If the `intersect` setting is true, the first intersecting item is used to determine the index in the data. If `intersect` false the nearest item is used to determine the index. -x | Returns all items that would intersect based on the `X` coordinate of the position only. Would be useful for a vertical cursor implementation. Note that this only applies to cartesian charts -y | Returns all items that would intersect based on the `Y` coordinate of the position. This would be useful for a horizontal cursor implementation. Note that this only applies to cartesian charts. - -### Animation Configuration - -The following animation options are available. The global options for are defined in `Chart.defaults.global.animation`. - -Name | Type | Default | Description ---- |:---:| --- | --- -duration | Number | 1000 | The number of milliseconds an animation takes. -easing | String | "easeOutQuart" | Easing function to use. Available options are: `'linear'`, `'easeInQuad'`, `'easeOutQuad'`, `'easeInOutQuad'`, `'easeInCubic'`, `'easeOutCubic'`, `'easeInOutCubic'`, `'easeInQuart'`, `'easeOutQuart'`, `'easeInOutQuart'`, `'easeInQuint'`, `'easeOutQuint'`, `'easeInOutQuint'`, `'easeInSine'`, `'easeOutSine'`, `'easeInOutSine'`, `'easeInExpo'`, `'easeOutExpo'`, `'easeInOutExpo'`, `'easeInCirc'`, `'easeOutCirc'`, `'easeInOutCirc'`, `'easeInElastic'`, `'easeOutElastic'`, `'easeInOutElastic'`, `'easeInBack'`, `'easeOutBack'`, `'easeInOutBack'`, `'easeInBounce'`, `'easeOutBounce'`, `'easeInOutBounce'`. See [Robert Penner's easing equations](http://robertpenner.com/easing/). -onProgress | Function | none | Callback called on each step of an animation. Passed a single argument, an object, containing the chart instance and an object with details of the animation. -onComplete | Function | none | Callback called at the end of an animation. Passed the same arguments as `onProgress` - -#### Animation Callbacks - -The `onProgress` and `onComplete` callbacks are useful for synchronizing an external draw to the chart animation. The callback is passed an object that implements the following interface. An example usage of these callbacks can be found on [Github](https://github.com/chartjs/Chart.js/blob/master/samples/animation/progress-bar.html). This sample displays a progress bar showing how far along the animation is. - -```javascript -{ - // Chart object - chartInstance, - - // Contains details of the on-going animation - animationObject, -} -``` - -#### Animation Object - -The animation object passed to the callbacks is of type `Chart.Animation`. The object has the following parameters. - -```javascript -{ - // Current Animation frame number - currentStep: Number, - - // Number of animation frames - numSteps: Number, - - // Animation easing to use - easing: String, - - // Function that renders the chart - render: Function, - - // User callback - onAnimationProgress: Function, - - // User callback - onAnimationComplete: Function -} -``` - -### Element Configuration - -The global options for elements are defined in `Chart.defaults.global.elements`. - -Options can be configured for four different types of elements: arc, lines, points, and rectangles. When set, these options apply to all objects of that type unless specifically overridden by the configuration attached to a dataset. - -#### Arc Configuration - -Arcs are used in the polar area, doughnut and pie charts. They can be configured with the following options. The global arc options are stored in `Chart.defaults.global.elements.arc`. - -Name | Type | Default | Description ---- | --- | --- | --- -backgroundColor | Color | 'rgba(0,0,0,0.1)' | Default fill color for arcs. Inherited from the global default -borderColor | Color | '#fff' | Default stroke color for arcs -borderWidth | Number | 2 | Default stroke width for arcs - -#### Line Configuration - -Line elements are used to represent the line in a line chart. The global line options are stored in `Chart.defaults.global.elements.line`. - -Name | Type | Default | Description ---- | --- | --- | --- -tension | Number | 0.4 | Default bezier curve tension. Set to `0` for no bezier curves. -backgroundColor | Color | 'rgba(0,0,0,0.1)' | Default line fill color -borderWidth | Number | 3 | Default line stroke width -borderColor | Color | 'rgba(0,0,0,0.1)' | Default line stroke color -borderCapStyle | String | 'butt' | Default line cap style. See [MDN](https://developer.mozilla.org/en/docs/Web/API/CanvasRenderingContext2D/lineCap) -borderDash | Array | `[]` | Default line dash. See [MDN](https://developer.mozilla.org/en-US/docs/Web/API/CanvasRenderingContext2D/setLineDash) -borderDashOffset | Number | 0.0 | Default line dash offset. See [MDN](https://developer.mozilla.org/en-US/docs/Web/API/CanvasRenderingContext2D/lineDashOffset) -borderJoinStyle | String | 'miter' | Default line join style. See [MDN](https://developer.mozilla.org/en-US/docs/Web/API/CanvasRenderingContext2D/lineJoin) -capBezierPoints | Boolean | true | If true, bezier control points are kept inside the chart. If false, no restriction is enforced. -fill | Boolean or String | true | If true, the fill is assumed to be to zero. String values are 'zero', 'top', and 'bottom' to fill to different locations. If `false`, no fill is added -stepped | Boolean | false | If true, the line is shown as a stepped line and 'tension' will be ignored - -#### Point Configuration - -Point elements are used to represent the points in a line chart or a bubble chart. The global point options are stored in `Chart.defaults.global.elements.point`. - -Name | Type | Default | Description ---- | --- | --- | --- -radius | Number | 3 | Default point radius -pointStyle | String | 'circle' | Default point style -backgroundColor | Color | 'rgba(0,0,0,0.1)' | Default point fill color -borderWidth | Number | 1 | Default point stroke width -borderColor | Color | 'rgba(0,0,0,0.1)' | Default point stroke color -hitRadius | Number | 1 | Extra radius added to point radius for hit detection -hoverRadius | Number | 4 | Default point radius when hovered -hoverBorderWidth | Number | 1 | Default stroke width when hovered - -#### Rectangle Configuration - -Rectangle elements are used to represent the bars in a bar chart. The global rectangle options are stored in `Chart.defaults.global.elements.rectangle`. - -Name | Type | Default | Description ---- | --- | --- | --- -backgroundColor | Color | 'rgba(0,0,0,0.1)' | Default bar fill color -borderWidth | Number | 0 | Default bar stroke width -borderColor | Color | 'rgba(0,0,0,0.1)' | Default bar stroke color -borderSkipped | String | 'bottom' | Default skipped (excluded) border for rectangle. Can be one of `bottom`, `left`, `top`, `right` - -### Colors - -When supplying colors to Chart options, you can use a number of formats. You can specify the color as a string in hexadecimal, RGB, or HSL notations. If a color is needed, but not specified, Chart.js will use the global default color. This color is stored at `Chart.defaults.global.defaultColor`. It is initially set to 'rgba(0, 0, 0, 0.1)'; - -You can also pass a [CanvasGradient](https://developer.mozilla.org/en-US/docs/Web/API/CanvasGradient) object. You will need to create this before passing to the chart, but using it you can achieve some interesting effects. - -### Patterns - -An alternative option is to pass a [CanvasPattern](https://developer.mozilla.org/en-US/docs/Web/API/CanvasPattern) object. For example, if you wanted to fill a dataset with a pattern from an image you could do the following. - -```javascript -var img = new Image(); -img.src = 'https://example.com/my_image.png'; -img.onload = function() { - var ctx = document.getElementById('canvas').getContext('2d'); - var fillPattern = ctx.createPattern(img, 'repeat'); - - var chart = new Chart(ctx, { - data: { - labels: ['Item 1', 'Item 2', 'Item 3'], - datasets: [{ - data: [10, 20, 30], - backgroundColor: fillPattern - }] - } - }) -} -``` - -Using pattern fills for data graphics can help viewers with vision deficiencies (e.g. color-blindness or partial sight) to [more easily understand your data](http://betweentwobrackets.com/data-graphics-and-colour-vision/). - -Using the [Patternomaly](https://github.com/ashiguruma/patternomaly) library you can generate patterns to fill datasets. - -```javascript -var chartData = { - datasets: [{ - data: [45, 25, 20, 10], - backgroundColor: [ - pattern.draw('square', '#ff6384'), - pattern.draw('circle', '#36a2eb'), - pattern.draw('diamond', '#cc65fe'), - pattern.draw('triangle', '#ffce56'), - ] - }], - labels: ['Red', 'Blue', 'Purple', 'Yellow'] -}; -``` - -### Mixed Chart Types - -When creating a chart, you have the option to overlay different chart types on top of each other as separate datasets. - -To do this, you must set a `type` for each dataset individually. You can create mixed chart types with bar and line chart types. - -When creating the chart you must set the overall `type` as `bar`. - -```javascript -var myChart = new Chart(ctx, { - type: 'bar', - data: { - labels: ['Item 1', 'Item 2', 'Item 3'], - datasets: [ - { - type: 'bar', - label: 'Bar Component', - data: [10, 20, 30], - }, - { - type: 'line', - label: 'Line Component', - data: [30, 20, 10], - } - ] - } -}); -``` diff --git a/system/templates/js/chart-js/docs/02-Scales.md b/system/templates/js/chart-js/docs/02-Scales.md deleted file mode 100644 index af7812ce0..000000000 --- a/system/templates/js/chart-js/docs/02-Scales.md +++ /dev/null @@ -1,369 +0,0 @@ ---- -title: Scales -anchor: scales ---- - -Scales in v2.0 of Chart.js are significantly more powerful, but also different than those of v1.0. -* Multiple X & Y axes are supported. -* A built-in label auto-skip feature detects would-be overlapping ticks and labels and removes every nth label to keep things displaying normally. -* Scale titles are supported -* New scale types can be extended without writing an entirely new chart type - - -### Common Configuration - -Every scale extends a core scale class with the following options: - -Name | Type | Default | Description ---- | --- | --- | --- -type | String | Chart specific. | Type of scale being employed. Custom scales can be created and registered with a string key. Options: ["category"](#scales-category-scale), ["linear"](#scales-linear-scale), ["logarithmic"](#scales-logarithmic-scale), ["time"](#scales-time-scale), ["radialLinear"](#scales-radial-linear-scale) -display | Boolean | true | If true, show the scale including gridlines, ticks, and labels. Overrides *gridLines.display*, *scaleLabel.display*, and *ticks.display*. -position | String | "left" | Position of the scale. Possible values are 'top', 'left', 'bottom' and 'right'. -id | String | | The ID is used to link datasets and scale axes together. The properties `datasets.xAxisID` or `datasets.yAxisID` have to match the scale properties `scales.xAxes.id` or `scales.yAxes.id`. This is especially needed if multi-axes charts are used. -beforeUpdate | Function | undefined | Callback called before the update process starts. Passed a single argument, the scale instance. -beforeSetDimensions | Function | undefined | Callback that runs before dimensions are set. Passed a single argument, the scale instance. -afterSetDimensions | Function | undefined | Callback that runs after dimensions are set. Passed a single argument, the scale instance. -beforeDataLimits | Function | undefined | Callback that runs before data limits are determined. Passed a single argument, the scale instance. -afterDataLimits | Function | undefined | Callback that runs after data limits are determined. Passed a single argument, the scale instance. -beforeBuildTicks | Function | undefined | Callback that runs before ticks are created. Passed a single argument, the scale instance. -afterBuildTicks | Function | undefined | Callback that runs after ticks are created. Useful for filtering ticks. Passed a single argument, the scale instance. -beforeTickToLabelConversion | Function | undefined | Callback that runs before ticks are converted into strings. Passed a single argument, the scale instance. -afterTickToLabelConversion | Function | undefined | Callback that runs after ticks are converted into strings. Passed a single argument, the scale instance. -beforeCalculateTickRotation | Function | undefined | Callback that runs before tick rotation is determined. Passed a single argument, the scale instance. -afterCalculateTickRotation | Function | undefined | Callback that runs after tick rotation is determined. Passed a single argument, the scale instance. -beforeFit | Function | undefined | Callback that runs before the scale fits to the canvas. Passed a single argument, the scale instance. -afterFit | Function | undefined | Callback that runs after the scale fits to the canvas. Passed a single argument, the scale instance. -afterUpdate | Function | undefined | Callback that runs at the end of the update process. Passed a single argument, the scale instance. -**gridLines** | Object | - | See [grid line configuration](#grid-line-configuration) section. -**scaleLabel** | Object | | See [scale title configuration](#scale-title-configuration) section. -**ticks** | Object | | See [tick configuration](#tick-configuration) section. - -#### Grid Line Configuration - -The grid line configuration is nested under the scale configuration in the `gridLines` key. It defines options for the grid lines that run perpendicular to the axis. - -Name | Type | Default | Description ---- | --- | --- | --- -display | Boolean | true | -color | Color or Array[Color] | "rgba(0, 0, 0, 0.1)" | Color of the grid lines. -borderDash | Array[Number] | [] | Length and spacing of dashes. See [MDN](https://developer.mozilla.org/en-US/docs/Web/API/CanvasRenderingContext2D/setLineDash) -borderDashOffset | Number | 0.0 | Offset for line dashes. See [MDN](https://developer.mozilla.org/en-US/docs/Web/API/CanvasRenderingContext2D/lineDashOffset) -lineWidth | Number or Array[Number] | 1 | Stroke width of grid lines -drawBorder | Boolean | true | If true draw border on the edge of the chart -drawOnChartArea | Boolean | true | If true, draw lines on the chart area inside the axis lines. This is useful when there are multiple axes and you need to control which grid lines are drawn -drawTicks | Boolean | true | If true, draw lines beside the ticks in the axis area beside the chart. -tickMarkLength | Number | 10 | Length in pixels that the grid lines will draw into the axis area. -zeroLineWidth | Number | 1 | Stroke width of the grid line for the first index (index 0). -zeroLineColor | Color | "rgba(0, 0, 0, 0.25)" | Stroke color of the grid line for the first index (index 0). -offsetGridLines | Boolean | false | If true, labels are shifted to be between grid lines. This is used in the bar chart. - -#### Scale Title Configuration - -The scale label configuration is nested under the scale configuration in the `scaleLabel` key. It defines options for the scale title. - -Name | Type | Default | Description ---- | --- | --- | --- -display | Boolean | false | -labelString | String | "" | The text for the title. (i.e. "# of People", "Response Choices") -fontColor | Color | "#666" | Font color for the scale title. -fontFamily| String | "'Helvetica Neue', 'Helvetica', 'Arial', sans-serif" | Font family for the scale title, follows CSS font-family options. -fontSize | Number | 12 | Font size for the scale title. -fontStyle | String | "normal" | Font style for the scale title, follows CSS font-style options (i.e. normal, italic, oblique, initial, inherit). - -#### Tick Configuration - -The tick configuration is nested under the scale configuration in the `ticks` key. It defines options for the tick marks that are generated by the axis. - -Name | Type | Default | Description ---- | --- | --- | --- -autoSkip | Boolean | true | If true, automatically calculates how many labels that can be shown and hides labels accordingly. Turn it off to show all labels no matter what -autoSkipPadding | Number | 0 | Padding between the ticks on the horizontal axis when `autoSkip` is enabled. *Note: Only applicable to horizontal scales.* -callback | Function | `function(value) { return helpers.isArray(value) ? value : '' + value; }` | Returns the string representation of the tick value as it should be displayed on the chart. See [callback](#scales-creating-custom-tick-formats) section below. -display | Boolean | true | If true, show the ticks. -fontColor | Color | "#666" | Font color for the tick labels. -fontFamily | String | "'Helvetica Neue', 'Helvetica', 'Arial', sans-serif" | Font family for the tick labels, follows CSS font-family options. -fontSize | Number | 12 | Font size for the tick labels. -fontStyle | String | "normal" | Font style for the tick labels, follows CSS font-style options (i.e. normal, italic, oblique, initial, inherit). -labelOffset | Number | 0 | Distance in pixels to offset the label from the centre point of the tick (in the y direction for the x axis, and the x direction for the y axis). *Note: this can cause labels at the edges to be cropped by the edge of the canvas* -maxRotation | Number | 90 | Maximum rotation for tick labels when rotating to condense labels. Note: Rotation doesn't occur until necessary. *Note: Only applicable to horizontal scales.* -minRotation | Number | 0 | Minimum rotation for tick labels. *Note: Only applicable to horizontal scales.* -mirror | Boolean | false | Flips tick labels around axis, displaying the labels inside the chart instead of outside. *Note: Only applicable to vertical scales.* -padding | Number | 10 | Padding between the tick label and the axis. *Note: Only applicable to horizontal scales.* -reverse | Boolean | false | Reverses order of tick labels. - -#### Creating Custom Tick Formats - -The `callback` method may be used for advanced tick customization. In the following example, every label of the Y axis would be displayed in scientific notation. - -If the callback returns `null` or `undefined` the associated grid line will be hidden. - -```javascript -var chartInstance = new Chart(ctx, { - type: 'line', - data: data, - options: { - scales: { - yAxes: [{ - ticks: { - // Create scientific notation labels - callback: function(value, index, values) { - return value.toExponential(); - } - } - }] - } - } -}); -``` - -### Category Scale - -The category scale will be familiar to those who have used v1.0. Labels are drawn from one of the label arrays included in the chart data. If only `data.labels` is defined, this will be used. If `data.xLabels` is defined and the axis is horizontal, this will be used. Similarly, if `data.yLabels` is defined and the axis is vertical, this property will be used. Using both `xLabels` and `yLabels` together can create a chart that uses strings for both the X and Y axes. - -#### Configuration Options - -The category scale has the following additional options that can be set. - -Name | Type | Default | Description ---- | --- | --- | --- -ticks.min | String | - | The minimum item to display. Must be a value in the `labels` array -ticks.max | String | - | The maximum item to display. Must be a value in the `labels` array - -### Linear Scale - -The linear scale is use to chart numerical data. It can be placed on either the x or y axis. The scatter chart type automatically configures a line chart to use one of these scales for the x axis. As the name suggests, linear interpolation is used to determine where a value lies on the axis. - -#### Configuration Options - -The following options are provided by the linear scale. They are all located in the `ticks` sub options. - -Name | Type | Default | Description ---- | --- | --- | --- -beginAtZero | Boolean | - | if true, scale will include 0 if it is not already included. -min | Number | - | User defined minimum number for the scale, overrides minimum value from data. -max | Number | - | User defined maximum number for the scale, overrides maximum value from data. -maxTicksLimit | Number | 11 | Maximum number of ticks and gridlines to show. If not defined, it will limit to 11 ticks but will show all gridlines. -fixedStepSize | Number | - | User defined fixed step size for the scale. If set, the scale ticks will be enumerated by multiple of stepSize, having one tick per increment. If not set, the ticks are labeled automatically using the nice numbers algorithm. -stepSize | Number | - | if defined, it can be used along with the min and the max to give a custom number of steps. See the example below. -suggestedMax | Number | - | User defined maximum number for the scale, overrides maximum value *except for if* it is lower than the maximum value. -suggestedMin | Number | - | User defined minimum number for the scale, overrides minimum value *except for if* it is higher than the minimum value. - -#### Example Configuration - -The following example creates a line chart with a vertical axis that goes from 0 to 5 in 0.5 sized steps. - -```javascript -var chartInstance = new Chart(ctx, { - type: 'line', - data: data, - options: { - scales: { - yAxes: [{ - ticks: { - max: 5, - min: 0, - stepSize: 0.5 - } - }] - } - } -}); -``` - -### Logarithmic Scale - -The logarithmic scale is use to chart numerical data. It can be placed on either the x or y axis. As the name suggests, logarithmic interpolation is used to determine where a value lies on the axis. - -#### Configuration Options - -The following options are provided by the logarithmic scale. They are all located in the `ticks` sub options. - -Name | Type | Default | Description ---- | --- | --- | --- -min | Number | - | User defined minimum number for the scale, overrides minimum value from data. -max | Number | - | User defined maximum number for the scale, overrides maximum value from data. - -#### Example Configuration - -The following example creates a chart with a logarithmic X axis that ranges from 1 to 1000. - -```javascript -var chartInstance = new Chart(ctx, { - type: 'line', - data: data, - options: { - scales: { - xAxes: [{ - type: 'logarithmic', - position: 'bottom', - ticks: { - min: 1, - max: 1000 - } - }] - } - } -}) -``` - -### Time Scale - -The time scale is used to display times and dates. It can only be placed on the X axis. When building its ticks, it will automatically calculate the most comfortable unit base on the size of the scale. - -#### Configuration Options - -The following options are provided by the time scale. They are all located in the `time` sub options. - -Name | Type | Default | Description ---- | --- | --- | --- -displayFormats | Object | - | See [Display Formats](#scales-display-formats) section below. -isoWeekday | Boolean | false | If true and the unit is set to 'week', iso weekdays will be used. -max | [Time](#scales-date-formats) | - | If defined, this will override the data maximum -min | [Time](#scales-date-formats) | - | If defined, this will override the data minimum -parser | String or Function | - | If defined as a string, it is interpreted as a custom format to be used by moment to parse the date. If this is a function, it must return a moment.js object given the appropriate data value. -round | String | - | If defined, dates will be rounded to the start of this unit. See [Time Units](#scales-time-units) below for the allowed units. -tooltipFormat | String | '' | The moment js format string to use for the tooltip. -unit | String | - | If defined, will force the unit to be a certain type. See [Time Units](#scales-time-units) section below for details. -unitStepSize | Number | 1 | The number of units between grid lines. -minUnit | String | 'millisecond' | The minimum display format to be used for a time unit - -#### Date Formats - -When providing data for the time scale, Chart.js supports all of the formats that Moment.js accepts. See [Moment.js docs](http://momentjs.com/docs/#/parsing/) for details. - -#### Display Formats - -The following display formats are used to configure how different time units are formed into strings for the axis tick marks. See [moment.js](http://momentjs.com/docs/#/displaying/format/) for the allowable format strings. - -Name | Default ---- | --- -millisecond | 'SSS [ms]' -second | 'h:mm:ss a' -minute | 'h:mm:ss a' -hour | 'MMM D, hA' -day | 'll' -week | 'll' -month | 'MMM YYYY' -quarter | '[Q]Q - YYYY' -year | 'YYYY' - -For example, to set the display format for the 'quarter' unit to show the month and year, the following config would be passed to the chart constructor. - -```javascript -var chartInstance = new Chart(ctx, { - type: 'line', - data: data, - options: { - scales: { - xAxes: [{ - type: 'time', - time: { - displayFormats: { - quarter: 'MMM YYYY' - } - } - }] - } - } -}) -``` - -#### Time Units - -The following time measurements are supported. The names can be passed as strings to the `time.unit` config option to force a certain unit. - -* millisecond -* second -* minute -* hour -* day -* week -* month -* quarter -* year - -For example, to create a chart with a time scale that always displayed units per month, the following config could be used. - -```javascript -var chartInstance = new Chart(ctx, { - type: 'line', - data: data, - options: { - scales: { - xAxes: [{ - time: { - unit: 'month' - } - }] - } - } -}) -``` - -### Radial Linear Scale - -The radial linear scale is used specifically for the radar and polar area chart types. It overlays the chart area, rather than being positioned on one of the edges. - -#### Configuration Options - -The following additional configuration options are provided by the radial linear scale. - -Name | Type | Default | Description ---- | --- | --- | --- -lineArc | Boolean | false | If true, circular arcs are used else straight lines are used. The former is used by the polar area chart and the latter by the radar chart -angleLines | Object | - | See the Angle Line Options section below for details. -pointLabels | Object | - | See the Point Label Options section below for details. -ticks | Object | - | See the Ticks table below for options. - -#### Angle Line Options - -The following options are used to configure angled lines that radiate from the center of the chart to the point labels. They can be found in the `angleLines` sub options. Note that these options only apply if `lineArc` is false. - -Name | Type | Default | Description ---- | --- | --- | --- -display | Boolean | true | If true, angle lines are shown. -color | Color | 'rgba(0, 0, 0, 0.1)' | Color of angled lines -lineWidth | Number | 1 | Width of angled lines - -#### Point Label Options - -The following options are used to configure the point labels that are shown on the perimeter of the scale. They can be found in the `pointLabels` sub options. Note that these options only apply if `lineArc` is false. - -Name | Type | Default | Description ---- | --- | --- | --- -callback | Function | - | Callback function to transform data label to axis label -fontColor | Color | '#666' | Font color -fontFamily | String | "'Helvetica Neue', 'Helvetica', 'Arial', sans-serif" | Font family to render -fontSize | Number | 10 | Font size in pixels -fontStyle | String | 'normal' | Font Style to use - - -#### Tick Options - -Name | Type | Default | Description ---- | --- | --- | --- -backdropColor | Color | 'rgba(255, 255, 255, 0.75)' | Color of label backdrops -backdropPaddingX | Number | 2 | Horizontal padding of label backdrop -backdropPaddingY | Number | 2 | Vertical padding of label backdrop -beginAtZero | Boolean | - | if true, scale will include 0 if it is not already included. -min | Number | - | User defined minimum number for the scale, overrides minimum value from data. -max | Number | - | User defined maximum number for the scale, overrides maximum value from data. -maxTicksLimit | Number | 11 | Maximum number of ticks and gridlines to show. If not defined, it will limit to 11 ticks but will show all gridlines. -showLabelBackdrop | Boolean | true | If true, draw a background behind the tick labels -fixedStepSize | Number | - | User defined fixed step size for the scale. If set, the scale ticks will be enumerated by multiple of stepSize, having one tick per increment. If not set, the ticks are labeled automatically using the nice numbers algorithm. -stepSize | Number | - | if defined, it can be used along with the min and the max to give a custom number of steps. See the example below. -suggestedMax | Number | - | User defined maximum number for the scale, overrides maximum value *except for if* it is lower than the maximum value. -suggestedMin | Number | - | User defined minimum number for the scale, overrides minimum value *except for if* it is higher than the minimum value. - -### Update Default Scale config - -The default configuration for a scale can be easily changed using the scale service. Pass in a partial configuration that will be merged with the current scale default configuration. - -For example, to set the minimum value of 0 for all linear scales, you would do the following. Any linear scales created after this time would now have a minimum of 0. -``` -Chart.scaleService.updateScaleDefaults('linear', { - ticks: { - min: 0 - } -}) -``` diff --git a/system/templates/js/chart-js/docs/03-Line-Chart.md b/system/templates/js/chart-js/docs/03-Line-Chart.md deleted file mode 100644 index 24b77cfe6..000000000 --- a/system/templates/js/chart-js/docs/03-Line-Chart.md +++ /dev/null @@ -1,187 +0,0 @@ ---- -title: Line Chart -anchor: line-chart ---- -### Introduction -A line chart is a way of plotting data points on a line. Often, it is used to show trend data, and the comparison of two data sets. - -
- -
- -### Example Usage -```javascript -var myLineChart = new Chart(ctx, { - type: 'line', - data: data, - options: options -}); -``` - -Alternatively a line chart can be created using syntax similar to the v1.0 syntax -```javascript -var myLineChart = Chart.Line(ctx, { - data: data, - options: options -}); -``` - -### Dataset Structure - -The following options can be included in a line chart dataset to configure options for that specific dataset. - -All point* properties can be specified as an array. If these are set to an array value, the first value applies to the first point, the second value to the second point, and so on. - -Property | Type | Usage ---- | --- | --- -data | See [data point](#line-chart-data-points) section | The data to plot in a line -label | `String` | The label for the dataset which appears in the legend and tooltips -xAxisID | `String` | The ID of the x axis to plot this dataset on -yAxisID | `String` | The ID of the y axis to plot this dataset on -fill | `Boolean` | If true, fill the area under the line -cubicInterpolationMode | `String` | Algorithm used to interpolate a smooth curve from the discrete data points. Options are 'default' and 'monotone'. The 'default' algorithm uses a custom weighted cubic interpolation, which produces pleasant curves for all types of datasets. The 'monotone' algorithm is more suited to `y = f(x)` datasets : it preserves monotonicity (or piecewise monotonicity) of the dataset being interpolated, and ensures local extremums (if any) stay at input data points. If left untouched (`undefined`), the global `options.elements.line.cubicInterpolationMode` property is used. -lineTension | `Number` | Bezier curve tension of the line. Set to 0 to draw straightlines. This option is ignored if monotone cubic interpolation is used. *Note* This was renamed from 'tension' but the old name still works. -backgroundColor | `Color` | The fill color under the line. See [Colors](#chart-configuration-colors) -borderWidth | `Number` | The width of the line in pixels -borderColor | `Color` | The color of the line. -borderCapStyle | `String` | Cap style of the line. See [MDN](https://developer.mozilla.org/en-US/docs/Web/API/CanvasRenderingContext2D/lineCap) -borderDash | `Array` | Length and spacing of dashes. See [MDN](https://developer.mozilla.org/en-US/docs/Web/API/CanvasRenderingContext2D/setLineDash) -borderDashOffset | `Number` | Offset for line dashes. See [MDN](https://developer.mozilla.org/en-US/docs/Web/API/CanvasRenderingContext2D/lineDashOffset) -borderJoinStyle | `String` | Line joint style. See [MDN](https://developer.mozilla.org/en-US/docs/Web/API/CanvasRenderingContext2D/lineJoin) -pointBorderColor | `Color or Array` | The border color for points. -pointBackgroundColor | `Color or Array` | The fill color for points -pointBorderWidth | `Number or Array` | The width of the point border in pixels -pointRadius | `Number or Array` | The radius of the point shape. If set to 0, nothing is rendered. -pointHoverRadius | `Number or Array` | The radius of the point when hovered -pointHitRadius | `Number or Array` | The pixel size of the non-displayed point that reacts to mouse events -pointHoverBackgroundColor | `Color or Array` | Point background color when hovered -pointHoverBorderColor | `Color or Array` | Point border color when hovered -pointHoverBorderWidth | `Number or Array` | Border width of point when hovered -pointStyle | `String, Array, Image, Array` | The style of point. Options are 'circle', 'triangle', 'rect', 'rectRounded', 'rectRot', 'cross', 'crossRot', 'star', 'line', and 'dash'. If the option is an image, that image is drawn on the canvas using `drawImage`. -showLine | `Boolean` | If false, the line is not drawn for this dataset -spanGaps | `Boolean` | If true, lines will be drawn between points with no or null data -steppedLine | `Boolean` | If true, the line is shown as a stepped line and 'lineTension' will be ignored - -An example data object using these attributes is shown below. -```javascript -var data = { - labels: ["January", "February", "March", "April", "May", "June", "July"], - datasets: [ - { - label: "My First dataset", - fill: false, - lineTension: 0.1, - backgroundColor: "rgba(75,192,192,0.4)", - borderColor: "rgba(75,192,192,1)", - borderCapStyle: 'butt', - borderDash: [], - borderDashOffset: 0.0, - borderJoinStyle: 'miter', - pointBorderColor: "rgba(75,192,192,1)", - pointBackgroundColor: "#fff", - pointBorderWidth: 1, - pointHoverRadius: 5, - pointHoverBackgroundColor: "rgba(75,192,192,1)", - pointHoverBorderColor: "rgba(220,220,220,1)", - pointHoverBorderWidth: 2, - pointRadius: 1, - pointHitRadius: 10, - data: [65, 59, 80, 81, 56, 55, 40], - spanGaps: false, - } - ] -}; -``` - -The line chart usually requires an array of labels. This labels are shown on the X axis. There must be one label for each data point. More labels than datapoints are allowed, in which case the line ends at the last data point. -The data for line charts is broken up into an array of datasets. Each dataset has a colour for the fill, a colour for the line and colours for the points and strokes of the points. These colours are strings just like CSS. You can use RGBA, RGB, HEX or HSL notation. - -The label key on each dataset is optional, and can be used when generating a scale for the chart. - -When `spanGaps` is set to true, the gaps between points in sparse datasets are filled in. By default, it is off. - -### Data Points - -The data passed to the chart can be passed in two formats. The most common method is to pass the data array as an array of numbers. In this case, the `data.labels` array must be specified and must contain a label for each point or, in the case of labels to be displayed over multiple lines an array of labels (one for each line) i.e `[["June","2015"], "July"]`. - -The alternate is used for sparse datasets. Data is specified using an object containing `x` and `y` properties. This is used for scatter charts as documented below. - -### Scatter Line Charts - -Scatter line charts can be created by changing the X axis to a linear axis. To use a scatter chart, data must be passed as objects containing X and Y properties. The example below creates a scatter chart with 3 points. - -```javascript -var scatterChart = new Chart(ctx, { - type: 'line', - data: { - datasets: [{ - label: 'Scatter Dataset', - data: [{ - x: -10, - y: 0 - }, { - x: 0, - y: 10 - }, { - x: 10, - y: 5 - }] - }] - }, - options: { - scales: { - xAxes: [{ - type: 'linear', - position: 'bottom' - }] - } - } -}); -``` - -### Chart Options - -These are the customisation options specific to Line charts. These options are merged with the [global chart configuration options](#chart-configuration-global-configuration), and form the options of the chart. - -Name | Type | Default | Description ---- | --- | --- | --- -showLines | Boolean | true | If false, the lines between points are not drawn -spanGaps | Boolean | false | If true, NaN data does not break the line - -You can override these for your `Chart` instance by passing a member `options` into the `Line` method. - -For example, we could have a line chart display without an X axis by doing the following. The config merge is smart enough to handle arrays so that you do not need to specify all axis settings to change one thing. - -```javascript -new Chart(ctx, { - type: 'line', - data: data, - options: { - scales: { - xAxes: [{ - display: false - }] - } - } -}); -``` - -We can also change these defaults values for each Line type that is created, this object is available at `Chart.defaults.line`. - -### Stacked Charts - -Stacked area charts can be created by setting the Y axis to a stacked configuration. The following example would have stacked lines. - -```javascript -var stackedLine = new Chart(ctx, { - type: 'line', - data: data, - options: { - scales: { - yAxes: [{ - stacked: true - }] - } - } -}); -``` \ No newline at end of file diff --git a/system/templates/js/chart-js/docs/04-Bar-Chart.md b/system/templates/js/chart-js/docs/04-Bar-Chart.md deleted file mode 100644 index ef2cd3c19..000000000 --- a/system/templates/js/chart-js/docs/04-Bar-Chart.md +++ /dev/null @@ -1,174 +0,0 @@ ---- -title: Bar Chart -anchor: bar-chart ---- - -### Introduction -A bar chart is a way of showing data as bars. - -It is sometimes used to show trend data, and the comparison of multiple data sets side by side. - -
- -
- -### Example Usage -```javascript -var myBarChart = new Chart(ctx, { - type: 'bar', - data: data, - options: options -}); -``` - -Or if you want horizontal bars. - -```javascript -var myBarChart = new Chart(ctx, { - type: 'horizontalBar', - data: data, - options: options -}); -``` - -### Dataset Structure -The following options can be included in a bar chart dataset to configure options for that specific dataset. - -Some properties can be specified as an array. If these are set to an array value, the first value applies to the first bar, the second value to the second bar, and so on. - -Property | Type | Usage ---- | --- | --- -data | `Array` | The data to plot as bars -label | `String` | The label for the dataset which appears in the legend and tooltips -xAxisID | `String` | The ID of the x axis to plot this dataset on -yAxisID | `String` | The ID of the y axis to plot this dataset on -backgroundColor | `Color or Array` | The fill color of the bars. See [Colors](#chart-configuration-colors) -borderColor | `Color or Array` | Bar border color -borderWidth | `Number or Array` | Border width of bar in pixels -borderSkipped | `String or Array` | Which edge to skip drawing the border for. Options are 'bottom', 'left', 'top', and 'right' -hoverBackgroundColor | `Color or Array` | Bar background color when hovered -hoverBorderColor | `Color or Array` | Bar border color when hovered -hoverBorderWidth | `Number or Array` | Border width of bar when hovered -stack | `String` | The ID of the group to which this dataset belongs to (when stacked, each group will be a separate stack) - -An example data object using these attributes is shown below. - -```javascript -var data = { - labels: ["January", "February", "March", "April", "May", "June", "July"], - datasets: [ - { - label: "My First dataset", - backgroundColor: [ - 'rgba(255, 99, 132, 0.2)', - 'rgba(54, 162, 235, 0.2)', - 'rgba(255, 206, 86, 0.2)', - 'rgba(75, 192, 192, 0.2)', - 'rgba(153, 102, 255, 0.2)', - 'rgba(255, 159, 64, 0.2)' - ], - borderColor: [ - 'rgba(255,99,132,1)', - 'rgba(54, 162, 235, 1)', - 'rgba(255, 206, 86, 1)', - 'rgba(75, 192, 192, 1)', - 'rgba(153, 102, 255, 1)', - 'rgba(255, 159, 64, 1)' - ], - borderWidth: 1, - data: [65, 59, 80, 81, 56, 55, 40], - } - ] -}; -``` -The bar chart has the a very similar data structure to the line chart, and has an array of datasets, each with colours and an array of data. -We have an array of labels too for display. In the example, we are showing the same data as the previous line chart example. - -### Chart Options - -These are the customisation options specific to Bar charts. These options are merged with the [global chart configuration options](#global-chart-configuration), and form the options of the chart. - -The default options for bar chart are defined in `Chart.defaults.bar`. - -Name | Type | Default | Description ---- |:---:| --- | --- -*hover*.mode | String | "label" | Label's hover mode. "label" is used since the x axis displays data by the index in the dataset. -scales | Object | - | - -*scales*.xAxes | Array | | The bar chart officially supports only 1 x-axis but uses an array to keep the API consistent. Use a scatter chart if you need multiple x axes. -*Options for xAxes* | | | -type | String | "Category" | As defined in [Scales](#scales-category-scale). -display | Boolean | true | If true, show the scale. -id | String | "x-axis-0" | Id of the axis so that data can bind to it -stacked | Boolean | false | If true, bars are stacked on the x-axis -barThickness | Number | | Manually set width of each bar in pixels. If not set, the bars are sized automatically. -categoryPercentage | Number | 0.8 | Percent (0-1) of the available width (the space between the gridlines for small datasets) for each data-point to use for the bars. [Read More](#bar-chart-barpercentage-vs-categorypercentage) -barPercentage | Number | 0.9 | Percent (0-1) of the available width each bar should be within the category percentage. 1.0 will take the whole category width and put the bars right next to each other. [Read More](#bar-chart-barpercentage-vs-categorypercentage) -gridLines | Object | [See Scales](#scales) | -*gridLines*.offsetGridLines | Boolean | true | If true, the bars for a particular data point fall between the grid lines. If false, the grid line will go right down the middle of the bars. -| | | -*scales*.yAxes | Array | `[{ type: "linear" }]` | -*Options for yAxes* | | | -type | String | "linear" | As defined in [Scales](#scales-linear-scale). -display | Boolean | true | If true, show the scale. -id | String | "y-axis-0" | Id of the axis so that data can bind to it. -stacked | Boolean | false | If true, bars are stacked on the y-axis -barThickness | Number | | Manually set height of each bar in pixels. If not set, the bars are sized automatically. - -You can override these for your `Chart` instance by passing a second argument into the `Bar` method as an object with the keys you want to override. - -For example, we could have a bar chart without a stroke on each bar by doing the following: - -```javascript -new Chart(ctx, { - type: "bar", - data: data, - options: { - scales: { - xAxes: [{ - stacked: true - }], - yAxes: [{ - stacked: true - }] - } - } -}); -// This will create a chart with all of the default options, merged from the global config, -// and the Bar chart defaults but this particular instance will have `stacked` set to true -// for both x and y axes. -``` - -We can also change these defaults values for each Bar type that is created, this object is available at `Chart.defaults.bar`. For horizontal bars, this object is available at `Chart.defaults.horizontalBar`. - -The default options for horizontal bar charts are defined in `Chart.defaults.horizontalBar` and are same as those of the bar chart, but with `xAxes` and `yAxes` swapped and the following additional options. - -Name | Type | Default | Description ---- |:---:| --- | --- -*Options for xAxes* | | | -position | String | "bottom" | -*Options for yAxes* | | | -position | String | "left" | - -### barPercentage vs categoryPercentage - -The following shows the relationship between the bar percentage option and the category percentage option. - -```text -// categoryPercentage: 1.0 -// barPercentage: 1.0 -Bar: | 1.0 | 1.0 | -Category: | 1.0 | -Sample: |===========| - -// categoryPercentage: 1.0 -// barPercentage: 0.5 -Bar: |.5| |.5| -Category: | 1.0 | -Sample: |==============| - -// categoryPercentage: 0.5 -// barPercentage: 1.0 -Bar: |1.||1.| -Category: | .5 | -Sample: |==============| -``` diff --git a/system/templates/js/chart-js/docs/05-Radar-Chart.md b/system/templates/js/chart-js/docs/05-Radar-Chart.md deleted file mode 100644 index 977574faf..000000000 --- a/system/templates/js/chart-js/docs/05-Radar-Chart.md +++ /dev/null @@ -1,125 +0,0 @@ ---- -title: Radar Chart -anchor: radar-chart ---- - -### Introduction -A radar chart is a way of showing multiple data points and the variation between them. - -They are often useful for comparing the points of two or more different data sets. - -
- -
- -### Example Usage - -```javascript -var myRadarChart = new Chart(ctx, { - type: 'radar', - data: data, - options: options -}); -``` - -### Dataset Structure - -The following options can be included in a radar chart dataset to configure options for that specific dataset. - -All point* properties can be specified as an array. If these are set to an array value, the first value applies to the first point, the second value to the second point, and so on. - -Property | Type | Usage ---- | --- | --- -data | `Array` | The data to plot in a line -label | `String` | The label for the dataset which appears in the legend and tooltips -fill | `Boolean` | If true, fill the area under the line -lineTension | `Number` | Bezier curve tension of the line. Set to 0 to draw straightlines. *Note* This was renamed from 'tension' but the old name still works. -backgroundColor | `Color` | The fill color under the line. See [Colors](#chart-configuration-colors) -borderWidth | `Number` | The width of the line in pixels -borderColor | `Color` | The color of the line. -borderCapStyle | `String` | Cap style of the line. See [MDN](https://developer.mozilla.org/en-US/docs/Web/API/CanvasRenderingContext2D/lineCap) -borderDash | `Array` | Length and spacing of dashes. See [MDN](https://developer.mozilla.org/en-US/docs/Web/API/CanvasRenderingContext2D/setLineDash) -borderDashOffset | `Number` | Offset for line dashes. See [MDN](https://developer.mozilla.org/en-US/docs/Web/API/CanvasRenderingContext2D/lineDashOffset) -borderJoinStyle | `String` | Line joint style. See [MDN](https://developer.mozilla.org/en-US/docs/Web/API/CanvasRenderingContext2D/lineJoin) -pointBorderColor | `Color or Array` | The border color for points. -pointBackgroundColor | `Color or Array` | The fill color for points -pointBorderWidth | `Number or Array` | The width of the point border in pixels -pointRadius | `Number or Array` | The radius of the point shape. If set to 0, nothing is rendered. -pointHoverRadius | `Number or Array` | The radius of the point when hovered -pointHitRadius | `Number or Array` | The pixel size of the non-displayed point that reacts to mouse events -pointHoverBackgroundColor | `Color or Array` | Point background color when hovered -pointHoverBorderColor | `Color or Array` | Point border color when hovered -pointHoverBorderWidth | `Number or Array` | Border width of point when hovered -pointStyle | `String or Array` | The style of point. Options include 'circle', 'triangle', 'rect', 'rectRounded', 'rectRot', 'cross', 'crossRot', 'star', 'line', and 'dash' - -An example data object using these attributes is shown below. - -```javascript -var data = { - labels: ["Eating", "Drinking", "Sleeping", "Designing", "Coding", "Cycling", "Running"], - datasets: [ - { - label: "My First dataset", - backgroundColor: "rgba(179,181,198,0.2)", - borderColor: "rgba(179,181,198,1)", - pointBackgroundColor: "rgba(179,181,198,1)", - pointBorderColor: "#fff", - pointHoverBackgroundColor: "#fff", - pointHoverBorderColor: "rgba(179,181,198,1)", - data: [65, 59, 90, 81, 56, 55, 40] - }, - { - label: "My Second dataset", - backgroundColor: "rgba(255,99,132,0.2)", - borderColor: "rgba(255,99,132,1)", - pointBackgroundColor: "rgba(255,99,132,1)", - pointBorderColor: "#fff", - pointHoverBackgroundColor: "#fff", - pointHoverBorderColor: "rgba(255,99,132,1)", - data: [28, 48, 40, 19, 96, 27, 100] - } - ] -}; -``` -For a radar chart, to provide context of what each point means, we include an array of strings that show around each point in the chart. -For the radar chart data, we have an array of datasets. Each of these is an object, with a fill colour, a stroke colour, a colour for the fill of each point, and a colour for the stroke of each point. We also have an array of data values. -The label key on each dataset is optional, and can be used when generating a scale for the chart. - - -### Chart Options - -These are the customisation options specific to Radar charts. These options are merged with the [global chart configuration options](#global-chart-configuration), and form the options of the chart. - -The default options for radar chart are defined in `Chart.defaults.radar`. - -Name | Type | Default | Description ---- | --- | --- | --- -scale | Object | [See Scales](#scales) and [Defaults for Radial Linear Scale](#scales-radial-linear-scale) | Options for the one scale used on the chart. Use this to style the ticks, labels, and grid lines. -*scale*.type | String |"radialLinear" | As defined in ["Radial Linear"](#scales-radial-linear-scale). -*elements*.line | Object | | Options for all line elements used on the chart, as defined in the global elements, duplicated here to show Radar chart specific defaults. -*elements.line*.lineTension | Number | 0 | Tension exhibited by lines when calculating splineCurve. Setting to 0 creates straight lines. -startAngle | Number | 0 | The number of degrees to rotate the chart clockwise. - -You can override these for your `Chart` instance by passing a second argument into the `Radar` method as an object with the keys you want to override. - -For example, we could have a radar chart without a point for each on piece of data by doing the following: - -```javascript -new Chart(ctx, { - type: "radar", - data: data, - options: { - scale: { - reverse: true, - ticks: { - beginAtZero: true - } - } - } -}); -// This will create a chart with all of the default options, merged from the global config, -// and the Radar chart defaults but this particular instance's scale will be reversed as -// well as the ticks beginning at zero. -``` - -We can also change these defaults values for each Radar type that is created, this object is available at `Chart.defaults.radar`. diff --git a/system/templates/js/chart-js/docs/06-Polar-Area-Chart.md b/system/templates/js/chart-js/docs/06-Polar-Area-Chart.md deleted file mode 100644 index 4f2d8960d..000000000 --- a/system/templates/js/chart-js/docs/06-Polar-Area-Chart.md +++ /dev/null @@ -1,109 +0,0 @@ ---- -title: Polar Area Chart -anchor: polar-area-chart ---- -### Introduction -Polar area charts are similar to pie charts, but each segment has the same angle - the radius of the segment differs depending on the value. - -This type of chart is often useful when we want to show a comparison data similar to a pie chart, but also show a scale of values for context. - -
- -
- -### Example Usage - -```javascript -new Chart(ctx, { - data: data, - type: 'polarArea', - options: options -}); -``` - -### Dataset Structure - -The following options can be included in a polar area chart dataset to configure options for that specific dataset. - -Some properties are specified as arrays. The first value applies to the first bar, the second value to the second bar, and so on. - -Property | Type | Usage ---- | --- | --- -data | `Array` | The data to plot as arcs -label | `String` | The label for the dataset which appears in the legend and tooltips -backgroundColor | `Array` | The fill color of the arcs. See [Colors](#chart-configuration-colors) -borderColor | `Array` | Arc border color -borderWidth | `Array` | Border width of arcs in pixels -hoverBackgroundColor | `Array` | Arc background color when hovered -hoverBorderColor | `Array` | Arc border color when hovered -hoverBorderWidth | `Array` | Border width of arc when hovered - -An example data object using these attributes is shown below. - -```javascript -var data = { - datasets: [{ - data: [ - 11, - 16, - 7, - 3, - 14 - ], - backgroundColor: [ - "#FF6384", - "#4BC0C0", - "#FFCE56", - "#E7E9ED", - "#36A2EB" - ], - label: 'My dataset' // for legend - }], - labels: [ - "Red", - "Green", - "Yellow", - "Grey", - "Blue" - ] -}; -``` -As you can see, for the chart data you pass in an array of objects, with a value and a colour. The value attribute should be a number, while the color attribute should be a string. Similar to CSS, for this string you can use HEX notation, RGB, RGBA or HSL. - -### Chart Options - -These are the customisation options specific to Polar Area charts. These options are merged with the [global chart configuration options](#global-chart-configuration), and form the options of the chart. - -Name | Type | Default | Description ---- | --- | --- | --- -startAngle | Number | -0.5 * Math.PI | Sets the starting angle for the first item in a dataset -scale | Object | [See Scales](#scales) and [Defaults for Radial Linear Scale](#scales-radial-linear-scale) | Options for the one scale used on the chart. Use this to style the ticks, labels, and grid. -*scale*.type | String |"radialLinear" | As defined in ["Radial Linear"](#scales-radial-linear-scale). -*scale*.lineArc | Boolean | true | When true, lines are circular. -*animation*.animateRotate | Boolean |true | If true, will animate the rotation of the chart. -*animation*.animateScale | Boolean | true | If true, will animate scaling the chart. -*legend*.*labels*.generateLabels | Function | `function(data) {} ` | Returns labels for each the legend -*legend*.onClick | Function | function(event, legendItem) {} ` | Handles clicking an individual legend item -legendCallback | Function | `function(chart) ` | Generates the HTML legend via calls to `generateLegend` - -You can override these for your `Chart` instance by passing a second argument into the `PolarArea` method as an object with the keys you want to override. - -For example, we could have a polar area chart with a black stroke on each segment like so: - -```javascript -new Chart(ctx, { - data: data, - type: "polarArea", - options: { - elements: { - arc: { - borderColor: "#000000" - } - } - } -}); -// This will create a chart with all of the default options, merged from the global config, -// and the PolarArea chart defaults but this particular instance will have `elements.arc.borderColor` set to `"#000000"`. -``` - -We can also change these defaults values for each PolarArea type that is created, this object is available at `Chart.defaults.polarArea`. diff --git a/system/templates/js/chart-js/docs/07-Pie-Doughnut-Chart.md b/system/templates/js/chart-js/docs/07-Pie-Doughnut-Chart.md deleted file mode 100644 index 998301322..000000000 --- a/system/templates/js/chart-js/docs/07-Pie-Doughnut-Chart.md +++ /dev/null @@ -1,115 +0,0 @@ ---- -title: Pie & Doughnut Charts -anchor: doughnut-pie-chart ---- -### Introduction -Pie and doughnut charts are probably the most commonly used charts there are. They are divided into segments, the arc of each segment shows the proportional value of each piece of data. - -They are excellent at showing the relational proportions between data. - -Pie and doughnut charts are effectively the same class in Chart.js, but have one different default value - their `cutoutPercentage`. This equates what percentage of the inner should be cut out. This defaults to `0` for pie charts, and `50` for doughnuts. - -They are also registered under two aliases in the `Chart` core. Other than their different default value, and different alias, they are exactly the same. - -
- -
- -
- -
-
- -### Example Usage - -```javascript -// For a pie chart -var myPieChart = new Chart(ctx,{ - type: 'pie', - data: data, - options: options -}); -``` - -```javascript -// And for a doughnut chart -var myDoughnutChart = new Chart(ctx, { - type: 'doughnut', - data: data, - options: options -}); -``` - -### Dataset Structure - -Property | Type | Usage ---- | --- | --- -data | `Array` | The data to plot as arcs -label | `String` | The label for the dataset which appears in the legend and tooltips -backgroundColor | `Array` | The fill color of the arcs. See [Colors](#chart-configuration-colors) -borderColor | `Array` | Arc border color -borderWidth | `Array` | Border width of arcs in pixels -hoverBackgroundColor | `Array` | Arc background color when hovered -hoverBorderColor | `Array` | Arc border color when hovered -hoverBorderWidth | `Array` | Border width of arc when hovered - -An example data object using these attributes is shown below. - -```javascript -var data = { - labels: [ - "Red", - "Blue", - "Yellow" - ], - datasets: [ - { - data: [300, 50, 100], - backgroundColor: [ - "#FF6384", - "#36A2EB", - "#FFCE56" - ], - hoverBackgroundColor: [ - "#FF6384", - "#36A2EB", - "#FFCE56" - ] - }] -}; -``` - -For a pie chart, datasets need to contain an array of data points. The data points should be a number, Chart.js will total all of the numbers and calculate the relative proportion of each. You can also add an array of background colors. The color attributes should be a string. Similar to CSS, for this string you can use HEX notation, RGB, RGBA or HSL. - -### Chart Options - -These are the customisation options specific to Pie & Doughnut charts. These options are merged with the [global chart configuration options](#global-chart-configuration), and form the options of the chart. - -Name | Type | Default | Description ---- | --- | --- | --- -cutoutPercentage | Number | 50 - for doughnut, 0 - for pie | The percentage of the chart that is cut out of the middle. -rotation | Number | -0.5 * Math.PI | Starting angle to draw arcs from -circumference | Number | 2 * Math.PI | Sweep to allow arcs to cover -*animation*.animateRotate | Boolean |true | If true, will animate the rotation of the chart. -*animation*.animateScale | Boolean | false | If true, will animate scaling the Doughnut from the centre. -*legend*.*labels*.generateLabels | Function | `function(chart) {} ` | Returns a label for each item to be displayed on the legend. -*legend*.onClick | Function | function(event, legendItem) {} ` | Handles clicking an individual legend item - -You can override these for your `Chart` instance by passing a second argument into the `Doughnut` method as an object with the keys you want to override. - -For example, we could have a doughnut chart that animates by scaling out from the centre like so: - -```javascript -new Chart(ctx,{ - type:"doughnut", - options: { - animation:{ - animateScale:true - } - } -}); -// This will create a chart with all of the default options, merged from the global config, -// and the Doughnut chart defaults but this particular instance will have `animateScale` set to `true`. -``` - -We can also change these default values for each Doughnut type that is created, this object is available at `Chart.defaults.doughnut`. Pie charts also have a clone of these defaults available to change at `Chart.defaults.pie`, with the only difference being `cutoutPercentage` being set to 0. diff --git a/system/templates/js/chart-js/docs/08-Bubble-Chart.md b/system/templates/js/chart-js/docs/08-Bubble-Chart.md deleted file mode 100644 index 59b8b7730..000000000 --- a/system/templates/js/chart-js/docs/08-Bubble-Chart.md +++ /dev/null @@ -1,100 +0,0 @@ ---- -title: Bubble Chart -anchor: bubble-chart ---- -### Introduction -A bubble chart is used to display three dimensions of data at the same time. The location of the bubble is determined by the first two dimensions and the corresponding horizontal and vertical axes. The third dimension is represented by the size of the individual bubbles. - -
- -
-
- -### Example Usage - -```javascript -// For a bubble chart -var myBubbleChart = new Chart(ctx,{ - type: 'bubble', - data: data, - options: options -}); -``` - -### Dataset Structure - -Property | Type | Usage ---- | --- | --- -data | `Array` | The data to plot as bubbles. See [Data format](#bubble-chart-data-format) -label | `String` | The label for the dataset which appears in the legend and tooltips -backgroundColor | `Color Array` | The fill color of the bubbles. See [Colors](#chart-configuration-colors) -borderColor | `Color or Array` | The stroke color of the bubbles. -borderWidth | `Number or Array` | The stroke width of bubble in pixels. -hoverBackgroundColor | `Color or Array` | The fill color of the bubbles when hovered. -hoverBorderColor | `Color or Array` | The stroke color of the bubbles when hovered. -hoverBorderWidth | `Number or Array` | The stroke width of the bubbles when hovered. -hoverRadius | `Number or Array` | Additional radius to add to data radius on hover. - -An example data object using these attributes is shown below. This example creates a single dataset with 2 different bubbles. - -```javascript -var data = { - datasets: [ - { - label: 'First Dataset', - data: [ - { - x: 20, - y: 30, - r: 15 - }, - { - x: 40, - y: 10, - r: 10 - } - ], - backgroundColor:"#FF6384", - hoverBackgroundColor: "#FF6384", - }] -}; -``` - -### Data Object - -Data for the bubble chart is passed in the form of an object. The object must implement the following interface. It is important to note that the radius property, `r` is **not** scaled by the chart. It is the raw radius in pixels of the bubble that is drawn on the canvas. - -```javascript -{ - // X Value - x: , - - // Y Value - y: , - - // Radius of bubble. This is not scaled. - r: -} -``` - -### Chart Options - -The bubble chart has no unique configuration options. To configure options common to all of the bubbles, the point element options are used. - -For example, to give all bubbles a 1px wide black border, the following options would be used. - -```javascript -new Chart(ctx,{ - type:"bubble", - options: { - elements: { - points: { - borderWidth: 1, - borderColor: 'rgb(0, 0, 0)' - } - } - } -}); -``` - -We can also change the default values for the Bubble chart type. Doing so will give all bubble charts created after this point the new defaults. The default configuration for the bubble chart can be accessed at `Chart.defaults.bubble`. diff --git a/system/templates/js/chart-js/docs/09-Advanced.md b/system/templates/js/chart-js/docs/09-Advanced.md deleted file mode 100644 index 05642fcab..000000000 --- a/system/templates/js/chart-js/docs/09-Advanced.md +++ /dev/null @@ -1,465 +0,0 @@ ---- -title: Advanced usage -anchor: advanced-usage ---- - - -### Prototype Methods - -For each chart, there are a set of global prototype methods on the shared `ChartType` which you may find useful. These are available on all charts created with Chart.js, but for the examples, let's use a line chart we've made. - -```javascript -// For example: -var myLineChart = new Chart(ctx, config); -``` - -#### .destroy() - -Use this to destroy any chart instances that are created. This will clean up any references stored to the chart object within Chart.js, along with any associated event listeners attached by Chart.js. -This must be called before the canvas is reused for a new chart. - -```javascript -// Destroys a specific chart instance -myLineChart.destroy(); -``` - -#### .update(duration, lazy) - -Triggers an update of the chart. This can be safely called after replacing the entire data object. This will update all scales, legends, and then re-render the chart. - -```javascript -// duration is the time for the animation of the redraw in milliseconds -// lazy is a boolean. if true, the animation can be interrupted by other animations -myLineChart.data.datasets[0].data[2] = 50; // Would update the first dataset's value of 'March' to be 50 -myLineChart.update(); // Calling update now animates the position of March from 90 to 50. -``` - -#### .reset() - -Reset the chart to it's state before the initial animation. A new animation can then be triggered using `update`. - -```javascript -myLineChart.reset(); -``` - -#### .render(duration, lazy) - -Triggers a redraw of all chart elements. Note, this does not update elements for new data. Use `.update()` in that case. - -```javascript -// duration is the time for the animation of the redraw in milliseconds -// lazy is a boolean. if true, the animation can be interrupted by other animations -myLineChart.render(duration, lazy); -``` - -#### .stop() - -Use this to stop any current animation loop. This will pause the chart during any current animation frame. Call `.render()` to re-animate. - -```javascript -// Stops the charts animation loop at its current frame -myLineChart.stop(); -// => returns 'this' for chainability -``` - -#### .resize() - -Use this to manually resize the canvas element. This is run each time the canvas container is resized, but you can call this method manually if you change the size of the canvas nodes container element. - -```javascript -// Resizes & redraws to fill its container element -myLineChart.resize(); -// => returns 'this' for chainability -``` - -#### .clear() - -Will clear the chart canvas. Used extensively internally between animation frames, but you might find it useful. - -```javascript -// Will clear the canvas that myLineChart is drawn on -myLineChart.clear(); -// => returns 'this' for chainability -``` - -#### .toBase64Image() - -This returns a base 64 encoded string of the chart in it's current state. - -```javascript -myLineChart.toBase64Image(); -// => returns png data url of the image on the canvas -``` - -#### .generateLegend() - -Returns an HTML string of a legend for that chart. The legend is generated from the `legendCallback` in the options. - -```javascript -myLineChart.generateLegend(); -// => returns HTML string of a legend for this chart -``` - -#### .getElementAtEvent(e) - -Calling `getElementAtEvent(event)` on your Chart instance passing an argument of an event, or jQuery event, will return the single element at the event position. If there are multiple items within range, only the first is returned - -```javascript -myLineChart.getElementAtEvent(e); -// => returns the first element at the event point. -``` - -#### .getElementsAtEvent(e) - -Looks for the element under the event point, then returns all elements at the same data index. This is used internally for 'label' mode highlighting. - -Calling `getElementsAtEvent(event)` on your Chart instance passing an argument of an event, or jQuery event, will return the point elements that are at that the same position of that event. - -```javascript -canvas.onclick = function(evt){ - var activePoints = myLineChart.getElementsAtEvent(evt); - // => activePoints is an array of points on the canvas that are at the same position as the click event. -}; -``` - -This functionality may be useful for implementing DOM based tooltips, or triggering custom behaviour in your application. - -#### .getDatasetAtEvent(e) - -Looks for the element under the event point, then returns all elements from that dataset. This is used internally for 'dataset' mode highlighting - -```javascript -myLineChart.getDatasetAtEvent(e); -// => returns an array of elements -``` - -#### .getDatasetMeta(index) - -Looks for the dataset that matches the current index and returns that metadata. This returned data has all of the metadata that is used to construct the chart. - -The `data` property of the metadata will contain information about each point, rectangle, etc. depending on the chart type. - -Extensive examples of usage are available in the [Chart.js tests](https://github.com/chartjs/Chart.js/tree/master/test). - -```javascript -var meta = myChart.getDatasetMeta(0); -var x = meta.data[0]._model.x -``` - -### External Tooltips - -You can enable custom tooltips in the global or chart configuration like so: - -```javascript -var myPieChart = new Chart(ctx, { - type: 'pie', - data: data, - options: { - tooltips: { - custom: function(tooltip) { - // tooltip will be false if tooltip is not visible or should be hidden - if (!tooltip) { - return; - } - - // Otherwise, tooltip will be an object with all tooltip properties like: - - // tooltip.caretSize - // tooltip.caretPadding - // tooltip.chart - // tooltip.cornerRadius - // tooltip.fillColor - // tooltip.font... - // tooltip.text - // tooltip.x - // tooltip.y - // tooltip.caretX - // tooltip.caretY - // etc... - } - } - } -}); -``` - -See `samples/tooltips/line-customTooltips.html` for examples on how to get started. - -### Writing New Scale Types - -Starting with Chart.js 2.0 scales can be individually extended. Scales should always derive from Chart.Scale. - -```javascript -var MyScale = Chart.Scale.extend({ - /* extensions ... */ -}); - -// MyScale is now derived from Chart.Scale -``` - -Once you have created your scale class, you need to register it with the global chart object so that it can be used. A default config for the scale may be provided when registering the constructor. The first parameter to the register function is a string key that is used later to identify which scale type to use for a chart. - -```javascript -Chart.scaleService.registerScaleType('myScale', MyScale, defaultConfigObject); -``` - -To use the new scale, simply pass in the string key to the config when creating a chart. - -```javascript -var lineChart = new Chart(ctx, { - data: data, - type: 'line', - options: { - scales: { - yAxes: [{ - type: 'myScale' // this is the same key that was passed to the registerScaleType function - }] - } - } -}) -``` - -#### Scale Properties - -Scale instances are given the following properties during the fitting process. - -```javascript -{ - left: Number, // left edge of the scale bounding box - right: Number, // right edge of the bounding box' - top: Number, - bottom: Number, - width: Number, // the same as right - left - height: Number, // the same as bottom - top - - // Margin on each side. Like css, this is outside the bounding box. - margins: { - left: Number, - right: Number, - top: Number, - bottom: Number, - }, - - // Amount of padding on the inside of the bounding box (like CSS) - paddingLeft: Number, - paddingRight: Number, - paddingTop: Number, - paddingBottom: Number, -} -``` - -#### Scale Interface -To work with Chart.js, custom scale types must implement the following interface. - -```javascript -{ - // Determines the data limits. Should set this.min and this.max to be the data max/min - determineDataLimits: function() {}, - - // Generate tick marks. this.chart is the chart instance. The data object can be accessed as this.chart.data - // buildTicks() should create a ticks array on the axis instance, if you intend to use any of the implementations from the base class - buildTicks: function() {}, - - // Get the value to show for the data at the given index of the the given dataset, ie this.chart.data.datasets[datasetIndex].data[index] - getLabelForIndex: function(index, datasetIndex) {}, - - // Get the pixel (x coordinate for horizontal axis, y coordinate for vertical axis) for a given value - // @param index: index into the ticks array - // @param includeOffset: if true, get the pixel halway between the given tick and the next - getPixelForTick: function(index, includeOffset) {}, - - // Get the pixel (x coordinate for horizontal axis, y coordinate for vertical axis) for a given value - // @param value : the value to get the pixel for - // @param index : index into the data array of the value - // @param datasetIndex : index of the dataset the value comes from - // @param includeOffset : if true, get the pixel halway between the given tick and the next - getPixelForValue: function(value, index, datasetIndex, includeOffset) {} - - // Get the value for a given pixel (x coordinate for horizontal axis, y coordinate for vertical axis) - // @param pixel : pixel value - getValueForPixel: function(pixel) {} -} -``` - -Optionally, the following methods may also be overwritten, but an implementation is already provided by the `Chart.Scale` base class. - -```javascript - // Transform the ticks array of the scale instance into strings. The default implementation simply calls this.options.ticks.callback(numericalTick, index, ticks); - convertTicksToLabels: function() {}, - - // Determine how much the labels will rotate by. The default implementation will only rotate labels if the scale is horizontal. - calculateTickRotation: function() {}, - - // Fits the scale into the canvas. - // this.maxWidth and this.maxHeight will tell you the maximum dimensions the scale instance can be. Scales should endeavour to be as efficient as possible with canvas space. - // this.margins is the amount of space you have on either side of your scale that you may expand in to. This is used already for calculating the best label rotation - // You must set this.minSize to be the size of your scale. It must be an object containing 2 properties: width and height. - // You must set this.width to be the width and this.height to be the height of the scale - fit: function() {}, - - // Draws the scale onto the canvas. this.(left|right|top|bottom) will have been populated to tell you the area on the canvas to draw in - // @param chartArea : an object containing four properties: left, right, top, bottom. This is the rectangle that lines, bars, etc will be drawn in. It may be used, for example, to draw grid lines. - draw: function(chartArea) {}, -``` - -The Core.Scale base class also has some utility functions that you may find useful. -```javascript -{ - // Returns true if the scale instance is horizontal - isHorizontal: function() {}, - - // Get the correct value from the value from this.chart.data.datasets[x].data[] - // If dataValue is an object, returns .x or .y depending on the return of isHorizontal() - // If the value is undefined, returns NaN - // Otherwise returns the value. - // Note that in all cases, the returned value is not guaranteed to be a Number - getRightValue: function(dataValue) {}, -} -``` - -### Writing New Chart Types - -Chart.js 2.0 introduces the concept of controllers for each dataset. Like scales, new controllers can be written as needed. - -```javascript -Chart.controllers.MyType = Chart.DatasetController.extend({ - -}); - - -// Now we can create a new instance of our chart, using the Chart.js API -new Chart(ctx, { - // this is the string the constructor was registered at, ie Chart.controllers.MyType - type: 'MyType', - data: data, - options: options -}); -``` - -#### Dataset Controller Interface - -Dataset controllers must implement the following interface. - -```javascript -{ - // Create elements for each piece of data in the dataset. Store elements in an array on the dataset as dataset.metaData - addElements: function() {}, - - // Create a single element for the data at the given index and reset its state - addElementAndReset: function(index) {}, - - // Draw the representation of the dataset - // @param ease : if specified, this number represents how far to transition elements. See the implementation of draw() in any of the provided controllers to see how this should be used - draw: function(ease) {}, - - // Remove hover styling from the given element - removeHoverStyle: function(element) {}, - - // Add hover styling to the given element - setHoverStyle: function(element) {}, - - // Update the elements in response to new data - // @param reset : if true, put the elements into a reset state so they can animate to their final values - update: function(reset) {}, -} -``` - -The following methods may optionally be overridden by derived dataset controllers -```javascript -{ - // Initializes the controller - initialize: function(chart, datasetIndex) {}, - - // Ensures that the dataset represented by this controller is linked to a scale. Overridden to helpers.noop in the polar area and doughnut controllers as these - // chart types using a single scale - linkScales: function() {}, - - // Called by the main chart controller when an update is triggered. The default implementation handles the number of data points changing and creating elements appropriately. - buildOrUpdateElements: function() {} -} -``` - -### Extending Existing Chart Types - -Extending or replacing an existing controller type is easy. Simply replace the constructor for one of the built in types with your own. - -The built in controller types are: -* `Chart.controllers.line` -* `Chart.controllers.bar` -* `Chart.controllers.radar` -* `Chart.controllers.doughnut` -* `Chart.controllers.polarArea` -* `Chart.controllers.bubble` - -#### Bar Controller -The bar controller has a special property that you should be aware of. To correctly calculate the width of a bar, the controller must determine the number of datasets that map to bars. To do this, the bar controller attaches a property `bar` to the dataset during initialization. If you are creating a replacement or updated bar controller, you should do the same. This will ensure that charts with regular bars and your new derived bars will work seamlessly. - -### Creating Plugins - -Starting with v2.1.0, you can create plugins for chart.js. To register your plugin, simply call `Chart.plugins.register` and pass your plugin in. -Plugins will be called at the following times -* Start of initialization -* End of initialization -* Start of update -* After the chart scales have calculated -* Start of datasets update -* End of datasets update -* End of update (before render occurs) -* Start of draw -* End of draw -* Before datasets draw -* After datasets draw -* Resize -* Before an animation is started -* When an event occurs on the canvas (mousemove, click, etc). This requires the `options.events` property handled - -Plugins should implement the `IPlugin` interface: -```javascript -{ - beforeInit: function(chartInstance) { }, - afterInit: function(chartInstance) { }, - - resize: function(chartInstance, newChartSize) { }, - - beforeUpdate: function(chartInstance) { }, - afterScaleUpdate: function(chartInstance) { } - beforeDatasetsUpdate: function(chartInstance) { } - afterDatasetsUpdate: function(chartInstance) { } - afterUpdate: function(chartInstance) { }, - - // This is called at the start of a render. It is only called once, even if the animation will run for a number of frames. Use beforeDraw or afterDraw - // to do something on each animation frame - beforeRender: function(chartInstance) { }, - - // Easing is for animation - beforeDraw: function(chartInstance, easing) { }, - afterDraw: function(chartInstance, easing) { }, - // Before the datasets are drawn but after scales are drawn - beforeDatasetsDraw: function(chartInstance, easing) { }, - afterDatasetsDraw: function(chartInstance, easing) { }, - - destroy: function(chartInstance) { } - - // Called when an event occurs on the chart - beforeEvent: function(chartInstance, event) {} - afterEvent: function(chartInstance, event) {} -} -``` - -### Building Chart.js - -Chart.js uses gulp to build the library into a single JavaScript file. - -Firstly, we need to ensure development dependencies are installed. With node and npm installed, after cloning the Chart.js repo to a local directory, and navigating to that directory in the command line, we can run the following: - -```bash -npm install -npm install -g gulp -``` - -This will install the local development dependencies for Chart.js, along with a CLI for the JavaScript task runner gulp. - -Now, we can run the `gulp build` task. - -```bash -gulp build -``` diff --git a/system/templates/js/chart-js/docs/10-Notes.md b/system/templates/js/chart-js/docs/10-Notes.md deleted file mode 100644 index 451a8a8cc..000000000 --- a/system/templates/js/chart-js/docs/10-Notes.md +++ /dev/null @@ -1,115 +0,0 @@ ---- -title: Notes -anchor: notes ---- -### Previous versions - -Version 2 has a completely different API than earlier versions. - -Most earlier version options have current equivalents or are the same. - -Please use the documentation that is available on [chartjs.org](http://www.chartjs.org/docs/) for the current version of Chart.js. - -Please note - documentation for previous versions are available on the GitHub repo. - -- [1.x Documentation](https://github.com/chartjs/Chart.js/tree/v1.1.1/docs) - -### Browser support - -Chart.js offers support for all browsers where canvas is supported. - -Browser support for the canvas element is available in all modern & major mobile browsers (http://caniuse.com/#feat=canvas). - -Thanks to BrowserStack for allowing our team to test on thousands of browsers. - - -### Bugs & issues - -Please report these on the GitHub page - at github.com/chartjs/Chart.js. If you could include a link to a simple jsbin or similar to demonstrate the issue, that'd be really helpful. - - -### Contributing - -New contributions to the library are welcome, but we ask that you please follow these guidelines: - -- Use tabs for indentation, not spaces. -- Only change the individual files in `/src`. -- Check that your code will pass `eslint` code standards, `gulp lint` will run this for you. -- Check that your code will pass tests, `gulp test` will run tests for you. -- Keep pull requests concise, and document new functionality in the relevant `.md` file. -- Consider whether your changes are useful for all users, or if creating a Chart.js plugin would be more appropriate. - -### License - -Chart.js is open source and available under the MIT license. - -### Charting Library Comparison - -Library Features - -| Feature | Chart.js | D3 | HighCharts | Chartist | -| ------- | -------- | --- | ---------- | -------- | -| Completely Free | ✓ | ✓ | | ✓ | -| Canvas | ✓ | | | | -| SVG | | ✓ | ✓ | ✓ | -| Built-in Charts | ✓ | | ✓ | ✓ | -| 8+ Chart Types | ✓ | ✓ | ✓ | | -| Extendable to Custom Charts | ✓ | ✓ | | | -| Supports Modern Browsers | ✓ | ✓ | ✓ | ✓ | -| Extensive Documentation | ✓ | ✓ | ✓ | ✓ | -| Open Source | ✓ | ✓ | ✓ | ✓ | - -Built in Chart Types - -| Type | Chart.js | HighCharts | Chartist | -| ---- | -------- | ---------- | -------- | -| Combined Types | ✓ | ✓ | | -| Line | ✓ | ✓ | ✓ | -| Bar | ✓ | ✓ | ✓ | -| Horizontal Bar | ✓ | ✓ | ✓ | -| Pie/Doughnut | ✓ | ✓ | ✓ | -| Polar Area | ✓ | ✓ | | -| Radar | ✓ | | | -| Scatter | ✓ | ✓ | ✓ | -| Bubble | ✓ | | | -| Gauges | | ✓ | | -| Maps (Heat/Tree/etc.) | | ✓ | | - -### Popular Plugins - -There are many plugins that add additional functionality to Chart.js. Some particularly notable ones are listed here. In addition, many plugins can be found on the [Chart.js GitHub organization](https://github.com/chartjs). - - - chartjs-plugin-annotation.js - Draw lines and boxes on chart area - - chartjs-plugin-deferred.js - Defer initial chart update until chart scrolls into viewport - - chartjs-plugin-draggable.js - Makes select chart elements draggable with the mouse - - chartjs-plugin-zoom.js - Enable zooming and panning on charts - - Chart.BarFunnel.js - Adds a bar funnel chart type - - Chart.LinearGauge.js - Adds a linear gauge chart type - - Chart.Smith.js - Adds a smith chart type - -### Popular Extensions - -There are many extensions which are available for use with popular frameworks. Some particularly notable ones are listed here. - -#### Angular - - angular-chart.js - - tc-angular-chartjs - - angular-chartjs - - Angular Chart-js Directive - -#### React - - react-chartjs2 - - react-chartjs-2 - -#### Django - - Django JChart - - Django Chartjs - -#### Ruby on Rails - - chartjs-ror - -#### Laravel - - laravel-chartjs - -#### Vue.js - - vue-chartjs diff --git a/system/templates/js/chart-js/docs/Chart.js b/system/templates/js/chart-js/docs/Chart.js deleted file mode 100755 index a25acef1d..000000000 --- a/system/templates/js/chart-js/docs/Chart.js +++ /dev/null @@ -1,1443 +0,0 @@ -/*! - * Chart.js - * http://chartjs.org/ - * - * Copyright 2013 Nick Downie - * Released under the MIT license - * https://github.com/nnnick/Chart.js/blob/master/LICENSE.md - */ - -//Define the global Chart Variable as a class. -var Chart = function(context){ - - var chart = this; - - - //Easing functions adapted from Robert Penner's easing equations - //http://www.robertpenner.com/easing/ - - var animationOptions = { - linear : function (t){ - return t; - }, - easeInQuad: function (t) { - return t*t; - }, - easeOutQuad: function (t) { - return -1 *t*(t-2); - }, - easeInOutQuad: function (t) { - if ((t/=1/2) < 1) return 1/2*t*t; - return -1/2 * ((--t)*(t-2) - 1); - }, - easeInCubic: function (t) { - return t*t*t; - }, - easeOutCubic: function (t) { - return 1*((t=t/1-1)*t*t + 1); - }, - easeInOutCubic: function (t) { - if ((t/=1/2) < 1) return 1/2*t*t*t; - return 1/2*((t-=2)*t*t + 2); - }, - easeInQuart: function (t) { - return t*t*t*t; - }, - easeOutQuart: function (t) { - return -1 * ((t=t/1-1)*t*t*t - 1); - }, - easeInOutQuart: function (t) { - if ((t/=1/2) < 1) return 1/2*t*t*t*t; - return -1/2 * ((t-=2)*t*t*t - 2); - }, - easeInQuint: function (t) { - return 1*(t/=1)*t*t*t*t; - }, - easeOutQuint: function (t) { - return 1*((t=t/1-1)*t*t*t*t + 1); - }, - easeInOutQuint: function (t) { - if ((t/=1/2) < 1) return 1/2*t*t*t*t*t; - return 1/2*((t-=2)*t*t*t*t + 2); - }, - easeInSine: function (t) { - return -1 * Math.cos(t/1 * (Math.PI/2)) + 1; - }, - easeOutSine: function (t) { - return 1 * Math.sin(t/1 * (Math.PI/2)); - }, - easeInOutSine: function (t) { - return -1/2 * (Math.cos(Math.PI*t/1) - 1); - }, - easeInExpo: function (t) { - return (t==0) ? 1 : 1 * Math.pow(2, 10 * (t/1 - 1)); - }, - easeOutExpo: function (t) { - return (t==1) ? 1 : 1 * (-Math.pow(2, -10 * t/1) + 1); - }, - easeInOutExpo: function (t) { - if (t==0) return 0; - if (t==1) return 1; - if ((t/=1/2) < 1) return 1/2 * Math.pow(2, 10 * (t - 1)); - return 1/2 * (-Math.pow(2, -10 * --t) + 2); - }, - easeInCirc: function (t) { - if (t>=1) return t; - return -1 * (Math.sqrt(1 - (t/=1)*t) - 1); - }, - easeOutCirc: function (t) { - return 1 * Math.sqrt(1 - (t=t/1-1)*t); - }, - easeInOutCirc: function (t) { - if ((t/=1/2) < 1) return -1/2 * (Math.sqrt(1 - t*t) - 1); - return 1/2 * (Math.sqrt(1 - (t-=2)*t) + 1); - }, - easeInElastic: function (t) { - var s=1.70158;var p=0;var a=1; - if (t==0) return 0; if ((t/=1)==1) return 1; if (!p) p=1*.3; - if (a < Math.abs(1)) { a=1; var s=p/4; } - else var s = p/(2*Math.PI) * Math.asin (1/a); - return -(a*Math.pow(2,10*(t-=1)) * Math.sin( (t*1-s)*(2*Math.PI)/p )); - }, - easeOutElastic: function (t) { - var s=1.70158;var p=0;var a=1; - if (t==0) return 0; if ((t/=1)==1) return 1; if (!p) p=1*.3; - if (a < Math.abs(1)) { a=1; var s=p/4; } - else var s = p/(2*Math.PI) * Math.asin (1/a); - return a*Math.pow(2,-10*t) * Math.sin( (t*1-s)*(2*Math.PI)/p ) + 1; - }, - easeInOutElastic: function (t) { - var s=1.70158;var p=0;var a=1; - if (t==0) return 0; if ((t/=1/2)==2) return 1; if (!p) p=1*(.3*1.5); - if (a < Math.abs(1)) { a=1; var s=p/4; } - else var s = p/(2*Math.PI) * Math.asin (1/a); - if (t < 1) return -.5*(a*Math.pow(2,10*(t-=1)) * Math.sin( (t*1-s)*(2*Math.PI)/p )); - return a*Math.pow(2,-10*(t-=1)) * Math.sin( (t*1-s)*(2*Math.PI)/p )*.5 + 1; - }, - easeInBack: function (t) { - var s = 1.70158; - return 1*(t/=1)*t*((s+1)*t - s); - }, - easeOutBack: function (t) { - var s = 1.70158; - return 1*((t=t/1-1)*t*((s+1)*t + s) + 1); - }, - easeInOutBack: function (t) { - var s = 1.70158; - if ((t/=1/2) < 1) return 1/2*(t*t*(((s*=(1.525))+1)*t - s)); - return 1/2*((t-=2)*t*(((s*=(1.525))+1)*t + s) + 2); - }, - easeInBounce: function (t) { - return 1 - animationOptions.easeOutBounce (1-t); - }, - easeOutBounce: function (t) { - if ((t/=1) < (1/2.75)) { - return 1*(7.5625*t*t); - } else if (t < (2/2.75)) { - return 1*(7.5625*(t-=(1.5/2.75))*t + .75); - } else if (t < (2.5/2.75)) { - return 1*(7.5625*(t-=(2.25/2.75))*t + .9375); - } else { - return 1*(7.5625*(t-=(2.625/2.75))*t + .984375); - } - }, - easeInOutBounce: function (t) { - if (t < 1/2) return animationOptions.easeInBounce (t*2) * .5; - return animationOptions.easeOutBounce (t*2-1) * .5 + 1*.5; - } - }; - - //Variables global to the chart - var width = context.canvas.width; - var height = context.canvas.height; - - - //High pixel density displays - multiply the size of the canvas height/width by the device pixel ratio, then scale. - if (window.devicePixelRatio) { - context.canvas.style.width = width + "px"; - context.canvas.style.height = height + "px"; - context.canvas.height = height * window.devicePixelRatio; - context.canvas.width = width * window.devicePixelRatio; - context.scale(window.devicePixelRatio, window.devicePixelRatio); - } - - this.PolarArea = function(data,options){ - - chart.PolarArea.defaults = { - scaleOverlay : true, - scaleOverride : false, - scaleSteps : null, - scaleStepWidth : null, - scaleStartValue : null, - scaleShowLine : true, - scaleLineColor : "rgba(0,0,0,.1)", - scaleLineWidth : 1, - scaleShowLabels : true, - scaleLabel : "<%=value%>", - scaleFontFamily : "'Arial'", - scaleFontSize : 12, - scaleFontStyle : "normal", - scaleFontColor : "#666", - scaleShowLabelBackdrop : true, - scaleBackdropColor : "rgba(255,255,255,0.75)", - scaleBackdropPaddingY : 2, - scaleBackdropPaddingX : 2, - segmentShowStroke : true, - segmentStrokeColor : "#fff", - segmentStrokeWidth : 2, - animation : true, - animationSteps : 100, - animationEasing : "easeOutBounce", - animateRotate : true, - animateScale : false, - onAnimationComplete : null - }; - - var config = (options)? mergeChartConfig(chart.PolarArea.defaults,options) : chart.PolarArea.defaults; - - return new PolarArea(data,config,context); - }; - - this.Radar = function(data,options){ - - chart.Radar.defaults = { - scaleOverlay : false, - scaleOverride : false, - scaleSteps : null, - scaleStepWidth : null, - scaleStartValue : null, - scaleShowLine : true, - scaleLineColor : "rgba(0,0,0,.1)", - scaleLineWidth : 1, - scaleShowLabels : false, - scaleLabel : "<%=value%>", - scaleFontFamily : "'Arial'", - scaleFontSize : 12, - scaleFontStyle : "normal", - scaleFontColor : "#666", - scaleShowLabelBackdrop : true, - scaleBackdropColor : "rgba(255,255,255,0.75)", - scaleBackdropPaddingY : 2, - scaleBackdropPaddingX : 2, - angleShowLineOut : true, - angleLineColor : "rgba(0,0,0,.1)", - angleLineWidth : 1, - pointLabelFontFamily : "'Arial'", - pointLabelFontStyle : "normal", - pointLabelFontSize : 12, - pointLabelFontColor : "#666", - pointDot : true, - pointDotRadius : 3, - pointDotStrokeWidth : 1, - datasetStroke : true, - datasetStrokeWidth : 2, - datasetFill : true, - animation : true, - animationSteps : 60, - animationEasing : "easeOutQuart", - onAnimationComplete : null - }; - - var config = (options)? mergeChartConfig(chart.Radar.defaults,options) : chart.Radar.defaults; - - return new Radar(data,config,context); - }; - - this.Pie = function(data,options){ - chart.Pie.defaults = { - segmentShowStroke : true, - segmentStrokeColor : "#fff", - segmentStrokeWidth : 2, - animation : true, - animationSteps : 100, - animationEasing : "easeOutBounce", - animateRotate : true, - animateScale : false, - onAnimationComplete : null - }; - - var config = (options)? mergeChartConfig(chart.Pie.defaults,options) : chart.Pie.defaults; - - return new Pie(data,config,context); - }; - - this.Doughnut = function(data,options){ - - chart.Doughnut.defaults = { - segmentShowStroke : true, - segmentStrokeColor : "#fff", - segmentStrokeWidth : 2, - percentageInnerCutout : 50, - animation : true, - animationSteps : 100, - animationEasing : "easeOutBounce", - animateRotate : true, - animateScale : false, - onAnimationComplete : null - }; - - var config = (options)? mergeChartConfig(chart.Doughnut.defaults,options) : chart.Doughnut.defaults; - - return new Doughnut(data,config,context); - - }; - - this.Line = function(data,options){ - - chart.Line.defaults = { - scaleOverlay : false, - scaleOverride : false, - scaleSteps : null, - scaleStepWidth : null, - scaleStartValue : null, - scaleLineColor : "rgba(0,0,0,.1)", - scaleLineWidth : 1, - scaleShowLabels : true, - scaleLabel : "<%=value%>", - scaleFontFamily : "'Arial'", - scaleFontSize : 12, - scaleFontStyle : "normal", - scaleFontColor : "#666", - scaleShowGridLines : true, - scaleGridLineColor : "rgba(0,0,0,.05)", - scaleGridLineWidth : 1, - bezierCurve : true, - pointDot : true, - pointDotRadius : 4, - pointDotStrokeWidth : 2, - datasetStroke : true, - datasetStrokeWidth : 2, - datasetFill : true, - animation : true, - animationSteps : 60, - animationEasing : "easeOutQuart", - onAnimationComplete : null - }; - var config = (options) ? mergeChartConfig(chart.Line.defaults,options) : chart.Line.defaults; - - return new Line(data,config,context); - } - - this.Bar = function(data,options){ - chart.Bar.defaults = { - scaleOverlay : false, - scaleOverride : false, - scaleSteps : null, - scaleStepWidth : null, - scaleStartValue : null, - scaleLineColor : "rgba(0,0,0,.1)", - scaleLineWidth : 1, - scaleShowLabels : true, - scaleLabel : "<%=value%>", - scaleFontFamily : "'Arial'", - scaleFontSize : 12, - scaleFontStyle : "normal", - scaleFontColor : "#666", - scaleShowGridLines : true, - scaleGridLineColor : "rgba(0,0,0,.05)", - scaleGridLineWidth : 1, - barShowStroke : true, - barStrokeWidth : 2, - barValueSpacing : 5, - barDatasetSpacing : 1, - animation : true, - animationSteps : 60, - animationEasing : "easeOutQuart", - onAnimationComplete : null - }; - var config = (options) ? mergeChartConfig(chart.Bar.defaults,options) : chart.Bar.defaults; - - return new Bar(data,config,context); - } - - var clear = function(c){ - c.clearRect(0, 0, width, height); - }; - - var PolarArea = function(data,config,ctx){ - var maxSize, scaleHop, calculatedScale, labelHeight, scaleHeight, valueBounds, labelTemplateString; - - - calculateDrawingSizes(); - - valueBounds = getValueBounds(); - - labelTemplateString = (config.scaleShowLabels)? config.scaleLabel : null; - - //Check and set the scale - if (!config.scaleOverride){ - - calculatedScale = calculateScale(scaleHeight,valueBounds.maxSteps,valueBounds.minSteps,valueBounds.maxValue,valueBounds.minValue,labelTemplateString); - } - else { - calculatedScale = { - steps : config.scaleSteps, - stepValue : config.scaleStepWidth, - graphMin : config.scaleStartValue, - labels : [] - } - for (var i=0; i upperValue) {upperValue = data[i].value;} - if (data[i].value < lowerValue) {lowerValue = data[i].value;} - }; - - var maxSteps = Math.floor((scaleHeight / (labelHeight*0.66))); - var minSteps = Math.floor((scaleHeight / labelHeight*0.5)); - - return { - maxValue : upperValue, - minValue : lowerValue, - maxSteps : maxSteps, - minSteps : minSteps - }; - - - } - } - - var Radar = function (data,config,ctx) { - var maxSize, scaleHop, calculatedScale, labelHeight, scaleHeight, valueBounds, labelTemplateString; - - //If no labels are defined set to an empty array, so referencing length for looping doesn't blow up. - if (!data.labels) data.labels = []; - - calculateDrawingSizes(); - - var valueBounds = getValueBounds(); - - labelTemplateString = (config.scaleShowLabels)? config.scaleLabel : null; - - //Check and set the scale - if (!config.scaleOverride){ - - calculatedScale = calculateScale(scaleHeight,valueBounds.maxSteps,valueBounds.minSteps,valueBounds.maxValue,valueBounds.minValue,labelTemplateString); - } - else { - calculatedScale = { - steps : config.scaleSteps, - stepValue : config.scaleStepWidth, - graphMin : config.scaleStartValue, - labels : [] - } - for (var i=0; i Math.PI){ - ctx.textAlign = "right"; - } - else{ - ctx.textAlign = "left"; - } - - ctx.textBaseline = "middle"; - - ctx.fillText(data.labels[k],opposite,-adjacent); - - } - ctx.restore(); - }; - function calculateDrawingSizes(){ - maxSize = (Min([width,height])/2); - - labelHeight = config.scaleFontSize*2; - - var labelLength = 0; - for (var i=0; ilabelLength) labelLength = textMeasurement; - } - - //Figure out whats the largest - the height of the text or the width of what's there, and minus it from the maximum usable size. - maxSize -= Max([labelLength,((config.pointLabelFontSize/2)*1.5)]); - - maxSize -= config.pointLabelFontSize; - maxSize = CapValue(maxSize, null, 0); - scaleHeight = maxSize; - //If the label height is less than 5, set it to 5 so we don't have lines on top of each other. - labelHeight = Default(labelHeight,5); - }; - function getValueBounds() { - var upperValue = Number.MIN_VALUE; - var lowerValue = Number.MAX_VALUE; - - for (var i=0; i upperValue){upperValue = data.datasets[i].data[j]} - if (data.datasets[i].data[j] < lowerValue){lowerValue = data.datasets[i].data[j]} - } - } - - var maxSteps = Math.floor((scaleHeight / (labelHeight*0.66))); - var minSteps = Math.floor((scaleHeight / labelHeight*0.5)); - - return { - maxValue : upperValue, - minValue : lowerValue, - maxSteps : maxSteps, - minSteps : minSteps - }; - - - } - } - - var Pie = function(data,config,ctx){ - var segmentTotal = 0; - - //In case we have a canvas that is not a square. Minus 5 pixels as padding round the edge. - var pieRadius = Min([height/2,width/2]) - 5; - - for (var i=0; i 0){ - ctx.save(); - ctx.textAlign = "right"; - } - else{ - ctx.textAlign = "center"; - } - ctx.fillStyle = config.scaleFontColor; - for (var i=0; i 0){ - ctx.translate(yAxisPosX + i*valueHop,xAxisPosY + config.scaleFontSize); - ctx.rotate(-(rotateLabels * (Math.PI/180))); - ctx.fillText(data.labels[i], 0,0); - ctx.restore(); - } - - else{ - ctx.fillText(data.labels[i], yAxisPosX + i*valueHop,xAxisPosY + config.scaleFontSize+3); - } - - ctx.beginPath(); - ctx.moveTo(yAxisPosX + i * valueHop, xAxisPosY+3); - - //Check i isnt 0, so we dont go over the Y axis twice. - if(config.scaleShowGridLines && i>0){ - ctx.lineWidth = config.scaleGridLineWidth; - ctx.strokeStyle = config.scaleGridLineColor; - ctx.lineTo(yAxisPosX + i * valueHop, 5); - } - else{ - ctx.lineTo(yAxisPosX + i * valueHop, xAxisPosY+3); - } - ctx.stroke(); - } - - //Y axis - ctx.lineWidth = config.scaleLineWidth; - ctx.strokeStyle = config.scaleLineColor; - ctx.beginPath(); - ctx.moveTo(yAxisPosX,xAxisPosY+5); - ctx.lineTo(yAxisPosX,5); - ctx.stroke(); - - ctx.textAlign = "right"; - ctx.textBaseline = "middle"; - for (var j=0; j longestText)? measuredText : longestText; - } - //Add a little extra padding from the y axis - longestText +=10; - } - xAxisLength = width - longestText - widestXLabel; - valueHop = Math.floor(xAxisLength/(data.labels.length-1)); - - yAxisPosX = width-widestXLabel/2-xAxisLength; - xAxisPosY = scaleHeight + config.scaleFontSize/2; - } - function calculateDrawingSizes(){ - maxSize = height; - - //Need to check the X axis first - measure the length of each text metric, and figure out if we need to rotate by 45 degrees. - ctx.font = config.scaleFontStyle + " " + config.scaleFontSize+"px " + config.scaleFontFamily; - widestXLabel = 1; - for (var i=0; i widestXLabel)? textLength : widestXLabel; - } - if (width/data.labels.length < widestXLabel){ - rotateLabels = 45; - if (width/data.labels.length < Math.cos(rotateLabels) * widestXLabel){ - rotateLabels = 90; - maxSize -= widestXLabel; - } - else{ - maxSize -= Math.sin(rotateLabels) * widestXLabel; - } - } - else{ - maxSize -= config.scaleFontSize; - } - - //Add a little padding between the x line and the text - maxSize -= 5; - - - labelHeight = config.scaleFontSize; - - maxSize -= labelHeight; - //Set 5 pixels greater than the font size to allow for a little padding from the X axis. - - scaleHeight = maxSize; - - //Then get the area above we can safely draw on. - - } - function getValueBounds() { - var upperValue = Number.MIN_VALUE; - var lowerValue = Number.MAX_VALUE; - for (var i=0; i upperValue) { upperValue = data.datasets[i].data[j] }; - if ( data.datasets[i].data[j] < lowerValue) { lowerValue = data.datasets[i].data[j] }; - } - }; - - var maxSteps = Math.floor((scaleHeight / (labelHeight*0.66))); - var minSteps = Math.floor((scaleHeight / labelHeight*0.5)); - - return { - maxValue : upperValue, - minValue : lowerValue, - maxSteps : maxSteps, - minSteps : minSteps - }; - - - } - - - } - - var Bar = function(data,config,ctx){ - var maxSize, scaleHop, calculatedScale, labelHeight, scaleHeight, valueBounds, labelTemplateString, valueHop,widestXLabel, xAxisLength,yAxisPosX,xAxisPosY,barWidth, rotateLabels = 0; - - calculateDrawingSizes(); - - valueBounds = getValueBounds(); - //Check and set the scale - labelTemplateString = (config.scaleShowLabels)? config.scaleLabel : ""; - if (!config.scaleOverride){ - - calculatedScale = calculateScale(scaleHeight,valueBounds.maxSteps,valueBounds.minSteps,valueBounds.maxValue,valueBounds.minValue,labelTemplateString); - } - else { - calculatedScale = { - steps : config.scaleSteps, - stepValue : config.scaleStepWidth, - graphMin : config.scaleStartValue, - labels : [] - } - for (var i=0; i 0){ - ctx.save(); - ctx.textAlign = "right"; - } - else{ - ctx.textAlign = "center"; - } - ctx.fillStyle = config.scaleFontColor; - for (var i=0; i 0){ - ctx.translate(yAxisPosX + i*valueHop,xAxisPosY + config.scaleFontSize); - ctx.rotate(-(rotateLabels * (Math.PI/180))); - ctx.fillText(data.labels[i], 0,0); - ctx.restore(); - } - - else{ - ctx.fillText(data.labels[i], yAxisPosX + i*valueHop + valueHop/2,xAxisPosY + config.scaleFontSize+3); - } - - ctx.beginPath(); - ctx.moveTo(yAxisPosX + (i+1) * valueHop, xAxisPosY+3); - - //Check i isnt 0, so we dont go over the Y axis twice. - ctx.lineWidth = config.scaleGridLineWidth; - ctx.strokeStyle = config.scaleGridLineColor; - ctx.lineTo(yAxisPosX + (i+1) * valueHop, 5); - ctx.stroke(); - } - - //Y axis - ctx.lineWidth = config.scaleLineWidth; - ctx.strokeStyle = config.scaleLineColor; - ctx.beginPath(); - ctx.moveTo(yAxisPosX,xAxisPosY+5); - ctx.lineTo(yAxisPosX,5); - ctx.stroke(); - - ctx.textAlign = "right"; - ctx.textBaseline = "middle"; - for (var j=0; j longestText)? measuredText : longestText; - } - //Add a little extra padding from the y axis - longestText +=10; - } - xAxisLength = width - longestText - widestXLabel; - valueHop = Math.floor(xAxisLength/(data.labels.length)); - - barWidth = (valueHop - config.scaleGridLineWidth*2 - (config.barValueSpacing*2) - (config.barDatasetSpacing*data.datasets.length-1) - ((config.barStrokeWidth/2)*data.datasets.length-1))/data.datasets.length; - - yAxisPosX = width-widestXLabel/2-xAxisLength; - xAxisPosY = scaleHeight + config.scaleFontSize/2; - } - function calculateDrawingSizes(){ - maxSize = height; - - //Need to check the X axis first - measure the length of each text metric, and figure out if we need to rotate by 45 degrees. - ctx.font = config.scaleFontStyle + " " + config.scaleFontSize+"px " + config.scaleFontFamily; - widestXLabel = 1; - for (var i=0; i widestXLabel)? textLength : widestXLabel; - } - if (width/data.labels.length < widestXLabel){ - rotateLabels = 45; - if (width/data.labels.length < Math.cos(rotateLabels) * widestXLabel){ - rotateLabels = 90; - maxSize -= widestXLabel; - } - else{ - maxSize -= Math.sin(rotateLabels) * widestXLabel; - } - } - else{ - maxSize -= config.scaleFontSize; - } - - //Add a little padding between the x line and the text - maxSize -= 5; - - - labelHeight = config.scaleFontSize; - - maxSize -= labelHeight; - //Set 5 pixels greater than the font size to allow for a little padding from the X axis. - - scaleHeight = maxSize; - - //Then get the area above we can safely draw on. - - } - function getValueBounds() { - var upperValue = Number.MIN_VALUE; - var lowerValue = Number.MAX_VALUE; - for (var i=0; i upperValue) { upperValue = data.datasets[i].data[j] }; - if ( data.datasets[i].data[j] < lowerValue) { lowerValue = data.datasets[i].data[j] }; - } - }; - - var maxSteps = Math.floor((scaleHeight / (labelHeight*0.66))); - var minSteps = Math.floor((scaleHeight / labelHeight*0.5)); - - return { - maxValue : upperValue, - minValue : lowerValue, - maxSteps : maxSteps, - minSteps : minSteps - }; - - - } - } - - function calculateOffset(val,calculatedScale,scaleHop){ - var outerValue = calculatedScale.steps * calculatedScale.stepValue; - var adjustedValue = val - calculatedScale.graphMin; - var scalingFactor = CapValue(adjustedValue/outerValue,1,0); - return (scaleHop*calculatedScale.steps) * scalingFactor; - } - - function animationLoop(config,drawScale,drawData,ctx){ - var animFrameAmount = (config.animation)? 1/CapValue(config.animationSteps,Number.MAX_VALUE,1) : 1, - easingFunction = animationOptions[config.animationEasing], - percentAnimComplete =(config.animation)? 0 : 1; - - - - if (typeof drawScale !== "function") drawScale = function(){}; - - requestAnimFrame(animLoop); - - function animateFrame(){ - var easeAdjustedAnimationPercent =(config.animation)? CapValue(easingFunction(percentAnimComplete),null,0) : 1; - clear(ctx); - if(config.scaleOverlay){ - drawData(easeAdjustedAnimationPercent); - drawScale(); - } else { - drawScale(); - drawData(easeAdjustedAnimationPercent); - } - } - function animLoop(){ - //We need to check if the animation is incomplete (less than 1), or complete (1). - percentAnimComplete += animFrameAmount; - animateFrame(); - //Stop the loop continuing forever - if (percentAnimComplete <= 1){ - requestAnimFrame(animLoop); - } - else{ - if (typeof config.onAnimationComplete == "function") config.onAnimationComplete(); - } - - } - - } - - //Declare global functions to be called within this namespace here. - - - // shim layer with setTimeout fallback - var requestAnimFrame = (function(){ - return window.requestAnimationFrame || - window.webkitRequestAnimationFrame || - window.mozRequestAnimationFrame || - window.oRequestAnimationFrame || - window.msRequestAnimationFrame || - function(callback) { - window.setTimeout(callback, 1000 / 60); - }; - })(); - - function calculateScale(drawingHeight,maxSteps,minSteps,maxValue,minValue,labelTemplateString){ - var graphMin,graphMax,graphRange,stepValue,numberOfSteps,valueRange,rangeOrderOfMagnitude,decimalNum; - - valueRange = maxValue - minValue; - - rangeOrderOfMagnitude = calculateOrderOfMagnitude(valueRange); - - graphMin = Math.floor(minValue / (1 * Math.pow(10, rangeOrderOfMagnitude))) * Math.pow(10, rangeOrderOfMagnitude); - - graphMax = Math.ceil(maxValue / (1 * Math.pow(10, rangeOrderOfMagnitude))) * Math.pow(10, rangeOrderOfMagnitude); - - graphRange = graphMax - graphMin; - - stepValue = Math.pow(10, rangeOrderOfMagnitude); - - numberOfSteps = Math.round(graphRange / stepValue); - - //Compare number of steps to the max and min for that size graph, and add in half steps if need be. - while(numberOfSteps < minSteps || numberOfSteps > maxSteps) { - if (numberOfSteps < minSteps){ - stepValue /= 2; - numberOfSteps = Math.round(graphRange/stepValue); - } - else{ - stepValue *=2; - numberOfSteps = Math.round(graphRange/stepValue); - } - }; - - - - //Create an array of all the labels by interpolating the string. - - var labels = []; - - if(labelTemplateString){ - //Fix floating point errors by setting to fixed the on the same decimal as the stepValue. - for (var i=1; i maxValue ) { - return maxValue; - } - } - if(isNumber(minValue)){ - if ( valueToCap < minValue ){ - return minValue; - } - } - return valueToCap; - } - function getDecimalPlaces (num){ - var numberOfDecimalPlaces; - if (num%1!=0){ - return num.toString().split(".")[1].length - } - else{ - return 0; - } - - } - - function mergeChartConfig(defaults,userDefined){ - var returnObj = {}; - for (var attrname in defaults) { returnObj[attrname] = defaults[attrname]; } - for (var attrname in userDefined) { returnObj[attrname] = userDefined[attrname]; } - return returnObj; - } - - //Javascript micro templating by John Resig - source at http://ejohn.org/blog/javascript-micro-templating/ - var cache = {}; - - function tmpl(str, data){ - // Figure out if we're getting a template, or if we need to - // load the template - and be sure to cache the result. - var fn = !/\W/.test(str) ? - cache[str] = cache[str] || - tmpl(document.getElementById(str).innerHTML) : - - // Generate a reusable function that will serve as a template - // generator (and which will be cached). - new Function("obj", - "var p=[],print=function(){p.push.apply(p,arguments);};" + - - // Introduce the data as local variables using with(){} - "with(obj){p.push('" + - - // Convert the template into pure JavaScript - str - .replace(/[\r\t\n]/g, " ") - .split("<%").join("\t") - .replace(/((^|%>)[^\t]*)'/g, "$1\r") - .replace(/\t=(.*?)%>/g, "',$1,'") - .split("\t").join("');") - .split("%>").join("p.push('") - .split("\r").join("\\'") - + "');}return p.join('');"); - - // Provide some basic currying to the user - return data ? fn( data ) : fn; - }; -} - - - diff --git a/system/templates/js/chart-js/docs/index.html b/system/templates/js/chart-js/docs/index.html deleted file mode 100755 index ef6f522c3..000000000 --- a/system/templates/js/chart-js/docs/index.html +++ /dev/null @@ -1,766 +0,0 @@ - - - - Chart.js Documentation - - - - - - - - -
-
-
-
- - -
-

Chart.js Documentation

-

Everything you need to know to create great looking charts using Chart.js

-
-

Getting started

-

Include Chart.js

-

First we need to include the Chart.js library on the page. The library occupies a global variable of Chart.

-
<script src="Chart.js"></script>
-

Creating a chart

-

To create a chart, we need to instantiate the Chart class. To do this, we need to pass in the 2d context of where we want to draw the chart. Here's an example.

-
<canvas id="myChart" width="400" height="400"></canvas>
-
//Get the context of the canvas element we want to select
-var ctx = document.getElementById("myChart").getContext("2d");
-var myNewChart = new Chart(ctx).PolarArea(data);
-

We can also get the context of our canvas with jQuery. To do this, we need to get the DOM node out of the jQuery collection, and call the getContext("2d") method on that.

-
//Get context with jQuery - using jQuery's .get() method.
-var ctx = $("#myChart").get(0).getContext("2d");
-//This will get the first returned node in the jQuery collection.
-var myNewChart = new Chart(ctx);
-

After we've instantiated the Chart class on the canvas we want to draw on, Chart.js will handle the scaling for retina displays.

-

With the Chart class set up, we can go on to create one of the charts Chart.js has available. In the example below, we would be drawing a Polar area chart.

-
new Chart(ctx).PolarArea(data,options);
-

We call a method of the name of the chart we want to create. We pass in the data for that chart type, and the options for that chart as parameters. Chart.js will merge the options you pass in with the default options for that chart type.

-
- -
-

Line chart

-

Introduction

-

A line chart is a way of plotting data points on a line.

-

Often, it is used to show trend data, and the comparison of two data sets.

-

Example usage

- -
new Chart(ctx).Line(data,options);
-

Data structure

-
var data = {
-	labels : ["January","February","March","April","May","June","July"],
-	datasets : [
-		{
-			fillColor : "rgba(220,220,220,0.5)",
-			strokeColor : "rgba(220,220,220,1)",
-			pointColor : "rgba(220,220,220,1)",
-			pointStrokeColor : "#fff",
-			data : [65,59,90,81,56,55,40]
-		},
-		{
-			fillColor : "rgba(151,187,205,0.5)",
-			strokeColor : "rgba(151,187,205,1)",
-			pointColor : "rgba(151,187,205,1)",
-			pointStrokeColor : "#fff",
-			data : [28,48,40,19,96,27,100]
-		}
-	]
-}
-

The line chart requires an array of labels for each of the data points. This is show on the X axis.

-

The data for line charts is broken up into an array of datasets. Each dataset has a colour for the fill, a colour for the line and colours for the points and strokes of the points. These colours are strings just like CSS. You can use RGBA, RGB, HEX or HSL notation.

- -

Chart options

-
Line.defaults = {
-				
-	//Boolean - If we show the scale above the chart data			
-	scaleOverlay : false,
-	
-	//Boolean - If we want to override with a hard coded scale
-	scaleOverride : false,
-	
-	//** Required if scaleOverride is true **
-	//Number - The number of steps in a hard coded scale
-	scaleSteps : null,
-	//Number - The value jump in the hard coded scale
-	scaleStepWidth : null,
-	//Number - The scale starting value
-	scaleStartValue : null,
-
-	//String - Colour of the scale line	
-	scaleLineColor : "rgba(0,0,0,.1)",
-	
-	//Number - Pixel width of the scale line	
-	scaleLineWidth : 1,
-
-	//Boolean - Whether to show labels on the scale	
-	scaleShowLabels : true,
-	
-	//Interpolated JS string - can access value
-	scaleLabel : "<%=value%>",
-	
-	//String - Scale label font declaration for the scale label
-	scaleFontFamily : "'Arial'",
-	
-	//Number - Scale label font size in pixels	
-	scaleFontSize : 12,
-	
-	//String - Scale label font weight style	
-	scaleFontStyle : "normal",
-	
-	//String - Scale label font colour	
-	scaleFontColor : "#666",	
-	
-	///Boolean - Whether grid lines are shown across the chart
-	scaleShowGridLines : true,
-	
-	//String - Colour of the grid lines
-	scaleGridLineColor : "rgba(0,0,0,.05)",
-	
-	//Number - Width of the grid lines
-	scaleGridLineWidth : 1,	
-	
-	//Boolean - Whether the line is curved between points
-	bezierCurve : true,
-	
-	//Boolean - Whether to show a dot for each point
-	pointDot : true,
-	
-	//Number - Radius of each point dot in pixels
-	pointDotRadius : 3,
-	
-	//Number - Pixel width of point dot stroke
-	pointDotStrokeWidth : 1,
-	
-	//Boolean - Whether to show a stroke for datasets
-	datasetStroke : true,
-	
-	//Number - Pixel width of dataset stroke
-	datasetStrokeWidth : 2,
-	
-	//Boolean - Whether to fill the dataset with a colour
-	datasetFill : true,
-	
-	//Boolean - Whether to animate the chart
-	animation : true,
-
-	//Number - Number of animation steps
-	animationSteps : 60,
-	
-	//String - Animation easing effect
-	animationEasing : "easeOutQuart",
-
-	//Function - Fires when the animation is complete
-	onAnimationComplete : null
-	
-}
-
- -
-

Bar chart

-

Introduction

-

A bar chart is a way of showing data as bars.

-

It is sometimes used to show trend data, and the comparison of multiple data sets side by side.

-

Example usage

- -
new Chart(ctx).Bar(data,options);
-

Data structure

-
var data = {
-	labels : ["January","February","March","April","May","June","July"],
-	datasets : [
-		{
-			fillColor : "rgba(220,220,220,0.5)",
-			strokeColor : "rgba(220,220,220,1)",
-			data : [65,59,90,81,56,55,40]
-		},
-		{
-			fillColor : "rgba(151,187,205,0.5)",
-			strokeColor : "rgba(151,187,205,1)",
-			data : [28,48,40,19,96,27,100]
-		}
-	]
-}
-

The bar chart has the a very similar data structure to the line chart, and has an array of datasets, each with colours and an array of data. Again, colours are in CSS format.

-

We have an array of labels too for display. In the example, we are showing the same data as the previous line chart example.

- -

Chart options

-
Bar.defaults = {
-				
-	//Boolean - If we show the scale above the chart data			
-	scaleOverlay : false,
-	
-	//Boolean - If we want to override with a hard coded scale
-	scaleOverride : false,
-	
-	//** Required if scaleOverride is true **
-	//Number - The number of steps in a hard coded scale
-	scaleSteps : null,
-	//Number - The value jump in the hard coded scale
-	scaleStepWidth : null,
-	//Number - The scale starting value
-	scaleStartValue : null,
-
-	//String - Colour of the scale line	
-	scaleLineColor : "rgba(0,0,0,.1)",
-	
-	//Number - Pixel width of the scale line	
-	scaleLineWidth : 1,
-
-	//Boolean - Whether to show labels on the scale	
-	scaleShowLabels : true,
-	
-	//Interpolated JS string - can access value
-	scaleLabel : "<%=value%>",
-	
-	//String - Scale label font declaration for the scale label
-	scaleFontFamily : "'Arial'",
-	
-	//Number - Scale label font size in pixels	
-	scaleFontSize : 12,
-	
-	//String - Scale label font weight style	
-	scaleFontStyle : "normal",
-	
-	//String - Scale label font colour	
-	scaleFontColor : "#666",	
-	
-	///Boolean - Whether grid lines are shown across the chart
-	scaleShowGridLines : true,
-	
-	//String - Colour of the grid lines
-	scaleGridLineColor : "rgba(0,0,0,.05)",
-	
-	//Number - Width of the grid lines
-	scaleGridLineWidth : 1,	
-
-	//Boolean - If there is a stroke on each bar	
-	barShowStroke : true,
-	
-	//Number - Pixel width of the bar stroke	
-	barStrokeWidth : 2,
-	
-	//Number - Spacing between each of the X value sets
-	barValueSpacing : 5,
-	
-	//Number - Spacing between data sets within X values
-	barDatasetSpacing : 1,
-	
-	//Boolean - Whether to animate the chart
-	animation : true,
-
-	//Number - Number of animation steps
-	animationSteps : 60,
-	
-	//String - Animation easing effect
-	animationEasing : "easeOutQuart",
-
-	//Function - Fires when the animation is complete
-	onAnimationComplete : null
-	
-}
-
- -
-

Radar chart

-

Introduction

-

A radar chart is a way of showing multiple data points and the variation between them.

-

They are often useful for comparing the points of two or more different data sets

-

Example usage

- -
new Chart(ctx).Radar(data,options);
-

Data structure

-
var data = {
-	labels : ["Eating","Drinking","Sleeping","Designing","Coding","Partying","Running"],
-	datasets : [
-		{
-			fillColor : "rgba(220,220,220,0.5)",
-			strokeColor : "rgba(220,220,220,1)",
-			pointColor : "rgba(220,220,220,1)",
-			pointStrokeColor : "#fff",
-			data : [65,59,90,81,56,55,40]
-		},
-		{
-			fillColor : "rgba(151,187,205,0.5)",
-			strokeColor : "rgba(151,187,205,1)",
-			pointColor : "rgba(151,187,205,1)",
-			pointStrokeColor : "#fff",
-			data : [28,48,40,19,96,27,100]
-		}
-	]
-}
-

For a radar chart, usually you will want to show a label on each point of the chart, so we include an array of strings that we show around each point in the chart. If you do not want this, you can either not include the array of labels, or choose to hide them in the chart options.

-

For the radar chart data, we have an array of datasets. Each of these is an object, with a fill colour, a stroke colour, a colour for the fill of each point, and a colour for the stroke of each point. We also have an array of data values.

- -

Chart options

-
Radar.defaults = {
-				
-	//Boolean - If we show the scale above the chart data			
-	scaleOverlay : false,
-	
-	//Boolean - If we want to override with a hard coded scale
-	scaleOverride : false,
-	
-	//** Required if scaleOverride is true **
-	//Number - The number of steps in a hard coded scale
-	scaleSteps : null,
-	//Number - The value jump in the hard coded scale
-	scaleStepWidth : null,
-	//Number - The centre starting value
-	scaleStartValue : null,
-	
-	//Boolean - Whether to show lines for each scale point
-	scaleShowLine : true,
-
-	//String - Colour of the scale line	
-	scaleLineColor : "rgba(0,0,0,.1)",
-	
-	//Number - Pixel width of the scale line	
-	scaleLineWidth : 1,
-
-	//Boolean - Whether to show labels on the scale	
-	scaleShowLabels : false,
-	
-	//Interpolated JS string - can access value
-	scaleLabel : "<%=value%>",
-	
-	//String - Scale label font declaration for the scale label
-	scaleFontFamily : "'Arial'",
-	
-	//Number - Scale label font size in pixels	
-	scaleFontSize : 12,
-	
-	//String - Scale label font weight style	
-	scaleFontStyle : "normal",
-	
-	//String - Scale label font colour	
-	scaleFontColor : "#666",
-	
-	//Boolean - Show a backdrop to the scale label
-	scaleShowLabelBackdrop : true,
-	
-	//String - The colour of the label backdrop	
-	scaleBackdropColor : "rgba(255,255,255,0.75)",
-	
-	//Number - The backdrop padding above & below the label in pixels
-	scaleBackdropPaddingY : 2,
-	
-	//Number - The backdrop padding to the side of the label in pixels	
-	scaleBackdropPaddingX : 2,
-	
-	//Boolean - Whether we show the angle lines out of the radar
-	angleShowLineOut : true,
-	
-	//String - Colour of the angle line
-	angleLineColor : "rgba(0,0,0,.1)",
-	
-	//Number - Pixel width of the angle line
-	angleLineWidth : 1,			
-	
-	//String - Point label font declaration
-	pointLabelFontFamily : "'Arial'",
-	
-	//String - Point label font weight
-	pointLabelFontStyle : "normal",
-	
-	//Number - Point label font size in pixels	
-	pointLabelFontSize : 12,
-	
-	//String - Point label font colour	
-	pointLabelFontColor : "#666",
-	
-	//Boolean - Whether to show a dot for each point
-	pointDot : true,
-	
-	//Number - Radius of each point dot in pixels
-	pointDotRadius : 3,
-	
-	//Number - Pixel width of point dot stroke
-	pointDotStrokeWidth : 1,
-	
-	//Boolean - Whether to show a stroke for datasets
-	datasetStroke : true,
-	
-	//Number - Pixel width of dataset stroke
-	datasetStrokeWidth : 2,
-	
-	//Boolean - Whether to fill the dataset with a colour
-	datasetFill : true,
-	
-	//Boolean - Whether to animate the chart
-	animation : true,
-
-	//Number - Number of animation steps
-	animationSteps : 60,
-	
-	//String - Animation easing effect
-	animationEasing : "easeOutQuart",
-
-	//Function - Fires when the animation is complete
-	onAnimationComplete : null
-	
-}
-
- -
-

Polar area chart

-

Introduction

-

Polar area charts are similar to pie charts, but each segment has the same angle - the radius of the segment differs depending on the value.

-

This type of chart is often useful when we want to show a comparison data similar to a pie chart, but also show a scale of values for context.

-

Example usage

- -
new Chart(ctx).PolarArea(data,options);
-

Data structure

-
var data = [
-	{
-		value : 30,
-		color: "#D97041"
-	},
-	{
-		value : 90,
-		color: "#C7604C"
-	},
-	{
-		value : 24,
-		color: "#21323D"
-	},
-	{
-		value : 58,
-		color: "#9D9B7F"
-	},
-	{
-		value : 82,
-		color: "#7D4F6D"
-	},
-	{
-		value : 8,
-		color: "#584A5E"
-	}
-]
-

As you can see, for the chart data you pass in an array of objects, with a value and a colour. The value attribute should be a number, while the color attribute should be a string. Similar to CSS, for this string you can use HEX notation, RGB, RGBA or HSL.

-

Chart options

-

These are the default chart options. By passing in an object with any of these attributes, Chart.js will merge these objects and the graph accordingly. Explanations of each option are commented in the code below.

-
PolarArea.defaults = {
-				
-	//Boolean - Whether we show the scale above or below the chart segments
-	scaleOverlay : true,
-	
-	//Boolean - If we want to override with a hard coded scale
-	scaleOverride : false,
-	
-	//** Required if scaleOverride is true **
-	//Number - The number of steps in a hard coded scale
-	scaleSteps : null,
-	//Number - The value jump in the hard coded scale
-	scaleStepWidth : null,
-	//Number - The centre starting value
-	scaleStartValue : null,
-	
-	//Boolean - Show line for each value in the scale
-	scaleShowLine : true,
-	
-	//String - The colour of the scale line
-	scaleLineColor : "rgba(0,0,0,.1)",
-	
-	//Number - The width of the line - in pixels
-	scaleLineWidth : 1,
-	
-	//Boolean - whether we should show text labels
-	scaleShowLabels : true,
-	
-	//Interpolated JS string - can access value
-	scaleLabel : "<%=value%>",
-	
-	//String - Scale label font declaration for the scale label
-	scaleFontFamily : "'Arial'",
-	
-	//Number - Scale label font size in pixels	
-	scaleFontSize : 12,
-	
-	//String - Scale label font weight style	
-	scaleFontStyle : "normal",
-	
-	//String - Scale label font colour	
-	scaleFontColor : "#666",
-	
-	//Boolean - Show a backdrop to the scale label
-	scaleShowLabelBackdrop : true,
-	
-	//String - The colour of the label backdrop	
-	scaleBackdropColor : "rgba(255,255,255,0.75)",
-	
-	//Number - The backdrop padding above & below the label in pixels
-	scaleBackdropPaddingY : 2,
-	
-	//Number - The backdrop padding to the side of the label in pixels	
-	scaleBackdropPaddingX : 2,
-
-	//Boolean - Stroke a line around each segment in the chart
-	segmentShowStroke : true,
-	
-	//String - The colour of the stroke on each segement.
-	segmentStrokeColor : "#fff",
-	
-	//Number - The width of the stroke value in pixels	
-	segmentStrokeWidth : 2,
-	
-	//Boolean - Whether to animate the chart or not
-	animation : true,
-	
-	//Number - Amount of animation steps
-	animationSteps : 100,
-	
-	//String - Animation easing effect.
-	animationEasing : "easeOutBounce",
-
-	//Boolean - Whether to animate the rotation of the chart
-	animateRotate : true,
-	
-	//Boolean - Whether to animate scaling the chart from the centre
-	animateScale : false,
-
-	//Function - This will fire when the animation of the chart is complete.
-	onAnimationComplete : null
-}
-
-
-

Pie chart

-

Introduction

-

Pie charts are probably the most commonly used chart there are. They are divided into segments, the arc of each segment shows a the proportional value of each piece of data.

-

They are excellent at showing the relational proportions between data.

-

Example usage

- -
new Chart(ctx).Pie(data,options);
-

Data structure

-
var data = [
-	{
-		value: 30,
-		color:"#F38630"
-	},
-	{
-		value : 50,
-		color : "#E0E4CC"
-	},
-	{
-		value : 100,
-		color : "#69D2E7"
-	}			
-]
-

For a pie chart, you must pass in an array of objects with a value and a color property. The value attribute should be a number, Chart.js will total all of the numbers and calculate the relative proportion of each. The color attribute should be a string. Similar to CSS, for this string you can use HEX notation, RGB, RGBA or HSL.

-

Chart options

-

These are the default options for the Pie chart. Pass in an object with any of these attributes to override them. -

Pie.defaults = {
-	//Boolean - Whether we should show a stroke on each segment
-	segmentShowStroke : true,
-	
-	//String - The colour of each segment stroke
-	segmentStrokeColor : "#fff",
-	
-	//Number - The width of each segment stroke
-	segmentStrokeWidth : 2,
-	
-	//Boolean - Whether we should animate the chart	
-	animation : true,
-	
-	//Number - Amount of animation steps
-	animationSteps : 100,
-	
-	//String - Animation easing effect
-	animationEasing : "easeOutBounce",
-	
-	//Boolean - Whether we animate the rotation of the Pie
-	animateRotate : true,
-
-	//Boolean - Whether we animate scaling the Pie from the centre
-	animateScale : false,
-	
-	//Function - Will fire on animation completion.
-	onAnimationComplete : null
-}
-
-
-

Doughnut chart

-

Introduction

-

Doughnut charts are similar to pie charts, however they have the centre cut out, and are therefore shaped more like a doughnut than a pie!

-

They are aso excellent at showing the relational proportions between data.

-

Example usage

- -
new Chart(ctx).Doughnut(data,options);
-

Data structure

-
var data = [
-	{
-		value: 30,
-		color:"#F7464A"
-	},
-	{
-		value : 50,
-		color : "#E2EAE9"
-	},
-	{
-		value : 100,
-		color : "#D4CCC5"
-	},
-	{
-		value : 40,
-		color : "#949FB1"
-	},
-	{
-		value : 120,
-		color : "#4D5360"
-	}
-
-]
-

For a doughnut chart, you must pass in an array of objects with a value and a color property. The value attribute should be a number, Chart.js will total all of the numbers and calculate the relative proportion of each. The color attribute should be a string. Similar to CSS, for this string you can use HEX notation, RGB, RGBA or HSL.

-

Chart options

-

These are the default options for the doughnut chart. Pass in an object with any of these attributes to override them. -

Doughnut.defaults = {
-	//Boolean - Whether we should show a stroke on each segment
-	segmentShowStroke : true,
-	
-	//String - The colour of each segment stroke
-	segmentStrokeColor : "#fff",
-	
-	//Number - The width of each segment stroke
-	segmentStrokeWidth : 2,
-	
-	//The percentage of the chart that we cut out of the middle.
-	percentageInnerCutout : 50,
-	
-	//Boolean - Whether we should animate the chart	
-	animation : true,
-	
-	//Number - Amount of animation steps
-	animationSteps : 100,
-	
-	//String - Animation easing effect
-	animationEasing : "easeOutBounce",
-	
-	//Boolean - Whether we animate the rotation of the Doughnut
-	animateRotate : true,
-
-	//Boolean - Whether we animate scaling the Doughnut from the centre
-	animateScale : false,
-	
-	//Function - Will fire on animation completion.
-	onAnimationComplete : null
-}
-
-
-

General issues

-

Chart interactivity

-

If you are looking to add interaction as a layer to charts, Chart.js is not the library for you. A better option would be using SVG, as this will let you attach event listeners to any of the elements in the chart, as these are all DOM nodes.

-

Chart.js uses the canvas element, which is a single DOM node, similar in characteristics to a static image. This does mean that it has a wider scope for compatibility, and less memory implications than SVG based charting solutions. The canvas element also allows for saving the contents as a base 64 string, allowing saving the chart as an image.

-

In SVG, all of the lines, data points and everything you see is a DOM node. As a result of this, complex charts with a lot of intricacies, or many charts on the page will often see dips in performance when scrolling or generating the chart, especially when there are multiple on the page. SVG also has relatively poor mobile support, with Android not supporting SVG at all before version 3.0, and iOS before 5.0. (caniuse.com/svg-html5).

-

Browser support

-

Browser support for the canvas element is available in all modern & major mobile browsers (caniuse.com/canvas).

-

For IE8 & below, I would recommend using the polyfill ExplorerCanvas - available at https://code.google.com/p/explorercanvas/. It falls back to Internet explorer's format VML when canvas support is not available. Example use:

-
<head>
-	<!--[if lte IE 8]>
-		<script src="excanvas.js"></script>
-	<![endif]-->
-</head>
-

Usually I would recommend feature detection to choose whether or not to load a polyfill, rather than IE conditional comments, however in this case, VML is a Microsoft proprietary format, so it will only work in IE.

-

Some important points to note in my experience using ExplorerCanvas as a fallback.

-
    -
  • Initialise charts on load rather than DOMContentReady when using the library, as sometimes a race condition will occur, and it will result in an error when trying to get the 2d context of a canvas.
  • -
  • New VML DOM elements are being created for each animation frame and there is no hardware acceleration. As a result animation is usually slow and jerky, with flashing text. It is a good idea to dynamically turn off animation based on canvas support. I recommend using the excellent Modernizr to do this.
  • -
  • When declaring fonts, the library explorercanvas requires the font name to be in single quotes inside the string. For example, instead of your scaleFontFamily property being simply "Arial", explorercanvas support, use "'Arial'" instead. Chart.js does this for default values.
  • - -
-

Bugs & issues

-

Please report these on the Github page - at github.com/nnnick/Chart.js.

-

New contributions to the library are welcome.

-

License

-

Chart.js is open source and available under the MIT license.

-
-
-
- - - - diff --git a/system/templates/js/chart-js/docs/prettify.css b/system/templates/js/chart-js/docs/prettify.css deleted file mode 100755 index 22e0d02f3..000000000 --- a/system/templates/js/chart-js/docs/prettify.css +++ /dev/null @@ -1,38 +0,0 @@ -/* Pretty printing styles. Used with prettify.js. */ -/* Vim sunburst theme by David Leibovic */ - -pre .str, code .str { color: #65B042; } /* string - green */ -pre .kwd, code .kwd { color: #E28964; } /* keyword - dark pink */ -pre .com, code .com { color: #AEAEAE; font-style: italic; } /* comment - gray */ -pre .typ, code .typ { color: #89bdff; } /* type - light blue */ -pre .lit, code .lit { color: #3387CC; } /* literal - blue */ -pre .pun, code .pun { color: #fff; } /* punctuation - white */ -pre .pln, code .pln { color: #fff; } /* plaintext - white */ -pre .tag, code .tag { color: #89bdff; } /* html/xml tag - light blue */ -pre .atn, code .atn { color: #bdb76b; } /* html/xml attribute name - khaki */ -pre .atv, code .atv { color: #65B042; } /* html/xml attribute value - green */ -pre .dec, code .dec { color: #3387CC; } /* decimal - blue */ - -pre.prettyprint, code.prettyprint { - background-color: #000; - -moz-border-radius: 8px; - -webkit-border-radius: 8px; - -o-border-radius: 8px; - -ms-border-radius: 8px; - -khtml-border-radius: 8px; - border-radius: 8px; -} - -pre.prettyprint { - width: 95%; - margin: 1em auto; - padding: 1em; - white-space: pre-wrap; -} - - -/* Specify class=linenums on a pre to get line numbering */ -ol.linenums { margin-top: 0; margin-bottom: 0; color: #AEAEAE; } /* IE indents via margin-left */ -li.L0,li.L1,li.L2,li.L3,li.L5,li.L6,li.L7,li.L8 { list-style-type: none } -/* Alternate shading for lines */ -li.L1,li.L3,li.L5,li.L7,li.L9 { } diff --git a/system/templates/js/chart-js/docs/prettify.js b/system/templates/js/chart-js/docs/prettify.js deleted file mode 100755 index 0f7ffa0c9..000000000 --- a/system/templates/js/chart-js/docs/prettify.js +++ /dev/null @@ -1,28 +0,0 @@ -var q=null;window.PR_SHOULD_USE_CONTINUATION=!0; -(function(){function L(a){function m(a){var f=a.charCodeAt(0);if(f!==92)return f;var b=a.charAt(1);return(f=r[b])?f:"0"<=b&&b<="7"?parseInt(a.substring(1),8):b==="u"||b==="x"?parseInt(a.substring(2),16):a.charCodeAt(1)}function e(a){if(a<32)return(a<16?"\\x0":"\\x")+a.toString(16);a=String.fromCharCode(a);if(a==="\\"||a==="-"||a==="["||a==="]")a="\\"+a;return a}function h(a){for(var f=a.substring(1,a.length-1).match(/\\u[\dA-Fa-f]{4}|\\x[\dA-Fa-f]{2}|\\[0-3][0-7]{0,2}|\\[0-7]{1,2}|\\[\S\s]|[^\\]/g),a= -[],b=[],o=f[0]==="^",c=o?1:0,i=f.length;c122||(d<65||j>90||b.push([Math.max(65,j)|32,Math.min(d,90)|32]),d<97||j>122||b.push([Math.max(97,j)&-33,Math.min(d,122)&-33]))}}b.sort(function(a,f){return a[0]-f[0]||f[1]-a[1]});f=[];j=[NaN,NaN];for(c=0;ci[0]&&(i[1]+1>i[0]&&b.push("-"),b.push(e(i[1])));b.push("]");return b.join("")}function y(a){for(var f=a.source.match(/\[(?:[^\\\]]|\\[\S\s])*]|\\u[\dA-Fa-f]{4}|\\x[\dA-Fa-f]{2}|\\\d+|\\[^\dux]|\(\?[!:=]|[()^]|[^()[\\^]+/g),b=f.length,d=[],c=0,i=0;c=2&&a==="["?f[c]=h(j):a!=="\\"&&(f[c]=j.replace(/[A-Za-z]/g,function(a){a=a.charCodeAt(0);return"["+String.fromCharCode(a&-33,a|32)+"]"}));return f.join("")}for(var t=0,s=!1,l=!1,p=0,d=a.length;p=5&&"lang-"===b.substring(0,5))&&!(o&&typeof o[1]==="string"))c=!1,b="src";c||(r[f]=b)}i=d;d+=f.length;if(c){c=o[1];var j=f.indexOf(c),k=j+c.length;o[2]&&(k=f.length-o[2].length,j=k-c.length);b=b.substring(5);B(l+i,f.substring(0,j),e,p);B(l+i+j,c,C(b,c),p);B(l+i+k,f.substring(k),e,p)}else p.push(l+i,b)}a.e=p}var h={},y;(function(){for(var e=a.concat(m), -l=[],p={},d=0,g=e.length;d=0;)h[n.charAt(k)]=r;r=r[1];n=""+r;p.hasOwnProperty(n)||(l.push(r),p[n]=q)}l.push(/[\S\s]/);y=L(l)})();var t=m.length;return e}function u(a){var m=[],e=[];a.tripleQuotedStrings?m.push(["str",/^(?:'''(?:[^'\\]|\\[\S\s]|''?(?=[^']))*(?:'''|$)|"""(?:[^"\\]|\\[\S\s]|""?(?=[^"]))*(?:"""|$)|'(?:[^'\\]|\\[\S\s])*(?:'|$)|"(?:[^"\\]|\\[\S\s])*(?:"|$))/,q,"'\""]):a.multiLineStrings?m.push(["str",/^(?:'(?:[^'\\]|\\[\S\s])*(?:'|$)|"(?:[^"\\]|\\[\S\s])*(?:"|$)|`(?:[^\\`]|\\[\S\s])*(?:`|$))/, -q,"'\"`"]):m.push(["str",/^(?:'(?:[^\n\r'\\]|\\.)*(?:'|$)|"(?:[^\n\r"\\]|\\.)*(?:"|$))/,q,"\"'"]);a.verbatimStrings&&e.push(["str",/^@"(?:[^"]|"")*(?:"|$)/,q]);var h=a.hashComments;h&&(a.cStyleComments?(h>1?m.push(["com",/^#(?:##(?:[^#]|#(?!##))*(?:###|$)|.*)/,q,"#"]):m.push(["com",/^#(?:(?:define|elif|else|endif|error|ifdef|include|ifndef|line|pragma|undef|warning)\b|[^\n\r]*)/,q,"#"]),e.push(["str",/^<(?:(?:(?:\.\.\/)*|\/?)(?:[\w-]+(?:\/[\w-]+)+)?[\w-]+\.h|[a-z]\w*)>/,q])):m.push(["com",/^#[^\n\r]*/, -q,"#"]));a.cStyleComments&&(e.push(["com",/^\/\/[^\n\r]*/,q]),e.push(["com",/^\/\*[\S\s]*?(?:\*\/|$)/,q]));a.regexLiterals&&e.push(["lang-regex",/^(?:^^\.?|[!+-]|!=|!==|#|%|%=|&|&&|&&=|&=|\(|\*|\*=|\+=|,|-=|->|\/|\/=|:|::|;|<|<<|<<=|<=|=|==|===|>|>=|>>|>>=|>>>|>>>=|[?@[^]|\^=|\^\^|\^\^=|{|\||\|=|\|\||\|\|=|~|break|case|continue|delete|do|else|finally|instanceof|return|throw|try|typeof)\s*(\/(?=[^*/])(?:[^/[\\]|\\[\S\s]|\[(?:[^\\\]]|\\[\S\s])*(?:]|$))+\/)/]);(h=a.types)&&e.push(["typ",h]);a=(""+a.keywords).replace(/^ | $/g, -"");a.length&&e.push(["kwd",RegExp("^(?:"+a.replace(/[\s,]+/g,"|")+")\\b"),q]);m.push(["pln",/^\s+/,q," \r\n\t\xa0"]);e.push(["lit",/^@[$_a-z][\w$@]*/i,q],["typ",/^(?:[@_]?[A-Z]+[a-z][\w$@]*|\w+_t\b)/,q],["pln",/^[$_a-z][\w$@]*/i,q],["lit",/^(?:0x[\da-f]+|(?:\d(?:_\d+)*\d*(?:\.\d*)?|\.\d\+)(?:e[+-]?\d+)?)[a-z]*/i,q,"0123456789"],["pln",/^\\[\S\s]?/,q],["pun",/^.[^\s\w"-$'./@\\`]*/,q]);return x(m,e)}function D(a,m){function e(a){switch(a.nodeType){case 1:if(k.test(a.className))break;if("BR"===a.nodeName)h(a), -a.parentNode&&a.parentNode.removeChild(a);else for(a=a.firstChild;a;a=a.nextSibling)e(a);break;case 3:case 4:if(p){var b=a.nodeValue,d=b.match(t);if(d){var c=b.substring(0,d.index);a.nodeValue=c;(b=b.substring(d.index+d[0].length))&&a.parentNode.insertBefore(s.createTextNode(b),a.nextSibling);h(a);c||a.parentNode.removeChild(a)}}}}function h(a){function b(a,d){var e=d?a.cloneNode(!1):a,f=a.parentNode;if(f){var f=b(f,1),g=a.nextSibling;f.appendChild(e);for(var h=g;h;h=g)g=h.nextSibling,f.appendChild(h)}return e} -for(;!a.nextSibling;)if(a=a.parentNode,!a)return;for(var a=b(a.nextSibling,0),e;(e=a.parentNode)&&e.nodeType===1;)a=e;d.push(a)}var k=/(?:^|\s)nocode(?:\s|$)/,t=/\r\n?|\n/,s=a.ownerDocument,l;a.currentStyle?l=a.currentStyle.whiteSpace:window.getComputedStyle&&(l=s.defaultView.getComputedStyle(a,q).getPropertyValue("white-space"));var p=l&&"pre"===l.substring(0,3);for(l=s.createElement("LI");a.firstChild;)l.appendChild(a.firstChild);for(var d=[l],g=0;g=0;){var h=m[e];A.hasOwnProperty(h)?window.console&&console.warn("cannot override language handler %s",h):A[h]=a}}function C(a,m){if(!a||!A.hasOwnProperty(a))a=/^\s*=o&&(h+=2);e>=c&&(a+=2)}}catch(w){"console"in window&&console.log(w&&w.stack?w.stack:w)}}var v=["break,continue,do,else,for,if,return,while"],w=[[v,"auto,case,char,const,default,double,enum,extern,float,goto,int,long,register,short,signed,sizeof,static,struct,switch,typedef,union,unsigned,void,volatile"], -"catch,class,delete,false,import,new,operator,private,protected,public,this,throw,true,try,typeof"],F=[w,"alignof,align_union,asm,axiom,bool,concept,concept_map,const_cast,constexpr,decltype,dynamic_cast,explicit,export,friend,inline,late_check,mutable,namespace,nullptr,reinterpret_cast,static_assert,static_cast,template,typeid,typename,using,virtual,where"],G=[w,"abstract,boolean,byte,extends,final,finally,implements,import,instanceof,null,native,package,strictfp,super,synchronized,throws,transient"], -H=[G,"as,base,by,checked,decimal,delegate,descending,dynamic,event,fixed,foreach,from,group,implicit,in,interface,internal,into,is,lock,object,out,override,orderby,params,partial,readonly,ref,sbyte,sealed,stackalloc,string,select,uint,ulong,unchecked,unsafe,ushort,var"],w=[w,"debugger,eval,export,function,get,null,set,undefined,var,with,Infinity,NaN"],I=[v,"and,as,assert,class,def,del,elif,except,exec,finally,from,global,import,in,is,lambda,nonlocal,not,or,pass,print,raise,try,with,yield,False,True,None"], -J=[v,"alias,and,begin,case,class,def,defined,elsif,end,ensure,false,in,module,next,nil,not,or,redo,rescue,retry,self,super,then,true,undef,unless,until,when,yield,BEGIN,END"],v=[v,"case,done,elif,esac,eval,fi,function,in,local,set,then,until"],K=/^(DIR|FILE|vector|(de|priority_)?queue|list|stack|(const_)?iterator|(multi)?(set|map)|bitset|u?(int|float)\d*)/,N=/\S/,O=u({keywords:[F,H,w,"caller,delete,die,do,dump,elsif,eval,exit,foreach,for,goto,if,import,last,local,my,next,no,our,print,package,redo,require,sub,undef,unless,until,use,wantarray,while,BEGIN,END"+ -I,J,v],hashComments:!0,cStyleComments:!0,multiLineStrings:!0,regexLiterals:!0}),A={};k(O,["default-code"]);k(x([],[["pln",/^[^]*(?:>|$)/],["com",/^<\!--[\S\s]*?(?:--\>|$)/],["lang-",/^<\?([\S\s]+?)(?:\?>|$)/],["lang-",/^<%([\S\s]+?)(?:%>|$)/],["pun",/^(?:<[%?]|[%?]>)/],["lang-",/^]*>([\S\s]+?)<\/xmp\b[^>]*>/i],["lang-js",/^]*>([\S\s]*?)(<\/script\b[^>]*>)/i],["lang-css",/^]*>([\S\s]*?)(<\/style\b[^>]*>)/i],["lang-in.tag",/^(<\/?[a-z][^<>]*>)/i]]), -["default-markup","htm","html","mxml","xhtml","xml","xsl"]);k(x([["pln",/^\s+/,q," \t\r\n"],["atv",/^(?:"[^"]*"?|'[^']*'?)/,q,"\"'"]],[["tag",/^^<\/?[a-z](?:[\w-.:]*\w)?|\/?>$/i],["atn",/^(?!style[\s=]|on)[a-z](?:[\w:-]*\w)?/i],["lang-uq.val",/^=\s*([^\s"'>]*(?:[^\s"'/>]|\/(?=\s)))/],["pun",/^[/<->]+/],["lang-js",/^on\w+\s*=\s*"([^"]+)"/i],["lang-js",/^on\w+\s*=\s*'([^']+)'/i],["lang-js",/^on\w+\s*=\s*([^\s"'>]+)/i],["lang-css",/^style\s*=\s*"([^"]+)"/i],["lang-css",/^style\s*=\s*'([^']+)'/i],["lang-css", -/^style\s*=\s*([^\s"'>]+)/i]]),["in.tag"]);k(x([],[["atv",/^[\S\s]+/]]),["uq.val"]);k(u({keywords:F,hashComments:!0,cStyleComments:!0,types:K}),["c","cc","cpp","cxx","cyc","m"]);k(u({keywords:"null,true,false"}),["json"]);k(u({keywords:H,hashComments:!0,cStyleComments:!0,verbatimStrings:!0,types:K}),["cs"]);k(u({keywords:G,cStyleComments:!0}),["java"]);k(u({keywords:v,hashComments:!0,multiLineStrings:!0}),["bsh","csh","sh"]);k(u({keywords:I,hashComments:!0,multiLineStrings:!0,tripleQuotedStrings:!0}), -["cv","py"]);k(u({keywords:"caller,delete,die,do,dump,elsif,eval,exit,foreach,for,goto,if,import,last,local,my,next,no,our,print,package,redo,require,sub,undef,unless,until,use,wantarray,while,BEGIN,END",hashComments:!0,multiLineStrings:!0,regexLiterals:!0}),["perl","pl","pm"]);k(u({keywords:J,hashComments:!0,multiLineStrings:!0,regexLiterals:!0}),["rb"]);k(u({keywords:w,cStyleComments:!0,regexLiterals:!0}),["js"]);k(u({keywords:"all,and,by,catch,class,else,extends,false,finally,for,if,in,is,isnt,loop,new,no,not,null,of,off,on,or,return,super,then,true,try,unless,until,when,while,yes", -hashComments:3,cStyleComments:!0,multilineStrings:!0,tripleQuotedStrings:!0,regexLiterals:!0}),["coffee"]);k(x([],[["str",/^[\S\s]+/]]),["regex"]);window.prettyPrintOne=function(a,m,e){var h=document.createElement("PRE");h.innerHTML=a;e&&D(h,e);E({g:m,i:e,h:h});return h.innerHTML};window.prettyPrint=function(a){function m(){for(var e=window.PR_SHOULD_USE_CONTINUATION?l.now()+250:Infinity;p=0){b=!0;break}b||((b=(b=n.className.match(/\blinenums\b(?::(\d+))?/))?b[1]&&b[1].length?+b[1]:!0:!1)&&D(n,b),d={g:k,h:n,i:b},E(d))}p - - - Animation Callbacks - - - - - - -
- - -
-
-
- - - - - \ No newline at end of file diff --git a/system/templates/js/chart-js/samples/bar.html b/system/templates/js/chart-js/samples/bar.html deleted file mode 100755 index bf150db8f..000000000 --- a/system/templates/js/chart-js/samples/bar.html +++ /dev/null @@ -1,39 +0,0 @@ - - - - Bar Chart - - - - - - - - - - - diff --git a/system/templates/js/chart-js/samples/bar/bar-horizontal.html b/system/templates/js/chart-js/samples/bar/bar-horizontal.html deleted file mode 100644 index affcc3349..000000000 --- a/system/templates/js/chart-js/samples/bar/bar-horizontal.html +++ /dev/null @@ -1,149 +0,0 @@ - - - - - Horizontal Bar Chart - - - - - - -
- -
- - - - - - - - - diff --git a/system/templates/js/chart-js/samples/bar/bar-multi-axis.html b/system/templates/js/chart-js/samples/bar/bar-multi-axis.html deleted file mode 100644 index b35e89055..000000000 --- a/system/templates/js/chart-js/samples/bar/bar-multi-axis.html +++ /dev/null @@ -1,108 +0,0 @@ - - - - - Bar Chart Multi Axis - - - - - - -
- -
- - - - - diff --git a/system/templates/js/chart-js/samples/bar/bar-stacked-group.html b/system/templates/js/chart-js/samples/bar/bar-stacked-group.html deleted file mode 100644 index 074e3eac0..000000000 --- a/system/templates/js/chart-js/samples/bar/bar-stacked-group.html +++ /dev/null @@ -1,105 +0,0 @@ - - - - - Stacked Bar Chart with Groups - - - - - - -
- -
- - - - - diff --git a/system/templates/js/chart-js/samples/bar/bar-stacked.html b/system/templates/js/chart-js/samples/bar/bar-stacked.html deleted file mode 100644 index f80b1b6ed..000000000 --- a/system/templates/js/chart-js/samples/bar/bar-stacked.html +++ /dev/null @@ -1,102 +0,0 @@ - - - - - Stacked Bar Chart - - - - - - -
- -
- - - - - diff --git a/system/templates/js/chart-js/samples/bar/bar.html b/system/templates/js/chart-js/samples/bar/bar.html deleted file mode 100644 index d2fc4acac..000000000 --- a/system/templates/js/chart-js/samples/bar/bar.html +++ /dev/null @@ -1,144 +0,0 @@ - - - - - Bar Chart - - - - - - -
- -
- - - - - - - - - diff --git a/system/templates/js/chart-js/samples/bubble.html b/system/templates/js/chart-js/samples/bubble.html deleted file mode 100644 index d62d63759..000000000 --- a/system/templates/js/chart-js/samples/bubble.html +++ /dev/null @@ -1,191 +0,0 @@ - - - - - Bubble Chart - - - - - - -
- -
- - - - - - - - - diff --git a/system/templates/js/chart-js/samples/combo-bar-line.html b/system/templates/js/chart-js/samples/combo-bar-line.html deleted file mode 100644 index c8b5a08f8..000000000 --- a/system/templates/js/chart-js/samples/combo-bar-line.html +++ /dev/null @@ -1,101 +0,0 @@ - - - - - Combo Bar-Line Chart - - - - - - -
- -
- - - - - diff --git a/system/templates/js/chart-js/samples/data_labelling.html b/system/templates/js/chart-js/samples/data_labelling.html deleted file mode 100644 index 939e517a9..000000000 --- a/system/templates/js/chart-js/samples/data_labelling.html +++ /dev/null @@ -1,132 +0,0 @@ - - - - - - Labelling Data Points - - - - - - -
- -
- - - - - diff --git a/system/templates/js/chart-js/samples/doughnut.html b/system/templates/js/chart-js/samples/doughnut.html deleted file mode 100644 index 51b98a82a..000000000 --- a/system/templates/js/chart-js/samples/doughnut.html +++ /dev/null @@ -1,144 +0,0 @@ - - - - - Doughnut Chart - - - - - - -
- -
- - - - - - - - - diff --git a/system/templates/js/chart-js/samples/legend/pointstyle.html b/system/templates/js/chart-js/samples/legend/pointstyle.html deleted file mode 100644 index 727c7a6d8..000000000 --- a/system/templates/js/chart-js/samples/legend/pointstyle.html +++ /dev/null @@ -1,116 +0,0 @@ - - - - - Legend Point Style - - - - - - -
-
- -
-
- -
-
- - - - diff --git a/system/templates/js/chart-js/samples/legend/positions.html b/system/templates/js/chart-js/samples/legend/positions.html deleted file mode 100644 index 97bc70fa0..000000000 --- a/system/templates/js/chart-js/samples/legend/positions.html +++ /dev/null @@ -1,121 +0,0 @@ - - - - - Legend Positions - - - - - - -
-
- -
-
- -
-
- -
-
- -
-
- - - - diff --git a/system/templates/js/chart-js/samples/line.html b/system/templates/js/chart-js/samples/line.html deleted file mode 100755 index 4c6734452..000000000 --- a/system/templates/js/chart-js/samples/line.html +++ /dev/null @@ -1,43 +0,0 @@ - - - - Line Chart - - - - - - - - - - - diff --git a/system/templates/js/chart-js/samples/line/different-point-sizes.html b/system/templates/js/chart-js/samples/line/different-point-sizes.html deleted file mode 100644 index ed52cf0ae..000000000 --- a/system/templates/js/chart-js/samples/line/different-point-sizes.html +++ /dev/null @@ -1,130 +0,0 @@ - - - - - Different Point Sizes - - - - - - -
- -
- - - - diff --git a/system/templates/js/chart-js/samples/line/interpolation-modes.html b/system/templates/js/chart-js/samples/line/interpolation-modes.html deleted file mode 100644 index ff75210a6..000000000 --- a/system/templates/js/chart-js/samples/line/interpolation-modes.html +++ /dev/null @@ -1,103 +0,0 @@ - - - - - Line Chart - Cubic interpolation mode - - - - - - -
- -
-
-
- - - - - \ No newline at end of file diff --git a/system/templates/js/chart-js/samples/line/line-multi-axis.html b/system/templates/js/chart-js/samples/line/line-multi-axis.html deleted file mode 100644 index debdf369f..000000000 --- a/system/templates/js/chart-js/samples/line/line-multi-axis.html +++ /dev/null @@ -1,104 +0,0 @@ - - - - - Line Chart Multiple Axes - - - - - - -
- -
- - - - - diff --git a/system/templates/js/chart-js/samples/line/line-skip-points.html b/system/templates/js/chart-js/samples/line/line-skip-points.html deleted file mode 100644 index bb8c8c4c8..000000000 --- a/system/templates/js/chart-js/samples/line/line-skip-points.html +++ /dev/null @@ -1,95 +0,0 @@ - - - - - Line Chart - - - - - - -
- -
- - - - diff --git a/system/templates/js/chart-js/samples/line/line-stacked-area.html b/system/templates/js/chart-js/samples/line/line-stacked-area.html deleted file mode 100644 index 041c9a84b..000000000 --- a/system/templates/js/chart-js/samples/line/line-stacked-area.html +++ /dev/null @@ -1,183 +0,0 @@ - - - - - Line Chart - - - - - - -
- -
-
-
- - - - - - - - - diff --git a/system/templates/js/chart-js/samples/line/line-stepped.html b/system/templates/js/chart-js/samples/line/line-stepped.html deleted file mode 100644 index ff1bf2a6e..000000000 --- a/system/templates/js/chart-js/samples/line/line-stepped.html +++ /dev/null @@ -1,93 +0,0 @@ - - - - - Stepped Line Chart - - - - - - -
- -
- - - - diff --git a/system/templates/js/chart-js/samples/line/line-styles.html b/system/templates/js/chart-js/samples/line/line-styles.html deleted file mode 100644 index 0ac3aabdb..000000000 --- a/system/templates/js/chart-js/samples/line/line-styles.html +++ /dev/null @@ -1,111 +0,0 @@ - - - - - Line Styles - - - - - - -
- -
- - - - diff --git a/system/templates/js/chart-js/samples/line/line.html b/system/templates/js/chart-js/samples/line/line.html deleted file mode 100644 index 68ae7e5f6..000000000 --- a/system/templates/js/chart-js/samples/line/line.html +++ /dev/null @@ -1,163 +0,0 @@ - - - - - Line Chart - - - - - - -
- -
-
-
- - - - - - - - - diff --git a/system/templates/js/chart-js/samples/line/point-styles.html b/system/templates/js/chart-js/samples/line/point-styles.html deleted file mode 100644 index 0056e7499..000000000 --- a/system/templates/js/chart-js/samples/line/point-styles.html +++ /dev/null @@ -1,96 +0,0 @@ - - - - - Line Chart - - - - - - -
-
- - - - diff --git a/system/templates/js/chart-js/samples/pie.html b/system/templates/js/chart-js/samples/pie.html deleted file mode 100644 index c299af961..000000000 --- a/system/templates/js/chart-js/samples/pie.html +++ /dev/null @@ -1,97 +0,0 @@ - - - - - Pie Chart - - - - - -
- -
- - - - - - - diff --git a/system/templates/js/chart-js/samples/polar-area.html b/system/templates/js/chart-js/samples/polar-area.html deleted file mode 100644 index 48fe984af..000000000 --- a/system/templates/js/chart-js/samples/polar-area.html +++ /dev/null @@ -1,117 +0,0 @@ - - - - - Polar Area Chart - - - - - - -
- -
- - - - - - - diff --git a/system/templates/js/chart-js/samples/polarArea.html b/system/templates/js/chart-js/samples/polarArea.html deleted file mode 100755 index dcc055b68..000000000 --- a/system/templates/js/chart-js/samples/polarArea.html +++ /dev/null @@ -1,44 +0,0 @@ - - - - Polar Area Chart - - - - - - - - - - - diff --git a/system/templates/js/chart-js/samples/radar.html b/system/templates/js/chart-js/samples/radar.html deleted file mode 100755 index 0ffdad91c..000000000 --- a/system/templates/js/chart-js/samples/radar.html +++ /dev/null @@ -1,43 +0,0 @@ - - - - Radar Chart - - - - - - - - - - - diff --git a/system/templates/js/chart-js/samples/radar/radar-skip-points.html b/system/templates/js/chart-js/samples/radar/radar-skip-points.html deleted file mode 100644 index ab29b3a0e..000000000 --- a/system/templates/js/chart-js/samples/radar/radar-skip-points.html +++ /dev/null @@ -1,109 +0,0 @@ - - - - - Radar Chart - - - - - - -
- -
- - - - - diff --git a/system/templates/js/chart-js/samples/radar/radar.html b/system/templates/js/chart-js/samples/radar/radar.html deleted file mode 100644 index 586e2df7a..000000000 --- a/system/templates/js/chart-js/samples/radar/radar.html +++ /dev/null @@ -1,146 +0,0 @@ - - - - - Radar Chart - - - - - - -
- -
- - - - - - - - - diff --git a/system/templates/js/chart-js/samples/scales/display-settings.html b/system/templates/js/chart-js/samples/scales/display-settings.html deleted file mode 100644 index 0c2dc114e..000000000 --- a/system/templates/js/chart-js/samples/scales/display-settings.html +++ /dev/null @@ -1,124 +0,0 @@ - - - - - Suggested Min/Max Settings - - - - - - -
- - - - diff --git a/system/templates/js/chart-js/samples/scales/filtering-labels.html b/system/templates/js/chart-js/samples/scales/filtering-labels.html deleted file mode 100644 index 4af89025e..000000000 --- a/system/templates/js/chart-js/samples/scales/filtering-labels.html +++ /dev/null @@ -1,93 +0,0 @@ - - - - - Chart with xAxis Filtering - - - - - - -
- -
- - - - diff --git a/system/templates/js/chart-js/samples/scales/gridlines.html b/system/templates/js/chart-js/samples/scales/gridlines.html deleted file mode 100644 index 76bb1f007..000000000 --- a/system/templates/js/chart-js/samples/scales/gridlines.html +++ /dev/null @@ -1,69 +0,0 @@ - - - - - Suggested Min/Max Settings - - - - - - -
- -
- - - - diff --git a/system/templates/js/chart-js/samples/scales/line-non-numeric-y.html b/system/templates/js/chart-js/samples/scales/line-non-numeric-y.html deleted file mode 100644 index 07e319b70..000000000 --- a/system/templates/js/chart-js/samples/scales/line-non-numeric-y.html +++ /dev/null @@ -1,73 +0,0 @@ - - - - - Line Chart - - - - - - -
- -
- - - - diff --git a/system/templates/js/chart-js/samples/scales/linear/min-max-settings.html b/system/templates/js/chart-js/samples/scales/linear/min-max-settings.html deleted file mode 100644 index 868bc7b1d..000000000 --- a/system/templates/js/chart-js/samples/scales/linear/min-max-settings.html +++ /dev/null @@ -1,64 +0,0 @@ - - - - - Min/Max Settings - - - - - - -
- -
- - - - diff --git a/system/templates/js/chart-js/samples/scales/linear/step-size.html b/system/templates/js/chart-js/samples/scales/linear/step-size.html deleted file mode 100644 index ced0b6c3c..000000000 --- a/system/templates/js/chart-js/samples/scales/linear/step-size.html +++ /dev/null @@ -1,175 +0,0 @@ - - - - - Line Chart - - - - - - -
- -
-
-
- - - - - - - - - diff --git a/system/templates/js/chart-js/samples/scales/linear/suggested-min-max-settings.html b/system/templates/js/chart-js/samples/scales/linear/suggested-min-max-settings.html deleted file mode 100644 index 18059548a..000000000 --- a/system/templates/js/chart-js/samples/scales/linear/suggested-min-max-settings.html +++ /dev/null @@ -1,67 +0,0 @@ - - - - - Suggested Min/Max Settings - - - - - - -
- -
- - - - diff --git a/system/templates/js/chart-js/samples/scales/logarithmic/line-logarithmic.html b/system/templates/js/chart-js/samples/scales/logarithmic/line-logarithmic.html deleted file mode 100644 index 2c961abd2..000000000 --- a/system/templates/js/chart-js/samples/scales/logarithmic/line-logarithmic.html +++ /dev/null @@ -1,97 +0,0 @@ - - - - - Logarithmic Line Chart - - - - - - -
- -
- - - - - diff --git a/system/templates/js/chart-js/samples/scales/logarithmic/scatter-logX.html b/system/templates/js/chart-js/samples/scales/logarithmic/scatter-logX.html deleted file mode 100644 index a4bd577c2..000000000 --- a/system/templates/js/chart-js/samples/scales/logarithmic/scatter-logX.html +++ /dev/null @@ -1,171 +0,0 @@ - - - - - Scatter Chart - - - - - - -
- -
- - - - diff --git a/system/templates/js/chart-js/samples/scales/multiline-labels.html b/system/templates/js/chart-js/samples/scales/multiline-labels.html deleted file mode 100644 index b7bb041e9..000000000 --- a/system/templates/js/chart-js/samples/scales/multiline-labels.html +++ /dev/null @@ -1,86 +0,0 @@ - - - - - Line Chart - - - - - - -
- -
- - - - diff --git a/system/templates/js/chart-js/samples/scales/time/combo-time-scale.html b/system/templates/js/chart-js/samples/scales/time/combo-time-scale.html deleted file mode 100644 index 873e40d1a..000000000 --- a/system/templates/js/chart-js/samples/scales/time/combo-time-scale.html +++ /dev/null @@ -1,175 +0,0 @@ - - - - - Line Chart - Combo Time Scale - - - - - - - -
- -
-
-
- - - - - - - - - diff --git a/system/templates/js/chart-js/samples/scales/time/line-time-point-data.html b/system/templates/js/chart-js/samples/scales/time/line-time-point-data.html deleted file mode 100644 index d880515f5..000000000 --- a/system/templates/js/chart-js/samples/scales/time/line-time-point-data.html +++ /dev/null @@ -1,149 +0,0 @@ - - - - - Time Scale Point Data - - - - - - - -
- -
-
-
- - - - - - - diff --git a/system/templates/js/chart-js/samples/scales/time/line-time-scale.html b/system/templates/js/chart-js/samples/scales/time/line-time-scale.html deleted file mode 100644 index b1645e0dd..000000000 --- a/system/templates/js/chart-js/samples/scales/time/line-time-scale.html +++ /dev/null @@ -1,207 +0,0 @@ - - - - - Line Chart - - - - - - - -
- -
-
-
- - - - - - - - - diff --git a/system/templates/js/chart-js/samples/scatter/scatter-multi-axis.html b/system/templates/js/chart-js/samples/scatter/scatter-multi-axis.html deleted file mode 100644 index aedcd3daa..000000000 --- a/system/templates/js/chart-js/samples/scatter/scatter-multi-axis.html +++ /dev/null @@ -1,139 +0,0 @@ - - - - - Scatter Chart Multi Axis - - - - - - -
- -
- - - - - diff --git a/system/templates/js/chart-js/samples/scatter/scatter.html b/system/templates/js/chart-js/samples/scatter/scatter.html deleted file mode 100644 index b8ac32b8f..000000000 --- a/system/templates/js/chart-js/samples/scatter/scatter.html +++ /dev/null @@ -1,107 +0,0 @@ - - - - - Scatter Chart - - - - - - -
- -
- - - - - diff --git a/system/templates/js/chart-js/samples/sixup.html b/system/templates/js/chart-js/samples/sixup.html deleted file mode 100755 index 37b957e72..000000000 --- a/system/templates/js/chart-js/samples/sixup.html +++ /dev/null @@ -1,155 +0,0 @@ - - - - Doughnut Chart - - - - - -
- - - - - - -
- - - - - diff --git a/system/templates/js/chart-js/samples/tooltips/dataPoints-customTooltips.html b/system/templates/js/chart-js/samples/tooltips/dataPoints-customTooltips.html deleted file mode 100644 index b9e981675..000000000 --- a/system/templates/js/chart-js/samples/tooltips/dataPoints-customTooltips.html +++ /dev/null @@ -1,125 +0,0 @@ - - - - - Custom Tooltips using Data Points - - - - - - - -
- -
-
-
- - - - diff --git a/system/templates/js/chart-js/samples/tooltips/interaction-modes.html b/system/templates/js/chart-js/samples/tooltips/interaction-modes.html deleted file mode 100644 index 17cacf42a..000000000 --- a/system/templates/js/chart-js/samples/tooltips/interaction-modes.html +++ /dev/null @@ -1,125 +0,0 @@ - - - - - Tooltip Interaction Modes - - - - - - -
-
- - - - diff --git a/system/templates/js/chart-js/samples/tooltips/line-customTooltips.html b/system/templates/js/chart-js/samples/tooltips/line-customTooltips.html deleted file mode 100644 index 97f543b26..000000000 --- a/system/templates/js/chart-js/samples/tooltips/line-customTooltips.html +++ /dev/null @@ -1,165 +0,0 @@ - - - - - Line Chart with Custom Tooltips - - - - - - -
- -
- - - - diff --git a/system/templates/js/chart-js/samples/tooltips/pie-customTooltips.html b/system/templates/js/chart-js/samples/tooltips/pie-customTooltips.html deleted file mode 100644 index 4eedd6a3a..000000000 --- a/system/templates/js/chart-js/samples/tooltips/pie-customTooltips.html +++ /dev/null @@ -1,146 +0,0 @@ - - - - - Pie Chart with Custom Tooltips - - - - - - - -
- -
- -
-
-
- - - - - diff --git a/system/templates/js/chart-js/samples/tooltips/position-modes.html b/system/templates/js/chart-js/samples/tooltips/position-modes.html deleted file mode 100644 index 696584b06..000000000 --- a/system/templates/js/chart-js/samples/tooltips/position-modes.html +++ /dev/null @@ -1,86 +0,0 @@ - - - - - Tooltip Interaction Modes - - - - - - -
-
- - - - diff --git a/system/templates/js/chart-js/samples/tooltips/tooltip-callbacks.html b/system/templates/js/chart-js/samples/tooltips/tooltip-callbacks.html deleted file mode 100644 index 590edd1a2..000000000 --- a/system/templates/js/chart-js/samples/tooltips/tooltip-callbacks.html +++ /dev/null @@ -1,107 +0,0 @@ - - - - - Tooltip Hooks - - - - - - -
- -
- - - - diff --git a/system/templates/js/chart-js/samples/utils.js b/system/templates/js/chart-js/samples/utils.js deleted file mode 100644 index 34965ce66..000000000 --- a/system/templates/js/chart-js/samples/utils.js +++ /dev/null @@ -1,13 +0,0 @@ -window.chartColors = { - red: 'rgb(255, 99, 132)', - orange: 'rgb(255, 159, 64)', - yellow: 'rgb(255, 205, 86)', - green: 'rgb(75, 192, 192)', - blue: 'rgb(54, 162, 235)', - purple: 'rgb(153, 102, 255)', - grey: 'rgb(231,233,237)' -}; - -window.randomScalingFactor = function() { - return (Math.random() > 0.5 ? 1.0 : -1.0) * Math.round(Math.random() * 100); -} \ No newline at end of file diff --git a/system/templates/js/chart-js/scripts/release.sh b/system/templates/js/chart-js/scripts/release.sh deleted file mode 100755 index 03c7c6462..000000000 --- a/system/templates/js/chart-js/scripts/release.sh +++ /dev/null @@ -1,29 +0,0 @@ -#!/bin/bash - -set -e - -if [ "$TRAVIS_BRANCH" != "release" ]; then - echo "Skipping release because this is not the 'release' branch" - exit 0 -fi - -# Travis executes this script from the repository root, so at the same level than package.json -VERSION=$(node -p -e "require('./package.json').version") - -# Make sure that the associated tag doesn't already exist -GITTAG=$(git ls-remote origin refs/tags/v$VERSION) -if [ "$GITTAG" != "" ]; then - echo "Tag for package.json version already exists, aborting release" - exit 1 -fi - -git remote add auth-origin https://$GITHUB_AUTH_TOKEN@github.com/$TRAVIS_REPO_SLUG.git -git config --global user.email "$GITHUB_AUTH_EMAIL" -git config --global user.name "Chart.js" -git checkout --detach --quiet -git add -f dist/*.js bower.json -git commit -m "Release $VERSION" -git tag -a "v$VERSION" -m "Version $VERSION" -git push -q auth-origin refs/tags/v$VERSION 2>/dev/null -git remote rm auth-origin -git checkout -f @{-1} diff --git a/system/templates/js/chart-js/site/assets/6charts.png b/system/templates/js/chart-js/site/assets/6charts.png deleted file mode 100755 index 17dc2dd1e417dbfb6ce0d4fece0c79adf9bab3e8..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 79923 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 diff --git a/system/templates/js/chart-js/site/assets/Chart.js b/system/templates/js/chart-js/site/assets/Chart.js deleted file mode 100755 index a25acef1d..000000000 --- a/system/templates/js/chart-js/site/assets/Chart.js +++ /dev/null @@ -1,1443 +0,0 @@ -/*! - * Chart.js - * http://chartjs.org/ - * - * Copyright 2013 Nick Downie - * Released under the MIT license - * https://github.com/nnnick/Chart.js/blob/master/LICENSE.md - */ - -//Define the global Chart Variable as a class. -var Chart = function(context){ - - var chart = this; - - - //Easing functions adapted from Robert Penner's easing equations - //http://www.robertpenner.com/easing/ - - var animationOptions = { - linear : function (t){ - return t; - }, - easeInQuad: function (t) { - return t*t; - }, - easeOutQuad: function (t) { - return -1 *t*(t-2); - }, - easeInOutQuad: function (t) { - if ((t/=1/2) < 1) return 1/2*t*t; - return -1/2 * ((--t)*(t-2) - 1); - }, - easeInCubic: function (t) { - return t*t*t; - }, - easeOutCubic: function (t) { - return 1*((t=t/1-1)*t*t + 1); - }, - easeInOutCubic: function (t) { - if ((t/=1/2) < 1) return 1/2*t*t*t; - return 1/2*((t-=2)*t*t + 2); - }, - easeInQuart: function (t) { - return t*t*t*t; - }, - easeOutQuart: function (t) { - return -1 * ((t=t/1-1)*t*t*t - 1); - }, - easeInOutQuart: function (t) { - if ((t/=1/2) < 1) return 1/2*t*t*t*t; - return -1/2 * ((t-=2)*t*t*t - 2); - }, - easeInQuint: function (t) { - return 1*(t/=1)*t*t*t*t; - }, - easeOutQuint: function (t) { - return 1*((t=t/1-1)*t*t*t*t + 1); - }, - easeInOutQuint: function (t) { - if ((t/=1/2) < 1) return 1/2*t*t*t*t*t; - return 1/2*((t-=2)*t*t*t*t + 2); - }, - easeInSine: function (t) { - return -1 * Math.cos(t/1 * (Math.PI/2)) + 1; - }, - easeOutSine: function (t) { - return 1 * Math.sin(t/1 * (Math.PI/2)); - }, - easeInOutSine: function (t) { - return -1/2 * (Math.cos(Math.PI*t/1) - 1); - }, - easeInExpo: function (t) { - return (t==0) ? 1 : 1 * Math.pow(2, 10 * (t/1 - 1)); - }, - easeOutExpo: function (t) { - return (t==1) ? 1 : 1 * (-Math.pow(2, -10 * t/1) + 1); - }, - easeInOutExpo: function (t) { - if (t==0) return 0; - if (t==1) return 1; - if ((t/=1/2) < 1) return 1/2 * Math.pow(2, 10 * (t - 1)); - return 1/2 * (-Math.pow(2, -10 * --t) + 2); - }, - easeInCirc: function (t) { - if (t>=1) return t; - return -1 * (Math.sqrt(1 - (t/=1)*t) - 1); - }, - easeOutCirc: function (t) { - return 1 * Math.sqrt(1 - (t=t/1-1)*t); - }, - easeInOutCirc: function (t) { - if ((t/=1/2) < 1) return -1/2 * (Math.sqrt(1 - t*t) - 1); - return 1/2 * (Math.sqrt(1 - (t-=2)*t) + 1); - }, - easeInElastic: function (t) { - var s=1.70158;var p=0;var a=1; - if (t==0) return 0; if ((t/=1)==1) return 1; if (!p) p=1*.3; - if (a < Math.abs(1)) { a=1; var s=p/4; } - else var s = p/(2*Math.PI) * Math.asin (1/a); - return -(a*Math.pow(2,10*(t-=1)) * Math.sin( (t*1-s)*(2*Math.PI)/p )); - }, - easeOutElastic: function (t) { - var s=1.70158;var p=0;var a=1; - if (t==0) return 0; if ((t/=1)==1) return 1; if (!p) p=1*.3; - if (a < Math.abs(1)) { a=1; var s=p/4; } - else var s = p/(2*Math.PI) * Math.asin (1/a); - return a*Math.pow(2,-10*t) * Math.sin( (t*1-s)*(2*Math.PI)/p ) + 1; - }, - easeInOutElastic: function (t) { - var s=1.70158;var p=0;var a=1; - if (t==0) return 0; if ((t/=1/2)==2) return 1; if (!p) p=1*(.3*1.5); - if (a < Math.abs(1)) { a=1; var s=p/4; } - else var s = p/(2*Math.PI) * Math.asin (1/a); - if (t < 1) return -.5*(a*Math.pow(2,10*(t-=1)) * Math.sin( (t*1-s)*(2*Math.PI)/p )); - return a*Math.pow(2,-10*(t-=1)) * Math.sin( (t*1-s)*(2*Math.PI)/p )*.5 + 1; - }, - easeInBack: function (t) { - var s = 1.70158; - return 1*(t/=1)*t*((s+1)*t - s); - }, - easeOutBack: function (t) { - var s = 1.70158; - return 1*((t=t/1-1)*t*((s+1)*t + s) + 1); - }, - easeInOutBack: function (t) { - var s = 1.70158; - if ((t/=1/2) < 1) return 1/2*(t*t*(((s*=(1.525))+1)*t - s)); - return 1/2*((t-=2)*t*(((s*=(1.525))+1)*t + s) + 2); - }, - easeInBounce: function (t) { - return 1 - animationOptions.easeOutBounce (1-t); - }, - easeOutBounce: function (t) { - if ((t/=1) < (1/2.75)) { - return 1*(7.5625*t*t); - } else if (t < (2/2.75)) { - return 1*(7.5625*(t-=(1.5/2.75))*t + .75); - } else if (t < (2.5/2.75)) { - return 1*(7.5625*(t-=(2.25/2.75))*t + .9375); - } else { - return 1*(7.5625*(t-=(2.625/2.75))*t + .984375); - } - }, - easeInOutBounce: function (t) { - if (t < 1/2) return animationOptions.easeInBounce (t*2) * .5; - return animationOptions.easeOutBounce (t*2-1) * .5 + 1*.5; - } - }; - - //Variables global to the chart - var width = context.canvas.width; - var height = context.canvas.height; - - - //High pixel density displays - multiply the size of the canvas height/width by the device pixel ratio, then scale. - if (window.devicePixelRatio) { - context.canvas.style.width = width + "px"; - context.canvas.style.height = height + "px"; - context.canvas.height = height * window.devicePixelRatio; - context.canvas.width = width * window.devicePixelRatio; - context.scale(window.devicePixelRatio, window.devicePixelRatio); - } - - this.PolarArea = function(data,options){ - - chart.PolarArea.defaults = { - scaleOverlay : true, - scaleOverride : false, - scaleSteps : null, - scaleStepWidth : null, - scaleStartValue : null, - scaleShowLine : true, - scaleLineColor : "rgba(0,0,0,.1)", - scaleLineWidth : 1, - scaleShowLabels : true, - scaleLabel : "<%=value%>", - scaleFontFamily : "'Arial'", - scaleFontSize : 12, - scaleFontStyle : "normal", - scaleFontColor : "#666", - scaleShowLabelBackdrop : true, - scaleBackdropColor : "rgba(255,255,255,0.75)", - scaleBackdropPaddingY : 2, - scaleBackdropPaddingX : 2, - segmentShowStroke : true, - segmentStrokeColor : "#fff", - segmentStrokeWidth : 2, - animation : true, - animationSteps : 100, - animationEasing : "easeOutBounce", - animateRotate : true, - animateScale : false, - onAnimationComplete : null - }; - - var config = (options)? mergeChartConfig(chart.PolarArea.defaults,options) : chart.PolarArea.defaults; - - return new PolarArea(data,config,context); - }; - - this.Radar = function(data,options){ - - chart.Radar.defaults = { - scaleOverlay : false, - scaleOverride : false, - scaleSteps : null, - scaleStepWidth : null, - scaleStartValue : null, - scaleShowLine : true, - scaleLineColor : "rgba(0,0,0,.1)", - scaleLineWidth : 1, - scaleShowLabels : false, - scaleLabel : "<%=value%>", - scaleFontFamily : "'Arial'", - scaleFontSize : 12, - scaleFontStyle : "normal", - scaleFontColor : "#666", - scaleShowLabelBackdrop : true, - scaleBackdropColor : "rgba(255,255,255,0.75)", - scaleBackdropPaddingY : 2, - scaleBackdropPaddingX : 2, - angleShowLineOut : true, - angleLineColor : "rgba(0,0,0,.1)", - angleLineWidth : 1, - pointLabelFontFamily : "'Arial'", - pointLabelFontStyle : "normal", - pointLabelFontSize : 12, - pointLabelFontColor : "#666", - pointDot : true, - pointDotRadius : 3, - pointDotStrokeWidth : 1, - datasetStroke : true, - datasetStrokeWidth : 2, - datasetFill : true, - animation : true, - animationSteps : 60, - animationEasing : "easeOutQuart", - onAnimationComplete : null - }; - - var config = (options)? mergeChartConfig(chart.Radar.defaults,options) : chart.Radar.defaults; - - return new Radar(data,config,context); - }; - - this.Pie = function(data,options){ - chart.Pie.defaults = { - segmentShowStroke : true, - segmentStrokeColor : "#fff", - segmentStrokeWidth : 2, - animation : true, - animationSteps : 100, - animationEasing : "easeOutBounce", - animateRotate : true, - animateScale : false, - onAnimationComplete : null - }; - - var config = (options)? mergeChartConfig(chart.Pie.defaults,options) : chart.Pie.defaults; - - return new Pie(data,config,context); - }; - - this.Doughnut = function(data,options){ - - chart.Doughnut.defaults = { - segmentShowStroke : true, - segmentStrokeColor : "#fff", - segmentStrokeWidth : 2, - percentageInnerCutout : 50, - animation : true, - animationSteps : 100, - animationEasing : "easeOutBounce", - animateRotate : true, - animateScale : false, - onAnimationComplete : null - }; - - var config = (options)? mergeChartConfig(chart.Doughnut.defaults,options) : chart.Doughnut.defaults; - - return new Doughnut(data,config,context); - - }; - - this.Line = function(data,options){ - - chart.Line.defaults = { - scaleOverlay : false, - scaleOverride : false, - scaleSteps : null, - scaleStepWidth : null, - scaleStartValue : null, - scaleLineColor : "rgba(0,0,0,.1)", - scaleLineWidth : 1, - scaleShowLabels : true, - scaleLabel : "<%=value%>", - scaleFontFamily : "'Arial'", - scaleFontSize : 12, - scaleFontStyle : "normal", - scaleFontColor : "#666", - scaleShowGridLines : true, - scaleGridLineColor : "rgba(0,0,0,.05)", - scaleGridLineWidth : 1, - bezierCurve : true, - pointDot : true, - pointDotRadius : 4, - pointDotStrokeWidth : 2, - datasetStroke : true, - datasetStrokeWidth : 2, - datasetFill : true, - animation : true, - animationSteps : 60, - animationEasing : "easeOutQuart", - onAnimationComplete : null - }; - var config = (options) ? mergeChartConfig(chart.Line.defaults,options) : chart.Line.defaults; - - return new Line(data,config,context); - } - - this.Bar = function(data,options){ - chart.Bar.defaults = { - scaleOverlay : false, - scaleOverride : false, - scaleSteps : null, - scaleStepWidth : null, - scaleStartValue : null, - scaleLineColor : "rgba(0,0,0,.1)", - scaleLineWidth : 1, - scaleShowLabels : true, - scaleLabel : "<%=value%>", - scaleFontFamily : "'Arial'", - scaleFontSize : 12, - scaleFontStyle : "normal", - scaleFontColor : "#666", - scaleShowGridLines : true, - scaleGridLineColor : "rgba(0,0,0,.05)", - scaleGridLineWidth : 1, - barShowStroke : true, - barStrokeWidth : 2, - barValueSpacing : 5, - barDatasetSpacing : 1, - animation : true, - animationSteps : 60, - animationEasing : "easeOutQuart", - onAnimationComplete : null - }; - var config = (options) ? mergeChartConfig(chart.Bar.defaults,options) : chart.Bar.defaults; - - return new Bar(data,config,context); - } - - var clear = function(c){ - c.clearRect(0, 0, width, height); - }; - - var PolarArea = function(data,config,ctx){ - var maxSize, scaleHop, calculatedScale, labelHeight, scaleHeight, valueBounds, labelTemplateString; - - - calculateDrawingSizes(); - - valueBounds = getValueBounds(); - - labelTemplateString = (config.scaleShowLabels)? config.scaleLabel : null; - - //Check and set the scale - if (!config.scaleOverride){ - - calculatedScale = calculateScale(scaleHeight,valueBounds.maxSteps,valueBounds.minSteps,valueBounds.maxValue,valueBounds.minValue,labelTemplateString); - } - else { - calculatedScale = { - steps : config.scaleSteps, - stepValue : config.scaleStepWidth, - graphMin : config.scaleStartValue, - labels : [] - } - for (var i=0; i upperValue) {upperValue = data[i].value;} - if (data[i].value < lowerValue) {lowerValue = data[i].value;} - }; - - var maxSteps = Math.floor((scaleHeight / (labelHeight*0.66))); - var minSteps = Math.floor((scaleHeight / labelHeight*0.5)); - - return { - maxValue : upperValue, - minValue : lowerValue, - maxSteps : maxSteps, - minSteps : minSteps - }; - - - } - } - - var Radar = function (data,config,ctx) { - var maxSize, scaleHop, calculatedScale, labelHeight, scaleHeight, valueBounds, labelTemplateString; - - //If no labels are defined set to an empty array, so referencing length for looping doesn't blow up. - if (!data.labels) data.labels = []; - - calculateDrawingSizes(); - - var valueBounds = getValueBounds(); - - labelTemplateString = (config.scaleShowLabels)? config.scaleLabel : null; - - //Check and set the scale - if (!config.scaleOverride){ - - calculatedScale = calculateScale(scaleHeight,valueBounds.maxSteps,valueBounds.minSteps,valueBounds.maxValue,valueBounds.minValue,labelTemplateString); - } - else { - calculatedScale = { - steps : config.scaleSteps, - stepValue : config.scaleStepWidth, - graphMin : config.scaleStartValue, - labels : [] - } - for (var i=0; i Math.PI){ - ctx.textAlign = "right"; - } - else{ - ctx.textAlign = "left"; - } - - ctx.textBaseline = "middle"; - - ctx.fillText(data.labels[k],opposite,-adjacent); - - } - ctx.restore(); - }; - function calculateDrawingSizes(){ - maxSize = (Min([width,height])/2); - - labelHeight = config.scaleFontSize*2; - - var labelLength = 0; - for (var i=0; ilabelLength) labelLength = textMeasurement; - } - - //Figure out whats the largest - the height of the text or the width of what's there, and minus it from the maximum usable size. - maxSize -= Max([labelLength,((config.pointLabelFontSize/2)*1.5)]); - - maxSize -= config.pointLabelFontSize; - maxSize = CapValue(maxSize, null, 0); - scaleHeight = maxSize; - //If the label height is less than 5, set it to 5 so we don't have lines on top of each other. - labelHeight = Default(labelHeight,5); - }; - function getValueBounds() { - var upperValue = Number.MIN_VALUE; - var lowerValue = Number.MAX_VALUE; - - for (var i=0; i upperValue){upperValue = data.datasets[i].data[j]} - if (data.datasets[i].data[j] < lowerValue){lowerValue = data.datasets[i].data[j]} - } - } - - var maxSteps = Math.floor((scaleHeight / (labelHeight*0.66))); - var minSteps = Math.floor((scaleHeight / labelHeight*0.5)); - - return { - maxValue : upperValue, - minValue : lowerValue, - maxSteps : maxSteps, - minSteps : minSteps - }; - - - } - } - - var Pie = function(data,config,ctx){ - var segmentTotal = 0; - - //In case we have a canvas that is not a square. Minus 5 pixels as padding round the edge. - var pieRadius = Min([height/2,width/2]) - 5; - - for (var i=0; i 0){ - ctx.save(); - ctx.textAlign = "right"; - } - else{ - ctx.textAlign = "center"; - } - ctx.fillStyle = config.scaleFontColor; - for (var i=0; i 0){ - ctx.translate(yAxisPosX + i*valueHop,xAxisPosY + config.scaleFontSize); - ctx.rotate(-(rotateLabels * (Math.PI/180))); - ctx.fillText(data.labels[i], 0,0); - ctx.restore(); - } - - else{ - ctx.fillText(data.labels[i], yAxisPosX + i*valueHop,xAxisPosY + config.scaleFontSize+3); - } - - ctx.beginPath(); - ctx.moveTo(yAxisPosX + i * valueHop, xAxisPosY+3); - - //Check i isnt 0, so we dont go over the Y axis twice. - if(config.scaleShowGridLines && i>0){ - ctx.lineWidth = config.scaleGridLineWidth; - ctx.strokeStyle = config.scaleGridLineColor; - ctx.lineTo(yAxisPosX + i * valueHop, 5); - } - else{ - ctx.lineTo(yAxisPosX + i * valueHop, xAxisPosY+3); - } - ctx.stroke(); - } - - //Y axis - ctx.lineWidth = config.scaleLineWidth; - ctx.strokeStyle = config.scaleLineColor; - ctx.beginPath(); - ctx.moveTo(yAxisPosX,xAxisPosY+5); - ctx.lineTo(yAxisPosX,5); - ctx.stroke(); - - ctx.textAlign = "right"; - ctx.textBaseline = "middle"; - for (var j=0; j longestText)? measuredText : longestText; - } - //Add a little extra padding from the y axis - longestText +=10; - } - xAxisLength = width - longestText - widestXLabel; - valueHop = Math.floor(xAxisLength/(data.labels.length-1)); - - yAxisPosX = width-widestXLabel/2-xAxisLength; - xAxisPosY = scaleHeight + config.scaleFontSize/2; - } - function calculateDrawingSizes(){ - maxSize = height; - - //Need to check the X axis first - measure the length of each text metric, and figure out if we need to rotate by 45 degrees. - ctx.font = config.scaleFontStyle + " " + config.scaleFontSize+"px " + config.scaleFontFamily; - widestXLabel = 1; - for (var i=0; i widestXLabel)? textLength : widestXLabel; - } - if (width/data.labels.length < widestXLabel){ - rotateLabels = 45; - if (width/data.labels.length < Math.cos(rotateLabels) * widestXLabel){ - rotateLabels = 90; - maxSize -= widestXLabel; - } - else{ - maxSize -= Math.sin(rotateLabels) * widestXLabel; - } - } - else{ - maxSize -= config.scaleFontSize; - } - - //Add a little padding between the x line and the text - maxSize -= 5; - - - labelHeight = config.scaleFontSize; - - maxSize -= labelHeight; - //Set 5 pixels greater than the font size to allow for a little padding from the X axis. - - scaleHeight = maxSize; - - //Then get the area above we can safely draw on. - - } - function getValueBounds() { - var upperValue = Number.MIN_VALUE; - var lowerValue = Number.MAX_VALUE; - for (var i=0; i upperValue) { upperValue = data.datasets[i].data[j] }; - if ( data.datasets[i].data[j] < lowerValue) { lowerValue = data.datasets[i].data[j] }; - } - }; - - var maxSteps = Math.floor((scaleHeight / (labelHeight*0.66))); - var minSteps = Math.floor((scaleHeight / labelHeight*0.5)); - - return { - maxValue : upperValue, - minValue : lowerValue, - maxSteps : maxSteps, - minSteps : minSteps - }; - - - } - - - } - - var Bar = function(data,config,ctx){ - var maxSize, scaleHop, calculatedScale, labelHeight, scaleHeight, valueBounds, labelTemplateString, valueHop,widestXLabel, xAxisLength,yAxisPosX,xAxisPosY,barWidth, rotateLabels = 0; - - calculateDrawingSizes(); - - valueBounds = getValueBounds(); - //Check and set the scale - labelTemplateString = (config.scaleShowLabels)? config.scaleLabel : ""; - if (!config.scaleOverride){ - - calculatedScale = calculateScale(scaleHeight,valueBounds.maxSteps,valueBounds.minSteps,valueBounds.maxValue,valueBounds.minValue,labelTemplateString); - } - else { - calculatedScale = { - steps : config.scaleSteps, - stepValue : config.scaleStepWidth, - graphMin : config.scaleStartValue, - labels : [] - } - for (var i=0; i 0){ - ctx.save(); - ctx.textAlign = "right"; - } - else{ - ctx.textAlign = "center"; - } - ctx.fillStyle = config.scaleFontColor; - for (var i=0; i 0){ - ctx.translate(yAxisPosX + i*valueHop,xAxisPosY + config.scaleFontSize); - ctx.rotate(-(rotateLabels * (Math.PI/180))); - ctx.fillText(data.labels[i], 0,0); - ctx.restore(); - } - - else{ - ctx.fillText(data.labels[i], yAxisPosX + i*valueHop + valueHop/2,xAxisPosY + config.scaleFontSize+3); - } - - ctx.beginPath(); - ctx.moveTo(yAxisPosX + (i+1) * valueHop, xAxisPosY+3); - - //Check i isnt 0, so we dont go over the Y axis twice. - ctx.lineWidth = config.scaleGridLineWidth; - ctx.strokeStyle = config.scaleGridLineColor; - ctx.lineTo(yAxisPosX + (i+1) * valueHop, 5); - ctx.stroke(); - } - - //Y axis - ctx.lineWidth = config.scaleLineWidth; - ctx.strokeStyle = config.scaleLineColor; - ctx.beginPath(); - ctx.moveTo(yAxisPosX,xAxisPosY+5); - ctx.lineTo(yAxisPosX,5); - ctx.stroke(); - - ctx.textAlign = "right"; - ctx.textBaseline = "middle"; - for (var j=0; j longestText)? measuredText : longestText; - } - //Add a little extra padding from the y axis - longestText +=10; - } - xAxisLength = width - longestText - widestXLabel; - valueHop = Math.floor(xAxisLength/(data.labels.length)); - - barWidth = (valueHop - config.scaleGridLineWidth*2 - (config.barValueSpacing*2) - (config.barDatasetSpacing*data.datasets.length-1) - ((config.barStrokeWidth/2)*data.datasets.length-1))/data.datasets.length; - - yAxisPosX = width-widestXLabel/2-xAxisLength; - xAxisPosY = scaleHeight + config.scaleFontSize/2; - } - function calculateDrawingSizes(){ - maxSize = height; - - //Need to check the X axis first - measure the length of each text metric, and figure out if we need to rotate by 45 degrees. - ctx.font = config.scaleFontStyle + " " + config.scaleFontSize+"px " + config.scaleFontFamily; - widestXLabel = 1; - for (var i=0; i widestXLabel)? textLength : widestXLabel; - } - if (width/data.labels.length < widestXLabel){ - rotateLabels = 45; - if (width/data.labels.length < Math.cos(rotateLabels) * widestXLabel){ - rotateLabels = 90; - maxSize -= widestXLabel; - } - else{ - maxSize -= Math.sin(rotateLabels) * widestXLabel; - } - } - else{ - maxSize -= config.scaleFontSize; - } - - //Add a little padding between the x line and the text - maxSize -= 5; - - - labelHeight = config.scaleFontSize; - - maxSize -= labelHeight; - //Set 5 pixels greater than the font size to allow for a little padding from the X axis. - - scaleHeight = maxSize; - - //Then get the area above we can safely draw on. - - } - function getValueBounds() { - var upperValue = Number.MIN_VALUE; - var lowerValue = Number.MAX_VALUE; - for (var i=0; i upperValue) { upperValue = data.datasets[i].data[j] }; - if ( data.datasets[i].data[j] < lowerValue) { lowerValue = data.datasets[i].data[j] }; - } - }; - - var maxSteps = Math.floor((scaleHeight / (labelHeight*0.66))); - var minSteps = Math.floor((scaleHeight / labelHeight*0.5)); - - return { - maxValue : upperValue, - minValue : lowerValue, - maxSteps : maxSteps, - minSteps : minSteps - }; - - - } - } - - function calculateOffset(val,calculatedScale,scaleHop){ - var outerValue = calculatedScale.steps * calculatedScale.stepValue; - var adjustedValue = val - calculatedScale.graphMin; - var scalingFactor = CapValue(adjustedValue/outerValue,1,0); - return (scaleHop*calculatedScale.steps) * scalingFactor; - } - - function animationLoop(config,drawScale,drawData,ctx){ - var animFrameAmount = (config.animation)? 1/CapValue(config.animationSteps,Number.MAX_VALUE,1) : 1, - easingFunction = animationOptions[config.animationEasing], - percentAnimComplete =(config.animation)? 0 : 1; - - - - if (typeof drawScale !== "function") drawScale = function(){}; - - requestAnimFrame(animLoop); - - function animateFrame(){ - var easeAdjustedAnimationPercent =(config.animation)? CapValue(easingFunction(percentAnimComplete),null,0) : 1; - clear(ctx); - if(config.scaleOverlay){ - drawData(easeAdjustedAnimationPercent); - drawScale(); - } else { - drawScale(); - drawData(easeAdjustedAnimationPercent); - } - } - function animLoop(){ - //We need to check if the animation is incomplete (less than 1), or complete (1). - percentAnimComplete += animFrameAmount; - animateFrame(); - //Stop the loop continuing forever - if (percentAnimComplete <= 1){ - requestAnimFrame(animLoop); - } - else{ - if (typeof config.onAnimationComplete == "function") config.onAnimationComplete(); - } - - } - - } - - //Declare global functions to be called within this namespace here. - - - // shim layer with setTimeout fallback - var requestAnimFrame = (function(){ - return window.requestAnimationFrame || - window.webkitRequestAnimationFrame || - window.mozRequestAnimationFrame || - window.oRequestAnimationFrame || - window.msRequestAnimationFrame || - function(callback) { - window.setTimeout(callback, 1000 / 60); - }; - })(); - - function calculateScale(drawingHeight,maxSteps,minSteps,maxValue,minValue,labelTemplateString){ - var graphMin,graphMax,graphRange,stepValue,numberOfSteps,valueRange,rangeOrderOfMagnitude,decimalNum; - - valueRange = maxValue - minValue; - - rangeOrderOfMagnitude = calculateOrderOfMagnitude(valueRange); - - graphMin = Math.floor(minValue / (1 * Math.pow(10, rangeOrderOfMagnitude))) * Math.pow(10, rangeOrderOfMagnitude); - - graphMax = Math.ceil(maxValue / (1 * Math.pow(10, rangeOrderOfMagnitude))) * Math.pow(10, rangeOrderOfMagnitude); - - graphRange = graphMax - graphMin; - - stepValue = Math.pow(10, rangeOrderOfMagnitude); - - numberOfSteps = Math.round(graphRange / stepValue); - - //Compare number of steps to the max and min for that size graph, and add in half steps if need be. - while(numberOfSteps < minSteps || numberOfSteps > maxSteps) { - if (numberOfSteps < minSteps){ - stepValue /= 2; - numberOfSteps = Math.round(graphRange/stepValue); - } - else{ - stepValue *=2; - numberOfSteps = Math.round(graphRange/stepValue); - } - }; - - - - //Create an array of all the labels by interpolating the string. - - var labels = []; - - if(labelTemplateString){ - //Fix floating point errors by setting to fixed the on the same decimal as the stepValue. - for (var i=1; i maxValue ) { - return maxValue; - } - } - if(isNumber(minValue)){ - if ( valueToCap < minValue ){ - return minValue; - } - } - return valueToCap; - } - function getDecimalPlaces (num){ - var numberOfDecimalPlaces; - if (num%1!=0){ - return num.toString().split(".")[1].length - } - else{ - return 0; - } - - } - - function mergeChartConfig(defaults,userDefined){ - var returnObj = {}; - for (var attrname in defaults) { returnObj[attrname] = defaults[attrname]; } - for (var attrname in userDefined) { returnObj[attrname] = userDefined[attrname]; } - return returnObj; - } - - //Javascript micro templating by John Resig - source at http://ejohn.org/blog/javascript-micro-templating/ - var cache = {}; - - function tmpl(str, data){ - // Figure out if we're getting a template, or if we need to - // load the template - and be sure to cache the result. - var fn = !/\W/.test(str) ? - cache[str] = cache[str] || - tmpl(document.getElementById(str).innerHTML) : - - // Generate a reusable function that will serve as a template - // generator (and which will be cached). - new Function("obj", - "var p=[],print=function(){p.push.apply(p,arguments);};" + - - // Introduce the data as local variables using with(){} - "with(obj){p.push('" + - - // Convert the template into pure JavaScript - str - .replace(/[\r\t\n]/g, " ") - .split("<%").join("\t") - .replace(/((^|%>)[^\t]*)'/g, "$1\r") - .replace(/\t=(.*?)%>/g, "',$1,'") - .split("\t").join("');") - .split("%>").join("p.push('") - .split("\r").join("\\'") - + "');}return p.join('');"); - - // Provide some basic currying to the user - return data ? fn( data ) : fn; - }; -} - - - diff --git a/system/templates/js/chart-js/site/assets/effects.js b/system/templates/js/chart-js/site/assets/effects.js deleted file mode 100755 index 19361f23f..000000000 --- a/system/templates/js/chart-js/site/assets/effects.js +++ /dev/null @@ -1,320 +0,0 @@ -$(window).load(function() { - var lineChartData = { - labels : ["January","February","March","April","May","June","July"], - datasets : [ - { - fillColor : "rgba(220,220,220,0.5)", - strokeColor : "rgba(220,220,220,1)", - pointColor : "rgba(220,220,220,1)", - pointStrokeColor : "#fff", - data : [65,59,90,81,56,55,40] - }, - { - fillColor : "rgba(151,187,205,0.5)", - strokeColor : "rgba(151,187,205,1)", - pointColor : "rgba(151,187,205,1)", - pointStrokeColor : "#fff", - data : [28,48,40,19,96,27,100] - } - ] - }; - - var barChartData = { - labels : ["January","February","March","April","May","June","July"], - datasets : [ - { - fillColor : "rgba(220,220,220,0.5)", - strokeColor : "rgba(220,220,220,1)", - data : [65,59,90,81,56,55,40] - }, - { - fillColor : "rgba(151,187,205,0.5)", - strokeColor : "rgba(151,187,205,1)", - data : [28,48,40,19,96,27,100] - } - ] - - }; - - var radarChartData = { - labels : ["A","B","C","D","E","F","G"], - datasets : [ - { - fillColor : "rgba(220,220,220,0.5)", - strokeColor : "rgba(220,220,220,1)", - pointColor : "rgba(220,220,220,1)", - pointStrokeColor : "#fff", - data : [65,59,90,81,56,55,40] - }, - { - fillColor : "rgba(151,187,205,0.5)", - strokeColor : "rgba(151,187,205,1)", - pointColor : "rgba(151,187,205,1)", - pointStrokeColor : "#fff", - data : [28,48,40,19,96,27,100] - } - ] - - }; - var pieChartData = [ - { - value: 30, - color:"#F38630" - }, - { - value : 50, - color : "#E0E4CC" - }, - { - value : 100, - color : "#69D2E7" - } - - ]; - var polarAreaChartData = [ - { - value : 62, - color: "#D97041" - }, - { - value : 70, - color: "#C7604C" - }, - { - value : 41, - color: "#21323D" - }, - { - value : 24, - color: "#9D9B7F" - }, - { - value : 55, - color: "#7D4F6D" - }, - { - value : 18, - color: "#584A5E" - } - ]; - var doughnutChartData = [ - { - value: 30, - color:"#F7464A" - }, - { - value : 50, - color : "#46BFBD" - }, - { - value : 100, - color : "#FDB45C" - }, - { - value : 40, - color : "#949FB1" - }, - { - value : 120, - color : "#4D5360" - } - - ]; - - var globalGraphSettings = {animation : Modernizr.canvas}; - - setIntroChart(); - - function setIntroChart(){ - var ctx = document.getElementById("introChart").getContext("2d"); - - new Chart(ctx).Line(lineChartData,{animation: Modernizr.canvas, scaleShowLabels : false, scaleFontColor : "#767C8D"}); - }; - - function showLineChart(){ - var ctx = document.getElementById("lineChartCanvas").getContext("2d"); - new Chart(ctx).Line(lineChartData,globalGraphSettings); - }; - function showBarChart(){ - var ctx = document.getElementById("barChartCanvas").getContext("2d"); - new Chart(ctx).Bar(barChartData,globalGraphSettings); - }; - function showRadarChart(){ - var ctx = document.getElementById("radarChartCanvas").getContext("2d"); - new Chart(ctx).Radar(radarChartData,globalGraphSettings); - } - function showPolarAreaChart(){ - var ctx = document.getElementById("polarAreaChartCanvas").getContext("2d"); - new Chart(ctx).PolarArea(polarAreaChartData,globalGraphSettings); - } - function showPieChart(){ - var ctx = document.getElementById("pieChartCanvas").getContext("2d"); - new Chart(ctx).Pie(pieChartData,globalGraphSettings); - }; - function showDoughnutChart(){ - var ctx = document.getElementById("doughnutChartCanvas").getContext("2d"); - new Chart(ctx).Doughnut(doughnutChartData,globalGraphSettings); - }; - - var graphInitDelay = 300; - - //Set up each of the inview events here. - $("#lineChart").on("inview",function(){ - var $this = $(this); - $this.removeClass("hidden").off("inview"); - setTimeout(showLineChart,graphInitDelay); - }); - $("#barChart").on("inview",function(){ - var $this = $(this); - $this.removeClass("hidden").off("inview"); - setTimeout(showBarChart,graphInitDelay); - }); - - $("#radarChart").on("inview",function(){ - var $this = $(this); - $this.removeClass("hidden").off("inview"); - setTimeout(showRadarChart,graphInitDelay); - }); - $("#pieChart").on("inview",function(){ - var $this = $(this); - $this.removeClass("hidden").off("inview"); - setTimeout(showPieChart,graphInitDelay); - }); - $("#polarAreaChart").on("inview",function(){ - var $this = $(this); - $this.removeClass("hidden").off("inview"); - setTimeout(showPolarAreaChart,graphInitDelay); - }); - $("#doughnutChart").on("inview",function(){ - var $this = $(this); - $this.removeClass("hidden").off("inview"); - setTimeout(showDoughnutChart,graphInitDelay); - }); - - }); - - /** - * author Christopher Blum - * - based on the idea of Remy Sharp, http://remysharp.com/2009/01/26/element-in-view-event-plugin/ - * - forked from http://github.com/zuk/jquery.inview/ - */ - (function ($) { - var inviewObjects = {}, viewportSize, viewportOffset, - d = document, w = window, documentElement = d.documentElement, expando = $.expando; - - $.event.special.inview = { - add: function(data) { - inviewObjects[data.guid + "-" + this[expando]] = { data: data, $element: $(this) }; - }, - - remove: function(data) { - try { delete inviewObjects[data.guid + "-" + this[expando]]; } catch(e) {} - } - }; - - function getViewportSize() { - var mode, domObject, size = { height: w.innerHeight, width: w.innerWidth }; - - // if this is correct then return it. iPad has compat Mode, so will - // go into check clientHeight/clientWidth (which has the wrong value). - if (!size.height) { - mode = d.compatMode; - if (mode || !$.support.boxModel) { // IE, Gecko - domObject = mode === 'CSS1Compat' ? - documentElement : // Standards - d.body; // Quirks - size = { - height: domObject.clientHeight, - width: domObject.clientWidth - }; - } - } - - return size; - } - - function getViewportOffset() { - return { - top: w.pageYOffset || documentElement.scrollTop || d.body.scrollTop, - left: w.pageXOffset || documentElement.scrollLeft || d.body.scrollLeft - }; - } - - function checkInView() { - var $elements = $(), elementsLength, i = 0; - - $.each(inviewObjects, function(i, inviewObject) { - var selector = inviewObject.data.selector, - $element = inviewObject.$element; - $elements = $elements.add(selector ? $element.find(selector) : $element); - }); - - elementsLength = $elements.length; - if (elementsLength) { - viewportSize = viewportSize || getViewportSize(); - viewportOffset = viewportOffset || getViewportOffset(); - - for (; i viewportOffset.top && - elementOffset.top < viewportOffset.top + viewportSize.height && - elementOffset.left + elementSize.width > viewportOffset.left && - elementOffset.left < viewportOffset.left + viewportSize.width) { - visiblePartX = (viewportOffset.left > elementOffset.left ? - 'right' : (viewportOffset.left + viewportSize.width) < (elementOffset.left + elementSize.width) ? - 'left' : 'both'); - visiblePartY = (viewportOffset.top > elementOffset.top ? - 'bottom' : (viewportOffset.top + viewportSize.height) < (elementOffset.top + elementSize.height) ? - 'top' : 'both'); - visiblePartsMerged = visiblePartX + "-" + visiblePartY; - if (!inView || inView !== visiblePartsMerged) { - $element.data('inview', visiblePartsMerged).trigger('inview', [true, visiblePartX, visiblePartY]); - } - } else if (inView) { - $element.data('inview', false).trigger('inview', [false]); - } - } - } - } - - $(w).bind("scroll resize", function() { - viewportSize = viewportOffset = null; - }); - - // IE < 9 scrolls to focused elements without firing the "scroll" event - if (!documentElement.addEventListener && documentElement.attachEvent) { - documentElement.attachEvent("onfocusin", function() { - viewportOffset = null; - }); - } - - // Use setInterval in order to also make sure this captures elements within - // "overflow:scroll" elements or elements that appeared in the dom tree due to - // dom manipulation and reflow - // old: $(window).scroll(checkInView); - // - // By the way, iOS (iPad, iPhone, ...) seems to not execute, or at least delays - // intervals while the user scrolls. Therefore the inview event might fire a bit late there - setInterval(checkInView, 250); - })(jQuery); \ No newline at end of file diff --git a/system/templates/js/chart-js/site/assets/excanvas.js b/system/templates/js/chart-js/site/assets/excanvas.js deleted file mode 100755 index 00b316ca9..000000000 --- a/system/templates/js/chart-js/site/assets/excanvas.js +++ /dev/null @@ -1,1416 +0,0 @@ -// Copyright 2006 Google Inc. -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. - - -// Known Issues: -// -// * Patterns only support repeat. -// * Radial gradient are not implemented. The VML version of these look very -// different from the canvas one. -// * Clipping paths are not implemented. -// * Coordsize. The width and height attribute have higher priority than the -// width and height style values which isn't correct. -// * Painting mode isn't implemented. -// * Canvas width/height should is using content-box by default. IE in -// Quirks mode will draw the canvas using border-box. Either change your -// doctype to HTML5 -// (http://www.whatwg.org/specs/web-apps/current-work/#the-doctype) -// or use Box Sizing Behavior from WebFX -// (http://webfx.eae.net/dhtml/boxsizing/boxsizing.html) -// * Non uniform scaling does not correctly scale strokes. -// * Optimize. There is always room for speed improvements. - -// Only add this code if we do not already have a canvas implementation -if (!document.createElement('canvas').getContext) { - -(function() { - - // alias some functions to make (compiled) code shorter - var m = Math; - var mr = m.round; - var ms = m.sin; - var mc = m.cos; - var abs = m.abs; - var sqrt = m.sqrt; - - // this is used for sub pixel precision - var Z = 10; - var Z2 = Z / 2; - - var IE_VERSION = +navigator.userAgent.match(/MSIE ([\d.]+)?/)[1]; - - /** - * This funtion is assigned to the elements as element.getContext(). - * @this {HTMLElement} - * @return {CanvasRenderingContext2D_} - */ - function getContext() { - return this.context_ || - (this.context_ = new CanvasRenderingContext2D_(this)); - } - - var slice = Array.prototype.slice; - - /** - * Binds a function to an object. The returned function will always use the - * passed in {@code obj} as {@code this}. - * - * Example: - * - * g = bind(f, obj, a, b) - * g(c, d) // will do f.call(obj, a, b, c, d) - * - * @param {Function} f The function to bind the object to - * @param {Object} obj The object that should act as this when the function - * is called - * @param {*} var_args Rest arguments that will be used as the initial - * arguments when the function is called - * @return {Function} A new function that has bound this - */ - function bind(f, obj, var_args) { - var a = slice.call(arguments, 2); - return function() { - return f.apply(obj, a.concat(slice.call(arguments))); - }; - } - - function encodeHtmlAttribute(s) { - return String(s).replace(/&/g, '&').replace(/"/g, '"'); - } - - function addNamespace(doc, prefix, urn) { - if (!doc.namespaces[prefix]) { - doc.namespaces.add(prefix, urn, '#default#VML'); - } - } - - function addNamespacesAndStylesheet(doc) { - addNamespace(doc, 'g_vml_', 'urn:schemas-microsoft-com:vml'); - addNamespace(doc, 'g_o_', 'urn:schemas-microsoft-com:office:office'); - - // Setup default CSS. Only add one style sheet per document - if (!doc.styleSheets['ex_canvas_']) { - var ss = doc.createStyleSheet(); - ss.owningElement.id = 'ex_canvas_'; - ss.cssText = 'canvas{display:inline-block;overflow:hidden;' + - // default size is 300x150 in Gecko and Opera - 'text-align:left;width:300px;height:150px}'; - } - } - - // Add namespaces and stylesheet at startup. - addNamespacesAndStylesheet(document); - - var G_vmlCanvasManager_ = { - init: function(opt_doc) { - var doc = opt_doc || document; - // Create a dummy element so that IE will allow canvas elements to be - // recognized. - doc.createElement('canvas'); - doc.attachEvent('onreadystatechange', bind(this.init_, this, doc)); - }, - - init_: function(doc) { - // find all canvas elements - var els = doc.getElementsByTagName('canvas'); - for (var i = 0; i < els.length; i++) { - this.initElement(els[i]); - } - }, - - /** - * Public initializes a canvas element so that it can be used as canvas - * element from now on. This is called automatically before the page is - * loaded but if you are creating elements using createElement you need to - * make sure this is called on the element. - * @param {HTMLElement} el The canvas element to initialize. - * @return {HTMLElement} the element that was created. - */ - initElement: function(el) { - if (!el.getContext) { - el.getContext = getContext; - - // Add namespaces and stylesheet to document of the element. - addNamespacesAndStylesheet(el.ownerDocument); - - // Remove fallback content. There is no way to hide text nodes so we - // just remove all childNodes. We could hide all elements and remove - // text nodes but who really cares about the fallback content. - el.innerHTML = ''; - - // do not use inline function because that will leak memory - el.attachEvent('onpropertychange', onPropertyChange); - el.attachEvent('onresize', onResize); - - var attrs = el.attributes; - if (attrs.width && attrs.width.specified) { - // TODO: use runtimeStyle and coordsize - // el.getContext().setWidth_(attrs.width.nodeValue); - el.style.width = attrs.width.nodeValue + 'px'; - } else { - el.width = el.clientWidth; - } - if (attrs.height && attrs.height.specified) { - // TODO: use runtimeStyle and coordsize - // el.getContext().setHeight_(attrs.height.nodeValue); - el.style.height = attrs.height.nodeValue + 'px'; - } else { - el.height = el.clientHeight; - } - //el.getContext().setCoordsize_() - } - return el; - } - }; - - function onPropertyChange(e) { - var el = e.srcElement; - - switch (e.propertyName) { - case 'width': - el.getContext().clearRect(); - el.style.width = el.attributes.width.nodeValue + 'px'; - // In IE8 this does not trigger onresize. - el.firstChild.style.width = el.clientWidth + 'px'; - break; - case 'height': - el.getContext().clearRect(); - el.style.height = el.attributes.height.nodeValue + 'px'; - el.firstChild.style.height = el.clientHeight + 'px'; - break; - } - } - - function onResize(e) { - var el = e.srcElement; - if (el.firstChild) { - el.firstChild.style.width = el.clientWidth + 'px'; - el.firstChild.style.height = el.clientHeight + 'px'; - } - } - - G_vmlCanvasManager_.init(); - - // precompute "00" to "FF" - var decToHex = []; - for (var i = 0; i < 16; i++) { - for (var j = 0; j < 16; j++) { - decToHex[i * 16 + j] = i.toString(16) + j.toString(16); - } - } - - function createMatrixIdentity() { - return [ - [1, 0, 0], - [0, 1, 0], - [0, 0, 1] - ]; - } - - function matrixMultiply(m1, m2) { - var result = createMatrixIdentity(); - - for (var x = 0; x < 3; x++) { - for (var y = 0; y < 3; y++) { - var sum = 0; - - for (var z = 0; z < 3; z++) { - sum += m1[x][z] * m2[z][y]; - } - - result[x][y] = sum; - } - } - return result; - } - - function copyState(o1, o2) { - o2.fillStyle = o1.fillStyle; - o2.lineCap = o1.lineCap; - o2.lineJoin = o1.lineJoin; - o2.lineWidth = o1.lineWidth; - o2.miterLimit = o1.miterLimit; - o2.shadowBlur = o1.shadowBlur; - o2.shadowColor = o1.shadowColor; - o2.shadowOffsetX = o1.shadowOffsetX; - o2.shadowOffsetY = o1.shadowOffsetY; - o2.strokeStyle = o1.strokeStyle; - o2.globalAlpha = o1.globalAlpha; - o2.font = o1.font; - o2.textAlign = o1.textAlign; - o2.textBaseline = o1.textBaseline; - o2.arcScaleX_ = o1.arcScaleX_; - o2.arcScaleY_ = o1.arcScaleY_; - o2.lineScale_ = o1.lineScale_; - } - - var colorData = { - aliceblue: '#F0F8FF', - antiquewhite: '#FAEBD7', - aquamarine: '#7FFFD4', - azure: '#F0FFFF', - beige: '#F5F5DC', - bisque: '#FFE4C4', - black: '#000000', - blanchedalmond: '#FFEBCD', - blueviolet: '#8A2BE2', - brown: '#A52A2A', - burlywood: '#DEB887', - cadetblue: '#5F9EA0', - chartreuse: '#7FFF00', - chocolate: '#D2691E', - coral: '#FF7F50', - cornflowerblue: '#6495ED', - cornsilk: '#FFF8DC', - crimson: '#DC143C', - cyan: '#00FFFF', - darkblue: '#00008B', - darkcyan: '#008B8B', - darkgoldenrod: '#B8860B', - darkgray: '#A9A9A9', - darkgreen: '#006400', - darkgrey: '#A9A9A9', - darkkhaki: '#BDB76B', - darkmagenta: '#8B008B', - darkolivegreen: '#556B2F', - darkorange: '#FF8C00', - darkorchid: '#9932CC', - darkred: '#8B0000', - darksalmon: '#E9967A', - darkseagreen: '#8FBC8F', - darkslateblue: '#483D8B', - darkslategray: '#2F4F4F', - darkslategrey: '#2F4F4F', - darkturquoise: '#00CED1', - darkviolet: '#9400D3', - deeppink: '#FF1493', - deepskyblue: '#00BFFF', - dimgray: '#696969', - dimgrey: '#696969', - dodgerblue: '#1E90FF', - firebrick: '#B22222', - floralwhite: '#FFFAF0', - forestgreen: '#228B22', - gainsboro: '#DCDCDC', - ghostwhite: '#F8F8FF', - gold: '#FFD700', - goldenrod: '#DAA520', - grey: '#808080', - greenyellow: '#ADFF2F', - honeydew: '#F0FFF0', - hotpink: '#FF69B4', - indianred: '#CD5C5C', - indigo: '#4B0082', - ivory: '#FFFFF0', - khaki: '#F0E68C', - lavender: '#E6E6FA', - lavenderblush: '#FFF0F5', - lawngreen: '#7CFC00', - lemonchiffon: '#FFFACD', - lightblue: '#ADD8E6', - lightcoral: '#F08080', - lightcyan: '#E0FFFF', - lightgoldenrodyellow: '#FAFAD2', - lightgreen: '#90EE90', - lightgrey: '#D3D3D3', - lightpink: '#FFB6C1', - lightsalmon: '#FFA07A', - lightseagreen: '#20B2AA', - lightskyblue: '#87CEFA', - lightslategray: '#778899', - lightslategrey: '#778899', - lightsteelblue: '#B0C4DE', - lightyellow: '#FFFFE0', - limegreen: '#32CD32', - linen: '#FAF0E6', - magenta: '#FF00FF', - mediumaquamarine: '#66CDAA', - mediumblue: '#0000CD', - mediumorchid: '#BA55D3', - mediumpurple: '#9370DB', - mediumseagreen: '#3CB371', - mediumslateblue: '#7B68EE', - mediumspringgreen: '#00FA9A', - mediumturquoise: '#48D1CC', - mediumvioletred: '#C71585', - midnightblue: '#191970', - mintcream: '#F5FFFA', - mistyrose: '#FFE4E1', - moccasin: '#FFE4B5', - navajowhite: '#FFDEAD', - oldlace: '#FDF5E6', - olivedrab: '#6B8E23', - orange: '#FFA500', - orangered: '#FF4500', - orchid: '#DA70D6', - palegoldenrod: '#EEE8AA', - palegreen: '#98FB98', - paleturquoise: '#AFEEEE', - palevioletred: '#DB7093', - papayawhip: '#FFEFD5', - peachpuff: '#FFDAB9', - peru: '#CD853F', - pink: '#FFC0CB', - plum: '#DDA0DD', - powderblue: '#B0E0E6', - rosybrown: '#BC8F8F', - royalblue: '#4169E1', - saddlebrown: '#8B4513', - salmon: '#FA8072', - sandybrown: '#F4A460', - seagreen: '#2E8B57', - seashell: '#FFF5EE', - sienna: '#A0522D', - skyblue: '#87CEEB', - slateblue: '#6A5ACD', - slategray: '#708090', - slategrey: '#708090', - snow: '#FFFAFA', - springgreen: '#00FF7F', - steelblue: '#4682B4', - tan: '#D2B48C', - thistle: '#D8BFD8', - tomato: '#FF6347', - turquoise: '#40E0D0', - violet: '#EE82EE', - wheat: '#F5DEB3', - whitesmoke: '#F5F5F5', - yellowgreen: '#9ACD32' - }; - - - function getRgbHslContent(styleString) { - var start = styleString.indexOf('(', 3); - var end = styleString.indexOf(')', start + 1); - var parts = styleString.substring(start + 1, end).split(','); - // add alpha if needed - if (parts.length != 4 || styleString.charAt(3) != 'a') { - parts[3] = 1; - } - return parts; - } - - function percent(s) { - return parseFloat(s) / 100; - } - - function clamp(v, min, max) { - return Math.min(max, Math.max(min, v)); - } - - function hslToRgb(parts){ - var r, g, b, h, s, l; - h = parseFloat(parts[0]) / 360 % 360; - if (h < 0) - h++; - s = clamp(percent(parts[1]), 0, 1); - l = clamp(percent(parts[2]), 0, 1); - if (s == 0) { - r = g = b = l; // achromatic - } else { - var q = l < 0.5 ? l * (1 + s) : l + s - l * s; - var p = 2 * l - q; - r = hueToRgb(p, q, h + 1 / 3); - g = hueToRgb(p, q, h); - b = hueToRgb(p, q, h - 1 / 3); - } - - return '#' + decToHex[Math.floor(r * 255)] + - decToHex[Math.floor(g * 255)] + - decToHex[Math.floor(b * 255)]; - } - - function hueToRgb(m1, m2, h) { - if (h < 0) - h++; - if (h > 1) - h--; - - if (6 * h < 1) - return m1 + (m2 - m1) * 6 * h; - else if (2 * h < 1) - return m2; - else if (3 * h < 2) - return m1 + (m2 - m1) * (2 / 3 - h) * 6; - else - return m1; - } - - var processStyleCache = {}; - - function processStyle(styleString) { - if (styleString in processStyleCache) { - return processStyleCache[styleString]; - } - - var str, alpha = 1; - - styleString = String(styleString); - if (styleString.charAt(0) == '#') { - str = styleString; - } else if (/^rgb/.test(styleString)) { - var parts = getRgbHslContent(styleString); - var str = '#', n; - for (var i = 0; i < 3; i++) { - if (parts[i].indexOf('%') != -1) { - n = Math.floor(percent(parts[i]) * 255); - } else { - n = +parts[i]; - } - str += decToHex[clamp(n, 0, 255)]; - } - alpha = +parts[3]; - } else if (/^hsl/.test(styleString)) { - var parts = getRgbHslContent(styleString); - str = hslToRgb(parts); - alpha = parts[3]; - } else { - str = colorData[styleString] || styleString; - } - return processStyleCache[styleString] = {color: str, alpha: alpha}; - } - - var DEFAULT_STYLE = { - style: 'normal', - variant: 'normal', - weight: 'normal', - size: 10, - family: 'sans-serif' - }; - - // Internal text style cache - var fontStyleCache = {}; - - function processFontStyle(styleString) { - if (fontStyleCache[styleString]) { - return fontStyleCache[styleString]; - } - - var el = document.createElement('div'); - var style = el.style; - try { - style.font = styleString; - } catch (ex) { - // Ignore failures to set to invalid font. - } - - return fontStyleCache[styleString] = { - style: style.fontStyle || DEFAULT_STYLE.style, - variant: style.fontVariant || DEFAULT_STYLE.variant, - weight: style.fontWeight || DEFAULT_STYLE.weight, - size: style.fontSize || DEFAULT_STYLE.size, - family: style.fontFamily || DEFAULT_STYLE.family - }; - } - - function getComputedStyle(style, element) { - var computedStyle = {}; - - for (var p in style) { - computedStyle[p] = style[p]; - } - - // Compute the size - var canvasFontSize = parseFloat(element.currentStyle.fontSize), - fontSize = parseFloat(style.size); - - if (typeof style.size == 'number') { - computedStyle.size = style.size; - } else if (style.size.indexOf('px') != -1) { - computedStyle.size = fontSize; - } else if (style.size.indexOf('em') != -1) { - computedStyle.size = canvasFontSize * fontSize; - } else if(style.size.indexOf('%') != -1) { - computedStyle.size = (canvasFontSize / 100) * fontSize; - } else if (style.size.indexOf('pt') != -1) { - computedStyle.size = fontSize / .75; - } else { - computedStyle.size = canvasFontSize; - } - - // Different scaling between normal text and VML text. This was found using - // trial and error to get the same size as non VML text. - computedStyle.size *= 0.981; - - return computedStyle; - } - - function buildStyle(style) { - return style.style + ' ' + style.variant + ' ' + style.weight + ' ' + - style.size + 'px ' + style.family; - } - - var lineCapMap = { - 'butt': 'flat', - 'round': 'round' - }; - - function processLineCap(lineCap) { - return lineCapMap[lineCap] || 'square'; - } - - /** - * This class implements CanvasRenderingContext2D interface as described by - * the WHATWG. - * @param {HTMLElement} canvasElement The element that the 2D context should - * be associated with - */ - function CanvasRenderingContext2D_(canvasElement) { - this.m_ = createMatrixIdentity(); - - this.mStack_ = []; - this.aStack_ = []; - this.currentPath_ = []; - - // Canvas context properties - this.strokeStyle = '#000'; - this.fillStyle = '#000'; - - this.lineWidth = 1; - this.lineJoin = 'miter'; - this.lineCap = 'butt'; - this.miterLimit = Z * 1; - this.globalAlpha = 1; - this.font = '10px sans-serif'; - this.textAlign = 'left'; - this.textBaseline = 'alphabetic'; - this.canvas = canvasElement; - - var cssText = 'width:' + canvasElement.clientWidth + 'px;height:' + - canvasElement.clientHeight + 'px;overflow:hidden;position:absolute'; - var el = canvasElement.ownerDocument.createElement('div'); - el.style.cssText = cssText; - canvasElement.appendChild(el); - - var overlayEl = el.cloneNode(false); - // Use a non transparent background. - overlayEl.style.backgroundColor = 'red'; - overlayEl.style.filter = 'alpha(opacity=0)'; - canvasElement.appendChild(overlayEl); - - this.element_ = el; - this.arcScaleX_ = 1; - this.arcScaleY_ = 1; - this.lineScale_ = 1; - } - - var contextPrototype = CanvasRenderingContext2D_.prototype; - contextPrototype.clearRect = function() { - if (this.textMeasureEl_) { - this.textMeasureEl_.removeNode(true); - this.textMeasureEl_ = null; - } - this.element_.innerHTML = ''; - }; - - contextPrototype.beginPath = function() { - // TODO: Branch current matrix so that save/restore has no effect - // as per safari docs. - this.currentPath_ = []; - }; - - contextPrototype.moveTo = function(aX, aY) { - var p = getCoords(this, aX, aY); - this.currentPath_.push({type: 'moveTo', x: p.x, y: p.y}); - this.currentX_ = p.x; - this.currentY_ = p.y; - }; - - contextPrototype.lineTo = function(aX, aY) { - var p = getCoords(this, aX, aY); - this.currentPath_.push({type: 'lineTo', x: p.x, y: p.y}); - - this.currentX_ = p.x; - this.currentY_ = p.y; - }; - - contextPrototype.bezierCurveTo = function(aCP1x, aCP1y, - aCP2x, aCP2y, - aX, aY) { - var p = getCoords(this, aX, aY); - var cp1 = getCoords(this, aCP1x, aCP1y); - var cp2 = getCoords(this, aCP2x, aCP2y); - bezierCurveTo(this, cp1, cp2, p); - }; - - // Helper function that takes the already fixed cordinates. - function bezierCurveTo(self, cp1, cp2, p) { - self.currentPath_.push({ - type: 'bezierCurveTo', - cp1x: cp1.x, - cp1y: cp1.y, - cp2x: cp2.x, - cp2y: cp2.y, - x: p.x, - y: p.y - }); - self.currentX_ = p.x; - self.currentY_ = p.y; - } - - contextPrototype.quadraticCurveTo = function(aCPx, aCPy, aX, aY) { - // the following is lifted almost directly from - // http://developer.mozilla.org/en/docs/Canvas_tutorial:Drawing_shapes - - var cp = getCoords(this, aCPx, aCPy); - var p = getCoords(this, aX, aY); - - var cp1 = { - x: this.currentX_ + 2.0 / 3.0 * (cp.x - this.currentX_), - y: this.currentY_ + 2.0 / 3.0 * (cp.y - this.currentY_) - }; - var cp2 = { - x: cp1.x + (p.x - this.currentX_) / 3.0, - y: cp1.y + (p.y - this.currentY_) / 3.0 - }; - - bezierCurveTo(this, cp1, cp2, p); - }; - - contextPrototype.arc = function(aX, aY, aRadius, - aStartAngle, aEndAngle, aClockwise) { - aRadius *= Z; - var arcType = aClockwise ? 'at' : 'wa'; - - var xStart = aX + mc(aStartAngle) * aRadius - Z2; - var yStart = aY + ms(aStartAngle) * aRadius - Z2; - - var xEnd = aX + mc(aEndAngle) * aRadius - Z2; - var yEnd = aY + ms(aEndAngle) * aRadius - Z2; - - // IE won't render arches drawn counter clockwise if xStart == xEnd. - if (xStart == xEnd && !aClockwise) { - xStart += 0.125; // Offset xStart by 1/80 of a pixel. Use something - // that can be represented in binary - } - - var p = getCoords(this, aX, aY); - var pStart = getCoords(this, xStart, yStart); - var pEnd = getCoords(this, xEnd, yEnd); - - this.currentPath_.push({type: arcType, - x: p.x, - y: p.y, - radius: aRadius, - xStart: pStart.x, - yStart: pStart.y, - xEnd: pEnd.x, - yEnd: pEnd.y}); - - }; - - contextPrototype.rect = function(aX, aY, aWidth, aHeight) { - this.moveTo(aX, aY); - this.lineTo(aX + aWidth, aY); - this.lineTo(aX + aWidth, aY + aHeight); - this.lineTo(aX, aY + aHeight); - this.closePath(); - }; - - contextPrototype.strokeRect = function(aX, aY, aWidth, aHeight) { - var oldPath = this.currentPath_; - this.beginPath(); - - this.moveTo(aX, aY); - this.lineTo(aX + aWidth, aY); - this.lineTo(aX + aWidth, aY + aHeight); - this.lineTo(aX, aY + aHeight); - this.closePath(); - this.stroke(); - - this.currentPath_ = oldPath; - }; - - contextPrototype.fillRect = function(aX, aY, aWidth, aHeight) { - var oldPath = this.currentPath_; - this.beginPath(); - - this.moveTo(aX, aY); - this.lineTo(aX + aWidth, aY); - this.lineTo(aX + aWidth, aY + aHeight); - this.lineTo(aX, aY + aHeight); - this.closePath(); - this.fill(); - - this.currentPath_ = oldPath; - }; - - contextPrototype.createLinearGradient = function(aX0, aY0, aX1, aY1) { - var gradient = new CanvasGradient_('gradient'); - gradient.x0_ = aX0; - gradient.y0_ = aY0; - gradient.x1_ = aX1; - gradient.y1_ = aY1; - return gradient; - }; - - contextPrototype.createRadialGradient = function(aX0, aY0, aR0, - aX1, aY1, aR1) { - var gradient = new CanvasGradient_('gradientradial'); - gradient.x0_ = aX0; - gradient.y0_ = aY0; - gradient.r0_ = aR0; - gradient.x1_ = aX1; - gradient.y1_ = aY1; - gradient.r1_ = aR1; - return gradient; - }; - - contextPrototype.drawImage = function(image, var_args) { - var dx, dy, dw, dh, sx, sy, sw, sh; - - // to find the original width we overide the width and height - var oldRuntimeWidth = image.runtimeStyle.width; - var oldRuntimeHeight = image.runtimeStyle.height; - image.runtimeStyle.width = 'auto'; - image.runtimeStyle.height = 'auto'; - - // get the original size - var w = image.width; - var h = image.height; - - // and remove overides - image.runtimeStyle.width = oldRuntimeWidth; - image.runtimeStyle.height = oldRuntimeHeight; - - if (arguments.length == 3) { - dx = arguments[1]; - dy = arguments[2]; - sx = sy = 0; - sw = dw = w; - sh = dh = h; - } else if (arguments.length == 5) { - dx = arguments[1]; - dy = arguments[2]; - dw = arguments[3]; - dh = arguments[4]; - sx = sy = 0; - sw = w; - sh = h; - } else if (arguments.length == 9) { - sx = arguments[1]; - sy = arguments[2]; - sw = arguments[3]; - sh = arguments[4]; - dx = arguments[5]; - dy = arguments[6]; - dw = arguments[7]; - dh = arguments[8]; - } else { - throw Error('Invalid number of arguments'); - } - - var d = getCoords(this, dx, dy); - - var w2 = sw / 2; - var h2 = sh / 2; - - var vmlStr = []; - - var W = 10; - var H = 10; - - // For some reason that I've now forgotten, using divs didn't work - vmlStr.push(' ' , - '', - ''); - - this.element_.insertAdjacentHTML('BeforeEnd', vmlStr.join('')); - }; - - contextPrototype.stroke = function(aFill) { - var lineStr = []; - var lineOpen = false; - - var W = 10; - var H = 10; - - lineStr.push(''); - - if (!aFill) { - appendStroke(this, lineStr); - } else { - appendFill(this, lineStr, min, max); - } - - lineStr.push(''); - - this.element_.insertAdjacentHTML('beforeEnd', lineStr.join('')); - }; - - function appendStroke(ctx, lineStr) { - var a = processStyle(ctx.strokeStyle); - var color = a.color; - var opacity = a.alpha * ctx.globalAlpha; - var lineWidth = ctx.lineScale_ * ctx.lineWidth; - - // VML cannot correctly render a line if the width is less than 1px. - // In that case, we dilute the color to make the line look thinner. - if (lineWidth < 1) { - opacity *= lineWidth; - } - - lineStr.push( - '' - ); - } - - function appendFill(ctx, lineStr, min, max) { - var fillStyle = ctx.fillStyle; - var arcScaleX = ctx.arcScaleX_; - var arcScaleY = ctx.arcScaleY_; - var width = max.x - min.x; - var height = max.y - min.y; - if (fillStyle instanceof CanvasGradient_) { - // TODO: Gradients transformed with the transformation matrix. - var angle = 0; - var focus = {x: 0, y: 0}; - - // additional offset - var shift = 0; - // scale factor for offset - var expansion = 1; - - if (fillStyle.type_ == 'gradient') { - var x0 = fillStyle.x0_ / arcScaleX; - var y0 = fillStyle.y0_ / arcScaleY; - var x1 = fillStyle.x1_ / arcScaleX; - var y1 = fillStyle.y1_ / arcScaleY; - var p0 = getCoords(ctx, x0, y0); - var p1 = getCoords(ctx, x1, y1); - var dx = p1.x - p0.x; - var dy = p1.y - p0.y; - angle = Math.atan2(dx, dy) * 180 / Math.PI; - - // The angle should be a non-negative number. - if (angle < 0) { - angle += 360; - } - - // Very small angles produce an unexpected result because they are - // converted to a scientific notation string. - if (angle < 1e-6) { - angle = 0; - } - } else { - var p0 = getCoords(ctx, fillStyle.x0_, fillStyle.y0_); - focus = { - x: (p0.x - min.x) / width, - y: (p0.y - min.y) / height - }; - - width /= arcScaleX * Z; - height /= arcScaleY * Z; - var dimension = m.max(width, height); - shift = 2 * fillStyle.r0_ / dimension; - expansion = 2 * fillStyle.r1_ / dimension - shift; - } - - // We need to sort the color stops in ascending order by offset, - // otherwise IE won't interpret it correctly. - var stops = fillStyle.colors_; - stops.sort(function(cs1, cs2) { - return cs1.offset - cs2.offset; - }); - - var length = stops.length; - var color1 = stops[0].color; - var color2 = stops[length - 1].color; - var opacity1 = stops[0].alpha * ctx.globalAlpha; - var opacity2 = stops[length - 1].alpha * ctx.globalAlpha; - - var colors = []; - for (var i = 0; i < length; i++) { - var stop = stops[i]; - colors.push(stop.offset * expansion + shift + ' ' + stop.color); - } - - // When colors attribute is used, the meanings of opacity and o:opacity2 - // are reversed. - lineStr.push(''); - } else if (fillStyle instanceof CanvasPattern_) { - if (width && height) { - var deltaLeft = -min.x; - var deltaTop = -min.y; - lineStr.push(''); - } - } else { - var a = processStyle(ctx.fillStyle); - var color = a.color; - var opacity = a.alpha * ctx.globalAlpha; - lineStr.push(''); - } - } - - contextPrototype.fill = function() { - this.stroke(true); - }; - - contextPrototype.closePath = function() { - this.currentPath_.push({type: 'close'}); - }; - - function getCoords(ctx, aX, aY) { - var m = ctx.m_; - return { - x: Z * (aX * m[0][0] + aY * m[1][0] + m[2][0]) - Z2, - y: Z * (aX * m[0][1] + aY * m[1][1] + m[2][1]) - Z2 - }; - }; - - contextPrototype.save = function() { - var o = {}; - copyState(this, o); - this.aStack_.push(o); - this.mStack_.push(this.m_); - this.m_ = matrixMultiply(createMatrixIdentity(), this.m_); - }; - - contextPrototype.restore = function() { - if (this.aStack_.length) { - copyState(this.aStack_.pop(), this); - this.m_ = this.mStack_.pop(); - } - }; - - function matrixIsFinite(m) { - return isFinite(m[0][0]) && isFinite(m[0][1]) && - isFinite(m[1][0]) && isFinite(m[1][1]) && - isFinite(m[2][0]) && isFinite(m[2][1]); - } - - function setM(ctx, m, updateLineScale) { - if (!matrixIsFinite(m)) { - return; - } - ctx.m_ = m; - - if (updateLineScale) { - // Get the line scale. - // Determinant of this.m_ means how much the area is enlarged by the - // transformation. So its square root can be used as a scale factor - // for width. - var det = m[0][0] * m[1][1] - m[0][1] * m[1][0]; - ctx.lineScale_ = sqrt(abs(det)); - } - } - - contextPrototype.translate = function(aX, aY) { - var m1 = [ - [1, 0, 0], - [0, 1, 0], - [aX, aY, 1] - ]; - - setM(this, matrixMultiply(m1, this.m_), false); - }; - - contextPrototype.rotate = function(aRot) { - var c = mc(aRot); - var s = ms(aRot); - - var m1 = [ - [c, s, 0], - [-s, c, 0], - [0, 0, 1] - ]; - - setM(this, matrixMultiply(m1, this.m_), false); - }; - - contextPrototype.scale = function(aX, aY) { - this.arcScaleX_ *= aX; - this.arcScaleY_ *= aY; - var m1 = [ - [aX, 0, 0], - [0, aY, 0], - [0, 0, 1] - ]; - - setM(this, matrixMultiply(m1, this.m_), true); - }; - - contextPrototype.transform = function(m11, m12, m21, m22, dx, dy) { - var m1 = [ - [m11, m12, 0], - [m21, m22, 0], - [dx, dy, 1] - ]; - - setM(this, matrixMultiply(m1, this.m_), true); - }; - - contextPrototype.setTransform = function(m11, m12, m21, m22, dx, dy) { - var m = [ - [m11, m12, 0], - [m21, m22, 0], - [dx, dy, 1] - ]; - - setM(this, m, true); - }; - - /** - * The text drawing function. - * The maxWidth argument isn't taken in account, since no browser supports - * it yet. - */ - contextPrototype.drawText_ = function(text, x, y, maxWidth, stroke) { - var m = this.m_, - delta = 1000, - left = 0, - right = delta, - offset = {x: 0, y: 0}, - lineStr = []; - - var fontStyle = getComputedStyle(processFontStyle(this.font), - this.element_); - - var fontStyleString = buildStyle(fontStyle); - - var elementStyle = this.element_.currentStyle; - var textAlign = this.textAlign.toLowerCase(); - switch (textAlign) { - case 'left': - case 'center': - case 'right': - break; - case 'end': - textAlign = elementStyle.direction == 'ltr' ? 'right' : 'left'; - break; - case 'start': - textAlign = elementStyle.direction == 'rtl' ? 'right' : 'left'; - break; - default: - textAlign = 'left'; - } - - // 1.75 is an arbitrary number, as there is no info about the text baseline - switch (this.textBaseline) { - case 'hanging': - case 'top': - offset.y = fontStyle.size / 1.75; - break; - case 'middle': - break; - default: - case null: - case 'alphabetic': - case 'ideographic': - case 'bottom': - offset.y = -fontStyle.size / 2.25; - break; - } - - switch(textAlign) { - case 'right': - left = delta; - right = 0.05; - break; - case 'center': - left = right = delta / 2; - break; - } - - var d = getCoords(this, x + offset.x, y + offset.y); - - lineStr.push(''); - - if (stroke) { - appendStroke(this, lineStr); - } else { - // TODO: Fix the min and max params. - appendFill(this, lineStr, {x: -left, y: 0}, - {x: right, y: fontStyle.size}); - } - - var skewM = m[0][0].toFixed(3) + ',' + m[1][0].toFixed(3) + ',' + - m[0][1].toFixed(3) + ',' + m[1][1].toFixed(3) + ',0,0'; - - var skewOffset = mr(d.x / Z) + ',' + mr(d.y / Z); - - lineStr.push('', - '', - ''); - - this.element_.insertAdjacentHTML('beforeEnd', lineStr.join('')); - }; - - contextPrototype.fillText = function(text, x, y, maxWidth) { - this.drawText_(text, x, y, maxWidth, false); - }; - - contextPrototype.strokeText = function(text, x, y, maxWidth) { - this.drawText_(text, x, y, maxWidth, true); - }; - - contextPrototype.measureText = function(text) { - if (!this.textMeasureEl_) { - var s = ''; - this.element_.insertAdjacentHTML('beforeEnd', s); - this.textMeasureEl_ = this.element_.lastChild; - } - var doc = this.element_.ownerDocument; - this.textMeasureEl_.innerHTML = ''; - this.textMeasureEl_.style.font = this.font; - // Don't use innerHTML or innerText because they allow markup/whitespace. - this.textMeasureEl_.appendChild(doc.createTextNode(text)); - return {width: this.textMeasureEl_.offsetWidth}; - }; - - /******** STUBS ********/ - contextPrototype.clip = function() { - // TODO: Implement - }; - - contextPrototype.arcTo = function() { - // TODO: Implement - }; - - contextPrototype.createPattern = function(image, repetition) { - return new CanvasPattern_(image, repetition); - }; - - // Gradient / Pattern Stubs - function CanvasGradient_(aType) { - this.type_ = aType; - this.x0_ = 0; - this.y0_ = 0; - this.r0_ = 0; - this.x1_ = 0; - this.y1_ = 0; - this.r1_ = 0; - this.colors_ = []; - } - - CanvasGradient_.prototype.addColorStop = function(aOffset, aColor) { - aColor = processStyle(aColor); - this.colors_.push({offset: aOffset, - color: aColor.color, - alpha: aColor.alpha}); - }; - - function CanvasPattern_(image, repetition) { - assertImageIsValid(image); - switch (repetition) { - case 'repeat': - case null: - case '': - this.repetition_ = 'repeat'; - break - case 'repeat-x': - case 'repeat-y': - case 'no-repeat': - this.repetition_ = repetition; - break; - default: - throwException('SYNTAX_ERR'); - } - - this.src_ = image.src; - this.width_ = image.width; - this.height_ = image.height; - } - - function throwException(s) { - throw new DOMException_(s); - } - - function assertImageIsValid(img) { - if (!img || img.nodeType != 1 || img.tagName != 'IMG') { - throwException('TYPE_MISMATCH_ERR'); - } - if (img.readyState != 'complete') { - throwException('INVALID_STATE_ERR'); - } - } - - function DOMException_(s) { - this.code = this[s]; - this.message = s +': DOM Exception ' + this.code; - } - var p = DOMException_.prototype = new Error; - p.INDEX_SIZE_ERR = 1; - p.DOMSTRING_SIZE_ERR = 2; - p.HIERARCHY_REQUEST_ERR = 3; - p.WRONG_DOCUMENT_ERR = 4; - p.INVALID_CHARACTER_ERR = 5; - p.NO_DATA_ALLOWED_ERR = 6; - p.NO_MODIFICATION_ALLOWED_ERR = 7; - p.NOT_FOUND_ERR = 8; - p.NOT_SUPPORTED_ERR = 9; - p.INUSE_ATTRIBUTE_ERR = 10; - p.INVALID_STATE_ERR = 11; - p.SYNTAX_ERR = 12; - p.INVALID_MODIFICATION_ERR = 13; - p.NAMESPACE_ERR = 14; - p.INVALID_ACCESS_ERR = 15; - p.VALIDATION_ERR = 16; - p.TYPE_MISMATCH_ERR = 17; - - // set up externs - G_vmlCanvasManager = G_vmlCanvasManager_; - CanvasRenderingContext2D = CanvasRenderingContext2D_; - CanvasGradient = CanvasGradient_; - CanvasPattern = CanvasPattern_; - DOMException = DOMException_; -})(); - -} // if \ No newline at end of file diff --git a/system/templates/js/chart-js/site/assets/html.png b/system/templates/js/chart-js/site/assets/html.png deleted file mode 100755 index 55439dc9a6bb8f7b5d4791e5c84f28607396f7ff..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 83653 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™^8ykZ5u@N1ig0(e@!@lB$1> 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
-
-
-
-
-

Chart.js

-

Easy, object oriented client side graphs for designers and developers

-
- - - -
DocumentationDownload -
-
-
- -

6 Chart types

-

Visualise your data in different ways. Each of them animated, fully customisable and look great, even on retina displays.

-
-
- -

HTML5 Based

-

Chart.js uses the HTML5 canvas element. It supports all modern browsers, and polyfills provide support for IE7/8.

-
-
- -

Simple and flexible

-

Chart.js is dependency free, lightweight (4.5k when minified and gzipped) and offers loads of customisation options.

-
-
-
- - - - - - - - - - - -

Like what you see? Download Chart.js on Github or read detailed documentation

-
- - - - - diff --git a/system/templates/js/chart-js/site/styles.css b/system/templates/js/chart-js/site/styles.css deleted file mode 100755 index e24d05dca..000000000 --- a/system/templates/js/chart-js/site/styles.css +++ /dev/null @@ -1,205 +0,0 @@ -* { - padding: 0; - margin: 0; - color: inherit; - -webkit-font-smoothing: antialiased; - text-rendering: optimizeLegibility; -} -body { - color: #282b36; - border-top: 8px solid #282b36; -} -canvas { - font-family: "proxima-nova", sans-serif sans-serif; -} -.redBorder, -.greenBorder, -.yellowBorder { - width: 33.33%; - float: left; - height: 8px; -} -.redBorder { - background-color: #f33e6f; -} -.greenBorder { - background-color: #46bfbd; -} -.yellowBorder { - background-color: #fdb45c; -} -h1 { - font-family: "proxima-nova", sans-serif; - font-weight: 600; - font-size: 55px; - margin-top: 40px; -} -h2 { - font-family: "proxima-nova", sans-serif; - font-weight: 400; - margin-top: 20px; - font-size: 26px; - line-height: 40px; -} -h3 { - font-family: "proxima-nova", sans-serif; - font-weight: 600; - text-align: center; - margin: 20px 0; -} -h3 a { - color: #2d91ea; - text-decoration: none; - border-bottom: 1px solid #2d91ea; -} -p { - font-family: "proxima-nova", sans-serif; - line-height: 24px; - font-size: 18px; - color: #767c8d; -} -.btn { - display: inline-block; - padding: 20px; - font-family: "proxima-nova", sans-serif; - font-weight: 600; - color: #fff; - text-decoration: none; - border-radius: 5px; - text-align: center; - font-size: 18px; - -webkit-transition-property: background-color box-shadow; - -webkit-transition-duration: 200ms; - -webkit-transition-timing-function: ease-in-out; - -moz-transition-property: background-color box-shadow; - -moz-transition-duration: 200ms; - -moz-transition-timing-function: ease-in-out; - -ms-transition-property: background-color box-shadow; - -ms-transition-duration: 200ms; - -ms-transition-timing-function: ease-in-out; - -o-transition-property: background-color box-shadow; - -o-transition-duration: 200ms; - -o-transition-timing-function: ease-in-out; - transition-property: background-color box-shadow; - transition-duration: 200ms; - transition-timing-function: ease-in-out; -} -.btn:active { - box-shadow: inset 1px 1px 4px rgba(0, 0, 0, 0.25); -} -.btn.red { - background-color: #f33e6f; -} -.btn.red:hover { - background-color: #f2265d; -} -.btn.blue { - background-color: #2d91ea; -} -.btn.blue:hover { - background-color: #1785e6; -} -header { - width: 978px; - margin: 20px auto; - display: block; - position: relative; -} -header hgroup { - width: 50%; - padding: 20px 0; -} -header #introChart { - position: absolute; - top: 60px; - right: 0; -} -header .btn { - margin-right: 10px; - width: 180px; -} -footer { - width: 100%; - text-align: center; - background-color: #ebebeb; -} -footer p { - color: #767c8d; - font-family: "proxima-nova", sans-serif; - font-size: 16px; - padding: 20px 0; -} -section { - width: 978px; - margin: 40px auto; -} -section:before { - content: ''; - width: 600px; - margin: 0 auto; - border-top: 1px solid #ebebeb; - height: 20px; - display: block; -} -section:after { - content: ""; - display: table; - clear: both; -} -*section { - zoom: 1; -} -#features article { - width: 33.33%; - float: left; -} -#features article p { - display: block; - width: 90%; - margin: 0 auto; - text-align: center; -} -#features article img { - width: 250px; - height: 250px; - margin: 0 auto; - display: block; -} -#examples article { - -webkit-transition: opacity 200ms ease-in-out; - -ms-transition: opacity 200ms ease-in-out; - -moz-transition: opacity 200ms ease-in-out; - -o-transition: opacity 200ms ease-in-out; - transition: opacity 200ms ease-in-out; - position: relative; - margin-top: 20px; - clear: both; -} -#examples article:after { - content: ''; - width: 600px; - padding-top: 40px; - margin: 40px auto; - border-bottom: 1px solid #ebebeb; - height: 20px; - display: block; - clear: both; -} -#examples article p { - margin-top: 10px; -} -#examples article .half { - width: 50%; - float: left; -} -#examples article .canvasWrapper { - float: left; - width: 449px; - padding: 0 20px; -} -#examples h3 { - clear: both; -} -#examples .hidden { - opacity: 0; -} diff --git a/system/templates/js/chart-js/src/chart.js b/system/templates/js/chart-js/src/chart.js deleted file mode 100644 index 77d2bb636..000000000 --- a/system/templates/js/chart-js/src/chart.js +++ /dev/null @@ -1,52 +0,0 @@ -/** - * @namespace Chart - */ -var Chart = require('./core/core.js')(); - -require('./core/core.helpers')(Chart); -require('./platforms/platform.js')(Chart); -require('./core/core.canvasHelpers')(Chart); -require('./core/core.plugin.js')(Chart); -require('./core/core.element')(Chart); -require('./core/core.animation')(Chart); -require('./core/core.controller')(Chart); -require('./core/core.datasetController')(Chart); -require('./core/core.layoutService')(Chart); -require('./core/core.scaleService')(Chart); -require('./core/core.ticks.js')(Chart); -require('./core/core.scale')(Chart); -require('./core/core.title')(Chart); -require('./core/core.legend')(Chart); -require('./core/core.interaction')(Chart); -require('./core/core.tooltip')(Chart); - -require('./elements/element.arc')(Chart); -require('./elements/element.line')(Chart); -require('./elements/element.point')(Chart); -require('./elements/element.rectangle')(Chart); - -require('./scales/scale.linearbase.js')(Chart); -require('./scales/scale.category')(Chart); -require('./scales/scale.linear')(Chart); -require('./scales/scale.logarithmic')(Chart); -require('./scales/scale.radialLinear')(Chart); -require('./scales/scale.time')(Chart); - -// Controllers must be loaded after elements -// See Chart.core.datasetController.dataElementType -require('./controllers/controller.bar')(Chart); -require('./controllers/controller.bubble')(Chart); -require('./controllers/controller.doughnut')(Chart); -require('./controllers/controller.line')(Chart); -require('./controllers/controller.polarArea')(Chart); -require('./controllers/controller.radar')(Chart); - -require('./charts/Chart.Bar')(Chart); -require('./charts/Chart.Bubble')(Chart); -require('./charts/Chart.Doughnut')(Chart); -require('./charts/Chart.Line')(Chart); -require('./charts/Chart.PolarArea')(Chart); -require('./charts/Chart.Radar')(Chart); -require('./charts/Chart.Scatter')(Chart); - -window.Chart = module.exports = Chart; diff --git a/system/templates/js/chart-js/src/charts/Chart.Bar.js b/system/templates/js/chart-js/src/charts/Chart.Bar.js deleted file mode 100644 index e1ad7962f..000000000 --- a/system/templates/js/chart-js/src/charts/Chart.Bar.js +++ /dev/null @@ -1,11 +0,0 @@ -'use strict'; - -module.exports = function(Chart) { - - Chart.Bar = function(context, config) { - config.type = 'bar'; - - return new Chart(context, config); - }; - -}; diff --git a/system/templates/js/chart-js/src/charts/Chart.Bubble.js b/system/templates/js/chart-js/src/charts/Chart.Bubble.js deleted file mode 100644 index 2de4a1047..000000000 --- a/system/templates/js/chart-js/src/charts/Chart.Bubble.js +++ /dev/null @@ -1,10 +0,0 @@ -'use strict'; - -module.exports = function(Chart) { - - Chart.Bubble = function(context, config) { - config.type = 'bubble'; - return new Chart(context, config); - }; - -}; diff --git a/system/templates/js/chart-js/src/charts/Chart.Doughnut.js b/system/templates/js/chart-js/src/charts/Chart.Doughnut.js deleted file mode 100644 index e1e8ce54b..000000000 --- a/system/templates/js/chart-js/src/charts/Chart.Doughnut.js +++ /dev/null @@ -1,11 +0,0 @@ -'use strict'; - -module.exports = function(Chart) { - - Chart.Doughnut = function(context, config) { - config.type = 'doughnut'; - - return new Chart(context, config); - }; - -}; diff --git a/system/templates/js/chart-js/src/charts/Chart.Line.js b/system/templates/js/chart-js/src/charts/Chart.Line.js deleted file mode 100644 index e89662ff7..000000000 --- a/system/templates/js/chart-js/src/charts/Chart.Line.js +++ /dev/null @@ -1,11 +0,0 @@ -'use strict'; - -module.exports = function(Chart) { - - Chart.Line = function(context, config) { - config.type = 'line'; - - return new Chart(context, config); - }; - -}; diff --git a/system/templates/js/chart-js/src/charts/Chart.PolarArea.js b/system/templates/js/chart-js/src/charts/Chart.PolarArea.js deleted file mode 100644 index e07e4bac5..000000000 --- a/system/templates/js/chart-js/src/charts/Chart.PolarArea.js +++ /dev/null @@ -1,11 +0,0 @@ -'use strict'; - -module.exports = function(Chart) { - - Chart.PolarArea = function(context, config) { - config.type = 'polarArea'; - - return new Chart(context, config); - }; - -}; diff --git a/system/templates/js/chart-js/src/charts/Chart.Radar.js b/system/templates/js/chart-js/src/charts/Chart.Radar.js deleted file mode 100644 index d17bd5d81..000000000 --- a/system/templates/js/chart-js/src/charts/Chart.Radar.js +++ /dev/null @@ -1,11 +0,0 @@ -'use strict'; - -module.exports = function(Chart) { - - Chart.Radar = function(context, config) { - config.type = 'radar'; - - return new Chart(context, config); - }; - -}; diff --git a/system/templates/js/chart-js/src/charts/Chart.Scatter.js b/system/templates/js/chart-js/src/charts/Chart.Scatter.js deleted file mode 100644 index 84594f637..000000000 --- a/system/templates/js/chart-js/src/charts/Chart.Scatter.js +++ /dev/null @@ -1,47 +0,0 @@ -'use strict'; - -module.exports = function(Chart) { - - var defaultConfig = { - hover: { - mode: 'single' - }, - - scales: { - xAxes: [{ - type: 'linear', // scatter should not use a category axis - position: 'bottom', - id: 'x-axis-1' // need an ID so datasets can reference the scale - }], - yAxes: [{ - type: 'linear', - position: 'left', - id: 'y-axis-1' - }] - }, - - tooltips: { - callbacks: { - title: function() { - // Title doesn't make sense for scatter since we format the data as a point - return ''; - }, - label: function(tooltipItem) { - return '(' + tooltipItem.xLabel + ', ' + tooltipItem.yLabel + ')'; - } - } - } - }; - - // Register the default config for this type - Chart.defaults.scatter = defaultConfig; - - // Scatter charts use line controllers - Chart.controllers.scatter = Chart.controllers.line; - - Chart.Scatter = function(context, config) { - config.type = 'scatter'; - return new Chart(context, config); - }; - -}; diff --git a/system/templates/js/chart-js/src/controllers/controller.bar.js b/system/templates/js/chart-js/src/controllers/controller.bar.js deleted file mode 100644 index 1d41386b6..000000000 --- a/system/templates/js/chart-js/src/controllers/controller.bar.js +++ /dev/null @@ -1,540 +0,0 @@ -'use strict'; - -module.exports = function(Chart) { - - var helpers = Chart.helpers; - - Chart.defaults.bar = { - hover: { - mode: 'label' - }, - - scales: { - xAxes: [{ - type: 'category', - - // Specific to Bar Controller - categoryPercentage: 0.8, - barPercentage: 0.9, - - // grid line settings - gridLines: { - offsetGridLines: true - } - }], - yAxes: [{ - type: 'linear' - }] - } - }; - - Chart.controllers.bar = Chart.DatasetController.extend({ - - dataElementType: Chart.elements.Rectangle, - - initialize: function(chart, datasetIndex) { - Chart.DatasetController.prototype.initialize.call(this, chart, datasetIndex); - - var me = this; - var meta = me.getMeta(); - var dataset = me.getDataset(); - - meta.stack = dataset.stack; - // Use this to indicate that this is a bar dataset. - meta.bar = true; - }, - - // Correctly calculate the bar width accounting for stacks and the fact that not all bars are visible - getStackCount: function() { - var me = this; - var meta = me.getMeta(); - var yScale = me.getScaleForId(meta.yAxisID); - - var stacks = []; - helpers.each(me.chart.data.datasets, function(dataset, datasetIndex) { - var dsMeta = me.chart.getDatasetMeta(datasetIndex); - if (dsMeta.bar && me.chart.isDatasetVisible(datasetIndex) && - (yScale.options.stacked === false || - (yScale.options.stacked === true && stacks.indexOf(dsMeta.stack) === -1) || - (yScale.options.stacked === undefined && (dsMeta.stack === undefined || stacks.indexOf(dsMeta.stack) === -1)))) { - stacks.push(dsMeta.stack); - } - }, me); - - return stacks.length; - }, - - update: function(reset) { - var me = this; - helpers.each(me.getMeta().data, function(rectangle, index) { - me.updateElement(rectangle, index, reset); - }, me); - }, - - updateElement: function(rectangle, index, reset) { - var me = this; - var meta = me.getMeta(); - var xScale = me.getScaleForId(meta.xAxisID); - var yScale = me.getScaleForId(meta.yAxisID); - var scaleBase = yScale.getBasePixel(); - var rectangleElementOptions = me.chart.options.elements.rectangle; - var custom = rectangle.custom || {}; - var dataset = me.getDataset(); - - rectangle._xScale = xScale; - rectangle._yScale = yScale; - rectangle._datasetIndex = me.index; - rectangle._index = index; - - var ruler = me.getRuler(index); // The index argument for compatible - rectangle._model = { - x: me.calculateBarX(index, me.index, ruler), - y: reset ? scaleBase : me.calculateBarY(index, me.index), - - // Tooltip - label: me.chart.data.labels[index], - datasetLabel: dataset.label, - - // Appearance - horizontal: false, - base: reset ? scaleBase : me.calculateBarBase(me.index, index), - width: me.calculateBarWidth(ruler), - backgroundColor: custom.backgroundColor ? custom.backgroundColor : helpers.getValueAtIndexOrDefault(dataset.backgroundColor, index, rectangleElementOptions.backgroundColor), - borderSkipped: custom.borderSkipped ? custom.borderSkipped : rectangleElementOptions.borderSkipped, - borderColor: custom.borderColor ? custom.borderColor : helpers.getValueAtIndexOrDefault(dataset.borderColor, index, rectangleElementOptions.borderColor), - borderWidth: custom.borderWidth ? custom.borderWidth : helpers.getValueAtIndexOrDefault(dataset.borderWidth, index, rectangleElementOptions.borderWidth) - }; - - rectangle.pivot(); - }, - - calculateBarBase: function(datasetIndex, index) { - var me = this; - var meta = me.getMeta(); - var yScale = me.getScaleForId(meta.yAxisID); - var base = yScale.getBaseValue(); - var original = base; - - if ((yScale.options.stacked === true) || - (yScale.options.stacked === undefined && meta.stack !== undefined)) { - var chart = me.chart; - var datasets = chart.data.datasets; - var value = Number(datasets[datasetIndex].data[index]); - - for (var i = 0; i < datasetIndex; i++) { - var currentDs = datasets[i]; - var currentDsMeta = chart.getDatasetMeta(i); - if (currentDsMeta.bar && currentDsMeta.yAxisID === yScale.id && chart.isDatasetVisible(i) && - meta.stack === currentDsMeta.stack) { - var currentVal = Number(currentDs.data[index]); - base += value < 0 ? Math.min(currentVal, original) : Math.max(currentVal, original); - } - } - - return yScale.getPixelForValue(base); - } - - return yScale.getBasePixel(); - }, - - getRuler: function() { - var me = this; - var meta = me.getMeta(); - var xScale = me.getScaleForId(meta.xAxisID); - var stackCount = me.getStackCount(); - - var tickWidth = xScale.width / xScale.ticks.length; - var categoryWidth = tickWidth * xScale.options.categoryPercentage; - var categorySpacing = (tickWidth - (tickWidth * xScale.options.categoryPercentage)) / 2; - var fullBarWidth = categoryWidth / stackCount; - - var barWidth = fullBarWidth * xScale.options.barPercentage; - var barSpacing = fullBarWidth - (fullBarWidth * xScale.options.barPercentage); - - return { - stackCount: stackCount, - tickWidth: tickWidth, - categoryWidth: categoryWidth, - categorySpacing: categorySpacing, - fullBarWidth: fullBarWidth, - barWidth: barWidth, - barSpacing: barSpacing - }; - }, - - calculateBarWidth: function(ruler) { - var me = this; - var meta = me.getMeta(); - var xScale = me.getScaleForId(meta.xAxisID); - if (xScale.options.barThickness) { - return xScale.options.barThickness; - } - return ruler.barWidth; - }, - - // Get stack index from the given dataset index accounting for stacks and the fact that not all bars are visible - getStackIndex: function(datasetIndex) { - var me = this; - var meta = me.chart.getDatasetMeta(datasetIndex); - var yScale = me.getScaleForId(meta.yAxisID); - var dsMeta, j; - var stacks = [meta.stack]; - - for (j = 0; j < datasetIndex; ++j) { - dsMeta = this.chart.getDatasetMeta(j); - if (dsMeta.bar && this.chart.isDatasetVisible(j) && - (yScale.options.stacked === false || - (yScale.options.stacked === true && stacks.indexOf(dsMeta.stack) === -1) || - (yScale.options.stacked === undefined && (dsMeta.stack === undefined || stacks.indexOf(dsMeta.stack) === -1)))) { - stacks.push(dsMeta.stack); - } - } - - return stacks.length - 1; - }, - - calculateBarX: function(index, datasetIndex, ruler) { - var me = this; - var meta = me.getMeta(); - var xScale = me.getScaleForId(meta.xAxisID); - var stackIndex = me.getStackIndex(datasetIndex); - var leftTick = xScale.getPixelForValue(null, index, datasetIndex, me.chart.isCombo); - leftTick -= me.chart.isCombo ? (ruler.tickWidth / 2) : 0; - - return leftTick + - (ruler.barWidth / 2) + - ruler.categorySpacing + - (ruler.barWidth * stackIndex) + - (ruler.barSpacing / 2) + - (ruler.barSpacing * stackIndex); - }, - - calculateBarY: function(index, datasetIndex) { - var me = this; - var meta = me.getMeta(); - var yScale = me.getScaleForId(meta.yAxisID); - var value = Number(me.getDataset().data[index]); - - if (yScale.options.stacked || - (yScale.options.stacked === undefined && meta.stack !== undefined)) { - var base = yScale.getBaseValue(); - var sumPos = base, - sumNeg = base; - - for (var i = 0; i < datasetIndex; i++) { - var ds = me.chart.data.datasets[i]; - var dsMeta = me.chart.getDatasetMeta(i); - if (dsMeta.bar && dsMeta.yAxisID === yScale.id && me.chart.isDatasetVisible(i) && - meta.stack === dsMeta.stack) { - var stackedVal = Number(ds.data[index]); - if (stackedVal < 0) { - sumNeg += stackedVal || 0; - } else { - sumPos += stackedVal || 0; - } - } - } - - if (value < 0) { - return yScale.getPixelForValue(sumNeg + value); - } - return yScale.getPixelForValue(sumPos + value); - } - - return yScale.getPixelForValue(value); - }, - - draw: function(ease) { - var me = this; - var easingDecimal = ease || 1; - var metaData = me.getMeta().data; - var dataset = me.getDataset(); - var i, len; - - Chart.canvasHelpers.clipArea(me.chart.chart.ctx, me.chart.chartArea); - for (i = 0, len = metaData.length; i < len; ++i) { - var d = dataset.data[i]; - if (d !== null && d !== undefined && !isNaN(d)) { - metaData[i].transition(easingDecimal).draw(); - } - } - Chart.canvasHelpers.unclipArea(me.chart.chart.ctx); - }, - - setHoverStyle: function(rectangle) { - var dataset = this.chart.data.datasets[rectangle._datasetIndex]; - var index = rectangle._index; - - var custom = rectangle.custom || {}; - var model = rectangle._model; - model.backgroundColor = custom.hoverBackgroundColor ? custom.hoverBackgroundColor : helpers.getValueAtIndexOrDefault(dataset.hoverBackgroundColor, index, helpers.getHoverColor(model.backgroundColor)); - model.borderColor = custom.hoverBorderColor ? custom.hoverBorderColor : helpers.getValueAtIndexOrDefault(dataset.hoverBorderColor, index, helpers.getHoverColor(model.borderColor)); - model.borderWidth = custom.hoverBorderWidth ? custom.hoverBorderWidth : helpers.getValueAtIndexOrDefault(dataset.hoverBorderWidth, index, model.borderWidth); - }, - - removeHoverStyle: function(rectangle) { - var dataset = this.chart.data.datasets[rectangle._datasetIndex]; - var index = rectangle._index; - var custom = rectangle.custom || {}; - var model = rectangle._model; - var rectangleElementOptions = this.chart.options.elements.rectangle; - - model.backgroundColor = custom.backgroundColor ? custom.backgroundColor : helpers.getValueAtIndexOrDefault(dataset.backgroundColor, index, rectangleElementOptions.backgroundColor); - model.borderColor = custom.borderColor ? custom.borderColor : helpers.getValueAtIndexOrDefault(dataset.borderColor, index, rectangleElementOptions.borderColor); - model.borderWidth = custom.borderWidth ? custom.borderWidth : helpers.getValueAtIndexOrDefault(dataset.borderWidth, index, rectangleElementOptions.borderWidth); - } - - }); - - - // including horizontalBar in the bar file, instead of a file of its own - // it extends bar (like pie extends doughnut) - Chart.defaults.horizontalBar = { - hover: { - mode: 'label' - }, - - scales: { - xAxes: [{ - type: 'linear', - position: 'bottom' - }], - yAxes: [{ - position: 'left', - type: 'category', - - // Specific to Horizontal Bar Controller - categoryPercentage: 0.8, - barPercentage: 0.9, - - // grid line settings - gridLines: { - offsetGridLines: true - } - }] - }, - elements: { - rectangle: { - borderSkipped: 'left' - } - }, - tooltips: { - callbacks: { - title: function(tooltipItems, data) { - // Pick first xLabel for now - var title = ''; - - if (tooltipItems.length > 0) { - if (tooltipItems[0].yLabel) { - title = tooltipItems[0].yLabel; - } else if (data.labels.length > 0 && tooltipItems[0].index < data.labels.length) { - title = data.labels[tooltipItems[0].index]; - } - } - - return title; - }, - label: function(tooltipItem, data) { - var datasetLabel = data.datasets[tooltipItem.datasetIndex].label || ''; - return datasetLabel + ': ' + tooltipItem.xLabel; - } - } - } - }; - - Chart.controllers.horizontalBar = Chart.controllers.bar.extend({ - - // Correctly calculate the bar width accounting for stacks and the fact that not all bars are visible - getStackCount: function() { - var me = this; - var meta = me.getMeta(); - var xScale = me.getScaleForId(meta.xAxisID); - - var stacks = []; - helpers.each(me.chart.data.datasets, function(dataset, datasetIndex) { - var dsMeta = me.chart.getDatasetMeta(datasetIndex); - if (dsMeta.bar && me.chart.isDatasetVisible(datasetIndex) && - (xScale.options.stacked === false || - (xScale.options.stacked === true && stacks.indexOf(dsMeta.stack) === -1) || - (xScale.options.stacked === undefined && (dsMeta.stack === undefined || stacks.indexOf(dsMeta.stack) === -1)))) { - stacks.push(dsMeta.stack); - } - }, me); - - return stacks.length; - }, - - updateElement: function(rectangle, index, reset) { - var me = this; - var meta = me.getMeta(); - var xScale = me.getScaleForId(meta.xAxisID); - var yScale = me.getScaleForId(meta.yAxisID); - var scaleBase = xScale.getBasePixel(); - var custom = rectangle.custom || {}; - var dataset = me.getDataset(); - var rectangleElementOptions = me.chart.options.elements.rectangle; - - rectangle._xScale = xScale; - rectangle._yScale = yScale; - rectangle._datasetIndex = me.index; - rectangle._index = index; - - var ruler = me.getRuler(index); // The index argument for compatible - rectangle._model = { - x: reset ? scaleBase : me.calculateBarX(index, me.index), - y: me.calculateBarY(index, me.index, ruler), - - // Tooltip - label: me.chart.data.labels[index], - datasetLabel: dataset.label, - - // Appearance - horizontal: true, - base: reset ? scaleBase : me.calculateBarBase(me.index, index), - height: me.calculateBarHeight(ruler), - backgroundColor: custom.backgroundColor ? custom.backgroundColor : helpers.getValueAtIndexOrDefault(dataset.backgroundColor, index, rectangleElementOptions.backgroundColor), - borderSkipped: custom.borderSkipped ? custom.borderSkipped : rectangleElementOptions.borderSkipped, - borderColor: custom.borderColor ? custom.borderColor : helpers.getValueAtIndexOrDefault(dataset.borderColor, index, rectangleElementOptions.borderColor), - borderWidth: custom.borderWidth ? custom.borderWidth : helpers.getValueAtIndexOrDefault(dataset.borderWidth, index, rectangleElementOptions.borderWidth) - }; - - rectangle.pivot(); - }, - - calculateBarBase: function(datasetIndex, index) { - var me = this; - var meta = me.getMeta(); - var xScale = me.getScaleForId(meta.xAxisID); - var base = xScale.getBaseValue(); - var originalBase = base; - - if (xScale.options.stacked || - (xScale.options.stacked === undefined && meta.stack !== undefined)) { - var chart = me.chart; - var datasets = chart.data.datasets; - var value = Number(datasets[datasetIndex].data[index]); - - for (var i = 0; i < datasetIndex; i++) { - var currentDs = datasets[i]; - var currentDsMeta = chart.getDatasetMeta(i); - if (currentDsMeta.bar && currentDsMeta.xAxisID === xScale.id && chart.isDatasetVisible(i) && - meta.stack === currentDsMeta.stack) { - var currentVal = Number(currentDs.data[index]); - base += value < 0 ? Math.min(currentVal, originalBase) : Math.max(currentVal, originalBase); - } - } - - return xScale.getPixelForValue(base); - } - - return xScale.getBasePixel(); - }, - - getRuler: function() { - var me = this; - var meta = me.getMeta(); - var yScale = me.getScaleForId(meta.yAxisID); - var stackCount = me.getStackCount(); - - var tickHeight = yScale.height / yScale.ticks.length; - var categoryHeight = tickHeight * yScale.options.categoryPercentage; - var categorySpacing = (tickHeight - (tickHeight * yScale.options.categoryPercentage)) / 2; - var fullBarHeight = categoryHeight / stackCount; - - var barHeight = fullBarHeight * yScale.options.barPercentage; - var barSpacing = fullBarHeight - (fullBarHeight * yScale.options.barPercentage); - - return { - stackCount: stackCount, - tickHeight: tickHeight, - categoryHeight: categoryHeight, - categorySpacing: categorySpacing, - fullBarHeight: fullBarHeight, - barHeight: barHeight, - barSpacing: barSpacing - }; - }, - - calculateBarHeight: function(ruler) { - var me = this; - var meta = me.getMeta(); - var yScale = me.getScaleForId(meta.yAxisID); - if (yScale.options.barThickness) { - return yScale.options.barThickness; - } - return ruler.barHeight; - }, - - // Get stack index from the given dataset index accounting for stacks and the fact that not all bars are visible - getStackIndex: function(datasetIndex) { - var me = this; - var meta = me.chart.getDatasetMeta(datasetIndex); - var xScale = me.getScaleForId(meta.xAxisID); - var dsMeta, j; - var stacks = [meta.stack]; - - for (j = 0; j < datasetIndex; ++j) { - dsMeta = this.chart.getDatasetMeta(j); - if (dsMeta.bar && this.chart.isDatasetVisible(j) && - (xScale.options.stacked === false || - (xScale.options.stacked === true && stacks.indexOf(dsMeta.stack) === -1) || - (xScale.options.stacked === undefined && (dsMeta.stack === undefined || stacks.indexOf(dsMeta.stack) === -1)))) { - stacks.push(dsMeta.stack); - } - } - - return stacks.length - 1; - }, - - calculateBarX: function(index, datasetIndex) { - var me = this; - var meta = me.getMeta(); - var xScale = me.getScaleForId(meta.xAxisID); - var value = Number(me.getDataset().data[index]); - - if (xScale.options.stacked || - (xScale.options.stacked === undefined && meta.stack !== undefined)) { - var base = xScale.getBaseValue(); - var sumPos = base, - sumNeg = base; - - for (var i = 0; i < datasetIndex; i++) { - var ds = me.chart.data.datasets[i]; - var dsMeta = me.chart.getDatasetMeta(i); - if (dsMeta.bar && dsMeta.xAxisID === xScale.id && me.chart.isDatasetVisible(i) && - meta.stack === dsMeta.stack) { - var stackedVal = Number(ds.data[index]); - if (stackedVal < 0) { - sumNeg += stackedVal || 0; - } else { - sumPos += stackedVal || 0; - } - } - } - - if (value < 0) { - return xScale.getPixelForValue(sumNeg + value); - } - return xScale.getPixelForValue(sumPos + value); - } - - return xScale.getPixelForValue(value); - }, - - calculateBarY: function(index, datasetIndex, ruler) { - var me = this; - var meta = me.getMeta(); - var yScale = me.getScaleForId(meta.yAxisID); - var stackIndex = me.getStackIndex(datasetIndex); - var topTick = yScale.getPixelForValue(null, index, datasetIndex, me.chart.isCombo); - topTick -= me.chart.isCombo ? (ruler.tickHeight / 2) : 0; - - return topTick + - (ruler.barHeight / 2) + - ruler.categorySpacing + - (ruler.barHeight * stackIndex) + - (ruler.barSpacing / 2) + - (ruler.barSpacing * stackIndex); - } - }); -}; diff --git a/system/templates/js/chart-js/src/controllers/controller.bubble.js b/system/templates/js/chart-js/src/controllers/controller.bubble.js deleted file mode 100644 index abe807b3b..000000000 --- a/system/templates/js/chart-js/src/controllers/controller.bubble.js +++ /dev/null @@ -1,122 +0,0 @@ -'use strict'; - -module.exports = function(Chart) { - - var helpers = Chart.helpers; - - Chart.defaults.bubble = { - hover: { - mode: 'single' - }, - - scales: { - xAxes: [{ - type: 'linear', // bubble should probably use a linear scale by default - position: 'bottom', - id: 'x-axis-0' // need an ID so datasets can reference the scale - }], - yAxes: [{ - type: 'linear', - position: 'left', - id: 'y-axis-0' - }] - }, - - tooltips: { - callbacks: { - title: function() { - // Title doesn't make sense for scatter since we format the data as a point - return ''; - }, - label: function(tooltipItem, data) { - var datasetLabel = data.datasets[tooltipItem.datasetIndex].label || ''; - var dataPoint = data.datasets[tooltipItem.datasetIndex].data[tooltipItem.index]; - return datasetLabel + ': (' + tooltipItem.xLabel + ', ' + tooltipItem.yLabel + ', ' + dataPoint.r + ')'; - } - } - } - }; - - Chart.controllers.bubble = Chart.DatasetController.extend({ - - dataElementType: Chart.elements.Point, - - update: function(reset) { - var me = this; - var meta = me.getMeta(); - var points = meta.data; - - // Update Points - helpers.each(points, function(point, index) { - me.updateElement(point, index, reset); - }); - }, - - updateElement: function(point, index, reset) { - var me = this; - var meta = me.getMeta(); - var xScale = me.getScaleForId(meta.xAxisID); - var yScale = me.getScaleForId(meta.yAxisID); - - var custom = point.custom || {}; - var dataset = me.getDataset(); - var data = dataset.data[index]; - var pointElementOptions = me.chart.options.elements.point; - var dsIndex = me.index; - - helpers.extend(point, { - // Utility - _xScale: xScale, - _yScale: yScale, - _datasetIndex: dsIndex, - _index: index, - - // Desired view properties - _model: { - x: reset ? xScale.getPixelForDecimal(0.5) : xScale.getPixelForValue(typeof data === 'object' ? data : NaN, index, dsIndex, me.chart.isCombo), - y: reset ? yScale.getBasePixel() : yScale.getPixelForValue(data, index, dsIndex), - // Appearance - radius: reset ? 0 : custom.radius ? custom.radius : me.getRadius(data), - - // Tooltip - hitRadius: custom.hitRadius ? custom.hitRadius : helpers.getValueAtIndexOrDefault(dataset.hitRadius, index, pointElementOptions.hitRadius) - } - }); - - // Trick to reset the styles of the point - Chart.DatasetController.prototype.removeHoverStyle.call(me, point, pointElementOptions); - - var model = point._model; - model.skip = custom.skip ? custom.skip : (isNaN(model.x) || isNaN(model.y)); - - point.pivot(); - }, - - getRadius: function(value) { - return value.r || this.chart.options.elements.point.radius; - }, - - setHoverStyle: function(point) { - var me = this; - Chart.DatasetController.prototype.setHoverStyle.call(me, point); - - // Radius - var dataset = me.chart.data.datasets[point._datasetIndex]; - var index = point._index; - var custom = point.custom || {}; - var model = point._model; - model.radius = custom.hoverRadius ? custom.hoverRadius : (helpers.getValueAtIndexOrDefault(dataset.hoverRadius, index, me.chart.options.elements.point.hoverRadius)) + me.getRadius(dataset.data[index]); - }, - - removeHoverStyle: function(point) { - var me = this; - Chart.DatasetController.prototype.removeHoverStyle.call(me, point, me.chart.options.elements.point); - - var dataVal = me.chart.data.datasets[point._datasetIndex].data[point._index]; - var custom = point.custom || {}; - var model = point._model; - - model.radius = custom.radius ? custom.radius : me.getRadius(dataVal); - } - }); -}; diff --git a/system/templates/js/chart-js/src/controllers/controller.doughnut.js b/system/templates/js/chart-js/src/controllers/controller.doughnut.js deleted file mode 100644 index 3d4780582..000000000 --- a/system/templates/js/chart-js/src/controllers/controller.doughnut.js +++ /dev/null @@ -1,303 +0,0 @@ -'use strict'; - -module.exports = function(Chart) { - - var helpers = Chart.helpers, - defaults = Chart.defaults; - - defaults.doughnut = { - animation: { - // Boolean - Whether we animate the rotation of the Doughnut - animateRotate: true, - // Boolean - Whether we animate scaling the Doughnut from the centre - animateScale: false - }, - aspectRatio: 1, - hover: { - mode: 'single' - }, - legendCallback: function(chart) { - var text = []; - text.push('
    '); - - var data = chart.data; - var datasets = data.datasets; - var labels = data.labels; - - if (datasets.length) { - for (var i = 0; i < datasets[0].data.length; ++i) { - text.push('
  • '); - if (labels[i]) { - text.push(labels[i]); - } - text.push('
  • '); - } - } - - text.push('
'); - return text.join(''); - }, - legend: { - labels: { - generateLabels: function(chart) { - var data = chart.data; - if (data.labels.length && data.datasets.length) { - return data.labels.map(function(label, i) { - var meta = chart.getDatasetMeta(0); - var ds = data.datasets[0]; - var arc = meta.data[i]; - var custom = arc && arc.custom || {}; - var getValueAtIndexOrDefault = helpers.getValueAtIndexOrDefault; - var arcOpts = chart.options.elements.arc; - var fill = custom.backgroundColor ? custom.backgroundColor : getValueAtIndexOrDefault(ds.backgroundColor, i, arcOpts.backgroundColor); - var stroke = custom.borderColor ? custom.borderColor : getValueAtIndexOrDefault(ds.borderColor, i, arcOpts.borderColor); - var bw = custom.borderWidth ? custom.borderWidth : getValueAtIndexOrDefault(ds.borderWidth, i, arcOpts.borderWidth); - - return { - text: label, - fillStyle: fill, - strokeStyle: stroke, - lineWidth: bw, - hidden: isNaN(ds.data[i]) || meta.data[i].hidden, - - // Extra data used for toggling the correct item - index: i - }; - }); - } - return []; - } - }, - - onClick: function(e, legendItem) { - var index = legendItem.index; - var chart = this.chart; - var i, ilen, meta; - - for (i = 0, ilen = (chart.data.datasets || []).length; i < ilen; ++i) { - meta = chart.getDatasetMeta(i); - // toggle visibility of index if exists - if (meta.data[index]) { - meta.data[index].hidden = !meta.data[index].hidden; - } - } - - chart.update(); - } - }, - - // The percentage of the chart that we cut out of the middle. - cutoutPercentage: 50, - - // The rotation of the chart, where the first data arc begins. - rotation: Math.PI * -0.5, - - // The total circumference of the chart. - circumference: Math.PI * 2.0, - - // Need to override these to give a nice default - tooltips: { - callbacks: { - title: function() { - return ''; - }, - label: function(tooltipItem, data) { - var dataLabel = data.labels[tooltipItem.index]; - var value = ': ' + data.datasets[tooltipItem.datasetIndex].data[tooltipItem.index]; - - if (helpers.isArray(dataLabel)) { - // show value on first line of multiline label - // need to clone because we are changing the value - dataLabel = dataLabel.slice(); - dataLabel[0] += value; - } else { - dataLabel += value; - } - - return dataLabel; - } - } - } - }; - - defaults.pie = helpers.clone(defaults.doughnut); - helpers.extend(defaults.pie, { - cutoutPercentage: 0 - }); - - - Chart.controllers.doughnut = Chart.controllers.pie = Chart.DatasetController.extend({ - - dataElementType: Chart.elements.Arc, - - linkScales: helpers.noop, - - // Get index of the dataset in relation to the visible datasets. This allows determining the inner and outer radius correctly - getRingIndex: function(datasetIndex) { - var ringIndex = 0; - - for (var j = 0; j < datasetIndex; ++j) { - if (this.chart.isDatasetVisible(j)) { - ++ringIndex; - } - } - - return ringIndex; - }, - - update: function(reset) { - var me = this; - var chart = me.chart, - chartArea = chart.chartArea, - opts = chart.options, - arcOpts = opts.elements.arc, - availableWidth = chartArea.right - chartArea.left - arcOpts.borderWidth, - availableHeight = chartArea.bottom - chartArea.top - arcOpts.borderWidth, - minSize = Math.min(availableWidth, availableHeight), - offset = { - x: 0, - y: 0 - }, - meta = me.getMeta(), - cutoutPercentage = opts.cutoutPercentage, - circumference = opts.circumference; - - // If the chart's circumference isn't a full circle, calculate minSize as a ratio of the width/height of the arc - if (circumference < Math.PI * 2.0) { - var startAngle = opts.rotation % (Math.PI * 2.0); - startAngle += Math.PI * 2.0 * (startAngle >= Math.PI ? -1 : startAngle < -Math.PI ? 1 : 0); - var endAngle = startAngle + circumference; - var start = {x: Math.cos(startAngle), y: Math.sin(startAngle)}; - var end = {x: Math.cos(endAngle), y: Math.sin(endAngle)}; - var contains0 = (startAngle <= 0 && 0 <= endAngle) || (startAngle <= Math.PI * 2.0 && Math.PI * 2.0 <= endAngle); - var contains90 = (startAngle <= Math.PI * 0.5 && Math.PI * 0.5 <= endAngle) || (startAngle <= Math.PI * 2.5 && Math.PI * 2.5 <= endAngle); - var contains180 = (startAngle <= -Math.PI && -Math.PI <= endAngle) || (startAngle <= Math.PI && Math.PI <= endAngle); - var contains270 = (startAngle <= -Math.PI * 0.5 && -Math.PI * 0.5 <= endAngle) || (startAngle <= Math.PI * 1.5 && Math.PI * 1.5 <= endAngle); - var cutout = cutoutPercentage / 100.0; - var min = {x: contains180 ? -1 : Math.min(start.x * (start.x < 0 ? 1 : cutout), end.x * (end.x < 0 ? 1 : cutout)), y: contains270 ? -1 : Math.min(start.y * (start.y < 0 ? 1 : cutout), end.y * (end.y < 0 ? 1 : cutout))}; - var max = {x: contains0 ? 1 : Math.max(start.x * (start.x > 0 ? 1 : cutout), end.x * (end.x > 0 ? 1 : cutout)), y: contains90 ? 1 : Math.max(start.y * (start.y > 0 ? 1 : cutout), end.y * (end.y > 0 ? 1 : cutout))}; - var size = {width: (max.x - min.x) * 0.5, height: (max.y - min.y) * 0.5}; - minSize = Math.min(availableWidth / size.width, availableHeight / size.height); - offset = {x: (max.x + min.x) * -0.5, y: (max.y + min.y) * -0.5}; - } - - chart.borderWidth = me.getMaxBorderWidth(meta.data); - chart.outerRadius = Math.max((minSize - chart.borderWidth) / 2, 0); - chart.innerRadius = Math.max(cutoutPercentage ? (chart.outerRadius / 100) * (cutoutPercentage) : 0, 0); - chart.radiusLength = (chart.outerRadius - chart.innerRadius) / chart.getVisibleDatasetCount(); - chart.offsetX = offset.x * chart.outerRadius; - chart.offsetY = offset.y * chart.outerRadius; - - meta.total = me.calculateTotal(); - - me.outerRadius = chart.outerRadius - (chart.radiusLength * me.getRingIndex(me.index)); - me.innerRadius = Math.max(me.outerRadius - chart.radiusLength, 0); - - helpers.each(meta.data, function(arc, index) { - me.updateElement(arc, index, reset); - }); - }, - - updateElement: function(arc, index, reset) { - var me = this; - var chart = me.chart, - chartArea = chart.chartArea, - opts = chart.options, - animationOpts = opts.animation, - centerX = (chartArea.left + chartArea.right) / 2, - centerY = (chartArea.top + chartArea.bottom) / 2, - startAngle = opts.rotation, // non reset case handled later - endAngle = opts.rotation, // non reset case handled later - dataset = me.getDataset(), - circumference = reset && animationOpts.animateRotate ? 0 : arc.hidden ? 0 : me.calculateCircumference(dataset.data[index]) * (opts.circumference / (2.0 * Math.PI)), - innerRadius = reset && animationOpts.animateScale ? 0 : me.innerRadius, - outerRadius = reset && animationOpts.animateScale ? 0 : me.outerRadius, - valueAtIndexOrDefault = helpers.getValueAtIndexOrDefault; - - helpers.extend(arc, { - // Utility - _datasetIndex: me.index, - _index: index, - - // Desired view properties - _model: { - x: centerX + chart.offsetX, - y: centerY + chart.offsetY, - startAngle: startAngle, - endAngle: endAngle, - circumference: circumference, - outerRadius: outerRadius, - innerRadius: innerRadius, - label: valueAtIndexOrDefault(dataset.label, index, chart.data.labels[index]) - } - }); - - var model = arc._model; - // Resets the visual styles - this.removeHoverStyle(arc); - - // Set correct angles if not resetting - if (!reset || !animationOpts.animateRotate) { - if (index === 0) { - model.startAngle = opts.rotation; - } else { - model.startAngle = me.getMeta().data[index - 1]._model.endAngle; - } - - model.endAngle = model.startAngle + model.circumference; - } - - arc.pivot(); - }, - - removeHoverStyle: function(arc) { - Chart.DatasetController.prototype.removeHoverStyle.call(this, arc, this.chart.options.elements.arc); - }, - - calculateTotal: function() { - var dataset = this.getDataset(); - var meta = this.getMeta(); - var total = 0; - var value; - - helpers.each(meta.data, function(element, index) { - value = dataset.data[index]; - if (!isNaN(value) && !element.hidden) { - total += Math.abs(value); - } - }); - - /* if (total === 0) { - total = NaN; - }*/ - - return total; - }, - - calculateCircumference: function(value) { - var total = this.getMeta().total; - if (total > 0 && !isNaN(value)) { - return (Math.PI * 2.0) * (value / total); - } - return 0; - }, - - // gets the max border or hover width to properly scale pie charts - getMaxBorderWidth: function(elements) { - var max = 0, - index = this.index, - length = elements.length, - borderWidth, - hoverWidth; - - for (var i = 0; i < length; i++) { - borderWidth = elements[i]._model ? elements[i]._model.borderWidth : 0; - hoverWidth = elements[i]._chart ? elements[i]._chart.config.data.datasets[index].hoverBorderWidth : 0; - - max = borderWidth > max ? borderWidth : max; - max = hoverWidth > max ? hoverWidth : max; - } - return max; - } - }); -}; diff --git a/system/templates/js/chart-js/src/controllers/controller.line.js b/system/templates/js/chart-js/src/controllers/controller.line.js deleted file mode 100644 index 806ab4f3f..000000000 --- a/system/templates/js/chart-js/src/controllers/controller.line.js +++ /dev/null @@ -1,339 +0,0 @@ -'use strict'; - -module.exports = function(Chart) { - - var helpers = Chart.helpers; - - Chart.defaults.line = { - showLines: true, - spanGaps: false, - - hover: { - mode: 'label' - }, - - scales: { - xAxes: [{ - type: 'category', - id: 'x-axis-0' - }], - yAxes: [{ - type: 'linear', - id: 'y-axis-0' - }] - } - }; - - function lineEnabled(dataset, options) { - return helpers.getValueOrDefault(dataset.showLine, options.showLines); - } - - Chart.controllers.line = Chart.DatasetController.extend({ - - datasetElementType: Chart.elements.Line, - - dataElementType: Chart.elements.Point, - - update: function(reset) { - var me = this; - var meta = me.getMeta(); - var line = meta.dataset; - var points = meta.data || []; - var options = me.chart.options; - var lineElementOptions = options.elements.line; - var scale = me.getScaleForId(meta.yAxisID); - var i, ilen, custom; - var dataset = me.getDataset(); - var showLine = lineEnabled(dataset, options); - - // Update Line - if (showLine) { - custom = line.custom || {}; - - // Compatibility: If the properties are defined with only the old name, use those values - if ((dataset.tension !== undefined) && (dataset.lineTension === undefined)) { - dataset.lineTension = dataset.tension; - } - - // Utility - line._scale = scale; - line._datasetIndex = me.index; - // Data - line._children = points; - // Model - line._model = { - // Appearance - // The default behavior of lines is to break at null values, according - // to https://github.com/chartjs/Chart.js/issues/2435#issuecomment-216718158 - // This option gives lines the ability to span gaps - spanGaps: dataset.spanGaps ? dataset.spanGaps : options.spanGaps, - tension: custom.tension ? custom.tension : helpers.getValueOrDefault(dataset.lineTension, lineElementOptions.tension), - backgroundColor: custom.backgroundColor ? custom.backgroundColor : (dataset.backgroundColor || lineElementOptions.backgroundColor), - borderWidth: custom.borderWidth ? custom.borderWidth : (dataset.borderWidth || lineElementOptions.borderWidth), - borderColor: custom.borderColor ? custom.borderColor : (dataset.borderColor || lineElementOptions.borderColor), - borderCapStyle: custom.borderCapStyle ? custom.borderCapStyle : (dataset.borderCapStyle || lineElementOptions.borderCapStyle), - borderDash: custom.borderDash ? custom.borderDash : (dataset.borderDash || lineElementOptions.borderDash), - borderDashOffset: custom.borderDashOffset ? custom.borderDashOffset : (dataset.borderDashOffset || lineElementOptions.borderDashOffset), - borderJoinStyle: custom.borderJoinStyle ? custom.borderJoinStyle : (dataset.borderJoinStyle || lineElementOptions.borderJoinStyle), - fill: custom.fill ? custom.fill : (dataset.fill !== undefined ? dataset.fill : lineElementOptions.fill), - steppedLine: custom.steppedLine ? custom.steppedLine : helpers.getValueOrDefault(dataset.steppedLine, lineElementOptions.stepped), - cubicInterpolationMode: custom.cubicInterpolationMode ? custom.cubicInterpolationMode : helpers.getValueOrDefault(dataset.cubicInterpolationMode, lineElementOptions.cubicInterpolationMode), - // Scale - scaleTop: scale.top, - scaleBottom: scale.bottom, - scaleZero: scale.getBasePixel() - }; - - line.pivot(); - } - - // Update Points - for (i=0, ilen=points.length; i'); - - var data = chart.data; - var datasets = data.datasets; - var labels = data.labels; - - if (datasets.length) { - for (var i = 0; i < datasets[0].data.length; ++i) { - text.push('
  • '); - if (labels[i]) { - text.push(labels[i]); - } - text.push('
  • '); - } - } - - text.push(''); - return text.join(''); - }, - legend: { - labels: { - generateLabels: function(chart) { - var data = chart.data; - if (data.labels.length && data.datasets.length) { - return data.labels.map(function(label, i) { - var meta = chart.getDatasetMeta(0); - var ds = data.datasets[0]; - var arc = meta.data[i]; - var custom = arc.custom || {}; - var getValueAtIndexOrDefault = helpers.getValueAtIndexOrDefault; - var arcOpts = chart.options.elements.arc; - var fill = custom.backgroundColor ? custom.backgroundColor : getValueAtIndexOrDefault(ds.backgroundColor, i, arcOpts.backgroundColor); - var stroke = custom.borderColor ? custom.borderColor : getValueAtIndexOrDefault(ds.borderColor, i, arcOpts.borderColor); - var bw = custom.borderWidth ? custom.borderWidth : getValueAtIndexOrDefault(ds.borderWidth, i, arcOpts.borderWidth); - - return { - text: label, - fillStyle: fill, - strokeStyle: stroke, - lineWidth: bw, - hidden: isNaN(ds.data[i]) || meta.data[i].hidden, - - // Extra data used for toggling the correct item - index: i - }; - }); - } - return []; - } - }, - - onClick: function(e, legendItem) { - var index = legendItem.index; - var chart = this.chart; - var i, ilen, meta; - - for (i = 0, ilen = (chart.data.datasets || []).length; i < ilen; ++i) { - meta = chart.getDatasetMeta(i); - meta.data[index].hidden = !meta.data[index].hidden; - } - - chart.update(); - } - }, - - // Need to override these to give a nice default - tooltips: { - callbacks: { - title: function() { - return ''; - }, - label: function(tooltipItem, data) { - return data.labels[tooltipItem.index] + ': ' + tooltipItem.yLabel; - } - } - } - }; - - Chart.controllers.polarArea = Chart.DatasetController.extend({ - - dataElementType: Chart.elements.Arc, - - linkScales: helpers.noop, - - update: function(reset) { - var me = this; - var chart = me.chart; - var chartArea = chart.chartArea; - var meta = me.getMeta(); - var opts = chart.options; - var arcOpts = opts.elements.arc; - var minSize = Math.min(chartArea.right - chartArea.left, chartArea.bottom - chartArea.top); - chart.outerRadius = Math.max((minSize - arcOpts.borderWidth / 2) / 2, 0); - chart.innerRadius = Math.max(opts.cutoutPercentage ? (chart.outerRadius / 100) * (opts.cutoutPercentage) : 1, 0); - chart.radiusLength = (chart.outerRadius - chart.innerRadius) / chart.getVisibleDatasetCount(); - - me.outerRadius = chart.outerRadius - (chart.radiusLength * me.index); - me.innerRadius = me.outerRadius - chart.radiusLength; - - meta.count = me.countVisibleElements(); - - helpers.each(meta.data, function(arc, index) { - me.updateElement(arc, index, reset); - }); - }, - - updateElement: function(arc, index, reset) { - var me = this; - var chart = me.chart; - var dataset = me.getDataset(); - var opts = chart.options; - var animationOpts = opts.animation; - var scale = chart.scale; - var getValueAtIndexOrDefault = helpers.getValueAtIndexOrDefault; - var labels = chart.data.labels; - - var circumference = me.calculateCircumference(dataset.data[index]); - var centerX = scale.xCenter; - var centerY = scale.yCenter; - - // If there is NaN data before us, we need to calculate the starting angle correctly. - // We could be way more efficient here, but its unlikely that the polar area chart will have a lot of data - var visibleCount = 0; - var meta = me.getMeta(); - for (var i = 0; i < index; ++i) { - if (!isNaN(dataset.data[i]) && !meta.data[i].hidden) { - ++visibleCount; - } - } - - // var negHalfPI = -0.5 * Math.PI; - var datasetStartAngle = opts.startAngle; - var distance = arc.hidden ? 0 : scale.getDistanceFromCenterForValue(dataset.data[index]); - var startAngle = datasetStartAngle + (circumference * visibleCount); - var endAngle = startAngle + (arc.hidden ? 0 : circumference); - - var resetRadius = animationOpts.animateScale ? 0 : scale.getDistanceFromCenterForValue(dataset.data[index]); - - helpers.extend(arc, { - // Utility - _datasetIndex: me.index, - _index: index, - _scale: scale, - - // Desired view properties - _model: { - x: centerX, - y: centerY, - innerRadius: 0, - outerRadius: reset ? resetRadius : distance, - startAngle: reset && animationOpts.animateRotate ? datasetStartAngle : startAngle, - endAngle: reset && animationOpts.animateRotate ? datasetStartAngle : endAngle, - label: getValueAtIndexOrDefault(labels, index, labels[index]) - } - }); - - // Apply border and fill style - me.removeHoverStyle(arc); - - arc.pivot(); - }, - - removeHoverStyle: function(arc) { - Chart.DatasetController.prototype.removeHoverStyle.call(this, arc, this.chart.options.elements.arc); - }, - - countVisibleElements: function() { - var dataset = this.getDataset(); - var meta = this.getMeta(); - var count = 0; - - helpers.each(meta.data, function(element, index) { - if (!isNaN(dataset.data[index]) && !element.hidden) { - count++; - } - }); - - return count; - }, - - calculateCircumference: function(value) { - var count = this.getMeta().count; - if (count > 0 && !isNaN(value)) { - return (2 * Math.PI) / count; - } - return 0; - } - }); -}; diff --git a/system/templates/js/chart-js/src/controllers/controller.radar.js b/system/templates/js/chart-js/src/controllers/controller.radar.js deleted file mode 100644 index fc0c4a285..000000000 --- a/system/templates/js/chart-js/src/controllers/controller.radar.js +++ /dev/null @@ -1,181 +0,0 @@ -'use strict'; - -module.exports = function(Chart) { - - var helpers = Chart.helpers; - - Chart.defaults.radar = { - aspectRatio: 1, - scale: { - type: 'radialLinear' - }, - elements: { - line: { - tension: 0 // no bezier in radar - } - } - }; - - Chart.controllers.radar = Chart.DatasetController.extend({ - - datasetElementType: Chart.elements.Line, - - dataElementType: Chart.elements.Point, - - linkScales: helpers.noop, - - update: function(reset) { - var me = this; - var meta = me.getMeta(); - var line = meta.dataset; - var points = meta.data; - var custom = line.custom || {}; - var dataset = me.getDataset(); - var lineElementOptions = me.chart.options.elements.line; - var scale = me.chart.scale; - - // Compatibility: If the properties are defined with only the old name, use those values - if ((dataset.tension !== undefined) && (dataset.lineTension === undefined)) { - dataset.lineTension = dataset.tension; - } - - helpers.extend(meta.dataset, { - // Utility - _datasetIndex: me.index, - // Data - _children: points, - _loop: true, - // Model - _model: { - // Appearance - tension: custom.tension ? custom.tension : helpers.getValueOrDefault(dataset.lineTension, lineElementOptions.tension), - backgroundColor: custom.backgroundColor ? custom.backgroundColor : (dataset.backgroundColor || lineElementOptions.backgroundColor), - borderWidth: custom.borderWidth ? custom.borderWidth : (dataset.borderWidth || lineElementOptions.borderWidth), - borderColor: custom.borderColor ? custom.borderColor : (dataset.borderColor || lineElementOptions.borderColor), - fill: custom.fill ? custom.fill : (dataset.fill !== undefined ? dataset.fill : lineElementOptions.fill), - borderCapStyle: custom.borderCapStyle ? custom.borderCapStyle : (dataset.borderCapStyle || lineElementOptions.borderCapStyle), - borderDash: custom.borderDash ? custom.borderDash : (dataset.borderDash || lineElementOptions.borderDash), - borderDashOffset: custom.borderDashOffset ? custom.borderDashOffset : (dataset.borderDashOffset || lineElementOptions.borderDashOffset), - borderJoinStyle: custom.borderJoinStyle ? custom.borderJoinStyle : (dataset.borderJoinStyle || lineElementOptions.borderJoinStyle), - - // Scale - scaleTop: scale.top, - scaleBottom: scale.bottom, - scaleZero: scale.getBasePosition() - } - }); - - meta.dataset.pivot(); - - // Update Points - helpers.each(points, function(point, index) { - me.updateElement(point, index, reset); - }, me); - - // Update bezier control points - me.updateBezierControlPoints(); - }, - updateElement: function(point, index, reset) { - var me = this; - var custom = point.custom || {}; - var dataset = me.getDataset(); - var scale = me.chart.scale; - var pointElementOptions = me.chart.options.elements.point; - var pointPosition = scale.getPointPositionForValue(index, dataset.data[index]); - - helpers.extend(point, { - // Utility - _datasetIndex: me.index, - _index: index, - _scale: scale, - - // Desired view properties - _model: { - x: reset ? scale.xCenter : pointPosition.x, // value not used in dataset scale, but we want a consistent API between scales - y: reset ? scale.yCenter : pointPosition.y, - - // Appearance - tension: custom.tension ? custom.tension : helpers.getValueOrDefault(dataset.lineTension, me.chart.options.elements.line.tension), - radius: custom.radius ? custom.radius : helpers.getValueAtIndexOrDefault(dataset.pointRadius, index, pointElementOptions.radius), - backgroundColor: custom.backgroundColor ? custom.backgroundColor : helpers.getValueAtIndexOrDefault(dataset.pointBackgroundColor, index, pointElementOptions.backgroundColor), - borderColor: custom.borderColor ? custom.borderColor : helpers.getValueAtIndexOrDefault(dataset.pointBorderColor, index, pointElementOptions.borderColor), - borderWidth: custom.borderWidth ? custom.borderWidth : helpers.getValueAtIndexOrDefault(dataset.pointBorderWidth, index, pointElementOptions.borderWidth), - pointStyle: custom.pointStyle ? custom.pointStyle : helpers.getValueAtIndexOrDefault(dataset.pointStyle, index, pointElementOptions.pointStyle), - - // Tooltip - hitRadius: custom.hitRadius ? custom.hitRadius : helpers.getValueAtIndexOrDefault(dataset.hitRadius, index, pointElementOptions.hitRadius) - } - }); - - point._model.skip = custom.skip ? custom.skip : (isNaN(point._model.x) || isNaN(point._model.y)); - }, - updateBezierControlPoints: function() { - var chartArea = this.chart.chartArea; - var meta = this.getMeta(); - - helpers.each(meta.data, function(point, index) { - var model = point._model; - var controlPoints = helpers.splineCurve( - helpers.previousItem(meta.data, index, true)._model, - model, - helpers.nextItem(meta.data, index, true)._model, - model.tension - ); - - // Prevent the bezier going outside of the bounds of the graph - model.controlPointPreviousX = Math.max(Math.min(controlPoints.previous.x, chartArea.right), chartArea.left); - model.controlPointPreviousY = Math.max(Math.min(controlPoints.previous.y, chartArea.bottom), chartArea.top); - - model.controlPointNextX = Math.max(Math.min(controlPoints.next.x, chartArea.right), chartArea.left); - model.controlPointNextY = Math.max(Math.min(controlPoints.next.y, chartArea.bottom), chartArea.top); - - // Now pivot the point for animation - point.pivot(); - }); - }, - - draw: function(ease) { - var meta = this.getMeta(); - var easingDecimal = ease || 1; - - // Transition Point Locations - helpers.each(meta.data, function(point) { - point.transition(easingDecimal); - }); - - // Transition and Draw the line - meta.dataset.transition(easingDecimal).draw(); - - // Draw the points - helpers.each(meta.data, function(point) { - point.draw(); - }); - }, - - setHoverStyle: function(point) { - // Point - var dataset = this.chart.data.datasets[point._datasetIndex]; - var custom = point.custom || {}; - var index = point._index; - var model = point._model; - - model.radius = custom.hoverRadius ? custom.hoverRadius : helpers.getValueAtIndexOrDefault(dataset.pointHoverRadius, index, this.chart.options.elements.point.hoverRadius); - model.backgroundColor = custom.hoverBackgroundColor ? custom.hoverBackgroundColor : helpers.getValueAtIndexOrDefault(dataset.pointHoverBackgroundColor, index, helpers.getHoverColor(model.backgroundColor)); - model.borderColor = custom.hoverBorderColor ? custom.hoverBorderColor : helpers.getValueAtIndexOrDefault(dataset.pointHoverBorderColor, index, helpers.getHoverColor(model.borderColor)); - model.borderWidth = custom.hoverBorderWidth ? custom.hoverBorderWidth : helpers.getValueAtIndexOrDefault(dataset.pointHoverBorderWidth, index, model.borderWidth); - }, - - removeHoverStyle: function(point) { - var dataset = this.chart.data.datasets[point._datasetIndex]; - var custom = point.custom || {}; - var index = point._index; - var model = point._model; - var pointElementOptions = this.chart.options.elements.point; - - model.radius = custom.radius ? custom.radius : helpers.getValueAtIndexOrDefault(dataset.radius, index, pointElementOptions.radius); - model.backgroundColor = custom.backgroundColor ? custom.backgroundColor : helpers.getValueAtIndexOrDefault(dataset.pointBackgroundColor, index, pointElementOptions.backgroundColor); - model.borderColor = custom.borderColor ? custom.borderColor : helpers.getValueAtIndexOrDefault(dataset.pointBorderColor, index, pointElementOptions.borderColor); - model.borderWidth = custom.borderWidth ? custom.borderWidth : helpers.getValueAtIndexOrDefault(dataset.pointBorderWidth, index, pointElementOptions.borderWidth); - } - }); -}; diff --git a/system/templates/js/chart-js/src/core/core.animation.js b/system/templates/js/chart-js/src/core/core.animation.js deleted file mode 100644 index dcb9c2ee0..000000000 --- a/system/templates/js/chart-js/src/core/core.animation.js +++ /dev/null @@ -1,139 +0,0 @@ -/* global window: false */ -'use strict'; - -module.exports = function(Chart) { - - var helpers = Chart.helpers; - - Chart.defaults.global.animation = { - duration: 1000, - easing: 'easeOutQuart', - onProgress: helpers.noop, - onComplete: helpers.noop - }; - - Chart.Animation = Chart.Element.extend({ - currentStep: null, // the current animation step - numSteps: 60, // default number of steps - easing: '', // the easing to use for this animation - render: null, // render function used by the animation service - - onAnimationProgress: null, // user specified callback to fire on each step of the animation - onAnimationComplete: null // user specified callback to fire when the animation finishes - }); - - Chart.animationService = { - frameDuration: 17, - animations: [], - dropFrames: 0, - request: null, - - /** - * @function Chart.animationService.addAnimation - * @param chartInstance {ChartController} the chart to animate - * @param animationObject {IAnimation} the animation that we will animate - * @param duration {Number} length of animation in ms - * @param lazy {Boolean} if true, the chart is not marked as animating to enable more responsive interactions - */ - addAnimation: function(chartInstance, animationObject, duration, lazy) { - var me = this; - - if (!lazy) { - chartInstance.animating = true; - } - - for (var index = 0; index < me.animations.length; ++index) { - if (me.animations[index].chartInstance === chartInstance) { - // replacing an in progress animation - me.animations[index].animationObject = animationObject; - return; - } - } - - me.animations.push({ - chartInstance: chartInstance, - animationObject: animationObject - }); - - // If there are no animations queued, manually kickstart a digest, for lack of a better word - if (me.animations.length === 1) { - me.requestAnimationFrame(); - } - }, - // Cancel the animation for a given chart instance - cancelAnimation: function(chartInstance) { - var index = helpers.findIndex(this.animations, function(animationWrapper) { - return animationWrapper.chartInstance === chartInstance; - }); - - if (index !== -1) { - this.animations.splice(index, 1); - chartInstance.animating = false; - } - }, - requestAnimationFrame: function() { - var me = this; - if (me.request === null) { - // Skip animation frame requests until the active one is executed. - // This can happen when processing mouse events, e.g. 'mousemove' - // and 'mouseout' events will trigger multiple renders. - me.request = helpers.requestAnimFrame.call(window, function() { - me.request = null; - me.startDigest(); - }); - } - }, - startDigest: function() { - var me = this; - - var startTime = Date.now(); - var framesToDrop = 0; - - if (me.dropFrames > 1) { - framesToDrop = Math.floor(me.dropFrames); - me.dropFrames = me.dropFrames % 1; - } - - var i = 0; - while (i < me.animations.length) { - if (me.animations[i].animationObject.currentStep === null) { - me.animations[i].animationObject.currentStep = 0; - } - - me.animations[i].animationObject.currentStep += 1 + framesToDrop; - - if (me.animations[i].animationObject.currentStep > me.animations[i].animationObject.numSteps) { - me.animations[i].animationObject.currentStep = me.animations[i].animationObject.numSteps; - } - - me.animations[i].animationObject.render(me.animations[i].chartInstance, me.animations[i].animationObject); - if (me.animations[i].animationObject.onAnimationProgress && me.animations[i].animationObject.onAnimationProgress.call) { - me.animations[i].animationObject.onAnimationProgress.call(me.animations[i].chartInstance, me.animations[i]); - } - - if (me.animations[i].animationObject.currentStep === me.animations[i].animationObject.numSteps) { - if (me.animations[i].animationObject.onAnimationComplete && me.animations[i].animationObject.onAnimationComplete.call) { - me.animations[i].animationObject.onAnimationComplete.call(me.animations[i].chartInstance, me.animations[i]); - } - - // executed the last frame. Remove the animation. - me.animations[i].chartInstance.animating = false; - - me.animations.splice(i, 1); - } else { - ++i; - } - } - - var endTime = Date.now(); - var dropFrames = (endTime - startTime) / me.frameDuration; - - me.dropFrames += dropFrames; - - // Do we have more stuff to animate? - if (me.animations.length > 0) { - me.requestAnimationFrame(); - } - } - }; -}; diff --git a/system/templates/js/chart-js/src/core/core.canvasHelpers.js b/system/templates/js/chart-js/src/core/core.canvasHelpers.js deleted file mode 100644 index 553730c73..000000000 --- a/system/templates/js/chart-js/src/core/core.canvasHelpers.js +++ /dev/null @@ -1,124 +0,0 @@ -'use strict'; - -module.exports = function(Chart) { - // Global Chart canvas helpers object for drawing items to canvas - var helpers = Chart.canvasHelpers = {}; - - helpers.drawPoint = function(ctx, pointStyle, radius, x, y) { - var type, edgeLength, xOffset, yOffset, height, size; - - if (typeof pointStyle === 'object') { - type = pointStyle.toString(); - if (type === '[object HTMLImageElement]' || type === '[object HTMLCanvasElement]') { - ctx.drawImage(pointStyle, x - pointStyle.width / 2, y - pointStyle.height / 2); - return; - } - } - - if (isNaN(radius) || radius <= 0) { - return; - } - - switch (pointStyle) { - // Default includes circle - default: - ctx.beginPath(); - ctx.arc(x, y, radius, 0, Math.PI * 2); - ctx.closePath(); - ctx.fill(); - break; - case 'triangle': - ctx.beginPath(); - edgeLength = 3 * radius / Math.sqrt(3); - height = edgeLength * Math.sqrt(3) / 2; - ctx.moveTo(x - edgeLength / 2, y + height / 3); - ctx.lineTo(x + edgeLength / 2, y + height / 3); - ctx.lineTo(x, y - 2 * height / 3); - ctx.closePath(); - ctx.fill(); - break; - case 'rect': - size = 1 / Math.SQRT2 * radius; - ctx.beginPath(); - ctx.fillRect(x - size, y - size, 2 * size, 2 * size); - ctx.strokeRect(x - size, y - size, 2 * size, 2 * size); - break; - case 'rectRounded': - var offset = radius / Math.SQRT2; - var leftX = x - offset; - var topY = y - offset; - var sideSize = Math.SQRT2 * radius; - Chart.helpers.drawRoundedRectangle(ctx, leftX, topY, sideSize, sideSize, radius / 2); - ctx.fill(); - break; - case 'rectRot': - size = 1 / Math.SQRT2 * radius; - ctx.beginPath(); - ctx.moveTo(x - size, y); - ctx.lineTo(x, y + size); - ctx.lineTo(x + size, y); - ctx.lineTo(x, y - size); - ctx.closePath(); - ctx.fill(); - break; - case 'cross': - ctx.beginPath(); - ctx.moveTo(x, y + radius); - ctx.lineTo(x, y - radius); - ctx.moveTo(x - radius, y); - ctx.lineTo(x + radius, y); - ctx.closePath(); - break; - case 'crossRot': - ctx.beginPath(); - xOffset = Math.cos(Math.PI / 4) * radius; - yOffset = Math.sin(Math.PI / 4) * radius; - ctx.moveTo(x - xOffset, y - yOffset); - ctx.lineTo(x + xOffset, y + yOffset); - ctx.moveTo(x - xOffset, y + yOffset); - ctx.lineTo(x + xOffset, y - yOffset); - ctx.closePath(); - break; - case 'star': - ctx.beginPath(); - ctx.moveTo(x, y + radius); - ctx.lineTo(x, y - radius); - ctx.moveTo(x - radius, y); - ctx.lineTo(x + radius, y); - xOffset = Math.cos(Math.PI / 4) * radius; - yOffset = Math.sin(Math.PI / 4) * radius; - ctx.moveTo(x - xOffset, y - yOffset); - ctx.lineTo(x + xOffset, y + yOffset); - ctx.moveTo(x - xOffset, y + yOffset); - ctx.lineTo(x + xOffset, y - yOffset); - ctx.closePath(); - break; - case 'line': - ctx.beginPath(); - ctx.moveTo(x - radius, y); - ctx.lineTo(x + radius, y); - ctx.closePath(); - break; - case 'dash': - ctx.beginPath(); - ctx.moveTo(x, y); - ctx.lineTo(x + radius, y); - ctx.closePath(); - break; - } - - ctx.stroke(); - }; - - helpers.clipArea = function(ctx, clipArea) { - ctx.save(); - ctx.beginPath(); - ctx.rect(clipArea.left, clipArea.top, clipArea.right - clipArea.left, clipArea.bottom - clipArea.top); - ctx.clip(); - }; - - helpers.unclipArea = function(ctx) { - ctx.restore(); - }; - -}; diff --git a/system/templates/js/chart-js/src/core/core.controller.js b/system/templates/js/chart-js/src/core/core.controller.js deleted file mode 100644 index b38df58b2..000000000 --- a/system/templates/js/chart-js/src/core/core.controller.js +++ /dev/null @@ -1,752 +0,0 @@ -'use strict'; - -module.exports = function(Chart) { - - var helpers = Chart.helpers; - var plugins = Chart.plugins; - var platform = Chart.platform; - - // Create a dictionary of chart types, to allow for extension of existing types - Chart.types = {}; - - // Store a reference to each instance - allowing us to globally resize chart instances on window resize. - // Destroy method on the chart will remove the instance of the chart from this reference. - Chart.instances = {}; - - // Controllers available for dataset visualization eg. bar, line, slice, etc. - Chart.controllers = {}; - - /** - * Initializes the given config with global and chart default values. - */ - function initConfig(config) { - config = config || {}; - - // Do NOT use configMerge() for the data object because this method merges arrays - // and so would change references to labels and datasets, preventing data updates. - var data = config.data = config.data || {}; - data.datasets = data.datasets || []; - data.labels = data.labels || []; - - config.options = helpers.configMerge( - Chart.defaults.global, - Chart.defaults[config.type], - config.options || {}); - - return config; - } - - /** - * Updates the config of the chart - * @param chart {Chart.Controller} chart to update the options for - */ - function updateConfig(chart) { - var newOptions = chart.options; - - // Update Scale(s) with options - if (newOptions.scale) { - chart.scale.options = newOptions.scale; - } else if (newOptions.scales) { - newOptions.scales.xAxes.concat(newOptions.scales.yAxes).forEach(function(scaleOptions) { - chart.scales[scaleOptions.id].options = scaleOptions; - }); - } - - // Tooltip - chart.tooltip._options = newOptions.tooltips; - } - - /** - * @class Chart.Controller - * The main controller of a chart. - */ - Chart.Controller = function(item, config, instance) { - var me = this; - - config = initConfig(config); - - var context = platform.acquireContext(item, config); - var canvas = context && context.canvas; - var height = canvas && canvas.height; - var width = canvas && canvas.width; - - instance.ctx = context; - instance.canvas = canvas; - instance.config = config; - instance.width = width; - instance.height = height; - instance.aspectRatio = height? width / height : null; - - me.id = helpers.uid(); - me.chart = instance; - me.config = config; - me.options = config.options; - me._bufferedRender = false; - - // Add the chart instance to the global namespace - Chart.instances[me.id] = me; - - Object.defineProperty(me, 'data', { - get: function() { - return me.config.data; - } - }); - - if (!context || !canvas) { - // The given item is not a compatible context2d element, let's return before finalizing - // the chart initialization but after setting basic chart / controller properties that - // can help to figure out that the chart is not valid (e.g chart.canvas !== null); - // https://github.com/chartjs/Chart.js/issues/2807 - console.error("Failed to create chart: can't acquire context from the given item"); - return me; - } - - me.initialize(); - me.update(); - - return me; - }; - - helpers.extend(Chart.Controller.prototype, /** @lends Chart.Controller.prototype */ { - initialize: function() { - var me = this; - - // Before init plugin notification - plugins.notify(me, 'beforeInit'); - - helpers.retinaScale(me.chart); - - me.bindEvents(); - - if (me.options.responsive) { - // Initial resize before chart draws (must be silent to preserve initial animations). - me.resize(true); - } - - // Make sure scales have IDs and are built before we build any controllers. - me.ensureScalesHaveIDs(); - me.buildScales(); - me.initToolTip(); - - // After init plugin notification - plugins.notify(me, 'afterInit'); - - return me; - }, - - clear: function() { - helpers.clear(this.chart); - return this; - }, - - stop: function() { - // Stops any current animation loop occurring - Chart.animationService.cancelAnimation(this); - return this; - }, - - resize: function(silent) { - var me = this; - var chart = me.chart; - var options = me.options; - var canvas = chart.canvas; - var aspectRatio = (options.maintainAspectRatio && chart.aspectRatio) || null; - - // the canvas render width and height will be casted to integers so make sure that - // the canvas display style uses the same integer values to avoid blurring effect. - var newWidth = Math.floor(helpers.getMaximumWidth(canvas)); - var newHeight = Math.floor(aspectRatio? newWidth / aspectRatio : helpers.getMaximumHeight(canvas)); - - if (chart.width === newWidth && chart.height === newHeight) { - return; - } - - canvas.width = chart.width = newWidth; - canvas.height = chart.height = newHeight; - canvas.style.width = newWidth + 'px'; - canvas.style.height = newHeight + 'px'; - - helpers.retinaScale(chart); - - if (!silent) { - // Notify any plugins about the resize - var newSize = {width: newWidth, height: newHeight}; - plugins.notify(me, 'resize', [newSize]); - - // Notify of resize - if (me.options.onResize) { - me.options.onResize(me, newSize); - } - - me.stop(); - me.update(me.options.responsiveAnimationDuration); - } - }, - - ensureScalesHaveIDs: function() { - var options = this.options; - var scalesOptions = options.scales || {}; - var scaleOptions = options.scale; - - helpers.each(scalesOptions.xAxes, function(xAxisOptions, index) { - xAxisOptions.id = xAxisOptions.id || ('x-axis-' + index); - }); - - helpers.each(scalesOptions.yAxes, function(yAxisOptions, index) { - yAxisOptions.id = yAxisOptions.id || ('y-axis-' + index); - }); - - if (scaleOptions) { - scaleOptions.id = scaleOptions.id || 'scale'; - } - }, - - /** - * Builds a map of scale ID to scale object for future lookup. - */ - buildScales: function() { - var me = this; - var options = me.options; - var scales = me.scales = {}; - var items = []; - - if (options.scales) { - items = items.concat( - (options.scales.xAxes || []).map(function(xAxisOptions) { - return {options: xAxisOptions, dtype: 'category'}; - }), - (options.scales.yAxes || []).map(function(yAxisOptions) { - return {options: yAxisOptions, dtype: 'linear'}; - }) - ); - } - - if (options.scale) { - items.push({options: options.scale, dtype: 'radialLinear', isDefault: true}); - } - - helpers.each(items, function(item) { - var scaleOptions = item.options; - var scaleType = helpers.getValueOrDefault(scaleOptions.type, item.dtype); - var scaleClass = Chart.scaleService.getScaleConstructor(scaleType); - if (!scaleClass) { - return; - } - - var scale = new scaleClass({ - id: scaleOptions.id, - options: scaleOptions, - ctx: me.chart.ctx, - chart: me - }); - - scales[scale.id] = scale; - - // TODO(SB): I think we should be able to remove this custom case (options.scale) - // and consider it as a regular scale part of the "scales"" map only! This would - // make the logic easier and remove some useless? custom code. - if (item.isDefault) { - me.scale = scale; - } - }); - - Chart.scaleService.addScalesToLayout(this); - }, - - buildOrUpdateControllers: function() { - var me = this; - var types = []; - var newControllers = []; - - helpers.each(me.data.datasets, function(dataset, datasetIndex) { - var meta = me.getDatasetMeta(datasetIndex); - if (!meta.type) { - meta.type = dataset.type || me.config.type; - } - - types.push(meta.type); - - if (meta.controller) { - meta.controller.updateIndex(datasetIndex); - } else { - meta.controller = new Chart.controllers[meta.type](me, datasetIndex); - newControllers.push(meta.controller); - } - }, me); - - if (types.length > 1) { - for (var i = 1; i < types.length; i++) { - if (types[i] !== types[i - 1]) { - me.isCombo = true; - break; - } - } - } - - return newControllers; - }, - - /** - * Reset the elements of all datasets - * @private - */ - resetElements: function() { - var me = this; - helpers.each(me.data.datasets, function(dataset, datasetIndex) { - me.getDatasetMeta(datasetIndex).controller.reset(); - }, me); - }, - - /** - * Resets the chart back to it's state before the initial animation - */ - reset: function() { - this.resetElements(); - this.tooltip.initialize(); - }, - - update: function(animationDuration, lazy) { - var me = this; - - updateConfig(me); - - if (plugins.notify(me, 'beforeUpdate') === false) { - return; - } - - // In case the entire data object changed - me.tooltip._data = me.data; - - // Make sure dataset controllers are updated and new controllers are reset - var newControllers = me.buildOrUpdateControllers(); - - // Make sure all dataset controllers have correct meta data counts - helpers.each(me.data.datasets, function(dataset, datasetIndex) { - me.getDatasetMeta(datasetIndex).controller.buildOrUpdateElements(); - }, me); - - me.updateLayout(); - - // Can only reset the new controllers after the scales have been updated - helpers.each(newControllers, function(controller) { - controller.reset(); - }); - - me.updateDatasets(); - - // Do this before render so that any plugins that need final scale updates can use it - plugins.notify(me, 'afterUpdate'); - - if (me._bufferedRender) { - me._bufferedRequest = { - lazy: lazy, - duration: animationDuration - }; - } else { - me.render(animationDuration, lazy); - } - }, - - /** - * Updates the chart layout unless a plugin returns `false` to the `beforeLayout` - * hook, in which case, plugins will not be called on `afterLayout`. - * @private - */ - updateLayout: function() { - var me = this; - - if (plugins.notify(me, 'beforeLayout') === false) { - return; - } - - Chart.layoutService.update(this, this.chart.width, this.chart.height); - - /** - * Provided for backward compatibility, use `afterLayout` instead. - * @method IPlugin#afterScaleUpdate - * @deprecated since version 2.5.0 - * @todo remove at version 3 - */ - plugins.notify(me, 'afterScaleUpdate'); - plugins.notify(me, 'afterLayout'); - }, - - /** - * Updates all datasets unless a plugin returns `false` to the `beforeDatasetsUpdate` - * hook, in which case, plugins will not be called on `afterDatasetsUpdate`. - * @private - */ - updateDatasets: function() { - var me = this; - - if (plugins.notify(me, 'beforeDatasetsUpdate') === false) { - return; - } - - for (var i = 0, ilen = me.data.datasets.length; i < ilen; ++i) { - me.getDatasetMeta(i).controller.update(); - } - - plugins.notify(me, 'afterDatasetsUpdate'); - }, - - render: function(duration, lazy) { - var me = this; - - if (plugins.notify(me, 'beforeRender') === false) { - return; - } - - var animationOptions = me.options.animation; - var onComplete = function() { - plugins.notify(me, 'afterRender'); - var callback = animationOptions && animationOptions.onComplete; - if (callback && callback.call) { - callback.call(me); - } - }; - - if (animationOptions && ((typeof duration !== 'undefined' && duration !== 0) || (typeof duration === 'undefined' && animationOptions.duration !== 0))) { - var animation = new Chart.Animation(); - animation.numSteps = (duration || animationOptions.duration) / 16.66; // 60 fps - animation.easing = animationOptions.easing; - - // render function - animation.render = function(chartInstance, animationObject) { - var easingFunction = helpers.easingEffects[animationObject.easing]; - var stepDecimal = animationObject.currentStep / animationObject.numSteps; - var easeDecimal = easingFunction(stepDecimal); - - chartInstance.draw(easeDecimal, stepDecimal, animationObject.currentStep); - }; - - // user events - animation.onAnimationProgress = animationOptions.onProgress; - animation.onAnimationComplete = onComplete; - - Chart.animationService.addAnimation(me, animation, duration, lazy); - } else { - me.draw(); - onComplete(); - } - - return me; - }, - - draw: function(easingValue) { - var me = this; - - me.clear(); - - if (easingValue === undefined || easingValue === null) { - easingValue = 1; - } - - if (plugins.notify(me, 'beforeDraw', [easingValue]) === false) { - return; - } - - // Draw all the scales - helpers.each(me.boxes, function(box) { - box.draw(me.chartArea); - }, me); - - if (me.scale) { - me.scale.draw(); - } - - me.drawDatasets(easingValue); - - // Finally draw the tooltip - me.tooltip.transition(easingValue).draw(); - - plugins.notify(me, 'afterDraw', [easingValue]); - }, - - /** - * Draws all datasets unless a plugin returns `false` to the `beforeDatasetsDraw` - * hook, in which case, plugins will not be called on `afterDatasetsDraw`. - * @private - */ - drawDatasets: function(easingValue) { - var me = this; - - if (plugins.notify(me, 'beforeDatasetsDraw', [easingValue]) === false) { - return; - } - - // Draw each dataset via its respective controller (reversed to support proper line stacking) - helpers.each(me.data.datasets, function(dataset, datasetIndex) { - if (me.isDatasetVisible(datasetIndex)) { - me.getDatasetMeta(datasetIndex).controller.draw(easingValue); - } - }, me, true); - - plugins.notify(me, 'afterDatasetsDraw', [easingValue]); - }, - - // Get the single element that was clicked on - // @return : An object containing the dataset index and element index of the matching element. Also contains the rectangle that was draw - getElementAtEvent: function(e) { - return Chart.Interaction.modes.single(this, e); - }, - - getElementsAtEvent: function(e) { - return Chart.Interaction.modes.label(this, e, {intersect: true}); - }, - - getElementsAtXAxis: function(e) { - return Chart.Interaction.modes['x-axis'](this, e, {intersect: true}); - }, - - getElementsAtEventForMode: function(e, mode, options) { - var method = Chart.Interaction.modes[mode]; - if (typeof method === 'function') { - return method(this, e, options); - } - - return []; - }, - - getDatasetAtEvent: function(e) { - return Chart.Interaction.modes.dataset(this, e, {intersect: true}); - }, - - getDatasetMeta: function(datasetIndex) { - var me = this; - var dataset = me.data.datasets[datasetIndex]; - if (!dataset._meta) { - dataset._meta = {}; - } - - var meta = dataset._meta[me.id]; - if (!meta) { - meta = dataset._meta[me.id] = { - type: null, - data: [], - dataset: null, - controller: null, - hidden: null, // See isDatasetVisible() comment - xAxisID: null, - yAxisID: null - }; - } - - return meta; - }, - - getVisibleDatasetCount: function() { - var count = 0; - for (var i = 0, ilen = this.data.datasets.length; i

    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 diff --git a/system/templates/js/chart-js/site/assets/simple.png b/system/templates/js/chart-js/site/assets/simple.png deleted file mode 100755 index 43c945d538aa8cefe7e5710235eea25a6c9fa858..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 48416 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 - - - Chart.js | HTML5 Charts for your website. - - - - - - - - - - - - -