1
0
Fork 0
mirror of https://github.com/YunoHost-Apps/webtrees_ynh.git synced 2024-09-03 18:26:37 +02:00
webtrees_ynh/sources/statisticsplot.php

1379 lines
39 KiB
PHP
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

<?php
/**
* webtrees: online genealogy
* Copyright (C) 2016 webtrees development team
* 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 <http://www.gnu.org/licenses/>.
*/
namespace Fisharebest\Webtrees;
/**
* Defined in session.php
*
* @global Tree $WT_TREE
*/
global $WT_TREE;
use Fisharebest\Webtrees\Date\GregorianDate;
define('WT_SCRIPT_NAME', 'statisticsplot.php');
require './includes/session.php';
/**
* Month of birth
*
* @param int $z_axis
* @param int[] $z_boundaries
* @param Stats $stats
*
* @return int
*/
function month_of_birth($z_axis, array $z_boundaries, Stats $stats) {
$total = 0;
if ($z_axis === 300) {
$num = $stats->statsBirthQuery(false);
foreach ($num as $values) {
foreach (array('JAN', 'FEB', 'MAR', 'APR', 'MAY', 'JUN', 'JUL', 'AUG', 'SEP', 'OCT', 'NOV', 'DEC') as $key => $month) {
if ($month === $values['d_month']) {
fill_y_data(0, $key, $values['total']);
$total += $values['total'];
}
}
}
} elseif ($z_axis === 301) {
$num = $stats->statsBirthQuery(false, true);
foreach ($num as $values) {
foreach (array('JAN', 'FEB', 'MAR', 'APR', 'MAY', 'JUN', 'JUL', 'AUG', 'SEP', 'OCT', 'NOV', 'DEC') as $key => $month) {
if ($month === $values['d_month']) {
if ($values['i_sex'] === 'M') {
fill_y_data(0, $key, $values['total']);
$total += $values['total'];
} elseif ($values['i_sex'] === 'F') {
fill_y_data(1, $key, $values['total']);
$total += $values['total'];
}
}
}
}
} else {
$zstart = 0;
foreach ($z_boundaries as $boundary) {
$num = $stats->statsBirthQuery(false, false, $zstart, $boundary);
foreach ($num as $values) {
foreach (array('JAN', 'FEB', 'MAR', 'APR', 'MAY', 'JUN', 'JUL', 'AUG', 'SEP', 'OCT', 'NOV', 'DEC') as $key => $month) {
if ($month === $values['d_month']) {
fill_y_data($boundary, $key, $values['total']);
$total += $values['total'];
}
}
}
$zstart = $boundary + 1;
}
}
return $total;
}
/**
* Month of birth of first child in a relation
*
* @param int $z_axis
* @param int[] $z_boundaries
* @param Stats $stats
*
* @return int
*/
function month_of_birth_of_first_child($z_axis, array $z_boundaries, Stats $stats) {
$total = 0;
if ($z_axis === 300) {
$num = $stats->monthFirstChildQuery(false);
foreach ($num as $values) {
foreach (array('JAN', 'FEB', 'MAR', 'APR', 'MAY', 'JUN', 'JUL', 'AUG', 'SEP', 'OCT', 'NOV', 'DEC') as $key => $month) {
if ($month === $values['d_month']) {
fill_y_data(0, $key, $values['total']);
$total += $values['total'];
}
}
}
} elseif ($z_axis === 301) {
$num = $stats->monthFirstChildQuery(false, true);
foreach ($num as $values) {
foreach (array('JAN', 'FEB', 'MAR', 'APR', 'MAY', 'JUN', 'JUL', 'AUG', 'SEP', 'OCT', 'NOV', 'DEC') as $key => $month) {
if ($month === $values['d_month']) {
if ($values['i_sex'] === 'M') {
fill_y_data(0, $key, $values['total']);
$total += $values['total'];
} elseif ($values['i_sex'] === 'F') {
fill_y_data(1, $key, $values['total']);
$total += $values['total'];
}
}
}
}
} else {
$zstart = 0;
foreach ($z_boundaries as $boundary) {
$num = $stats->monthFirstChildQuery(false, false, $zstart, $boundary);
foreach ($num as $values) {
foreach (array('JAN', 'FEB', 'MAR', 'APR', 'MAY', 'JUN', 'JUL', 'AUG', 'SEP', 'OCT', 'NOV', 'DEC') as $key => $month) {
if ($month === $values['d_month']) {
fill_y_data($boundary, $key, $values['total']);
$total += $values['total'];
}
}
}
$zstart = $boundary + 1;
}
}
return $total;
}
/**
* Month of death
*
* @param int $z_axis
* @param int[] $z_boundaries
* @param Stats $stats
*
* @return int
*/
function month_of_death($z_axis, array $z_boundaries, Stats $stats) {
$total = 0;
if ($z_axis === 300) {
$num = $stats->statsDeathQuery(false);
foreach ($num as $values) {
foreach (array('JAN', 'FEB', 'MAR', 'APR', 'MAY', 'JUN', 'JUL', 'AUG', 'SEP', 'OCT', 'NOV', 'DEC') as $key => $month) {
if ($month === $values['d_month']) {
fill_y_data(0, $key, $values['total']);
$total += $values['total'];
}
}
}
} elseif ($z_axis === 301) {
$num = $stats->statsDeathQuery(false, true);
foreach ($num as $values) {
foreach (array('JAN', 'FEB', 'MAR', 'APR', 'MAY', 'JUN', 'JUL', 'AUG', 'SEP', 'OCT', 'NOV', 'DEC') as $key => $month) {
if ($month === $values['d_month']) {
if ($values['i_sex'] === 'M') {
fill_y_data(0, $key, $values['total']);
$total += $values['total'];
} elseif ($values['i_sex'] === 'F') {
fill_y_data(1, $key, $values['total']);
$total += $values['total'];
}
}
}
}
} else {
$zstart = 0;
foreach ($z_boundaries as $boundary) {
$num = $stats->statsDeathQuery(false, false, $zstart, $boundary);
foreach ($num as $values) {
foreach (array('JAN', 'FEB', 'MAR', 'APR', 'MAY', 'JUN', 'JUL', 'AUG', 'SEP', 'OCT', 'NOV', 'DEC') as $key => $month) {
if ($month === $values['d_month']) {
fill_y_data($boundary, $key, $values['total']);
$total += $values['total'];
}
}
}
$zstart = $boundary + 1;
}
}
return $total;
}
/**
* Month of marriage
*
* @param int $z_axis
* @param int[] $z_boundaries
* @param Stats $stats
*
* @return int
*/
function month_of_marriage($z_axis, array $z_boundaries, Stats $stats) {
$total = 0;
if ($z_axis === 300) {
$num = $stats->statsMarrQuery(false, false);
foreach ($num as $values) {
foreach (array('JAN', 'FEB', 'MAR', 'APR', 'MAY', 'JUN', 'JUL', 'AUG', 'SEP', 'OCT', 'NOV', 'DEC') as $key => $month) {
if ($month === $values['d_month']) {
fill_y_data(0, $key, $values['total']);
$total += $values['total'];
}
}
}
} else {
$zstart = 0;
foreach ($z_boundaries as $boundary) {
$num = $stats->statsMarrQuery(false, false, $zstart, $boundary);
foreach ($num as $values) {
foreach (array('JAN', 'FEB', 'MAR', 'APR', 'MAY', 'JUN', 'JUL', 'AUG', 'SEP', 'OCT', 'NOV', 'DEC') as $key => $month) {
if ($month === $values['d_month']) {
fill_y_data($boundary, $key, $values['total']);
$total += $values['total'];
}
}
}
$zstart = $boundary + 1;
}
}
return $total;
}
/**
* Month of first marriage
*
* @param int $z_axis
* @param int[] $z_boundaries
* @param Stats $stats
*
* @return int
*/
function month_of_first_marriage($z_axis, array $z_boundaries, Stats $stats) {
$total = 0;
if ($z_axis === 300) {
$num = $stats->statsMarrQuery(false, true);
$indi = array();
$fam = array();
foreach ($num as $values) {
if (!in_array($values['indi'], $indi) && !in_array($values['fams'], $fam)) {
foreach (array('JAN', 'FEB', 'MAR', 'APR', 'MAY', 'JUN', 'JUL', 'AUG', 'SEP', 'OCT', 'NOV', 'DEC') as $key => $month) {
if ($month === $values['month']) {
fill_y_data(0, $key, 1);
$total++;
}
}
$indi[] = $values['indi'];
$fam[] = $values['fams'];
}
}
} else {
$zstart = 0;
$indi = array();
$fam = array();
foreach ($z_boundaries as $boundary) {
$num = $stats->statsMarrQuery(false, true, $zstart, $boundary);
foreach ($num as $values) {
if (!in_array($values['indi'], $indi) && !in_array($values['fams'], $fam)) {
foreach (array('JAN', 'FEB', 'MAR', 'APR', 'MAY', 'JUN', 'JUL', 'AUG', 'SEP', 'OCT', 'NOV', 'DEC') as $key => $month) {
if ($month === $values['month']) {
fill_y_data($boundary, $key, 1);
$total++;
}
}
$indi[] = $values['indi'];
$fam[] = $values['fams'];
}
}
$zstart = $boundary + 1;
}
}
return $total;
}
/**
* Age related to birth year
*
* @param int $z_axis
* @param int[] $z_boundaries
* @param Stats $stats
*
* @return int
*/
function lifespan_by_birth_year($z_axis, array $z_boundaries, Stats $stats) {
$total = 0;
if ($z_axis === 300) {
$num = $stats->statsAgeQuery(false, 'BIRT');
foreach ($num as $values) {
foreach ($values as $age_value) {
fill_y_data(0, (int) ($age_value / 365.25), 1);
$total++;
}
}
} elseif ($z_axis === 301) {
$num = $stats->statsAgeQuery(false, 'BIRT', 'M');
foreach ($num as $values) {
foreach ($values as $age_value) {
fill_y_data(0, (int) ($age_value / 365.25), 1);
$total++;
}
}
$num = $stats->statsAgeQuery(false, 'BIRT', 'F');
foreach ($num as $values) {
foreach ($values as $age_value) {
fill_y_data(1, (int) ($age_value / 365.25), 1);
$total++;
}
}
} else {
$zstart = 0;
foreach ($z_boundaries as $boundary) {
$num = $stats->statsAgeQuery(false, 'BIRT', 'BOTH', $zstart, $boundary);
foreach ($num as $values) {
foreach ($values as $age_value) {
fill_y_data($boundary, (int) ($age_value / 365.25), 1);
$total++;
}
}
$zstart = $boundary + 1;
}
}
return $total;
}
/**
* Age related to death year
*
* @param int $z_axis
* @param int[] $z_boundaries
* @param Stats $stats
*
* @return int
*/
function lifespan_by_death_year($z_axis, array $z_boundaries, Stats $stats) {
$total = 0;
if ($z_axis === 300) {
$num = $stats->statsAgeQuery(false, 'DEAT');
foreach ($num as $values) {
foreach ($values as $age_value) {
fill_y_data(0, (int) ($age_value / 365.25), 1);
$total++;
}
}
} elseif ($z_axis === 301) {
$num = $stats->statsAgeQuery(false, 'DEAT', 'M');
foreach ($num as $values) {
foreach ($values as $age_value) {
fill_y_data(0, (int) ($age_value / 365.25), 1);
$total++;
}
}
$num = $stats->statsAgeQuery(false, 'DEAT', 'F');
foreach ($num as $values) {
foreach ($values as $age_value) {
fill_y_data(1, (int) ($age_value / 365.25), 1);
$total++;
}
}
} else {
$zstart = 0;
foreach ($z_boundaries as $boundary) {
$num = $stats->statsAgeQuery(false, 'DEAT', 'BOTH', $zstart, $boundary);
foreach ($num as $values) {
foreach ($values as $age_value) {
fill_y_data($boundary, (int) ($age_value / 365.25), 1);
$total++;
}
}
$zstart = $boundary + 1;
}
}
return $total;
}
/**
* Age in year of marriage
*
* @param int $z_axis
* @param int[] $z_boundaries
* @param Stats $stats
*
* @return int
*/
function age_at_marriage($z_axis, array $z_boundaries, Stats $stats) {
$total = 0;
if ($z_axis === 300) {
$num = $stats->statsMarrAgeQuery(false, 'M');
foreach ($num as $values) {
fill_y_data(0, (int) ($values['age'] / 365.25), 1);
$total++;
}
$num = $stats->statsMarrAgeQuery(false, 'F');
foreach ($num as $values) {
fill_y_data(0, (int) ($values['age'] / 365.25), 1);
$total++;
}
} elseif ($z_axis === 301) {
$num = $stats->statsMarrAgeQuery(false, 'M');
foreach ($num as $values) {
fill_y_data(0, (int) ($values['age'] / 365.25), 1);
$total++;
}
$num = $stats->statsMarrAgeQuery(false, 'F');
foreach ($num as $values) {
fill_y_data(1, (int) ($values['age'] / 365.25), 1);
$total++;
}
} else {
$zstart = 0;
foreach ($z_boundaries as $boundary) {
$num = $stats->statsMarrAgeQuery(false, 'M', $zstart, $boundary);
foreach ($num as $values) {
fill_y_data($boundary, (int) ($values['age'] / 365.25), 1);
$total++;
}
$num = $stats->statsMarrAgeQuery(false, 'F', $zstart, $boundary);
foreach ($num as $values) {
fill_y_data($boundary, (int) ($values['age'] / 365.25), 1);
$total++;
}
$zstart = $boundary + 1;
}
}
return $total;
}
/**
* Age in year of first marriage
*
* @param int $z_axis
* @param int[] $z_boundaries
* @param Stats $stats
*
* @return int
*/
function age_at_first_marriage($z_axis, array $z_boundaries, Stats $stats) {
$total = 0;
if ($z_axis === 300) {
$num = $stats->statsMarrAgeQuery(false, 'M');
$indi = array();
foreach ($num as $values) {
if (!in_array($values['d_gid'], $indi)) {
fill_y_data(0, (int) ($values['age'] / 365.25), 1);
$total++;
$indi[] = $values['d_gid'];
}
}
$num = $stats->statsMarrAgeQuery(false, 'F');
$indi = array();
foreach ($num as $values) {
if (!in_array($values['d_gid'], $indi)) {
fill_y_data(0, (int) ($values['age'] / 365.25), 1);
$total++;
$indi[] = $values['d_gid'];
}
}
} elseif ($z_axis === 301) {
$num = $stats->statsMarrAgeQuery(false, 'M');
$indi = array();
foreach ($num as $values) {
if (!in_array($values['d_gid'], $indi)) {
fill_y_data(0, (int) ($values['age'] / 365.25), 1);
$total++;
$indi[] = $values['d_gid'];
}
}
$num = $stats->statsMarrAgeQuery(false, 'F');
$indi = array();
foreach ($num as $values) {
if (!in_array($values['d_gid'], $indi)) {
fill_y_data(1, (int) ($values['age'] / 365.25), 1);
$total++;
$indi[] = $values['d_gid'];
}
}
} else {
$zstart = 0;
$indi = array();
foreach ($z_boundaries as $boundary) {
$num = $stats->statsMarrAgeQuery(false, 'M', $zstart, $boundary);
foreach ($num as $values) {
if (!in_array($values['d_gid'], $indi)) {
fill_y_data($boundary, (int) ($values['age'] / 365.25), 1);
$total++;
$indi[] = $values['d_gid'];
}
}
$num = $stats->statsMarrAgeQuery(false, 'F', $zstart, $boundary);
foreach ($num as $values) {
if (!in_array($values['d_gid'], $indi)) {
fill_y_data($boundary, (int) ($values['age'] / 365.25), 1);
$total++;
$indi[] = $values['d_gid'];
}
}
$zstart = $boundary + 1;
}
}
return $total;
}
/**
* Number of children
*
* @param int $z_axis
* @param int[] $z_boundaries
* @param Stats $stats
*
* @return int
*/
function number_of_children($z_axis, array $z_boundaries, Stats $stats) {
$total = 0;
if ($z_axis === 300) {
$num = $stats->statsChildrenQuery(false);
foreach ($num as $values) {
fill_y_data(0, $values['f_numchil'], $values['total']);
$total += $values['f_numchil'] * $values['total'];
}
} elseif ($z_axis === 301) {
$num = $stats->statsChildrenQuery(false, 'M');
foreach ($num as $values) {
fill_y_data(0, $values['num'], $values['total']);
$total += $values['num'] * $values['total'];
}
$num = $stats->statsChildrenQuery(false, 'F');
foreach ($num as $values) {
fill_y_data(1, $values['num'], $values['total']);
$total += $values['num'] * $values['total'];
}
} else {
$zstart = 0;
foreach ($z_boundaries as $boundary) {
$num = $stats->statsChildrenQuery(false, 'BOTH', $zstart, $boundary);
foreach ($num as $values) {
fill_y_data($boundary, $values['f_numchil'], $values['total']);
$total += $values['f_numchil'] * $values['total'];
}
$zstart = $boundary + 1;
}
}
return $total;
}
/**
* Calculate the Y axis.
*
* @param int $z
* @param int $x
* @param int $val
*/
function fill_y_data($z, $x, $val) {
global $ydata, $xmax, $x_boundaries, $zmax, $z_boundaries, $xgiven, $zgiven;
//-- calculate index $i out of given z value
//-- calculate index $j out of given x value
if ($xgiven) {
$j = $x;
} else {
$j = 0;
while (($x > $x_boundaries[$j]) && ($j < $xmax)) {
$j++;
}
}
if ($zgiven) {
$i = $z;
} else {
$i = 0;
while (($z > $z_boundaries[$i]) && ($i < $zmax)) {
$i++;
}
}
if (isset($ydata[$i][$j])) {
$ydata[$i][$j] += $val;
} else {
$ydata[$i][$j] = $val;
}
}
/**
* Plot the data.
*
* @param string $mytitle
* @param integer[][] $xdata
* @param string $xtitle
* @param integer[][] $ydata
* @param string $ytitle
* @param string[] $legend
*/
function my_plot($mytitle, $xdata, $xtitle, $ydata, $ytitle, $legend) {
global $percentage, $male_female, $ymax, $scalefactor, $datastring, $imgurl;
// Google Chart API only allows text encoding for numbers less than 100
// and it does not allow adjusting the y-axis range, so we must find the maximum y-value
// in order to adjust beforehand by changing the numbers
if ($male_female) {
$stop = 2;
} else {
$stop = count($ydata);
}
if ($percentage) {
$ypercentmax = 0;
$yt = array();
for ($i = 0; $i < $stop; $i++) {
if (isset($ydata[$i])) {
$ymax = max($ydata[$i]);
$yt[$i] = array_sum($ydata[$i]);
if ($yt[$i] > 0) {
$ypercent = round($ymax / $yt[$i] * 100, 1);
$ypercentmax = max($ypercentmax, $ypercent);
}
}
}
$ymax = $ypercentmax;
if ($ymax > 0) {
$scalefactor = 100.0 / $ymax;
} else {
$scalefactor = 0;
}
$datastring = 'chd=t:';
for ($i = 0; $i < $stop; $i++) {
if (isset($ydata[$i])) {
foreach ($ydata[$i] as $j => $data) {
if ($j > 0) {
$datastring .= ',';
}
if ($yt[$i] > 0) {
$datastring .= round($data / $yt[$i] * 100 * $scalefactor, 1);
} else {
$datastring .= '0';
}
}
if ($i !== $stop - 1) {
$datastring .= '|';
}
}
}
} else {
for ($i = 0; $i < $stop; $i++) {
$ymax = max($ymax, max($ydata[$i]));
}
if ($ymax > 0) {
$scalefactor = 100.0 / $ymax;
} else {
$scalefactor = 0;
}
$datastring = 'chd=t:';
for ($i = 0; $i < $stop; $i++) {
foreach ($ydata[$i] as $j => $data) {
if ($j > 0) {
$datastring .= ',';
}
$datastring .= round($data * $scalefactor, 1);
}
if ($i !== $stop - 1) {
$datastring .= '|';
}
}
}
$colors = array('0000FF', 'FFA0CB', '9F00FF', 'FF7000', '905030', 'FF0000', '00FF00', 'F0F000');
$colorstring = 'chco=';
for ($i = 0; $i < $stop; $i++) {
if (isset($colors[$i])) {
$colorstring .= $colors[$i];
if ($i !== ($stop - 1)) {
$colorstring .= ',';
}
}
}
$titleLength = strpos($mytitle . "\n", "\n");
$title = substr($mytitle, 0, $titleLength);
$imgurl = 'https://chart.googleapis.com/chart?cht=bvg&amp;chs=950x300&amp;chf=bg,s,ffffff00|c,s,ffffff00&amp;chtt=' . rawurlencode($title) . '&amp;' . $datastring . '&amp;' . $colorstring . '&amp;chbh=';
if (count($ydata) > 3) {
$imgurl .= '5,1';
} elseif (count($ydata) < 2) {
$imgurl .= '45,1';
} else {
$imgurl .= '20,3';
}
$imgurl .= '&amp;chxt=x,x,y,y&amp;chxl=0:|';
foreach ($xdata as $data) {
$imgurl .= rawurlencode($data) . '|';
}
$imgurl .= '1:||||' . rawurlencode($xtitle) . '|2:|';
$imgurl .= '0|';
if ($percentage) {
for ($i = 1; $i < 11; $i++) {
if ($ymax < 11) {
$imgurl .= round($ymax * $i / 10, 1) . '|';
} else {
$imgurl .= round($ymax * $i / 10, 0) . '|';
}
}
$imgurl .= '3:||%|';
} else {
if ($ymax < 11) {
for ($i = 1; $i < $ymax + 1; $i++) {
$imgurl .= round($ymax * $i / ($ymax), 0) . '|';
}
} else {
for ($i = 1; $i < 11; $i++) {
$imgurl .= round($ymax * $i / 10, 0) . '|';
}
}
$imgurl .= '3:||' . rawurlencode($ytitle) . '|';
}
// Only show legend if y-data is non-2-dimensional
if (count($ydata) > 1) {
$imgurl .= '&amp;chdl=';
foreach ($legend as $i => $data) {
if ($i > 0) {
$imgurl .= '|';
}
$imgurl .= rawurlencode($data);
}
}
$title = strstr($mytitle, '|', true);
echo '<img src="', $imgurl, '" width="950" height="300" alt="', Filter::escapeHtml($title), '" title="', Filter::escapeHtml($title), '">';
}
/**
* Create the X azxs.
*
* @param string $x_axis_boundaries
*/
function calculate_axis($x_axis_boundaries) {
global $x_axis, $xdata, $xmax, $x_boundaries;
// Calculate xdata and zdata elements out of chart values
$hulpar = explode(',', $x_axis_boundaries);
$i = 1;
if ($x_axis === 21 && $hulpar[0] == 1) {
$xdata[0] = 0;
} else {
$xdata[0] = format_range_of_numbers(0, $hulpar[0]);
}
$x_boundaries[0] = $hulpar[0] - 1;
while (isset($hulpar[$i])) {
$i1 = $i - 1;
if (($hulpar[$i] - $hulpar[$i1]) === 1) {
$xdata[$i] = $hulpar[$i1];
$x_boundaries[$i] = $hulpar[$i1];
} elseif ($hulpar[$i1] === $hulpar[0]) {
$xdata[$i] = format_range_of_numbers($hulpar[$i1], $hulpar[$i]);
$x_boundaries[$i] = $hulpar[$i];
} else {
$xdata[$i] = format_range_of_numbers($hulpar[$i1] + 1, $hulpar[$i]);
$x_boundaries[$i] = $hulpar[$i];
}
$i++;
}
$xdata[$i] = $hulpar[$i - 1];
$x_boundaries[$i] = $hulpar[$i - 1];
if ($hulpar[$i - 1] === $i) {
$xmax = $i + 1;
} else {
$xmax = $i;
}
$xdata[$xmax] = /* I18N: Label on a graph; 40+ means 40 or more */ I18N::translate('%s+', I18N::number($hulpar[$i - 1]));
$x_boundaries[$xmax] = 10000;
$xmax = $xmax + 1;
if ($xmax > 20) {
$xmax = 20;
}
}
/**
* A range of integers.
*
* @param int $x
* @param int $y
*
* @return string
*/
function format_range_of_numbers($x, $y) {
return /* I18N: A range of numbers */ I18N::translate(
'%1$s%2$s',
I18N::number($x),
I18N::number($y)
);
}
/**
* Calculate the Z axis.
*
* @param string $boundaries_z_axis
*/
function calculate_legend($boundaries_z_axis) {
global $legend, $zmax, $z_boundaries;
// calculate the legend values
$hulpar = explode(',', $boundaries_z_axis);
$i = 1;
$date = new Date('BEF ' . $hulpar[0]);
$legend[0] = strip_tags($date->display());
$z_boundaries[0] = $hulpar[0] - 1;
while (isset($hulpar[$i])) {
$i1 = $i - 1;
$date = new Date('BET ' . $hulpar[$i1] . ' AND ' . ($hulpar[$i] - 1));
$legend[$i] = strip_tags($date->display());
$z_boundaries[$i] = $hulpar[$i] - 1;
$i++;
}
$zmax = $i;
$zmax1 = $zmax - 1;
$date = new Date('AFT ' . $hulpar[$zmax1]);
$legend[$zmax] = strip_tags($date->display());
$z_boundaries[$zmax] = 10000;
$zmax = $zmax + 1;
if ($zmax > 8) {
$zmax = 8;
}
}
global $legend, $xdata, $ydata, $xmax, $zmax, $z_boundaries, $xgiven, $zgiven, $percentage, $male_female;
$x_axis = Filter::getInteger('x-as', 1, 21, 11);
$y_axis = Filter::getInteger('y-as', 201, 202, 201);
$z_axis = Filter::getInteger('z-as', 300, 302, 302);
$stats = new Stats($WT_TREE);
$z_boundaries = array();
echo '<div class="statistics_chart" title="', I18N::translate('Statistics chart'), '">';
switch ($x_axis) {
case '1':
echo $stats->chartDistribution(array(Filter::get('chart_shows'), Filter::get('chart_type'), Filter::get('SURN')));
break;
case '2':
echo $stats->chartDistribution(array(Filter::get('chart_shows'), 'birth_distribution_chart'));
break;
case '3':
echo $stats->chartDistribution(array(Filter::get('chart_shows'), 'death_distribution_chart'));
break;
case '4':
echo $stats->chartDistribution(array(Filter::get('chart_shows'), 'marriage_distribution_chart'));
break;
case '11':
$monthdata = array();
for ($i = 0; $i < 12; ++$i) {
$monthdata[$i] = GregorianDate::monthNameNominativeCase($i + 1, false);
}
$xgiven = true;
$zgiven = false;
$title = I18N::translate('Month of birth');
$xtitle = I18N::translate('month');
$ytitle = I18N::translate('numbers');
$boundaries_z_axis = Filter::get('z-axis-boundaries-periods', null, '0');
$xdata = $monthdata;
$xmax = 12;
if ($z_axis !== 300 && $z_axis !== 301) {
calculate_legend($boundaries_z_axis);
}
$percentage = false;
if ($y_axis === 201) {
$percentage = false;
$ytitle = I18N::translate('Individuals');
} elseif ($y_axis === 202) {
$percentage = true;
$ytitle = I18N::translate('percentage');
}
$male_female = false;
if ($z_axis === 300) {
$zgiven = false;
$legend[0] = 'all';
$zmax = 1;
$z_boundaries[0] = 100000;
} elseif ($z_axis === 301) {
$male_female = true;
$zgiven = true;
$legend[0] = I18N::translate('Male');
$legend[1] = I18N::translate('Female');
$zmax = 2;
$xtitle = $xtitle . I18N::translate(' per gender');
} elseif ($z_axis === 302) {
$xtitle = $xtitle . I18N::translate(' per time period');
}
//-- reset the data array
for ($i = 0; $i < $zmax; $i++) {
for ($j = 0; $j < $xmax; $j++) {
$ydata[$i][$j] = 0;
}
}
$total = month_of_birth($z_axis, $z_boundaries, $stats);
$hstr = $title . '|' . I18N::translate('Counts ') . ' ' . I18N::number($total) . ' ' . I18N::translate('of') . ' ' . $stats->totalIndividuals();
my_plot($hstr, $xdata, $xtitle, $ydata, $ytitle, $legend);
break;
case '12':
$monthdata = array();
for ($i = 0; $i < 12; ++$i) {
$monthdata[$i] = GregorianDate::monthNameNominativeCase($i + 1, false);
}
$xgiven = true;
$zgiven = false;
$title = I18N::translate('Month of death');
$xtitle = I18N::translate('month');
$ytitle = I18N::translate('numbers');
$boundaries_z_axis = Filter::get('z-axis-boundaries-periods', null, '0');
$xdata = $monthdata;
$xmax = 12;
if ($z_axis !== 300 && $z_axis !== 301) {
calculate_legend($boundaries_z_axis);
}
$percentage = false;
if ($y_axis === 201) {
$percentage = false;
$ytitle = I18N::translate('Individuals');
} elseif ($y_axis === 202) {
$percentage = true;
$ytitle = I18N::translate('percentage');
}
$male_female = false;
if ($z_axis === 300) {
$zgiven = false;
$legend[0] = 'all';
$zmax = 1;
$z_boundaries[0] = 100000;
} elseif ($z_axis === 301) {
$male_female = true;
$zgiven = true;
$legend[0] = I18N::translate('Male');
$legend[1] = I18N::translate('Female');
$zmax = 2;
$xtitle = $xtitle . I18N::translate(' per gender');
} elseif ($z_axis === 302) {
$xtitle = $xtitle . I18N::translate(' per time period');
}
//-- reset the data array
for ($i = 0; $i < $zmax; $i++) {
for ($j = 0; $j < $xmax; $j++) {
$ydata[$i][$j] = 0;
}
}
$total = month_of_death($z_axis, $z_boundaries, $stats);
$hstr = $title . '|' . I18N::translate('Counts ') . ' ' . I18N::number($total) . ' ' . I18N::translate('of') . ' ' . $stats->totalIndividuals();
my_plot($hstr, $xdata, $xtitle, $ydata, $ytitle, $legend);
break;
case '13':
$monthdata = array();
for ($i = 0; $i < 12; ++$i) {
$monthdata[$i] = GregorianDate::monthNameNominativeCase($i + 1, false);
}
if ($z_axis === 301) {
$z_axis = 300;
}
$xgiven = true;
$zgiven = false;
$title = I18N::translate('Month of marriage');
$xtitle = I18N::translate('month');
$ytitle = I18N::translate('numbers');
$boundaries_z_axis = Filter::get('z-axis-boundaries-periods', null, '0');
$xdata = $monthdata;
$xmax = 12;
if ($z_axis !== 300 && $z_axis !== 301) {
calculate_legend($boundaries_z_axis);
}
$percentage = false;
if ($y_axis === 201) {
$percentage = false;
$ytitle = I18N::translate('Families');
} elseif ($y_axis === 202) {
$percentage = true;
$ytitle = I18N::translate('percentage');
}
$male_female = false;
if ($z_axis === 300) {
$zgiven = false;
$legend[0] = 'all';
$zmax = 1;
$z_boundaries[0] = 100000;
} elseif ($z_axis === 301) {
$male_female = true;
$zgiven = true;
$legend[0] = I18N::translate('Male');
$legend[1] = I18N::translate('Female');
$zmax = 2;
$xtitle = $xtitle . I18N::translate(' per gender');
} elseif ($z_axis === 302) {
$xtitle = $xtitle . I18N::translate(' per time period');
}
//-- reset the data array
for ($i = 0; $i < $zmax; $i++) {
for ($j = 0; $j < $xmax; $j++) {
$ydata[$i][$j] = 0;
}
}
$total = month_of_marriage($z_axis, $z_boundaries, $stats);
$hstr = $title . '|' . I18N::translate('Counts ') . ' ' . I18N::number($total) . ' ' . I18N::translate('of') . ' ' . $stats->totalFamilies();
my_plot($hstr, $xdata, $xtitle, $ydata, $ytitle, $legend);
break;
case '14':
$monthdata = array();
for ($i = 0; $i < 12; ++$i) {
$monthdata[$i] = GregorianDate::monthNameNominativeCase($i + 1, false);
}
$xgiven = true;
$zgiven = false;
$title = I18N::translate('Month of birth of first child in a relation');
$xtitle = I18N::translate('month');
$ytitle = I18N::translate('numbers');
$boundaries_z_axis = Filter::get('z-axis-boundaries-periods', null, '0');
$xdata = $monthdata;
$xmax = 12;
if ($z_axis !== 300 && $z_axis !== 301) {
calculate_legend($boundaries_z_axis);
}
$percentage = false;
if ($y_axis === 201) {
$percentage = false;
$ytitle = I18N::translate('Children');
} elseif ($y_axis === 202) {
$percentage = true;
$ytitle = I18N::translate('percentage');
}
$male_female = false;
if ($z_axis === 300) {
$zgiven = false;
$legend[0] = 'all';
$zmax = 1;
$z_boundaries[0] = 100000;
} elseif ($z_axis === 301) {
$male_female = true;
$zgiven = true;
$legend[0] = I18N::translate('Male');
$legend[1] = I18N::translate('Female');
$zmax = 2;
$xtitle = $xtitle . I18N::translate(' per gender');
} elseif ($z_axis === 302) {
$xtitle = $xtitle . I18N::translate(' per time period');
}
//-- reset the data array
for ($i = 0; $i < $zmax; $i++) {
for ($j = 0; $j < $xmax; $j++) {
$ydata[$i][$j] = 0;
}
}
$total = month_of_birth_of_first_child($z_axis, $z_boundaries, $stats);
$hstr = $title . '|' . I18N::translate('Counts ') . ' ' . I18N::number($total) . ' ' . I18N::translate('of') . ' ' . $stats->totalFamilies();
my_plot($hstr, $xdata, $xtitle, $ydata, $ytitle, $legend);
break;
case '15':
$monthdata = array();
for ($i = 0; $i < 12; ++$i) {
$monthdata[$i] = GregorianDate::monthNameNominativeCase($i + 1, false);
}
if ($z_axis === 301) {
$z_axis = 300;
}
$xgiven = true;
$zgiven = false;
$title = I18N::translate('Month of first marriage');
$xtitle = I18N::translate('month');
$ytitle = I18N::translate('numbers');
$boundaries_z_axis = Filter::get('z-axis-boundaries-periods', null, '0');
$xdata = $monthdata;
$xmax = 12;
if ($z_axis !== 300 && $z_axis !== 301) {
calculate_legend($boundaries_z_axis);
}
$percentage = false;
if ($y_axis === 201) {
$percentage = false;
$ytitle = I18N::translate('Families');
} elseif ($y_axis === 202) {
$percentage = true;
$ytitle = I18N::translate('percentage');
}
$male_female = false;
if ($z_axis === 300) {
$zgiven = false;
$legend[0] = 'all';
$zmax = 1;
$z_boundaries[0] = 100000;
} elseif ($z_axis === 301) {
$male_female = true;
$zgiven = true;
$legend[0] = I18N::translate('Male');
$legend[1] = I18N::translate('Female');
$zmax = 2;
$xtitle = $xtitle . I18N::translate(' per gender');
} elseif ($z_axis === 302) {
$xtitle = $xtitle . I18N::translate(' per time period');
}
//-- reset the data array
for ($i = 0; $i < $zmax; $i++) {
for ($j = 0; $j < $xmax; $j++) {
$ydata[$i][$j] = 0;
}
}
$total = month_of_first_marriage($z_axis, $z_boundaries, $stats);
$hstr = $title . '|' . I18N::translate('Counts ') . ' ' . I18N::number($total) . ' ' . I18N::translate('of') . ' ' . $stats->totalFamilies();
my_plot($hstr, $xdata, $xtitle, $ydata, $ytitle, $legend);
break;
case '17':
$monthdata = array();
for ($i = 0; $i < 12; ++$i) {
$monthdata[$i] = GregorianDate::monthNameNominativeCase($i + 1, false);
}
$xgiven = false;
$zgiven = false;
$title = I18N::translate('Age related to birth year');
$xtitle = I18N::translate('age');
$ytitle = I18N::translate('numbers');
$boundaries_x_axis = Filter::get('x-axis-boundaries-ages');
$boundaries_z_axis = Filter::get('z-axis-boundaries-periods', null, '0');
calculate_axis($boundaries_x_axis);
if ($z_axis !== 300 && $z_axis !== 301) {
calculate_legend($boundaries_z_axis);
}
$percentage = false;
if ($y_axis === 201) {
$percentage = false;
$ytitle = I18N::translate('Individuals');
} elseif ($y_axis === 202) {
$percentage = true;
$ytitle = I18N::translate('percentage');
}
$male_female = false;
if ($z_axis === 300) {
$zgiven = false;
$legend[0] = 'all';
$zmax = 1;
$z_boundaries[0] = 100000;
} elseif ($z_axis === 301) {
$male_female = true;
$zgiven = true;
$legend[0] = I18N::translate('Male');
$legend[1] = I18N::translate('Female');
$zmax = 2;
$xtitle = $xtitle . I18N::translate(' per gender');
} elseif ($z_axis === 302) {
$xtitle = $xtitle . I18N::translate(' per time period');
}
//-- reset the data array
for ($i = 0; $i < $zmax; $i++) {
for ($j = 0; $j < $xmax; $j++) {
$ydata[$i][$j] = 0;
}
}
$total = lifespan_by_birth_year($z_axis, $z_boundaries, $stats);
$hstr = $title . '|' . I18N::translate('Counts ') . ' ' . I18N::number($total) . ' ' . I18N::translate('of') . ' ' . $stats->totalIndividuals();
my_plot($hstr, $xdata, $xtitle, $ydata, $ytitle, $legend);
break;
case '18':
$monthdata = array();
for ($i = 0; $i < 12; ++$i) {
$monthdata[$i] = GregorianDate::monthNameNominativeCase($i + 1, false);
}
$xgiven = false;
$zgiven = false;
$title = I18N::translate('Age related to death year');
$xtitle = I18N::translate('age');
$ytitle = I18N::translate('numbers');
$boundaries_x_axis = Filter::get('x-axis-boundaries-ages');
$boundaries_z_axis = Filter::get('z-axis-boundaries-periods', null, '0');
calculate_axis($boundaries_x_axis);
if ($z_axis !== 300 && $z_axis !== 301) {
calculate_legend($boundaries_z_axis);
}
$percentage = false;
if ($y_axis === 201) {
$percentage = false;
$ytitle = I18N::translate('Individuals');
} elseif ($y_axis === 202) {
$percentage = true;
$ytitle = I18N::translate('percentage');
}
$male_female = false;
if ($z_axis === 300) {
$zgiven = false;
$legend[0] = 'all';
$zmax = 1;
$z_boundaries[0] = 100000;
} elseif ($z_axis === 301) {
$male_female = true;
$zgiven = true;
$legend[0] = I18N::translate('Male');
$legend[1] = I18N::translate('Female');
$zmax = 2;
$xtitle = $xtitle . I18N::translate(' per gender');
} elseif ($z_axis === 302) {
$xtitle = $xtitle . I18N::translate(' per time period');
}
//-- reset the data array
for ($i = 0; $i < $zmax; $i++) {
for ($j = 0; $j < $xmax; $j++) {
$ydata[$i][$j] = 0;
}
}
$total = lifespan_by_death_year($z_axis, $z_boundaries, $stats);
$hstr = $title . '|' . I18N::translate('Counts ') . ' ' . I18N::number($total) . ' ' . I18N::translate('of') . ' ' . $stats->totalIndividuals();
my_plot($hstr, $xdata, $xtitle, $ydata, $ytitle, $legend);
break;
case '19':
$monthdata = array();
for ($i = 0; $i < 12; ++$i) {
$monthdata[$i] = GregorianDate::monthNameNominativeCase($i + 1, false);
}
$xgiven = false;
$zgiven = false;
$title = I18N::translate('Age in year of marriage');
$xtitle = I18N::translate('age');
$ytitle = I18N::translate('numbers');
$boundaries_x_axis = Filter::get('x-axis-boundaries-ages_m');
$boundaries_z_axis = Filter::get('z-axis-boundaries-periods', null, '0');
calculate_axis($boundaries_x_axis);
if ($z_axis !== 300 && $z_axis !== 301) {
calculate_legend($boundaries_z_axis);
}
$percentage = false;
if ($y_axis === 201) {
$percentage = false;
$ytitle = I18N::translate('Individuals');
} elseif ($y_axis === 202) {
$percentage = true;
$ytitle = I18N::translate('percentage');
}
$male_female = false;
$z_boundaries[0] = 100000;
if ($z_axis === 300) {
$zgiven = false;
$legend[0] = 'all';
$zmax = 1;
} elseif ($z_axis === 301) {
$male_female = true;
$zgiven = true;
$legend[0] = I18N::translate('Male');
$legend[1] = I18N::translate('Female');
$zmax = 2;
$xtitle = $xtitle . I18N::translate(' per gender');
} elseif ($z_axis === 302) {
$xtitle = $xtitle . I18N::translate(' per time period');
}
//-- reset the data array
for ($i = 0; $i < $zmax; $i++) {
for ($j = 0; $j < $xmax; $j++) {
$ydata[$i][$j] = 0;
}
}
$total = age_at_marriage($z_axis, $z_boundaries, $stats);
$hstr = $title . '|' . I18N::translate('Counts ') . ' ' . I18N::number($total) . ' ' . I18N::translate('of') . ' ' . $stats->totalIndividuals();
my_plot($hstr, $xdata, $xtitle, $ydata, $ytitle, $legend);
break;
case '20':
$monthdata = array();
for ($i = 0; $i < 12; ++$i) {
$monthdata[$i] = GregorianDate::monthNameNominativeCase($i + 1, false);
}
$xgiven = false;
$zgiven = false;
$title = I18N::translate('Age in year of first marriage');
$xtitle = I18N::translate('age');
$ytitle = I18N::translate('numbers');
$boundaries_x_axis = Filter::get('x-axis-boundaries-ages_m');
$boundaries_z_axis = Filter::get('z-axis-boundaries-periods', null, '0');
calculate_axis($boundaries_x_axis);
if ($z_axis !== 300 && $z_axis !== 301) {
calculate_legend($boundaries_z_axis);
}
$percentage = false;
if ($y_axis === 201) {
$percentage = false;
$ytitle = I18N::translate('Individuals');
} elseif ($y_axis === 202) {
$percentage = true;
$ytitle = I18N::translate('percentage');
}
$male_female = false;
if ($z_axis === 300) {
$zgiven = false;
$legend[0] = 'all';
$zmax = 1;
$z_boundaries[0] = 100000;
} elseif ($z_axis === 301) {
$male_female = true;
$zgiven = true;
$legend[0] = I18N::translate('Male');
$legend[1] = I18N::translate('Female');
$zmax = 2;
$xtitle = $xtitle . I18N::translate(' per gender');
} elseif ($z_axis === 302) {
$xtitle = $xtitle . I18N::translate(' per time period');
}
//-- reset the data array
for ($i = 0; $i < $zmax; $i++) {
for ($j = 0; $j < $xmax; $j++) {
$ydata[$i][$j] = 0;
}
}
$total = age_at_first_marriage($z_axis, $z_boundaries, $stats);
$hstr = $title . '|' . I18N::translate('Counts ') . ' ' . I18N::number($total) . ' ' . I18N::translate('of') . ' ' . $stats->totalIndividuals();
my_plot($hstr, $xdata, $xtitle, $ydata, $ytitle, $legend);
break;
case '21':
$monthdata = array();
for ($i = 0; $i < 12; ++$i) {
$monthdata[$i] = GregorianDate::monthNameNominativeCase($i + 1, false);
}
$xgiven = false;
$zgiven = false;
$title = I18N::translate('Number of children');
$xtitle = I18N::translate('children');
$ytitle = I18N::translate('numbers');
$boundaries_x_axis = Filter::get('x-axis-boundaries-numbers');
$boundaries_z_axis = Filter::get('z-axis-boundaries-periods', null, '0');
calculate_axis($boundaries_x_axis);
if ($z_axis !== 300 && $z_axis !== 301) {
calculate_legend($boundaries_z_axis);
}
$percentage = false;
if ($y_axis === 201) {
$percentage = false;
$ytitle = I18N::translate('Families');
} elseif ($y_axis === 202) {
$percentage = true;
$ytitle = I18N::translate('percentage');
}
$male_female = false;
if ($z_axis === 300) {
$zgiven = false;
$legend[0] = 'all';
$zmax = 1;
$z_boundaries[0] = 100000;
} elseif ($z_axis === 301) {
$male_female = true;
$zgiven = true;
$legend[0] = I18N::translate('Male');
$legend[1] = I18N::translate('Female');
$zmax = 2;
$xtitle = $xtitle . I18N::translate(' per gender');
} elseif ($z_axis === 302) {
$xtitle = $xtitle . I18N::translate(' per time period');
}
//-- reset the data array
for ($i = 0; $i < $zmax; $i++) {
for ($j = 0; $j < $xmax; $j++) {
$ydata[$i][$j] = 0;
}
}
$total = number_of_children($z_axis, $z_boundaries, $stats);
$hstr = $title . '|' . I18N::translate('Counts ') . ' ' . I18N::number($total) . ' ' . I18N::translate('of') . ' ' . $stats->totalChildren();
my_plot($hstr, $xdata, $xtitle, $ydata, $ytitle, $legend);
break;
default:
echo '<i class="icon-loading-large"></i>';
break;
}
echo '</div>';