function determineSize()

in src/core/main.ts [3160:3590]


  function determineSize(data, scale, layout, representation) {
    //logEvent("timeline: " + scale + " - " + layout + " - " + representation, "sizing");

    switch (representation) {

      case "Linear":
        switch (scale) {

          case "Chronological":
            switch (layout) {

              case "Unified":
                // justifiable
                assignTracks(data, [], layout);
                //logEvent("# tracks: " + globals.num_tracks, "sizing");

                globals.width = instance._render_width - globals.margin.right - globals.margin.left - getScrollbarWidth();
                globals.height = globals.num_tracks * globals.track_height + 1.5 * globals.track_height + globals.margin.top + globals.margin.bottom;
                break;

              case "Faceted":
                // justifiable
                processFacets();
                //logEvent("# within-facet tracks: " + (globals.max_num_tracks + 1), "sizing");

                globals.width = instance._render_width - globals.margin.right - globals.margin.left - getScrollbarWidth();
                globals.height = (globals.max_num_tracks * globals.track_height + 1.5 * globals.track_height) * globals.num_facets + globals.margin.top + globals.margin.bottom;
                break;

              case "Segmented":
                // justifiable
                assignTracks(data, [], layout);
                //logEvent("# tracks: " + globals.num_tracks, "sizing");

                globals.width = instance._render_width - globals.margin.right - globals.margin.left - getScrollbarWidth();
                globals.height = (globals.num_tracks * globals.track_height + 1.5 * globals.track_height) * globals.num_segments + globals.margin.top + globals.margin.bottom;
                break;
              default:
                break;
            }
            break;

          case "Relative":
            if (layout === "Faceted") {
              // justifiable
              processFacets();
              //logEvent("# within-facet tracks: " + (globals.max_num_tracks + 1), "sizing");

              globals.width = instance._render_width - globals.margin.right - globals.margin.left - getScrollbarWidth();
              globals.height = (globals.max_num_tracks * globals.track_height + 1.5 * globals.track_height) * globals.num_facets + globals.margin.top + globals.margin.bottom;
            } else {
              // not justifiable
              //logEvent("scale-layout-representation combination not possible/justifiable", "error");

              globals.width = 0;
              globals.height = 0;
            }
            break;

          case "Log":
            if (layout === "Unified") {
              // justifiable
              assignTracks(data, [], layout);
              //logEvent("# tracks: " + globals.num_tracks, "sizing");

              globals.width = instance._render_width - globals.margin.right - globals.margin.left - getScrollbarWidth();
              globals.height = globals.num_tracks * globals.track_height + 1.5 * globals.track_height + globals.margin.top + globals.margin.bottom;
            } else if (layout === "Faceted") {
              // justifiable
              processFacets();
              //logEvent("# within-facet tracks: " + (globals.max_num_tracks + 1), "sizing");

              globals.width = instance._render_width - globals.margin.right - globals.margin.left - getScrollbarWidth();
              globals.height = (globals.max_num_tracks * globals.track_height + 1.5 * globals.track_height) * globals.num_facets + globals.margin.top + globals.margin.bottom;
            } else {
              // not justifiable
              //logEvent("scale-layout-representation combination not possible/justifiable", "error");

              globals.width = 0;
              globals.height = 0;
            }
            break;

          case "Collapsed":
            if (layout === "Unified") {
              // justifiable
              assignSequenceTracks(data);
              globals.max_seq_index = d3.max(data, function (d) { return d.seq_index; }) + 1;
              var bar_chart_height = (4 * globals.unit_width);
              globals.width = globals.max_seq_index * 1.5 * globals.unit_width + globals.margin.left + 3 * globals.margin.right;
              globals.height = (globals.num_seq_tracks * globals.track_height + 1.5 * globals.track_height) + bar_chart_height + globals.margin.top + globals.margin.bottom;
            } else {
              // not justifiable
              //logEvent("scale-layout-representation combination not possible/justifiable", "error");

              globals.width = 0;
              globals.height = 0;
            }
            break;

          case "Sequential":
            if (layout === "Unified") {
              // justifiable
              assignSequenceTracks(data);
              globals.max_seq_index = d3.max(data, function (d) { return d.seq_index; }) + 1;
              globals.width = d3.max([
                globals.max_seq_index * 1.5 * globals.unit_width + globals.margin.left + globals.margin.right,
                instance._render_width - globals.margin.right - globals.margin.left - getScrollbarWidth()
              ]);
              globals.height = globals.num_seq_tracks * globals.track_height + 1.5 * globals.track_height + globals.margin.top + globals.margin.bottom;
            } else if (layout === "Faceted") {
              // justifiable
              processFacets();
              globals.max_seq_index = d3.max(data, function (d) { return d.seq_index; }) + 1;
              globals.width = d3.max([
                globals.max_seq_index * 1.5 * globals.unit_width + globals.margin.left + globals.margin.right,
                instance._render_width - globals.margin.right - globals.margin.left - getScrollbarWidth()
              ]);
              globals.height = (globals.max_num_seq_tracks * globals.track_height + 1.5 * globals.track_height) * globals.num_facets + globals.margin.top + globals.margin.bottom;
            } else {
              // not justifiable
              //logEvent("scale-layout-representation combination not possible/justifiable", "error");

              globals.width = 0;
              globals.height = 0;
            }
            break;
          default:
            break;
        }
        break;

      case "Radial":

        globals.centre_radius = 50;

        var effective_size = instance._render_width - globals.margin.right - globals.padding.right - globals.margin.left - globals.padding.left - getScrollbarWidth();

        switch (scale) {

          case "Chronological":

            switch (layout) {

              case "Unified":
                // justifiable
                assignTracks(data, [], layout);
                //logEvent("# tracks: " + globals.num_tracks, "sizing");

                globals.centre_radius = d3.max([50, (effective_size - ((globals.num_tracks + 2) * 2 * globals.track_height)) / 2]);
                globals.width = (2 * globals.centre_radius + (globals.num_tracks + 2) * 2 * globals.track_height) + globals.margin.left + globals.margin.right;
                if (globals.centre_radius > 200) { globals.centre_radius = 200; }
                globals.height = (2 * globals.centre_radius + (globals.num_tracks + 2) * 2 * globals.track_height) + globals.margin.top + globals.margin.bottom;
                break;

              case "Faceted":
                // justifiable
                processFacets();

                globals.centre_radius = 50;
                var estimated_facet_width = (2 * globals.centre_radius + (globals.max_num_tracks + 2) * 2 * globals.track_height);

                globals.num_facet_cols = d3.max([1, d3.min([globals.num_facet_cols, Math.floor(effective_size / estimated_facet_width)])]);
                globals.num_facet_rows = Math.ceil(globals.num_facets / globals.num_facet_cols);

                globals.centre_radius = d3.max([50, (effective_size / globals.num_facet_cols - ((globals.max_num_tracks + 2) * 2 * globals.track_height)) / 2]);
                globals.width = (2 * globals.centre_radius + (globals.max_num_tracks + 2) * 2 * globals.track_height) * globals.num_facet_cols + globals.margin.left + globals.margin.right;
                if (globals.centre_radius > 200) { globals.centre_radius = 200; }
                globals.height = (2 * globals.centre_radius + (globals.max_num_tracks + 2) * 2 * globals.track_height) * globals.num_facet_rows + globals.margin.top + globals.margin.bottom + globals.num_facet_rows * globals.buffer;
                break;

              case "Segmented":
                // justifiable
                assignTracks(data, [], layout);
                //logEvent("# tracks: " + globals.num_tracks, "sizing");

                globals.centre_radius = 50;
                var estimated_segment_width = (2 * globals.centre_radius + (globals.num_tracks + 2) * 2 * globals.track_height);

                globals.num_segment_cols = d3.max([1, d3.min([globals.num_segment_cols, Math.floor(effective_size / estimated_segment_width)])]);
                globals.num_segment_rows = Math.ceil(globals.num_segments / globals.num_segment_cols);

                globals.centre_radius = d3.max([50, (effective_size / globals.num_segment_cols - ((globals.num_tracks + 2) * 2 * globals.track_height)) / 2]);
                globals.width = (2 * globals.centre_radius + (globals.num_tracks + 2) * 2 * globals.track_height) * globals.num_segment_cols + globals.margin.left + globals.margin.right;
                if (globals.centre_radius > 200) {
                  globals.centre_radius = 200;
                }
                globals.height = (2 * globals.centre_radius + (globals.num_tracks + 2) * 2 * globals.track_height) * globals.num_segment_rows + globals.margin.top + globals.margin.bottom + globals.num_segment_rows * globals.buffer;
                break;
              default:
                break;
            }
            break;

          case "Relative":
            if (layout === "Faceted") {
              // justifiable
              processFacets();
              //logEvent("# within-facet tracks: " + (globals.max_num_tracks + 1), "sizing");

              globals.centre_radius = 50;
              estimated_facet_width = (2 * globals.centre_radius + (globals.max_num_tracks + 2) * 2 * globals.track_height);

              globals.num_facet_cols = d3.min([globals.num_facet_cols, Math.floor(effective_size / estimated_facet_width)]);
              globals.num_facet_rows = Math.ceil(globals.num_facets / globals.num_facet_cols);

              globals.centre_radius = d3.max([50, (effective_size / globals.num_facet_cols - ((globals.max_num_tracks + 2) * 2 * globals.track_height)) / 2]);
              globals.width = (2 * globals.centre_radius + (globals.max_num_tracks + 2) * 2 * globals.track_height) * globals.num_facet_cols + globals.margin.left + globals.margin.right;
              if (globals.centre_radius > 200) {
                globals.centre_radius = 200;
              }
              globals.height = (2 * globals.centre_radius + (globals.max_num_tracks + 2) * 2 * globals.track_height) * globals.num_facet_rows + globals.margin.top + globals.margin.bottom + globals.num_facet_rows * globals.buffer;
            } else {
              // not justifiable
              //logEvent("scale-layout-representation combination not possible/justifiable", "error");

              globals.width = 0;
              globals.height = 0;
            }
            break;

          case "Sequential":
            if (layout === "Unified") {
              // justifiable
              assignSequenceTracks(data);
              globals.max_seq_index = d3.max(data, function (d) { return d.seq_index; }) + 1;
              globals.centre_radius = (effective_size - (4 * globals.track_height)) / 2;
              globals.width = (2 * globals.centre_radius + 4 * globals.track_height) + globals.margin.left + globals.margin.right;
              if (globals.centre_radius > 200) {
                globals.centre_radius = 200;
              }
              globals.height = (2 * globals.centre_radius + 4 * globals.track_height) + globals.margin.top + globals.margin.bottom;
            } else if (layout === "Faceted") {
              // justifiable

              processFacets();
              globals.max_seq_index = d3.max(data, function (d) { return d.seq_index; }) + 1;

              globals.centre_radius = 50;
              estimated_facet_width = (2 * globals.centre_radius + (4 * globals.track_height));

              globals.num_facet_cols = d3.min([globals.num_facet_cols, Math.floor(effective_size / estimated_facet_width)]);
              globals.num_facet_rows = Math.ceil(globals.num_facets / globals.num_facet_cols);

              globals.centre_radius = d3.max([50, (effective_size / globals.num_facet_cols - (4 * globals.track_height)) / 2]);
              globals.width = (2 * globals.centre_radius + 4 * globals.track_height) * globals.num_facet_cols + globals.margin.left + globals.margin.right;
              if (globals.centre_radius > 200) {
                globals.centre_radius = 200;
              }
              globals.height = (2 * globals.centre_radius + 4 * globals.track_height) * globals.num_facet_rows + globals.margin.top + globals.margin.bottom + globals.num_facet_rows * globals.buffer;
            } else {
              // not justifiable
              //logEvent("scale-layout-representation combination not possible/justifiable", "error");

              globals.width = 0;
              globals.height = 0;
            }
            break;
          default:
            break;
        }
        break;

      case "Grid":

        if (scale === "Chronological" && layout === "Segmented") {
          // justifiable

          assignTracks(data, [], layout);

          var cell_size = 50,
            century_height = cell_size * globals.unit_width,
            century_width = cell_size * 10;

          // determine the range, round to whole centuries
          var range_floor = Math.floor(data.min_start_date.getUTCFullYear() / 100) * 100,
            range_ceil = Math.ceil((data.max_end_date.getUTCFullYear() + 1) / 100) * 100;

          // determine the time domain of the data along a linear quantitative scale
          var year_range = d3.range(range_floor, range_ceil);

          // determine maximum number of centuries given year_range
          var num_centuries = (Math.ceil(year_range.length / 100));

          globals.width = century_width + globals.margin.left + globals.margin.right;
          globals.height = num_centuries * century_height + num_centuries * cell_size + globals.margin.top + globals.margin.bottom - cell_size;
        } else {
          // not justifiable
          //logEvent("scale-layout-representation combination not possible/justifiable", "error");

          globals.width = 0;
          globals.height = 0;
        }
        break;

      case "Calendar":

        if (scale === "Chronological" && layout === "Segmented") {
          // justifiable

          assignTracks(data, [], layout);

          cell_size = 20;
          var year_height = cell_size * 8, // 7 days of week + buffer
            year_width = cell_size * 53; // 53 weeks of the year + buffer

          // determine the range, round to whole centuries
          range_floor = data.min_start_date.getUTCFullYear();
          range_ceil = data.max_end_date.getUTCFullYear();

          // determine the time domain of the data along a linear quantitative scale
          year_range = d3.range(range_floor, range_ceil + 1);

          globals.width = year_width + globals.margin.left + globals.margin.right;
          globals.height = year_range.length * year_height + globals.margin.top + globals.margin.bottom - cell_size;
        } else {
          // not justifiable
          //logEvent("scale-layout-representation combination not possible/justifiable", "error");

          globals.width = 0;
          globals.height = 0;
        }
        break;

      case "Spiral":

        if (scale === "Sequential") {
          if (layout === "Unified") {
            // justifiable

            assignSequenceTracks(data);
            globals.max_seq_index = d3.max(data, function (d) { return d.seq_index; }) + 1;
            var angle = 0,
              i = 0;

            data.forEach(function (item) {
              var radius = Math.sqrt(i + 1);
              angle += Math.asin(1 / radius);
              i++;
              item.spiral_index = i;
              item.spiral_x = Math.cos(angle) * (radius * globals.spiral_padding);
              item.spiral_y = Math.sin(angle) * (radius * globals.spiral_padding);
            });

            var max_x = d3.max(data, function (d) { return d.spiral_x; });
            var max_y = d3.max(data, function (d) { return d.spiral_y; });
            var min_x = d3.min(data, function (d) { return d.spiral_x; });
            var min_y = d3.min(data, function (d) { return d.spiral_y; });

            globals.spiral_dim = d3.max([(max_x + 2 * globals.spiral_padding) - (min_x - 2 * globals.spiral_padding), (max_y + 2 * globals.spiral_padding) - (min_y - 2 * globals.spiral_padding)]);

            globals.width = d3.max([
              globals.spiral_dim + globals.spiral_padding + globals.margin.right + globals.margin.left,
              instance._render_width - globals.margin.right - globals.margin.left - getScrollbarWidth()
            ]);

            // USES EFFECTIVE_HEIGHT
            globals.height = d3.max([
              globals.spiral_dim + globals.spiral_padding + globals.margin.top + globals.margin.bottom,
              instance._render_height - globals.margin.top - globals.margin.bottom - getScrollbarWidth()
            ]);
          } else if (layout === "Faceted") {
            // justifiable
            processFacets();
            globals.max_seq_index = d3.max(data, function (d) { return d.seq_index; }) + 1;

            globals.timeline_facets.forEach(function (timeline) {
              angle = 0;
              i = 0;

              timeline.values.forEach(function (item) {
                var radius = Math.sqrt(i + 1);
                angle += Math.asin(1 / radius);
                i++;
                item.spiral_index = i;
                item.spiral_x = Math.cos(angle) * (radius * globals.spiral_padding);
                item.spiral_y = Math.sin(angle) * (radius * globals.spiral_padding);
              });
            });

            max_x = d3.max(data, function (d) { return d.spiral_x; });
            max_y = d3.max(data, function (d) { return d.spiral_y; });
            min_x = d3.min(data, function (d) { return d.spiral_x; });
            min_y = d3.min(data, function (d) { return d.spiral_y; });

            globals.spiral_dim = d3.max([(max_x + 2 * globals.spiral_padding) - (min_x - 2 * globals.spiral_padding), (max_y + 2 * globals.spiral_padding) - (min_y - 2 * globals.spiral_padding)]);

            effective_size = instance._render_width - globals.margin.right - globals.margin.left - getScrollbarWidth();

            globals.num_facet_cols = d3.min([globals.num_facet_cols, Math.floor(effective_size / globals.spiral_dim)]);
            globals.num_facet_rows = Math.ceil(globals.num_facets / globals.num_facet_cols);

            globals.width = d3.max([
              globals.num_facet_cols * globals.spiral_dim + globals.margin.right + globals.margin.left,
              instance._render_width - globals.margin.right - globals.margin.left - getScrollbarWidth()
            ]);
            globals.height = globals.num_facet_rows * globals.spiral_dim + globals.margin.top + globals.margin.bottom;
          } else {
            // not justifiable
            globals.width = 0;
            globals.height = 0;
          }
        } else {
          // not justifiable
          //logEvent("scale-layout-representation combination not possible/justifiable", "error");

          globals.width = 0;
          globals.height = 0;
        }
        break;

      case "Curve":
        if (scale === "Sequential" && layout === "Unified") {
          // justifiable
          assignSequenceTracks(data);
          globals.max_seq_index = d3.max(data, function (d) { return d.seq_index; }) + 1;
          globals.width = instance._render_width - globals.margin.right - globals.margin.left - getScrollbarWidth();
          globals.height = instance._render_height - globals.margin.top - globals.margin.bottom - getScrollbarWidth();
        } else {
          // not justifiable
          //logEvent("scale-layout-representation combination not possible/justifiable", "error");

          globals.width = 0;
          globals.height = 0;
        }
        break;
      default:
        break;
    }
    //logEvent("dimensions: " + globals.width + " (W) x " + globals.height + " (H)", "sizing");
  }