From f9c555e5c1ac3bfc49559386f3a7c9d12703a762 Mon Sep 17 00:00:00 2001 From: Filip Brzozowski Date: Tue, 28 Mar 2017 20:00:23 +0100 Subject: Issue #11450 - Email clarification for new version (#11542) * Issue #11450 Add clarification in emails about new version for super users * Revert "Issue #11450" This reverts commit ed5d25a20677f7e33a2eaff1e621334cbee65c19. * #11450 correstions based on feedback * #11450 test fix --- plugins/CoreUpdater/Test/Integration/UpdateCommunicationTest.php | 4 ++++ plugins/CoreUpdater/UpdateCommunication.php | 2 ++ plugins/CoreUpdater/lang/en.json | 3 ++- 3 files changed, 8 insertions(+), 1 deletion(-) diff --git a/plugins/CoreUpdater/Test/Integration/UpdateCommunicationTest.php b/plugins/CoreUpdater/Test/Integration/UpdateCommunicationTest.php index 5b4a03cb37..8533e5675c 100644 --- a/plugins/CoreUpdater/Test/Integration/UpdateCommunicationTest.php +++ b/plugins/CoreUpdater/Test/Integration/UpdateCommunicationTest.php @@ -79,6 +79,8 @@ CoreUpdater_YouCanUpgradeAutomaticallyOrDownloadPackage CoreUpdater_ViewVersionChangelog http://piwik.org/changelog/piwik-33-0-0/ +CoreUpdater_ReceiveEmailBecauseIsSuperUser + CoreUpdater_FeedbackRequest http://piwik.org/contact/"; @@ -95,6 +97,8 @@ CoreUpdater_ThereIsNewVersionAvailableForUpdate CoreUpdater_YouCanUpgradeAutomaticallyOrDownloadPackage {$rootUrl}index.php?module=CoreUpdater&action=newVersionAvailable +CoreUpdater_ReceiveEmailBecauseIsSuperUser + CoreUpdater_FeedbackRequest http://piwik.org/contact/"; diff --git a/plugins/CoreUpdater/UpdateCommunication.php b/plugins/CoreUpdater/UpdateCommunication.php index d39f44c111..971bd16fa0 100644 --- a/plugins/CoreUpdater/UpdateCommunication.php +++ b/plugins/CoreUpdater/UpdateCommunication.php @@ -79,6 +79,8 @@ class UpdateCommunication $message .= "\n\n"; } + $message .= Piwik::translate('CoreUpdater_ReceiveEmailBecauseIsSuperUser', $host); + $message .= "\n\n"; $message .= Piwik::translate('CoreUpdater_FeedbackRequest'); $message .= "\n"; $message .= 'http://piwik.org/contact/'; diff --git a/plugins/CoreUpdater/lang/en.json b/plugins/CoreUpdater/lang/en.json index cd517e0d31..16d2d91aed 100644 --- a/plugins/CoreUpdater/lang/en.json +++ b/plugins/CoreUpdater/lang/en.json @@ -77,6 +77,7 @@ "YouCanUpgradeAutomaticallyOrDownloadPackage": "You can update to version %s automatically or download the package and install it manually:", "YouMustDownloadPackageOrFixPermissions": "Piwik is unable to overwrite your current installation. You can either fix the directory\/file permissions, or download the package and install version %s manually:", "YourDatabaseIsOutOfDate": "Your Piwik database is out-of-date, and must be upgraded before you can continue.", - "ViewVersionChangelog": "View the changelog for this version:" + "ViewVersionChangelog": "View the changelog for this version:", + "ReceiveEmailBecauseIsSuperUser": "You receive this email because you are a Super User on the Piwik at: %s" } } \ No newline at end of file -- cgit v1.2.3 From 5d46f802f0485c504c3923aa625032ca998048cf Mon Sep 17 00:00:00 2001 From: Stefan Giehl Date: Wed, 29 Mar 2017 10:09:18 +0200 Subject: Make it possible to disable flattening for an report (#11529) * use report property to enable/disable flattener * update tests * Update changelog [ci skip] * minor renamings --- CHANGELOG.md | 1 + core/API/DataTablePostProcessor.php | 6 +++ core/DataTable/Filter/RemoveSubtables.php | 47 ++++++++++++++++ core/Plugin/Report.php | 17 ++++++ core/ViewDataTable/Config.php | 10 ++++ plugins/Referrers/Reports/GetReferrerType.php | 1 + plugins/UserId/Reports/GetUsers.php | 12 ++--- ...ng_flattened__Referrers.getReferrerType_day.xml | 62 ++++------------------ .../UIIntegrationTest_metric_tooltip.png | 4 +- 9 files changed, 100 insertions(+), 60 deletions(-) create mode 100644 core/DataTable/Filter/RemoveSubtables.php diff --git a/CHANGELOG.md b/CHANGELOG.md index 7a0c7a7ba4..4e71995db5 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -8,6 +8,7 @@ The Product Changelog at **[piwik.org/changelog](http://piwik.org/changelog)** l ### Breaking Changes * New config setting `enable_plugin_upload` lets you enable uploading and installing a Piwik plugin ZIP file by a Super User. This used to be enabled by default, but it is now disabled by default now for security reasons. +* New Report class property `Report::$supportsFlatten` lets you define if a report supports flattening (defaults to `true`). If set to `false` it will also set `ViewDataTable\Config::$show_flatten_table` to `false` ### New APIs * A new event `Controller.triggerAdminNotifications` has been added to let plugins know when they are supposed to trigger notifications in the admin. diff --git a/core/API/DataTablePostProcessor.php b/core/API/DataTablePostProcessor.php index c2fdd1569c..c4eb7441d0 100644 --- a/core/API/DataTablePostProcessor.php +++ b/core/API/DataTablePostProcessor.php @@ -170,6 +170,12 @@ class DataTablePostProcessor public function applyFlattener($dataTable) { if (Common::getRequestVar('flat', '0', 'string', $this->request) == '1') { + // skip flattening if not supported by report and remove subtables only + if ($this->report && !$this->report->supportsFlatten()) { + $dataTable->filter('RemoveSubtables'); + return $dataTable; + } + $flattener = new Flattener($this->apiModule, $this->apiMethod, $this->request); if (Common::getRequestVar('include_aggregate_rows', '0', 'string', $this->request) == '1') { $flattener->includeAggregateRows(); diff --git a/core/DataTable/Filter/RemoveSubtables.php b/core/DataTable/Filter/RemoveSubtables.php new file mode 100644 index 0000000000..e84244119c --- /dev/null +++ b/core/DataTable/Filter/RemoveSubtables.php @@ -0,0 +1,47 @@ +filter('RemoveSubtables'); + * + * @api + */ +class RemoveSubtables extends BaseFilter +{ + /** + * Constructor. + * + * @param DataTable $table The DataTable that will be filtered eventually. + */ + public function __construct($table) + { + parent::__construct($table); + } + + /** + * See {@link Limit}. + * + * @param DataTable $table + */ + public function filter($table) + { + $rows = $table->getRows(); + foreach ($rows as $row) { + $row->removeSubtable(); + } + } +} diff --git a/core/Plugin/Report.php b/core/Plugin/Report.php index 7bdbf0710e..df28f450c9 100644 --- a/core/Plugin/Report.php +++ b/core/Plugin/Report.php @@ -119,6 +119,14 @@ class Report */ protected $hasGoalMetrics = false; + /** + * Set this property to false in case your report can't/shouldn't be flattened. + * In this case, flattener won't be applied even if parameter is provided in a request + * @var bool + * @api + */ + protected $supportsFlatten = true; + /** * Set it to boolean `true` if your report always returns a constant count of rows, for instance always 24 rows * for 1-24 hours. @@ -493,6 +501,15 @@ class Report return $this->hasGoalMetrics; } + /** + * @return bool + * @ignore + */ + public function supportsFlatten() + { + return $this->supportsFlatten; + } + /** * If the report is enabled the report metadata for this report will be built and added to the list of available * reports. Overwrite this method and leave it empty in case you do not want your report to be added to the report diff --git a/core/ViewDataTable/Config.php b/core/ViewDataTable/Config.php index 2ccd975c7b..0eb99aa9f5 100644 --- a/core/ViewDataTable/Config.php +++ b/core/ViewDataTable/Config.php @@ -502,6 +502,7 @@ class Config $this->loadDocumentation(); $this->setShouldShowPivotBySubtable(); + $this->setShouldShowFlattener(); } /** Load documentation from the API */ @@ -755,6 +756,15 @@ class Config } } + private function setShouldShowFlattener() + { + $report = ReportsProvider::factory($this->controllerName, $this->controllerAction); + + if ($report && !$report->supportsFlatten()) { + $this->show_flatten_table = false; + } + } + public function disablePivotBySubtableIfTableHasNoSubtables(DataTable $table) { foreach ($table->getRows() as $row) { diff --git a/plugins/Referrers/Reports/GetReferrerType.php b/plugins/Referrers/Reports/GetReferrerType.php index 16a11d295b..dea44ccb5a 100644 --- a/plugins/Referrers/Reports/GetReferrerType.php +++ b/plugins/Referrers/Reports/GetReferrerType.php @@ -37,6 +37,7 @@ class GetReferrerType extends Base $this->hasGoalMetrics = true; $this->order = 1; $this->subcategoryId = 'Referrers_WidgetGetAll'; + $this->supportsFlatten = false; } public function getDefaultTypeViewDataTable() diff --git a/plugins/UserId/Reports/GetUsers.php b/plugins/UserId/Reports/GetUsers.php index 776c29e02f..7fba70f472 100644 --- a/plugins/UserId/Reports/GetUsers.php +++ b/plugins/UserId/Reports/GetUsers.php @@ -25,11 +25,12 @@ class GetUsers extends Base { parent::init(); - $this->name = Piwik::translate('UserId_UserReportTitle'); - $this->subcategoryId = 'UserId_UserReportTitle'; - $this->documentation = ''; - $this->dimension = new UserId(); - $this->metrics = array('label', 'nb_visits', 'nb_actions', 'nb_visits_converted'); + $this->name = Piwik::translate('UserId_UserReportTitle'); + $this->subcategoryId = 'UserId_UserReportTitle'; + $this->documentation = ''; + $this->dimension = new UserId(); + $this->metrics = array('label', 'nb_visits', 'nb_actions', 'nb_visits_converted'); + $this->supportsFlatten = false; // This defines in which order your report appears in the mobile app, in the menu and in the list of widgets $this->order = 9; @@ -60,7 +61,6 @@ class GetUsers extends Base $view->config->show_related_reports = false; $view->config->show_insights = false; $view->config->show_pivot_by_subtable = false; - $view->config->show_flatten_table = false; if ($view->isViewDataTableId(HtmlTable::ID)) { $view->config->disable_row_evolution = false; diff --git a/tests/PHPUnit/System/expected/test_reportLimiting_flattened__Referrers.getReferrerType_day.xml b/tests/PHPUnit/System/expected/test_reportLimiting_flattened__Referrers.getReferrerType_day.xml index 2f781c0adb..e8636937d0 100644 --- a/tests/PHPUnit/System/expected/test_reportLimiting_flattened__Referrers.getReferrerType_day.xml +++ b/tests/PHPUnit/System/expected/test_reportLimiting_flattened__Referrers.getReferrerType_day.xml @@ -14,68 +14,26 @@ - 7 - 7 - 7 - 0 - 1 - 0 - 7 - 0 - - - - 3 - 4 - 4 - 0 - 1 - 0 - 4 - 0 - - - - 3 - 3 - 3 + 12 + 12 + 12 0 1 0 - 3 - 0 - - - - 2 - 2 - 2 - 0 - 1 - 0 - 2 + 12 0 + referrerType==search - 2 - 2 - 2 - 0 - 1 - 0 - 2 - 0 - - - - 2 - 2 - 2 + 7 + 8 + 8 0 1 0 - 2 + 8 0 + referrerType==website \ No newline at end of file diff --git a/tests/UI/expected-screenshots/UIIntegrationTest_metric_tooltip.png b/tests/UI/expected-screenshots/UIIntegrationTest_metric_tooltip.png index ace02fe4d0..0bf02f7209 100644 --- a/tests/UI/expected-screenshots/UIIntegrationTest_metric_tooltip.png +++ b/tests/UI/expected-screenshots/UIIntegrationTest_metric_tooltip.png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:c133c0a47fe8139277d12e0fd82a5145d84a22d6bfeeff18b4cde7a0e8316b04 -size 168821 +oid sha256:d8ff715f995e7e109653c1c2a774d1ffd0219c5db50c8ac797fac07383c756d6 +size 168384 -- cgit v1.2.3 From d578a737916f64e777c37ce8a427591c5c9e2414 Mon Sep 17 00:00:00 2001 From: Stefan Giehl Date: Wed, 29 Mar 2017 19:47:37 +0200 Subject: Replace archives if they already exists instead of ignoring them (#11476) * replace archives if they already exists instead of ignoring them * adds a simple test to prove archives are replaced now * improve test --- core/DataAccess/Model.php | 3 +- tests/PHPUnit/Integration/ArchiveTest.php | 64 +++++++++++++++++++++++++++++++ 2 files changed, 66 insertions(+), 1 deletion(-) diff --git a/core/DataAccess/Model.php b/core/DataAccess/Model.php index ba04962ff4..d5da1e33ed 100644 --- a/core/DataAccess/Model.php +++ b/core/DataAccess/Model.php @@ -304,11 +304,12 @@ class Model { // duplicate idarchives are Ignored, see https://github.com/piwik/piwik/issues/987 $query = "INSERT IGNORE INTO " . $tableName . " (" . implode(", ", $fields) . ") - VALUES (?,?,?,?,?,?,?,?)"; + VALUES (?,?,?,?,?,?,?,?) ON DUPLICATE KEY UPDATE " . end($fields) . " = ?"; $bindSql = $record; $bindSql[] = $name; $bindSql[] = $value; + $bindSql[] = $value; Db::query($query, $bindSql); diff --git a/tests/PHPUnit/Integration/ArchiveTest.php b/tests/PHPUnit/Integration/ArchiveTest.php index 906cfe40c9..df8ef4021c 100644 --- a/tests/PHPUnit/Integration/ArchiveTest.php +++ b/tests/PHPUnit/Integration/ArchiveTest.php @@ -7,16 +7,21 @@ */ namespace Piwik\Tests\Integration; +use Piwik\API\Proxy; use Piwik\Archive as PiwikArchive; +use Piwik\ArchiveProcessor; use Piwik\ArchiveProcessor\Parameters; use Piwik\ArchiveProcessor\Rules; use Piwik\Common; use Piwik\Config; +use Piwik\DataAccess\ArchiveSelector; use Piwik\DataAccess\ArchiveTableCreator; use Piwik\DataAccess\ArchiveWriter; +use Piwik\DataAccess\LogAggregator; use Piwik\Date; use Piwik\Db; use Piwik\Piwik; +use Piwik\Plugins\UserLanguage; use Piwik\Segment; use Piwik\Site; use Piwik\Tests\Fixtures\OneVisitorTwoVisits; @@ -229,6 +234,65 @@ class ArchiveTest extends IntegrationTestCase ); } + public function testExistingArchivesAreReplaced() + { + $date = self::$fixture->dateTime; + $period = PeriodFactory::makePeriodFromQueryParams('UTC', 'day', $date); + + // request an report to trigger archiving + $userLanguageReport = Proxy::getInstance()->call('\\Piwik\\Plugins\\UserLanguage\\API', 'getLanguage', array( + 'idSite' => 1, + 'period' => 'day', + 'date' => $date + )); + + $this->assertEquals(1, $userLanguageReport->getRowsCount()); + $this->assertEquals('UserLanguage_LanguageCode fr', $userLanguageReport->getFirstRow()->getColumn('label')); + $this->assertEquals('UserLanguage_LanguageCode fr', $userLanguageReport->getLastRow()->getColumn('label')); + + $parameters = new Parameters(new Site(1), $period, new Segment('', '')); + $parameters->setRequestedPlugin('UserLanguage'); + + $result = ArchiveSelector::getArchiveIdAndVisits($parameters, $period->getDateStart()->getDateStartUTC()); + $idArchive = $result ? array_shift($result) : null; + + if (empty($idArchive)) { + $this->fail('Archive should be available'); + } + + // track a new visits now + $fixture = self::$fixture; + $t = $fixture::getTracker(1, $date, $defaultInit = true); + $t->setForceVisitDateTime(Date::factory($date)->addHour(1)->getDatetime()); + $t->setUrl('http://example.org/index.htm'); + $t->setBrowserLanguage('pt-br'); + $fixture::checkResponse($t->doTrackPageView('my site')); + + $archiveWriter = new ArchiveWriter($parameters, !!$idArchive); + $archiveWriter->idArchive = $idArchive; + + $archiveProcessor = new ArchiveProcessor($parameters, $archiveWriter, + new LogAggregator($parameters)); + + $archiveProcessor->setNumberOfVisits(1, 1); + + // directly trigger specific archiver for existing archive + $archiver = new UserLanguage\Archiver($archiveProcessor); + $archiver->aggregateDayReport(); + + // report should be updated + $userLanguageReport = Proxy::getInstance()->call('\\Piwik\\Plugins\\UserLanguage\\API', 'getLanguage', array( + 'idSite' => 1, + 'period' => 'day', + 'date' => $date + )); + + $this->assertEquals(2, $userLanguageReport->getRowsCount()); + $this->assertEquals('UserLanguage_LanguageCode fr', $userLanguageReport->getFirstRow()->getColumn('label')); + $this->assertEquals('UserLanguage_LanguageCode pt', $userLanguageReport->getLastRow()->getColumn('label')); + } + + private function createManyDifferentArchiveBlobs() { $recordName1 = 'Actions_Actions'; -- cgit v1.2.3 From 9c86cd6f9cbcb8c0bbb2825f725658f2b6b1fc3f Mon Sep 17 00:00:00 2001 From: Stefan Giehl Date: Wed, 29 Mar 2017 20:45:17 +0200 Subject: fix scaling of exported images (#11557) --- plugins/CoreVisualizations/javascripts/jqplot.js | 11 ++++++----- 1 file changed, 6 insertions(+), 5 deletions(-) diff --git a/plugins/CoreVisualizations/javascripts/jqplot.js b/plugins/CoreVisualizations/javascripts/jqplot.js index 13c91a568c..984f8b4484 100644 --- a/plugins/CoreVisualizations/javascripts/jqplot.js +++ b/plugins/CoreVisualizations/javascripts/jqplot.js @@ -407,9 +407,10 @@ /** Export the chart as an image */ exportAsImage: function (container, lang) { + var pixelRatio = window.devicePixelRatio || 1; var exportCanvas = document.createElement('canvas'); - exportCanvas.width = container.width(); - exportCanvas.height = container.height(); + exportCanvas.width = Math.round(container.width() * pixelRatio); + exportCanvas.height = Math.round(container.height() * pixelRatio); if (!exportCanvas.getContext) { alert("Sorry, not supported in your browser. Please upgrade your browser :)"); @@ -428,7 +429,7 @@ position.left += addPosition.left; position.top += addPosition.top + parseInt(parent.css('marginTop'), 10); } - exportCtx.drawImage(canvas[0], Math.round(position.left), Math.round(position.top)); + exportCtx.drawImage(canvas[0], Math.round(position.left * pixelRatio), Math.round(position.top * pixelRatio)); } var exported = exportCanvas.toDataURL("image/png"); @@ -437,8 +438,8 @@ img.src = exported; img = $(img).css({ - width: exportCanvas.width + 'px', - height: exportCanvas.height + 'px' + width: Math.round(exportCanvas.width / pixelRatio) + 'px', + height: Math.round(exportCanvas.height / pixelRatio) + 'px' }); var popover = $(document.createElement('div')); -- cgit v1.2.3 From a21b868d63b1a210016c9a43a3a470b5e88f6c64 Mon Sep 17 00:00:00 2001 From: Lukas Winkler Date: Wed, 29 Mar 2017 22:19:15 +0200 Subject: New flag icons (#11553) * updated flag icons * remove lines completly * Visitors in Real-time * added ti flag * fix merge * readd logoHeight * remove flags from plugins/UserCountry/images/ * change flag directory * (hopefully) fix all tests * UserCountry system tests * Fix tests refs https://github.com/piwik/piwik/pull/11553 * Fixed CustomDimensions tests * remove unused flags * remove flag of united nations * System tests with new path * light border around flags in goals and live view * Fix BC system test * border around flag in visitor profile * Border around country flags in reports * border around flag icons in HTML reports * simpler css * System tests * UI tests show new flags + borders around them --- LEGALNOTICE | 26 +- ...est_Contents__Live.getLastVisitsDetails_day.xml | 4 +- ...t_Contents__Live.getLastVisitsDetails_month.xml | 4 +- ...ractionMatch__Live.getLastVisitsDetails_day.xml | 4 +- ...tTargetMatch__Live.getLastVisitsDetails_day.xml | 4 +- ...OrPieceMatch__Live.getLastVisitsDetails_day.xml | 4 +- .../CoreHome/DataTableRowAction/RowEvolution.php | 2 +- .../CoreHome/stylesheets/dataTable/_dataTable.less | 1 - .../templates/ReportRenderer/_htmlReportBody.twig | 4 +- plugins/CustomDimensions | 2 +- ...esSystemTest__Live.getLastVisitsDetails_day.xml | 2 +- plugins/Goals/stylesheets/goals.css | 5 + plugins/Live/stylesheets/live.less | 5 + plugins/Live/stylesheets/visitor_profile.less | 4 + .../Live/templates/_dataTableViz_visitorLog.twig | 4 +- plugins/Live/templates/getLastVisitsStart.twig | 2 +- plugins/Live/templates/getVisitorProfilePopup.twig | 4 +- .../expected/test___Live.getVisitorProfile.xml | 24 +- .../test_higherLimit__Live.getVisitorProfile.xml | 44 +-- plugins/Morpheus/icons | 2 +- plugins/Morpheus/stylesheets/ui/_popups.less | 1 - plugins/UserCountry/API.php | 3 +- plugins/UserCountry/functions.php | 2 +- plugins/UserCountry/images/flags/a1.png | Bin 290 -> 0 bytes plugins/UserCountry/images/flags/a2.png | Bin 290 -> 0 bytes plugins/UserCountry/images/flags/ac.png | Bin 545 -> 0 bytes plugins/UserCountry/images/flags/ad.png | Bin 454 -> 0 bytes plugins/UserCountry/images/flags/ae.png | Bin 277 -> 0 bytes plugins/UserCountry/images/flags/af.png | Bin 420 -> 0 bytes plugins/UserCountry/images/flags/ag.png | Bin 456 -> 0 bytes plugins/UserCountry/images/flags/ai.png | Bin 516 -> 0 bytes plugins/UserCountry/images/flags/al.png | Bin 434 -> 0 bytes plugins/UserCountry/images/flags/am.png | Bin 332 -> 0 bytes plugins/UserCountry/images/flags/an.png | Bin 365 -> 0 bytes plugins/UserCountry/images/flags/ao.png | Bin 395 -> 0 bytes plugins/UserCountry/images/flags/ap.png | Bin 290 -> 0 bytes plugins/UserCountry/images/flags/aq.png | Bin 376 -> 0 bytes plugins/UserCountry/images/flags/ar.png | Bin 367 -> 0 bytes plugins/UserCountry/images/flags/as.png | Bin 540 -> 0 bytes plugins/UserCountry/images/flags/at.png | Bin 290 -> 0 bytes plugins/UserCountry/images/flags/au.png | Bin 580 -> 0 bytes plugins/UserCountry/images/flags/aw.png | Bin 393 -> 0 bytes plugins/UserCountry/images/flags/ax.png | Bin 480 -> 0 bytes plugins/UserCountry/images/flags/az.png | Bin 423 -> 0 bytes plugins/UserCountry/images/flags/ba.png | Bin 471 -> 0 bytes plugins/UserCountry/images/flags/bb.png | Bin 403 -> 0 bytes plugins/UserCountry/images/flags/bd.png | Bin 372 -> 0 bytes plugins/UserCountry/images/flags/be.png | Bin 294 -> 0 bytes plugins/UserCountry/images/flags/bf.png | Bin 341 -> 0 bytes plugins/UserCountry/images/flags/bg.png | Bin 320 -> 0 bytes plugins/UserCountry/images/flags/bh.png | Bin 345 -> 0 bytes plugins/UserCountry/images/flags/bi.png | Bin 566 -> 0 bytes plugins/UserCountry/images/flags/bj.png | Bin 311 -> 0 bytes plugins/UserCountry/images/flags/bl.png | Bin 369 -> 0 bytes plugins/UserCountry/images/flags/bm.png | Bin 499 -> 0 bytes plugins/UserCountry/images/flags/bn.png | Bin 502 -> 0 bytes plugins/UserCountry/images/flags/bo.png | Bin 341 -> 0 bytes plugins/UserCountry/images/flags/bq.png | Bin 310 -> 0 bytes plugins/UserCountry/images/flags/br.png | Bin 486 -> 0 bytes plugins/UserCountry/images/flags/bs.png | Bin 391 -> 0 bytes plugins/UserCountry/images/flags/bt.png | Bin 471 -> 0 bytes plugins/UserCountry/images/flags/bu.png | Bin 464 -> 0 bytes plugins/UserCountry/images/flags/bv.png | Bin 397 -> 0 bytes plugins/UserCountry/images/flags/bw.png | Bin 327 -> 0 bytes plugins/UserCountry/images/flags/by.png | Bin 382 -> 0 bytes plugins/UserCountry/images/flags/bz.png | Bin 476 -> 0 bytes plugins/UserCountry/images/flags/ca.png | Bin 471 -> 0 bytes plugins/UserCountry/images/flags/cat.png | Bin 353 -> 0 bytes plugins/UserCountry/images/flags/cc.png | Bin 496 -> 0 bytes plugins/UserCountry/images/flags/cd.png | Bin 477 -> 0 bytes plugins/UserCountry/images/flags/cf.png | Bin 456 -> 0 bytes plugins/UserCountry/images/flags/cg.png | Bin 380 -> 0 bytes plugins/UserCountry/images/flags/ch.png | Bin 354 -> 0 bytes plugins/UserCountry/images/flags/ci.png | Bin 306 -> 0 bytes plugins/UserCountry/images/flags/ck.png | Bin 495 -> 0 bytes plugins/UserCountry/images/flags/cl.png | Bin 324 -> 0 bytes plugins/UserCountry/images/flags/cm.png | Bin 347 -> 0 bytes plugins/UserCountry/images/flags/cn.png | Bin 349 -> 0 bytes plugins/UserCountry/images/flags/co.png | Bin 330 -> 0 bytes plugins/UserCountry/images/flags/cp.png | Bin 369 -> 0 bytes plugins/UserCountry/images/flags/cr.png | Bin 349 -> 0 bytes plugins/UserCountry/images/flags/cs.png | Bin 321 -> 0 bytes plugins/UserCountry/images/flags/cu.png | Bin 445 -> 0 bytes plugins/UserCountry/images/flags/cv.png | Bin 441 -> 0 bytes plugins/UserCountry/images/flags/cw.png | Bin 308 -> 0 bytes plugins/UserCountry/images/flags/cx.png | Bin 498 -> 0 bytes plugins/UserCountry/images/flags/cy.png | Bin 337 -> 0 bytes plugins/UserCountry/images/flags/cz.png | Bin 367 -> 0 bytes plugins/UserCountry/images/flags/de.png | Bin 364 -> 0 bytes plugins/UserCountry/images/flags/dg.png | Bin 658 -> 0 bytes plugins/UserCountry/images/flags/dj.png | Bin 430 -> 0 bytes plugins/UserCountry/images/flags/dk.png | Bin 352 -> 0 bytes plugins/UserCountry/images/flags/dm.png | Bin 508 -> 0 bytes plugins/UserCountry/images/flags/do.png | Bin 368 -> 0 bytes plugins/UserCountry/images/flags/dz.png | Bin 454 -> 0 bytes plugins/UserCountry/images/flags/ea.png | Bin 344 -> 0 bytes plugins/UserCountry/images/flags/ec.png | Bin 355 -> 0 bytes plugins/UserCountry/images/flags/ee.png | Bin 297 -> 0 bytes plugins/UserCountry/images/flags/eg.png | Bin 348 -> 0 bytes plugins/UserCountry/images/flags/eh.png | Bin 388 -> 0 bytes plugins/UserCountry/images/flags/er.png | Bin 497 -> 0 bytes plugins/UserCountry/images/flags/es.png | Bin 344 -> 0 bytes plugins/UserCountry/images/flags/et.png | Bin 445 -> 0 bytes plugins/UserCountry/images/flags/eu.png | Bin 418 -> 0 bytes plugins/UserCountry/images/flags/fi.png | Bin 368 -> 0 bytes plugins/UserCountry/images/flags/fj.png | Bin 517 -> 0 bytes plugins/UserCountry/images/flags/fk.png | Bin 526 -> 0 bytes plugins/UserCountry/images/flags/fm.png | Bin 409 -> 0 bytes plugins/UserCountry/images/flags/fo.png | Bin 377 -> 0 bytes plugins/UserCountry/images/flags/fr.png | Bin 369 -> 0 bytes plugins/UserCountry/images/flags/fx.png | Bin 369 -> 0 bytes plugins/UserCountry/images/flags/ga.png | Bin 342 -> 0 bytes plugins/UserCountry/images/flags/gb.png | Bin 545 -> 0 bytes plugins/UserCountry/images/flags/gd.png | Bin 461 -> 0 bytes plugins/UserCountry/images/flags/ge.png | Bin 493 -> 0 bytes plugins/UserCountry/images/flags/gf.png | Bin 390 -> 0 bytes plugins/UserCountry/images/flags/gg.png | Bin 524 -> 0 bytes plugins/UserCountry/images/flags/gh.png | Bin 336 -> 0 bytes plugins/UserCountry/images/flags/gi.png | Bin 369 -> 0 bytes plugins/UserCountry/images/flags/gl.png | Bin 351 -> 0 bytes plugins/UserCountry/images/flags/gm.png | Bin 363 -> 0 bytes plugins/UserCountry/images/flags/gn.png | Bin 319 -> 0 bytes plugins/UserCountry/images/flags/gp.png | Bin 353 -> 0 bytes plugins/UserCountry/images/flags/gq.png | Bin 405 -> 0 bytes plugins/UserCountry/images/flags/gr.png | Bin 391 -> 0 bytes plugins/UserCountry/images/flags/gs.png | Bin 522 -> 0 bytes plugins/UserCountry/images/flags/gt.png | Bin 333 -> 0 bytes plugins/UserCountry/images/flags/gu.png | Bin 384 -> 0 bytes plugins/UserCountry/images/flags/gw.png | Bin 346 -> 0 bytes plugins/UserCountry/images/flags/gy.png | Bin 521 -> 0 bytes plugins/UserCountry/images/flags/hk.png | Bin 393 -> 0 bytes plugins/UserCountry/images/flags/hm.png | Bin 580 -> 0 bytes plugins/UserCountry/images/flags/hn.png | Bin 411 -> 0 bytes plugins/UserCountry/images/flags/hr.png | Bin 386 -> 0 bytes plugins/UserCountry/images/flags/ht.png | Bin 327 -> 0 bytes plugins/UserCountry/images/flags/hu.png | Bin 293 -> 0 bytes plugins/UserCountry/images/flags/ic.png | Bin 378 -> 0 bytes plugins/UserCountry/images/flags/id.png | Bin 301 -> 0 bytes plugins/UserCountry/images/flags/ie.png | Bin 333 -> 0 bytes plugins/UserCountry/images/flags/il.png | Bin 326 -> 0 bytes plugins/UserCountry/images/flags/im.png | Bin 320 -> 0 bytes plugins/UserCountry/images/flags/in.png | Bin 377 -> 0 bytes plugins/UserCountry/images/flags/io.png | Bin 575 -> 0 bytes plugins/UserCountry/images/flags/iq.png | Bin 403 -> 0 bytes plugins/UserCountry/images/flags/ir.png | Bin 398 -> 0 bytes plugins/UserCountry/images/flags/is.png | Bin 410 -> 0 bytes plugins/UserCountry/images/flags/it.png | Bin 283 -> 0 bytes plugins/UserCountry/images/flags/je.png | Bin 475 -> 0 bytes plugins/UserCountry/images/flags/jm.png | Bin 508 -> 0 bytes plugins/UserCountry/images/flags/jo.png | Bin 353 -> 0 bytes plugins/UserCountry/images/flags/jp.png | Bin 307 -> 0 bytes plugins/UserCountry/images/flags/ke.png | Bin 435 -> 0 bytes plugins/UserCountry/images/flags/kg.png | Bin 354 -> 0 bytes plugins/UserCountry/images/flags/kh.png | Bin 422 -> 0 bytes plugins/UserCountry/images/flags/ki.png | Bin 551 -> 0 bytes plugins/UserCountry/images/flags/km.png | Bin 456 -> 0 bytes plugins/UserCountry/images/flags/kn.png | Bin 480 -> 0 bytes plugins/UserCountry/images/flags/kp.png | Bin 424 -> 0 bytes plugins/UserCountry/images/flags/kr.png | Bin 507 -> 0 bytes plugins/UserCountry/images/flags/kw.png | Bin 351 -> 0 bytes plugins/UserCountry/images/flags/ky.png | Bin 532 -> 0 bytes plugins/UserCountry/images/flags/kz.png | Bin 459 -> 0 bytes plugins/UserCountry/images/flags/la.png | Bin 415 -> 0 bytes plugins/UserCountry/images/flags/lb.png | Bin 393 -> 0 bytes plugins/UserCountry/images/flags/lc.png | Bin 462 -> 0 bytes plugins/UserCountry/images/flags/li.png | Bin 399 -> 0 bytes plugins/UserCountry/images/flags/lk.png | Bin 464 -> 0 bytes plugins/UserCountry/images/flags/lr.png | Bin 365 -> 0 bytes plugins/UserCountry/images/flags/ls.png | Bin 361 -> 0 bytes plugins/UserCountry/images/flags/lt.png | Bin 345 -> 0 bytes plugins/UserCountry/images/flags/lu.png | Bin 338 -> 0 bytes plugins/UserCountry/images/flags/lv.png | Bin 339 -> 0 bytes plugins/UserCountry/images/flags/ly.png | Bin 353 -> 0 bytes plugins/UserCountry/images/flags/ma.png | Bin 293 -> 0 bytes plugins/UserCountry/images/flags/mc.png | Bin 254 -> 0 bytes plugins/UserCountry/images/flags/md.png | Bin 404 -> 0 bytes plugins/UserCountry/images/flags/me.png | Bin 394 -> 0 bytes plugins/UserCountry/images/flags/mf.png | Bin 369 -> 0 bytes plugins/UserCountry/images/flags/mg.png | Bin 313 -> 0 bytes plugins/UserCountry/images/flags/mh.png | Bin 518 -> 0 bytes plugins/UserCountry/images/flags/mk.png | Bin 449 -> 0 bytes plugins/UserCountry/images/flags/ml.png | Bin 322 -> 0 bytes plugins/UserCountry/images/flags/mm.png | Bin 464 -> 0 bytes plugins/UserCountry/images/flags/mn.png | Bin 343 -> 0 bytes plugins/UserCountry/images/flags/mo.png | Bin 456 -> 0 bytes plugins/UserCountry/images/flags/mp.png | Bin 481 -> 0 bytes plugins/UserCountry/images/flags/mq.png | Bin 541 -> 0 bytes plugins/UserCountry/images/flags/mr.png | Bin 408 -> 0 bytes plugins/UserCountry/images/flags/ms.png | Bin 497 -> 0 bytes plugins/UserCountry/images/flags/mt.png | Bin 296 -> 0 bytes plugins/UserCountry/images/flags/mu.png | Bin 360 -> 0 bytes plugins/UserCountry/images/flags/mv.png | Bin 391 -> 0 bytes plugins/UserCountry/images/flags/mw.png | Bin 365 -> 0 bytes plugins/UserCountry/images/flags/mx.png | Bin 424 -> 0 bytes plugins/UserCountry/images/flags/my.png | Bin 464 -> 0 bytes plugins/UserCountry/images/flags/mz.png | Bin 439 -> 0 bytes plugins/UserCountry/images/flags/na.png | Bin 559 -> 0 bytes plugins/UserCountry/images/flags/nc.png | Bin 470 -> 0 bytes plugins/UserCountry/images/flags/ne.png | Bin 393 -> 0 bytes plugins/UserCountry/images/flags/nf.png | Bin 474 -> 0 bytes plugins/UserCountry/images/flags/ng.png | Bin 341 -> 0 bytes plugins/UserCountry/images/flags/ni.png | Bin 372 -> 0 bytes plugins/UserCountry/images/flags/nl.png | Bin 310 -> 0 bytes plugins/UserCountry/images/flags/no.png | Bin 397 -> 0 bytes plugins/UserCountry/images/flags/np.png | Bin 423 -> 0 bytes plugins/UserCountry/images/flags/nr.png | Bin 391 -> 0 bytes plugins/UserCountry/images/flags/nt.png | Bin 198 -> 0 bytes plugins/UserCountry/images/flags/nu.png | Bin 468 -> 0 bytes plugins/UserCountry/images/flags/nz.png | Bin 529 -> 0 bytes plugins/UserCountry/images/flags/o1.png | Bin 290 -> 0 bytes plugins/UserCountry/images/flags/om.png | Bin 339 -> 0 bytes plugins/UserCountry/images/flags/pa.png | Bin 390 -> 0 bytes plugins/UserCountry/images/flags/pe.png | Bin 264 -> 0 bytes plugins/UserCountry/images/flags/pf.png | Bin 379 -> 0 bytes plugins/UserCountry/images/flags/pg.png | Bin 438 -> 0 bytes plugins/UserCountry/images/flags/ph.png | Bin 416 -> 0 bytes plugins/UserCountry/images/flags/pk.png | Bin 448 -> 0 bytes plugins/UserCountry/images/flags/pl.png | Bin 243 -> 0 bytes plugins/UserCountry/images/flags/pm.png | Bin 572 -> 0 bytes plugins/UserCountry/images/flags/pn.png | Bin 547 -> 0 bytes plugins/UserCountry/images/flags/pr.png | Bin 445 -> 0 bytes plugins/UserCountry/images/flags/ps.png | Bin 348 -> 0 bytes plugins/UserCountry/images/flags/pt.png | Bin 407 -> 0 bytes plugins/UserCountry/images/flags/pw.png | Bin 424 -> 0 bytes plugins/UserCountry/images/flags/py.png | Bin 344 -> 0 bytes plugins/UserCountry/images/flags/qa.png | Bin 343 -> 0 bytes plugins/UserCountry/images/flags/re.png | Bin 369 -> 0 bytes plugins/UserCountry/images/flags/ro.png | Bin 333 -> 0 bytes plugins/UserCountry/images/flags/rs.png | Bin 376 -> 0 bytes plugins/UserCountry/images/flags/ru.png | Bin 299 -> 0 bytes plugins/UserCountry/images/flags/rw.png | Bin 382 -> 0 bytes plugins/UserCountry/images/flags/sa.png | Bin 428 -> 0 bytes plugins/UserCountry/images/flags/sb.png | Bin 520 -> 0 bytes plugins/UserCountry/images/flags/sc.png | Bin 481 -> 0 bytes plugins/UserCountry/images/flags/sd.png | Bin 364 -> 0 bytes plugins/UserCountry/images/flags/se.png | Bin 389 -> 0 bytes plugins/UserCountry/images/flags/sf.png | Bin 368 -> 0 bytes plugins/UserCountry/images/flags/sg.png | Bin 350 -> 0 bytes plugins/UserCountry/images/flags/sh.png | Bin 524 -> 0 bytes plugins/UserCountry/images/flags/si.png | Bin 383 -> 0 bytes plugins/UserCountry/images/flags/sj.png | Bin 397 -> 0 bytes plugins/UserCountry/images/flags/sk.png | Bin 439 -> 0 bytes plugins/UserCountry/images/flags/sl.png | Bin 321 -> 0 bytes plugins/UserCountry/images/flags/sm.png | Bin 396 -> 0 bytes plugins/UserCountry/images/flags/sn.png | Bin 356 -> 0 bytes plugins/UserCountry/images/flags/so.png | Bin 376 -> 0 bytes plugins/UserCountry/images/flags/sr.png | Bin 370 -> 0 bytes plugins/UserCountry/images/flags/ss.png | Bin 422 -> 0 bytes plugins/UserCountry/images/flags/st.png | Bin 429 -> 0 bytes plugins/UserCountry/images/flags/su.png | Bin 273 -> 0 bytes plugins/UserCountry/images/flags/sv.png | Bin 373 -> 0 bytes plugins/UserCountry/images/flags/sx.png | Bin 416 -> 0 bytes plugins/UserCountry/images/flags/sy.png | Bin 322 -> 0 bytes plugins/UserCountry/images/flags/sz.png | Bin 508 -> 0 bytes plugins/UserCountry/images/flags/ta.png | Bin 512 -> 0 bytes plugins/UserCountry/images/flags/tc.png | Bin 509 -> 0 bytes plugins/UserCountry/images/flags/td.png | Bin 378 -> 0 bytes plugins/UserCountry/images/flags/tf.png | Bin 399 -> 0 bytes plugins/UserCountry/images/flags/tg.png | Bin 410 -> 0 bytes plugins/UserCountry/images/flags/th.png | Bin 327 -> 0 bytes plugins/UserCountry/images/flags/ti.png | Bin 811 -> 0 bytes plugins/UserCountry/images/flags/tj.png | Bin 367 -> 0 bytes plugins/UserCountry/images/flags/tk.png | Bin 379 -> 0 bytes plugins/UserCountry/images/flags/tl.png | Bin 395 -> 0 bytes plugins/UserCountry/images/flags/tm.png | Bin 456 -> 0 bytes plugins/UserCountry/images/flags/tn.png | Bin 367 -> 0 bytes plugins/UserCountry/images/flags/to.png | Bin 302 -> 0 bytes plugins/UserCountry/images/flags/tp.png | Bin 395 -> 0 bytes plugins/UserCountry/images/flags/tr.png | Bin 366 -> 0 bytes plugins/UserCountry/images/flags/tt.png | Bin 486 -> 0 bytes plugins/UserCountry/images/flags/tv.png | Bin 443 -> 0 bytes plugins/UserCountry/images/flags/tw.png | Bin 330 -> 0 bytes plugins/UserCountry/images/flags/tz.png | Bin 514 -> 0 bytes plugins/UserCountry/images/flags/ua.png | Bin 304 -> 0 bytes plugins/UserCountry/images/flags/ug.png | Bin 388 -> 0 bytes plugins/UserCountry/images/flags/uk.png | Bin 545 -> 0 bytes plugins/UserCountry/images/flags/um.png | Bin 455 -> 0 bytes plugins/UserCountry/images/flags/us.png | Bin 492 -> 0 bytes plugins/UserCountry/images/flags/uy.png | Bin 411 -> 0 bytes plugins/UserCountry/images/flags/uz.png | Bin 411 -> 0 bytes plugins/UserCountry/images/flags/va.png | Bin 419 -> 0 bytes plugins/UserCountry/images/flags/vc.png | Bin 412 -> 0 bytes plugins/UserCountry/images/flags/ve.png | Bin 412 -> 0 bytes plugins/UserCountry/images/flags/vg.png | Bin 510 -> 0 bytes plugins/UserCountry/images/flags/vi.png | Bin 523 -> 0 bytes plugins/UserCountry/images/flags/vn.png | Bin 324 -> 0 bytes plugins/UserCountry/images/flags/vu.png | Bin 450 -> 0 bytes plugins/UserCountry/images/flags/wf.png | Bin 438 -> 0 bytes plugins/UserCountry/images/flags/ws.png | Bin 352 -> 0 bytes plugins/UserCountry/images/flags/xx.png | Bin 290 -> 0 bytes plugins/UserCountry/images/flags/ye.png | Bin 302 -> 0 bytes plugins/UserCountry/images/flags/yt.png | Bin 456 -> 0 bytes plugins/UserCountry/images/flags/yu.png | Bin 321 -> 0 bytes plugins/UserCountry/images/flags/za.png | Bin 523 -> 0 bytes plugins/UserCountry/images/flags/zm.png | Bin 359 -> 0 bytes plugins/UserCountry/images/flags/zr.png | Bin 380 -> 0 bytes plugins/UserCountry/images/flags/zw.png | Bin 462 -> 0 bytes plugins/UserCountry/stylesheets/userCountry.less | 7 + ...kingWithSomeData__UserCountry.getCity_month.xml | 10 +- ...gWithSomeData__UserCountry.getCountry_month.xml | 35 +-- ...ngWithSomeData__UserCountry.getRegion_month.xml | 10 +- plugins/UserCountry/tests/Unit/UserCountryTest.php | 2 +- plugins/UserCountryMap/javascripts/realtime-map.js | 4 +- .../System/BackwardsCompatibility1XTest.php | 3 + ...nt_noOptions__Live.getLastVisitsDetails_day.xml | 54 ++-- ...t_noOptions__Live.getLastVisitsDetails_year.xml | 60 ++-- ...estAPITest__Live.getLastVisitsDetails_range.xml | 70 ++--- ...atibility1XTest__UserCountry.getCountry_day.xml | 30 ++ ...CustomEvents__Live.getLastVisitsDetails_day.xml | 60 ++-- ...stomEvents__Live.getLastVisitsDetails_month.xml | 60 ++-- ...ImportLogs__Live.getLastVisitsDetails_range.xml | 312 ++++++++++----------- .../test_ImportLogs__UserCountry.getCity_month.xml | 10 +- ...st_ImportLogs__UserCountry.getCountry_month.xml | 35 +-- ...est_ImportLogs__UserCountry.getRegion_month.xml | 10 +- ...ixedSiteId__Live.getLastVisitsDetails_range.xml | 90 +++--- ...AndLimit_1__Live.getLastVisitsDetails_month.xml | 18 +- ...AndLimit_2__Live.getLastVisitsDetails_month.xml | 18 +- ...ls_sortAsc__Live.getLastVisitsDetails_month.xml | 14 +- ...IdVisitAsc__Live.getLastVisitsDetails_month.xml | 14 +- ...tByIdVisit__Live.getLastVisitsDetails_month.xml | 42 +-- ...VisitCount__Live.getLastVisitsDetails_month.xml | 14 +- ...s_sortDesc__Live.getLastVisitsDetails_month.xml | 42 +-- ...ebsiteTest__Live.getLastVisitsDetails_month.xml | 60 ++-- ...rsOneWebsiteTest__UserCountry.getCity_month.xml | 24 +- ...neWebsiteTest__UserCountry.getCountry_month.xml | 50 ++-- ...OneWebsiteTest__UserCountry.getRegion_month.xml | 20 +- ...excludelowpop__UserCountry.getCountry_month.xml | 10 +- ...est_segment_city__UserCountry.getCity_month.xml | 2 +- ..._segment_city__UserCountry.getCountry_month.xml | 5 +- ...t_segment_city__UserCountry.getRegion_month.xml | 2 +- ...ent_continent__UserCountry.getCountry_month.xml | 25 +- ...segment_lat_long__UserCountry.getCity_month.xml | 2 +- ...ment_lat_long__UserCountry.getCountry_month.xml | 5 +- ...gment_lat_long__UserCountry.getRegion_month.xml | 2 +- ...t_segment_region__UserCountry.getCity_month.xml | 4 +- ...egment_region__UserCountry.getCountry_month.xml | 5 +- ...segment_region__UserCountry.getRegion_month.xml | 2 +- ...neVisitorTwoVisits__UserCountry.getCity_day.xml | 2 +- ...isitorTwoVisits__UserCountry.getCountry_day.xml | 2 +- ...VisitorTwoVisits__UserCountry.getRegion_day.xml | 2 +- ...ookieSupport__Live.getLastVisitsDetails_day.xml | 12 +- ..._withCookieSupport__UserCountry.getCity_day.xml | 2 +- ...thCookieSupport__UserCountry.getCountry_day.xml | 5 +- ...ithCookieSupport__UserCountry.getRegion_day.xml | 2 +- ...ordSpecified__Live.getLastVisitsDetails_day.xml | 12 +- ...fThreeDays__Live.getLastVisitsDetails_month.xml | 18 +- ...imezonesTest__Live.getLastVisitsDetails_day.xml | 6 +- ...duledReports.generateReport_month.original.html | 60 ++-- ...duledReports.generateReport_month.original.html | 54 ++-- ...eduledReports.generateReport_month.original.pdf | Bin 552121 -> 552243 bytes ...tReportMetadata__API.getProcessedReport_day.xml | 5 +- ..._showRawMetrics__API.getProcessedReport_day.xml | 5 +- ...st_csvExport__Live.getLastVisitsDetails_day.csv | Bin 8472 -> 8478 bytes ...tatusOrdered__Live.getLastVisitsDetails_day.xml | 4 +- ...eOrderWithItems__API.getProcessedReport_day.xml | 10 +- ...derWithItems__Live.getLastVisitsDetails_day.xml | 6 +- ...erceOrderWithItems__UserCountry.getCity_day.xml | 2 +- ...eOrderWithItems__UserCountry.getCountry_day.xml | 10 +- ...ceOrderWithItems__UserCountry.getRegion_day.xml | 2 +- ...eduledReports.generateReport_week.original.html | 46 +-- ...eduledReports.generateReport_week.original.html | 40 +-- ...heduledReports.generateReport_week.original.pdf | Bin 569258 -> 569333 bytes ...ays_DateRange__UserCountry.getCountry_range.xml | 5 +- ...aAndNormalAPI__API.getProcessedReport_range.xml | 5 +- ...tN_MetadataAndNormalAPI__Live.getLastVisits.xml | 18 +- ...dNormalAPI__Live.getLastVisitsDetails_range.xml | 18 +- ...etadataAndNormalAPI__Live.getVisitorProfile.xml | 14 +- ...I_pagesegment__API.getProcessedReport_range.xml | 5 +- ...ndNormalAPI_pagesegment__Live.getLastVisits.xml | 18 +- ...agesegment__Live.getLastVisitsDetails_range.xml | 18 +- ...rmalAPI_pagesegment__Live.getVisitorProfile.xml | 14 +- ...est_reportLimiting__UserCountry.getCity_day.xml | 6 +- ...t_reportLimiting__UserCountry.getRegion_day.xml | 6 +- ...Limiting_flattened__UserCountry.getCity_day.xml | 6 +- ...miting_flattened__UserCountry.getRegion_day.xml | 6 +- ...iting_rankingQuery__UserCountry.getCity_day.xml | 6 +- ...ing_rankingQuery__UserCountry.getRegion_day.xml | 6 +- .../ActionsDataTable_segmented_visitor_log.png | 4 +- .../UIIntegrationTest_dashboard2.png | 4 +- .../UIIntegrationTest_dashboard3.png | 4 +- .../UIIntegrationTest_ecommerce_log.png | 4 +- .../UIIntegrationTest_goals_individual_goal.png | 4 +- ...tegrationTest_goals_individual_goal_updated.png | 4 +- .../UIIntegrationTest_segmented_visitorlog.png | 4 +- .../UIIntegrationTest_visitor_profile_popup.png | 4 +- ...IntegrationTest_visitors_locations_provider.png | 4 +- .../UIIntegrationTest_visitors_realtime_map.png | 4 +- ...onTest_visitors_with_site_search_visitorlog.png | 4 +- .../UIIntegrationTest_widgetize_ecommercelog.png | 4 +- 389 files changed, 960 insertions(+), 945 deletions(-) delete mode 100644 plugins/UserCountry/images/flags/a1.png delete mode 100644 plugins/UserCountry/images/flags/a2.png delete mode 100644 plugins/UserCountry/images/flags/ac.png delete mode 100644 plugins/UserCountry/images/flags/ad.png delete mode 100644 plugins/UserCountry/images/flags/ae.png delete mode 100644 plugins/UserCountry/images/flags/af.png delete mode 100644 plugins/UserCountry/images/flags/ag.png delete mode 100644 plugins/UserCountry/images/flags/ai.png delete mode 100644 plugins/UserCountry/images/flags/al.png delete mode 100644 plugins/UserCountry/images/flags/am.png delete mode 100644 plugins/UserCountry/images/flags/an.png delete mode 100644 plugins/UserCountry/images/flags/ao.png delete mode 100644 plugins/UserCountry/images/flags/ap.png delete mode 100644 plugins/UserCountry/images/flags/aq.png delete mode 100644 plugins/UserCountry/images/flags/ar.png delete mode 100644 plugins/UserCountry/images/flags/as.png delete mode 100644 plugins/UserCountry/images/flags/at.png delete mode 100644 plugins/UserCountry/images/flags/au.png delete mode 100644 plugins/UserCountry/images/flags/aw.png delete mode 100644 plugins/UserCountry/images/flags/ax.png delete mode 100644 plugins/UserCountry/images/flags/az.png delete mode 100644 plugins/UserCountry/images/flags/ba.png delete mode 100644 plugins/UserCountry/images/flags/bb.png delete mode 100644 plugins/UserCountry/images/flags/bd.png delete mode 100644 plugins/UserCountry/images/flags/be.png delete mode 100644 plugins/UserCountry/images/flags/bf.png delete mode 100644 plugins/UserCountry/images/flags/bg.png delete mode 100644 plugins/UserCountry/images/flags/bh.png delete mode 100644 plugins/UserCountry/images/flags/bi.png delete mode 100644 plugins/UserCountry/images/flags/bj.png delete mode 100644 plugins/UserCountry/images/flags/bl.png delete mode 100644 plugins/UserCountry/images/flags/bm.png delete mode 100644 plugins/UserCountry/images/flags/bn.png delete mode 100644 plugins/UserCountry/images/flags/bo.png delete mode 100644 plugins/UserCountry/images/flags/bq.png delete mode 100644 plugins/UserCountry/images/flags/br.png delete mode 100644 plugins/UserCountry/images/flags/bs.png delete mode 100644 plugins/UserCountry/images/flags/bt.png delete mode 100644 plugins/UserCountry/images/flags/bu.png delete mode 100644 plugins/UserCountry/images/flags/bv.png delete mode 100644 plugins/UserCountry/images/flags/bw.png delete mode 100644 plugins/UserCountry/images/flags/by.png delete mode 100644 plugins/UserCountry/images/flags/bz.png delete mode 100644 plugins/UserCountry/images/flags/ca.png delete mode 100644 plugins/UserCountry/images/flags/cat.png delete mode 100644 plugins/UserCountry/images/flags/cc.png delete mode 100644 plugins/UserCountry/images/flags/cd.png delete mode 100644 plugins/UserCountry/images/flags/cf.png delete mode 100644 plugins/UserCountry/images/flags/cg.png delete mode 100644 plugins/UserCountry/images/flags/ch.png delete mode 100644 plugins/UserCountry/images/flags/ci.png delete mode 100644 plugins/UserCountry/images/flags/ck.png delete mode 100644 plugins/UserCountry/images/flags/cl.png delete mode 100644 plugins/UserCountry/images/flags/cm.png delete mode 100644 plugins/UserCountry/images/flags/cn.png delete mode 100644 plugins/UserCountry/images/flags/co.png delete mode 100644 plugins/UserCountry/images/flags/cp.png delete mode 100644 plugins/UserCountry/images/flags/cr.png delete mode 100644 plugins/UserCountry/images/flags/cs.png delete mode 100644 plugins/UserCountry/images/flags/cu.png delete mode 100644 plugins/UserCountry/images/flags/cv.png delete mode 100644 plugins/UserCountry/images/flags/cw.png delete mode 100644 plugins/UserCountry/images/flags/cx.png delete mode 100644 plugins/UserCountry/images/flags/cy.png delete mode 100644 plugins/UserCountry/images/flags/cz.png delete mode 100644 plugins/UserCountry/images/flags/de.png delete mode 100644 plugins/UserCountry/images/flags/dg.png delete mode 100644 plugins/UserCountry/images/flags/dj.png delete mode 100644 plugins/UserCountry/images/flags/dk.png delete mode 100644 plugins/UserCountry/images/flags/dm.png delete mode 100644 plugins/UserCountry/images/flags/do.png delete mode 100644 plugins/UserCountry/images/flags/dz.png delete mode 100644 plugins/UserCountry/images/flags/ea.png delete mode 100644 plugins/UserCountry/images/flags/ec.png delete mode 100644 plugins/UserCountry/images/flags/ee.png delete mode 100644 plugins/UserCountry/images/flags/eg.png delete mode 100644 plugins/UserCountry/images/flags/eh.png delete mode 100644 plugins/UserCountry/images/flags/er.png delete mode 100644 plugins/UserCountry/images/flags/es.png delete mode 100644 plugins/UserCountry/images/flags/et.png delete mode 100644 plugins/UserCountry/images/flags/eu.png delete mode 100644 plugins/UserCountry/images/flags/fi.png delete mode 100644 plugins/UserCountry/images/flags/fj.png delete mode 100644 plugins/UserCountry/images/flags/fk.png delete mode 100644 plugins/UserCountry/images/flags/fm.png delete mode 100644 plugins/UserCountry/images/flags/fo.png delete mode 100644 plugins/UserCountry/images/flags/fr.png delete mode 100644 plugins/UserCountry/images/flags/fx.png delete mode 100644 plugins/UserCountry/images/flags/ga.png delete mode 100644 plugins/UserCountry/images/flags/gb.png delete mode 100644 plugins/UserCountry/images/flags/gd.png delete mode 100644 plugins/UserCountry/images/flags/ge.png delete mode 100644 plugins/UserCountry/images/flags/gf.png delete mode 100644 plugins/UserCountry/images/flags/gg.png delete mode 100644 plugins/UserCountry/images/flags/gh.png delete mode 100644 plugins/UserCountry/images/flags/gi.png delete mode 100644 plugins/UserCountry/images/flags/gl.png delete mode 100644 plugins/UserCountry/images/flags/gm.png delete mode 100644 plugins/UserCountry/images/flags/gn.png delete mode 100644 plugins/UserCountry/images/flags/gp.png delete mode 100644 plugins/UserCountry/images/flags/gq.png delete mode 100644 plugins/UserCountry/images/flags/gr.png delete mode 100644 plugins/UserCountry/images/flags/gs.png delete mode 100644 plugins/UserCountry/images/flags/gt.png delete mode 100644 plugins/UserCountry/images/flags/gu.png delete mode 100644 plugins/UserCountry/images/flags/gw.png delete mode 100644 plugins/UserCountry/images/flags/gy.png delete mode 100644 plugins/UserCountry/images/flags/hk.png delete mode 100644 plugins/UserCountry/images/flags/hm.png delete mode 100644 plugins/UserCountry/images/flags/hn.png delete mode 100644 plugins/UserCountry/images/flags/hr.png delete mode 100644 plugins/UserCountry/images/flags/ht.png delete mode 100644 plugins/UserCountry/images/flags/hu.png delete mode 100644 plugins/UserCountry/images/flags/ic.png delete mode 100644 plugins/UserCountry/images/flags/id.png delete mode 100644 plugins/UserCountry/images/flags/ie.png delete mode 100644 plugins/UserCountry/images/flags/il.png delete mode 100644 plugins/UserCountry/images/flags/im.png delete mode 100644 plugins/UserCountry/images/flags/in.png delete mode 100644 plugins/UserCountry/images/flags/io.png delete mode 100644 plugins/UserCountry/images/flags/iq.png delete mode 100644 plugins/UserCountry/images/flags/ir.png delete mode 100644 plugins/UserCountry/images/flags/is.png delete mode 100644 plugins/UserCountry/images/flags/it.png delete mode 100644 plugins/UserCountry/images/flags/je.png delete mode 100644 plugins/UserCountry/images/flags/jm.png delete mode 100644 plugins/UserCountry/images/flags/jo.png delete mode 100644 plugins/UserCountry/images/flags/jp.png delete mode 100644 plugins/UserCountry/images/flags/ke.png delete mode 100644 plugins/UserCountry/images/flags/kg.png delete mode 100644 plugins/UserCountry/images/flags/kh.png delete mode 100644 plugins/UserCountry/images/flags/ki.png delete mode 100644 plugins/UserCountry/images/flags/km.png delete mode 100644 plugins/UserCountry/images/flags/kn.png delete mode 100644 plugins/UserCountry/images/flags/kp.png delete mode 100644 plugins/UserCountry/images/flags/kr.png delete mode 100644 plugins/UserCountry/images/flags/kw.png delete mode 100644 plugins/UserCountry/images/flags/ky.png delete mode 100644 plugins/UserCountry/images/flags/kz.png delete mode 100644 plugins/UserCountry/images/flags/la.png delete mode 100644 plugins/UserCountry/images/flags/lb.png delete mode 100644 plugins/UserCountry/images/flags/lc.png delete mode 100644 plugins/UserCountry/images/flags/li.png delete mode 100644 plugins/UserCountry/images/flags/lk.png delete mode 100644 plugins/UserCountry/images/flags/lr.png delete mode 100644 plugins/UserCountry/images/flags/ls.png delete mode 100644 plugins/UserCountry/images/flags/lt.png delete mode 100644 plugins/UserCountry/images/flags/lu.png delete mode 100644 plugins/UserCountry/images/flags/lv.png delete mode 100644 plugins/UserCountry/images/flags/ly.png delete mode 100644 plugins/UserCountry/images/flags/ma.png delete mode 100644 plugins/UserCountry/images/flags/mc.png delete mode 100644 plugins/UserCountry/images/flags/md.png delete mode 100644 plugins/UserCountry/images/flags/me.png delete mode 100644 plugins/UserCountry/images/flags/mf.png delete mode 100644 plugins/UserCountry/images/flags/mg.png delete mode 100644 plugins/UserCountry/images/flags/mh.png delete mode 100644 plugins/UserCountry/images/flags/mk.png delete mode 100644 plugins/UserCountry/images/flags/ml.png delete mode 100644 plugins/UserCountry/images/flags/mm.png delete mode 100644 plugins/UserCountry/images/flags/mn.png delete mode 100644 plugins/UserCountry/images/flags/mo.png delete mode 100644 plugins/UserCountry/images/flags/mp.png delete mode 100644 plugins/UserCountry/images/flags/mq.png delete mode 100644 plugins/UserCountry/images/flags/mr.png delete mode 100644 plugins/UserCountry/images/flags/ms.png delete mode 100644 plugins/UserCountry/images/flags/mt.png delete mode 100644 plugins/UserCountry/images/flags/mu.png delete mode 100644 plugins/UserCountry/images/flags/mv.png delete mode 100644 plugins/UserCountry/images/flags/mw.png delete mode 100644 plugins/UserCountry/images/flags/mx.png delete mode 100644 plugins/UserCountry/images/flags/my.png delete mode 100644 plugins/UserCountry/images/flags/mz.png delete mode 100644 plugins/UserCountry/images/flags/na.png delete mode 100644 plugins/UserCountry/images/flags/nc.png delete mode 100644 plugins/UserCountry/images/flags/ne.png delete mode 100644 plugins/UserCountry/images/flags/nf.png delete mode 100644 plugins/UserCountry/images/flags/ng.png delete mode 100644 plugins/UserCountry/images/flags/ni.png delete mode 100644 plugins/UserCountry/images/flags/nl.png delete mode 100644 plugins/UserCountry/images/flags/no.png delete mode 100644 plugins/UserCountry/images/flags/np.png delete mode 100644 plugins/UserCountry/images/flags/nr.png delete mode 100644 plugins/UserCountry/images/flags/nt.png delete mode 100644 plugins/UserCountry/images/flags/nu.png delete mode 100644 plugins/UserCountry/images/flags/nz.png delete mode 100644 plugins/UserCountry/images/flags/o1.png delete mode 100644 plugins/UserCountry/images/flags/om.png delete mode 100644 plugins/UserCountry/images/flags/pa.png delete mode 100644 plugins/UserCountry/images/flags/pe.png delete mode 100644 plugins/UserCountry/images/flags/pf.png delete mode 100644 plugins/UserCountry/images/flags/pg.png delete mode 100644 plugins/UserCountry/images/flags/ph.png delete mode 100644 plugins/UserCountry/images/flags/pk.png delete mode 100644 plugins/UserCountry/images/flags/pl.png delete mode 100644 plugins/UserCountry/images/flags/pm.png delete mode 100644 plugins/UserCountry/images/flags/pn.png delete mode 100644 plugins/UserCountry/images/flags/pr.png delete mode 100644 plugins/UserCountry/images/flags/ps.png delete mode 100644 plugins/UserCountry/images/flags/pt.png delete mode 100644 plugins/UserCountry/images/flags/pw.png delete mode 100644 plugins/UserCountry/images/flags/py.png delete mode 100644 plugins/UserCountry/images/flags/qa.png delete mode 100644 plugins/UserCountry/images/flags/re.png delete mode 100644 plugins/UserCountry/images/flags/ro.png delete mode 100644 plugins/UserCountry/images/flags/rs.png delete mode 100644 plugins/UserCountry/images/flags/ru.png delete mode 100644 plugins/UserCountry/images/flags/rw.png delete mode 100644 plugins/UserCountry/images/flags/sa.png delete mode 100644 plugins/UserCountry/images/flags/sb.png delete mode 100644 plugins/UserCountry/images/flags/sc.png delete mode 100644 plugins/UserCountry/images/flags/sd.png delete mode 100644 plugins/UserCountry/images/flags/se.png delete mode 100644 plugins/UserCountry/images/flags/sf.png delete mode 100644 plugins/UserCountry/images/flags/sg.png delete mode 100644 plugins/UserCountry/images/flags/sh.png delete mode 100644 plugins/UserCountry/images/flags/si.png delete mode 100644 plugins/UserCountry/images/flags/sj.png delete mode 100644 plugins/UserCountry/images/flags/sk.png delete mode 100644 plugins/UserCountry/images/flags/sl.png delete mode 100644 plugins/UserCountry/images/flags/sm.png delete mode 100644 plugins/UserCountry/images/flags/sn.png delete mode 100644 plugins/UserCountry/images/flags/so.png delete mode 100644 plugins/UserCountry/images/flags/sr.png delete mode 100644 plugins/UserCountry/images/flags/ss.png delete mode 100644 plugins/UserCountry/images/flags/st.png delete mode 100644 plugins/UserCountry/images/flags/su.png delete mode 100644 plugins/UserCountry/images/flags/sv.png delete mode 100644 plugins/UserCountry/images/flags/sx.png delete mode 100644 plugins/UserCountry/images/flags/sy.png delete mode 100644 plugins/UserCountry/images/flags/sz.png delete mode 100644 plugins/UserCountry/images/flags/ta.png delete mode 100644 plugins/UserCountry/images/flags/tc.png delete mode 100644 plugins/UserCountry/images/flags/td.png delete mode 100644 plugins/UserCountry/images/flags/tf.png delete mode 100644 plugins/UserCountry/images/flags/tg.png delete mode 100644 plugins/UserCountry/images/flags/th.png delete mode 100644 plugins/UserCountry/images/flags/ti.png delete mode 100644 plugins/UserCountry/images/flags/tj.png delete mode 100644 plugins/UserCountry/images/flags/tk.png delete mode 100644 plugins/UserCountry/images/flags/tl.png delete mode 100644 plugins/UserCountry/images/flags/tm.png delete mode 100644 plugins/UserCountry/images/flags/tn.png delete mode 100644 plugins/UserCountry/images/flags/to.png delete mode 100644 plugins/UserCountry/images/flags/tp.png delete mode 100644 plugins/UserCountry/images/flags/tr.png delete mode 100644 plugins/UserCountry/images/flags/tt.png delete mode 100644 plugins/UserCountry/images/flags/tv.png delete mode 100644 plugins/UserCountry/images/flags/tw.png delete mode 100644 plugins/UserCountry/images/flags/tz.png delete mode 100644 plugins/UserCountry/images/flags/ua.png delete mode 100644 plugins/UserCountry/images/flags/ug.png delete mode 100644 plugins/UserCountry/images/flags/uk.png delete mode 100644 plugins/UserCountry/images/flags/um.png delete mode 100644 plugins/UserCountry/images/flags/us.png delete mode 100644 plugins/UserCountry/images/flags/uy.png delete mode 100644 plugins/UserCountry/images/flags/uz.png delete mode 100644 plugins/UserCountry/images/flags/va.png delete mode 100644 plugins/UserCountry/images/flags/vc.png delete mode 100644 plugins/UserCountry/images/flags/ve.png delete mode 100644 plugins/UserCountry/images/flags/vg.png delete mode 100644 plugins/UserCountry/images/flags/vi.png delete mode 100644 plugins/UserCountry/images/flags/vn.png delete mode 100644 plugins/UserCountry/images/flags/vu.png delete mode 100644 plugins/UserCountry/images/flags/wf.png delete mode 100644 plugins/UserCountry/images/flags/ws.png delete mode 100644 plugins/UserCountry/images/flags/xx.png delete mode 100644 plugins/UserCountry/images/flags/ye.png delete mode 100644 plugins/UserCountry/images/flags/yt.png delete mode 100644 plugins/UserCountry/images/flags/yu.png delete mode 100644 plugins/UserCountry/images/flags/za.png delete mode 100644 plugins/UserCountry/images/flags/zm.png delete mode 100644 plugins/UserCountry/images/flags/zr.png delete mode 100644 plugins/UserCountry/images/flags/zw.png create mode 100644 tests/PHPUnit/System/expected/test_BackwardsCompatibility1XTest__UserCountry.getCountry_day.xml diff --git a/LEGALNOTICE b/LEGALNOTICE index d4b1e6d51b..85bb53e12c 100644 --- a/LEGALNOTICE +++ b/LEGALNOTICE @@ -245,6 +245,12 @@ THIRD-PARTY CONTENT Notes: - used in Piwik's ExampleUI plugin + Name: flag-icon-css - Lipis + Link: https://github.com/lipis/flag-icon-css + License: MIT (Expat) + Notes: + - used for flag PNGs + Name: Wine project - tahoma.ttf font Link: http://source.winehq.org/git/wine.git/blob_plain/HEAD:/fonts/tahoma.ttf License: LGPL v2.1 @@ -259,18 +265,18 @@ THIRD-PARTY CONTENT Link: https://www.iconfinder.com/icons/216429/thumbs_up_icon License: Creative Commons (Attribution-Share Alike 3.0 Unported) - Name: plugins/Insights/images/idea.png - Link: https://www.iconfinder.com/icons/6074/brainstorm_bulb_idea_jabber_light_icon - License: GPL - By: Alessandro Rei - http://www.kde-look.org/usermanager/search.php?username=mentalrey + Name: plugins/Insights/images/idea.png + Link: https://www.iconfinder.com/icons/6074/brainstorm_bulb_idea_jabber_light_icon + License: GPL + By: Alessandro Rei - http://www.kde-look.org/usermanager/search.php?username=mentalrey - Name: Material icons ("icon-info2" "icon-outline" "icon-settings", "icon-form") in plugins/Morpheus/fonts - Link: https://design.google.com/icons/ - License: Apache License Version 2.0 + Name: Material icons ("icon-info2" "icon-outline" "icon-settings", "icon-form") in plugins/Morpheus/fonts + Link: https://design.google.com/icons/ + License: Apache License Version 2.0 - Name: IcoMoon - Free icons ("icon-funnel", "icon-lab", "icon-archive") in plugins/Morpheus/fonts - Link: https://icomoon.io/#icons-icomoon - License: GPL + Name: IcoMoon - Free icons ("icon-funnel", "icon-lab", "icon-archive") in plugins/Morpheus/fonts + Link: https://icomoon.io/#icons-icomoon + License: GPL Notes: - the "New BSD" license refers to either the "Modified BSD" and "Simplified BSD" diff --git a/plugins/Contents/tests/System/expected/test_Contents__Live.getLastVisitsDetails_day.xml b/plugins/Contents/tests/System/expected/test_Contents__Live.getLastVisitsDetails_day.xml index 436975fff5..b16427cf44 100644 --- a/plugins/Contents/tests/System/expected/test_Contents__Live.getLastVisitsDetails_day.xml +++ b/plugins/Contents/tests/System/expected/test_Contents__Live.getLastVisitsDetails_day.xml @@ -76,7 +76,7 @@ eur France fr - plugins/UserCountry/images/flags/fr.png + plugins/Morpheus/icons/dist/flags/fr.png @@ -188,7 +188,7 @@ eur France fr - plugins/UserCountry/images/flags/fr.png + plugins/Morpheus/icons/dist/flags/fr.png diff --git a/plugins/Contents/tests/System/expected/test_Contents__Live.getLastVisitsDetails_month.xml b/plugins/Contents/tests/System/expected/test_Contents__Live.getLastVisitsDetails_month.xml index 436975fff5..b16427cf44 100644 --- a/plugins/Contents/tests/System/expected/test_Contents__Live.getLastVisitsDetails_month.xml +++ b/plugins/Contents/tests/System/expected/test_Contents__Live.getLastVisitsDetails_month.xml @@ -76,7 +76,7 @@ eur France fr - plugins/UserCountry/images/flags/fr.png + plugins/Morpheus/icons/dist/flags/fr.png @@ -188,7 +188,7 @@ eur France fr - plugins/UserCountry/images/flags/fr.png + plugins/Morpheus/icons/dist/flags/fr.png diff --git a/plugins/Contents/tests/System/expected/test_Contents_contentInteractionMatch__Live.getLastVisitsDetails_day.xml b/plugins/Contents/tests/System/expected/test_Contents_contentInteractionMatch__Live.getLastVisitsDetails_day.xml index 436975fff5..b16427cf44 100644 --- a/plugins/Contents/tests/System/expected/test_Contents_contentInteractionMatch__Live.getLastVisitsDetails_day.xml +++ b/plugins/Contents/tests/System/expected/test_Contents_contentInteractionMatch__Live.getLastVisitsDetails_day.xml @@ -76,7 +76,7 @@ eur France fr - plugins/UserCountry/images/flags/fr.png + plugins/Morpheus/icons/dist/flags/fr.png @@ -188,7 +188,7 @@ eur France fr - plugins/UserCountry/images/flags/fr.png + plugins/Morpheus/icons/dist/flags/fr.png diff --git a/plugins/Contents/tests/System/expected/test_Contents_contentTargetMatch__Live.getLastVisitsDetails_day.xml b/plugins/Contents/tests/System/expected/test_Contents_contentTargetMatch__Live.getLastVisitsDetails_day.xml index 436975fff5..b16427cf44 100644 --- a/plugins/Contents/tests/System/expected/test_Contents_contentTargetMatch__Live.getLastVisitsDetails_day.xml +++ b/plugins/Contents/tests/System/expected/test_Contents_contentTargetMatch__Live.getLastVisitsDetails_day.xml @@ -76,7 +76,7 @@ eur France fr - plugins/UserCountry/images/flags/fr.png + plugins/Morpheus/icons/dist/flags/fr.png @@ -188,7 +188,7 @@ eur France fr - plugins/UserCountry/images/flags/fr.png + plugins/Morpheus/icons/dist/flags/fr.png diff --git a/plugins/Contents/tests/System/expected/test_ContentscontentNameOrPieceMatch__Live.getLastVisitsDetails_day.xml b/plugins/Contents/tests/System/expected/test_ContentscontentNameOrPieceMatch__Live.getLastVisitsDetails_day.xml index 436975fff5..b16427cf44 100644 --- a/plugins/Contents/tests/System/expected/test_ContentscontentNameOrPieceMatch__Live.getLastVisitsDetails_day.xml +++ b/plugins/Contents/tests/System/expected/test_ContentscontentNameOrPieceMatch__Live.getLastVisitsDetails_day.xml @@ -76,7 +76,7 @@ eur France fr - plugins/UserCountry/images/flags/fr.png + plugins/Morpheus/icons/dist/flags/fr.png @@ -188,7 +188,7 @@ eur France fr - plugins/UserCountry/images/flags/fr.png + plugins/Morpheus/icons/dist/flags/fr.png diff --git a/plugins/CoreHome/DataTableRowAction/RowEvolution.php b/plugins/CoreHome/DataTableRowAction/RowEvolution.php index e7e46820f5..5a6a83c46a 100644 --- a/plugins/CoreHome/DataTableRowAction/RowEvolution.php +++ b/plugins/CoreHome/DataTableRowAction/RowEvolution.php @@ -130,7 +130,7 @@ class RowEvolution $metricsText = Piwik::translate('RowEvolution_AvailableMetrics'); $popoverTitle = ''; if ($this->rowLabel) { - $icon = $this->rowIcon ? '' : ''; + $icon = $this->rowIcon ? '' : ''; $metricsText = sprintf(Piwik::translate('RowEvolution_MetricsFor'), $this->dimension . ': ' . $icon . ' ' . $this->rowLabel); $popoverTitle = $icon . ' ' . $this->rowLabel; } diff --git a/plugins/CoreHome/stylesheets/dataTable/_dataTable.less b/plugins/CoreHome/stylesheets/dataTable/_dataTable.less index 5c321005ad..2015f6ea2e 100644 --- a/plugins/CoreHome/stylesheets/dataTable/_dataTable.less +++ b/plugins/CoreHome/stylesheets/dataTable/_dataTable.less @@ -480,7 +480,6 @@ tr.level12 td.label { table.dataTable td.label img { margin-top: -3px; - max-width: 16px; max-height: 16px; } diff --git a/plugins/CoreHome/templates/ReportRenderer/_htmlReportBody.twig b/plugins/CoreHome/templates/ReportRenderer/_htmlReportBody.twig index d331175edd..87364415df 100644 --- a/plugins/CoreHome/templates/ReportRenderer/_htmlReportBody.twig +++ b/plugins/CoreHome/templates/ReportRenderer/_htmlReportBody.twig @@ -53,7 +53,9 @@ {% if columnId == 'label' %} {% if rowMetrics[columnId] is defined %} {% if rowMetadata.logo is defined %} - +   {% endif %} {% if rowMetadata.url is defined %} diff --git a/plugins/CustomDimensions b/plugins/CustomDimensions index 6c39cfbb21..ebc3766520 160000 --- a/plugins/CustomDimensions +++ b/plugins/CustomDimensions @@ -1 +1 @@ -Subproject commit 6c39cfbb2189178aa10705e1a4fb5dd3212729c1 +Subproject commit ebc37665207419a365d74d7d595b038715de20b6 diff --git a/plugins/CustomVariables/tests/System/expected/test_CustomVariablesSystemTest__Live.getLastVisitsDetails_day.xml b/plugins/CustomVariables/tests/System/expected/test_CustomVariablesSystemTest__Live.getLastVisitsDetails_day.xml index aee0c3d3da..4a884ae177 100644 --- a/plugins/CustomVariables/tests/System/expected/test_CustomVariablesSystemTest__Live.getLastVisitsDetails_day.xml +++ b/plugins/CustomVariables/tests/System/expected/test_CustomVariablesSystemTest__Live.getLastVisitsDetails_day.xml @@ -117,7 +117,7 @@ eur France fr - plugins/UserCountry/images/flags/fr.png + plugins/Morpheus/icons/dist/flags/fr.png diff --git a/plugins/Goals/stylesheets/goals.css b/plugins/Goals/stylesheets/goals.css index 220f57e3d2..7fbb35d2b0 100644 --- a/plugins/Goals/stylesheets/goals.css +++ b/plugins/Goals/stylesheets/goals.css @@ -32,6 +32,11 @@ ul.ulGoalTopElements li { list-style-type: circle; } +ul.ulGoalTopElements img { + border: 1px solid lightgray; + box-sizing: content-box; +} + .ulGoalTopElements a { text-decoration: none; color: #0033CC; diff --git a/plugins/Live/stylesheets/live.less b/plugins/Live/stylesheets/live.less index c471009e50..309b93cecc 100644 --- a/plugins/Live/stylesheets/live.less +++ b/plugins/Live/stylesheets/live.less @@ -297,6 +297,11 @@ a.visitor-log-visitor-profile-link { height: 16px; } +.visitorLogIconWithDetails.flag>img { + border: 1px solid lightgray; + box-sizing: content-box; +} + .visitorLogIcons>span.visitorRank>img { margin: auto 0; } diff --git a/plugins/Live/stylesheets/visitor_profile.less b/plugins/Live/stylesheets/visitor_profile.less index 79ab10222c..5622e42f1a 100644 --- a/plugins/Live/stylesheets/visitor_profile.less +++ b/plugins/Live/stylesheets/visitor_profile.less @@ -279,6 +279,10 @@ margin-right: 1em; } } +.visitor-profile-location img { + border: 1px solid lightgray; + box-sizing: content-box; +} .visitor-profile-important-visits { diff --git a/plugins/Live/templates/_dataTableViz_visitorLog.twig b/plugins/Live/templates/_dataTableViz_visitorLog.twig index 99fd4488e5..5281f9974f 100644 --- a/plugins/Live/templates/_dataTableViz_visitorLog.twig +++ b/plugins/Live/templates/_dataTableViz_visitorLog.twig @@ -158,9 +158,9 @@ GPS (lat/long): {{ visitor.getColumn('latitude') }},{{ visitor.getColumn('longit {% endif %} {% if visitor.getColumn('countryFlag') %} - + - + {% if visitor.getColumn('city') %}{{ visitor.getColumn('city')|rawSafeDecoded }}{% endif -%} {%- if visitor.getColumn('region') %}{% if visitor.getColumn('city') %}, {% endif %}{{ visitor.getColumn('region')|rawSafeDecoded }}{% endif %} diff --git a/plugins/Live/templates/getLastVisitsStart.twig b/plugins/Live/templates/getLastVisitsStart.twig index ac1ce17e06..4e44f75427 100644 --- a/plugins/Live/templates/getLastVisitsStart.twig +++ b/plugins/Live/templates/getLastVisitsStart.twig @@ -19,7 +19,7 @@ {% endif %}
- {% if visitor.countryFlag is defined %} {% endif %} + {% if visitor.countryFlag is defined %} {% endif %} {% if visitor.browserIcon is defined %} {% endif %} {% if visitor.operatingSystemIcon is defined %} {% endif %}   diff --git a/plugins/Live/templates/getVisitorProfilePopup.twig b/plugins/Live/templates/getVisitorProfilePopup.twig index 673fc82b8b..c0b3141892 100644 --- a/plugins/Live/templates/getVisitorProfilePopup.twig +++ b/plugins/Live/templates/getVisitorProfilePopup.twig @@ -138,7 +138,7 @@ {{ entry.prettyName }} {%- endif -%} -   +   {%- endset %} {{- 'General_XFromY'|translate(entryVisits, entryCountry)|raw -}}{% if not loop.last %}, {% endif %} @@ -169,4 +169,4 @@ -{% endif %} +{% endif %} \ No newline at end of file diff --git a/plugins/Live/tests/System/expected/test___Live.getVisitorProfile.xml b/plugins/Live/tests/System/expected/test___Live.getVisitorProfile.xml index ebb9d33283..6d2f99e5d5 100644 --- a/plugins/Live/tests/System/expected/test___Live.getVisitorProfile.xml +++ b/plugins/Live/tests/System/expected/test___Live.getVisitorProfile.xml @@ -31,13 +31,13 @@ fr 1 - plugins/UserCountry/images/flags/fr.png + plugins/Morpheus/icons/dist/flags/fr.png France xx 30 - plugins/UserCountry/images/flags/xx.png + plugins/Morpheus/icons/dist/flags/xx.png Unknown @@ -130,7 +130,7 @@ unk Unknown xx - plugins/UserCountry/images/flags/xx.png + plugins/Morpheus/icons/dist/flags/xx.png @@ -238,7 +238,7 @@ unk Unknown xx - plugins/UserCountry/images/flags/xx.png + plugins/Morpheus/icons/dist/flags/xx.png @@ -346,7 +346,7 @@ unk Unknown xx - plugins/UserCountry/images/flags/xx.png + plugins/Morpheus/icons/dist/flags/xx.png @@ -454,7 +454,7 @@ unk Unknown xx - plugins/UserCountry/images/flags/xx.png + plugins/Morpheus/icons/dist/flags/xx.png @@ -562,7 +562,7 @@ unk Unknown xx - plugins/UserCountry/images/flags/xx.png + plugins/Morpheus/icons/dist/flags/xx.png @@ -670,7 +670,7 @@ unk Unknown xx - plugins/UserCountry/images/flags/xx.png + plugins/Morpheus/icons/dist/flags/xx.png @@ -778,7 +778,7 @@ unk Unknown xx - plugins/UserCountry/images/flags/xx.png + plugins/Morpheus/icons/dist/flags/xx.png @@ -886,7 +886,7 @@ unk Unknown xx - plugins/UserCountry/images/flags/xx.png + plugins/Morpheus/icons/dist/flags/xx.png @@ -994,7 +994,7 @@ unk Unknown xx - plugins/UserCountry/images/flags/xx.png + plugins/Morpheus/icons/dist/flags/xx.png @@ -1102,7 +1102,7 @@ unk Unknown xx - plugins/UserCountry/images/flags/xx.png + plugins/Morpheus/icons/dist/flags/xx.png diff --git a/plugins/Live/tests/System/expected/test_higherLimit__Live.getVisitorProfile.xml b/plugins/Live/tests/System/expected/test_higherLimit__Live.getVisitorProfile.xml index 816f5a2df7..1e3914be4c 100644 --- a/plugins/Live/tests/System/expected/test_higherLimit__Live.getVisitorProfile.xml +++ b/plugins/Live/tests/System/expected/test_higherLimit__Live.getVisitorProfile.xml @@ -31,13 +31,13 @@ fr 1 - plugins/UserCountry/images/flags/fr.png + plugins/Morpheus/icons/dist/flags/fr.png France xx 30 - plugins/UserCountry/images/flags/xx.png + plugins/Morpheus/icons/dist/flags/xx.png Unknown @@ -130,7 +130,7 @@ unk Unknown xx - plugins/UserCountry/images/flags/xx.png + plugins/Morpheus/icons/dist/flags/xx.png @@ -238,7 +238,7 @@ unk Unknown xx - plugins/UserCountry/images/flags/xx.png + plugins/Morpheus/icons/dist/flags/xx.png @@ -346,7 +346,7 @@ unk Unknown xx - plugins/UserCountry/images/flags/xx.png + plugins/Morpheus/icons/dist/flags/xx.png @@ -454,7 +454,7 @@ unk Unknown xx - plugins/UserCountry/images/flags/xx.png + plugins/Morpheus/icons/dist/flags/xx.png @@ -562,7 +562,7 @@ unk Unknown xx - plugins/UserCountry/images/flags/xx.png + plugins/Morpheus/icons/dist/flags/xx.png @@ -670,7 +670,7 @@ unk Unknown xx - plugins/UserCountry/images/flags/xx.png + plugins/Morpheus/icons/dist/flags/xx.png @@ -778,7 +778,7 @@ unk Unknown xx - plugins/UserCountry/images/flags/xx.png + plugins/Morpheus/icons/dist/flags/xx.png @@ -886,7 +886,7 @@ unk Unknown xx - plugins/UserCountry/images/flags/xx.png + plugins/Morpheus/icons/dist/flags/xx.png @@ -994,7 +994,7 @@ unk Unknown xx - plugins/UserCountry/images/flags/xx.png + plugins/Morpheus/icons/dist/flags/xx.png @@ -1102,7 +1102,7 @@ unk Unknown xx - plugins/UserCountry/images/flags/xx.png + plugins/Morpheus/icons/dist/flags/xx.png @@ -1210,7 +1210,7 @@ unk Unknown xx - plugins/UserCountry/images/flags/xx.png + plugins/Morpheus/icons/dist/flags/xx.png @@ -1318,7 +1318,7 @@ unk Unknown xx - plugins/UserCountry/images/flags/xx.png + plugins/Morpheus/icons/dist/flags/xx.png @@ -1426,7 +1426,7 @@ unk Unknown xx - plugins/UserCountry/images/flags/xx.png + plugins/Morpheus/icons/dist/flags/xx.png @@ -1534,7 +1534,7 @@ unk Unknown xx - plugins/UserCountry/images/flags/xx.png + plugins/Morpheus/icons/dist/flags/xx.png @@ -1642,7 +1642,7 @@ unk Unknown xx - plugins/UserCountry/images/flags/xx.png + plugins/Morpheus/icons/dist/flags/xx.png @@ -1750,7 +1750,7 @@ unk Unknown xx - plugins/UserCountry/images/flags/xx.png + plugins/Morpheus/icons/dist/flags/xx.png @@ -1858,7 +1858,7 @@ unk Unknown xx - plugins/UserCountry/images/flags/xx.png + plugins/Morpheus/icons/dist/flags/xx.png @@ -1966,7 +1966,7 @@ unk Unknown xx - plugins/UserCountry/images/flags/xx.png + plugins/Morpheus/icons/dist/flags/xx.png @@ -2074,7 +2074,7 @@ unk Unknown xx - plugins/UserCountry/images/flags/xx.png + plugins/Morpheus/icons/dist/flags/xx.png @@ -2182,7 +2182,7 @@ unk Unknown xx - plugins/UserCountry/images/flags/xx.png + plugins/Morpheus/icons/dist/flags/xx.png diff --git a/plugins/Morpheus/icons b/plugins/Morpheus/icons index 73ceb86e07..10891baaf5 160000 --- a/plugins/Morpheus/icons +++ b/plugins/Morpheus/icons @@ -1 +1 @@ -Subproject commit 73ceb86e07fa0d963a791aac8337736901a9f544 +Subproject commit 10891baaf590cc0026bb7caefc2edf597d79a7e4 diff --git a/plugins/Morpheus/stylesheets/ui/_popups.less b/plugins/Morpheus/stylesheets/ui/_popups.less index 4ffa175a59..0e328f37a7 100644 --- a/plugins/Morpheus/stylesheets/ui/_popups.less +++ b/plugins/Morpheus/stylesheets/ui/_popups.less @@ -2,7 +2,6 @@ color: @theme-color-text; font-weight: normal; img { - width: 16px; height: 16px; } } diff --git a/plugins/UserCountry/API.php b/plugins/UserCountry/API.php index 176030ec31..c4e12b550a 100644 --- a/plugins/UserCountry/API.php +++ b/plugins/UserCountry/API.php @@ -38,8 +38,7 @@ class API extends \Piwik\Plugin\API $dataTable->filter('ColumnCallbackAddMetadata', array('label', 'logo', __NAMESPACE__ . '\getFlagFromCode')); $dataTable->filter('ColumnCallbackReplace', array('label', __NAMESPACE__ . '\countryTranslate')); - $dataTable->queueFilter('ColumnCallbackAddMetadata', array(array(), 'logoWidth', function () { return 16; })); - $dataTable->queueFilter('ColumnCallbackAddMetadata', array(array(), 'logoHeight', function () { return 11; })); + $dataTable->queueFilter('ColumnCallbackAddMetadata', array(array(), 'logoHeight', function () { return 16; })); return $dataTable; } diff --git a/plugins/UserCountry/functions.php b/plugins/UserCountry/functions.php index 33a95600bb..008e4786a5 100644 --- a/plugins/UserCountry/functions.php +++ b/plugins/UserCountry/functions.php @@ -22,7 +22,7 @@ use Piwik\Tracker\Visit; */ function getFlagFromCode($code) { - $pathInPiwik = 'plugins/UserCountry/images/flags/%s.png'; + $pathInPiwik = 'plugins/Morpheus/icons/dist/flags/%s.png'; $pathWithCode = sprintf($pathInPiwik, $code); $absolutePath = PIWIK_INCLUDE_PATH . '/' . $pathWithCode; if (file_exists($absolutePath)) { diff --git a/plugins/UserCountry/images/flags/a1.png b/plugins/UserCountry/images/flags/a1.png deleted file mode 100644 index da6e1bbe89..0000000000 Binary files a/plugins/UserCountry/images/flags/a1.png and /dev/null differ diff --git a/plugins/UserCountry/images/flags/a2.png b/plugins/UserCountry/images/flags/a2.png deleted file mode 100644 index da6e1bbe89..0000000000 Binary files a/plugins/UserCountry/images/flags/a2.png and /dev/null differ diff --git a/plugins/UserCountry/images/flags/ac.png b/plugins/UserCountry/images/flags/ac.png deleted file mode 100644 index 405e897c52..0000000000 Binary files a/plugins/UserCountry/images/flags/ac.png and /dev/null differ diff --git a/plugins/UserCountry/images/flags/ad.png b/plugins/UserCountry/images/flags/ad.png deleted file mode 100644 index 385fa1d7ea..0000000000 Binary files a/plugins/UserCountry/images/flags/ad.png and /dev/null differ diff --git a/plugins/UserCountry/images/flags/ae.png b/plugins/UserCountry/images/flags/ae.png deleted file mode 100644 index cf10beb4a3..0000000000 Binary files a/plugins/UserCountry/images/flags/ae.png and /dev/null differ diff --git a/plugins/UserCountry/images/flags/af.png b/plugins/UserCountry/images/flags/af.png deleted file mode 100644 index 1b24b434fa..0000000000 Binary files a/plugins/UserCountry/images/flags/af.png and /dev/null differ diff --git a/plugins/UserCountry/images/flags/ag.png b/plugins/UserCountry/images/flags/ag.png deleted file mode 100644 index 3ca9b1763c..0000000000 Binary files a/plugins/UserCountry/images/flags/ag.png and /dev/null differ diff --git a/plugins/UserCountry/images/flags/ai.png b/plugins/UserCountry/images/flags/ai.png deleted file mode 100644 index 9bde3ce709..0000000000 Binary files a/plugins/UserCountry/images/flags/ai.png and /dev/null differ diff --git a/plugins/UserCountry/images/flags/al.png b/plugins/UserCountry/images/flags/al.png deleted file mode 100644 index e5f7b0647c..0000000000 Binary files a/plugins/UserCountry/images/flags/al.png and /dev/null differ diff --git a/plugins/UserCountry/images/flags/am.png b/plugins/UserCountry/images/flags/am.png deleted file mode 100644 index 6d0a22383b..0000000000 Binary files a/plugins/UserCountry/images/flags/am.png and /dev/null differ diff --git a/plugins/UserCountry/images/flags/an.png b/plugins/UserCountry/images/flags/an.png deleted file mode 100644 index c5165608ce..0000000000 Binary files a/plugins/UserCountry/images/flags/an.png and /dev/null differ diff --git a/plugins/UserCountry/images/flags/ao.png b/plugins/UserCountry/images/flags/ao.png deleted file mode 100644 index c0872c46f8..0000000000 Binary files a/plugins/UserCountry/images/flags/ao.png and /dev/null differ diff --git a/plugins/UserCountry/images/flags/ap.png b/plugins/UserCountry/images/flags/ap.png deleted file mode 100644 index da6e1bbe89..0000000000 Binary files a/plugins/UserCountry/images/flags/ap.png and /dev/null differ diff --git a/plugins/UserCountry/images/flags/aq.png b/plugins/UserCountry/images/flags/aq.png deleted file mode 100644 index 217eaba391..0000000000 Binary files a/plugins/UserCountry/images/flags/aq.png and /dev/null differ diff --git a/plugins/UserCountry/images/flags/ar.png b/plugins/UserCountry/images/flags/ar.png deleted file mode 100644 index 0f09ebdd8e..0000000000 Binary files a/plugins/UserCountry/images/flags/ar.png and /dev/null differ diff --git a/plugins/UserCountry/images/flags/as.png b/plugins/UserCountry/images/flags/as.png deleted file mode 100644 index 774776150a..0000000000 Binary files a/plugins/UserCountry/images/flags/as.png and /dev/null differ diff --git a/plugins/UserCountry/images/flags/at.png b/plugins/UserCountry/images/flags/at.png deleted file mode 100644 index 700a656671..0000000000 Binary files a/plugins/UserCountry/images/flags/at.png and /dev/null differ diff --git a/plugins/UserCountry/images/flags/au.png b/plugins/UserCountry/images/flags/au.png deleted file mode 100644 index 709eac00de..0000000000 Binary files a/plugins/UserCountry/images/flags/au.png and /dev/null differ diff --git a/plugins/UserCountry/images/flags/aw.png b/plugins/UserCountry/images/flags/aw.png deleted file mode 100644 index 7b7d01c10f..0000000000 Binary files a/plugins/UserCountry/images/flags/aw.png and /dev/null differ diff --git a/plugins/UserCountry/images/flags/ax.png b/plugins/UserCountry/images/flags/ax.png deleted file mode 100644 index ff51987a16..0000000000 Binary files a/plugins/UserCountry/images/flags/ax.png and /dev/null differ diff --git a/plugins/UserCountry/images/flags/az.png b/plugins/UserCountry/images/flags/az.png deleted file mode 100644 index 2f189667f6..0000000000 Binary files a/plugins/UserCountry/images/flags/az.png and /dev/null differ diff --git a/plugins/UserCountry/images/flags/ba.png b/plugins/UserCountry/images/flags/ba.png deleted file mode 100644 index c996c301cb..0000000000 Binary files a/plugins/UserCountry/images/flags/ba.png and /dev/null differ diff --git a/plugins/UserCountry/images/flags/bb.png b/plugins/UserCountry/images/flags/bb.png deleted file mode 100644 index 50992817cf..0000000000 Binary files a/plugins/UserCountry/images/flags/bb.png and /dev/null differ diff --git a/plugins/UserCountry/images/flags/bd.png b/plugins/UserCountry/images/flags/bd.png deleted file mode 100644 index 685325475a..0000000000 Binary files a/plugins/UserCountry/images/flags/bd.png and /dev/null differ diff --git a/plugins/UserCountry/images/flags/be.png b/plugins/UserCountry/images/flags/be.png deleted file mode 100644 index 12c10f46e0..0000000000 Binary files a/plugins/UserCountry/images/flags/be.png and /dev/null differ diff --git a/plugins/UserCountry/images/flags/bf.png b/plugins/UserCountry/images/flags/bf.png deleted file mode 100644 index 22b42bcc98..0000000000 Binary files a/plugins/UserCountry/images/flags/bf.png and /dev/null differ diff --git a/plugins/UserCountry/images/flags/bg.png b/plugins/UserCountry/images/flags/bg.png deleted file mode 100644 index 41f34d8562..0000000000 Binary files a/plugins/UserCountry/images/flags/bg.png and /dev/null differ diff --git a/plugins/UserCountry/images/flags/bh.png b/plugins/UserCountry/images/flags/bh.png deleted file mode 100644 index 32ca603f30..0000000000 Binary files a/plugins/UserCountry/images/flags/bh.png and /dev/null differ diff --git a/plugins/UserCountry/images/flags/bi.png b/plugins/UserCountry/images/flags/bi.png deleted file mode 100644 index 1f03e129ad..0000000000 Binary files a/plugins/UserCountry/images/flags/bi.png and /dev/null differ diff --git a/plugins/UserCountry/images/flags/bj.png b/plugins/UserCountry/images/flags/bj.png deleted file mode 100644 index 53d4eb1e99..0000000000 Binary files a/plugins/UserCountry/images/flags/bj.png and /dev/null differ diff --git a/plugins/UserCountry/images/flags/bl.png b/plugins/UserCountry/images/flags/bl.png deleted file mode 100644 index 744ede391d..0000000000 Binary files a/plugins/UserCountry/images/flags/bl.png and /dev/null differ diff --git a/plugins/UserCountry/images/flags/bm.png b/plugins/UserCountry/images/flags/bm.png deleted file mode 100644 index 3cb8803156..0000000000 Binary files a/plugins/UserCountry/images/flags/bm.png and /dev/null differ diff --git a/plugins/UserCountry/images/flags/bn.png b/plugins/UserCountry/images/flags/bn.png deleted file mode 100644 index 9aafbb389c..0000000000 Binary files a/plugins/UserCountry/images/flags/bn.png and /dev/null differ diff --git a/plugins/UserCountry/images/flags/bo.png b/plugins/UserCountry/images/flags/bo.png deleted file mode 100644 index 46b519eae6..0000000000 Binary files a/plugins/UserCountry/images/flags/bo.png and /dev/null differ diff --git a/plugins/UserCountry/images/flags/bq.png b/plugins/UserCountry/images/flags/bq.png deleted file mode 100644 index 77f75f6ffa..0000000000 Binary files a/plugins/UserCountry/images/flags/bq.png and /dev/null differ diff --git a/plugins/UserCountry/images/flags/br.png b/plugins/UserCountry/images/flags/br.png deleted file mode 100644 index 5cdff06a4a..0000000000 Binary files a/plugins/UserCountry/images/flags/br.png and /dev/null differ diff --git a/plugins/UserCountry/images/flags/bs.png b/plugins/UserCountry/images/flags/bs.png deleted file mode 100644 index bc5333e0b9..0000000000 Binary files a/plugins/UserCountry/images/flags/bs.png and /dev/null differ diff --git a/plugins/UserCountry/images/flags/bt.png b/plugins/UserCountry/images/flags/bt.png deleted file mode 100644 index 0abb9130c7..0000000000 Binary files a/plugins/UserCountry/images/flags/bt.png and /dev/null differ diff --git a/plugins/UserCountry/images/flags/bu.png b/plugins/UserCountry/images/flags/bu.png deleted file mode 100644 index d96c2f30f7..0000000000 Binary files a/plugins/UserCountry/images/flags/bu.png and /dev/null differ diff --git a/plugins/UserCountry/images/flags/bv.png b/plugins/UserCountry/images/flags/bv.png deleted file mode 100644 index 74264c5866..0000000000 Binary files a/plugins/UserCountry/images/flags/bv.png and /dev/null differ diff --git a/plugins/UserCountry/images/flags/bw.png b/plugins/UserCountry/images/flags/bw.png deleted file mode 100644 index 463a97775a..0000000000 Binary files a/plugins/UserCountry/images/flags/bw.png and /dev/null differ diff --git a/plugins/UserCountry/images/flags/by.png b/plugins/UserCountry/images/flags/by.png deleted file mode 100644 index 81c5086ca6..0000000000 Binary files a/plugins/UserCountry/images/flags/by.png and /dev/null differ diff --git a/plugins/UserCountry/images/flags/bz.png b/plugins/UserCountry/images/flags/bz.png deleted file mode 100644 index f653173d4f..0000000000 Binary files a/plugins/UserCountry/images/flags/bz.png and /dev/null differ diff --git a/plugins/UserCountry/images/flags/ca.png b/plugins/UserCountry/images/flags/ca.png deleted file mode 100644 index b7c48f6341..0000000000 Binary files a/plugins/UserCountry/images/flags/ca.png and /dev/null differ diff --git a/plugins/UserCountry/images/flags/cat.png b/plugins/UserCountry/images/flags/cat.png deleted file mode 100644 index 58faea35b8..0000000000 Binary files a/plugins/UserCountry/images/flags/cat.png and /dev/null differ diff --git a/plugins/UserCountry/images/flags/cc.png b/plugins/UserCountry/images/flags/cc.png deleted file mode 100644 index 0791bad575..0000000000 Binary files a/plugins/UserCountry/images/flags/cc.png and /dev/null differ diff --git a/plugins/UserCountry/images/flags/cd.png b/plugins/UserCountry/images/flags/cd.png deleted file mode 100644 index 6cdfe5c08b..0000000000 Binary files a/plugins/UserCountry/images/flags/cd.png and /dev/null differ diff --git a/plugins/UserCountry/images/flags/cf.png b/plugins/UserCountry/images/flags/cf.png deleted file mode 100644 index d932c21016..0000000000 Binary files a/plugins/UserCountry/images/flags/cf.png and /dev/null differ diff --git a/plugins/UserCountry/images/flags/cg.png b/plugins/UserCountry/images/flags/cg.png deleted file mode 100644 index 0811ccce06..0000000000 Binary files a/plugins/UserCountry/images/flags/cg.png and /dev/null differ diff --git a/plugins/UserCountry/images/flags/ch.png b/plugins/UserCountry/images/flags/ch.png deleted file mode 100644 index 6f6723fb89..0000000000 Binary files a/plugins/UserCountry/images/flags/ch.png and /dev/null differ diff --git a/plugins/UserCountry/images/flags/ci.png b/plugins/UserCountry/images/flags/ci.png deleted file mode 100644 index b0d78c7ec6..0000000000 Binary files a/plugins/UserCountry/images/flags/ci.png and /dev/null differ diff --git a/plugins/UserCountry/images/flags/ck.png b/plugins/UserCountry/images/flags/ck.png deleted file mode 100644 index 99efe50044..0000000000 Binary files a/plugins/UserCountry/images/flags/ck.png and /dev/null differ diff --git a/plugins/UserCountry/images/flags/cl.png b/plugins/UserCountry/images/flags/cl.png deleted file mode 100644 index 74a69dc8e8..0000000000 Binary files a/plugins/UserCountry/images/flags/cl.png and /dev/null differ diff --git a/plugins/UserCountry/images/flags/cm.png b/plugins/UserCountry/images/flags/cm.png deleted file mode 100644 index 65d3827a46..0000000000 Binary files a/plugins/UserCountry/images/flags/cm.png and /dev/null differ diff --git a/plugins/UserCountry/images/flags/cn.png b/plugins/UserCountry/images/flags/cn.png deleted file mode 100644 index 9f1b310908..0000000000 Binary files a/plugins/UserCountry/images/flags/cn.png and /dev/null differ diff --git a/plugins/UserCountry/images/flags/co.png b/plugins/UserCountry/images/flags/co.png deleted file mode 100644 index eeb10fd86a..0000000000 Binary files a/plugins/UserCountry/images/flags/co.png and /dev/null differ diff --git a/plugins/UserCountry/images/flags/cp.png b/plugins/UserCountry/images/flags/cp.png deleted file mode 100644 index 744ede391d..0000000000 Binary files a/plugins/UserCountry/images/flags/cp.png and /dev/null differ diff --git a/plugins/UserCountry/images/flags/cr.png b/plugins/UserCountry/images/flags/cr.png deleted file mode 100644 index 413797bfe2..0000000000 Binary files a/plugins/UserCountry/images/flags/cr.png and /dev/null differ diff --git a/plugins/UserCountry/images/flags/cs.png b/plugins/UserCountry/images/flags/cs.png deleted file mode 100644 index 0e0fb6deba..0000000000 Binary files a/plugins/UserCountry/images/flags/cs.png and /dev/null differ diff --git a/plugins/UserCountry/images/flags/cu.png b/plugins/UserCountry/images/flags/cu.png deleted file mode 100644 index 0303459ddd..0000000000 Binary files a/plugins/UserCountry/images/flags/cu.png and /dev/null differ diff --git a/plugins/UserCountry/images/flags/cv.png b/plugins/UserCountry/images/flags/cv.png deleted file mode 100644 index 7a1f79755d..0000000000 Binary files a/plugins/UserCountry/images/flags/cv.png and /dev/null differ diff --git a/plugins/UserCountry/images/flags/cw.png b/plugins/UserCountry/images/flags/cw.png deleted file mode 100644 index a6d5f2834b..0000000000 Binary files a/plugins/UserCountry/images/flags/cw.png and /dev/null differ diff --git a/plugins/UserCountry/images/flags/cx.png b/plugins/UserCountry/images/flags/cx.png deleted file mode 100644 index 8acecd6ec6..0000000000 Binary files a/plugins/UserCountry/images/flags/cx.png and /dev/null differ diff --git a/plugins/UserCountry/images/flags/cy.png b/plugins/UserCountry/images/flags/cy.png deleted file mode 100644 index 9c2de21570..0000000000 Binary files a/plugins/UserCountry/images/flags/cy.png and /dev/null differ diff --git a/plugins/UserCountry/images/flags/cz.png b/plugins/UserCountry/images/flags/cz.png deleted file mode 100644 index 69ea675978..0000000000 Binary files a/plugins/UserCountry/images/flags/cz.png and /dev/null differ diff --git a/plugins/UserCountry/images/flags/de.png b/plugins/UserCountry/images/flags/de.png deleted file mode 100644 index 2df162b4af..0000000000 Binary files a/plugins/UserCountry/images/flags/de.png and /dev/null differ diff --git a/plugins/UserCountry/images/flags/dg.png b/plugins/UserCountry/images/flags/dg.png deleted file mode 100644 index 3e74b6a316..0000000000 Binary files a/plugins/UserCountry/images/flags/dg.png and /dev/null differ diff --git a/plugins/UserCountry/images/flags/dj.png b/plugins/UserCountry/images/flags/dj.png deleted file mode 100644 index 3fe7b82cf6..0000000000 Binary files a/plugins/UserCountry/images/flags/dj.png and /dev/null differ diff --git a/plugins/UserCountry/images/flags/dk.png b/plugins/UserCountry/images/flags/dk.png deleted file mode 100644 index 622cebd2ce..0000000000 Binary files a/plugins/UserCountry/images/flags/dk.png and /dev/null differ diff --git a/plugins/UserCountry/images/flags/dm.png b/plugins/UserCountry/images/flags/dm.png deleted file mode 100644 index c49785d5ba..0000000000 Binary files a/plugins/UserCountry/images/flags/dm.png and /dev/null differ diff --git a/plugins/UserCountry/images/flags/do.png b/plugins/UserCountry/images/flags/do.png deleted file mode 100644 index 46230992f8..0000000000 Binary files a/plugins/UserCountry/images/flags/do.png and /dev/null differ diff --git a/plugins/UserCountry/images/flags/dz.png b/plugins/UserCountry/images/flags/dz.png deleted file mode 100644 index 144fe154e2..0000000000 Binary files a/plugins/UserCountry/images/flags/dz.png and /dev/null differ diff --git a/plugins/UserCountry/images/flags/ea.png b/plugins/UserCountry/images/flags/ea.png deleted file mode 100644 index cfd22a445c..0000000000 Binary files a/plugins/UserCountry/images/flags/ea.png and /dev/null differ diff --git a/plugins/UserCountry/images/flags/ec.png b/plugins/UserCountry/images/flags/ec.png deleted file mode 100644 index 4ca13865ff..0000000000 Binary files a/plugins/UserCountry/images/flags/ec.png and /dev/null differ diff --git a/plugins/UserCountry/images/flags/ee.png b/plugins/UserCountry/images/flags/ee.png deleted file mode 100644 index 17393b8b00..0000000000 Binary files a/plugins/UserCountry/images/flags/ee.png and /dev/null differ diff --git a/plugins/UserCountry/images/flags/eg.png b/plugins/UserCountry/images/flags/eg.png deleted file mode 100644 index a7131a3a78..0000000000 Binary files a/plugins/UserCountry/images/flags/eg.png and /dev/null differ diff --git a/plugins/UserCountry/images/flags/eh.png b/plugins/UserCountry/images/flags/eh.png deleted file mode 100644 index 89fe31a0a9..0000000000 Binary files a/plugins/UserCountry/images/flags/eh.png and /dev/null differ diff --git a/plugins/UserCountry/images/flags/er.png b/plugins/UserCountry/images/flags/er.png deleted file mode 100644 index 2dfe8106b5..0000000000 Binary files a/plugins/UserCountry/images/flags/er.png and /dev/null differ diff --git a/plugins/UserCountry/images/flags/es.png b/plugins/UserCountry/images/flags/es.png deleted file mode 100644 index cfd22a445c..0000000000 Binary files a/plugins/UserCountry/images/flags/es.png and /dev/null differ diff --git a/plugins/UserCountry/images/flags/et.png b/plugins/UserCountry/images/flags/et.png deleted file mode 100644 index 11f79b002a..0000000000 Binary files a/plugins/UserCountry/images/flags/et.png and /dev/null differ diff --git a/plugins/UserCountry/images/flags/eu.png b/plugins/UserCountry/images/flags/eu.png deleted file mode 100644 index 8f5a3eb31c..0000000000 Binary files a/plugins/UserCountry/images/flags/eu.png and /dev/null differ diff --git a/plugins/UserCountry/images/flags/fi.png b/plugins/UserCountry/images/flags/fi.png deleted file mode 100644 index f3b1058cd4..0000000000 Binary files a/plugins/UserCountry/images/flags/fi.png and /dev/null differ diff --git a/plugins/UserCountry/images/flags/fj.png b/plugins/UserCountry/images/flags/fj.png deleted file mode 100644 index 903f680324..0000000000 Binary files a/plugins/UserCountry/images/flags/fj.png and /dev/null differ diff --git a/plugins/UserCountry/images/flags/fk.png b/plugins/UserCountry/images/flags/fk.png deleted file mode 100644 index 5adec9e3e2..0000000000 Binary files a/plugins/UserCountry/images/flags/fk.png and /dev/null differ diff --git a/plugins/UserCountry/images/flags/fm.png b/plugins/UserCountry/images/flags/fm.png deleted file mode 100644 index 2e2a7a96f0..0000000000 Binary files a/plugins/UserCountry/images/flags/fm.png and /dev/null differ diff --git a/plugins/UserCountry/images/flags/fo.png b/plugins/UserCountry/images/flags/fo.png deleted file mode 100644 index 39d2040bc6..0000000000 Binary files a/plugins/UserCountry/images/flags/fo.png and /dev/null differ diff --git a/plugins/UserCountry/images/flags/fr.png b/plugins/UserCountry/images/flags/fr.png deleted file mode 100644 index 744ede391d..0000000000 Binary files a/plugins/UserCountry/images/flags/fr.png and /dev/null differ diff --git a/plugins/UserCountry/images/flags/fx.png b/plugins/UserCountry/images/flags/fx.png deleted file mode 100644 index 744ede391d..0000000000 Binary files a/plugins/UserCountry/images/flags/fx.png and /dev/null differ diff --git a/plugins/UserCountry/images/flags/ga.png b/plugins/UserCountry/images/flags/ga.png deleted file mode 100644 index b6ca79e3bc..0000000000 Binary files a/plugins/UserCountry/images/flags/ga.png and /dev/null differ diff --git a/plugins/UserCountry/images/flags/gb.png b/plugins/UserCountry/images/flags/gb.png deleted file mode 100644 index 405e897c52..0000000000 Binary files a/plugins/UserCountry/images/flags/gb.png and /dev/null differ diff --git a/plugins/UserCountry/images/flags/gd.png b/plugins/UserCountry/images/flags/gd.png deleted file mode 100644 index 9b077bb889..0000000000 Binary files a/plugins/UserCountry/images/flags/gd.png and /dev/null differ diff --git a/plugins/UserCountry/images/flags/ge.png b/plugins/UserCountry/images/flags/ge.png deleted file mode 100644 index a700789b0b..0000000000 Binary files a/plugins/UserCountry/images/flags/ge.png and /dev/null differ diff --git a/plugins/UserCountry/images/flags/gf.png b/plugins/UserCountry/images/flags/gf.png deleted file mode 100644 index b3e22fb218..0000000000 Binary files a/plugins/UserCountry/images/flags/gf.png and /dev/null differ diff --git a/plugins/UserCountry/images/flags/gg.png b/plugins/UserCountry/images/flags/gg.png deleted file mode 100644 index 479141192e..0000000000 Binary files a/plugins/UserCountry/images/flags/gg.png and /dev/null differ diff --git a/plugins/UserCountry/images/flags/gh.png b/plugins/UserCountry/images/flags/gh.png deleted file mode 100644 index 952b1620aa..0000000000 Binary files a/plugins/UserCountry/images/flags/gh.png and /dev/null differ diff --git a/plugins/UserCountry/images/flags/gi.png b/plugins/UserCountry/images/flags/gi.png deleted file mode 100644 index f366599da8..0000000000 Binary files a/plugins/UserCountry/images/flags/gi.png and /dev/null differ diff --git a/plugins/UserCountry/images/flags/gl.png b/plugins/UserCountry/images/flags/gl.png deleted file mode 100644 index f22289be9d..0000000000 Binary files a/plugins/UserCountry/images/flags/gl.png and /dev/null differ diff --git a/plugins/UserCountry/images/flags/gm.png b/plugins/UserCountry/images/flags/gm.png deleted file mode 100644 index feed27f5c5..0000000000 Binary files a/plugins/UserCountry/images/flags/gm.png and /dev/null differ diff --git a/plugins/UserCountry/images/flags/gn.png b/plugins/UserCountry/images/flags/gn.png deleted file mode 100644 index 3efeaa534a..0000000000 Binary files a/plugins/UserCountry/images/flags/gn.png and /dev/null differ diff --git a/plugins/UserCountry/images/flags/gp.png b/plugins/UserCountry/images/flags/gp.png deleted file mode 100644 index 160dae80c0..0000000000 Binary files a/plugins/UserCountry/images/flags/gp.png and /dev/null differ diff --git a/plugins/UserCountry/images/flags/gq.png b/plugins/UserCountry/images/flags/gq.png deleted file mode 100644 index cad564ceb4..0000000000 Binary files a/plugins/UserCountry/images/flags/gq.png and /dev/null differ diff --git a/plugins/UserCountry/images/flags/gr.png b/plugins/UserCountry/images/flags/gr.png deleted file mode 100644 index dde5b025b7..0000000000 Binary files a/plugins/UserCountry/images/flags/gr.png and /dev/null differ diff --git a/plugins/UserCountry/images/flags/gs.png b/plugins/UserCountry/images/flags/gs.png deleted file mode 100644 index e37521f63b..0000000000 Binary files a/plugins/UserCountry/images/flags/gs.png and /dev/null differ diff --git a/plugins/UserCountry/images/flags/gt.png b/plugins/UserCountry/images/flags/gt.png deleted file mode 100644 index 75e76cddb9..0000000000 Binary files a/plugins/UserCountry/images/flags/gt.png and /dev/null differ diff --git a/plugins/UserCountry/images/flags/gu.png b/plugins/UserCountry/images/flags/gu.png deleted file mode 100644 index 4f034bcb29..0000000000 Binary files a/plugins/UserCountry/images/flags/gu.png and /dev/null differ diff --git a/plugins/UserCountry/images/flags/gw.png b/plugins/UserCountry/images/flags/gw.png deleted file mode 100644 index 2ad970b20b..0000000000 Binary files a/plugins/UserCountry/images/flags/gw.png and /dev/null differ diff --git a/plugins/UserCountry/images/flags/gy.png b/plugins/UserCountry/images/flags/gy.png deleted file mode 100644 index 889b5d786e..0000000000 Binary files a/plugins/UserCountry/images/flags/gy.png and /dev/null differ diff --git a/plugins/UserCountry/images/flags/hk.png b/plugins/UserCountry/images/flags/hk.png deleted file mode 100644 index 5a3663a87c..0000000000 Binary files a/plugins/UserCountry/images/flags/hk.png and /dev/null differ diff --git a/plugins/UserCountry/images/flags/hm.png b/plugins/UserCountry/images/flags/hm.png deleted file mode 100644 index 709eac00de..0000000000 Binary files a/plugins/UserCountry/images/flags/hm.png and /dev/null differ diff --git a/plugins/UserCountry/images/flags/hn.png b/plugins/UserCountry/images/flags/hn.png deleted file mode 100644 index d29296df9c..0000000000 Binary files a/plugins/UserCountry/images/flags/hn.png and /dev/null differ diff --git a/plugins/UserCountry/images/flags/hr.png b/plugins/UserCountry/images/flags/hr.png deleted file mode 100644 index 20c66c3a60..0000000000 Binary files a/plugins/UserCountry/images/flags/hr.png and /dev/null differ diff --git a/plugins/UserCountry/images/flags/ht.png b/plugins/UserCountry/images/flags/ht.png deleted file mode 100644 index 7aef235b83..0000000000 Binary files a/plugins/UserCountry/images/flags/ht.png and /dev/null differ diff --git a/plugins/UserCountry/images/flags/hu.png b/plugins/UserCountry/images/flags/hu.png deleted file mode 100644 index 2d01818314..0000000000 Binary files a/plugins/UserCountry/images/flags/hu.png and /dev/null differ diff --git a/plugins/UserCountry/images/flags/ic.png b/plugins/UserCountry/images/flags/ic.png deleted file mode 100644 index 3e48fe66e3..0000000000 Binary files a/plugins/UserCountry/images/flags/ic.png and /dev/null differ diff --git a/plugins/UserCountry/images/flags/id.png b/plugins/UserCountry/images/flags/id.png deleted file mode 100644 index 2f67d57320..0000000000 Binary files a/plugins/UserCountry/images/flags/id.png and /dev/null differ diff --git a/plugins/UserCountry/images/flags/ie.png b/plugins/UserCountry/images/flags/ie.png deleted file mode 100644 index 9a799f8640..0000000000 Binary files a/plugins/UserCountry/images/flags/ie.png and /dev/null differ diff --git a/plugins/UserCountry/images/flags/il.png b/plugins/UserCountry/images/flags/il.png deleted file mode 100644 index 6512bedf75..0000000000 Binary files a/plugins/UserCountry/images/flags/il.png and /dev/null differ diff --git a/plugins/UserCountry/images/flags/im.png b/plugins/UserCountry/images/flags/im.png deleted file mode 100644 index 8df02545dc..0000000000 Binary files a/plugins/UserCountry/images/flags/im.png and /dev/null differ diff --git a/plugins/UserCountry/images/flags/in.png b/plugins/UserCountry/images/flags/in.png deleted file mode 100644 index 351c6a51d9..0000000000 Binary files a/plugins/UserCountry/images/flags/in.png and /dev/null differ diff --git a/plugins/UserCountry/images/flags/io.png b/plugins/UserCountry/images/flags/io.png deleted file mode 100644 index d87ed5f932..0000000000 Binary files a/plugins/UserCountry/images/flags/io.png and /dev/null differ diff --git a/plugins/UserCountry/images/flags/iq.png b/plugins/UserCountry/images/flags/iq.png deleted file mode 100644 index 4eb6b878bd..0000000000 Binary files a/plugins/UserCountry/images/flags/iq.png and /dev/null differ diff --git a/plugins/UserCountry/images/flags/ir.png b/plugins/UserCountry/images/flags/ir.png deleted file mode 100644 index f60fb8ac2b..0000000000 Binary files a/plugins/UserCountry/images/flags/ir.png and /dev/null differ diff --git a/plugins/UserCountry/images/flags/is.png b/plugins/UserCountry/images/flags/is.png deleted file mode 100644 index a4f546273d..0000000000 Binary files a/plugins/UserCountry/images/flags/is.png and /dev/null differ diff --git a/plugins/UserCountry/images/flags/it.png b/plugins/UserCountry/images/flags/it.png deleted file mode 100644 index 534fd5e657..0000000000 Binary files a/plugins/UserCountry/images/flags/it.png and /dev/null differ diff --git a/plugins/UserCountry/images/flags/je.png b/plugins/UserCountry/images/flags/je.png deleted file mode 100644 index 76758f4cd3..0000000000 Binary files a/plugins/UserCountry/images/flags/je.png and /dev/null differ diff --git a/plugins/UserCountry/images/flags/jm.png b/plugins/UserCountry/images/flags/jm.png deleted file mode 100644 index f4012fa0dc..0000000000 Binary files a/plugins/UserCountry/images/flags/jm.png and /dev/null differ diff --git a/plugins/UserCountry/images/flags/jo.png b/plugins/UserCountry/images/flags/jo.png deleted file mode 100644 index f7beba7ead..0000000000 Binary files a/plugins/UserCountry/images/flags/jo.png and /dev/null differ diff --git a/plugins/UserCountry/images/flags/jp.png b/plugins/UserCountry/images/flags/jp.png deleted file mode 100644 index 0dc03c944b..0000000000 Binary files a/plugins/UserCountry/images/flags/jp.png and /dev/null differ diff --git a/plugins/UserCountry/images/flags/ke.png b/plugins/UserCountry/images/flags/ke.png deleted file mode 100644 index 5842ce3c42..0000000000 Binary files a/plugins/UserCountry/images/flags/ke.png and /dev/null differ diff --git a/plugins/UserCountry/images/flags/kg.png b/plugins/UserCountry/images/flags/kg.png deleted file mode 100644 index 766bc89816..0000000000 Binary files a/plugins/UserCountry/images/flags/kg.png and /dev/null differ diff --git a/plugins/UserCountry/images/flags/kh.png b/plugins/UserCountry/images/flags/kh.png deleted file mode 100644 index c2d9aea1ce..0000000000 Binary files a/plugins/UserCountry/images/flags/kh.png and /dev/null differ diff --git a/plugins/UserCountry/images/flags/ki.png b/plugins/UserCountry/images/flags/ki.png deleted file mode 100644 index 89bc45b7bd..0000000000 Binary files a/plugins/UserCountry/images/flags/ki.png and /dev/null differ diff --git a/plugins/UserCountry/images/flags/km.png b/plugins/UserCountry/images/flags/km.png deleted file mode 100644 index adfe5fb1c3..0000000000 Binary files a/plugins/UserCountry/images/flags/km.png and /dev/null differ diff --git a/plugins/UserCountry/images/flags/kn.png b/plugins/UserCountry/images/flags/kn.png deleted file mode 100644 index 4460ff6053..0000000000 Binary files a/plugins/UserCountry/images/flags/kn.png and /dev/null differ diff --git a/plugins/UserCountry/images/flags/kp.png b/plugins/UserCountry/images/flags/kp.png deleted file mode 100644 index 134a9f1adf..0000000000 Binary files a/plugins/UserCountry/images/flags/kp.png and /dev/null differ diff --git a/plugins/UserCountry/images/flags/kr.png b/plugins/UserCountry/images/flags/kr.png deleted file mode 100644 index 09ad2c39b5..0000000000 Binary files a/plugins/UserCountry/images/flags/kr.png and /dev/null differ diff --git a/plugins/UserCountry/images/flags/kw.png b/plugins/UserCountry/images/flags/kw.png deleted file mode 100644 index 2742d890f3..0000000000 Binary files a/plugins/UserCountry/images/flags/kw.png and /dev/null differ diff --git a/plugins/UserCountry/images/flags/ky.png b/plugins/UserCountry/images/flags/ky.png deleted file mode 100644 index 3f0de844a1..0000000000 Binary files a/plugins/UserCountry/images/flags/ky.png and /dev/null differ diff --git a/plugins/UserCountry/images/flags/kz.png b/plugins/UserCountry/images/flags/kz.png deleted file mode 100644 index 37a7ddf08e..0000000000 Binary files a/plugins/UserCountry/images/flags/kz.png and /dev/null differ diff --git a/plugins/UserCountry/images/flags/la.png b/plugins/UserCountry/images/flags/la.png deleted file mode 100644 index 7d5b624359..0000000000 Binary files a/plugins/UserCountry/images/flags/la.png and /dev/null differ diff --git a/plugins/UserCountry/images/flags/lb.png b/plugins/UserCountry/images/flags/lb.png deleted file mode 100644 index 8affe4a819..0000000000 Binary files a/plugins/UserCountry/images/flags/lb.png and /dev/null differ diff --git a/plugins/UserCountry/images/flags/lc.png b/plugins/UserCountry/images/flags/lc.png deleted file mode 100644 index 2c9870761b..0000000000 Binary files a/plugins/UserCountry/images/flags/lc.png and /dev/null differ diff --git a/plugins/UserCountry/images/flags/li.png b/plugins/UserCountry/images/flags/li.png deleted file mode 100644 index 0d7ad9717c..0000000000 Binary files a/plugins/UserCountry/images/flags/li.png and /dev/null differ diff --git a/plugins/UserCountry/images/flags/lk.png b/plugins/UserCountry/images/flags/lk.png deleted file mode 100644 index 0d14120392..0000000000 Binary files a/plugins/UserCountry/images/flags/lk.png and /dev/null differ diff --git a/plugins/UserCountry/images/flags/lr.png b/plugins/UserCountry/images/flags/lr.png deleted file mode 100644 index 2376d28817..0000000000 Binary files a/plugins/UserCountry/images/flags/lr.png and /dev/null differ diff --git a/plugins/UserCountry/images/flags/ls.png b/plugins/UserCountry/images/flags/ls.png deleted file mode 100644 index dbc9ccb644..0000000000 Binary files a/plugins/UserCountry/images/flags/ls.png and /dev/null differ diff --git a/plugins/UserCountry/images/flags/lt.png b/plugins/UserCountry/images/flags/lt.png deleted file mode 100644 index ace453f7f2..0000000000 Binary files a/plugins/UserCountry/images/flags/lt.png and /dev/null differ diff --git a/plugins/UserCountry/images/flags/lu.png b/plugins/UserCountry/images/flags/lu.png deleted file mode 100644 index 4a9e3d5d9a..0000000000 Binary files a/plugins/UserCountry/images/flags/lu.png and /dev/null differ diff --git a/plugins/UserCountry/images/flags/lv.png b/plugins/UserCountry/images/flags/lv.png deleted file mode 100644 index d9236f966b..0000000000 Binary files a/plugins/UserCountry/images/flags/lv.png and /dev/null differ diff --git a/plugins/UserCountry/images/flags/ly.png b/plugins/UserCountry/images/flags/ly.png deleted file mode 100644 index b5bd4c1607..0000000000 Binary files a/plugins/UserCountry/images/flags/ly.png and /dev/null differ diff --git a/plugins/UserCountry/images/flags/ma.png b/plugins/UserCountry/images/flags/ma.png deleted file mode 100644 index 44f2961c1b..0000000000 Binary files a/plugins/UserCountry/images/flags/ma.png and /dev/null differ diff --git a/plugins/UserCountry/images/flags/mc.png b/plugins/UserCountry/images/flags/mc.png deleted file mode 100644 index ecc5edb750..0000000000 Binary files a/plugins/UserCountry/images/flags/mc.png and /dev/null differ diff --git a/plugins/UserCountry/images/flags/md.png b/plugins/UserCountry/images/flags/md.png deleted file mode 100644 index 80b6bf63af..0000000000 Binary files a/plugins/UserCountry/images/flags/md.png and /dev/null differ diff --git a/plugins/UserCountry/images/flags/me.png b/plugins/UserCountry/images/flags/me.png deleted file mode 100644 index 0a3ee99b21..0000000000 Binary files a/plugins/UserCountry/images/flags/me.png and /dev/null differ diff --git a/plugins/UserCountry/images/flags/mf.png b/plugins/UserCountry/images/flags/mf.png deleted file mode 100644 index 744ede391d..0000000000 Binary files a/plugins/UserCountry/images/flags/mf.png and /dev/null differ diff --git a/plugins/UserCountry/images/flags/mg.png b/plugins/UserCountry/images/flags/mg.png deleted file mode 100644 index b8740f880c..0000000000 Binary files a/plugins/UserCountry/images/flags/mg.png and /dev/null differ diff --git a/plugins/UserCountry/images/flags/mh.png b/plugins/UserCountry/images/flags/mh.png deleted file mode 100644 index 9cf98c1546..0000000000 Binary files a/plugins/UserCountry/images/flags/mh.png and /dev/null differ diff --git a/plugins/UserCountry/images/flags/mk.png b/plugins/UserCountry/images/flags/mk.png deleted file mode 100644 index ee987490be..0000000000 Binary files a/plugins/UserCountry/images/flags/mk.png and /dev/null differ diff --git a/plugins/UserCountry/images/flags/ml.png b/plugins/UserCountry/images/flags/ml.png deleted file mode 100644 index a28459d13f..0000000000 Binary files a/plugins/UserCountry/images/flags/ml.png and /dev/null differ diff --git a/plugins/UserCountry/images/flags/mm.png b/plugins/UserCountry/images/flags/mm.png deleted file mode 100644 index 772f931f0b..0000000000 Binary files a/plugins/UserCountry/images/flags/mm.png and /dev/null differ diff --git a/plugins/UserCountry/images/flags/mn.png b/plugins/UserCountry/images/flags/mn.png deleted file mode 100644 index cc6c412171..0000000000 Binary files a/plugins/UserCountry/images/flags/mn.png and /dev/null differ diff --git a/plugins/UserCountry/images/flags/mo.png b/plugins/UserCountry/images/flags/mo.png deleted file mode 100644 index fc49f581ee..0000000000 Binary files a/plugins/UserCountry/images/flags/mo.png and /dev/null differ diff --git a/plugins/UserCountry/images/flags/mp.png b/plugins/UserCountry/images/flags/mp.png deleted file mode 100644 index df0c4b8c18..0000000000 Binary files a/plugins/UserCountry/images/flags/mp.png and /dev/null differ diff --git a/plugins/UserCountry/images/flags/mq.png b/plugins/UserCountry/images/flags/mq.png deleted file mode 100644 index 6ebdb3ab6c..0000000000 Binary files a/plugins/UserCountry/images/flags/mq.png and /dev/null differ diff --git a/plugins/UserCountry/images/flags/mr.png b/plugins/UserCountry/images/flags/mr.png deleted file mode 100644 index 6700d1ce92..0000000000 Binary files a/plugins/UserCountry/images/flags/mr.png and /dev/null differ diff --git a/plugins/UserCountry/images/flags/ms.png b/plugins/UserCountry/images/flags/ms.png deleted file mode 100644 index aef23fc512..0000000000 Binary files a/plugins/UserCountry/images/flags/ms.png and /dev/null differ diff --git a/plugins/UserCountry/images/flags/mt.png b/plugins/UserCountry/images/flags/mt.png deleted file mode 100644 index 837261ebc2..0000000000 Binary files a/plugins/UserCountry/images/flags/mt.png and /dev/null differ diff --git a/plugins/UserCountry/images/flags/mu.png b/plugins/UserCountry/images/flags/mu.png deleted file mode 100644 index c1e8b909d3..0000000000 Binary files a/plugins/UserCountry/images/flags/mu.png and /dev/null differ diff --git a/plugins/UserCountry/images/flags/mv.png b/plugins/UserCountry/images/flags/mv.png deleted file mode 100644 index f03f90ac65..0000000000 Binary files a/plugins/UserCountry/images/flags/mv.png and /dev/null differ diff --git a/plugins/UserCountry/images/flags/mw.png b/plugins/UserCountry/images/flags/mw.png deleted file mode 100644 index 45ea61d87f..0000000000 Binary files a/plugins/UserCountry/images/flags/mw.png and /dev/null differ diff --git a/plugins/UserCountry/images/flags/mx.png b/plugins/UserCountry/images/flags/mx.png deleted file mode 100644 index c78ac89691..0000000000 Binary files a/plugins/UserCountry/images/flags/mx.png and /dev/null differ diff --git a/plugins/UserCountry/images/flags/my.png b/plugins/UserCountry/images/flags/my.png deleted file mode 100644 index d47867be7a..0000000000 Binary files a/plugins/UserCountry/images/flags/my.png and /dev/null differ diff --git a/plugins/UserCountry/images/flags/mz.png b/plugins/UserCountry/images/flags/mz.png deleted file mode 100644 index 464017e923..0000000000 Binary files a/plugins/UserCountry/images/flags/mz.png and /dev/null differ diff --git a/plugins/UserCountry/images/flags/na.png b/plugins/UserCountry/images/flags/na.png deleted file mode 100644 index d685c4973d..0000000000 Binary files a/plugins/UserCountry/images/flags/na.png and /dev/null differ diff --git a/plugins/UserCountry/images/flags/nc.png b/plugins/UserCountry/images/flags/nc.png deleted file mode 100644 index 88f4ea8559..0000000000 Binary files a/plugins/UserCountry/images/flags/nc.png and /dev/null differ diff --git a/plugins/UserCountry/images/flags/ne.png b/plugins/UserCountry/images/flags/ne.png deleted file mode 100644 index b5f3b8f06d..0000000000 Binary files a/plugins/UserCountry/images/flags/ne.png and /dev/null differ diff --git a/plugins/UserCountry/images/flags/nf.png b/plugins/UserCountry/images/flags/nf.png deleted file mode 100644 index b00b331fe3..0000000000 Binary files a/plugins/UserCountry/images/flags/nf.png and /dev/null differ diff --git a/plugins/UserCountry/images/flags/ng.png b/plugins/UserCountry/images/flags/ng.png deleted file mode 100644 index 6dcc973ed5..0000000000 Binary files a/plugins/UserCountry/images/flags/ng.png and /dev/null differ diff --git a/plugins/UserCountry/images/flags/ni.png b/plugins/UserCountry/images/flags/ni.png deleted file mode 100644 index 44d8a0d3bd..0000000000 Binary files a/plugins/UserCountry/images/flags/ni.png and /dev/null differ diff --git a/plugins/UserCountry/images/flags/nl.png b/plugins/UserCountry/images/flags/nl.png deleted file mode 100644 index 77f75f6ffa..0000000000 Binary files a/plugins/UserCountry/images/flags/nl.png and /dev/null differ diff --git a/plugins/UserCountry/images/flags/no.png b/plugins/UserCountry/images/flags/no.png deleted file mode 100644 index 74264c5866..0000000000 Binary files a/plugins/UserCountry/images/flags/no.png and /dev/null differ diff --git a/plugins/UserCountry/images/flags/np.png b/plugins/UserCountry/images/flags/np.png deleted file mode 100644 index 2afe8d7e5f..0000000000 Binary files a/plugins/UserCountry/images/flags/np.png and /dev/null differ diff --git a/plugins/UserCountry/images/flags/nr.png b/plugins/UserCountry/images/flags/nr.png deleted file mode 100644 index 211e42bb19..0000000000 Binary files a/plugins/UserCountry/images/flags/nr.png and /dev/null differ diff --git a/plugins/UserCountry/images/flags/nt.png b/plugins/UserCountry/images/flags/nt.png deleted file mode 100644 index b253914525..0000000000 Binary files a/plugins/UserCountry/images/flags/nt.png and /dev/null differ diff --git a/plugins/UserCountry/images/flags/nu.png b/plugins/UserCountry/images/flags/nu.png deleted file mode 100644 index b9f7f988f4..0000000000 Binary files a/plugins/UserCountry/images/flags/nu.png and /dev/null differ diff --git a/plugins/UserCountry/images/flags/nz.png b/plugins/UserCountry/images/flags/nz.png deleted file mode 100644 index be935de872..0000000000 Binary files a/plugins/UserCountry/images/flags/nz.png and /dev/null differ diff --git a/plugins/UserCountry/images/flags/o1.png b/plugins/UserCountry/images/flags/o1.png deleted file mode 100644 index da6e1bbe89..0000000000 Binary files a/plugins/UserCountry/images/flags/o1.png and /dev/null differ diff --git a/plugins/UserCountry/images/flags/om.png b/plugins/UserCountry/images/flags/om.png deleted file mode 100644 index ec95c5aeb9..0000000000 Binary files a/plugins/UserCountry/images/flags/om.png and /dev/null differ diff --git a/plugins/UserCountry/images/flags/pa.png b/plugins/UserCountry/images/flags/pa.png deleted file mode 100644 index a8a6ea5083..0000000000 Binary files a/plugins/UserCountry/images/flags/pa.png and /dev/null differ diff --git a/plugins/UserCountry/images/flags/pe.png b/plugins/UserCountry/images/flags/pe.png deleted file mode 100644 index 1cf08251f1..0000000000 Binary files a/plugins/UserCountry/images/flags/pe.png and /dev/null differ diff --git a/plugins/UserCountry/images/flags/pf.png b/plugins/UserCountry/images/flags/pf.png deleted file mode 100644 index 7e471d6438..0000000000 Binary files a/plugins/UserCountry/images/flags/pf.png and /dev/null differ diff --git a/plugins/UserCountry/images/flags/pg.png b/plugins/UserCountry/images/flags/pg.png deleted file mode 100644 index 87160a51ee..0000000000 Binary files a/plugins/UserCountry/images/flags/pg.png and /dev/null differ diff --git a/plugins/UserCountry/images/flags/ph.png b/plugins/UserCountry/images/flags/ph.png deleted file mode 100644 index 703dd735a5..0000000000 Binary files a/plugins/UserCountry/images/flags/ph.png and /dev/null differ diff --git a/plugins/UserCountry/images/flags/pk.png b/plugins/UserCountry/images/flags/pk.png deleted file mode 100644 index f20f3f6e2e..0000000000 Binary files a/plugins/UserCountry/images/flags/pk.png and /dev/null differ diff --git a/plugins/UserCountry/images/flags/pl.png b/plugins/UserCountry/images/flags/pl.png deleted file mode 100644 index f6997a2ca6..0000000000 Binary files a/plugins/UserCountry/images/flags/pl.png and /dev/null differ diff --git a/plugins/UserCountry/images/flags/pm.png b/plugins/UserCountry/images/flags/pm.png deleted file mode 100644 index 4aa799ba7b..0000000000 Binary files a/plugins/UserCountry/images/flags/pm.png and /dev/null differ diff --git a/plugins/UserCountry/images/flags/pn.png b/plugins/UserCountry/images/flags/pn.png deleted file mode 100644 index 6f62a64d65..0000000000 Binary files a/plugins/UserCountry/images/flags/pn.png and /dev/null differ diff --git a/plugins/UserCountry/images/flags/pr.png b/plugins/UserCountry/images/flags/pr.png deleted file mode 100644 index 4bf609fec4..0000000000 Binary files a/plugins/UserCountry/images/flags/pr.png and /dev/null differ diff --git a/plugins/UserCountry/images/flags/ps.png b/plugins/UserCountry/images/flags/ps.png deleted file mode 100644 index dd1d7821ec..0000000000 Binary files a/plugins/UserCountry/images/flags/ps.png and /dev/null differ diff --git a/plugins/UserCountry/images/flags/pt.png b/plugins/UserCountry/images/flags/pt.png deleted file mode 100644 index 67e4878e88..0000000000 Binary files a/plugins/UserCountry/images/flags/pt.png and /dev/null differ diff --git a/plugins/UserCountry/images/flags/pw.png b/plugins/UserCountry/images/flags/pw.png deleted file mode 100644 index 71fd0a48ca..0000000000 Binary files a/plugins/UserCountry/images/flags/pw.png and /dev/null differ diff --git a/plugins/UserCountry/images/flags/py.png b/plugins/UserCountry/images/flags/py.png deleted file mode 100644 index 182d9dc0a9..0000000000 Binary files a/plugins/UserCountry/images/flags/py.png and /dev/null differ diff --git a/plugins/UserCountry/images/flags/qa.png b/plugins/UserCountry/images/flags/qa.png deleted file mode 100644 index 86c39fadaa..0000000000 Binary files a/plugins/UserCountry/images/flags/qa.png and /dev/null differ diff --git a/plugins/UserCountry/images/flags/re.png b/plugins/UserCountry/images/flags/re.png deleted file mode 100644 index 744ede391d..0000000000 Binary files a/plugins/UserCountry/images/flags/re.png and /dev/null differ diff --git a/plugins/UserCountry/images/flags/ro.png b/plugins/UserCountry/images/flags/ro.png deleted file mode 100644 index 2535bc81f2..0000000000 Binary files a/plugins/UserCountry/images/flags/ro.png and /dev/null differ diff --git a/plugins/UserCountry/images/flags/rs.png b/plugins/UserCountry/images/flags/rs.png deleted file mode 100644 index 32f6cb945b..0000000000 Binary files a/plugins/UserCountry/images/flags/rs.png and /dev/null differ diff --git a/plugins/UserCountry/images/flags/ru.png b/plugins/UserCountry/images/flags/ru.png deleted file mode 100644 index 096b9c44e7..0000000000 Binary files a/plugins/UserCountry/images/flags/ru.png and /dev/null differ diff --git a/plugins/UserCountry/images/flags/rw.png b/plugins/UserCountry/images/flags/rw.png deleted file mode 100644 index f4b0136eae..0000000000 Binary files a/plugins/UserCountry/images/flags/rw.png and /dev/null differ diff --git a/plugins/UserCountry/images/flags/sa.png b/plugins/UserCountry/images/flags/sa.png deleted file mode 100644 index 03cecfb8c9..0000000000 Binary files a/plugins/UserCountry/images/flags/sa.png and /dev/null differ diff --git a/plugins/UserCountry/images/flags/sb.png b/plugins/UserCountry/images/flags/sb.png deleted file mode 100644 index 8af1fb9d2f..0000000000 Binary files a/plugins/UserCountry/images/flags/sb.png and /dev/null differ diff --git a/plugins/UserCountry/images/flags/sc.png b/plugins/UserCountry/images/flags/sc.png deleted file mode 100644 index fec2961dbb..0000000000 Binary files a/plugins/UserCountry/images/flags/sc.png and /dev/null differ diff --git a/plugins/UserCountry/images/flags/sd.png b/plugins/UserCountry/images/flags/sd.png deleted file mode 100644 index eba0a2079b..0000000000 Binary files a/plugins/UserCountry/images/flags/sd.png and /dev/null differ diff --git a/plugins/UserCountry/images/flags/se.png b/plugins/UserCountry/images/flags/se.png deleted file mode 100644 index e2b347c78b..0000000000 Binary files a/plugins/UserCountry/images/flags/se.png and /dev/null differ diff --git a/plugins/UserCountry/images/flags/sf.png b/plugins/UserCountry/images/flags/sf.png deleted file mode 100644 index f3b1058cd4..0000000000 Binary files a/plugins/UserCountry/images/flags/sf.png and /dev/null differ diff --git a/plugins/UserCountry/images/flags/sg.png b/plugins/UserCountry/images/flags/sg.png deleted file mode 100644 index 84172cae18..0000000000 Binary files a/plugins/UserCountry/images/flags/sg.png and /dev/null differ diff --git a/plugins/UserCountry/images/flags/sh.png b/plugins/UserCountry/images/flags/sh.png deleted file mode 100644 index 7e724d4781..0000000000 Binary files a/plugins/UserCountry/images/flags/sh.png and /dev/null differ diff --git a/plugins/UserCountry/images/flags/si.png b/plugins/UserCountry/images/flags/si.png deleted file mode 100644 index 266b9df29d..0000000000 Binary files a/plugins/UserCountry/images/flags/si.png and /dev/null differ diff --git a/plugins/UserCountry/images/flags/sj.png b/plugins/UserCountry/images/flags/sj.png deleted file mode 100644 index 74264c5866..0000000000 Binary files a/plugins/UserCountry/images/flags/sj.png and /dev/null differ diff --git a/plugins/UserCountry/images/flags/sk.png b/plugins/UserCountry/images/flags/sk.png deleted file mode 100644 index 53d286a6e1..0000000000 Binary files a/plugins/UserCountry/images/flags/sk.png and /dev/null differ diff --git a/plugins/UserCountry/images/flags/sl.png b/plugins/UserCountry/images/flags/sl.png deleted file mode 100644 index c59445bc58..0000000000 Binary files a/plugins/UserCountry/images/flags/sl.png and /dev/null differ diff --git a/plugins/UserCountry/images/flags/sm.png b/plugins/UserCountry/images/flags/sm.png deleted file mode 100644 index 65ceb3aa49..0000000000 Binary files a/plugins/UserCountry/images/flags/sm.png and /dev/null differ diff --git a/plugins/UserCountry/images/flags/sn.png b/plugins/UserCountry/images/flags/sn.png deleted file mode 100644 index 89961cb89b..0000000000 Binary files a/plugins/UserCountry/images/flags/sn.png and /dev/null differ diff --git a/plugins/UserCountry/images/flags/so.png b/plugins/UserCountry/images/flags/so.png deleted file mode 100644 index 00750dae44..0000000000 Binary files a/plugins/UserCountry/images/flags/so.png and /dev/null differ diff --git a/plugins/UserCountry/images/flags/sr.png b/plugins/UserCountry/images/flags/sr.png deleted file mode 100644 index 764f544694..0000000000 Binary files a/plugins/UserCountry/images/flags/sr.png and /dev/null differ diff --git a/plugins/UserCountry/images/flags/ss.png b/plugins/UserCountry/images/flags/ss.png deleted file mode 100644 index 84a52ca247..0000000000 Binary files a/plugins/UserCountry/images/flags/ss.png and /dev/null differ diff --git a/plugins/UserCountry/images/flags/st.png b/plugins/UserCountry/images/flags/st.png deleted file mode 100644 index dd62dce7ff..0000000000 Binary files a/plugins/UserCountry/images/flags/st.png and /dev/null differ diff --git a/plugins/UserCountry/images/flags/su.png b/plugins/UserCountry/images/flags/su.png deleted file mode 100644 index 3e1d87c962..0000000000 Binary files a/plugins/UserCountry/images/flags/su.png and /dev/null differ diff --git a/plugins/UserCountry/images/flags/sv.png b/plugins/UserCountry/images/flags/sv.png deleted file mode 100644 index 03ce5ec83c..0000000000 Binary files a/plugins/UserCountry/images/flags/sv.png and /dev/null differ diff --git a/plugins/UserCountry/images/flags/sx.png b/plugins/UserCountry/images/flags/sx.png deleted file mode 100644 index 229d4014ba..0000000000 Binary files a/plugins/UserCountry/images/flags/sx.png and /dev/null differ diff --git a/plugins/UserCountry/images/flags/sy.png b/plugins/UserCountry/images/flags/sy.png deleted file mode 100644 index 83de9ef018..0000000000 Binary files a/plugins/UserCountry/images/flags/sy.png and /dev/null differ diff --git a/plugins/UserCountry/images/flags/sz.png b/plugins/UserCountry/images/flags/sz.png deleted file mode 100644 index 6e40120260..0000000000 Binary files a/plugins/UserCountry/images/flags/sz.png and /dev/null differ diff --git a/plugins/UserCountry/images/flags/ta.png b/plugins/UserCountry/images/flags/ta.png deleted file mode 100644 index b0eaef6dc5..0000000000 Binary files a/plugins/UserCountry/images/flags/ta.png and /dev/null differ diff --git a/plugins/UserCountry/images/flags/tc.png b/plugins/UserCountry/images/flags/tc.png deleted file mode 100644 index 0c96ec08c8..0000000000 Binary files a/plugins/UserCountry/images/flags/tc.png and /dev/null differ diff --git a/plugins/UserCountry/images/flags/td.png b/plugins/UserCountry/images/flags/td.png deleted file mode 100644 index 6e2da09705..0000000000 Binary files a/plugins/UserCountry/images/flags/td.png and /dev/null differ diff --git a/plugins/UserCountry/images/flags/tf.png b/plugins/UserCountry/images/flags/tf.png deleted file mode 100644 index 3ed6bc60ad..0000000000 Binary files a/plugins/UserCountry/images/flags/tf.png and /dev/null differ diff --git a/plugins/UserCountry/images/flags/tg.png b/plugins/UserCountry/images/flags/tg.png deleted file mode 100644 index 2ab18d070a..0000000000 Binary files a/plugins/UserCountry/images/flags/tg.png and /dev/null differ diff --git a/plugins/UserCountry/images/flags/th.png b/plugins/UserCountry/images/flags/th.png deleted file mode 100644 index c1817ebc94..0000000000 Binary files a/plugins/UserCountry/images/flags/th.png and /dev/null differ diff --git a/plugins/UserCountry/images/flags/ti.png b/plugins/UserCountry/images/flags/ti.png deleted file mode 100644 index 0253120670..0000000000 Binary files a/plugins/UserCountry/images/flags/ti.png and /dev/null differ diff --git a/plugins/UserCountry/images/flags/tj.png b/plugins/UserCountry/images/flags/tj.png deleted file mode 100644 index e1ddbb0889..0000000000 Binary files a/plugins/UserCountry/images/flags/tj.png and /dev/null differ diff --git a/plugins/UserCountry/images/flags/tk.png b/plugins/UserCountry/images/flags/tk.png deleted file mode 100644 index 107ce1494f..0000000000 Binary files a/plugins/UserCountry/images/flags/tk.png and /dev/null differ diff --git a/plugins/UserCountry/images/flags/tl.png b/plugins/UserCountry/images/flags/tl.png deleted file mode 100644 index 0fa1b59794..0000000000 Binary files a/plugins/UserCountry/images/flags/tl.png and /dev/null differ diff --git a/plugins/UserCountry/images/flags/tm.png b/plugins/UserCountry/images/flags/tm.png deleted file mode 100644 index cb1b24dd1e..0000000000 Binary files a/plugins/UserCountry/images/flags/tm.png and /dev/null differ diff --git a/plugins/UserCountry/images/flags/tn.png b/plugins/UserCountry/images/flags/tn.png deleted file mode 100644 index 33d830d502..0000000000 Binary files a/plugins/UserCountry/images/flags/tn.png and /dev/null differ diff --git a/plugins/UserCountry/images/flags/to.png b/plugins/UserCountry/images/flags/to.png deleted file mode 100644 index 8b0aa02145..0000000000 Binary files a/plugins/UserCountry/images/flags/to.png and /dev/null differ diff --git a/plugins/UserCountry/images/flags/tp.png b/plugins/UserCountry/images/flags/tp.png deleted file mode 100644 index 0fa1b59794..0000000000 Binary files a/plugins/UserCountry/images/flags/tp.png and /dev/null differ diff --git a/plugins/UserCountry/images/flags/tr.png b/plugins/UserCountry/images/flags/tr.png deleted file mode 100644 index 3698f405fa..0000000000 Binary files a/plugins/UserCountry/images/flags/tr.png and /dev/null differ diff --git a/plugins/UserCountry/images/flags/tt.png b/plugins/UserCountry/images/flags/tt.png deleted file mode 100644 index 4f36edb09f..0000000000 Binary files a/plugins/UserCountry/images/flags/tt.png and /dev/null differ diff --git a/plugins/UserCountry/images/flags/tv.png b/plugins/UserCountry/images/flags/tv.png deleted file mode 100644 index e1fcffcade..0000000000 Binary files a/plugins/UserCountry/images/flags/tv.png and /dev/null differ diff --git a/plugins/UserCountry/images/flags/tw.png b/plugins/UserCountry/images/flags/tw.png deleted file mode 100644 index 39ac6e00cd..0000000000 Binary files a/plugins/UserCountry/images/flags/tw.png and /dev/null differ diff --git a/plugins/UserCountry/images/flags/tz.png b/plugins/UserCountry/images/flags/tz.png deleted file mode 100644 index e31644b158..0000000000 Binary files a/plugins/UserCountry/images/flags/tz.png and /dev/null differ diff --git a/plugins/UserCountry/images/flags/ua.png b/plugins/UserCountry/images/flags/ua.png deleted file mode 100644 index ddda0b21ab..0000000000 Binary files a/plugins/UserCountry/images/flags/ua.png and /dev/null differ diff --git a/plugins/UserCountry/images/flags/ug.png b/plugins/UserCountry/images/flags/ug.png deleted file mode 100644 index 7a77615592..0000000000 Binary files a/plugins/UserCountry/images/flags/ug.png and /dev/null differ diff --git a/plugins/UserCountry/images/flags/uk.png b/plugins/UserCountry/images/flags/uk.png deleted file mode 100644 index 405e897c52..0000000000 Binary files a/plugins/UserCountry/images/flags/uk.png and /dev/null differ diff --git a/plugins/UserCountry/images/flags/um.png b/plugins/UserCountry/images/flags/um.png deleted file mode 100644 index 9ff9ecf851..0000000000 Binary files a/plugins/UserCountry/images/flags/um.png and /dev/null differ diff --git a/plugins/UserCountry/images/flags/us.png b/plugins/UserCountry/images/flags/us.png deleted file mode 100644 index a60ef55968..0000000000 Binary files a/plugins/UserCountry/images/flags/us.png and /dev/null differ diff --git a/plugins/UserCountry/images/flags/uy.png b/plugins/UserCountry/images/flags/uy.png deleted file mode 100644 index 7aff0bc68f..0000000000 Binary files a/plugins/UserCountry/images/flags/uy.png and /dev/null differ diff --git a/plugins/UserCountry/images/flags/uz.png b/plugins/UserCountry/images/flags/uz.png deleted file mode 100644 index c3ba2ddcf2..0000000000 Binary files a/plugins/UserCountry/images/flags/uz.png and /dev/null differ diff --git a/plugins/UserCountry/images/flags/va.png b/plugins/UserCountry/images/flags/va.png deleted file mode 100644 index c9be43d266..0000000000 Binary files a/plugins/UserCountry/images/flags/va.png and /dev/null differ diff --git a/plugins/UserCountry/images/flags/vc.png b/plugins/UserCountry/images/flags/vc.png deleted file mode 100644 index a7935eee68..0000000000 Binary files a/plugins/UserCountry/images/flags/vc.png and /dev/null differ diff --git a/plugins/UserCountry/images/flags/ve.png b/plugins/UserCountry/images/flags/ve.png deleted file mode 100644 index 43eb422e11..0000000000 Binary files a/plugins/UserCountry/images/flags/ve.png and /dev/null differ diff --git a/plugins/UserCountry/images/flags/vg.png b/plugins/UserCountry/images/flags/vg.png deleted file mode 100644 index 63afb343ca..0000000000 Binary files a/plugins/UserCountry/images/flags/vg.png and /dev/null differ diff --git a/plugins/UserCountry/images/flags/vi.png b/plugins/UserCountry/images/flags/vi.png deleted file mode 100644 index dc0d214ae6..0000000000 Binary files a/plugins/UserCountry/images/flags/vi.png and /dev/null differ diff --git a/plugins/UserCountry/images/flags/vn.png b/plugins/UserCountry/images/flags/vn.png deleted file mode 100644 index a2cd8a151a..0000000000 Binary files a/plugins/UserCountry/images/flags/vn.png and /dev/null differ diff --git a/plugins/UserCountry/images/flags/vu.png b/plugins/UserCountry/images/flags/vu.png deleted file mode 100644 index e7972bc01d..0000000000 Binary files a/plugins/UserCountry/images/flags/vu.png and /dev/null differ diff --git a/plugins/UserCountry/images/flags/wf.png b/plugins/UserCountry/images/flags/wf.png deleted file mode 100644 index d9d33e18b0..0000000000 Binary files a/plugins/UserCountry/images/flags/wf.png and /dev/null differ diff --git a/plugins/UserCountry/images/flags/ws.png b/plugins/UserCountry/images/flags/ws.png deleted file mode 100644 index 8b40fdd224..0000000000 Binary files a/plugins/UserCountry/images/flags/ws.png and /dev/null differ diff --git a/plugins/UserCountry/images/flags/xx.png b/plugins/UserCountry/images/flags/xx.png deleted file mode 100644 index da6e1bbe89..0000000000 Binary files a/plugins/UserCountry/images/flags/xx.png and /dev/null differ diff --git a/plugins/UserCountry/images/flags/ye.png b/plugins/UserCountry/images/flags/ye.png deleted file mode 100644 index 6437e6f918..0000000000 Binary files a/plugins/UserCountry/images/flags/ye.png and /dev/null differ diff --git a/plugins/UserCountry/images/flags/yt.png b/plugins/UserCountry/images/flags/yt.png deleted file mode 100644 index ca9bacbbf7..0000000000 Binary files a/plugins/UserCountry/images/flags/yt.png and /dev/null differ diff --git a/plugins/UserCountry/images/flags/yu.png b/plugins/UserCountry/images/flags/yu.png deleted file mode 100644 index 0e0fb6deba..0000000000 Binary files a/plugins/UserCountry/images/flags/yu.png and /dev/null differ diff --git a/plugins/UserCountry/images/flags/za.png b/plugins/UserCountry/images/flags/za.png deleted file mode 100644 index 5200bf9761..0000000000 Binary files a/plugins/UserCountry/images/flags/za.png and /dev/null differ diff --git a/plugins/UserCountry/images/flags/zm.png b/plugins/UserCountry/images/flags/zm.png deleted file mode 100644 index 5145ab5547..0000000000 Binary files a/plugins/UserCountry/images/flags/zm.png and /dev/null differ diff --git a/plugins/UserCountry/images/flags/zr.png b/plugins/UserCountry/images/flags/zr.png deleted file mode 100644 index 0811ccce06..0000000000 Binary files a/plugins/UserCountry/images/flags/zr.png and /dev/null differ diff --git a/plugins/UserCountry/images/flags/zw.png b/plugins/UserCountry/images/flags/zw.png deleted file mode 100644 index 3d2d4b6591..0000000000 Binary files a/plugins/UserCountry/images/flags/zw.png and /dev/null differ diff --git a/plugins/UserCountry/stylesheets/userCountry.less b/plugins/UserCountry/stylesheets/userCountry.less index fc080b25c3..c035ece395 100755 --- a/plugins/UserCountry/stylesheets/userCountry.less +++ b/plugins/UserCountry/stylesheets/userCountry.less @@ -1,3 +1,10 @@ +#widgetUserCountrygetRegion, #widgetUserCountrygetCountry, #widgetUserCountrygetCity { + .dataTable .label img { + border: 1px solid lightgray; + box-sizing: content-box; + margin-top: -1px; + } +} input.location-provider { cursor: pointer; diff --git a/plugins/UserCountry/tests/System/expected/test_AttributeHistoricalDataWithLocationsTest_testExecute_ShouldReturnLogAfterWorkingWithSomeData__UserCountry.getCity_month.xml b/plugins/UserCountry/tests/System/expected/test_AttributeHistoricalDataWithLocationsTest_testExecute_ShouldReturnLogAfterWorkingWithSomeData__UserCountry.getCity_month.xml index af2eb4e1ed..ae227475bd 100644 --- a/plugins/UserCountry/tests/System/expected/test_AttributeHistoricalDataWithLocationsTest_testExecute_ShouldReturnLogAfterWorkingWithSomeData__UserCountry.getCity_month.xml +++ b/plugins/UserCountry/tests/System/expected/test_AttributeHistoricalDataWithLocationsTest_testExecute_ShouldReturnLogAfterWorkingWithSomeData__UserCountry.getCity_month.xml @@ -28,7 +28,7 @@ xx Unknown Unknown - plugins/UserCountry/images/flags/xx.png + plugins/Morpheus/icons/dist/flags/xx.png @@ -60,7 +60,7 @@ ca Canada British Columbia - plugins/UserCountry/images/flags/ca.png + plugins/Morpheus/icons/dist/flags/ca.png @@ -92,7 +92,7 @@ fr France Franche-Comte - plugins/UserCountry/images/flags/fr.png + plugins/Morpheus/icons/dist/flags/fr.png @@ -124,7 +124,7 @@ ti Tibet Unknown - plugins/UserCountry/images/flags/ti.png + plugins/Morpheus/icons/dist/flags/ti.png @@ -156,6 +156,6 @@ it Italy Lazio - plugins/UserCountry/images/flags/it.png + plugins/Morpheus/icons/dist/flags/it.png \ No newline at end of file diff --git a/plugins/UserCountry/tests/System/expected/test_AttributeHistoricalDataWithLocationsTest_testExecute_ShouldReturnLogAfterWorkingWithSomeData__UserCountry.getCountry_month.xml b/plugins/UserCountry/tests/System/expected/test_AttributeHistoricalDataWithLocationsTest_testExecute_ShouldReturnLogAfterWorkingWithSomeData__UserCountry.getCountry_month.xml index 66bfe2fbc3..1c8ba290ed 100644 --- a/plugins/UserCountry/tests/System/expected/test_AttributeHistoricalDataWithLocationsTest_testExecute_ShouldReturnLogAfterWorkingWithSomeData__UserCountry.getCountry_month.xml +++ b/plugins/UserCountry/tests/System/expected/test_AttributeHistoricalDataWithLocationsTest_testExecute_ShouldReturnLogAfterWorkingWithSomeData__UserCountry.getCountry_month.xml @@ -23,10 +23,9 @@ 9 0 cn - plugins/UserCountry/images/flags/cn.png + plugins/Morpheus/icons/dist/flags/cn.png countryCode==cn - 16 - 11 + 16 @@ -51,10 +50,9 @@ 3 0 ca - plugins/UserCountry/images/flags/ca.png + plugins/Morpheus/icons/dist/flags/ca.png countryCode==ca - 16 - 11 + 16 @@ -79,10 +77,9 @@ 2 1 fr - plugins/UserCountry/images/flags/fr.png + plugins/Morpheus/icons/dist/flags/fr.png countryCode==fr - 16 - 11 + 16 @@ -107,10 +104,9 @@ 1 0 id - plugins/UserCountry/images/flags/id.png + plugins/Morpheus/icons/dist/flags/id.png countryCode==id - 16 - 11 + 16 @@ -135,10 +131,9 @@ 1 0 it - plugins/UserCountry/images/flags/it.png + plugins/Morpheus/icons/dist/flags/it.png countryCode==it - 16 - 11 + 16 @@ -163,10 +158,9 @@ 1 0 ti - plugins/UserCountry/images/flags/ti.png + plugins/Morpheus/icons/dist/flags/ti.png countryCode==ti - 16 - 11 + 16 @@ -191,9 +185,8 @@ 1 0 us - plugins/UserCountry/images/flags/us.png + plugins/Morpheus/icons/dist/flags/us.png countryCode==us - 16 - 11 + 16 \ No newline at end of file diff --git a/plugins/UserCountry/tests/System/expected/test_AttributeHistoricalDataWithLocationsTest_testExecute_ShouldReturnLogAfterWorkingWithSomeData__UserCountry.getRegion_month.xml b/plugins/UserCountry/tests/System/expected/test_AttributeHistoricalDataWithLocationsTest_testExecute_ShouldReturnLogAfterWorkingWithSomeData__UserCountry.getRegion_month.xml index 26b27b21a9..49fc389c31 100644 --- a/plugins/UserCountry/tests/System/expected/test_AttributeHistoricalDataWithLocationsTest_testExecute_ShouldReturnLogAfterWorkingWithSomeData__UserCountry.getRegion_month.xml +++ b/plugins/UserCountry/tests/System/expected/test_AttributeHistoricalDataWithLocationsTest_testExecute_ShouldReturnLogAfterWorkingWithSomeData__UserCountry.getRegion_month.xml @@ -26,7 +26,7 @@ xx Unknown Unknown - plugins/UserCountry/images/flags/xx.png + plugins/Morpheus/icons/dist/flags/xx.png @@ -55,7 +55,7 @@ ca Canada British Columbia - plugins/UserCountry/images/flags/ca.png + plugins/Morpheus/icons/dist/flags/ca.png @@ -84,7 +84,7 @@ fr France Franche-Comte - plugins/UserCountry/images/flags/fr.png + plugins/Morpheus/icons/dist/flags/fr.png @@ -113,7 +113,7 @@ it Italy Lazio - plugins/UserCountry/images/flags/it.png + plugins/Morpheus/icons/dist/flags/it.png @@ -142,6 +142,6 @@ ti Tibet Unknown - plugins/UserCountry/images/flags/ti.png + plugins/Morpheus/icons/dist/flags/ti.png \ No newline at end of file diff --git a/plugins/UserCountry/tests/Unit/UserCountryTest.php b/plugins/UserCountry/tests/Unit/UserCountryTest.php index c2db05db2d..7dfc80521b 100644 --- a/plugins/UserCountry/tests/Unit/UserCountryTest.php +++ b/plugins/UserCountry/tests/Unit/UserCountryTest.php @@ -51,7 +51,7 @@ class UserCountryTest extends \PHPUnit_Framework_TestCase $countries = $dataProvider->getCountryList(true); // Get list of existing flag icons - $flags = scandir(PIWIK_PATH_TEST_TO_ROOT . '/plugins/UserCountry/images/flags/'); + $flags = scandir(PIWIK_PATH_TEST_TO_ROOT . '/plugins/Morpheus/icons/dist/flags/'); // Get list of countries foreach ($countries as $country => $continent) { diff --git a/plugins/UserCountryMap/javascripts/realtime-map.js b/plugins/UserCountryMap/javascripts/realtime-map.js index 105f12eae0..8e1240228c 100644 --- a/plugins/UserCountryMap/javascripts/realtime-map.js +++ b/plugins/UserCountryMap/javascripts/realtime-map.js @@ -215,10 +215,10 @@ function visitTooltip(r) { var ds = new Date().getTime() / 1000 - r.lastActionTimestamp, ad = r.actionDetails, - ico = function (src, square) { return ' '; }; + ico = function (src) { return ' '; }; return '

' + (r.city ? r.city + ' / ' : '') + r.country + '

' + // icons - ico(r.countryFlag) + ico(r.browserIcon, true) + ico(r.operatingSystemIcon, true) + '
' + + ico(r.countryFlag) + ico(r.browserIcon) + ico(r.operatingSystemIcon) + '
' + // User ID (r.userId ? _pk_translate('General_UserId') + ': ' + r.userId + '
' : '') + // last action diff --git a/tests/PHPUnit/System/BackwardsCompatibility1XTest.php b/tests/PHPUnit/System/BackwardsCompatibility1XTest.php index 443112a97f..73bdb32cdc 100644 --- a/tests/PHPUnit/System/BackwardsCompatibility1XTest.php +++ b/tests/PHPUnit/System/BackwardsCompatibility1XTest.php @@ -119,6 +119,9 @@ class BackwardsCompatibility1XTest extends SystemTestCase 'Actions.getPageUrls', 'Actions.getDownloads', 'Actions.getDownload', + + // new flag dimensions + 'UserCountry.getCountry', ); $apiNotToCall = array( diff --git a/tests/PHPUnit/System/expected/test_ArchiveCronTest_preArchivedSegment_noOptions__Live.getLastVisitsDetails_day.xml b/tests/PHPUnit/System/expected/test_ArchiveCronTest_preArchivedSegment_noOptions__Live.getLastVisitsDetails_day.xml index 1767b3b86f..1b1925d1ec 100644 --- a/tests/PHPUnit/System/expected/test_ArchiveCronTest_preArchivedSegment_noOptions__Live.getLastVisitsDetails_day.xml +++ b/tests/PHPUnit/System/expected/test_ArchiveCronTest_preArchivedSegment_noOptions__Live.getLastVisitsDetails_day.xml @@ -89,7 +89,7 @@ unk Unknown xx - plugins/UserCountry/images/flags/xx.png + plugins/Morpheus/icons/dist/flags/xx.png @@ -107,10 +107,10 @@ - 0.00 + 0 0 0 - 0.00 + 0 0 0 @@ -203,7 +203,7 @@ unk Unknown xx - plugins/UserCountry/images/flags/xx.png + plugins/Morpheus/icons/dist/flags/xx.png @@ -221,10 +221,10 @@ - 0.00 + 0 0 0 - 0.00 + 0 0 0 @@ -317,7 +317,7 @@ amn United States us - plugins/UserCountry/images/flags/us.png + plugins/Morpheus/icons/dist/flags/us.png Virginia VA Ashburn @@ -335,10 +335,10 @@ - 0.00 + 0 0 0 - 0.00 + 0 0 0 @@ -431,7 +431,7 @@ amn United States us - plugins/UserCountry/images/flags/us.png + plugins/Morpheus/icons/dist/flags/us.png Virginia VA Ashburn @@ -449,10 +449,10 @@ - 0.00 + 0 0 0 - 0.00 + 0 0 0 @@ -545,7 +545,7 @@ amn United States us - plugins/UserCountry/images/flags/us.png + plugins/Morpheus/icons/dist/flags/us.png Virginia VA Ashburn @@ -563,10 +563,10 @@ - 0.00 + 0 0 0 - 0.00 + 0 0 0 @@ -659,7 +659,7 @@ asi Japan jp - plugins/UserCountry/images/flags/jp.png + plugins/Morpheus/icons/dist/flags/jp.png @@ -677,10 +677,10 @@ - 0.00 + 0 0 0 - 0.00 + 0 0 0 @@ -773,7 +773,7 @@ asi Japan jp - plugins/UserCountry/images/flags/jp.png + plugins/Morpheus/icons/dist/flags/jp.png @@ -791,10 +791,10 @@ - 0.00 + 0 0 0 - 0.00 + 0 0 0 @@ -887,7 +887,7 @@ asi Japan jp - plugins/UserCountry/images/flags/jp.png + plugins/Morpheus/icons/dist/flags/jp.png @@ -905,10 +905,10 @@ - 0.00 + 0 0 0 - 0.00 + 0 0 0 @@ -1001,7 +1001,7 @@ asi Japan jp - plugins/UserCountry/images/flags/jp.png + plugins/Morpheus/icons/dist/flags/jp.png @@ -1019,10 +1019,10 @@ - 0.00 + 0 0 0 - 0.00 + 0 0 0 diff --git a/tests/PHPUnit/System/expected/test_ArchiveCronTest_preArchivedSegment_noOptions__Live.getLastVisitsDetails_year.xml b/tests/PHPUnit/System/expected/test_ArchiveCronTest_preArchivedSegment_noOptions__Live.getLastVisitsDetails_year.xml index 9d70523384..20a0ff9335 100644 --- a/tests/PHPUnit/System/expected/test_ArchiveCronTest_preArchivedSegment_noOptions__Live.getLastVisitsDetails_year.xml +++ b/tests/PHPUnit/System/expected/test_ArchiveCronTest_preArchivedSegment_noOptions__Live.getLastVisitsDetails_year.xml @@ -280,7 +280,7 @@ asi Japan jp - plugins/UserCountry/images/flags/jp.png + plugins/Morpheus/icons/dist/flags/jp.png @@ -298,10 +298,10 @@ - 0.00 + 0 0 0 - 0.00 + 0 0 0 @@ -402,7 +402,7 @@ unk Unknown xx - plugins/UserCountry/images/flags/xx.png + plugins/Morpheus/icons/dist/flags/xx.png @@ -433,10 +433,10 @@ - 0.00 + 0 0 0 - 0.00 + 0 0 0 @@ -529,7 +529,7 @@ asi Japan jp - plugins/UserCountry/images/flags/jp.png + plugins/Morpheus/icons/dist/flags/jp.png @@ -551,10 +551,10 @@ - 0.00 + 0 0 0 - 0.00 + 0 0 0 @@ -647,7 +647,7 @@ asi South Korea kr - plugins/UserCountry/images/flags/kr.png + plugins/Morpheus/icons/dist/flags/kr.png Seoul-t'ukpyolsi 11 Seoul @@ -669,10 +669,10 @@ - 0.00 + 0 0 0 - 0.00 + 0 0 0 @@ -784,7 +784,7 @@ asi Japan jp - plugins/UserCountry/images/flags/jp.png + plugins/Morpheus/icons/dist/flags/jp.png @@ -806,10 +806,10 @@ - 0.00 + 0 0 0 - 0.00 + 0 0 0 @@ -929,7 +929,7 @@ asi Japan jp - plugins/UserCountry/images/flags/jp.png + plugins/Morpheus/icons/dist/flags/jp.png @@ -951,10 +951,10 @@ - 0.00 + 0 0 0 - 0.00 + 0 0 0 @@ -1047,7 +1047,7 @@ amn United States us - plugins/UserCountry/images/flags/us.png + plugins/Morpheus/icons/dist/flags/us.png Virginia VA Ashburn @@ -1069,10 +1069,10 @@ - 0.00 + 0 0 0 - 0.00 + 0 0 0 @@ -1165,7 +1165,7 @@ amn United States us - plugins/UserCountry/images/flags/us.png + plugins/Morpheus/icons/dist/flags/us.png Virginia VA Ashburn @@ -1187,10 +1187,10 @@ - 0.00 + 0 0 0 - 0.00 + 0 0 0 @@ -1272,7 +1272,7 @@ oce Australia au - plugins/UserCountry/images/flags/au.png + plugins/Morpheus/icons/dist/flags/au.png @@ -1294,10 +1294,10 @@ - 0.00 + 0 0 0 - 0.00 + 0 0 0 @@ -1390,7 +1390,7 @@ asi Japan jp - plugins/UserCountry/images/flags/jp.png + plugins/Morpheus/icons/dist/flags/jp.png @@ -1412,10 +1412,10 @@ - 0.00 + 0 0 0 - 0.00 + 0 0 0 diff --git a/tests/PHPUnit/System/expected/test_AutoSuggestAPITest__Live.getLastVisitsDetails_range.xml b/tests/PHPUnit/System/expected/test_AutoSuggestAPITest__Live.getLastVisitsDetails_range.xml index 2569b8da4d..acfde7e3fc 100644 --- a/tests/PHPUnit/System/expected/test_AutoSuggestAPITest__Live.getLastVisitsDetails_range.xml +++ b/tests/PHPUnit/System/expected/test_AutoSuggestAPITest__Live.getLastVisitsDetails_range.xml @@ -83,7 +83,7 @@ amn United States us - plugins/UserCountry/images/flags/us.png + plugins/Morpheus/icons/dist/flags/us.png California CA not a city @@ -268,7 +268,7 @@ unk Unknown xx - plugins/UserCountry/images/flags/xx.png + plugins/Morpheus/icons/dist/flags/xx.png @@ -399,7 +399,7 @@ unk Unknown xx - plugins/UserCountry/images/flags/xx.png + plugins/Morpheus/icons/dist/flags/xx.png @@ -573,7 +573,7 @@ eur Macedonia mk - plugins/UserCountry/images/flags/mk.png + plugins/Morpheus/icons/dist/flags/mk.png Miravci 66 Stratford-upon-Avon @@ -704,7 +704,7 @@ eur Macedonia mk - plugins/UserCountry/images/flags/mk.png + plugins/Morpheus/icons/dist/flags/mk.png Miravci 66 Stratford-upon-Avon @@ -897,7 +897,7 @@ eur Russia ru - plugins/UserCountry/images/flags/ru.png + plugins/Morpheus/icons/dist/flags/ru.png Saint Petersburg City 66 Hluboká nad Vltavou @@ -1028,7 +1028,7 @@ eur Russia ru - plugins/UserCountry/images/flags/ru.png + plugins/Morpheus/icons/dist/flags/ru.png Saint Petersburg City 66 Hluboká nad Vltavou @@ -1202,7 +1202,7 @@ eur Russia ru - plugins/UserCountry/images/flags/ru.png + plugins/Morpheus/icons/dist/flags/ru.png Saint Petersburg City 66 Stratford-upon-Avon @@ -1333,7 +1333,7 @@ eur Russia ru - plugins/UserCountry/images/flags/ru.png + plugins/Morpheus/icons/dist/flags/ru.png Saint Petersburg City 66 Stratford-upon-Avon @@ -1526,7 +1526,7 @@ eur United Kingdom gb - plugins/UserCountry/images/flags/gb.png + plugins/Morpheus/icons/dist/flags/gb.png Kent G5 Stratford-upon-Avon @@ -1657,7 +1657,7 @@ eur United Kingdom gb - plugins/UserCountry/images/flags/gb.png + plugins/Morpheus/icons/dist/flags/gb.png Kent G5 Stratford-upon-Avon @@ -1831,7 +1831,7 @@ eur United Kingdom gb - plugins/UserCountry/images/flags/gb.png + plugins/Morpheus/icons/dist/flags/gb.png London, City of H9 London @@ -2005,7 +2005,7 @@ asi Tibet ti - plugins/UserCountry/images/flags/ti.png + plugins/Morpheus/icons/dist/flags/ti.png Unknown 1 Lhasa @@ -2128,7 +2128,7 @@ eur United Kingdom gb - plugins/UserCountry/images/flags/gb.png + plugins/Morpheus/icons/dist/flags/gb.png London, City of H9 London @@ -2259,7 +2259,7 @@ asi Tibet ti - plugins/UserCountry/images/flags/ti.png + plugins/Morpheus/icons/dist/flags/ti.png Unknown 1 Lhasa @@ -2452,7 +2452,7 @@ eur United Kingdom gb - plugins/UserCountry/images/flags/gb.png + plugins/Morpheus/icons/dist/flags/gb.png Warwickshire P3 Stratford-upon-Avon @@ -2645,7 +2645,7 @@ amn United States us - plugins/UserCountry/images/flags/us.png + plugins/Morpheus/icons/dist/flags/us.png @@ -2768,7 +2768,7 @@ eur United Kingdom gb - plugins/UserCountry/images/flags/gb.png + plugins/Morpheus/icons/dist/flags/gb.png Warwickshire P3 Stratford-upon-Avon @@ -2899,7 +2899,7 @@ amn United States us - plugins/UserCountry/images/flags/us.png + plugins/Morpheus/icons/dist/flags/us.png @@ -3073,7 +3073,7 @@ eur United Kingdom gb - plugins/UserCountry/images/flags/gb.png + plugins/Morpheus/icons/dist/flags/gb.png Warwickshire P3 Nuneaton and Bedworth @@ -3247,7 +3247,7 @@ amn Canada ca - plugins/UserCountry/images/flags/ca.png + plugins/Morpheus/icons/dist/flags/ca.png British Columbia BC Vancouver @@ -3421,7 +3421,7 @@ amn Canada ca - plugins/UserCountry/images/flags/ca.png + plugins/Morpheus/icons/dist/flags/ca.png British Columbia BC Vancouver @@ -3587,7 +3587,7 @@ asi Indonesia id - plugins/UserCountry/images/flags/id.png + plugins/Morpheus/icons/dist/flags/id.png @@ -3718,7 +3718,7 @@ eur United Kingdom gb - plugins/UserCountry/images/flags/gb.png + plugins/Morpheus/icons/dist/flags/gb.png Warwickshire P3 Nuneaton and Bedworth @@ -3849,7 +3849,7 @@ amn Canada ca - plugins/UserCountry/images/flags/ca.png + plugins/Morpheus/icons/dist/flags/ca.png British Columbia BC Vancouver @@ -3980,7 +3980,7 @@ amn Canada ca - plugins/UserCountry/images/flags/ca.png + plugins/Morpheus/icons/dist/flags/ca.png British Columbia BC Vancouver @@ -4111,7 +4111,7 @@ asi Indonesia id - plugins/UserCountry/images/flags/id.png + plugins/Morpheus/icons/dist/flags/id.png @@ -4304,7 +4304,7 @@ eur United Kingdom gb - plugins/UserCountry/images/flags/gb.png + plugins/Morpheus/icons/dist/flags/gb.png Warwickshire P3 Stratford-upon-Avon @@ -4497,7 +4497,7 @@ eur France fr - plugins/UserCountry/images/flags/fr.png + plugins/Morpheus/icons/dist/flags/fr.png Franche-Comte A6 Besançon @@ -4690,7 +4690,7 @@ amn Canada ca - plugins/UserCountry/images/flags/ca.png + plugins/Morpheus/icons/dist/flags/ca.png British Columbia BC Vancouver @@ -4875,7 +4875,7 @@ eur Italy it - plugins/UserCountry/images/flags/it.png + plugins/Morpheus/icons/dist/flags/it.png @@ -5006,7 +5006,7 @@ eur United Kingdom gb - plugins/UserCountry/images/flags/gb.png + plugins/Morpheus/icons/dist/flags/gb.png Warwickshire P3 Stratford-upon-Avon @@ -5137,7 +5137,7 @@ eur France fr - plugins/UserCountry/images/flags/fr.png + plugins/Morpheus/icons/dist/flags/fr.png Franche-Comte A6 Besançon @@ -5268,7 +5268,7 @@ amn Canada ca - plugins/UserCountry/images/flags/ca.png + plugins/Morpheus/icons/dist/flags/ca.png British Columbia BC Vancouver @@ -5399,7 +5399,7 @@ eur Italy it - plugins/UserCountry/images/flags/it.png + plugins/Morpheus/icons/dist/flags/it.png diff --git a/tests/PHPUnit/System/expected/test_BackwardsCompatibility1XTest__UserCountry.getCountry_day.xml b/tests/PHPUnit/System/expected/test_BackwardsCompatibility1XTest__UserCountry.getCountry_day.xml new file mode 100644 index 0000000000..9a80fd221e --- /dev/null +++ b/tests/PHPUnit/System/expected/test_BackwardsCompatibility1XTest__UserCountry.getCountry_day.xml @@ -0,0 +1,30 @@ + + + + + 1 + 2 + 8 + 7 + 1621 + 1 + + + 1 + 1 + 42 + + + 1 + 1 + 1 + + + 2 + 43 + fr + plugins/Morpheus/icons/dist/flags/fr.png + countryCode==fr + 16 + + \ No newline at end of file diff --git a/tests/PHPUnit/System/expected/test_CustomEvents__Live.getLastVisitsDetails_day.xml b/tests/PHPUnit/System/expected/test_CustomEvents__Live.getLastVisitsDetails_day.xml index f1426e40f6..f6e2c74e73 100644 --- a/tests/PHPUnit/System/expected/test_CustomEvents__Live.getLastVisitsDetails_day.xml +++ b/tests/PHPUnit/System/expected/test_CustomEvents__Live.getLastVisitsDetails_day.xml @@ -73,7 +73,7 @@ eur France fr - plugins/UserCountry/images/flags/fr.png + plugins/Morpheus/icons/dist/flags/fr.png @@ -106,10 +106,10 @@ - 0.00 + 0 0 0 - 0.00 + 0 0 0 @@ -186,7 +186,7 @@ eur France fr - plugins/UserCountry/images/flags/fr.png + plugins/Morpheus/icons/dist/flags/fr.png @@ -219,10 +219,10 @@ - 0.00 + 0 0 0 - 0.00 + 0 0 0 @@ -377,7 +377,7 @@ eur France fr - plugins/UserCountry/images/flags/fr.png + plugins/Morpheus/icons/dist/flags/fr.png @@ -410,10 +410,10 @@ - 0.00 + 0 0 0 - 0.00 + 0 0 0 @@ -490,7 +490,7 @@ eur France fr - plugins/UserCountry/images/flags/fr.png + plugins/Morpheus/icons/dist/flags/fr.png @@ -523,10 +523,10 @@ - 0.00 + 0 0 0 - 0.00 + 0 0 0 @@ -894,7 +894,7 @@ eur France fr - plugins/UserCountry/images/flags/fr.png + plugins/Morpheus/icons/dist/flags/fr.png @@ -927,10 +927,10 @@ - 0.00 + 0 0 0 - 0.00 + 0 0 0 @@ -1007,7 +1007,7 @@ eur France fr - plugins/UserCountry/images/flags/fr.png + plugins/Morpheus/icons/dist/flags/fr.png @@ -1036,10 +1036,10 @@ - 0.00 + 0 0 0 - 0.00 + 0 0 0 @@ -1116,7 +1116,7 @@ eur France fr - plugins/UserCountry/images/flags/fr.png + plugins/Morpheus/icons/dist/flags/fr.png @@ -1145,10 +1145,10 @@ - 0.00 + 0 0 0 - 0.00 + 0 0 0 @@ -1303,7 +1303,7 @@ eur France fr - plugins/UserCountry/images/flags/fr.png + plugins/Morpheus/icons/dist/flags/fr.png @@ -1332,10 +1332,10 @@ - 0.00 + 0 0 0 - 0.00 + 0 0 0 @@ -1412,7 +1412,7 @@ eur France fr - plugins/UserCountry/images/flags/fr.png + plugins/Morpheus/icons/dist/flags/fr.png @@ -1441,10 +1441,10 @@ - 0.00 + 0 0 0 - 0.00 + 0 0 0 @@ -1761,7 +1761,7 @@ eur France fr - plugins/UserCountry/images/flags/fr.png + plugins/Morpheus/icons/dist/flags/fr.png @@ -1790,10 +1790,10 @@ - 0.00 + 0 0 0 - 0.00 + 0 0 0 diff --git a/tests/PHPUnit/System/expected/test_CustomEvents__Live.getLastVisitsDetails_month.xml b/tests/PHPUnit/System/expected/test_CustomEvents__Live.getLastVisitsDetails_month.xml index 3327e3002e..6256dca24b 100644 --- a/tests/PHPUnit/System/expected/test_CustomEvents__Live.getLastVisitsDetails_month.xml +++ b/tests/PHPUnit/System/expected/test_CustomEvents__Live.getLastVisitsDetails_month.xml @@ -73,7 +73,7 @@ eur France fr - plugins/UserCountry/images/flags/fr.png + plugins/Morpheus/icons/dist/flags/fr.png @@ -102,10 +102,10 @@ - 0.00 + 0 0 0 - 0.00 + 0 0 0 @@ -182,7 +182,7 @@ eur France fr - plugins/UserCountry/images/flags/fr.png + plugins/Morpheus/icons/dist/flags/fr.png @@ -211,10 +211,10 @@ - 0.00 + 0 0 0 - 0.00 + 0 0 0 @@ -369,7 +369,7 @@ eur France fr - plugins/UserCountry/images/flags/fr.png + plugins/Morpheus/icons/dist/flags/fr.png @@ -398,10 +398,10 @@ - 0.00 + 0 0 0 - 0.00 + 0 0 0 @@ -478,7 +478,7 @@ eur France fr - plugins/UserCountry/images/flags/fr.png + plugins/Morpheus/icons/dist/flags/fr.png @@ -507,10 +507,10 @@ - 0.00 + 0 0 0 - 0.00 + 0 0 0 @@ -827,7 +827,7 @@ eur France fr - plugins/UserCountry/images/flags/fr.png + plugins/Morpheus/icons/dist/flags/fr.png @@ -856,10 +856,10 @@ - 0.00 + 0 0 0 - 0.00 + 0 0 0 @@ -936,7 +936,7 @@ eur France fr - plugins/UserCountry/images/flags/fr.png + plugins/Morpheus/icons/dist/flags/fr.png @@ -969,10 +969,10 @@ - 0.00 + 0 0 0 - 0.00 + 0 0 0 @@ -1049,7 +1049,7 @@ eur France fr - plugins/UserCountry/images/flags/fr.png + plugins/Morpheus/icons/dist/flags/fr.png @@ -1082,10 +1082,10 @@ - 0.00 + 0 0 0 - 0.00 + 0 0 0 @@ -1240,7 +1240,7 @@ eur France fr - plugins/UserCountry/images/flags/fr.png + plugins/Morpheus/icons/dist/flags/fr.png @@ -1273,10 +1273,10 @@ - 0.00 + 0 0 0 - 0.00 + 0 0 0 @@ -1353,7 +1353,7 @@ eur France fr - plugins/UserCountry/images/flags/fr.png + plugins/Morpheus/icons/dist/flags/fr.png @@ -1386,10 +1386,10 @@ - 0.00 + 0 0 0 - 0.00 + 0 0 0 @@ -1757,7 +1757,7 @@ eur France fr - plugins/UserCountry/images/flags/fr.png + plugins/Morpheus/icons/dist/flags/fr.png @@ -1790,10 +1790,10 @@ - 0.00 + 0 0 0 - 0.00 + 0 0 0 diff --git a/tests/PHPUnit/System/expected/test_ImportLogs__Live.getLastVisitsDetails_range.xml b/tests/PHPUnit/System/expected/test_ImportLogs__Live.getLastVisitsDetails_range.xml index a41bee8bd7..4b2ba500d1 100644 --- a/tests/PHPUnit/System/expected/test_ImportLogs__Live.getLastVisitsDetails_range.xml +++ b/tests/PHPUnit/System/expected/test_ImportLogs__Live.getLastVisitsDetails_range.xml @@ -91,7 +91,7 @@ amn United States us - plugins/UserCountry/images/flags/us.png + plugins/Morpheus/icons/dist/flags/us.png North Carolina NC Raleigh @@ -128,10 +128,10 @@ - 0.00 + 0 0 0 - 0.00 + 0 0 0 @@ -243,7 +243,7 @@ amn United States us - plugins/UserCountry/images/flags/us.png + plugins/Morpheus/icons/dist/flags/us.png California CA Lake Forest @@ -267,10 +267,10 @@ - 0.00 + 0 0 0 - 0.00 + 0 0 0 @@ -365,7 +365,7 @@ eur Germany de - plugins/UserCountry/images/flags/de.png + plugins/Morpheus/icons/dist/flags/de.png @@ -414,10 +414,10 @@ - 0.00 + 0 0 0 - 0.00 + 0 0 0 @@ -529,7 +529,7 @@ amn United States us - plugins/UserCountry/images/flags/us.png + plugins/Morpheus/icons/dist/flags/us.png @@ -570,10 +570,10 @@ - 0.00 + 0 0 0 - 0.00 + 0 0 0 @@ -655,7 +655,7 @@ eur Belgium be - plugins/UserCountry/images/flags/be.png + plugins/Morpheus/icons/dist/flags/be.png Limburg 05 Maaseik @@ -696,10 +696,10 @@ - 0.00 + 0 0 0 - 0.00 + 0 0 0 @@ -794,7 +794,7 @@ amn United States us - plugins/UserCountry/images/flags/us.png + plugins/Morpheus/icons/dist/flags/us.png California CA San Francisco @@ -843,10 +843,10 @@ - 0.00 + 0 0 0 - 0.00 + 0 0 0 @@ -939,7 +939,7 @@ asi Japan jp - plugins/UserCountry/images/flags/jp.png + plugins/Morpheus/icons/dist/flags/jp.png Kanagawa 19 Nihon'odori @@ -976,10 +976,10 @@ - 0.00 + 0 0 0 - 0.00 + 0 0 0 @@ -1074,7 +1074,7 @@ eur Germany de - plugins/UserCountry/images/flags/de.png + plugins/Morpheus/icons/dist/flags/de.png Nordrhein-Westfalen 07 Weilerswist @@ -1103,10 +1103,10 @@ - 0.00 + 0 0 0 - 0.00 + 0 0 0 @@ -1201,7 +1201,7 @@ eur Germany de - plugins/UserCountry/images/flags/de.png + plugins/Morpheus/icons/dist/flags/de.png Rheinland-Pfalz 08 Mainz @@ -1250,10 +1250,10 @@ - 0.00 + 0 0 0 - 0.00 + 0 0 0 @@ -1388,7 +1388,7 @@ eur Russia ru - plugins/UserCountry/images/flags/ru.png + plugins/Morpheus/icons/dist/flags/ru.png Moscow City 48 Moscow @@ -1421,10 +1421,10 @@ - 0.00 + 0 0 0 - 0.00 + 0 0 0 @@ -1519,7 +1519,7 @@ eur Turkey tr - plugins/UserCountry/images/flags/tr.png + plugins/Morpheus/icons/dist/flags/tr.png Rize 53 Esentepe @@ -1560,10 +1560,10 @@ - 0.00 + 0 0 0 - 0.00 + 0 0 0 @@ -1658,7 +1658,7 @@ eur Belgium be - plugins/UserCountry/images/flags/be.png + plugins/Morpheus/icons/dist/flags/be.png Limburg 05 Maaseik @@ -1699,10 +1699,10 @@ - 0.00 + 0 0 0 - 0.00 + 0 0 0 @@ -1986,7 +1986,7 @@ asi Japan jp - plugins/UserCountry/images/flags/jp.png + plugins/Morpheus/icons/dist/flags/jp.png @@ -2006,10 +2006,10 @@ - 0.00 + 0 0 0 - 0.00 + 0 0 0 @@ -2104,7 +2104,7 @@ unk Unknown xx - plugins/UserCountry/images/flags/xx.png + plugins/Morpheus/icons/dist/flags/xx.png @@ -2124,10 +2124,10 @@ - 0.00 + 0 0 0 - 0.00 + 0 0 0 @@ -2239,7 +2239,7 @@ unk Unknown xx - plugins/UserCountry/images/flags/xx.png + plugins/Morpheus/icons/dist/flags/xx.png @@ -2259,10 +2259,10 @@ - 0.00 + 0 0 0 - 0.00 + 0 0 0 @@ -2365,7 +2365,7 @@ amn United States us - plugins/UserCountry/images/flags/us.png + plugins/Morpheus/icons/dist/flags/us.png @@ -2389,10 +2389,10 @@ - 0.00 + 0 0 0 - 0.00 + 0 0 0 @@ -2535,7 +2535,7 @@ amn United States us - plugins/UserCountry/images/flags/us.png + plugins/Morpheus/icons/dist/flags/us.png @@ -2559,10 +2559,10 @@ - 0.00 + 0 0 0 - 0.00 + 0 0 0 @@ -2657,7 +2657,7 @@ amn United States us - plugins/UserCountry/images/flags/us.png + plugins/Morpheus/icons/dist/flags/us.png @@ -2677,10 +2677,10 @@ - 0.00 + 0 0 0 - 0.00 + 0 0 0 @@ -2804,7 +2804,7 @@ amn United States us - plugins/UserCountry/images/flags/us.png + plugins/Morpheus/icons/dist/flags/us.png @@ -2824,10 +2824,10 @@ - 0.00 + 0 0 0 - 0.00 + 0 0 0 @@ -2928,7 +2928,7 @@ amn United States us - plugins/UserCountry/images/flags/us.png + plugins/Morpheus/icons/dist/flags/us.png @@ -2952,10 +2952,10 @@ - 0.00 + 0 0 0 - 0.00 + 0 0 0 @@ -3056,7 +3056,7 @@ unk Unknown xx - plugins/UserCountry/images/flags/xx.png + plugins/Morpheus/icons/dist/flags/xx.png @@ -3089,10 +3089,10 @@ - 0.00 + 0 0 0 - 0.00 + 0 0 0 @@ -3185,7 +3185,7 @@ unk Unknown xx - plugins/UserCountry/images/flags/xx.png + plugins/Morpheus/icons/dist/flags/xx.png @@ -3234,10 +3234,10 @@ - 0.00 + 0 0 0 - 0.00 + 0 0 0 @@ -3332,7 +3332,7 @@ amn Canada ca - plugins/UserCountry/images/flags/ca.png + plugins/Morpheus/icons/dist/flags/ca.png Nunavut NU Igloolik @@ -3352,10 +3352,10 @@ - 0.00 + 0 0 0 - 0.00 + 0 0 0 @@ -3450,7 +3450,7 @@ amn United States us - plugins/UserCountry/images/flags/us.png + plugins/Morpheus/icons/dist/flags/us.png New Jersey NJ Mount Laurel @@ -3470,10 +3470,10 @@ - 0.00 + 0 0 0 - 0.00 + 0 0 0 @@ -3557,7 +3557,7 @@ unk Unknown xx - plugins/UserCountry/images/flags/xx.png + plugins/Morpheus/icons/dist/flags/xx.png @@ -3577,10 +3577,10 @@ - 0.00 + 0 0 0 - 0.00 + 0 0 0 @@ -3663,7 +3663,7 @@ unk Unknown xx - plugins/UserCountry/images/flags/xx.png + plugins/Morpheus/icons/dist/flags/xx.png @@ -3683,10 +3683,10 @@ - 0.00 + 0 0 0 - 0.00 + 0 0 0 @@ -3779,7 +3779,7 @@ asi Japan jp - plugins/UserCountry/images/flags/jp.png + plugins/Morpheus/icons/dist/flags/jp.png @@ -3803,10 +3803,10 @@ - 0.00 + 0 0 0 - 0.00 + 0 0 0 @@ -3899,7 +3899,7 @@ asi South Korea kr - plugins/UserCountry/images/flags/kr.png + plugins/Morpheus/icons/dist/flags/kr.png Seoul-t'ukpyolsi 11 Seoul @@ -3923,10 +3923,10 @@ - 0.00 + 0 0 0 - 0.00 + 0 0 0 @@ -4038,7 +4038,7 @@ asi Japan jp - plugins/UserCountry/images/flags/jp.png + plugins/Morpheus/icons/dist/flags/jp.png @@ -4062,10 +4062,10 @@ - 0.00 + 0 0 0 - 0.00 + 0 0 0 @@ -4185,7 +4185,7 @@ asi Japan jp - plugins/UserCountry/images/flags/jp.png + plugins/Morpheus/icons/dist/flags/jp.png @@ -4209,10 +4209,10 @@ - 0.00 + 0 0 0 - 0.00 + 0 0 0 @@ -4305,7 +4305,7 @@ amn United States us - plugins/UserCountry/images/flags/us.png + plugins/Morpheus/icons/dist/flags/us.png Virginia VA Ashburn @@ -4329,10 +4329,10 @@ - 0.00 + 0 0 0 - 0.00 + 0 0 0 @@ -4425,7 +4425,7 @@ amn United States us - plugins/UserCountry/images/flags/us.png + plugins/Morpheus/icons/dist/flags/us.png Virginia VA Ashburn @@ -4449,10 +4449,10 @@ - 0.00 + 0 0 0 - 0.00 + 0 0 0 @@ -4534,7 +4534,7 @@ oce Australia au - plugins/UserCountry/images/flags/au.png + plugins/Morpheus/icons/dist/flags/au.png @@ -4558,10 +4558,10 @@ - 0.00 + 0 0 0 - 0.00 + 0 0 0 @@ -4654,7 +4654,7 @@ asi Japan jp - plugins/UserCountry/images/flags/jp.png + plugins/Morpheus/icons/dist/flags/jp.png @@ -4678,10 +4678,10 @@ - 0.00 + 0 0 0 - 0.00 + 0 0 0 @@ -4774,7 +4774,7 @@ asi Japan jp - plugins/UserCountry/images/flags/jp.png + plugins/Morpheus/icons/dist/flags/jp.png @@ -4798,10 +4798,10 @@ - 0.00 + 0 0 0 - 0.00 + 0 0 0 @@ -4894,7 +4894,7 @@ unk Unknown xx - plugins/UserCountry/images/flags/xx.png + plugins/Morpheus/icons/dist/flags/xx.png @@ -4914,10 +4914,10 @@ - 0.00 + 0 0 0 - 0.00 + 0 0 0 @@ -5010,7 +5010,7 @@ unk Unknown xx - plugins/UserCountry/images/flags/xx.png + plugins/Morpheus/icons/dist/flags/xx.png @@ -5030,10 +5030,10 @@ - 0.00 + 0 0 0 - 0.00 + 0 0 0 @@ -5126,7 +5126,7 @@ ams Brazil br - plugins/UserCountry/images/flags/br.png + plugins/Morpheus/icons/dist/flags/br.png @@ -5146,10 +5146,10 @@ - 0.00 + 0 0 0 - 0.00 + 0 0 0 @@ -5242,7 +5242,7 @@ ams Brazil br - plugins/UserCountry/images/flags/br.png + plugins/Morpheus/icons/dist/flags/br.png @@ -5262,10 +5262,10 @@ - 0.00 + 0 0 0 - 0.00 + 0 0 0 @@ -5358,7 +5358,7 @@ ams Brazil br - plugins/UserCountry/images/flags/br.png + plugins/Morpheus/icons/dist/flags/br.png @@ -5378,10 +5378,10 @@ - 0.00 + 0 0 0 - 0.00 + 0 0 0 @@ -5474,7 +5474,7 @@ asi Japan jp - plugins/UserCountry/images/flags/jp.png + plugins/Morpheus/icons/dist/flags/jp.png @@ -5494,10 +5494,10 @@ - 0.00 + 0 0 0 - 0.00 + 0 0 0 @@ -5590,7 +5590,7 @@ asi Japan jp - plugins/UserCountry/images/flags/jp.png + plugins/Morpheus/icons/dist/flags/jp.png @@ -5610,10 +5610,10 @@ - 0.00 + 0 0 0 - 0.00 + 0 0 0 @@ -5706,7 +5706,7 @@ unk Unknown xx - plugins/UserCountry/images/flags/xx.png + plugins/Morpheus/icons/dist/flags/xx.png @@ -5726,10 +5726,10 @@ - 0.00 + 0 0 0 - 0.00 + 0 0 0 @@ -5822,7 +5822,7 @@ unk Unknown xx - plugins/UserCountry/images/flags/xx.png + plugins/Morpheus/icons/dist/flags/xx.png @@ -5842,10 +5842,10 @@ - 0.00 + 0 0 0 - 0.00 + 0 0 0 @@ -5938,7 +5938,7 @@ unk Unknown xx - plugins/UserCountry/images/flags/xx.png + plugins/Morpheus/icons/dist/flags/xx.png @@ -5958,10 +5958,10 @@ - 0.00 + 0 0 0 - 0.00 + 0 0 0 @@ -6054,7 +6054,7 @@ amn United States us - plugins/UserCountry/images/flags/us.png + plugins/Morpheus/icons/dist/flags/us.png Virginia VA Ashburn @@ -6074,10 +6074,10 @@ - 0.00 + 0 0 0 - 0.00 + 0 0 0 @@ -6170,7 +6170,7 @@ amn United States us - plugins/UserCountry/images/flags/us.png + plugins/Morpheus/icons/dist/flags/us.png Virginia VA Ashburn @@ -6190,10 +6190,10 @@ - 0.00 + 0 0 0 - 0.00 + 0 0 0 @@ -6286,7 +6286,7 @@ amn United States us - plugins/UserCountry/images/flags/us.png + plugins/Morpheus/icons/dist/flags/us.png Virginia VA Ashburn @@ -6306,10 +6306,10 @@ - 0.00 + 0 0 0 - 0.00 + 0 0 0 @@ -6402,7 +6402,7 @@ asi Japan jp - plugins/UserCountry/images/flags/jp.png + plugins/Morpheus/icons/dist/flags/jp.png @@ -6422,10 +6422,10 @@ - 0.00 + 0 0 0 - 0.00 + 0 0 0 @@ -6518,7 +6518,7 @@ asi Japan jp - plugins/UserCountry/images/flags/jp.png + plugins/Morpheus/icons/dist/flags/jp.png @@ -6538,10 +6538,10 @@ - 0.00 + 0 0 0 - 0.00 + 0 0 0 @@ -6634,7 +6634,7 @@ asi Japan jp - plugins/UserCountry/images/flags/jp.png + plugins/Morpheus/icons/dist/flags/jp.png @@ -6654,10 +6654,10 @@ - 0.00 + 0 0 0 - 0.00 + 0 0 0 @@ -6750,7 +6750,7 @@ asi Japan jp - plugins/UserCountry/images/flags/jp.png + plugins/Morpheus/icons/dist/flags/jp.png @@ -6770,10 +6770,10 @@ - 0.00 + 0 0 0 - 0.00 + 0 0 0 diff --git a/tests/PHPUnit/System/expected/test_ImportLogs__UserCountry.getCity_month.xml b/tests/PHPUnit/System/expected/test_ImportLogs__UserCountry.getCity_month.xml index 4f7962f12b..e7b230a210 100644 --- a/tests/PHPUnit/System/expected/test_ImportLogs__UserCountry.getCity_month.xml +++ b/tests/PHPUnit/System/expected/test_ImportLogs__UserCountry.getCity_month.xml @@ -25,7 +25,7 @@ xx Unknown Unknown - plugins/UserCountry/images/flags/xx.png + plugins/Morpheus/icons/dist/flags/xx.png @@ -53,7 +53,7 @@ us United States Virginia - plugins/UserCountry/images/flags/us.png + plugins/Morpheus/icons/dist/flags/us.png @@ -81,7 +81,7 @@ ca Canada Nunavut - plugins/UserCountry/images/flags/ca.png + plugins/Morpheus/icons/dist/flags/ca.png @@ -109,7 +109,7 @@ us United States New Jersey - plugins/UserCountry/images/flags/us.png + plugins/Morpheus/icons/dist/flags/us.png @@ -137,6 +137,6 @@ kr South Korea Seoul-t'ukpyolsi - plugins/UserCountry/images/flags/kr.png + plugins/Morpheus/icons/dist/flags/kr.png \ No newline at end of file diff --git a/tests/PHPUnit/System/expected/test_ImportLogs__UserCountry.getCountry_month.xml b/tests/PHPUnit/System/expected/test_ImportLogs__UserCountry.getCountry_month.xml index 70da83f4e9..63c3f98c5a 100644 --- a/tests/PHPUnit/System/expected/test_ImportLogs__UserCountry.getCountry_month.xml +++ b/tests/PHPUnit/System/expected/test_ImportLogs__UserCountry.getCountry_month.xml @@ -19,10 +19,9 @@ 11 0 jp - plugins/UserCountry/images/flags/jp.png + plugins/Morpheus/icons/dist/flags/jp.png countryCode==jp - 16 - 11 + 16 @@ -43,10 +42,9 @@ 9 2 us - plugins/UserCountry/images/flags/us.png + plugins/Morpheus/icons/dist/flags/us.png countryCode==us - 16 - 11 + 16 @@ -68,10 +66,9 @@ 1 0 xx - plugins/UserCountry/images/flags/xx.png + plugins/Morpheus/icons/dist/flags/xx.png countryCode==xx - 16 - 11 + 16 @@ -92,10 +89,9 @@ 3 0 br - plugins/UserCountry/images/flags/br.png + plugins/Morpheus/icons/dist/flags/br.png countryCode==br - 16 - 11 + 16 @@ -108,10 +104,9 @@ 1 0 au - plugins/UserCountry/images/flags/au.png + plugins/Morpheus/icons/dist/flags/au.png countryCode==au - 16 - 11 + 16 @@ -132,10 +127,9 @@ 1 0 ca - plugins/UserCountry/images/flags/ca.png + plugins/Morpheus/icons/dist/flags/ca.png countryCode==ca - 16 - 11 + 16 @@ -156,9 +150,8 @@ 1 0 kr - plugins/UserCountry/images/flags/kr.png + plugins/Morpheus/icons/dist/flags/kr.png countryCode==kr - 16 - 11 + 16 \ No newline at end of file diff --git a/tests/PHPUnit/System/expected/test_ImportLogs__UserCountry.getRegion_month.xml b/tests/PHPUnit/System/expected/test_ImportLogs__UserCountry.getRegion_month.xml index ca4f6b23bf..0b3b63e919 100644 --- a/tests/PHPUnit/System/expected/test_ImportLogs__UserCountry.getRegion_month.xml +++ b/tests/PHPUnit/System/expected/test_ImportLogs__UserCountry.getRegion_month.xml @@ -23,7 +23,7 @@ xx Unknown Unknown - plugins/UserCountry/images/flags/xx.png + plugins/Morpheus/icons/dist/flags/xx.png @@ -48,7 +48,7 @@ us United States Virginia - plugins/UserCountry/images/flags/us.png + plugins/Morpheus/icons/dist/flags/us.png @@ -73,7 +73,7 @@ us United States New Jersey - plugins/UserCountry/images/flags/us.png + plugins/Morpheus/icons/dist/flags/us.png @@ -98,7 +98,7 @@ ca Canada Nunavut - plugins/UserCountry/images/flags/ca.png + plugins/Morpheus/icons/dist/flags/ca.png @@ -123,6 +123,6 @@ kr South Korea Seoul-t'ukpyolsi - plugins/UserCountry/images/flags/kr.png + plugins/Morpheus/icons/dist/flags/kr.png \ No newline at end of file diff --git a/tests/PHPUnit/System/expected/test_ImportLogs_siteIdThree_TrackedUsingLogReplayWithFixedSiteId__Live.getLastVisitsDetails_range.xml b/tests/PHPUnit/System/expected/test_ImportLogs_siteIdThree_TrackedUsingLogReplayWithFixedSiteId__Live.getLastVisitsDetails_range.xml index 6e91c71915..fcc6864644 100644 --- a/tests/PHPUnit/System/expected/test_ImportLogs_siteIdThree_TrackedUsingLogReplayWithFixedSiteId__Live.getLastVisitsDetails_range.xml +++ b/tests/PHPUnit/System/expected/test_ImportLogs_siteIdThree_TrackedUsingLogReplayWithFixedSiteId__Live.getLastVisitsDetails_range.xml @@ -80,7 +80,7 @@ amn United States us - plugins/UserCountry/images/flags/us.png + plugins/Morpheus/icons/dist/flags/us.png North Carolina NC Raleigh @@ -117,10 +117,10 @@ - 0.00 + 0 0 0 - 0.00 + 0 0 0 @@ -221,7 +221,7 @@ amn United States us - plugins/UserCountry/images/flags/us.png + plugins/Morpheus/icons/dist/flags/us.png California CA Lake Forest @@ -245,10 +245,10 @@ - 0.00 + 0 0 0 - 0.00 + 0 0 0 @@ -332,7 +332,7 @@ eur Germany de - plugins/UserCountry/images/flags/de.png + plugins/Morpheus/icons/dist/flags/de.png @@ -381,10 +381,10 @@ - 0.00 + 0 0 0 - 0.00 + 0 0 0 @@ -485,7 +485,7 @@ amn United States us - plugins/UserCountry/images/flags/us.png + plugins/Morpheus/icons/dist/flags/us.png @@ -526,10 +526,10 @@ - 0.00 + 0 0 0 - 0.00 + 0 0 0 @@ -611,7 +611,7 @@ eur Belgium be - plugins/UserCountry/images/flags/be.png + plugins/Morpheus/icons/dist/flags/be.png Limburg 05 Maaseik @@ -652,10 +652,10 @@ - 0.00 + 0 0 0 - 0.00 + 0 0 0 @@ -739,7 +739,7 @@ amn United States us - plugins/UserCountry/images/flags/us.png + plugins/Morpheus/icons/dist/flags/us.png California CA San Francisco @@ -788,10 +788,10 @@ - 0.00 + 0 0 0 - 0.00 + 0 0 0 @@ -873,7 +873,7 @@ asi Japan jp - plugins/UserCountry/images/flags/jp.png + plugins/Morpheus/icons/dist/flags/jp.png Kanagawa 19 Nihon'odori @@ -910,10 +910,10 @@ - 0.00 + 0 0 0 - 0.00 + 0 0 0 @@ -997,7 +997,7 @@ eur Germany de - plugins/UserCountry/images/flags/de.png + plugins/Morpheus/icons/dist/flags/de.png Nordrhein-Westfalen 07 Weilerswist @@ -1026,10 +1026,10 @@ - 0.00 + 0 0 0 - 0.00 + 0 0 0 @@ -1113,7 +1113,7 @@ eur Germany de - plugins/UserCountry/images/flags/de.png + plugins/Morpheus/icons/dist/flags/de.png Rheinland-Pfalz 08 Mainz @@ -1162,10 +1162,10 @@ - 0.00 + 0 0 0 - 0.00 + 0 0 0 @@ -1289,7 +1289,7 @@ eur Russia ru - plugins/UserCountry/images/flags/ru.png + plugins/Morpheus/icons/dist/flags/ru.png Moscow City 48 Moscow @@ -1322,10 +1322,10 @@ - 0.00 + 0 0 0 - 0.00 + 0 0 0 @@ -1409,7 +1409,7 @@ eur Turkey tr - plugins/UserCountry/images/flags/tr.png + plugins/Morpheus/icons/dist/flags/tr.png Rize 53 Esentepe @@ -1450,10 +1450,10 @@ - 0.00 + 0 0 0 - 0.00 + 0 0 0 @@ -1537,7 +1537,7 @@ eur Belgium be - plugins/UserCountry/images/flags/be.png + plugins/Morpheus/icons/dist/flags/be.png Limburg 05 Maaseik @@ -1578,10 +1578,10 @@ - 0.00 + 0 0 0 - 0.00 + 0 0 0 @@ -1671,7 +1671,7 @@ unk Unknown xx - plugins/UserCountry/images/flags/xx.png + plugins/Morpheus/icons/dist/flags/xx.png @@ -1704,10 +1704,10 @@ - 0.00 + 0 0 0 - 0.00 + 0 0 0 @@ -1789,7 +1789,7 @@ unk Unknown xx - plugins/UserCountry/images/flags/xx.png + plugins/Morpheus/icons/dist/flags/xx.png @@ -1838,10 +1838,10 @@ - 0.00 + 0 0 0 - 0.00 + 0 0 0 @@ -1965,7 +1965,7 @@ unk Unknown xx - plugins/UserCountry/images/flags/xx.png + plugins/Morpheus/icons/dist/flags/xx.png @@ -1998,10 +1998,10 @@ - 0.00 + 0 0 0 - 0.00 + 0 0 0 diff --git a/tests/PHPUnit/System/expected/test_ManyVisitorsOneWebsiteTest_Live.getLastVisitsDetails_offsetAndLimit_1__Live.getLastVisitsDetails_month.xml b/tests/PHPUnit/System/expected/test_ManyVisitorsOneWebsiteTest_Live.getLastVisitsDetails_offsetAndLimit_1__Live.getLastVisitsDetails_month.xml index 94f689d62d..da66ef187d 100644 --- a/tests/PHPUnit/System/expected/test_ManyVisitorsOneWebsiteTest_Live.getLastVisitsDetails_offsetAndLimit_1__Live.getLastVisitsDetails_month.xml +++ b/tests/PHPUnit/System/expected/test_ManyVisitorsOneWebsiteTest_Live.getLastVisitsDetails_offsetAndLimit_1__Live.getLastVisitsDetails_month.xml @@ -155,7 +155,7 @@ unk Unknown xx - plugins/UserCountry/images/flags/xx.png + plugins/Morpheus/icons/dist/flags/xx.png @@ -192,10 +192,10 @@ - 0.00 + 0 0 0 - 0.00 + 0 0 0 @@ -292,7 +292,7 @@ unk Unknown xx - plugins/UserCountry/images/flags/xx.png + plugins/Morpheus/icons/dist/flags/xx.png @@ -329,10 +329,10 @@ - 0.00 + 0 0 0 - 0.00 + 0 0 0 @@ -472,7 +472,7 @@ eur Macedonia mk - plugins/UserCountry/images/flags/mk.png + plugins/Morpheus/icons/dist/flags/mk.png Miravci 66 Stratford-upon-Avon @@ -509,10 +509,10 @@ - 0.00 + 0 0 0 - 0.00 + 0 0 0 diff --git a/tests/PHPUnit/System/expected/test_ManyVisitorsOneWebsiteTest_Live.getLastVisitsDetails_offsetAndLimit_2__Live.getLastVisitsDetails_month.xml b/tests/PHPUnit/System/expected/test_ManyVisitorsOneWebsiteTest_Live.getLastVisitsDetails_offsetAndLimit_2__Live.getLastVisitsDetails_month.xml index d454b9c3db..2e513ce895 100644 --- a/tests/PHPUnit/System/expected/test_ManyVisitorsOneWebsiteTest_Live.getLastVisitsDetails_offsetAndLimit_2__Live.getLastVisitsDetails_month.xml +++ b/tests/PHPUnit/System/expected/test_ManyVisitorsOneWebsiteTest_Live.getLastVisitsDetails_offsetAndLimit_2__Live.getLastVisitsDetails_month.xml @@ -93,7 +93,7 @@ eur Macedonia mk - plugins/UserCountry/images/flags/mk.png + plugins/Morpheus/icons/dist/flags/mk.png Miravci 66 Stratford-upon-Avon @@ -130,10 +130,10 @@ - 0.00 + 0 0 0 - 0.00 + 0 0 0 @@ -292,7 +292,7 @@ eur Russia ru - plugins/UserCountry/images/flags/ru.png + plugins/Morpheus/icons/dist/flags/ru.png Saint Petersburg City 66 Hluboká nad Vltavou @@ -329,10 +329,10 @@ - 0.00 + 0 0 0 - 0.00 + 0 0 0 @@ -429,7 +429,7 @@ eur Russia ru - plugins/UserCountry/images/flags/ru.png + plugins/Morpheus/icons/dist/flags/ru.png Saint Petersburg City 66 Hluboká nad Vltavou @@ -466,10 +466,10 @@ - 0.00 + 0 0 0 - 0.00 + 0 0 0 diff --git a/tests/PHPUnit/System/expected/test_ManyVisitorsOneWebsiteTest_Live.getLastVisitsDetails_sortAsc__Live.getLastVisitsDetails_month.xml b/tests/PHPUnit/System/expected/test_ManyVisitorsOneWebsiteTest_Live.getLastVisitsDetails_sortAsc__Live.getLastVisitsDetails_month.xml index 5a4b100f86..520a06bc6b 100644 --- a/tests/PHPUnit/System/expected/test_ManyVisitorsOneWebsiteTest_Live.getLastVisitsDetails_sortAsc__Live.getLastVisitsDetails_month.xml +++ b/tests/PHPUnit/System/expected/test_ManyVisitorsOneWebsiteTest_Live.getLastVisitsDetails_sortAsc__Live.getLastVisitsDetails_month.xml @@ -75,7 +75,7 @@ eur United Kingdom gb - plugins/UserCountry/images/flags/gb.png + plugins/Morpheus/icons/dist/flags/gb.png Warwickshire P3 Stratford-upon-Avon @@ -196,7 +196,7 @@ eur France fr - plugins/UserCountry/images/flags/fr.png + plugins/Morpheus/icons/dist/flags/fr.png Franche-Comte A6 Besançon @@ -317,7 +317,7 @@ amn Canada ca - plugins/UserCountry/images/flags/ca.png + plugins/Morpheus/icons/dist/flags/ca.png British Columbia BC Vancouver @@ -438,7 +438,7 @@ eur Italy it - plugins/UserCountry/images/flags/it.png + plugins/Morpheus/icons/dist/flags/it.png @@ -590,7 +590,7 @@ eur United Kingdom gb - plugins/UserCountry/images/flags/gb.png + plugins/Morpheus/icons/dist/flags/gb.png Warwickshire P3 Stratford-upon-Avon @@ -742,7 +742,7 @@ eur France fr - plugins/UserCountry/images/flags/fr.png + plugins/Morpheus/icons/dist/flags/fr.png Franche-Comte A6 Besançon @@ -886,7 +886,7 @@ amn Canada ca - plugins/UserCountry/images/flags/ca.png + plugins/Morpheus/icons/dist/flags/ca.png British Columbia BC Vancouver diff --git a/tests/PHPUnit/System/expected/test_ManyVisitorsOneWebsiteTest_Live.getLastVisitsDetails_sortByIdVisitAsc__Live.getLastVisitsDetails_month.xml b/tests/PHPUnit/System/expected/test_ManyVisitorsOneWebsiteTest_Live.getLastVisitsDetails_sortByIdVisitAsc__Live.getLastVisitsDetails_month.xml index d7bb4bf39a..50a69b836c 100644 --- a/tests/PHPUnit/System/expected/test_ManyVisitorsOneWebsiteTest_Live.getLastVisitsDetails_sortByIdVisitAsc__Live.getLastVisitsDetails_month.xml +++ b/tests/PHPUnit/System/expected/test_ManyVisitorsOneWebsiteTest_Live.getLastVisitsDetails_sortByIdVisitAsc__Live.getLastVisitsDetails_month.xml @@ -89,7 +89,7 @@ eur United Kingdom gb - plugins/UserCountry/images/flags/gb.png + plugins/Morpheus/icons/dist/flags/gb.png Warwickshire P3 Stratford-upon-Avon @@ -251,7 +251,7 @@ eur United Kingdom gb - plugins/UserCountry/images/flags/gb.png + plugins/Morpheus/icons/dist/flags/gb.png Warwickshire P3 Stratford-upon-Avon @@ -379,7 +379,7 @@ eur France fr - plugins/UserCountry/images/flags/fr.png + plugins/Morpheus/icons/dist/flags/fr.png Franche-Comte A6 Besançon @@ -541,7 +541,7 @@ eur France fr - plugins/UserCountry/images/flags/fr.png + plugins/Morpheus/icons/dist/flags/fr.png Franche-Comte A6 Besançon @@ -669,7 +669,7 @@ amn Canada ca - plugins/UserCountry/images/flags/ca.png + plugins/Morpheus/icons/dist/flags/ca.png British Columbia BC Vancouver @@ -831,7 +831,7 @@ amn Canada ca - plugins/UserCountry/images/flags/ca.png + plugins/Morpheus/icons/dist/flags/ca.png British Columbia BC Vancouver @@ -951,7 +951,7 @@ eur Italy it - plugins/UserCountry/images/flags/it.png + plugins/Morpheus/icons/dist/flags/it.png diff --git a/tests/PHPUnit/System/expected/test_ManyVisitorsOneWebsiteTest_Live.getLastVisitsDetails_sortByIdVisit__Live.getLastVisitsDetails_month.xml b/tests/PHPUnit/System/expected/test_ManyVisitorsOneWebsiteTest_Live.getLastVisitsDetails_sortByIdVisit__Live.getLastVisitsDetails_month.xml index 6860c259d7..198d996bfc 100644 --- a/tests/PHPUnit/System/expected/test_ManyVisitorsOneWebsiteTest_Live.getLastVisitsDetails_sortByIdVisit__Live.getLastVisitsDetails_month.xml +++ b/tests/PHPUnit/System/expected/test_ManyVisitorsOneWebsiteTest_Live.getLastVisitsDetails_sortByIdVisit__Live.getLastVisitsDetails_month.xml @@ -83,7 +83,7 @@ amn United States us - plugins/UserCountry/images/flags/us.png + plugins/Morpheus/icons/dist/flags/us.png California CA not a city @@ -112,10 +112,10 @@ - 0.00 + 0 0 0 - 0.00 + 0 0 0 @@ -274,7 +274,7 @@ unk Unknown xx - plugins/UserCountry/images/flags/xx.png + plugins/Morpheus/icons/dist/flags/xx.png @@ -311,10 +311,10 @@ - 0.00 + 0 0 0 - 0.00 + 0 0 0 @@ -411,7 +411,7 @@ unk Unknown xx - plugins/UserCountry/images/flags/xx.png + plugins/Morpheus/icons/dist/flags/xx.png @@ -448,10 +448,10 @@ - 0.00 + 0 0 0 - 0.00 + 0 0 0 @@ -591,7 +591,7 @@ eur Macedonia mk - plugins/UserCountry/images/flags/mk.png + plugins/Morpheus/icons/dist/flags/mk.png Miravci 66 Stratford-upon-Avon @@ -628,10 +628,10 @@ - 0.00 + 0 0 0 - 0.00 + 0 0 0 @@ -728,7 +728,7 @@ eur Macedonia mk - plugins/UserCountry/images/flags/mk.png + plugins/Morpheus/icons/dist/flags/mk.png Miravci 66 Stratford-upon-Avon @@ -765,10 +765,10 @@ - 0.00 + 0 0 0 - 0.00 + 0 0 0 @@ -927,7 +927,7 @@ eur Russia ru - plugins/UserCountry/images/flags/ru.png + plugins/Morpheus/icons/dist/flags/ru.png Saint Petersburg City 66 Hluboká nad Vltavou @@ -964,10 +964,10 @@ - 0.00 + 0 0 0 - 0.00 + 0 0 0 @@ -1064,7 +1064,7 @@ eur Russia ru - plugins/UserCountry/images/flags/ru.png + plugins/Morpheus/icons/dist/flags/ru.png Saint Petersburg City 66 Hluboká nad Vltavou @@ -1101,10 +1101,10 @@ - 0.00 + 0 0 0 - 0.00 + 0 0 0 diff --git a/tests/PHPUnit/System/expected/test_ManyVisitorsOneWebsiteTest_Live.getLastVisitsDetails_sortByVisitCount__Live.getLastVisitsDetails_month.xml b/tests/PHPUnit/System/expected/test_ManyVisitorsOneWebsiteTest_Live.getLastVisitsDetails_sortByVisitCount__Live.getLastVisitsDetails_month.xml index 6b0807d712..f73ae2256a 100644 --- a/tests/PHPUnit/System/expected/test_ManyVisitorsOneWebsiteTest_Live.getLastVisitsDetails_sortByVisitCount__Live.getLastVisitsDetails_month.xml +++ b/tests/PHPUnit/System/expected/test_ManyVisitorsOneWebsiteTest_Live.getLastVisitsDetails_sortByVisitCount__Live.getLastVisitsDetails_month.xml @@ -123,7 +123,7 @@ unk Unknown xx - plugins/UserCountry/images/flags/xx.png + plugins/Morpheus/icons/dist/flags/xx.png @@ -253,7 +253,7 @@ unk Unknown xx - plugins/UserCountry/images/flags/xx.png + plugins/Morpheus/icons/dist/flags/xx.png @@ -417,7 +417,7 @@ eur Russia ru - plugins/UserCountry/images/flags/ru.png + plugins/Morpheus/icons/dist/flags/ru.png Saint Petersburg City 66 Hluboká nad Vltavou @@ -563,7 +563,7 @@ eur Macedonia mk - plugins/UserCountry/images/flags/mk.png + plugins/Morpheus/icons/dist/flags/mk.png Miravci 66 Stratford-upon-Avon @@ -693,7 +693,7 @@ eur Macedonia mk - plugins/UserCountry/images/flags/mk.png + plugins/Morpheus/icons/dist/flags/mk.png Miravci 66 Stratford-upon-Avon @@ -823,7 +823,7 @@ eur Russia ru - plugins/UserCountry/images/flags/ru.png + plugins/Morpheus/icons/dist/flags/ru.png Saint Petersburg City 66 Hluboká nad Vltavou @@ -943,7 +943,7 @@ amn United States us - plugins/UserCountry/images/flags/us.png + plugins/Morpheus/icons/dist/flags/us.png California CA not a city diff --git a/tests/PHPUnit/System/expected/test_ManyVisitorsOneWebsiteTest_Live.getLastVisitsDetails_sortDesc__Live.getLastVisitsDetails_month.xml b/tests/PHPUnit/System/expected/test_ManyVisitorsOneWebsiteTest_Live.getLastVisitsDetails_sortDesc__Live.getLastVisitsDetails_month.xml index 6860c259d7..198d996bfc 100644 --- a/tests/PHPUnit/System/expected/test_ManyVisitorsOneWebsiteTest_Live.getLastVisitsDetails_sortDesc__Live.getLastVisitsDetails_month.xml +++ b/tests/PHPUnit/System/expected/test_ManyVisitorsOneWebsiteTest_Live.getLastVisitsDetails_sortDesc__Live.getLastVisitsDetails_month.xml @@ -83,7 +83,7 @@ amn United States us - plugins/UserCountry/images/flags/us.png + plugins/Morpheus/icons/dist/flags/us.png California CA not a city @@ -112,10 +112,10 @@ - 0.00 + 0 0 0 - 0.00 + 0 0 0 @@ -274,7 +274,7 @@ unk Unknown xx - plugins/UserCountry/images/flags/xx.png + plugins/Morpheus/icons/dist/flags/xx.png @@ -311,10 +311,10 @@ - 0.00 + 0 0 0 - 0.00 + 0 0 0 @@ -411,7 +411,7 @@ unk Unknown xx - plugins/UserCountry/images/flags/xx.png + plugins/Morpheus/icons/dist/flags/xx.png @@ -448,10 +448,10 @@ - 0.00 + 0 0 0 - 0.00 + 0 0 0 @@ -591,7 +591,7 @@ eur Macedonia mk - plugins/UserCountry/images/flags/mk.png + plugins/Morpheus/icons/dist/flags/mk.png Miravci 66 Stratford-upon-Avon @@ -628,10 +628,10 @@ - 0.00 + 0 0 0 - 0.00 + 0 0 0 @@ -728,7 +728,7 @@ eur Macedonia mk - plugins/UserCountry/images/flags/mk.png + plugins/Morpheus/icons/dist/flags/mk.png Miravci 66 Stratford-upon-Avon @@ -765,10 +765,10 @@ - 0.00 + 0 0 0 - 0.00 + 0 0 0 @@ -927,7 +927,7 @@ eur Russia ru - plugins/UserCountry/images/flags/ru.png + plugins/Morpheus/icons/dist/flags/ru.png Saint Petersburg City 66 Hluboká nad Vltavou @@ -964,10 +964,10 @@ - 0.00 + 0 0 0 - 0.00 + 0 0 0 @@ -1064,7 +1064,7 @@ eur Russia ru - plugins/UserCountry/images/flags/ru.png + plugins/Morpheus/icons/dist/flags/ru.png Saint Petersburg City 66 Hluboká nad Vltavou @@ -1101,10 +1101,10 @@ - 0.00 + 0 0 0 - 0.00 + 0 0 0 diff --git a/tests/PHPUnit/System/expected/test_ManyVisitorsOneWebsiteTest__Live.getLastVisitsDetails_month.xml b/tests/PHPUnit/System/expected/test_ManyVisitorsOneWebsiteTest__Live.getLastVisitsDetails_month.xml index 29a0f0d4fb..608a2b87f4 100644 --- a/tests/PHPUnit/System/expected/test_ManyVisitorsOneWebsiteTest__Live.getLastVisitsDetails_month.xml +++ b/tests/PHPUnit/System/expected/test_ManyVisitorsOneWebsiteTest__Live.getLastVisitsDetails_month.xml @@ -83,7 +83,7 @@ amn United States us - plugins/UserCountry/images/flags/us.png + plugins/Morpheus/icons/dist/flags/us.png California CA not a city @@ -112,10 +112,10 @@ - 0.00 + 0 0 0 - 0.00 + 0 0 0 @@ -274,7 +274,7 @@ unk Unknown xx - plugins/UserCountry/images/flags/xx.png + plugins/Morpheus/icons/dist/flags/xx.png @@ -311,10 +311,10 @@ - 0.00 + 0 0 0 - 0.00 + 0 0 0 @@ -411,7 +411,7 @@ unk Unknown xx - plugins/UserCountry/images/flags/xx.png + plugins/Morpheus/icons/dist/flags/xx.png @@ -448,10 +448,10 @@ - 0.00 + 0 0 0 - 0.00 + 0 0 0 @@ -591,7 +591,7 @@ eur Macedonia mk - plugins/UserCountry/images/flags/mk.png + plugins/Morpheus/icons/dist/flags/mk.png Miravci 66 Stratford-upon-Avon @@ -628,10 +628,10 @@ - 0.00 + 0 0 0 - 0.00 + 0 0 0 @@ -728,7 +728,7 @@ eur Macedonia mk - plugins/UserCountry/images/flags/mk.png + plugins/Morpheus/icons/dist/flags/mk.png Miravci 66 Stratford-upon-Avon @@ -765,10 +765,10 @@ - 0.00 + 0 0 0 - 0.00 + 0 0 0 @@ -927,7 +927,7 @@ eur Russia ru - plugins/UserCountry/images/flags/ru.png + plugins/Morpheus/icons/dist/flags/ru.png Saint Petersburg City 66 Hluboká nad Vltavou @@ -964,10 +964,10 @@ - 0.00 + 0 0 0 - 0.00 + 0 0 0 @@ -1064,7 +1064,7 @@ eur Russia ru - plugins/UserCountry/images/flags/ru.png + plugins/Morpheus/icons/dist/flags/ru.png Saint Petersburg City 66 Hluboká nad Vltavou @@ -1101,10 +1101,10 @@ - 0.00 + 0 0 0 - 0.00 + 0 0 0 @@ -1244,7 +1244,7 @@ eur Russia ru - plugins/UserCountry/images/flags/ru.png + plugins/Morpheus/icons/dist/flags/ru.png Saint Petersburg City 66 Stratford-upon-Avon @@ -1281,10 +1281,10 @@ - 0.00 + 0 0 0 - 0.00 + 0 0 0 @@ -1381,7 +1381,7 @@ eur Russia ru - plugins/UserCountry/images/flags/ru.png + plugins/Morpheus/icons/dist/flags/ru.png Saint Petersburg City 66 Stratford-upon-Avon @@ -1418,10 +1418,10 @@ - 0.00 + 0 0 0 - 0.00 + 0 0 0 @@ -1580,7 +1580,7 @@ eur United Kingdom gb - plugins/UserCountry/images/flags/gb.png + plugins/Morpheus/icons/dist/flags/gb.png Kent G5 Stratford-upon-Avon @@ -1617,10 +1617,10 @@ - 0.00 + 0 0 0 - 0.00 + 0 0 0 diff --git a/tests/PHPUnit/System/expected/test_ManyVisitorsOneWebsiteTest__UserCountry.getCity_month.xml b/tests/PHPUnit/System/expected/test_ManyVisitorsOneWebsiteTest__UserCountry.getCity_month.xml index f9f34d09f3..7df3efc479 100644 --- a/tests/PHPUnit/System/expected/test_ManyVisitorsOneWebsiteTest__UserCountry.getCity_month.xml +++ b/tests/PHPUnit/System/expected/test_ManyVisitorsOneWebsiteTest__UserCountry.getCity_month.xml @@ -29,7 +29,7 @@ xx Unknown Unknown - plugins/UserCountry/images/flags/xx.png + plugins/Morpheus/icons/dist/flags/xx.png @@ -62,7 +62,7 @@ ca Canada British Columbia - plugins/UserCountry/images/flags/ca.png + plugins/Morpheus/icons/dist/flags/ca.png @@ -95,7 +95,7 @@ gb United Kingdom Warwickshire - plugins/UserCountry/images/flags/gb.png + plugins/Morpheus/icons/dist/flags/gb.png @@ -128,7 +128,7 @@ fr France Franche-Comte - plugins/UserCountry/images/flags/fr.png + plugins/Morpheus/icons/dist/flags/fr.png @@ -159,7 +159,7 @@ ru Russia Saint Petersburg City - plugins/UserCountry/images/flags/ru.png + plugins/Morpheus/icons/dist/flags/ru.png @@ -192,7 +192,7 @@ ti Tibet Unknown - plugins/UserCountry/images/flags/ti.png + plugins/Morpheus/icons/dist/flags/ti.png @@ -223,7 +223,7 @@ gb United Kingdom London, City of - plugins/UserCountry/images/flags/gb.png + plugins/Morpheus/icons/dist/flags/gb.png @@ -254,7 +254,7 @@ gb United Kingdom Warwickshire - plugins/UserCountry/images/flags/gb.png + plugins/Morpheus/icons/dist/flags/gb.png @@ -285,7 +285,7 @@ gb United Kingdom Kent - plugins/UserCountry/images/flags/gb.png + plugins/Morpheus/icons/dist/flags/gb.png @@ -316,7 +316,7 @@ mk Macedonia Miravci - plugins/UserCountry/images/flags/mk.png + plugins/Morpheus/icons/dist/flags/mk.png @@ -347,7 +347,7 @@ ru Russia Saint Petersburg City - plugins/UserCountry/images/flags/ru.png + plugins/Morpheus/icons/dist/flags/ru.png @@ -375,6 +375,6 @@ us United States California - plugins/UserCountry/images/flags/us.png + plugins/Morpheus/icons/dist/flags/us.png \ No newline at end of file diff --git a/tests/PHPUnit/System/expected/test_ManyVisitorsOneWebsiteTest__UserCountry.getCountry_month.xml b/tests/PHPUnit/System/expected/test_ManyVisitorsOneWebsiteTest__UserCountry.getCountry_month.xml index 82341bda26..3e1bd4e2cc 100644 --- a/tests/PHPUnit/System/expected/test_ManyVisitorsOneWebsiteTest__UserCountry.getCountry_month.xml +++ b/tests/PHPUnit/System/expected/test_ManyVisitorsOneWebsiteTest__UserCountry.getCountry_month.xml @@ -24,10 +24,9 @@ 5 0 gb - plugins/UserCountry/images/flags/gb.png + plugins/Morpheus/icons/dist/flags/gb.png countryCode==gb - 16 - 11 + 16 @@ -53,10 +52,9 @@ 3 0 ca - plugins/UserCountry/images/flags/ca.png + plugins/Morpheus/icons/dist/flags/ca.png countryCode==ca - 16 - 11 + 16 @@ -82,10 +80,9 @@ 2 0 ru - plugins/UserCountry/images/flags/ru.png + plugins/Morpheus/icons/dist/flags/ru.png countryCode==ru - 16 - 11 + 16 @@ -111,10 +108,9 @@ 2 1 us - plugins/UserCountry/images/flags/us.png + plugins/Morpheus/icons/dist/flags/us.png countryCode==us - 16 - 11 + 16 @@ -140,10 +136,9 @@ 1 0 fr - plugins/UserCountry/images/flags/fr.png + plugins/Morpheus/icons/dist/flags/fr.png countryCode==fr - 16 - 11 + 16 @@ -169,10 +164,9 @@ 1 0 id - plugins/UserCountry/images/flags/id.png + plugins/Morpheus/icons/dist/flags/id.png countryCode==id - 16 - 11 + 16 @@ -198,10 +192,9 @@ 1 0 it - plugins/UserCountry/images/flags/it.png + plugins/Morpheus/icons/dist/flags/it.png countryCode==it - 16 - 11 + 16 @@ -227,10 +220,9 @@ 1 0 mk - plugins/UserCountry/images/flags/mk.png + plugins/Morpheus/icons/dist/flags/mk.png countryCode==mk - 16 - 11 + 16 @@ -256,10 +248,9 @@ 1 0 ti - plugins/UserCountry/images/flags/ti.png + plugins/Morpheus/icons/dist/flags/ti.png countryCode==ti - 16 - 11 + 16 @@ -285,9 +276,8 @@ 1 0 xx - plugins/UserCountry/images/flags/xx.png + plugins/Morpheus/icons/dist/flags/xx.png countryCode==xx - 16 - 11 + 16 \ No newline at end of file diff --git a/tests/PHPUnit/System/expected/test_ManyVisitorsOneWebsiteTest__UserCountry.getRegion_month.xml b/tests/PHPUnit/System/expected/test_ManyVisitorsOneWebsiteTest__UserCountry.getRegion_month.xml index 8d74035038..8e963544ee 100644 --- a/tests/PHPUnit/System/expected/test_ManyVisitorsOneWebsiteTest__UserCountry.getRegion_month.xml +++ b/tests/PHPUnit/System/expected/test_ManyVisitorsOneWebsiteTest__UserCountry.getRegion_month.xml @@ -27,7 +27,7 @@ xx Unknown Unknown - plugins/UserCountry/images/flags/xx.png + plugins/Morpheus/icons/dist/flags/xx.png @@ -57,7 +57,7 @@ ca Canada British Columbia - plugins/UserCountry/images/flags/ca.png + plugins/Morpheus/icons/dist/flags/ca.png @@ -87,7 +87,7 @@ gb United Kingdom Warwickshire - plugins/UserCountry/images/flags/gb.png + plugins/Morpheus/icons/dist/flags/gb.png @@ -117,7 +117,7 @@ ru Russia Saint Petersburg City - plugins/UserCountry/images/flags/ru.png + plugins/Morpheus/icons/dist/flags/ru.png @@ -147,7 +147,7 @@ fr France Franche-Comte - plugins/UserCountry/images/flags/fr.png + plugins/Morpheus/icons/dist/flags/fr.png @@ -177,7 +177,7 @@ gb United Kingdom Kent - plugins/UserCountry/images/flags/gb.png + plugins/Morpheus/icons/dist/flags/gb.png @@ -207,7 +207,7 @@ gb United Kingdom London, City of - plugins/UserCountry/images/flags/gb.png + plugins/Morpheus/icons/dist/flags/gb.png @@ -237,7 +237,7 @@ mk Macedonia Miravci - plugins/UserCountry/images/flags/mk.png + plugins/Morpheus/icons/dist/flags/mk.png @@ -267,7 +267,7 @@ ti Tibet Unknown - plugins/UserCountry/images/flags/ti.png + plugins/Morpheus/icons/dist/flags/ti.png @@ -292,6 +292,6 @@ us United States California - plugins/UserCountry/images/flags/us.png + plugins/Morpheus/icons/dist/flags/us.png \ No newline at end of file diff --git a/tests/PHPUnit/System/expected/test_ManyVisitorsOneWebsiteTest_getCountry_with_filter_excludelowpop__UserCountry.getCountry_month.xml b/tests/PHPUnit/System/expected/test_ManyVisitorsOneWebsiteTest_getCountry_with_filter_excludelowpop__UserCountry.getCountry_month.xml index f3a9d2a67c..3281980946 100644 --- a/tests/PHPUnit/System/expected/test_ManyVisitorsOneWebsiteTest_getCountry_with_filter_excludelowpop__UserCountry.getCountry_month.xml +++ b/tests/PHPUnit/System/expected/test_ManyVisitorsOneWebsiteTest_getCountry_with_filter_excludelowpop__UserCountry.getCountry_month.xml @@ -24,10 +24,9 @@ 5 0 gb - plugins/UserCountry/images/flags/gb.png + plugins/Morpheus/icons/dist/flags/gb.png countryCode==gb - 16 - 11 + 16 @@ -53,9 +52,8 @@ 3 0 ca - plugins/UserCountry/images/flags/ca.png + plugins/Morpheus/icons/dist/flags/ca.png countryCode==ca - 16 - 11 + 16 \ No newline at end of file diff --git a/tests/PHPUnit/System/expected/test_ManyVisitorsOneWebsiteTest_segment_city__UserCountry.getCity_month.xml b/tests/PHPUnit/System/expected/test_ManyVisitorsOneWebsiteTest_segment_city__UserCountry.getCity_month.xml index 312160ddd2..e170d8d501 100644 --- a/tests/PHPUnit/System/expected/test_ManyVisitorsOneWebsiteTest_segment_city__UserCountry.getCity_month.xml +++ b/tests/PHPUnit/System/expected/test_ManyVisitorsOneWebsiteTest_segment_city__UserCountry.getCity_month.xml @@ -31,6 +31,6 @@ gb United Kingdom Warwickshire - plugins/UserCountry/images/flags/gb.png + plugins/Morpheus/icons/dist/flags/gb.png \ No newline at end of file diff --git a/tests/PHPUnit/System/expected/test_ManyVisitorsOneWebsiteTest_segment_city__UserCountry.getCountry_month.xml b/tests/PHPUnit/System/expected/test_ManyVisitorsOneWebsiteTest_segment_city__UserCountry.getCountry_month.xml index 14cb04d3d7..01782fba66 100644 --- a/tests/PHPUnit/System/expected/test_ManyVisitorsOneWebsiteTest_segment_city__UserCountry.getCountry_month.xml +++ b/tests/PHPUnit/System/expected/test_ManyVisitorsOneWebsiteTest_segment_city__UserCountry.getCountry_month.xml @@ -24,9 +24,8 @@ 2 0 gb - plugins/UserCountry/images/flags/gb.png + plugins/Morpheus/icons/dist/flags/gb.png countryCode==gb - 16 - 11 + 16 \ No newline at end of file diff --git a/tests/PHPUnit/System/expected/test_ManyVisitorsOneWebsiteTest_segment_city__UserCountry.getRegion_month.xml b/tests/PHPUnit/System/expected/test_ManyVisitorsOneWebsiteTest_segment_city__UserCountry.getRegion_month.xml index eb777c4f04..05f987deef 100644 --- a/tests/PHPUnit/System/expected/test_ManyVisitorsOneWebsiteTest_segment_city__UserCountry.getRegion_month.xml +++ b/tests/PHPUnit/System/expected/test_ManyVisitorsOneWebsiteTest_segment_city__UserCountry.getRegion_month.xml @@ -28,6 +28,6 @@ gb United Kingdom Warwickshire - plugins/UserCountry/images/flags/gb.png + plugins/Morpheus/icons/dist/flags/gb.png \ No newline at end of file diff --git a/tests/PHPUnit/System/expected/test_ManyVisitorsOneWebsiteTest_segment_continent__UserCountry.getCountry_month.xml b/tests/PHPUnit/System/expected/test_ManyVisitorsOneWebsiteTest_segment_continent__UserCountry.getCountry_month.xml index c8d94aac7e..48db8ab5db 100644 --- a/tests/PHPUnit/System/expected/test_ManyVisitorsOneWebsiteTest_segment_continent__UserCountry.getCountry_month.xml +++ b/tests/PHPUnit/System/expected/test_ManyVisitorsOneWebsiteTest_segment_continent__UserCountry.getCountry_month.xml @@ -24,10 +24,9 @@ 5 0 gb - plugins/UserCountry/images/flags/gb.png + plugins/Morpheus/icons/dist/flags/gb.png countryCode==gb - 16 - 11 + 16 @@ -53,10 +52,9 @@ 2 0 ru - plugins/UserCountry/images/flags/ru.png + plugins/Morpheus/icons/dist/flags/ru.png countryCode==ru - 16 - 11 + 16 @@ -82,10 +80,9 @@ 1 0 fr - plugins/UserCountry/images/flags/fr.png + plugins/Morpheus/icons/dist/flags/fr.png countryCode==fr - 16 - 11 + 16 @@ -111,10 +108,9 @@ 1 0 it - plugins/UserCountry/images/flags/it.png + plugins/Morpheus/icons/dist/flags/it.png countryCode==it - 16 - 11 + 16 @@ -140,9 +136,8 @@ 1 0 mk - plugins/UserCountry/images/flags/mk.png + plugins/Morpheus/icons/dist/flags/mk.png countryCode==mk - 16 - 11 + 16 \ No newline at end of file diff --git a/tests/PHPUnit/System/expected/test_ManyVisitorsOneWebsiteTest_segment_lat_long__UserCountry.getCity_month.xml b/tests/PHPUnit/System/expected/test_ManyVisitorsOneWebsiteTest_segment_lat_long__UserCountry.getCity_month.xml index 092f2c0db8..cb1ce9b492 100644 --- a/tests/PHPUnit/System/expected/test_ManyVisitorsOneWebsiteTest_segment_lat_long__UserCountry.getCity_month.xml +++ b/tests/PHPUnit/System/expected/test_ManyVisitorsOneWebsiteTest_segment_lat_long__UserCountry.getCity_month.xml @@ -31,6 +31,6 @@ ca Canada British Columbia - plugins/UserCountry/images/flags/ca.png + plugins/Morpheus/icons/dist/flags/ca.png \ No newline at end of file diff --git a/tests/PHPUnit/System/expected/test_ManyVisitorsOneWebsiteTest_segment_lat_long__UserCountry.getCountry_month.xml b/tests/PHPUnit/System/expected/test_ManyVisitorsOneWebsiteTest_segment_lat_long__UserCountry.getCountry_month.xml index e4b7c8e8ff..5c1e0ee7b7 100644 --- a/tests/PHPUnit/System/expected/test_ManyVisitorsOneWebsiteTest_segment_lat_long__UserCountry.getCountry_month.xml +++ b/tests/PHPUnit/System/expected/test_ManyVisitorsOneWebsiteTest_segment_lat_long__UserCountry.getCountry_month.xml @@ -24,9 +24,8 @@ 3 0 ca - plugins/UserCountry/images/flags/ca.png + plugins/Morpheus/icons/dist/flags/ca.png countryCode==ca - 16 - 11 + 16 \ No newline at end of file diff --git a/tests/PHPUnit/System/expected/test_ManyVisitorsOneWebsiteTest_segment_lat_long__UserCountry.getRegion_month.xml b/tests/PHPUnit/System/expected/test_ManyVisitorsOneWebsiteTest_segment_lat_long__UserCountry.getRegion_month.xml index dc4bb6c0af..5b6c579fd9 100644 --- a/tests/PHPUnit/System/expected/test_ManyVisitorsOneWebsiteTest_segment_lat_long__UserCountry.getRegion_month.xml +++ b/tests/PHPUnit/System/expected/test_ManyVisitorsOneWebsiteTest_segment_lat_long__UserCountry.getRegion_month.xml @@ -28,6 +28,6 @@ ca Canada British Columbia - plugins/UserCountry/images/flags/ca.png + plugins/Morpheus/icons/dist/flags/ca.png \ No newline at end of file diff --git a/tests/PHPUnit/System/expected/test_ManyVisitorsOneWebsiteTest_segment_region__UserCountry.getCity_month.xml b/tests/PHPUnit/System/expected/test_ManyVisitorsOneWebsiteTest_segment_region__UserCountry.getCity_month.xml index aefcded3e8..26ea4337d0 100644 --- a/tests/PHPUnit/System/expected/test_ManyVisitorsOneWebsiteTest_segment_region__UserCountry.getCity_month.xml +++ b/tests/PHPUnit/System/expected/test_ManyVisitorsOneWebsiteTest_segment_region__UserCountry.getCity_month.xml @@ -31,7 +31,7 @@ gb United Kingdom Warwickshire - plugins/UserCountry/images/flags/gb.png + plugins/Morpheus/icons/dist/flags/gb.png @@ -62,6 +62,6 @@ gb United Kingdom Warwickshire - plugins/UserCountry/images/flags/gb.png + plugins/Morpheus/icons/dist/flags/gb.png \ No newline at end of file diff --git a/tests/PHPUnit/System/expected/test_ManyVisitorsOneWebsiteTest_segment_region__UserCountry.getCountry_month.xml b/tests/PHPUnit/System/expected/test_ManyVisitorsOneWebsiteTest_segment_region__UserCountry.getCountry_month.xml index 69cd5479ef..4b743fcad0 100644 --- a/tests/PHPUnit/System/expected/test_ManyVisitorsOneWebsiteTest_segment_region__UserCountry.getCountry_month.xml +++ b/tests/PHPUnit/System/expected/test_ManyVisitorsOneWebsiteTest_segment_region__UserCountry.getCountry_month.xml @@ -24,9 +24,8 @@ 3 0 gb - plugins/UserCountry/images/flags/gb.png + plugins/Morpheus/icons/dist/flags/gb.png countryCode==gb - 16 - 11 + 16 \ No newline at end of file diff --git a/tests/PHPUnit/System/expected/test_ManyVisitorsOneWebsiteTest_segment_region__UserCountry.getRegion_month.xml b/tests/PHPUnit/System/expected/test_ManyVisitorsOneWebsiteTest_segment_region__UserCountry.getRegion_month.xml index 7dc6b84073..bbe13fca3c 100644 --- a/tests/PHPUnit/System/expected/test_ManyVisitorsOneWebsiteTest_segment_region__UserCountry.getRegion_month.xml +++ b/tests/PHPUnit/System/expected/test_ManyVisitorsOneWebsiteTest_segment_region__UserCountry.getRegion_month.xml @@ -28,6 +28,6 @@ gb United Kingdom Warwickshire - plugins/UserCountry/images/flags/gb.png + plugins/Morpheus/icons/dist/flags/gb.png \ No newline at end of file diff --git a/tests/PHPUnit/System/expected/test_OneVisitorTwoVisits__UserCountry.getCity_day.xml b/tests/PHPUnit/System/expected/test_OneVisitorTwoVisits__UserCountry.getCity_day.xml index e2562def53..c0135236f8 100644 --- a/tests/PHPUnit/System/expected/test_OneVisitorTwoVisits__UserCountry.getCity_day.xml +++ b/tests/PHPUnit/System/expected/test_OneVisitorTwoVisits__UserCountry.getCity_day.xml @@ -28,6 +28,6 @@ xx Unknown Unknown - plugins/UserCountry/images/flags/xx.png + plugins/Morpheus/icons/dist/flags/xx.png \ No newline at end of file diff --git a/tests/PHPUnit/System/expected/test_OneVisitorTwoVisits__UserCountry.getCountry_day.xml b/tests/PHPUnit/System/expected/test_OneVisitorTwoVisits__UserCountry.getCountry_day.xml index d358b9a330..01c30c1a1b 100644 --- a/tests/PHPUnit/System/expected/test_OneVisitorTwoVisits__UserCountry.getCountry_day.xml +++ b/tests/PHPUnit/System/expected/test_OneVisitorTwoVisits__UserCountry.getCountry_day.xml @@ -23,7 +23,7 @@ 2 43 fr - plugins/UserCountry/images/flags/fr.png + plugins/Morpheus/icons/dist/flags/fr.png countryCode==fr 16 11 diff --git a/tests/PHPUnit/System/expected/test_OneVisitorTwoVisits__UserCountry.getRegion_day.xml b/tests/PHPUnit/System/expected/test_OneVisitorTwoVisits__UserCountry.getRegion_day.xml index a32f142d6e..be4c941999 100644 --- a/tests/PHPUnit/System/expected/test_OneVisitorTwoVisits__UserCountry.getRegion_day.xml +++ b/tests/PHPUnit/System/expected/test_OneVisitorTwoVisits__UserCountry.getRegion_day.xml @@ -26,6 +26,6 @@ xx Unknown Unknown - plugins/UserCountry/images/flags/xx.png + plugins/Morpheus/icons/dist/flags/xx.png \ No newline at end of file diff --git a/tests/PHPUnit/System/expected/test_OneVisitorTwoVisits_withCookieSupport__Live.getLastVisitsDetails_day.xml b/tests/PHPUnit/System/expected/test_OneVisitorTwoVisits_withCookieSupport__Live.getLastVisitsDetails_day.xml index ef0c6d4fcf..7884fcdf89 100644 --- a/tests/PHPUnit/System/expected/test_OneVisitorTwoVisits_withCookieSupport__Live.getLastVisitsDetails_day.xml +++ b/tests/PHPUnit/System/expected/test_OneVisitorTwoVisits_withCookieSupport__Live.getLastVisitsDetails_day.xml @@ -85,7 +85,7 @@ eur France fr - plugins/UserCountry/images/flags/fr.png + plugins/Morpheus/icons/dist/flags/fr.png @@ -114,10 +114,10 @@ - 0.00 + 0 0 0 - 0.00 + 0 0 0 @@ -303,7 +303,7 @@ eur France fr - plugins/UserCountry/images/flags/fr.png + plugins/Morpheus/icons/dist/flags/fr.png @@ -332,10 +332,10 @@ - 0.00 + 0 0 0 - 0.00 + 0 0 0 diff --git a/tests/PHPUnit/System/expected/test_OneVisitorTwoVisits_withCookieSupport__UserCountry.getCity_day.xml b/tests/PHPUnit/System/expected/test_OneVisitorTwoVisits_withCookieSupport__UserCountry.getCity_day.xml index 0c927196d9..7a36771e5e 100644 --- a/tests/PHPUnit/System/expected/test_OneVisitorTwoVisits_withCookieSupport__UserCountry.getCity_day.xml +++ b/tests/PHPUnit/System/expected/test_OneVisitorTwoVisits_withCookieSupport__UserCountry.getCity_day.xml @@ -29,6 +29,6 @@ xx Unknown Unknown - plugins/UserCountry/images/flags/xx.png + plugins/Morpheus/icons/dist/flags/xx.png \ No newline at end of file diff --git a/tests/PHPUnit/System/expected/test_OneVisitorTwoVisits_withCookieSupport__UserCountry.getCountry_day.xml b/tests/PHPUnit/System/expected/test_OneVisitorTwoVisits_withCookieSupport__UserCountry.getCountry_day.xml index c95226160c..45bb6b9f18 100644 --- a/tests/PHPUnit/System/expected/test_OneVisitorTwoVisits_withCookieSupport__UserCountry.getCountry_day.xml +++ b/tests/PHPUnit/System/expected/test_OneVisitorTwoVisits_withCookieSupport__UserCountry.getCountry_day.xml @@ -24,9 +24,8 @@ 2 43 fr - plugins/UserCountry/images/flags/fr.png + plugins/Morpheus/icons/dist/flags/fr.png countryCode==fr - 16 - 11 + 16 \ No newline at end of file diff --git a/tests/PHPUnit/System/expected/test_OneVisitorTwoVisits_withCookieSupport__UserCountry.getRegion_day.xml b/tests/PHPUnit/System/expected/test_OneVisitorTwoVisits_withCookieSupport__UserCountry.getRegion_day.xml index 2a364cd566..d1663e0ee4 100644 --- a/tests/PHPUnit/System/expected/test_OneVisitorTwoVisits_withCookieSupport__UserCountry.getRegion_day.xml +++ b/tests/PHPUnit/System/expected/test_OneVisitorTwoVisits_withCookieSupport__UserCountry.getRegion_day.xml @@ -27,6 +27,6 @@ xx Unknown Unknown - plugins/UserCountry/images/flags/xx.png + plugins/Morpheus/icons/dist/flags/xx.png \ No newline at end of file diff --git a/tests/PHPUnit/System/expected/test_OneVisitor_NoKeywordSpecified__Live.getLastVisitsDetails_day.xml b/tests/PHPUnit/System/expected/test_OneVisitor_NoKeywordSpecified__Live.getLastVisitsDetails_day.xml index c75da162ca..ce7e76cd29 100644 --- a/tests/PHPUnit/System/expected/test_OneVisitor_NoKeywordSpecified__Live.getLastVisitsDetails_day.xml +++ b/tests/PHPUnit/System/expected/test_OneVisitor_NoKeywordSpecified__Live.getLastVisitsDetails_day.xml @@ -72,7 +72,7 @@ eur France fr - plugins/UserCountry/images/flags/fr.png + plugins/Morpheus/icons/dist/flags/fr.png @@ -101,10 +101,10 @@ - 0.00 + 0 0 0 - 0.00 + 0 0 0 @@ -193,7 +193,7 @@ eur France fr - plugins/UserCountry/images/flags/fr.png + plugins/Morpheus/icons/dist/flags/fr.png @@ -222,10 +222,10 @@ - 0.00 + 0 0 0 - 0.00 + 0 0 0 diff --git a/tests/PHPUnit/System/expected/test_OneVisitor_SeveralDays_ImportedInRandomOrderTest_shouldShowOneVisit_InEachOfThreeDays__Live.getLastVisitsDetails_month.xml b/tests/PHPUnit/System/expected/test_OneVisitor_SeveralDays_ImportedInRandomOrderTest_shouldShowOneVisit_InEachOfThreeDays__Live.getLastVisitsDetails_month.xml index 00e9c1cdba..6e1b82df61 100644 --- a/tests/PHPUnit/System/expected/test_OneVisitor_SeveralDays_ImportedInRandomOrderTest_shouldShowOneVisit_InEachOfThreeDays__Live.getLastVisitsDetails_month.xml +++ b/tests/PHPUnit/System/expected/test_OneVisitor_SeveralDays_ImportedInRandomOrderTest_shouldShowOneVisit_InEachOfThreeDays__Live.getLastVisitsDetails_month.xml @@ -77,7 +77,7 @@ unk Unknown xx - plugins/UserCountry/images/flags/xx.png + plugins/Morpheus/icons/dist/flags/xx.png @@ -97,10 +97,10 @@ Sunday, April 7, 2013 Sunday, April 7, 2013 10:00:00 - 0.00 + 0 0 0 - 0.00 + 0 0 0 @@ -181,7 +181,7 @@ unk Unknown xx - plugins/UserCountry/images/flags/xx.png + plugins/Morpheus/icons/dist/flags/xx.png @@ -201,10 +201,10 @@ Saturday, April 6, 2013 Saturday, April 6, 2013 11:00:00 - 0.00 + 0 0 0 - 0.00 + 0 0 0 @@ -285,7 +285,7 @@ unk Unknown xx - plugins/UserCountry/images/flags/xx.png + plugins/Morpheus/icons/dist/flags/xx.png @@ -305,10 +305,10 @@ Friday, April 5, 2013 Friday, April 5, 2013 12:00:00 - 0.00 + 0 0 0 - 0.00 + 0 0 0 diff --git a/tests/PHPUnit/System/expected/test_TimezonesTest__Live.getLastVisitsDetails_day.xml b/tests/PHPUnit/System/expected/test_TimezonesTest__Live.getLastVisitsDetails_day.xml index 0fba801755..6b911721dd 100644 --- a/tests/PHPUnit/System/expected/test_TimezonesTest__Live.getLastVisitsDetails_day.xml +++ b/tests/PHPUnit/System/expected/test_TimezonesTest__Live.getLastVisitsDetails_day.xml @@ -72,7 +72,7 @@ eur France fr - plugins/UserCountry/images/flags/fr.png + plugins/Morpheus/icons/dist/flags/fr.png @@ -101,10 +101,10 @@ - 0.00 + 0 0 0 - 0.00 + 0 0 0 diff --git a/tests/PHPUnit/System/expected/test_TwoVisitors_twoWebsites_differentDays_scheduled_report_in_html_tables_and_graph__ScheduledReports.generateReport_month.original.html b/tests/PHPUnit/System/expected/test_TwoVisitors_twoWebsites_differentDays_scheduled_report_in_html_tables_and_graph__ScheduledReports.generateReport_month.original.html index 95b5726131..a20f435ec9 100644 --- a/tests/PHPUnit/System/expected/test_TwoVisitors_twoWebsites_differentDays_scheduled_report_in_html_tables_and_graph__ScheduledReports.generateReport_month.original.html +++ b/tests/PHPUnit/System/expected/test_TwoVisitors_twoWebsites_differentDays_scheduled_report_in_html_tables_and_graph__ScheduledReports.generateReport_month.original.html @@ -599,7 +599,7 @@ - +   Unknown @@ -624,7 +624,7 @@ - +   Desktop @@ -762,7 +762,7 @@ - +   Unknown @@ -923,7 +923,7 @@ - +   Unknown @@ -948,7 +948,7 @@ - +   Windows XP @@ -1018,7 +1018,7 @@ - +   Unknown @@ -1043,7 +1043,7 @@ - +   Firefox @@ -1068,7 +1068,7 @@ - +   Opera @@ -1138,7 +1138,7 @@ - +   Unknown @@ -1163,7 +1163,7 @@ - +   Firefox 3.6 @@ -1188,7 +1188,7 @@ - +   Opera 9.63 @@ -1372,7 +1372,7 @@ - +   Unknown @@ -1397,7 +1397,7 @@ - +   Windows @@ -1569,7 +1569,7 @@ - +   Cookie @@ -1582,7 +1582,7 @@ - +   Flash @@ -1595,7 +1595,7 @@ - +   Java @@ -1608,7 +1608,7 @@ - +   Director @@ -1621,7 +1621,7 @@ - +   Gears @@ -1634,7 +1634,7 @@ - +   Pdf @@ -1647,7 +1647,7 @@ - +   Quicktime @@ -1660,7 +1660,7 @@ - +   Realplayer @@ -1673,7 +1673,7 @@ - +   Silverlight @@ -1686,7 +1686,7 @@ - +   Windowsmedia @@ -1708,7 +1708,7 @@ @@ -1744,7 +1744,7 @@ - +   Unknown @@ -1769,7 +1769,7 @@ - +   France @@ -1894,7 +1894,7 @@ @@ -1930,7 +1930,7 @@ - +   Unknown @@ -2055,7 +2055,7 @@ @@ -2091,7 +2091,7 @@ - +   Unknown diff --git a/tests/PHPUnit/System/expected/test_TwoVisitors_twoWebsites_differentDays_scheduled_report_in_html_tables_only__ScheduledReports.generateReport_month.original.html b/tests/PHPUnit/System/expected/test_TwoVisitors_twoWebsites_differentDays_scheduled_report_in_html_tables_only__ScheduledReports.generateReport_month.original.html index 6369647644..e89f30802e 100644 --- a/tests/PHPUnit/System/expected/test_TwoVisitors_twoWebsites_differentDays_scheduled_report_in_html_tables_only__ScheduledReports.generateReport_month.original.html +++ b/tests/PHPUnit/System/expected/test_TwoVisitors_twoWebsites_differentDays_scheduled_report_in_html_tables_only__ScheduledReports.generateReport_month.original.html @@ -578,7 +578,7 @@ - +   Unknown @@ -603,7 +603,7 @@ - +   Desktop @@ -727,7 +727,7 @@ - +   Unknown @@ -874,7 +874,7 @@ - +   Unknown @@ -899,7 +899,7 @@ - +   Windows XP @@ -962,7 +962,7 @@ - +   Unknown @@ -987,7 +987,7 @@ - +   Firefox @@ -1012,7 +1012,7 @@ - +   Opera @@ -1075,7 +1075,7 @@ - +   Unknown @@ -1100,7 +1100,7 @@ - +   Firefox 3.6 @@ -1125,7 +1125,7 @@ - +   Opera 9.63 @@ -1295,7 +1295,7 @@ - +   Unknown @@ -1320,7 +1320,7 @@ - +   Windows @@ -1478,7 +1478,7 @@ - +   Cookie @@ -1491,7 +1491,7 @@ - +   Flash @@ -1504,7 +1504,7 @@ - +   Java @@ -1517,7 +1517,7 @@ - +   Director @@ -1530,7 +1530,7 @@ - +   Gears @@ -1543,7 +1543,7 @@ - +   Pdf @@ -1556,7 +1556,7 @@ - +   Quicktime @@ -1569,7 +1569,7 @@ - +   Realplayer @@ -1582,7 +1582,7 @@ - +   Silverlight @@ -1595,7 +1595,7 @@ - +   Windowsmedia @@ -1646,7 +1646,7 @@ - +   Unknown @@ -1671,7 +1671,7 @@ - +   France @@ -1818,7 +1818,7 @@ - +   Unknown @@ -1965,7 +1965,7 @@ - +   Unknown diff --git a/tests/PHPUnit/System/expected/test_TwoVisitors_twoWebsites_differentDays_scheduled_report_in_pdf_tables_only__ScheduledReports.generateReport_month.original.pdf b/tests/PHPUnit/System/expected/test_TwoVisitors_twoWebsites_differentDays_scheduled_report_in_pdf_tables_only__ScheduledReports.generateReport_month.original.pdf index adda5aaba5..906bc48da4 100644 Binary files a/tests/PHPUnit/System/expected/test_TwoVisitors_twoWebsites_differentDays_scheduled_report_in_pdf_tables_only__ScheduledReports.generateReport_month.original.pdf and b/tests/PHPUnit/System/expected/test_TwoVisitors_twoWebsites_differentDays_scheduled_report_in_pdf_tables_only__ScheduledReports.generateReport_month.original.pdf differ diff --git a/tests/PHPUnit/System/expected/test_apiGetReportMetadata__API.getProcessedReport_day.xml b/tests/PHPUnit/System/expected/test_apiGetReportMetadata__API.getProcessedReport_day.xml index 286c0b87bf..406af740bc 100644 --- a/tests/PHPUnit/System/expected/test_apiGetReportMetadata__API.getProcessedReport_day.xml +++ b/tests/PHPUnit/System/expected/test_apiGetReportMetadata__API.getProcessedReport_day.xml @@ -65,10 +65,9 @@ fr - plugins/UserCountry/images/flags/fr.png + plugins/Morpheus/icons/dist/flags/fr.png countryCode==fr - 16 - 11 + 16 diff --git a/tests/PHPUnit/System/expected/test_apiGetReportMetadata_showRawMetrics__API.getProcessedReport_day.xml b/tests/PHPUnit/System/expected/test_apiGetReportMetadata_showRawMetrics__API.getProcessedReport_day.xml index 7b6386371b..8fac78a731 100644 --- a/tests/PHPUnit/System/expected/test_apiGetReportMetadata_showRawMetrics__API.getProcessedReport_day.xml +++ b/tests/PHPUnit/System/expected/test_apiGetReportMetadata_showRawMetrics__API.getProcessedReport_day.xml @@ -78,10 +78,9 @@ fr - plugins/UserCountry/images/flags/fr.png + plugins/Morpheus/icons/dist/flags/fr.png countryCode==fr - 16 - 11 + 16 diff --git a/tests/PHPUnit/System/expected/test_csvExport__Live.getLastVisitsDetails_day.csv b/tests/PHPUnit/System/expected/test_csvExport__Live.getLastVisitsDetails_day.csv index a6d50f68e5..6f949c9790 100644 Binary files a/tests/PHPUnit/System/expected/test_csvExport__Live.getLastVisitsDetails_day.csv and b/tests/PHPUnit/System/expected/test_csvExport__Live.getLastVisitsDetails_day.csv differ diff --git a/tests/PHPUnit/System/expected/test_ecommerceOrderWithItems_LiveEcommerceStatusOrdered__Live.getLastVisitsDetails_day.xml b/tests/PHPUnit/System/expected/test_ecommerceOrderWithItems_LiveEcommerceStatusOrdered__Live.getLastVisitsDetails_day.xml index d931369c63..65dcc1a5e3 100755 --- a/tests/PHPUnit/System/expected/test_ecommerceOrderWithItems_LiveEcommerceStatusOrdered__Live.getLastVisitsDetails_day.xml +++ b/tests/PHPUnit/System/expected/test_ecommerceOrderWithItems_LiveEcommerceStatusOrdered__Live.getLastVisitsDetails_day.xml @@ -98,7 +98,7 @@ eur Poland pl - plugins/UserCountry/images/flags/pl.png + plugins/Morpheus/icons/dist/flags/pl.png @@ -327,7 +327,7 @@ eur Poland pl - plugins/UserCountry/images/flags/pl.png + plugins/Morpheus/icons/dist/flags/pl.png diff --git a/tests/PHPUnit/System/expected/test_ecommerceOrderWithItems__API.getProcessedReport_day.xml b/tests/PHPUnit/System/expected/test_ecommerceOrderWithItems__API.getProcessedReport_day.xml index 4a63c7e22e..8019f8be6b 100755 --- a/tests/PHPUnit/System/expected/test_ecommerceOrderWithItems__API.getProcessedReport_day.xml +++ b/tests/PHPUnit/System/expected/test_ecommerceOrderWithItems__API.getProcessedReport_day.xml @@ -75,17 +75,15 @@ pl - plugins/UserCountry/images/flags/pl.png + plugins/Morpheus/icons/dist/flags/pl.png countryCode==pl - 16 - 11 + 16 fr - plugins/UserCountry/images/flags/fr.png + plugins/Morpheus/icons/dist/flags/fr.png countryCode==fr - 16 - 11 + 16 diff --git a/tests/PHPUnit/System/expected/test_ecommerceOrderWithItems__Live.getLastVisitsDetails_day.xml b/tests/PHPUnit/System/expected/test_ecommerceOrderWithItems__Live.getLastVisitsDetails_day.xml index 8504c298e6..6b870a80fd 100755 --- a/tests/PHPUnit/System/expected/test_ecommerceOrderWithItems__Live.getLastVisitsDetails_day.xml +++ b/tests/PHPUnit/System/expected/test_ecommerceOrderWithItems__Live.getLastVisitsDetails_day.xml @@ -181,7 +181,7 @@ eur Poland pl - plugins/UserCountry/images/flags/pl.png + plugins/Morpheus/icons/dist/flags/pl.png @@ -537,7 +537,7 @@ eur Poland pl - plugins/UserCountry/images/flags/pl.png + plugins/Morpheus/icons/dist/flags/pl.png @@ -775,7 +775,7 @@ eur France fr - plugins/UserCountry/images/flags/fr.png + plugins/Morpheus/icons/dist/flags/fr.png diff --git a/tests/PHPUnit/System/expected/test_ecommerceOrderWithItems__UserCountry.getCity_day.xml b/tests/PHPUnit/System/expected/test_ecommerceOrderWithItems__UserCountry.getCity_day.xml index 995d52a578..1fbd1b3ea7 100755 --- a/tests/PHPUnit/System/expected/test_ecommerceOrderWithItems__UserCountry.getCity_day.xml +++ b/tests/PHPUnit/System/expected/test_ecommerceOrderWithItems__UserCountry.getCity_day.xml @@ -40,6 +40,6 @@ xx Unknown Unknown - plugins/UserCountry/images/flags/xx.png + plugins/Morpheus/icons/dist/flags/xx.png \ No newline at end of file diff --git a/tests/PHPUnit/System/expected/test_ecommerceOrderWithItems__UserCountry.getCountry_day.xml b/tests/PHPUnit/System/expected/test_ecommerceOrderWithItems__UserCountry.getCountry_day.xml index 284c301614..c30519b3db 100755 --- a/tests/PHPUnit/System/expected/test_ecommerceOrderWithItems__UserCountry.getCountry_day.xml +++ b/tests/PHPUnit/System/expected/test_ecommerceOrderWithItems__UserCountry.getCountry_day.xml @@ -30,10 +30,9 @@ 2 3111.11 pl - plugins/UserCountry/images/flags/pl.png + plugins/Morpheus/icons/dist/flags/pl.png countryCode==pl - 16 - 11 + 16 @@ -54,9 +53,8 @@ 1 10 fr - plugins/UserCountry/images/flags/fr.png + plugins/Morpheus/icons/dist/flags/fr.png countryCode==fr - 16 - 11 + 16 \ No newline at end of file diff --git a/tests/PHPUnit/System/expected/test_ecommerceOrderWithItems__UserCountry.getRegion_day.xml b/tests/PHPUnit/System/expected/test_ecommerceOrderWithItems__UserCountry.getRegion_day.xml index 6f6499cc36..3d891a7b3e 100755 --- a/tests/PHPUnit/System/expected/test_ecommerceOrderWithItems__UserCountry.getRegion_day.xml +++ b/tests/PHPUnit/System/expected/test_ecommerceOrderWithItems__UserCountry.getRegion_day.xml @@ -38,6 +38,6 @@ xx Unknown Unknown - plugins/UserCountry/images/flags/xx.png + plugins/Morpheus/icons/dist/flags/xx.png \ No newline at end of file diff --git a/tests/PHPUnit/System/expected/test_ecommerceOrderWithItems_scheduled_report_in_html_tables_and_graph__ScheduledReports.generateReport_week.original.html b/tests/PHPUnit/System/expected/test_ecommerceOrderWithItems_scheduled_report_in_html_tables_and_graph__ScheduledReports.generateReport_week.original.html index d0e86d01ac..549a8099a7 100644 --- a/tests/PHPUnit/System/expected/test_ecommerceOrderWithItems_scheduled_report_in_html_tables_and_graph__ScheduledReports.generateReport_week.original.html +++ b/tests/PHPUnit/System/expected/test_ecommerceOrderWithItems_scheduled_report_in_html_tables_and_graph__ScheduledReports.generateReport_week.original.html @@ -767,7 +767,7 @@ - +   Desktop @@ -905,7 +905,7 @@ - +   Unknown @@ -1043,7 +1043,7 @@ - +   Windows XP @@ -1113,7 +1113,7 @@ - +   Firefox @@ -1183,7 +1183,7 @@ - +   Firefox 3.6 @@ -1321,7 +1321,7 @@ - +   Windows @@ -1447,7 +1447,7 @@ - +   Cookie @@ -1460,7 +1460,7 @@ - +   Flash @@ -1473,7 +1473,7 @@ - +   Java @@ -1486,7 +1486,7 @@ - +   Director @@ -1499,7 +1499,7 @@ - +   Gears @@ -1512,7 +1512,7 @@ - +   Pdf @@ -1525,7 +1525,7 @@ - +   Quicktime @@ -1538,7 +1538,7 @@ - +   Realplayer @@ -1551,7 +1551,7 @@ - +   Silverlight @@ -1564,7 +1564,7 @@ - +   Windowsmedia @@ -1586,7 +1586,7 @@ @@ -1622,7 +1622,7 @@ - +   Poland @@ -1647,7 +1647,7 @@ - +   France @@ -1749,7 +1749,7 @@ @@ -1785,7 +1785,7 @@ - +   Unknown @@ -1910,7 +1910,7 @@ @@ -1946,7 +1946,7 @@ - +   Unknown diff --git a/tests/PHPUnit/System/expected/test_ecommerceOrderWithItems_scheduled_report_in_html_tables_only__ScheduledReports.generateReport_week.original.html b/tests/PHPUnit/System/expected/test_ecommerceOrderWithItems_scheduled_report_in_html_tables_only__ScheduledReports.generateReport_week.original.html index e4e55f4bc1..f9f4d5404a 100644 --- a/tests/PHPUnit/System/expected/test_ecommerceOrderWithItems_scheduled_report_in_html_tables_only__ScheduledReports.generateReport_week.original.html +++ b/tests/PHPUnit/System/expected/test_ecommerceOrderWithItems_scheduled_report_in_html_tables_only__ScheduledReports.generateReport_week.original.html @@ -739,7 +739,7 @@ - +   Desktop @@ -863,7 +863,7 @@ - +   Unknown @@ -987,7 +987,7 @@ - +   Windows XP @@ -1050,7 +1050,7 @@ - +   Firefox @@ -1113,7 +1113,7 @@ - +   Firefox 3.6 @@ -1237,7 +1237,7 @@ - +   Windows @@ -1349,7 +1349,7 @@ - +   Cookie @@ -1362,7 +1362,7 @@ - +   Flash @@ -1375,7 +1375,7 @@ - +   Java @@ -1388,7 +1388,7 @@ - +   Director @@ -1401,7 +1401,7 @@ - +   Gears @@ -1414,7 +1414,7 @@ - +   Pdf @@ -1427,7 +1427,7 @@ - +   Quicktime @@ -1440,7 +1440,7 @@ - +   Realplayer @@ -1453,7 +1453,7 @@ - +   Silverlight @@ -1466,7 +1466,7 @@ - +   Windowsmedia @@ -1517,7 +1517,7 @@ - +   Poland @@ -1542,7 +1542,7 @@ - +   France @@ -1666,7 +1666,7 @@ - +   Unknown @@ -1813,7 +1813,7 @@ - +   Unknown diff --git a/tests/PHPUnit/System/expected/test_ecommerceOrderWithItems_scheduled_report_in_pdf_tables_only__ScheduledReports.generateReport_week.original.pdf b/tests/PHPUnit/System/expected/test_ecommerceOrderWithItems_scheduled_report_in_pdf_tables_only__ScheduledReports.generateReport_week.original.pdf index 8bf8259f0d..a22fba16e5 100644 Binary files a/tests/PHPUnit/System/expected/test_ecommerceOrderWithItems_scheduled_report_in_pdf_tables_only__ScheduledReports.generateReport_week.original.pdf and b/tests/PHPUnit/System/expected/test_ecommerceOrderWithItems_scheduled_report_in_pdf_tables_only__ScheduledReports.generateReport_week.original.pdf differ diff --git a/tests/PHPUnit/System/expected/test_oneVisitor_oneWebsite_severalDays_DateRange__UserCountry.getCountry_range.xml b/tests/PHPUnit/System/expected/test_oneVisitor_oneWebsite_severalDays_DateRange__UserCountry.getCountry_range.xml index 1e511f6135..c807579102 100644 --- a/tests/PHPUnit/System/expected/test_oneVisitor_oneWebsite_severalDays_DateRange__UserCountry.getCountry_range.xml +++ b/tests/PHPUnit/System/expected/test_oneVisitor_oneWebsite_severalDays_DateRange__UserCountry.getCountry_range.xml @@ -11,9 +11,8 @@ 4 0 fr - plugins/UserCountry/images/flags/fr.png + plugins/Morpheus/icons/dist/flags/fr.png countryCode==fr - 16 - 11 + 16 \ No newline at end of file diff --git a/tests/PHPUnit/System/expected/test_periodIsRange_dateIsLastN_MetadataAndNormalAPI__API.getProcessedReport_range.xml b/tests/PHPUnit/System/expected/test_periodIsRange_dateIsLastN_MetadataAndNormalAPI__API.getProcessedReport_range.xml index f01ce588fb..fc0189404c 100644 --- a/tests/PHPUnit/System/expected/test_periodIsRange_dateIsLastN_MetadataAndNormalAPI__API.getProcessedReport_range.xml +++ b/tests/PHPUnit/System/expected/test_periodIsRange_dateIsLastN_MetadataAndNormalAPI__API.getProcessedReport_range.xml @@ -62,10 +62,9 @@ fr - plugins/UserCountry/images/flags/fr.png + plugins/Morpheus/icons/dist/flags/fr.png countryCode==fr - 16 - 11 + 16 diff --git a/tests/PHPUnit/System/expected/test_periodIsRange_dateIsLastN_MetadataAndNormalAPI__Live.getLastVisits.xml b/tests/PHPUnit/System/expected/test_periodIsRange_dateIsLastN_MetadataAndNormalAPI__Live.getLastVisits.xml index de354fdde7..26352512c9 100644 --- a/tests/PHPUnit/System/expected/test_periodIsRange_dateIsLastN_MetadataAndNormalAPI__Live.getLastVisits.xml +++ b/tests/PHPUnit/System/expected/test_periodIsRange_dateIsLastN_MetadataAndNormalAPI__Live.getLastVisits.xml @@ -72,7 +72,7 @@ eur France fr - plugins/UserCountry/images/flags/fr.png + plugins/Morpheus/icons/dist/flags/fr.png @@ -109,10 +109,10 @@ - 0.00 + 0 0 0 - 0.00 + 0 0 0 @@ -199,7 +199,7 @@ eur France fr - plugins/UserCountry/images/flags/fr.png + plugins/Morpheus/icons/dist/flags/fr.png @@ -236,10 +236,10 @@ - 0.00 + 0 0 0 - 0.00 + 0 0 0 @@ -387,7 +387,7 @@ eur France fr - plugins/UserCountry/images/flags/fr.png + plugins/Morpheus/icons/dist/flags/fr.png @@ -428,10 +428,10 @@ - 0.00 + 0 0 0 - 0.00 + 0 0 0 diff --git a/tests/PHPUnit/System/expected/test_periodIsRange_dateIsLastN_MetadataAndNormalAPI__Live.getLastVisitsDetails_range.xml b/tests/PHPUnit/System/expected/test_periodIsRange_dateIsLastN_MetadataAndNormalAPI__Live.getLastVisitsDetails_range.xml index de354fdde7..26352512c9 100644 --- a/tests/PHPUnit/System/expected/test_periodIsRange_dateIsLastN_MetadataAndNormalAPI__Live.getLastVisitsDetails_range.xml +++ b/tests/PHPUnit/System/expected/test_periodIsRange_dateIsLastN_MetadataAndNormalAPI__Live.getLastVisitsDetails_range.xml @@ -72,7 +72,7 @@ eur France fr - plugins/UserCountry/images/flags/fr.png + plugins/Morpheus/icons/dist/flags/fr.png @@ -109,10 +109,10 @@ - 0.00 + 0 0 0 - 0.00 + 0 0 0 @@ -199,7 +199,7 @@ eur France fr - plugins/UserCountry/images/flags/fr.png + plugins/Morpheus/icons/dist/flags/fr.png @@ -236,10 +236,10 @@ - 0.00 + 0 0 0 - 0.00 + 0 0 0 @@ -387,7 +387,7 @@ eur France fr - plugins/UserCountry/images/flags/fr.png + plugins/Morpheus/icons/dist/flags/fr.png @@ -428,10 +428,10 @@ - 0.00 + 0 0 0 - 0.00 + 0 0 0 diff --git a/tests/PHPUnit/System/expected/test_periodIsRange_dateIsLastN_MetadataAndNormalAPI__Live.getVisitorProfile.xml b/tests/PHPUnit/System/expected/test_periodIsRange_dateIsLastN_MetadataAndNormalAPI__Live.getVisitorProfile.xml index d9f537271f..7cae27dd3a 100644 --- a/tests/PHPUnit/System/expected/test_periodIsRange_dateIsLastN_MetadataAndNormalAPI__Live.getVisitorProfile.xml +++ b/tests/PHPUnit/System/expected/test_periodIsRange_dateIsLastN_MetadataAndNormalAPI__Live.getVisitorProfile.xml @@ -30,7 +30,7 @@ fr 2 - plugins/UserCountry/images/flags/fr.png + plugins/Morpheus/icons/dist/flags/fr.png France @@ -123,7 +123,7 @@ eur France fr - plugins/UserCountry/images/flags/fr.png + plugins/Morpheus/icons/dist/flags/fr.png @@ -160,10 +160,10 @@ - 0.00 + 0 0 0 - 0.00 + 0 0 0 @@ -250,7 +250,7 @@ eur France fr - plugins/UserCountry/images/flags/fr.png + plugins/Morpheus/icons/dist/flags/fr.png @@ -287,10 +287,10 @@ - 0.00 + 0 0 0 - 0.00 + 0 0 0 diff --git a/tests/PHPUnit/System/expected/test_periodIsRange_dateIsLastN_MetadataAndNormalAPI_pagesegment__API.getProcessedReport_range.xml b/tests/PHPUnit/System/expected/test_periodIsRange_dateIsLastN_MetadataAndNormalAPI_pagesegment__API.getProcessedReport_range.xml index f01ce588fb..fc0189404c 100644 --- a/tests/PHPUnit/System/expected/test_periodIsRange_dateIsLastN_MetadataAndNormalAPI_pagesegment__API.getProcessedReport_range.xml +++ b/tests/PHPUnit/System/expected/test_periodIsRange_dateIsLastN_MetadataAndNormalAPI_pagesegment__API.getProcessedReport_range.xml @@ -62,10 +62,9 @@ fr - plugins/UserCountry/images/flags/fr.png + plugins/Morpheus/icons/dist/flags/fr.png countryCode==fr - 16 - 11 + 16 diff --git a/tests/PHPUnit/System/expected/test_periodIsRange_dateIsLastN_MetadataAndNormalAPI_pagesegment__Live.getLastVisits.xml b/tests/PHPUnit/System/expected/test_periodIsRange_dateIsLastN_MetadataAndNormalAPI_pagesegment__Live.getLastVisits.xml index de354fdde7..26352512c9 100644 --- a/tests/PHPUnit/System/expected/test_periodIsRange_dateIsLastN_MetadataAndNormalAPI_pagesegment__Live.getLastVisits.xml +++ b/tests/PHPUnit/System/expected/test_periodIsRange_dateIsLastN_MetadataAndNormalAPI_pagesegment__Live.getLastVisits.xml @@ -72,7 +72,7 @@ eur France fr - plugins/UserCountry/images/flags/fr.png + plugins/Morpheus/icons/dist/flags/fr.png @@ -109,10 +109,10 @@ - 0.00 + 0 0 0 - 0.00 + 0 0 0 @@ -199,7 +199,7 @@ eur France fr - plugins/UserCountry/images/flags/fr.png + plugins/Morpheus/icons/dist/flags/fr.png @@ -236,10 +236,10 @@ - 0.00 + 0 0 0 - 0.00 + 0 0 0 @@ -387,7 +387,7 @@ eur France fr - plugins/UserCountry/images/flags/fr.png + plugins/Morpheus/icons/dist/flags/fr.png @@ -428,10 +428,10 @@ - 0.00 + 0 0 0 - 0.00 + 0 0 0 diff --git a/tests/PHPUnit/System/expected/test_periodIsRange_dateIsLastN_MetadataAndNormalAPI_pagesegment__Live.getLastVisitsDetails_range.xml b/tests/PHPUnit/System/expected/test_periodIsRange_dateIsLastN_MetadataAndNormalAPI_pagesegment__Live.getLastVisitsDetails_range.xml index de354fdde7..26352512c9 100644 --- a/tests/PHPUnit/System/expected/test_periodIsRange_dateIsLastN_MetadataAndNormalAPI_pagesegment__Live.getLastVisitsDetails_range.xml +++ b/tests/PHPUnit/System/expected/test_periodIsRange_dateIsLastN_MetadataAndNormalAPI_pagesegment__Live.getLastVisitsDetails_range.xml @@ -72,7 +72,7 @@ eur France fr - plugins/UserCountry/images/flags/fr.png + plugins/Morpheus/icons/dist/flags/fr.png @@ -109,10 +109,10 @@ - 0.00 + 0 0 0 - 0.00 + 0 0 0 @@ -199,7 +199,7 @@ eur France fr - plugins/UserCountry/images/flags/fr.png + plugins/Morpheus/icons/dist/flags/fr.png @@ -236,10 +236,10 @@ - 0.00 + 0 0 0 - 0.00 + 0 0 0 @@ -387,7 +387,7 @@ eur France fr - plugins/UserCountry/images/flags/fr.png + plugins/Morpheus/icons/dist/flags/fr.png @@ -428,10 +428,10 @@ - 0.00 + 0 0 0 - 0.00 + 0 0 0 diff --git a/tests/PHPUnit/System/expected/test_periodIsRange_dateIsLastN_MetadataAndNormalAPI_pagesegment__Live.getVisitorProfile.xml b/tests/PHPUnit/System/expected/test_periodIsRange_dateIsLastN_MetadataAndNormalAPI_pagesegment__Live.getVisitorProfile.xml index d9f537271f..7cae27dd3a 100644 --- a/tests/PHPUnit/System/expected/test_periodIsRange_dateIsLastN_MetadataAndNormalAPI_pagesegment__Live.getVisitorProfile.xml +++ b/tests/PHPUnit/System/expected/test_periodIsRange_dateIsLastN_MetadataAndNormalAPI_pagesegment__Live.getVisitorProfile.xml @@ -30,7 +30,7 @@ fr 2 - plugins/UserCountry/images/flags/fr.png + plugins/Morpheus/icons/dist/flags/fr.png France @@ -123,7 +123,7 @@ eur France fr - plugins/UserCountry/images/flags/fr.png + plugins/Morpheus/icons/dist/flags/fr.png @@ -160,10 +160,10 @@ - 0.00 + 0 0 0 - 0.00 + 0 0 0 @@ -250,7 +250,7 @@ eur France fr - plugins/UserCountry/images/flags/fr.png + plugins/Morpheus/icons/dist/flags/fr.png @@ -287,10 +287,10 @@ - 0.00 + 0 0 0 - 0.00 + 0 0 0 diff --git a/tests/PHPUnit/System/expected/test_reportLimiting__UserCountry.getCity_day.xml b/tests/PHPUnit/System/expected/test_reportLimiting__UserCountry.getCity_day.xml index 171e7338ad..57ad67177d 100644 --- a/tests/PHPUnit/System/expected/test_reportLimiting__UserCountry.getCity_day.xml +++ b/tests/PHPUnit/System/expected/test_reportLimiting__UserCountry.getCity_day.xml @@ -16,7 +16,7 @@ au Australia Victoria - plugins/UserCountry/images/flags/au.png + plugins/Morpheus/icons/dist/flags/au.png @@ -34,7 +34,7 @@ fr France Provence-Alpes-Cote d'Azur - plugins/UserCountry/images/flags/fr.png + plugins/Morpheus/icons/dist/flags/fr.png @@ -46,6 +46,6 @@ 0 35 0 - plugins/UserCountry/images/flags/xx.png + plugins/Morpheus/icons/dist/flags/xx.png \ No newline at end of file diff --git a/tests/PHPUnit/System/expected/test_reportLimiting__UserCountry.getRegion_day.xml b/tests/PHPUnit/System/expected/test_reportLimiting__UserCountry.getRegion_day.xml index cc6727dc54..7c39516a86 100644 --- a/tests/PHPUnit/System/expected/test_reportLimiting__UserCountry.getRegion_day.xml +++ b/tests/PHPUnit/System/expected/test_reportLimiting__UserCountry.getRegion_day.xml @@ -15,7 +15,7 @@ fr France Provence-Alpes-Cote d'Azur - plugins/UserCountry/images/flags/fr.png + plugins/Morpheus/icons/dist/flags/fr.png @@ -32,7 +32,7 @@ au Australia Victoria - plugins/UserCountry/images/flags/au.png + plugins/Morpheus/icons/dist/flags/au.png @@ -44,6 +44,6 @@ 0 35 0 - plugins/UserCountry/images/flags/xx.png + plugins/Morpheus/icons/dist/flags/xx.png \ No newline at end of file diff --git a/tests/PHPUnit/System/expected/test_reportLimiting_flattened__UserCountry.getCity_day.xml b/tests/PHPUnit/System/expected/test_reportLimiting_flattened__UserCountry.getCity_day.xml index ff7ba019b4..d260f831b8 100644 --- a/tests/PHPUnit/System/expected/test_reportLimiting_flattened__UserCountry.getCity_day.xml +++ b/tests/PHPUnit/System/expected/test_reportLimiting_flattened__UserCountry.getCity_day.xml @@ -10,7 +10,7 @@ 0 35 0 - plugins/UserCountry/images/flags/xx.png + plugins/Morpheus/icons/dist/flags/xx.png @@ -28,7 +28,7 @@ au Australia Victoria - plugins/UserCountry/images/flags/au.png + plugins/Morpheus/icons/dist/flags/au.png @@ -46,6 +46,6 @@ fr France Provence-Alpes-Cote d'Azur - plugins/UserCountry/images/flags/fr.png + plugins/Morpheus/icons/dist/flags/fr.png \ No newline at end of file diff --git a/tests/PHPUnit/System/expected/test_reportLimiting_flattened__UserCountry.getRegion_day.xml b/tests/PHPUnit/System/expected/test_reportLimiting_flattened__UserCountry.getRegion_day.xml index 4680c84581..5d1560212f 100644 --- a/tests/PHPUnit/System/expected/test_reportLimiting_flattened__UserCountry.getRegion_day.xml +++ b/tests/PHPUnit/System/expected/test_reportLimiting_flattened__UserCountry.getRegion_day.xml @@ -10,7 +10,7 @@ 0 35 0 - plugins/UserCountry/images/flags/xx.png + plugins/Morpheus/icons/dist/flags/xx.png @@ -27,7 +27,7 @@ fr France Provence-Alpes-Cote d'Azur - plugins/UserCountry/images/flags/fr.png + plugins/Morpheus/icons/dist/flags/fr.png @@ -44,6 +44,6 @@ au Australia Victoria - plugins/UserCountry/images/flags/au.png + plugins/Morpheus/icons/dist/flags/au.png \ No newline at end of file diff --git a/tests/PHPUnit/System/expected/test_reportLimiting_rankingQuery__UserCountry.getCity_day.xml b/tests/PHPUnit/System/expected/test_reportLimiting_rankingQuery__UserCountry.getCity_day.xml index 171e7338ad..57ad67177d 100644 --- a/tests/PHPUnit/System/expected/test_reportLimiting_rankingQuery__UserCountry.getCity_day.xml +++ b/tests/PHPUnit/System/expected/test_reportLimiting_rankingQuery__UserCountry.getCity_day.xml @@ -16,7 +16,7 @@ au Australia Victoria - plugins/UserCountry/images/flags/au.png + plugins/Morpheus/icons/dist/flags/au.png @@ -34,7 +34,7 @@ fr France Provence-Alpes-Cote d'Azur - plugins/UserCountry/images/flags/fr.png + plugins/Morpheus/icons/dist/flags/fr.png @@ -46,6 +46,6 @@ 0 35 0 - plugins/UserCountry/images/flags/xx.png + plugins/Morpheus/icons/dist/flags/xx.png \ No newline at end of file diff --git a/tests/PHPUnit/System/expected/test_reportLimiting_rankingQuery__UserCountry.getRegion_day.xml b/tests/PHPUnit/System/expected/test_reportLimiting_rankingQuery__UserCountry.getRegion_day.xml index cc6727dc54..7c39516a86 100644 --- a/tests/PHPUnit/System/expected/test_reportLimiting_rankingQuery__UserCountry.getRegion_day.xml +++ b/tests/PHPUnit/System/expected/test_reportLimiting_rankingQuery__UserCountry.getRegion_day.xml @@ -15,7 +15,7 @@ fr France Provence-Alpes-Cote d'Azur - plugins/UserCountry/images/flags/fr.png + plugins/Morpheus/icons/dist/flags/fr.png @@ -32,7 +32,7 @@ au Australia Victoria - plugins/UserCountry/images/flags/au.png + plugins/Morpheus/icons/dist/flags/au.png @@ -44,6 +44,6 @@ 0 35 0 - plugins/UserCountry/images/flags/xx.png + plugins/Morpheus/icons/dist/flags/xx.png \ No newline at end of file diff --git a/tests/UI/expected-screenshots/ActionsDataTable_segmented_visitor_log.png b/tests/UI/expected-screenshots/ActionsDataTable_segmented_visitor_log.png index 25de05506d..fc3b19e165 100644 --- a/tests/UI/expected-screenshots/ActionsDataTable_segmented_visitor_log.png +++ b/tests/UI/expected-screenshots/ActionsDataTable_segmented_visitor_log.png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:841bc41ed9926768f1cca3f13f4bf7b9b3270d1da3e626805793f585a410d69c -size 467099 +oid sha256:b3c4e5fd742348492ca86f4409f9cbf9371221cd2d7198919e22ac72501fb49f +size 467356 diff --git a/tests/UI/expected-screenshots/UIIntegrationTest_dashboard2.png b/tests/UI/expected-screenshots/UIIntegrationTest_dashboard2.png index 2e905c2a38..8dd98cfdbe 100644 --- a/tests/UI/expected-screenshots/UIIntegrationTest_dashboard2.png +++ b/tests/UI/expected-screenshots/UIIntegrationTest_dashboard2.png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:a12c91b95c462b640e045f226c3473932892b5a92bd190ae312672650e785e23 -size 1448761 +oid sha256:40fa47ca0be52a7e1e9b3a3c991788b8f7938989e4a6a96d938219422acdb81e +size 1447082 diff --git a/tests/UI/expected-screenshots/UIIntegrationTest_dashboard3.png b/tests/UI/expected-screenshots/UIIntegrationTest_dashboard3.png index bb577a268a..93b6f70d28 100644 --- a/tests/UI/expected-screenshots/UIIntegrationTest_dashboard3.png +++ b/tests/UI/expected-screenshots/UIIntegrationTest_dashboard3.png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:4fdde96d9eee84ebfe9a93d386eda2a5f653cd9c715ed1ab71d929a9d8e64c56 -size 428222 +oid sha256:7e8bac31646c54e6bf3addbe0286b6f16245a83e3a09558a07d1289cabb27e06 +size 428512 diff --git a/tests/UI/expected-screenshots/UIIntegrationTest_ecommerce_log.png b/tests/UI/expected-screenshots/UIIntegrationTest_ecommerce_log.png index df0c907d9d..f600970845 100644 --- a/tests/UI/expected-screenshots/UIIntegrationTest_ecommerce_log.png +++ b/tests/UI/expected-screenshots/UIIntegrationTest_ecommerce_log.png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:d94c2d36cb25289fb20e1f7777d6dc7b5eebe7413b248e04216e8ffc63ae8b6f -size 453380 +oid sha256:2d7ff08569369ed7a290d9a07dff56dc5199207053c7fdae42abc15c265b1ec9 +size 451587 diff --git a/tests/UI/expected-screenshots/UIIntegrationTest_goals_individual_goal.png b/tests/UI/expected-screenshots/UIIntegrationTest_goals_individual_goal.png index 656b7c6d7f..5f55bcaab9 100644 --- a/tests/UI/expected-screenshots/UIIntegrationTest_goals_individual_goal.png +++ b/tests/UI/expected-screenshots/UIIntegrationTest_goals_individual_goal.png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:f28635c160528c866556db17a448e1f54eaee804352bbf42a10a9b1160b20b09 -size 196505 +oid sha256:769f6bb2140bf6270a41321fa32b60d26f9822cfa446701e3671c8cca6c1ee41 +size 196103 diff --git a/tests/UI/expected-screenshots/UIIntegrationTest_goals_individual_goal_updated.png b/tests/UI/expected-screenshots/UIIntegrationTest_goals_individual_goal_updated.png index 4f81381671..9ddd0328ec 100644 --- a/tests/UI/expected-screenshots/UIIntegrationTest_goals_individual_goal_updated.png +++ b/tests/UI/expected-screenshots/UIIntegrationTest_goals_individual_goal_updated.png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:b6d32e848ad796b951e76b59c60dcb116c2a696e87e4b1e461a38543ee503496 -size 197006 +oid sha256:e61cfc01c7af201b6d2d707a2a5e238a557ecc8fd8267551f1ff2da2b6e675ce +size 196603 diff --git a/tests/UI/expected-screenshots/UIIntegrationTest_segmented_visitorlog.png b/tests/UI/expected-screenshots/UIIntegrationTest_segmented_visitorlog.png index 4150fa7089..0a4d512277 100644 --- a/tests/UI/expected-screenshots/UIIntegrationTest_segmented_visitorlog.png +++ b/tests/UI/expected-screenshots/UIIntegrationTest_segmented_visitorlog.png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:e7de59d3457826bbd15039bfd7c35e6a322120db89edcb9bebc2b43df45cc9dd -size 803484 +oid sha256:feda268a7117f452cba4eb695cdc39abd5b7068597d7c2ce3a7eeee797f592e6 +size 804380 diff --git a/tests/UI/expected-screenshots/UIIntegrationTest_visitor_profile_popup.png b/tests/UI/expected-screenshots/UIIntegrationTest_visitor_profile_popup.png index 6e8da54c2d..833931cb7b 100644 --- a/tests/UI/expected-screenshots/UIIntegrationTest_visitor_profile_popup.png +++ b/tests/UI/expected-screenshots/UIIntegrationTest_visitor_profile_popup.png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:f06ec8e680da552dc576ab6ae148991cc106104b42a9aff89a3cfd6ed2a27879 -size 228716 +oid sha256:6571be1d79e9e8180ebb82f521698e85bb34f2cde8aeaae490ce45d82ce5dfb4 +size 228752 diff --git a/tests/UI/expected-screenshots/UIIntegrationTest_visitors_locations_provider.png b/tests/UI/expected-screenshots/UIIntegrationTest_visitors_locations_provider.png index baf870442f..e14182cff4 100644 --- a/tests/UI/expected-screenshots/UIIntegrationTest_visitors_locations_provider.png +++ b/tests/UI/expected-screenshots/UIIntegrationTest_visitors_locations_provider.png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:3fc03e1db0efa7bb2008094f68c7a7617b09694a290aec95c5c244e0328bed34 -size 173561 +oid sha256:154e7aa39b4891cf54a1b8639fc856d8c9b966b5bb3f933d7ff499542bee2db4 +size 172904 diff --git a/tests/UI/expected-screenshots/UIIntegrationTest_visitors_realtime_map.png b/tests/UI/expected-screenshots/UIIntegrationTest_visitors_realtime_map.png index daf33b8ea8..5db9932c1c 100644 --- a/tests/UI/expected-screenshots/UIIntegrationTest_visitors_realtime_map.png +++ b/tests/UI/expected-screenshots/UIIntegrationTest_visitors_realtime_map.png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:8097dd425997c11934e909e050768f1131dea60f19c725a5c9aa295e6a6f6f3b -size 113271 +oid sha256:d98e92f3427f99f5057ab30a68b82ee69f5790cb0860643ca8673ea99b406bbb +size 113148 diff --git a/tests/UI/expected-screenshots/UIIntegrationTest_visitors_with_site_search_visitorlog.png b/tests/UI/expected-screenshots/UIIntegrationTest_visitors_with_site_search_visitorlog.png index f5b1096d43..e0428c4d74 100644 --- a/tests/UI/expected-screenshots/UIIntegrationTest_visitors_with_site_search_visitorlog.png +++ b/tests/UI/expected-screenshots/UIIntegrationTest_visitors_with_site_search_visitorlog.png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:bb7d254aa2b3a60ad890d54b2f1686c1f9805e824c6c35e3f0ae7ff66eaa5eb5 -size 110260 +oid sha256:658893bddff5b10cd8d9a52300b7854bbee6b72dc4bdc3b832049cbc2b196791 +size 109515 diff --git a/tests/UI/expected-screenshots/UIIntegrationTest_widgetize_ecommercelog.png b/tests/UI/expected-screenshots/UIIntegrationTest_widgetize_ecommercelog.png index f87692ce69..b4bef9d7cc 100644 --- a/tests/UI/expected-screenshots/UIIntegrationTest_widgetize_ecommercelog.png +++ b/tests/UI/expected-screenshots/UIIntegrationTest_widgetize_ecommercelog.png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:1d6fbe98fbae04f3186b86acd70e269badabd1cfe8e818fe3e628a1e44571629 -size 448495 +oid sha256:9735d7df7a8fb2d91eb8922eea1fd6ad742232f8989cd3629c7af699b02d0625 +size 446145 -- cgit v1.2.3 From de954a59ae324135fdccb438cc1b5a0040471639 Mon Sep 17 00:00:00 2001 From: sgiehl Date: Thu, 30 Mar 2017 21:58:04 +0200 Subject: fixes #11567 - fix possible notice in devicedetection archiver --- plugins/DevicesDetection/Archiver.php | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/plugins/DevicesDetection/Archiver.php b/plugins/DevicesDetection/Archiver.php index ea63485017..a930757174 100644 --- a/plugins/DevicesDetection/Archiver.php +++ b/plugins/DevicesDetection/Archiver.php @@ -87,8 +87,9 @@ class Archiver extends \Piwik\Plugin\Archiver } while ($conversionRow = $query->fetch()) { - - $metrics->sumMetricsGoals($conversionRow[$labelSQL], $conversionRow); + if (isset($conversionRow[$labelSQL])) { + $metrics->sumMetricsGoals($conversionRow[$labelSQL], $conversionRow); + } } $metrics->enrichMetricsWithConversions(); } -- cgit v1.2.3 From abbf4a3951ddc90ae4fd737a5c930fb36c69face Mon Sep 17 00:00:00 2001 From: Stefan Giehl Date: Thu, 30 Mar 2017 22:13:06 +0200 Subject: Improve header layout of error, update and maintenance screen (#11561) * Improve layout of error and maintenance scrrens * improve header on update pages * use svg logo as default * update screenshots --- core/ExceptionHandler.php | 12 ++++++++---- core/FrontController.php | 12 +++++++----- core/testMinimumPhpVersion.php | 2 +- plugins/CoreAdminHome/CustomLogo.php | 2 +- plugins/CoreUpdater/templates/layout.twig | 11 ++++++++--- plugins/Morpheus/stylesheets/simple_structure.css | 4 +++- plugins/Morpheus/templates/simpleLayoutHeader.tpl | 2 -- .../CoreUpdaterCode_httpUpdateSuccess.png | 4 ++-- .../expected-screenshots/CoreUpdaterCode_httpsUpdateFail.png | 4 ++-- tests/UI/expected-screenshots/CoreUpdaterCode_newVersion.png | 4 ++-- tests/UI/expected-screenshots/CoreUpdaterDb_main.png | 4 ++-- tests/UI/expected-screenshots/CoreUpdaterDb_updated.png | 4 ++-- .../UIIntegrationTest_db_connect_error.png | 4 ++-- .../UIIntegrationTest_widgetize_apidisallowed.png | 4 ++-- 14 files changed, 42 insertions(+), 31 deletions(-) diff --git a/core/ExceptionHandler.php b/core/ExceptionHandler.php index f636b3b05d..a6e2c075e4 100644 --- a/core/ExceptionHandler.php +++ b/core/ExceptionHandler.php @@ -93,12 +93,16 @@ class ExceptionHandler $message = Common::sanitizeInputValue($message); } - $logo = new CustomLogo(); - $logoHeaderUrl = false; - $logoFaviconUrl = false; + $logoHeaderUrl = 'plugins/Morpheus/images/logo.svg'; + $logoFaviconUrl = 'plugins/CoreHome/images/favicon.png'; try { - $logoHeaderUrl = $logo->getHeaderLogoUrl(); + $logo = new CustomLogo(); + if ($logo->hasSVGLogo()) { + $logoHeaderUrl = $logo->getSVGLogoUrl(); + } else { + $logoHeaderUrl = $logo->getHeaderLogoUrl(); + } $logoFaviconUrl = $logo->getPathUserFavicon(); } catch (Exception $ex) { try { diff --git a/core/FrontController.php b/core/FrontController.php index c08ad5a6c2..3612215c11 100644 --- a/core/FrontController.php +++ b/core/FrontController.php @@ -433,16 +433,18 @@ class FrontController extends Singleton } Common::sendResponseCode(503); - $logoUrl = null; - $faviconUrl = null; + $logoUrl = 'plugins/Morpheus/images/logo.svg'; + $faviconUrl = 'plugins/CoreHome/images/favicon.png'; try { $logo = new CustomLogo(); - $logoUrl = $logo->getHeaderLogoUrl(); + if ($logo->hasSVGLogo()) { + $logoUrl = $logo->getSVGLogoUrl(); + } else { + $logoUrl = $logo->getHeaderLogoUrl(); + } $faviconUrl = $logo->getPathUserFavicon(); } catch (Exception $ex) { } - $logoUrl = $logoUrl ?: 'plugins/Morpheus/images/logo-header.png'; - $faviconUrl = $faviconUrl ?: 'plugins/CoreHome/images/favicon.png'; $page = file_get_contents(PIWIK_INCLUDE_PATH . '/plugins/Morpheus/templates/maintenance.tpl'); $page = str_replace('%logoUrl%', $logoUrl, $page); diff --git a/core/testMinimumPhpVersion.php b/core/testMinimumPhpVersion.php index 4562c2f154..ca276b1de3 100644 --- a/core/testMinimumPhpVersion.php +++ b/core/testMinimumPhpVersion.php @@ -125,7 +125,7 @@ if (!function_exists('Piwik_GetErrorMessagePage')) { } if (empty($logoUrl)) { - $logoUrl = "plugins/Morpheus/images/logo-header.png"; + $logoUrl = "plugins/Morpheus/images/logo.svg"; } if (empty($faviconUrl)) { diff --git a/plugins/CoreAdminHome/CustomLogo.php b/plugins/CoreAdminHome/CustomLogo.php index 75948fdc12..62856d1977 100644 --- a/plugins/CoreAdminHome/CustomLogo.php +++ b/plugins/CoreAdminHome/CustomLogo.php @@ -30,7 +30,7 @@ class CustomLogo public function getHeaderLogoUrl($pathOnly = false) { - $defaultLogo = 'plugins/Morpheus/images/logo-header.png'; + $defaultLogo = 'plugins/Morpheus/images/logo.svg'; $themeLogo = 'plugins/%s/images/logo-header.png'; $customLogo = static::getPathUserLogoSmall(); return $this->getPathToLogo($pathOnly, $defaultLogo, $themeLogo, $customLogo); diff --git a/plugins/CoreUpdater/templates/layout.twig b/plugins/CoreUpdater/templates/layout.twig index e49d4bdd3e..4114ff463a 100644 --- a/plugins/CoreUpdater/templates/layout.twig +++ b/plugins/CoreUpdater/templates/layout.twig @@ -17,10 +17,15 @@ +
diff --git a/plugins/Morpheus/stylesheets/simple_structure.css b/plugins/Morpheus/stylesheets/simple_structure.css index b55fed8ab7..4e204a4218 100644 --- a/plugins/Morpheus/stylesheets/simple_structure.css +++ b/plugins/Morpheus/stylesheets/simple_structure.css @@ -4,12 +4,14 @@ body { } body#simple { background: #fff; + margin: 0; } #simple .logo { color: #888; text-align: center; font-size: 12px; - margin-top: 30px; + background-color: #37474f !important; + padding: 15px 0; } #simple .logo a { color: #888; diff --git a/plugins/Morpheus/templates/simpleLayoutHeader.tpl b/plugins/Morpheus/templates/simpleLayoutHeader.tpl index 8c8ac2a5ff..28db4dd27e 100644 --- a/plugins/Morpheus/templates/simpleLayoutHeader.tpl +++ b/plugins/Morpheus/templates/simpleLayoutHeader.tpl @@ -11,8 +11,6 @@
diff --git a/tests/UI/expected-screenshots/CoreUpdaterCode_httpUpdateSuccess.png b/tests/UI/expected-screenshots/CoreUpdaterCode_httpUpdateSuccess.png index d8f616e021..ab15352f32 100644 --- a/tests/UI/expected-screenshots/CoreUpdaterCode_httpUpdateSuccess.png +++ b/tests/UI/expected-screenshots/CoreUpdaterCode_httpUpdateSuccess.png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:9a6ac1c08cf9741c75912f738644f22eac1dd733fba90b11337b1c9d458b3548 -size 56883 +oid sha256:6db8ea812b4c025d3c5f3c3b6841b6fa7e0ffc53c9f15bcf3bf08c1c935cc444 +size 55769 diff --git a/tests/UI/expected-screenshots/CoreUpdaterCode_httpsUpdateFail.png b/tests/UI/expected-screenshots/CoreUpdaterCode_httpsUpdateFail.png index f2c309a950..ca41c0251f 100644 --- a/tests/UI/expected-screenshots/CoreUpdaterCode_httpsUpdateFail.png +++ b/tests/UI/expected-screenshots/CoreUpdaterCode_httpsUpdateFail.png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:fb41825f8b99e30f19d10f3835d0d8579e9d3e731aad5c6023865cf7dfbbfb29 -size 99028 +oid sha256:a15a4cc2c2eef49d326e3c3ab8e879e16b15f3db8e3703b53337fad7d8baa92d +size 98232 diff --git a/tests/UI/expected-screenshots/CoreUpdaterCode_newVersion.png b/tests/UI/expected-screenshots/CoreUpdaterCode_newVersion.png index c8bcd22ae5..864db2b917 100644 --- a/tests/UI/expected-screenshots/CoreUpdaterCode_newVersion.png +++ b/tests/UI/expected-screenshots/CoreUpdaterCode_newVersion.png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:c8bb4b50b39944cd1c0cf8b5a282c8ec4ec8223d4e760ee79c333225bfb1ca04 -size 106399 +oid sha256:dc0381732a8de0a1dda12ed8d021f4526a71ad2c750faf3bfa7d8c4847b954c3 +size 105284 diff --git a/tests/UI/expected-screenshots/CoreUpdaterDb_main.png b/tests/UI/expected-screenshots/CoreUpdaterDb_main.png index e2330d0dd6..fa6f940efc 100644 --- a/tests/UI/expected-screenshots/CoreUpdaterDb_main.png +++ b/tests/UI/expected-screenshots/CoreUpdaterDb_main.png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:8561ee39fc47919209492fa0ff7d19913fddc0c47bcece0c87f956487e1a2e4a -size 289021 +oid sha256:a4d34bec02cb09474bc37a7a5849088066390febec6a344cd10eb483627559c7 +size 287997 diff --git a/tests/UI/expected-screenshots/CoreUpdaterDb_updated.png b/tests/UI/expected-screenshots/CoreUpdaterDb_updated.png index b855411727..26ea1cda48 100644 --- a/tests/UI/expected-screenshots/CoreUpdaterDb_updated.png +++ b/tests/UI/expected-screenshots/CoreUpdaterDb_updated.png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:03c097db06daa76df4c9bc9eab062b3830c49364898467ff0d5c3db920efef28 -size 76446 +oid sha256:0f26afe60c3accd1cf614fcb9dcb786230d86fa8372e76d664a359ff939798eb +size 75501 diff --git a/tests/UI/expected-screenshots/UIIntegrationTest_db_connect_error.png b/tests/UI/expected-screenshots/UIIntegrationTest_db_connect_error.png index 4f97756072..89d6568b78 100644 --- a/tests/UI/expected-screenshots/UIIntegrationTest_db_connect_error.png +++ b/tests/UI/expected-screenshots/UIIntegrationTest_db_connect_error.png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:227d0ade8b369c8337609b40585164ab90f219b8e6ecc5983a6f2356ae7390c9 -size 75520 +oid sha256:e6506ebd66b5a115207ebfadc7ebee42ce1070a12675260b97fa86c483403923 +size 74504 diff --git a/tests/UI/expected-screenshots/UIIntegrationTest_widgetize_apidisallowed.png b/tests/UI/expected-screenshots/UIIntegrationTest_widgetize_apidisallowed.png index 7d3579d52f..8f779e9914 100644 --- a/tests/UI/expected-screenshots/UIIntegrationTest_widgetize_apidisallowed.png +++ b/tests/UI/expected-screenshots/UIIntegrationTest_widgetize_apidisallowed.png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:ac2b019ed247ac357c2cda8f7009c14c2add84e366084390e039342dafecc077 -size 51963 +oid sha256:750c30bb164fe68397b877d7556d4a8db53d9f3bacd3adc1fa14d0281f679677 +size 51089 -- cgit v1.2.3 From e6bac81abdf0d32429d208ce751f0e3333bacb20 Mon Sep 17 00:00:00 2001 From: sgiehl Date: Thu, 30 Mar 2017 22:41:45 +0200 Subject: small improvement --- plugins/DevicesDetection/Archiver.php | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/plugins/DevicesDetection/Archiver.php b/plugins/DevicesDetection/Archiver.php index a930757174..9f268f85a0 100644 --- a/plugins/DevicesDetection/Archiver.php +++ b/plugins/DevicesDetection/Archiver.php @@ -87,9 +87,7 @@ class Archiver extends \Piwik\Plugin\Archiver } while ($conversionRow = $query->fetch()) { - if (isset($conversionRow[$labelSQL])) { - $metrics->sumMetricsGoals($conversionRow[$labelSQL], $conversionRow); - } + $metrics->sumMetricsGoals(isset($conversionRow[$labelSQL]) ? $conversionRow[$labelSQL] : null, $conversionRow); } $metrics->enrichMetricsWithConversions(); } -- cgit v1.2.3 From ea6491028c4f90948d70ca51167f996fa6c3136a Mon Sep 17 00:00:00 2001 From: Stefan Giehl Date: Thu, 30 Mar 2017 23:22:14 +0200 Subject: Improves "No data has been recorded yet" page (#11555) * Improve 'No data recorded yet' page * updates expected UI screenshots * slightly improve text * update screenshot --- plugins/CoreAdminHome/lang/en.json | 1 + plugins/Installation/Controller.php | 1 + plugins/SitesManager/lang/en.json | 8 ++++++-- plugins/SitesManager/stylesheets/SitesManager.less | 4 ++++ .../SitesManager/templates/_displayJavascriptCode.twig | 16 +++++++++++++++- plugins/SitesManager/templates/siteWithoutData.twig | 5 ++++- .../EmptySite_emptySiteDashboard.png | 4 ++-- .../UI/expected-screenshots/Installation_js_tracking.png | 4 ++-- 8 files changed, 35 insertions(+), 8 deletions(-) diff --git a/plugins/CoreAdminHome/lang/en.json b/plugins/CoreAdminHome/lang/en.json index bc045654e7..4c718121f0 100644 --- a/plugins/CoreAdminHome/lang/en.json +++ b/plugins/CoreAdminHome/lang/en.json @@ -45,6 +45,7 @@ "JSTracking_TrackNoScript": "Track users with JavaScript disabled", "JSTracking_VisitorCustomVars": "Track custom variables for this visitor", "JSTracking_VisitorCustomVarsDesc": "For example, with variable name \"Type\" and value \"Customer\".", + "JSTracking_EndNote": "Note: You can generate a customized tracking code in the %1$sTracking Code%2$s admin section.", "JSTrackingIntro1": "You can track visitors to your website many different ways. The recommended way to do it is through JavaScript. To use this method you must make sure every webpage of your website has some JavaScript code, which you can generate here.", "JSTrackingIntro2": "Once you have the JavaScript tracking code for your website, copy and paste it to all the pages you want to track with Piwik.", "JSTrackingIntro3b": "In most websites, blogs, CMS, etc. you can use a pre-made plugin to do the technical work for you. (See our %1$slist of plugins used to integrate Piwik%2$s.) If no plugin exists you can edit your website templates and add this code to the </head> tag which is often defined in a 'header.php', 'header.tpl' or similar template file.", diff --git a/plugins/Installation/Controller.php b/plugins/Installation/Controller.php index 5fa34da734..47b33fe9d4 100644 --- a/plugins/Installation/Controller.php +++ b/plugins/Installation/Controller.php @@ -376,6 +376,7 @@ class Controller extends \Piwik\Plugin\ControllerAdmin $viewTrackingHelp->jsTag = $javascriptGenerator->generate($idSite, Url::getCurrentUrlWithoutFileName()); $viewTrackingHelp->idSite = $idSite; $viewTrackingHelp->piwikUrl = Url::getCurrentUrlWithoutFileName(); + $viewTrackingHelp->isInstall = true; $view->trackingHelp = $viewTrackingHelp->render(); $view->displaySiteName = $siteName; diff --git a/plugins/SitesManager/lang/en.json b/plugins/SitesManager/lang/en.json index 898b257a82..1375674e1c 100644 --- a/plugins/SitesManager/lang/en.json +++ b/plugins/SitesManager/lang/en.json @@ -44,8 +44,12 @@ "ListOfIpsToBeExcludedOnAllWebsites": "The IPs below will be excluded from being tracked on all websites.", "ListOfQueryParametersToBeExcludedOnAllWebsites": "The Query URLs parameters below will be excluded from URLs on all websites.", "ListOfQueryParametersToExclude": "Enter the list of URL Query Parameters, one per line, to exclude from the Page URLs reports. Regular expressions such as %s are suported.", + "LogAnalytics": "Log Analytics", + "LogAnalyticsDescription": "If the Javascript tracking method isn’t feasible, you can %1$suse server log analytics%2$s as an alternative method for tracking your website’s users.", "MainDescription": "Your Web Analytics reports need Websites! Add, update, delete Websites, and show the JavaScript to insert in your pages.", "MenuManage": "Manage", + "MobileAppsAndSDKs": "Mobile apps and SDKs", + "MobileAppsAndSDKsDescription": "Not tracking a website? You can alternatively track a mobile app or any other type of application using one of the %1$savailable SDKs%2$s.", "NotAnEcommerceSite": "Not an Ecommerce site", "NotFound": "No websites found for", "NoWebsites": "You don't have any website to administrate.", @@ -69,9 +73,9 @@ "SiteSearchUse": "You can use Piwik to track and report what visitors are searching in your website's internal search engine.", "SiteWithoutDataTitle": "No data has been recorded yet", "SiteWithoutDataDescription": "No analytics data has been tracked for this website yet.", - "SiteWithoutDataSetupTracking": "Please set up the %1$sJavaScript tracking code%2$s on your website if you haven't done that already.", + "SiteWithoutDataSetupTracking": "Please set up the %1$stracking code%2$s below into your website or mobile app if you haven't done already.", "SiteWithoutDataMessageDisappears": "This message will disappear as soon as some data was tracked for this website.", - "SiteWithoutDataSetupGoals": "In the meantime, maybe you would like to %1$sset up some goals%2$s.", + "SiteWithoutDataSetupGoals": "In the meantime, maybe you would like to %1$sset up some goals%2$s or learn more about the %3$sfeatures%4$s of Piwik in one of our %5$sguides%6$s or %7$sFAQs%8$s.", "SuperUserAccessCan": "A user with Super User access can also %1$s specify global settings%2$s for new websites.", "Timezone": "Time zone", "TrackingSiteSearch": "Tracking Internal Site Search", diff --git a/plugins/SitesManager/stylesheets/SitesManager.less b/plugins/SitesManager/stylesheets/SitesManager.less index dc3b4e48b0..2452a806ae 100644 --- a/plugins/SitesManager/stylesheets/SitesManager.less +++ b/plugins/SitesManager/stylesheets/SitesManager.less @@ -113,6 +113,10 @@ td.editable-site-field:hover { font-weight: normal; color: black; } + + p + p { + margin-top: 10px; + } } #js-visitor-cv-extra th { diff --git a/plugins/SitesManager/templates/_displayJavascriptCode.twig b/plugins/SitesManager/templates/_displayJavascriptCode.twig index b5c4671c7e..a400c316ad 100644 --- a/plugins/SitesManager/templates/_displayJavascriptCode.twig +++ b/plugins/SitesManager/templates/_displayJavascriptCode.twig @@ -13,5 +13,19 @@

{{ 'CoreAdminHome_JSTrackingIntro5'|translate('','')|raw }}

-

{{ 'Installation_JSTracking_EndNote'|translate('','')|raw }}

+ {% if isInstall is defined %} +

{{ 'Installation_JSTracking_EndNote'|translate('', '')|raw }}

+ {% else %} +

{{ 'CoreAdminHome_JSTracking_EndNote'|translate('','')|raw }}

+ {% endif %} + +

{{ 'SitesManager_LogAnalytics'|translate }}

+ +

{{ 'SitesManager_LogAnalyticsDescription'|translate('', '')|raw }}

+ +

{{ 'SitesManager_MobileAppsAndSDKs'|translate }}

+ +

{{ 'SitesManager_MobileAppsAndSDKsDescription'|translate('','')|raw }}

+

+
\ No newline at end of file diff --git a/plugins/SitesManager/templates/siteWithoutData.twig b/plugins/SitesManager/templates/siteWithoutData.twig index d8596cf0fd..bf0db36a39 100644 --- a/plugins/SitesManager/templates/siteWithoutData.twig +++ b/plugins/SitesManager/templates/siteWithoutData.twig @@ -41,7 +41,10 @@ {{ 'SitesManager_SiteWithoutDataSetupGoals'|translate('', "")|raw }} + }) ~ '">', "", + '', "", + '', "", + '', "")|raw }}

{{ trackingHelp|raw }} diff --git a/tests/UI/expected-screenshots/EmptySite_emptySiteDashboard.png b/tests/UI/expected-screenshots/EmptySite_emptySiteDashboard.png index 0ec9b44b84..6433c2ab72 100644 --- a/tests/UI/expected-screenshots/EmptySite_emptySiteDashboard.png +++ b/tests/UI/expected-screenshots/EmptySite_emptySiteDashboard.png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:ce3bd400dcd3586fe1874141e386997bc4d3983f73a94beb58e2e43fb76ffbed -size 178968 +oid sha256:e2c131f981a3d5ac09c7f035a3f855bc35f4e7ec9bf3083c475df5a770ce90f5 +size 217051 diff --git a/tests/UI/expected-screenshots/Installation_js_tracking.png b/tests/UI/expected-screenshots/Installation_js_tracking.png index f763bd2c8a..1c80945c89 100644 --- a/tests/UI/expected-screenshots/Installation_js_tracking.png +++ b/tests/UI/expected-screenshots/Installation_js_tracking.png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:3fcce42eb580e158fd1eac73e2146360a33594e65f5d925e561698b07f38dc3d -size 192902 +oid sha256:83be8b2ff81e007f67f2f3339ba1ca9bb2c6fd0b3761382a5078bf69c9e4cde9 +size 222090 -- cgit v1.2.3 From eb121d6a338858738bf5d4cc3d6e907f72208f40 Mon Sep 17 00:00:00 2001 From: Peter Boehlke Date: Fri, 31 Mar 2017 13:01:02 +0200 Subject: NumberFormatter usw fallback if locale en_US not installed (#11571) Fixes "Error in the display of localized numbers" #10594 --- core/Intl/Locale.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/core/Intl/Locale.php b/core/Intl/Locale.php index 05cf51a8e3..684861237e 100644 --- a/core/Intl/Locale.php +++ b/core/Intl/Locale.php @@ -32,7 +32,7 @@ class Locale setlocale(LC_ALL, $newLocale); setlocale(LC_CTYPE, ''); // Always use english for numbers. otherwise the decimal separator might get localized when casting a float to string - setlocale(LC_NUMERIC, array('en_US.UTF-8', 'en-US')); + setlocale(LC_NUMERIC, array('en_US.UTF-8', 'en-US', 'C.UTF-8', 'C')); } public static function setDefaultLocale() -- cgit v1.2.3 From c79e15605bb7e2ee632ddc63b1b271df08944b42 Mon Sep 17 00:00:00 2001 From: Stefan Giehl Date: Mon, 3 Apr 2017 19:44:25 +0200 Subject: replace pChart with CpChart (#11559) --- CHANGELOG.md | 3 + composer.json | 3 +- composer.lock | 75 +- libs/README.md | 10 - libs/pChart/GPLv3.txt | 675 --- libs/pChart/change.log | 292 -- libs/pChart/class/pData.class.php | 789 ---- libs/pChart/class/pDraw.class.php | 6226 -------------------------- libs/pChart/class/pImage.class.php | 482 -- libs/pChart/class/pPie.class.php | 1500 ------- libs/pChart/readme.txt | 143 - plugins/ImageGraph/API.php | 2 +- plugins/ImageGraph/StaticGraph.php | 20 +- plugins/ImageGraph/StaticGraph/Exception.php | 4 +- plugins/ImageGraph/StaticGraph/PieGraph.php | 10 +- 15 files changed, 91 insertions(+), 10143 deletions(-) delete mode 100755 libs/pChart/GPLv3.txt delete mode 100644 libs/pChart/change.log delete mode 100755 libs/pChart/class/pData.class.php delete mode 100755 libs/pChart/class/pDraw.class.php delete mode 100755 libs/pChart/class/pImage.class.php delete mode 100755 libs/pChart/class/pPie.class.php delete mode 100644 libs/pChart/readme.txt diff --git a/CHANGELOG.md b/CHANGELOG.md index 4e71995db5..11bcfef2c6 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -13,6 +13,9 @@ The Product Changelog at **[piwik.org/changelog](http://piwik.org/changelog)** l ### New APIs * A new event `Controller.triggerAdminNotifications` has been added to let plugins know when they are supposed to trigger notifications in the admin. +### Library updates +* pChart library has been removed in favor of [CpChart](https://github.com/szymach/c-pchart), a pChart fork with composer support and PSR standards. + ## Piwik 3.0.2 ### New Features diff --git a/composer.json b/composer.json index ef6b953aaf..976fc09874 100644 --- a/composer.json +++ b/composer.json @@ -45,7 +45,8 @@ "piwik/searchengine-and-social-list": "~1.0", "tecnickcom/tcpdf": "~6.0", "piwik/piwik-php-tracker": "^1.0", - "composer/semver": "~1.3.0" + "composer/semver": "~1.3.0", + "szymach/c-pchart": "^2.0" }, "require-dev": { "aws/aws-sdk-php": "2.7.1", diff --git a/composer.lock b/composer.lock index 81891faa81..d17e00a4f0 100644 --- a/composer.lock +++ b/composer.lock @@ -4,8 +4,8 @@ "Read more about it at https://getcomposer.org/doc/01-basic-usage.md#composer-lock-the-lock-file", "This file is @generated automatically" ], - "hash": "db7672f3c64f1dbbd65edc6fd119e414", - "content-hash": "126d7da5eef61ae7f0764a2cfdf2c068", + "hash": "28cc5fd9b5400da4b1e2d40969c2511d", + "content-hash": "39dbe45e9a9ada455d5b38be7e6f5fad", "packages": [ { "name": "composer/semver", @@ -15,7 +15,7 @@ "url": "https://github.com/composer/semver.git", "reference": "df4463baa9f44fe6cf0a6da4fde2934d4c0a2747" }, - "dist": { + "dist": { "type": "zip", "url": "https://api.github.com/repos/composer/semver/zipball/df4463baa9f44fe6cf0a6da4fde2934d4c0a2747", "reference": "df4463baa9f44fe6cf0a6da4fde2934d4c0a2747", @@ -1190,6 +1190,73 @@ "homepage": "https://symfony.com", "time": "2015-06-25 11:21:15" }, + { + "name": "szymach/c-pchart", + "version": "2.0.4", + "source": { + "type": "git", + "url": "https://github.com/szymach/c-pchart.git", + "reference": "ed1a876c907c0610eae72592e563e1792e2d455a" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/szymach/c-pchart/zipball/ed1a876c907c0610eae72592e563e1792e2d455a", + "reference": "ed1a876c907c0610eae72592e563e1792e2d455a", + "shasum": "" + }, + "require": { + "ext-gd": "*", + "php": ">=5.4" + }, + "require-dev": { + "behat/behat": "^3.3", + "behat/mink": "^1.7", + "behat/mink-goutte-driver": "^1.2", + "bossa/phpspec2-expect": "^1.0", + "sensiolabs/behat-page-object-extension": "^2.0", + "squizlabs/php_codesniffer": "^2.8" + }, + "type": "project", + "extra": { + "branch-alias": { + "dev-master": "2.0.x-dev" + } + }, + "autoload": { + "psr-4": { + "CpChart\\": "src/" + }, + "files": [ + "src/Resources/data/constants.php" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "GPL-3.0" + ], + "authors": [ + { + "name": "Jean-Damien Pogolotti", + "homepage": "http://www.pchart.net", + "role": "Creator of the original pChart library" + }, + { + "name": "Piotr Szymaszek", + "homepage": "https://github.com/szymach", + "role": "Developer of the CpChart wrapper package" + } + ], + "description": "Port of \"pChart\" library into PHP 5", + "homepage": "https://github.com/szymach/c-pchart", + "keywords": [ + "CpChart", + "c-pChart", + "charts", + "pchart", + "statistics" + ], + "time": "2017-03-08 22:32:31" + }, { "name": "tecnickcom/tcpdf", "version": "6.2.12", @@ -1502,7 +1569,7 @@ "description": "XHProf: A Hierarchical Profiler for PHP", "homepage": "http://pecl.php.net/package/xhprof", "keywords": [ - "performance", + "performance", "profiling" ], "time": "2015-02-26 14:37:51" diff --git a/libs/README.md b/libs/README.md index edc4a97dc1..824d7f2473 100644 --- a/libs/README.md +++ b/libs/README.md @@ -7,16 +7,6 @@ third-party libraries: * HTML/Quickform2/ - in r2626, php 5.1.6 incompatibility - in r3040, exception classes don't follow PEAR naming convention - * pChart2.1.3/ - - the following unused files were removed: - class/pBarcode39.class.php, class/pBarcode128.class.php, - class/pBubble.class.php, class/pCache.class.php, class/pIndicator.class.php, - class/pRadar.class.php, class/pScatter.class.php, class/pSplit.class.php, - class/pSpring.class.php, class/pStock.class.php, class/pSurface.class.php, - data/, examples/, fonts/, palettes/ - - The bug #4206 (GD with JIS-mapped Japanese Font Support) was fixed in this - commit: https://github.com/piwik/piwik/commit/516c13d9b13ca3b908575eb809f7ad9d9397f0e1 - Changed files: class/pImage.class.php class/pDraw.class.php * sparkline/ - in r1296, remove require_once - empty sparklines with floats, off-by-one errors, and locale conflict diff --git a/libs/pChart/GPLv3.txt b/libs/pChart/GPLv3.txt deleted file mode 100755 index 10926e87f1..0000000000 --- a/libs/pChart/GPLv3.txt +++ /dev/null @@ -1,675 +0,0 @@ - GNU GENERAL PUBLIC LICENSE - Version 3, 29 June 2007 - - Copyright (C) 2007 Free Software Foundation, Inc. - Everyone is permitted to copy and distribute verbatim copies - of this license document, but changing it is not allowed. - - Preamble - - The GNU General Public License is a free, copyleft license for -software and other kinds of works. - - The licenses for most software and other practical works are designed -to take away your freedom to share and change the works. By contrast, -the GNU General Public License is intended to guarantee your freedom to -share and change all versions of a program--to make sure it remains free -software for all its users. We, the Free Software Foundation, use the -GNU General Public License for most of our software; it applies also to -any other work released this way by its authors. You can apply it to -your programs, too. - - When we speak of free software, we are referring to freedom, not -price. Our General Public Licenses are designed to make sure that you -have the freedom to distribute copies of free software (and charge for -them if you wish), that you receive source code or can get it if you -want it, that you can change the software or use pieces of it in new -free programs, and that you know you can do these things. - - To protect your rights, we need to prevent others from denying you -these rights or asking you to surrender the rights. Therefore, you have -certain responsibilities if you distribute copies of the software, or if -you modify it: responsibilities to respect the freedom of others. - - For example, if you distribute copies of such a program, whether -gratis or for a fee, you must pass on to the recipients the same -freedoms that you received. You must make sure that they, too, receive -or can get the source code. And you must show them these terms so they -know their rights. - - Developers that use the GNU GPL protect your rights with two steps: -(1) assert copyright on the software, and (2) offer you this License -giving you legal permission to copy, distribute and/or modify it. - - For the developers' and authors' protection, the GPL clearly explains -that there is no warranty for this free software. For both users' and -authors' sake, the GPL requires that modified versions be marked as -changed, so that their problems will not be attributed erroneously to -authors of previous versions. - - Some devices are designed to deny users access to install or run -modified versions of the software inside them, although the manufacturer -can do so. This is fundamentally incompatible with the aim of -protecting users' freedom to change the software. The systematic -pattern of such abuse occurs in the area of products for individuals to -use, which is precisely where it is most unacceptable. Therefore, we -have designed this version of the GPL to prohibit the practice for those -products. If such problems arise substantially in other domains, we -stand ready to extend this provision to those domains in future versions -of the GPL, as needed to protect the freedom of users. - - Finally, every program is threatened constantly by software patents. -States should not allow patents to restrict development and use of -software on general-purpose computers, but in those that do, we wish to -avoid the special danger that patents applied to a free program could -make it effectively proprietary. To prevent this, the GPL assures that -patents cannot be used to render the program non-free. - - The precise terms and conditions for copying, distribution and -modification follow. - - TERMS AND CONDITIONS - - 0. Definitions. - - "This License" refers to version 3 of the GNU General Public License. - - "Copyright" also means copyright-like laws that apply to other kinds of -works, such as semiconductor masks. - - "The Program" refers to any copyrightable work licensed under this -License. Each licensee is addressed as "you". "Licensees" and -"recipients" may be individuals or organizations. - - To "modify" a work means to copy from or adapt all or part of the work -in a fashion requiring copyright permission, other than the making of an -exact copy. The resulting work is called a "modified version" of the -earlier work or a work "based on" the earlier work. - - A "covered work" means either the unmodified Program or a work based -on the Program. - - To "propagate" a work means to do anything with it that, without -permission, would make you directly or secondarily liable for -infringement under applicable copyright law, except executing it on a -computer or modifying a private copy. Propagation includes copying, -distribution (with or without modification), making available to the -public, and in some countries other activities as well. - - To "convey" a work means any kind of propagation that enables other -parties to make or receive copies. Mere interaction with a user through -a computer network, with no transfer of a copy, is not conveying. - - An interactive user interface displays "Appropriate Legal Notices" -to the extent that it includes a convenient and prominently visible -feature that (1) displays an appropriate copyright notice, and (2) -tells the user that there is no warranty for the work (except to the -extent that warranties are provided), that licensees may convey the -work under this License, and how to view a copy of this License. If -the interface presents a list of user commands or options, such as a -menu, a prominent item in the list meets this criterion. - - 1. Source Code. - - The "source code" for a work means the preferred form of the work -for making modifications to it. "Object code" means any non-source -form of a work. - - A "Standard Interface" means an interface that either is an official -standard defined by a recognized standards body, or, in the case of -interfaces specified for a particular programming language, one that -is widely used among developers working in that language. - - The "System Libraries" of an executable work include anything, other -than the work as a whole, that (a) is included in the normal form of -packaging a Major Component, but which is not part of that Major -Component, and (b) serves only to enable use of the work with that -Major Component, or to implement a Standard Interface for which an -implementation is available to the public in source code form. A -"Major Component", in this context, means a major essential component -(kernel, window system, and so on) of the specific operating system -(if any) on which the executable work runs, or a compiler used to -produce the work, or an object code interpreter used to run it. - - The "Corresponding Source" for a work in object code form means all -the source code needed to generate, install, and (for an executable -work) run the object code and to modify the work, including scripts to -control those activities. However, it does not include the work's -System Libraries, or general-purpose tools or generally available free -programs which are used unmodified in performing those activities but -which are not part of the work. For example, Corresponding Source -includes interface definition files associated with source files for -the work, and the source code for shared libraries and dynamically -linked subprograms that the work is specifically designed to require, -such as by intimate data communication or control flow between those -subprograms and other parts of the work. - - The Corresponding Source need not include anything that users -can regenerate automatically from other parts of the Corresponding -Source. - - The Corresponding Source for a work in source code form is that -same work. - - 2. Basic Permissions. - - All rights granted under this License are granted for the term of -copyright on the Program, and are irrevocable provided the stated -conditions are met. This License explicitly affirms your unlimited -permission to run the unmodified Program. The output from running a -covered work is covered by this License only if the output, given its -content, constitutes a covered work. This License acknowledges your -rights of fair use or other equivalent, as provided by copyright law. - - You may make, run and propagate covered works that you do not -convey, without conditions so long as your license otherwise remains -in force. You may convey covered works to others for the sole purpose -of having them make modifications exclusively for you, or provide you -with facilities for running those works, provided that you comply with -the terms of this License in conveying all material for which you do -not control copyright. Those thus making or running the covered works -for you must do so exclusively on your behalf, under your direction -and control, on terms that prohibit them from making any copies of -your copyrighted material outside their relationship with you. - - Conveying under any other circumstances is permitted solely under -the conditions stated below. Sublicensing is not allowed; section 10 -makes it unnecessary. - - 3. Protecting Users' Legal Rights From Anti-Circumvention Law. - - No covered work shall be deemed part of an effective technological -measure under any applicable law fulfilling obligations under article -11 of the WIPO copyright treaty adopted on 20 December 1996, or -similar laws prohibiting or restricting circumvention of such -measures. - - When you convey a covered work, you waive any legal power to forbid -circumvention of technological measures to the extent such circumvention -is effected by exercising rights under this License with respect to -the covered work, and you disclaim any intention to limit operation or -modification of the work as a means of enforcing, against the work's -users, your or third parties' legal rights to forbid circumvention of -technological measures. - - 4. Conveying Verbatim Copies. - - You may convey verbatim copies of the Program's source code as you -receive it, in any medium, provided that you conspicuously and -appropriately publish on each copy an appropriate copyright notice; -keep intact all notices stating that this License and any -non-permissive terms added in accord with section 7 apply to the code; -keep intact all notices of the absence of any warranty; and give all -recipients a copy of this License along with the Program. - - You may charge any price or no price for each copy that you convey, -and you may offer support or warranty protection for a fee. - - 5. Conveying Modified Source Versions. - - You may convey a work based on the Program, or the modifications to -produce it from the Program, in the form of source code under the -terms of section 4, provided that you also meet all of these conditions: - - a) The work must carry prominent notices stating that you modified - it, and giving a relevant date. - - b) The work must carry prominent notices stating that it is - released under this License and any conditions added under section - 7. This requirement modifies the requirement in section 4 to - "keep intact all notices". - - c) You must license the entire work, as a whole, under this - License to anyone who comes into possession of a copy. This - License will therefore apply, along with any applicable section 7 - additional terms, to the whole of the work, and all its parts, - regardless of how they are packaged. This License gives no - permission to license the work in any other way, but it does not - invalidate such permission if you have separately received it. - - d) If the work has interactive user interfaces, each must display - Appropriate Legal Notices; however, if the Program has interactive - interfaces that do not display Appropriate Legal Notices, your - work need not make them do so. - - A compilation of a covered work with other separate and independent -works, which are not by their nature extensions of the covered work, -and which are not combined with it such as to form a larger program, -in or on a volume of a storage or distribution medium, is called an -"aggregate" if the compilation and its resulting copyright are not -used to limit the access or legal rights of the compilation's users -beyond what the individual works permit. Inclusion of a covered work -in an aggregate does not cause this License to apply to the other -parts of the aggregate. - - 6. Conveying Non-Source Forms. - - You may convey a covered work in object code form under the terms -of sections 4 and 5, provided that you also convey the -machine-readable Corresponding Source under the terms of this License, -in one of these ways: - - a) Convey the object code in, or embodied in, a physical product - (including a physical distribution medium), accompanied by the - Corresponding Source fixed on a durable physical medium - customarily used for software interchange. - - b) Convey the object code in, or embodied in, a physical product - (including a physical distribution medium), accompanied by a - written offer, valid for at least three years and valid for as - long as you offer spare parts or customer support for that product - model, to give anyone who possesses the object code either (1) a - copy of the Corresponding Source for all the software in the - product that is covered by this License, on a durable physical - medium customarily used for software interchange, for a price no - more than your reasonable cost of physically performing this - conveying of source, or (2) access to copy the - Corresponding Source from a network server at no charge. - - c) Convey individual copies of the object code with a copy of the - written offer to provide the Corresponding Source. This - alternative is allowed only occasionally and noncommercially, and - only if you received the object code with such an offer, in accord - with subsection 6b. - - d) Convey the object code by offering access from a designated - place (gratis or for a charge), and offer equivalent access to the - Corresponding Source in the same way through the same place at no - further charge. You need not require recipients to copy the - Corresponding Source along with the object code. If the place to - copy the object code is a network server, the Corresponding Source - may be on a different server (operated by you or a third party) - that supports equivalent copying facilities, provided you maintain - clear directions next to the object code saying where to find the - Corresponding Source. Regardless of what server hosts the - Corresponding Source, you remain obligated to ensure that it is - available for as long as needed to satisfy these requirements. - - e) Convey the object code using peer-to-peer transmission, provided - you inform other peers where the object code and Corresponding - Source of the work are being offered to the general public at no - charge under subsection 6d. - - A separable portion of the object code, whose source code is excluded -from the Corresponding Source as a System Library, need not be -included in conveying the object code work. - - A "User Product" is either (1) a "consumer product", which means any -tangible personal property which is normally used for personal, family, -or household purposes, or (2) anything designed or sold for incorporation -into a dwelling. In determining whether a product is a consumer product, -doubtful cases shall be resolved in favor of coverage. For a particular -product received by a particular user, "normally used" refers to a -typical or common use of that class of product, regardless of the status -of the particular user or of the way in which the particular user -actually uses, or expects or is expected to use, the product. A product -is a consumer product regardless of whether the product has substantial -commercial, industrial or non-consumer uses, unless such uses represent -the only significant mode of use of the product. - - "Installation Information" for a User Product means any methods, -procedures, authorization keys, or other information required to install -and execute modified versions of a covered work in that User Product from -a modified version of its Corresponding Source. The information must -suffice to ensure that the continued functioning of the modified object -code is in no case prevented or interfered with solely because -modification has been made. - - If you convey an object code work under this section in, or with, or -specifically for use in, a User Product, and the conveying occurs as -part of a transaction in which the right of possession and use of the -User Product is transferred to the recipient in perpetuity or for a -fixed term (regardless of how the transaction is characterized), the -Corresponding Source conveyed under this section must be accompanied -by the Installation Information. But this requirement does not apply -if neither you nor any third party retains the ability to install -modified object code on the User Product (for example, the work has -been installed in ROM). - - The requirement to provide Installation Information does not include a -requirement to continue to provide support service, warranty, or updates -for a work that has been modified or installed by the recipient, or for -the User Product in which it has been modified or installed. Access to a -network may be denied when the modification itself materially and -adversely affects the operation of the network or violates the rules and -protocols for communication across the network. - - Corresponding Source conveyed, and Installation Information provided, -in accord with this section must be in a format that is publicly -documented (and with an implementation available to the public in -source code form), and must require no special password or key for -unpacking, reading or copying. - - 7. Additional Terms. - - "Additional permissions" are terms that supplement the terms of this -License by making exceptions from one or more of its conditions. -Additional permissions that are applicable to the entire Program shall -be treated as though they were included in this License, to the extent -that they are valid under applicable law. If additional permissions -apply only to part of the Program, that part may be used separately -under those permissions, but the entire Program remains governed by -this License without regard to the additional permissions. - - When you convey a copy of a covered work, you may at your option -remove any additional permissions from that copy, or from any part of -it. (Additional permissions may be written to require their own -removal in certain cases when you modify the work.) You may place -additional permissions on material, added by you to a covered work, -for which you have or can give appropriate copyright permission. - - Notwithstanding any other provision of this License, for material you -add to a covered work, you may (if authorized by the copyright holders of -that material) supplement the terms of this License with terms: - - a) Disclaiming warranty or limiting liability differently from the - terms of sections 15 and 16 of this License; or - - b) Requiring preservation of specified reasonable legal notices or - author attributions in that material or in the Appropriate Legal - Notices displayed by works containing it; or - - c) Prohibiting misrepresentation of the origin of that material, or - requiring that modified versions of such material be marked in - reasonable ways as different from the original version; or - - d) Limiting the use for publicity purposes of names of licensors or - authors of the material; or - - e) Declining to grant rights under trademark law for use of some - trade names, trademarks, or service marks; or - - f) Requiring indemnification of licensors and authors of that - material by anyone who conveys the material (or modified versions of - it) with contractual assumptions of liability to the recipient, for - any liability that these contractual assumptions directly impose on - those licensors and authors. - - All other non-permissive additional terms are considered "further -restrictions" within the meaning of section 10. If the Program as you -received it, or any part of it, contains a notice stating that it is -governed by this License along with a term that is a further -restriction, you may remove that term. If a license document contains -a further restriction but permits relicensing or conveying under this -License, you may add to a covered work material governed by the terms -of that license document, provided that the further restriction does -not survive such relicensing or conveying. - - If you add terms to a covered work in accord with this section, you -must place, in the relevant source files, a statement of the -additional terms that apply to those files, or a notice indicating -where to find the applicable terms. - - Additional terms, permissive or non-permissive, may be stated in the -form of a separately written license, or stated as exceptions; -the above requirements apply either way. - - 8. Termination. - - You may not propagate or modify a covered work except as expressly -provided under this License. Any attempt otherwise to propagate or -modify it is void, and will automatically terminate your rights under -this License (including any patent licenses granted under the third -paragraph of section 11). - - However, if you cease all violation of this License, then your -license from a particular copyright holder is reinstated (a) -provisionally, unless and until the copyright holder explicitly and -finally terminates your license, and (b) permanently, if the copyright -holder fails to notify you of the violation by some reasonable means -prior to 60 days after the cessation. - - Moreover, your license from a particular copyright holder is -reinstated permanently if the copyright holder notifies you of the -violation by some reasonable means, this is the first time you have -received notice of violation of this License (for any work) from that -copyright holder, and you cure the violation prior to 30 days after -your receipt of the notice. - - Termination of your rights under this section does not terminate the -licenses of parties who have received copies or rights from you under -this License. If your rights have been terminated and not permanently -reinstated, you do not qualify to receive new licenses for the same -material under section 10. - - 9. Acceptance Not Required for Having Copies. - - You are not required to accept this License in order to receive or -run a copy of the Program. Ancillary propagation of a covered work -occurring solely as a consequence of using peer-to-peer transmission -to receive a copy likewise does not require acceptance. However, -nothing other than this License grants you permission to propagate or -modify any covered work. These actions infringe copyright if you do -not accept this License. Therefore, by modifying or propagating a -covered work, you indicate your acceptance of this License to do so. - - 10. Automatic Licensing of Downstream Recipients. - - Each time you convey a covered work, the recipient automatically -receives a license from the original licensors, to run, modify and -propagate that work, subject to this License. You are not responsible -for enforcing compliance by third parties with this License. - - An "entity transaction" is a transaction transferring control of an -organization, or substantially all assets of one, or subdividing an -organization, or merging organizations. If propagation of a covered -work results from an entity transaction, each party to that -transaction who receives a copy of the work also receives whatever -licenses to the work the party's predecessor in interest had or could -give under the previous paragraph, plus a right to possession of the -Corresponding Source of the work from the predecessor in interest, if -the predecessor has it or can get it with reasonable efforts. - - You may not impose any further restrictions on the exercise of the -rights granted or affirmed under this License. For example, you may -not impose a license fee, royalty, or other charge for exercise of -rights granted under this License, and you may not initiate litigation -(including a cross-claim or counterclaim in a lawsuit) alleging that -any patent claim is infringed by making, using, selling, offering for -sale, or importing the Program or any portion of it. - - 11. Patents. - - A "contributor" is a copyright holder who authorizes use under this -License of the Program or a work on which the Program is based. The -work thus licensed is called the contributor's "contributor version". - - A contributor's "essential patent claims" are all patent claims -owned or controlled by the contributor, whether already acquired or -hereafter acquired, that would be infringed by some manner, permitted -by this License, of making, using, or selling its contributor version, -but do not include claims that would be infringed only as a -consequence of further modification of the contributor version. For -purposes of this definition, "control" includes the right to grant -patent sublicenses in a manner consistent with the requirements of -this License. - - Each contributor grants you a non-exclusive, worldwide, royalty-free -patent license under the contributor's essential patent claims, to -make, use, sell, offer for sale, import and otherwise run, modify and -propagate the contents of its contributor version. - - In the following three paragraphs, a "patent license" is any express -agreement or commitment, however denominated, not to enforce a patent -(such as an express permission to practice a patent or covenant not to -sue for patent infringement). To "grant" such a patent license to a -party means to make such an agreement or commitment not to enforce a -patent against the party. - - If you convey a covered work, knowingly relying on a patent license, -and the Corresponding Source of the work is not available for anyone -to copy, free of charge and under the terms of this License, through a -publicly available network server or other readily accessible means, -then you must either (1) cause the Corresponding Source to be so -available, or (2) arrange to deprive yourself of the benefit of the -patent license for this particular work, or (3) arrange, in a manner -consistent with the requirements of this License, to extend the patent -license to downstream recipients. "Knowingly relying" means you have -actual knowledge that, but for the patent license, your conveying the -covered work in a country, or your recipient's use of the covered work -in a country, would infringe one or more identifiable patents in that -country that you have reason to believe are valid. - - If, pursuant to or in connection with a single transaction or -arrangement, you convey, or propagate by procuring conveyance of, a -covered work, and grant a patent license to some of the parties -receiving the covered work authorizing them to use, propagate, modify -or convey a specific copy of the covered work, then the patent license -you grant is automatically extended to all recipients of the covered -work and works based on it. - - A patent license is "discriminatory" if it does not include within -the scope of its coverage, prohibits the exercise of, or is -conditioned on the non-exercise of one or more of the rights that are -specifically granted under this License. You may not convey a covered -work if you are a party to an arrangement with a third party that is -in the business of distributing software, under which you make payment -to the third party based on the extent of your activity of conveying -the work, and under which the third party grants, to any of the -parties who would receive the covered work from you, a discriminatory -patent license (a) in connection with copies of the covered work -conveyed by you (or copies made from those copies), or (b) primarily -for and in connection with specific products or compilations that -contain the covered work, unless you entered into that arrangement, -or that patent license was granted, prior to 28 March 2007. - - Nothing in this License shall be construed as excluding or limiting -any implied license or other defenses to infringement that may -otherwise be available to you under applicable patent law. - - 12. No Surrender of Others' Freedom. - - If conditions are imposed on you (whether by court order, agreement or -otherwise) that contradict the conditions of this License, they do not -excuse you from the conditions of this License. If you cannot convey a -covered work so as to satisfy simultaneously your obligations under this -License and any other pertinent obligations, then as a consequence you may -not convey it at all. For example, if you agree to terms that obligate you -to collect a royalty for further conveying from those to whom you convey -the Program, the only way you could satisfy both those terms and this -License would be to refrain entirely from conveying the Program. - - 13. Use with the GNU Affero General Public License. - - Notwithstanding any other provision of this License, you have -permission to link or combine any covered work with a work licensed -under version 3 of the GNU Affero General Public License into a single -combined work, and to convey the resulting work. The terms of this -License will continue to apply to the part which is the covered work, -but the special requirements of the GNU Affero General Public License, -section 13, concerning interaction through a network will apply to the -combination as such. - - 14. Revised Versions of this License. - - The Free Software Foundation may publish revised and/or new versions of -the GNU General Public License from time to time. Such new versions will -be similar in spirit to the present version, but may differ in detail to -address new problems or concerns. - - Each version is given a distinguishing version number. If the -Program specifies that a certain numbered version of the GNU General -Public License "or any later version" applies to it, you have the -option of following the terms and conditions either of that numbered -version or of any later version published by the Free Software -Foundation. If the Program does not specify a version number of the -GNU General Public License, you may choose any version ever published -by the Free Software Foundation. - - If the Program specifies that a proxy can decide which future -versions of the GNU General Public License can be used, that proxy's -public statement of acceptance of a version permanently authorizes you -to choose that version for the Program. - - Later license versions may give you additional or different -permissions. However, no additional obligations are imposed on any -author or copyright holder as a result of your choosing to follow a -later version. - - 15. Disclaimer of Warranty. - - THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY -APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT -HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY -OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, -THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR -PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM -IS WITH YOU. SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF -ALL NECESSARY SERVICING, REPAIR OR CORRECTION. - - 16. Limitation of Liability. - - IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING -WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MODIFIES AND/OR CONVEYS -THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY -GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE -USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF -DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD -PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS), -EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF -SUCH DAMAGES. - - 17. Interpretation of Sections 15 and 16. - - If the disclaimer of warranty and limitation of liability provided -above cannot be given local legal effect according to their terms, -reviewing courts shall apply local law that most closely approximates -an absolute waiver of all civil liability in connection with the -Program, unless a warranty or assumption of liability accompanies a -copy of the Program in return for a fee. - - END OF TERMS AND CONDITIONS - - How to Apply These Terms to Your New Programs - - If you develop a new program, and you want it to be of the greatest -possible use to the public, the best way to achieve this is to make it -free software which everyone can redistribute and change under these terms. - - To do so, attach the following notices to the program. It is safest -to attach them to the start of each source file to most effectively -state the exclusion of warranty; and each file should have at least -the "copyright" line and a pointer to where the full notice is found. - - - Copyright (C) - - This program is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 3 of the License, or - (at your option) any later version. - - This program is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with this program. If not, see . - -Also add information on how to contact you by electronic and paper mail. - - If the program does terminal interaction, make it output a short -notice like this when it starts in an interactive mode: - - Copyright (C) - This program comes with ABSOLUTELY NO WARRANTY; for details type `show w'. - This is free software, and you are welcome to redistribute it - under certain conditions; type `show c' for details. - -The hypothetical commands `show w' and `show c' should show the appropriate -parts of the General Public License. Of course, your program's commands -might be different; for a GUI interface, you would use an "about box". - - You should also get your employer (if you work as a programmer) or school, -if any, to sign a "copyright disclaimer" for the program, if necessary. -For more information on this, and how to apply and follow the GNU GPL, see -. - - The GNU General Public License does not permit incorporating your program -into proprietary programs. If your program is a subroutine library, you -may consider it more useful to permit linking proprietary applications with -the library. If this is what you want to do, use the GNU Lesser General -Public License instead of this License. But first, please read -. - diff --git a/libs/pChart/change.log b/libs/pChart/change.log deleted file mode 100644 index 717502dde7..0000000000 --- a/libs/pChart/change.log +++ /dev/null @@ -1,292 +0,0 @@ - - ╔═════════════════════════════════════════╗ - ║ ║ - ║ pChart - a PHP Charting library ║ - ║ ║ - ║ Version : 2.1.4 ║ - ║ Made by : Jean-Damien POGOLOTTI ║ - ║ Last Update : 19/01/14 ║ - ║ ║ - ╚═════════════════════════════════════════╝ - - 2.1.4 ──────────────────────────────────────────────────────────────────────── - - o Added the AXIS_FORMAT_TRAFFIC format. - o Added the RemoveSkippedAxis parameter to the drawScale() function. - o Enhanced the title field of the floating labels. - o Replaced the date() calles by gmdate() ones. - o Added the $BoxAlpha parameter to the drawLabel(s) functions. - o Fixed a labelling bug on the pie charts. (Thanks to François LE QUEMENER) - o Fixed a security issue with the /examples folder. (Thanks to Nicolas CHATELAIN) - - 2.1.3 ──────────────────────────────────────────────────────────────────────── - - o Updated drawPlotChart() to size the plot based on the serie weight. - o Added the drawXThreshold() function. - o Added the drawXThresholdArea() function. - o Added the AreaName param. to drawXThresholdArea() and drawThresholdArea(). - o Various visual enhancements. - o Fixed a bug in the drawPlotChart() function. - o Added shadow support for the Area charts. - o Added the BorderWidth parameter to the drawBubbleChart() function. - o Added the Shape parameter to the drawBubbleChart() function. - o Added the AXIS_FORMAT_CUSTOM for user callback handling. - o Rewritten the drawStackedAreaChart() function. - o Added support for labels on stacked charts. - o Added the createFunctionSerie() function to the pData class. - o Added the drawScatterThreshold() function to the pScatter class. - o Added the drawScatterThresholdArea() function to the pScatter class. - o Added the setAbsicssaPosition() function to the pData class. - o Added the NegateValues() function to the pData class. - o Added the NoMargin parameter to the drawThresholdArea & drawThreshold fcts. - o Added the drawAreaMirror() function. - o Added the EURO_SYMBOL constant. - o Added the replaceImageMapValues() function. - o Added the replaceImageMapTitle() function. - o Thresholds functions can now accept an array of points. - o Added the FixedMax parameter to both the Radar and Polar charts. - o Added the Precision parameter to the pie and ring charts. - o Added the DisplayOrientation parameter to the bar & stacked bar charts. - o Fixed a bug while using the drawBestFit function with VOID datasets. - o Added the RemoveXAxis option to the drawScale() function. - - - 2.1.2 ──────────────────────────────────────────────────────────────────────── - - o Added zone threshold support for filled area charts. - o Added zone threshold support for filled spline charts. - o Added the setScatterSerieShape() function. - o Added the getSerieMedian() function. - o Added the drawZoneChart() function. - o Added the getStandardDeviation() function. - o Added the getCoefficientOfVariation() function. - o Added the getGeometricMean() function. - o Added the getHarmonicMean() function. - o Introduced support for imageMap. - o Added the initialiseImageMap() function. - o Added the addToImageMap() function. - o Added the dumpImageMap() function. - o Added value writting supports to the radars & polars charts. - o Added the option to add an inner border to the reg. and stacked bar charts. - o Added the SERIE_SHAPE_DIAMOND and SERIE_SHAPE_FILLEDDIAMOND series shapes. - o Fixed a visual bug in the drawAreaChart function. (thks to dmiller) - o Added the BrowserExpire param to the stroke() function (thks to marquonis) - o Fixed a visual bug in the drawBarChart function when the Interleave is 0. - o Corrected a bug in the drawScatterBestFit() function (thks to ares) - o Fixed some bugs with the pie chart functions. - - - 2.1.1 ──────────────────────────────────────────────────────────────────────── - - o Created the pIndicator class. - o Created the pSurface class. - o Added the drawLabel() function. - o Added the writeScatterLabel() function. - o Added the writeBubbleLabel() function. - o Added the ForceAlpha parameter to the buble chart. - o Added the LabelStacked parameter to the 2D and 3D pie charts. - o Added 2D ring chart support to the pPie class extension. - o Added 3D ring chart support to the pPie class extension. - o Added the autoOutput() method to the pCache class. - o Added some NULL value tests. - o Added the setSerieShape() function to the pData class. - o Added the setAbscissaName() function to the pData class. - o Fixed a bug in the getAverage() function. - o Changed the VOID constant from 0.12345 to 0.123456789. - o Fixed a bug with the number of decimals in the METRIC scale. - o Fixed a visual bug with reversed bar chart labelling. - o Added the ValuePosition & ValuePadding parameters to the pie charts. - o Added the WriteValue parameters to the 2D pie charts. - o Added the getSeriePalette() function to the pData class. - o pData methods can now accept array of serie parameters. - o Fixed a bug in the scatter spline chart VOID values handling. - - 2.1.0 ──────────────────────────────────────────────────────────────────────── - - /!\ Renamed the .class files to .class.php. - - o Create the pScatter class. - o Added the ScatterPlotChart() charting method. - o Added the ScatterLineChart() charting method. - o Added the ScatterSplineChart() charting method. - o Added the DrawScatterLegend() function. - o Added the getScatterLegendSize() function. - o Added the following function to the pData class : - - - setScatterSerie() - - setScatterSerieDescription() - - setScatterSeriePicture() - - setScatterSerieDrawable() - - setScatterSerieTicks() - - setScatterSerieWeight() - - setScatterSerieColor() - - o Added a Forces config. array to drawSpline() function to allow parametric - forces. (used by the scatter spline algorithm) - o Added Floating0Serie & Floating0Value options to the drawBarChart function. - o Added the Draw0Line option to the drawBarChart function. - o Added support for line and filled step charts. - o Fixed a visual artifact in the drawGradient() function. - o Fixed a visual artifact in the drawRoundedFilledRectangle() function. - o Fixed a visual artifact in the drawRadar() function. - o Rewritten the example index page. - o Added the Floating parameter to the scaling functions. - o Added the drawBestFit() and drawScatterBestFit() math functions. - - - 2.0.13 ─────────────────────────────────────────────────────────────────────── - - o Modified the drawScale() function to get the best visual factors. - o Added the BorderAlpha parameter to the drawFilledCircle() function. - o Shipped more examples. - o Fixed a bug in the normalize() function and 0 Values. - o Finally implemented the setSeriePicture() output. - o Added the bubble class extension. - o Added the possibility to have a transparent background to the generated - pictures keeping the alpha channels (thanks to georgi.m) - o Updated the sandbox to support transparent background. - o Added the drawDerivative() function to draw curve slope factor. - o Additional Minor fixes. - - - 2.0.12 ─────────────────────────────────────────────────────────────────────── - - o Added missing points (VOID) handling for line & spline charts. - o Added customisation options to the drawLegend() function. - o Various additions and enhancements in the sandbox. - o Added the weight series support to the drawSplineChart() function. - o Added the SCALE_MODE_MANUAL scaling method. - - - 2.0.11 ─────────────────────────────────────────────────────────────────────── - - o Added the AxisBoxRounded, AxisFontName, AxisFontSize parameters to the - radar and polar class. - o Fixed a bug with the axis labels of the radar charts using the STAR layout. - o Fixed a bug in the axis format computing. - o Added the axis format option in the sandbox system. - o Tuned the way the METRIC scales are displayed. - o Fixed a bug with the getWidth(), getHeight().(thanks to SandmanXC) - - - 2.0.10 ─────────────────────────────────────────────────────────────────────── - - /!\ First public release. - - o Fixed a bug in the normalize() function for VOID values. - o Updated the example rendering frontend. - o Updated the sandbox. - - - 2.0.9 ──────────────────────────────────────────────────────────────────────── - - o Added the sandbox. - o Added the getLegendSize() function. - o Added the SCALE_MODE_ADDALL_START0 scaling method. - o Fixed a bug in the normalize() function. - o Fixed a bug in the computeScale() function. - - 2.0.8 ──────────────────────────────────────────────────────────────────────── - - o Corrected a bug in the drawThreshold() function. (thanks to mice32alpha) - o Added rendering options to the writeBounds() function. - o Enhanced the rendering of the drawRoundedFilledRectangle() function. - o Added the setSerieWeight() function to the pData class. - o Fixed a bug in the loadPalette() function. - o Added the 9 palette files. (/palettes) - o Fixed visual artifact in the drawGradientArea() function. - - - 2.0.7 ──────────────────────────────────────────────────────────────────────── - - o Fixed a cosmetic issue in the stacked area chart function. - o Bar chart with 0 values now appears as a 0 line. - o Zero values are not rendered anymore in stacked bar charts. - o Added the possibility to rotate X axis labels. (LabelRotation) - o Added rendering parameters for skipped X axis values : - - $SkippedAxisTicks - $SkippedAxisR - $SkippedAxisG - $SkippedAxisB - $SkippedAxisAlpha - $SkippedTickR - $SkippedTickG - $SkippedTickB - $SkippedTickAlpha - $SkippedInnerTickWidth - $SkippedOuterTickWidth - - o Added the ability to draw a background box around text (flat, rounded) - o Added the importFromCSV() method to the pData class. - o Fixed a bug in the min/max computing of the data series with VOID values. - - - 2.0.6 ──────────────────────────────────────────────────────────────────────── - - o Added setSliceColor() function to the pPie class. - o Added support for stacked area charts. - o Fixed an issue with 3D pie chart labelling. - o Fixed artifacts issues with the 3D pie hidden faces. - o Fixed a bug in the drawPolygon() function. - o Fixed a bug with automatic abscissa labelling. - o Rewritten the delayedLoaded script. (advice of mathbr for compatibility) - - - 2.0.5 ──────────────────────────────────────────────────────────────────────── - - o Added support for 3D pie charts. - o Enhanced the example rendering. (web) - o Added functionalities on radar charts (proposed by dani Huber) - - - SkipLabels to skip any number of labels. - - LabelMiddle to center the labels between the slices. - - o Fixed a bug with the palette management. - o Fixed an issue while displaying multiple-line legends. - o Added the delayed loader script in the examples. - - - 2.0.4 ──────────────────────────────────────────────────────────────────────── - - o Fixed issue with really small data series. (one value) - o Enhanced the example rendering. (batch + web) - o Added the autoOutput() rendering method. - o Made various minor fixes. - - - 2.0.3 ──────────────────────────────────────────────────────────────────────── - - o Added the autoOutput() function that determine if the picture should be - rendered with the Render() or Stroke() function based on the way the script - is called. (CLI or HTTPD) - o Added the getSum() function to the pData class. - o Added support for 2D pie charts : - - - draw2DPie() - - drawPieLegend() - - o Fixed angle issue in the drawArrowLabel function. - o While turning AA off, dashed line were not rendered (thanks to mice32alpha) - - - 2.0.2 ──────────────────────────────────────────────────────────────────────── - - o Fixing some notifications messages with the PHP5.3.x deprecated functions : - - - split has been replaced by preg_split. - - ereg has been replaced by preg_match. - - o Removed deprecated test with the in_array() function. - - - 2.0.1 ──────────────────────────────────────────────────────────────────────── - - o First public early adopter release. - - - 2.0.0 ──────────────────────────────────────────────────────────────────────── - - o Initial release of the v2.0.0 trunk. All primitive functions and some of - the charting functions have been created. - diff --git a/libs/pChart/class/pData.class.php b/libs/pChart/class/pData.class.php deleted file mode 100755 index d29e0d499c..0000000000 --- a/libs/pChart/class/pData.class.php +++ /dev/null @@ -1,789 +0,0 @@ -array("R"=>188,"G"=>224,"B"=>46,"Alpha"=>100), - "1"=>array("R"=>224,"G"=>100,"B"=>46,"Alpha"=>100), - "2"=>array("R"=>224,"G"=>214,"B"=>46,"Alpha"=>100), - "3"=>array("R"=>46,"G"=>151,"B"=>224,"Alpha"=>100), - "4"=>array("R"=>176,"G"=>46,"B"=>224,"Alpha"=>100), - "5"=>array("R"=>224,"G"=>46,"B"=>117,"Alpha"=>100), - "6"=>array("R"=>92,"G"=>224,"B"=>46,"Alpha"=>100), - "7"=>array("R"=>224,"G"=>176,"B"=>46,"Alpha"=>100)); - - /* Class creator */ - function __construct() - { - $this->Data = ""; - $this->Data["XAxisDisplay"] = AXIS_FORMAT_DEFAULT; - $this->Data["XAxisFormat"] = NULL; - $this->Data["XAxisName"] = NULL; - $this->Data["XAxisUnit"] = NULL; - $this->Data["Abscissa"] = NULL; - $this->Data["AbsicssaPosition"] = AXIS_POSITION_BOTTOM; - - $this->Data["Axis"][0]["Display"] = AXIS_FORMAT_DEFAULT; - $this->Data["Axis"][0]["Position"] = AXIS_POSITION_LEFT; - $this->Data["Axis"][0]["Identity"] = AXIS_Y; - } - - /* Add a single point or an array to the given serie */ - function addPoints($Values,$SerieName="Serie1") - { - if (!isset($this->Data["Series"][$SerieName])) - $this->initialise($SerieName); - - if ( is_array($Values) ) - { - foreach($Values as $Key => $Value) - { $this->Data["Series"][$SerieName]["Data"][] = $Value; } - } - else - $this->Data["Series"][$SerieName]["Data"][] = $Values; - - if ( $Values != VOID ) - { - $StrippedData = $this->stripVOID($this->Data["Series"][$SerieName]["Data"]); - if ( empty($StrippedData) ) { $this->Data["Series"][$SerieName]["Max"] = 0; $this->Data["Series"][$SerieName]["Min"] =0; return(0); } - $this->Data["Series"][$SerieName]["Max"] = max($StrippedData); - $this->Data["Series"][$SerieName]["Min"] = min($StrippedData); - } - } - - /* Strip VOID values */ - function stripVOID($Values) - { if (!is_array($Values)) { return(array()); } $Result = array(); foreach($Values as $Key => $Value) { if ( $Value != VOID ) { $Result[] = $Value; } } return($Result); } - - /* Return the number of values contained in a given serie */ - function getSerieCount($Serie) - { if (isset($this->Data["Series"][$Serie]["Data"])) { return(sizeof($this->Data["Series"][$Serie]["Data"])); } else { return(0); } } - - /* Remove a serie from the pData object */ - function removeSerie($Series) - { - if ( !is_array($Series) ) { $Series = $this->convertToArray($Series); } - foreach($Series as $Key => $Serie) { if (isset($this->Data["Series"][$Serie])) { unset($this->Data["Series"][$Serie]); } } - } - - /* Return a value from given serie & index */ - function getValueAt($Serie,$Index=0) - { if (isset($this->Data["Series"][$Serie]["Data"][$Index])) { return($this->Data["Series"][$Serie]["Data"][$Index]); } else { return(NULL); } } - - /* Return the values array */ - function getValues($Serie) - { if (isset($this->Data["Series"][$Serie]["Data"])) { return($this->Data["Series"][$Serie]["Data"]); } else { return(NULL); } } - - /* Reverse the values in the given serie */ - function reverseSerie($Series) - { - if ( !is_array($Series) ) { $Series = $this->convertToArray($Series); } - foreach($Series as $Key => $Serie) { if (isset($this->Data["Series"][$Serie]["Data"])) { $this->Data["Series"][$Serie]["Data"] = array_reverse($this->Data["Series"][$Serie]["Data"]); } } - } - - /* Return the sum of the serie values */ - function getSum($Serie) - { if (isset($this->Data["Series"][$Serie])) { return(array_sum($this->Data["Series"][$Serie]["Data"])); } else { return(NULL); } } - - /* Return the max value of a given serie */ - function getMax($Serie) - { if (isset($this->Data["Series"][$Serie]["Max"])) { return($this->Data["Series"][$Serie]["Max"]); } else { return(NULL); } } - - /* Return the min value of a given serie */ - function getMin($Serie) - { if (isset($this->Data["Series"][$Serie]["Min"])) { return($this->Data["Series"][$Serie]["Min"]); } else { return(NULL); } } - - /* Set the description of a given serie */ - function setSerieShape($Series,$Shape=SERIE_SHAPE_FILLEDCIRCLE) - { - if ( !is_array($Series) ) { $Series = $this->convertToArray($Series); } - foreach($Series as $Key => $Serie) { if (isset($this->Data["Series"][$Serie]) ) { $this->Data["Series"][$Serie]["Shape"] = $Shape; } } - } - - /* Set the description of a given serie */ - function setSerieDescription($Series,$Description="My serie") - { - if ( !is_array($Series) ) { $Series = $this->convertToArray($Series); } - foreach($Series as $Key => $Serie) { if (isset($this->Data["Series"][$Serie]) ) { $this->Data["Series"][$Serie]["Description"] = $Description; } } - } - - /* Set a serie as "drawable" while calling a rendering function */ - function setSerieDrawable($Series,$Drawable=TRUE) - { - if ( !is_array($Series) ) { $Series = $this->convertToArray($Series); } - foreach($Series as $Key => $Serie) { if (isset($this->Data["Series"][$Serie]) ) { $this->Data["Series"][$Serie]["isDrawable"] = $Drawable; } } - } - - /* Set the icon associated to a given serie */ - function setSeriePicture($Series,$Picture=NULL) - { - if ( !is_array($Series) ) { $Series = $this->convertToArray($Series); } - foreach($Series as $Key => $Serie) { if (isset($this->Data["Series"][$Serie]) ) { $this->Data["Series"][$Serie]["Picture"] = $Picture; } } - } - - /* Set the name of the X Axis */ - function setXAxisName($Name) - { $this->Data["XAxisName"] = $Name; } - - /* Set the display mode of the X Axis */ - function setXAxisDisplay($Mode,$Format=NULL) - { $this->Data["XAxisDisplay"] = $Mode; $this->Data["XAxisFormat"] = $Format; } - - /* Set the unit that will be displayed on the X axis */ - function setXAxisUnit($Unit) - { $this->Data["XAxisUnit"] = $Unit; } - - /* Set the serie that will be used as abscissa */ - function setAbscissa($Serie) - { if (isset($this->Data["Series"][$Serie])) { $this->Data["Abscissa"] = $Serie; } } - - function setAbsicssaPosition($Position = AXIS_POSITION_BOTTOM) - { $this->Data["AbsicssaPosition"] = $Position; } - - /* Set the name of the abscissa axis */ - function setAbscissaName($Name) - { $this->Data["AbscissaName"] = $Name; } - - /* Create a scatter group specifyin X and Y data series */ - function setScatterSerie($SerieX,$SerieY,$ID=0) - { if (isset($this->Data["Series"][$SerieX]) && isset($this->Data["Series"][$SerieY]) ) { $this->initScatterSerie($ID); $this->Data["ScatterSeries"][$ID]["X"] = $SerieX; $this->Data["ScatterSeries"][$ID]["Y"] = $SerieY; } } - - /* Set the shape of a given sctatter serie */ - function setScatterSerieShape($ID,$Shape=SERIE_SHAPE_FILLEDCIRCLE) - { if (isset($this->Data["ScatterSeries"][$ID]) ) { $this->Data["ScatterSeries"][$ID]["Shape"] = $Shape; } } - - /* Set the description of a given scatter serie */ - function setScatterSerieDescription($ID,$Description="My serie") - { if (isset($this->Data["ScatterSeries"][$ID]) ) { $this->Data["ScatterSeries"][$ID]["Description"] = $Description; } } - - /* Set the icon associated to a given scatter serie */ - function setScatterSeriePicture($ID,$Picture=NULL) - { if (isset($this->Data["ScatterSeries"][$ID]) ) { $this->Data["ScatterSeries"][$ID]["Picture"] = $Picture; } } - - /* Set a scatter serie as "drawable" while calling a rendering function */ - function setScatterSerieDrawable($ID ,$Drawable=TRUE) - { if (isset($this->Data["ScatterSeries"][$ID]) ) { $this->Data["ScatterSeries"][$ID]["isDrawable"] = $Drawable; } } - - /* Define if a scatter serie should be draw with ticks */ - function setScatterSerieTicks($ID,$Width=0) - { if ( isset($this->Data["ScatterSeries"][$ID]) ) { $this->Data["ScatterSeries"][$ID]["Ticks"] = $Width; } } - - /* Define if a scatter serie should be draw with a special weight */ - function setScatterSerieWeight($ID,$Weight=0) - { if ( isset($this->Data["ScatterSeries"][$ID]) ) { $this->Data["ScatterSeries"][$ID]["Weight"] = $Weight; } } - - /* Associate a color to a scatter serie */ - function setScatterSerieColor($ID,$Format) - { - $R = isset($Format["R"]) ? $Format["R"] : 0; - $G = isset($Format["G"]) ? $Format["G"] : 0; - $B = isset($Format["B"]) ? $Format["B"] : 0; - $Alpha = isset($Format["Alpha"]) ? $Format["Alpha"] : 100; - - if ( isset($this->Data["ScatterSeries"][$ID]) ) - { - $this->Data["ScatterSeries"][$ID]["Color"]["R"] = $R; - $this->Data["ScatterSeries"][$ID]["Color"]["G"] = $G; - $this->Data["ScatterSeries"][$ID]["Color"]["B"] = $B; - $this->Data["ScatterSeries"][$ID]["Color"]["Alpha"] = $Alpha; - } - } - - /* Compute the series limits for an individual and global point of view */ - function limits() - { - $GlobalMin = ABSOLUTE_MAX; - $GlobalMax = ABSOLUTE_MIN; - - foreach($this->Data["Series"] as $Key => $Value) - { - if ( $this->Data["Abscissa"] != $Key && $this->Data["Series"][$Key]["isDrawable"] == TRUE) - { - if ( $GlobalMin > $this->Data["Series"][$Key]["Min"] ) { $GlobalMin = $this->Data["Series"][$Key]["Min"]; } - if ( $GlobalMax < $this->Data["Series"][$Key]["Max"] ) { $GlobalMax = $this->Data["Series"][$Key]["Max"]; } - } - } - $this->Data["Min"] = $GlobalMin; - $this->Data["Max"] = $GlobalMax; - - return(array($GlobalMin,$GlobalMax)); - } - - /* Mark all series as drawable */ - function drawAll() - { foreach($this->Data["Series"] as $Key => $Value) { if ( $this->Data["Abscissa"] != $Key ) { $this->Data["Series"][$Key]["isDrawable"]=TRUE; } } } - - /* Return the average value of the given serie */ - function getSerieAverage($Serie) - { - if ( isset($this->Data["Series"][$Serie]) ) - { - $SerieData = $this->stripVOID($this->Data["Series"][$Serie]["Data"]); - return(array_sum($SerieData)/sizeof($SerieData)); - } - else - return(NULL); - } - - /* Return the geometric mean of the given serie */ - function getGeometricMean($Serie) - { - if ( isset($this->Data["Series"][$Serie]) ) - { - $SerieData = $this->stripVOID($this->Data["Series"][$Serie]["Data"]); - $Seriesum = 1; foreach($SerieData as $Key => $Value) { $Seriesum = $Seriesum * $Value; } - return(pow($Seriesum,1/sizeof($SerieData))); - } - else - return(NULL); - } - - /* Return the harmonic mean of the given serie */ - function getHarmonicMean($Serie) - { - if ( isset($this->Data["Series"][$Serie]) ) - { - $SerieData = $this->stripVOID($this->Data["Series"][$Serie]["Data"]); - $Seriesum = 0; foreach($SerieData as $Key => $Value) { $Seriesum = $Seriesum + 1/$Value; } - return(sizeof($SerieData)/$Seriesum); - } - else - return(NULL); - } - - /* Return the standard deviation of the given serie */ - function getStandardDeviation($Serie) - { - if ( isset($this->Data["Series"][$Serie]) ) - { - $Average = $this->getSerieAverage($Serie); - $SerieData = $this->stripVOID($this->Data["Series"][$Serie]["Data"]); - - $DeviationSum = 0; - foreach($SerieData as $Key => $Value) - $DeviationSum = $DeviationSum + ($Value-$Average)*($Value-$Average); - - $Deviation = sqrt($DeviationSum/count($SerieData)); - - return($Deviation); - } - else - return(NULL); - } - - /* Return the Coefficient of variation of the given serie */ - function getCoefficientOfVariation($Serie) - { - if ( isset($this->Data["Series"][$Serie]) ) - { - $Average = $this->getSerieAverage($Serie); - $StandardDeviation = $this->getStandardDeviation($Serie); - - if ( $StandardDeviation != 0 ) - return($StandardDeviation/$Average); - else - return(NULL); - } - else - return(NULL); - } - - /* Return the median value of the given serie */ - function getSerieMedian($Serie) - { - if ( isset($this->Data["Series"][$Serie]) ) - { - $SerieData = $this->stripVOID($this->Data["Series"][$Serie]["Data"]); - sort($SerieData); - $SerieCenter = floor(sizeof($SerieData)/2); - - if ( isset($SerieData[$SerieCenter]) ) - return($SerieData[$SerieCenter]); - else - return(NULL); - } - else - return(NULL); - } - - /* Return the x th percentil of the given serie */ - function getSeriePercentile($Serie="Serie1",$Percentil=95) - { - if (!isset($this->Data["Series"][$Serie]["Data"])) { return(NULL); } - - $Values = count($this->Data["Series"][$Serie]["Data"])-1; - if ( $Values < 0 ) { $Values = 0; } - - $PercentilID = floor(($Values/100)*$Percentil+.5); - $SortedValues = $this->Data["Series"][$Serie]["Data"]; - sort($SortedValues); - - if ( is_numeric($SortedValues[$PercentilID]) ) - return($SortedValues[$PercentilID]); - else - return(NULL); - } - - /* Add random values to a given serie */ - function addRandomValues($SerieName="Serie1",$Options="") - { - $Values = isset($Options["Values"]) ? $Options["Values"] : 20; - $Min = isset($Options["Min"]) ? $Options["Min"] : 0; - $Max = isset($Options["Max"]) ? $Options["Max"] : 100; - $withFloat = isset($Options["withFloat"]) ? $Options["withFloat"] : FALSE; - - for ($i=0;$i<=$Values;$i++) - { - if ( $withFloat ) { $Value = rand($Min*100,$Max*100)/100; } else { $Value = rand($Min,$Max); } - $this->addPoints($Value,$SerieName); - } - } - - /* Test if we have valid data */ - function containsData() - { - if (!isset($this->Data["Series"])) { return(FALSE); } - - $Result = FALSE; - foreach($this->Data["Series"] as $Key => $Value) - { if ( $this->Data["Abscissa"] != $Key && $this->Data["Series"][$Key]["isDrawable"]==TRUE) { $Result=TRUE; } } - return($Result); - } - - /* Set the display mode of an Axis */ - function setAxisDisplay($AxisID,$Mode=AXIS_FORMAT_DEFAULT,$Format=NULL) - { - if ( isset($this->Data["Axis"][$AxisID] ) ) - { - $this->Data["Axis"][$AxisID]["Display"] = $Mode; - if ( $Format != NULL ) { $this->Data["Axis"][$AxisID]["Format"] = $Format; } - } - } - - /* Set the position of an Axis */ - function setAxisPosition($AxisID,$Position=AXIS_POSITION_LEFT) - { if ( isset($this->Data["Axis"][$AxisID] ) ) { $this->Data["Axis"][$AxisID]["Position"] = $Position; } } - - /* Associate an unit to an axis */ - function setAxisUnit($AxisID,$Unit) - { if ( isset($this->Data["Axis"][$AxisID] ) ) { $this->Data["Axis"][$AxisID]["Unit"] = $Unit; } } - - /* Associate a name to an axis */ - function setAxisName($AxisID,$Name) - { if ( isset($this->Data["Axis"][$AxisID] ) ) { $this->Data["Axis"][$AxisID]["Name"] = $Name; } } - - /* Associate a color to an axis */ - function setAxisColor($AxisID,$Format) - { - $R = isset($Format["R"]) ? $Format["R"] : 0; - $G = isset($Format["G"]) ? $Format["G"] : 0; - $B = isset($Format["B"]) ? $Format["B"] : 0; - $Alpha = isset($Format["Alpha"]) ? $Format["Alpha"] : 100; - - if ( isset($this->Data["Axis"][$AxisID] ) ) - { - $this->Data["Axis"][$AxisID]["Color"]["R"] = $R; - $this->Data["Axis"][$AxisID]["Color"]["G"] = $G; - $this->Data["Axis"][$AxisID]["Color"]["B"] = $B; - $this->Data["Axis"][$AxisID]["Color"]["Alpha"] = $Alpha; - } - } - - - /* Design an axis as X or Y member */ - function setAxisXY($AxisID,$Identity=AXIS_Y) - { if ( isset($this->Data["Axis"][$AxisID] ) ) { $this->Data["Axis"][$AxisID]["Identity"] = $Identity; } } - - /* Associate one data serie with one axis */ - function setSerieOnAxis($Series,$AxisID) - { - if ( !is_array($Series) ) { $Series = $this->convertToArray($Series); } - foreach($Series as $Key => $Serie) - { - $PreviousAxis = $this->Data["Series"][$Serie]["Axis"]; - - /* Create missing axis */ - if ( !isset($this->Data["Axis"][$AxisID] ) ) - { $this->Data["Axis"][$AxisID]["Position"] = AXIS_POSITION_LEFT; $this->Data["Axis"][$AxisID]["Identity"] = AXIS_Y;} - - $this->Data["Series"][$Serie]["Axis"] = $AxisID; - - /* Cleanup unused axis */ - $Found = FALSE; - foreach($this->Data["Series"] as $SerieName => $Values) { if ( $Values["Axis"] == $PreviousAxis ) { $Found = TRUE; } } - if (!$Found) { unset($this->Data["Axis"][$PreviousAxis]); } - } - } - - /* Define if a serie should be draw with ticks */ - function setSerieTicks($Series,$Width=0) - { - if ( !is_array($Series) ) { $Series = $this->convertToArray($Series); } - foreach($Series as $Key => $Serie) { if ( isset($this->Data["Series"][$Serie]) ) { $this->Data["Series"][$Serie]["Ticks"] = $Width; } } - } - - /* Define if a serie should be draw with a special weight */ - function setSerieWeight($Series,$Weight=0) - { - if ( !is_array($Series) ) { $Series = $this->convertToArray($Series); } - foreach($Series as $Key => $Serie) { if ( isset($this->Data["Series"][$Serie]) ) { $this->Data["Series"][$Serie]["Weight"] = $Weight; } } - } - - /* Returns the palette of the given serie */ - function getSeriePalette($Serie) - { - if ( !isset($this->Data["Series"][$Serie]) ) { return(NULL); } - - $Result = ""; - $Result["R"] = $this->Data["Series"][$Serie]["Color"]["R"]; - $Result["G"] = $this->Data["Series"][$Serie]["Color"]["G"]; - $Result["B"] = $this->Data["Series"][$Serie]["Color"]["B"]; - $Result["Alpha"] = $this->Data["Series"][$Serie]["Color"]["Alpha"]; - - return($Result); - } - - /* Set the color of one serie */ - function setPalette($Series,$Format=NULL) - { - if ( !is_array($Series) ) { $Series = $this->convertToArray($Series); } - - foreach($Series as $Key => $Serie) - { - $R = isset($Format["R"]) ? $Format["R"] : 0; - $G = isset($Format["G"]) ? $Format["G"] : 0; - $B = isset($Format["B"]) ? $Format["B"] : 0; - $Alpha = isset($Format["Alpha"]) ? $Format["Alpha"] : 100; - - if ( isset($this->Data["Series"][$Serie]) ) - { - $OldR = $this->Data["Series"][$Serie]["Color"]["R"]; $OldG = $this->Data["Series"][$Serie]["Color"]["G"]; $OldB = $this->Data["Series"][$Serie]["Color"]["B"]; - $this->Data["Series"][$Serie]["Color"]["R"] = $R; - $this->Data["Series"][$Serie]["Color"]["G"] = $G; - $this->Data["Series"][$Serie]["Color"]["B"] = $B; - $this->Data["Series"][$Serie]["Color"]["Alpha"] = $Alpha; - - /* Do reverse processing on the internal palette array */ - foreach ($this->Palette as $Key => $Value) - { if ($Value["R"] == $OldR && $Value["G"] == $OldG && $Value["B"] == $OldB) { $this->Palette[$Key]["R"] = $R; $this->Palette[$Key]["G"] = $G; $this->Palette[$Key]["B"] = $B; $this->Palette[$Key]["Alpha"] = $Alpha;} } - } - } - } - - /* Load a palette file */ - function loadPalette($FileName,$Overwrite=FALSE) - { - if ( !file_exists($FileName) ) { return(-1); } - if ( $Overwrite ) { $this->Palette = ""; } - - $fileHandle = @fopen($FileName, "r"); - if (!$fileHandle) { return(-1); } - while (!feof($fileHandle)) - { - $buffer = fgets($fileHandle, 4096); - if ( preg_match("/,/",$buffer) ) - { - list($R,$G,$B,$Alpha) = preg_split("/,/",$buffer); - if ( $this->Palette == "" ) { $ID = 0; } else { $ID = count($this->Palette); } - $this->Palette[$ID] = array("R"=>$R,"G"=>$G,"B"=>$B,"Alpha"=>$Alpha); - } - } - fclose($fileHandle); - - /* Apply changes to current series */ - $ID = 0; - if ( isset($this->Data["Series"])) - { - foreach($this->Data["Series"] as $Key => $Value) - { - if ( !isset($this->Palette[$ID]) ) - $this->Data["Series"][$Key]["Color"] = array("R"=>0,"G"=>0,"B"=>0,"Alpha"=>0); - else - $this->Data["Series"][$Key]["Color"] = $this->Palette[$ID]; - $ID++; - } - } - } - - /* Initialise a given scatter serie */ - function initScatterSerie($ID) - { - if ( isset($this->Data["ScatterSeries"][$ID]) ) { return(0); } - - $this->Data["ScatterSeries"][$ID]["Description"] = "Scatter ".$ID; - $this->Data["ScatterSeries"][$ID]["isDrawable"] = TRUE; - $this->Data["ScatterSeries"][$ID]["Picture"] = NULL; - $this->Data["ScatterSeries"][$ID]["Ticks"] = 0; - $this->Data["ScatterSeries"][$ID]["Weight"] = 0; - - if ( isset($this->Palette[$ID]) ) - $this->Data["ScatterSeries"][$ID]["Color"] = $this->Palette[$ID]; - else - { - $this->Data["ScatterSeries"][$ID]["Color"]["R"] = rand(0,255); - $this->Data["ScatterSeries"][$ID]["Color"]["G"] = rand(0,255); - $this->Data["ScatterSeries"][$ID]["Color"]["B"] = rand(0,255); - $this->Data["ScatterSeries"][$ID]["Color"]["Alpha"] = 100; - } - } - - /* Initialise a given serie */ - function initialise($Serie) - { - if ( isset($this->Data["Series"]) ) { $ID = count($this->Data["Series"]); } else { $ID = 0; } - - $this->Data["Series"][$Serie]["Description"] = $Serie; - $this->Data["Series"][$Serie]["isDrawable"] = TRUE; - $this->Data["Series"][$Serie]["Picture"] = NULL; - $this->Data["Series"][$Serie]["Max"] = NULL; - $this->Data["Series"][$Serie]["Min"] = NULL; - $this->Data["Series"][$Serie]["Axis"] = 0; - $this->Data["Series"][$Serie]["Ticks"] = 0; - $this->Data["Series"][$Serie]["Weight"] = 0; - $this->Data["Series"][$Serie]["Shape"] = SERIE_SHAPE_FILLEDCIRCLE; - - if ( isset($this->Palette[$ID]) ) - $this->Data["Series"][$Serie]["Color"] = $this->Palette[$ID]; - else - { - $this->Data["Series"][$Serie]["Color"]["R"] = rand(0,255); - $this->Data["Series"][$Serie]["Color"]["G"] = rand(0,255); - $this->Data["Series"][$Serie]["Color"]["B"] = rand(0,255); - $this->Data["Series"][$Serie]["Color"]["Alpha"] = 100; - } - } - - function normalize($NormalizationFactor=100,$UnitChange=NULL,$Round=1) - { - $Abscissa = $this->Data["Abscissa"]; - - $SelectedSeries = ""; - $MaxVal = 0; - foreach($this->Data["Axis"] as $AxisID => $Axis) - { - if ( $UnitChange != NULL ) { $this->Data["Axis"][$AxisID]["Unit"] = $UnitChange; } - - foreach($this->Data["Series"] as $SerieName => $Serie) - { - if ($Serie["Axis"] == $AxisID && $Serie["isDrawable"] == TRUE && $SerieName != $Abscissa) - { - $SelectedSeries[$SerieName] = $SerieName; - - if ( count($Serie["Data"] ) > $MaxVal ) { $MaxVal = count($Serie["Data"]); } - } - } - } - - for($i=0;$i<=$MaxVal-1;$i++) - { - $Factor = 0; - foreach ($SelectedSeries as $Key => $SerieName ) - { - $Value = $this->Data["Series"][$SerieName]["Data"][$i]; - if ( $Value != VOID ) - $Factor = $Factor + abs($Value); - } - - if ( $Factor != 0 ) - { - $Factor = $NormalizationFactor / $Factor; - - foreach ($SelectedSeries as $Key => $SerieName ) - { - $Value = $this->Data["Series"][$SerieName]["Data"][$i]; - - if ( $Value != VOID && $Factor != $NormalizationFactor ) - $this->Data["Series"][$SerieName]["Data"][$i] = round(abs($Value)*$Factor,$Round); - elseif ( $Value == VOID || $Value == 0 ) - $this->Data["Series"][$SerieName]["Data"][$i] = VOID; - elseif ( $Factor == $NormalizationFactor ) - $this->Data["Series"][$SerieName]["Data"][$i] = $NormalizationFactor; - } - } - } - - foreach ($SelectedSeries as $Key => $SerieName ) - { - $this->Data["Series"][$SerieName]["Max"] = max($this->stripVOID($this->Data["Series"][$SerieName]["Data"])); - $this->Data["Series"][$SerieName]["Min"] = min($this->stripVOID($this->Data["Series"][$SerieName]["Data"])); - } - } - - /* Load data from a CSV (or similar) data source */ - function importFromCSV($FileName,$Options="") - { - $Delimiter = isset($Options["Delimiter"]) ? $Options["Delimiter"] : ","; - $GotHeader = isset($Options["GotHeader"]) ? $Options["GotHeader"] : FALSE; - $SkipColumns = isset($Options["SkipColumns"]) ? $Options["SkipColumns"] : array(-1); - $DefaultSerieName = isset($Options["DefaultSerieName"]) ? $Options["DefaultSerieName"] : "Serie"; - - $Handle = @fopen($FileName,"r"); - if ($Handle) - { - $HeaderParsed = FALSE; $SerieNames = ""; - while (!feof($Handle)) - { - $Buffer = fgets($Handle, 4096); - $Buffer = str_replace(chr(10),"",$Buffer); - $Buffer = str_replace(chr(13),"",$Buffer); - $Values = preg_split("/".$Delimiter."/",$Buffer); - - if ( $Buffer != "" ) - { - if ( $GotHeader && !$HeaderParsed ) - { - foreach($Values as $Key => $Name) { if ( !in_array($Key,$SkipColumns) ) { $SerieNames[$Key] = $Name; } } - $HeaderParsed = TRUE; - } - else - { - if ($SerieNames == "" ) { foreach($Values as $Key => $Name) { if ( !in_array($Key,$SkipColumns) ) { $SerieNames[$Key] = $DefaultSerieName.$Key; } } } - foreach($Values as $Key => $Value) { if ( !in_array($Key,$SkipColumns) ) { $this->addPoints($Value,$SerieNames[$Key]); } } - } - } - } - fclose($Handle); - } - } - - /* Create a dataset based on a formula */ - /* COMMENTED BY PIWIK to avoid eval() - function createFunctionSerie($SerieName,$Formula="",$Options="") - { - $MinX = isset($Options["MinX"]) ? $Options["MinX"] : -10; - $MaxX = isset($Options["MaxX"]) ? $Options["MaxX"] : 10; - $XStep = isset($Options["XStep"]) ? $Options["XStep"] : 1; - $AutoDescription = isset($Options["AutoDescription"]) ? $Options["AutoDescription"] : FALSE; - $RecordAbscissa = isset($Options["RecordAbscissa"]) ? $Options["RecordAbscissa"] : FALSE; - $AbscissaSerie = isset($Options["AbscissaSerie"]) ? $Options["AbscissaSerie"] : "Abscissa"; - - if ( $Formula == "" ) { return(0); } - - $Result = ""; $Abscissa = ""; - for($i=$MinX; $i<=$MaxX; $i=$i+$XStep) - { - $Expression = "\$return = '!'.(".str_replace("z",$i,$Formula).");"; - if ( @eval($Expression) === FALSE ) { $return = VOID; } - if ( $return == "!" ) { $return = VOID; } else { $return = $this->right($return,strlen($return)-1); } - if ( $return == "NAN" ) { $return = VOID; } - if ( $return == "INF" ) { $return = VOID; } - if ( $return == "-INF" ) { $return = VOID; } - - $Abscissa[] = $i; - $Result[] = $return; - } - - $this->addPoints($Result,$SerieName); - if ( $AutoDescription ) { $this->setSerieDescription($SerieName,$Formula); } - if ( $RecordAbscissa ) { $this->addPoints($Abscissa,$AbscissaSerie); } - }*/ - - function negateValues($Series) - { - if ( !is_array($Series) ) { $Series = $this->convertToArray($Series); } - foreach($Series as $Key => $SerieName) - { - if (isset($this->Data["Series"][$SerieName])) - { - $Data = ""; - foreach($this->Data["Series"][$SerieName]["Data"] as $Key => $Value) - { if ( $Value == VOID ) { $Data[] = VOID; } else { $Data[] = -$Value; } } - $this->Data["Series"][$SerieName]["Data"] = $Data; - - $this->Data["Series"][$SerieName]["Max"] = max($this->stripVOID($this->Data["Series"][$SerieName]["Data"])); - $this->Data["Series"][$SerieName]["Min"] = min($this->stripVOID($this->Data["Series"][$SerieName]["Data"])); - } - } - } - - /* Return the data & configuration of the series */ - function getData() - { return($this->Data); } - - /* Save a palette element */ - function savePalette($ID,$Color) - { $this->Palette[$ID] = $Color; } - - /* Return the palette of the series */ - function getPalette() - { return($this->Palette); } - - /* Called by the scaling algorithm to save the config */ - function saveAxisConfig($Axis) { $this->Data["Axis"]=$Axis; } - - /* Save the Y Margin if set */ - function saveYMargin($Value) { $this->Data["YMargin"]=$Value; } - - /* Save extended configuration to the pData object */ - function saveExtendedData($Tag,$Values) { $this->Data["Extended"][$Tag]=$Values; } - - /* Called by the scaling algorithm to save the orientation of the scale */ - function saveOrientation($Orientation) { $this->Data["Orientation"]=$Orientation; } - - /* Convert a string to a single elements array */ - function convertToArray($Value) - { $Values = ""; $Values[] = $Value; return($Values); } - - /* Class string wrapper */ - function __toString() - { return("pData object."); } - - function left($value,$NbChar) { return substr($value,0,$NbChar); } - function right($value,$NbChar) { return substr($value,strlen($value)-$NbChar,$NbChar); } - function mid($value,$Depart,$NbChar) { return substr($value,$Depart-1,$NbChar); } - } -?> \ No newline at end of file diff --git a/libs/pChart/class/pDraw.class.php b/libs/pChart/class/pDraw.class.php deleted file mode 100755 index 0b30d99279..0000000000 --- a/libs/pChart/class/pDraw.class.php +++ /dev/null @@ -1,6226 +0,0 @@ -DataSet->getData(); - - foreach($Data["Series"] as $SerieName => $Serie) - { if ( $Serie["isDrawable"] == TRUE && $SerieName != $Data["Abscissa"] ) { $Results++; } } - - return($Results); - } - - /* Fix box coordinates */ - function fixBoxCoordinates($Xa,$Ya,$Xb,$Yb) - { - $X1 = min($Xa,$Xb); $Y1 = min($Ya,$Yb); - $X2 = max($Xa,$Xb); $Y2 = max($Ya,$Yb); - - return(array($X1,$Y1,$X2,$Y2)); - } - - /* Draw a polygon */ - function drawPolygon($Points,$Format="") - { - $R = isset($Format["R"]) ? $Format["R"] : 0; - $G = isset($Format["G"]) ? $Format["G"] : 0; - $B = isset($Format["B"]) ? $Format["B"] : 0; - $Alpha = isset($Format["Alpha"]) ? $Format["Alpha"] : 100; - $NoFill = isset($Format["NoFill"]) ? $Format["NoFill"] : FALSE; - $NoBorder = isset($Format["NoBorder"]) ? $Format["NoBorder"] : FALSE; - $BorderR = isset($Format["BorderR"]) ? $Format["BorderR"] : $R; - $BorderG = isset($Format["BorderG"]) ? $Format["BorderG"] : $G; - $BorderB = isset($Format["BorderB"]) ? $Format["BorderB"] : $B; - $BorderAlpha = isset($Format["Alpha"]) ? $Format["Alpha"] : $Alpha / 2; - $Surrounding = isset($Format["Surrounding"]) ? $Format["Surrounding"] : NULL; - $SkipX = isset($Format["SkipX"]) ? $Format["SkipX"] : OUT_OF_SIGHT; - $SkipY = isset($Format["SkipY"]) ? $Format["SkipY"] : OUT_OF_SIGHT; - - /* Calling the ImageFilledPolygon() function over the $Points array will round it */ - $Backup = $Points; - - if ( $Surrounding != NULL ) { $BorderR = $R+$Surrounding; $BorderG = $G+$Surrounding; $BorderB = $B+$Surrounding; } - - if ( $SkipX != OUT_OF_SIGHT ) { $SkipX = floor($SkipX); } - if ( $SkipY != OUT_OF_SIGHT ) { $SkipY = floor($SkipY); } - - $RestoreShadow = $this->Shadow; - if ( !$NoFill ) - { - if ( $this->Shadow && $this->ShadowX != 0 && $this->ShadowY != 0 ) - { - $this->Shadow = FALSE; - for($i=0;$i<=count($Points)-1;$i=$i+2) - { $Shadow[] = $Points[$i] + $this->ShadowX; $Shadow[] = $Points[$i+1] + $this->ShadowY; } - $this->drawPolygon($Shadow,array("R"=>$this->ShadowR,"G"=>$this->ShadowG,"B"=>$this->ShadowB,"Alpha"=>$this->Shadowa,"NoBorder"=>TRUE)); - } - - $FillColor = $this->allocateColor($this->Picture,$R,$G,$B,$Alpha); - - if ( count($Points) >= 6 ) - { ImageFilledPolygon($this->Picture,$Points,count($Points)/2,$FillColor); } - } - - if ( !$NoBorder ) - { - $Points = $Backup; - - if ( $NoFill ) - $BorderSettings = array("R"=>$R,"G"=>$G,"B"=>$B,"Alpha"=>$Alpha); - else - $BorderSettings = array("R"=>$BorderR,"G"=>$BorderG,"B"=>$BorderB,"Alpha"=>$BorderAlpha); - - for($i=0;$i<=count($Points)-1;$i=$i+2) - { - if ( isset($Points[$i+2]) ) - { - if ( !($Points[$i] == $Points[$i+2] && $Points[$i] == $SkipX ) && !($Points[$i+1] == $Points[$i+3] && $Points[$i+1] == $SkipY ) ) - $this->drawLine($Points[$i],$Points[$i+1],$Points[$i+2],$Points[$i+3],$BorderSettings); - } - else - { - if ( !($Points[$i] == $Points[0] && $Points[$i] == $SkipX ) && !($Points[$i+1] == $Points[1] && $Points[$i+1] == $SkipY ) ) - $this->drawLine($Points[$i],$Points[$i+1],$Points[0],$Points[1],$BorderSettings); - } - } - } - - $this->Shadow = $RestoreShadow; - } - - /* Apply AALias correction to the rounded box boundaries */ - function offsetCorrection($Value,$Mode) - { - $Value = round($Value,1); - - if ( $Value == 0 && $Mode == 1 ) { return(.9); } - if ( $Value == 0 ) { return(0); } - - if ( $Mode == 1) - { if ( $Value == 1 ) { return(.9); }; if ( $Value == .1 ) { return(.9); }; if ( $Value == .2 ) { return(.8); }; if ( $Value == .3 ) { return(.8); }; if ( $Value == .4 ) { return(.7); }; if ( $Value == .5 ) { return(.5); }; if ( $Value == .6 ) { return(.8); }; if ( $Value == .7 ) { return(.7); }; if ( $Value == .8 ) { return(.6); }; if ( $Value == .9 ) { return(.9); }; } - - if ( $Mode == 2) - { if ( $Value == 1 ) { return(.9); }; if ( $Value == .1 ) { return(.1); }; if ( $Value == .2 ) { return(.2); }; if ( $Value == .3 ) { return(.3); }; if ( $Value == .4 ) { return(.4); }; if ( $Value == .5 ) { return(.5); }; if ( $Value == .6 ) { return(.8); }; if ( $Value == .7 ) { return(.7); }; if ( $Value == .8 ) { return(.8); }; if ( $Value == .9 ) { return(.9); }; } - - if ( $Mode == 3) - { if ( $Value == 1 ) { return(.1); }; if ( $Value == .1 ) { return(.1); }; if ( $Value == .2 ) { return(.2); }; if ( $Value == .3 ) { return(.3); }; if ( $Value == .4 ) { return(.4); }; if ( $Value == .5 ) { return(.9); }; if ( $Value == .6 ) { return(.6); }; if ( $Value == .7 ) { return(.7); }; if ( $Value == .8 ) { return(.4); }; if ( $Value == .9 ) { return(.5); }; } - - if ( $Mode == 4) - { if ( $Value == 1 ) { return(-1); }; if ( $Value == .1 ) { return(.1); }; if ( $Value == .2 ) { return(.2); }; if ( $Value == .3 ) { return(.3); }; if ( $Value == .4 ) { return(.1); }; if ( $Value == .5 ) { return(-.1); }; if ( $Value == .6 ) { return(.8); }; if ( $Value == .7 ) { return(.1); }; if ( $Value == .8 ) { return(.1); }; if ( $Value == .9 ) { return(.1); }; } - } - - /* Draw a rectangle with rounded corners */ - function drawRoundedRectangle($X1,$Y1,$X2,$Y2,$Radius,$Format="") - { - $R = isset($Format["R"]) ? $Format["R"] : 0; - $G = isset($Format["G"]) ? $Format["G"] : 0; - $B = isset($Format["B"]) ? $Format["B"] : 0; - $Alpha = isset($Format["Alpha"]) ? $Format["Alpha"] : 100; - - list($X1,$Y1,$X2,$Y2) = $this->fixBoxCoordinates($X1,$Y1,$X2,$Y2); - - if ( $X2 - $X1 < $Radius ) { $Radius = floor((($X2-$X1))/2); } - if ( $Y2 - $Y1 < $Radius ) { $Radius = floor((($Y2-$Y1))/2); } - - $Color = array("R"=>$R,"G"=>$G,"B"=>$B,"Alpha"=>$Alpha,"NoBorder"=>TRUE); - - if ( $Radius <= 0 ) { $this->drawRectangle($X1,$Y1,$X2,$Y2,$Color); return(0); } - - if ( $this->Antialias ) - { - $this->drawLine($X1+$Radius,$Y1,$X2-$Radius,$Y1,$Color); - $this->drawLine($X2,$Y1+$Radius,$X2,$Y2-$Radius,$Color); - $this->drawLine($X2-$Radius,$Y2,$X1+$Radius,$Y2,$Color); - $this->drawLine($X1,$Y1+$Radius,$X1,$Y2-$Radius,$Color); - } - else - { - $Color = $this->allocateColor($this->Picture,$R,$G,$B,$Alpha); - imageline($this->Picture,$X1+$Radius,$Y1,$X2-$Radius,$Y1,$Color); - imageline($this->Picture,$X2,$Y1+$Radius,$X2,$Y2-$Radius,$Color); - imageline($this->Picture,$X2-$Radius,$Y2,$X1+$Radius,$Y2,$Color); - imageline($this->Picture,$X1,$Y1+$Radius,$X1,$Y2-$Radius,$Color); - } - - $Step = 360 / (2 * PI * $Radius); - for($i=0;$i<=90;$i=$i+$Step) - { - $X = cos(($i+180)*PI/180) * $Radius + $X1 + $Radius; - $Y = sin(($i+180)*PI/180) * $Radius + $Y1 + $Radius; - $this->drawAntialiasPixel($X,$Y,array("R"=>$R,"G"=>$G,"B"=>$B,"Alpha"=>$Alpha)); - - $X = cos(($i+90)*PI/180) * $Radius + $X1 + $Radius; - $Y = sin(($i+90)*PI/180) * $Radius + $Y2 - $Radius; - $this->drawAntialiasPixel($X,$Y,array("R"=>$R,"G"=>$G,"B"=>$B,"Alpha"=>$Alpha)); - - $X = cos($i*PI/180) * $Radius + $X2 - $Radius; - $Y = sin($i*PI/180) * $Radius + $Y2 - $Radius; - $this->drawAntialiasPixel($X,$Y,array("R"=>$R,"G"=>$G,"B"=>$B,"Alpha"=>$Alpha)); - - $X = cos(($i+270)*PI/180) * $Radius + $X2 - $Radius; - $Y = sin(($i+270)*PI/180) * $Radius + $Y1 + $Radius; - $this->drawAntialiasPixel($X,$Y,array("R"=>$R,"G"=>$G,"B"=>$B,"Alpha"=>$Alpha)); - } - } - - /* Draw a rectangle with rounded corners */ - function drawRoundedFilledRectangle($X1,$Y1,$X2,$Y2,$Radius,$Format="") - { - $R = isset($Format["R"]) ? $Format["R"] : 0; - $G = isset($Format["G"]) ? $Format["G"] : 0; - $B = isset($Format["B"]) ? $Format["B"] : 0; - $BorderR = isset($Format["BorderR"]) ? $Format["BorderR"] : -1; - $BorderG = isset($Format["BorderG"]) ? $Format["BorderG"] : -1; - $BorderB = isset($Format["BorderB"]) ? $Format["BorderB"] : -1; - $Alpha = isset($Format["Alpha"]) ? $Format["Alpha"] : 100; - $Surrounding = isset($Format["Surrounding"]) ? $Format["Surrounding"] : NULL; - - /* Temporary fix for AA issue */ - $Y1 = floor($Y1); $Y2 = floor($Y2); $X1 = floor($X1); $X2 = floor($X2); - - if ( $Surrounding != NULL ) { $BorderR = $R+$Surrounding; $BorderG = $G+$Surrounding; $BorderB = $B+$Surrounding; } - if ( $BorderR == -1 ) { $BorderR = $R; $BorderG = $G; $BorderB = $B; } - - list($X1,$Y1,$X2,$Y2) = $this->fixBoxCoordinates($X1,$Y1,$X2,$Y2); - - if ( $X2 - $X1 < $Radius*2 ) { $Radius = floor((($X2-$X1))/4); } - if ( $Y2 - $Y1 < $Radius*2 ) { $Radius = floor((($Y2-$Y1))/4); } - - $RestoreShadow = $this->Shadow; - if ( $this->Shadow && $this->ShadowX != 0 && $this->ShadowY != 0 ) - { - $this->Shadow = FALSE; - $this->drawRoundedFilledRectangle($X1+$this->ShadowX,$Y1+$this->ShadowY,$X2+$this->ShadowX,$Y2+$this->ShadowY,$Radius,array("R"=>$this->ShadowR,"G"=>$this->ShadowG,"B"=>$this->ShadowB,"Alpha"=>$this->Shadowa)); - } - - $Color = array("R"=>$R,"G"=>$G,"B"=>$B,"Alpha"=>$Alpha,"NoBorder"=>TRUE); - - if ( $Radius <= 0 ) { $this->drawFilledRectangle($X1,$Y1,$X2,$Y2,$Color); return(0); } - - $YTop = $Y1+$Radius; - $YBottom = $Y2-$Radius; - - $Step = 360 / (2 * PI * $Radius); - $Positions = ""; $Radius--; $MinY = ""; $MaxY = ""; - for($i=0;$i<=90;$i=$i+$Step) - { - $Xp1 = cos(($i+180)*PI/180) * $Radius + $X1 + $Radius; - $Xp2 = cos(((90-$i)+270)*PI/180) * $Radius + $X2 - $Radius; - $Yp = floor(sin(($i+180)*PI/180) * $Radius + $YTop); - if ( $MinY == "" || $Yp > $MinY ) { $MinY = $Yp; } - - if ( $Xp1 <= floor($X1) ) { $Xp1++; } - if ( $Xp2 >= floor($X2) ) { $Xp2--; } - $Xp1++; - - if ( !isset($Positions[$Yp]) ) - { $Positions[$Yp]["X1"] = $Xp1; $Positions[$Yp]["X2"] = $Xp2; } - else - { $Positions[$Yp]["X1"] = ($Positions[$Yp]["X1"]+$Xp1)/2; $Positions[$Yp]["X2"] = ($Positions[$Yp]["X2"]+$Xp2)/2; } - - $Xp1 = cos(($i+90)*PI/180) * $Radius + $X1 + $Radius; - $Xp2 = cos((90-$i)*PI/180) * $Radius + $X2 - $Radius; - $Yp = floor(sin(($i+90)*PI/180) * $Radius + $YBottom); - if ( $MaxY == "" || $Yp < $MaxY ) { $MaxY = $Yp; } - - if ( $Xp1 <= floor($X1) ) { $Xp1++; } - if ( $Xp2 >= floor($X2) ) { $Xp2--; } - $Xp1++; - - if ( !isset($Positions[$Yp]) ) - { $Positions[$Yp]["X1"] = $Xp1; $Positions[$Yp]["X2"] = $Xp2; } - else - { $Positions[$Yp]["X1"] = ($Positions[$Yp]["X1"]+$Xp1)/2; $Positions[$Yp]["X2"] = ($Positions[$Yp]["X2"]+$Xp2)/2; } - } - - $ManualColor = $this->allocateColor($this->Picture,$R,$G,$B,$Alpha); - foreach($Positions as $Yp => $Bounds) - { - $X1 = $Bounds["X1"]; $X1Dec = $this->getFirstDecimal($X1); if ( $X1Dec != 0 ) { $X1 = floor($X1)+1; } - $X2 = $Bounds["X2"]; $X2Dec = $this->getFirstDecimal($X2); if ( $X2Dec != 0 ) { $X2 = floor($X2)-1; } - imageline($this->Picture,$X1,$Yp,$X2,$Yp,$ManualColor); - } - $this->drawFilledRectangle($X1,$MinY+1,floor($X2),$MaxY-1,$Color); - - $Radius++; - $this->drawRoundedRectangle($X1,$Y1,$X2+1,$Y2-1,$Radius,array("R"=>$BorderR,"G"=>$BorderG,"B"=>$BorderB,"Alpha"=>$Alpha)); - - $this->Shadow = $RestoreShadow; - } - - /* Draw a rectangle with rounded corners */ - function drawRoundedFilledRectangle_deprecated($X1,$Y1,$X2,$Y2,$Radius,$Format="") - { - $R = isset($Format["R"]) ? $Format["R"] : 0; - $G = isset($Format["G"]) ? $Format["G"] : 0; - $B = isset($Format["B"]) ? $Format["B"] : 0; - $BorderR = isset($Format["BorderR"]) ? $Format["BorderR"] : -1; - $BorderG = isset($Format["BorderG"]) ? $Format["BorderG"] : -1; - $BorderB = isset($Format["BorderB"]) ? $Format["BorderB"] : -1; - $Alpha = isset($Format["Alpha"]) ? $Format["Alpha"] : 100; - $Surrounding = isset($Format["Surrounding"]) ? $Format["Surrounding"] : NULL; - - if ( $Surrounding != NULL ) { $BorderR = $R+$Surrounding; $BorderG = $G+$Surrounding; $BorderB = $B+$Surrounding; } - if ( $BorderR == -1 ) { $BorderR = $R; $BorderG = $G; $BorderB = $B; } - - list($X1,$Y1,$X2,$Y2) = $this->fixBoxCoordinates($X1,$Y1,$X2,$Y2); - - if ( $X2 - $X1 < $Radius ) { $Radius = floor((($X2-$X1)+2)/2); } - if ( $Y2 - $Y1 < $Radius ) { $Radius = floor((($Y2-$Y1)+2)/2); } - - $RestoreShadow = $this->Shadow; - if ( $this->Shadow && $this->ShadowX != 0 && $this->ShadowY != 0 ) - { - $this->Shadow = FALSE; - $this->drawRoundedFilledRectangle($X1+$this->ShadowX,$Y1+$this->ShadowY,$X2+$this->ShadowX,$Y2+$this->ShadowY,$Radius,array("R"=>$this->ShadowR,"G"=>$this->ShadowG,"B"=>$this->ShadowB,"Alpha"=>$this->Shadowa)); - } - - if ( $this->getFirstDecimal($X2) >= 5 ) { $XOffset2 = 1; } else { $XOffset2 = 0; } - if ( $this->getFirstDecimal($X1) <= 5 ) { $XOffset1 = 1; } else { $XOffset1 = 0; } - - if ( !$this->Antialias ) { $XOffset1 = 1; $XOffset2 = 1; } - - $YTop = floor($Y1+$Radius); - $YBottom = floor($Y2-$Radius); - - $this->drawFilledRectangle($X1-$XOffset1,$YTop,$X2+$XOffset2,$YBottom,array("R"=>$R,"G"=>$G,"B"=>$B,"Alpha"=>$Alpha,"NoBorder"=>TRUE)); - - $Step = 360 / (2 * PI * $Radius); - $Color = $this->allocateColor($this->Picture,$R,$G,$B,$Alpha); - $Color2 = $this->allocateColor($this->Picture,255,0,0,$Alpha); - $Drawn = ""; - - if ( $Alpha < 100 ) { $Drawn[$YTop] = FALSE; } - if ( $Alpha < 100 ) { $Drawn[$YBottom] = TRUE; } - - for($i=0;$i<=90;$i=$i+$Step) - { - $Xp1 = cos(($i+180)*PI/180) * $Radius + $X1 + $Radius; - $Xp2 = cos(((90-$i)+270)*PI/180) * $Radius + $X2 - $Radius; - $Yp = sin(($i+180)*PI/180) * $Radius + $YTop; - - if ( $this->getFirstDecimal($Xp1) > 5 ) { $XOffset1 = 1; } else { $XOffset1 = 0; } - if ( $this->getFirstDecimal($Xp2) > 5 ) { $XOffset2 = 1; } else { $XOffset2 = 0; } - if ( $this->getFirstDecimal($Yp) > 5 ) { $YOffset = 1; } else { $YOffset = 0; } - - if ( !isset($Drawn[$Yp+$YOffset]) || $Alpha == 100 ) - imageline($this->Picture,$Xp1+$XOffset1,$Yp+$YOffset,$Xp2+$XOffset2,$Yp+$YOffset,$Color); - - $Drawn[$Yp+$YOffset] = $Xp2; - - $Xp1 = cos(($i+90)*PI/180) * $Radius + $X1 + $Radius; - $Xp2 = cos((90-$i)*PI/180) * $Radius + $X2 - $Radius; - $Yp = sin(($i+90)*PI/180) * $Radius + $YBottom; - - if ( $this->getFirstDecimal($Xp1) > 7 ) { $XOffset1 = 1; } else { $XOffset1 = 0; } - if ( $this->getFirstDecimal($Xp2) > 7 ) { $XOffset2 = 1; } else { $XOffset2 = 0; } - if ( $this->getFirstDecimal($Yp) > 5 ) { $YOffset = 1; } else { $YOffset = 0; } - - if ( !isset($Drawn[$Yp+$YOffset]) || $Alpha == 100 ) - imageline($this->Picture,$Xp1+$XOffset1,$Yp+$YOffset,$Xp2+$XOffset2,$Yp+$YOffset,$Color); - - $Drawn[$Yp+$YOffset] = $Xp2; - } - - $this->drawRoundedRectangle($X1,$Y1,$X2,$Y2,$Radius,array("R"=>$BorderR,"G"=>$BorderG,"B"=>$BorderB,"Alpha"=>$Alpha)); - - $this->Shadow = $RestoreShadow; - } - - /* Draw a rectangle */ - function drawRectangle($X1,$Y1,$X2,$Y2,$Format="") - { - $R = isset($Format["R"]) ? $Format["R"] : 0; - $G = isset($Format["G"]) ? $Format["G"] : 0; - $B = isset($Format["B"]) ? $Format["B"] : 0; - $Alpha = isset($Format["Alpha"]) ? $Format["Alpha"] : 100; - $Ticks = isset($Format["Ticks"]) ? $Format["Ticks"] : NULL; - $NoAngle = isset($Format["NoAngle"]) ? $Format["NoAngle"] : FALSE; - - if ($X1 > $X2) { list($X1, $X2) = array($X2, $X1); } - if ($Y1 > $Y2) { list($Y1, $Y2) = array($Y2, $Y1); } - - if ( $this->Antialias ) - { - if ( $NoAngle ) - { - $this->drawLine($X1+1,$Y1,$X2-1,$Y1,array("R"=>$R,"G"=>$G,"B"=>$B,"Alpha"=>$Alpha,"Ticks"=>$Ticks)); - $this->drawLine($X2,$Y1+1,$X2,$Y2-1,array("R"=>$R,"G"=>$G,"B"=>$B,"Alpha"=>$Alpha,"Ticks"=>$Ticks)); - $this->drawLine($X2-1,$Y2,$X1+1,$Y2,array("R"=>$R,"G"=>$G,"B"=>$B,"Alpha"=>$Alpha,"Ticks"=>$Ticks)); - $this->drawLine($X1,$Y1+1,$X1,$Y2-1,array("R"=>$R,"G"=>$G,"B"=>$B,"Alpha"=>$Alpha,"Ticks"=>$Ticks)); - } - else - { - $this->drawLine($X1+1,$Y1,$X2-1,$Y1,array("R"=>$R,"G"=>$G,"B"=>$B,"Alpha"=>$Alpha,"Ticks"=>$Ticks)); - $this->drawLine($X2,$Y1,$X2,$Y2,array("R"=>$R,"G"=>$G,"B"=>$B,"Alpha"=>$Alpha,"Ticks"=>$Ticks)); - $this->drawLine($X2-1,$Y2,$X1+1,$Y2,array("R"=>$R,"G"=>$G,"B"=>$B,"Alpha"=>$Alpha,"Ticks"=>$Ticks)); - $this->drawLine($X1,$Y1,$X1,$Y2,array("R"=>$R,"G"=>$G,"B"=>$B,"Alpha"=>$Alpha,"Ticks"=>$Ticks)); - } - } - else - { - $Color = $this->allocateColor($this->Picture,$R,$G,$B,$Alpha); - imagerectangle($this->Picture,$X1,$Y1,$X2,$Y2,$Color); - } - } - - /* Draw a filled rectangle */ - function drawFilledRectangle($X1,$Y1,$X2,$Y2,$Format="") - { - $R = isset($Format["R"]) ? $Format["R"] : 0; - $G = isset($Format["G"]) ? $Format["G"] : 0; - $B = isset($Format["B"]) ? $Format["B"] : 0; - $Alpha = isset($Format["Alpha"]) ? $Format["Alpha"] : 100; - $BorderR = isset($Format["BorderR"]) ? $Format["BorderR"] : -1; - $BorderG = isset($Format["BorderG"]) ? $Format["BorderG"] : -1; - $BorderB = isset($Format["BorderB"]) ? $Format["BorderB"] : -1; - $BorderAlpha = isset($Format["BorderAlpha"]) ? $Format["BorderAlpha"] : $Alpha; - $Surrounding = isset($Format["Surrounding"]) ? $Format["Surrounding"] : NULL; - $Ticks = isset($Format["Ticks"]) ? $Format["Ticks"] : NULL; - $NoAngle = isset($Format["NoAngle"]) ? $Format["NoAngle"] : NULL; - $Dash = isset($Format["Dash"]) ? $Format["Dash"] : FALSE; - $DashStep = isset($Format["DashStep"]) ? $Format["DashStep"] : 4; - $DashR = isset($Format["DashR"]) ? $Format["DashR"] : 0; - $DashG = isset($Format["DashG"]) ? $Format["DashG"] : 0; - $DashB = isset($Format["DashB"]) ? $Format["DashB"] : 0; - $NoBorder = isset($Format["NoBorder"]) ? $Format["NoBorder"] : FALSE; - - if ( $Surrounding != NULL ) { $BorderR = $R+$Surrounding; $BorderG = $G+$Surrounding; $BorderB = $B+$Surrounding; } - - if ($X1 > $X2) { list($X1, $X2) = array($X2, $X1); } - if ($Y1 > $Y2) { list($Y1, $Y2) = array($Y2, $Y1); } - - $RestoreShadow = $this->Shadow; - if ( $this->Shadow && $this->ShadowX != 0 && $this->ShadowY != 0 ) - { - $this->Shadow = FALSE; - $this->drawFilledRectangle($X1+$this->ShadowX,$Y1+$this->ShadowY,$X2+$this->ShadowX,$Y2+$this->ShadowY,array("R"=>$this->ShadowR,"G"=>$this->ShadowG,"B"=>$this->ShadowB,"Alpha"=>$this->Shadowa,"Ticks"=>$Ticks,"NoAngle"=>$NoAngle)); - } - - $Color = $this->allocateColor($this->Picture,$R,$G,$B,$Alpha); - if ( $NoAngle ) - { - imagefilledrectangle($this->Picture,ceil($X1)+1,ceil($Y1),floor($X2)-1,floor($Y2),$Color); - imageline($this->Picture,ceil($X1),ceil($Y1)+1,ceil($X1),floor($Y2)-1,$Color); - imageline($this->Picture,floor($X2),ceil($Y1)+1,floor($X2),floor($Y2)-1,$Color); - } - else - imagefilledrectangle($this->Picture,ceil($X1),ceil($Y1),floor($X2),floor($Y2),$Color); - - if ( $Dash ) - { - if ( $BorderR != -1 ) { $iX1=$X1+1; $iY1=$Y1+1; $iX2=$X2-1; $iY2=$Y2-1; } else { $iX1=$X1; $iY1=$Y1; $iX2=$X2; $iY2=$Y2; } - - $Color = $this->allocateColor($this->Picture,$DashR,$DashG,$DashB,$Alpha); - $Y=$iY1-$DashStep; - for($X=$iX1; $X<=$iX2+($iY2-$iY1); $X=$X+$DashStep) - { - $Y=$Y+$DashStep; - if ( $X > $iX2 ) { $Xa = $X-($X-$iX2); $Ya = $iY1+($X-$iX2); } else { $Xa = $X; $Ya = $iY1; } - if ( $Y > $iY2 ) { $Xb = $iX1+($Y-$iY2); $Yb = $Y-($Y-$iY2); } else { $Xb = $iX1; $Yb = $Y; } - imageline($this->Picture,$Xa,$Ya,$Xb,$Yb,$Color); - } - } - - if ( $this->Antialias && !$NoBorder ) - { - if ( $X1 < ceil($X1) ) - { - $AlphaA = $Alpha * (ceil($X1) - $X1); - $Color = $this->allocateColor($this->Picture,$R,$G,$B,$AlphaA); - imageline($this->Picture,ceil($X1)-1,ceil($Y1),ceil($X1)-1,floor($Y2),$Color); - } - - if ( $Y1 < ceil($Y1) ) - { - $AlphaA = $Alpha * (ceil($Y1) - $Y1); - $Color = $this->allocateColor($this->Picture,$R,$G,$B,$AlphaA); - imageline($this->Picture,ceil($X1),ceil($Y1)-1,floor($X2),ceil($Y1)-1,$Color); - } - - if ( $X2 > floor($X2) ) - { - $AlphaA = $Alpha * (.5-($X2 - floor($X2))); - $Color = $this->allocateColor($this->Picture,$R,$G,$B,$AlphaA); - imageline($this->Picture,floor($X2)+1,ceil($Y1),floor($X2)+1,floor($Y2),$Color); - } - - if ( $Y2 > floor($Y2) ) - { - $AlphaA = $Alpha * (.5-($Y2 - floor($Y2))); - $Color = $this->allocateColor($this->Picture,$R,$G,$B,$AlphaA); - imageline($this->Picture,ceil($X1),floor($Y2)+1,floor($X2),floor($Y2)+1,$Color); - } - } - - if ( $BorderR != -1 ) - $this->drawRectangle($X1,$Y1,$X2,$Y2,array("R"=>$BorderR,"G"=>$BorderG,"B"=>$BorderB,"Alpha"=>$BorderAlpha,"Ticks"=>$Ticks,"NoAngle"=>$NoAngle)); - - $this->Shadow = $RestoreShadow; - } - - /* Draw a rectangular marker of the specified size */ - function drawRectangleMarker($X,$Y,$Format="") - { - $Size = isset($Format["Size"]) ? $Format["Size"] : 4; - - $HalfSize = floor($Size/2); - $this->drawFilledRectangle($X-$HalfSize,$Y-$HalfSize,$X+$HalfSize,$Y+$HalfSize,$Format); - } - - /* Drawn a spline based on the bezier function */ - function drawSpline($Coordinates,$Format="") - { - $R = isset($Format["R"]) ? $Format["R"] : 0; - $G = isset($Format["G"]) ? $Format["G"] : 0; - $B = isset($Format["B"]) ? $Format["B"] : 0; - $Alpha = isset($Format["Alpha"]) ? $Format["Alpha"] : 100; - $Force = isset($Format["Force"]) ? $Format["Force"] : 30; - $Forces = isset($Format["Forces"]) ? $Format["Forces"] : NULL; - $ShowC = isset($Format["ShowControl"]) ? $Format["ShowControl"] : FALSE; - $Ticks = isset($Format["Ticks"]) ? $Format["Ticks"] : NULL; - $PathOnly = isset($Format["PathOnly"]) ? $Format["PathOnly"] : FALSE; - $Weight = isset($Format["Weight"]) ? $Format["Weight"] : NULL; - - $Cpt = NULL; $Mode = NULL; $Result = ""; - for($i=1;$i<=count($Coordinates)-1;$i++) - { - $X1 = $Coordinates[$i-1][0]; $Y1 = $Coordinates[$i-1][1]; - $X2 = $Coordinates[$i][0]; $Y2 = $Coordinates[$i][1]; - - if ( $Forces != NULL ) { $Force = $Forces[$i]; } - - /* First segment */ - if ( $i == 1 ) - { $Xv1 = $X1; $Yv1 = $Y1; } - else - { - $Angle1 = $this->getAngle($XLast,$YLast,$X1,$Y1); - $Angle2 = $this->getAngle($X1,$Y1,$X2,$Y2); - $XOff = cos($Angle2 * PI / 180) * $Force + $X1; - $YOff = sin($Angle2 * PI / 180) * $Force + $Y1; - - $Xv1 = cos($Angle1 * PI / 180) * $Force + $XOff; - $Yv1 = sin($Angle1 * PI / 180) * $Force + $YOff; - } - - /* Last segment */ - if ( $i == count($Coordinates)-1 ) - { $Xv2 = $X2; $Yv2 = $Y2; } - else - { - $Angle1 = $this->getAngle($X2,$Y2,$Coordinates[$i+1][0],$Coordinates[$i+1][1]); - $Angle2 = $this->getAngle($X1,$Y1,$X2,$Y2); - $XOff = cos(($Angle2+180) * PI / 180) * $Force + $X2; - $YOff = sin(($Angle2+180) * PI / 180) * $Force + $Y2; - - $Xv2 = cos(($Angle1+180) * PI / 180) * $Force + $XOff; - $Yv2 = sin(($Angle1+180) * PI / 180) * $Force + $YOff; - } - - $Path = $this->drawBezier($X1,$Y1,$X2,$Y2,$Xv1,$Yv1,$Xv2,$Yv2,$Format); - if ($PathOnly) { $Result[] = $Path; } - - $XLast = $X1; $YLast = $Y1; - } - - return($Result); - } - - /* Draw a bezier curve with two controls points */ - function drawBezier($X1,$Y1,$X2,$Y2,$Xv1,$Yv1,$Xv2,$Yv2,$Format="") - { - $R = isset($Format["R"]) ? $Format["R"] : 0; - $G = isset($Format["G"]) ? $Format["G"] : 0; - $B = isset($Format["B"]) ? $Format["B"] : 0; - $Alpha = isset($Format["Alpha"]) ? $Format["Alpha"] : 100; - $ShowC = isset($Format["ShowControl"]) ? $Format["ShowControl"] : FALSE; - $Segments = isset($Format["Segments"]) ? $Format["Segments"] : NULL; - $Ticks = isset($Format["Ticks"]) ? $Format["Ticks"] : NULL; - $NoDraw = isset($Format["NoDraw"]) ? $Format["NoDraw"] : FALSE; - $PathOnly = isset($Format["PathOnly"]) ? $Format["PathOnly"] : FALSE; - $Weight = isset($Format["Weight"]) ? $Format["Weight"] : NULL; - $DrawArrow = isset($Format["DrawArrow"]) ? $Format["DrawArrow"] : FALSE; - $ArrowSize = isset($Format["ArrowSize"]) ? $Format["ArrowSize"] : 10; - $ArrowRatio = isset($Format["ArrowRatio"]) ? $Format["ArrowRatio"] : .5; - $ArrowTwoHeads = isset($Format["ArrowTwoHeads"]) ? $Format["ArrowTwoHeads"] : FALSE; - - if ( $Segments == NULL ) - { - $Length = $this->getLength($X1,$Y1,$X2,$Y2); - $Precision = ($Length*125)/1000; - } - else - $Precision = $Segments; - - $P[0]["X"] = $X1; $P[0]["Y"] = $Y1; - $P[1]["X"] = $Xv1; $P[1]["Y"] = $Yv1; - $P[2]["X"] = $Xv2; $P[2]["Y"] = $Yv2; - $P[3]["X"] = $X2; $P[3]["Y"] = $Y2; - - /* Compute the bezier points */ - $Q = ""; $ID = 0; $Path = ""; - for($i=0;$i<=$Precision;$i=$i+1) - { - $u = $i / $Precision; - - $C = ""; - $C[0] = (1 - $u) * (1 - $u) * (1 - $u); - $C[1] = ($u * 3) * (1 - $u) * (1 - $u); - $C[2] = 3 * $u * $u * (1 - $u); - $C[3] = $u * $u * $u; - - for($j=0;$j<=3;$j++) - { - if ( !isset($Q[$ID]) ) { $Q[$ID] = ""; } - if ( !isset($Q[$ID]["X"]) ) { $Q[$ID]["X"] = 0; } - if ( !isset($Q[$ID]["Y"]) ) { $Q[$ID]["Y"] = 0; } - - $Q[$ID]["X"] = $Q[$ID]["X"] + $P[$j]["X"] * $C[$j]; - $Q[$ID]["Y"] = $Q[$ID]["Y"] + $P[$j]["Y"] * $C[$j]; - } - $ID++; - } - $Q[$ID]["X"] = $X2; $Q[$ID]["Y"] = $Y2; - - if ( !$NoDraw ) - { - /* Display the control points */ - if ( $ShowC && !$PathOnly ) - { - $Xv1 = floor($Xv1); $Yv1 = floor($Yv1); $Xv2 = floor($Xv2); $Yv2 = floor($Yv2); - - $this->drawLine($X1,$Y1,$X2,$Y2,array("R"=>0,"G"=>0,"B"=>0,"Alpha"=>30)); - - $MyMarkerSettings = array("R"=>255,"G"=>0,"B"=>0,"BorderR"=>255,"BorderB"=>255,"BorderG"=>255,"Size"=>4); - $this->drawRectangleMarker($Xv1,$Yv1,$MyMarkerSettings); - $this->drawText($Xv1+4,$Yv1,"v1"); - $MyMarkerSettings = array("R"=>0,"G"=>0,"B"=>255,"BorderR"=>255,"BorderB"=>255,"BorderG"=>255,"Size"=>4); - $this->drawRectangleMarker($Xv2,$Yv2,$MyMarkerSettings); - $this->drawText($Xv2+4,$Yv2,"v2"); - } - - /* Draw the bezier */ - $LastX = NULL; $LastY = NULL; $Cpt = NULL; $Mode = NULL; $ArrowS = NULL; - foreach ($Q as $Key => $Point) - { - $X = $Point["X"]; $Y = $Point["Y"]; - - /* Get the first segment */ - if ( $ArrowS == NULL && $LastX != NULL && $LastY != NULL ) - { $ArrowS["X2"] = $LastX; $ArrowS["Y2"] = $LastY; $ArrowS["X1"] = $X; $ArrowS["Y1"] = $Y; } - - if ( $LastX != NULL && $LastY != NULL && !$PathOnly) - list($Cpt,$Mode) = $this->drawLine($LastX,$LastY,$X,$Y,array("R"=>$R,"G"=>$G,"B"=>$B,"Alpha"=>$Alpha,"Ticks"=>$Ticks,"Cpt"=>$Cpt,"Mode"=>$Mode,"Weight"=>$Weight)); - - /* Get the last segment */ - $ArrowE["X1"] = $LastX; $ArrowE["Y1"] = $LastY; $ArrowE["X2"] = $X; $ArrowE["Y2"] = $Y; - - $LastX = $X; $LastY = $Y; - } - - if ( $DrawArrow && !$PathOnly ) - { - $ArrowSettings = array("FillR"=>$R,"FillG"=>$G,"FillB"=>$B,"Alpha"=>$Alpha,"Size"=>$ArrowSize,"Ratio"=>$ArrowRatio); - if ( $ArrowTwoHeads ) - $this->drawArrow($ArrowS["X1"],$ArrowS["Y1"],$ArrowS["X2"],$ArrowS["Y2"],$ArrowSettings); - - $this->drawArrow($ArrowE["X1"],$ArrowE["Y1"],$ArrowE["X2"],$ArrowE["Y2"],$ArrowSettings); - } - } - return($Q); - } - - /* Draw a line between two points */ - function drawLine($X1,$Y1,$X2,$Y2,$Format="") - { - $R = isset($Format["R"]) ? $Format["R"] : 0; - $G = isset($Format["G"]) ? $Format["G"] : 0; - $B = isset($Format["B"]) ? $Format["B"] : 0; - $Alpha = isset($Format["Alpha"]) ? $Format["Alpha"] : 100; - $Ticks = isset($Format["Ticks"]) ? $Format["Ticks"] : NULL; - $Cpt = isset($Format["Cpt"]) ? $Format["Cpt"] : 1; - $Mode = isset($Format["Mode"]) ? $Format["Mode"] : 1; - $Weight = isset($Format["Weight"]) ? $Format["Weight"] : NULL; - $Threshold = isset($Format["Threshold"]) ? $Format["Threshold"] : NULL; - - if ( $this->Antialias == FALSE && $Ticks == NULL ) - { - if ( $this->Shadow && $this->ShadowX != 0 && $this->ShadowY != 0 ) - { - $ShadowColor = $this->allocateColor($this->Picture,$this->ShadowR,$this->ShadowG,$this->ShadowB,$this->Shadowa); - imageline($this->Picture,$X1+$this->ShadowX,$Y1+$this->ShadowY,$X2+$this->ShadowX,$Y2+$this->ShadowY,$ShadowColor); - } - - $Color = $this->allocateColor($this->Picture,$R,$G,$B,$Alpha); - imageline($this->Picture,$X1,$Y1,$X2,$Y2,$Color); - return(0); - } - - $Distance = sqrt(($X2-$X1)*($X2-$X1)+($Y2-$Y1)*($Y2-$Y1)); - if ( $Distance == 0 ) { return(-1); } - - /* Derivative algorithm for overweighted lines, re-route to polygons primitives */ - if ( $Weight != NULL ) - { - $Angle = $this->getAngle($X1,$Y1,$X2,$Y2); - $PolySettings = array ("R"=>$R,"G"=>$G,"B"=>$B,"Alpha"=>$Alpha,"BorderAlpha"=>$Alpha); - - if ( $Ticks == NULL ) - { - $Points = ""; - $Points[] = cos(deg2rad($Angle-90)) * $Weight + $X1; $Points[] = sin(deg2rad($Angle-90)) * $Weight + $Y1; - $Points[] = cos(deg2rad($Angle+90)) * $Weight + $X1; $Points[] = sin(deg2rad($Angle+90)) * $Weight + $Y1; - $Points[] = cos(deg2rad($Angle+90)) * $Weight + $X2; $Points[] = sin(deg2rad($Angle+90)) * $Weight + $Y2; - $Points[] = cos(deg2rad($Angle-90)) * $Weight + $X2; $Points[] = sin(deg2rad($Angle-90)) * $Weight + $Y2; - - $this->drawPolygon($Points,$PolySettings); - } - else - { - for($i=0;$i<=$Distance;$i=$i+$Ticks*2) - { - $Xa = (($X2-$X1)/$Distance) * $i + $X1; $Ya = (($Y2-$Y1)/$Distance) * $i + $Y1; - $Xb = (($X2-$X1)/$Distance) * ($i+$Ticks) + $X1; $Yb = (($Y2-$Y1)/$Distance) * ($i+$Ticks) + $Y1; - - $Points = ""; - $Points[] = cos(deg2rad($Angle-90)) * $Weight + $Xa; $Points[] = sin(deg2rad($Angle-90)) * $Weight + $Ya; - $Points[] = cos(deg2rad($Angle+90)) * $Weight + $Xa; $Points[] = sin(deg2rad($Angle+90)) * $Weight + $Ya; - $Points[] = cos(deg2rad($Angle+90)) * $Weight + $Xb; $Points[] = sin(deg2rad($Angle+90)) * $Weight + $Yb; - $Points[] = cos(deg2rad($Angle-90)) * $Weight + $Xb; $Points[] = sin(deg2rad($Angle-90)) * $Weight + $Yb; - - $this->drawPolygon($Points,$PolySettings); - } - } - - return(1); - } - - $XStep = ($X2-$X1) / $Distance; - $YStep = ($Y2-$Y1) / $Distance; - - for($i=0;$i<=$Distance;$i++) - { - $X = $i * $XStep + $X1; - $Y = $i * $YStep + $Y1; - - $Color = array("R"=>$R,"G"=>$G,"B"=>$B,"Alpha"=>$Alpha); - - if ( $Threshold != NULL ) - { - foreach($Threshold as $Key => $Parameters) - { - if ( $Y <= $Parameters["MinX"] && $Y >= $Parameters["MaxX"]) - { - if ( isset($Parameters["R"]) ) { $RT = $Parameters["R"]; } else { $RT = 0; } - if ( isset($Parameters["G"]) ) { $GT = $Parameters["G"]; } else { $GT = 0; } - if ( isset($Parameters["B"]) ) { $BT = $Parameters["B"]; } else { $BT = 0; } - if ( isset($Parameters["Alpha"]) ) { $AlphaT = $Parameters["Alpha"]; } else { $AlphaT = 0; } - $Color = array("R"=>$RT,"G"=>$GT,"B"=>$BT,"Alpha"=>$AlphaT); - } - } - } - - if ( $Ticks != NULL ) - { - if ( $Cpt % $Ticks == 0 ) - { $Cpt = 0; if ( $Mode == 1 ) { $Mode = 0; } else { $Mode = 1; } } - - if ( $Mode == 1 ) - $this->drawAntialiasPixel($X,$Y,$Color); - - $Cpt++; - } - else - $this->drawAntialiasPixel($X,$Y,$Color); - } - - return(array($Cpt,$Mode)); - } - - /* Draw a circle */ - function drawCircle($Xc,$Yc,$Height,$Width,$Format="") - { - $R = isset($Format["R"]) ? $Format["R"] : 0; - $G = isset($Format["G"]) ? $Format["G"] : 0; - $B = isset($Format["B"]) ? $Format["B"] : 0; - $Alpha = isset($Format["Alpha"]) ? $Format["Alpha"] : 100; - $Ticks = isset($Format["Ticks"]) ? $Format["Ticks"] : NULL; - - $Height = abs($Height); - $Width = abs($Width); - - if ( $Height == 0 ) { $Height = 1; } - if ( $Width == 0 ) { $Width = 1; } - $Xc = floor($Xc); $Yc = floor($Yc); - - $RestoreShadow = $this->Shadow; - if ( $this->Shadow && $this->ShadowX != 0 && $this->ShadowY != 0 ) - { - $this->Shadow = FALSE; - $this->drawCircle($Xc+$this->ShadowX,$Yc+$this->ShadowY,$Height,$Width,array("R"=>$this->ShadowR,"G"=>$this->ShadowG,"B"=>$this->ShadowB,"Alpha"=>$this->Shadowa,"Ticks"=>$Ticks)); - } - - if ( $Width == 0 ) { $Width = $Height; } - if ( $R < 0 ) { $R = 0; } if ( $R > 255 ) { $R = 255; } - if ( $G < 0 ) { $G = 0; } if ( $G > 255 ) { $G = 255; } - if ( $B < 0 ) { $B = 0; } if ( $B > 255 ) { $B = 255; } - - $Step = 360 / (2 * PI * max($Width,$Height)); - $Mode = 1; $Cpt = 1; - for($i=0;$i<=360;$i=$i+$Step) - { - $X = cos($i*PI/180) * $Height + $Xc; - $Y = sin($i*PI/180) * $Width + $Yc; - - if ( $Ticks != NULL ) - { - if ( $Cpt % $Ticks == 0 ) - { $Cpt = 0; if ( $Mode == 1 ) { $Mode = 0; } else { $Mode = 1; } } - - if ( $Mode == 1 ) - $this->drawAntialiasPixel($X,$Y,array("R"=>$R,"G"=>$G,"B"=>$B,"Alpha"=>$Alpha)); - - $Cpt++; - } - else - $this->drawAntialiasPixel($X,$Y,array("R"=>$R,"G"=>$G,"B"=>$B,"Alpha"=>$Alpha)); - - } - $this->Shadow = $RestoreShadow; - } - - /* Draw a filled circle */ - function drawFilledCircle($X,$Y,$Radius,$Format="") - { - $R = isset($Format["R"]) ? $Format["R"] : 0; - $G = isset($Format["G"]) ? $Format["G"] : 0; - $B = isset($Format["B"]) ? $Format["B"] : 0; - $Alpha = isset($Format["Alpha"]) ? $Format["Alpha"] : 100; - $BorderR = isset($Format["BorderR"]) ? $Format["BorderR"] : -1; - $BorderG = isset($Format["BorderG"]) ? $Format["BorderG"] : -1; - $BorderB = isset($Format["BorderB"]) ? $Format["BorderB"] : -1; - $BorderAlpha = isset($Format["BorderAlpha"]) ? $Format["BorderAlpha"] : $Alpha; - $Ticks = isset($Format["Ticks"]) ? $Format["Ticks"] : NULL; - $Surrounding = isset($Format["Surrounding"]) ? $Format["Surrounding"] : NULL; - - if ( $Radius == 0 ) { $Radius = 1; } - if ( $Surrounding != NULL ) { $BorderR = $R+$Surrounding; $BorderG = $G+$Surrounding; $BorderB = $B+$Surrounding; } - $X = floor($X); $Y = floor($Y); - - $Radius = abs($Radius); - - $RestoreShadow = $this->Shadow; - if ( $this->Shadow && $this->ShadowX != 0 && $this->ShadowY != 0 ) - { - $this->Shadow = FALSE; - $this->drawFilledCircle($X+$this->ShadowX,$Y+$this->ShadowY,$Radius,array("R"=>$this->ShadowR,"G"=>$this->ShadowG,"B"=>$this->ShadowB,"Alpha"=>$this->Shadowa,"Ticks"=>$Ticks)); - } - - $this->Mask = ""; - $Color = $this->allocateColor($this->Picture,$R,$G,$B,$Alpha); - for ($i=0; $i<=$Radius*2; $i++) - { - $Slice = sqrt($Radius * $Radius - ($Radius - $i) * ($Radius - $i)); - $XPos = floor($Slice); - $YPos = $Y + $i - $Radius; - $AAlias = $Slice - floor($Slice); - - $this->Mask[$X-$XPos][$YPos] = TRUE; - $this->Mask[$X+$XPos][$YPos] = TRUE; - imageline($this->Picture,$X-$XPos,$YPos,$X+$XPos,$YPos,$Color); - } - if ( $this->Antialias ) - $this->drawCircle($X,$Y,$Radius,$Radius,array("R"=>$R,"G"=>$G,"B"=>$B,"Alpha"=>$Alpha,"Ticks"=>$Ticks)); - - $this->Mask = ""; - - if ( $BorderR != -1 ) - $this->drawCircle($X,$Y,$Radius,$Radius,array("R"=>$BorderR,"G"=>$BorderG,"B"=>$BorderB,"Alpha"=>$BorderAlpha,"Ticks"=>$Ticks)); - - $this->Shadow = $RestoreShadow; - } - - /* Write text */ - function drawText($X,$Y,$Text,$Format="") - { - $R = isset($Format["R"]) ? $Format["R"] : $this->FontColorR; - $G = isset($Format["G"]) ? $Format["G"] : $this->FontColorG; - $B = isset($Format["B"]) ? $Format["B"] : $this->FontColorB; - $Angle = isset($Format["Angle"]) ? $Format["Angle"] : 0; - $Align = isset($Format["Align"]) ? $Format["Align"] : TEXT_ALIGN_BOTTOMLEFT; - $Alpha = isset($Format["Alpha"]) ? $Format["Alpha"] : $this->FontColorA; - $FontName = isset($Format["FontName"]) ? $Format["FontName"] : $this->FontName; - $FontSize = isset($Format["FontSize"]) ? $Format["FontSize"] : $this->FontSize; - $ShowOrigine = isset($Format["ShowOrigine"]) ? $Format["ShowOrigine"] : FALSE; - $TOffset = isset($Format["TOffset"]) ? $Format["TOffset"] : 2; - $DrawBox = isset($Format["DrawBox"]) ? $Format["DrawBox"] : FALSE; - $DrawBoxBorder = isset($Format["DrawBoxBorder"]) ? $Format["DrawBoxBorder"] : TRUE; - $BorderOffset = isset($Format["BorderOffset"]) ? $Format["BorderOffset"] : 6; - $BoxRounded = isset($Format["BoxRounded"]) ? $Format["BoxRounded"] : FALSE; - $RoundedRadius = isset($Format["RoundedRadius"]) ? $Format["RoundedRadius"] : 6; - $BoxR = isset($Format["BoxR"]) ? $Format["BoxR"] : 255; - $BoxG = isset($Format["BoxG"]) ? $Format["BoxG"] : 255; - $BoxB = isset($Format["BoxB"]) ? $Format["BoxB"] : 255; - $BoxAlpha = isset($Format["BoxAlpha"]) ? $Format["BoxAlpha"] : 50; - $BoxSurrounding = isset($Format["BoxSurrounding"]) ? $Format["BoxSurrounding"] : ""; - $BoxBorderR = isset($Format["BoxR"]) ? $Format["BoxR"] : 0; - $BoxBorderG = isset($Format["BoxG"]) ? $Format["BoxG"] : 0; - $BoxBorderB = isset($Format["BoxB"]) ? $Format["BoxB"] : 0; - $BoxBorderAlpha = isset($Format["BoxAlpha"]) ? $Format["BoxAlpha"] : 50; - $NoShadow = isset($Format["NoShadow"]) ? $Format["NoShadow"] : FALSE; - - $Shadow = $this->Shadow; - if ( $NoShadow ) { $this->Shadow = FALSE; } - - if ( $BoxSurrounding != "" ) { $BoxBorderR = $BoxR - $BoxSurrounding; $BoxBorderG = $BoxG - $BoxSurrounding; $BoxBorderB = $BoxB - $BoxSurrounding; $BoxBorderAlpha = $BoxAlpha; } - - if ( $ShowOrigine ) - { - $MyMarkerSettings = array("R"=>255,"G"=>0,"B"=>0,"BorderR"=>255,"BorderB"=>255,"BorderG"=>255,"Size"=>4); - $this->drawRectangleMarker($X,$Y,$MyMarkerSettings); - } - - $TxtPos = $this->getTextBox($X,$Y,$FontName,$FontSize,$Angle,$Text); - - if ( $DrawBox && ($Angle == 0 || $Angle == 90 || $Angle == 180 || $Angle == 270)) - { - $T[0]["X"]=0;$T[0]["Y"]=0;$T[1]["X"]=0;$T[1]["Y"]=0;$T[2]["X"]=0;$T[2]["Y"]=0;$T[3]["X"]=0;$T[3]["Y"]=0; - if ( $Angle == 0 ) { $T[0]["X"]=-$TOffset;$T[0]["Y"]=$TOffset;$T[1]["X"]=$TOffset;$T[1]["Y"]=$TOffset;$T[2]["X"]=$TOffset;$T[2]["Y"]=-$TOffset;$T[3]["X"]=-$TOffset;$T[3]["Y"]=-$TOffset; } - - $X1 = min($TxtPos[0]["X"],$TxtPos[1]["X"],$TxtPos[2]["X"],$TxtPos[3]["X"]) - $BorderOffset + 3; - $Y1 = min($TxtPos[0]["Y"],$TxtPos[1]["Y"],$TxtPos[2]["Y"],$TxtPos[3]["Y"]) - $BorderOffset; - $X2 = max($TxtPos[0]["X"],$TxtPos[1]["X"],$TxtPos[2]["X"],$TxtPos[3]["X"]) + $BorderOffset + 3; - $Y2 = max($TxtPos[0]["Y"],$TxtPos[1]["Y"],$TxtPos[2]["Y"],$TxtPos[3]["Y"]) + $BorderOffset - 3; - - $X1 = $X1 - $TxtPos[$Align]["X"] + $X + $T[0]["X"]; - $Y1 = $Y1 - $TxtPos[$Align]["Y"] + $Y + $T[0]["Y"]; - $X2 = $X2 - $TxtPos[$Align]["X"] + $X + $T[0]["X"]; - $Y2 = $Y2 - $TxtPos[$Align]["Y"] + $Y + $T[0]["Y"]; - - $Settings = array("R"=>$BoxR,"G"=>$BoxG,"B"=>$BoxB,"Alpha"=>$BoxAlpha,"BorderR"=>$BoxBorderR,"BorderG"=>$BoxBorderG,"BorderB"=>$BoxBorderB,"BorderAlpha"=>$BoxBorderAlpha); - - if ( $BoxRounded ) - { $this->drawRoundedFilledRectangle($X1,$Y1,$X2,$Y2,$RoundedRadius,$Settings); } - else - { $this->drawFilledRectangle($X1,$Y1,$X2,$Y2,$Settings); } - } - - $X = $X - $TxtPos[$Align]["X"] + $X; - $Y = $Y - $TxtPos[$Align]["Y"] + $Y; - - if ( $this->Shadow && $this->ShadowX != 0 && $this->ShadowY != 0 ) - { - $C_ShadowColor = $this->allocateColor($this->Picture,$this->ShadowR,$this->ShadowG,$this->ShadowB,$this->Shadowa); - imagettftext($this->Picture,$FontSize,$Angle,$X+$this->ShadowX,$Y+$this->ShadowY,$C_ShadowColor,$FontName,$this->getEncodedText($Text)); - } - - $C_TextColor = $this->AllocateColor($this->Picture,$R,$G,$B,$Alpha); - imagettftext($this->Picture,$FontSize,$Angle,$X,$Y,$C_TextColor,$FontName,$this->getEncodedText($Text)); - - $this->Shadow = $Shadow; - - return($TxtPos); - } - - function getEncodedText($text) - { - $gdinfo = gd_info(); - if (!empty($gdinfo['JIS-mapped Japanese Font Support'])) { - return mb_convert_encoding($text, "SJIS", "UTF-8"); - } - - return $text; - } - - /* Draw a gradient within a defined area */ - function drawGradientArea($X1,$Y1,$X2,$Y2,$Direction,$Format="") - { - $StartR = isset($Format["StartR"]) ? $Format["StartR"] : 90; - $StartG = isset($Format["StartG"]) ? $Format["StartG"] : 90; - $StartB = isset($Format["StartB"]) ? $Format["StartB"] : 90; - $EndR = isset($Format["EndR"]) ? $Format["EndR"] : 0; - $EndG = isset($Format["EndG"]) ? $Format["EndG"] : 0; - $EndB = isset($Format["EndB"]) ? $Format["EndB"] : 0; - $Alpha = isset($Format["Alpha"]) ? $Format["Alpha"] : 100; - $Levels = isset($Format["Levels"]) ? $Format["Levels"] : NULL; - - $Shadow = $this->Shadow; - $this->Shadow = FALSE; - - if ( $StartR == $EndR && $StartG == $EndG && $StartB == $EndB ) - { - $this->drawFilledRectangle($X1,$Y1,$X2,$Y2,array("R"=>$StartR,"G"=>$StartG,"B"=>$StartB,"Alpha"=>$Alpha)); - return(0); - } - - if ( $Levels != NULL ) - { $EndR=$StartR+$Levels; $EndG=$StartG+$Levels; $EndB=$StartB+$Levels; } - - if ($X1 > $X2) { list($X1, $X2) = array($X2, $X1); } - if ($Y1 > $Y2) { list($Y1, $Y2) = array($Y2, $Y1); } - - if ( $Direction == DIRECTION_VERTICAL ) { $Width = abs($Y2-$Y1); } - if ( $Direction == DIRECTION_HORIZONTAL ) { $Width = abs($X2-$X1); } - - $Step = max(abs($EndR-$StartR),abs($EndG-$StartG),abs($EndB-$StartB)); - $StepSize = $Width/$Step; - $RStep = ($EndR-$StartR)/$Step; - $GStep = ($EndG-$StartG)/$Step; - $BStep = ($EndB-$StartB)/$Step; - - $R=$StartR;$G=$StartG;$B=$StartB; - switch($Direction) - { - case DIRECTION_VERTICAL: - $StartY = $Y1; $EndY = floor($Y2)+1; $LastY2 = $StartY; - for($i=0;$i<=$Step;$i++) - { - $Y2 = floor($StartY + ($i * $StepSize)); - - if ($Y2 > $EndY) { $Y2 = $EndY; } - if (($Y1 != $Y2 && $Y1 < $Y2) || $Y2 == $EndY) - { - $Color = array("R"=>$R,"G"=>$G,"B"=>$B,"Alpha"=>$Alpha); - $this->drawFilledRectangle($X1,$Y1,$X2,$Y2,$Color); - $LastY2 = max($LastY2,$Y2); - $Y1 = $Y2+1; - } - $R = $R + $RStep; $G = $G + $GStep; $B = $B + $BStep; - } - if ( $LastY2 < $EndY && isset($Color)) { for ($i=$LastY2+1;$i<=$EndY;$i++) { $this->drawLine($X1,$i,$X2,$i,$Color); } } - break; - - case DIRECTION_HORIZONTAL: - $StartX = $X1; $EndX = $X2; - for($i=0;$i<=$Step;$i++) - { - $X2 = floor($StartX + ($i * $StepSize)); - - if ($X2 > $EndX) { $X2 = $EndX; } - if (($X1 != $X2 && $X1 < $X2) || $X2 == $EndX) - { - $Color = array("R"=>$R,"G"=>$G,"B"=>$B,"Alpha"=>$Alpha); - $this->drawFilledRectangle($X1,$Y1,$X2,$Y2,$Color); - $X1 = $X2+1; - } - $R = $R + $RStep; $G = $G + $GStep; $B = $B + $BStep; - } - if ( $X2 < $EndX && isset($Color)) { $this->drawFilledRectangle($X2,$Y1,$EndX,$Y2,$Color); } - break; - } - - $this->Shadow = $Shadow; - - } - - /* Draw an aliased pixel */ - function drawAntialiasPixel($X,$Y,$Format="") - { - $R = isset($Format["R"]) ? $Format["R"] : 0; - $G = isset($Format["G"]) ? $Format["G"] : 0; - $B = isset($Format["B"]) ? $Format["B"] : 0; - $Alpha = isset($Format["Alpha"]) ? $Format["Alpha"] : 100; - - if ( $X < 0 || $Y < 0 || $X >= $this->XSize || $Y >= $this->YSize ) - return(-1); - - if ( $R < 0 ) { $R = 0; } if ( $R > 255 ) { $R = 255; } - if ( $G < 0 ) { $G = 0; } if ( $G > 255 ) { $G = 255; } - if ( $B < 0 ) { $B = 0; } if ( $B > 255 ) { $B = 255; } - - if ( !$this->Antialias ) - { - if ( $this->Shadow && $this->ShadowX != 0 && $this->ShadowY != 0 ) - { - $ShadowColor = $this->allocateColor($this->Picture,$this->ShadowR,$this->ShadowG,$this->ShadowB,$this->Shadowa); - imagesetpixel($this->Picture,$X+$this->ShadowX,$Y+$this->ShadowY,$ShadowColor); - } - - $PlotColor = $this->allocateColor($this->Picture,$R,$G,$B,$Alpha); - imagesetpixel($this->Picture,$X,$Y,$PlotColor); - - return(0); - } - - $Plot = ""; - $Xi = floor($X); - $Yi = floor($Y); - - if ( $Xi == $X && $Yi == $Y) - { - if ( $Alpha == 100 ) - $this->drawAlphaPixel($X,$Y,100,$R,$G,$B); - else - $this->drawAlphaPixel($X,$Y,$Alpha,$R,$G,$B); - } - else - { - $Alpha1 = (((1 - ($X - floor($X))) * (1 - ($Y - floor($Y))) * 100) / 100) * $Alpha; - if ( $Alpha1 > $this->AntialiasQuality ) { $this->drawAlphaPixel($Xi,$Yi,$Alpha1,$R,$G,$B); } - - $Alpha2 = ((($X - floor($X)) * (1 - ($Y - floor($Y))) * 100) / 100) * $Alpha; - if ( $Alpha2 > $this->AntialiasQuality ) { $this->drawAlphaPixel($Xi+1,$Yi,$Alpha2,$R,$G,$B); } - - $Alpha3 = (((1 - ($X - floor($X))) * ($Y - floor($Y)) * 100) / 100) * $Alpha; - if ( $Alpha3 > $this->AntialiasQuality ) { $this->drawAlphaPixel($Xi,$Yi+1,$Alpha3,$R,$G,$B); } - - $Alpha4 = ((($X - floor($X)) * ($Y - floor($Y)) * 100) / 100) * $Alpha; - if ( $Alpha4 > $this->AntialiasQuality ) { $this->drawAlphaPixel($Xi+1,$Yi+1,$Alpha4,$R,$G,$B); } - } - } - - /* Draw a semi-transparent pixel */ - function drawAlphaPixel($X,$Y,$Alpha,$R,$G,$B) - { - if ( isset($this->Mask[$X])) { if ( isset($this->Mask[$X][$Y]) ) { return(0); } } - - if ( $X < 0 || $Y < 0 || $X >= $this->XSize || $Y >= $this->YSize ) - return(-1); - - if ( $R < 0 ) { $R = 0; } if ( $R > 255 ) { $R = 255; } - if ( $G < 0 ) { $G = 0; } if ( $G > 255 ) { $G = 255; } - if ( $B < 0 ) { $B = 0; } if ( $B > 255 ) { $B = 255; } - - if ( $this->Shadow && $this->ShadowX != 0 && $this->ShadowY != 0 ) - { - $AlphaFactor = floor(($Alpha / 100) * $this->Shadowa); - $ShadowColor = $this->allocateColor($this->Picture,$this->ShadowR,$this->ShadowG,$this->ShadowB,$AlphaFactor); - imagesetpixel($this->Picture,$X+$this->ShadowX,$Y+$this->ShadowY,$ShadowColor); - } - - $C_Aliased = $this->allocateColor($this->Picture,$R,$G,$B,$Alpha); - imagesetpixel($this->Picture,$X,$Y,$C_Aliased); - } - - /* Convert apha to base 10 */ - function convertAlpha($AlphaValue) - { return((127/100)*(100-$AlphaValue)); } - - /* Allocate a color with transparency */ - function allocateColor($Picture,$R,$G,$B,$Alpha=100) - { - if ( $R < 0 ) { $R = 0; } if ( $R > 255 ) { $R = 255; } - if ( $G < 0 ) { $G = 0; } if ( $G > 255 ) { $G = 255; } - if ( $B < 0 ) { $B = 0; } if ( $B > 255 ) { $B = 255; } - if ( $Alpha < 0 ) { $Alpha = 0; } - if ( $Alpha > 100) { $Alpha = 100; } - - $Alpha = $this->convertAlpha($Alpha); - return(imagecolorallocatealpha($Picture,$R,$G,$B,$Alpha)); - } - - /* Load a PNG file and draw it over the chart */ - function drawFromPNG($X,$Y,$FileName) - { $this->drawFromPicture(1,$FileName,$X,$Y); } - - /* Load a GIF file and draw it over the chart */ - function drawFromGIF($X,$Y,$FileName) - { $this->drawFromPicture(2,$FileName,$X,$Y); } - - /* Load a JPEG file and draw it over the chart */ - function drawFromJPG($X,$Y,$FileName) - { $this->drawFromPicture(3,$FileName,$X,$Y); } - - function getPicInfo($FileName) - { - $Infos = getimagesize($FileName); - $Width = $Infos[0]; - $Height = $Infos[1]; - $Type = $Infos["mime"]; - - if ( $Type == "image/png") { $Type = 1; } - if ( $Type == "image/gif") { $Type = 2; } - if ( $Type == "image/jpeg ") { $Type = 3; } - - return(array($Width,$Height,$Type)); - } - - /* Generic loader function for external pictures */ - function drawFromPicture($PicType,$FileName,$X,$Y) - { - if ( file_exists($FileName)) - { - list($Width,$Height) = $this->getPicInfo($FileName); - - if ( $PicType == 1 ) - { $Raster = imagecreatefrompng($FileName); } - elseif ( $PicType == 2 ) - { $Raster = imagecreatefromgif($FileName); } - elseif ( $PicType == 3 ) - { $Raster = imagecreatefromjpeg($FileName); } - else - { return(0); } - - - $RestoreShadow = $this->Shadow; - if ( $this->Shadow && $this->ShadowX != 0 && $this->ShadowY != 0 ) - { - $this->Shadow = FALSE; - if ( $PicType == 3 ) - $this->drawFilledRectangle($X+$this->ShadowX,$Y+$this->ShadowY,$X+$Width+$this->ShadowX,$Y+$Height+$this->ShadowY,array("R"=>$this->ShadowR,"G"=>$this->ShadowG,"B"=>$this->ShadowB,"Alpha"=>$this->Shadowa)); - else - { - $TranparentID = imagecolortransparent($Raster); - for ($Xc=0;$Xc<=$Width-1;$Xc++) - { - for ($Yc=0;$Yc<=$Height-1;$Yc++) - { - $RGBa = imagecolorat($Raster,$Xc,$Yc); - $Values = imagecolorsforindex($Raster,$RGBa); - if ( $Values["alpha"] < 120 ) - { - $AlphaFactor = floor(($this->Shadowa / 100) * ((100 / 127) * (127-$Values["alpha"]))); - $this->drawAlphaPixel($X+$Xc+$this->ShadowX,$Y+$Yc+$this->ShadowY,$AlphaFactor,$this->ShadowR,$this->ShadowG,$this->ShadowB); - } - } - } - } - } - $this->Shadow = $RestoreShadow; - - imagecopy($this->Picture,$Raster,$X,$Y,0,0,$Width,$Height); - imagedestroy($Raster); - } - } - - /* Draw an arrow */ - function drawArrow($X1,$Y1,$X2,$Y2,$Format="") - { - $FillR = isset($Format["FillR"]) ? $Format["FillR"] : 0; - $FillG = isset($Format["FillG"]) ? $Format["FillG"] : 0; - $FillB = isset($Format["FillB"]) ? $Format["FillB"] : 0; - $BorderR = isset($Format["BorderR"]) ? $Format["BorderR"] : $FillR; - $BorderG = isset($Format["BorderG"]) ? $Format["BorderG"] : $FillG; - $BorderB = isset($Format["BorderB"]) ? $Format["BorderB"] : $FillB; - $Alpha = isset($Format["Alpha"]) ? $Format["Alpha"] : 100; - $Size = isset($Format["Size"]) ? $Format["Size"] : 10; - $Ratio = isset($Format["Ratio"]) ? $Format["Ratio"] : .5; - $TwoHeads = isset($Format["TwoHeads"]) ? $Format["TwoHeads"] : FALSE; - $Ticks = isset($Format["Ticks"]) ? $Format["Ticks"] : FALSE; - - /* Calculate the line angle */ - $Angle = $this->getAngle($X1,$Y1,$X2,$Y2); - - /* Override Shadow support, this will be managed internally */ - $RestoreShadow = $this->Shadow; - if ( $this->Shadow && $this->ShadowX != 0 && $this->ShadowY != 0 ) - { - $this->Shadow = FALSE; - $this->drawArrow($X1+$this->ShadowX,$Y1+$this->ShadowY,$X2+$this->ShadowX,$Y2+$this->ShadowY,array("FillR"=>$this->ShadowR,"FillG"=>$this->ShadowG,"FillB"=>$this->ShadowB,"Alpha"=>$this->Shadowa,"Size"=>$Size,"Ratio"=>$Ratio,"TwoHeads"=>$TwoHeads,"Ticks"=>$Ticks)); - } - - /* Draw the 1st Head */ - $TailX = cos(($Angle-180)*PI/180)*$Size+$X2; - $TailY = sin(($Angle-180)*PI/180)*$Size+$Y2; - - $Points = ""; - $Points[] = $X2; $Points[] = $Y2; - $Points[] = cos(($Angle-90)*PI/180)*$Size*$Ratio+$TailX; $Points[] = sin(($Angle-90)*PI/180)*$Size*$Ratio+$TailY; - $Points[] = cos(($Angle-270)*PI/180)*$Size*$Ratio+$TailX; $Points[] = sin(($Angle-270)*PI/180)*$Size*$Ratio+$TailY; - $Points[] = $X2; $Points[] = $Y2; - - /* Visual correction */ - if ($Angle == 180 || $Angle == 360 ) { $Points[4] = $Points[2]; } - if ($Angle == 90 || $Angle == 270 ) { $Points[5] = $Points[3]; } - - $ArrowColor = $this->allocateColor($this->Picture,$FillR,$FillG,$FillB,$Alpha); - ImageFilledPolygon($this->Picture,$Points,4,$ArrowColor); - - $this->drawLine($Points[0],$Points[1],$Points[2],$Points[3],array("R"=>$BorderR,"G"=>$BorderG,"B"=>$BorderB,"Alpha"=>$Alpha)); - $this->drawLine($Points[2],$Points[3],$Points[4],$Points[5],array("R"=>$BorderR,"G"=>$BorderG,"B"=>$BorderB,"Alpha"=>$Alpha)); - $this->drawLine($Points[0],$Points[1],$Points[4],$Points[5],array("R"=>$BorderR,"G"=>$BorderG,"B"=>$BorderB,"Alpha"=>$Alpha)); - - /* Draw the second head */ - if ( $TwoHeads ) - { - $Angle = $this->getAngle($X2,$Y2,$X1,$Y1); - - $TailX2 = cos(($Angle-180)*PI/180)*$Size+$X1; - $TailY2 = sin(($Angle-180)*PI/180)*$Size+$Y1; - - $Points = ""; - $Points[] = $X1; $Points[] = $Y1; - $Points[] = cos(($Angle-90)*PI/180)*$Size*$Ratio+$TailX2; $Points[] = sin(($Angle-90)*PI/180)*$Size*$Ratio+$TailY2; - $Points[] = cos(($Angle-270)*PI/180)*$Size*$Ratio+$TailX2; $Points[] = sin(($Angle-270)*PI/180)*$Size*$Ratio+$TailY2; - $Points[] = $X1; $Points[] = $Y1; - - /* Visual correction */ - if ($Angle == 180 || $Angle == 360 ) { $Points[4] = $Points[2]; } - if ($Angle == 90 || $Angle == 270 ) { $Points[5] = $Points[3]; } - - $ArrowColor = $this->allocateColor($this->Picture,$FillR,$FillG,$FillB,$Alpha); - ImageFilledPolygon($this->Picture,$Points,4,$ArrowColor); - - $this->drawLine($Points[0],$Points[1],$Points[2],$Points[3],array("R"=>$BorderR,"G"=>$BorderG,"B"=>$BorderB,"Alpha"=>$Alpha)); - $this->drawLine($Points[2],$Points[3],$Points[4],$Points[5],array("R"=>$BorderR,"G"=>$BorderG,"B"=>$BorderB,"Alpha"=>$Alpha)); - $this->drawLine($Points[0],$Points[1],$Points[4],$Points[5],array("R"=>$BorderR,"G"=>$BorderG,"B"=>$BorderB,"Alpha"=>$Alpha)); - - $this->drawLine($TailX,$TailY,$TailX2,$TailY2,array("R"=>$BorderR,"G"=>$BorderG,"B"=>$BorderB,"Alpha"=>$Alpha,"Ticks"=>$Ticks)); - } - else - $this->drawLine($X1,$Y1,$TailX,$TailY,array("R"=>$BorderR,"G"=>$BorderG,"B"=>$BorderB,"Alpha"=>$Alpha,"Ticks"=>$Ticks)); - - /* Re-enable shadows */ - $this->Shadow = $RestoreShadow; - } - - /* Draw a label with associated arrow */ - function drawArrowLabel($X1,$Y1,$Text,$Format="") - { - $FillR = isset($Format["FillR"]) ? $Format["FillR"] : 0; - $FillG = isset($Format["FillG"]) ? $Format["FillG"] : 0; - $FillB = isset($Format["FillB"]) ? $Format["FillB"] : 0; - $BorderR = isset($Format["BorderR"]) ? $Format["BorderR"] : $FillR; - $BorderG = isset($Format["BorderG"]) ? $Format["BorderG"] : $FillG; - $BorderB = isset($Format["BorderB"]) ? $Format["BorderB"] : $FillB; - $FontName = isset($Format["FontName"]) ? $Format["FontName"] : $this->FontName; - $FontSize = isset($Format["FontSize"]) ? $Format["FontSize"] : $this->FontSize; - $Alpha = isset($Format["Alpha"]) ? $Format["Alpha"] : 100; - $Length = isset($Format["Length"]) ? $Format["Length"] : 50; - $Angle = isset($Format["Angle"]) ? $Format["Angle"] : 315; - $Size = isset($Format["Size"]) ? $Format["Size"] : 10; - $Position = isset($Format["Position"]) ? $Format["Position"] : POSITION_TOP; - $RoundPos = isset($Format["RoundPos"]) ? $Format["RoundPos"] : FALSE; - $Ticks = isset($Format["Ticks"]) ? $Format["Ticks"] : NULL; - - $Angle = $Angle % 360; - - $X2 = sin(($Angle+180)*PI/180)*$Length+$X1; - $Y2 = cos(($Angle+180)*PI/180)*$Length+$Y1; - - if ( $RoundPos && $Angle > 0 && $Angle < 180 ) { $Y2 = ceil($Y2); } - if ( $RoundPos && $Angle > 180 ) { $Y2 = floor($Y2); } - - $this->drawArrow($X2,$Y2,$X1,$Y1,$Format); - - $Size = imagettfbbox($FontSize,0,$FontName,$this->getEncodedText($Text)); - $TxtWidth = max(abs($Size[2]-$Size[0]),abs($Size[0]-$Size[6])); - $TxtHeight = max(abs($Size[1]-$Size[7]),abs($Size[3]-$Size[1])); - - if ( $Angle > 0 && $Angle < 180 ) - { - $this->drawLine($X2,$Y2,$X2-$TxtWidth,$Y2,array("R"=>$BorderR,"G"=>$BorderG,"B"=>$BorderB,"Alpha"=>$Alpha,"Ticks"=>$Ticks)); - if ( $Position == POSITION_TOP ) - $this->drawText($X2,$Y2-2,$Text,array("R"=>$BorderR,"G"=>$BorderG,"B"=>$BorderB,"Alpha"=>$Alpha,"Align"=>TEXT_ALIGN_BOTTOMRIGHT)); - else - $this->drawText($X2,$Y2+4,$Text,array("R"=>$BorderR,"G"=>$BorderG,"B"=>$BorderB,"Alpha"=>$Alpha,"Align"=>TEXT_ALIGN_TOPRIGHT)); - } - else - { - $this->drawLine($X2,$Y2,$X2+$TxtWidth,$Y2,array("R"=>$BorderR,"G"=>$BorderG,"B"=>$BorderB,"Alpha"=>$Alpha,"Ticks"=>$Ticks)); - if ( $Position == POSITION_TOP ) - $this->drawText($X2,$Y2-2,$Text,array("R"=>$BorderR,"G"=>$BorderG,"B"=>$BorderB,"Alpha"=>$Alpha)); - else - $this->drawText($X2,$Y2+4,$Text,array("R"=>$BorderR,"G"=>$BorderG,"B"=>$BorderB,"Alpha"=>$Alpha,"Align"=>TEXT_ALIGN_TOPLEFT)); - } - } - - /* Draw a progress bar filled with specified % */ - function drawProgress($X,$Y,$Percent,$Format="") - { - if ( $Percent > 100 ) { $Percent = 100; } - if ( $Percent < 0 ) { $Percent = 0; } - - $Width = isset($Format["Width"]) ? $Format["Width"] : 200; - $Height = isset($Format["Height"]) ? $Format["Height"] : 20; - $Orientation = isset($Format["Orientation"]) ? $Format["Orientation"] : ORIENTATION_HORIZONTAL; - $ShowLabel = isset($Format["ShowLabel"]) ? $Format["ShowLabel"] : FALSE; - $LabelPos = isset($Format["LabelPos"]) ? $Format["LabelPos"] : LABEL_POS_INSIDE; - $Margin = isset($Format["Margin"]) ? $Format["Margin"] : 10; - $R = isset($Format["R"]) ? $Format["R"] : 130; - $G = isset($Format["G"]) ? $Format["G"] : 130; - $B = isset($Format["B"]) ? $Format["B"] : 130; - $RFade = isset($Format["RFade"]) ? $Format["RFade"] : -1; - $GFade = isset($Format["GFade"]) ? $Format["GFade"] : -1; - $BFade = isset($Format["BFade"]) ? $Format["BFade"] : -1; - $BorderR = isset($Format["BorderR"]) ? $Format["BorderR"] : $R; - $BorderG = isset($Format["BorderG"]) ? $Format["BorderG"] : $G; - $BorderB = isset($Format["BorderB"]) ? $Format["BorderB"] : $B; - $BoxBorderR = isset($Format["BoxBorderR"]) ? $Format["BoxBorderR"] : 0; - $BoxBorderG = isset($Format["BoxBorderG"]) ? $Format["BoxBorderG"] : 0; - $BoxBorderB = isset($Format["BoxBorderB"]) ? $Format["BoxBorderB"] : 0; - $BoxBackR = isset($Format["BoxBackR"]) ? $Format["BoxBackR"] : 255; - $BoxBackG = isset($Format["BoxBackG"]) ? $Format["BoxBackG"] : 255; - $BoxBackB = isset($Format["BoxBackB"]) ? $Format["BoxBackB"] : 255; - $Alpha = isset($Format["Alpha"]) ? $Format["Alpha"] : 100; - $Surrounding = isset($Format["Surrounding"]) ? $Format["Surrounding"] : NULL; - $BoxSurrounding = isset($Format["BoxSurrounding"]) ? $Format["BoxSurrounding"] : NULL; - $NoAngle = isset($Format["NoAngle"]) ? $Format["NoAngle"] : FALSE; - - if ( $RFade != -1 && $GFade != -1 && $BFade != -1 ) - { - $RFade = (($RFade-$R)/100)*$Percent+$R; - $GFade = (($GFade-$G)/100)*$Percent+$G; - $BFade = (($BFade-$B)/100)*$Percent+$B; - } - - if ( $Surrounding != NULL ) { $BorderR = $R + $Surrounding; $BorderG = $G + $Surrounding; $BorderB = $B + $Surrounding; } - if ( $BoxSurrounding != NULL ) { $BoxBorderR = $BoxBackR + $Surrounding; $BoxBorderG = $BoxBackG + $Surrounding; $BoxBorderB = $BoxBackB + $Surrounding; } - - if ( $Orientation == ORIENTATION_VERTICAL ) - { - $InnerHeight = (($Height-2)/100)*$Percent; - $this->drawFilledRectangle($X,$Y,$X+$Width,$Y-$Height,array("R"=>$BoxBackR,"G"=>$BoxBackG,"B"=>$BoxBackB,"BorderR"=>$BoxBorderR,"BorderG"=>$BoxBorderG,"BorderB"=>$BoxBorderB,"NoAngle"=>$NoAngle)); - - $RestoreShadow = $this->Shadow; $this->Shadow = FALSE; - if ( $RFade != -1 && $GFade != -1 && $BFade != -1 ) - { - $GradientOptions = array("StartR"=>$RFade,"StartG"=>$GFade,"StartB"=>$BFade,"EndR"=>$R,"EndG"=>$G,"EndB"=>$B); - $this->drawGradientArea($X+1,$Y-1,$X+$Width-1,$Y-$InnerHeight,DIRECTION_VERTICAL,$GradientOptions); - - if ( $Surrounding ) - $this->drawRectangle($X+1,$Y-1,$X+$Width-1,$Y-$InnerHeight,array("R"=>255,"G"=>255,"B"=>255,"Alpha"=>$Surrounding)); - } - else - $this->drawFilledRectangle($X+1,$Y-1,$X+$Width-1,$Y-$InnerHeight,array("R"=>$R,"G"=>$G,"B"=>$B,"BorderR"=>$BorderR,"BorderG"=>$BorderG,"BorderB"=>$BorderB)); - - $this->Shadow = $RestoreShadow; - - if ( $ShowLabel && $LabelPos == LABEL_POS_BOTTOM ) { $this->drawText($X+($Width/2),$Y+$Margin,$Percent."%",array("Align"=>TEXT_ALIGN_TOPMIDDLE)); } - if ( $ShowLabel && $LabelPos == LABEL_POS_TOP ) { $this->drawText($X+($Width/2),$Y-$Height-$Margin,$Percent."%",array("Align"=>TEXT_ALIGN_BOTTOMMIDDLE)); } - if ( $ShowLabel && $LabelPos == LABEL_POS_INSIDE ) { $this->drawText($X+($Width/2),$Y-$InnerHeight-$Margin,$Percent."%",array("Align"=>TEXT_ALIGN_MIDDLELEFT,"Angle"=>90)); } - if ( $ShowLabel && $LabelPos == LABEL_POS_CENTER ) { $this->drawText($X+($Width/2),$Y-($Height/2),$Percent."%",array("Align"=>TEXT_ALIGN_MIDDLEMIDDLE,"Angle"=>90)); } - } - else - { - if ( $Percent == 100 ) - $InnerWidth = $Width-1; - else - $InnerWidth = (($Width-2)/100)*$Percent; - - $this->drawFilledRectangle($X,$Y,$X+$Width,$Y+$Height,array("R"=>$BoxBackR,"G"=>$BoxBackG,"B"=>$BoxBackB,"BorderR"=>$BoxBorderR,"BorderG"=>$BoxBorderG,"BorderB"=>$BoxBorderB,"NoAngle"=>$NoAngle)); - - $RestoreShadow = $this->Shadow; $this->Shadow = FALSE; - if ( $RFade != -1 && $GFade != -1 && $BFade != -1 ) - { - $GradientOptions = array("StartR"=>$R,"StartG"=>$G,"StartB"=>$B,"EndR"=>$RFade,"EndG"=>$GFade,"EndB"=>$BFade); - $this->drawGradientArea($X+1,$Y+1,$X+$InnerWidth,$Y+$Height-1,DIRECTION_HORIZONTAL,$GradientOptions); - - if ( $Surrounding ) - $this->drawRectangle($X+1,$Y+1,$X+$InnerWidth,$Y+$Height-1,array("R"=>255,"G"=>255,"B"=>255,"Alpha"=>$Surrounding)); - } - else - $this->drawFilledRectangle($X+1,$Y+1,$X+$InnerWidth,$Y+$Height-1,array("R"=>$R,"G"=>$G,"B"=>$B,"BorderR"=>$BorderR,"BorderG"=>$BorderG,"BorderB"=>$BorderB)); - - $this->Shadow = $RestoreShadow; - - if ( $ShowLabel && $LabelPos == LABEL_POS_LEFT ) { $this->drawText($X-$Margin,$Y+($Height/2),$Percent."%",array("Align"=>TEXT_ALIGN_MIDDLERIGHT)); } - if ( $ShowLabel && $LabelPos == LABEL_POS_RIGHT ) { $this->drawText($X+$Width+$Margin,$Y+($Height/2),$Percent."%",array("Align"=>TEXT_ALIGN_MIDDLELEFT)); } - if ( $ShowLabel && $LabelPos == LABEL_POS_CENTER ) { $this->drawText($X+($Width/2),$Y+($Height/2),$Percent."%",array("Align"=>TEXT_ALIGN_MIDDLEMIDDLE)); } - if ( $ShowLabel && $LabelPos == LABEL_POS_INSIDE ) { $this->drawText($X+$InnerWidth+$Margin,$Y+($Height/2),$Percent."%",array("Align"=>TEXT_ALIGN_MIDDLELEFT)); } - } - } - - /* Get the legend box size */ - function getLegendSize($Format="") - { - $FontName = isset($Format["FontName"]) ? $Format["FontName"] : $this->FontName; - $FontSize = isset($Format["FontSize"]) ? $Format["FontSize"] : $this->FontSize; - $BoxSize = isset($Format["BoxSize"]) ? $Format["BoxSize"] : 5; - $Margin = isset($Format["Margin"]) ? $Format["Margin"] : 5; - $Style = isset($Format["Style"]) ? $Format["Style"] : LEGEND_ROUND; - $Mode = isset($Format["Mode"]) ? $Format["Mode"] : LEGEND_VERTICAL; - $BoxWidth = isset($Format["BoxWidth"]) ? $Format["BoxWidth"] : 5; - $BoxHeight = isset($Format["BoxHeight"]) ? $Format["BoxHeight"] : 5; - $IconAreaWidth = isset($Format["IconAreaWidth"]) ? $Format["IconAreaWidth"] : $BoxWidth; - $IconAreaHeight = isset($Format["IconAreaHeight"]) ? $Format["IconAreaHeight"] : $BoxHeight; - $XSpacing = isset($Format["XSpacing"]) ? $Format["XSpacing"] : 5; - - $Data = $this->DataSet->getData(); - - foreach($Data["Series"] as $SerieName => $Serie) - { - if ( $Serie["isDrawable"] == TRUE && $SerieName != $Data["Abscissa"] && isset($Serie["Picture"])) - { - list($PicWidth,$PicHeight) = $this->getPicInfo($Serie["Picture"]); - if ( $IconAreaWidth < $PicWidth ) { $IconAreaWidth = $PicWidth; } - if ( $IconAreaHeight < $PicHeight ) { $IconAreaHeight = $PicHeight; } - } - } - - $YStep = max($this->FontSize,$IconAreaHeight) + 5; - $XStep = $IconAreaWidth + 5; - $XStep = $XSpacing; - - $X=100; $Y=100; - - $Boundaries = ""; $Boundaries["L"] = $X; $Boundaries["T"] = $Y; $Boundaries["R"] = 0; $Boundaries["B"] = 0; $vY = $Y; $vX = $X; - foreach($Data["Series"] as $SerieName => $Serie) - { - if ( $Serie["isDrawable"] == TRUE && $SerieName != $Data["Abscissa"] ) - { - if ( $Mode == LEGEND_VERTICAL ) - { - $BoxArray = $this->getTextBox($vX+$IconAreaWidth+4,$vY+$IconAreaHeight/2,$FontName,$FontSize,0,$Serie["Description"]); - - if ( $Boundaries["T"] > $BoxArray[2]["Y"]+$IconAreaHeight/2 ) { $Boundaries["T"] = $BoxArray[2]["Y"]+$IconAreaHeight/2; } - if ( $Boundaries["R"] < $BoxArray[1]["X"]+2 ) { $Boundaries["R"] = $BoxArray[1]["X"]+2; } - if ( $Boundaries["B"] < $BoxArray[1]["Y"]+2+$IconAreaHeight/2 ) { $Boundaries["B"] = $BoxArray[1]["Y"]+2+$IconAreaHeight/2; } - - $Lines = preg_split("/\n/",$Serie["Description"]); - $vY = $vY + max($this->FontSize*count($Lines),$IconAreaHeight) + 5; - } - elseif ( $Mode == LEGEND_HORIZONTAL ) - { - $Lines = preg_split("/\n/",$Serie["Description"]); - $Width = ""; - foreach($Lines as $Key => $Value) - { - $BoxArray = $this->getTextBox($vX+$IconAreaWidth+6,$Y+$IconAreaHeight/2+(($this->FontSize+3)*$Key),$FontName,$FontSize,0,$Value); - - if ( $Boundaries["T"] > $BoxArray[2]["Y"]+$IconAreaHeight/2 ) { $Boundaries["T"] = $BoxArray[2]["Y"]+$IconAreaHeight/2; } - if ( $Boundaries["R"] < $BoxArray[1]["X"]+2 ) { $Boundaries["R"] = $BoxArray[1]["X"]+2; } - if ( $Boundaries["B"] < $BoxArray[1]["Y"]+2+$IconAreaHeight/2 ) { $Boundaries["B"] = $BoxArray[1]["Y"]+2+$IconAreaHeight/2; } - - $Width[] = $BoxArray[1]["X"]; - } - - $vX=max($Width)+$XStep; - } - } - } - $vY=$vY-$YStep; $vX=$vX-$XStep; - - $TopOffset = $Y - $Boundaries["T"]; - if ( $Boundaries["B"]-($vY+$IconAreaHeight) < $TopOffset ) { $Boundaries["B"] = $vY+$IconAreaHeight+$TopOffset; } - - $Width = ($Boundaries["R"]+$Margin) - ($Boundaries["L"]-$Margin); - $Height = ($Boundaries["B"]+$Margin) - ($Boundaries["T"]-$Margin); - - return(array("Width"=>$Width,"Height"=>$Height)); - } - - /* Draw the legend of the active series */ - function drawLegend($X,$Y,$Format="") - { - $Family = isset($Format["Family"]) ? $Format["Family"] : LEGEND_FAMILY_BOX; - $FontName = isset($Format["FontName"]) ? $Format["FontName"] : $this->FontName; - $FontSize = isset($Format["FontSize"]) ? $Format["FontSize"] : $this->FontSize; - $FontR = isset($Format["FontR"]) ? $Format["FontR"] : $this->FontColorR; - $FontG = isset($Format["FontG"]) ? $Format["FontG"] : $this->FontColorG; - $FontB = isset($Format["FontB"]) ? $Format["FontB"] : $this->FontColorB; - $BoxWidth = isset($Format["BoxWidth"]) ? $Format["BoxWidth"] : 5; - $BoxHeight = isset($Format["BoxHeight"]) ? $Format["BoxHeight"] : 5; - $IconAreaWidth = isset($Format["IconAreaWidth"]) ? $Format["IconAreaWidth"] : $BoxWidth; - $IconAreaHeight = isset($Format["IconAreaHeight"]) ? $Format["IconAreaHeight"] : $BoxHeight; - $XSpacing = isset($Format["XSpacing"]) ? $Format["XSpacing"] : 5; - $Margin = isset($Format["Margin"]) ? $Format["Margin"] : 5; - $R = isset($Format["R"]) ? $Format["R"] : 200; - $G = isset($Format["G"]) ? $Format["G"] : 200; - $B = isset($Format["B"]) ? $Format["B"] : 200; - $Alpha = isset($Format["Alpha"]) ? $Format["Alpha"] : 100; - $BorderR = isset($Format["BorderR"]) ? $Format["BorderR"] : 255; - $BorderG = isset($Format["BorderG"]) ? $Format["BorderG"] : 255; - $BorderB = isset($Format["BorderB"]) ? $Format["BorderB"] : 255; - $Surrounding = isset($Format["Surrounding"]) ? $Format["Surrounding"] : NULL; - $Style = isset($Format["Style"]) ? $Format["Style"] : LEGEND_ROUND; - $Mode = isset($Format["Mode"]) ? $Format["Mode"] : LEGEND_VERTICAL; - - if ( $Surrounding != NULL ) { $BorderR = $R + $Surrounding; $BorderG = $G + $Surrounding; $BorderB = $B + $Surrounding; } - - $Data = $this->DataSet->getData(); - - foreach($Data["Series"] as $SerieName => $Serie) - { - if ( $Serie["isDrawable"] == TRUE && $SerieName != $Data["Abscissa"] && isset($Serie["Picture"])) - { - list($PicWidth,$PicHeight) = $this->getPicInfo($Serie["Picture"]); - if ( $IconAreaWidth < $PicWidth ) { $IconAreaWidth = $PicWidth; } - if ( $IconAreaHeight < $PicHeight ) { $IconAreaHeight = $PicHeight; } - } - } - - $YStep = max($this->FontSize,$IconAreaHeight) + 5; - $XStep = $IconAreaWidth + 5; - $XStep = $XSpacing; - - $Boundaries = ""; $Boundaries["L"] = $X; $Boundaries["T"] = $Y; $Boundaries["R"] = 0; $Boundaries["B"] = 0; $vY = $Y; $vX = $X; - foreach($Data["Series"] as $SerieName => $Serie) - { - if ( $Serie["isDrawable"] == TRUE && $SerieName != $Data["Abscissa"] ) - { - if ( $Mode == LEGEND_VERTICAL ) - { - $BoxArray = $this->getTextBox($vX+$IconAreaWidth+4,$vY+$IconAreaHeight/2,$FontName,$FontSize,0,$Serie["Description"]); - - if ( $Boundaries["T"] > $BoxArray[2]["Y"]+$IconAreaHeight/2 ) { $Boundaries["T"] = $BoxArray[2]["Y"]+$IconAreaHeight/2; } - if ( $Boundaries["R"] < $BoxArray[1]["X"]+2 ) { $Boundaries["R"] = $BoxArray[1]["X"]+2; } - if ( $Boundaries["B"] < $BoxArray[1]["Y"]+2+$IconAreaHeight/2 ) { $Boundaries["B"] = $BoxArray[1]["Y"]+2+$IconAreaHeight/2; } - - $Lines = preg_split("/\n/",$Serie["Description"]); - $vY = $vY + max($this->FontSize*count($Lines),$IconAreaHeight) + 5; - } - elseif ( $Mode == LEGEND_HORIZONTAL ) - { - $Lines = preg_split("/\n/",$Serie["Description"]); - $Width = ""; - foreach($Lines as $Key => $Value) - { - $BoxArray = $this->getTextBox($vX+$IconAreaWidth+6,$Y+$IconAreaHeight/2+(($this->FontSize+3)*$Key),$FontName,$FontSize,0,$Value); - - if ( $Boundaries["T"] > $BoxArray[2]["Y"]+$IconAreaHeight/2 ) { $Boundaries["T"] = $BoxArray[2]["Y"]+$IconAreaHeight/2; } - if ( $Boundaries["R"] < $BoxArray[1]["X"]+2 ) { $Boundaries["R"] = $BoxArray[1]["X"]+2; } - if ( $Boundaries["B"] < $BoxArray[1]["Y"]+2+$IconAreaHeight/2 ) { $Boundaries["B"] = $BoxArray[1]["Y"]+2+$IconAreaHeight/2; } - - $Width[] = $BoxArray[1]["X"]; - } - - $vX=max($Width)+$XStep; - } - } - } - $vY=$vY-$YStep; $vX=$vX-$XStep; - - $TopOffset = $Y - $Boundaries["T"]; - if ( $Boundaries["B"]-($vY+$IconAreaHeight) < $TopOffset ) { $Boundaries["B"] = $vY+$IconAreaHeight+$TopOffset; } - - if ( $Style == LEGEND_ROUND ) - $this->drawRoundedFilledRectangle($Boundaries["L"]-$Margin,$Boundaries["T"]-$Margin,$Boundaries["R"]+$Margin,$Boundaries["B"]+$Margin,$Margin,array("R"=>$R,"G"=>$G,"B"=>$B,"Alpha"=>$Alpha,"BorderR"=>$BorderR,"BorderG"=>$BorderG,"BorderB"=>$BorderB)); - elseif ( $Style == LEGEND_BOX ) - $this->drawFilledRectangle($Boundaries["L"]-$Margin,$Boundaries["T"]-$Margin,$Boundaries["R"]+$Margin,$Boundaries["B"]+$Margin,array("R"=>$R,"G"=>$G,"B"=>$B,"Alpha"=>$Alpha,"BorderR"=>$BorderR,"BorderG"=>$BorderG,"BorderB"=>$BorderB)); - - $RestoreShadow = $this->Shadow; $this->Shadow = FALSE; - foreach($Data["Series"] as $SerieName => $Serie) - { - if ( $Serie["isDrawable"] == TRUE && $SerieName != $Data["Abscissa"] ) - { - $R = $Serie["Color"]["R"]; $G = $Serie["Color"]["G"]; $B = $Serie["Color"]["B"]; - $Ticks = $Serie["Ticks"]; $Weight = $Serie["Weight"]; - - if ( isset($Serie["Picture"]) ) - { - $Picture = $Serie["Picture"]; - list($PicWidth,$PicHeight) = $this->getPicInfo($Picture); - $PicX = $X+$IconAreaWidth/2; $PicY = $Y+$IconAreaHeight/2; - - $this->drawFromPNG($PicX-$PicWidth/2,$PicY-$PicHeight/2,$Picture); - } - else - { - if ( $Family == LEGEND_FAMILY_BOX ) - { - if ( $BoxWidth != $IconAreaWidth ) { $XOffset = floor(($IconAreaWidth-$BoxWidth)/2); } else { $XOffset = 0; } - if ( $BoxHeight != $IconAreaHeight ) { $YOffset = floor(($IconAreaHeight-$BoxHeight)/2); } else { $YOffset = 0; } - - $this->drawFilledRectangle($X+1+$XOffset,$Y+1+$YOffset,$X+$BoxWidth+$XOffset+1,$Y+$BoxHeight+1+$YOffset,array("R"=>0,"G"=>0,"B"=>0,"Alpha"=>20)); - $this->drawFilledRectangle($X+$XOffset,$Y+$YOffset,$X+$BoxWidth+$XOffset,$Y+$BoxHeight+$YOffset,array("R"=>$R,"G"=>$G,"B"=>$B,"Surrounding"=>20)); - } - elseif ( $Family == LEGEND_FAMILY_CIRCLE ) - { - $this->drawFilledCircle($X+1+$IconAreaWidth/2,$Y+1+$IconAreaHeight/2,min($IconAreaHeight/2,$IconAreaWidth/2),array("R"=>0,"G"=>0,"B"=>0,"Alpha"=>20)); - $this->drawFilledCircle($X+$IconAreaWidth/2,$Y+$IconAreaHeight/2,min($IconAreaHeight/2,$IconAreaWidth/2),array("R"=>$R,"G"=>$G,"B"=>$B,"Surrounding"=>20)); - } - elseif ( $Family == LEGEND_FAMILY_LINE ) - { - $this->drawLine($X+1,$Y+1+$IconAreaHeight/2,$X+1+$IconAreaWidth,$Y+1+$IconAreaHeight/2,array("R"=>0,"G"=>0,"B"=>0,"Alpha"=>20,"Ticks"=>$Ticks,"Weight"=>$Weight)); - $this->drawLine($X,$Y+$IconAreaHeight/2,$X+$IconAreaWidth,$Y+$IconAreaHeight/2,array("R"=>$R,"G"=>$G,"B"=>$B,"Ticks"=>$Ticks,"Weight"=>$Weight)); - } - } - - if ( $Mode == LEGEND_VERTICAL ) - { - $Lines = preg_split("/\n/",$Serie["Description"]); - foreach($Lines as $Key => $Value) - $this->drawText($X+$IconAreaWidth+4,$Y+$IconAreaHeight/2+(($this->FontSize+3)*$Key),$Value,array("R"=>$FontR,"G"=>$FontG,"B"=>$FontB,"Align"=>TEXT_ALIGN_MIDDLELEFT,"FontSize"=>$FontSize,"FontName"=>$FontName)); - - $Y=$Y+max($this->FontSize*count($Lines),$IconAreaHeight) + 5; - } - elseif ( $Mode == LEGEND_HORIZONTAL ) - { - $Lines = preg_split("/\n/",$Serie["Description"]); - $Width = ""; - foreach($Lines as $Key => $Value) - { - $BoxArray = $this->drawText($X+$IconAreaWidth+4,$Y+$IconAreaHeight/2+(($this->FontSize+3)*$Key),$Value,array("R"=>$FontR,"G"=>$FontG,"B"=>$FontB,"Align"=>TEXT_ALIGN_MIDDLELEFT,"FontSize"=>$FontSize,"FontName"=>$FontName)); - $Width[] = $BoxArray[1]["X"]; - } - $X=max($Width)+2+$XStep; - } - } - } - - - $this->Shadow = $RestoreShadow; - } - - function drawScale($Format="") - { - $Pos = isset($Format["Pos"]) ? $Format["Pos"] : SCALE_POS_LEFTRIGHT; - $Floating = isset($Format["Floating"]) ? $Format["Floating"] : FALSE; - $Mode = isset($Format["Mode"]) ? $Format["Mode"] : SCALE_MODE_FLOATING; - $RemoveXAxis = isset($Format["RemoveXAxis"]) ? $Format["RemoveXAxis"] : FALSE; - $MinDivHeight = isset($Format["MinDivHeight"]) ? $Format["MinDivHeight"] : 20; - $Factors = isset($Format["Factors"]) ? $Format["Factors"] : array(1,2,5); - $ManualScale = isset($Format["ManualScale"]) ? $Format["ManualScale"] : array("0"=>array("Min"=>-100,"Max"=>100)); - $XMargin = isset($Format["XMargin"]) ? $Format["XMargin"] : AUTO; - $YMargin = isset($Format["YMargin"]) ? $Format["YMargin"] : 0; - $ScaleSpacing = isset($Format["ScaleSpacing"]) ? $Format["ScaleSpacing"] : 15; - $InnerTickWidth = isset($Format["InnerTickWidth"]) ? $Format["InnerTickWidth"] : 2; - $OuterTickWidth = isset($Format["OuterTickWidth"]) ? $Format["OuterTickWidth"] : 2; - $DrawXLines = isset($Format["DrawXLines"]) ? $Format["DrawXLines"] : TRUE; - $DrawYLines = isset($Format["DrawYLines"]) ? $Format["DrawYLines"] : ALL; - $GridTicks = isset($Format["GridTicks"]) ? $Format["GridTicks"] : 4; - $GridR = isset($Format["GridR"]) ? $Format["GridR"] : 255; - $GridG = isset($Format["GridG"]) ? $Format["GridG"] : 255; - $GridB = isset($Format["GridB"]) ? $Format["GridB"] : 255; - $GridAlpha = isset($Format["GridAlpha"]) ? $Format["GridAlpha"] : 40; - $AxisRo = isset($Format["AxisR"]) ? $Format["AxisR"] : 0; - $AxisGo = isset($Format["AxisG"]) ? $Format["AxisG"] : 0; - $AxisBo = isset($Format["AxisB"]) ? $Format["AxisB"] : 0; - $AxisAlpha = isset($Format["AxisAlpha"]) ? $Format["AxisAlpha"] : 100; - $TickRo = isset($Format["TickR"]) ? $Format["TickR"] : 0; - $TickGo = isset($Format["TickG"]) ? $Format["TickG"] : 0; - $TickBo = isset($Format["TickB"]) ? $Format["TickB"] : 0; - $TickAlpha = isset($Format["TickAlpha"]) ? $Format["TickAlpha"] : 100; - $DrawSubTicks = isset($Format["DrawSubTicks"]) ? $Format["DrawSubTicks"] : FALSE; - $InnerSubTickWidth = isset($Format["InnerSubTickWidth"]) ? $Format["InnerSubTickWidth"] : 0; - $OuterSubTickWidth = isset($Format["OuterSubTickWidth"]) ? $Format["OuterSubTickWidth"] : 2; - $SubTickR = isset($Format["SubTickR"]) ? $Format["SubTickR"] : 255; - $SubTickG = isset($Format["SubTickG"]) ? $Format["SubTickG"] : 0; - $SubTickB = isset($Format["SubTickB"]) ? $Format["SubTickB"] : 0; - $SubTickAlpha = isset($Format["SubTickAlpha"]) ? $Format["SubTickAlpha"] : 100; - $AutoAxisLabels = isset($Format["AutoAxisLabels"]) ? $Format["AutoAxisLabels"] : TRUE; - $XReleasePercent = isset($Format["XReleasePercent"]) ? $Format["XReleasePercent"] : 1; - $DrawArrows = isset($Format["DrawArrows"]) ? $Format["DrawArrows"] : FALSE; - $ArrowSize = isset($Format["ArrowSize"]) ? $Format["ArrowSize"] : 8; - $CycleBackground = isset($Format["CycleBackground"]) ? $Format["CycleBackground"] : FALSE; - $BackgroundR1 = isset($Format["BackgroundR1"]) ? $Format["BackgroundR1"] : 255; - $BackgroundG1 = isset($Format["BackgroundG1"]) ? $Format["BackgroundG1"] : 255; - $BackgroundB1 = isset($Format["BackgroundB1"]) ? $Format["BackgroundB1"] : 255; - $BackgroundAlpha1 = isset($Format["BackgroundAlpha1"]) ? $Format["BackgroundAlpha1"] : 20; - $BackgroundR2 = isset($Format["BackgroundR2"]) ? $Format["BackgroundR2"] : 230; - $BackgroundG2 = isset($Format["BackgroundG2"]) ? $Format["BackgroundG2"] : 230; - $BackgroundB2 = isset($Format["BackgroundB2"]) ? $Format["BackgroundB2"] : 230; - $BackgroundAlpha2 = isset($Format["BackgroundAlpha2"]) ? $Format["BackgroundAlpha2"] : 20; - $LabelingMethod = isset($Format["LabelingMethod"]) ? $Format["LabelingMethod"] : LABELING_ALL; - $LabelSkip = isset($Format["LabelSkip"]) ? $Format["LabelSkip"] : 0; - $LabelRotation = isset($Format["LabelRotation"]) ? $Format["LabelRotation"] : 0; - $RemoveSkippedAxis = isset($Format["RemoveSkippedAxis"]) ? $Format["RemoveSkippedAxis"] : FALSE; - $SkippedAxisTicks = isset($Format["SkippedAxisTicks"]) ? $Format["SkippedAxisTicks"] : $GridTicks+2; - $SkippedAxisR = isset($Format["SkippedAxisR"]) ? $Format["SkippedAxisR"] : $GridR; - $SkippedAxisG = isset($Format["SkippedAxisG"]) ? $Format["SkippedAxisG"] : $GridG; - $SkippedAxisB = isset($Format["SkippedAxisB"]) ? $Format["SkippedAxisB"] : $GridB; - $SkippedAxisAlpha = isset($Format["SkippedAxisAlpha"]) ? $Format["SkippedAxisAlpha"] : $GridAlpha-30; - $SkippedTickR = isset($Format["SkippedTickR"]) ? $Format["SkippedTickR"] : $TickRo; - $SkippedTickG = isset($Format["SkippedTickG"]) ? $Format["SkippedTickG"] : $TickGo; - $SkippedTickB = isset($Format["SkippedTicksB"]) ? $Format["SkippedTickB"] : $TickBo; - $SkippedTickAlpha = isset($Format["SkippedTickAlpha"]) ? $Format["SkippedTickAlpha"] : $TickAlpha-80; - $SkippedInnerTickWidth = isset($Format["SkippedInnerTickWidth"]) ? $Format["SkippedInnerTickWidth"] : 0; - $SkippedOuterTickWidth = isset($Format["SkippedOuterTickWidth"]) ? $Format["SkippedOuterTickWidth"] : 2; - - /* Floating scale require X & Y margins to be set manually */ - if ( $Floating && ( $XMargin == AUTO || $YMargin == 0 ) ) { $Floating = FALSE; } - - /* Skip a NOTICE event in case of an empty array */ - if ( $DrawYLines == NONE || $DrawYLines == FALSE ) { $DrawYLines = array("zarma"=>"31"); } - - /* Define the color for the skipped elements */ - $SkippedAxisColor = array("R"=>$SkippedAxisR,"G"=>$SkippedAxisG,"B"=>$SkippedAxisB,"Alpha"=>$SkippedAxisAlpha,"Ticks"=>$SkippedAxisTicks); - $SkippedTickColor = array("R"=>$SkippedTickR,"G"=>$SkippedTickG,"B"=>$SkippedTickB,"Alpha"=>$SkippedTickAlpha); - - $Data = $this->DataSet->getData(); - if ( isset($Data["Abscissa"]) ) { $Abscissa = $Data["Abscissa"]; } else { $Abscissa = NULL; } - - /* Unset the abscissa axis, needed if we display multiple charts on the same picture */ - if ( $Abscissa != NULL ) - { - foreach($Data["Axis"] as $AxisID => $Parameters) - { if ($Parameters["Identity"] == AXIS_X) { unset($Data["Axis"][$AxisID]); } } - } - - /* Build the scale settings */ - $GotXAxis = FALSE; - foreach($Data["Axis"] as $AxisID => $AxisParameter) - { - if ( $AxisParameter["Identity"] == AXIS_X ) { $GotXAxis = TRUE; } - - if ( $Pos == SCALE_POS_LEFTRIGHT && $AxisParameter["Identity"] == AXIS_Y) - { $Height = $this->GraphAreaY2-$this->GraphAreaY1 - $YMargin*2; } - elseif ( $Pos == SCALE_POS_LEFTRIGHT && $AxisParameter["Identity"] == AXIS_X) - { $Height = $this->GraphAreaX2-$this->GraphAreaX1; } - elseif ( $Pos == SCALE_POS_TOPBOTTOM && $AxisParameter["Identity"] == AXIS_Y) - { $Height = $this->GraphAreaX2-$this->GraphAreaX1 - $YMargin*2;; } - else - { $Height = $this->GraphAreaY2-$this->GraphAreaY1; } - - $AxisMin = ABSOLUTE_MAX; $AxisMax = OUT_OF_SIGHT; - if ( $Mode == SCALE_MODE_FLOATING || $Mode == SCALE_MODE_START0 ) - { - foreach($Data["Series"] as $SerieID => $SerieParameter) - { - if ( $SerieParameter["Axis"] == $AxisID && $Data["Series"][$SerieID]["isDrawable"] && $Data["Abscissa"] != $SerieID) - { - $AxisMax = max($AxisMax,$Data["Series"][$SerieID]["Max"]); - $AxisMin = min($AxisMin,$Data["Series"][$SerieID]["Min"]); - } - } - $AutoMargin = (($AxisMax-$AxisMin)/100)*$XReleasePercent; - - $Data["Axis"][$AxisID]["Min"] = $AxisMin-$AutoMargin; $Data["Axis"][$AxisID]["Max"] = $AxisMax+$AutoMargin; - if ( $Mode == SCALE_MODE_START0 ) { $Data["Axis"][$AxisID]["Min"] = 0; } - } - elseif ( $Mode == SCALE_MODE_MANUAL ) - { - if ( isset($ManualScale[$AxisID]["Min"]) && isset($ManualScale[$AxisID]["Max"]) ) - { - $Data["Axis"][$AxisID]["Min"] = $ManualScale[$AxisID]["Min"]; - $Data["Axis"][$AxisID]["Max"] = $ManualScale[$AxisID]["Max"]; - } - else - { echo "Manual scale boundaries not set."; exit(); } - } - elseif ( $Mode == SCALE_MODE_ADDALL || $Mode == SCALE_MODE_ADDALL_START0 ) - { - $Series = ""; - foreach($Data["Series"] as $SerieID => $SerieParameter) - { if ( $SerieParameter["Axis"] == $AxisID && $SerieParameter["isDrawable"] && $Data["Abscissa"] != $SerieID ) { $Series[$SerieID] = count($Data["Series"][$SerieID]["Data"]); } } - - for ($ID=0;$ID<=max($Series)-1;$ID++) - { - $PointMin = 0; $PointMax = 0; - foreach($Series as $SerieID => $ValuesCount ) - { - if (isset($Data["Series"][$SerieID]["Data"][$ID]) && $Data["Series"][$SerieID]["Data"][$ID] != NULL ) - { - $Value = $Data["Series"][$SerieID]["Data"][$ID]; - if ( $Value > 0 ) { $PointMax = $PointMax + $Value; } else { $PointMin = $PointMin + $Value; } - } - } - $AxisMax = max($AxisMax,$PointMax); - $AxisMin = min($AxisMin,$PointMin); - } - $AutoMargin = (($AxisMax-$AxisMin)/100)*$XReleasePercent; - $Data["Axis"][$AxisID]["Min"] = $AxisMin-$AutoMargin; $Data["Axis"][$AxisID]["Max"] = $AxisMax+$AutoMargin; - } - $MaxDivs = floor($Height/$MinDivHeight); - - if ( $Mode == SCALE_MODE_ADDALL_START0 ) { $Data["Axis"][$AxisID]["Min"] = 0; } - - $Scale = $this->computeScale($Data["Axis"][$AxisID]["Min"],$Data["Axis"][$AxisID]["Max"],$MaxDivs,$Factors,$AxisID); - - $Data["Axis"][$AxisID]["Margin"] = $AxisParameter["Identity"] == AXIS_X ? $XMargin : $YMargin; - $Data["Axis"][$AxisID]["ScaleMin"] = $Scale["XMin"]; - $Data["Axis"][$AxisID]["ScaleMax"] = $Scale["XMax"]; - $Data["Axis"][$AxisID]["Rows"] = $Scale["Rows"]; - $Data["Axis"][$AxisID]["RowHeight"] = $Scale["RowHeight"]; - - if ( isset($Scale["Format"]) ) { $Data["Axis"][$AxisID]["Format"] = $Scale["Format"]; } - - if ( !isset($Data["Axis"][$AxisID]["Display"]) ) { $Data["Axis"][$AxisID]["Display"] = NULL; } - if ( !isset($Data["Axis"][$AxisID]["Format"]) ) { $Data["Axis"][$AxisID]["Format"] = NULL; } - if ( !isset($Data["Axis"][$AxisID]["Unit"]) ) { $Data["Axis"][$AxisID]["Unit"] = NULL; } - } - - /* Still no X axis */ - if ( $GotXAxis == FALSE ) - { - if ( $Abscissa != NULL ) - { - $Points = count($Data["Series"][$Abscissa]["Data"]); - if ( $AutoAxisLabels ) - $AxisName = isset($Data["Series"][$Abscissa]["Description"]) ? $Data["Series"][$Abscissa]["Description"] : NULL; - else - $AxisName = NULL; - } - else - { - $Points = 0; - $AxisName = isset($Data["XAxisName"]) ? $Data["XAxisName"] : NULL; - foreach($Data["Series"] as $SerieID => $SerieParameter) - { if ( $SerieParameter["isDrawable"] ) { $Points = max($Points,count($SerieParameter["Data"])); } } - } - - $AxisID = count($Data["Axis"]); - $Data["Axis"][$AxisID]["Identity"] = AXIS_X; - if ( $Pos == SCALE_POS_LEFTRIGHT ) { $Data["Axis"][$AxisID]["Position"] = AXIS_POSITION_BOTTOM; } else { $Data["Axis"][$AxisID]["Position"] = AXIS_POSITION_LEFT; } - if ( isset($Data["AbscissaName"]) ) { $Data["Axis"][$AxisID]["Name"] = $Data["AbscissaName"]; } - if ( $XMargin == AUTO ) - { - if ( $Pos == SCALE_POS_LEFTRIGHT ) - { $Height = $this->GraphAreaX2-$this->GraphAreaX1; } - else - { $Height = $this->GraphAreaY2-$this->GraphAreaY1; } - - if ( $Points == 1 ) - $Data["Axis"][$AxisID]["Margin"] = $Height / 2; - else - $Data["Axis"][$AxisID]["Margin"] = ($Height/$Points) / 2; - } - else - { $Data["Axis"][$AxisID]["Margin"] = $XMargin; } - $Data["Axis"][$AxisID]["Rows"] = $Points-1; - if ( !isset($Data["Axis"][$AxisID]["Display"]) ) { $Data["Axis"][$AxisID]["Display"] = NULL; } - if ( !isset($Data["Axis"][$AxisID]["Format"]) ) { $Data["Axis"][$AxisID]["Format"] = NULL; } - if ( !isset($Data["Axis"][$AxisID]["Unit"]) ) { $Data["Axis"][$AxisID]["Unit"] = NULL; } - } - - /* Do we need to reverse the abscissa position? */ - if ( $Pos != SCALE_POS_LEFTRIGHT ) - { - if ( $Data["AbsicssaPosition"] == AXIS_POSITION_BOTTOM ) - { $Data["AbsicssaPosition"] = AXIS_POSITION_LEFT; } - else - { $Data["AbsicssaPosition"] = AXIS_POSITION_RIGHT; } - } - $Data["Axis"][$AxisID]["Position"] = $Data["AbsicssaPosition"]; - - $this->DataSet->saveOrientation($Pos); - $this->DataSet->saveAxisConfig($Data["Axis"]); - $this->DataSet->saveYMargin($YMargin); - - $FontColorRo = $this->FontColorR; $FontColorGo = $this->FontColorG; $FontColorBo = $this->FontColorB; - - $AxisPos["L"] = $this->GraphAreaX1; $AxisPos["R"] = $this->GraphAreaX2; $AxisPos["T"] = $this->GraphAreaY1; $AxisPos["B"] = $this->GraphAreaY2; - foreach($Data["Axis"] as $AxisID => $Parameters) - { - if ( isset($Parameters["Color"]) ) - { - $AxisR = $Parameters["Color"]["R"]; $AxisG = $Parameters["Color"]["G"]; $AxisB = $Parameters["Color"]["B"]; - $TickR = $Parameters["Color"]["R"]; $TickG = $Parameters["Color"]["G"]; $TickB = $Parameters["Color"]["B"]; - $this->setFontProperties(array("R"=>$Parameters["Color"]["R"],"G"=>$Parameters["Color"]["G"],"B"=>$Parameters["Color"]["B"])); - } - else - { - $AxisR = $AxisRo; $AxisG = $AxisGo; $AxisB = $AxisBo; - $TickR = $TickRo; $TickG = $TickGo; $TickB = $TickBo; - $this->setFontProperties(array("R"=>$FontColorRo,"G"=>$FontColorGo,"B"=>$FontColorBo)); - } - - $LastValue = "w00t"; $ID = 1; - if ( $Parameters["Identity"] == AXIS_X ) - { - if ( $Pos == SCALE_POS_LEFTRIGHT ) - { - if ( $Parameters["Position"] == AXIS_POSITION_BOTTOM ) - { - if ( $LabelRotation == 0 ) { $LabelAlign = TEXT_ALIGN_TOPMIDDLE; $YLabelOffset = 2; } - if ( $LabelRotation > 0 && $LabelRotation < 190 ) { $LabelAlign = TEXT_ALIGN_MIDDLERIGHT; $YLabelOffset = 5; } - if ( $LabelRotation == 180 ) { $LabelAlign = TEXT_ALIGN_BOTTOMMIDDLE; $YLabelOffset = 5; } - if ( $LabelRotation > 180 && $LabelRotation < 360 ) { $LabelAlign = TEXT_ALIGN_MIDDLELEFT; $YLabelOffset = 2; } - - if ( !$RemoveXAxis ) - { - if ( $Floating ) - { $FloatingOffset = $YMargin; $this->drawLine($this->GraphAreaX1+$Parameters["Margin"],$AxisPos["B"],$this->GraphAreaX2-$Parameters["Margin"],$AxisPos["B"],array("R"=>$AxisR,"G"=>$AxisG,"B"=>$AxisB,"Alpha"=>$AxisAlpha)); } - else - { $FloatingOffset = 0; $this->drawLine($this->GraphAreaX1,$AxisPos["B"],$this->GraphAreaX2,$AxisPos["B"],array("R"=>$AxisR,"G"=>$AxisG,"B"=>$AxisB,"Alpha"=>$AxisAlpha)); } - - if ( $DrawArrows ) { $this->drawArrow($this->GraphAreaX2-$Parameters["Margin"],$AxisPos["B"],$this->GraphAreaX2+($ArrowSize*2),$AxisPos["B"],array("FillR"=>$AxisR,"FillG"=>$AxisG,"FillB"=>$AxisB,"Size"=>$ArrowSize)); } - } - - $Width = ($this->GraphAreaX2 - $this->GraphAreaX1) - $Parameters["Margin"]*2; - - if ($Parameters["Rows"] == 0 ) { $Step = $Width; } else { $Step = $Width / ($Parameters["Rows"]); } - - $MaxBottom = $AxisPos["B"]; - for($i=0;$i<=$Parameters["Rows"];$i++) - { - $XPos = $this->GraphAreaX1 + $Parameters["Margin"] + $Step*$i; - $YPos = $AxisPos["B"]; - - if ( $Abscissa != NULL ) - { if ( isset($Data["Series"][$Abscissa]["Data"][$i]) ) { $Value = $this->scaleFormat($Data["Series"][$Abscissa]["Data"][$i],$Data["XAxisDisplay"],$Data["XAxisFormat"],$Data["XAxisUnit"]); } else { $Value = ""; } } - else - { - if ( isset($Parameters["ScaleMin"]) && isset ($Parameters["RowHeight"]) ) - $Value = $this->scaleFormat($Parameters["ScaleMin"] + $Parameters["RowHeight"]*$i,$Data["XAxisDisplay"],$Data["XAxisFormat"],$Data["XAxisUnit"]); - else - $Value = $i; - } - - $ID++; $Skipped = TRUE; - if ( $this->isValidLabel($Value,$LastValue,$LabelingMethod,$ID,$LabelSkip) && !$RemoveXAxis) - { - $Bounds = $this->drawText($XPos,$YPos+$OuterTickWidth+$YLabelOffset,$Value,array("Angle"=>$LabelRotation,"Align"=>$LabelAlign)); - $TxtBottom = $YPos+$OuterTickWidth+2+($Bounds[0]["Y"]-$Bounds[2]["Y"]); - $MaxBottom = max($MaxBottom,$TxtBottom); - $LastValue = $Value; - $Skipped = FALSE; - } - - if ( $RemoveXAxis ) { $Skipped = FALSE; } - - if ( $Skipped ) - { - if ( $DrawXLines && !$RemoveSkippedAxis ) { $this->drawLine($XPos,$this->GraphAreaY1+$FloatingOffset,$XPos,$this->GraphAreaY2-$FloatingOffset,$SkippedAxisColor); } - if ( ($SkippedInnerTickWidth !=0 || $SkippedOuterTickWidth != 0) && !$RemoveXAxis && !$RemoveSkippedAxis) { $this->drawLine($XPos,$YPos-$SkippedInnerTickWidth,$XPos,$YPos+$SkippedOuterTickWidth,$SkippedTickColor); } - } - else - { - if ( $DrawXLines && ($XPos != $this->GraphAreaX1 && $XPos != $this->GraphAreaX2) ) { $this->drawLine($XPos,$this->GraphAreaY1+$FloatingOffset,$XPos,$this->GraphAreaY2-$FloatingOffset,array("R"=>$GridR,"G"=>$GridG,"B"=>$GridB,"Alpha"=>$GridAlpha,"Ticks"=>$GridTicks)); } - if ( ($InnerTickWidth !=0 || $OuterTickWidth != 0) && !$RemoveXAxis ) { $this->drawLine($XPos,$YPos-$InnerTickWidth,$XPos,$YPos+$OuterTickWidth,array("R"=>$TickR,"G"=>$TickG,"B"=>$TickB,"Alpha"=>$TickAlpha)); } - } - } - - if ( isset($Parameters["Name"]) && !$RemoveXAxis) - { - $YPos = $MaxBottom+2; - $XPos = $this->GraphAreaX1+($this->GraphAreaX2-$this->GraphAreaX1)/2; - $Bounds = $this->drawText($XPos,$YPos,$Parameters["Name"],array("Align"=>TEXT_ALIGN_TOPMIDDLE)); - $MaxBottom = $Bounds[0]["Y"]; - - $this->DataSet->Data["GraphArea"]["Y2"] = $MaxBottom + $this->FontSize; - } - - $AxisPos["B"] = $MaxBottom + $ScaleSpacing; - } - elseif ( $Parameters["Position"] == AXIS_POSITION_TOP ) - { - if ( $LabelRotation == 0 ) { $LabelAlign = TEXT_ALIGN_BOTTOMMIDDLE; $YLabelOffset = 2; } - if ( $LabelRotation > 0 && $LabelRotation < 190 ) { $LabelAlign = TEXT_ALIGN_MIDDLELEFT; $YLabelOffset = 2; } - if ( $LabelRotation == 180 ) { $LabelAlign = TEXT_ALIGN_TOPMIDDLE; $YLabelOffset = 5; } - if ( $LabelRotation > 180 && $LabelRotation < 360 ) { $LabelAlign = TEXT_ALIGN_MIDDLERIGHT; $YLabelOffset = 5; } - - if ( !$RemoveXAxis ) - { - if ( $Floating ) - { $FloatingOffset = $YMargin; $this->drawLine($this->GraphAreaX1+$Parameters["Margin"],$AxisPos["T"],$this->GraphAreaX2-$Parameters["Margin"],$AxisPos["T"],array("R"=>$AxisR,"G"=>$AxisG,"B"=>$AxisB,"Alpha"=>$AxisAlpha)); } - else - { $FloatingOffset = 0; $this->drawLine($this->GraphAreaX1,$AxisPos["T"],$this->GraphAreaX2,$AxisPos["T"],array("R"=>$AxisR,"G"=>$AxisG,"B"=>$AxisB,"Alpha"=>$AxisAlpha)); } - - if ( $DrawArrows ) { $this->drawArrow($this->GraphAreaX2-$Parameters["Margin"],$AxisPos["T"],$this->GraphAreaX2+($ArrowSize*2),$AxisPos["T"],array("FillR"=>$AxisR,"FillG"=>$AxisG,"FillB"=>$AxisB,"Size"=>$ArrowSize)); } - } - - $Width = ($this->GraphAreaX2 - $this->GraphAreaX1) - $Parameters["Margin"]*2; - - if ($Parameters["Rows"] == 0 ) { $Step = $Width; } else { $Step = $Width / $Parameters["Rows"]; } - - $MinTop = $AxisPos["T"]; - for($i=0;$i<=$Parameters["Rows"];$i++) - { - $XPos = $this->GraphAreaX1 + $Parameters["Margin"] + $Step*$i; - $YPos = $AxisPos["T"]; - - if ( $Abscissa != NULL ) - { if ( isset($Data["Series"][$Abscissa]["Data"][$i]) ) { $Value = $this->scaleFormat($Data["Series"][$Abscissa]["Data"][$i],$Data["XAxisDisplay"],$Data["XAxisFormat"],$Data["XAxisUnit"]); } else { $Value = ""; } } - else - { - if ( isset($Parameters["ScaleMin"]) && isset ($Parameters["RowHeight"]) ) - $Value = $this->scaleFormat($Parameters["ScaleMin"] + $Parameters["RowHeight"]*$i,$Data["XAxisDisplay"],$Data["XAxisFormat"],$Data["XAxisUnit"]); - else - $Value = $i; - } - - $ID++; $Skipped = TRUE; - if ( $this->isValidLabel($Value,$LastValue,$LabelingMethod,$ID,$LabelSkip) && !$RemoveXAxis) - { - $Bounds = $this->drawText($XPos,$YPos-$OuterTickWidth-$YLabelOffset,$Value,array("Angle"=>$LabelRotation,"Align"=>$LabelAlign)); - $TxtBox = $YPos-$OuterTickWidth-2-($Bounds[0]["Y"]-$Bounds[2]["Y"]); - $MinTop = min($MinTop,$TxtBox); - $LastValue = $Value; - $Skipped = FALSE; - } - - if ( $RemoveXAxis ) { $Skipped = FALSE; } - - if ( $Skipped ) - { - if ( $DrawXLines && !$RemoveSkippedAxis ) { $this->drawLine($XPos,$this->GraphAreaY1+$FloatingOffset,$XPos,$this->GraphAreaY2-$FloatingOffset,$SkippedAxisColor); } - if ( ($SkippedInnerTickWidth !=0 || $SkippedOuterTickWidth != 0) && !$RemoveXAxis && !$RemoveSkippedAxis ) { $this->drawLine($XPos,$YPos+$SkippedInnerTickWidth,$XPos,$YPos-$SkippedOuterTickWidth,$SkippedTickColor); } - } - else - { - if ( $DrawXLines ) { $this->drawLine($XPos,$this->GraphAreaY1+$FloatingOffset,$XPos,$this->GraphAreaY2-$FloatingOffset,array("R"=>$GridR,"G"=>$GridG,"B"=>$GridB,"Alpha"=>$GridAlpha,"Ticks"=>$GridTicks)); } - if ( ($InnerTickWidth !=0 || $OuterTickWidth != 0) && !$RemoveXAxis ) { $this->drawLine($XPos,$YPos+$InnerTickWidth,$XPos,$YPos-$OuterTickWidth,array("R"=>$TickR,"G"=>$TickG,"B"=>$TickB,"Alpha"=>$TickAlpha)); } - } - - } - - if ( isset($Parameters["Name"]) && !$RemoveXAxis ) - { - $YPos = $MinTop-2; - $XPos = $this->GraphAreaX1+($this->GraphAreaX2-$this->GraphAreaX1)/2; - $Bounds = $this->drawText($XPos,$YPos,$Parameters["Name"],array("Align"=>TEXT_ALIGN_BOTTOMMIDDLE)); - $MinTop = $Bounds[2]["Y"]; - - $this->DataSet->Data["GraphArea"]["Y1"] = $MinTop; - } - - $AxisPos["T"] = $MinTop - $ScaleSpacing; - } - } - elseif ( $Pos == SCALE_POS_TOPBOTTOM ) - { - if ( $Parameters["Position"] == AXIS_POSITION_LEFT ) - { - if ( $LabelRotation == 0 ) { $LabelAlign = TEXT_ALIGN_MIDDLERIGHT; $XLabelOffset = -2; } - if ( $LabelRotation > 0 && $LabelRotation < 190 ) { $LabelAlign = TEXT_ALIGN_MIDDLERIGHT; $XLabelOffset = -6; } - if ( $LabelRotation == 180 ) { $LabelAlign = TEXT_ALIGN_MIDDLELEFT; $XLabelOffset = -2; } - if ( $LabelRotation > 180 && $LabelRotation < 360 ) { $LabelAlign = TEXT_ALIGN_MIDDLELEFT; $XLabelOffset = -5; } - - if ( !$RemoveXAxis ) - { - if ( $Floating ) - { $FloatingOffset = $YMargin; $this->drawLine($AxisPos["L"],$this->GraphAreaY1+$Parameters["Margin"],$AxisPos["L"],$this->GraphAreaY2-$Parameters["Margin"],array("R"=>$AxisR,"G"=>$AxisG,"B"=>$AxisB,"Alpha"=>$AxisAlpha)); } - else - { $FloatingOffset = 0; $this->drawLine($AxisPos["L"],$this->GraphAreaY1,$AxisPos["L"],$this->GraphAreaY2,array("R"=>$AxisR,"G"=>$AxisG,"B"=>$AxisB,"Alpha"=>$AxisAlpha)); } - - if ( $DrawArrows ) { $this->drawArrow($AxisPos["L"],$this->GraphAreaY2-$Parameters["Margin"],$AxisPos["L"],$this->GraphAreaY2+($ArrowSize*2),array("FillR"=>$AxisR,"FillG"=>$AxisG,"FillB"=>$AxisB,"Size"=>$ArrowSize)); } - } - - $Height = ($this->GraphAreaY2 - $this->GraphAreaY1) - $Parameters["Margin"]*2; - - if ($Parameters["Rows"] == 0 ) { $Step = $Height; } else { $Step = $Height / $Parameters["Rows"]; } - - $MinLeft = $AxisPos["L"]; - for($i=0;$i<=$Parameters["Rows"];$i++) - { - $YPos = $this->GraphAreaY1 + $Parameters["Margin"] + $Step*$i; - $XPos = $AxisPos["L"]; - - if ( $Abscissa != NULL ) - { if ( isset($Data["Series"][$Abscissa]["Data"][$i]) ) { $Value = $this->scaleFormat($Data["Series"][$Abscissa]["Data"][$i],$Data["XAxisDisplay"],$Data["XAxisFormat"],$Data["XAxisUnit"]); } else { $Value = ""; } } - else - { - if ( isset($Parameters["ScaleMin"]) && isset ($Parameters["RowHeight"]) ) - $Value = $this->scaleFormat($Parameters["ScaleMin"] + $Parameters["RowHeight"]*$i,$Data["XAxisDisplay"],$Data["XAxisFormat"],$Data["XAxisUnit"]); - else - $Value = $i; - } - - $ID++; $Skipped = TRUE; - if ( $this->isValidLabel($Value,$LastValue,$LabelingMethod,$ID,$LabelSkip) && !$RemoveXAxis) - { - $Bounds = $this->drawText($XPos-$OuterTickWidth+$XLabelOffset,$YPos,$Value,array("Angle"=>$LabelRotation,"Align"=>$LabelAlign)); - $TxtBox = $XPos-$OuterTickWidth-2-($Bounds[1]["X"]-$Bounds[0]["X"]); - $MinLeft = min($MinLeft,$TxtBox); - $LastValue = $Value; - $Skipped = FALSE; - } - - if ( $RemoveXAxis ) { $Skipped = FALSE; } - - if ( $Skipped ) - { - if ( $DrawXLines && !$RemoveSkippedAxis ) { $this->drawLine($this->GraphAreaX1+$FloatingOffset,$YPos,$this->GraphAreaX2-$FloatingOffset,$YPos,$SkippedAxisColor); } - if ( ($SkippedInnerTickWidth !=0 || $SkippedOuterTickWidth != 0) && !$RemoveXAxis && !$RemoveSkippedAxis ) { $this->drawLine($XPos-$SkippedOuterTickWidth,$YPos,$XPos+$SkippedInnerTickWidth,$YPos,$SkippedTickColor); } - } - else - { - if ( $DrawXLines && ($YPos != $this->GraphAreaY1 && $YPos != $this->GraphAreaY2) ) { $this->drawLine($this->GraphAreaX1+$FloatingOffset,$YPos,$this->GraphAreaX2-$FloatingOffset,$YPos,array("R"=>$GridR,"G"=>$GridG,"B"=>$GridB,"Alpha"=>$GridAlpha,"Ticks"=>$GridTicks)); } - if ( ($InnerTickWidth !=0 || $OuterTickWidth != 0) && !$RemoveXAxis ) { $this->drawLine($XPos-$OuterTickWidth,$YPos,$XPos+$InnerTickWidth,$YPos,array("R"=>$TickR,"G"=>$TickG,"B"=>$TickB,"Alpha"=>$TickAlpha)); } - } - - } - if ( isset($Parameters["Name"]) && !$RemoveXAxis ) - { - $XPos = $MinLeft-2; - $YPos = $this->GraphAreaY1+($this->GraphAreaY2-$this->GraphAreaY1)/2; - $Bounds = $this->drawText($XPos,$YPos,$Parameters["Name"],array("Align"=>TEXT_ALIGN_BOTTOMMIDDLE,"Angle"=>90)); - $MinLeft = $Bounds[0]["X"]; - - $this->DataSet->Data["GraphArea"]["X1"] = $MinLeft; - } - - $AxisPos["L"] = $MinLeft - $ScaleSpacing; - } - elseif ( $Parameters["Position"] == AXIS_POSITION_RIGHT ) - { - if ( $LabelRotation == 0 ) { $LabelAlign = TEXT_ALIGN_MIDDLELEFT; $XLabelOffset = 2; } - if ( $LabelRotation > 0 && $LabelRotation < 190 ) { $LabelAlign = TEXT_ALIGN_MIDDLELEFT; $XLabelOffset = 6; } - if ( $LabelRotation == 180 ) { $LabelAlign = TEXT_ALIGN_MIDDLERIGHT; $XLabelOffset = 5; } - if ( $LabelRotation > 180 && $LabelRotation < 360 ) { $LabelAlign = TEXT_ALIGN_MIDDLERIGHT; $XLabelOffset = 7; } - - if ( !$RemoveXAxis ) - { - if ( $Floating ) - { $FloatingOffset = $YMargin; $this->drawLine($AxisPos["R"],$this->GraphAreaY1+$Parameters["Margin"],$AxisPos["R"],$this->GraphAreaY2-$Parameters["Margin"],array("R"=>$AxisR,"G"=>$AxisG,"B"=>$AxisB,"Alpha"=>$AxisAlpha)); } - else - { $FloatingOffset = 0; $this->drawLine($AxisPos["R"],$this->GraphAreaY1,$AxisPos["R"],$this->GraphAreaY2,array("R"=>$AxisR,"G"=>$AxisG,"B"=>$AxisB,"Alpha"=>$AxisAlpha)); } - - if ( $DrawArrows ) { $this->drawArrow($AxisPos["R"],$this->GraphAreaY2-$Parameters["Margin"],$AxisPos["R"],$this->GraphAreaY2+($ArrowSize*2),array("FillR"=>$AxisR,"FillG"=>$AxisG,"FillB"=>$AxisB,"Size"=>$ArrowSize)); } - } - - $Height = ($this->GraphAreaY2 - $this->GraphAreaY1) - $Parameters["Margin"]*2; - - if ($Parameters["Rows"] == 0 ) { $Step = $Height; } else { $Step = $Height / $Parameters["Rows"]; } - - $MaxRight = $AxisPos["R"]; - for($i=0;$i<=$Parameters["Rows"];$i++) - { - $YPos = $this->GraphAreaY1 + $Parameters["Margin"] + $Step*$i; - $XPos = $AxisPos["R"]; - - if ( $Abscissa != NULL ) - { if ( isset($Data["Series"][$Abscissa]["Data"][$i]) ) { $Value = $this->scaleFormat($Data["Series"][$Abscissa]["Data"][$i],$Data["XAxisDisplay"],$Data["XAxisFormat"],$Data["XAxisUnit"]); } else { $Value = ""; } } - else - { - if ( isset($Parameters["ScaleMin"]) && isset ($Parameters["RowHeight"]) ) - $Value = $this->scaleFormat($Parameters["ScaleMin"] + $Parameters["RowHeight"]*$i,$Data["XAxisDisplay"],$Data["XAxisFormat"],$Data["XAxisUnit"]); - else - $Value = $i; - } - - $ID++; $Skipped = TRUE; - if ( $this->isValidLabel($Value,$LastValue,$LabelingMethod,$ID,$LabelSkip) && !$RemoveXAxis) - { - $Bounds = $this->drawText($XPos+$OuterTickWidth+$XLabelOffset,$YPos,$Value,array("Angle"=>$LabelRotation,"Align"=>$LabelAlign)); - $TxtBox = $XPos+$OuterTickWidth+2+($Bounds[1]["X"]-$Bounds[0]["X"]); - $MaxRight = max($MaxRight,$TxtBox); - $LastValue = $Value; - $Skipped = FALSE; - } - - if ( $RemoveXAxis ) { $Skipped = FALSE; } - - if ( $Skipped ) - { - if ( $DrawXLines && !$RemoveSkippedAxis ) { $this->drawLine($this->GraphAreaX1+$FloatingOffset,$YPos,$this->GraphAreaX2-$FloatingOffset,$YPos,$SkippedAxisColor); } - if ( ($SkippedInnerTickWidth != 0 || $SkippedOuterTickWidth != 0) && !$RemoveXAxis && !$RemoveSkippedAxis ) { $this->drawLine($XPos+$SkippedOuterTickWidth,$YPos,$XPos-$SkippedInnerTickWidth,$YPos,$SkippedTickColor); } - } - else - { - if ( $DrawXLines ) { $this->drawLine($this->GraphAreaX1+$FloatingOffset,$YPos,$this->GraphAreaX2-$FloatingOffset,$YPos,array("R"=>$GridR,"G"=>$GridG,"B"=>$GridB,"Alpha"=>$GridAlpha,"Ticks"=>$GridTicks)); } - if ( ($InnerTickWidth != 0 || $OuterTickWidth != 0) && !$RemoveXAxis ) { $this->drawLine($XPos+$OuterTickWidth,$YPos,$XPos-$InnerTickWidth,$YPos,array("R"=>$TickR,"G"=>$TickG,"B"=>$TickB,"Alpha"=>$TickAlpha)); } - } - - } - - if ( isset($Parameters["Name"]) && !$RemoveXAxis) - { - $XPos = $MaxRight+4; - $YPos = $this->GraphAreaY1+($this->GraphAreaY2-$this->GraphAreaY1)/2; - $Bounds = $this->drawText($XPos,$YPos,$Parameters["Name"],array("Align"=>TEXT_ALIGN_BOTTOMMIDDLE,"Angle"=>270)); - $MaxRight = $Bounds[1]["X"]; - - $this->DataSet->Data["GraphArea"]["X2"] = $MaxRight + $this->FontSize; - } - - $AxisPos["R"] = $MaxRight + $ScaleSpacing; - } - } - } - - - - if ( $Parameters["Identity"] == AXIS_Y ) - { - if ( $Pos == SCALE_POS_LEFTRIGHT ) - { - if ( $Parameters["Position"] == AXIS_POSITION_LEFT ) - { - - if ( $Floating ) - { $FloatingOffset = $XMargin; $this->drawLine($AxisPos["L"],$this->GraphAreaY1+$Parameters["Margin"],$AxisPos["L"],$this->GraphAreaY2-$Parameters["Margin"],array("R"=>$AxisR,"G"=>$AxisG,"B"=>$AxisB,"Alpha"=>$AxisAlpha)); } - else - { $FloatingOffset = 0; $this->drawLine($AxisPos["L"],$this->GraphAreaY1,$AxisPos["L"],$this->GraphAreaY2,array("R"=>$AxisR,"G"=>$AxisG,"B"=>$AxisB,"Alpha"=>$AxisAlpha)); } - - if ( $DrawArrows ) { $this->drawArrow($AxisPos["L"],$this->GraphAreaY1+$Parameters["Margin"],$AxisPos["L"],$this->GraphAreaY1-($ArrowSize*2),array("FillR"=>$AxisR,"FillG"=>$AxisG,"FillB"=>$AxisB,"Size"=>$ArrowSize)); } - - $Height = ($this->GraphAreaY2 - $this->GraphAreaY1) - $Parameters["Margin"]*2; - $Step = $Height / $Parameters["Rows"]; $SubTicksSize = $Step /2; $MinLeft = $AxisPos["L"]; - $LastY = NULL; - for($i=0;$i<=$Parameters["Rows"];$i++) - { - $YPos = $this->GraphAreaY2 - $Parameters["Margin"] - $Step*$i; - $XPos = $AxisPos["L"]; - $Value = $this->scaleFormat($Parameters["ScaleMin"] + $Parameters["RowHeight"]*$i,$Parameters["Display"],$Parameters["Format"],$Parameters["Unit"]); - - if ( $i%2 == 1 ) { $BGColor = array("R"=>$BackgroundR1,"G"=>$BackgroundG1,"B"=>$BackgroundB1,"Alpha"=>$BackgroundAlpha1); } else { $BGColor = array("R"=>$BackgroundR2,"G"=>$BackgroundG2,"B"=>$BackgroundB2,"Alpha"=>$BackgroundAlpha2); } - if ( $LastY != NULL && $CycleBackground && ( $DrawYLines == ALL || in_array($AxisID,$DrawYLines) )) { $this->drawFilledRectangle($this->GraphAreaX1+$FloatingOffset,$LastY,$this->GraphAreaX2-$FloatingOffset,$YPos,$BGColor); } - - if ( $DrawYLines == ALL || in_array($AxisID,$DrawYLines) ) { $this->drawLine($this->GraphAreaX1+$FloatingOffset,$YPos,$this->GraphAreaX2-$FloatingOffset,$YPos,array("R"=>$GridR,"G"=>$GridG,"B"=>$GridB,"Alpha"=>$GridAlpha,"Ticks"=>$GridTicks)); } - - if ( $DrawSubTicks && $i != $Parameters["Rows"] ) - $this->drawLine($XPos-$OuterSubTickWidth,$YPos-$SubTicksSize,$XPos+$InnerSubTickWidth,$YPos-$SubTicksSize,array("R"=>$SubTickR,"G"=>$SubTickG,"B"=>$SubTickB,"Alpha"=>$SubTickAlpha)); - - $this->drawLine($XPos-$OuterTickWidth,$YPos,$XPos+$InnerTickWidth,$YPos,array("R"=>$TickR,"G"=>$TickG,"B"=>$TickB,"Alpha"=>$TickAlpha)); - $Bounds = $this->drawText($XPos-$OuterTickWidth-2,$YPos,$Value,array("Align"=>TEXT_ALIGN_MIDDLERIGHT)); - $TxtLeft = $XPos-$OuterTickWidth-2-($Bounds[1]["X"]-$Bounds[0]["X"]); - $MinLeft = min($MinLeft,$TxtLeft); - - $LastY = $YPos; - } - - if ( isset($Parameters["Name"]) ) - { - $XPos = $MinLeft-2; - $YPos = $this->GraphAreaY1+($this->GraphAreaY2-$this->GraphAreaY1)/2; - $Bounds = $this->drawText($XPos,$YPos,$Parameters["Name"],array("Align"=>TEXT_ALIGN_BOTTOMMIDDLE,"Angle"=>90)); - $MinLeft = $Bounds[2]["X"]; - - $this->DataSet->Data["GraphArea"]["X1"] = $MinLeft; - } - - $AxisPos["L"] = $MinLeft - $ScaleSpacing; - } - elseif ( $Parameters["Position"] == AXIS_POSITION_RIGHT ) - { - if ( $Floating ) - { $FloatingOffset = $XMargin; $this->drawLine($AxisPos["R"],$this->GraphAreaY1+$Parameters["Margin"],$AxisPos["R"],$this->GraphAreaY2-$Parameters["Margin"],array("R"=>$AxisR,"G"=>$AxisG,"B"=>$AxisB,"Alpha"=>$AxisAlpha)); } - else - { $FloatingOffset = 0; $this->drawLine($AxisPos["R"],$this->GraphAreaY1,$AxisPos["R"],$this->GraphAreaY2,array("R"=>$AxisR,"G"=>$AxisG,"B"=>$AxisB,"Alpha"=>$AxisAlpha)); } - - if ( $DrawArrows ) { $this->drawArrow($AxisPos["R"],$this->GraphAreaY1+$Parameters["Margin"],$AxisPos["R"],$this->GraphAreaY1-($ArrowSize*2),array("FillR"=>$AxisR,"FillG"=>$AxisG,"FillB"=>$AxisB,"Size"=>$ArrowSize)); } - - $Height = ($this->GraphAreaY2 - $this->GraphAreaY1) - $Parameters["Margin"]*2; - $Step = $Height / $Parameters["Rows"]; $SubTicksSize = $Step /2; $MaxLeft = $AxisPos["R"]; - $LastY = NULL; - for($i=0;$i<=$Parameters["Rows"];$i++) - { - $YPos = $this->GraphAreaY2 - $Parameters["Margin"] - $Step*$i; - $XPos = $AxisPos["R"]; - $Value = $this->scaleFormat($Parameters["ScaleMin"] + $Parameters["RowHeight"]*$i,$Parameters["Display"],$Parameters["Format"],$Parameters["Unit"]); - - if ( $i%2 == 1 ) { $BGColor = array("R"=>$BackgroundR1,"G"=>$BackgroundG1,"B"=>$BackgroundB1,"Alpha"=>$BackgroundAlpha1); } else { $BGColor = array("R"=>$BackgroundR2,"G"=>$BackgroundG2,"B"=>$BackgroundB2,"Alpha"=>$BackgroundAlpha2); } - if ( $LastY != NULL && $CycleBackground && ( $DrawYLines == ALL || in_array($AxisID,$DrawYLines) )) { $this->drawFilledRectangle($this->GraphAreaX1+$FloatingOffset,$LastY,$this->GraphAreaX2-$FloatingOffset,$YPos,$BGColor); } - - if ( $DrawYLines == ALL || in_array($AxisID,$DrawYLines) ) { $this->drawLine($this->GraphAreaX1+$FloatingOffset,$YPos,$this->GraphAreaX2-$FloatingOffset,$YPos,array("R"=>$GridR,"G"=>$GridG,"B"=>$GridB,"Alpha"=>$GridAlpha,"Ticks"=>$GridTicks)); } - - if ( $DrawSubTicks && $i != $Parameters["Rows"] ) - $this->drawLine($XPos-$OuterSubTickWidth,$YPos-$SubTicksSize,$XPos+$InnerSubTickWidth,$YPos-$SubTicksSize,array("R"=>$SubTickR,"G"=>$SubTickG,"B"=>$SubTickB,"Alpha"=>$SubTickAlpha)); - - $this->drawLine($XPos-$InnerTickWidth,$YPos,$XPos+$OuterTickWidth,$YPos,array("R"=>$TickR,"G"=>$TickG,"B"=>$TickB,"Alpha"=>$TickAlpha)); - $Bounds = $this->drawText($XPos+$OuterTickWidth+2,$YPos,$Value,array("Align"=>TEXT_ALIGN_MIDDLELEFT)); - $TxtLeft = $XPos+$OuterTickWidth+2+($Bounds[1]["X"]-$Bounds[0]["X"]); - $MaxLeft = max($MaxLeft,$TxtLeft); - - $LastY = $YPos; - } - - if ( isset($Parameters["Name"]) ) - { - $XPos = $MaxLeft+6; - $YPos = $this->GraphAreaY1+($this->GraphAreaY2-$this->GraphAreaY1)/2; - $Bounds = $this->drawText($XPos,$YPos,$Parameters["Name"],array("Align"=>TEXT_ALIGN_BOTTOMMIDDLE,"Angle"=>270)); - $MaxLeft = $Bounds[2]["X"]; - - $this->DataSet->Data["GraphArea"]["X2"] = $MaxLeft + $this->FontSize; - } - $AxisPos["R"] = $MaxLeft + $ScaleSpacing; - } - } - elseif ( $Pos == SCALE_POS_TOPBOTTOM ) - { - if ( $Parameters["Position"] == AXIS_POSITION_TOP ) - { - if ( $Floating ) - { $FloatingOffset = $XMargin; $this->drawLine($this->GraphAreaX1+$Parameters["Margin"],$AxisPos["T"],$this->GraphAreaX2-$Parameters["Margin"],$AxisPos["T"],array("R"=>$AxisR,"G"=>$AxisG,"B"=>$AxisB,"Alpha"=>$AxisAlpha)); } - else - { $FloatingOffset = 0; $this->drawLine($this->GraphAreaX1,$AxisPos["T"],$this->GraphAreaX2,$AxisPos["T"],array("R"=>$AxisR,"G"=>$AxisG,"B"=>$AxisB,"Alpha"=>$AxisAlpha)); } - - if ( $DrawArrows ) { $this->drawArrow($this->GraphAreaX2-$Parameters["Margin"],$AxisPos["T"],$this->GraphAreaX2+($ArrowSize*2),$AxisPos["T"],array("FillR"=>$AxisR,"FillG"=>$AxisG,"FillB"=>$AxisB,"Size"=>$ArrowSize)); } - - $Width = ($this->GraphAreaX2 - $this->GraphAreaX1) - $Parameters["Margin"]*2; - $Step = $Width / $Parameters["Rows"]; $SubTicksSize = $Step /2; $MinTop = $AxisPos["T"]; - $LastX = NULL; - for($i=0;$i<=$Parameters["Rows"];$i++) - { - $XPos = $this->GraphAreaX1 + $Parameters["Margin"] + $Step*$i; - $YPos = $AxisPos["T"]; - $Value = $this->scaleFormat($Parameters["ScaleMin"] + $Parameters["RowHeight"]*$i,$Parameters["Display"],$Parameters["Format"],$Parameters["Unit"]); - - if ( $i%2 == 1 ) { $BGColor = array("R"=>$BackgroundR1,"G"=>$BackgroundG1,"B"=>$BackgroundB1,"Alpha"=>$BackgroundAlpha1); } else { $BGColor = array("R"=>$BackgroundR2,"G"=>$BackgroundG2,"B"=>$BackgroundB2,"Alpha"=>$BackgroundAlpha2); } - if ( $LastX != NULL && $CycleBackground && ( $DrawYLines == ALL || in_array($AxisID,$DrawYLines) )) { $this->drawFilledRectangle($LastX,$this->GraphAreaY1+$FloatingOffset,$XPos,$this->GraphAreaY2-$FloatingOffset,$BGColor); } - - if ( $DrawYLines == ALL || in_array($AxisID,$DrawYLines) ) { $this->drawLine($XPos,$this->GraphAreaY1+$FloatingOffset,$XPos,$this->GraphAreaY2-$FloatingOffset,array("R"=>$GridR,"G"=>$GridG,"B"=>$GridB,"Alpha"=>$GridAlpha,"Ticks"=>$GridTicks)); } - - if ( $DrawSubTicks && $i != $Parameters["Rows"] ) - $this->drawLine($XPos+$SubTicksSize,$YPos-$OuterSubTickWidth,$XPos+$SubTicksSize,$YPos+$InnerSubTickWidth,array("R"=>$SubTickR,"G"=>$SubTickG,"B"=>$SubTickB,"Alpha"=>$SubTickAlpha)); - - $this->drawLine($XPos,$YPos-$OuterTickWidth,$XPos,$YPos+$InnerTickWidth,array("R"=>$TickR,"G"=>$TickG,"B"=>$TickB,"Alpha"=>$TickAlpha)); - $Bounds = $this->drawText($XPos,$YPos-$OuterTickWidth-2,$Value,array("Align"=>TEXT_ALIGN_BOTTOMMIDDLE)); - $TxtHeight = $YPos-$OuterTickWidth-2-($Bounds[1]["Y"]-$Bounds[2]["Y"]); - $MinTop = min($MinTop,$TxtHeight); - - $LastX = $XPos; - } - - if ( isset($Parameters["Name"]) ) - { - $YPos = $MinTop-2; - $XPos = $this->GraphAreaX1+($this->GraphAreaX2-$this->GraphAreaX1)/2; - $Bounds = $this->drawText($XPos,$YPos,$Parameters["Name"],array("Align"=>TEXT_ALIGN_BOTTOMMIDDLE)); - $MinTop = $Bounds[2]["Y"]; - - $this->DataSet->Data["GraphArea"]["Y1"] = $MinTop; - } - - $AxisPos["T"] = $MinTop - $ScaleSpacing; - } - elseif ( $Parameters["Position"] == AXIS_POSITION_BOTTOM ) - { - if ( $Floating ) - { $FloatingOffset = $XMargin; $this->drawLine($this->GraphAreaX1+$Parameters["Margin"],$AxisPos["B"],$this->GraphAreaX2-$Parameters["Margin"],$AxisPos["B"],array("R"=>$AxisR,"G"=>$AxisG,"B"=>$AxisB,"Alpha"=>$AxisAlpha)); } - else - { $FloatingOffset = 0; $this->drawLine($this->GraphAreaX1,$AxisPos["B"],$this->GraphAreaX2,$AxisPos["B"],array("R"=>$AxisR,"G"=>$AxisG,"B"=>$AxisB,"Alpha"=>$AxisAlpha)); } - - if ( $DrawArrows ) { $this->drawArrow($this->GraphAreaX2-$Parameters["Margin"],$AxisPos["B"],$this->GraphAreaX2+($ArrowSize*2),$AxisPos["B"],array("FillR"=>$AxisR,"FillG"=>$AxisG,"FillB"=>$AxisB,"Size"=>$ArrowSize)); } - - $Width = ($this->GraphAreaX2 - $this->GraphAreaX1) - $Parameters["Margin"]*2; - $Step = $Width / $Parameters["Rows"]; $SubTicksSize = $Step /2; $MaxBottom = $AxisPos["B"]; - $LastX = NULL; - for($i=0;$i<=$Parameters["Rows"];$i++) - { - $XPos = $this->GraphAreaX1 + $Parameters["Margin"] + $Step*$i; - $YPos = $AxisPos["B"]; - $Value = $this->scaleFormat($Parameters["ScaleMin"] + $Parameters["RowHeight"]*$i,$Parameters["Display"],$Parameters["Format"],$Parameters["Unit"]); - - if ( $i%2 == 1 ) { $BGColor = array("R"=>$BackgroundR1,"G"=>$BackgroundG1,"B"=>$BackgroundB1,"Alpha"=>$BackgroundAlpha1); } else { $BGColor = array("R"=>$BackgroundR2,"G"=>$BackgroundG2,"B"=>$BackgroundB2,"Alpha"=>$BackgroundAlpha2); } - if ( $LastX != NULL && $CycleBackground && ( $DrawYLines == ALL || in_array($AxisID,$DrawYLines) )) { $this->drawFilledRectangle($LastX,$this->GraphAreaY1+$FloatingOffset,$XPos,$this->GraphAreaY2-$FloatingOffset,$BGColor); } - - if ( $DrawYLines == ALL || in_array($AxisID,$DrawYLines) ) { $this->drawLine($XPos,$this->GraphAreaY1+$FloatingOffset,$XPos,$this->GraphAreaY2-$FloatingOffset,array("R"=>$GridR,"G"=>$GridG,"B"=>$GridB,"Alpha"=>$GridAlpha,"Ticks"=>$GridTicks)); } - - if ( $DrawSubTicks && $i != $Parameters["Rows"] ) - $this->drawLine($XPos+$SubTicksSize,$YPos-$OuterSubTickWidth,$XPos+$SubTicksSize,$YPos+$InnerSubTickWidth,array("R"=>$SubTickR,"G"=>$SubTickG,"B"=>$SubTickB,"Alpha"=>$SubTickAlpha)); - - $this->drawLine($XPos,$YPos-$OuterTickWidth,$XPos,$YPos+$InnerTickWidth,array("R"=>$TickR,"G"=>$TickG,"B"=>$TickB,"Alpha"=>$TickAlpha)); - $Bounds = $this->drawText($XPos,$YPos+$OuterTickWidth+2,$Value,array("Align"=>TEXT_ALIGN_TOPMIDDLE)); - $TxtHeight = $YPos+$OuterTickWidth+2+($Bounds[1]["Y"]-$Bounds[2]["Y"]); - $MaxBottom = max($MaxBottom,$TxtHeight); - - $LastX = $XPos; - } - - if ( isset($Parameters["Name"]) ) - { - $YPos = $MaxBottom+2; - $XPos = $this->GraphAreaX1+($this->GraphAreaX2-$this->GraphAreaX1)/2; - $Bounds = $this->drawText($XPos,$YPos,$Parameters["Name"],array("Align"=>TEXT_ALIGN_TOPMIDDLE)); - $MaxBottom = $Bounds[0]["Y"]; - - $this->DataSet->Data["GraphArea"]["Y2"] = $MaxBottom + $this->FontSize; - } - - $AxisPos["B"] = $MaxBottom + $ScaleSpacing; - } - } - } - } - } - - function isValidLabel($Value,$LastValue,$LabelingMethod,$ID,$LabelSkip) - { - if ( $LabelingMethod == LABELING_DIFFERENT && $Value != $LastValue ) { return(TRUE); } - if ( $LabelingMethod == LABELING_DIFFERENT && $Value == $LastValue ) { return(FALSE); } - if ( $LabelingMethod == LABELING_ALL && $LabelSkip == 0 ) { return(TRUE); } - if ( $LabelingMethod == LABELING_ALL && ($ID+$LabelSkip) % ($LabelSkip+1) != 1 ) { return(FALSE); } - - return(TRUE); - } - - /* Compute the scale, check for the best visual factors */ - function computeScale($XMin,$XMax,$MaxDivs,$Factors,$AxisID=0) - { - /* Compute each factors */ - $Results = ""; - foreach ($Factors as $Key => $Factor) - $Results[$Factor] = $this->processScale($XMin,$XMax,$MaxDivs,array($Factor),$AxisID); - - /* Remove scales that are creating to much decimals */ - $GoodScaleFactors = ""; - foreach ($Results as $Key => $Result) - { - $Decimals = preg_split("/\./",$Result["RowHeight"]); - if ( (!isset($Decimals[1])) || (strlen($Decimals[1]) < 6) ) { $GoodScaleFactors[] = $Key; } - } - - /* Found no correct scale, shame,... returns the 1st one as default */ - if ( $GoodScaleFactors == "" ) { return($Results[$Factors[0]]); } - - /* Find the factor that cause the maximum number of Rows */ - $MaxRows = 0; $BestFactor = 0; - foreach($GoodScaleFactors as $Key => $Factor) - { if ( $Results[$Factor]["Rows"] > $MaxRows ) { $MaxRows = $Results[$Factor]["Rows"]; $BestFactor = $Factor; } } - - /* Return the best visual scale */ - return($Results[$BestFactor]); - } - - /* Compute the best matching scale based on size & factors */ - function processScale($XMin,$XMax,$MaxDivs,$Factors,$AxisID) - { - $ScaleHeight = abs(ceil($XMax)-floor($XMin)); - - if ( isset($this->DataSet->Data["Axis"][$AxisID]["Format"]) ) - $Format = $this->DataSet->Data["Axis"][$AxisID]["Format"]; - else - $Format = NULL; - - if ( isset($this->DataSet->Data["Axis"][$AxisID]["Display"]) ) - $Mode = $this->DataSet->Data["Axis"][$AxisID]["Display"]; - else - $Mode = AXIS_FORMAT_DEFAULT; - - $Scale = ""; - if ( $XMin != $XMax ) - { - $Found = FALSE; $Rescaled = FALSE; $Scaled10Factor = .0001; $Result = 0; - while(!$Found) - { - foreach($Factors as $Key => $Factor) - { - if ( !$Found ) - { - if ( !($this->modulo($XMin,$Factor*$Scaled10Factor) == 0) || ($XMin != floor($XMin))) { $XMinRescaled = floor($XMin/($Factor*$Scaled10Factor))*$Factor*$Scaled10Factor; } else { $XMinRescaled = $XMin; } - if ( !($this->modulo($XMax,$Factor*$Scaled10Factor) == 0) || ($XMax != floor($XMax))) { $XMaxRescaled = floor($XMax/($Factor*$Scaled10Factor))*$Factor*$Scaled10Factor+($Factor*$Scaled10Factor); } else { $XMaxRescaled = $XMax; } - $ScaleHeightRescaled = abs($XMaxRescaled-$XMinRescaled); - - if ( !$Found && floor($ScaleHeightRescaled/($Factor*$Scaled10Factor)) <= $MaxDivs ) { $Found = TRUE; $Rescaled = TRUE; $Result = $Factor * $Scaled10Factor; } - } - } - $Scaled10Factor = $Scaled10Factor * 10; - } - - /* ReCall Min / Max / Height */ - if ( $Rescaled ) { $XMin = $XMinRescaled; $XMax = $XMaxRescaled; $ScaleHeight = $ScaleHeightRescaled; } - - /* Compute rows size */ - $Rows = floor($ScaleHeight / $Result); if ( $Rows == 0 ) { $Rows = 1; } - $RowHeight = $ScaleHeight / $Rows; - - /* Return the results */ - $Scale["Rows"] = $Rows; $Scale["RowHeight"] = $RowHeight; $Scale["XMin"] = $XMin; $Scale["XMax"] = $XMax; - - /* Compute the needed decimals for the metric view to avoid repetition of the same X Axis labels */ - if ( $Mode == AXIS_FORMAT_METRIC && $Format == NULL ) - { - $Done = FALSE; $GoodDecimals = 0; - for($Decimals=0;$Decimals<=10;$Decimals++) - { - if ( !$Done ) - { - $LastLabel = "zob"; $ScaleOK = TRUE; - for($i=0;$i<=$Rows;$i++) - { - $Value = $XMin + $i*$RowHeight; - $Label = $this->scaleFormat($Value,AXIS_FORMAT_METRIC,$Decimals); - - if ( $LastLabel == $Label ) { $ScaleOK = FALSE; } - $LastLabel = $Label; - } - if ( $ScaleOK ) { $Done = TRUE; $GoodDecimals = $Decimals; } - } - } - - $Scale["Format"] = $GoodDecimals; - } - } - else - { - /* If all values are the same we keep a +1/-1 scale */ - $Rows = 2; $XMin = $XMax-1; $XMax = $XMax+1; $RowHeight = 1; - - /* Return the results */ - $Scale["Rows"] = $Rows; $Scale["RowHeight"] = $RowHeight; $Scale["XMin"] = $XMin; $Scale["XMax"] = $XMax; - } - - return($Scale); - } - - function modulo($Value1,$Value2) - { - if (floor($Value2) == 0) { return(0); } - if (floor($Value2) != 0) { return($Value1 % $Value2); } - - $MinValue = min($Value1,$Value2); $Factor = 10; - while ( floor($MinValue*$Factor) == 0 ) - { $Factor = $Factor * 10; } - - return(($Value1*$Factor) % ($Value2*$Factor)); - } - - /* Draw an X threshold */ - function drawXThreshold($Value,$Format="") - { - $R = isset($Format["R"]) ? $Format["R"] : 255; - $G = isset($Format["G"]) ? $Format["G"] : 0; - $B = isset($Format["B"]) ? $Format["B"] : 0; - $Alpha = isset($Format["Alpha"]) ? $Format["Alpha"] : 50; - $Weight = isset($Format["Weight"]) ? $Format["Weight"] : NULL; - $Ticks = isset($Format["Ticks"]) ? $Format["Ticks"] : 6; - $Wide = isset($Format["Wide"]) ? $Format["Wide"] : FALSE; - $WideFactor = isset($Format["WideFactor"]) ? $Format["WideFactor"] : 5; - $WriteCaption = isset($Format["WriteCaption"]) ? $Format["WriteCaption"] : FALSE; - $Caption = isset($Format["Caption"]) ? $Format["Caption"] : NULL; - $CaptionAlign = isset($Format["CaptionAlign"]) ? $Format["CaptionAlign"] : CAPTION_LEFT_TOP; - $CaptionOffset = isset($Format["CaptionOffset"]) ? $Format["CaptionOffset"] : 5; - $CaptionR = isset($Format["CaptionR"]) ? $Format["CaptionR"] : 255; - $CaptionG = isset($Format["CaptionG"]) ? $Format["CaptionG"] : 255; - $CaptionB = isset($Format["CaptionB"]) ? $Format["CaptionB"] : 255; - $CaptionAlpha = isset($Format["CaptionAlpha"]) ? $Format["CaptionAlpha"] : 100; - $DrawBox = isset($Format["DrawBox"]) ? $Format["DrawBox"] : TRUE; - $DrawBoxBorder = isset($Format["DrawBoxBorder"]) ? $Format["DrawBoxBorder"] : FALSE; - $BorderOffset = isset($Format["BorderOffset"]) ? $Format["BorderOffset"] : 3; - $BoxRounded = isset($Format["BoxRounded"]) ? $Format["BoxRounded"] : TRUE; - $RoundedRadius = isset($Format["RoundedRadius"]) ? $Format["RoundedRadius"] : 3; - $BoxR = isset($Format["BoxR"]) ? $Format["BoxR"] : 0; - $BoxG = isset($Format["BoxG"]) ? $Format["BoxG"] : 0; - $BoxB = isset($Format["BoxB"]) ? $Format["BoxB"] : 0; - $BoxAlpha = isset($Format["BoxAlpha"]) ? $Format["BoxAlpha"] : 30; - $BoxSurrounding = isset($Format["BoxSurrounding"]) ? $Format["BoxSurrounding"] : ""; - $BoxBorderR = isset($Format["BoxBorderR"]) ? $Format["BoxBorderR"] : 255; - $BoxBorderG = isset($Format["BoxBorderG"]) ? $Format["BoxBorderG"] : 255; - $BoxBorderB = isset($Format["BoxBorderB"]) ? $Format["BoxBorderB"] : 255; - $BoxBorderAlpha = isset($Format["BoxBorderAlpha"]) ? $Format["BoxBorderAlpha"] : 100; - $ValueIsLabel = isset($Format["ValueIsLabel"]) ? $Format["ValueIsLabel"] : FALSE; - - $Data = $this->DataSet->getData(); - $AbscissaMargin = $this->getAbscissaMargin($Data); - $XScale = $this->scaleGetXSettings(); - - if ( is_array($Value) ) { foreach ($Value as $Key => $ID) { $this->drawXThreshold($ID,$Format); } return(0); } - - if ( $ValueIsLabel ) - { - $Format["ValueIsLabel"] = FALSE; - foreach($Data["Series"][$Data["Abscissa"]]["Data"] as $Key => $SerieValue) - { if ( $SerieValue == $Value ) { $this->drawXThreshold($Key,$Format); } } - - return(0); - } - - $CaptionSettings = array("DrawBox"=>$DrawBox,"DrawBoxBorder"=>$DrawBoxBorder,"BorderOffset"=>$BorderOffset,"BoxRounded"=>$BoxRounded,"RoundedRadius"=>$RoundedRadius, - "BoxR"=>$BoxR,"BoxG"=>$BoxG,"BoxB"=>$BoxB,"BoxAlpha"=>$BoxAlpha,"BoxSurrounding"=>$BoxSurrounding, - "BoxBorderR"=>$BoxBorderR,"BoxBorderG"=>$BoxBorderG,"BoxBorderB"=>$BoxBorderB,"BoxBorderAlpha"=>$BoxBorderAlpha, - "R"=>$CaptionR,"G"=>$CaptionG,"B"=>$CaptionB,"Alpha"=>$CaptionAlpha); - - if ( $Caption == NULL ) - { - if ( isset($Data["Abscissa"]) ) - { - if ( isset($Data["Series"][$Data["Abscissa"]]["Data"][$Value]) ) - $Caption = $Data["Series"][$Data["Abscissa"]]["Data"][$Value]; - else - $Caption = $Value; - } - else - $Caption = $Value; - } - - if ( $Data["Orientation"] == SCALE_POS_LEFTRIGHT ) - { - $XStep = (($this->GraphAreaX2 - $this->GraphAreaX1) - $XScale[0] *2 ) / $XScale[1]; - $XPos = $this->GraphAreaX1 + $XScale[0] + $XStep * $Value; - $YPos1 = $this->GraphAreaY1 + $Data["YMargin"]; - $YPos2 = $this->GraphAreaY2 - $Data["YMargin"]; - - if ( $XPos >= $this->GraphAreaX1 + $AbscissaMargin && $XPos <= $this->GraphAreaX2 - $AbscissaMargin ) - { - $this->drawLine($XPos,$YPos1,$XPos,$YPos2,array("R"=>$R,"G"=>$G,"B"=>$B,"Alpha"=>$Alpha,"Ticks"=>$Ticks,"Weight"=>$Weight)); - - if ( $Wide ) - { - $this->drawLine($XPos-1,$YPos1,$XPos-1,$YPos2,array("R"=>$R,"G"=>$G,"B"=>$B,"Alpha"=>$Alpha/$WideFactor,"Ticks"=>$Ticks)); - $this->drawLine($XPos+1,$YPos1,$XPos+1,$YPos2,array("R"=>$R,"G"=>$G,"B"=>$B,"Alpha"=>$Alpha/$WideFactor,"Ticks"=>$Ticks)); - } - - if ( $WriteCaption ) - { - if ( $CaptionAlign == CAPTION_LEFT_TOP ) - { $Y = $YPos1 + $CaptionOffset; $CaptionSettings["Align"] = TEXT_ALIGN_TOPMIDDLE; } - else - { $Y = $YPos2 - $CaptionOffset; $CaptionSettings["Align"] = TEXT_ALIGN_BOTTOMMIDDLE; } - - $this->drawText($XPos,$Y,$Caption,$CaptionSettings); - } - - return(array("X"=>$XPos)); - } - } - elseif( $Data["Orientation"] == SCALE_POS_TOPBOTTOM ) - { - $XStep = (($this->GraphAreaY2 - $this->GraphAreaY1) - $XScale[0] *2 ) / $XScale[1]; - $XPos = $this->GraphAreaY1 + $XScale[0] + $XStep * $Value; - $YPos1 = $this->GraphAreaX1 + $Data["YMargin"]; - $YPos2 = $this->GraphAreaX2 - $Data["YMargin"]; - - if ( $XPos >= $this->GraphAreaY1 + $AbscissaMargin && $XPos <= $this->GraphAreaY2 - $AbscissaMargin ) - { - $this->drawLine($YPos1,$XPos,$YPos2,$XPos,array("R"=>$R,"G"=>$G,"B"=>$B,"Alpha"=>$Alpha,"Ticks"=>$Ticks,"Weight"=>$Weight)); - - if ( $Wide ) - { - $this->drawLine($YPos1,$XPos-1,$YPos2,$XPos-1,array("R"=>$R,"G"=>$G,"B"=>$B,"Alpha"=>$Alpha/$WideFactor,"Ticks"=>$Ticks)); - $this->drawLine($YPos1,$XPos+1,$YPos2,$XPos+1,array("R"=>$R,"G"=>$G,"B"=>$B,"Alpha"=>$Alpha/$WideFactor,"Ticks"=>$Ticks)); - } - - if ( $WriteCaption ) - { - if ( $CaptionAlign == CAPTION_LEFT_TOP ) - { $Y = $YPos1 + $CaptionOffset; $CaptionSettings["Align"] = TEXT_ALIGN_MIDDLELEFT; } - else - { $Y = $YPos2 - $CaptionOffset; $CaptionSettings["Align"] = TEXT_ALIGN_MIDDLERIGHT; } - - $this->drawText($Y,$XPos,$Caption,$CaptionSettings); - } - - return(array("X"=>$XPos)); - } - } - } - - /* Draw an X threshold area */ - function drawXThresholdArea($Value1,$Value2,$Format="") - { - $R = isset($Format["R"]) ? $Format["R"] : 255; - $G = isset($Format["G"]) ? $Format["G"] : 0; - $B = isset($Format["B"]) ? $Format["B"] : 0; - $Alpha = isset($Format["Alpha"]) ? $Format["Alpha"] : 20; - $Border = isset($Format["Border"]) ? $Format["Border"] : TRUE; - $BorderR = isset($Format["BorderR"]) ? $Format["BorderR"] : $R; - $BorderG = isset($Format["BorderG"]) ? $Format["BorderG"] : $G; - $BorderB = isset($Format["BorderB"]) ? $Format["BorderB"] : $B; - $BorderAlpha = isset($Format["BorderAlpha"]) ? $Format["BorderAlpha"] : $Alpha + 20; - $BorderTicks = isset($Format["BorderTicks"]) ? $Format["BorderTicks"] : 2; - $AreaName = isset($Format["AreaName"]) ? $Format["AreaName"] : NULL; - $NameAngle = isset($Format["NameAngle"]) ? $Format["NameAngle"] : ZONE_NAME_ANGLE_AUTO; - $NameR = isset($Format["NameR"]) ? $Format["NameR"] : 255; - $NameG = isset($Format["NameG"]) ? $Format["NameG"] : 255; - $NameB = isset($Format["NameB"]) ? $Format["NameB"] : 255; - $NameAlpha = isset($Format["NameAlpha"]) ? $Format["NameAlpha"] : 100; - $DisableShadowOnArea = isset($Format["DisableShadowOnArea"]) ? $Format["DisableShadowOnArea"] : TRUE; - - $RestoreShadow = $this->Shadow; - if ( $DisableShadowOnArea && $this->Shadow ) { $this->Shadow = FALSE; } - - if ($BorderAlpha >100) { $BorderAlpha = 100;} - - $Data = $this->DataSet->getData(); - $XScale = $this->scaleGetXSettings(); - $AbscissaMargin = $this->getAbscissaMargin($Data); - - if ( $Data["Orientation"] == SCALE_POS_LEFTRIGHT ) - { - $XStep = (($this->GraphAreaX2 - $this->GraphAreaX1) - $XScale[0] *2 ) / $XScale[1]; - $XPos1 = $this->GraphAreaX1 + $XScale[0] + $XStep * $Value1; - $XPos2 = $this->GraphAreaX1 + $XScale[0] + $XStep * $Value2; - $YPos1 = $this->GraphAreaY1 + $Data["YMargin"]; - $YPos2 = $this->GraphAreaY2 - $Data["YMargin"]; - - if ( $XPos1 < $this->GraphAreaX1 + $XScale[0] ) { $XPos1 = $this->GraphAreaX1 + $XScale[0]; } - if ( $XPos1 > $this->GraphAreaX2 - $XScale[0] ) { $XPos1 = $this->GraphAreaX2 - $XScale[0]; } - if ( $XPos2 < $this->GraphAreaX1 + $XScale[0] ) { $XPos2 = $this->GraphAreaX1 + $XScale[0]; } - if ( $XPos2 > $this->GraphAreaX2 - $XScale[0] ) { $XPos2 = $this->GraphAreaX2 - $XScale[0]; } - - $this->drawFilledRectangle($XPos1,$YPos1,$XPos2,$YPos2,array("R"=>$R,"G"=>$G,"B"=>$B,"Alpha"=>$Alpha)); - - if ( $Border ) - { - $this->drawLine($XPos1,$YPos1,$XPos1,$YPos2,array("R"=>$BorderR,"G"=>$BorderG,"B"=>$BorderB,"Alpha"=>$BorderAlpha,"Ticks"=>$BorderTicks)); - $this->drawLine($XPos2,$YPos1,$XPos2,$YPos2,array("R"=>$BorderR,"G"=>$BorderG,"B"=>$BorderB,"Alpha"=>$BorderAlpha,"Ticks"=>$BorderTicks)); - } - - if ( $AreaName != NULL ) - { - $XPos = ($XPos2-$XPos1)/2 + $XPos1; - $YPos = ($YPos2-$YPos1)/2 + $YPos1; - - if ( $NameAngle == ZONE_NAME_ANGLE_AUTO ) - { - $TxtPos = $this->getTextBox($XPos,$YPos,$this->FontName,$this->FontSize,0,$AreaName); - $TxtWidth = $TxtPos[1]["X"] - $TxtPos[0]["X"]; - if ( abs($XPos2 - $XPos1) > $TxtWidth ) { $NameAngle = 0; } else { $NameAngle = 90; } - } - $this->Shadow = $RestoreShadow; - $this->drawText($XPos,$YPos,$AreaName,array("R"=>$NameR,"G"=>$NameG,"B"=>$NameB,"Alpha"=>$NameAlpha,"Angle"=>$NameAngle,"Align"=>TEXT_ALIGN_MIDDLEMIDDLE)); - if ( $DisableShadowOnArea ) { $this->Shadow = FALSE; } - } - - $this->Shadow = $RestoreShadow; - return(array("X1"=>$XPos1,"X2"=>$XPos2)); - } - elseif ( $Data["Orientation"] == SCALE_POS_TOPBOTTOM ) - { - $XStep = (($this->GraphAreaY2 - $this->GraphAreaY1) - $XScale[0] *2 ) / $XScale[1]; - $XPos1 = $this->GraphAreaY1 + $XScale[0] + $XStep * $Value1; - $XPos2 = $this->GraphAreaY1 + $XScale[0] + $XStep * $Value2; - $YPos1 = $this->GraphAreaX1 + $Data["YMargin"]; - $YPos2 = $this->GraphAreaX2 - $Data["YMargin"]; - - if ( $XPos1 < $this->GraphAreaY1 + $XScale[0] ) { $XPos1 = $this->GraphAreaY1 + $XScale[0]; } - if ( $XPos1 > $this->GraphAreaY2 - $XScale[0] ) { $XPos1 = $this->GraphAreaY2 - $XScale[0]; } - if ( $XPos2 < $this->GraphAreaY1 + $XScale[0] ) { $XPos2 = $this->GraphAreaY1 + $XScale[0]; } - if ( $XPos2 > $this->GraphAreaY2 - $XScale[0] ) { $XPos2 = $this->GraphAreaY2 - $XScale[0]; } - - $this->drawFilledRectangle($YPos1,$XPos1,$YPos2,$XPos2,array("R"=>$R,"G"=>$G,"B"=>$B,"Alpha"=>$Alpha)); - - if ( $Border ) - { - $this->drawLine($YPos1,$XPos1,$YPos2,$XPos1,array("R"=>$BorderR,"G"=>$BorderG,"B"=>$BorderB,"Alpha"=>$BorderAlpha,"Ticks"=>$BorderTicks)); - $this->drawLine($YPos1,$XPos2,$YPos2,$XPos2,array("R"=>$BorderR,"G"=>$BorderG,"B"=>$BorderB,"Alpha"=>$BorderAlpha,"Ticks"=>$BorderTicks)); - } - - if ( $AreaName != NULL ) - { - $XPos = ($XPos2-$XPos1)/2 + $XPos1; - $YPos = ($YPos2-$YPos1)/2 + $YPos1; - - $this->Shadow = $RestoreShadow; - $this->drawText($YPos,$XPos,$AreaName,array("R"=>$NameR,"G"=>$NameG,"B"=>$NameB,"Alpha"=>$NameAlpha,"Angle"=>0,"Align"=>TEXT_ALIGN_MIDDLEMIDDLE)); - if ( $DisableShadowOnArea ) { $this->Shadow = FALSE; } - } - - $this->Shadow = $RestoreShadow; - return(array("X1"=>$XPos1,"X2"=>$XPos2)); - } - } - - /* Draw an Y threshold with the computed scale */ - function drawThreshold($Value,$Format="") - { - $AxisID = isset($Format["AxisID"]) ? $Format["AxisID"] : 0; - $R = isset($Format["R"]) ? $Format["R"] : 255; - $G = isset($Format["G"]) ? $Format["G"] : 0; - $B = isset($Format["B"]) ? $Format["B"] : 0; - $Alpha = isset($Format["Alpha"]) ? $Format["Alpha"] : 50; - $Weight = isset($Format["Weight"]) ? $Format["Weight"] : NULL; - $Ticks = isset($Format["Ticks"]) ? $Format["Ticks"] : 6; - $Wide = isset($Format["Wide"]) ? $Format["Wide"] : FALSE; - $WideFactor = isset($Format["WideFactor"]) ? $Format["WideFactor"] : 5; - $WriteCaption = isset($Format["WriteCaption"]) ? $Format["WriteCaption"] : FALSE; - $Caption = isset($Format["Caption"]) ? $Format["Caption"] : NULL; - $CaptionAlign = isset($Format["CaptionAlign"]) ? $Format["CaptionAlign"] : CAPTION_LEFT_TOP; - $CaptionOffset = isset($Format["CaptionOffset"]) ? $Format["CaptionOffset"] : 10; - $CaptionR = isset($Format["CaptionR"]) ? $Format["CaptionR"] : 255; - $CaptionG = isset($Format["CaptionG"]) ? $Format["CaptionG"] : 255; - $CaptionB = isset($Format["CaptionB"]) ? $Format["CaptionB"] : 255; - $CaptionAlpha = isset($Format["CaptionAlpha"]) ? $Format["CaptionAlpha"] : 100; - $DrawBox = isset($Format["DrawBox"]) ? $Format["DrawBox"] : TRUE; - $DrawBoxBorder = isset($Format["DrawBoxBorder"]) ? $Format["DrawBoxBorder"] : FALSE; - $BorderOffset = isset($Format["BorderOffset"]) ? $Format["BorderOffset"] : 5; - $BoxRounded = isset($Format["BoxRounded"]) ? $Format["BoxRounded"] : TRUE; - $RoundedRadius = isset($Format["RoundedRadius"]) ? $Format["RoundedRadius"] : 3; - $BoxR = isset($Format["BoxR"]) ? $Format["BoxR"] : 0; - $BoxG = isset($Format["BoxG"]) ? $Format["BoxG"] : 0; - $BoxB = isset($Format["BoxB"]) ? $Format["BoxB"] : 0; - $BoxAlpha = isset($Format["BoxAlpha"]) ? $Format["BoxAlpha"] : 20; - $BoxSurrounding = isset($Format["BoxSurrounding"]) ? $Format["BoxSurrounding"] : ""; - $BoxBorderR = isset($Format["BoxBorderR"]) ? $Format["BoxBorderR"] : 255; - $BoxBorderG = isset($Format["BoxBorderG"]) ? $Format["BoxBorderG"] : 255; - $BoxBorderB = isset($Format["BoxBorderB"]) ? $Format["BoxBorderB"] : 255; - $BoxBorderAlpha = isset($Format["BoxBorderAlpha"]) ? $Format["BoxBorderAlpha"] : 100; - $NoMargin = isset($Format["NoMargin"]) ? $Format["NoMargin"] : FALSE; - - if ( is_array($Value) ) { foreach ($Value as $Key => $ID) { $this->drawThreshold($ID,$Format); } return(0); } - - $CaptionSettings = array("DrawBox"=>$DrawBox,"DrawBoxBorder"=>$DrawBoxBorder,"BorderOffset"=>$BorderOffset,"BoxRounded"=>$BoxRounded,"RoundedRadius"=>$RoundedRadius, - "BoxR"=>$BoxR,"BoxG"=>$BoxG,"BoxB"=>$BoxB,"BoxAlpha"=>$BoxAlpha,"BoxSurrounding"=>$BoxSurrounding, - "BoxBorderR"=>$BoxBorderR,"BoxBorderG"=>$BoxBorderG,"BoxBorderB"=>$BoxBorderB,"BoxBorderAlpha"=>$BoxBorderAlpha, - "R"=>$CaptionR,"G"=>$CaptionG,"B"=>$CaptionB,"Alpha"=>$CaptionAlpha); - - $Data = $this->DataSet->getData(); - $AbscissaMargin = $this->getAbscissaMargin($Data); - - if ( $NoMargin ) { $AbscissaMargin = 0; } - if ( !isset($Data["Axis"][$AxisID]) ) { return(-1); } - if ( $Caption == NULL ) { $Caption = $Value; } - - if ( $Data["Orientation"] == SCALE_POS_LEFTRIGHT ) - { - $YPos = $this->scaleComputeY($Value,array("AxisID"=>$AxisID)); - if ( $YPos >= $this->GraphAreaY1+$Data["Axis"][$AxisID]["Margin"] && $YPos <= $this->GraphAreaY2-$Data["Axis"][$AxisID]["Margin"] ) - { - $X1 = $this->GraphAreaX1 + $AbscissaMargin; - $X2 = $this->GraphAreaX2 - $AbscissaMargin; - - $this->drawLine($X1,$YPos,$X2,$YPos,array("R"=>$R,"G"=>$G,"B"=>$B,"Alpha"=>$Alpha,"Ticks"=>$Ticks,"Weight"=>$Weight)); - - if ( $Wide ) - { - $this->drawLine($X1,$YPos-1,$X2,$YPos-1,array("R"=>$R,"G"=>$G,"B"=>$B,"Alpha"=>$Alpha/$WideFactor,"Ticks"=>$Ticks)); - $this->drawLine($X1,$YPos+1,$X2,$YPos+1,array("R"=>$R,"G"=>$G,"B"=>$B,"Alpha"=>$Alpha/$WideFactor,"Ticks"=>$Ticks)); - } - - if ( $WriteCaption ) - { - if ( $CaptionAlign == CAPTION_LEFT_TOP ) - { $X = $X1 + $CaptionOffset; $CaptionSettings["Align"] = TEXT_ALIGN_MIDDLELEFT; } - else - { $X = $X2 - $CaptionOffset; $CaptionSettings["Align"] = TEXT_ALIGN_MIDDLERIGHT; } - - $this->drawText($X,$YPos,$Caption,$CaptionSettings); - } - } - - return(array("Y"=>$YPos)); - } - - if ( $Data["Orientation"] == SCALE_POS_TOPBOTTOM ) - { - $XPos = $this->scaleComputeY($Value,array("AxisID"=>$AxisID)); - if ( $XPos >= $this->GraphAreaX1+$Data["Axis"][$AxisID]["Margin"] && $XPos <= $this->GraphAreaX2-$Data["Axis"][$AxisID]["Margin"] ) - { - $Y1 = $this->GraphAreaY1 + $AbscissaMargin; - $Y2 = $this->GraphAreaY2 - $AbscissaMargin; - - $this->drawLine($XPos,$Y1,$XPos,$Y2,array("R"=>$R,"G"=>$G,"B"=>$B,"Alpha"=>$Alpha,"Ticks"=>$Ticks,"Weight"=>$Weight)); - - if ( $Wide ) - { - $this->drawLine($XPos-1,$Y1,$XPos-1,$Y2,array("R"=>$R,"G"=>$G,"B"=>$B,"Alpha"=>$Alpha/$WideFactor,"Ticks"=>$Ticks)); - $this->drawLine($XPos+1,$Y1,$XPos+1,$Y2,array("R"=>$R,"G"=>$G,"B"=>$B,"Alpha"=>$Alpha/$WideFactor,"Ticks"=>$Ticks)); - } - - if ( $WriteCaption ) - { - if ( $CaptionAlign == CAPTION_LEFT_TOP ) - { $Y = $Y1 + $CaptionOffset; $CaptionSettings["Align"] = TEXT_ALIGN_TOPMIDDLE; } - else - { $Y = $Y2 - $CaptionOffset; $CaptionSettings["Align"] = TEXT_ALIGN_BOTTOMMIDDLE; } - - $CaptionSettings["Align"] = TEXT_ALIGN_TOPMIDDLE; - $this->drawText($XPos,$Y,$Caption,$CaptionSettings); - } - } - - return(array("Y"=>$XPos)); - } - } - - /* Draw a threshold with the computed scale */ - function drawThresholdArea($Value1,$Value2,$Format="") - { - $AxisID = isset($Format["AxisID"]) ? $Format["AxisID"] : 0; - $R = isset($Format["R"]) ? $Format["R"] : 255; - $G = isset($Format["G"]) ? $Format["G"] : 0; - $B = isset($Format["B"]) ? $Format["B"] : 0; - $Alpha = isset($Format["Alpha"]) ? $Format["Alpha"] : 20; - $Border = isset($Format["Border"]) ? $Format["Border"] : TRUE; - $BorderR = isset($Format["BorderR"]) ? $Format["BorderR"] : $R; - $BorderG = isset($Format["BorderG"]) ? $Format["BorderG"] : $G; - $BorderB = isset($Format["BorderB"]) ? $Format["BorderB"] : $B; - $BorderAlpha = isset($Format["BorderAlpha"]) ? $Format["BorderAlpha"] : $Alpha + 20; - $BorderTicks = isset($Format["BorderTicks"]) ? $Format["BorderTicks"] : 2; - $AreaName = isset($Format["AreaName"]) ? $Format["AreaName"] : NULL; - $NameAngle = isset($Format["NameAngle"]) ? $Format["NameAngle"] : ZONE_NAME_ANGLE_AUTO; - $NameR = isset($Format["NameR"]) ? $Format["NameR"] : 255; - $NameG = isset($Format["NameG"]) ? $Format["NameG"] : 255; - $NameB = isset($Format["NameB"]) ? $Format["NameB"] : 255; - $NameAlpha = isset($Format["NameAlpha"]) ? $Format["NameAlpha"] : 100; - $DisableShadowOnArea = isset($Format["DisableShadowOnArea"]) ? $Format["DisableShadowOnArea"] : TRUE; - $NoMargin = isset($Format["NoMargin"]) ? $Format["NoMargin"] : FALSE; - - if ($Value1 > $Value2) { list($Value1, $Value2) = array($Value2, $Value1); } - - $RestoreShadow = $this->Shadow; - if ( $DisableShadowOnArea && $this->Shadow ) { $this->Shadow = FALSE; } - - if ($BorderAlpha >100) { $BorderAlpha = 100;} - - $Data = $this->DataSet->getData(); - $AbscissaMargin = $this->getAbscissaMargin($Data); - - if ( $NoMargin ) { $AbscissaMargin = 0; } - if ( !isset($Data["Axis"][$AxisID]) ) { return(-1); } - - if ( $Data["Orientation"] == SCALE_POS_LEFTRIGHT ) - { - $XPos1 = $this->GraphAreaX1 + $AbscissaMargin; - $XPos2 = $this->GraphAreaX2 - $AbscissaMargin; - $YPos1 = $this->scaleComputeY($Value1,array("AxisID"=>$AxisID)); - $YPos2 = $this->scaleComputeY($Value2,array("AxisID"=>$AxisID)); - - if ( $YPos1 < $this->GraphAreaY1+$Data["Axis"][$AxisID]["Margin"] ) { $YPos1 = $this->GraphAreaY1+$Data["Axis"][$AxisID]["Margin"]; } - if ( $YPos1 > $this->GraphAreaY2-$Data["Axis"][$AxisID]["Margin"] ) { $YPos1 = $this->GraphAreaY2-$Data["Axis"][$AxisID]["Margin"]; } - if ( $YPos2 < $this->GraphAreaY1+$Data["Axis"][$AxisID]["Margin"] ) { $YPos2 = $this->GraphAreaY1+$Data["Axis"][$AxisID]["Margin"]; } - if ( $YPos2 > $this->GraphAreaY2-$Data["Axis"][$AxisID]["Margin"] ) { $YPos2 = $this->GraphAreaY2-$Data["Axis"][$AxisID]["Margin"]; } - - $this->drawFilledRectangle($XPos1,$YPos1,$XPos2,$YPos2,array("R"=>$R,"G"=>$G,"B"=>$B,"Alpha"=>$Alpha)); - if ( $Border ) - { - $this->drawLine($XPos1,$YPos1,$XPos2,$YPos1,array("R"=>$BorderR,"G"=>$BorderG,"B"=>$BorderB,"Alpha"=>$BorderAlpha,"Ticks"=>$BorderTicks)); - $this->drawLine($XPos1,$YPos2,$XPos2,$YPos2,array("R"=>$BorderR,"G"=>$BorderG,"B"=>$BorderB,"Alpha"=>$BorderAlpha,"Ticks"=>$BorderTicks)); - } - - if ( $AreaName != NULL ) - { - $XPos = ($XPos2-$XPos1)/2 + $XPos1; - $YPos = ($YPos2-$YPos1)/2 + $YPos1; - $this->Shadow = $RestoreShadow; - $this->drawText($XPos,$YPos,$AreaName,array("R"=>$NameR,"G"=>$NameG,"B"=>$NameB,"Alpha"=>$NameAlpha,"Angle"=>0,"Align"=>TEXT_ALIGN_MIDDLEMIDDLE)); - if ( $DisableShadowOnArea ) { $this->Shadow = FALSE; } - } - - $this->Shadow = $RestoreShadow; - return(array("Y1"=>$YPos1,"Y2"=>$YPos2)); - } - elseif ( $Data["Orientation"] == SCALE_POS_TOPBOTTOM ) - { - $YPos1 = $this->GraphAreaY1 + $AbscissaMargin; - $YPos2 = $this->GraphAreaY2 - $AbscissaMargin; - $XPos1 = $this->scaleComputeY($Value1,array("AxisID"=>$AxisID)); - $XPos2 = $this->scaleComputeY($Value2,array("AxisID"=>$AxisID)); - - if ( $XPos1 < $this->GraphAreaX1+$Data["Axis"][$AxisID]["Margin"] ) { $XPos1 = $this->GraphAreaX1+$Data["Axis"][$AxisID]["Margin"]; } - if ( $XPos1 > $this->GraphAreaX2-$Data["Axis"][$AxisID]["Margin"] ) { $XPos1 = $this->GraphAreaX2-$Data["Axis"][$AxisID]["Margin"]; } - if ( $XPos2 < $this->GraphAreaX1+$Data["Axis"][$AxisID]["Margin"] ) { $XPos2 = $this->GraphAreaX1+$Data["Axis"][$AxisID]["Margin"]; } - if ( $XPos2 > $this->GraphAreaX2-$Data["Axis"][$AxisID]["Margin"] ) { $XPos2 = $this->GraphAreaX2-$Data["Axis"][$AxisID]["Margin"]; } - - $this->drawFilledRectangle($XPos1,$YPos1,$XPos2,$YPos2,array("R"=>$R,"G"=>$G,"B"=>$B,"Alpha"=>$Alpha)); - if ( $Border ) - { - $this->drawLine($XPos1,$YPos1,$XPos1,$YPos2,array("R"=>$BorderR,"G"=>$BorderG,"B"=>$BorderB,"Alpha"=>$BorderAlpha,"Ticks"=>$BorderTicks)); - $this->drawLine($XPos2,$YPos1,$XPos2,$YPos2,array("R"=>$BorderR,"G"=>$BorderG,"B"=>$BorderB,"Alpha"=>$BorderAlpha,"Ticks"=>$BorderTicks)); - } - - if ( $AreaName != NULL ) - { - $XPos = ($YPos2-$YPos1)/2 + $YPos1; - $YPos = ($XPos2-$XPos1)/2 + $XPos1; - - if ( $NameAngle == ZONE_NAME_ANGLE_AUTO ) - { - $TxtPos = $this->getTextBox($XPos,$YPos,$this->FontName,$this->FontSize,0,$AreaName); - $TxtWidth = $TxtPos[1]["X"] - $TxtPos[0]["X"]; - if ( abs($XPos2 - $XPos1) > $TxtWidth ) { $NameAngle = 0; } else { $NameAngle = 90; } - } - $this->Shadow = $RestoreShadow; - $this->drawText($YPos,$XPos,$AreaName,array("R"=>$NameR,"G"=>$NameG,"B"=>$NameB,"Alpha"=>$NameAlpha,"Angle"=>$NameAngle,"Align"=>TEXT_ALIGN_MIDDLEMIDDLE)); - if ( $DisableShadowOnArea ) { $this->Shadow = FALSE; } - } - - $this->Shadow = $RestoreShadow; - return(array("Y1"=>$XPos1,"Y2"=>$XPos2)); - } - } - - function scaleGetXSettings() - { - $Data = $this->DataSet->getData(); - foreach($Data["Axis"] as $AxisID => $Settings) - { - if ( $Settings["Identity"] == AXIS_X ) - { - $Rows = $Settings["Rows"]; - - return(array($Settings["Margin"],$Rows)); - } - } - } - - function scaleComputeY($Values,$Option="",$ReturnOnly0Height=FALSE) - { - $AxisID = isset($Option["AxisID"]) ? $Option["AxisID"] : 0; - $SerieName = isset($Option["SerieName"]) ? $Option["SerieName"] : NULL; - - $Data = $this->DataSet->getData(); - if ( !isset($Data["Axis"][$AxisID]) ) { return(-1); } - - if ( $SerieName != NULL ) { $AxisID = $Data["Series"][$SerieName]["Axis"]; } - if ( !is_array($Values) ) { $tmp = $Values; $Values = ""; $Values[0] = $tmp; } - - $Result = ""; - if ( $Data["Orientation"] == SCALE_POS_LEFTRIGHT ) - { - $Height = ($this->GraphAreaY2 - $this->GraphAreaY1) - $Data["Axis"][$AxisID]["Margin"]*2; - $ScaleHeight = $Data["Axis"][$AxisID]["ScaleMax"] - $Data["Axis"][$AxisID]["ScaleMin"]; - $Step = $Height / $ScaleHeight; - - if ( $ReturnOnly0Height ) - { foreach($Values as $Key => $Value) { if ( $Value == VOID ) { $Result[] = VOID; } else { $Result[] = $Step * $Value; } } } - else - { foreach($Values as $Key => $Value) { if ( $Value == VOID ) { $Result[] = VOID; } else { $Result[] = $this->GraphAreaY2 - $Data["Axis"][$AxisID]["Margin"] - ($Step * ($Value-$Data["Axis"][$AxisID]["ScaleMin"])); } } } - } - else - { - $Width = ($this->GraphAreaX2 - $this->GraphAreaX1) - $Data["Axis"][$AxisID]["Margin"]*2; - $ScaleWidth = $Data["Axis"][$AxisID]["ScaleMax"] - $Data["Axis"][$AxisID]["ScaleMin"]; - $Step = $Width / $ScaleWidth; - - if ( $ReturnOnly0Height ) - { foreach($Values as $Key => $Value) { if ( $Value == VOID ) { $Result[] = VOID; } else { $Result[] = $Step * $Value; } } } - else - { foreach($Values as $Key => $Value) { if ( $Value == VOID ) { $Result[] = VOID; } else { $Result[] = $this->GraphAreaX1 + $Data["Axis"][$AxisID]["Margin"] + ($Step * ($Value-$Data["Axis"][$AxisID]["ScaleMin"])); } } } - } - - if ( count($Result) == 1 ) - return($Result[0]); - else - return($Result); - } - - /* Format the axis values */ - function scaleFormat($Value,$Mode=NULL,$Format=NULL,$Unit=NULL) - { - if ( $Value == VOID ) { return(""); } - - if ( $Mode == AXIS_FORMAT_TRAFFIC ) - { - if ( $Value == 0 ) { return("0B"); } - $Units = array("B","KB","MB","GB","TB","PB"); - $Sign = ""; if ( $Value < 0 ) { $Value = abs($Value); $Sign = "-"; } - - $Value = number_format($Value/pow(1024,($Scale=floor(log($Value,1024)))),2,",","."); - return($Sign.$Value." ".$Units[$Scale]); - } - - if ( $Mode == AXIS_FORMAT_CUSTOM ) - { if ( function_exists($Format) ) { return(call_user_func($Format,$Value)); } } - - if ( $Mode == AXIS_FORMAT_DATE ) - { if ( $Format == NULL ) { $Pattern = "d/m/Y"; } else { $Pattern = $Format; } return(gmdate($Pattern,$Value)); } - - if ( $Mode == AXIS_FORMAT_TIME ) - { if ( $Format == NULL ) { $Pattern = "H:i:s"; } else { $Pattern = $Format; } return(gmdate($Pattern,$Value)); } - - if ( $Mode == AXIS_FORMAT_CURRENCY ) - { return($Format.number_format($Value,2)); } - - if ( $Mode == AXIS_FORMAT_METRIC ) - { - if (abs($Value) > 1000000000) - return(round($Value/1000000000,$Format)."g".$Unit); - if (abs($Value) > 1000000) - return(round($Value/1000000,$Format)."m".$Unit); - elseif (abs($Value) >= 1000) - return(round($Value/1000,$Format)."k".$Unit); - - } - return($Value.$Unit); - } - - /* Write Max value on a chart */ - function writeBounds($Type=BOUND_BOTH,$Format=NULL) - { - $MaxLabelTxt = isset($Format["MaxLabelTxt"]) ? $Format["MaxLabelTxt"] : "max="; - $MinLabelTxt = isset($Format["MinLabelTxt"]) ? $Format["MinLabelTxt"] : "min="; - $Decimals = isset($Format["Decimals"]) ? $Format["Decimals"] : 1; - $ExcludedSeries = isset($Format["ExcludedSeries"]) ? $Format["ExcludedSeries"] : ""; - $DisplayOffset = isset($Format["DisplayOffset"]) ? $Format["DisplayOffset"] : 4; - $DisplayColor = isset($Format["DisplayColor"]) ? $Format["DisplayColor"] : DISPLAY_MANUAL; - $MaxDisplayR = isset($Format["MaxDisplayR"]) ? $Format["MaxDisplayR"] : 0; - $MaxDisplayG = isset($Format["MaxDisplayG"]) ? $Format["MaxDisplayG"] : 0; - $MaxDisplayB = isset($Format["MaxDisplayB"]) ? $Format["MaxDisplayB"] : 0; - $MinDisplayR = isset($Format["MinDisplayR"]) ? $Format["MinDisplayR"] : 255; - $MinDisplayG = isset($Format["MinDisplayG"]) ? $Format["MinDisplayG"] : 255; - $MinDisplayB = isset($Format["MinDisplayB"]) ? $Format["MinDisplayB"] : 255; - $MinLabelPos = isset($Format["MinLabelPos"]) ? $Format["MinLabelPos"] : BOUND_LABEL_POS_AUTO; - $MaxLabelPos = isset($Format["MaxLabelPos"]) ? $Format["MaxLabelPos"] : BOUND_LABEL_POS_AUTO; - $DrawBox = isset($Format["DrawBox"]) ? $Format["DrawBox"] : TRUE; - $DrawBoxBorder = isset($Format["DrawBoxBorder"]) ? $Format["DrawBoxBorder"] : FALSE; - $BorderOffset = isset($Format["BorderOffset"]) ? $Format["BorderOffset"] : 5; - $BoxRounded = isset($Format["BoxRounded"]) ? $Format["BoxRounded"] : TRUE; - $RoundedRadius = isset($Format["RoundedRadius"]) ? $Format["RoundedRadius"] : 3; - $BoxR = isset($Format["BoxR"]) ? $Format["BoxR"] : 0; - $BoxG = isset($Format["BoxG"]) ? $Format["BoxG"] : 0; - $BoxB = isset($Format["BoxB"]) ? $Format["BoxB"] : 0; - $BoxAlpha = isset($Format["BoxAlpha"]) ? $Format["BoxAlpha"] : 20; - $BoxSurrounding = isset($Format["BoxSurrounding"]) ? $Format["BoxSurrounding"] : ""; - $BoxBorderR = isset($Format["BoxBorderR"]) ? $Format["BoxBorderR"] : 255; - $BoxBorderG = isset($Format["BoxBorderG"]) ? $Format["BoxBorderG"] : 255; - $BoxBorderB = isset($Format["BoxBorderB"]) ? $Format["BoxBorderB"] : 255; - $BoxBorderAlpha = isset($Format["BoxBorderAlpha"]) ? $Format["BoxBorderAlpha"] : 100; - - $CaptionSettings = array("DrawBox"=>$DrawBox,"DrawBoxBorder"=>$DrawBoxBorder,"BorderOffset"=>$BorderOffset,"BoxRounded"=>$BoxRounded,"RoundedRadius"=>$RoundedRadius, - "BoxR"=>$BoxR,"BoxG"=>$BoxG,"BoxB"=>$BoxB,"BoxAlpha"=>$BoxAlpha,"BoxSurrounding"=>$BoxSurrounding, - "BoxBorderR"=>$BoxBorderR,"BoxBorderG"=>$BoxBorderG,"BoxBorderB"=>$BoxBorderB,"BoxBorderAlpha"=>$BoxBorderAlpha); - - list($XMargin,$XDivs) = $this->scaleGetXSettings(); - - $Data = $this->DataSet->getData(); - foreach($Data["Series"] as $SerieName => $Serie) - { - if ( $Serie["isDrawable"] == TRUE && $SerieName != $Data["Abscissa"] && !isset($ExcludedSeries[$SerieName])) - { - $R = $Serie["Color"]["R"]; $G = $Serie["Color"]["G"]; $B = $Serie["Color"]["B"]; $Alpha = $Serie["Color"]["Alpha"]; $Ticks = $Serie["Ticks"]; - if ( $DisplayColor == DISPLAY_AUTO ) { $DisplayR = $R; $DisplayG = $G; $DisplayB = $B; } - - $MinValue = $this->DataSet->getMin($SerieName); - $MaxValue = $this->DataSet->getMax($SerieName); - - $MinPos = VOID; $MaxPos = VOID; - foreach($Serie["Data"] as $Key => $Value) - { - if ( $Value == $MinValue && $MinPos == VOID ) { $MinPos = $Key; } - if ( $Value == $MaxValue ) { $MaxPos = $Key; } - } - - $AxisID = $Serie["Axis"]; - $Mode = $Data["Axis"][$AxisID]["Display"]; - $Format = $Data["Axis"][$AxisID]["Format"]; - $Unit = $Data["Axis"][$AxisID]["Unit"]; - - $PosArray = $this->scaleComputeY($Serie["Data"],array("AxisID"=>$Serie["Axis"])); - - if ( $Data["Orientation"] == SCALE_POS_LEFTRIGHT ) - { - $XStep = ($this->GraphAreaX2-$this->GraphAreaX1-$XMargin*2)/$XDivs; - $X = $this->GraphAreaX1 + $XMargin; - $SerieOffset = isset($Serie["XOffset"]) ? $Serie["XOffset"] : 0; - - if ( $Type == BOUND_MAX || $Type == BOUND_BOTH ) - { - if ( $MaxLabelPos == BOUND_LABEL_POS_TOP || ( $MaxLabelPos == BOUND_LABEL_POS_AUTO && $MaxValue >= 0) ) { $YPos = $PosArray[$MaxPos] - $DisplayOffset + 2; $Align = TEXT_ALIGN_BOTTOMMIDDLE; } - if ( $MaxLabelPos == BOUND_LABEL_POS_BOTTOM || ( $MaxLabelPos == BOUND_LABEL_POS_AUTO && $MaxValue < 0) ) { $YPos = $PosArray[$MaxPos] + $DisplayOffset + 2; $Align = TEXT_ALIGN_TOPMIDDLE; } - - $XPos = $X + $MaxPos*$XStep + $SerieOffset; - $Label = $MaxLabelTxt.$this->scaleFormat(round($MaxValue,$Decimals),$Mode,$Format,$Unit); - - $TxtPos = $this->getTextBox($XPos,$YPos,$this->FontName,$this->FontSize,0,$Label); - $XOffset = 0; $YOffset = 0; - if ( $TxtPos[0]["X"] < $this->GraphAreaX1 ) { $XOffset = (($this->GraphAreaX1 - $TxtPos[0]["X"])/2); } - if ( $TxtPos[1]["X"] > $this->GraphAreaX2 ) { $XOffset = -(($TxtPos[1]["X"] - $this->GraphAreaX2)/2); } - if ( $TxtPos[2]["Y"] < $this->GraphAreaY1 ) { $YOffset = $this->GraphAreaY1 - $TxtPos[2]["Y"]; } - if ( $TxtPos[0]["Y"] > $this->GraphAreaY2 ) { $YOffset = -($TxtPos[0]["Y"] - $this->GraphAreaY2); } - - $CaptionSettings["R"] = $MaxDisplayR; $CaptionSettings["G"] = $MaxDisplayG; - $CaptionSettings["B"] = $MaxDisplayB; $CaptionSettings["Align"] = $Align; - - $this->drawText($XPos+$XOffset,$YPos+$YOffset,$Label,$CaptionSettings); - } - - if ( $Type == BOUND_MIN || $Type == BOUND_BOTH ) - { - if ( $MinLabelPos == BOUND_LABEL_POS_TOP || ( $MinLabelPos == BOUND_LABEL_POS_AUTO && $MinValue >= 0) ) { $YPos = $PosArray[$MinPos] - $DisplayOffset + 2; $Align = TEXT_ALIGN_BOTTOMMIDDLE; } - if ( $MinLabelPos == BOUND_LABEL_POS_BOTTOM || ( $MinLabelPos == BOUND_LABEL_POS_AUTO && $MinValue < 0) ) { $YPos = $PosArray[$MinPos] + $DisplayOffset + 2; $Align = TEXT_ALIGN_TOPMIDDLE; } - - $XPos = $X + $MinPos*$XStep + $SerieOffset; - $Label = $MinLabelTxt.$this->scaleFormat(round($MinValue,$Decimals),$Mode,$Format,$Unit); - - $TxtPos = $this->getTextBox($XPos,$YPos,$this->FontName,$this->FontSize,0,$Label); - $XOffset = 0; $YOffset = 0; - if ( $TxtPos[0]["X"] < $this->GraphAreaX1 ) { $XOffset = (($this->GraphAreaX1 - $TxtPos[0]["X"])/2); } - if ( $TxtPos[1]["X"] > $this->GraphAreaX2 ) { $XOffset = -(($TxtPos[1]["X"] - $this->GraphAreaX2)/2); } - if ( $TxtPos[2]["Y"] < $this->GraphAreaY1 ) { $YOffset = $this->GraphAreaY1 - $TxtPos[2]["Y"]; } - if ( $TxtPos[0]["Y"] > $this->GraphAreaY2 ) { $YOffset = -($TxtPos[0]["Y"] - $this->GraphAreaY2); } - - $CaptionSettings["R"] = $MinDisplayR; $CaptionSettings["G"] = $MinDisplayG; - $CaptionSettings["B"] = $MinDisplayB; $CaptionSettings["Align"] = $Align; - - $this->drawText($XPos+$XOffset,$YPos-$DisplayOffset+$YOffset,$Label,$CaptionSettings); - } - } - else - { - $XStep = ($this->GraphAreaY2-$this->GraphAreaY1-$XMargin*2)/$XDivs; - $X = $this->GraphAreaY1 + $XMargin; - $SerieOffset = isset($Serie["XOffset"]) ? $Serie["XOffset"] : 0; - - if ( $Type == BOUND_MAX || $Type == BOUND_BOTH ) - { - if ( $MaxLabelPos == BOUND_LABEL_POS_TOP || ( $MaxLabelPos == BOUND_LABEL_POS_AUTO && $MaxValue >= 0) ) { $YPos = $PosArray[$MaxPos] + $DisplayOffset + 2; $Align = TEXT_ALIGN_MIDDLELEFT; } - if ( $MaxLabelPos == BOUND_LABEL_POS_BOTTOM || ( $MaxLabelPos == BOUND_LABEL_POS_AUTO && $MaxValue < 0) ) { $YPos = $PosArray[$MaxPos] - $DisplayOffset + 2; $Align = TEXT_ALIGN_MIDDLERIGHT; } - - $XPos = $X + $MaxPos*$XStep + $SerieOffset; - $Label = $MaxLabelTxt.$this->scaleFormat($MaxValue,$Mode,$Format,$Unit); - - $TxtPos = $this->getTextBox($YPos,$XPos,$this->FontName,$this->FontSize,0,$Label); - $XOffset = 0; $YOffset = 0; - if ( $TxtPos[0]["X"] < $this->GraphAreaX1 ) { $XOffset = $this->GraphAreaX1 - $TxtPos[0]["X"]; } - if ( $TxtPos[1]["X"] > $this->GraphAreaX2 ) { $XOffset = -($TxtPos[1]["X"] - $this->GraphAreaX2); } - if ( $TxtPos[2]["Y"] < $this->GraphAreaY1 ) { $YOffset = ($this->GraphAreaY1 - $TxtPos[2]["Y"])/2; } - if ( $TxtPos[0]["Y"] > $this->GraphAreaY2 ) { $YOffset = -(($TxtPos[0]["Y"] - $this->GraphAreaY2)/2);} - - $CaptionSettings["R"] = $MaxDisplayR; $CaptionSettings["G"] = $MaxDisplayG; - $CaptionSettings["B"] = $MaxDisplayB; $CaptionSettings["Align"] = $Align; - - $this->drawText($YPos+$XOffset,$XPos+$YOffset,$Label,$CaptionSettings); - } - - if ( $Type == BOUND_MIN || $Type == BOUND_BOTH ) - { - if ( $MinLabelPos == BOUND_LABEL_POS_TOP || ( $MinLabelPos == BOUND_LABEL_POS_AUTO && $MinValue >= 0) ) { $YPos = $PosArray[$MinPos] + $DisplayOffset + 2; $Align = TEXT_ALIGN_MIDDLELEFT; } - if ( $MinLabelPos == BOUND_LABEL_POS_BOTTOM || ( $MinLabelPos == BOUND_LABEL_POS_AUTO && $MinValue < 0) ) { $YPos = $PosArray[$MinPos] - $DisplayOffset + 2; $Align = TEXT_ALIGN_MIDDLERIGHT; } - - $XPos = $X + $MinPos*$XStep + $SerieOffset; - $Label = $MinLabelTxt.$this->scaleFormat($MinValue,$Mode,$Format,$Unit); - - $TxtPos = $this->getTextBox($YPos,$XPos,$this->FontName,$this->FontSize,0,$Label); - $XOffset = 0; $YOffset = 0; - if ( $TxtPos[0]["X"] < $this->GraphAreaX1 ) { $XOffset = $this->GraphAreaX1 - $TxtPos[0]["X"]; } - if ( $TxtPos[1]["X"] > $this->GraphAreaX2 ) { $XOffset = -($TxtPos[1]["X"] - $this->GraphAreaX2); } - if ( $TxtPos[2]["Y"] < $this->GraphAreaY1 ) { $YOffset = ($this->GraphAreaY1 - $TxtPos[2]["Y"])/2; } - if ( $TxtPos[0]["Y"] > $this->GraphAreaY2 ) { $YOffset = -(($TxtPos[0]["Y"] - $this->GraphAreaY2)/2);} - - $CaptionSettings["R"] = $MinDisplayR; $CaptionSettings["G"] = $MinDisplayG; - $CaptionSettings["B"] = $MinDisplayB; $CaptionSettings["Align"] = $Align; - - $this->drawText($YPos+$XOffset,$XPos+$YOffset,$Label,$CaptionSettings); - } - } - } - } - } - - /* Draw a plot chart */ - function drawPlotChart($Format=NULL) - { - $PlotSize = isset($Format["PlotSize"]) ? $Format["PlotSize"] : NULL; - $PlotBorder = isset($Format["PlotBorder"]) ? $Format["PlotBorder"] : FALSE; - $BorderR = isset($Format["BorderR"]) ? $Format["BorderR"] : 50; - $BorderG = isset($Format["BorderG"]) ? $Format["BorderG"] : 50; - $BorderB = isset($Format["BorderB"]) ? $Format["BorderB"] : 50; - $BorderAlpha = isset($Format["BorderAlpha"]) ? $Format["BorderAlpha"] : 30; - $BorderSize = isset($Format["BorderSize"]) ? $Format["BorderSize"] : 2; - $Surrounding = isset($Format["Surrounding"]) ? $Format["Surrounding"] : NULL; - $DisplayValues = isset($Format["DisplayValues"]) ? $Format["DisplayValues"] : FALSE; - $DisplayOffset = isset($Format["DisplayOffset"]) ? $Format["DisplayOffset"] : 4; - $DisplayColor = isset($Format["DisplayColor"]) ? $Format["DisplayColor"] : DISPLAY_MANUAL; - $DisplayR = isset($Format["DisplayR"]) ? $Format["DisplayR"] : 0; - $DisplayG = isset($Format["DisplayG"]) ? $Format["DisplayG"] : 0; - $DisplayB = isset($Format["DisplayB"]) ? $Format["DisplayB"] : 0; - $RecordImageMap = isset($Format["RecordImageMap"]) ? $Format["RecordImageMap"] : FALSE; - - $this->LastChartLayout = CHART_LAST_LAYOUT_REGULAR; - - $Data = $this->DataSet->getData(); - list($XMargin,$XDivs) = $this->scaleGetXSettings(); - - foreach($Data["Series"] as $SerieName => $Serie) - { - if ( $Serie["isDrawable"] == TRUE && $SerieName != $Data["Abscissa"] ) - { - if ( isset($Serie["Weight"]) ) { $SerieWeight = $Serie["Weight"] + 2; } else { $SerieWeight = 2; } - if ( $PlotSize != NULL ) { $SerieWeight = $PlotSize; } - - $R = $Serie["Color"]["R"]; $G = $Serie["Color"]["G"]; $B = $Serie["Color"]["B"]; $Alpha = $Serie["Color"]["Alpha"]; $Ticks = $Serie["Ticks"]; - if ( $Surrounding != NULL ) { $BorderR = $R + $Surrounding; $BorderG = $G + $Surrounding; $BorderB = $B + $Surrounding; } - if ( isset($Serie["Picture"]) ) - { $Picture = $Serie["Picture"]; list($PicWidth,$PicHeight,$PicType) = $this->getPicInfo($Picture); } - else { $Picture = NULL; $PicOffset = 0; } - - if ( $DisplayColor == DISPLAY_AUTO ) { $DisplayR = $R; $DisplayG = $G; $DisplayB = $B; } - - $AxisID = $Serie["Axis"]; - $Shape = $Serie["Shape"]; - $Mode = $Data["Axis"][$AxisID]["Display"]; - $Format = $Data["Axis"][$AxisID]["Format"]; - $Unit = $Data["Axis"][$AxisID]["Unit"]; - - if (isset($Serie["Description"])) { $SerieDescription = $Serie["Description"]; } else { $SerieDescription = $SerieName; } - - $PosArray = $this->scaleComputeY($Serie["Data"],array("AxisID"=>$Serie["Axis"])); - - $this->DataSet->Data["Series"][$SerieName]["XOffset"] = 0; - - if ( $Data["Orientation"] == SCALE_POS_LEFTRIGHT ) - { - if ( $XDivs == 0 ) { $XStep = ($this->GraphAreaX2-$this->GraphAreaX1)/4; } else { $XStep = ($this->GraphAreaX2-$this->GraphAreaX1-$XMargin*2)/$XDivs; } - if ( $Picture != NULL ) { $PicOffset = $PicHeight / 2; $SerieWeight = 0; } - $X = $this->GraphAreaX1 + $XMargin; - - if ( !is_array($PosArray) ) { $Value = $PosArray; $PosArray = ""; $PosArray[0] = $Value; } - foreach($PosArray as $Key => $Y) - { - if ( $DisplayValues ) - $this->drawText($X,$Y-$DisplayOffset-$SerieWeight-$BorderSize-$PicOffset,$this->scaleFormat($Serie["Data"][$Key],$Mode,$Format,$Unit),array("R"=>$DisplayR,"G"=>$DisplayG,"B"=>$DisplayB,"Align"=>TEXT_ALIGN_BOTTOMMIDDLE)); - - if ( $Y != VOID ) - { - if ( $RecordImageMap ) { $this->addToImageMap("CIRCLE",floor($X).",".floor($Y).",".$SerieWeight,$this->toHTMLColor($R,$G,$B),$SerieDescription,$this->scaleFormat($Serie["Data"][$Key],$Mode,$Format,$Unit)); } - - if ( $Picture != NULL ) - { $this->drawFromPicture($PicType,$Picture,$X-$PicWidth/2,$Y-$PicHeight/2); } - else - { $this->drawShape($X,$Y,$Shape,$SerieWeight,$PlotBorder,$BorderSize,$R,$G,$B,$Alpha,$BorderR,$BorderG,$BorderB,$BorderAlpha); } - } - $X = $X + $XStep; - } - } - else - { - if ( $XDivs == 0 ) { $YStep = ($this->GraphAreaY2-$this->GraphAreaY1)/4; } else { $YStep = ($this->GraphAreaY2-$this->GraphAreaY1-$XMargin*2)/$XDivs; } - if ( $Picture != NULL ) { $PicOffset = $PicWidth / 2; $SerieWeight = 0; } - $Y = $this->GraphAreaY1 + $XMargin; - - if ( !is_array($PosArray) ) { $Value = $PosArray; $PosArray = ""; $PosArray[0] = $Value; } - foreach($PosArray as $Key => $X) - { - if ( $DisplayValues ) - $this->drawText($X+$DisplayOffset+$SerieWeight+$BorderSize+$PicOffset,$Y,$this->scaleFormat($Serie["Data"][$Key],$Mode,$Format,$Unit),array("Angle"=>270,"R"=>$DisplayR,"G"=>$DisplayG,"B"=>$DisplayB,"Align"=>TEXT_ALIGN_BOTTOMMIDDLE)); - - if ( $X != VOID ) - { - if ( $RecordImageMap ) { $this->addToImageMap("CIRCLE",floor($X).",".floor($Y).",".$SerieWeight,$this->toHTMLColor($R,$G,$B),$SerieDescription,$this->scaleFormat($Serie["Data"][$Key],$Mode,$Format,$Unit)); } - - if ( $Picture != NULL ) - { $this->drawFromPicture($PicType,$Picture,$X-$PicWidth/2,$Y-$PicHeight/2); } - else - { $this->drawShape($X,$Y,$Shape,$SerieWeight,$PlotBorder,$BorderSize,$R,$G,$B,$Alpha,$BorderR,$BorderG,$BorderB,$BorderAlpha); } - } - $Y = $Y + $YStep; - } - } - } - } - } - - /* Draw a spline chart */ - function drawSplineChart($Format=NULL) - { - $BreakVoid = isset($Format["BreakVoid"]) ? $Format["BreakVoid"] : TRUE; - $VoidTicks = isset($Format["VoidTicks"]) ? $Format["VoidTicks"] : 4; - $BreakR = isset($Format["BreakR"]) ? $Format["BreakR"] : NULL; // 234 - $BreakG = isset($Format["BreakG"]) ? $Format["BreakG"] : NULL; // 55 - $BreakB = isset($Format["BreakB"]) ? $Format["BreakB"] : NULL; // 26 - $DisplayValues = isset($Format["DisplayValues"]) ? $Format["DisplayValues"] : FALSE; - $DisplayOffset = isset($Format["DisplayOffset"]) ? $Format["DisplayOffset"] : 2; - $DisplayColor = isset($Format["DisplayColor"]) ? $Format["DisplayColor"] : DISPLAY_MANUAL; - $DisplayR = isset($Format["DisplayR"]) ? $Format["DisplayR"] : 0; - $DisplayG = isset($Format["DisplayG"]) ? $Format["DisplayG"] : 0; - $DisplayB = isset($Format["DisplayB"]) ? $Format["DisplayB"] : 0; - $RecordImageMap = isset($Format["RecordImageMap"]) ? $Format["RecordImageMap"] : FALSE; - $ImageMapPlotSize = isset($Format["ImageMapPlotSize"]) ? $Format["ImageMapPlotSize"] : 5; - - $this->LastChartLayout = CHART_LAST_LAYOUT_REGULAR; - - $Data = $this->DataSet->getData(); - list($XMargin,$XDivs) = $this->scaleGetXSettings(); - foreach($Data["Series"] as $SerieName => $Serie) - { - if ( $Serie["isDrawable"] == TRUE && $SerieName != $Data["Abscissa"] ) - { - $R = $Serie["Color"]["R"]; $G = $Serie["Color"]["G"]; $B = $Serie["Color"]["B"]; $Alpha = $Serie["Color"]["Alpha"]; $Ticks = $Serie["Ticks"]; $Weight = $Serie["Weight"]; - - if ( $BreakR == NULL ) - $BreakSettings = array("R"=>$R,"G"=>$G,"B"=>$B,"Alpha"=>$Alpha,"Ticks"=>$VoidTicks); - else - $BreakSettings = array("R"=>$BreakR,"G"=>$BreakG,"B"=>$BreakB,"Alpha"=>$Alpha,"Ticks"=>$VoidTicks,"Weight"=>$Weight); - - if ( $DisplayColor == DISPLAY_AUTO ) { $DisplayR = $R; $DisplayG = $G; $DisplayB = $B; } - - $AxisID = $Serie["Axis"]; - $Mode = $Data["Axis"][$AxisID]["Display"]; - $Format = $Data["Axis"][$AxisID]["Format"]; - $Unit = $Data["Axis"][$AxisID]["Unit"]; - - if (isset($Serie["Description"])) { $SerieDescription = $Serie["Description"]; } else { $SerieDescription = $SerieName; } - - $PosArray = $this->scaleComputeY($Serie["Data"],array("AxisID"=>$Serie["Axis"])); - - $this->DataSet->Data["Series"][$SerieName]["XOffset"] = 0; - - if ( $Data["Orientation"] == SCALE_POS_LEFTRIGHT ) - { - if ( $XDivs == 0 ) { $XStep = ($this->GraphAreaX2-$this->GraphAreaX1)/4; } else { $XStep = ($this->GraphAreaX2-$this->GraphAreaX1-$XMargin*2)/$XDivs; } - $X = $this->GraphAreaX1 + $XMargin; $WayPoints = ""; - $Force = $XStep / 5; - - if ( !is_array($PosArray) ) { $Value = $PosArray; $PosArray = ""; $PosArray[0] = $Value; } - $LastGoodY = NULL; $LastGoodX = NULL; $LastX = 1; $LastY = 1; - foreach($PosArray as $Key => $Y) - { - if ( $DisplayValues ) - $this->drawText($X,$Y-$DisplayOffset,$this->scaleFormat($Serie["Data"][$Key],$Mode,$Format,$Unit),array("R"=>$DisplayR,"G"=>$DisplayG,"B"=>$DisplayB,"Align"=>TEXT_ALIGN_BOTTOMMIDDLE)); - - if ( $RecordImageMap && $Y != VOID ) { $this->addToImageMap("CIRCLE",floor($X).",".floor($Y).",".$ImageMapPlotSize,$this->toHTMLColor($R,$G,$B),$SerieDescription,$this->scaleFormat($Serie["Data"][$Key],$Mode,$Format,$Unit)); } - - if ( $Y == VOID && $LastY != NULL ) - { $this->drawSpline($WayPoints,array("Force"=>$Force,"R"=>$R,"G"=>$G,"B"=>$B,"Alpha"=>$Alpha,"Ticks"=>$Ticks,"Weight"=>$Weight)); $WayPoints = ""; } - - if ( $Y != VOID && $LastY == NULL && $LastGoodY != NULL && !$BreakVoid ) - { $this->drawLine($LastGoodX,$LastGoodY,$X,$Y,$BreakSettings); } - - if ( $Y != VOID ) - $WayPoints[] = array($X,$Y); - - if ( $Y != VOID ) { $LastGoodY = $Y; $LastGoodX = $X; } - if ( $Y == VOID ) { $Y = NULL; } - - $LastX = $X; $LastY = $Y; - $X = $X + $XStep; - } - $this->drawSpline($WayPoints,array("Force"=>$Force,"R"=>$R,"G"=>$G,"B"=>$B,"Alpha"=>$Alpha,"Ticks"=>$Ticks,"Weight"=>$Weight)); - } - else - { - if ( $XDivs == 0 ) { $YStep = ($this->GraphAreaY2-$this->GraphAreaY1)/4; } else { $YStep = ($this->GraphAreaY2-$this->GraphAreaY1-$XMargin*2)/$XDivs; } - $Y = $this->GraphAreaY1 + $XMargin; $WayPoints = ""; - $Force = $YStep / 5; - - if ( !is_array($PosArray) ) { $Value = $PosArray; $PosArray = ""; $PosArray[0] = $Value; } - $LastGoodY = NULL; $LastGoodX = NULL; $LastX = 1; $LastY = 1; - foreach($PosArray as $Key => $X) - { - if ( $DisplayValues ) - $this->drawText($X+$DisplayOffset,$Y,$this->scaleFormat($Serie["Data"][$Key],$Mode,$Format,$Unit),array("Angle"=>270,"R"=>$DisplayR,"G"=>$DisplayG,"B"=>$DisplayB,"Align"=>TEXT_ALIGN_BOTTOMMIDDLE)); - - if ( $RecordImageMap && $X != VOID ) { $this->addToImageMap("CIRCLE",floor($X).",".floor($Y).",".$ImageMapPlotSize,$this->toHTMLColor($R,$G,$B),$SerieDescription,$this->scaleFormat($Serie["Data"][$Key],$Mode,$Format,$Unit)); } - - if ( $X == VOID && $LastX != NULL ) - { $this->drawSpline($WayPoints,array("Force"=>$Force,"R"=>$R,"G"=>$G,"B"=>$B,"Alpha"=>$Alpha,"Ticks"=>$Ticks,"Weight"=>$Weight)); $WayPoints = ""; } - - if ( $X != VOID && $LastX == NULL && $LastGoodX != NULL && !$BreakVoid ) - { $this->drawLine($LastGoodX,$LastGoodY,$X,$Y,$BreakSettings); } - - if ( $X != VOID ) - $WayPoints[] = array($X,$Y); - - if ( $X != VOID ) { $LastGoodX = $X; $LastGoodY = $Y; } - if ( $X == VOID ) { $X = NULL; } - - $LastX = $X; $LastY = $Y; - $Y = $Y + $YStep; - } - $this->drawSpline($WayPoints,array("Force"=>$Force,"R"=>$R,"G"=>$G,"B"=>$B,"Alpha"=>$Alpha,"Ticks"=>$Ticks,"Weight"=>$Weight)); - } - } - } - } - - /* Draw a filled spline chart */ - function drawFilledSplineChart($Format=NULL) - { - $DisplayValues = isset($Format["DisplayValues"]) ? $Format["DisplayValues"] : FALSE; - $DisplayOffset = isset($Format["DisplayOffset"]) ? $Format["DisplayOffset"] : 2; - $DisplayColor = isset($Format["DisplayColor"]) ? $Format["DisplayColor"] : DISPLAY_MANUAL; - $DisplayR = isset($Format["DisplayR"]) ? $Format["DisplayR"] : 0; - $DisplayG = isset($Format["DisplayG"]) ? $Format["DisplayG"] : 0; - $DisplayB = isset($Format["DisplayB"]) ? $Format["DisplayB"] : 0; - $AroundZero = isset($Format["AroundZero"]) ? $Format["AroundZero"] : TRUE; - $Threshold = isset($Format["Threshold"]) ? $Format["Threshold"] : NULL; - - $this->LastChartLayout = CHART_LAST_LAYOUT_REGULAR; - - $Data = $this->DataSet->getData(); - list($XMargin,$XDivs) = $this->scaleGetXSettings(); - foreach($Data["Series"] as $SerieName => $Serie) - { - if ( $Serie["isDrawable"] == TRUE && $SerieName != $Data["Abscissa"] ) - { - $R = $Serie["Color"]["R"]; $G = $Serie["Color"]["G"]; $B = $Serie["Color"]["B"]; $Alpha = $Serie["Color"]["Alpha"]; $Ticks = $Serie["Ticks"]; - if ( $DisplayColor == DISPLAY_AUTO ) { $DisplayR = $R; $DisplayG = $G; $DisplayB = $B; } - - $AxisID = $Serie["Axis"]; - $Mode = $Data["Axis"][$AxisID]["Display"]; - $Format = $Data["Axis"][$AxisID]["Format"]; - $Unit = $Data["Axis"][$AxisID]["Unit"]; - - $PosArray = $this->scaleComputeY($Serie["Data"],array("AxisID"=>$Serie["Axis"])); - if ( $AroundZero ) { $YZero = $this->scaleComputeY(0,array("AxisID"=>$Serie["Axis"])); } - - if ( $Threshold != NULL ) - { - foreach($Threshold as $Key => $Params) - { - $Threshold[$Key]["MinX"] = $this->scaleComputeY($Params["Min"],array("AxisID"=>$Serie["Axis"])); - $Threshold[$Key]["MaxX"] = $this->scaleComputeY($Params["Max"],array("AxisID"=>$Serie["Axis"])); - } - } - - $this->DataSet->Data["Series"][$SerieName]["XOffset"] = 0; - - if ( $Data["Orientation"] == SCALE_POS_LEFTRIGHT ) - { - if ( $XDivs == 0 ) { $XStep = ($this->GraphAreaX2-$this->GraphAreaX1)/4; } else { $XStep = ($this->GraphAreaX2-$this->GraphAreaX1-$XMargin*2)/$XDivs; } - $X = $this->GraphAreaX1 + $XMargin; $WayPoints = ""; - $Force = $XStep / 5; - - if ( !$AroundZero ) { $YZero = $this->GraphAreaY2-1; } - if ( $YZero > $this->GraphAreaY2-1 ) { $YZero = $this->GraphAreaY2-1; } - if ( $YZero < $this->GraphAreaY1+1 ) { $YZero = $this->GraphAreaY1+1; } - - $LastX = ""; $LastY = ""; - if ( !is_array($PosArray) ) { $Value = $PosArray; $PosArray = ""; $PosArray[0] = $Value; } - foreach($PosArray as $Key => $Y) - { - if ( $DisplayValues ) - $this->drawText($X,$Y-$DisplayOffset,$this->scaleFormat($Serie["Data"][$Key],$Mode,$Format,$Unit),array("R"=>$DisplayR,"G"=>$DisplayG,"B"=>$DisplayB,"Align"=>TEXT_ALIGN_BOTTOMMIDDLE)); - - if ( $Y == VOID ) - { - $Area = $this->drawSpline($WayPoints,array("Force"=>$Force,"PathOnly"=>TRUE)); - - if ( $Area != "" ) - { - foreach ($Area as $key => $Points) - { - $Corners = ""; $Corners[] = $Area[$key][0]["X"]; $Corners[] = $YZero; - foreach($Points as $subKey => $Point) - { - if ( $subKey == count($Points)-1) { $Corners[] = $Point["X"]-1; } else { $Corners[] = $Point["X"]; } - $Corners[] = $Point["Y"]+1; - } - $Corners[] = $Points[$subKey]["X"]-1; $Corners[] = $YZero; - - $this->drawPolygonChart($Corners,array("R"=>$R,"G"=>$G,"B"=>$B,"Alpha"=>$Alpha/2,"NoBorder"=>TRUE,"Threshold"=>$Threshold)); - } - $this->drawSpline($WayPoints,array("Force"=>$Force,"R"=>$R,"G"=>$G,"B"=>$B,"Alpha"=>$Alpha,"Ticks"=>$Ticks)); - } - - $WayPoints = ""; - } - else - $WayPoints[] = array($X,$Y-.5); /* -.5 for AA visual fix */ - - $X = $X + $XStep; - } - $Area = $this->drawSpline($WayPoints,array("Force"=>$Force,"PathOnly"=>TRUE)); - - if ( $Area != "" ) - { - foreach ($Area as $key => $Points) - { - $Corners = ""; $Corners[] = $Area[$key][0]["X"]; $Corners[] = $YZero; - foreach($Points as $subKey => $Point) - { - if ( $subKey == count($Points)-1) { $Corners[] = $Point["X"]-1; } else { $Corners[] = $Point["X"]; } - $Corners[] = $Point["Y"]+1; - } - $Corners[] = $Points[$subKey]["X"]-1; $Corners[] = $YZero; - - $this->drawPolygonChart($Corners,array("R"=>$R,"G"=>$G,"B"=>$B,"Alpha"=>$Alpha/2,"NoBorder"=>TRUE,"Threshold"=>$Threshold)); - } - $this->drawSpline($WayPoints,array("Force"=>$Force,"R"=>$R,"G"=>$G,"B"=>$B,"Alpha"=>$Alpha,"Ticks"=>$Ticks)); - } - } - else - { - if ( $XDivs == 0 ) { $YStep = ($this->GraphAreaY2-$this->GraphAreaY1)/4; } else { $YStep = ($this->GraphAreaY2-$this->GraphAreaY1-$XMargin*2)/$XDivs; } - $Y = $this->GraphAreaY1 + $XMargin; $WayPoints = ""; - $Force = $YStep / 5; - - if ( !$AroundZero ) { $YZero = $this->GraphAreaX1+1; } - if ( $YZero > $this->GraphAreaX2-1 ) { $YZero = $this->GraphAreaX2-1; } - if ( $YZero < $this->GraphAreaX1+1 ) { $YZero = $this->GraphAreaX1+1; } - - if ( !is_array($PosArray) ) { $Value = $PosArray; $PosArray = ""; $PosArray[0] = $Value; } - foreach($PosArray as $Key => $X) - { - if ( $DisplayValues ) - $this->drawText($X+$DisplayOffset,$Y,$this->scaleFormat($Serie["Data"][$Key],$Mode,$Format,$Unit),array("Angle"=>270,"R"=>$DisplayR,"G"=>$DisplayG,"B"=>$DisplayB,"Align"=>TEXT_ALIGN_BOTTOMMIDDLE)); - - if ( $X == VOID ) - { - $Area = $this->drawSpline($WayPoints,array("Force"=>$Force,"PathOnly"=>TRUE)); - - if ( $Area != "" ) - { - foreach ($Area as $key => $Points) - { - $Corners = ""; $Corners[] = $YZero; $Corners[] = $Area[$key][0]["Y"]; - foreach($Points as $subKey => $Point) - { - if ( $subKey == count($Points)-1) { $Corners[] = $Point["X"]-1; } else { $Corners[] = $Point["X"]; } - $Corners[] = $Point["Y"]; - } - $Corners[] = $YZero; $Corners[] = $Points[$subKey]["Y"]-1; - - $this->drawPolygonChart($Corners,array("R"=>$R,"G"=>$G,"B"=>$B,"Alpha"=>$Alpha/2,"NoBorder"=>TRUE,"Threshold"=>$Threshold)); - } - $this->drawSpline($WayPoints,array("Force"=>$Force,"R"=>$R,"G"=>$G,"B"=>$B,"Alpha"=>$Alpha,"Ticks"=>$Ticks)); - } - - $WayPoints = ""; - } - else - $WayPoints[] = array($X,$Y); - - $Y = $Y + $YStep; - } - $Area = $this->drawSpline($WayPoints,array("Force"=>$Force,"PathOnly"=>TRUE)); - - if ( $Area != "" ) - { - foreach ($Area as $key => $Points) - { - $Corners = ""; $Corners[] = $YZero; $Corners[] = $Area[$key][0]["Y"]; - foreach($Points as $subKey => $Point) - { - if ( $subKey == count($Points)-1) { $Corners[] = $Point["X"]-1; } else { $Corners[] = $Point["X"]; } - $Corners[] = $Point["Y"]; - } - $Corners[] = $YZero; $Corners[] = $Points[$subKey]["Y"]-1; - - $this->drawPolygonChart($Corners,array("R"=>$R,"G"=>$G,"B"=>$B,"Alpha"=>$Alpha/2,"NoBorder"=>TRUE,"Threshold"=>$Threshold)); - } - $this->drawSpline($WayPoints,array("Force"=>$Force,"R"=>$R,"G"=>$G,"B"=>$B,"Alpha"=>$Alpha,"Ticks"=>$Ticks)); - } - - } - } - } - } - - /* Draw a line chart */ - function drawLineChart($Format=NULL) - { - $BreakVoid = isset($Format["BreakVoid"]) ? $Format["BreakVoid"] : TRUE; - $VoidTicks = isset($Format["VoidTicks"]) ? $Format["VoidTicks"] : 4; - $BreakR = isset($Format["BreakR"]) ? $Format["BreakR"] : NULL; - $BreakG = isset($Format["BreakG"]) ? $Format["BreakG"] : NULL; - $BreakB = isset($Format["BreakB"]) ? $Format["BreakB"] : NULL; - $DisplayValues = isset($Format["DisplayValues"]) ? $Format["DisplayValues"] : FALSE; - $DisplayOffset = isset($Format["DisplayOffset"]) ? $Format["DisplayOffset"] : 2; - $DisplayColor = isset($Format["DisplayColor"]) ? $Format["DisplayColor"] : DISPLAY_MANUAL; - $DisplayR = isset($Format["DisplayR"]) ? $Format["DisplayR"] : 0; - $DisplayG = isset($Format["DisplayG"]) ? $Format["DisplayG"] : 0; - $DisplayB = isset($Format["DisplayB"]) ? $Format["DisplayB"] : 0; - $RecordImageMap = isset($Format["RecordImageMap"]) ? $Format["RecordImageMap"] : FALSE; - $ImageMapPlotSize = isset($Format["ImageMapPlotSize"]) ? $Format["ImageMapPlotSize"] : 5; - $ForceColor = isset($Format["ForceColor"]) ? $Format["ForceColor"] : FALSE; - $ForceR = isset($Format["ForceR"]) ? $Format["ForceR"] : 0; - $ForceG = isset($Format["ForceG"]) ? $Format["ForceG"] : 0; - $ForceB = isset($Format["ForceB"]) ? $Format["ForceB"] : 0; - $ForceAlpha = isset($Format["ForceAlpha"]) ? $Format["ForceAlpha"] : 100; - - $this->LastChartLayout = CHART_LAST_LAYOUT_REGULAR; - - $Data = $this->DataSet->getData(); - list($XMargin,$XDivs) = $this->scaleGetXSettings(); - foreach($Data["Series"] as $SerieName => $Serie) - { - if ( $Serie["isDrawable"] == TRUE && $SerieName != $Data["Abscissa"] ) - { - $R = $Serie["Color"]["R"]; $G = $Serie["Color"]["G"]; $B = $Serie["Color"]["B"]; $Alpha = $Serie["Color"]["Alpha"]; $Ticks = $Serie["Ticks"]; $Weight = $Serie["Weight"]; - - if ( $ForceColor ) - { $R = $ForceR; $G = $ForceG; $B = $ForceB; $Alpha = $ForceAlpha; } - - if ( $BreakR == NULL ) - $BreakSettings = array("R"=>$R,"G"=>$G,"B"=>$B,"Alpha"=>$Alpha,"Ticks"=>$VoidTicks,"Weight"=>$Weight); - else - $BreakSettings = array("R"=>$BreakR,"G"=>$BreakG,"B"=>$BreakB,"Alpha"=>$Alpha,"Ticks"=>$VoidTicks,"Weight"=>$Weight); - - if ( $DisplayColor == DISPLAY_AUTO ) { $DisplayR = $R; $DisplayG = $G; $DisplayB = $B; } - - $AxisID = $Serie["Axis"]; - $Mode = $Data["Axis"][$AxisID]["Display"]; - $Format = $Data["Axis"][$AxisID]["Format"]; - $Unit = $Data["Axis"][$AxisID]["Unit"]; - - if (isset($Serie["Description"])) { $SerieDescription = $Serie["Description"]; } else { $SerieDescription = $SerieName; } - - $PosArray = $this->scaleComputeY($Serie["Data"],array("AxisID"=>$Serie["Axis"])); - - $this->DataSet->Data["Series"][$SerieName]["XOffset"] = 0; - - if ( $Data["Orientation"] == SCALE_POS_LEFTRIGHT ) - { - if ( $XDivs == 0 ) { $XStep = ($this->GraphAreaX2-$this->GraphAreaX1)/4; } else { $XStep = ($this->GraphAreaX2-$this->GraphAreaX1-$XMargin*2)/$XDivs; } - $X = $this->GraphAreaX1 + $XMargin; $LastX = NULL; $LastY = NULL; - - if ( !is_array($PosArray) ) { $Value = $PosArray; $PosArray = ""; $PosArray[0] = $Value; } - $LastGoodY = NULL; $LastGoodX = NULL; - foreach($PosArray as $Key => $Y) - { - if ( $DisplayValues && $Serie["Data"][$Key] != VOID ) - { - if ( $Serie["Data"][$Key] > 0 ) { $Align = TEXT_ALIGN_BOTTOMMIDDLE; $Offset = $DisplayOffset; } else { $Align = TEXT_ALIGN_TOPMIDDLE; $Offset = -$DisplayOffset; } - $this->drawText($X,$Y-$Offset-$Weight,$this->scaleFormat($Serie["Data"][$Key],$Mode,$Format,$Unit),array("R"=>$DisplayR,"G"=>$DisplayG,"B"=>$DisplayB,"Align"=>$Align)); - } - - if ( $RecordImageMap && $Y != VOID ) { $this->addToImageMap("CIRCLE",floor($X).",".floor($Y).",".$ImageMapPlotSize,$this->toHTMLColor($R,$G,$B),$SerieDescription,$this->scaleFormat($Serie["Data"][$Key],$Mode,$Format,$Unit)); } - - if ( $Y != VOID && $LastX != NULL && $LastY != NULL ) - $this->drawLine($LastX,$LastY,$X,$Y,array("R"=>$R,"G"=>$G,"B"=>$B,"Alpha"=>$Alpha,"Ticks"=>$Ticks,"Weight"=>$Weight)); - - if ( $Y != VOID && $LastY == NULL && $LastGoodY != NULL && !$BreakVoid ) - { $this->drawLine($LastGoodX,$LastGoodY,$X,$Y,$BreakSettings); $LastGoodY = NULL; } - - if ( $Y != VOID ) { $LastGoodY = $Y; $LastGoodX = $X; } - if ( $Y == VOID ) { $Y = NULL; } - - $LastX = $X; $LastY = $Y; - $X = $X + $XStep; - } - } - else - { - if ( $XDivs == 0 ) { $YStep = ($this->GraphAreaY2-$this->GraphAreaY1)/4; } else { $YStep = ($this->GraphAreaY2-$this->GraphAreaY1-$XMargin*2)/$XDivs; } - $Y = $this->GraphAreaY1 + $XMargin; $LastX = NULL; $LastY = NULL; - - if ( !is_array($PosArray) ) { $Value = $PosArray; $PosArray = ""; $PosArray[0] = $Value; } - $LastGoodY = NULL; $LastGoodX = NULL; - foreach($PosArray as $Key => $X) - { - if ( $DisplayValues && $Serie["Data"][$Key] != VOID ) - { $this->drawText($X+$DisplayOffset+$Weight,$Y,$this->scaleFormat($Serie["Data"][$Key],$Mode,$Format,$Unit),array("Angle"=>270,"R"=>$DisplayR,"G"=>$DisplayG,"B"=>$DisplayB,"Align"=>TEXT_ALIGN_BOTTOMMIDDLE)); } - - if ( $RecordImageMap && $X != VOID ) { $this->addToImageMap("CIRCLE",floor($X).",".floor($Y).",".$ImageMapPlotSize,$this->toHTMLColor($R,$G,$B),$SerieDescription,$this->scaleFormat($Serie["Data"][$Key],$Mode,$Format,$Unit)); } - - if ( $X != VOID && $LastX != NULL && $LastY != NULL ) - $this->drawLine($LastX,$LastY,$X,$Y,array("R"=>$R,"G"=>$G,"B"=>$B,"Alpha"=>$Alpha,"Ticks"=>$Ticks,"Weight"=>$Weight)); - - if ( $X != VOID && $LastX == NULL && $LastGoodY != NULL && !$BreakVoid ) - { $this->drawLine($LastGoodX,$LastGoodY,$X,$Y,$BreakSettings); $LastGoodY = NULL; } - - if ( $X != VOID ) { $LastGoodY = $Y; $LastGoodX = $X; } - if ( $X == VOID ) { $X = NULL; } - - $LastX = $X; $LastY = $Y; - $Y = $Y + $YStep; - } - } - } - } - } - - /* Draw a line chart */ - function drawZoneChart($SerieA,$SerieB,$Format=NULL) - { - $AxisID = isset($Format["AxisID"]) ? $Format["AxisID"] : 0; - $LineR = isset($Format["LineR"]) ? $Format["LineR"] : 150; - $LineG = isset($Format["LineG"]) ? $Format["LineG"] : 150; - $LineB = isset($Format["LineB"]) ? $Format["LineB"] : 150; - $LineAlpha = isset($Format["LineAlpha"]) ? $Format["LineAlpha"] : 50; - $LineTicks = isset($Format["LineTicks"]) ? $Format["LineTicks"] : 1; - $AreaR = isset($Format["AreaR"]) ? $Format["AreaR"] : 150; - $AreaG = isset($Format["AreaG"]) ? $Format["AreaG"] : 150; - $AreaB = isset($Format["AreaB"]) ? $Format["AreaB"] : 150; - $AreaAlpha = isset($Format["AreaAlpha"]) ? $Format["AreaAlpha"] : 5; - - $this->LastChartLayout = CHART_LAST_LAYOUT_REGULAR; - - $Data = $this->DataSet->getData(); - if ( !isset($Data["Series"][$SerieA]["Data"]) || !isset($Data["Series"][$SerieB]["Data"]) ) { return(0); } - $SerieAData = $Data["Series"][$SerieA]["Data"]; - $SerieBData = $Data["Series"][$SerieB]["Data"]; - - list($XMargin,$XDivs) = $this->scaleGetXSettings(); - - $Mode = $Data["Axis"][$AxisID]["Display"]; - $Format = $Data["Axis"][$AxisID]["Format"]; - $Unit = $Data["Axis"][$AxisID]["Unit"]; - - $PosArrayA = $this->scaleComputeY($SerieAData,array("AxisID"=>$AxisID)); - $PosArrayB = $this->scaleComputeY($SerieBData,array("AxisID"=>$AxisID)); - if ( count($PosArrayA) != count($PosArrayB) ) { return(0); } - - if ( $Data["Orientation"] == SCALE_POS_LEFTRIGHT ) - { - if ( $XDivs == 0 ) { $XStep = ($this->GraphAreaX2-$this->GraphAreaX1)/4; } else { $XStep = ($this->GraphAreaX2-$this->GraphAreaX1-$XMargin*2)/$XDivs; } - $X = $this->GraphAreaX1 + $XMargin; $LastX = NULL; $LastY = NULL; - - $LastX = NULL; $LastY1 = NULL; $LastY2 = NULL; - $BoundsA = ""; $BoundsB = ""; - foreach($PosArrayA as $Key => $Y1) - { - $Y2 = $PosArrayB[$Key]; - - $BoundsA[] = $X; $BoundsA[] = $Y1; - $BoundsB[] = $X; $BoundsB[] = $Y2; - - $LastX = $X; - $LastY1 = $Y1; $LastY2 = $Y2; - - $X = $X + $XStep; - } - $Bounds = array_merge($BoundsA,$this->reversePlots($BoundsB)); - $this->drawPolygonChart($Bounds,array("R"=>$AreaR,"G"=>$AreaG,"B"=>$AreaB,"Alpha"=>$AreaAlpha)); - - for($i=0;$i<=count($BoundsA)-4;$i=$i+2) - { - $this->drawLine($BoundsA[$i],$BoundsA[$i+1],$BoundsA[$i+2],$BoundsA[$i+3],array("R"=>$LineR,"G"=>$LineG,"B"=>$LineB,"Alpha"=>$LineAlpha,"Ticks"=>$LineTicks)); - $this->drawLine($BoundsB[$i],$BoundsB[$i+1],$BoundsB[$i+2],$BoundsB[$i+3],array("R"=>$LineR,"G"=>$LineG,"B"=>$LineB,"Alpha"=>$LineAlpha,"Ticks"=>$LineTicks)); - } - } - else - { - if ( $XDivs == 0 ) { $YStep = ($this->GraphAreaY2-$this->GraphAreaY1)/4; } else { $YStep = ($this->GraphAreaY2-$this->GraphAreaY1-$XMargin*2)/$XDivs; } - $Y = $this->GraphAreaY1 + $XMargin; $LastX = NULL; $LastY = NULL; - - $LastY = NULL; $LastX1 = NULL; $LastX2 = NULL; - $BoundsA = ""; $BoundsB = ""; - foreach($PosArrayA as $Key => $X1) - { - $X2 = $PosArrayB[$Key]; - - $BoundsA[] = $X1; $BoundsA[] = $Y; - $BoundsB[] = $X2; $BoundsB[] = $Y; - - $LastY = $Y; - $LastX1 = $X1; $LastX2 = $X2; - - $Y = $Y + $YStep; - } - $Bounds = array_merge($BoundsA,$this->reversePlots($BoundsB)); - $this->drawPolygonChart($Bounds,array("R"=>$AreaR,"G"=>$AreaG,"B"=>$AreaB,"Alpha"=>$AreaAlpha)); - - for($i=0;$i<=count($BoundsA)-4;$i=$i+2) - { - $this->drawLine($BoundsA[$i],$BoundsA[$i+1],$BoundsA[$i+2],$BoundsA[$i+3],array("R"=>$LineR,"G"=>$LineG,"B"=>$LineB,"Alpha"=>$LineAlpha,"Ticks"=>$LineTicks)); - $this->drawLine($BoundsB[$i],$BoundsB[$i+1],$BoundsB[$i+2],$BoundsB[$i+3],array("R"=>$LineR,"G"=>$LineG,"B"=>$LineB,"Alpha"=>$LineAlpha,"Ticks"=>$LineTicks)); - } - } - } - - /* Draw a step chart */ - function drawStepChart($Format=NULL) - { - $BreakVoid = isset($Format["BreakVoid"]) ? $Format["BreakVoid"] : FALSE; - $ReCenter = isset($Format["ReCenter"]) ? $Format["ReCenter"] : TRUE; - $VoidTicks = isset($Format["VoidTicks"]) ? $Format["VoidTicks"] : 4; - $BreakR = isset($Format["BreakR"]) ? $Format["BreakR"] : NULL; - $BreakG = isset($Format["BreakG"]) ? $Format["BreakG"] : NULL; - $BreakB = isset($Format["BreakB"]) ? $Format["BreakB"] : NULL; - $DisplayValues = isset($Format["DisplayValues"]) ? $Format["DisplayValues"] :FALSE; - $DisplayOffset = isset($Format["DisplayOffset"]) ? $Format["DisplayOffset"] : 2; - $DisplayColor = isset($Format["DisplayColor"]) ? $Format["DisplayColor"] : DISPLAY_MANUAL; - $DisplayR = isset($Format["DisplayR"]) ? $Format["DisplayR"] : 0; - $DisplayG = isset($Format["DisplayG"]) ? $Format["DisplayG"] : 0; - $DisplayB = isset($Format["DisplayB"]) ? $Format["DisplayB"] : 0; - $RecordImageMap = isset($Format["RecordImageMap"]) ? $Format["RecordImageMap"] : FALSE; - $ImageMapPlotSize = isset($Format["ImageMapPlotSize"]) ? $Format["ImageMapPlotSize"] : 5; - - $this->LastChartLayout = CHART_LAST_LAYOUT_REGULAR; - - $Data = $this->DataSet->getData(); - list($XMargin,$XDivs) = $this->scaleGetXSettings(); - foreach($Data["Series"] as $SerieName => $Serie) - { - if ( $Serie["isDrawable"] == TRUE && $SerieName != $Data["Abscissa"] ) - { - $R = $Serie["Color"]["R"]; $G = $Serie["Color"]["G"]; $B = $Serie["Color"]["B"]; $Alpha = $Serie["Color"]["Alpha"]; $Ticks = $Serie["Ticks"]; $Weight = $Serie["Weight"]; - - if (isset($Serie["Description"])) { $SerieDescription = $Serie["Description"]; } else { $SerieDescription = $SerieName; } - - if ( $BreakR == NULL ) - $BreakSettings = array("R"=>$R,"G"=>$G,"B"=>$B,"Alpha"=>$Alpha,"Ticks"=>$VoidTicks,"Weight"=>$Weight); - else - $BreakSettings = array("R"=>$BreakR,"G"=>$BreakG,"B"=>$BreakB,"Alpha"=>$Alpha,"Ticks"=>$VoidTicks,"Weight"=>$Weight); - - if ( $DisplayColor == DISPLAY_AUTO ) { $DisplayR = $R; $DisplayG = $G; $DisplayB = $B; } - - $AxisID = $Serie["Axis"]; - $Mode = $Data["Axis"][$AxisID]["Display"]; - $Format = $Data["Axis"][$AxisID]["Format"]; - $Unit = $Data["Axis"][$AxisID]["Unit"]; - $Color = array("R"=>$R,"G"=>$G,"B"=>$B,"Alpha"=>$Alpha,"Ticks"=>$Ticks,"Weight"=>$Weight); - - $PosArray = $this->scaleComputeY($Serie["Data"],array("AxisID"=>$Serie["Axis"])); - - $this->DataSet->Data["Series"][$SerieName]["XOffset"] = 0; - - if ( $Data["Orientation"] == SCALE_POS_LEFTRIGHT ) - { - if ( $XDivs == 0 ) { $XStep = ($this->GraphAreaX2-$this->GraphAreaX1)/4; } else { $XStep = ($this->GraphAreaX2-$this->GraphAreaX1-$XMargin*2)/$XDivs; } - $X = $this->GraphAreaX1 + $XMargin; $LastX = NULL; $LastY = NULL; - - if ( !is_array($PosArray) ) { $Value = $PosArray; $PosArray = ""; $PosArray[0] = $Value; } - $LastGoodY = NULL; $LastGoodX = NULL; $Init = FALSE; - foreach($PosArray as $Key => $Y) - { - if ( $DisplayValues && $Serie["Data"][$Key] != VOID ) - { - if ( $Y <= $LastY ) { $Align = TEXT_ALIGN_BOTTOMMIDDLE; $Offset = $DisplayOffset; } else { $Align = TEXT_ALIGN_TOPMIDDLE; $Offset = -$DisplayOffset; } - $this->drawText($X,$Y-$Offset-$Weight,$this->scaleFormat($Serie["Data"][$Key],$Mode,$Format,$Unit),array("R"=>$DisplayR,"G"=>$DisplayG,"B"=>$DisplayB,"Align"=>$Align)); - } - - if ( $Y != VOID && $LastX != NULL && $LastY != NULL ) - { - $this->drawLine($LastX,$LastY,$X,$LastY,$Color); - $this->drawLine($X,$LastY,$X,$Y,$Color); - if ( $ReCenter && $X+$XStep < $this->GraphAreaX2 - $XMargin ) - { - $this->drawLine($X,$Y,$X+$XStep,$Y,$Color); - if ( $RecordImageMap ) { $this->addToImageMap("RECT",floor($X-$ImageMapPlotSize).",".floor($Y-$ImageMapPlotSize).",".floor($X+$XStep+$ImageMapPlotSize).",".floor($Y+$ImageMapPlotSize),$this->toHTMLColor($R,$G,$B),$SerieDescription,$this->scaleFormat($Serie["Data"][$Key],$Mode,$Format,$Unit)); } - } - else - { if ( $RecordImageMap ) { $this->addToImageMap("RECT",floor($LastX-$ImageMapPlotSize).",".floor($LastY-$ImageMapPlotSize).",".floor($X+$ImageMapPlotSize).",".floor($LastY+$ImageMapPlotSize),$this->toHTMLColor($R,$G,$B),$SerieDescription,$this->scaleFormat($Serie["Data"][$Key],$Mode,$Format,$Unit)); } } - } - - if ( $Y != VOID && $LastY == NULL && $LastGoodY != NULL && !$BreakVoid ) - { - if ( $ReCenter ) - { - $this->drawLine($LastGoodX+$XStep,$LastGoodY,$X,$LastGoodY,$BreakSettings); - if ( $RecordImageMap ) { $this->addToImageMap("RECT",floor($LastGoodX+$XStep-$ImageMapPlotSize).",".floor($LastGoodY-$ImageMapPlotSize).",".floor($X+$ImageMapPlotSize).",".floor($LastGoodY+$ImageMapPlotSize),$this->toHTMLColor($R,$G,$B),$SerieDescription,$this->scaleFormat($Serie["Data"][$Key],$Mode,$Format,$Unit)); } - } - else - { - $this->drawLine($LastGoodX,$LastGoodY,$X,$LastGoodY,$BreakSettings); - if ( $RecordImageMap ) { $this->addToImageMap("RECT",floor($LastGoodX-$ImageMapPlotSize).",".floor($LastGoodY-$ImageMapPlotSize).",".floor($X+$ImageMapPlotSize).",".floor($LastGoodY+$ImageMapPlotSize),$this->toHTMLColor($R,$G,$B),$SerieDescription,$this->scaleFormat($Serie["Data"][$Key],$Mode,$Format,$Unit)); } - } - - $this->drawLine($X,$LastGoodY,$X,$Y,$BreakSettings); - $LastGoodY = NULL; - } - elseif( !$BreakVoid && $LastGoodY == NULL && $Y != VOID ) - { - $this->drawLine($this->GraphAreaX1 + $XMargin,$Y,$X,$Y,$BreakSettings); - if ( $RecordImageMap ) { $this->addToImageMap("RECT",floor($this->GraphAreaX1+$XMargin-$ImageMapPlotSize).",".floor($Y-$ImageMapPlotSize).",".floor($X+$ImageMapPlotSize).",".floor($Y+$ImageMapPlotSize),$this->toHTMLColor($R,$G,$B),$SerieDescription,$this->scaleFormat($Serie["Data"][$Key],$Mode,$Format,$Unit)); } - } - - if ( $Y != VOID ) { $LastGoodY = $Y; $LastGoodX = $X; } - if ( $Y == VOID ) { $Y = NULL; } - - if ( !$Init && $ReCenter ) { $X = $X - $XStep/2; $Init = TRUE; } - $LastX = $X; $LastY = $Y; - if ( $LastX < $this->GraphAreaX1 + $XMargin ) { $LastX = $this->GraphAreaX1 + $XMargin; } - $X = $X + $XStep; - } - if ( $ReCenter ) - { - $this->drawLine($LastX,$LastY,$this->GraphAreaX2 - $XMargin,$LastY,$Color); - if ( $RecordImageMap ) { $this->addToImageMap("RECT",floor($LastX-$ImageMapPlotSize).",".floor($LastY-$ImageMapPlotSize).",".floor($this->GraphAreaX2-$XMargin+$ImageMapPlotSize).",".floor($LastY+$ImageMapPlotSize),$this->toHTMLColor($R,$G,$B),$SerieDescription,$this->scaleFormat($Serie["Data"][$Key],$Mode,$Format,$Unit)); } - } - } - else - { - if ( $XDivs == 0 ) { $YStep = ($this->GraphAreaY2-$this->GraphAreaY1)/4; } else { $YStep = ($this->GraphAreaY2-$this->GraphAreaY1-$XMargin*2)/$XDivs; } - $Y = $this->GraphAreaY1 + $XMargin; $LastX = NULL; $LastY = NULL; - - if ( !is_array($PosArray) ) { $Value = $PosArray; $PosArray = ""; $PosArray[0] = $Value; } - $LastGoodY = NULL; $LastGoodX = NULL; $Init = FALSE; - foreach($PosArray as $Key => $X) - { - if ( $DisplayValues && $Serie["Data"][$Key] != VOID ) - { - if ( $X >= $LastX ) { $Align = TEXT_ALIGN_MIDDLELEFT; $Offset = $DisplayOffset; } else { $Align = TEXT_ALIGN_MIDDLERIGHT; $Offset = -$DisplayOffset; } - $this->drawText($X+$Offset+$Weight,$Y,$this->scaleFormat($Serie["Data"][$Key],$Mode,$Format,$Unit),array("R"=>$DisplayR,"G"=>$DisplayG,"B"=>$DisplayB,"Align"=>$Align)); - } - - if ( $X != VOID && $LastX != NULL && $LastY != NULL ) - { - $this->drawLine($LastX,$LastY,$LastX,$Y,$Color); - $this->drawLine($LastX,$Y,$X,$Y,$Color); - - if ( $RecordImageMap ) { $this->addToImageMap("RECT",floor($LastX-$ImageMapPlotSize).",".floor($LastY-$ImageMapPlotSize).",".floor($LastX+$XStep+$ImageMapPlotSize).",".floor($Y+$ImageMapPlotSize),$this->toHTMLColor($R,$G,$B),$SerieDescription,$this->scaleFormat($Serie["Data"][$Key],$Mode,$Format,$Unit)); } - } - - if ( $X != VOID && $LastX == NULL && $LastGoodY != NULL && !$BreakVoid ) - { - $this->drawLine($LastGoodX,$LastGoodY,$LastGoodX,$LastGoodY+$YStep,$Color); - if ( $RecordImageMap ) { $this->addToImageMap("RECT",floor($LastGoodX-$ImageMapPlotSize).",".floor($LastGoodY-$ImageMapPlotSize).",".floor($LastGoodX+$ImageMapPlotSize).",".floor($LastGoodY+$YStep+$ImageMapPlotSize),$this->toHTMLColor($R,$G,$B),$SerieDescription,$this->scaleFormat($Serie["Data"][$Key],$Mode,$Format,$Unit)); } - - $this->drawLine($LastGoodX,$LastGoodY+$YStep,$LastGoodX,$Y,$BreakSettings); - if ( $RecordImageMap ) { $this->addToImageMap("RECT",floor($LastGoodX-$ImageMapPlotSize).",".floor($LastGoodY+$YStep-$ImageMapPlotSize).",".floor($LastGoodX+$ImageMapPlotSize).",".floor($YStep+$ImageMapPlotSize),$this->toHTMLColor($R,$G,$B),$SerieDescription,$this->scaleFormat($Serie["Data"][$Key],$Mode,$Format,$Unit)); } - - $this->drawLine($LastGoodX,$Y,$X,$Y,$BreakSettings); - $LastGoodY = NULL; - } - elseif ( $X != VOID && $LastGoodY == NULL && !$BreakVoid ) - { - $this->drawLine($X,$this->GraphAreaY1 + $XMargin,$X,$Y,$BreakSettings); - if ( $RecordImageMap ) { $this->addToImageMap("RECT",floor($X-$ImageMapPlotSize).",".floor($this->GraphAreaY1+$XMargin-$ImageMapPlotSize).",".floor($X+$ImageMapPlotSize).",".floor($Y+$ImageMapPlotSize),$this->toHTMLColor($R,$G,$B),$SerieDescription,$this->scaleFormat($Serie["Data"][$Key],$Mode,$Format,$Unit)); } - } - - if ( $X != VOID ) { $LastGoodY = $Y; $LastGoodX = $X; } - if ( $X == VOID ) { $X = NULL; } - - if ( !$Init && $ReCenter ) { $Y = $Y - $YStep/2; $Init = TRUE; } - $LastX = $X; $LastY = $Y; - if ( $LastY < $this->GraphAreaY1 + $XMargin ) { $LastY = $this->GraphAreaY1 + $XMargin; } - $Y = $Y + $YStep; - } - if ( $ReCenter ) - { - $this->drawLine($LastX,$LastY,$LastX,$this->GraphAreaY2 - $XMargin,$Color); - if ( $RecordImageMap ) { $this->addToImageMap("RECT",floor($LastX-$ImageMapPlotSize).",".floor($LastY-$ImageMapPlotSize).",".floor($LastX+$ImageMapPlotSize).",".floor($this->GraphAreaY2-$XMargin+$ImageMapPlotSize),$this->toHTMLColor($R,$G,$B),$SerieDescription,$this->scaleFormat($Serie["Data"][$Key],$Mode,$Format,$Unit)); } - } - } - } - } - } - - /* Draw a step chart */ - function drawFilledStepChart($Format=NULL) - { - $ReCenter = isset($Format["ReCenter"]) ? $Format["ReCenter"] : TRUE; - $DisplayValues = isset($Format["DisplayValues"]) ? $Format["DisplayValues"] :FALSE; - $DisplayOffset = isset($Format["DisplayOffset"]) ? $Format["DisplayOffset"] : 2; - $DisplayColor = isset($Format["DisplayColor"]) ? $Format["DisplayColor"] : DISPLAY_MANUAL; - $ForceTransparency = isset($Format["ForceTransparency"]) ? $Format["ForceTransparency"] : NULL; - $DisplayR = isset($Format["DisplayR"]) ? $Format["DisplayR"] : 0; - $DisplayG = isset($Format["DisplayG"]) ? $Format["DisplayG"] : 0; - $DisplayB = isset($Format["DisplayB"]) ? $Format["DisplayB"] : 0; - $AroundZero = isset($Format["AroundZero"]) ? $Format["AroundZero"] : TRUE; - - $this->LastChartLayout = CHART_LAST_LAYOUT_REGULAR; - - $Data = $this->DataSet->getData(); - list($XMargin,$XDivs) = $this->scaleGetXSettings(); - foreach($Data["Series"] as $SerieName => $Serie) - { - if ( $Serie["isDrawable"] == TRUE && $SerieName != $Data["Abscissa"] ) - { - $R = $Serie["Color"]["R"]; $G = $Serie["Color"]["G"]; $B = $Serie["Color"]["B"]; $Alpha = $Serie["Color"]["Alpha"]; $Ticks = $Serie["Ticks"]; $Weight = $Serie["Weight"]; - - if ( $DisplayColor == DISPLAY_AUTO ) { $DisplayR = $R; $DisplayG = $G; $DisplayB = $B; } - - $AxisID = $Serie["Axis"]; - $Mode = $Data["Axis"][$AxisID]["Display"]; - $Format = $Data["Axis"][$AxisID]["Format"]; - $Unit = $Data["Axis"][$AxisID]["Unit"]; - - $Color = array("R"=>$R,"G"=>$G,"B"=>$B); - if ( $ForceTransparency != NULL ) { $Color["Alpha"] = $ForceTransparency; } else { $Color["Alpha"] = $Alpha; } - - $PosArray = $this->scaleComputeY($Serie["Data"],array("AxisID"=>$Serie["Axis"])); - $YZero = $this->scaleComputeY(0,array("AxisID"=>$Serie["Axis"])); - - $this->DataSet->Data["Series"][$SerieName]["XOffset"] = 0; - - if ( $Data["Orientation"] == SCALE_POS_LEFTRIGHT ) - { - if ( $YZero > $this->GraphAreaY2-1 ) { $YZero = $this->GraphAreaY2-1; } - if ( $YZero < $this->GraphAreaY1+1 ) { $YZero = $this->GraphAreaY1+1; } - - if ( $XDivs == 0 ) { $XStep = ($this->GraphAreaX2-$this->GraphAreaX1)/4; } else { $XStep = ($this->GraphAreaX2-$this->GraphAreaX1-$XMargin*2)/$XDivs; } - $X = $this->GraphAreaX1 + $XMargin; $LastX = NULL; $LastY = NULL; - - if ( !$AroundZero ) { $YZero = $this->GraphAreaY2-1; } - - if ( !is_array($PosArray) ) { $Value = $PosArray; $PosArray = ""; $PosArray[0] = $Value; } - $LastGoodY = NULL; $LastGoodX = NULL; $Points = ""; $Init = FALSE; - foreach($PosArray as $Key => $Y) - { - if ( $Y == VOID && $LastX != NULL && $LastY != NULL && $Points !="" ) - { - $Points[] = $LastX; $Points[] = $LastY; - $Points[] = $X; $Points[] = $LastY; - $Points[] = $X; $Points[] = $YZero; - $this->drawPolygon($Points,$Color); - $Points = ""; - } - - if ( $Y != VOID && $LastX != NULL && $LastY != NULL ) - { - if ( $Points == "") { $Points[] = $LastX; $Points[] = $YZero; } - $Points[] = $LastX; $Points[] = $LastY; - $Points[] = $X; $Points[] = $LastY; - $Points[] = $X; $Points[] = $Y; - } - - if ( $Y != VOID ) { $LastGoodY = $Y; $LastGoodX = $X; } - if ( $Y == VOID ) { $Y = NULL; } - - if ( !$Init && $ReCenter ) { $X = $X - $XStep/2; $Init = TRUE; } - $LastX = $X; $LastY = $Y; - if ( $LastX < $this->GraphAreaX1 + $XMargin ) { $LastX = $this->GraphAreaX1 + $XMargin; } - $X = $X + $XStep; - } - - if ( $ReCenter ) - { - $Points[] = $LastX+$XStep/2; $Points[] = $LastY; - $Points[] = $LastX+$XStep/2; $Points[] = $YZero; - } - else - { $Points[] = $LastX; $Points[] = $YZero; } - - $this->drawPolygon($Points,$Color); - } - else - { - if ( $YZero < $this->GraphAreaX1+1 ) { $YZero = $this->GraphAreaX1+1; } - if ( $YZero > $this->GraphAreaX2-1 ) { $YZero = $this->GraphAreaX2-1; } - - if ( $XDivs == 0 ) { $YStep = ($this->GraphAreaY2-$this->GraphAreaY1)/4; } else { $YStep = ($this->GraphAreaY2-$this->GraphAreaY1-$XMargin*2)/$XDivs; } - $Y = $this->GraphAreaY1 + $XMargin; $LastX = NULL; $LastY = NULL; - - if ( !is_array($PosArray) ) { $Value = $PosArray; $PosArray = ""; $PosArray[0] = $Value; } - $LastGoodY = NULL; $LastGoodX = NULL; $Points = ""; - foreach($PosArray as $Key => $X) - { - if ( $X == VOID && $LastX != NULL && $LastY != NULL && $Points !="" ) - { - $Points[] = $LastX; $Points[] = $LastY; - $Points[] = $LastX; $Points[] = $Y; - $Points[] = $YZero; $Points[] = $Y; - $this->drawPolygon($Points,$Color); - $Points = ""; - } - - if ( $X != VOID && $LastX != NULL && $LastY != NULL ) - { - if ( $Points == "") { $Points[] = $YZero; $Points[] = $LastY; } - $Points[] = $LastX; $Points[] = $LastY; - $Points[] = $LastX; $Points[] = $Y; - $Points[] = $X; $Points[] = $Y; - } - - if ( $X != VOID ) { $LastGoodY = $Y; $LastGoodX = $X; } - if ( $X == VOID ) { $X = NULL; } - - if ( $LastX == NULL && $ReCenter ) { $Y = $Y - $YStep/2; } - $LastX = $X; $LastY = $Y; - if ( $LastY < $this->GraphAreaY1 + $XMargin ) { $LastY = $this->GraphAreaY1 + $XMargin; } - $Y = $Y + $YStep; - } - - if ( $ReCenter ) - { - $Points[] = $LastX; $Points[] = $LastY+$YStep/2; - $Points[] = $YZero; $Points[] = $LastY+$YStep/2; - } - else - { $Points[] = $YZero; $Points[] = $LastY; } - - $this->drawPolygon($Points,$Color); - } - } - } - } - - /* Draw an area chart */ - function drawAreaChart($Format=NULL) - { - $DisplayValues = isset($Format["DisplayValues"]) ? $Format["DisplayValues"] : FALSE; - $DisplayOffset = isset($Format["DisplayOffset"]) ? $Format["DisplayOffset"] : 2; - $DisplayColor = isset($Format["DisplayColor"]) ? $Format["DisplayColor"] : DISPLAY_MANUAL; - $DisplayR = isset($Format["DisplayR"]) ? $Format["DisplayR"] : 0; - $DisplayG = isset($Format["DisplayG"]) ? $Format["DisplayG"] : 0; - $DisplayB = isset($Format["DisplayB"]) ? $Format["DisplayB"] : 0; - $ForceTransparency = isset($Format["ForceTransparency"]) ? $Format["ForceTransparency"] : 25; - $AroundZero = isset($Format["AroundZero"]) ? $Format["AroundZero"] : TRUE; - $Threshold = isset($Format["Threshold"]) ? $Format["Threshold"] : NULL; - - $this->LastChartLayout = CHART_LAST_LAYOUT_REGULAR; - - $Data = $this->DataSet->getData(); - list($XMargin,$XDivs) = $this->scaleGetXSettings(); - - foreach($Data["Series"] as $SerieName => $Serie) - { - if ( $Serie["isDrawable"] == TRUE && $SerieName != $Data["Abscissa"] ) - { - $R = $Serie["Color"]["R"]; $G = $Serie["Color"]["G"]; $B = $Serie["Color"]["B"]; $Alpha = $Serie["Color"]["Alpha"]; $Ticks = $Serie["Ticks"]; - if ( $DisplayColor == DISPLAY_AUTO ) { $DisplayR = $R; $DisplayG = $G; $DisplayB = $B; } - - $AxisID = $Serie["Axis"]; - $Mode = $Data["Axis"][$AxisID]["Display"]; - $Format = $Data["Axis"][$AxisID]["Format"]; - $Unit = $Data["Axis"][$AxisID]["Unit"]; - - $PosArray = $this->scaleComputeY($Serie["Data"],array("AxisID"=>$Serie["Axis"])); - $YZero = $this->scaleComputeY(0,array("AxisID"=>$Serie["Axis"])); - - if ( $Threshold != NULL ) - { - foreach($Threshold as $Key => $Params) - { - $Threshold[$Key]["MinX"] = $this->scaleComputeY($Params["Min"],array("AxisID"=>$Serie["Axis"])); - $Threshold[$Key]["MaxX"] = $this->scaleComputeY($Params["Max"],array("AxisID"=>$Serie["Axis"])); - } - } - - $this->DataSet->Data["Series"][$SerieName]["XOffset"] = 0; - - if ( $Data["Orientation"] == SCALE_POS_LEFTRIGHT ) - { - if ( $YZero > $this->GraphAreaY2-1 ) { $YZero = $this->GraphAreaY2-1; } - - $Areas = ""; $AreaID = 0; - $Areas[$AreaID][] = $this->GraphAreaX1 + $XMargin; - if ( $AroundZero ) { $Areas[$AreaID][] = $YZero; } else { $Areas[$AreaID][] = $this->GraphAreaY2-1; } - - if ( $XDivs == 0 ) { $XStep = ($this->GraphAreaX2-$this->GraphAreaX1)/4; } else { $XStep = ($this->GraphAreaX2-$this->GraphAreaX1-$XMargin*2)/$XDivs; } - $X = $this->GraphAreaX1 + $XMargin; $LastX = NULL; $LastY = NULL; - - if ( !is_array($PosArray) ) { $Value = $PosArray; $PosArray = ""; $PosArray[0] = $Value; } - foreach($PosArray as $Key => $Y) - { - if ( $DisplayValues && $Serie["Data"][$Key] != VOID ) - { - if ( $Serie["Data"][$Key] > 0 ) { $Align = TEXT_ALIGN_BOTTOMMIDDLE; $Offset = $DisplayOffset; } else { $Align = TEXT_ALIGN_TOPMIDDLE; $Offset = -$DisplayOffset; } - $this->drawText($X,$Y-$Offset,$this->scaleFormat($Serie["Data"][$Key],$Mode,$Format,$Unit),array("R"=>$DisplayR,"G"=>$DisplayG,"B"=>$DisplayB,"Align"=>$Align)); - } - - if ( $Y == VOID && isset($Areas[$AreaID]) ) - { - if($LastX == NULL) - { $Areas[$AreaID][] = $X; } - else - { $Areas[$AreaID][] = $LastX; } - - if ( $AroundZero ) { $Areas[$AreaID][] = $YZero; } else { $Areas[$AreaID][] = $this->GraphAreaY2-1; } - $AreaID++; - } - elseif ($Y != VOID) - { - if ( !isset($Areas[$AreaID]) ) - { - $Areas[$AreaID][] = $X; - if ( $AroundZero ) { $Areas[$AreaID][] = $YZero; } else { $Areas[$AreaID][] = $this->GraphAreaY2-1; } - } - - $Areas[$AreaID][] = $X; - $Areas[$AreaID][] = $Y; - } - - $LastX = $X; - $X = $X + $XStep; - } - $Areas[$AreaID][] = $LastX; - if ( $AroundZero ) { $Areas[$AreaID][] = $YZero; } else { $Areas[$AreaID][] = $this->GraphAreaY2-1; } - - /* Handle shadows in the areas */ - if ( $this->Shadow ) - { - $ShadowArea = ""; - foreach($Areas as $Key => $Points) - { - $ShadowArea[$Key] = ""; - foreach($Points as $Key2 => $Value) - { - if ( $Key2 % 2 == 0 ) - { $ShadowArea[$Key][] = $Value + $this->ShadowX; } - else - { $ShadowArea[$Key][] = $Value + $this->ShadowY; } - } - } - - foreach($ShadowArea as $Key => $Points) - $this->drawPolygonChart($Points,array("R"=>$this->ShadowR,"G"=>$this->ShadowG,"B"=>$this->ShadowB,"Alpha"=>$this->Shadowa)); - } - - $Alpha = $ForceTransparency != NULL ? $ForceTransparency : $Alpha; - $Color = array("R"=>$R,"G"=>$G,"B"=>$B,"Alpha"=>$Alpha,"Threshold"=>$Threshold); - - foreach($Areas as $Key => $Points) - $this->drawPolygonChart($Points,$Color); - } - else - { - if ( $YZero < $this->GraphAreaX1+1 ) { $YZero = $this->GraphAreaX1+1; } - if ( $YZero > $this->GraphAreaX2-1 ) { $YZero = $this->GraphAreaX2-1; } - - $Areas = ""; $AreaID = 0; - if ( $AroundZero ) { $Areas[$AreaID][] = $YZero; } else { $Areas[$AreaID][] = $this->GraphAreaX1+1; } - $Areas[$AreaID][] = $this->GraphAreaY1 + $XMargin; - - if ( $XDivs == 0 ) { $YStep = ($this->GraphAreaY2-$this->GraphAreaY1)/4; } else { $YStep = ($this->GraphAreaY2-$this->GraphAreaY1-$XMargin*2)/$XDivs; } - $Y = $this->GraphAreaY1 + $XMargin; $LastX = NULL; $LastY = NULL; - - if ( !is_array($PosArray) ) { $Value = $PosArray; $PosArray = ""; $PosArray[0] = $Value; } - foreach($PosArray as $Key => $X) - { - if ( $DisplayValues && $Serie["Data"][$Key] != VOID ) - { - if ( $Serie["Data"][$Key] > 0 ) { $Align = TEXT_ALIGN_BOTTOMMIDDLE; $Offset = $DisplayOffset; } else { $Align = TEXT_ALIGN_TOPMIDDLE; $Offset = -$DisplayOffset; } - $this->drawText($X+$Offset,$Y,$this->scaleFormat($Serie["Data"][$Key],$Mode,$Format,$Unit),array("Angle"=>270,"R"=>$DisplayR,"G"=>$DisplayG,"B"=>$DisplayB,"Align"=>$Align)); - } - - if ( $X == VOID && isset($Areas[$AreaID]) ) - { - if ( $AroundZero ) { $Areas[$AreaID][] = $YZero; } else { $Areas[$AreaID][] = $this->GraphAreaX1+1; } - - if($LastY == NULL) - { $Areas[$AreaID][] = $Y; } - else - { $Areas[$AreaID][] = $LastY; } - - $AreaID++; - } - elseif ($X != VOID) - { - if ( !isset($Areas[$AreaID]) ) - { - if ( $AroundZero ) { $Areas[$AreaID][] = $YZero; } else { $Areas[$AreaID][] = $this->GraphAreaX1+1; } - $Areas[$AreaID][] = $Y; - } - - $Areas[$AreaID][] = $X; - $Areas[$AreaID][] = $Y; - } - - $LastX = $X; $LastY = $Y; - $Y = $Y + $YStep; - } - if ( $AroundZero ) { $Areas[$AreaID][] = $YZero; } else { $Areas[$AreaID][] = $this->GraphAreaX1+1; } - $Areas[$AreaID][] = $LastY; - - /* Handle shadows in the areas */ - if ( $this->Shadow ) - { - $ShadowArea = ""; - foreach($Areas as $Key => $Points) - { - $ShadowArea[$Key] = ""; - foreach($Points as $Key2 => $Value) - { - if ( $Key2 % 2 == 0 ) - { $ShadowArea[$Key][] = $Value + $this->ShadowX; } - else - { $ShadowArea[$Key][] = $Value + $this->ShadowY; } - } - } - - foreach($ShadowArea as $Key => $Points) - $this->drawPolygonChart($Points,array("R"=>$this->ShadowR,"G"=>$this->ShadowG,"B"=>$this->ShadowB,"Alpha"=>$this->Shadowa)); - } - - $Alpha = $ForceTransparency != NULL ? $ForceTransparency : $Alpha; - $Color = array("R"=>$R,"G"=>$G,"B"=>$B,"Alpha"=>$Alpha,"Threshold"=>$Threshold); - - foreach($Areas as $Key => $Points) - $this->drawPolygonChart($Points,$Color); - } - } - } - } - - - /* Draw a bar chart */ - function drawBarChart($Format=NULL) - { - $Floating0Serie = isset($Format["Floating0Serie"]) ? $Format["Floating0Serie"] : NULL; - $Floating0Value = isset($Format["Floating0Value"]) ? $Format["Floating0Value"] : NULL; - $Draw0Line = isset($Format["Draw0Line"]) ? $Format["Draw0Line"] : FALSE; - $DisplayValues = isset($Format["DisplayValues"]) ? $Format["DisplayValues"] : FALSE; - $DisplayOrientation = isset($Format["DisplayOrientation"]) ? $Format["DisplayOrientation"] : ORIENTATION_HORIZONTAL; - $DisplayOffset = isset($Format["DisplayOffset"]) ? $Format["DisplayOffset"] : 2; - $DisplayColor = isset($Format["DisplayColor"]) ? $Format["DisplayColor"] : DISPLAY_MANUAL; - $DisplayFont = isset($Format["DisplaySize"]) ? $Format["DisplaySize"] : $this->FontName; - $DisplaySize = isset($Format["DisplaySize"]) ? $Format["DisplaySize"] : $this->FontSize; - $DisplayPos = isset($Format["DisplayPos"]) ? $Format["DisplayPos"] : LABEL_POS_OUTSIDE; - $DisplayShadow = isset($Format["DisplayShadow"]) ? $Format["DisplayShadow"] : TRUE; - $DisplayR = isset($Format["DisplayR"]) ? $Format["DisplayR"] : 0; - $DisplayG = isset($Format["DisplayG"]) ? $Format["DisplayG"] : 0; - $DisplayB = isset($Format["DisplayB"]) ? $Format["DisplayB"] : 0; - $AroundZero = isset($Format["AroundZero"]) ? $Format["AroundZero"] : TRUE; - $Interleave = isset($Format["Interleave"]) ? $Format["Interleave"] : .5; - $Rounded = isset($Format["Rounded"]) ? $Format["Rounded"] : FALSE; - $RoundRadius = isset($Format["RoundRadius"]) ? $Format["RoundRadius"] : 4; - $Surrounding = isset($Format["Surrounding"]) ? $Format["Surrounding"] : NULL; - $BorderR = isset($Format["BorderR"]) ? $Format["BorderR"] : -1; - $BorderG = isset($Format["BorderG"]) ? $Format["BorderG"] : -1; - $BorderB = isset($Format["BorderB"]) ? $Format["BorderB"] : -1; - $Gradient = isset($Format["Gradient"]) ? $Format["Gradient"] : FALSE; - $GradientMode = isset($Format["GradientMode"]) ? $Format["GradientMode"] : GRADIENT_SIMPLE; - $GradientAlpha = isset($Format["GradientAlpha"]) ? $Format["GradientAlpha"] : 20; - $GradientStartR = isset($Format["GradientStartR"]) ? $Format["GradientStartR"] : 255; - $GradientStartG = isset($Format["GradientStartG"]) ? $Format["GradientStartG"] : 255; - $GradientStartB = isset($Format["GradientStartB"]) ? $Format["GradientStartB"] : 255; - $GradientEndR = isset($Format["GradientEndR"]) ? $Format["GradientEndR"] : 0; - $GradientEndG = isset($Format["GradientEndG"]) ? $Format["GradientEndG"] : 0; - $GradientEndB = isset($Format["GradientEndB"]) ? $Format["GradientEndB"] : 0; - $TxtMargin = isset($Format["TxtMargin"]) ? $Format["TxtMargin"] : 6; - $OverrideColors = isset($Format["OverrideColors"]) ? $Format["OverrideColors"] : NULL; - $OverrideSurrounding = isset($Format["OverrideSurrounding"]) ? $Format["OverrideSurrounding"] : 30; - $InnerSurrounding = isset($Format["InnerSurrounding"]) ? $Format["InnerSurrounding"] : NULL; - $InnerBorderR = isset($Format["InnerBorderR"]) ? $Format["InnerBorderR"] : -1; - $InnerBorderG = isset($Format["InnerBorderG"]) ? $Format["InnerBorderG"] : -1; - $InnerBorderB = isset($Format["InnerBorderB"]) ? $Format["InnerBorderB"] : -1; - $RecordImageMap = isset($Format["RecordImageMap"]) ? $Format["RecordImageMap"] : FALSE; - - $this->LastChartLayout = CHART_LAST_LAYOUT_REGULAR; - - $Data = $this->DataSet->getData(); - list($XMargin,$XDivs) = $this->scaleGetXSettings(); - - if ( $OverrideColors != NULL ) - { - $OverrideColors = $this->validatePalette($OverrideColors,$OverrideSurrounding); - $this->DataSet->saveExtendedData("Palette",$OverrideColors); - } - - $RestoreShadow = $this->Shadow; - - $SeriesCount = $this->countDrawableSeries(); - $CurrentSerie = 0; - foreach($Data["Series"] as $SerieName => $Serie) - { - if ( $Serie["isDrawable"] == TRUE && $SerieName != $Data["Abscissa"] ) - { - $R = $Serie["Color"]["R"]; $G = $Serie["Color"]["G"]; $B = $Serie["Color"]["B"]; $Alpha = $Serie["Color"]["Alpha"]; $Ticks = $Serie["Ticks"]; - if ( $DisplayColor == DISPLAY_AUTO ) { $DisplayR = $R; $DisplayG = $G; $DisplayB = $B; } - if ( $Surrounding != NULL ) { $BorderR = $R+$Surrounding; $BorderG = $G+$Surrounding; $BorderB = $B+$Surrounding; } - if ( $InnerSurrounding != NULL ) { $InnerBorderR = $R+$InnerSurrounding; $InnerBorderG = $G+$InnerSurrounding; $InnerBorderB = $B+$InnerSurrounding; } - if ( $InnerBorderR == -1 ) { $InnerColor = NULL; } else { $InnerColor = array("R"=>$InnerBorderR,"G"=>$InnerBorderG,"B"=>$InnerBorderB); } - $Color = array("R"=>$R,"G"=>$G,"B"=>$B,"Alpha"=>$Alpha,"BorderR"=>$BorderR,"BorderG"=>$BorderG,"BorderB"=>$BorderB); - - $AxisID = $Serie["Axis"]; - $Mode = $Data["Axis"][$AxisID]["Display"]; - $Format = $Data["Axis"][$AxisID]["Format"]; - $Unit = $Data["Axis"][$AxisID]["Unit"]; - - if (isset($Serie["Description"])) { $SerieDescription = $Serie["Description"]; } else { $SerieDescription = $SerieName; } - - $PosArray = $this->scaleComputeY($Serie["Data"],array("AxisID"=>$Serie["Axis"])); - - if ( $Floating0Value != NULL ) - { $YZero = $this->scaleComputeY($Floating0Value,array("AxisID"=>$Serie["Axis"])); } - else - { $YZero = $this->scaleComputeY(0,array("AxisID"=>$Serie["Axis"])); } - - if ( $Data["Orientation"] == SCALE_POS_LEFTRIGHT ) - { - if ( $YZero > $this->GraphAreaY2-1 ) { $YZero = $this->GraphAreaY2-1; } - if ( $YZero < $this->GraphAreaY1+1 ) { $YZero = $this->GraphAreaY1+1; } - - if ( $XDivs == 0 ) { $XStep = 0; } else { $XStep = ($this->GraphAreaX2-$this->GraphAreaX1-$XMargin*2)/$XDivs; } - $X = $this->GraphAreaX1 + $XMargin; - - if ( $AroundZero ) { $Y1 = $YZero; } else { $Y1 = $this->GraphAreaY2-1; } - if ( $XDivs == 0 ) { $XSize = ($this->GraphAreaX2-$this->GraphAreaX1)/($SeriesCount+$Interleave); } else { $XSize = ($XStep / ($SeriesCount+$Interleave) ); } - - $XOffset = -($XSize*$SeriesCount)/2 + $CurrentSerie * $XSize; - if ( $X + $XOffset <= $this->GraphAreaX1 ) { $XOffset = $this->GraphAreaX1 - $X + 1 ; } - - $this->DataSet->Data["Series"][$SerieName]["XOffset"] = $XOffset + $XSize / 2; - - if ( $Rounded || $BorderR != -1) { $XSpace = 1; } else { $XSpace = 0; } - - if ( !is_array($PosArray) ) { $Value = $PosArray; $PosArray = ""; $PosArray[0] = $Value; } - - $ID = 0; - foreach($PosArray as $Key => $Y2) - { - if ( $Floating0Serie != NULL ) - { - if ( isset($Data["Series"][$Floating0Serie]["Data"][$Key]) ) - { $Value = $Data["Series"][$Floating0Serie]["Data"][$Key]; } - else - { $Value = 0; } - - $YZero = $this->scaleComputeY($Value,array("AxisID"=>$Serie["Axis"])); - if ( $YZero > $this->GraphAreaY2-1 ) { $YZero = $this->GraphAreaY2-1; } - if ( $YZero < $this->GraphAreaY1+1 ) { $YZero = $this->GraphAreaY1+1; } - - if ( $AroundZero ) { $Y1 = $YZero; } else { $Y1 = $this->GraphAreaY2-1; } - } - - if ( $OverrideColors != NULL ) - { if ( isset($OverrideColors[$ID]) ) { $Color = array("R"=>$OverrideColors[$ID]["R"],"G"=>$OverrideColors[$ID]["G"],"B"=>$OverrideColors[$ID]["B"],"Alpha"=>$OverrideColors[$ID]["Alpha"],"BorderR"=>$OverrideColors[$ID]["BorderR"],"BorderG"=>$OverrideColors[$ID]["BorderG"],"BorderB"=>$OverrideColors[$ID]["BorderB"]); } else { $Color = $this->getRandomColor(); } } - - if ( $Y2 != VOID ) - { - $BarHeight = $Y1 - $Y2; - - if ( $Serie["Data"][$Key] == 0 ) - { - $this->drawLine($X+$XOffset+$XSpace,$Y1,$X+$XOffset+$XSize-$XSpace,$Y1,$Color); - if ( $RecordImageMap ) { $this->addToImageMap("RECT",floor($X+$XOffset+$XSpace).",".floor($Y1-1).",".floor($X+$XOffset+$XSize-$XSpace).",".floor($Y1+1),$this->toHTMLColor($R,$G,$B),$SerieDescription,$this->scaleFormat($Serie["Data"][$Key],$Mode,$Format,$Unit)); } - } - else - { - if ( $RecordImageMap ) { $this->addToImageMap("RECT",floor($X+$XOffset+$XSpace).",".floor($Y1).",".floor($X+$XOffset+$XSize-$XSpace).",".floor($Y2),$this->toHTMLColor($R,$G,$B),$SerieDescription,$this->scaleFormat($Serie["Data"][$Key],$Mode,$Format,$Unit)); } - - if ( $Rounded ) - $this->drawRoundedFilledRectangle($X+$XOffset+$XSpace,$Y1,$X+$XOffset+$XSize-$XSpace,$Y2,$RoundRadius,$Color); - else - { - $this->drawFilledRectangle($X+$XOffset+$XSpace,$Y1,$X+$XOffset+$XSize-$XSpace,$Y2,$Color); - - if ( $InnerColor != NULL ) { $this->drawRectangle($X+$XOffset+$XSpace+1,min($Y1,$Y2)+1,$X+$XOffset+$XSize-$XSpace-1,max($Y1,$Y2)-1,$InnerColor); } - - if ( $Gradient ) - { - $this->Shadow = FALSE; - - if ( $GradientMode == GRADIENT_SIMPLE ) - { - if ( $Serie["Data"][$Key] >= 0 ) - $GradienColor = array("StartR"=>$GradientStartR,"StartG"=>$GradientStartG,"StartB"=>$GradientStartB,"EndR"=>$GradientEndR,"EndG"=>$GradientEndG,"EndB"=>$GradientEndB,"Alpha"=>$GradientAlpha); - else - $GradienColor = array("StartR"=>$GradientEndR,"StartG"=>$GradientEndG,"StartB"=>$GradientEndB,"EndR"=>$GradientStartR,"EndG"=>$GradientStartG,"EndB"=>$GradientStartB,"Alpha"=>$GradientAlpha); - - $this->drawGradientArea($X+$XOffset+$XSpace,$Y1,$X+$XOffset+$XSize-$XSpace,$Y2,DIRECTION_VERTICAL,$GradienColor); - } - elseif ( $GradientMode == GRADIENT_EFFECT_CAN ) - { - $GradienColor1 = array("StartR"=>$GradientEndR,"StartG"=>$GradientEndG,"StartB"=>$GradientEndB,"EndR"=>$GradientStartR,"EndG"=>$GradientStartG,"EndB"=>$GradientStartB,"Alpha"=>$GradientAlpha); - $GradienColor2 = array("StartR"=>$GradientStartR,"StartG"=>$GradientStartG,"StartB"=>$GradientStartB,"EndR"=>$GradientEndR,"EndG"=>$GradientEndG,"EndB"=>$GradientEndB,"Alpha"=>$GradientAlpha); - $XSpan = floor($XSize / 3); - - $this->drawGradientArea($X+$XOffset+$XSpace,$Y1,$X+$XOffset+$XSpan-$XSpace,$Y2,DIRECTION_HORIZONTAL,$GradienColor1); - $this->drawGradientArea($X+$XOffset+$XSpan+$XSpace,$Y1,$X+$XOffset+$XSize-$XSpace,$Y2,DIRECTION_HORIZONTAL,$GradienColor2); - } - $this->Shadow = $RestoreShadow; - } - } - - if ( $Draw0Line ) - { - $Line0Color = array("R"=>0,"G"=>0,"B"=>0,"Alpha"=>20); - - if ( abs($Y1 - $Y2) > 3 ) { $Line0Width = 3; } else { $Line0Width = 1; } - if ( $Y1 - $Y2 < 0 ) { $Line0Width = -$Line0Width; } - - $this->drawFilledRectangle($X+$XOffset+$XSpace,floor($Y1),$X+$XOffset+$XSize-$XSpace,floor($Y1)-$Line0Width,$Line0Color); - $this->drawLine($X+$XOffset+$XSpace,floor($Y1),$X+$XOffset+$XSize-$XSpace,floor($Y1),$Line0Color); - } - } - - if ( $DisplayValues && $Serie["Data"][$Key] != VOID ) - { - if ( $DisplayShadow ) { $this->Shadow = TRUE; } - - $Caption = $this->scaleFormat($Serie["Data"][$Key],$Mode,$Format,$Unit); - $TxtPos = $this->getTextBox(0,0,$DisplayFont,$DisplaySize,90,$Caption); - $TxtHeight = $TxtPos[0]["Y"] - $TxtPos[1]["Y"] + $TxtMargin; - - if ( $DisplayPos == LABEL_POS_INSIDE && abs($TxtHeight) < abs($BarHeight) ) - { - $CenterX = (($X+$XOffset+$XSize-$XSpace)-($X+$XOffset+$XSpace))/2 + $X+$XOffset+$XSpace; - $CenterY = ($Y2-$Y1)/2 + $Y1; - - $this->drawText($CenterX,$CenterY,$Caption,array("R"=>$DisplayR,"G"=>$DisplayG,"B"=>$DisplayB,"Align"=>TEXT_ALIGN_MIDDLEMIDDLE,"FontSize"=>$DisplaySize,"Angle"=>90)); - } - else - { - if ( $Serie["Data"][$Key] >= 0 ) { $Align = TEXT_ALIGN_BOTTOMMIDDLE; $Offset = $DisplayOffset; } else { $Align = TEXT_ALIGN_TOPMIDDLE; $Offset = -$DisplayOffset; } - $this->drawText($X+$XOffset+$XSize/2,$Y2-$Offset,$this->scaleFormat($Serie["Data"][$Key],$Mode,$Format,$Unit),array("R"=>$DisplayR,"G"=>$DisplayG,"B"=>$DisplayB,"Align"=>$Align,"FontSize"=>$DisplaySize)); - } - - $this->Shadow = $RestoreShadow; - } - } - - $X = $X + $XStep; - $ID++; - } - } - else - { - if ( $YZero < $this->GraphAreaX1+1 ) { $YZero = $this->GraphAreaX1+1; } - if ( $YZero > $this->GraphAreaX2-1 ) { $YZero = $this->GraphAreaX2-1; } - - if ( $XDivs == 0 ) { $YStep = 0; } else { $YStep = ($this->GraphAreaY2-$this->GraphAreaY1-$XMargin*2)/$XDivs; } - - $Y = $this->GraphAreaY1 + $XMargin; - - if ( $AroundZero ) { $X1 = $YZero; } else { $X1 = $this->GraphAreaX1+1; } - if ( $XDivs == 0 ) { $YSize = ($this->GraphAreaY2-$this->GraphAreaY1)/($SeriesCount+$Interleave); } else { $YSize = ($YStep / ($SeriesCount+$Interleave) ); } - - $YOffset = -($YSize*$SeriesCount)/2 + $CurrentSerie * $YSize; - if ( $Y + $YOffset <= $this->GraphAreaY1 ) { $YOffset = $this->GraphAreaY1 - $Y + 1 ; } - - $this->DataSet->Data["Series"][$SerieName]["XOffset"] = $YOffset + $YSize / 2; - - if ( $Rounded || $BorderR != -1 ) { $YSpace = 1; } else { $YSpace = 0; } - - if ( !is_array($PosArray) ) { $Value = $PosArray; $PosArray = ""; $PosArray[0] = $Value; } - - $ID = 0 ; - foreach($PosArray as $Key => $X2) - { - if ( $Floating0Serie != NULL ) - { - if ( isset($Data["Series"][$Floating0Serie]["Data"][$Key]) ) - $Value = $Data["Series"][$Floating0Serie]["Data"][$Key]; - else { $Value = 0; } - - $YZero = $this->scaleComputeY($Value,array("AxisID"=>$Serie["Axis"])); - if ( $YZero < $this->GraphAreaX1+1 ) { $YZero = $this->GraphAreaX1+1; } - if ( $YZero > $this->GraphAreaX2-1 ) { $YZero = $this->GraphAreaX2-1; } - if ( $AroundZero ) { $X1 = $YZero; } else { $X1 = $this->GraphAreaX1+1; } - } - - if ( $OverrideColors != NULL ) - { if ( isset($OverrideColors[$ID]) ) { $Color = array("R"=>$OverrideColors[$ID]["R"],"G"=>$OverrideColors[$ID]["G"],"B"=>$OverrideColors[$ID]["B"],"Alpha"=>$OverrideColors[$ID]["Alpha"],"BorderR"=>$OverrideColors[$ID]["BorderR"],"BorderG"=>$OverrideColors[$ID]["BorderG"],"BorderB"=>$OverrideColors[$ID]["BorderB"]); } else { $Color = $this->getRandomColor(); } } - - if ( $X2 != VOID ) - { - $BarWidth = $X2 - $X1; - - if ( $Serie["Data"][$Key] == 0 ) - { - $this->drawLine($X1,$Y+$YOffset+$YSpace,$X1,$Y+$YOffset+$YSize-$YSpace,$Color); - if ( $RecordImageMap ) { $this->addToImageMap("RECT",floor($X1-1).",".floor($Y+$YOffset+$YSpace).",".floor($X1+1).",".floor($Y+$YOffset+$YSize-$YSpace),$this->toHTMLColor($R,$G,$B),$SerieDescription,$this->scaleFormat($Serie["Data"][$Key],$Mode,$Format,$Unit)); } - } - else - { - if ( $RecordImageMap ) { $this->addToImageMap("RECT",floor($X1).",".floor($Y+$YOffset+$YSpace).",".floor($X2).",".floor($Y+$YOffset+$YSize-$YSpace),$this->toHTMLColor($R,$G,$B),$SerieDescription,$this->scaleFormat($Serie["Data"][$Key],$Mode,$Format,$Unit)); } - - if ( $Rounded ) - $this->drawRoundedFilledRectangle($X1+1,$Y+$YOffset+$YSpace,$X2,$Y+$YOffset+$YSize-$YSpace,$RoundRadius,$Color); - else - { - $this->drawFilledRectangle($X1,$Y+$YOffset+$YSpace,$X2,$Y+$YOffset+$YSize-$YSpace,$Color); - - if ( $InnerColor != NULL ) { $this->drawRectangle(min($X1,$X2)+1,$Y+$YOffset+$YSpace+1,max($X1,$X2)-1,$Y+$YOffset+$YSize-$YSpace-1,$InnerColor); } - - if ( $Gradient ) - { - $this->Shadow = FALSE; - - if ( $GradientMode == GRADIENT_SIMPLE ) - { - if ( $Serie["Data"][$Key] >= 0 ) - $GradienColor = array("StartR"=>$GradientStartR,"StartG"=>$GradientStartG,"StartB"=>$GradientStartB,"EndR"=>$GradientEndR,"EndG"=>$GradientEndG,"EndB"=>$GradientEndB,"Alpha"=>$GradientAlpha); - else - $GradienColor = array("StartR"=>$GradientEndR,"StartG"=>$GradientEndG,"StartB"=>$GradientEndB,"EndR"=>$GradientStartR,"EndG"=>$GradientStartG,"EndB"=>$GradientStartB,"Alpha"=>$GradientAlpha); - - $this->drawGradientArea($X1,$Y+$YOffset+$YSpace,$X2,$Y+$YOffset+$YSize-$YSpace,DIRECTION_HORIZONTAL,$GradienColor); - } - elseif ( $GradientMode == GRADIENT_EFFECT_CAN ) - { - $GradienColor1 = array("StartR"=>$GradientEndR,"StartG"=>$GradientEndG,"StartB"=>$GradientEndB,"EndR"=>$GradientStartR,"EndG"=>$GradientStartG,"EndB"=>$GradientStartB,"Alpha"=>$GradientAlpha); - $GradienColor2 = array("StartR"=>$GradientStartR,"StartG"=>$GradientStartG,"StartB"=>$GradientStartB,"EndR"=>$GradientEndR,"EndG"=>$GradientEndG,"EndB"=>$GradientEndB,"Alpha"=>$GradientAlpha); - $YSpan = floor($YSize / 3); - - $this->drawGradientArea($X1,$Y+$YOffset+$YSpace,$X2,$Y+$YOffset+$YSpan-$YSpace,DIRECTION_VERTICAL,$GradienColor1); - $this->drawGradientArea($X1,$Y+$YOffset+$YSpan,$X2,$Y+$YOffset+$YSize-$YSpace,DIRECTION_VERTICAL,$GradienColor2); - } - $this->Shadow = $RestoreShadow; - } - } - - if ( $Draw0Line ) - { - $Line0Color = array("R"=>0,"G"=>0,"B"=>0,"Alpha"=>20); - - if ( abs($X1 - $X2) > 3 ) { $Line0Width = 3; } else { $Line0Width = 1; } - if ( $X2 - $X1 < 0 ) { $Line0Width = -$Line0Width; } - - $this->drawFilledRectangle(floor($X1),$Y+$YOffset+$YSpace,floor($X1)+$Line0Width,$Y+$YOffset+$YSize-$YSpace,$Line0Color); - $this->drawLine(floor($X1),$Y+$YOffset+$YSpace,floor($X1),$Y+$YOffset+$YSize-$YSpace,$Line0Color); - } - } - - if ( $DisplayValues && $Serie["Data"][$Key] != VOID ) - { - if ( $DisplayShadow ) { $this->Shadow = TRUE; } - - $Caption = $this->scaleFormat($Serie["Data"][$Key],$Mode,$Format,$Unit); - $TxtPos = $this->getTextBox(0,0,$DisplayFont,$DisplaySize,0,$Caption); - $TxtWidth = $TxtPos[1]["X"] - $TxtPos[0]["X"] + $TxtMargin; - - if ( $DisplayPos == LABEL_POS_INSIDE && abs($TxtWidth) < abs($BarWidth) ) - { - $CenterX = ($X2-$X1)/2 + $X1; - $CenterY = (($Y+$YOffset+$YSize-$YSpace)-($Y+$YOffset+$YSpace))/2 + ($Y+$YOffset+$YSpace); - - $this->drawText($CenterX,$CenterY,$Caption,array("R"=>$DisplayR,"G"=>$DisplayG,"B"=>$DisplayB,"Align"=>TEXT_ALIGN_MIDDLEMIDDLE,"FontSize"=>$DisplaySize)); - } - else - { - if ( $Serie["Data"][$Key] >= 0 ) { $Align = TEXT_ALIGN_MIDDLELEFT; $Offset = $DisplayOffset; } else { $Align = TEXT_ALIGN_MIDDLERIGHT; $Offset = -$DisplayOffset; } - $this->drawText($X2+$Offset,$Y+$YOffset+$YSize/2,$Caption,array("R"=>$DisplayR,"G"=>$DisplayG,"B"=>$DisplayB,"Align"=>$Align,"FontSize"=>$DisplaySize)); - } - - $this->Shadow = $RestoreShadow; - } - } - $Y = $Y + $YStep; - $ID++; - } - } - $CurrentSerie++; - } - } - } - - /* Draw a bar chart */ - function drawStackedBarChart($Format=NULL) - { - $DisplayValues = isset($Format["DisplayValues"]) ? $Format["DisplayValues"] : FALSE; - $DisplayOrientation = isset($Format["DisplayOrientation"]) ? $Format["DisplayOrientation"] : ORIENTATION_AUTO; - $DisplayRound = isset($Format["DisplayRound"]) ? $Format["DisplayRound"] : 0; - $DisplayColor = isset($Format["DisplayColor"]) ? $Format["DisplayColor"] : DISPLAY_MANUAL; - $DisplayFont = isset($Format["DisplayFont"]) ? $Format["DisplayFont"] : $this->FontName; - $DisplaySize = isset($Format["DisplaySize"]) ? $Format["DisplaySize"] : $this->FontSize; - $DisplayR = isset($Format["DisplayR"]) ? $Format["DisplayR"] : 0; - $DisplayG = isset($Format["DisplayG"]) ? $Format["DisplayG"] : 0; - $DisplayB = isset($Format["DisplayB"]) ? $Format["DisplayB"] : 0; - $Interleave = isset($Format["Interleave"]) ? $Format["Interleave"] : .5; - $Rounded = isset($Format["Rounded"]) ? $Format["Rounded"] : FALSE; - $RoundRadius = isset($Format["RoundRadius"]) ? $Format["RoundRadius"] : 4; - $Surrounding = isset($Format["Surrounding"]) ? $Format["Surrounding"] : NULL; - $BorderR = isset($Format["BorderR"]) ? $Format["BorderR"] : -1; - $BorderG = isset($Format["BorderG"]) ? $Format["BorderG"] : -1; - $BorderB = isset($Format["BorderB"]) ? $Format["BorderB"] : -1; - $Gradient = isset($Format["Gradient"]) ? $Format["Gradient"] : FALSE; - $GradientMode = isset($Format["GradientMode"]) ? $Format["GradientMode"] : GRADIENT_SIMPLE; - $GradientAlpha = isset($Format["GradientAlpha"]) ? $Format["GradientAlpha"] : 20; - $GradientStartR = isset($Format["GradientStartR"]) ? $Format["GradientStartR"] : 255; - $GradientStartG = isset($Format["GradientStartG"]) ? $Format["GradientStartG"] : 255; - $GradientStartB = isset($Format["GradientStartB"]) ? $Format["GradientStartB"] : 255; - $GradientEndR = isset($Format["GradientEndR"]) ? $Format["GradientEndR"] : 0; - $GradientEndG = isset($Format["GradientEndG"]) ? $Format["GradientEndG"] : 0; - $GradientEndB = isset($Format["GradientEndB"]) ? $Format["GradientEndB"] : 0; - $InnerSurrounding = isset($Format["InnerSurrounding"]) ? $Format["InnerSurrounding"] : NULL; - $InnerBorderR = isset($Format["InnerBorderR"]) ? $Format["InnerBorderR"] : -1; - $InnerBorderG = isset($Format["InnerBorderG"]) ? $Format["InnerBorderG"] : -1; - $InnerBorderB = isset($Format["InnerBorderB"]) ? $Format["InnerBorderB"] : -1; - $RecordImageMap = isset($Format["RecordImageMap"]) ? $Format["RecordImageMap"] : FALSE; - $FontFactor = isset($Format["FontFactor"]) ? $Format["FontFactor"] : 8; - - $this->LastChartLayout = CHART_LAST_LAYOUT_STACKED; - - $Data = $this->DataSet->getData(); - list($XMargin,$XDivs) = $this->scaleGetXSettings(); - - $RestoreShadow = $this->Shadow; - - $LastX = ""; $LastY = ""; - foreach($Data["Series"] as $SerieName => $Serie) - { - if ( $Serie["isDrawable"] == TRUE && $SerieName != $Data["Abscissa"] ) - { - $R = $Serie["Color"]["R"]; $G = $Serie["Color"]["G"]; $B = $Serie["Color"]["B"]; $Alpha = $Serie["Color"]["Alpha"]; $Ticks = $Serie["Ticks"]; - if ( $DisplayColor == DISPLAY_AUTO ) { $DisplayR = 255; $DisplayG = 255; $DisplayB = 255; } - if ( $Surrounding != NULL ) { $BorderR = $R+$Surrounding; $BorderG = $G+$Surrounding; $BorderB = $B+$Surrounding; } - if ( $InnerSurrounding != NULL ) { $InnerBorderR = $R+$InnerSurrounding; $InnerBorderG = $G+$InnerSurrounding; $InnerBorderB = $B+$InnerSurrounding; } - if ( $InnerBorderR == -1 ) { $InnerColor = NULL; } else { $InnerColor = array("R"=>$InnerBorderR,"G"=>$InnerBorderG,"B"=>$InnerBorderB); } - - $AxisID = $Serie["Axis"]; - $Mode = $Data["Axis"][$AxisID]["Display"]; - $Format = $Data["Axis"][$AxisID]["Format"]; - $Unit = $Data["Axis"][$AxisID]["Unit"]; - - if (isset($Serie["Description"])) { $SerieDescription = $Serie["Description"]; } else { $SerieDescription = $SerieName; } - - $PosArray = $this->scaleComputeY($Serie["Data"],array("AxisID"=>$Serie["Axis"]),TRUE); - $YZero = $this->scaleComputeY(0,array("AxisID"=>$Serie["Axis"])); - - $this->DataSet->Data["Series"][$SerieName]["XOffset"] = 0; - - $Color = array("TransCorner"=>TRUE,"R"=>$R,"G"=>$G,"B"=>$B,"Alpha"=>$Alpha,"BorderR"=>$BorderR,"BorderG"=>$BorderG,"BorderB"=>$BorderB); - - if ( $Data["Orientation"] == SCALE_POS_LEFTRIGHT ) - { - if ( $YZero > $this->GraphAreaY2-1 ) { $YZero = $this->GraphAreaY2-1; } - if ( $YZero > $this->GraphAreaY2-1 ) { $YZero = $this->GraphAreaY2-1; } - - if ( $XDivs == 0 ) { $XStep = ($this->GraphAreaX2-$this->GraphAreaX1)/4; } else { $XStep = ($this->GraphAreaX2-$this->GraphAreaX1-$XMargin*2)/$XDivs; } - $X = $this->GraphAreaX1 + $XMargin; - - $XSize = ($XStep / (1+$Interleave) ); - $XOffset = -($XSize/2); - - if ( !is_array($PosArray) ) { $Value = $PosArray; $PosArray = ""; $PosArray[0] = $Value; } - foreach($PosArray as $Key => $Height) - { - if ( $Height != VOID && $Serie["Data"][$Key] != 0 ) - { - if ( $Serie["Data"][$Key] > 0 ) { $Pos = "+"; } else { $Pos = "-"; } - - if ( !isset($LastY[$Key] ) ) { $LastY[$Key] = ""; } - if ( !isset($LastY[$Key][$Pos] ) ) { $LastY[$Key][$Pos] = $YZero; } - - $Y1 = $LastY[$Key][$Pos]; - $Y2 = $Y1 - $Height; - - if ( ($Rounded || $BorderR != -1) && ($Pos == "+" && $Y1 != $YZero) ) { $YSpaceUp = 1; } else { $YSpaceUp = 0; } - if ( ($Rounded || $BorderR != -1) && ($Pos == "-" && $Y1 != $YZero) ) { $YSpaceDown = 1; } else { $YSpaceDown = 0; } - - if ( $RecordImageMap ) { $this->addToImageMap("RECT",floor($X+$XOffset).",".floor($Y1-$YSpaceUp+$YSpaceDown).",".floor($X+$XOffset+$XSize).",".floor($Y2),$this->toHTMLColor($R,$G,$B),$SerieDescription,$this->scaleFormat($Serie["Data"][$Key],$Mode,$Format,$Unit)); } - - if ( $Rounded ) - $this->drawRoundedFilledRectangle($X+$XOffset,$Y1-$YSpaceUp+$YSpaceDown,$X+$XOffset+$XSize,$Y2,$RoundRadius,$Color); - else - { - $this->drawFilledRectangle($X+$XOffset,$Y1-$YSpaceUp+$YSpaceDown,$X+$XOffset+$XSize,$Y2,$Color); - - if ( $InnerColor != NULL ) { $RestoreShadow = $this->Shadow; $this->Shadow = FALSE; $this->drawRectangle(min($X+$XOffset+1,$X+$XOffset+$XSize),min($Y1-$YSpaceUp+$YSpaceDown,$Y2)+1,max($X+$XOffset+1,$X+$XOffset+$XSize)-1,max($Y1-$YSpaceUp+$YSpaceDown,$Y2)-1,$InnerColor); $this->Shadow = $RestoreShadow;} - - if ( $Gradient ) - { - $this->Shadow = FALSE; - - if ( $GradientMode == GRADIENT_SIMPLE ) - { - $GradientColor = array("StartR"=>$GradientStartR,"StartG"=>$GradientStartG,"StartB"=>$GradientStartB,"EndR"=>$GradientEndR,"EndG"=>$GradientEndG,"EndB"=>$GradientEndB,"Alpha"=>$GradientAlpha); - $this->drawGradientArea($X+$XOffset,$Y1-1-$YSpaceUp+$YSpaceDown,$X+$XOffset+$XSize,$Y2+1,DIRECTION_VERTICAL,$GradientColor); - } - elseif ( $GradientMode == GRADIENT_EFFECT_CAN ) - { - $GradientColor1 = array("StartR"=>$GradientEndR,"StartG"=>$GradientEndG,"StartB"=>$GradientEndB,"EndR"=>$GradientStartR,"EndG"=>$GradientStartG,"EndB"=>$GradientStartB,"Alpha"=>$GradientAlpha); - $GradientColor2 = array("StartR"=>$GradientStartR,"StartG"=>$GradientStartG,"StartB"=>$GradientStartB,"EndR"=>$GradientEndR,"EndG"=>$GradientEndG,"EndB"=>$GradientEndB,"Alpha"=>$GradientAlpha); - $XSpan = floor($XSize / 3); - - $this->drawGradientArea($X+$XOffset-.5,$Y1-.5-$YSpaceUp+$YSpaceDown,$X+$XOffset+$XSpan,$Y2+.5,DIRECTION_HORIZONTAL,$GradientColor1); - $this->drawGradientArea($X+$XSpan+$XOffset-.5,$Y1-.5-$YSpaceUp+$YSpaceDown,$X+$XOffset+$XSize,$Y2+.5,DIRECTION_HORIZONTAL,$GradientColor2); - } - $this->Shadow = $RestoreShadow; - } - } - - if ( $DisplayValues ) - { - $BarHeight = abs($Y2-$Y1)-2; - $BarWidth = $XSize+($XOffset/2)-$FontFactor; - - $Caption = $this->scaleFormat(round($Serie["Data"][$Key],$DisplayRound),$Mode,$Format,$Unit); - $TxtPos = $this->getTextBox(0,0,$DisplayFont,$DisplaySize,0,$Caption); - $TxtHeight = abs($TxtPos[2]["Y"] - $TxtPos[0]["Y"]); - $TxtWidth = abs($TxtPos[1]["X"] - $TxtPos[0]["X"]); - - $XCenter = ( ($X+$XOffset+$XSize) - ($X+$XOffset) ) / 2 + $X+$XOffset; - $YCenter = ( ($Y2) - ($Y1-$YSpaceUp+$YSpaceDown) ) / 2 + $Y1-$YSpaceUp+$YSpaceDown; - - $Done = FALSE; - if ( $DisplayOrientation == ORIENTATION_HORIZONTAL || $DisplayOrientation == ORIENTATION_AUTO ) - { - if ( $TxtHeight < $BarHeight && $TxtWidth < $BarWidth ) - { - $this->drawText($XCenter,$YCenter,$this->scaleFormat($Serie["Data"][$Key],$Mode,$Format,$Unit),array("R"=>$DisplayR,"G"=>$DisplayG,"B"=>$DisplayB,"Align"=>TEXT_ALIGN_MIDDLEMIDDLE,"FontSize"=>$DisplaySize,"FontName"=>$DisplayFont)); - $Done = TRUE; - } - } - - if ( $DisplayOrientation == ORIENTATION_VERTICAL || ( $DisplayOrientation == ORIENTATION_AUTO && !$Done) ) - { - if ( $TxtHeight < $BarWidth && $TxtWidth < $BarHeight ) - $this->drawText($XCenter,$YCenter,$this->scaleFormat($Serie["Data"][$Key],$Mode,$Format,$Unit),array("R"=>$DisplayR,"G"=>$DisplayG,"B"=>$DisplayB,"Angle"=>90,"Align"=>TEXT_ALIGN_MIDDLEMIDDLE,"FontSize"=>$DisplaySize,"FontName"=>$DisplayFont)); - } - } - - $LastY[$Key][$Pos] = $Y2; - } - - $X = $X + $XStep; - } - } - else - { - if ( $YZero < $this->GraphAreaX1+1 ) { $YZero = $this->GraphAreaX1+1; } - if ( $YZero > $this->GraphAreaX2-1 ) { $YZero = $this->GraphAreaX2-1; } - - if ( $XDivs == 0 ) { $YStep = ($this->GraphAreaY2-$this->GraphAreaY1)/4; } else { $YStep = ($this->GraphAreaY2-$this->GraphAreaY1-$XMargin*2)/$XDivs; } - $Y = $this->GraphAreaY1 + $XMargin; - - $YSize = $YStep / (1+$Interleave); - $YOffset = -($YSize/2); - - if ( !is_array($PosArray) ) { $Value = $PosArray; $PosArray = ""; $PosArray[0] = $Value; } - foreach($PosArray as $Key => $Width) - { - if ( $Width != VOID && $Serie["Data"][$Key] != 0 ) - { - if ( $Serie["Data"][$Key] > 0 ) { $Pos = "+"; } else { $Pos = "-"; } - - if ( !isset($LastX[$Key] ) ) { $LastX[$Key] = ""; } - if ( !isset($LastX[$Key][$Pos] ) ) { $LastX[$Key][$Pos] = $YZero; } - - $X1 = $LastX[$Key][$Pos]; - $X2 = $X1 + $Width; - - if ( ($Rounded || $BorderR != -1) && ($Pos == "+" && $X1 != $YZero) ) { $XSpaceLeft = 2; } else { $XSpaceLeft = 0; } - if ( ($Rounded || $BorderR != -1) && ($Pos == "-" && $X1 != $YZero) ) { $XSpaceRight = 2; } else { $XSpaceRight = 0; } - - if ( $RecordImageMap ) { $this->addToImageMap("RECT",floor($X1+$XSpaceLeft).",".floor($Y+$YOffset).",".floor($X2-$XSpaceRight).",".floor($Y+$YOffset+$YSize),$this->toHTMLColor($R,$G,$B),$SerieDescription,$this->scaleFormat($Serie["Data"][$Key],$Mode,$Format,$Unit)); } - - if ( $Rounded ) - $this->drawRoundedFilledRectangle($X1+$XSpaceLeft,$Y+$YOffset,$X2-$XSpaceRight,$Y+$YOffset+$YSize,$RoundRadius,$Color); - else - { - $this->drawFilledRectangle($X1+$XSpaceLeft,$Y+$YOffset,$X2-$XSpaceRight,$Y+$YOffset+$YSize,$Color); - - if ( $InnerColor != NULL ) { $RestoreShadow = $this->Shadow; $this->Shadow = FALSE; $this->drawRectangle(min($X1+$XSpaceLeft,$X2-$XSpaceRight)+1,min($Y+$YOffset,$Y+$YOffset+$YSize)+1,max($X1+$XSpaceLeft,$X2-$XSpaceRight)-1,max($Y+$YOffset,$Y+$YOffset+$YSize)-1,$InnerColor); $this->Shadow = $RestoreShadow;} - - if ( $Gradient ) - { - $this->Shadow = FALSE; - - if ( $GradientMode == GRADIENT_SIMPLE ) - { - $GradientColor = array("StartR"=>$GradientStartR,"StartG"=>$GradientStartG,"StartB"=>$GradientStartB,"EndR"=>$GradientEndR,"EndG"=>$GradientEndG,"EndB"=>$GradientEndB,"Alpha"=>$GradientAlpha); - $this->drawGradientArea($X1+$XSpaceLeft,$Y+$YOffset,$X2-$XSpaceRight,$Y+$YOffset+$YSize,DIRECTION_HORIZONTAL,$GradientColor); - } - elseif ( $GradientMode == GRADIENT_EFFECT_CAN ) - { - $GradientColor1 = array("StartR"=>$GradientEndR,"StartG"=>$GradientEndG,"StartB"=>$GradientEndB,"EndR"=>$GradientStartR,"EndG"=>$GradientStartG,"EndB"=>$GradientStartB,"Alpha"=>$GradientAlpha); - $GradientColor2 = array("StartR"=>$GradientStartR,"StartG"=>$GradientStartG,"StartB"=>$GradientStartB,"EndR"=>$GradientEndR,"EndG"=>$GradientEndG,"EndB"=>$GradientEndB,"Alpha"=>$GradientAlpha); - $YSpan = floor($YSize / 3); - - $this->drawGradientArea($X1+$XSpaceLeft,$Y+$YOffset,$X2-$XSpaceRight,$Y+$YOffset+$YSpan,DIRECTION_VERTICAL,$GradientColor1); - $this->drawGradientArea($X1+$XSpaceLeft,$Y+$YOffset+$YSpan,$X2-$XSpaceRight,$Y+$YOffset+$YSize,DIRECTION_VERTICAL,$GradientColor2); - } - $this->Shadow = $RestoreShadow; - } - } - - if ( $DisplayValues ) - { - $BarWidth = abs($X2-$X1)-$FontFactor; - $BarHeight = $YSize+($YOffset/2)-$FontFactor/2; - $Caption = $this->scaleFormat(round($Serie["Data"][$Key],$DisplayRound),$Mode,$Format,$Unit); - $TxtPos = $this->getTextBox(0,0,$DisplayFont,$DisplaySize,0,$Caption); - $TxtHeight = abs($TxtPos[2]["Y"] - $TxtPos[0]["Y"]); - $TxtWidth = abs($TxtPos[1]["X"] - $TxtPos[0]["X"]); - - $XCenter = ( $X2 - $X1 ) / 2 + $X1; - $YCenter = ( ($Y+$YOffset+$YSize) - ($Y+$YOffset) ) / 2 + $Y+$YOffset; - - $Done = FALSE; - if ( $DisplayOrientation == ORIENTATION_HORIZONTAL || $DisplayOrientation == ORIENTATION_AUTO ) - { - if ( $TxtHeight < $BarHeight && $TxtWidth < $BarWidth ) - { - $this->drawText($XCenter,$YCenter,$this->scaleFormat($Serie["Data"][$Key],$Mode,$Format,$Unit),array("R"=>$DisplayR,"G"=>$DisplayG,"B"=>$DisplayB,"Align"=>TEXT_ALIGN_MIDDLEMIDDLE,"FontSize"=>$DisplaySize,"FontName"=>$DisplayFont)); - $Done = TRUE; - } - } - - if ( $DisplayOrientation == ORIENTATION_VERTICAL || ( $DisplayOrientation == ORIENTATION_AUTO && !$Done) ) - { - if ( $TxtHeight < $BarWidth && $TxtWidth < $BarHeight ) - $this->drawText($XCenter,$YCenter,$this->scaleFormat($Serie["Data"][$Key],$Mode,$Format,$Unit),array("R"=>$DisplayR,"G"=>$DisplayG,"B"=>$DisplayB,"Angle"=>90,"Align"=>TEXT_ALIGN_MIDDLEMIDDLE,"FontSize"=>$DisplaySize,"FontName"=>$DisplayFont)); - } - } - - $LastX[$Key][$Pos] = $X2; - } - - $Y = $Y + $YStep; - } - } - } - } - } - - /* Draw a stacked area chart */ - function drawStackedAreaChart($Format=NULL) - { - $DrawLine = isset($Format["DrawLine"]) ? $Format["DrawLine"] : FALSE; - $LineSurrounding = isset($Format["LineSurrounding"]) ? $Format["LineSurrounding"] : NULL; - $LineR = isset($Format["LineR"]) ? $Format["LineR"] : VOID; - $LineG = isset($Format["LineG"]) ? $Format["LineG"] : VOID; - $LineB = isset($Format["LineB"]) ? $Format["LineB"] : VOID; - $LineAlpha = isset($Format["LineAlpha"]) ? $Format["LineAlpha"] : 100; - $DrawPlot = isset($Format["DrawPlot"]) ? $Format["DrawPlot"] : FALSE; - $PlotRadius = isset($Format["PlotRadius"]) ? $Format["PlotRadius"] : 2; - $PlotBorder = isset($Format["PlotBorder"]) ? $Format["PlotBorder"] : 1; - $PlotBorderSurrounding = isset($Format["PlotBorderSurrounding"]) ? $Format["PlotBorderSurrounding"] : NULL; - $PlotBorderR = isset($Format["PlotBorderR"]) ? $Format["PlotBorderR"] : 0; - $PlotBorderG = isset($Format["PlotBorderG"]) ? $Format["PlotBorderG"] : 0; - $PlotBorderB = isset($Format["PlotBorderB"]) ? $Format["PlotBorderB"] : 0; - $PlotBorderAlpha = isset($Format["PlotBorderAlpha"]) ? $Format["PlotBorderAlpha"] : 50; - $ForceTransparency = isset($Format["ForceTransparency"]) ? $Format["ForceTransparency"] : NULL; - - $this->LastChartLayout = CHART_LAST_LAYOUT_STACKED; - - $Data = $this->DataSet->getData(); - list($XMargin,$XDivs) = $this->scaleGetXSettings(); - - $RestoreShadow = $this->Shadow; - $this->Shadow = FALSE; - - /* Build the offset data series */ - $OffsetData = ""; - $OverallOffset = ""; - $SerieOrder = ""; - foreach($Data["Series"] as $SerieName => $Serie) - { - if ( $Serie["isDrawable"] == TRUE && $SerieName != $Data["Abscissa"] ) - { - $SerieOrder[] = $SerieName; - - foreach($Serie["Data"] as $Key => $Value) - { - if ( $Value == VOID ) { $Value = 0; } - if ($Value >= 0) { $Sign = "+"; } else { $Sign = "-"; } - if ( !isset($OverallOffset[$Key]) || !isset($OverallOffset[$Key][$Sign]) ) { $OverallOffset[$Key][$Sign] = 0; } - - if ( $Sign == "+" ) - { $Data["Series"][$SerieName]["Data"][$Key] = $Value + $OverallOffset[$Key][$Sign]; } - else - { $Data["Series"][$SerieName]["Data"][$Key] = $Value - $OverallOffset[$Key][$Sign]; } - - $OverallOffset[$Key][$Sign] = $OverallOffset[$Key][$Sign] + abs($Value); - } - } - } - $SerieOrder = array_reverse($SerieOrder); - - $LastX = ""; $LastY = ""; - foreach($SerieOrder as $Key => $SerieName) - { - $Serie = $Data["Series"][$SerieName]; - if ( $Serie["isDrawable"] == TRUE && $SerieName != $Data["Abscissa"] ) - { - $R = $Serie["Color"]["R"]; $G = $Serie["Color"]["G"]; $B = $Serie["Color"]["B"]; $Alpha = $Serie["Color"]["Alpha"]; $Ticks = $Serie["Ticks"]; - if ( $ForceTransparency != NULL ) { $Alpha = $ForceTransparency; } - - $Color = array("R"=>$R,"G"=>$G,"B"=>$B,"Alpha"=>$Alpha); - - if ( $LineSurrounding != NULL ) - $LineColor = array("R"=>$R+$LineSurrounding,"G"=>$G+$LineSurrounding,"B"=>$B+$LineSurrounding,"Alpha"=>$Alpha); - elseif ( $LineR != VOID ) - $LineColor = array("R"=>$LineR,"G"=>$LineG,"B"=>$LineB,"Alpha"=>$LineAlpha); - else - $LineColor = $Color; - - if ( $PlotBorderSurrounding != NULL ) - $PlotBorderColor = array("R"=>$R+$PlotBorderSurrounding,"G"=>$G+$PlotBorderSurrounding,"B"=>$B+$PlotBorderSurrounding,"Alpha"=>$PlotBorderAlpha); - else - $PlotBorderColor = array("R"=>$PlotBorderR,"G"=>$PlotBorderG,"B"=>$PlotBorderB,"Alpha"=>$PlotBorderAlpha); - - $AxisID = $Serie["Axis"]; - $Mode = $Data["Axis"][$AxisID]["Display"]; - $Format = $Data["Axis"][$AxisID]["Format"]; - $Unit = $Data["Axis"][$AxisID]["Unit"]; - - $PosArray = $this->scaleComputeY($Serie["Data"],array("AxisID"=>$Serie["Axis"]),TRUE); - $YZero = $this->scaleComputeY(0,array("AxisID"=>$Serie["Axis"])); - - $this->DataSet->Data["Series"][$SerieName]["XOffset"] = 0; - - if ( $Data["Orientation"] == SCALE_POS_LEFTRIGHT ) - { - if ( $YZero < $this->GraphAreaY1+1 ) { $YZero = $this->GraphAreaY1+1; } - if ( $YZero > $this->GraphAreaY2-1 ) { $YZero = $this->GraphAreaY2-1; } - - if ( $XDivs == 0 ) { $XStep = ($this->GraphAreaX2-$this->GraphAreaX1)/4; } else { $XStep = ($this->GraphAreaX2-$this->GraphAreaX1-$XMargin*2)/$XDivs; } - $X = $this->GraphAreaX1 + $XMargin; - - if ( !is_array($PosArray) ) { $Value = $PosArray; $PosArray = ""; $PosArray[0] = $Value; } - - $Plots = ""; $Plots[] = $X; $Plots[] = $YZero; - foreach($PosArray as $Key => $Height) - { - if ( $Height != VOID ) { $Plots[] = $X; $Plots[] = $YZero-$Height; } - $X = $X + $XStep; - } - $Plots[] = $X-$XStep; $Plots[] = $YZero; - - $this->drawPolygon($Plots,$Color); - - $this->Shadow = $RestoreShadow; - if ( $DrawLine ) { for($i=2; $i<=count($Plots)-6; $i=$i+2) { $this->drawLine($Plots[$i],$Plots[$i+1],$Plots[$i+2],$Plots[$i+3],$LineColor); } } - if ( $DrawPlot ) - { - for($i=2; $i<=count($Plots)-4; $i=$i+2) - { - if ( $PlotBorder != 0 ) - { $this->drawFilledCircle($Plots[$i],$Plots[$i+1],$PlotRadius+$PlotBorder,$PlotBorderColor); } - - $this->drawFilledCircle($Plots[$i],$Plots[$i+1],$PlotRadius,$Color); - } - } - $this->Shadow = FALSE; - } - elseif ( $Data["Orientation"] == SCALE_POS_TOPBOTTOM ) - { - if ( $YZero < $this->GraphAreaX1+1 ) { $YZero = $this->GraphAreaX1+1; } - if ( $YZero > $this->GraphAreaX2-1 ) { $YZero = $this->GraphAreaX2-1; } - - if ( $XDivs == 0 ) { $YStep = ($this->GraphAreaY2-$this->GraphAreaY1)/4; } else { $YStep = ($this->GraphAreaY2-$this->GraphAreaY1-$XMargin*2)/$XDivs; } - $Y = $this->GraphAreaY1 + $XMargin; - - if ( !is_array($PosArray) ) { $Value = $PosArray; $PosArray = ""; $PosArray[0] = $Value; } - - $Plots = ""; $Plots[] = $YZero; $Plots[] = $Y; - foreach($PosArray as $Key => $Height) - { - if ( $Height != VOID ) { $Plots[] = $YZero+$Height; $Plots[] = $Y; } - $Y = $Y + $YStep; - } - $Plots[] = $YZero; $Plots[] = $Y-$YStep; - - $this->drawPolygon($Plots,$Color); - - $this->Shadow = $RestoreShadow; - if ( $DrawLine ) { for($i=2; $i<=count($Plots)-6; $i=$i+2) { $this->drawLine($Plots[$i],$Plots[$i+1],$Plots[$i+2],$Plots[$i+3],$LineColor); } } - if ( $DrawPlot ) - { - for($i=2; $i<=count($Plots)-4; $i=$i+2) - { - if ( $PlotBorder != 0 ) - { $this->drawFilledCircle($Plots[$i],$Plots[$i+1],$PlotRadius+$PlotBorder,$PlotBorderColor); } - - $this->drawFilledCircle($Plots[$i],$Plots[$i+1],$PlotRadius,$Color); - } - } - $this->Shadow = FALSE; - } - } - } - $this->Shadow = $RestoreShadow; - } - - /* Returns a random color */ - function getRandomColor($Alpha=100) - { return(array("R"=>rand(0,255),"G"=>rand(0,255),"B"=>rand(0,255),"Alpha"=>$Alpha)); } - - /* Validate a palette */ - function validatePalette($Colors,$Surrounding=NULL) - { - $Result = ""; - - if ( !is_array($Colors) ) { return($this->getRandomColor()); } - - foreach($Colors as $Key => $Values) - { - if ( isset($Values["R"]) ) { $Result[$Key]["R"] = $Values["R"]; } else { $Result[$Key]["R"] = rand(0,255); } - if ( isset($Values["G"]) ) { $Result[$Key]["G"] = $Values["G"]; } else { $Result[$Key]["G"] = rand(0,255); } - if ( isset($Values["B"]) ) { $Result[$Key]["B"] = $Values["B"]; } else { $Result[$Key]["B"] = rand(0,255); } - if ( isset($Values["Alpha"]) ) { $Result[$Key]["Alpha"] = $Values["Alpha"]; } else { $Result[$Key]["Alpha"] = 100; } - - if ( $Surrounding != NULL ) - { - $Result[$Key]["BorderR"] = $Result[$Key]["R"] + $Surrounding; - $Result[$Key]["BorderG"] = $Result[$Key]["G"] + $Surrounding; - $Result[$Key]["BorderB"] = $Result[$Key]["B"] + $Surrounding; - } - else - { - if ( isset($Values["BorderR"]) ) { $Result[$Key]["BorderR"] = $Values["BorderR"]; } else { $Result[$Key]["BorderR"] = $Result[$Key]["R"]; } - if ( isset($Values["BorderG"]) ) { $Result[$Key]["BorderG"] = $Values["BorderG"]; } else { $Result[$Key]["BorderG"] = $Result[$Key]["G"]; } - if ( isset($Values["BorderB"]) ) { $Result[$Key]["BorderB"] = $Values["BorderB"]; } else { $Result[$Key]["BorderB"] = $Result[$Key]["B"]; } - if ( isset($Values["BorderAlpha"]) ) { $Result[$Key]["BorderAlpha"] = $Values["BorderAlpha"]; } else { $Result[$Key]["BorderAlpha"] = $Result[$Key]["Alpha"]; } - } - } - - return($Result); - } - - /* Draw the derivative chart associated to the data series */ - function drawDerivative($Format=NULL) - { - $Offset = isset($Format["Offset"]) ? $Format["Offset"] : 10; - $SerieSpacing = isset($Format["SerieSpacing"]) ? $Format["SerieSpacing"] : 3; - $DerivativeHeight = isset($Format["DerivativeHeight"]) ? $Format["DerivativeHeight"] : 4; - $ShadedSlopeBox = isset($Format["ShadedSlopeBox"]) ? $Format["ShadedSlopeBox"] : FALSE; - $DrawBackground = isset($Format["DrawBackground"]) ? $Format["DrawBackground"] : TRUE; - $BackgroundR = isset($Format["BackgroundR"]) ? $Format["BackgroundR"] : 255; - $BackgroundG = isset($Format["BackgroundG"]) ? $Format["BackgroundG"] : 255; - $BackgroundB = isset($Format["BackgroundB"]) ? $Format["BackgroundB"] : 255; - $BackgroundAlpha = isset($Format["BackgroundAlpha"]) ? $Format["BackgroundAlpha"] : 20; - $DrawBorder = isset($Format["DrawBorder"]) ? $Format["DrawBorder"] : TRUE; - $BorderR = isset($Format["BorderR"]) ? $Format["BorderR"] : 0; - $BorderG = isset($Format["BorderG"]) ? $Format["BorderG"] : 0; - $BorderB = isset($Format["BorderB"]) ? $Format["BorderB"] : 0; - $BorderAlpha = isset($Format["BorderAlpha"]) ? $Format["BorderAlpha"] : 100; - $Caption = isset($Format["Caption"]) ? $Format["Caption"] : TRUE; - $CaptionHeight = isset($Format["CaptionHeight"]) ? $Format["CaptionHeight"] : 10; - $CaptionWidth = isset($Format["CaptionWidth"]) ? $Format["CaptionWidth"] : 20; - $CaptionMargin = isset($Format["CaptionMargin"]) ? $Format["CaptionMargin"] : 4; - $CaptionLine = isset($Format["CaptionLine"]) ? $Format["CaptionLine"] : FALSE; - $CaptionBox = isset($Format["CaptionBox"]) ? $Format["CaptionBox"] : FALSE; - $CaptionBorderR = isset($Format["CaptionBorderR"]) ? $Format["CaptionBorderR"] : 0; - $CaptionBorderG = isset($Format["CaptionBorderG"]) ? $Format["CaptionBorderG"] : 0; - $CaptionBorderB = isset($Format["CaptionBorderB"]) ? $Format["CaptionBorderB"] : 0; - $CaptionFillR = isset($Format["CaptionFillR"]) ? $Format["CaptionFillR"] : 255; - $CaptionFillG = isset($Format["CaptionFillG"]) ? $Format["CaptionFillG"] : 255; - $CaptionFillB = isset($Format["CaptionFillB"]) ? $Format["CaptionFillB"] : 255; - $CaptionFillAlpha = isset($Format["CaptionFillAlpha"]) ? $Format["CaptionFillAlpha"] : 80; - $PositiveSlopeStartR = isset($Format["PositiveSlopeStartR"]) ? $Format["PositiveSlopeStartR"] : 184; - $PositiveSlopeStartG = isset($Format["PositiveSlopeStartG"]) ? $Format["PositiveSlopeStartG"] : 234; - $PositiveSlopeStartB = isset($Format["PositiveSlopeStartB"]) ? $Format["PositiveSlopeStartB"] : 88; - $PositiveSlopeEndR = isset($Format["PositiveSlopeStartR"]) ? $Format["PositiveSlopeStartR"] : 239; - $PositiveSlopeEndG = isset($Format["PositiveSlopeStartG"]) ? $Format["PositiveSlopeStartG"] : 31; - $PositiveSlopeEndB = isset($Format["PositiveSlopeStartB"]) ? $Format["PositiveSlopeStartB"] : 36; - $NegativeSlopeStartR = isset($Format["NegativeSlopeStartR"]) ? $Format["NegativeSlopeStartR"] : 184; - $NegativeSlopeStartG = isset($Format["NegativeSlopeStartG"]) ? $Format["NegativeSlopeStartG"] : 234; - $NegativeSlopeStartB = isset($Format["NegativeSlopeStartB"]) ? $Format["NegativeSlopeStartB"] : 88; - $NegativeSlopeEndR = isset($Format["NegativeSlopeStartR"]) ? $Format["NegativeSlopeStartR"] : 67; - $NegativeSlopeEndG = isset($Format["NegativeSlopeStartG"]) ? $Format["NegativeSlopeStartG"] : 124; - $NegativeSlopeEndB = isset($Format["NegativeSlopeStartB"]) ? $Format["NegativeSlopeStartB"] : 227; - - $Data = $this->DataSet->getData(); - - list($XMargin,$XDivs) = $this->scaleGetXSettings(); - - if ( $Data["Orientation"] == SCALE_POS_LEFTRIGHT ) - $YPos = $this->DataSet->Data["GraphArea"]["Y2"] + $Offset; - else - $XPos = $this->DataSet->Data["GraphArea"]["X2"] + $Offset; - - foreach($Data["Series"] as $SerieName => $Serie) - { - if ( $Serie["isDrawable"] == TRUE && $SerieName != $Data["Abscissa"] ) - { - $R = $Serie["Color"]["R"]; $G = $Serie["Color"]["G"]; $B = $Serie["Color"]["B"]; $Alpha = $Serie["Color"]["Alpha"]; $Ticks = $Serie["Ticks"]; $Weight = $Serie["Weight"]; - - $AxisID = $Serie["Axis"]; - $PosArray = $this->scaleComputeY($Serie["Data"],array("AxisID"=>$Serie["Axis"])); - - if ( $Data["Orientation"] == SCALE_POS_LEFTRIGHT ) - { - if ( $Caption ) - { - if ( $CaptionLine ) - { - $StartX = floor($this->GraphAreaX1-$CaptionWidth+$XMargin-$CaptionMargin); - $EndX = floor($this->GraphAreaX1-$CaptionMargin+$XMargin); - - $CaptionSettings = array("R"=>$R,"G"=>$G,"B"=>$B,"Alpha"=>$Alpha,"Ticks"=>$Ticks,"Weight"=>$Weight); - if ( $CaptionBox ) { $this->drawFilledRectangle($StartX,$YPos,$EndX,$YPos+$CaptionHeight,array("R"=>$CaptionFillR,"G"=>$CaptionFillG,"B"=>$CaptionFillB,"BorderR"=>$CaptionBorderR,"BorderG"=>$CaptionBorderG,"BorderB"=>$CaptionBorderB,"Alpha"=>$CaptionFillAlpha)); } - $this->drawLine($StartX+2,$YPos+($CaptionHeight/2),$EndX-2,$YPos+($CaptionHeight/2),$CaptionSettings); - } - else - $this->drawFilledRectangle($this->GraphAreaX1-$CaptionWidth+$XMargin-$CaptionMargin,$YPos,$this->GraphAreaX1-$CaptionMargin+$XMargin,$YPos+$CaptionHeight,array("R"=>$R,"G"=>$G,"B"=>$B,"BorderR"=>$CaptionBorderR,"BorderG"=>$CaptionBorderG,"BorderB"=>$CaptionBorderB)); - } - - if ( $XDivs == 0 ) { $XStep = ($this->GraphAreaX2-$this->GraphAreaX1)/4; } else { $XStep = ($this->GraphAreaX2-$this->GraphAreaX1-$XMargin*2)/$XDivs; } - $X = $this->GraphAreaX1 + $XMargin; - - $TopY = $YPos + ($CaptionHeight/2) - ($DerivativeHeight/2); - $BottomY = $YPos + ($CaptionHeight/2) + ($DerivativeHeight/2); - - $StartX = floor($this->GraphAreaX1+$XMargin); - $EndX = floor($this->GraphAreaX2-$XMargin); - - if ( $DrawBackground ) { $this->drawFilledRectangle($StartX-1,$TopY-1,$EndX+1,$BottomY+1,array("R"=>$BackgroundR,"G"=>$BackgroundG,"B"=>$BackgroundB,"Alpha"=>$BackgroundAlpha)); } - if ( $DrawBorder ) { $this->drawRectangle($StartX-1,$TopY-1,$EndX+1,$BottomY+1,array("R"=>$BorderR,"G"=>$BorderG,"B"=>$BorderB,"Alpha"=>$BorderAlpha)); } - - if ( !is_array($PosArray) ) { $Value = $PosArray; $PosArray = ""; $PosArray[0] = $Value; } - - $RestoreShadow = $this->Shadow; - $this->Shadow = FALSE; - - /* Determine the Max slope index */ - $LastX = NULL; $LastY = NULL; $MinSlope = 0; $MaxSlope = 1; - foreach($PosArray as $Key => $Y) - { - if ( $Y != VOID && $LastX != NULL ) - { $Slope = ($LastY - $Y); if ( $Slope > $MaxSlope ) { $MaxSlope = $Slope; } if ( $Slope < $MinSlope ) { $MinSlope = $Slope; } } - - if ( $Y == VOID ) - { $LastX = NULL; $LastY = NULL; } - else - { $LastX = $X; $LastY = $Y; } - } - - $LastX = NULL; $LastY = NULL; $LastColor = NULL; - foreach($PosArray as $Key => $Y) - { - if ( $Y != VOID && $LastY != NULL ) - { - $Slope = ($LastY - $Y); - - if ( $Slope >= 0 ) - { - $SlopeIndex = (100 / $MaxSlope) * $Slope; - $R = (($PositiveSlopeEndR - $PositiveSlopeStartR)/100)*$SlopeIndex+$PositiveSlopeStartR; - $G = (($PositiveSlopeEndG - $PositiveSlopeStartG)/100)*$SlopeIndex+$PositiveSlopeStartG; - $B = (($PositiveSlopeEndB - $PositiveSlopeStartB)/100)*$SlopeIndex+$PositiveSlopeStartB; - } - elseif ( $Slope < 0 ) - { - $SlopeIndex = (100 / abs($MinSlope)) * abs($Slope); - $R = (($NegativeSlopeEndR - $NegativeSlopeStartR)/100)*$SlopeIndex+$NegativeSlopeStartR; - $G = (($NegativeSlopeEndG - $NegativeSlopeStartG)/100)*$SlopeIndex+$NegativeSlopeStartG; - $B = (($NegativeSlopeEndB - $NegativeSlopeStartB)/100)*$SlopeIndex+$NegativeSlopeStartB; - } - - $Color = array("R"=>$R,"G"=>$G,"B"=>$B); - - if ( $ShadedSlopeBox && $LastColor != NULL ) // && $Slope != 0 - { - $GradientSettings = array("StartR"=>$LastColor["R"],"StartG"=>$LastColor["G"],"StartB"=>$LastColor["B"],"EndR"=>$R,"EndG"=>$G,"EndB"=>$B); - $this->drawGradientArea($LastX,$TopY,$X,$BottomY,DIRECTION_HORIZONTAL,$GradientSettings); - } - elseif ( !$ShadedSlopeBox || $LastColor == NULL ) // || $Slope == 0 - $this->drawFilledRectangle(floor($LastX),$TopY,floor($X),$BottomY,$Color); - - $LastColor = $Color; - } - - if ( $Y == VOID ) - { $LastY = NULL; } - else - { $LastX = $X; $LastY = $Y; } - - $X = $X + $XStep; - } - - $YPos = $YPos + $CaptionHeight + $SerieSpacing; - } - else - { - if ( $Caption ) - { - $StartY = floor($this->GraphAreaY1-$CaptionWidth+$XMargin-$CaptionMargin); - $EndY = floor($this->GraphAreaY1-$CaptionMargin+$XMargin); - if ( $CaptionLine ) - { - $CaptionSettings = array("R"=>$R,"G"=>$G,"B"=>$B,"Alpha"=>$Alpha,"Ticks"=>$Ticks,"Weight"=>$Weight); - if ( $CaptionBox ) { $this->drawFilledRectangle($XPos,$StartY,$XPos+$CaptionHeight,$EndY,array("R"=>$CaptionFillR,"G"=>$CaptionFillG,"B"=>$CaptionFillB,"BorderR"=>$CaptionBorderR,"BorderG"=>$CaptionBorderG,"BorderB"=>$CaptionBorderB,"Alpha"=>$CaptionFillAlpha)); } - $this->drawLine($XPos+($CaptionHeight/2),$StartY+2,$XPos+($CaptionHeight/2),$EndY-2,$CaptionSettings); - } - else - $this->drawFilledRectangle($XPos,$StartY,$XPos+$CaptionHeight,$EndY,array("R"=>$R,"G"=>$G,"B"=>$B,"BorderR"=>$CaptionBorderR,"BorderG"=>$CaptionBorderG,"BorderB"=>$CaptionBorderB)); - } - - - if ( $XDivs == 0 ) { $XStep = ($this->GraphAreaY2-$this->GraphAreaY1)/4; } else { $XStep = ($this->GraphAreaY2-$this->GraphAreaY1-$XMargin*2)/$XDivs; } - $Y = $this->GraphAreaY1 + $XMargin; - - $TopX = $XPos + ($CaptionHeight/2) - ($DerivativeHeight/2); - $BottomX = $XPos + ($CaptionHeight/2) + ($DerivativeHeight/2); - - $StartY = floor($this->GraphAreaY1+$XMargin); - $EndY = floor($this->GraphAreaY2-$XMargin); - - if ( $DrawBackground ) { $this->drawFilledRectangle($TopX-1,$StartY-1,$BottomX+1,$EndY+1,array("R"=>$BackgroundR,"G"=>$BackgroundG,"B"=>$BackgroundB,"Alpha"=>$BackgroundAlpha)); } - if ( $DrawBorder ) { $this->drawRectangle($TopX-1,$StartY-1,$BottomX+1,$EndY+1,array("R"=>$BorderR,"G"=>$BorderG,"B"=>$BorderB,"Alpha"=>$BorderAlpha)); } - - if ( !is_array($PosArray) ) { $Value = $PosArray; $PosArray = ""; $PosArray[0] = $Value; } - - $RestoreShadow = $this->Shadow; - $this->Shadow = FALSE; - - /* Determine the Max slope index */ - $LastX = NULL; $LastY = NULL; $MinSlope = 0; $MaxSlope = 1; - foreach($PosArray as $Key => $X) - { - if ( $X != VOID && $LastX != NULL ) - { $Slope = ($X - $LastX); if ( $Slope > $MaxSlope ) { $MaxSlope = $Slope; } if ( $Slope < $MinSlope ) { $MinSlope = $Slope; } } - - if ( $X == VOID ) - { $LastX = NULL; } - else - { $LastX = $X; } - } - - $LastX = NULL; $LastY = NULL; $LastColor = NULL; - foreach($PosArray as $Key => $X) - { - if ( $X != VOID && $LastX != NULL ) - { - $Slope = ($X - $LastX); - - if ( $Slope >= 0 ) - { - $SlopeIndex = (100 / $MaxSlope) * $Slope; - $R = (($PositiveSlopeEndR - $PositiveSlopeStartR)/100)*$SlopeIndex+$PositiveSlopeStartR; - $G = (($PositiveSlopeEndG - $PositiveSlopeStartG)/100)*$SlopeIndex+$PositiveSlopeStartG; - $B = (($PositiveSlopeEndB - $PositiveSlopeStartB)/100)*$SlopeIndex+$PositiveSlopeStartB; - } - elseif ( $Slope < 0 ) - { - $SlopeIndex = (100 / abs($MinSlope)) * abs($Slope); - $R = (($NegativeSlopeEndR - $NegativeSlopeStartR)/100)*$SlopeIndex+$NegativeSlopeStartR; - $G = (($NegativeSlopeEndG - $NegativeSlopeStartG)/100)*$SlopeIndex+$NegativeSlopeStartG; - $B = (($NegativeSlopeEndB - $NegativeSlopeStartB)/100)*$SlopeIndex+$NegativeSlopeStartB; - } - - $Color = array("R"=>$R,"G"=>$G,"B"=>$B); - - if ( $ShadedSlopeBox && $LastColor != NULL ) - { - $GradientSettings = array("StartR"=>$LastColor["R"],"StartG"=>$LastColor["G"],"StartB"=>$LastColor["B"],"EndR"=>$R,"EndG"=>$G,"EndB"=>$B); - - $this->drawGradientArea($TopX,$LastY,$BottomX,$Y,DIRECTION_VERTICAL,$GradientSettings); - } - elseif ( !$ShadedSlopeBox || $LastColor == NULL ) - $this->drawFilledRectangle($TopX,floor($LastY),$BottomX,floor($Y),$Color); - - $LastColor = $Color; - } - - if ( $X == VOID ) - { $LastX = NULL; } - else - { $LastX = $X; $LastY = $Y; } - - $Y = $Y + $XStep; - } - - $XPos = $XPos + $CaptionHeight + $SerieSpacing; - } - - $this->Shadow = $RestoreShadow; - } - } - } - - /* Draw the line of best fit */ - function drawBestFit($Format="") - { - $OverrideTicks = isset($Format["Ticks"]) ? $Format["Ticks"] : NULL; - $OverrideR = isset($Format["R"]) ? $Format["R"] : VOID; - $OverrideG = isset($Format["G"]) ? $Format["G"] : VOID; - $OverrideB = isset($Format["B"]) ? $Format["B"] : VOID; - $OverrideAlpha = isset($Format["Alpha"]) ? $Format["Alpha"] : VOID; - - $Data = $this->DataSet->getData(); - list($XMargin,$XDivs) = $this->scaleGetXSettings(); - - foreach($Data["Series"] as $SerieName => $Serie) - { - if ( $Serie["isDrawable"] == TRUE && $SerieName != $Data["Abscissa"] ) - { - if ( $OverrideR != VOID && $OverrideG != VOID && $OverrideB != VOID ) { $R = $OverrideR; $G = $OverrideG; $B = $OverrideB; } else { $R = $Serie["Color"]["R"]; $G = $Serie["Color"]["G"]; $B = $Serie["Color"]["B"]; } - if ( $OverrideTicks == NULL ) { $Ticks = $Serie["Ticks"]; } else { $Ticks = $OverrideTicks; } - if ( $OverrideAlpha == VOID ) { $Alpha = $Serie["Color"]["Alpha"]; } else { $Alpha = $OverrideAlpha; } - - $Color = array("R"=>$R,"G"=>$G,"B"=>$B,"Alpha"=>$Alpha,"Ticks"=>$Ticks); - - $AxisID = $Serie["Axis"]; - $PosArray = $this->scaleComputeY($Serie["Data"],array("AxisID"=>$Serie["Axis"])); - - if ( $Data["Orientation"] == SCALE_POS_LEFTRIGHT ) - { - if ( $XDivs == 0 ) { $XStep = ($this->GraphAreaX2-$this->GraphAreaX1)/4; } else { $XStep = ($this->GraphAreaX2-$this->GraphAreaX1-$XMargin*2)/$XDivs; } - $X = $this->GraphAreaX1 + $XMargin; - - if ( !is_array($PosArray) ) { $Value = $PosArray; $PosArray = ""; $PosArray[0] = $Value; } - $Sxy = 0; $Sx = 0; $Sy = 0; $Sxx = 0; - foreach($PosArray as $Key => $Y) - { - if ( $Y != VOID ) - { - $Sxy = $Sxy + $X*$Y; - $Sx = $Sx + $X; - $Sy = $Sy + $Y; - $Sxx = $Sxx + $X*$X; - } - - $X = $X + $XStep; - } - $n = count($this->DataSet->stripVOID($PosArray)); //$n = count($PosArray); - $M = (($n*$Sxy)-($Sx*$Sy)) / (($n*$Sxx)-($Sx*$Sx)); - $B = (($Sy)-($M*$Sx))/($n); - - $X1 = $this->GraphAreaX1 + $XMargin; - $Y1 = $M * $X1 + $B; - $X2 = $this->GraphAreaX2 - $XMargin; - $Y2 = $M * $X2 + $B; - - if ( $Y1 < $this->GraphAreaY1 ) { $X1 = $X1 + ($this->GraphAreaY1-$Y1); $Y1 = $this->GraphAreaY1; } - if ( $Y1 > $this->GraphAreaY2 ) { $X1 = $X1 + ($Y1-$this->GraphAreaY2); $Y1 = $this->GraphAreaY2; } - if ( $Y2 < $this->GraphAreaY1 ) { $X2 = $X2 - ($this->GraphAreaY1-$Y2); $Y2 = $this->GraphAreaY1; } - if ( $Y2 > $this->GraphAreaY2 ) { $X2 = $X2 - ($Y2-$this->GraphAreaY2); $Y2 = $this->GraphAreaY2; } - - $this->drawLine($X1,$Y1,$X2,$Y2,$Color); - } - else - { - if ( $XDivs == 0 ) { $YStep = ($this->GraphAreaY2-$this->GraphAreaY1)/4; } else { $YStep = ($this->GraphAreaY2-$this->GraphAreaY1-$XMargin*2)/$XDivs; } - $Y = $this->GraphAreaY1 + $XMargin; - - if ( !is_array($PosArray) ) { $Value = $PosArray; $PosArray = ""; $PosArray[0] = $Value; } - $Sxy = 0; $Sx = 0; $Sy = 0; $Sxx = 0; - foreach($PosArray as $Key => $X) - { - if ( $X != VOID ) - { - $Sxy = $Sxy + $X*$Y; - $Sx = $Sx + $Y; - $Sy = $Sy + $X; - $Sxx = $Sxx + $Y*$Y; - } - - $Y = $Y + $YStep; - } - $n = count($this->DataSet->stripVOID($PosArray)); //$n = count($PosArray); - $M = (($n*$Sxy)-($Sx*$Sy)) / (($n*$Sxx)-($Sx*$Sx)); - $B = (($Sy)-($M*$Sx))/($n); - - $Y1 = $this->GraphAreaY1 + $XMargin; - $X1 = $M * $Y1 + $B; - $Y2 = $this->GraphAreaY2 - $XMargin; - $X2 = $M * $Y2 + $B; - - if ( $X1 < $this->GraphAreaX1 ) { $Y1 = $Y1 + ($this->GraphAreaX1-$X1); $X1 = $this->GraphAreaX1; } - if ( $X1 > $this->GraphAreaX2 ) { $Y1 = $Y1 + ($X1-$this->GraphAreaX2); $X1 = $this->GraphAreaX2; } - if ( $X2 < $this->GraphAreaX1 ) { $Y2 = $Y2 - ($this->GraphAreaY1-$X2); $X2 = $this->GraphAreaX1; } - if ( $X2 > $this->GraphAreaX2 ) { $Y2 = $Y2 - ($X2-$this->GraphAreaX2); $X2 = $this->GraphAreaX2; } - - $this->drawLine($X1,$Y1,$X2,$Y2,$Color); - } - } - } - } - - /* Write labels */ - function writeLabel($SeriesName,$Indexes,$Format="") - { - $OverrideTitle = isset($Format["OverrideTitle"]) ? $Format["OverrideTitle"] : NULL; - $ForceLabels = isset($Format["ForceLabels"]) ? $Format["ForceLabels"] : NULL; - $DrawPoint = isset($Format["DrawPoint"]) ? $Format["DrawPoint"] : LABEL_POINT_BOX; - $DrawVerticalLine = isset($Format["DrawVerticalLine"]) ? $Format["DrawVerticalLine"] : FALSE; - $VerticalLineR = isset($Format["VerticalLineR"]) ? $Format["VerticalLineR"] : 0; - $VerticalLineG = isset($Format["VerticalLineG"]) ? $Format["VerticalLineG"] : 0; - $VerticalLineB = isset($Format["VerticalLineB"]) ? $Format["VerticalLineB"] : 0; - $VerticalLineAlpha = isset($Format["VerticalLineAlpha"]) ? $Format["VerticalLineAlpha"] : 40; - $VerticalLineTicks = isset($Format["VerticalLineTicks"]) ? $Format["VerticalLineTicks"] : 2; - - $Data = $this->DataSet->getData(); - list($XMargin,$XDivs) = $this->scaleGetXSettings(); - - if ( !is_array($Indexes) ) { $Index = $Indexes; $Indexes = ""; $Indexes[] = $Index; } - if ( !is_array($SeriesName) ) { $SerieName = $SeriesName; $SeriesName = ""; $SeriesName[] = $SerieName; } - if ( $ForceLabels != NULL && !is_array($ForceLabels) ) { $ForceLabel = $ForceLabels; $ForceLabels = ""; $ForceLabels[] = $ForceLabel; } - - foreach ($Indexes as $Key => $Index) - { - $Series = ""; - - if ( $Data["Orientation"] == SCALE_POS_LEFTRIGHT ) - { - if ( $XDivs == 0 ) { $XStep = ($this->GraphAreaX2-$this->GraphAreaX1)/4; } else { $XStep = ($this->GraphAreaX2-$this->GraphAreaX1-$XMargin*2)/$XDivs; } - $X = $this->GraphAreaX1 + $XMargin + $Index * $XStep; - - if ( $DrawVerticalLine ) { $this->drawLine($X,$this->GraphAreaY1+$Data["YMargin"],$X,$this->GraphAreaY2-$Data["YMargin"],array("R"=>$VerticalLineR,"G"=>$VerticalLineG,"B"=>$VerticalLineB,"Alpha"=>$VerticalLineAlpha,"Ticks"=>$VerticalLineTicks)); } - - $MinY = $this->GraphAreaY2; - foreach ($SeriesName as $iKey => $SerieName) - { - if ( isset($Data["Series"][$SerieName]["Data"][$Index]) ) - { - $AxisID = $Data["Series"][$SerieName]["Axis"]; - $XAxisMode = $Data["XAxisDisplay"]; - $XAxisFormat = $Data["XAxisFormat"]; - $XAxisUnit = $Data["XAxisUnit"]; - $AxisMode = $Data["Axis"][$AxisID]["Display"]; - $AxisFormat = $Data["Axis"][$AxisID]["Format"]; - $AxisUnit = $Data["Axis"][$AxisID]["Unit"]; - - if ( isset($Data["Abscissa"]) && isset($Data["Series"][$Data["Abscissa"]]["Data"][$Index]) ) - $XLabel = $this->scaleFormat($Data["Series"][$Data["Abscissa"]]["Data"][$Index],$XAxisMode,$XAxisFormat,$XAxisUnit); - else - $XLabel = ""; - - if ( $OverrideTitle != NULL) - $Description = $OverrideTitle; - elseif ( count($SeriesName) == 1 ) - { - $Description = $Data["Series"][$SerieName]["Description"]." - ".$XLabel; - } - elseif ( isset($Data["Abscissa"]) && isset($Data["Series"][$Data["Abscissa"]]["Data"][$Index]) ) - $Description = $XLabel; - - $Serie = ""; - $Serie["R"] = $Data["Series"][$SerieName]["Color"]["R"]; - $Serie["G"] = $Data["Series"][$SerieName]["Color"]["G"]; - $Serie["B"] = $Data["Series"][$SerieName]["Color"]["B"]; - $Serie["Alpha"] = $Data["Series"][$SerieName]["Color"]["Alpha"]; - - if ( count($SeriesName) == 1 && isset($Data["Series"][$SerieName]["XOffset"]) ) - $SerieOffset = $Data["Series"][$SerieName]["XOffset"]; - else - $SerieOffset = 0; - - $Value = $Data["Series"][$SerieName]["Data"][$Index]; - if ( $Value == VOID ) { $Value = "NaN"; } - - if ( $ForceLabels != NULL ) - $Caption = isset($ForceLabels[$Key]) ? $ForceLabels[$Key] : "Not set"; - else - $Caption = $this->scaleFormat($Value,$AxisMode,$AxisFormat,$AxisUnit); - - if ( $this->LastChartLayout == CHART_LAST_LAYOUT_STACKED ) - { - if ( $Value >=0 ) { $LookFor = "+"; } else { $LookFor = "-"; } - - $Value = 0; $Done = FALSE; - foreach($Data["Series"] as $Name => $SerieLookup) - { - if ( $SerieLookup["isDrawable"] == TRUE && $Name != $Data["Abscissa"] && !$Done ) - { - if ( isset($Data["Series"][$Name]["Data"][$Index]) && $Data["Series"][$Name]["Data"][$Index] != VOID ) - { - if ($Data["Series"][$Name]["Data"][$Index] >= 0 && $LookFor == "+" ) { $Value = $Value + $Data["Series"][$Name]["Data"][$Index]; } - if ($Data["Series"][$Name]["Data"][$Index] < 0 && $LookFor == "-" ) { $Value = $Value - $Data["Series"][$Name]["Data"][$Index]; } - if ($Name == $SerieName ) { $Done = TRUE; } - } - } - } - } - - $X = floor($this->GraphAreaX1 + $XMargin + $Index * $XStep + $SerieOffset); - $Y = floor($this->scaleComputeY($Value,array("AxisID"=>$AxisID))); - - if ($Y < $MinY) { $MinY = $Y; } - - if ( $DrawPoint == LABEL_POINT_CIRCLE ) - $this->drawFilledCircle($X,$Y,3,array("R"=>255,"G"=>255,"B"=>255,"BorderR"=>0,"BorderG"=>0,"BorderB"=>0)); - elseif ( $DrawPoint == LABEL_POINT_BOX ) - $this->drawFilledRectangle($X-2,$Y-2,$X+2,$Y+2,array("R"=>255,"G"=>255,"B"=>255,"BorderR"=>0,"BorderG"=>0,"BorderB"=>0)); - - $Series[] = array("Format"=>$Serie,"Caption"=>$Caption); - } - } - $this->drawLabelBox($X,$MinY-3,$Description,$Series,$Format); - - } - else - { - if ( $XDivs == 0 ) { $XStep = ($this->GraphAreaY2-$this->GraphAreaY1)/4; } else { $XStep = ($this->GraphAreaY2-$this->GraphAreaY1-$XMargin*2)/$XDivs; } - $Y = $this->GraphAreaY1 + $XMargin + $Index * $XStep; - - if ( $DrawVerticalLine ) { $this->drawLine($this->GraphAreaX1+$Data["YMargin"],$Y,$this->GraphAreaX2-$Data["YMargin"],$Y,array("R"=>$VerticalLineR,"G"=>$VerticalLineG,"B"=>$VerticalLineB,"Alpha"=>$VerticalLineAlpha,"Ticks"=>$VerticalLineTicks)); } - - $MinX = $this->GraphAreaX2; - foreach ($SeriesName as $Key => $SerieName) - { - if ( isset($Data["Series"][$SerieName]["Data"][$Index]) ) - { - $AxisID = $Data["Series"][$SerieName]["Axis"]; - $XAxisMode = $Data["XAxisDisplay"]; - $XAxisFormat = $Data["XAxisFormat"]; - $XAxisUnit = $Data["XAxisUnit"]; - $AxisMode = $Data["Axis"][$AxisID]["Display"]; - $AxisFormat = $Data["Axis"][$AxisID]["Format"]; - $AxisUnit = $Data["Axis"][$AxisID]["Unit"]; - - if ( isset($Data["Abscissa"]) && isset($Data["Series"][$Data["Abscissa"]]["Data"][$Index]) ) - $XLabel = $this->scaleFormat($Data["Series"][$Data["Abscissa"]]["Data"][$Index],$XAxisMode,$XAxisFormat,$XAxisUnit); - else - $XLabel = ""; - - if ( $OverrideTitle != NULL) - $Description = $OverrideTitle; - elseif ( count($SeriesName) == 1 ) - { - if ( isset($Data["Abscissa"]) && isset($Data["Series"][$Data["Abscissa"]]["Data"][$Index]) ) - $Description = $Data["Series"][$SerieName]["Description"]." - ".$XLabel; - } - elseif ( isset($Data["Abscissa"]) && isset($Data["Series"][$Data["Abscissa"]]["Data"][$Index]) ) - $Description = $XLabel; - - $Serie = ""; - if ( isset($Data["Extended"]["Palette"][$Index] ) ) - { - $Serie["R"] = $Data["Extended"]["Palette"][$Index]["R"]; - $Serie["G"] = $Data["Extended"]["Palette"][$Index]["G"]; - $Serie["B"] = $Data["Extended"]["Palette"][$Index]["B"]; - $Serie["Alpha"] = $Data["Extended"]["Palette"][$Index]["Alpha"]; - } - else - { - $Serie["R"] = $Data["Series"][$SerieName]["Color"]["R"]; - $Serie["G"] = $Data["Series"][$SerieName]["Color"]["G"]; - $Serie["B"] = $Data["Series"][$SerieName]["Color"]["B"]; - $Serie["Alpha"] = $Data["Series"][$SerieName]["Color"]["Alpha"]; - } - - if ( count($SeriesName) == 1 && isset($Data["Series"][$SerieName]["XOffset"]) ) - $SerieOffset = $Data["Series"][$SerieName]["XOffset"]; - else - $SerieOffset = 0; - - $Value = $Data["Series"][$SerieName]["Data"][$Index]; - if ( $ForceLabels != NULL ) - $Caption = isset($ForceLabels[$Key]) ? $ForceLabels[$Key] : "Not set"; - else - $Caption = $this->scaleFormat($Value,$AxisMode,$AxisFormat,$AxisUnit); - if ( $Value == VOID ) { $Value = "NaN"; } - - if ( $this->LastChartLayout == CHART_LAST_LAYOUT_STACKED ) - { - if ( $Value >=0 ) { $LookFor = "+"; } else { $LookFor = "-"; } - - $Value = 0; $Done = FALSE; - foreach($Data["Series"] as $Name => $SerieLookup) - { - if ( $SerieLookup["isDrawable"] == TRUE && $Name != $Data["Abscissa"] && !$Done ) - { - if ( isset($Data["Series"][$Name]["Data"][$Index]) && $Data["Series"][$Name]["Data"][$Index] != VOID ) - { - if ($Data["Series"][$Name]["Data"][$Index] >= 0 && $LookFor == "+" ) { $Value = $Value + $Data["Series"][$Name]["Data"][$Index]; } - if ($Data["Series"][$Name]["Data"][$Index] < 0 && $LookFor == "-" ) { $Value = $Value - $Data["Series"][$Name]["Data"][$Index]; } - if ($Name == $SerieName ) { $Done = TRUE; } - } - } - } - } - - $X = floor($this->scaleComputeY($Value,array("AxisID"=>$AxisID))); - $Y = floor($this->GraphAreaY1 + $XMargin + $Index * $XStep + $SerieOffset); - - if ($X < $MinX) { $MinX = $X; } - - if ( $DrawPoint == LABEL_POINT_CIRCLE ) - $this->drawFilledCircle($X,$Y,3,array("R"=>255,"G"=>255,"B"=>255,"BorderR"=>0,"BorderG"=>0,"BorderB"=>0)); - elseif ( $DrawPoint == LABEL_POINT_BOX ) - $this->drawFilledRectangle($X-2,$Y-2,$X+2,$Y+2,array("R"=>255,"G"=>255,"B"=>255,"BorderR"=>0,"BorderG"=>0,"BorderB"=>0)); - - $Series[] = array("Format"=>$Serie,"Caption"=>$Caption); - } - } - $this->drawLabelBox($MinX,$Y-3,$Description,$Series,$Format); - - } - } - } - - /* Draw a label box */ - function drawLabelBox($X,$Y,$Title,$Captions,$Format="") - { - $NoTitle = isset($Format["NoTitle"]) ? $Format["NoTitle"] : NULL; - $BoxWidth = isset($Format["BoxWidth"]) ? $Format["BoxWidth"] : 50; - $DrawSerieColor = isset($Format["DrawSerieColor"]) ? $Format["DrawSerieColor"] : TRUE; - $SerieR = isset($Format["SerieR"]) ? $Format["SerieR"] : NULL; - $SerieG = isset($Format["SerieG"]) ? $Format["SerieG"] : NULL; - $SerieB = isset($Format["SerieB"]) ? $Format["SerieB"] : NULL; - $SerieAlpha = isset($Format["SerieAlpha"]) ? $Format["SerieAlpha"] : NULL; - $SerieBoxSize = isset($Format["SerieBoxSize"]) ? $Format["SerieBoxSize"] : 6; - $SerieBoxSpacing = isset($Format["SerieBoxSpacing"]) ? $Format["SerieBoxSpacing"] : 4; - $VerticalMargin = isset($Format["VerticalMargin"]) ? $Format["VerticalMargin"] : 10; - $HorizontalMargin = isset($Format["HorizontalMargin"]) ? $Format["HorizontalMargin"] : 8; - $R = isset($Format["R"]) ? $Format["R"] : $this->FontColorR; - $G = isset($Format["G"]) ? $Format["G"] : $this->FontColorG; - $B = isset($Format["B"]) ? $Format["B"] : $this->FontColorB; - $Alpha = isset($Format["Alpha"]) ? $Format["Alpha"] : $this->FontColorA; - $FontName = isset($Format["FontName"]) ? $Format["FontName"] : $this->FontName; - $FontSize = isset($Format["FontSize"]) ? $Format["FontSize"] : $this->FontSize; - $TitleMode = isset($Format["TitleMode"]) ? $Format["TitleMode"] : LABEL_TITLE_NOBACKGROUND; - $TitleR = isset($Format["TitleR"]) ? $Format["TitleR"] : $R; - $TitleG = isset($Format["TitleG"]) ? $Format["TitleG"] : $G; - $TitleB = isset($Format["TitleB"]) ? $Format["TitleB"] : $B; - $TitleAlpha = isset($Format["TitleAlpha"]) ? $Format["TitleAlpha"] : 100; - $TitleBackgroundR = isset($Format["TitleBackgroundR"]) ? $Format["TitleBackgroundR"] : 0; - $TitleBackgroundG = isset($Format["TitleBackgroundG"]) ? $Format["TitleBackgroundG"] : 0; - $TitleBackgroundB = isset($Format["TitleBackgroundB"]) ? $Format["TitleBackgroundB"] : 0; - $TitleBackgroundAlpha = isset($Format["TitleBackgroundAlpha"]) ? $Format["TitleBackgroundAlpha"] : 100; - $GradientStartR = isset($Format["GradientStartR"]) ? $Format["GradientStartR"] : 255; - $GradientStartG = isset($Format["GradientStartG"]) ? $Format["GradientStartG"] : 255; - $GradientStartB = isset($Format["GradientStartB"]) ? $Format["GradientStartB"] : 255; - $GradientEndR = isset($Format["GradientEndR"]) ? $Format["GradientEndR"] : 220; - $GradientEndG = isset($Format["GradientEndG"]) ? $Format["GradientEndG"] : 220; - $GradientEndB = isset($Format["GradientEndB"]) ? $Format["GradientEndB"] : 220; - $BoxAlpha = isset($Format["BoxAlpha"]) ? $Format["BoxAlpha"] : 100; - - if ( !$DrawSerieColor ) { $SerieBoxSize = 0; $SerieBoxSpacing = 0; } - - $TxtPos = $this->getTextBox($X,$Y,$FontName,$FontSize,0,$Title); - $TitleWidth = ($TxtPos[1]["X"] - $TxtPos[0]["X"])+$VerticalMargin*2; - $TitleHeight = ($TxtPos[0]["Y"] - $TxtPos[2]["Y"]); - - if ( $NoTitle ) { $TitleWidth = 0; $TitleHeight = 0; } - - $CaptionWidth = 0; $CaptionHeight = -$HorizontalMargin; - foreach($Captions as $Key =>$Caption) - { - $TxtPos = $this->getTextBox($X,$Y,$FontName,$FontSize,0,$Caption["Caption"]); - $CaptionWidth = max($CaptionWidth,($TxtPos[1]["X"] - $TxtPos[0]["X"])+$VerticalMargin*2); - $CaptionHeight = $CaptionHeight + max(($TxtPos[0]["Y"] - $TxtPos[2]["Y"]),($SerieBoxSize+2)) + $HorizontalMargin; - } - - if ( $CaptionHeight <= 5 ) { $CaptionHeight = $CaptionHeight + $HorizontalMargin/2; } - - if ( $DrawSerieColor ) { $CaptionWidth = $CaptionWidth + $SerieBoxSize + $SerieBoxSpacing; } - - $BoxWidth = max($BoxWidth,$TitleWidth,$CaptionWidth); - - $XMin = $X - 5 - floor(($BoxWidth-10) / 2); - $XMax = $X + 5 + floor(($BoxWidth-10) / 2); - - $RestoreShadow = $this->Shadow; - if ( $this->Shadow == TRUE ) - { - $this->Shadow = FALSE; - - $Poly = ""; - $Poly[] = $X+$this->ShadowX; $Poly[] = $Y+$this->ShadowX; - $Poly[] = $X+5+$this->ShadowX; $Poly[] = $Y-5+$this->ShadowX; - $Poly[] = $XMax+$this->ShadowX; $Poly[] = $Y-5+$this->ShadowX; - - if ( $NoTitle ) - { - $Poly[] = $XMax+$this->ShadowX; $Poly[] = $Y-5-$TitleHeight-$CaptionHeight-$HorizontalMargin*2+$this->ShadowX; - $Poly[] = $XMin+$this->ShadowX; $Poly[] = $Y-5-$TitleHeight-$CaptionHeight-$HorizontalMargin*2+$this->ShadowX; - } - else - { - $Poly[] = $XMax+$this->ShadowX; $Poly[] = $Y-5-$TitleHeight-$CaptionHeight-$HorizontalMargin*3+$this->ShadowX; - $Poly[] = $XMin+$this->ShadowX; $Poly[] = $Y-5-$TitleHeight-$CaptionHeight-$HorizontalMargin*3+$this->ShadowX; - } - - $Poly[] = $XMin+$this->ShadowX; $Poly[] = $Y-5+$this->ShadowX; - $Poly[] = $X-5+$this->ShadowX; $Poly[] = $Y-5+$this->ShadowX; - $this->drawPolygon($Poly,array("R"=>$this->ShadowR,"G"=>$this->ShadowG,"B"=>$this->ShadowB,"Alpha"=>$this->Shadowa)); - } - - /* Draw the background */ - $GradientSettings = array("StartR"=>$GradientStartR,"StartG"=>$GradientStartG,"StartB"=>$GradientStartB,"EndR"=>$GradientEndR,"EndG"=>$GradientEndG,"EndB"=>$GradientEndB,"Alpha"=>$BoxAlpha); - if ( $NoTitle ) - $this->drawGradientArea($XMin,$Y-5-$TitleHeight-$CaptionHeight-$HorizontalMargin*2,$XMax,$Y-6,DIRECTION_VERTICAL,$GradientSettings); - else - $this->drawGradientArea($XMin,$Y-5-$TitleHeight-$CaptionHeight-$HorizontalMargin*3,$XMax,$Y-6,DIRECTION_VERTICAL,$GradientSettings); - $Poly = ""; $Poly[] = $X; $Poly[] = $Y; $Poly[] = $X-5; $Poly[] = $Y-5; $Poly[] = $X+5; $Poly[] = $Y-5; - $this->drawPolygon($Poly,array("R"=>$GradientEndR,"G"=>$GradientEndG,"B"=>$GradientEndB,"Alpha"=>$BoxAlpha,"NoBorder"=>TRUE)); - - /* Outer border */ - $OuterBorderColor = $this->allocateColor($this->Picture,100,100,100,$BoxAlpha); - imageline($this->Picture,$XMin,$Y-5,$X-5,$Y-5,$OuterBorderColor); - imageline($this->Picture,$X,$Y,$X-5,$Y-5,$OuterBorderColor); - imageline($this->Picture,$X,$Y,$X+5,$Y-5,$OuterBorderColor); - imageline($this->Picture,$X+5,$Y-5,$XMax,$Y-5,$OuterBorderColor); - if ( $NoTitle ) - { - imageline($this->Picture,$XMin,$Y-5-$TitleHeight-$CaptionHeight-$HorizontalMargin*2,$XMin,$Y-5,$OuterBorderColor); - imageline($this->Picture,$XMax,$Y-5-$TitleHeight-$CaptionHeight-$HorizontalMargin*2,$XMax,$Y-5,$OuterBorderColor); - imageline($this->Picture,$XMin,$Y-5-$TitleHeight-$CaptionHeight-$HorizontalMargin*2,$XMax,$Y-5-$TitleHeight-$CaptionHeight-$HorizontalMargin*2,$OuterBorderColor); - } - else - { - imageline($this->Picture,$XMin,$Y-5-$TitleHeight-$CaptionHeight-$HorizontalMargin*3,$XMin,$Y-5,$OuterBorderColor); - imageline($this->Picture,$XMax,$Y-5-$TitleHeight-$CaptionHeight-$HorizontalMargin*3,$XMax,$Y-5,$OuterBorderColor); - imageline($this->Picture,$XMin,$Y-5-$TitleHeight-$CaptionHeight-$HorizontalMargin*3,$XMax,$Y-5-$TitleHeight-$CaptionHeight-$HorizontalMargin*3,$OuterBorderColor); - } - - /* Inner border */ - $InnerBorderColor = $this->allocateColor($this->Picture,255,255,255,$BoxAlpha); - imageline($this->Picture,$XMin+1,$Y-6,$X-5,$Y-6,$InnerBorderColor); - imageline($this->Picture,$X,$Y-1,$X-5,$Y-6,$InnerBorderColor); - imageline($this->Picture,$X,$Y-1,$X+5,$Y-6,$InnerBorderColor); - imageline($this->Picture,$X+5,$Y-6,$XMax-1,$Y-6,$InnerBorderColor); - if ( $NoTitle ) - { - imageline($this->Picture,$XMin+1,$Y-4-$TitleHeight-$CaptionHeight-$HorizontalMargin*2,$XMin+1,$Y-6,$InnerBorderColor); - imageline($this->Picture,$XMax-1,$Y-4-$TitleHeight-$CaptionHeight-$HorizontalMargin*2,$XMax-1,$Y-6,$InnerBorderColor); - imageline($this->Picture,$XMin+1,$Y-4-$TitleHeight-$CaptionHeight-$HorizontalMargin*2,$XMax-1,$Y-4-$TitleHeight-$CaptionHeight-$HorizontalMargin*2,$InnerBorderColor); - } - else - { - imageline($this->Picture,$XMin+1,$Y-4-$TitleHeight-$CaptionHeight-$HorizontalMargin*3,$XMin+1,$Y-6,$InnerBorderColor); - imageline($this->Picture,$XMax-1,$Y-4-$TitleHeight-$CaptionHeight-$HorizontalMargin*3,$XMax-1,$Y-6,$InnerBorderColor); - imageline($this->Picture,$XMin+1,$Y-4-$TitleHeight-$CaptionHeight-$HorizontalMargin*3,$XMax-1,$Y-4-$TitleHeight-$CaptionHeight-$HorizontalMargin*3,$InnerBorderColor); - } - - /* Draw the separator line */ - if ( $TitleMode == LABEL_TITLE_NOBACKGROUND && !$NoTitle ) - { - $YPos = $Y-7-$CaptionHeight-$HorizontalMargin-$HorizontalMargin/2; - $XMargin = $VerticalMargin / 2; - $this->drawLine($XMin+$XMargin,$YPos+1,$XMax-$XMargin,$YPos+1,array("R"=>$GradientEndR,"G"=>$GradientEndG,"B"=>$GradientEndB,"Alpha"=>$BoxAlpha)); - $this->drawLine($XMin+$XMargin,$YPos,$XMax-$XMargin,$YPos,array("R"=>$GradientStartR,"G"=>$GradientStartG,"B"=>$GradientStartB,"Alpha"=>$BoxAlpha)); - } - elseif ( $TitleMode == LABEL_TITLE_BACKGROUND ) - { - $this->drawFilledRectangle($XMin,$Y-5-$TitleHeight-$CaptionHeight-$HorizontalMargin*3,$XMax,$Y-5-$TitleHeight-$CaptionHeight-$HorizontalMargin+$HorizontalMargin/2,array("R"=>$TitleBackgroundR,"G"=>$TitleBackgroundG,"B"=>$TitleBackgroundB,"Alpha"=>$BoxAlpha)); - imageline($this->Picture,$XMin+1,$Y-5-$TitleHeight-$CaptionHeight-$HorizontalMargin+$HorizontalMargin/2+1,$XMax-1,$Y-5-$TitleHeight-$CaptionHeight-$HorizontalMargin+$HorizontalMargin/2+1,$InnerBorderColor); - } - - /* Write the description */ - if ( !$NoTitle ) - $this->drawText($XMin+$VerticalMargin,$Y-7-$CaptionHeight-$HorizontalMargin*2,$Title,array("Align"=>TEXT_ALIGN_BOTTOMLEFT,"R"=>$TitleR,"G"=>$TitleG,"B"=>$TitleB)); - - /* Write the value */ - $YPos = $Y-5-$HorizontalMargin; $XPos = $XMin+$VerticalMargin+$SerieBoxSize+$SerieBoxSpacing; - foreach($Captions as $Key => $Caption) - { - $CaptionTxt = $Caption["Caption"]; - $TxtPos = $this->getTextBox($XPos,$YPos,$FontName,$FontSize,0,$CaptionTxt); - $CaptionHeight = ($TxtPos[0]["Y"] - $TxtPos[2]["Y"]); - - /* Write the serie color if needed */ - if ( $DrawSerieColor ) - { - $BoxSettings = array("R"=>$Caption["Format"]["R"],"G"=>$Caption["Format"]["G"],"B"=>$Caption["Format"]["B"],"Alpha"=>$Caption["Format"]["Alpha"],"BorderR"=>0,"BorderG"=>0,"BorderB"=>0); - $this->drawFilledRectangle($XMin+$VerticalMargin,$YPos-$SerieBoxSize,$XMin+$VerticalMargin+$SerieBoxSize,$YPos,$BoxSettings); - } - - $this->drawText($XPos,$YPos,$CaptionTxt,array("Align"=>TEXT_ALIGN_BOTTOMLEFT)); - - $YPos = $YPos - $CaptionHeight - $HorizontalMargin; - } - - $this->Shadow = $RestoreShadow; - } - - /* Draw a basic shape */ - function drawShape($X,$Y,$Shape,$PlotSize,$PlotBorder,$BorderSize,$R,$G,$B,$Alpha,$BorderR,$BorderG,$BorderB,$BorderAlpha) - { - if ( $Shape == SERIE_SHAPE_FILLEDCIRCLE ) - { - if ( $PlotBorder ) { $this->drawFilledCircle($X,$Y,$PlotSize+$BorderSize,array("R"=>$BorderR,"G"=>$BorderG,"B"=>$BorderB,"Alpha"=>$BorderAlpha)); } - $this->drawFilledCircle($X,$Y,$PlotSize,array("R"=>$R,"G"=>$G,"B"=>$B,"Alpha"=>$Alpha)); - } - elseif ( $Shape == SERIE_SHAPE_FILLEDSQUARE ) - { - if ( $PlotBorder ) { $this->drawFilledRectangle($X-$PlotSize-$BorderSize,$Y-$PlotSize-$BorderSize,$X+$PlotSize+$BorderSize,$Y+$PlotSize+$BorderSize,array("R"=>$BorderR,"G"=>$BorderG,"B"=>$BorderB,"Alpha"=>$BorderAlpha)); } - $this->drawFilledRectangle($X-$PlotSize,$Y-$PlotSize,$X+$PlotSize,$Y+$PlotSize,array("R"=>$R,"G"=>$G,"B"=>$B,"Alpha"=>$Alpha)); - } - elseif ( $Shape == SERIE_SHAPE_FILLEDTRIANGLE ) - { - if ( $PlotBorder ) - { - $Pos = ""; $Pos[]=$X; $Pos[]=$Y-$PlotSize-$BorderSize; $Pos[]=$X-$PlotSize-$BorderSize; $Pos[]=$Y+$PlotSize+$BorderSize; $Pos[]=$X+$PlotSize+$BorderSize; $Pos[]=$Y+$PlotSize+$BorderSize; - $this->drawPolygon($Pos,array("R"=>$BorderR,"G"=>$BorderG,"B"=>$BorderB,"Alpha"=>$BorderAlpha)); - } - - $Pos = ""; $Pos[]=$X; $Pos[]=$Y-$PlotSize; $Pos[]=$X-$PlotSize; $Pos[]=$Y+$PlotSize; $Pos[]=$X+$PlotSize; $Pos[]=$Y+$PlotSize; - $this->drawPolygon($Pos,array("R"=>$R,"G"=>$G,"B"=>$B,"Alpha"=>$Alpha)); - } - elseif ( $Shape == SERIE_SHAPE_TRIANGLE ) - { - $this->drawLine($X,$Y-$PlotSize,$X-$PlotSize,$Y+$PlotSize,array("R"=>$R,"G"=>$G,"B"=>$B,"Alpha"=>$Alpha)); - $this->drawLine($X-$PlotSize,$Y+$PlotSize,$X+$PlotSize,$Y+$PlotSize,array("R"=>$R,"G"=>$G,"B"=>$B,"Alpha"=>$Alpha)); - $this->drawLine($X+$PlotSize,$Y+$PlotSize,$X,$Y-$PlotSize,array("R"=>$R,"G"=>$G,"B"=>$B,"Alpha"=>$Alpha)); - } - elseif ( $Shape == SERIE_SHAPE_SQUARE ) - $this->drawRectangle($X-$PlotSize,$Y-$PlotSize,$X+$PlotSize,$Y+$PlotSize,array("R"=>$R,"G"=>$G,"B"=>$B,"Alpha"=>$Alpha)); - elseif ( $Shape == SERIE_SHAPE_CIRCLE ) - $this->drawCircle($X,$Y,$PlotSize,$PlotSize,array("R"=>$R,"G"=>$G,"B"=>$B,"Alpha"=>$Alpha)); - elseif ( $Shape == SERIE_SHAPE_DIAMOND ) - { - $Pos = ""; $Pos[]=$X-$PlotSize; $Pos[]=$Y; $Pos[]=$X; $Pos[]=$Y-$PlotSize; $Pos[]=$X+$PlotSize; $Pos[]=$Y; $Pos[]=$X; $Pos[]=$Y+$PlotSize; - $this->drawPolygon($Pos,array("NoFill"=>TRUE,"BorderR"=>$R,"BorderG"=>$G,"BorderB"=>$B,"BorderAlpha"=>$Alpha)); - } - elseif ( $Shape == SERIE_SHAPE_FILLEDDIAMOND ) - { - if ( $PlotBorder ) - { - $Pos = ""; $Pos[]=$X-$PlotSize-$BorderSize; $Pos[]=$Y; $Pos[]=$X; $Pos[]=$Y-$PlotSize-$BorderSize; $Pos[]=$X+$PlotSize+$BorderSize; $Pos[]=$Y; $Pos[]=$X; $Pos[]=$Y+$PlotSize+$BorderSize; - $this->drawPolygon($Pos,array("R"=>$BorderR,"G"=>$BorderG,"B"=>$BorderB,"Alpha"=>$BorderAlpha)); - } - - $Pos = ""; $Pos[]=$X-$PlotSize; $Pos[]=$Y; $Pos[]=$X; $Pos[]=$Y-$PlotSize; $Pos[]=$X+$PlotSize; $Pos[]=$Y; $Pos[]=$X; $Pos[]=$Y+$PlotSize; - $this->drawPolygon($Pos,array("R"=>$R,"G"=>$G,"B"=>$B,"Alpha"=>$Alpha)); - } - } - - function drawPolygonChart($Points,$Format="") - { - $R = isset($Format["R"]) ? $Format["R"] : 0; - $G = isset($Format["G"]) ? $Format["G"] : 0; - $B = isset($Format["B"]) ? $Format["B"] : 0; - $Alpha = isset($Format["Alpha"]) ? $Format["Alpha"] : 100; - $NoFill = isset($Format["NoFill"]) ? $Format["NoFill"] : FALSE; - $NoBorder = isset($Format["NoBorder"]) ? $Format["NoBorder"] : FALSE; - $BorderR = isset($Format["BorderR"]) ? $Format["BorderR"] : $R; - $BorderG = isset($Format["BorderG"]) ? $Format["BorderG"] : $G; - $BorderB = isset($Format["BorderB"]) ? $Format["BorderB"] : $B; - $BorderAlpha = isset($Format["BorderAlpha"]) ? $Format["BorderAlpha"] : $Alpha / 2; - $Surrounding = isset($Format["Surrounding"]) ? $Format["Surrounding"] : NULL; - $Threshold = isset($Format["Threshold"]) ? $Format["Threshold"] : NULL; - - if ( $Surrounding != NULL ) { $BorderR = $R+$Surrounding; $BorderG = $G+$Surrounding; $BorderB = $B+$Surrounding; } - - $RestoreShadow = $this->Shadow; - $this->Shadow = FALSE; - - $AllIntegers = TRUE; - for($i=0;$i<=count($Points)-2;$i=$i+2) - { if ( $this->getFirstDecimal($Points[$i+1]) != 0 ) { $AllIntegers = FALSE; } } - - /* Convert polygon to segments */ - $Segments = ""; - for($i=2;$i<=count($Points)-2;$i=$i+2) - { $Segments[] = array("X1"=>$Points[$i-2],"Y1"=>$Points[$i-1],"X2"=>$Points[$i],"Y2"=>$Points[$i+1]); } - $Segments[] = array("X1"=>$Points[$i-2],"Y1"=>$Points[$i-1],"X2"=>$Points[0],"Y2"=>$Points[1]); - - /* Simplify straight lines */ - $Result = ""; $inHorizon = FALSE; $LastX = VOID; - foreach($Segments as $Key => $Pos) - { - if ( $Pos["Y1"] != $Pos["Y2"] ) - { - if ( $inHorizon ) { $inHorizon = FALSE; $Result[] = array("X1"=>$LastX,"Y1"=>$Pos["Y1"],"X2"=>$Pos["X1"],"Y2"=>$Pos["Y1"]); } - - $Result[] = array("X1"=>$Pos["X1"],"Y1"=>$Pos["Y1"],"X2"=>$Pos["X2"],"Y2"=>$Pos["Y2"]); - } - else { if ( !$inHorizon ) { $inHorizon = TRUE; $LastX = $Pos["X1"];} } - } - $Segments = $Result; - - /* Do we have something to draw */ - if ( $Segments == "" ) { return(0); } - - /* For segments debugging purpose */ - //foreach($Segments as $Key => $Pos) - // echo $Pos["X1"].",".$Pos["Y1"].",".$Pos["X2"].",".$Pos["Y2"]."\r\n"; - - /* Find out the min & max Y boundaries */ - $MinY = OUT_OF_SIGHT; $MaxY = OUT_OF_SIGHT; - foreach($Segments as $Key => $Coords) - { - if ( $MinY == OUT_OF_SIGHT || $MinY > min($Coords["Y1"],$Coords["Y2"]) ) { $MinY = min($Coords["Y1"],$Coords["Y2"]); } - if ( $MaxY == OUT_OF_SIGHT || $MaxY < max($Coords["Y1"],$Coords["Y2"]) ) { $MaxY = max($Coords["Y1"],$Coords["Y2"]); } - } - - if ( $AllIntegers ) { $YStep = 1; } else { $YStep = .5; } - - $MinY = floor($MinY); $MaxY = floor($MaxY); - - /* Scan each Y lines */ - $DefaultColor = $this->allocateColor($this->Picture,$R,$G,$B,$Alpha); - $DebugLine = 0; $DebugColor = $this->allocateColor($this->Picture,255,0,0,100); - - $MinY = floor($MinY); $MaxY = floor($MaxY); $YStep = 1; - - if ( !$NoFill ) - { - //if ( $DebugLine ) { $MinY = $DebugLine; $MaxY = $DebugLine; } - for($Y=$MinY;$Y<=$MaxY;$Y=$Y+$YStep) - { - $Intersections = ""; $LastSlope = NULL; $RestoreLast = "-"; - foreach($Segments as $Key => $Coords) - { - $X1 = $Coords["X1"]; $X2 = $Coords["X2"]; $Y1 = $Coords["Y1"]; $Y2 = $Coords["Y2"]; - - if ( min($Y1,$Y2) <= $Y && max($Y1,$Y2) >= $Y ) - { - if ( $Y1 == $Y2 ) - { $X = $X1; } - else - { $X = $X1 + ( ($Y-$Y1)*$X2 - ($Y-$Y1)*$X1 ) / ($Y2-$Y1); } - - $X = floor($X); - - if ( $X2 == $X1 ) - { $Slope = "!"; } - else - { - $SlopeC = ($Y2 - $Y1) / ($X2 - $X1); - if( $SlopeC == 0 ) - { $Slope = "="; } - elseif( $SlopeC > 0 ) - { $Slope = "+"; } - elseif ( $SlopeC < 0 ) - { $Slope = "-"; } - } - - if ( !is_array($Intersections) ) - { $Intersections[] = $X; } - elseif( !in_array($X,$Intersections) ) - { $Intersections[] = $X; } - elseif( in_array($X,$Intersections) ) - { - if ($Y == $DebugLine) { echo $Slope."/".$LastSlope."(".$X.") "; } - - if ( $Slope == "=" && $LastSlope == "-" ) { $Intersections[] = $X; } - if ( $Slope != $LastSlope && $LastSlope != "!" && $LastSlope != "=" ) { $Intersections[] = $X; } - if ( $Slope != $LastSlope && $LastSlope == "!" && $Slope == "+" ) { $Intersections[] = $X; } - } - - if ( is_array($Intersections) && in_array($X,$Intersections) && $LastSlope == "=" && ($Slope == "-" )) { $Intersections[] = $X; } - - $LastSlope = $Slope; - } - } - if ( $RestoreLast != "-" ) { $Intersections[] = $RestoreLast; echo "@".$Y."\r\n"; } - - if ( is_array($Intersections) ) - { - sort($Intersections); - - if ($Y == $DebugLine) { print_r($Intersections); } - - /* Remove NULL plots */ - $Result = ""; - for($i=0;$i<=count($Intersections)-1;$i=$i+2) - { - if ( isset($Intersections[$i+1]) ) - { if ( $Intersections[$i] != $Intersections[$i+1] ) { $Result[] = $Intersections[$i]; $Result[] = $Intersections[$i+1]; } } - } - - if ( is_array($Result) ) - { - $Intersections = $Result; - - $LastX = OUT_OF_SIGHT; - foreach($Intersections as $Key => $X) - { - if ( $LastX == OUT_OF_SIGHT ) - $LastX = $X; - elseif ( $LastX != OUT_OF_SIGHT ) - { - if ( $this->getFirstDecimal($LastX) > 1 ) { $LastX++; } - - $Color = $DefaultColor; - if ( $Threshold != NULL ) - { - foreach($Threshold as $Key => $Parameters) - { - if ( $Y <= $Parameters["MinX"] && $Y >= $Parameters["MaxX"]) - { - if ( isset($Parameters["R"]) ) { $R = $Parameters["R"]; } else { $R = 0; } - if ( isset($Parameters["G"]) ) { $G = $Parameters["G"]; } else { $G = 0; } - if ( isset($Parameters["B"]) ) { $B = $Parameters["B"]; } else { $B = 0; } - if ( isset($Parameters["Alpha"]) ) { $Alpha = $Parameters["Alpha"]; } else { $Alpha = 100; } - $Color = $this->allocateColor($this->Picture,$R,$G,$B,$Alpha); - } - } - } - - imageline($this->Picture,$LastX,$Y,$X,$Y,$Color); - - if ( $Y == $DebugLine) { imageline($this->Picture,$LastX,$Y,$X,$Y,$DebugColor); } - - $LastX = OUT_OF_SIGHT; - } - } - } - } - } - } - - /* Draw the polygon border, if required */ - if ( !$NoBorder) - { - foreach($Segments as $Key => $Coords) - $this->drawLine($Coords["X1"],$Coords["Y1"],$Coords["X2"],$Coords["Y2"],array("R"=>$BorderR,"G"=>$BorderG,"B"=>$BorderB,"Alpha"=>$BorderAlpha,"Threshold"=>$Threshold)); - } - - $this->Shadow = $RestoreShadow; - } - - /* Return the abscissa margin */ - function getAbscissaMargin($Data) - { - foreach($Data["Axis"] as $AxisID => $Values) { if ( $Values["Identity"] == AXIS_X ) { return($Values["Margin"]); } } - return(0); - } - - } -?> \ No newline at end of file diff --git a/libs/pChart/class/pImage.class.php b/libs/pChart/class/pImage.class.php deleted file mode 100755 index 562dd08922..0000000000 --- a/libs/pChart/class/pImage.class.php +++ /dev/null @@ -1,482 +0,0 @@ -TransparentBackground = $TransparentBackground; - - if ( $DataSet != NULL ) { $this->DataSet = $DataSet; } - - $this->XSize = $XSize; - $this->YSize = $YSize; - $this->Picture = imagecreatetruecolor($XSize,$YSize); - - if ( $this->TransparentBackground ) - { - imagealphablending($this->Picture,FALSE); - imagefilledrectangle($this->Picture, 0,0,$XSize, $YSize, imagecolorallocatealpha($this->Picture, 255, 255, 255, 127)); - imagealphablending($this->Picture,TRUE); - imagesavealpha($this->Picture,true); - } - else - { - $C_White = $this->AllocateColor($this->Picture,255,255,255); - imagefilledrectangle($this->Picture,0,0,$XSize,$YSize,$C_White); - } - } - - /* Enable / Disable and set shadow properties */ - function setShadow($Enabled=TRUE,$Format="") - { - $X = isset($Format["X"]) ? $Format["X"] : 2; - $Y = isset($Format["Y"]) ? $Format["Y"] : 2; - $R = isset($Format["R"]) ? $Format["R"] : 0; - $G = isset($Format["G"]) ? $Format["G"] : 0; - $B = isset($Format["B"]) ? $Format["B"] : 0; - $Alpha = isset($Format["Alpha"]) ? $Format["Alpha"] : 10; - - $this->Shadow = $Enabled; - $this->ShadowX = $X; - $this->ShadowY = $Y; - $this->ShadowR = $R; - $this->ShadowG = $G; - $this->ShadowB = $B; - $this->Shadowa = $Alpha; - } - - /* Set the graph area position */ - function setGraphArea($X1,$Y1,$X2,$Y2) - { - if ( $X2 < $X1 || $X1 == $X2 || $Y2 < $Y1 || $Y1 == $Y2 ) { return(-1); } - - $this->GraphAreaX1 = $X1; $this->DataSet->Data["GraphArea"]["X1"] = $X1; - $this->GraphAreaY1 = $Y1; $this->DataSet->Data["GraphArea"]["Y1"] = $Y1; - $this->GraphAreaX2 = $X2; $this->DataSet->Data["GraphArea"]["X2"] = $X2; - $this->GraphAreaY2 = $Y2; $this->DataSet->Data["GraphArea"]["Y2"] = $Y2; - } - - /* Return the width of the picture */ - function getWidth() - { return($this->XSize); } - - /* Return the heigth of the picture */ - function getHeight() - { return($this->YSize); } - - /* Render the picture to a file */ - function render($FileName) - { - if ( $this->TransparentBackground ) { imagealphablending($this->Picture,false); imagesavealpha($this->Picture,true); } - imagepng($this->Picture,$FileName); - } - - /* Render the picture to a web browser stream */ - function stroke($BrowserExpire=FALSE) - { - if ( $this->TransparentBackground ) { imagealphablending($this->Picture,false); imagesavealpha($this->Picture,true); } - - if ( $BrowserExpire ) - { - header("Expires: Mon, 26 Jul 1997 05:00:00 GMT"); - header("Cache-Control: no-cache"); - header("Pragma: no-cache"); - } - - header('Content-type: image/png'); - imagepng($this->Picture); - } - - /* Automatic output method based on the calling interface */ - function autoOutput($FileName="output.png") - { - if (php_sapi_name() == "cli") - $this->Render($FileName); - else - $this->Stroke(); - } - - /* Return the length between two points */ - function getLength($X1,$Y1,$X2,$Y2) - { return(sqrt(pow(max($X1,$X2)-min($X1,$X2),2)+pow(max($Y1,$Y2)-min($Y1,$Y2),2))); } - - /* Return the orientation of a line */ - function getAngle($X1,$Y1,$X2,$Y2) - { - $Opposite = $Y2 - $Y1; $Adjacent = $X2 - $X1;$Angle = rad2deg(atan2($Opposite,$Adjacent)); - if ($Angle > 0) { return($Angle); } else { return(360-abs($Angle)); } - } - - /* Return the surrounding box of text area */ - function getTextBox_deprecated($X,$Y,$FontName,$FontSize,$Angle,$Text) - { - $Size = imagettfbbox($FontSize,$Angle,$FontName,$this->getEncodedText($Text)); - $Width = $this->getLength($Size[0],$Size[1],$Size[2],$Size[3])+1; - $Height = $this->getLength($Size[2],$Size[3],$Size[4],$Size[5])+1; - - $RealPos[0]["X"] = $X; $RealPos[0]["Y"] = $Y; - $RealPos[1]["X"] = cos((360-$Angle)*PI/180)*$Width + $RealPos[0]["X"]; $RealPos[1]["Y"] = sin((360-$Angle)*PI/180)*$Width + $RealPos[0]["Y"]; - $RealPos[2]["X"] = cos((270-$Angle)*PI/180)*$Height + $RealPos[1]["X"]; $RealPos[2]["Y"] = sin((270-$Angle)*PI/180)*$Height + $RealPos[1]["Y"]; - $RealPos[3]["X"] = cos((180-$Angle)*PI/180)*$Width + $RealPos[2]["X"]; $RealPos[3]["Y"] = sin((180-$Angle)*PI/180)*$Width + $RealPos[2]["Y"]; - - $RealPos[TEXT_ALIGN_BOTTOMLEFT]["X"] = $RealPos[0]["X"]; $RealPos[TEXT_ALIGN_BOTTOMLEFT]["Y"] = $RealPos[0]["Y"]; - $RealPos[TEXT_ALIGN_BOTTOMRIGHT]["X"] = $RealPos[1]["X"]; $RealPos[TEXT_ALIGN_BOTTOMRIGHT]["Y"] = $RealPos[1]["Y"]; - - return($RealPos); - } - - function getEncodedText($text) - { - $gdinfo = gd_info(); - if (!empty($gdinfo['JIS-mapped Japanese Font Support'])) { - return mb_convert_encoding($text, "SJIS", "UTF-8"); - } - - return $text; - } - - /* Return the surrounding box of text area */ - function getTextBox($X,$Y,$FontName,$FontSize,$Angle,$Text) - { - $coords = imagettfbbox($FontSize, 0, $FontName, $this->getEncodedText($Text)); - - $a = deg2rad($Angle); $ca = cos($a); $sa = sin($a); $RealPos = array(); - for($i = 0; $i < 7; $i += 2) - { - $RealPos[$i/2]["X"] = $X + round($coords[$i] * $ca + $coords[$i+1] * $sa); - $RealPos[$i/2]["Y"] = $Y + round($coords[$i+1] * $ca - $coords[$i] * $sa); - } - - $RealPos[TEXT_ALIGN_BOTTOMLEFT]["X"] = $RealPos[0]["X"]; $RealPos[TEXT_ALIGN_BOTTOMLEFT]["Y"] = $RealPos[0]["Y"]; - $RealPos[TEXT_ALIGN_BOTTOMRIGHT]["X"] = $RealPos[1]["X"]; $RealPos[TEXT_ALIGN_BOTTOMRIGHT]["Y"] = $RealPos[1]["Y"]; - $RealPos[TEXT_ALIGN_TOPLEFT]["X"] = $RealPos[3]["X"]; $RealPos[TEXT_ALIGN_TOPLEFT]["Y"] = $RealPos[3]["Y"]; - $RealPos[TEXT_ALIGN_TOPRIGHT]["X"] = $RealPos[2]["X"]; $RealPos[TEXT_ALIGN_TOPRIGHT]["Y"] = $RealPos[2]["Y"]; - $RealPos[TEXT_ALIGN_BOTTOMMIDDLE]["X"] = ($RealPos[1]["X"]-$RealPos[0]["X"])/2+$RealPos[0]["X"]; $RealPos[TEXT_ALIGN_BOTTOMMIDDLE]["Y"] = ($RealPos[0]["Y"]-$RealPos[1]["Y"])/2+$RealPos[1]["Y"]; - $RealPos[TEXT_ALIGN_TOPMIDDLE]["X"] = ($RealPos[2]["X"]-$RealPos[3]["X"])/2+$RealPos[3]["X"]; $RealPos[TEXT_ALIGN_TOPMIDDLE]["Y"] = ($RealPos[3]["Y"]-$RealPos[2]["Y"])/2+$RealPos[2]["Y"]; - $RealPos[TEXT_ALIGN_MIDDLELEFT]["X"] = ($RealPos[0]["X"]-$RealPos[3]["X"])/2+$RealPos[3]["X"]; $RealPos[TEXT_ALIGN_MIDDLELEFT]["Y"] = ($RealPos[0]["Y"]-$RealPos[3]["Y"])/2+$RealPos[3]["Y"]; - $RealPos[TEXT_ALIGN_MIDDLERIGHT]["X"] = ($RealPos[1]["X"]-$RealPos[2]["X"])/2+$RealPos[2]["X"]; $RealPos[TEXT_ALIGN_MIDDLERIGHT]["Y"] = ($RealPos[1]["Y"]-$RealPos[2]["Y"])/2+$RealPos[2]["Y"]; - $RealPos[TEXT_ALIGN_MIDDLEMIDDLE]["X"] = ($RealPos[1]["X"]-$RealPos[3]["X"])/2+$RealPos[3]["X"]; $RealPos[TEXT_ALIGN_MIDDLEMIDDLE]["Y"] = ($RealPos[0]["Y"]-$RealPos[2]["Y"])/2+$RealPos[2]["Y"]; - - return($RealPos); - } - - /* Set current font properties */ - function setFontProperties($Format="") - { - $R = isset($Format["R"]) ? $Format["R"] : -1; - $G = isset($Format["G"]) ? $Format["G"] : -1; - $B = isset($Format["B"]) ? $Format["B"] : -1; - $Alpha = isset($Format["Alpha"]) ? $Format["Alpha"] : 100; - $FontName = isset($Format["FontName"]) ? $Format["FontName"] : NULL; - $FontSize = isset($Format["FontSize"]) ? $Format["FontSize"] : NULL; - - if ( $R != -1) { $this->FontColorR = $R; } - if ( $G != -1) { $this->FontColorG = $G; } - if ( $B != -1) { $this->FontColorB = $B; } - if ( $Alpha != NULL) { $this->FontColorA = $Alpha; } - - if ( $FontName != NULL ) - $this->FontName = $FontName; - - if ( $FontSize != NULL ) - $this->FontSize = $FontSize; - } - - /* Returns the 1st decimal values (used to correct AA bugs) */ - function getFirstDecimal($Value) - { - $Values = preg_split("/\./",$Value); - if ( isset($Values[1]) ) { return(substr($Values[1],0,1)); } else { return(0); } - } - - /* Attach a dataset to your pChart Object */ - function setDataSet(&$DataSet) - { $this->DataSet = $DataSet; } - - /* Print attached dataset contents to STDOUT */ - function printDataSet() - { print_r($this->DataSet); } - - /* Initialise the image map methods */ - function initialiseImageMap($Name="pChart",$StorageMode=IMAGE_MAP_STORAGE_SESSION,$UniqueID="imageMap",$StorageFolder="tmp") - { - $this->ImageMapIndex = $Name; - $this->ImageMapStorageMode = $StorageMode; - - if ($StorageMode == IMAGE_MAP_STORAGE_SESSION) - { - if(!isset($_SESSION)) { session_start(); } - $_SESSION[$this->ImageMapIndex] = NULL; - } - elseif($StorageMode == IMAGE_MAP_STORAGE_FILE) - { - $this->ImageMapFileName = $UniqueID; - $this->ImageMapStorageFolder = $StorageFolder; - - if (file_exists($StorageFolder."/".$UniqueID.".map")) { unlink($StorageFolder."/".$UniqueID.".map"); } - } - } - - /* Add a zone to the image map */ - function addToImageMap($Type,$Plots,$Color=NULL,$Title=NULL,$Message=NULL,$HTMLEncode=FALSE) - { - if ( $this->ImageMapStorageMode == NULL ) { $this->initialiseImageMap(); } - - /* Encode the characters in the imagemap in HTML standards */ - $Title = str_replace("€","\u20AC",$Title); - $Title = htmlentities($Title,ENT_QUOTES,"ISO-8859-15"); - if ( $HTMLEncode ) - { - $Message = htmlentities($Message,ENT_QUOTES,"ISO-8859-15"); - $Message = str_replace("<","<",$Message); - $Message = str_replace(">",">",$Message); - } - - if ( $this->ImageMapStorageMode == IMAGE_MAP_STORAGE_SESSION ) - { - if(!isset($_SESSION)) { $this->initialiseImageMap(); } - $_SESSION[$this->ImageMapIndex][] = array($Type,$Plots,$Color,$Title,$Message); - } - elseif($this->ImageMapStorageMode == IMAGE_MAP_STORAGE_FILE) - { - $Handle = fopen($this->ImageMapStorageFolder."/".$this->ImageMapFileName.".map", 'a'); - fwrite($Handle, $Type.IMAGE_MAP_DELIMITER.$Plots.IMAGE_MAP_DELIMITER.$Color.IMAGE_MAP_DELIMITER.$Title.IMAGE_MAP_DELIMITER.$Message."\r\n"); - fclose($Handle); - } - } - - /* Remove VOID values from an imagemap custom values array */ - function removeVOIDFromArray($SerieName, $Values) - { - if ( !isset($this->DataSet->Data["Series"][$SerieName]) ) { return(-1); } - - $Result = ""; - foreach($this->DataSet->Data["Series"][$SerieName]["Data"] as $Key => $Value) - { if ( $Value != VOID && isset($Values[$Key]) ) { $Result[] = $Values[$Key]; } } - return($Result); - } - - /* Replace the title of one image map serie */ - function replaceImageMapTitle($OldTitle, $NewTitle) - { - if ( $this->ImageMapStorageMode == NULL ) { return(-1); } - - if ( is_array($NewTitle) ) { $NewTitle = $this->removeVOIDFromArray($OldTitle, $NewTitle); } - - if ( $this->ImageMapStorageMode == IMAGE_MAP_STORAGE_SESSION ) - { - if(!isset($_SESSION)) { return(-1); } - if ( is_array($NewTitle) ) - { $ID = 0; foreach($_SESSION[$this->ImageMapIndex] as $Key => $Settings) { if ( $Settings[3] == $OldTitle && isset($NewTitle[$ID])) { $_SESSION[$this->ImageMapIndex][$Key][3] = $NewTitle[$ID]; $ID++; } } } - else - { foreach($_SESSION[$this->ImageMapIndex] as $Key => $Settings) { if ( $Settings[3] == $OldTitle ) { $_SESSION[$this->ImageMapIndex][$Key][3] = $NewTitle; } } } - } - elseif( $this->ImageMapStorageMode == IMAGE_MAP_STORAGE_FILE ) - { - $TempArray = ""; - $Handle = @fopen($this->ImageMapStorageFolder."/".$this->ImageMapFileName.".map", "r"); - if ($Handle) - { - while (($Buffer = fgets($Handle, 4096)) !== false) - { - $Fields = preg_split("/".IMAGE_MAP_DELIMITER."/",str_replace(array(chr(10),chr(13)),"",$Buffer)); - $TempArray[] = array($Fields[0],$Fields[1],$Fields[2],$Fields[3],$Fields[4]); - } - fclose($Handle); - - if ( is_array($NewTitle) ) - { $ID = 0; foreach($TempArray as $Key => $Settings) { if ( $Settings[3] == $OldTitle && isset($NewTitle[$ID]) ) { $TempArray[$Key][3] = $NewTitle[$ID]; $ID++; } } } - else - { foreach($TempArray as $Key => $Settings) { if ( $Settings[3] == $OldTitle ) { $TempArray[$Key][3] = $NewTitle; } } } - - $Handle = fopen($this->ImageMapStorageFolder."/".$this->ImageMapFileName.".map", 'w'); - foreach($TempArray as $Key => $Settings) - { fwrite($Handle, $Settings[0].IMAGE_MAP_DELIMITER.$Settings[1].IMAGE_MAP_DELIMITER.$Settings[2].IMAGE_MAP_DELIMITER.$Settings[3].IMAGE_MAP_DELIMITER.$Settings[4]."\r\n"); } - fclose($Handle); - } - } - } - - /* Replace the values of the image map contents */ - function replaceImageMapValues($Title, $Values) - { - if ( $this->ImageMapStorageMode == NULL ) { return(-1); } - - $Values = $this->removeVOIDFromArray($Title, $Values); - $ID = 0; - if ( $this->ImageMapStorageMode == IMAGE_MAP_STORAGE_SESSION ) - { - if(!isset($_SESSION)) { return(-1); } - foreach($_SESSION[$this->ImageMapIndex] as $Key => $Settings) { if ( $Settings[3] == $Title ) { if ( isset($Values[$ID]) ) { $_SESSION[$this->ImageMapIndex][$Key][4] = $Values[$ID]; } $ID++; } } - } - elseif( $this->ImageMapStorageMode == IMAGE_MAP_STORAGE_FILE ) - { - $TempArray = ""; - $Handle = @fopen($this->ImageMapStorageFolder."/".$this->ImageMapFileName.".map", "r"); - if ($Handle) - { - while (($Buffer = fgets($Handle, 4096)) !== false) - { - $Fields = preg_split("/".IMAGE_MAP_DELIMITER."/",str_replace(array(chr(10),chr(13)),"",$Buffer)); - $TempArray[] = array($Fields[0],$Fields[1],$Fields[2],$Fields[3],$Fields[4]); - } - fclose($Handle); - - foreach($TempArray as $Key => $Settings) { if ( $Settings[3] == $Title ) { if ( isset($Values[$ID]) ) { $TempArray[$Key][4] = $Values[$ID]; } $ID++; } } - - $Handle = fopen($this->ImageMapStorageFolder."/".$this->ImageMapFileName.".map", 'w'); - foreach($TempArray as $Key => $Settings) - { fwrite($Handle, $Settings[0].IMAGE_MAP_DELIMITER.$Settings[1].IMAGE_MAP_DELIMITER.$Settings[2].IMAGE_MAP_DELIMITER.$Settings[3].IMAGE_MAP_DELIMITER.$Settings[4]."\r\n"); } - fclose($Handle); - } - } - } - - /* Dump the image map */ - function dumpImageMap($Name="pChart",$StorageMode=IMAGE_MAP_STORAGE_SESSION,$UniqueID="imageMap",$StorageFolder="tmp") - { - $this->ImageMapIndex = $Name; - $this->ImageMapStorageMode = $StorageMode; - - if ( $this->ImageMapStorageMode == IMAGE_MAP_STORAGE_SESSION ) - { - if(!isset($_SESSION)) { session_start(); } - if ( $_SESSION[$Name] != NULL ) - { - foreach($_SESSION[$Name] as $Key => $Params) - { echo $Params[0].IMAGE_MAP_DELIMITER.$Params[1].IMAGE_MAP_DELIMITER.$Params[2].IMAGE_MAP_DELIMITER.$Params[3].IMAGE_MAP_DELIMITER.$Params[4]."\r\n"; } - } - } - elseif( $this->ImageMapStorageMode == IMAGE_MAP_STORAGE_FILE ) - { - if (file_exists($StorageFolder."/".$UniqueID.".map")) - { - $Handle = @fopen($StorageFolder."/".$UniqueID.".map", "r"); - if ($Handle) { while (($Buffer = fgets($Handle, 4096)) !== false) { echo $Buffer; } } - fclose($Handle); - - if ( $this->ImageMapAutoDelete ) { unlink($StorageFolder."/".$UniqueID.".map"); } - } - } - - /* When the image map is returned to the client, the script ends */ - exit(); - } - - /* Return the HTML converted color from the RGB composite values */ - function toHTMLColor($R,$G,$B) - { - $R=intval($R); $G=intval($G); $B=intval($B); - $R=dechex($R<0?0:($R>255?255:$R)); $G=dechex($G<0?0:($G>255?255:$G));$B=dechex($B<0?0:($B>255?255:$B)); - $Color="#".(strlen($R) < 2?'0':'').$R; $Color.=(strlen($G) < 2?'0':'').$G; $Color.= (strlen($B) < 2?'0':'').$B; - return($Color); - } - - /* Reverse an array of points */ - function reversePlots($Plots) - { - $Result = ""; - for($i=count($Plots)-2;$i>=0;$i=$i-2) { $Result[] = $Plots[$i]; $Result[] = $Plots[$i+1]; } - return($Result); - } - - /* Mirror Effect */ - function drawAreaMirror($X,$Y,$Width,$Height,$Format="") - { - $StartAlpha = isset($Format["StartAlpha"]) ? $Format["StartAlpha"] : 80; - $EndAlpha = isset($Format["EndAlpha"]) ? $Format["EndAlpha"] : 0; - - $AlphaStep = ($StartAlpha-$EndAlpha)/$Height; - - $Picture = imagecreatetruecolor($this->XSize,$this->YSize); - imagecopy($Picture,$this->Picture,0,0,0,0,$this->XSize,$this->YSize); - - for($i=1;$i<=$Height;$i++) - { - if ( $Y+($i-1) < $this->YSize && $Y-$i > 0 ) { imagecopymerge($Picture,$this->Picture,$X,$Y+($i-1),$X,$Y-$i,$Width,1,$StartAlpha-$AlphaStep*$i); } - } - - imagecopy($this->Picture,$Picture,0,0,0,0,$this->XSize,$this->YSize); - } - } -?> \ No newline at end of file diff --git a/libs/pChart/class/pPie.class.php b/libs/pChart/class/pPie.class.php deleted file mode 100755 index 845f81ca98..0000000000 --- a/libs/pChart/class/pPie.class.php +++ /dev/null @@ -1,1500 +0,0 @@ -pChartObject = $Object; - - /* Cache the pData object reference */ - $this->pDataObject = $pDataObject; - } - - /* Draw a pie chart */ - function draw2DPie($X,$Y,$Format="") - { - $Radius = isset($Format["Radius"]) ? $Format["Radius"] : 60; - $Precision = isset($Format["Precision"]) ? $Format["Precision"] : 0; - $DataGapAngle = isset($Format["DataGapAngle"]) ? $Format["DataGapAngle"] : 0; - $DataGapRadius = isset($Format["DataGapRadius"]) ? $Format["DataGapRadius"] : 0; - $SecondPass = isset($Format["SecondPass"]) ? $Format["SecondPass"] : TRUE; - $Border = isset($Format["Border"]) ? $Format["Border"] : FALSE; - $BorderR = isset($Format["BorderR"]) ? $Format["BorderR"] : 255; - $BorderG = isset($Format["BorderG"]) ? $Format["BorderG"] : 255; - $BorderB = isset($Format["BorderB"]) ? $Format["BorderB"] : 255; - $Shadow = isset($Format["Shadow"]) ? $Format["Shadow"] : FALSE; - $DrawLabels = isset($Format["DrawLabels"]) ? $Format["DrawLabels"] : FALSE; - $LabelStacked = isset($Format["LabelStacked"]) ? $Format["LabelStacked"] : FALSE; - $LabelColor = isset($Format["LabelColor"]) ? $Format["LabelColor"] : PIE_LABEL_COLOR_MANUAL; - $LabelR = isset($Format["LabelR"]) ? $Format["LabelR"] : 0; - $LabelG = isset($Format["LabelG"]) ? $Format["LabelG"] : 0; - $LabelB = isset($Format["LabelB"]) ? $Format["LabelB"] : 0; - $LabelAlpha = isset($Format["LabelAlpha"]) ? $Format["LabelAlpha"] : 100; - $WriteValues = isset($Format["WriteValues"]) ? $Format["WriteValues"] : NULL; - $ValuePosition = isset($Format["ValuePosition"]) ? $Format["ValuePosition"] : PIE_VALUE_OUTSIDE; - $ValuePadding = isset($Format["ValuePadding"]) ? $Format["ValuePadding"] : 15; - $ValueSuffix = isset($Format["ValueSuffix"]) ? $Format["ValueSuffix"] : ""; - $ValueR = isset($Format["ValueR"]) ? $Format["ValueR"] : 255; - $ValueG = isset($Format["ValueG"]) ? $Format["ValueG"] : 255; - $ValueB = isset($Format["ValueB"]) ? $Format["ValueB"] : 255; - $ValueAlpha = isset($Format["ValueAlpha"]) ? $Format["ValueAlpha"] : 100; - $RecordImageMap = isset($Format["RecordImageMap"]) ? $Format["RecordImageMap"] : FALSE; - - /* Data Processing */ - $Data = $this->pDataObject->getData(); - $Palette = $this->pDataObject->getPalette(); - - /* Do we have an abscissa serie defined? */ - if ( $Data["Abscissa"] == "" ) { return(PIE_NO_ABSCISSA); } - - /* Try to find the data serie */ - $DataSerie = ""; - foreach ($Data["Series"] as $SerieName => $SerieData) - { if ( $SerieName != $Data["Abscissa"]) { $DataSerie = $SerieName; } } - - /* Do we have data to compute? */ - if ( $DataSerie == "" ) { return(PIE_NO_DATASERIE); } - - /* Remove unused data */ - list($Data,$Palette) = $this->clean0Values($Data,$Palette,$DataSerie,$Data["Abscissa"]); - - /* Compute the pie sum */ - $SerieSum = $this->pDataObject->getSum($DataSerie); - - /* Do we have data to draw? */ - if ( $SerieSum == 0 ) { return(PIE_SUMISNULL); } - - /* Dump the real number of data to draw */ - $Values = ""; - foreach ($Data["Series"][$DataSerie]["Data"] as $Key => $Value) - { if ($Value != 0) { $Values[] = $Value; } } - - /* Compute the wasted angular space between series */ - if (count($Values)==1) { $WastedAngular = 0; } else { $WastedAngular = count($Values) * $DataGapAngle; } - - /* Compute the scale */ - $ScaleFactor = (360 - $WastedAngular) / $SerieSum; - - $RestoreShadow = $this->pChartObject->Shadow; - if ( $this->pChartObject->Shadow ) - { - $this->pChartObject->Shadow = FALSE; - - $ShadowFormat = $Format; $ShadowFormat["Shadow"] = TRUE; - $this->draw2DPie($X+$this->pChartObject->ShadowX,$Y+$this->pChartObject->ShadowY,$ShadowFormat); - } - - /* Draw the polygon pie elements */ - $Step = 360 / (2 * PI * $Radius); - $Offset = 0; $ID = 0; - foreach($Values as $Key => $Value) - { - if ( $Shadow ) - $Settings = array("R"=>$this->pChartObject->ShadowR,"G"=>$this->pChartObject->ShadowG,"B"=>$this->pChartObject->ShadowB,"Alpha"=>$this->pChartObject->Shadowa); - else - { - if ( !isset($Palette[$ID]["R"]) ) { $Color = $this->pChartObject->getRandomColor(); $Palette[$ID] = $Color; $this->pDataObject->savePalette($ID,$Color); } - $Settings = array("R"=>$Palette[$ID]["R"],"G"=>$Palette[$ID]["G"],"B"=>$Palette[$ID]["B"],"Alpha"=>$Palette[$ID]["Alpha"]); - } - - if ( !$SecondPass && !$Shadow ) - { - if ( !$Border ) - $Settings["Surrounding"] = 10; - else - { $Settings["BorderR"] = $BorderR; $Settings["BorderG"] = $BorderG; $Settings["BorderB"] = $BorderB; } - } - - $Plots = ""; - $EndAngle = $Offset+($Value*$ScaleFactor); if ( $EndAngle > 360 ) { $EndAngle = 360; } - - $Angle = ($EndAngle - $Offset)/2 + $Offset; - if ($DataGapAngle == 0) - { $X0 = $X; $Y0 = $Y; } - else - { - $X0 = cos(($Angle-90)*PI/180) * $DataGapRadius + $X; - $Y0 = sin(($Angle-90)*PI/180) * $DataGapRadius + $Y; - } - - $Plots[] = $X0; $Plots[] = $Y0; - - - for($i=$Offset;$i<=$EndAngle;$i=$i+$Step) - { - $Xc = cos(($i-90)*PI/180) * $Radius + $X; - $Yc = sin(($i-90)*PI/180) * $Radius + $Y; - - if ( $SecondPass && ( $i<90 )) { $Yc++; } - if ( $SecondPass && ( $i>180 && $i<270 )) { $Xc++; } - if ( $SecondPass && ( $i>=270 )) { $Xc++; $Yc++; } - - $Plots[] = $Xc; $Plots[] = $Yc; - } - - $this->pChartObject->drawPolygon($Plots,$Settings); - if ( $RecordImageMap && !$Shadow ) { $this->pChartObject->addToImageMap("POLY",$this->arraySerialize($Plots),$this->pChartObject->toHTMLColor($Palette[$ID]["R"],$Palette[$ID]["G"],$Palette[$ID]["B"]),$Data["Series"][$Data["Abscissa"]]["Data"][$Key],$Value); } - - if ( $DrawLabels && !$Shadow && !$SecondPass ) - { - if ( $LabelColor == PIE_LABEL_COLOR_AUTO ) - { $Settings = array("FillR"=>$Palette[$ID]["R"],"FillG"=>$Palette[$ID]["G"],"FillB"=>$Palette[$ID]["B"],"Alpha"=>$Palette[$ID]["Alpha"]);} - else - { $Settings = array("FillR"=>$LabelR,"FillG"=>$LabelG,"FillB"=>$LabelB,"Alpha"=>$LabelAlpha); } - - $Angle = ($EndAngle - $Offset)/2 + $Offset; - $Xc = cos(($Angle-90)*PI/180) * $Radius + $X; - $Yc = sin(($Angle-90)*PI/180) * $Radius + $Y; - - $Label = $Data["Series"][$Data["Abscissa"]]["Data"][$Key]; - - if ( $LabelStacked ) - $this->writePieLabel($Xc,$Yc,$Label,$Angle,$Settings,TRUE,$X,$Y,$Radius); - else - $this->writePieLabel($Xc,$Yc,$Label,$Angle,$Settings,FALSE); - } - - $Offset = $i + $DataGapAngle; $ID++; - } - - /* Second pass to smooth the angles */ - if ( $SecondPass ) - { - $Step = 360 / (2 * PI * $Radius); - $Offset = 0; $ID = 0; - foreach($Values as $Key => $Value) - { - $FirstPoint = TRUE; - if ( $Shadow ) - $Settings = array("R"=>$this->pChartObject->ShadowR,"G"=>$this->pChartObject->ShadowG,"B"=>$this->pChartObject->ShadowB,"Alpha"=>$this->pChartObject->Shadowa); - else - { - if ( $Border ) - $Settings = array("R"=>$BorderR,"G"=>$BorderG,"B"=>$BorderB); - else - $Settings = array("R"=>$Palette[$ID]["R"],"G"=>$Palette[$ID]["G"],"B"=>$Palette[$ID]["B"],"Alpha"=>$Palette[$ID]["Alpha"]); - } - - $EndAngle = $Offset+($Value*$ScaleFactor); if ( $EndAngle > 360 ) { $EndAngle = 360; } - - if ($DataGapAngle == 0) - { $X0 = $X; $Y0 = $Y; } - else - { - $Angle = ($EndAngle - $Offset)/2 + $Offset; - $X0 = cos(($Angle-90)*PI/180) * $DataGapRadius + $X; - $Y0 = sin(($Angle-90)*PI/180) * $DataGapRadius + $Y; - } - $Plots[] = $X0; $Plots[] = $Y0; - - for($i=$Offset;$i<=$EndAngle;$i=$i+$Step) - { - $Xc = cos(($i-90)*PI/180) * $Radius + $X; - $Yc = sin(($i-90)*PI/180) * $Radius + $Y; - - if ( $FirstPoint ) { $this->pChartObject->drawLine($Xc,$Yc,$X0,$Y0,$Settings); } { $FirstPoint = FALSE; } - - $this->pChartObject->drawAntialiasPixel($Xc,$Yc,$Settings); - } - $this->pChartObject->drawLine($Xc,$Yc,$X0,$Y0,$Settings); - - if ( $DrawLabels && !$Shadow ) - { - if ( $LabelColor == PIE_LABEL_COLOR_AUTO ) - { $Settings = array("FillR"=>$Palette[$ID]["R"],"FillG"=>$Palette[$ID]["G"],"FillB"=>$Palette[$ID]["B"],"Alpha"=>$Palette[$ID]["Alpha"]);} - else - { $Settings = array("FillR"=>$LabelR,"FillG"=>$LabelG,"FillB"=>$LabelB,"Alpha"=>$LabelAlpha); } - - $Angle = ($EndAngle - $Offset)/2 + $Offset; - $Xc = cos(($Angle-90)*PI/180) * $Radius + $X; - $Yc = sin(($Angle-90)*PI/180) * $Radius + $Y; - - $Label = $Data["Series"][$Data["Abscissa"]]["Data"][$Key]; - - if ( $LabelStacked ) - $this->writePieLabel($Xc,$Yc,$Label,$Angle,$Settings,TRUE,$X,$Y,$Radius); - else - $this->writePieLabel($Xc,$Yc,$Label,$Angle,$Settings,FALSE); - } - - $Offset = $i + $DataGapAngle; $ID++; - } - } - - if ( $WriteValues != NULL && !$Shadow ) - { - $Step = 360 / (2 * PI * $Radius); - $Offset = 0; $ID = count($Values)-1; - $Settings = array("Align"=>TEXT_ALIGN_MIDDLEMIDDLE,"R"=>$ValueR,"G"=>$ValueG,"B"=>$ValueB,"Alpha"=>$ValueAlpha); - foreach($Values as $Key => $Value) - { - $EndAngle = ($Value*$ScaleFactor) + $Offset; if ( (int)$EndAngle > 360 ) { $EndAngle = 0; } - $Angle = ($EndAngle - $Offset)/2 + $Offset; - - if ( $ValuePosition == PIE_VALUE_OUTSIDE ) - { - $Xc = cos(($Angle-90)*PI/180) * ($Radius+$ValuePadding) + $X; - $Yc = sin(($Angle-90)*PI/180) * ($Radius+$ValuePadding) + $Y; - } - else - { - $Xc = cos(($Angle-90)*PI/180) * ($Radius)/2 + $X; - $Yc = sin(($Angle-90)*PI/180) * ($Radius)/2 + $Y; - } - - if ( $WriteValues == PIE_VALUE_PERCENTAGE ) - $Display = round(( 100 / $SerieSum ) * $Value,$Precision)."%"; - elseif ( $WriteValues == PIE_VALUE_NATURAL ) - $Display = $Value.$ValueSuffix; - - $this->pChartObject->drawText($Xc,$Yc,$Display,$Settings); - - $Offset = $EndAngle + $DataGapAngle; $ID--; - } - } - - if ( $DrawLabels && $LabelStacked ) { $this->writeShiftedLabels(); } - - $this->pChartObject->Shadow = $RestoreShadow; - - return(PIE_RENDERED); - } - - /* Draw a 3D pie chart */ - function draw3DPie($X,$Y,$Format="") - { - /* Rendering layout */ - $Radius = isset($Format["Radius"]) ? $Format["Radius"] : 80; - $Precision = isset($Format["Precision"]) ? $Format["Precision"] : 0; - $SkewFactor = isset($Format["SkewFactor"]) ? $Format["SkewFactor"] : .5; - $SliceHeight = isset($Format["SliceHeight"]) ? $Format["SliceHeight"] : 20; - $DataGapAngle = isset($Format["DataGapAngle"]) ? $Format["DataGapAngle"] : 0; - $DataGapRadius = isset($Format["DataGapRadius"]) ? $Format["DataGapRadius"] : 0; - $SecondPass = isset($Format["SecondPass"]) ? $Format["SecondPass"] : TRUE; - $Border = isset($Format["Border"]) ? $Format["Border"] : FALSE; - $Shadow = isset($Format["Shadow"]) ? $Format["Shadow"] : FALSE; - $DrawLabels = isset($Format["DrawLabels"]) ? $Format["DrawLabels"] : FALSE; - $LabelStacked = isset($Format["LabelStacked"]) ? $Format["LabelStacked"] : FALSE; - $LabelColor = isset($Format["LabelColor"]) ? $Format["LabelColor"] : PIE_LABEL_COLOR_MANUAL; - $LabelR = isset($Format["LabelR"]) ? $Format["LabelR"] : 0; - $LabelG = isset($Format["LabelG"]) ? $Format["LabelG"] : 0; - $LabelB = isset($Format["LabelB"]) ? $Format["LabelB"] : 0; - $LabelAlpha = isset($Format["LabelAlpha"]) ? $Format["LabelAlpha"] : 100; - $WriteValues = isset($Format["WriteValues"]) ? $Format["WriteValues"] : NULL; //PIE_VALUE_PERCENTAGE - $ValuePosition = isset($Format["ValuePosition"]) ? $Format["ValuePosition"] : PIE_VALUE_INSIDE; - $ValuePadding = isset($Format["ValuePadding"]) ? $Format["ValuePadding"] : 15; - $ValueSuffix = isset($Format["ValueSuffix"]) ? $Format["ValueSuffix"] : ""; - $ValueR = isset($Format["ValueR"]) ? $Format["ValueR"] : 255; - $ValueG = isset($Format["ValueG"]) ? $Format["ValueG"] : 255; - $ValueB = isset($Format["ValueB"]) ? $Format["ValueB"] : 255; - $ValueAlpha = isset($Format["ValueAlpha"]) ? $Format["ValueAlpha"] : 100; - $RecordImageMap = isset($Format["RecordImageMap"]) ? $Format["RecordImageMap"] : FALSE; - - /* Error correction for overlaying rounded corners */ - if ( $SkewFactor < .5 ) { $SkewFactor = .5; } - - /* Data Processing */ - $Data = $this->pDataObject->getData(); - $Palette = $this->pDataObject->getPalette(); - - /* Do we have an abscissa serie defined? */ - if ( $Data["Abscissa"] == "" ) { return(PIE_NO_ABSCISSA); } - - /* Try to find the data serie */ - $DataSerie = ""; - foreach ($Data["Series"] as $SerieName => $SerieData) - { if ( $SerieName != $Data["Abscissa"]) { $DataSerie = $SerieName; } } - - /* Do we have data to compute? */ - if ( $DataSerie == "" ) { return(PIE_NO_DATASERIE); } - - /* Remove unused data */ - list($Data,$Palette) = $this->clean0Values($Data,$Palette,$DataSerie,$Data["Abscissa"]); - - /* Compute the pie sum */ - $SerieSum = $this->pDataObject->getSum($DataSerie); - - /* Do we have data to draw? */ - if ( $SerieSum == 0 ) { return(PIE_SUMISNULL); } - - /* Dump the real number of data to draw */ - $Values = ""; - foreach ($Data["Series"][$DataSerie]["Data"] as $Key => $Value) - { if ($Value != 0) { $Values[] = $Value; } } - - /* Compute the wasted angular space between series */ - if (count($Values)==1) { $WastedAngular = 0; } else { $WastedAngular = count($Values) * $DataGapAngle; } - - /* Compute the scale */ - $ScaleFactor = (360 - $WastedAngular) / $SerieSum; - - $RestoreShadow = $this->pChartObject->Shadow; - if ( $this->pChartObject->Shadow ) { $this->pChartObject->Shadow = FALSE; } - - /* Draw the polygon pie elements */ - $Step = 360 / (2 * PI * $Radius); - $Offset = 360; $ID = count($Values)-1; - $Values = array_reverse($Values); - $Slice = 0; $Slices = ""; $SliceColors = ""; $Visible = ""; $SliceAngle = ""; - foreach($Values as $Key => $Value) - { - if ( !isset($Palette[$ID]["R"]) ) { $Color = $this->pChartObject->getRandomColor(); $Palette[$ID] = $Color; $this->pDataObject->savePalette($ID,$Color); } - $Settings = array("R"=>$Palette[$ID]["R"],"G"=>$Palette[$ID]["G"],"B"=>$Palette[$ID]["B"],"Alpha"=>$Palette[$ID]["Alpha"]); - - $SliceColors[$Slice] = $Settings; - - $StartAngle = $Offset; - $EndAngle = $Offset-($Value*$ScaleFactor); if ( $EndAngle < 0 ) { $EndAngle = 0; } - - if ( $StartAngle > 180 ) { $Visible[$Slice]["Start"] = TRUE; } else { $Visible[$Slice]["Start"] = TRUE; } - if ( $EndAngle < 180 ) { $Visible[$Slice]["End"] = FALSE; } else { $Visible[$Slice]["End"] = TRUE; } - - if ($DataGapAngle == 0) - { $X0 = $X; $Y0 = $Y; } - else - { - $Angle = ($EndAngle - $Offset)/2 + $Offset; - $X0 = cos(($Angle-90)*PI/180) * $DataGapRadius + $X; - $Y0 = sin(($Angle-90)*PI/180) * $DataGapRadius*$SkewFactor + $Y; - } - $Slices[$Slice][] = $X0; $Slices[$Slice][] = $Y0; $SliceAngle[$Slice][] = 0; - - for($i=$Offset;$i>=$EndAngle;$i=$i-$Step) - { - $Xc = cos(($i-90)*PI/180) * $Radius + $X; - $Yc = sin(($i-90)*PI/180) * $Radius*$SkewFactor + $Y; - - if ( ($SecondPass || $RestoreShadow ) && ( $i<90 )) { $Yc++; } - if ( ($SecondPass || $RestoreShadow ) && ( $i>90 && $i<180 )) { $Xc++; } - if ( ($SecondPass || $RestoreShadow ) && ( $i>180 && $i<270 )) { $Xc++; } - if ( ($SecondPass || $RestoreShadow ) && ( $i>=270 )) { $Xc++; $Yc++; } - - $Slices[$Slice][] = $Xc; $Slices[$Slice][] = $Yc; $SliceAngle[$Slice][] = $i; - } - - $Offset = $i - $DataGapAngle; $ID--; $Slice++; - } - - /* Draw the bottom shadow if needed */ - if ( $RestoreShadow && ($this->pChartObject->ShadowX != 0 || $this->pChartObject->ShadowY !=0 )) - { - foreach($Slices as $SliceID => $Plots) - { - $ShadowPie = ""; - for($i=0;$ipChartObject->ShadowX; $ShadowPie[] = $Plots[$i+1]+$this->pChartObject->ShadowY; } - - $Settings = array("R"=>$this->pChartObject->ShadowR,"G"=>$this->pChartObject->ShadowG,"B"=>$this->pChartObject->ShadowB,"Alpha"=>$this->pChartObject->Shadowa,"NoBorder"=>TRUE); - $this->pChartObject->drawPolygon($ShadowPie,$Settings); - } - - $Step = 360 / (2 * PI * $Radius); - $Offset = 360; - foreach($Values as $Key => $Value) - { - $EndAngle = $Offset-($Value*$ScaleFactor); if ( $EndAngle < 0 ) { $EndAngle = 0; } - - for($i=$Offset;$i>=$EndAngle;$i=$i-$Step) - { - $Xc = cos(($i-90)*PI/180) * $Radius + $X + $this->pChartObject->ShadowX; - $Yc = sin(($i-90)*PI/180) * $Radius*$SkewFactor + $Y + $this->pChartObject->ShadowY; - - $this->pChartObject->drawAntialiasPixel($Xc,$Yc,$Settings); - } - - $Offset = $i - $DataGapAngle; $ID--; - } - } - - /* Draw the bottom pie splice */ - foreach($Slices as $SliceID => $Plots) - { - $Settings = $SliceColors[$SliceID]; $Settings["NoBorder"] = TRUE; - $this->pChartObject->drawPolygon($Plots,$Settings); - - if ( $SecondPass ) - { - $Settings = $SliceColors[$SliceID]; - if ( $Border ) - { $Settings["R"]+= 30; $Settings["G"]+= 30; $Settings["B"]+= 30;; } - - if ( isset($SliceAngle[$SliceID][1]) ) /* Empty error handling */ - { - $Angle = $SliceAngle[$SliceID][1]; - $Xc = cos(($Angle-90)*PI/180) * $Radius + $X; - $Yc = sin(($Angle-90)*PI/180) * $Radius*$SkewFactor + $Y; - $this->pChartObject->drawLine($Plots[0],$Plots[1],$Xc,$Yc,$Settings); - - $Angle = $SliceAngle[$SliceID][count($SliceAngle[$SliceID])-1]; - $Xc = cos(($Angle-90)*PI/180) * $Radius + $X; - $Yc = sin(($Angle-90)*PI/180) * $Radius*$SkewFactor + $Y; - $this->pChartObject->drawLine($Plots[0],$Plots[1],$Xc,$Yc,$Settings); - } - } - } - - /* Draw the two vertical edges */ - $Slices = array_reverse($Slices); - $SliceColors = array_reverse($SliceColors); - foreach($Slices as $SliceID => $Plots) - { - $Settings = $SliceColors[$SliceID]; - $Settings["R"]+= 10; $Settings["G"]+= 10; $Settings["B"]+= 10; $Settings["NoBorder"] = TRUE; - - if ( $Visible[$SliceID]["Start"] && isset($Plots[2])) /* Empty error handling */ - { - $this->pChartObject->drawLine($Plots[2],$Plots[3],$Plots[2],$Plots[3]- $SliceHeight,array("R"=>$Settings["R"],"G"=>$Settings["G"],"B"=>$Settings["B"])); - $Border = ""; - $Border[] = $Plots[0]; $Border[] = $Plots[1]; $Border[] = $Plots[0]; $Border[] = $Plots[1] - $SliceHeight; - $Border[] = $Plots[2]; $Border[] = $Plots[3] - $SliceHeight; $Border[] = $Plots[2]; $Border[] = $Plots[3]; - $this->pChartObject->drawPolygon($Border,$Settings); - } - } - - $Slices = array_reverse($Slices); - $SliceColors = array_reverse($SliceColors); - foreach($Slices as $SliceID => $Plots) - { - $Settings = $SliceColors[$SliceID]; - $Settings["R"]+= 10; $Settings["G"]+= 10; $Settings["B"]+= 10; $Settings["NoBorder"] = TRUE; - if ( $Visible[$SliceID]["End"] ) - { - $this->pChartObject->drawLine($Plots[count($Plots)-2],$Plots[count($Plots)-1],$Plots[count($Plots)-2],$Plots[count($Plots)-1]- $SliceHeight,array("R"=>$Settings["R"],"G"=>$Settings["G"],"B"=>$Settings["B"])); - - $Border = ""; - $Border[] = $Plots[0]; $Border[] = $Plots[1]; $Border[] = $Plots[0]; $Border[] = $Plots[1] - $SliceHeight; - $Border[] = $Plots[count($Plots)-2]; $Border[] = $Plots[count($Plots)-1] - $SliceHeight; $Border[] = $Plots[count($Plots)-2]; $Border[] = $Plots[count($Plots)-1]; - $this->pChartObject->drawPolygon($Border,$Settings); - } - } - - /* Draw the rounded edges */ - foreach($Slices as $SliceID => $Plots) - { - $Settings = $SliceColors[$SliceID]; - $Settings["R"]+= 10; $Settings["G"]+= 10; $Settings["B"]+= 10; $Settings["NoBorder"] = TRUE; - - for ($j=2;$j 90 ) - { - $Border = ""; - $Border[] = $Plots[$j]; $Border[] = $Plots[$j+1]; - $Border[] = $Plots[$j+2]; $Border[] = $Plots[$j+3]; - $Border[] = $Plots[$j+2]; $Border[] = $Plots[$j+3] - $SliceHeight; - $Border[] = $Plots[$j]; $Border[] = $Plots[$j+1] - $SliceHeight; - $this->pChartObject->drawPolygon($Border,$Settings); - } - } - - if ( $SecondPass ) - { - $Settings = $SliceColors[$SliceID]; - if ( $Border ) - { $Settings["R"]+= 30; $Settings["G"]+= 30; $Settings["B"]+= 30; } - - if ( isset($SliceAngle[$SliceID][1]) ) /* Empty error handling */ - { - $Angle = $SliceAngle[$SliceID][1]; - if ( $Angle < 270 && $Angle > 90 ) - { - $Xc = cos(($Angle-90)*PI/180) * $Radius + $X; - $Yc = sin(($Angle-90)*PI/180) * $Radius*$SkewFactor + $Y; - $this->pChartObject->drawLine($Xc,$Yc,$Xc,$Yc-$SliceHeight,$Settings); - } - } - - $Angle = $SliceAngle[$SliceID][count($SliceAngle[$SliceID])-1]; - if ( $Angle < 270 && $Angle > 90 ) - { - $Xc = cos(($Angle-90)*PI/180) * $Radius + $X; - $Yc = sin(($Angle-90)*PI/180) * $Radius*$SkewFactor + $Y; - $this->pChartObject->drawLine($Xc,$Yc,$Xc,$Yc-$SliceHeight,$Settings); - } - - if ( isset($SliceAngle[$SliceID][1]) && $SliceAngle[$SliceID][1] > 270 && $SliceAngle[$SliceID][count($SliceAngle[$SliceID])-1] < 270 ) - { - $Xc = cos((270-90)*PI/180) * $Radius + $X; - $Yc = sin((270-90)*PI/180) * $Radius*$SkewFactor + $Y; - $this->pChartObject->drawLine($Xc,$Yc,$Xc,$Yc-$SliceHeight,$Settings); - } - - if ( isset($SliceAngle[$SliceID][1]) && $SliceAngle[$SliceID][1] > 90 && $SliceAngle[$SliceID][count($SliceAngle[$SliceID])-1] < 90 ) - { - $Xc = cos((0)*PI/180) * $Radius + $X; - $Yc = sin((0)*PI/180) * $Radius*$SkewFactor + $Y; - $this->pChartObject->drawLine($Xc,$Yc,$Xc,$Yc-$SliceHeight,$Settings); - } - - } - } - - /* Draw the top splice */ - foreach($Slices as $SliceID => $Plots) - { - $Settings = $SliceColors[$SliceID]; - $Settings["R"]+= 20; $Settings["G"]+= 20; $Settings["B"]+= 20; - - $Top = ""; - for($j=0;$jpChartObject->drawPolygon($Top,$Settings); - - if ( $RecordImageMap && !$Shadow ) { $this->pChartObject->addToImageMap("POLY",$this->arraySerialize($Top),$this->pChartObject->toHTMLColor($Settings["R"],$Settings["G"],$Settings["B"]),$Data["Series"][$Data["Abscissa"]]["Data"][count($Slices)-$SliceID-1],$Values[$SliceID]); } - } - - - /* Second pass to smooth the angles */ - if ( $SecondPass ) - { - $Step = 360 / (2 * PI * $Radius); - $Offset = 360; $ID = count($Values)-1; - foreach($Values as $Key => $Value) - { - $FirstPoint = TRUE; - if ( $Shadow ) - $Settings = array("R"=>$this->pChartObject->ShadowR,"G"=>$this->pChartObject->ShadowG,"B"=>$this->pChartObject->ShadowB,"Alpha"=>$this->pChartObject->Shadowa); - else - { - if ( $Border ) - { $Settings = array("R"=>$Palette[$ID]["R"]+30,"G"=>$Palette[$ID]["G"]+30,"B"=>$Palette[$ID]["B"]+30,"Alpha"=>$Palette[$ID]["Alpha"]); } - else - $Settings = array("R"=>$Palette[$ID]["R"],"G"=>$Palette[$ID]["G"],"B"=>$Palette[$ID]["B"],"Alpha"=>$Palette[$ID]["Alpha"]); - } - - $EndAngle = $Offset-($Value*$ScaleFactor); if ( $EndAngle < 0 ) { $EndAngle = 0; } - - if ($DataGapAngle == 0) - { $X0 = $X; $Y0 = $Y- $SliceHeight; } - else - { - $Angle = ($EndAngle - $Offset)/2 + $Offset; - $X0 = cos(($Angle-90)*PI/180) * $DataGapRadius + $X; - $Y0 = sin(($Angle-90)*PI/180) * $DataGapRadius*$SkewFactor + $Y - $SliceHeight; - } - $Plots[] = $X0; $Plots[] = $Y0; - - for($i=$Offset;$i>=$EndAngle;$i=$i-$Step) - { - $Xc = cos(($i-90)*PI/180) * $Radius + $X; - $Yc = sin(($i-90)*PI/180) * $Radius*$SkewFactor + $Y - $SliceHeight; - - if ( $FirstPoint ) { $this->pChartObject->drawLine($Xc,$Yc,$X0,$Y0,$Settings); } { $FirstPoint = FALSE; } - - $this->pChartObject->drawAntialiasPixel($Xc,$Yc,$Settings); - if ($i < 270 && $i > 90 ) { $this->pChartObject->drawAntialiasPixel($Xc,$Yc+$SliceHeight,$Settings); } - } - $this->pChartObject->drawLine($Xc,$Yc,$X0,$Y0,$Settings); - - $Offset = $i - $DataGapAngle; $ID--; - } - } - - if ( $WriteValues != NULL ) - { - $Step = 360 / (2 * PI * $Radius); - $Offset = 360; $ID = count($Values)-1; - $Settings = array("Align"=>TEXT_ALIGN_MIDDLEMIDDLE,"R"=>$ValueR,"G"=>$ValueG,"B"=>$ValueB,"Alpha"=>$ValueAlpha); - foreach($Values as $Key => $Value) - { - $EndAngle = $Offset-($Value*$ScaleFactor); if ( $EndAngle < 0 ) { $EndAngle = 0; } - - $Angle = ($EndAngle - $Offset)/2 + $Offset; - - if ( $ValuePosition == PIE_VALUE_OUTSIDE ) - { - $Xc = cos(($Angle-90)*PI/180) * ($Radius+$ValuePadding) + $X; - $Yc = sin(($Angle-90)*PI/180) * (($Radius*$SkewFactor)+$ValuePadding) + $Y - $SliceHeight; - } - else - { - $Xc = cos(($Angle-90)*PI/180) * ($Radius)/2 + $X; - $Yc = sin(($Angle-90)*PI/180) * ($Radius*$SkewFactor)/2 + $Y - $SliceHeight; - } - - if ( $WriteValues == PIE_VALUE_PERCENTAGE ) - $Display = round(( 100 / $SerieSum ) * $Value,$Precision)."%"; - elseif ( $WriteValues == PIE_VALUE_NATURAL ) - $Display = $Value.$ValueSuffix; - - $this->pChartObject->drawText($Xc,$Yc,$Display,$Settings); - - $Offset = $EndAngle - $DataGapAngle; $ID--; - } - } - - if ( $DrawLabels ) - { - $Step = 360 / (2 * PI * $Radius); - $Offset = 360; $ID = count($Values)-1; - foreach($Values as $Key => $Value) - { - if ( $LabelColor == PIE_LABEL_COLOR_AUTO ) - { $Settings = array("FillR"=>$Palette[$ID]["R"],"FillG"=>$Palette[$ID]["G"],"FillB"=>$Palette[$ID]["B"],"Alpha"=>$Palette[$ID]["Alpha"]);} - else - { $Settings = array("FillR"=>$LabelR,"FillG"=>$LabelG,"FillB"=>$LabelB,"Alpha"=>$LabelAlpha); } - - $EndAngle = $Offset-($Value*$ScaleFactor); if ( $EndAngle < 0 ) { $EndAngle = 0; } - - $Angle = ($EndAngle - $Offset)/2 + $Offset; - $Xc = cos(($Angle-90)*PI/180) * $Radius + $X; - $Yc = sin(($Angle-90)*PI/180) * $Radius*$SkewFactor + $Y - $SliceHeight; - - if ( isset($Data["Series"][$Data["Abscissa"]]["Data"][$ID]) ) - { - $Label = $Data["Series"][$Data["Abscissa"]]["Data"][$ID]; - - if ( $LabelStacked ) - $this->writePieLabel($Xc,$Yc,$Label,$Angle,$Settings,TRUE,$X,$Y,$Radius,TRUE); - else - $this->writePieLabel($Xc,$Yc,$Label,$Angle,$Settings,FALSE); - } - - $Offset = $EndAngle - $DataGapAngle; $ID--; - } - } - - if ( $DrawLabels && $LabelStacked ) { $this->writeShiftedLabels(); } - - $this->pChartObject->Shadow = $RestoreShadow; - - return(PIE_RENDERED); - } - - /* Draw the legend of pie chart */ - function drawPieLegend($X,$Y,$Format="") - { - $FontName = isset($Format["FontName"]) ? $Format["FontName"] : $this->pChartObject->FontName; - $FontSize = isset($Format["FontSize"]) ? $Format["FontSize"] : $this->pChartObject->FontSize; - $FontR = isset($Format["FontR"]) ? $Format["FontR"] : $this->pChartObject->FontColorR; - $FontG = isset($Format["FontG"]) ? $Format["FontG"] : $this->pChartObject->FontColorG; - $FontB = isset($Format["FontB"]) ? $Format["FontB"] : $this->pChartObject->FontColorB; - $BoxSize = isset($Format["BoxSize"]) ? $Format["BoxSize"] : 5; - $Margin = isset($Format["Margin"]) ? $Format["Margin"] : 5; - $R = isset($Format["R"]) ? $Format["R"] : 200; - $G = isset($Format["G"]) ? $Format["G"] : 200; - $B = isset($Format["B"]) ? $Format["B"] : 200; - $Alpha = isset($Format["Alpha"]) ? $Format["Alpha"] : 100; - $BorderR = isset($Format["BorderR"]) ? $Format["BorderR"] : 255; - $BorderG = isset($Format["BorderG"]) ? $Format["BorderG"] : 255; - $BorderB = isset($Format["BorderB"]) ? $Format["BorderB"] : 255; - $Surrounding = isset($Format["Surrounding"]) ? $Format["Surrounding"] : NULL; - $Style = isset($Format["Style"]) ? $Format["Style"] : LEGEND_ROUND; - $Mode = isset($Format["Mode"]) ? $Format["Mode"] : LEGEND_VERTICAL; - - if ( $Surrounding != NULL ) { $BorderR = $R + $Surrounding; $BorderG = $G + $Surrounding; $BorderB = $B + $Surrounding; } - - $YStep = max($this->pChartObject->FontSize,$BoxSize) + 5; - $XStep = $BoxSize + 5; - - /* Data Processing */ - $Data = $this->pDataObject->getData(); - $Palette = $this->pDataObject->getPalette(); - - /* Do we have an abscissa serie defined? */ - if ( $Data["Abscissa"] == "" ) { return(PIE_NO_ABSCISSA); } - - $Boundaries = ""; $Boundaries["L"] = $X; $Boundaries["T"] = $Y; $Boundaries["R"] = 0; $Boundaries["B"] = 0; $vY = $Y; $vX = $X; - foreach($Data["Series"][$Data["Abscissa"]]["Data"] as $Key => $Value) - { - $BoxArray = $this->pChartObject->getTextBox($vX+$BoxSize+4,$vY+$BoxSize/2,$FontName,$FontSize,0,$Value); - - if ( $Mode == LEGEND_VERTICAL ) - { - if ( $Boundaries["T"] > $BoxArray[2]["Y"]+$BoxSize/2 ) { $Boundaries["T"] = $BoxArray[2]["Y"]+$BoxSize/2; } - if ( $Boundaries["R"] < $BoxArray[1]["X"]+2 ) { $Boundaries["R"] = $BoxArray[1]["X"]+2; } - if ( $Boundaries["B"] < $BoxArray[1]["Y"]+2+$BoxSize/2 ) { $Boundaries["B"] = $BoxArray[1]["Y"]+2+$BoxSize/2; } - $vY=$vY+$YStep; - } - elseif ( $Mode == LEGEND_HORIZONTAL ) - { - if ( $Boundaries["T"] > $BoxArray[2]["Y"]+$BoxSize/2 ) { $Boundaries["T"] = $BoxArray[2]["Y"]+$BoxSize/2; } - if ( $Boundaries["R"] < $BoxArray[1]["X"]+2 ) { $Boundaries["R"] = $BoxArray[1]["X"]+2; } - if ( $Boundaries["B"] < $BoxArray[1]["Y"]+2+$BoxSize/2 ) { $Boundaries["B"] = $BoxArray[1]["Y"]+2+$BoxSize/2; } - $vX=$Boundaries["R"]+$XStep; - } - } - $vY=$vY-$YStep; $vX=$vX-$XStep; - - $TopOffset = $Y - $Boundaries["T"]; - if ( $Boundaries["B"]-($vY+$BoxSize) < $TopOffset ) { $Boundaries["B"] = $vY+$BoxSize+$TopOffset; } - - if ( $Style == LEGEND_ROUND ) - $this->pChartObject->drawRoundedFilledRectangle($Boundaries["L"]-$Margin,$Boundaries["T"]-$Margin,$Boundaries["R"]+$Margin,$Boundaries["B"]+$Margin,$Margin,array("R"=>$R,"G"=>$G,"B"=>$B,"Alpha"=>$Alpha,"BorderR"=>$BorderR,"BorderG"=>$BorderG,"BorderB"=>$BorderB)); - elseif ( $Style == LEGEND_BOX ) - $this->pChartObject->drawFilledRectangle($Boundaries["L"]-$Margin,$Boundaries["T"]-$Margin,$Boundaries["R"]+$Margin,$Boundaries["B"]+$Margin,array("R"=>$R,"G"=>$G,"B"=>$B,"Alpha"=>$Alpha,"BorderR"=>$BorderR,"BorderG"=>$BorderG,"BorderB"=>$BorderB)); - - $RestoreShadow = $this->pChartObject->Shadow; $this->pChartObject->Shadow = FALSE; - foreach($Data["Series"][$Data["Abscissa"]]["Data"] as $Key => $Value) - { - $R = $Palette[$Key]["R"]; $G = $Palette[$Key]["G"]; $B = $Palette[$Key]["B"]; - - $this->pChartObject->drawFilledRectangle($X+1,$Y+1,$X+$BoxSize+1,$Y+$BoxSize+1,array("R"=>0,"G"=>0,"B"=>0,"Alpha"=>20)); - $this->pChartObject->drawFilledRectangle($X,$Y,$X+$BoxSize,$Y+$BoxSize,array("R"=>$R,"G"=>$G,"B"=>$B,"Surrounding"=>20)); - if ( $Mode == LEGEND_VERTICAL ) - { - $this->pChartObject->drawText($X+$BoxSize+4,$Y+$BoxSize/2,$Value,array("R"=>$FontR,"G"=>$FontG,"B"=>$FontB,"Align"=>TEXT_ALIGN_MIDDLELEFT,"FontName"=>$FontName,"FontSize"=>$FontSize)); - $Y=$Y+$YStep; - } - elseif ( $Mode == LEGEND_HORIZONTAL ) - { - $BoxArray = $this->pChartObject->drawText($X+$BoxSize+4,$Y+$BoxSize/2,$Value,array("R"=>$FontR,"G"=>$FontG,"B"=>$FontB,"Align"=>TEXT_ALIGN_MIDDLELEFT,"FontName"=>$FontName,"FontSize"=>$FontSize)); - $X=$BoxArray[1]["X"]+2+$XStep; - } - } - - $this->Shadow = $RestoreShadow; - } - - /* Set the color of the specified slice */ - function setSliceColor($SliceID,$Format="") - { - $R = isset($Format["R"]) ? $Format["R"] : 0; - $G = isset($Format["G"]) ? $Format["G"] : 0; - $B = isset($Format["B"]) ? $Format["B"] : 0; - $Alpha = isset($Format["Alpha"]) ? $Format["Alpha"] : 100; - - $this->pDataObject->Palette[$SliceID]["R"] = $R; - $this->pDataObject->Palette[$SliceID]["G"] = $G; - $this->pDataObject->Palette[$SliceID]["B"] = $B; - $this->pDataObject->Palette[$SliceID]["Alpha"] = $Alpha; - } - - /* Internally used compute the label positions */ - function writePieLabel($X,$Y,$Label,$Angle,$Settings,$Stacked,$Xc=0,$Yc=0,$Radius=0,$Reversed=FALSE) - { - $LabelOffset = 30; - $FontName = $this->pChartObject->FontName; - $FontSize = $this->pChartObject->FontSize; - - if ( !$Stacked ) - { - $Settings["Angle"] = 360-$Angle; - $Settings["Length"] = 25; - $Settings["Size"] = 8; - - $this->pChartObject->drawArrowLabel($X,$Y," ".$Label." ",$Settings); - } - else - { - $X2 = cos(deg2rad($Angle-90))*20+$X; - $Y2 = sin(deg2rad($Angle-90))*20+$Y; - - $TxtPos = $this->pChartObject->getTextBox($X,$Y,$FontName,$FontSize,0,$Label); - $Height = $TxtPos[0]["Y"] - $TxtPos[2]["Y"]; - $YTop = $Y2 - $Height/2 - 2; - $YBottom = $Y2 + $Height/2 + 2; - - if ( $this->LabelPos != "" ) - { - $Done = FALSE; - foreach($this->LabelPos as $Key => $Settings) - { - if ( !$Done ) - { - if ( $Angle <= 90 && (($YTop >= $Settings["YTop"] && $YTop <= $Settings["YBottom"]) || ($YBottom >= $Settings["YTop"] && $YBottom <= $Settings["YBottom"]))) - { $this->shift(0,180,-($Height+2),$Reversed); $Done = TRUE; } - if ( $Angle > 90 && $Angle <= 180 && (($YTop >= $Settings["YTop"] && $YTop <= $Settings["YBottom"]) || ($YBottom >= $Settings["YTop"] && $YBottom <= $Settings["YBottom"]))) - { $this->shift(0,180,-($Height+2),$Reversed); $Done = TRUE; } - if ( $Angle > 180 && $Angle <= 270 && (($YTop >= $Settings["YTop"] && $YTop <= $Settings["YBottom"]) || ($YBottom >= $Settings["YTop"] && $YBottom <= $Settings["YBottom"]))) - { $this->shift(180,360,($Height+2),$Reversed); $Done = TRUE; } - if ( $Angle > 270 && $Angle <= 360 && (($YTop >= $Settings["YTop"] && $YTop <= $Settings["YBottom"]) || ($YBottom >= $Settings["YTop"] && $YBottom <= $Settings["YBottom"]))) - { $this->shift(180,360,($Height+2),$Reversed); $Done = TRUE; } - } - } - } - - $LabelSettings = array("YTop"=>$YTop,"YBottom"=>$YBottom,"Label"=>$Label,"Angle"=>$Angle,"X1"=>$X,"Y1"=>$Y,"X2"=>$X2,"Y2"=>$Y2); - if ( $Angle <= 180 ) { $LabelSettings["X3"] = $Xc+$Radius+$LabelOffset; } - if ( $Angle > 180 ) { $LabelSettings["X3"] = $Xc-$Radius-$LabelOffset; } - $this->LabelPos[] = $LabelSettings; - } - } - - /* Internally used to shift label positions */ - function shift($StartAngle,$EndAngle,$Offset,$Reversed) - { - if ( $Reversed ) { $Offset = -$Offset; } - foreach($this->LabelPos as $Key => $Settings) - { - if ( $Settings["Angle"] > $StartAngle && $Settings["Angle"] <= $EndAngle ) { $this->LabelPos[$Key]["YTop"] = $Settings["YTop"] + $Offset; $this->LabelPos[$Key]["YBottom"] = $Settings["YBottom"] + $Offset; $this->LabelPos[$Key]["Y2"] = $Settings["Y2"] + $Offset; } - } - } - - /* Internally used to write the re-computed labels */ - function writeShiftedLabels() - { - if ( $this->LabelPos == "" ) { return(0); } - foreach($this->LabelPos as $Key => $Settings) - { - $X1 = $Settings["X1"]; $Y1 = $Settings["Y1"]; - $X2 = $Settings["X2"]; $Y2 = $Settings["Y2"]; - $X3 = $Settings["X3"]; - $Angle = $Settings["Angle"]; - $Label = $Settings["Label"]; - - $this->pChartObject->drawArrow($X2,$Y2,$X1,$Y1,array("Size"=>8)); - if ( $Angle <= 180 ) - { - $this->pChartObject->drawLine($X2,$Y2,$X3,$Y2); - $this->pChartObject->drawText($X3+2,$Y2,$Label,array("Align"=>TEXT_ALIGN_MIDDLELEFT)); - } - else - { - $this->pChartObject->drawLine($X2,$Y2,$X3,$Y2); - $this->pChartObject->drawText($X3-2,$Y2,$Label,array("Align"=>TEXT_ALIGN_MIDDLERIGHT)); - } - } - } - - /* Draw a ring chart */ - function draw2DRing($X,$Y,$Format="") - { - $OuterRadius = isset($Format["Radius"]) ? $Format["Radius"] : 60; - $Precision = isset($Format["Precision"]) ? $Format["Precision"] : 0; - $InnerRadius = isset($Format["Radius"]) ? $Format["Radius"] : 30; - $Border = isset($Format["Border"]) ? $Format["Border"] : FALSE; - $BorderR = isset($Format["BorderR"]) ? $Format["BorderR"] : 255; - $BorderG = isset($Format["BorderG"]) ? $Format["BorderG"] : 255; - $BorderB = isset($Format["BorderB"]) ? $Format["BorderB"] : 255; - $BorderAlpha = isset($Format["BorderAlpha"]) ? $Format["BorderAlpha"] : 100; - $Shadow = isset($Format["Shadow"]) ? $Format["Shadow"] : FALSE; - $DrawLabels = isset($Format["DrawLabels"]) ? $Format["DrawLabels"] : FALSE; - $LabelStacked = isset($Format["LabelStacked"]) ? $Format["LabelStacked"] : FALSE; - $LabelColor = isset($Format["LabelColor"]) ? $Format["LabelColor"] : PIE_LABEL_COLOR_MANUAL; - $LabelR = isset($Format["LabelR"]) ? $Format["LabelR"] : 0; - $LabelG = isset($Format["LabelG"]) ? $Format["LabelG"] : 0; - $LabelB = isset($Format["LabelB"]) ? $Format["LabelB"] : 0; - $LabelAlpha = isset($Format["LabelAlpha"]) ? $Format["LabelAlpha"] : 100; - $WriteValues = isset($Format["WriteValues"]) ? $Format["WriteValues"] : NULL; //PIE_VALUE_PERCENTAGE - $ValuePadding = isset($Format["ValuePadding"]) ? $Format["ValuePadding"] : 5; - $ValuePosition = isset($Format["ValuePosition"]) ? $Format["ValuePosition"] : PIE_VALUE_OUTSIDE; - $ValueSuffix = isset($Format["ValueSuffix"]) ? $Format["ValueSuffix"] : ""; - $ValueR = isset($Format["ValueR"]) ? $Format["ValueR"] : 255; - $ValueG = isset($Format["ValueG"]) ? $Format["ValueG"] : 255; - $ValueB = isset($Format["ValueB"]) ? $Format["ValueB"] : 255; - $ValueAlpha = isset($Format["ValueAlpha"]) ? $Format["ValueAlpha"] : 100; - $RecordImageMap = isset($Format["RecordImageMap"]) ? $Format["RecordImageMap"] : FALSE; - - /* Data Processing */ - $Data = $this->pDataObject->getData(); - $Palette = $this->pDataObject->getPalette(); - - /* Do we have an abscissa serie defined? */ - if ( $Data["Abscissa"] == "" ) { return(PIE_NO_ABSCISSA); } - - /* Try to find the data serie */ - $DataSerie = ""; - foreach ($Data["Series"] as $SerieName => $SerieData) - { if ( $SerieName != $Data["Abscissa"]) { $DataSerie = $SerieName; } } - - /* Do we have data to compute? */ - if ( $DataSerie == "" ) { return(PIE_NO_DATASERIE); } - - /* Remove unused data */ - list($Data,$Palette) = $this->clean0Values($Data,$Palette,$DataSerie,$Data["Abscissa"]); - - /* Compute the pie sum */ - $SerieSum = $this->pDataObject->getSum($DataSerie); - - /* Do we have data to draw? */ - if ( $SerieSum == 0 ) { return(PIE_SUMISNULL); } - - /* Dump the real number of data to draw */ - $Values = ""; - foreach ($Data["Series"][$DataSerie]["Data"] as $Key => $Value) - { if ($Value != 0) { $Values[] = $Value; } } - - /* Compute the wasted angular space between series */ - if (count($Values)==1) { $WastedAngular = 0; } else { $WastedAngular = 0; } // count($Values) - - /* Compute the scale */ - $ScaleFactor = (360 - $WastedAngular) / $SerieSum; - - $RestoreShadow = $this->pChartObject->Shadow; - if ( $this->pChartObject->Shadow ) - { - $this->pChartObject->Shadow = FALSE; - - $ShadowFormat = $Format; $ShadowFormat["Shadow"] = TRUE; - $this->draw2DRing($X+$this->pChartObject->ShadowX,$Y+$this->pChartObject->ShadowY,$ShadowFormat); - } - - /* Draw the polygon pie elements */ - $Step = 360 / (2 * PI * $OuterRadius); - $Offset = 0; $ID = 0; - foreach($Values as $Key => $Value) - { - if ( $Shadow ) - { - $Settings = array("R"=>$this->pChartObject->ShadowR,"G"=>$this->pChartObject->ShadowG,"B"=>$this->pChartObject->ShadowB,"Alpha"=>$this->pChartObject->Shadowa); - $BorderColor = $Settings; - } - else - { - if ( !isset($Palette[$ID]["R"]) ) { $Color = $this->pChartObject->getRandomColor(); $Palette[$ID] = $Color; $this->pDataObject->savePalette($ID,$Color); } - $Settings = array("R"=>$Palette[$ID]["R"],"G"=>$Palette[$ID]["G"],"B"=>$Palette[$ID]["B"],"Alpha"=>$Palette[$ID]["Alpha"]); - - if ( $Border ) - $BorderColor = array("R"=>$BorderR,"G"=>$BorderG,"B"=>$BorderB,"Alpha"=>$BorderAlpha); - else - $BorderColor = $Settings; - } - - $Plots = ""; $Boundaries = ""; $AAPixels = ""; - $EndAngle = $Offset+($Value*$ScaleFactor); if ( $EndAngle > 360 ) { $EndAngle = 360; } - for($i=$Offset;$i<=$EndAngle;$i=$i+$Step) - { - $Xc = cos(($i-90)*PI/180) * $OuterRadius + $X; - $Yc = sin(($i-90)*PI/180) * $OuterRadius + $Y; - - if ( !isset($Boundaries[0]["X1"]) ) { $Boundaries[0]["X1"] = $Xc; $Boundaries[0]["Y1"] = $Yc; } - $AAPixels[] = array($Xc,$Yc); - - if ( $i<90 ) { $Yc++; } - if ( $i>180 && $i<270 ) { $Xc++; } - if ( $i>=270 ) { $Xc++; $Yc++; } - - $Plots[] = $Xc; $Plots[] = $Yc; - } - $Boundaries[1]["X1"] = $Xc; $Boundaries[1]["Y1"] = $Yc; - $Lasti = $EndAngle; - - for($i=$EndAngle;$i>=$Offset;$i=$i-$Step) - { - $Xc = cos(($i-90)*PI/180) * ($InnerRadius-1) + $X; - $Yc = sin(($i-90)*PI/180) * ($InnerRadius-1) + $Y; - - if ( !isset($Boundaries[1]["X2"]) ) { $Boundaries[1]["X2"] = $Xc; $Boundaries[1]["Y2"] = $Yc; } - $AAPixels[] = array($Xc,$Yc); - - $Xc = cos(($i-90)*PI/180) * $InnerRadius + $X; - $Yc = sin(($i-90)*PI/180) * $InnerRadius + $Y; - - if ( $i<90 ) { $Yc++; } - if ( $i>180 && $i<270 ) { $Xc++; } - if ( $i>=270 ) { $Xc++; $Yc++; } - - $Plots[] = $Xc; $Plots[] = $Yc; - } - $Boundaries[0]["X2"] = $Xc; $Boundaries[0]["Y2"] = $Yc; - - /* Draw the polygon */ - $this->pChartObject->drawPolygon($Plots,$Settings); - if ( $RecordImageMap && !$Shadow ) { $this->pChartObject->addToImageMap("POLY",$this->arraySerialize($Plots),$this->pChartObject->toHTMLColor($Palette[$ID]["R"],$Palette[$ID]["G"],$Palette[$ID]["B"]),$Data["Series"][$Data["Abscissa"]]["Data"][$Key],$Value); } - - /* Smooth the edges using AA */ - foreach($AAPixels as $iKey => $Pos ) { $this->pChartObject->drawAntialiasPixel($Pos[0],$Pos[1],$BorderColor); } - $this->pChartObject->drawLine($Boundaries[0]["X1"],$Boundaries[0]["Y1"],$Boundaries[0]["X2"],$Boundaries[0]["Y2"],$BorderColor); - $this->pChartObject->drawLine($Boundaries[1]["X1"],$Boundaries[1]["Y1"],$Boundaries[1]["X2"],$Boundaries[1]["Y2"],$BorderColor); - - if ( $DrawLabels && !$Shadow ) - { - if ( $LabelColor == PIE_LABEL_COLOR_AUTO ) - { $Settings = array("FillR"=>$Palette[$ID]["R"],"FillG"=>$Palette[$ID]["G"],"FillB"=>$Palette[$ID]["B"],"Alpha"=>$Palette[$ID]["Alpha"]);} - else - { $Settings = array("FillR"=>$LabelR,"FillG"=>$LabelG,"FillB"=>$LabelB,"Alpha"=>$LabelAlpha); } - - $Angle = ($EndAngle - $Offset)/2 + $Offset; - $Xc = cos(($Angle-90)*PI/180) * $OuterRadius + $X; - $Yc = sin(($Angle-90)*PI/180) * $OuterRadius + $Y; - - $Label = $Data["Series"][$Data["Abscissa"]]["Data"][$Key]; - - if ( $LabelStacked ) - $this->writePieLabel($Xc,$Yc,$Label,$Angle,$Settings,TRUE,$X,$Y,$OuterRadius); - else - $this->writePieLabel($Xc,$Yc,$Label,$Angle,$Settings,FALSE); - } - - $Offset = $Lasti; $ID++; - } - - if ( $DrawLabels && $LabelStacked ) { $this->writeShiftedLabels(); } - - if ( $WriteValues && !$Shadow ) - { - $Step = 360 / (2 * PI * $OuterRadius); - $Offset = 0; - foreach($Values as $Key => $Value) - { - $EndAngle = $Offset+($Value*$ScaleFactor); - if ( $EndAngle > 360 ) { $EndAngle = 360; } - - $Angle = $Offset+($Value*$ScaleFactor)/2; - if ( $ValuePosition == PIE_VALUE_OUTSIDE ) - { - $Xc = cos(($Angle-90)*PI/180) * ($OuterRadius+$ValuePadding) + $X; - $Yc = sin(($Angle-90)*PI/180) * ($OuterRadius+$ValuePadding) + $Y; - if ( $Angle >=0 && $Angle <= 90 ) { $Align = TEXT_ALIGN_BOTTOMLEFT; } - if ( $Angle > 90 && $Angle <= 180 ) { $Align = TEXT_ALIGN_TOPLEFT; } - if ( $Angle > 180 && $Angle <= 270 ) { $Align = TEXT_ALIGN_TOPRIGHT; } - if ( $Angle > 270 ) { $Align = TEXT_ALIGN_BOTTOMRIGHT; } - } - else - { - $Xc = cos(($Angle-90)*PI/180) * (($OuterRadius-$InnerRadius)/2+$InnerRadius) + $X; - $Yc = sin(($Angle-90)*PI/180) * (($OuterRadius-$InnerRadius)/2+$InnerRadius) + $Y; - $Align = TEXT_ALIGN_MIDDLEMIDDLE; - } - - if ( $WriteValues == PIE_VALUE_PERCENTAGE ) - $Display = round(( 100 / $SerieSum ) * $Value,$Precision)."%"; - elseif ( $WriteValues == PIE_VALUE_NATURAL ) - $Display = $Value.$ValueSuffix; - else - $Label = ""; - - $this->pChartObject->drawText($Xc,$Yc,$Display,array("Align"=>$Align,"R"=>$ValueR,"G"=>$ValueG,"B"=>$ValueB)); - $Offset = $EndAngle; - } - } - - $this->pChartObject->Shadow = $RestoreShadow; - - return(PIE_RENDERED); - } - - /* Draw a 3D ring chart */ - function draw3DRing($X,$Y,$Format="") - { - $OuterRadius = isset($Format["OuterRadius"]) ? $Format["OuterRadius"] : 100; - $Precision = isset($Format["Precision"]) ? $Format["Precision"] : 0; - $InnerRadius = isset($Format["InnerRadius"]) ? $Format["InnerRadius"] : 30; - $SkewFactor = isset($Format["SkewFactor"]) ? $Format["SkewFactor"] : .6; - $SliceHeight = isset($Format["SliceHeight"]) ? $Format["SliceHeight"] : 10; - $DataGapAngle = isset($Format["DataGapAngle"]) ? $Format["DataGapAngle"] : 10; - $DataGapRadius = isset($Format["DataGapRadius"]) ? $Format["DataGapRadius"] : 10; - $Border = isset($Format["Border"]) ? $Format["Border"] : FALSE; - $Shadow = isset($Format["Shadow"]) ? $Format["Shadow"] : FALSE; - $DrawLabels = isset($Format["DrawLabels"]) ? $Format["DrawLabels"] : FALSE; - $LabelStacked = isset($Format["LabelStacked"]) ? $Format["LabelStacked"] : FALSE; - $LabelColor = isset($Format["LabelColor"]) ? $Format["LabelColor"] : PIE_LABEL_COLOR_MANUAL; - $LabelR = isset($Format["LabelR"]) ? $Format["LabelR"] : 0; - $LabelG = isset($Format["LabelG"]) ? $Format["LabelG"] : 0; - $LabelB = isset($Format["LabelB"]) ? $Format["LabelB"] : 0; - $LabelAlpha = isset($Format["LabelAlpha"]) ? $Format["LabelAlpha"] : 100; - $Cf = isset($Format["Cf"]) ? $Format["Cf"] : 20; - $WriteValues = isset($Format["WriteValues"]) ? $Format["WriteValues"] : PIE_VALUE_NATURAL; - $ValuePadding = isset($Format["ValuePadding"]) ? $Format["ValuePadding"] : $SliceHeight + 15; - $ValuePosition = isset($Format["ValuePosition"]) ? $Format["ValuePosition"] : PIE_VALUE_OUTSIDE; - $ValueSuffix = isset($Format["ValueSuffix"]) ? $Format["ValueSuffix"] : ""; - $ValueR = isset($Format["ValueR"]) ? $Format["ValueR"] : 255; - $ValueG = isset($Format["ValueG"]) ? $Format["ValueG"] : 255; - $ValueB = isset($Format["ValueB"]) ? $Format["ValueB"] : 255; - $ValueAlpha = isset($Format["ValueAlpha"]) ? $Format["ValueAlpha"] : 100; - $RecordImageMap = isset($Format["RecordImageMap"]) ? $Format["RecordImageMap"] : FALSE; - - /* Error correction for overlaying rounded corners */ - if ( $SkewFactor < .5 ) { $SkewFactor = .5; } - - /* Data Processing */ - $Data = $this->pDataObject->getData(); - $Palette = $this->pDataObject->getPalette(); - - /* Do we have an abscissa serie defined? */ - if ( $Data["Abscissa"] == "" ) { return(PIE_NO_ABSCISSA); } - - /* Try to find the data serie */ - $DataSerie = ""; - foreach ($Data["Series"] as $SerieName => $SerieData) - { if ( $SerieName != $Data["Abscissa"]) { $DataSerie = $SerieName; } } - - /* Do we have data to compute? */ - if ( $DataSerie == "" ) { return(PIE_NO_DATASERIE); } - - /* Remove unused data */ - list($Data,$Palette) = $this->clean0Values($Data,$Palette,$DataSerie,$Data["Abscissa"]); - - /* Compute the pie sum */ - $SerieSum = $this->pDataObject->getSum($DataSerie); - - /* Do we have data to draw? */ - if ( $SerieSum == 0 ) { return(PIE_SUMISNULL); } - - /* Dump the real number of data to draw */ - $Values = ""; - foreach ($Data["Series"][$DataSerie]["Data"] as $Key => $Value) - { if ($Value != 0) { $Values[] = $Value; } } - - /* Compute the wasted angular space between series */ - if (count($Values)==1) { $WastedAngular = 0; } else { $WastedAngular = count($Values) * $DataGapAngle; } - - /* Compute the scale */ - $ScaleFactor = (360 - $WastedAngular) / $SerieSum; - - $RestoreShadow = $this->pChartObject->Shadow; - if ( $this->pChartObject->Shadow ) { $this->pChartObject->Shadow = FALSE; } - - /* Draw the polygon ring elements */ - $Offset = 360; $ID = count($Values)-1; - $Values = array_reverse($Values); - $Slice = 0; $Slices = ""; $SliceColors = ""; $Visible = ""; $SliceAngle = ""; - foreach($Values as $Key => $Value) - { - if ( !isset($Palette[$ID]["R"]) ) { $Color = $this->pChartObject->getRandomColor(); $Palette[$ID] = $Color; $this->pDataObject->savePalette($ID,$Color); } - $Settings = array("R"=>$Palette[$ID]["R"],"G"=>$Palette[$ID]["G"],"B"=>$Palette[$ID]["B"],"Alpha"=>$Palette[$ID]["Alpha"]); - - $SliceColors[$Slice] = $Settings; - - $StartAngle = $Offset; - $EndAngle = $Offset-($Value*$ScaleFactor); if ( $EndAngle < 0 ) { $EndAngle = 0; } - - if ( $StartAngle > 180 ) { $Visible[$Slice]["Start"] = TRUE; } else { $Visible[$Slice]["Start"] = TRUE; } - if ( $EndAngle < 180 ) { $Visible[$Slice]["End"] = FALSE; } else { $Visible[$Slice]["End"] = TRUE; } - - $Step = (360 / (2 * PI * $OuterRadius))/2; - $OutX1 = VOID; $OutY1 = VOID; - for($i=$Offset;$i>=$EndAngle;$i=$i-$Step) - { - $Xc = cos(($i-90)*PI/180) * ($OuterRadius+$DataGapRadius-2) + $X; - $Yc = sin(($i-90)*PI/180) * ($OuterRadius+$DataGapRadius-2)*$SkewFactor + $Y; - $Slices[$Slice]["AA"][] = array($Xc,$Yc); - - $Xc = cos(($i-90)*PI/180) * ($OuterRadius+$DataGapRadius-1) + $X; - $Yc = sin(($i-90)*PI/180) * ($OuterRadius+$DataGapRadius-1)*$SkewFactor + $Y; - $Slices[$Slice]["AA"][] = array($Xc,$Yc); - - $Xc = cos(($i-90)*PI/180) * ($OuterRadius+$DataGapRadius) + $X; - $Yc = sin(($i-90)*PI/180) * ($OuterRadius+$DataGapRadius)*$SkewFactor + $Y; - $this->pChartObject->drawAntialiasPixel($Xc,$Yc,$Settings); - - if ( $OutX1 == VOID ) { $OutX1 = $Xc; $OutY1 = $Yc; } - - if ( $i<90 ) { $Yc++; } - if ( $i>90 && $i<180 ) { $Xc++; } - if ( $i>180 && $i<270 ) { $Xc++; } - if ( $i>=270 ) { $Xc++; $Yc++; } - - $Slices[$Slice]["BottomPoly"][] = floor($Xc); $Slices[$Slice]["BottomPoly"][] = floor($Yc); - $Slices[$Slice]["TopPoly"][] = floor($Xc); $Slices[$Slice]["TopPoly"][] = floor($Yc)-$SliceHeight; - $Slices[$Slice]["Angle"][] = $i; - } - $OutX2 = $Xc; $OutY2 = $Yc; - - $Slices[$Slice]["Angle"][] = VOID; - $Lasti = $i; - - $Step = (360 / (2 * PI * $InnerRadius))/2; - $InX1 = VOID; $InY1 = VOID; - for($i=$EndAngle;$i<=$Offset;$i=$i+$Step) - { - $Xc = cos(($i-90)*PI/180) * ($InnerRadius+$DataGapRadius-1) + $X; - $Yc = sin(($i-90)*PI/180) * ($InnerRadius+$DataGapRadius-1)*$SkewFactor + $Y; - $Slices[$Slice]["AA"][] = array($Xc,$Yc); - - $Xc = cos(($i-90)*PI/180) * ($InnerRadius+$DataGapRadius) + $X; - $Yc = sin(($i-90)*PI/180) * ($InnerRadius+$DataGapRadius)*$SkewFactor + $Y; - $Slices[$Slice]["AA"][] = array($Xc,$Yc); - - if ( $InX1 == VOID ) { $InX1 = $Xc; $InY1 = $Yc; } - - if ( $i<90 ) { $Yc++; } - if ( $i>90 && $i<180 ) { $Xc++; } - if ( $i>180 && $i<270 ) { $Xc++; } - if ( $i>=270 ) { $Xc++; $Yc++; } - - $Slices[$Slice]["BottomPoly"][] = floor($Xc); $Slices[$Slice]["BottomPoly"][] = floor($Yc); - $Slices[$Slice]["TopPoly"][] = floor($Xc); $Slices[$Slice]["TopPoly"][] = floor($Yc)-$SliceHeight; - $Slices[$Slice]["Angle"][] = $i; - } - $InX2 = $Xc; $InY2 = $Yc; - - $Slices[$Slice]["InX1"] = $InX1; $Slices[$Slice]["InY1"] = $InY1; - $Slices[$Slice]["InX2"] = $InX2; $Slices[$Slice]["InY2"] = $InY2; - $Slices[$Slice]["OutX1"] = $OutX1; $Slices[$Slice]["OutY1"] = $OutY1; - $Slices[$Slice]["OutX2"] = $OutX2; $Slices[$Slice]["OutY2"] = $OutY2; - - $Offset = $Lasti - $DataGapAngle; $ID--; $Slice++; - } - - /* Draw the bottom pie splice */ - foreach($Slices as $SliceID => $Plots) - { - $Settings = $SliceColors[$SliceID]; $Settings["NoBorder"] = TRUE; - $this->pChartObject->drawPolygon($Plots["BottomPoly"],$Settings); - - foreach($Plots["AA"] as $Key => $Pos) - $this->pChartObject->drawAntialiasPixel($Pos[0],$Pos[1],$Settings); - - $this->pChartObject->drawLine($Plots["InX1"],$Plots["InY1"],$Plots["OutX2"],$Plots["OutY2"],$Settings); - $this->pChartObject->drawLine($Plots["InX2"],$Plots["InY2"],$Plots["OutX1"],$Plots["OutY1"],$Settings); - } - - $Slices = array_reverse($Slices); - $SliceColors = array_reverse($SliceColors); - - /* Draw the vertical edges (semi-visible) */ - foreach($Slices as $SliceID => $Plots) - { - $Settings = $SliceColors[$SliceID]; $Settings["NoBorder"] = TRUE; - $Settings["R"] = $Settings["R"]+$Cf; $Settings["G"] = $Settings["G"]+$Cf; $Settings["B"] = $Settings["B"]+$Cf; - - $StartAngle = $Plots["Angle"][0]; - foreach($Plots["Angle"] as $Key =>$Angle) { if ($Angle == VOID) { $EndAngle = $Plots["Angle"][$Key-1]; } } - - if ( $StartAngle >= 270 || $StartAngle <= 90 ) - $this->pChartObject->drawLine($Plots["OutX1"],$Plots["OutY1"],$Plots["OutX1"],$Plots["OutY1"]-$SliceHeight,$Settings); - if ( $StartAngle >= 270 || $StartAngle <= 90 ) - $this->pChartObject->drawLine($Plots["OutX2"],$Plots["OutY2"],$Plots["OutX2"],$Plots["OutY2"]-$SliceHeight,$Settings); - - $this->pChartObject->drawLine($Plots["InX1"],$Plots["InY1"],$Plots["InX1"],$Plots["InY1"]-$SliceHeight,$Settings); - $this->pChartObject->drawLine($Plots["InX2"],$Plots["InY2"],$Plots["InX2"],$Plots["InY2"]-$SliceHeight,$Settings); - } - - /* Draw the inner vertical slices */ - foreach($Slices as $SliceID => $Plots) - { - $Settings = $SliceColors[$SliceID]; $Settings["NoBorder"] = TRUE; - $Settings["R"] = $Settings["R"]+$Cf; $Settings["G"] = $Settings["G"]+$Cf; $Settings["B"] = $Settings["B"]+$Cf; - - $Outer = TRUE; $Inner = FALSE; - $InnerPlotsA = ""; $InnerPlotsB = ""; - foreach($Plots["Angle"] as $ID => $Angle) - { - if ( $Angle == VOID ) - { $Outer = FALSE; $Inner = TRUE; } - elseif( $Inner ) - { - if (( $Angle < 90 || $Angle > 270 ) && isset($Plots["BottomPoly"][$ID*2]) ) - { - $Xo = $Plots["BottomPoly"][$ID*2]; - $Yo = $Plots["BottomPoly"][$ID*2+1]; - - $InnerPlotsA[] = $Xo; $InnerPlotsA[] = $Yo; - $InnerPlotsB[] = $Xo; $InnerPlotsB[] = $Yo-$SliceHeight; - } - } - } - - if ( $InnerPlotsA != "" ) - { $InnerPlots = array_merge($InnerPlotsA,$this->arrayReverse($InnerPlotsB)); $this->pChartObject->drawPolygon($InnerPlots,$Settings); } - } - - /* Draw the splice top and left poly */ - foreach($Slices as $SliceID => $Plots) - { - $Settings = $SliceColors[$SliceID]; $Settings["NoBorder"] = TRUE; - $Settings["R"] = $Settings["R"]+$Cf*1.5; $Settings["G"] = $Settings["G"]+$Cf*1.5; $Settings["B"] = $Settings["B"]+$Cf*1.5; - - $StartAngle = $Plots["Angle"][0]; - foreach($Plots["Angle"] as $Key =>$Angle) { if ($Angle == VOID) { $EndAngle = $Plots["Angle"][$Key-1]; } } - - if ( $StartAngle < 180 ) - { - $Points = ""; - $Points[] = $Plots["InX2"]; - $Points[] = $Plots["InY2"]; - $Points[] = $Plots["InX2"]; - $Points[] = $Plots["InY2"]-$SliceHeight; - $Points[] = $Plots["OutX1"]; - $Points[] = $Plots["OutY1"]-$SliceHeight; - $Points[] = $Plots["OutX1"]; - $Points[] = $Plots["OutY1"]; - - $this->pChartObject->drawPolygon($Points,$Settings); - } - - if ( $EndAngle > 180 ) - { - $Points = ""; - $Points[] = $Plots["InX1"]; - $Points[] = $Plots["InY1"]; - $Points[] = $Plots["InX1"]; - $Points[] = $Plots["InY1"]-$SliceHeight; - $Points[] = $Plots["OutX2"]; - $Points[] = $Plots["OutY2"]-$SliceHeight; - $Points[] = $Plots["OutX2"]; - $Points[] = $Plots["OutY2"]; - - $this->pChartObject->drawPolygon($Points,$Settings); - } - } - - - /* Draw the vertical edges (visible) */ - foreach($Slices as $SliceID => $Plots) - { - $Settings = $SliceColors[$SliceID]; $Settings["NoBorder"] = TRUE; - $Settings["R"] = $Settings["R"]+$Cf; $Settings["G"] = $Settings["G"]+$Cf; $Settings["B"] = $Settings["B"]+$Cf; - - $StartAngle = $Plots["Angle"][0]; - foreach($Plots["Angle"] as $Key =>$Angle) { if ($Angle == VOID) { $EndAngle = $Plots["Angle"][$Key-1]; } } - - if ( $StartAngle <= 270 && $StartAngle >= 90 ) - $this->pChartObject->drawLine($Plots["OutX1"],$Plots["OutY1"],$Plots["OutX1"],$Plots["OutY1"]-$SliceHeight,$Settings); - if ( $EndAngle <= 270 && $EndAngle >= 90 ) - $this->pChartObject->drawLine($Plots["OutX2"],$Plots["OutY2"],$Plots["OutX2"],$Plots["OutY2"]-$SliceHeight,$Settings); - } - - - /* Draw the outer vertical slices */ - foreach($Slices as $SliceID => $Plots) - { - $Settings = $SliceColors[$SliceID]; $Settings["NoBorder"] = TRUE; - $Settings["R"] = $Settings["R"]+$Cf; $Settings["G"] = $Settings["G"]+$Cf; $Settings["B"] = $Settings["B"]+$Cf; - - $Outer = TRUE; $Inner = FALSE; - $OuterPlotsA = ""; $OuterPlotsB = ""; $InnerPlotsA = ""; $InnerPlotsB = ""; - foreach($Plots["Angle"] as $ID => $Angle) - { - if ( $Angle == VOID ) - { $Outer = FALSE; $Inner = TRUE; } - elseif( $Outer ) - { - if ( ( $Angle > 90 && $Angle < 270 ) && isset($Plots["BottomPoly"][$ID*2]) ) - { - $Xo = $Plots["BottomPoly"][$ID*2]; - $Yo = $Plots["BottomPoly"][$ID*2+1]; - - $OuterPlotsA[] = $Xo; $OuterPlotsA[] = $Yo; - $OuterPlotsB[] = $Xo; $OuterPlotsB[] = $Yo-$SliceHeight; - } - } - } - if ( $OuterPlotsA != "" ) - { $OuterPlots = array_merge($OuterPlotsA,$this->arrayReverse($OuterPlotsB)); $this->pChartObject->drawPolygon($OuterPlots,$Settings); } - } - - $Slices = array_reverse($Slices); - $SliceColors = array_reverse($SliceColors); - - - /* Draw the top pie splice */ - foreach($Slices as $SliceID => $Plots) - { - $Settings = $SliceColors[$SliceID]; $Settings["NoBorder"] = TRUE; - $Settings["R"] = $Settings["R"]+$Cf*2; $Settings["G"] = $Settings["G"]+$Cf*2; $Settings["B"] = $Settings["B"]+$Cf*2; - - $this->pChartObject->drawPolygon($Plots["TopPoly"],$Settings); - - if ( $RecordImageMap ) { $this->pChartObject->addToImageMap("POLY",$this->arraySerialize($Plots["TopPoly"]),$this->pChartObject->toHTMLColor($Settings["R"],$Settings["G"],$Settings["B"]),$Data["Series"][$Data["Abscissa"]]["Data"][$SliceID],$Data["Series"][$DataSerie]["Data"][count($Slices)-$SliceID-1]); } - - foreach($Plots["AA"] as $Key => $Pos) - $this->pChartObject->drawAntialiasPixel($Pos[0],$Pos[1]-$SliceHeight,$Settings); - - $this->pChartObject->drawLine($Plots["InX1"],$Plots["InY1"]-$SliceHeight,$Plots["OutX2"],$Plots["OutY2"]-$SliceHeight,$Settings); - $this->pChartObject->drawLine($Plots["InX2"],$Plots["InY2"]-$SliceHeight,$Plots["OutX1"],$Plots["OutY1"]-$SliceHeight,$Settings); - } - - if ( $DrawLabels ) - { - $Offset = 360; - foreach($Values as $Key => $Value) - { - $StartAngle = $Offset; - $EndAngle = $Offset-($Value*$ScaleFactor); if ( $EndAngle < 0 ) { $EndAngle = 0; } - - if ( $LabelColor == PIE_LABEL_COLOR_AUTO ) - { $Settings = array("FillR"=>$Palette[$ID]["R"],"FillG"=>$Palette[$ID]["G"],"FillB"=>$Palette[$ID]["B"],"Alpha"=>$Palette[$ID]["Alpha"]);} - else - { $Settings = array("FillR"=>$LabelR,"FillG"=>$LabelG,"FillB"=>$LabelB,"Alpha"=>$LabelAlpha); } - - $Angle = ($EndAngle - $Offset)/2 + $Offset; - $Xc = cos(($Angle-90)*PI/180) * ($OuterRadius+$DataGapRadius) + $X; - $Yc = sin(($Angle-90)*PI/180) * ($OuterRadius+$DataGapRadius)*$SkewFactor + $Y; - - if ( $WriteValues == PIE_VALUE_PERCENTAGE ) - $Label = $Display = round(( 100 / $SerieSum ) * $Value,$Precision)."%"; - elseif ( $WriteValues == PIE_VALUE_NATURAL ) - $Label = $Data["Series"][$Data["Abscissa"]]["Data"][$Key]; - else - $Label = ""; - - if ( $LabelStacked ) - $this->writePieLabel($Xc,$Yc-$SliceHeight,$Label,$Angle,$Settings,TRUE,$X,$Y,$OuterRadius); - else - $this->writePieLabel($Xc,$Yc-$SliceHeight,$Label,$Angle,$Settings,FALSE); - - $Offset = $EndAngle - $DataGapAngle; $ID--; $Slice++; - } - } - if ( $DrawLabels && $LabelStacked ) { $this->writeShiftedLabels(); } - - $this->pChartObject->Shadow = $RestoreShadow; - - return(PIE_RENDERED); - } - - /* Serialize an array */ - function arraySerialize($Data) - { - $Result = ""; - foreach($Data as $Key => $Value) - { if ($Result == "") { $Result = floor($Value); } else { $Result = $Result.",".floor($Value); } } - - return($Result); - } - - /* Reverse an array */ - function arrayReverse($Plots) - { - $Result = ""; - - for($i=count($Plots)-1;$i>=0;$i=$i-2) - { $Result[] = $Plots[$i-1]; $Result[] = $Plots[$i]; } - - return($Result); - } - - /* Remove unused series & values */ - function clean0Values($Data,$Palette,$DataSerie,$AbscissaSerie) - { - $NewPalette = ""; $NewData = ""; $NewAbscissa = ""; - - /* Remove unused series */ - foreach($Data["Series"] as $SerieName => $SerieSettings) - { if ( $SerieName != $DataSerie && $SerieName != $AbscissaSerie ) { unset($Data["Series"][$SerieName]); } } - - /* Remove NULL values */ - foreach($Data["Series"][$DataSerie]["Data"] as $Key => $Value) - { - if ($Value != 0 ) - { - $NewData[] = $Value; - $NewAbscissa[] = $Data["Series"][$AbscissaSerie]["Data"][$Key]; - if ( isset($Palette[$Key]) ) { $NewPalette[] = $Palette[$Key]; } - } - } - $Data["Series"][$DataSerie]["Data"] = $NewData; - $Data["Series"][$AbscissaSerie]["Data"] = $NewAbscissa; - - return(array($Data,$NewPalette)); - } - } -?> \ No newline at end of file diff --git a/libs/pChart/readme.txt b/libs/pChart/readme.txt deleted file mode 100644 index 6004ea52e6..0000000000 --- a/libs/pChart/readme.txt +++ /dev/null @@ -1,143 +0,0 @@ - - ╔════════════════════════════════════════════════════════════════════════════╗ - ║ ║ - ║ pChart - a PHP Charting library ║ - ║ ║ - ║ Version : 2.1.4 ║ - ║ Made by : Jean-Damien POGOLOTTI ║ - ║ Last Update : 19/01/2014 ║ - ║ ║ - ╚════════════════════════════════════════════════════════════════════════════╝ - - ≡ WHAT CAN pCHART DO FOR YOU? ──────────────────────────────────────────────── - - pChart is a PHP framework that will help you to create anti-aliased charts or - pictures directly from your web server. You can then display the result in - the client browser, sent it by mail or insert it into PDFs. - - This library has now reached an important point in its development cycle - going out of the beta step. pChart 2.0 is a completly rewritten library based - on what I've learned doing the first version. - - - ≡ PACKAGE CONTENTS ─────────────────────────────────────────────────────────── - - ┬ - │ - ├─ /cache This folder is used by the pCache module. - │ - ├─ /class This folder contains the library core classes. - │ │ - │ ├─ pBarcode39.class Class to draw Code 39 barcodes. - │ ├─ pBarcode128.class Class to draw Code 128 barcodes. - │ ├─ pBubble.class Class to draw bubble charts. - │ ├─ pCache.class Class enabling chart caching functionalities. - │ ├─ pData.class Class to manipulate chart data. - │ ├─ pDraw.class Extended drawing functions. - │ ├─ pIndicator.class Class to draw indicators. - │ ├─ pImage.class Core drawing functions. - │ ├─ pPie.class Class to draw pie charts. - │ ├─ pSplit.class Class to draw split path charts. - │ ├─ pSpring.class Class to draw spring charts. - │ ├─ pScatter.class Class to draw scatter charts. - │ ├─ pStock.class Class to draw stock charts. - │ └─ pSurface.class Class to draw surface charts. - │ - ├─ /data This folder contains extended data. - │ │ - │ ├─ 39.db Code 39 barcodes static database. - │ └─ 128.db Code 128 barcodes static database. - │ - ├─ /examples This folder contains some PHP examples. - │ │ - │ ├─ delayedLoader Delayed loader script example. - │ ├─ imageMap Image map script example. - │ └─ sandbox Powerful dev. tool to design your charts. - │ - ├─ /fonts This folder contains a bunch of TTF fonts. - │ - ├─ /palettes Sample palettes files. - │ - ├─ change.log History of all the changes since the 2.0 - ├─ GPLv3.txt GPLv3 official text. - └─ readme.txt This file. - - - ≡ PREREQUiSiTES ────────────────────────────────────────────────────────────── - - This library has been written to work with PHP 5+ versions. It will also work - with PHP 4 but the rendering quality maybe downgraded and the rendering speed - seriously impacted. - - pChart require the GD and FreeType PHP extensions to be installed on your - web server. This is an important prerequiste that can't be overrided. - - - ≡ RUNNiNG THE EXAMPLES ─────────────────────────────────────────────────────── - - pChart is shipped with examples (located in the /examples folder) that you - can either render from a web page using your http and pointing to this folder - or from the command line invoking the php interpreter. - - On windows OS, assuming that your PHP binaries are correctly configured in - the PATH environment variable you can also execute the BuildAll.cmd batch - file. - - - ≡ LiCENSE ──────────────────────────────────────────────────────────────────── - - The pChart library is released under two different licenses. If your - application is not a commercial one (eg: you make no money by redistributing - it) then the GNU GPLv3 license (General Public License) applies. This license - allows you to freely integrate this library in your applications, modify the - code and redistribute it in bundled packages as long as your application is - also distributed with the GPL license. - - The GPLv3 license description can be found in GPLv3.txt. - - If your application can't meet the GPL license or is a commercial one (eg: - the library is integrated in a software or an appliance you're selling) then - you'll have to buy a commercial license. With this license you don't need to - make publicly available your application code under the GPL license terms. - - Commercial license price are depending of your needs. - - Please consult the web page : http://www.pchart.net/license - - - ≡ EXTERNAL COPYRiGHTS ──────────────────────────────────────────────────────── - - Those external components are only provided as a base to run examples. The - pChart library does not depends on any of them to be used. - - Famfamfam icons has been made by Mark James, Rounded corners lite has been - coded by Cameron Cooke and Tim Hutchison, Javascript Color Picker has been - written by Honza Odvarko. - - The provided font files are licensed under their own terms : - - │ - ├─ advent_light.ttf Copyright Andreas K. inde - ├─ Bedizen.ttf Copyright Tepid Monkey Fonts - ├─ calibri.ttf Copyright Microsoft - ├─ Forgotte.ttf Copyright Ray Larabie - ├─ GeosansLight.ttf Copyright Manfred Klein - ├─ MankSans.ttf Copyright Manfred Klein - ├─ pf_arma_five.ttf Copyright Yusuke Kamiyamane - ├─ Silkscreen.ttf Copyright Jason Aleksandr Kottke - └─ verdana.ttf Copyright Microsoft - - - ≡ SUPPORT ──────────────────────────────────────────────────────────────────── - - Since the beginning, pChart is a community driven project. You're missing - feature then ask! We'll try to get it implemented in the future version or - you'll be guided to create a class extension for your own needs. - - pChart portal : http://www.pchart.net - Documentation wiki : http://wiki.pchart.net - Support forum : http://wiki.pchart.net/forum - - - --- - (c)2014 Jean-Damien POGOLOTTI - 13k lines of codes diff --git a/plugins/ImageGraph/API.php b/plugins/ImageGraph/API.php index b596fe6d37..e9f15d0b04 100644 --- a/plugins/ImageGraph/API.php +++ b/plugins/ImageGraph/API.php @@ -263,7 +263,7 @@ class API extends \Piwik\Plugin\API case StaticGraph::GRAPH_TYPE_BASIC_PIE: if (count($ordinateColumns) > 1) { - // pChart doesn't support multiple series on pie charts + // CpChart doesn't support multiple series on pie charts throw new Exception("Pie charts do not currently support multiple series"); } diff --git a/plugins/ImageGraph/StaticGraph.php b/plugins/ImageGraph/StaticGraph.php index 3cd7b738ee..1f74457e7d 100644 --- a/plugins/ImageGraph/StaticGraph.php +++ b/plugins/ImageGraph/StaticGraph.php @@ -9,17 +9,13 @@ namespace Piwik\Plugins\ImageGraph; -use pData; -use pImage; +use CpChart\Chart\Data; +use CpChart\Chart\Image; use Piwik\Container\StaticContainer; use Piwik\NumberFormatter; use Piwik\Piwik; use Piwik\BaseFactory; -require_once PIWIK_INCLUDE_PATH . "/libs/pChart/class/pDraw.class.php"; -require_once PIWIK_INCLUDE_PATH . "/libs/pChart/class/pImage.class.php"; -require_once PIWIK_INCLUDE_PATH . "/libs/pChart/class/pData.class.php"; - /** * The StaticGraph abstract class is used as a base class for different types of static graphs. * @@ -45,11 +41,11 @@ abstract class StaticGraph extends BaseFactory private $aliasedGraph; /** - * @var pImage + * @var Image */ protected $pImage; /** - * @var pData + * @var Data */ protected $pData; protected $ordinateLabels; @@ -102,7 +98,7 @@ abstract class StaticGraph extends BaseFactory public function sendToDisk($filename) { $filePath = self::getOutputPath($filename); - $this->pImage->Render($filePath); + $this->pImage->render($filePath); return $filePath; } @@ -238,7 +234,7 @@ abstract class StaticGraph extends BaseFactory protected function initpData() { - $this->pData = new pData(); + $this->pData = new Data(); foreach ($this->ordinateSeries as $column => $data) { $this->pData->addPoints($data, $column); @@ -257,7 +253,7 @@ abstract class StaticGraph extends BaseFactory protected function initpImage() { - $this->pImage = new pImage($this->width, $this->height, $this->pData); + $this->pImage = new Image($this->width, $this->height, $this->pData); $this->pImage->Antialias = $this->aliasedGraph; $this->pImage->setFontProperties( @@ -347,7 +343,7 @@ abstract class StaticGraph extends BaseFactory /** * Global format method * - * required to format y axis values using pcharts internal format callbacks + * required to format y axis values using CpChart internal format callbacks * @param $value * @return mixed */ diff --git a/plugins/ImageGraph/StaticGraph/Exception.php b/plugins/ImageGraph/StaticGraph/Exception.php index eca980e3b2..dd10193365 100644 --- a/plugins/ImageGraph/StaticGraph/Exception.php +++ b/plugins/ImageGraph/StaticGraph/Exception.php @@ -8,7 +8,7 @@ */ namespace Piwik\Plugins\ImageGraph\StaticGraph; -use pData; +use CpChart\Chart\Data; use Piwik\Plugins\ImageGraph\StaticGraph; /** @@ -51,7 +51,7 @@ class Exception extends StaticGraph public function renderGraph() { - $this->pData = new pData(); + $this->pData = new Data(); $message = $this->exception->getMessage(); list($textWidth, $textHeight) = $this->getTextWidthHeight($message); diff --git a/plugins/ImageGraph/StaticGraph/PieGraph.php b/plugins/ImageGraph/StaticGraph/PieGraph.php index d3e88b52f4..a43a6ff631 100644 --- a/plugins/ImageGraph/StaticGraph/PieGraph.php +++ b/plugins/ImageGraph/StaticGraph/PieGraph.php @@ -9,10 +9,8 @@ namespace Piwik\Plugins\ImageGraph\StaticGraph; +use CpChart\Chart\Pie; use Piwik\Plugins\ImageGraph\StaticGraph; -use pPie; - -require_once PIWIK_INCLUDE_PATH . "/libs/pChart/class/pPie.class.php"; /** * @@ -26,7 +24,7 @@ abstract class PieGraph extends StaticGraph const SLICE_COLOR_KEY = "SLICE_COLOR"; /** - * @var pPie + * @var Pie */ protected $pieChart; protected $xPosition; @@ -57,7 +55,7 @@ abstract class PieGraph extends StaticGraph $radius = ($this->height / 2) - self::RADIUS_MARGIN; } - $this->pieChart = new pPie($this->pImage, $this->pData); + $this->pieChart = new Pie($this->pImage, $this->pData); $numberOfSlices = count($this->abscissaSeries); $numberOfAvailableColors = count($this->colors); @@ -89,7 +87,7 @@ abstract class PieGraph extends StaticGraph * it uses a threshold to determine if an abscissa value should be drawn on the PIE * discarded abscissa values are summed in the 'other' abscissa value * - * if this process is not perform, pChart will draw pie slices that are too small to see + * if this process is not perform, CpChart will draw pie slices that are too small to see */ private function truncateSmallValues() { -- cgit v1.2.3 From 72ffc34feeb36200964bbe47f27f8154805dc1f5 Mon Sep 17 00:00:00 2001 From: Stefan Giehl Date: Mon, 3 Apr 2017 21:49:45 +0200 Subject: language update (#11578) --- lang/pl.json | 6 ++++++ lang/pt-br.json | 16 ++++++++++++++++ lang/tr.json | 4 ++++ plugins/Contents/lang/tr.json | 2 ++ plugins/CoreAdminHome/lang/de.json | 1 + plugins/CoreAdminHome/lang/el.json | 1 + plugins/CoreAdminHome/lang/pt-br.json | 1 + plugins/CoreAdminHome/lang/sq.json | 1 + plugins/CoreAdminHome/lang/zh-tw.json | 1 + plugins/CoreHome/lang/pt-br.json | 2 ++ plugins/CoreHome/lang/zh-tw.json | 2 +- plugins/CorePluginsAdmin/lang/de.json | 1 + plugins/CorePluginsAdmin/lang/el.json | 1 + plugins/CorePluginsAdmin/lang/fr.json | 1 + plugins/CorePluginsAdmin/lang/sq.json | 1 + plugins/CorePluginsAdmin/lang/zh-tw.json | 1 + plugins/CoreUpdater/lang/el.json | 3 ++- plugins/CoreUpdater/lang/fr.json | 3 ++- plugins/CoreUpdater/lang/sq.json | 3 ++- plugins/CoreUpdater/lang/zh-tw.json | 3 ++- plugins/CustomPiwikJs/lang/el.json | 1 + plugins/CustomPiwikJs/lang/fr.json | 1 + plugins/CustomPiwikJs/lang/sq.json | 1 + plugins/CustomPiwikJs/lang/zh-tw.json | 1 + plugins/Installation/lang/el.json | 1 + plugins/Installation/lang/fr.json | 1 + plugins/Installation/lang/sq.json | 1 + plugins/Installation/lang/zh-tw.json | 1 + plugins/Marketplace/lang/el.json | 1 + plugins/Marketplace/lang/fr.json | 1 + plugins/Marketplace/lang/sq.json | 1 + plugins/Marketplace/lang/zh-tw.json | 1 + plugins/SitesManager/lang/cs.json | 2 -- plugins/SitesManager/lang/de.json | 5 +++-- plugins/SitesManager/lang/el.json | 8 ++++++-- plugins/SitesManager/lang/es.json | 2 -- plugins/SitesManager/lang/fr.json | 3 +-- plugins/SitesManager/lang/it.json | 2 -- plugins/SitesManager/lang/ja.json | 2 -- plugins/SitesManager/lang/ko.json | 2 -- plugins/SitesManager/lang/nb.json | 2 -- plugins/SitesManager/lang/nl.json | 2 -- plugins/SitesManager/lang/pt-br.json | 2 -- plugins/SitesManager/lang/sq.json | 8 ++++++-- plugins/SitesManager/lang/sr.json | 2 -- plugins/SitesManager/lang/sv.json | 2 -- plugins/SitesManager/lang/uk.json | 2 -- plugins/SitesManager/lang/zh-tw.json | 8 ++++++-- 48 files changed, 83 insertions(+), 37 deletions(-) diff --git a/lang/pl.json b/lang/pl.json index f65ac788bc..b6f2bdb711 100644 --- a/lang/pl.json +++ b/lang/pl.json @@ -80,6 +80,7 @@ "ConfigFileIsNotWritable": "Plik konfiguracyjny Piwik %1$s nie ma ustawionych praw do zapisu, zmiany poczynione nie mogły więc zostać zapisane. %2$s Zmień przez chmod uprawnienia do zapisu pliku konfiguracyjnego.", "Continue": "Kontunuuj", "ContinueToPiwik": "Idź do Piwik", + "CurrentlyUsingUnsecureHttp": "Aktualnie używasz Piwik przez niezabezpieczony protokół HTTP. Zalecamy wykorzystanie SSL (HTTPS) aby poprawić bezpieczeństwo.", "CreatedByUser": "utworzony przez %s", "CurrentMonth": "bieżący miesiąc", "CurrentWeek": "bieżący tydzień", @@ -216,6 +217,7 @@ "Name": "Nazwa", "NbActions": "Numer działań", "NbInteractions": "Liczba interakcji", + "NbSearches": "Liczba wewnętrznych wyszukiwań", "NeedMoreHelp": "Potrzebujesz więcej pomocy?", "Never": "Nigdy", "NewReportsWillBeProcessedByCron": "Kiedy archiwizacja baz Piwik nie jest wywoływana przez przeglądarkę, nowe raporty będą jedynie przetwarzane przez crontab.", @@ -334,12 +336,14 @@ "TimeAgo": "%s temu", "TimeFormat": "Format czasu", "TimeOnPage": "Czas na stronie", + "ToDeleteAllDirectoriesRunThisCommand": "W celu usunięcia tych katalogów możesz użyć komendy:", "Total": "Ogólnie", "TotalRatioTooltip": "To jest %1$s wszystkich %2$s %3$s.", "TotalRevenue": "Przychody ogółem", "TrackingScopeAction": "Akcja", "TrackingScopePage": "Strona", "TrackingScopeVisit": "Wizyta", + "TransitionsRowActionTooltip": "Zobacz co odwiedzający zrobili przed i po obejrzeniu tej strony", "TransitionsRowActionTooltipTitle": "Otwarte przejścia", "TranslatorName": "Remigiusz Waszkiewicz, Marcin Kowol, Maciej Zawadziński, Artur Warchoł,AETERNUS, Tomasz Kornicki", "UniquePurchases": "Unikalnych zakupów", @@ -415,6 +419,7 @@ "HowtoDeleteAnAccount": "Naciśnij i przytrzymaj by usunac konto.", "HowtoDeleteAnAccountOniOS": "W celu usunięcia konta przeciągnij z prawej do lewej", "HowtoLoginAnonymous": "Pozostaw nazwę i hasło uzytkownika pustymi dla logowania anonimowego", + "HttpTimeout": "HTTP Timeout - Przekroczono maksymalny dozwolony czas", "LastUpdated": "Ostatnia aktualizacja: %s", "LoadingReport": "Ładowanie %s", "LoginCredentials": "Uprawnienia", @@ -449,6 +454,7 @@ "TryIt": "Wypróbuj!", "VerifyAccount": "Weryfikowanie Konta", "ValidateSslCertificate": "Zweryfikuj certyfikat SSL", + "VerifyLoginData": "Upewnij się, że Twój login i hasło są poprawne.", "YouAreOffline": "Przepraszamy, obecnie jesteś odłączony" }, "RowEvolution": { diff --git a/lang/pt-br.json b/lang/pt-br.json index 300529cbad..1d319a7f3d 100644 --- a/lang/pt-br.json +++ b/lang/pt-br.json @@ -62,12 +62,15 @@ "ColumnNbActions": "Ações", "ColumnNbActionsDocumentation": "O número de ações realizadas pelos seus visitantes. As ações podem ser exibições de páginas, pesquisas internas no site, downloads ou outlinks.", "ColumnNbUniqVisitors": "Visitantes Únicos", + "ColumnNbUniqVisitorsDocumentation": "O número de visitantes não duplicados que chegam ao seu site. Cada usuário só é contado uma vez, mesmo se eles visitam o site várias vezes ao dia.", "ColumnNbUsers": "Usuários", "ColumnNbUsersDocumentation": "O número de usuários autenticados em seu site. É o número de usuários ativos únicos que têm um ID de usuário definido (através da função de código de rastreamento 'getUserId').", "ColumnNbVisits": "Visitas", + "ColumnNbVisitsDocumentation": "Se um visitante chega ao seu site pela primeira vez, ou se eles visitam uma página mais de 30 minutos depois de sua última página vista, isso será registrado como uma nova visita.", "ColumnPageBounceRateDocumentation": "A porcentagem de visitas que começou nesta página e deixou o site de imediato.", "ColumnPageviews": "Exibições de página", "ColumnPageviewsDocumentation": "O número de vezes que a página foi visitada.", + "ColumnPercentageVisits": "%% Visitas", "ColumnRevenue": "Lucro", "ColumnSumVisitLength": "Tempo total gasto pelos visitantes (em segundos)", "ColumnTotalPageviews": "Total de Exibições de Páginas", @@ -158,6 +161,12 @@ "ExceptionLanguageFileNotFound": "Ficheiro de idioma %s não encontrado.", "ExceptionMethodNotFound": "O método '%1$s' não existe ou não está disponível no módulo '%2$s'.", "ExceptionMissingFile": "Arquivo faltando: %s.", + "ExceptionUnexpectedFile": "Arquivos foram encontrados no seu Piwik mas nós não esperávamos por eles.", + "ExceptionUnexpectedFilePleaseDelete": "Por favor, apague estes arquivos para prevenir erros.", + "ExceptionUnexpectedDirectory": "Diretórios foram encontrados no seu Piwik mas nós não esperávamos por eles.", + "ExceptionUnexpectedDirectoryPleaseDelete": "Por favor, apague estes diretórios para prevenir erros.", + "ExceptionFileToDelete": "Arquivo para apagar: %s", + "ExceptionDirectoryToDelete": "Diretório para apagar: %s", "ExceptionNonceMismatch": "Não conseguiria verificar a segurança tomada nesse modelo.", "ExceptionPrivilege": "Não pode aceder a este recurso uma vez que ele requer um acesso %s.", "ExceptionPrivilegeAccessWebsite": "Não pode aceder a este recurso uma vez que ele requer um acesso %s para o site id=%d.", @@ -174,6 +183,9 @@ "ExportAsImage": "Exportar como imagem", "ExportThisReport": "Exportar este conjunto de dados noutros formatos", "Faq": "FAQ", + "FileIntegrityWarning": "Verificação de integridade dos arquivos falhou e reportou alguns erros. Você deve corrigir esse problema e, então, atualizar essa página até que ela não mostre nenhum erro.", + "FileIntegrityWarningReupload": "Os erros abaixo podem ser devido a um envio parcial ou falho de arquivos do Piwik.", + "FileIntegrityWarningReuploadBis": "Tente reenviar todos os arquivos do Piwik em modo BINÁRIO.", "First": "Primeiro", "Flatten": "Achatar", "ForExampleShort": "ex.", @@ -229,6 +241,7 @@ "MultiSitesSummary": "Todos os sites", "Name": "Nome", "NbActions": "Número de Ações", + "NbInteractions": "Número de Interações", "NbSearches": "Número de Pesquisas internas", "NeedMoreHelp": "Precisa de mais ajuda?", "Never": "Nunca", @@ -284,6 +297,7 @@ "Password": "Senha", "Period": "Período", "Piechart": "Gráfico circular", + "PiwikIsACollaborativeProjectYouCanContributeAndDonateNextRelease": "%1$sPiwik%2$s é um projeto colaborativo trazido a você pelos membros da %7$s equipe Piwik%8$s, bem como por muitos outros colaboradores ao redor do mundo. Se você é um fã do Piwik, você pode ajudar: descubra %3$sComo participar do Piwik%4$s, ou %5$sdoe agora%6$s para ajudar a financiar o próximo grande lançamento do Piwik!", "PiwikXIsAvailablePleaseNotifyPiwikAdmin": "%1$s está disponível. Por favor notifique o %2$sadministrator Piwik%3$s.", "PiwikXIsAvailablePleaseUpdateNow": "Piwiki %1$s está disponível. %2$s Por favor atualize agora!%3$s (veja %4$sas mudanças%5$s).", "PleaseContactYourPiwikAdministrator": "Por favor, contate o administrador do Piwik.", @@ -356,6 +370,8 @@ "TimeAgo": "%s atrás", "TimeFormat": "Formato do horário", "TimeOnPage": "Tempo na página", + "ToDeleteAllDirectoriesRunThisCommand": "Para apagar todos estes diretórios de uma vez, você pode executar esse comando:", + "ToDeleteAllFilesRunThisCommand": "Para apagar todos estes arquivos de uma vez, você pode executar esse comando:", "Total": "Total", "TotalRatioTooltip": "Este é %1$s de todos os %2$s %3$s.", "TotalRevenue": "Total de Revendas", diff --git a/lang/tr.json b/lang/tr.json index 187d2853ee..74c8174528 100644 --- a/lang/tr.json +++ b/lang/tr.json @@ -26,6 +26,7 @@ "Cancel": "İptal", "CannotUnzipFile": "Zip'den çıkarılamıyor %1$s: %2$s", "ChangePassword": "Şifre değiştir", + "ChooseDate": "Tarih seçin, şuan seçilen tarih: %s", "ChooseLanguage": "Dil seçin", "ChoosePeriod": "Zaman aralığı seçin", "ClickHere": "Daha fazla bilgi için buraya tıklayın.", @@ -109,6 +110,7 @@ "EcommerceOrders": "ETicaret Siparişleri", "Edit": "Düzenle", "Error": "Hata", + "Errors": "Hatalar", "ExceptionConfigurationFileNotFound": "Yapılandırma dosyası {%s} bulunamadı.", "ExceptionDatabaseVersion": "Sizin %1$s versiyonunuz %2$s ama Piwik en az %3$s kabul eder.", "ExceptionFileIntegrity": "Bütünlük kontrolü başarısız: %s", @@ -375,6 +377,7 @@ "ReleaseToRefresh": "Yenilemek için bırakın...", "Reloading": "Yeniden yükleniyor...", "RequestTimedOutShort": "Ağ Zamanaşımı Hatası", + "RestrictedCompatibility": "Kısıtlı uyumluluk", "SaveSuccessError": "Piwik adresi veya kullanıcı adı ve şifre kombinasyonu yanlış.", "SearchWebsite": "Websitelerinde ara", "ShowAll": "Tümünü göster", @@ -384,6 +387,7 @@ "TryIt": "Dene!", "VerifyAccount": "Hesap Doğrulama", "ValidateSslCertificate": "SSL Sertifikasını Doğrula", + "VerifyLoginData": "Kullanıcı adı ve parolanın doğru olduğundan emin olun.", "YouAreOffline": "Üzgünüm, şu anda çevrimdışısınız" }, "RowEvolution": { diff --git a/plugins/Contents/lang/tr.json b/plugins/Contents/lang/tr.json index e444b82427..0a9f304036 100644 --- a/plugins/Contents/lang/tr.json +++ b/plugins/Contents/lang/tr.json @@ -2,6 +2,8 @@ "Contents": { "PluginDescription": "İçerik ve reklam izleme, sayfalarınızdaki herhangi bir içeriğin (reklam, görsel, herhangi bir öge) başarımının (görülme, tıklanma, CTR) izlenmesini sağlar.", "Impressions": "Görülme", + "ContentInteraction": "İçerik Etkileşimi", + "ContentInteractions": "İçerik Etkileşimleri", "InteractionRate": "Etkileşim Oranı", "ContentName": "İçerik Adı", "ContentPiece": "İçerik Parçası", diff --git a/plugins/CoreAdminHome/lang/de.json b/plugins/CoreAdminHome/lang/de.json index c29bcdc690..6fbf8a17e0 100644 --- a/plugins/CoreAdminHome/lang/de.json +++ b/plugins/CoreAdminHome/lang/de.json @@ -45,6 +45,7 @@ "JSTracking_TrackNoScript": "Benutzer mit deaktiviertem JavaScript tracken", "JSTracking_VisitorCustomVars": "Benutzerdefinierte Variable für diesen Besucher aufzeichnen", "JSTracking_VisitorCustomVarsDesc": "Zum Beispiel mit dem Variablennamen \"Typ\" und dem Wert \"Kunde\".", + "JSTracking_EndNote": "Hinweis: Sie können sich einen angepassten Tracking Code unter Einstellungen > %1$sTracking Code%2$s erzeugen.", "JSTrackingIntro1": "Es gibt viele verschiedene Möglichkeiten Besucher Ihrer Website zu tracken. Die empfohlene Art und Weise dies zu tun, ist die Verwendung von JavaScript. Um diese Methode zu nutzen müssen Sie sicher stellen, dass auf jeder Seite Ihrer Website ein JavaScript-Code eingebunden ist. Diesen können Sie hier generieren.", "JSTrackingIntro2": "Sobald Sie den JavaScript Tracking Code für Ihre Website haben, fügen Sie ihn auf allen Seiten ein, die Sie mit Piwik überwachen möchten.", "JSTrackingIntro3b": "Bei den meisten Webseiten, Blogs und CMS, etc. können Sie ein existierendes Plugin benutzen, das Ihnen die technische Arbeit abnimmt. (Schauen Sie hierzu in die %1$sListe der Plugins um Piwik zu integrieren%2$s.) Falls kein passendes Plugin besteht können Sie die Templates Ihrer Webseite bearbeiten und diesen Quellcode in den %lt;\/head>-Tag einfügen. Dieser ist häufig in einer 'header.php' oder header.tpl' oder ähnlich benannten Template-Datei definiert.", diff --git a/plugins/CoreAdminHome/lang/el.json b/plugins/CoreAdminHome/lang/el.json index 57ac255474..e24ee25c6e 100644 --- a/plugins/CoreAdminHome/lang/el.json +++ b/plugins/CoreAdminHome/lang/el.json @@ -45,6 +45,7 @@ "JSTracking_TrackNoScript": "Παρακολούθηση χρηστών με απενεργοποιημένη τη JavaScript", "JSTracking_VisitorCustomVars": "Παρακολούθηση προσαρμοσμένων μεταβλητών για αυτό τον επισκέπτη", "JSTracking_VisitorCustomVarsDesc": "Για παράδειγμα, με όνομα της μεταβλητής \"Τύπος\" και τιμή \"Πελάτης\".", + "JSTracking_EndNote": "Σημείωση: Μπορείτε να δημιουργήσετε προσαρμοσμένο κώδικα παρακολούθησης στο τμήμα διαχείρισης του %1$sΚώδικα Παρακολούθησης%2$s.", "JSTrackingIntro1": "Μπορείτε να παρακολουθείτε τους επισκέπτες στον ιστοτόπο σας με πολλούς διαφορετικούς τρόπους. Ο συνιστώμενος τρόπος είναι μέσω της JavaScript. Για να χρησιμοποιήσετε αυτή τη μέθοδο θα πρέπει να βεβαιωθείτε ότι κάθε σελίδα του ιστοτόπου σας έχει κάποιο κώδικα JavaScript, τον οποίο μπορείτε να δημιουργήσετε εδώ.", "JSTrackingIntro2": "Μόλις έχετε το JavaScript κώδικα παρακολούθησης για την ιστοσελίδα σας, αντιγράψετε και επικολλήστε τον σε όλες τις σελίδες που θέλετε να παρακολουθήσετε με το Piwik.", "JSTrackingIntro3b": "Στους περισσότερους ιστοτόπους, ιστολόγια, CMS, κτλ. μπορείτε να χρησιμοποιήσετε ένα προ-κατασκευασμένο πρόσθετο που θα εκτελεί την τεχνική εργασία για εσάς. (Δείτε τη %1$sλίστα των πρόσθετων για ενσωμάτωση με το Piwik%2$s.) Αν δεν υπάρχει πρόσθετο μπορείτε να επεξεργαστείτε τα αρχεία προτύπου του ιστοτόπου σας και να προσθέσετε τον κώδικα στη σήμανση <\/head> που συχνά ορίζεται στο αρχείο 'header.php', 'header.tpl' ή παρόμοιο αρχείο προτύπου.", diff --git a/plugins/CoreAdminHome/lang/pt-br.json b/plugins/CoreAdminHome/lang/pt-br.json index 1829bfe5bc..9ed3e637da 100644 --- a/plugins/CoreAdminHome/lang/pt-br.json +++ b/plugins/CoreAdminHome/lang/pt-br.json @@ -40,6 +40,7 @@ "JSTracking_MergeSubdomainsDesc": "Portanto se um visitante acessar %1$s e %2$s, ele será contado como visitante único.", "JSTracking_PageCustomVars": "Setar uma variável personalizada para cada exibição de página", "JSTracking_PageCustomVarsDesc": "Por exemplo, com variável de nome \"Categoria\" e valor \"White Papers\".", + "JSTracking_TrackNoScript": "Rastreia usuários com JavaScript desabilitado", "JSTracking_VisitorCustomVars": "Setar variáveis personalizadas para este visitante", "JSTracking_VisitorCustomVarsDesc": "Por exemplo, com nome da variável \"Tipo\" e valor \"Cliente\".", "JSTrackingIntro1": "Você pode rastrear os visitantes de seu site muitas maneiras diferentes. A maneira recomendada de fazer isso é através de JavaScript. Para usar este método, você deve se certificar de que cada página do seu site possui o código JavaScript que você pode gerar aqui.", diff --git a/plugins/CoreAdminHome/lang/sq.json b/plugins/CoreAdminHome/lang/sq.json index 8ac03ea920..a0cf52f8ea 100644 --- a/plugins/CoreAdminHome/lang/sq.json +++ b/plugins/CoreAdminHome/lang/sq.json @@ -45,6 +45,7 @@ "JSTracking_TrackNoScript": "Ndiqi përdoruesit me JavaScript të çaktivizuar", "JSTracking_VisitorCustomVars": "Ndiqni ndryshore vetjake për këtë vizitor", "JSTracking_VisitorCustomVarsDesc": "Për shembull, me emër ndryshoreje \"Lloj\" dhe vlerë \"Klient\".", + "JSTracking_EndNote": "Shënim: Te ndarja %1$sKod Ndjekjeje%2$s e përgjegjësit mund të prodhoni kod vetjak ndjekjesh.", "JSTrackingIntro1": "Vizitorët në sajtin tuaj mund t’i ndiqni në mjaft rrugë të ndryshme. Rruga e këshilluar për ta bërë është përmes JavaScript-it. Për të përdorur këtë metodë, duhet të garantoni që çdo faqe e sajtit tuaj të përmbajë një copëz kodi JavaScript, të cilin mund ta prodhoni nga këtu.", "JSTrackingIntro2": "Pasi të keni kodin JavaScript të ndjekjes për sajtin tuaj, kopjojeni dhe hidheni te krejt faqet që dëshironi të ndiqni me Piwik.", "JSTrackingIntro3b": "Në shumicën e sajteve, blogjeve, CMS-ve, etj. mund të përdorni shtojca të gatshme që do të bënin për ju punën teknike. (Shihni %1$slistën tonë të shtojcave të përdorura për të integruar Piwik-un%2$s.) Nëse nuk ka shtojcë të tillë, mund të përpunoni gjedhet e sajtit tuaj dhe të shtoni këtë kod te etiketa <\/head>, e cila shpesh përkufizohet brenda një kartele gjedhe 'header.php', 'header.tpl' ose të ngjashme.", diff --git a/plugins/CoreAdminHome/lang/zh-tw.json b/plugins/CoreAdminHome/lang/zh-tw.json index 3430c9a49a..86c3649ffc 100644 --- a/plugins/CoreAdminHome/lang/zh-tw.json +++ b/plugins/CoreAdminHome/lang/zh-tw.json @@ -45,6 +45,7 @@ "JSTracking_TrackNoScript": "追蹤已禁用 JavaScript 的訪客", "JSTracking_VisitorCustomVars": "為此訪客追蹤自訂變數", "JSTracking_VisitorCustomVarsDesc": "例如變數名稱為「類型」,值為「顧客」。", + "JSTracking_EndNote": "注意:你可以在管理中心的%1$s追蹤程式碼%2$s頁面中產生自訂的追蹤程式碼。", "JSTrackingIntro1": "你可以透過多種不同的方式追蹤你的網站訪客。推薦使用 JavaScript 的追蹤方式。要使用此方法必須先確定你網站中的每一頁都有一樣的 JavaScript 程式碼,你可以在這裡產生。", "JSTrackingIntro2": "當你有了網站的 JavaScript 追蹤程式碼,請複製並貼上到所有你想透過 Piwik 追蹤的頁面上。", "JSTrackingIntro3b": "多數的網站、部落格、CMS 等等。你可以使用一個預製的外掛來幫你做技術性的工作。(查看%1$s用來整合 Piwik 的外掛列表%2$s。)如果沒有看到你想要的外掛,你可以直接編輯網站的模板,並將程式碼貼到 <\/head> 標籤之前,通常出現在「header.php」、「header.tpl」等類似的模板檔案中。", diff --git a/plugins/CoreHome/lang/pt-br.json b/plugins/CoreHome/lang/pt-br.json index 35060bd57a..84a4df9462 100644 --- a/plugins/CoreHome/lang/pt-br.json +++ b/plugins/CoreHome/lang/pt-br.json @@ -5,6 +5,7 @@ "CheckForUpdates": "Verificar atualizações", "CheckPiwikOut": "Verificar saída do Piwik", "ClickToEditX": "Clique para editar %s", + "ClickToSeeFullInformation": "Clique para ver toda a informação", "CloseSearch": "Fechar busca", "CloseWidgetDirections": "Você pode fechar esta ferramenta clicando no ícone \"X\" na parte superior do widget.", "DataForThisReportHasBeenPurged": "Os dados para este relatório possuem mais de %s meses e foram excluídos.", @@ -49,6 +50,7 @@ "YouAreUsingTheLatestVersion": "Você está usando a última versão do Piwik!", "ClickRowToExpandOrContract": "Clique nesta linha para expandir ou contrair a subtabela.", "UndoPivotBySubtable": "Este relatório foi articulado %s desfazer articulação", + "NoSuchPage": "Esta página não existe", "PivotBySubtable": "Este relatório não foi articulado %1$s Articular por %2$s", "SystemSummaryWidget": "Resumo do Sistema", "SystemSummaryNWebsites": "%d websites", diff --git a/plugins/CoreHome/lang/zh-tw.json b/plugins/CoreHome/lang/zh-tw.json index fb56b7839d..848918f85f 100644 --- a/plugins/CoreHome/lang/zh-tw.json +++ b/plugins/CoreHome/lang/zh-tw.json @@ -14,7 +14,7 @@ "DataTableIncludeAggregateRows": "合計列已隱藏 %s 點擊顯示", "DataTableHowToSearch": "按下 Enter 鍵或點擊搜尋圖示來搜尋", "Default": "預設", - "DonateCall1": "使用 Piwik 永遠不花你任何一毛錢,但那不表示我們開發沒有花到錢。", + "DonateCall1": "使用 Piwik 永遠不花你任何一毛錢,但那不表示我們開發不需要花到半毛錢。", "DonateCall2": "Piwik 需要你的持續支持以成長茁壯。", "DonateCall3": "如果你覺得 Piwik 為你的事業或是奮鬥過程中增添了非凡的價值,%1$s請考慮捐助%2$s或是%3$s購買高級功能%4$s。每一分錢都是幫助。", "DonateFormInstructions": "使用滑桿來選擇數量,接著點擊 Subscribe 來捐助。", diff --git a/plugins/CorePluginsAdmin/lang/de.json b/plugins/CorePluginsAdmin/lang/de.json index 09b1f1cb1e..a1e0c9c9d5 100644 --- a/plugins/CorePluginsAdmin/lang/de.json +++ b/plugins/CorePluginsAdmin/lang/de.json @@ -37,6 +37,7 @@ "NoPluginSettings": "Es gibt keine Einstellungen dieser Erweiterung, die konfiguriert werden können", "Origin": "Quelle", "OriginCore": "Core", + "OriginOfficial": "Offiziell", "OriginThirdParty": "Dritt-Anbieter", "PluginHomepage": "Plugin-Website", "PluginNotCompatibleWith": "Das Plugin %1$s ist nicht kompatibel mit %2$s.", diff --git a/plugins/CorePluginsAdmin/lang/el.json b/plugins/CorePluginsAdmin/lang/el.json index 15bbccc1c1..84d4792a2f 100644 --- a/plugins/CorePluginsAdmin/lang/el.json +++ b/plugins/CorePluginsAdmin/lang/el.json @@ -37,6 +37,7 @@ "NoPluginSettings": "Δεν υπάρχουν ρυθμίσεις που μπορούν να παραμετροποιηθούν", "Origin": "Προέλευση", "OriginCore": "Πυρήνας", + "OriginOfficial": "Επίσημο", "OriginThirdParty": "Από τρίτες πηγές", "PluginHomepage": "Ιστοσελίδα πρόσθετου", "PluginNotCompatibleWith": "Το πρόσθετο %1$s δεν είναι συμβατό με το %2$s.", diff --git a/plugins/CorePluginsAdmin/lang/fr.json b/plugins/CorePluginsAdmin/lang/fr.json index a4683c5d31..c0957b7bbb 100644 --- a/plugins/CorePluginsAdmin/lang/fr.json +++ b/plugins/CorePluginsAdmin/lang/fr.json @@ -37,6 +37,7 @@ "NoPluginSettings": "Aucun paramètre de plugin ne peut être configuré", "Origin": "Origine", "OriginCore": "Principal", + "OriginOfficial": "Officiel", "OriginThirdParty": "Tierce-Partie", "PluginHomepage": "Page d'accueil du plugin", "PluginNotCompatibleWith": "Le composant %1$s n'est pas compatible avec %2$s.", diff --git a/plugins/CorePluginsAdmin/lang/sq.json b/plugins/CorePluginsAdmin/lang/sq.json index 3bc6306e4e..375bac5796 100644 --- a/plugins/CorePluginsAdmin/lang/sq.json +++ b/plugins/CorePluginsAdmin/lang/sq.json @@ -37,6 +37,7 @@ "NoPluginSettings": "S’ka rregullime shtojce që mund të formësohen", "Origin": "Origjina", "OriginCore": "Bazë", + "OriginOfficial": "Zyrtare", "OriginThirdParty": "Prej palësh të treta", "PluginHomepage": "Faqe Hyrëse e Shtojcës", "PluginNotCompatibleWith": "Shtojca %1$s s’është e përputhshme me %2$s.", diff --git a/plugins/CorePluginsAdmin/lang/zh-tw.json b/plugins/CorePluginsAdmin/lang/zh-tw.json index 7f6151bba2..6b475ed777 100644 --- a/plugins/CorePluginsAdmin/lang/zh-tw.json +++ b/plugins/CorePluginsAdmin/lang/zh-tw.json @@ -37,6 +37,7 @@ "NoPluginSettings": "沒有可以可以變更設定的外掛", "Origin": "來源", "OriginCore": "核心", + "OriginOfficial": "官方", "OriginThirdParty": "第三方", "PluginHomepage": "外掛首頁", "PluginNotCompatibleWith": "%1$s 個外掛和 %2$s 不相容。", diff --git a/plugins/CoreUpdater/lang/el.json b/plugins/CoreUpdater/lang/el.json index ce020be4c8..771bfea8b1 100644 --- a/plugins/CoreUpdater/lang/el.json +++ b/plugins/CoreUpdater/lang/el.json @@ -77,6 +77,7 @@ "YouCanUpgradeAutomaticallyOrDownloadPackage": "Μπορείτε να αναβαθμίσετε στην έκδοση %s αυτόματα ή λάβετε το πακέτο και εγκαταστήστε τη χειροκίνητα:", "YouMustDownloadPackageOrFixPermissions": "Το Piwik δεν μπορεί να αντικαταστήσει την υπάρχουσα εγκατάσταση. Μπορείτε να διορθώσετε τα δικαιώματα πρόσβασης των φακέλων\/αρχείων ή κατεβάστε το πακέτο και εγκαταστήστε την έκδοση %s χειροκίνητα.", "YourDatabaseIsOutOfDate": "Η βάση δεδομένων του Piwik είναι παλιά και πρέπει να αναβαθμιστεί προτού συνεχίσετε.", - "ViewVersionChangelog": "Δείτε τις αλλαγές για αυτή την έκδοση:" + "ViewVersionChangelog": "Δείτε τις αλλαγές για αυτή την έκδοση:", + "ReceiveEmailBecauseIsSuperUser": "Λαμβάνετε το e-mail επειδή είστε Υπερ-Χρήστης του Piwik στο: %s" } } \ No newline at end of file diff --git a/plugins/CoreUpdater/lang/fr.json b/plugins/CoreUpdater/lang/fr.json index ac9cf688cb..8adec2ba2f 100644 --- a/plugins/CoreUpdater/lang/fr.json +++ b/plugins/CoreUpdater/lang/fr.json @@ -77,6 +77,7 @@ "YouCanUpgradeAutomaticallyOrDownloadPackage": "Vous pouvez mettre à jour vers la version %s automatiquement ou télécharger l'archive et l'installer manuellement :", "YouMustDownloadPackageOrFixPermissions": "Piwik ne peut pas écraser votre installation courante. Vous pouvez soit corriger les permissions du répertoire\/fichier, soit télécharger le package et installer la version %s manuellement:", "YourDatabaseIsOutOfDate": "Votre base de données est expirée et doit être mise à jour avant de pouvoir continuer.", - "ViewVersionChangelog": "Voir les changements pour cette version :" + "ViewVersionChangelog": "Voir les changements pour cette version :", + "ReceiveEmailBecauseIsSuperUser": "Vous recevez ce courriel car vous êtes un super utilisateur de l'installation Piwik à l'adresse: %s" } } \ No newline at end of file diff --git a/plugins/CoreUpdater/lang/sq.json b/plugins/CoreUpdater/lang/sq.json index 2783cc9115..715382f57a 100644 --- a/plugins/CoreUpdater/lang/sq.json +++ b/plugins/CoreUpdater/lang/sq.json @@ -77,6 +77,7 @@ "YouCanUpgradeAutomaticallyOrDownloadPackage": "Mund ta përmirësoni automatikisht me versionin %s, ose të shkarkoni paketën dhe ta instaloni atë dorazi:", "YouMustDownloadPackageOrFixPermissions": "Piwik-u s’është në gjendje të mbishkruajë instalimin tuaj të tanishëm. Mundeni ose të ndreqni lejet mbi drejtorira\/kartela, ose të shkarkoni paketën dhe instaloni versionin %s dorazi:", "YourDatabaseIsOutOfDate": "Baza juaj e të dhënave për Piwik-un është e vjetruar, dhe duhet përmirësuar përpara se të mund të vazhdoni.", - "ViewVersionChangelog": "Shihni regjistër ndryshimesh për këtë version:" + "ViewVersionChangelog": "Shihni regjistër ndryshimesh për këtë version:", + "ReceiveEmailBecauseIsSuperUser": "E morët këtë email ngaqë jeni një Superpërdorues Piwik-u te: %s" } } \ No newline at end of file diff --git a/plugins/CoreUpdater/lang/zh-tw.json b/plugins/CoreUpdater/lang/zh-tw.json index e4aa286fd4..5c2599d25d 100644 --- a/plugins/CoreUpdater/lang/zh-tw.json +++ b/plugins/CoreUpdater/lang/zh-tw.json @@ -77,6 +77,7 @@ "YouCanUpgradeAutomaticallyOrDownloadPackage": "你可以自動更新至版本 %s ,或是下載壓縮檔並手動安裝它:", "YouMustDownloadPackageOrFixPermissions": "Piwik 無法覆寫你當前的安裝。你可以修改資料夾\/檔案權限,或是下載安裝包然後手動安裝版本 %s:", "YourDatabaseIsOutOfDate": "你的 Piwik 資料庫已經過期了,所以在繼續前必須先升級。", - "ViewVersionChangelog": "查看此版本的更新紀錄:" + "ViewVersionChangelog": "查看此版本的更新紀錄:", + "ReceiveEmailBecauseIsSuperUser": "你會收到這封信件是因為你在 %s 的 Piwik 上是超級使用者。" } } \ No newline at end of file diff --git a/plugins/CustomPiwikJs/lang/el.json b/plugins/CustomPiwikJs/lang/el.json index 7a3c1c1aaa..8e1eee2ce5 100644 --- a/plugins/CustomPiwikJs/lang/el.json +++ b/plugins/CustomPiwikJs/lang/el.json @@ -1,5 +1,6 @@ { "CustomPiwikJs": { + "PluginDescription": "Δίνει τη δυνατότητα σε κάθε πρόσθετο να επεκτείνει το αρχείο παρακολούθησης JavaScript (piwik.js) και παρέχει νέα λειτουργικότητα και δυνατότητες μετρήσεων στον ιστοτόπο.", "DiagnosticPiwikJsWritable": "Αρχείο παρακολούθησης JavaScript (\"\/piwik.js\")", "DiagnosticPiwikJsNotWritable": "Το αρχείο παρακολούθησης JavaScript \"\/piwik.js\" δεν είναι εγγράψιμο που σημαίνει ότι άλλα πρόσθετα δεν μπορούν να επεκτείνουν την κλάση παρακολούθησης. Στο μέλλον ορισμένα χαρακτηριστικά του πυρήνα δε θα δουλεύουν όπως πρέπει.", "DiagnosticPiwikJsMakeWritable": "Προτείνεται να κάνετε το αρχείο Piwik.js εγγράψιμο εκτελώντας αυτή την εντολή: %s" diff --git a/plugins/CustomPiwikJs/lang/fr.json b/plugins/CustomPiwikJs/lang/fr.json index 84853489f6..5d473f96a9 100644 --- a/plugins/CustomPiwikJs/lang/fr.json +++ b/plugins/CustomPiwikJs/lang/fr.json @@ -1,5 +1,6 @@ { "CustomPiwikJs": { + "PluginDescription": "Autorise n'importe quel composant à mettre à jour le fichier de suivit Piwik (Piwik.js) et à ajouter de nouvelles fonctionnalités ainsi que des capacités de suivit de site web.", "DiagnosticPiwikJsWritable": "Traceur JavaScript inscriptible (\"\/piwik.js\")", "DiagnosticPiwikJsNotWritable": "Le fichier du traceur JavaScript Piwik \"\/piwik.js\" ne peut pas être modifié ce qui signifie que les autres composants ne peuvent pas l'enrichir. A l'avenir même certaines fonctionnalités natives pourraient ne pas fonctionner comme prévu.", "DiagnosticPiwikJsMakeWritable": "Nous vous recommandons de permettre l'écriture de Piwik.js en exécutant la commande suivante : %s" diff --git a/plugins/CustomPiwikJs/lang/sq.json b/plugins/CustomPiwikJs/lang/sq.json index 018fd9dd7a..ecbaac3c89 100644 --- a/plugins/CustomPiwikJs/lang/sq.json +++ b/plugins/CustomPiwikJs/lang/sq.json @@ -1,5 +1,6 @@ { "CustomPiwikJs": { + "PluginDescription": "I lejon cilësdo shtojcë të zgjerojë kartelën Piwik JavaScript Tracking (piwik.js) dhe të shtojë aftësi të reja funksionimi dhe matjesh në sajt.", "DiagnosticPiwikJsWritable": "Ndjekës JavaScript i Shkrueshëm (\"\/piwik.js\")", "DiagnosticPiwikJsNotWritable": "Kartela e ndjekësit JavaScript të Piwik-ut, \"\/piwik.js\" s’është e shkrueshme, çka do të thotë se shtojcat e tjera s’mund ta zgjerojnë ndjekësin JavaScript. Në të ardhmen mund të mos punojnë siç pritet madje edhe disa veçori bazë.", "DiagnosticPiwikJsMakeWritable": "Këshillojmë bërjen e Piwik.js të shkrueshme, duke xhiruar urdhrin: %s" diff --git a/plugins/CustomPiwikJs/lang/zh-tw.json b/plugins/CustomPiwikJs/lang/zh-tw.json index 8771e2974e..ae73130274 100644 --- a/plugins/CustomPiwikJs/lang/zh-tw.json +++ b/plugins/CustomPiwikJs/lang/zh-tw.json @@ -1,5 +1,6 @@ { "CustomPiwikJs": { + "PluginDescription": "允許任何外掛擴展 Piwik JavaScript 追蹤檔案(piwik.js)來增加新功能和網站衡量能力。", "DiagnosticPiwikJsWritable": "可寫的 JavaScript 追蹤(\/piwik.js)", "DiagnosticPiwikJsNotWritable": "Piwik 的 JavaScript 追蹤檔案「\/piwik.js」不可寫入,這代表其他外掛無法擴展 JavaScript 追蹤。未來甚至有些核心功能會無法正常運作。", "DiagnosticPiwikJsMakeWritable": "我們推薦讓 Piwik.js 可寫入,請執行此指令:%s" diff --git a/plugins/Installation/lang/el.json b/plugins/Installation/lang/el.json index ddc14ca4ff..ff1d3e93d0 100644 --- a/plugins/Installation/lang/el.json +++ b/plugins/Installation/lang/el.json @@ -84,6 +84,7 @@ "SystemCheckGlobHelp": "Η εσωτερική συνάρτηση έχει απενεργοποιηθεί στον διακομιστή σας. Το Piwik θα προσπαθήσει να εξομοιώσει τη συνάρτηση αλλά ίσως να υπάρχουν επιπλέον περιορισμοί ασφαλείας. Η λειτουργικότητα μπορεί να επηρεαστεί.", "SystemCheckGzcompressHelp": "Πρέπει να ενεργοποιήσετε την επέκταση zlib και την συνάρτηση gzcompress.", "SystemCheckGzuncompressHelp": "Πρέπει να ενεργοποιήσετε την επέκταση zlib και την συνάρτηση gzuncompress.", + "SystemCheckHashHelp": "Θα πρέπει να παραμετροποιήσετε και να μεταγλωττίσετε πάλι την PHP με ενεργοποιημένη την υποστήριξη hash() παραλείποντας την επιλογή --disable-hash.", "SystemCheckIconvHelp": "Πρέπει να ρυθμίσετε και ξαναεγκαταστήσετε την PHP με ενεργοποιημένη την υποστήριξη «iconv», --with-iconv.", "SystemCheckJsonHelp": "Η επέκταση php5-json απαιτείται προκειμένου το Piwik να διαβάζει και γράφει δεδομένα σε μορφή JSON.", "SystemCheckMailHelp": "Τα μηνύματα με τις παρατηρήσεις σας και για τους Ξεχασμένους Κωδικούς δεν θα στέλνονται αν δεν είναι ενεργοποιημένη η συνάρτηση mail().", diff --git a/plugins/Installation/lang/fr.json b/plugins/Installation/lang/fr.json index 061b843ed6..43cd1b81d8 100644 --- a/plugins/Installation/lang/fr.json +++ b/plugins/Installation/lang/fr.json @@ -84,6 +84,7 @@ "SystemCheckGlobHelp": "Cette fonction native a été désactivée sur votre hôte. Piwik va tenter de l'émuler mais il pourra rencontrer des restrictions de sécurité. Les fonctionnalités pourront en être impactées.", "SystemCheckGzcompressHelp": "Vous devez activer l'extension zlib et la fonction gzcompress", "SystemCheckGzuncompressHelp": "Vous devez activer l'extension zlib et la fonction gzuncompress", + "SystemCheckHashHelp": "Vous devez reconfigurer et re-compiler PHP en avec le support de hash() activé en enlevant l'option --disable-hash.", "SystemCheckIconvHelp": "Vous devez configurer PHP et le recompiler avec le support \"iconv\" activé, --with-iconv.", "SystemCheckJsonHelp": "L'extension php5-json est nécéssaire pour lire et écrire des données au format JSON.", "SystemCheckMailHelp": "Les Feedback (commentaires) et mots de passe perdus ne pourront être envoyés sans la fonciton mail().", diff --git a/plugins/Installation/lang/sq.json b/plugins/Installation/lang/sq.json index 8a6eaae077..ba5e166ded 100644 --- a/plugins/Installation/lang/sq.json +++ b/plugins/Installation/lang/sq.json @@ -84,6 +84,7 @@ "SystemCheckGlobHelp": "Ky funksion i trupëzuar është i çaktivizuar te streha juaj. Piwik-u do të përpiqet ta emulojë këtë funksion por mund të hasë kufizime të mëtejshme sigurie. Kjo mund të ketë ndikim te funksionimi.", "SystemCheckGzcompressHelp": "Lypset të aktivizoni zgjerimin zlib dhe funksionin gzcompress.", "SystemCheckGzuncompressHelp": "Lypset të aktivizoni zgjerimin zlib dhe funksionin gzuncompress.", + "SystemCheckHashHelp": "Lypset të formësoni dhe rikrijoni PHP-në me mbulim të hash() të aktivizuar duke përjashtuar mundësinë --disable-hash.", "SystemCheckIconvHelp": "Lypset të formësoni dhe rindërtoni PHP-në me aktivizim të mbulimit të \"iconv\", --with-iconv.", "SystemCheckJsonHelp": "Zgjerimi php5-json është i domosdoshëm që Piwik-u të lexojë dhe shkruajë të dhëna JSON.", "SystemCheckMailHelp": "Mesazhet mbi Përshtypjet dhe Fjalëkalim të Humbur nuk kanë për t’u dërguar pa mail().", diff --git a/plugins/Installation/lang/zh-tw.json b/plugins/Installation/lang/zh-tw.json index bfd4089358..952c4cf2c4 100644 --- a/plugins/Installation/lang/zh-tw.json +++ b/plugins/Installation/lang/zh-tw.json @@ -84,6 +84,7 @@ "SystemCheckGlobHelp": "這個內建的功能已被你的主機商停用。Piwik 將嘗試模擬這個功能,但可能會遇到安全限制。功能可能受到影響。", "SystemCheckGzcompressHelp": "你必須啟用 zlib 擴充功能和 gzcompress 功能。", "SystemCheckGzuncompressHelp": "你必須啟用 zlib 擴充功能和 gzuncompress 功能。", + "SystemCheckHashHelp": "你必須配置並重建 PHP 經由執行 --disable-hash 選項來啟用 hash() 支援。", "SystemCheckIconvHelp": "你需要設定及重建 PHP,然後啟用 iconv 支援,--with-iconv。", "SystemCheckJsonHelp": "Piwik 要讀寫 JSON 檔案必須使用 php5-json 擴充功能。", "SystemCheckMailHelp": "意見回饋及忘記密碼的訊息若沒有 mail() 將無法寄送。", diff --git a/plugins/Marketplace/lang/el.json b/plugins/Marketplace/lang/el.json index affd65e572..e47634c476 100644 --- a/plugins/Marketplace/lang/el.json +++ b/plugins/Marketplace/lang/el.json @@ -103,6 +103,7 @@ "Updated": "Ενημερώθηκε", "UpdatingPlugin": "Γίνεται ενημέρωση του %1$s", "UploadZipFile": "Ανέβασμα του αρχείου ZIP", + "PluginUploadDisabled": "Η υποβολή πρόσθετου είναι απενεργοποιημένη στο αρχείο ρυθμίσεων. Προκειμένου να ενεργοποιήσετε το χαρακτηριστικό αυτό τροποποιήστε τις ρυθμίσεις σας ή επικοινωνήστε με τον διαχειριστή σας", "LicenseKeyExpiresSoon": "Η άδειά σας λήγει σύντομα, επικοινωνήστε με %1$s.", "LicenseKeyIsExpired": "Η άδειά σας έληξε, επικοινωνήστε με %1$s.", "MultiServerEnvironmentWarning": "Δεν μπορείτε να εγκαταστήσετε το πρόσθετο κατευθείαν, καθώς χρησιμοποιείτε το Piwik σε πολλαπλούς διακομιστές. Το πρόσθετο εγκαθίσταται σε ένα μόνο διακομιστή. Εναλλακτικά κατεβάστε το και εγκαταστήστε το χειροκίνητα σε όλους τους διακομιστές σας.", diff --git a/plugins/Marketplace/lang/fr.json b/plugins/Marketplace/lang/fr.json index a4bc8cf24e..3d467b9308 100644 --- a/plugins/Marketplace/lang/fr.json +++ b/plugins/Marketplace/lang/fr.json @@ -103,6 +103,7 @@ "Updated": "Mis à jour", "UpdatingPlugin": "Mise à jour de %1$s", "UploadZipFile": "Télécharger fichier ZIP", + "PluginUploadDisabled": "Le téléversement de composant est désactivé dans le fichier de configuration. Afin d'activer cette fonctionnalité, veuillez mettre à jour votre configuration ou contacter votre administrateur.", "LicenseKeyExpiresSoon": "Votre clef de licence expire bientôt, veuillez contacter %1$s.", "LicenseKeyIsExpired": "Votre clef de licence est expirée, veuillez contacter %1$s.", "MultiServerEnvironmentWarning": "Vous ne pouvez pas installer ou mettre à jour le composant directement car vous utilisez Piwik sur plusieurs serveurs. Ce composant serait installé sur un seul serveur. A la place téléchargez et déployez le composant manuellement sur tous les serveurs.", diff --git a/plugins/Marketplace/lang/sq.json b/plugins/Marketplace/lang/sq.json index cb1efb6021..61921f8a08 100644 --- a/plugins/Marketplace/lang/sq.json +++ b/plugins/Marketplace/lang/sq.json @@ -103,6 +103,7 @@ "Updated": "U përditësua", "UpdatingPlugin": "Po përditësohet %1$s", "UploadZipFile": "Ngarkoni kartelë ZIP", + "PluginUploadDisabled": "Ngarkimi i shtojcës është i çaktivizuar te kartela e formësimit. Që të mund të aktivizoni këtë veçori, ju lutemi, përditësoni formësimin tuaj ose lidhuni me përgjegjësin tuaj", "LicenseKeyExpiresSoon": "Kyçi juaj i licencës skadon së shpejti, ju lutemi, lidhuni me %1$s.", "LicenseKeyIsExpired": "Kyçi juaj i licencës ka skaduar, Ju lutemi, lidhuni me %1$s.", "MultiServerEnvironmentWarning": "S’mundeni ta instaloni apo përditësoni shtojcën drejtpërsëdrejti, ngaqë po përdorni Piwik-un në disa shërbyes. Shtojca do të duhej të instalohej vetëm në një shërbyes. Në vend të kësaj, shkarkojeni shtojcën dhe instalojeni dorazi te krejt shërbyesit tuaj.", diff --git a/plugins/Marketplace/lang/zh-tw.json b/plugins/Marketplace/lang/zh-tw.json index 9da6bfda08..e77a9bf605 100644 --- a/plugins/Marketplace/lang/zh-tw.json +++ b/plugins/Marketplace/lang/zh-tw.json @@ -103,6 +103,7 @@ "Updated": "已更新", "UpdatingPlugin": "更新 %1$s 中", "UploadZipFile": "上傳 ZIP 檔案", + "PluginUploadDisabled": "外掛上傳已在設定檔案中停用。要啟用這項功能請更新你的配置或聯絡你的管理員。", "LicenseKeyExpiresSoon": "你的註冊碼即將過期,請聯絡 %1$s。", "LicenseKeyIsExpired": "你的註冊碼已過期,請聯絡 %1$s。", "MultiServerEnvironmentWarning": "你在多伺服器中使用 Piwik,因此無法直接安裝或更新外掛。外掛只能在單一伺服器中安裝。請手動下載外掛並部屬到所有伺服器中。", diff --git a/plugins/SitesManager/lang/cs.json b/plugins/SitesManager/lang/cs.json index a5d61bfdbf..49aa48194f 100644 --- a/plugins/SitesManager/lang/cs.json +++ b/plugins/SitesManager/lang/cs.json @@ -69,9 +69,7 @@ "SiteSearchUse": "Piwik můžete použít ke sledování a hlášení toho, co návštěvníci hledají pomocí interního vyhledávače.", "SiteWithoutDataTitle": "Zatím nebyla zaznamenána žádná data", "SiteWithoutDataDescription": "Pro tuto stránku nebyla zatím zaznamenána žádná analytická data.", - "SiteWithoutDataSetupTracking": "Nastavte prosím %1$sJavaScript sledovací kód%2$s na svém webu, pokud jste tak již neučinili.", "SiteWithoutDataMessageDisappears": "Tato zpráva zmizí jakmile dojde k nahrání nějakých dat pro tento web.", - "SiteWithoutDataSetupGoals": "Mezitím byste možná chtěli %1$snastavit nějaké cíle%2$s.", "SuperUserAccessCan": "Uživatel se super-uživatelským přístupem může také %1$sspecifikovat globální nastavení%2$s pro nové weby.", "Timezone": "Časová zóna", "TrackingSiteSearch": "Sledování interního vyhledávání na stránkách", diff --git a/plugins/SitesManager/lang/de.json b/plugins/SitesManager/lang/de.json index 86de40f710..2cf854456e 100644 --- a/plugins/SitesManager/lang/de.json +++ b/plugins/SitesManager/lang/de.json @@ -44,8 +44,10 @@ "ListOfIpsToBeExcludedOnAllWebsites": "Die untenstehenden IPs werden auf allen Websites ignoriert.", "ListOfQueryParametersToBeExcludedOnAllWebsites": "Die untenstehenden GET-Parameter werden von allen URLs aller Websites ignoriert.", "ListOfQueryParametersToExclude": "Geben Sie die Liste der URL Query Parameter an, einen pro Zeile, um sie von der URL Berichtsseite auszuschliessen. Reguläre Ausdrücke so wie %s werden unterstützt.", + "LogAnalytics": "Log-Analyse", "MainDescription": "Ihre Webanalyse benötigt Websites! Websites können hinzugefügt, aktualisiert und gelöscht werden. Hier wird auch der JavaScript-Code gezeigt, der in Ihre Websites eingefügt werden muss.", "MenuManage": "Verwalten", + "MobileAppsAndSDKs": "Mobile Anwendungen und SDKs", "NotAnEcommerceSite": "Dies ist keine Ecommerce Seite", "NotFound": "Keine Websites gefunden für", "NoWebsites": "Es ist noch keine Website zum administrieren vorhanden.", @@ -69,9 +71,8 @@ "SiteSearchUse": "Piwik kann auswerten, wonach Besucher in der internen Suche der Website suchen.", "SiteWithoutDataTitle": "Bisher wurden keine Daten aufgezeichnet", "SiteWithoutDataDescription": "Für diese Website wurden bisher noch keine Analysedaten aufgezeichnet.", - "SiteWithoutDataSetupTracking": "Bitte fügen Sie den %1$sJavaScript Tracking Code%2$s auf ihrer Website ein, insofern Sie dies noch nicht getan haben.", + "SiteWithoutDataSetupTracking": "Bitte fügen Sie den folgenden %1$sTracking Code%2$s auf ihrer Website ein, insofern Sie dies noch nicht getan haben.", "SiteWithoutDataMessageDisappears": "Diese Nachricht wird verschwinden sobald die ersten Daten für diese Website aufgezeichnet wurden.", - "SiteWithoutDataSetupGoals": "In den Zwischenzeit können Sie bereits %1$sZiele aufsetzen%2$s.", "SuperUserAccessCan": "Ein Nutzer mit Hauptadministrator-Berechtigung kann ebenfalls %1$sglobale Einstellungen%2$s für neue Websites vornehmen.", "Timezone": "Zeitzone", "TrackingSiteSearch": "Die interne Suche auswerten", diff --git a/plugins/SitesManager/lang/el.json b/plugins/SitesManager/lang/el.json index 79e1564ce7..ac0012afa4 100644 --- a/plugins/SitesManager/lang/el.json +++ b/plugins/SitesManager/lang/el.json @@ -44,8 +44,12 @@ "ListOfIpsToBeExcludedOnAllWebsites": "Οι παρακάτω διευθύνσεις IP θα αποκλειστούν από την ανίχνευση σε όλες τις ιστοσελίδες.", "ListOfQueryParametersToBeExcludedOnAllWebsites": "Οι παράμετροι Ερωτήματος URLs παρακάτω θα αποκλειστούν από URLs σε όλες τις ιστοσελίδες.", "ListOfQueryParametersToExclude": "Εισάγετε τη λίστα των παραμέτρων ερωτήματος στη διεύθυνση URL, μία ανά γραμμή, για να μη συμπεριληφθούν στις Αναφορές Σελίδων Διευθύνσεων URL. Κανονικές εκφράσεις όπως %s υποστηρίζονται.", + "LogAnalytics": "Ημερολόγιο Αναλυτικών", + "LogAnalyticsDescription": "Αν η μέθοδος με Javascript δεν είναι δυνατή, μπορείτε να %1$sχρησιμοποιήσετε το ημερολόγιο αναλυτικών του διακομιστή%2$s ως εναλλακτική μέθοδο για την παρακολούθηση των χρηστών του ιστοτόπου σας.", "MainDescription": "Το σύστημα αναλυτικών αναφορών χρειάζεται ιστοσελίδες! Προσθέστε, ενημερώστε, διαγράψτε ιστοσελίδες και εμφανίστε τον κώδικα Javascript που θα εισαχθεί στις ιστοσελίδες σας.", "MenuManage": "Διαχείριση", + "MobileAppsAndSDKs": "Εφαρμογές και SDK για κινητά", + "MobileAppsAndSDKsDescription": "Δεν παρακολουθείτε ένα ιστοτόπο; Μπορείτε εναλλακτικά να παρακολουθείτε μια εφαρμογή για κινητά ή οποιοδήποτε άλλο τύπο εφαρμογής με χρήση ενός από τα %1$sδιαθέσιμα SDK%2$s.", "NotAnEcommerceSite": "Δεν είναι ιστοσελίδα Ηλεκτρονικού Εμπορίου", "NotFound": "Δεν βρέθηκαν ιστοσελίδες για", "NoWebsites": "Δεν έχετε κάποια ιστοσελίδα για να διαχειριστείτε.", @@ -69,9 +73,9 @@ "SiteSearchUse": "Μπορείτε να χρησιμοποιήσετε το Piwik για να παρακολουθείτε και να έχετε αναφορές για το τι ψάχνουν οι επισκέπτες στην εσωτερική μηχανή αναζήτησης της ιστοσελίδας σας.", "SiteWithoutDataTitle": "Δεν έχουν καταγραφεί ακόμη δεδομένα", "SiteWithoutDataDescription": "Δεν έχουν ακόμη καταγραφεί δεδομένα αναλυτικών για τον ιστοτόπο αυτόν ακόμη.", - "SiteWithoutDataSetupTracking": "Παρακαλώ εισάγετε τον %1$sκώδικα παρακολούθησης JavaScript%2$s για τον ιστοτόπο σας αν δεν το έχετε ήδη κάνει.", + "SiteWithoutDataSetupTracking": "Κάντε ορισμό του %1$sκώδικα παρακολούθησης%2$s στον ιστοτόπο σας ή στην εφαρμογή για κινητά αν δεν το έχετε ήδη κάνει.", "SiteWithoutDataMessageDisappears": "Το μήνυμα θα εξαφανιστεί με το που θα καταχωρηθούν δεδομένα παρακολούθησης για τον ιστοτόπο αυτό.", - "SiteWithoutDataSetupGoals": "Στο μεταξύ, μπορεί να θέλετε να %1$sορίσετε μερικούς στόχους%2$s.", + "SiteWithoutDataSetupGoals": "Εν τω μεταξύ, μπορείτε να %1$sορίσετε ορισμένους στόχους%2$s ή να μάθετε περισσότερα σχετικά με τα %3$sχαρακτηριστικά%4$s του Piwik σε ένα από τους %5$sοδηγούς%6$s μας ή τις %7$sσυχνές ερωτήσεις-απαντήσεις%8$s.", "SuperUserAccessCan": "Ένας χρήστης με πρόσβαση Υπερ Χρήστη μπορεί επίσης να %1$s ορίσει τις καθολικές παραμέτρους%2$s για νέους ιστοτόπους.", "Timezone": "Ζώνη ώρας", "TrackingSiteSearch": "Καταγραφή Εσωτερικής Αναζήτησης Ιστοσελίδας", diff --git a/plugins/SitesManager/lang/es.json b/plugins/SitesManager/lang/es.json index 287bc19613..a3876f7c29 100644 --- a/plugins/SitesManager/lang/es.json +++ b/plugins/SitesManager/lang/es.json @@ -69,9 +69,7 @@ "SiteSearchUse": "Puede utilizar Piwik para rastrear y obtener un informe que es lo que están buscando sus visitantes en el motor de búsqueda interno de su sitio de internet.", "SiteWithoutDataTitle": "Aun no se han grabado datos", "SiteWithoutDataDescription": "Aun no se han registrado datos analíticos para este sitio de internet.", - "SiteWithoutDataSetupTracking": "Por favor configure el %1$scódigo de rastreo Javascript%2$s en su sitio de internet si ya no lo ha hecho.", "SiteWithoutDataMessageDisappears": "Este mensaje desaparecerá tan pronto como algún dato sea rastreado en este sitio de internet.", - "SiteWithoutDataSetupGoals": "Mientras tanto, tal vez le gustaría %1$sestablecer algunas metas%2$s.", "SuperUserAccessCan": "Un usuario con acceso Super Usuario también puede %1$s especificar la configuración global%2$s para nuevos sitios web.", "Timezone": "Zona Horaria", "TrackingSiteSearch": "Seguimiento en el Buscador interno del sitio", diff --git a/plugins/SitesManager/lang/fr.json b/plugins/SitesManager/lang/fr.json index c96c2105c8..fba6d2784c 100644 --- a/plugins/SitesManager/lang/fr.json +++ b/plugins/SitesManager/lang/fr.json @@ -46,6 +46,7 @@ "ListOfQueryParametersToExclude": "Entrez la liste de vos paramètres d'URL à exclure des rapports d'URL de page, un par ligne. Les expressions régulières comme %s sont supportées.", "MainDescription": "Piwik a besoin de sites pour générer des rapports ! Ajoutez, éditez et supprimez des sites, et voyez le code JavaScript à inclure dans vos pages.", "MenuManage": "Gérer", + "MobileAppsAndSDKs": "Applications mobiles et SDKs", "NotAnEcommerceSite": "N'est pas un site d'e-commerce", "NotFound": "Aucun site trouvé pour", "NoWebsites": "Vous n'avez aucun site Internet à administrer.", @@ -69,9 +70,7 @@ "SiteSearchUse": "Vous pouvez utiliser Piwik pour suivre et effectuer un rapport sur ce que vos visiteurs cherchent sur le moteur de recherche interne de votre site web.", "SiteWithoutDataTitle": "Aucune donnée enregistrée pour le moment", "SiteWithoutDataDescription": "Aucune donnée d'analyse n'a été enregistrée pour ce site pour le moment.", - "SiteWithoutDataSetupTracking": "Veuillez configurer le %1$scode de suivit JavaScript%2$s sur votre site web si vous ne l'avez pas déjà fait.", "SiteWithoutDataMessageDisappears": "Ce message disparaitra dès lors que certaines données auront été enregistrées pour ce site web.", - "SiteWithoutDataSetupGoals": "Pendant ce temps, peut-être voudriez-vous %1$sdéfinir des objectifs%2$s.", "SuperUserAccessCan": "Un utilisateur avec un accès super utilisateur peut aussi %1$sconfigurer les paramètres globaux%2$s pour les nouveaux sites web.", "Timezone": "Fuseau horaire", "TrackingSiteSearch": "Suivi de la recherche interne sur le site", diff --git a/plugins/SitesManager/lang/it.json b/plugins/SitesManager/lang/it.json index a74de97bd2..f2b46bc947 100644 --- a/plugins/SitesManager/lang/it.json +++ b/plugins/SitesManager/lang/it.json @@ -69,9 +69,7 @@ "SiteSearchUse": "È possibile utilizzare Piwik per monitorare e creare dei report su ciò che i visitatori stanno cercando nel motore di ricerca interno del tuo sito web.", "SiteWithoutDataTitle": "Non è stato ancora registrato alcun dato", "SiteWithoutDataDescription": "Per questo sito non sono ancora stati tracciati dati statistici.", - "SiteWithoutDataSetupTracking": "Si prega di impostare il %1$sCodice di Tracciamento JavaScript%2$s sul tuo sito, se già non lo hai fatto.", "SiteWithoutDataMessageDisappears": "Questo messaggio scomparirà non appena dei dati di questo sito saranno raccolti.", - "SiteWithoutDataSetupGoals": "Nel frattempo, può essere che tu voglia %1$simpostare alcuni goal%2$s.", "SuperUserAccessCan": "Un utente con accesso Super User può anche %1$sspecificare le impostazioni globali%2$s per i nuovi siti.", "Timezone": "Fuso orario", "TrackingSiteSearch": "Tracciamento Ricerca Interna Sito", diff --git a/plugins/SitesManager/lang/ja.json b/plugins/SitesManager/lang/ja.json index 031deb101c..a0e13a643c 100644 --- a/plugins/SitesManager/lang/ja.json +++ b/plugins/SitesManager/lang/ja.json @@ -69,9 +69,7 @@ "SiteSearchUse": "Piwik を利用して、ビジターがウェブサイトの内部検索エンジンで検索しているものを追跡およびレポートすることができます。", "SiteWithoutDataTitle": "まだデータは記録されていません", "SiteWithoutDataDescription": "まだこのウエブサイトの分析データは追跡されていません。", - "SiteWithoutDataSetupTracking": "まだ行っていない場合は、ウェブサイトで %1$sJavaScriptトラッキングコード%2$s を設定してください。", "SiteWithoutDataMessageDisappears": "このメッセージは、このウェブサイトの一部のデータが追跡されるとすぐに消えます。", - "SiteWithoutDataSetupGoals": "一方で、おそらくいくつかの%1$s目標を設定したい%2$sと思われるでしょう。", "SuperUserAccessCan": "スーパーユーザーアクセス権限を持つユーザーは、新しいウェブサイトに対し %1$s グローバルリストを指定 %2$s することもできます。", "Timezone": "タイムゾーン", "TrackingSiteSearch": "サイト内検索のトラッキング", diff --git a/plugins/SitesManager/lang/ko.json b/plugins/SitesManager/lang/ko.json index 669131a57a..87821e980c 100644 --- a/plugins/SitesManager/lang/ko.json +++ b/plugins/SitesManager/lang/ko.json @@ -68,9 +68,7 @@ "SiteSearchUse": "당신은 Piwik를 사용하여 웹사이트의 내부검색 엔진에서 방문자가 어떤 검색을 했는지 추적하고 보고받을 수 있습니다.", "SiteWithoutDataTitle": "아직 아무런 데이터가 기록되지 않았습니다.", "SiteWithoutDataDescription": "아직 해당 사이트를 추적하여 분석한 데이터가 없습니다.", - "SiteWithoutDataSetupTracking": "만약 %1$s자바스크립트 추적 코드%2$s를 당신의 웹사이트에 설정하지 않았다면 이를 수행해주세요.", "SiteWithoutDataMessageDisappears": "이 글귀는 해당 웹사이트에서 데이터가 추적되어지는 즉시 사라질 것이다.", - "SiteWithoutDataSetupGoals": "한편, 당신은 %1$s목표 설정%2$s을 하고 싶을 것이다.", "SuperUserAccessCan": "슈퍼 유저는 새로운 사이트에 대해서 %1$s일반 웹사이트 설정%2$s을 통해 관리할 수 있습니다.", "Timezone": "시간대", "TrackingSiteSearch": "사이트 내부 검색 추적", diff --git a/plugins/SitesManager/lang/nb.json b/plugins/SitesManager/lang/nb.json index 834816e971..29c2f2a133 100644 --- a/plugins/SitesManager/lang/nb.json +++ b/plugins/SitesManager/lang/nb.json @@ -67,9 +67,7 @@ "SiteSearchUse": "Du kan bruke Piwik for å spore og rapportere hva besøkere søker etter i ditt nettsteds interne søkemotor.", "SiteWithoutDataTitle": "Ingen data har blitt samlet inn ennå", "SiteWithoutDataDescription": "Ingen analysedata har blitt sporet for dette nettstedet ennå.", - "SiteWithoutDataSetupTracking": "Vennligst sett opp %1$sJavaScript-sporingskoden%2$s på ditt nettsted hvis du ikke har gjort det allerede.", "SiteWithoutDataMessageDisappears": "Denne meldingen vil forsvinne så snart noe data har blitt registrert for dette nettstedet.", - "SiteWithoutDataSetupGoals": "I mellomtiden vil du kanskje %1$ssette opp noen mål%2$s.", "SuperUserAccessCan": "En bruker med superbrukertilgang kan også %1$s spesifisere globale innstillinger%2$s for nye nettsteder.", "Timezone": "Tidssone", "TrackingSiteSearch": "Sporer interne nettstedssøk", diff --git a/plugins/SitesManager/lang/nl.json b/plugins/SitesManager/lang/nl.json index 6828ce5ef9..855f878c4b 100644 --- a/plugins/SitesManager/lang/nl.json +++ b/plugins/SitesManager/lang/nl.json @@ -65,9 +65,7 @@ "SiteSearchUse": "Je kan Piwik gebruiken om te volgen en te rapporteren wat bezoekers via de interne zoekmachine op je website zoeken.", "SiteWithoutDataTitle": "Er zijn nog geen gegevens geregistreerd", "SiteWithoutDataDescription": "Er is nog geen analytics data voor deze website bijgehouden.", - "SiteWithoutDataSetupTracking": "Voeg %1$sJavaScript tracking code%2$s toe aan je website, wanneer je dit nog niet hebt gedaan.", "SiteWithoutDataMessageDisappears": "Deze melding zal verdwijnen wanneer er wat data voor deze website is ontvangen.", - "SiteWithoutDataSetupGoals": "In de tussen tijd, mischien wil je een aantal doelen%2$s opzettens%1$s.", "SuperUserAccessCan": "Een gebruiker met Super User rechten kan ook %1$s de globale instellingen specificeren%2$s voor nieuwe websites.", "Timezone": "Tijdzone", "TrackingSiteSearch": "Interne site zoekmachine bijhouden.", diff --git a/plugins/SitesManager/lang/pt-br.json b/plugins/SitesManager/lang/pt-br.json index 3401df4a6e..31e6cd5e56 100644 --- a/plugins/SitesManager/lang/pt-br.json +++ b/plugins/SitesManager/lang/pt-br.json @@ -68,9 +68,7 @@ "SiteSearchUse": "Você pode utilizar o Piwik para acompanhar e informar o que os visitantes estão procurando no motor de pesquisa interna do seu site.", "SiteWithoutDataTitle": "Ainda não há dados gravados", "SiteWithoutDataDescription": "Ainda não há dados de análises de rastreamentos para este website", - "SiteWithoutDataSetupTracking": "Por favor, configure o %1$scódigo de rastreamento JavaScript%2$s em seu website, caso ainda não tenha feito.", "SiteWithoutDataMessageDisappears": "Esta mensagem vai desaparecer assim que alguns dados foram rastreados para este site.", - "SiteWithoutDataSetupGoals": "Por enquanto, talvez você queira %1$sdefinir algumas metas%2$s.", "SuperUserAccessCan": "Um usuário com privilégio de Super Usuário também pode %1$s especificar configurações globais%2$s para novos sites.", "Timezone": "Fuso horário", "TrackingSiteSearch": "Acompanhamento de pesquisa interna do site", diff --git a/plugins/SitesManager/lang/sq.json b/plugins/SitesManager/lang/sq.json index 118ca7a9ef..172bd50d14 100644 --- a/plugins/SitesManager/lang/sq.json +++ b/plugins/SitesManager/lang/sq.json @@ -44,8 +44,12 @@ "ListOfIpsToBeExcludedOnAllWebsites": "IP-të më poshtë do të përjashtohen nga ndjekja në krejt sajtet.", "ListOfQueryParametersToBeExcludedOnAllWebsites": "Parametrat për URL-ra Kërkesash më poshtë do të përjashtohen nga URL-të për krejt sajtet.", "ListOfQueryParametersToExclude": "Jepni listën e Parametrave URL Query, një për rresht, që duhen përjashtuar nga raportet URL Faqesh. Mbulohen shprehje të rregullta si %s.", + "LogAnalytics": "Analiza Regjistri", + "LogAnalyticsDescription": "Nëse metoda Javascript e gjurmimeve s’është e mundur, si metodë alternative për gjurmimin e përdoruesve të sajtit tuaj mund të %1$spërdorni analizat e regjistrit të shërbyesit%2$s.", "MainDescription": "Raportet tuaja Analizash Web lypin sajte! Shtoni, përditësoni, hiqni sajte, dhe shfaqni JavaScript-in për futje në faqet tuaja.", "MenuManage": "Administroni", + "MobileAppsAndSDKs": "Aplikacione dhe SDK-ra për celular", + "MobileAppsAndSDKsDescription": "S’ndiqni ndonjë sajt? Mundeni të ndiqni një aplikacion për celular, ose çfarëdo lloj tjetër aplikacioni që përdor një nga %1$sSDK-të e gatshme%2$s.", "NotAnEcommerceSite": "Jo sajt E-tregtie", "NotFound": "S’u gjetën sajte për", "NoWebsites": "S’keni ndonjë sajt për ta administruar.", @@ -69,9 +73,9 @@ "SiteSearchUse": "Mund ta përdorni Piwik-un për të ndjekur dhe raportuar se çfarë kërkojnë vizitorët me motorin e kërkimeve të brendshme në sajtin tuaj .", "SiteWithoutDataTitle": "Ende s’ka të dhëna të regjistruara", "SiteWithoutDataDescription": "Për këtë sajt s’janë ndjekur ende të dhëna analitike.", - "SiteWithoutDataSetupTracking": "Ju lutemi, rregulloni te sajti juaj %1$skodin e ndjekjeve JavaScript%2$s, nëse s’e keni bërë tashmë.", + "SiteWithoutDataSetupTracking": "Ju lutemi, rregulloni më poshtë %1$skodin e gjurmimit%2$s për sajtin apo aplikacionin tuaj për celular, po qe se s’e keni bërë ende.", "SiteWithoutDataMessageDisappears": "Ky mesazh do të zhduket sapo të ketë ndoca të dhëna të ndjekura për këtë sajt.", - "SiteWithoutDataSetupGoals": "Ndoshta mund të donit, ndërkohë, të %1$scaktoni ndonjë objektiv%2$s.", + "SiteWithoutDataSetupGoals": "Ndërkohë, mund të donit ndoshta të %1$scaktoni ndonjë objektiv global%2$s ose të mësoni më tepër rreth %3$sveçorive%4$s të Piwik-ut, në një nga %5$sudhërrëgyesit%6$s tanë apo %7$sFAQ%8$s.", "SuperUserAccessCan": "Një përdorues me hyrje Superpërdoruesi mundet gjithashtu %1$s të caktojë rregullime të përgjithshme%2$s për sajte të rinj.", "Timezone": "Zonë kohore", "TrackingSiteSearch": "Ndjekje Kërkimesh Brenda Sajti", diff --git a/plugins/SitesManager/lang/sr.json b/plugins/SitesManager/lang/sr.json index cbeb9a658e..07bf1d1ffe 100644 --- a/plugins/SitesManager/lang/sr.json +++ b/plugins/SitesManager/lang/sr.json @@ -68,9 +68,7 @@ "SiteSearchUse": "Možete koristiti Piwik za praćenje i kreiranje izveštaja o tome šta posetioci traže na vašem sajtu koristeći polje za pretragu.", "SiteWithoutDataTitle": "Nikakvi podaci do sad nisu zabeleženi", "SiteWithoutDataDescription": "Još uvek nema analitičkih podataka za ova sajt.", - "SiteWithoutDataSetupTracking": "Molimo vas da postavite %1$sJavaScript kod za praćenje%2$s na vaš sajt ukoliko to već niste učinili.", "SiteWithoutDataMessageDisappears": "Ova poruka će nestati čim se zabeleži neki saobraćaj na sajtu.", - "SiteWithoutDataSetupGoals": "U međuvremenu možete da %1$spostavite neke ciljeve %2$s.", "SuperUserAccessCan": "Korisnik sa superkorisničkim nivoom pristupa može i da %1$spostavi globalna podešavanja%2$s za nove sajtove.", "Timezone": "Vremenska zona", "TrackingSiteSearch": "Praćenje pretraživanja sajta", diff --git a/plugins/SitesManager/lang/sv.json b/plugins/SitesManager/lang/sv.json index c32bf9cc29..64ab73b9aa 100644 --- a/plugins/SitesManager/lang/sv.json +++ b/plugins/SitesManager/lang/sv.json @@ -66,9 +66,7 @@ "SiteSearchUse": "Du kan använda Piwik för att spåra och rapportera om vad besökarna söker efter med din webbplats interna sökmotor.", "SiteWithoutDataTitle": "Inga data har samlats in än", "SiteWithoutDataDescription": "Inga data har samlats in för denna webbplats än.", - "SiteWithoutDataSetupTracking": "Vänligen konfigurera %1$sJavaScript spårningskoden%2$s på din webbplats om du inte redan har gjort det.", "SiteWithoutDataMessageDisappears": "Detta meddelande kommer visas tills data samlats in för denna webbsida.", - "SiteWithoutDataSetupGoals": "Under tiden kanske du vill %1$ssätta upp några mål%2$s.", "SuperUserAccessCan": "En användare med Superbehörighet kan också %1$s specificera globala inställningar%2$s för nya webbsidor.", "Timezone": "Tidszon", "TrackingSiteSearch": "Spåra webbplatsens interna sökfunktion", diff --git a/plugins/SitesManager/lang/uk.json b/plugins/SitesManager/lang/uk.json index 7d7073dbed..3b7d862150 100644 --- a/plugins/SitesManager/lang/uk.json +++ b/plugins/SitesManager/lang/uk.json @@ -69,9 +69,7 @@ "SiteSearchUse": "Ви можете використовувати Piwik для відстеження та відображення аналітики по тому, що шукають відвідувачі на вашому сайті використовуючи функціонал для внутрішнього пошуку по сайту.", "SiteWithoutDataTitle": "Ще ніякі дані не були записані", "SiteWithoutDataDescription": "Немає даних аналітики що відстежувалися на цьому сайті.", - "SiteWithoutDataSetupTracking": "Будь ласка, налаштуйте %1$sJavaScript код відстеження%2$s на вашому сайті, якщо ви цього не зробили раніше.", "SiteWithoutDataMessageDisappears": "Це повідомлення зникне, як тільки перші дані отримаються на цей сайт.", - "SiteWithoutDataSetupGoals": "У той же час, може бути, ви хотіли б %1$sвстановити деякі цілі%2$s.", "SuperUserAccessCan": "Користувач з правами суперкористувача може також %1$sвказати загальні налаштування%2$s для нових веб-сайтів.", "Timezone": "Часовий пояс", "TrackingSiteSearch": "Відстежувати внутрішній пошук по сайту", diff --git a/plugins/SitesManager/lang/zh-tw.json b/plugins/SitesManager/lang/zh-tw.json index 7ddbbcb304..837f3f2508 100644 --- a/plugins/SitesManager/lang/zh-tw.json +++ b/plugins/SitesManager/lang/zh-tw.json @@ -44,8 +44,12 @@ "ListOfIpsToBeExcludedOnAllWebsites": "以下的 IP 位址將會被所有網站排除。", "ListOfQueryParametersToBeExcludedOnAllWebsites": "以下的網址查詢參數將會被所有網站排除。", "ListOfQueryParametersToExclude": "輸入網址查詢參數列表,一行一個,將從網頁網址報表中被排除。支援正規表示式如 %s。", + "LogAnalytics": "紀錄檔分析", + "LogAnalyticsDescription": "如果無法使用 Javascript 來追蹤,你可以改用%1$s伺服器紀錄檔追蹤%2$s的方式來追蹤你的網站使用者。", "MainDescription": "你的網站分析報告需要網站!新增、更新或刪除網站,並顯示 JavaScript 追蹤程式碼插入在你的網頁之中。", "MenuManage": "管理", + "MobileAppsAndSDKs": "行動應用程式和 SDK", + "MobileAppsAndSDKsDescription": "不是追蹤網站?你也可以使用%1$s可用的 SDK%2$s 來追蹤行動應用程式或任何應用程式。", "NotAnEcommerceSite": "非電子商務網站", "NotFound": "找不到網站", "NoWebsites": "你沒有任何網站可以管理。", @@ -69,9 +73,9 @@ "SiteSearchUse": "你可以使用 Piwik 來追蹤並報告訪客在你網站內的搜尋引擎中搜尋了什麼。", "SiteWithoutDataTitle": "還沒有紀錄到資料", "SiteWithoutDataDescription": "這個網站還沒有追蹤分析資料。", - "SiteWithoutDataSetupTracking": "請在你的網站中放置 %1$sJavaScript 追蹤程式碼%2$s。", + "SiteWithoutDataSetupTracking": "請在你的網站或行動應用程式中設定%1$s追蹤程式碼%2$s(如果你還沒完成的話)。", "SiteWithoutDataMessageDisappears": "此訊息將會在這個網站開始收集到追蹤資料時隱藏。", - "SiteWithoutDataSetupGoals": "同時,你也可能想要%1$s設定一些目標%2$s。", + "SiteWithoutDataSetupGoals": "同時,你或許會想要%1$s設定一些目標%2$s,或在我們的%5$s指南%6$s和 %7$sFAQs%8$s 中了解更多關於 Piwik 的%3$s功能%4$s。", "SuperUserAccessCan": "一個擁有超級使用者權限的使用者也可以為新網站%1$s指定全域設定%2$s。", "Timezone": "時區", "TrackingSiteSearch": "追蹤站內搜尋", -- cgit v1.2.3 From f10b98a306f101b3684ec77574596d4fdaf7dd26 Mon Sep 17 00:00:00 2001 From: Stefan Giehl Date: Mon, 3 Apr 2017 21:58:13 +0200 Subject: Fix action enumeration in visitorlog (#11577) * fix action enumeration in visitorlog * update expected screenshots --- plugins/Live/javascripts/visitorLog.js | 2 +- tests/UI/expected-screenshots/UIIntegrationTest_dashboard2.png | 4 ++-- tests/UI/expected-screenshots/UIIntegrationTest_ecommerce_log.png | 4 ++-- .../expected-screenshots/UIIntegrationTest_widgetize_ecommercelog.png | 4 ++-- .../expected-screenshots/UIIntegrationTest_widgetize_visitor_log.png | 4 ++-- 5 files changed, 9 insertions(+), 9 deletions(-) diff --git a/plugins/Live/javascripts/visitorLog.js b/plugins/Live/javascripts/visitorLog.js index 07cdd313f2..74393f7ff7 100644 --- a/plugins/Live/javascripts/visitorLog.js +++ b/plugins/Live/javascripts/visitorLog.js @@ -77,7 +77,7 @@ var prevelement; var prevhtml; var counter = 0; - $(this).find("li").each(function () { + $(this).find("> li").each(function () { counter++; $(this).val(counter); var current = $(this).html(); diff --git a/tests/UI/expected-screenshots/UIIntegrationTest_dashboard2.png b/tests/UI/expected-screenshots/UIIntegrationTest_dashboard2.png index 8dd98cfdbe..fbdf7fa122 100644 --- a/tests/UI/expected-screenshots/UIIntegrationTest_dashboard2.png +++ b/tests/UI/expected-screenshots/UIIntegrationTest_dashboard2.png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:40fa47ca0be52a7e1e9b3a3c991788b8f7938989e4a6a96d938219422acdb81e -size 1447082 +oid sha256:06c191f3c60d5aaa5eefe76269763bdcfa1ee4a71c47a6a1514e095a5421993d +size 1446632 diff --git a/tests/UI/expected-screenshots/UIIntegrationTest_ecommerce_log.png b/tests/UI/expected-screenshots/UIIntegrationTest_ecommerce_log.png index f600970845..b933377013 100644 --- a/tests/UI/expected-screenshots/UIIntegrationTest_ecommerce_log.png +++ b/tests/UI/expected-screenshots/UIIntegrationTest_ecommerce_log.png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:2d7ff08569369ed7a290d9a07dff56dc5199207053c7fdae42abc15c265b1ec9 -size 451587 +oid sha256:06f016ae54dce5d636a6b03b2ec4a82742b99f25135ac01014e3e1522ede4612 +size 451177 diff --git a/tests/UI/expected-screenshots/UIIntegrationTest_widgetize_ecommercelog.png b/tests/UI/expected-screenshots/UIIntegrationTest_widgetize_ecommercelog.png index b4bef9d7cc..17240d640a 100644 --- a/tests/UI/expected-screenshots/UIIntegrationTest_widgetize_ecommercelog.png +++ b/tests/UI/expected-screenshots/UIIntegrationTest_widgetize_ecommercelog.png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:9735d7df7a8fb2d91eb8922eea1fd6ad742232f8989cd3629c7af699b02d0625 -size 446145 +oid sha256:e65a25e2cb17caa1c0ceb8e3a2466491e270d2c0a26c24322b6e9572fe01324d +size 445631 diff --git a/tests/UI/expected-screenshots/UIIntegrationTest_widgetize_visitor_log.png b/tests/UI/expected-screenshots/UIIntegrationTest_widgetize_visitor_log.png index 454685d2df..9510f82db0 100644 --- a/tests/UI/expected-screenshots/UIIntegrationTest_widgetize_visitor_log.png +++ b/tests/UI/expected-screenshots/UIIntegrationTest_widgetize_visitor_log.png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:924d507d83b7d46da6fd2e6d6e2f4a57cc4f125915b9358d552cf414b7393974 -size 631447 +oid sha256:a82901cf3a852302466e14f1d022c94e083eb698733a6b1b548a442058f0a231 +size 633000 -- cgit v1.2.3 From a6be17ebdfdaf76a05146e2af5b5508d97ae1914 Mon Sep 17 00:00:00 2001 From: Matthieu Aubry Date: Mon, 3 Apr 2017 23:25:58 +0200 Subject: 3.0.3-rc1 --- core/Version.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/core/Version.php b/core/Version.php index 119be80874..ba881f2a12 100644 --- a/core/Version.php +++ b/core/Version.php @@ -20,7 +20,7 @@ final class Version * The current Piwik version. * @var string */ - const VERSION = '3.0.3-b2'; + const VERSION = '3.0.3-rc1'; public function isStableVersion($version) { -- cgit v1.2.3 From e33674ec3acb5dc71411d84a0b388892eb182b09 Mon Sep 17 00:00:00 2001 From: Matthieu Aubry Date: Tue, 4 Apr 2017 13:57:01 +0200 Subject: Piwik 3.0.3 release --- core/Version.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/core/Version.php b/core/Version.php index ba881f2a12..93f5b9c95c 100644 --- a/core/Version.php +++ b/core/Version.php @@ -20,7 +20,7 @@ final class Version * The current Piwik version. * @var string */ - const VERSION = '3.0.3-rc1'; + const VERSION = '3.0.3'; public function isStableVersion($version) { -- cgit v1.2.3