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

1380 lines
39 KiB
PHP
Raw Normal View History

<?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>';