Selected Quarterly Financial Data (Unaudited) - Schedule of Quarterly Financial Information (Details) - USD ($) $ / shares in Units, shares in Thousands, $ in Thousands |
3 Months Ended | 12 Months Ended | |||||||||
|---|---|---|---|---|---|---|---|---|---|---|---|
Dec. 31, 2019 |
Sep. 27, 2019 |
Jun. 28, 2019 |
Mar. 29, 2019 |
Dec. 31, 2018 |
Sep. 28, 2018 |
Jun. 29, 2018 |
Mar. 30, 2018 |
Dec. 31, 2019 |
Dec. 31, 2018 |
Dec. 31, 2017 |
|
| Quarterly Financial Information Disclosure [Abstract] | |||||||||||
| Total revenue | $ 365,271 | $ 359,854 | $ 331,589 | $ 325,928 | $ 329,561 | $ 308,095 | $ 321,132 | $ 320,516 | $ 1,382,642 | $ 1,279,304 | $ 1,114,788 |
| Gross profit | 34,246 | 34,317 | 31,036 | 30,332 | 30,030 | 29,131 | 29,068 | 26,466 | |||
| Operating income | 15,626 | 14,383 | 11,193 | 10,413 | 12,648 | 14,006 | 12,998 | 8,671 | 51,615 | 48,323 | 41,220 |
| Net income | $ 10,626 | $ 9,382 | $ 7,617 | $ 7,091 | $ 10,124 | $ 9,866 | $ 9,195 | $ 6,111 | $ 34,716 | $ 35,296 | $ 59,497 |
| Basic earnings per share (in dollars per share) | $ 0.92 | $ 0.82 | $ 0.66 | $ 0.63 | $ 0.90 | $ 0.88 | $ 0.82 | $ 0.55 | $ 3.03 | $ 3.14 | $ 5.40 |
| Diluted earnings per share (in dollars per share) | $ 0.91 | $ 0.80 | $ 0.66 | $ 0.62 | $ 0.89 | $ 0.86 | $ 0.81 | $ 0.54 | $ 2.99 | $ 3.10 | $ 5.31 |
| Weighted average number of shares outstanding - basic (in shares) | 11,515 | 11,506 | 11,455 | 11,292 | 11,262 | 11,248 | 11,235 | 11,146 | 11,444 | 11,224 | 11,021 |
| Weighted average number of shares outstanding - diluted (in shares) | 11,728 | 11,678 | 11,605 | 11,399 | 11,369 | 11,406 | 11,383 | 11,338 | 11,612 | 11,378 | 11,209 |