. */ define('WT_SCRIPT_NAME', 'pedigree.php'); require './includes/session.php'; define("ARROW_WRAPPER", "
"); define("MENU_WRAPPER", "
"); define("MENU_ITEM", "%s"); define("BOX_WRAPPER", "
"); $controller = new PedigreeController; $controller ->pageHeader() ->addExternalJavascript(WT_AUTOCOMPLETE_JS_URL) ->addInlineJavascript('autocomplete();'); ?>

getPageTitle(); ?>

PEDIGREE_GENERATIONS, 3, $MAX_PEDIGREE_GENERATIONS); ?> I18N::translate('Portrait'), 1 => I18N::translate('Landscape'), 2 => I18N::translate('Oldest at top'), 3 => I18N::translate('Oldest at bottom')), null, $talloffset); ?> ">
error_message) { echo '

', $controller->error_message, '

'; return; } $posn = $TEXT_DIRECTION == 'rtl' ? 'right' : 'left'; echo '
'; //-- echo the boxes $curgen = 1; $xoffset = 0; $yoffset = 0; // -- used to offset the position of each box as it is generated $prevxoffset = 0; // -- used to track the horizontal x position of the previous box $prevyoffset = 0; // -- used to track the vertical y position of the previous box $maxyoffset = 0; $lineDrawx = array(); // -- used to position joining lines on $lineDrawy = array(); // -- used to position joining lines on for ($i = ($controller->treesize - 1); $i >= 0; $i--) { // set positions for joining lines $lineDrawx[$i] = $xoffset; $lineDrawy[$i] = $yoffset - 200; // 200 adjustment necessary to move canvas below menus and options. Matched to similar amount on canvas style. // -- check to see if we have moved to the next generation if ($i < (int) ($controller->treesize / (pow(2, $curgen)))) { $curgen++; } $prevxoffset = $xoffset; $prevyoffset = $yoffset; if ($talloffset < 2) { // Portrait 0 Landscape 1 top 2 bottom 3 $xoffset = $controller->offsetarray[$i]["x"]; $yoffset = $controller->offsetarray[$i]["y"]; } else { $xoffset = $controller->offsetarray[$i]["y"]; $yoffset = $controller->offsetarray[$i]["x"]; } // -- draw the box if ($yoffset > $maxyoffset) { $maxyoffset = $yoffset; } // Can we go back to an earlier generation? $can_go_back = $curgen == 1 && $controller->ancestors[$i] && $controller->ancestors[$i]->getChildFamilies(); if ($talloffset == 2) { // oldest at top if ($can_go_back) { printf(ARROW_WRAPPER, $posn, $xoffset + $controller->pbwidth / 2, $yoffset - 22); $did = 1; if ($i > (int) ($controller->treesize / 2) + (int) ($controller->treesize / 4)) { $did++; } printf(MENU_ITEM, $controller->ancestors[$did]->getXref(), $controller->show_full, $controller->PEDIGREE_GENERATIONS, $talloffset, 'icon-uarrow noprint', ''); echo '
'; } } // beginning of box setup and display //Correct box spacing for different layouts if (($talloffset == 3) && ($curgen == 1)) { $yoffset += 25; } if (($talloffset == 3) && ($curgen == 2)) { $yoffset += 10; } printf(BOX_WRAPPER, $posn, $xoffset, $yoffset, $controller->pbwidth, $controller->pbheight); print_pedigree_person($controller->ancestors[$i]); if ($can_go_back) { $did = 1; if ($i > (int) ($controller->treesize / 2) + (int) ($controller->treesize / 4)) { $did++; } if ($TEXT_DIRECTION == "rtl") { $arrow = 'icon-larrow'; } else { $arrow = 'icon-rarrow'; } if ($talloffset == 3) { printf(ARROW_WRAPPER, $posn, $controller->pbwidth / 2, $controller->pbheight + 5); printf(MENU_ITEM, $controller->ancestors[$did]->getXref(), $controller->show_full, $controller->PEDIGREE_GENERATIONS, $talloffset, 'icon-darrow noprint', ''); echo '
'; } elseif ($talloffset < 2) { printf(ARROW_WRAPPER, $posn, $controller->pbwidth + 5, $controller->pbheight / 2 - 10); printf(MENU_ITEM, $controller->ancestors[$did]->getXref(), $controller->show_full, $controller->PEDIGREE_GENERATIONS, $talloffset, "$arrow noprint", ''); echo '
'; } } echo '
'; } // -- echo left arrow for decendants so that we can move down the tree $yoffset += ($controller->pbheight / 2) - 10; $famids = $controller->root->getSpouseFamilies(); //-- make sure there is more than 1 child in the family with parents $cfamids = $controller->root->getChildFamilies(); if (count($famids) > 0) { if ($TEXT_DIRECTION == 'rtl') { $arrow = 'icon-rarrow'; } else { $arrow = 'icon-larrow'; } switch ($talloffset) { case 0: $offsetx = $PEDIGREE_GENERATIONS < 6 ? $offsetx = 60 * (5 - $PEDIGREE_GENERATIONS) : 0; $offsety = $yoffset; break; case 1: $offsetx = $PEDIGREE_GENERATIONS < 4 ? $basexoffset + 60 : $basexoffset; $offsety = $yoffset; break; case 2: $offsetx = $xoffset - 10 + $controller->pbwidth / 2; $offsety = $yoffset + $controller->pbheight / 2 + 10; $arrow = 'icon-darrow'; break; case 3: $offsetx = $xoffset - 10 + $controller->pbwidth / 2; $offsety = $yoffset - $controller->pbheight / 2 - 10; $arrow = 'icon-uarrow'; break; } printf(MENU_WRAPPER, $posn, $offsetx, $offsety, $arrow); foreach ($famids as $family) { echo '', I18N::translate('Family'), ''; $spouse = $family->getSpouse($controller->root); if ($spouse) { printf(MENU_ITEM, $spouse->getXref(), $controller->show_full, $controller->PEDIGREE_GENERATIONS, $talloffset, 'name1', $spouse->getFullName()); } $children = $family->getChildren(); foreach ($children as $child) { printf(MENU_ITEM, $child->getXref(), $controller->show_full, $controller->PEDIGREE_GENERATIONS, $talloffset, 'name1', $child->getFullName()); } } //-- echo the siblings foreach ($cfamids as $family) { if ($family != null) { $siblings = array_filter($family->getChildren(), function(Individual $item) use ($controller) { return $controller->rootid != $item->getXref(); }); $num = count($siblings); if ($num) { echo ""; echo $num > 1 ? I18N::translate('Siblings') : I18N::translate('Sibling'); echo ""; foreach ($siblings as $child) { printf(MENU_ITEM, $child->getXref(), $controller->show_full, $controller->PEDIGREE_GENERATIONS, $talloffset, 'name1', $child->getFullName()); } } } } echo '
', // #childbox '
', '
'; // #childarrow } // calculate canvas width if ($talloffset < 2) { $canvaswidth = $PEDIGREE_GENERATIONS * ($controller->pbwidth + 20); } else { $canvaswidth = pow(2, $PEDIGREE_GENERATIONS - 1) * ($controller->pbwidth + 20); } echo '

No lines between boxes? Unfortunately your browser does not support the HTML5 canvas feature.

'; echo ''; //close #pedigree_chart echo ''; //close #pedigree-page // Expand
to include the absolutely-positioned elements. $controller->addInlineJavascript(' var WT_PEDIGREE_CHART = (function() { jQuery("html").css("overflow","visible"); // workaround for chrome v37 canvas bugs jQuery("#pedigree-page").css("height", "' . ($maxyoffset + 30) . '"); // Draw joining lines in // Set variables var textdirection = "' . $TEXT_DIRECTION . '", talloffset = ' . $talloffset . ', canvaswidth = ' . ($canvaswidth) . ', offset_x = 20, offset_y = ' . $controller->pbheight . '/2+' . $controller->linewidth . ', lineDrawx = new Array("' . join(array_reverse($lineDrawx), '","') . '"), lineDrawy = new Array("' . join(array_reverse($lineDrawy), '","') . '"), offset_x2 = ' . $controller->pbwidth . '/2+' . $controller->linewidth . ', offset_y2 = ' . $controller->pbheight . '*2, lineDrawx2 = new Array("' . join($lineDrawx, '","') . '"), lineDrawy2 = new Array("' . join($lineDrawy, '","') . '"), maxjoins = Math.pow(2,' . $PEDIGREE_GENERATIONS . '), ctx = jQuery("#pedigree_canvas")[0].getContext("2d"); // Set line styles ctx.strokeStyle = jQuery("#pedigree_canvas").css("color"); ctx.lineWidth = ' . $controller->linewidth . '; ctx.shadowColor = "' . $controller->shadowcolor . '"; ctx.shadowBlur = ' . $controller->shadowblur . '; ctx.shadowOffsetX = ' . $controller->shadowoffsetX . '; ctx.shadowOffsetY = ' . $controller->shadowoffsetY . '; //Draw the lines switch (talloffset) { case 0: // portrait // drop through case 1: // landscape for (var i = 0; i <= maxjoins-3; i+=2) { if (textdirection == "rtl") { ctx.moveTo(canvaswidth-lineDrawx[i],lineDrawy[i]-0+offset_y+offset_x/2); ctx.lineTo(canvaswidth-lineDrawx[i]+offset_x,lineDrawy[i]-0+offset_y+offset_x/2); ctx.lineTo(canvaswidth-lineDrawx[i+1]+offset_x,lineDrawy[i+1]-0+offset_y-offset_x/2); ctx.lineTo(canvaswidth-lineDrawx[i+1],lineDrawy[i+1]-0+offset_y-offset_x/2); } else { ctx.moveTo(lineDrawx[i],lineDrawy[i]-0+offset_y+offset_x/2); ctx.lineTo(lineDrawx[i]-offset_x,lineDrawy[i]-0+offset_y+offset_x/2); ctx.lineTo(lineDrawx[i+1]-offset_x,lineDrawy[i+1]-0+offset_y-offset_x/2); ctx.lineTo(lineDrawx[i+1],lineDrawy[i+1]-0+offset_y-offset_x/2); } } break; case 2: // oldest at top for (var i = 1; i <= maxjoins; i+=2) { if (textdirection == "rtl") { ctx.moveTo(lineDrawx2[i]-0+offset_x2-offset_x,lineDrawy2[i]); ctx.lineTo(lineDrawx2[i]-0+offset_x2-offset_x,lineDrawy2[i]-0+offset_y2); ctx.lineTo(lineDrawx2[i+1]-0+offset_x2+offset_x/2,lineDrawy2[i]-0+offset_y2); ctx.lineTo(lineDrawx2[i+1]-0+offset_x2+offset_x/2,lineDrawy2[i]); } else { ctx.moveTo(lineDrawx2[i]-0+offset_x2-offset_x/2,lineDrawy2[i]); ctx.lineTo(lineDrawx2[i]-0+offset_x2-offset_x/2,lineDrawy2[i]-0+offset_y2); ctx.lineTo(lineDrawx2[i+1]-0+offset_x2+offset_x/2,lineDrawy2[i]-0+offset_y2); ctx.lineTo(lineDrawx2[i+1]-0+offset_x2+offset_x/2,lineDrawy2[i]); } } break; case 3: // oldest at bottom // drop through default: // anything else for (var i = 1; i <= maxjoins; i+=2) { ctx.moveTo(lineDrawx2[i]-0+offset_x2-offset_x,lineDrawy2[i]); ctx.lineTo(lineDrawx2[i]-0+offset_x2-offset_x,lineDrawy2[i]-offset_y2/2); ctx.lineTo(lineDrawx2[i+1]-0+offset_x2+offset_x/2,lineDrawy2[i]-offset_y2/2); ctx.lineTo(lineDrawx2[i+1]-0+offset_x2+offset_x/2,lineDrawy2[i]); } } ctx.stroke(); jQuery("#childarrow").on("click", ".menuselect", function(e) { e.preventDefault(); jQuery("#childbox").slideToggle("fast"); }); return "' . strip_tags($controller->root->getFullName()) . '"; })(); ');