{
  "schema": {"language": "vega", "version": "3.0"},
  "width": 720,
  "height": 480,
  "padding": 5,

  "signals": [
    { "name": "min", "update": "+datetime('Jan 1 2000')" },
    { "name": "max", "update": "+datetime('Mar 1 2010')" },
    {
      "name": "brush", "value": 0,
      "on": [
        {
          "events": "@overview:mousedown",
          "update": "[x(), x()]"
        },
        {
          "events": "[@overview:mousedown, window:mouseup] > window:mousemove",
          "update": "[brush[0], clamp(x(), 0, width)]"
        },
        {
          "events": {"signal": "delta"},
          "update": "clampRange([anchor[0] + delta, anchor[1] + delta], 0, width)"
        }
      ]
    },
    {
      "name": "anchor", "value": null,
      "on": [{"events": "@brush:mousedown", "update": "slice(brush)"}]
    },
    {
      "name": "xdown", "value": 0,
      "on": [{"events": "@brush:mousedown", "update": "x()"}]
    },
    {
      "name": "delta", "value": 0,
      "on": [
        {
          "events": "[@brush:mousedown, window:mouseup] > window:mousemove",
          "update": "x() - xdown"
        }
      ]
    },
    {
      "name": "cursor", "value": "'default'",
      "on": [
        {
          "events": "[@overview:mousedown, window:mouseup] > window:mousemove!",
          "update": "'ew-resize'"
        },
        {
          "events": "@brush:mousemove, [@brush:mousedown, window:mouseup] > window:mousemove!",
          "update": "'move'"
        },
        {
          "events": "@brush:mouseout, window:mouseup",
          "update": "'default'"
        }
      ]
    },
    {
      "name": "range", "update": "[min, min]",
      "on": [
        {
          "events": {"signal": "brush"},
          "update": "invert('xOverview', brush)"
        }
      ]
    },
    {
      "name": "min_date",
      "update": "+range[0] === +range[1] ? min : min(range[0], range[1])"
    },
    {
      "name": "max_date",
      "update": "+range[0] === +range[1] ? max : max(range[0], range[1])"
    }
  ],

  "data": [
    {
      "name": "sp500",
      "url": "data/sp500.csv",
      "format": {"type": "csv", "parse": {"price": "number", "date": "date"}}
    }
  ],

  "scales": [
    {
      "name": "xOverview",
      "type": "time",
      "range": "width",
      "domain": {"data": "sp500", "field": "date"}
    },
    {
      "name": "yOverview",
      "type": "linear",
      "range": [70, 0],
      "domain": {"data": "sp500", "field": "price"},
      "nice": true, "zero": true
    },
    {
      "name": "xDetail",
      "type": "time",
      "range": "width",
      "domain": [{"signal": "min_date"}, {"signal": "max_date"}]
    },
    {
      "name": "yDetail",
      "type": "linear",
      "range": [390, 0],
      "domain": {"data": "sp500", "field": "price"},
      "nice": true, "zero": true
    }
  ],

  "marks": [
    {
      "type": "group",
      "name": "detail",
      "encode": {
        "enter": {
          "height": {"value": 390},
          "width": {"value": 720}
        }
      },
      "axes": [
        {"orient": "bottom", "scale": "xDetail"},
        {"orient": "left", "scale": "yDetail"}
      ],
      "marks": [
        {
          "type": "group",
          "encode": {
            "enter": {
              "height": {"field": {"group": "height"}},
              "width": {"field": {"group": "width"}},
              "clip": {"value": true}
            }
          },
          "marks": [
            {
              "type": "area",
              "from": {"data": "sp500"},
              "encode": {
                "update": {
                  "x": {"scale": "xDetail", "field": "date"},
                  "y": {"scale": "yDetail", "field": "price"},
                  "y2": {"scale": "yDetail", "value": 0},
                  "fill": {"value": "steelblue"}
                }
              }
            }
          ]
        }
      ]
    },

    {
      "type": "group",
      "name": "overview",
      "encode": {
        "enter": {
          "x": {"value": 0},
          "y": {"value": 430},
          "height": {"value": 70},
          "width": {"value": 720},
          "fill": {"value": "transparent"}
        }
      },
      "axes": [
        {"orient": "bottom", "scale": "xOverview"}
      ],
      "marks": [
        {
          "type": "area",
          "interactive": false,
          "from": {"data": "sp500"},
          "encode": {
            "update": {
              "x": {"scale": "xOverview", "field": "date"},
              "y": {"scale": "yOverview", "field": "price"},
              "y2": {"scale": "yOverview", "value": 0},
              "fill": {"value": "steelblue"}
            }
          }
        },
        {
          "type": "rect",
          "name": "brush",
          "encode":{
            "enter":{
              "y": {"value": 0},
              "height": {"value":70},
              "fill": {"value": "#333"},
              "fillOpacity": {"value":0.2}
            },
            "update":{
              "x": {"signal": "brush[0]"},
              "x2": {"signal": "brush[1]"}
            }
          }
        },
        {
          "type": "rect",
          "interactive": false,
          "encode":{
            "enter":{
              "y": {"value": 0},
              "height": {"value":70},
              "width": {"value": 1},
              "fill": {"value": "firebrick"}
            },
            "update":{
              "x": {"signal": "brush[0]"}
            }
          }
        },
        {
          "type": "rect",
          "interactive": false,
          "encode":{
            "enter":{
              "y": {"value": 0},
              "height": {"value":70},
              "width": {"value": 1},
              "fill": {"value": "firebrick"}
            },
            "update":{
              "x": {"signal": "brush[1]"}
            }
          }
        }
      ]
    }
  ]
}
