This isn't a very elegant implementation, but since nobody else has answered so far, I've decided to post it. It is an extension of what I posted in this previous question.
f1[x_] := x^2
f2[x_] := x + 1
With[{span = 10., δ = .1, f1DragPt = {0., f1[0.]}, f2DragPt = {0., f2[0.]}},
Framed @
DynamicModule[{mXY, action, xmin, xmax, ymin, ymax, p1, p2},
{xmin, xmax} = {ymin, ymax} = span {-1., 1.}/2.;
p1 = p2 = {0., 0.};
EventHandler[
Dynamic @
Plot[
{f1[t - p1[[1]]] + p1[[2]], f2[t - p2[[1]]] + p2[[2]]},
{t, xmin, xmax},
AspectRatio -> Automatic,
PlotRange -> {{xmin, xmax}, {ymin, ymax}},
GridLines ->
{Floor /@ Range[xmin, xmax], Floor /@ Range[ymin, ymax]}],
{"MouseDown" :>
(mXY = MousePosition["Graphics"];
Which[
Abs[f1[mXY[[1]] - p1[[1]]] + p1[[2]] - mXY[[2]]] < δ, action = "moveF1",
Abs[f2[mXY[[1]] - p2[[1]]] + p2[[2]] - mXY[[2]]] < δ, action = "moveF2",
True, action = "pan"])},
{"MouseDragged" :>
Module[{xy, dx, dy},
xy = MousePosition["Graphics"];
Switch[action,
"pan",
{dx, dy} = xy - mXY; xmin -= dx; xmax -= dx; ymin -= dy; ymax -= dy,
"moveF1", p1 = xy - f1DragPt,
"moveF2", p2 = xy - f2DragPt]]}]]]
Initial plot

Plot after some panning and curve dragging.

To select a curve for moving, click anywhere along the curve. However, dragging will always be with the mouse cursor at the designated drag point.
Having to designate drag points for each curve is one of the inelegant features of this solution.
Update
Here is a version that doesn't require designating drag points in advance. Any point of a curve can serve as a drag point.
With[{span = 10., δ = .1},
Framed @
DynamicModule[
{mXY, action, f1DragPt, f2DragPt, xmin, xmax, ymin, ymax, p1, p2},
{xmin, xmax} = {ymin, ymax} = span {-1., 1.}/2.;
p1 = p2 = {0., 0.};
EventHandler[
Dynamic @
Plot[
{f1[t - p1[[1]]] + p1[[2]], f2[t - p2[[1]]] + p2[[2]]},
{t, xmin, xmax},
AspectRatio -> Automatic,
PlotRange -> {{xmin, xmax}, {ymin, ymax}},
GridLines ->
{Floor /@ Range[xmin, xmax], Floor /@ Range[ymin, ymax]}],
{"MouseDown" :>
(mXY = MousePosition["Graphics"];
Which[
Abs[f1[mXY[[1]] - p1[[1]]] + p1[[2]] - mXY[[2]]] < δ,
f1DragPt = mXY - p1; action = "moveF1",
Abs[f2[mXY[[1]] - p2[[1]]] + p2[[2]] - mXY[[2]]] < δ,
f2DragPt = mXY - p2; action = "moveF2",
True, action = "pan"])},
{"MouseDragged" :>
Module[{xy, dx, dy},
xy = MousePosition["Graphics"];
Switch[action,
"pan",
{dx, dy} = xy - mXY; xmin -= dx; xmax -= dx; ymin -= dy; ymax -= dy,
"moveF1", p1 = xy - f1DragPt,
"moveF2", p2 = xy - f2DragPt]]}]]]
PlotRange
. So, unlike the other solutions here, you won't hit a wall if you pan too far. It also, somewhat amusingly, supports "throwing". I don't have it anywhere at the moment, but if there's interest, I could maybe throw it up on a Github gist or something. $\endgroup$