Condensed Consolidated Statements of Stockholders' Equity (Unaudited) - USD ($) shares in Thousands, $ in Thousands | Common Class A [Member] Retained Earnings [Member] | Common Class A [Member] AOCI Attributable to Parent [Member] | Common Class A [Member] Common Stock, Common Class A [Member] | Common Class A [Member] Common Stock, Common Class B [Member] | Common Class A [Member] Treasury Stock, Common [Member] | Common Class A [Member] Additional Paid-in Capital [Member] | Common Class A [Member] | Common Class B [Member] Retained Earnings [Member] | Common Class B [Member] AOCI Attributable to Parent [Member] | Common Class B [Member] Common Stock, Common Class A [Member] | Common Class B [Member] Common Stock, Common Class B [Member] | Common Class B [Member] Treasury Stock, Common [Member] | Common Class B [Member] Additional Paid-in Capital [Member] | Common Class B [Member] | Retained Earnings [Member] | AOCI Attributable to Parent [Member] | Common Stock, Common Class A [Member] | Common Stock, Common Class B [Member] | Treasury Stock, Common [Member] | Additional Paid-in Capital [Member] | Total |
Balance at Dec. 31, 2022 | | | | | | | | | | | | | | | $ 237,188 | $ (16,546) | $ 214 | $ 1,067 | $ (349) | $ 40,772 | $ 262,346 |
Balance (in shares) at Dec. 31, 2022 | | | | | | | | | | | | | | | | | 2,142 | 10,643 | | | |
Net earnings | | | | | | | | | | | | | | | 14,572 | 0 | $ 0 | $ 0 | 0 | 0 | 14,572 |
Cash dividends declared on common stock | $ (128) | $ 0 | $ 0 | $ 0 | $ 0 | $ 0 | $ (128) | $ (747) | $ 0 | $ 0 | $ 0 | $ 0 | $ 0 | $ (747) | | | | | | | |
Forfeiture of restricted common stock | | | | | | | | | | | | | | | 0 | 0 | $ 0 | $ (1) | 0 | | 0 |
Forfeiture of restricted common stock (in shares) | | | | | | | | | | | | | | | | | 0 | (10) | | | |
Forfeiture of restricted common stock | | | | | | | | | | | | | | | 0 | 0 | $ 0 | $ (1) | 0 | | 0 |
Foreign currency translation adjustment, net of taxes | | | | | | | | | | | | | | | 0 | 1,998 | 0 | 0 | 0 | 0 | 1,998 |
Unrealized holding gains on interest rate swap cash flow hedge, net of taxes | | | | | | | | | | | | | | | 0 | (894) | 0 | 0 | 0 | 0 | (894) |
Unrealized holding gains on marketable securities, net of taxes | | | | | | | | | | | | | | | 0 | 1 | 0 | 0 | 0 | 0 | 1 |
Stock-based compensation expense | | | | | | | | | | | | | | | 0 | 0 | 0 | 0 | 0 | 902 | 902 |
Change in unfunded SERP liability, net of taxes | | | | | | | | | | | | | | | 0 | 13 | 0 | 0 | 0 | 0 | 13 |
Net earnings | | | | | | | | | | | | | | | 14,572 | 0 | 0 | 0 | 0 | 0 | 14,572 |
Forfeiture of restricted common stock | | | | | | | | | | | | | | | 0 | 0 | $ 0 | $ 1 | 0 | | 0 |
Forfeiture of restricted common stock (in shares) | | | | | | | | | | | | | | | | | 0 | (10) | | | |
Forfeiture of restricted common stock | | | | | | | | | | | | | | | | | | | | (1) | |
Forfeiture of restricted common stock | | | | | | | | | | | | | | | | | | | | 1 | |
Stock-based compensation expense | | | | | | | | | | | | | | | 0 | 0 | $ 0 | $ 0 | 0 | 902 | 902 |
Change in unfunded SERP liability, net of taxes | | | | | | | | | | | | | | | 0 | 13 | 0 | 0 | 0 | 0 | 13 |
Balance at Mar. 31, 2023 | | | | | | | | | | | | | | | 250,885 | (15,428) | $ 214 | $ 1,066 | (349) | 41,675 | 278,063 |
Balance (in shares) at Mar. 31, 2023 | | | | | | | | | | | | | | | | | 2,142 | 10,633 | | | |
Balance at Dec. 31, 2022 | | | | | | | | | | | | | | | 237,188 | (16,546) | $ 214 | $ 1,067 | (349) | 40,772 | 262,346 |
Balance (in shares) at Dec. 31, 2022 | | | | | | | | | | | | | | | | | 2,142 | 10,643 | | | |
Net earnings | | | | | | | 6,790 | | | | | | | 35,557 | | | | | | | 42,347 |
Cash dividends declared on common stock | | | | | | | (257) | | | | | | | (1,490) | | | | | | | |
Foreign currency translation adjustment, net of taxes | | | | | | | | | | | | | | | | | | | | | (233) |
Unrealized holding gains on marketable securities, net of taxes | | | | | | | | | | | | | | | | | | | | | 1 |
Change in unfunded SERP liability, net of taxes | | | | | | | | | | | | | | | | | | | | | 27 |
Net earnings | | | | | | | 6,790 | | | | | | | 35,557 | | | | | | | 42,347 |
Change in unfunded SERP liability, net of taxes | | | | | | | | | | | | | | | | | | | | | 27 |
Balance at Jun. 30, 2023 | | | | | | | | | | | | | | | 277,790 | (16,856) | $ 214 | $ 1,064 | (349) | 42,627 | 304,490 |
Balance (in shares) at Jun. 30, 2023 | | | | | | | | | | | | | | | | | 2,142 | 10,638 | | | |
Balance at Mar. 31, 2023 | | | | | | | | | | | | | | | 250,885 | (15,428) | $ 214 | $ 1,066 | (349) | 41,675 | 278,063 |
Balance (in shares) at Mar. 31, 2023 | | | | | | | | | | | | | | | | | 2,142 | 10,633 | | | |
Net earnings | | | | | | | 4,458 | | | | | | | 23,317 | 27,775 | 0 | $ 0 | $ 0 | 0 | 0 | 27,775 |
Cash dividends declared on common stock | (128) | 0 | 0 | 0 | 0 | 0 | (128) | (742) | 0 | 0 | 0 | 0 | 0 | (742) | | | | | | | |
Issuance of restricted common stock | | | | | | | | | | | | | | | 0 | 0 | $ 0 | $ 1 | 0 | (1) | 0 |
Issuance of restricted common stock (in shares) | | | | | | | | | | | | | | | | | 0 | 10 | | | |
Forfeiture of restricted common stock | | | | | | | | | | | | | | | 0 | 0 | $ 0 | $ (3) | 0 | | 0 |
Forfeiture of restricted common stock (in shares) | | | | | | | | | | | | | | | | | 0 | (5) | | | |
Forfeiture of restricted common stock | | | | | | | | | | | | | | | 0 | 0 | $ 0 | $ (3) | 0 | | 0 |
Foreign currency translation adjustment, net of taxes | | | | | | | | | | | | | | | 0 | (2,231) | 0 | 0 | 0 | 0 | (2,231) |
Unrealized holding gains on interest rate swap cash flow hedge, net of taxes | | | | | | | | | | | | | | | 0 | 789 | 0 | 0 | 0 | 0 | 789 |
Unrealized holding gains on marketable securities, net of taxes | | | | | | | | | | | | | | | | | | | | | 0 |
Stock-based compensation expense | | | | | | | | | | | | | | | 0 | 0 | 0 | 0 | 0 | 950 | 950 |
Change in unfunded SERP liability, net of taxes | | | | | | | | | | | | | | | 0 | 14 | 0 | 0 | 0 | 0 | 14 |
Net earnings | | | | | | | 4,458 | | | | | | | 23,317 | 27,775 | 0 | 0 | 0 | 0 | 0 | 27,775 |
Forfeiture of restricted common stock | | | | | | | | | | | | | | | 0 | 0 | $ 0 | $ 3 | 0 | | 0 |
Forfeiture of restricted common stock (in shares) | | | | | | | | | | | | | | | | | 0 | (5) | | | |
Forfeiture of restricted common stock | | | | | | | | | | | | | | | | | | | | (3) | |
Forfeiture of restricted common stock | | | | | | | | | | | | | | | | | | | | 3 | |
Stock-based compensation expense | | | | | | | | | | | | | | | 0 | 0 | $ 0 | $ 0 | 0 | 950 | 950 |
Change in unfunded SERP liability, net of taxes | | | | | | | | | | | | | | | 0 | 14 | 0 | 0 | 0 | 0 | 14 |
Balance at Jun. 30, 2023 | | | | | | | | | | | | | | | 277,790 | (16,856) | $ 214 | $ 1,064 | (349) | 42,627 | 304,490 |
Balance (in shares) at Jun. 30, 2023 | | | | | | | | | | | | | | | | | 2,142 | 10,638 | | | |
Balance at Dec. 31, 2023 | | | | | | | | | | | | | | | 307,510 | (12,037) | $ 214 | $ 1,065 | (454) | 44,260 | 340,558 |
Balance (in shares) at Dec. 31, 2023 | | | | | | | | | | | | | | | | | 2,142 | 10,620 | | | |
Net earnings | | | | | | | | | | | | | | | 15,874 | 0 | $ 0 | $ 0 | 0 | 0 | 15,874 |
Cash dividends declared on common stock | (129) | 0 | 0 | 0 | 0 | 0 | (129) | (747) | 0 | 0 | 0 | 0 | 0 | (747) | | | | | | | |
Issuance of restricted common stock | | | | | | | | | | | | | | | 0 | 0 | $ 0 | $ 6 | $ 0 | $ (6) | 0 |
Issuance of restricted common stock (in shares) | | | | | | | | | | | | | | | | | 0 | 58 | | | |
Forfeiture of restricted common stock | | | | | | | | | | | | | | | 0 | 0 | $ 0 | $ (6) | | | 0 |
Forfeiture of restricted common stock (in shares) | | | | | | | | | | | | | | | | | 0 | 0 | 0 | 0 | |
Forfeiture of restricted common stock | | | | | | | | | | | | | | | 0 | 0 | $ 0 | $ (6) | | | 0 |
Purchases of common stock | | | | | | | | | | | | | | | 0 | 0 | $ (1) | $ (10) | $ (6,283) | | (6,283) |
Purchases of common stock (in shares) | | | | | | | | | | | | | | | | | (11) | (98) | | | |
Purchases of common stock | | | | | | | | | | | | | | | | | | | | $ 11 | |
Foreign currency translation adjustment, net of taxes | | | | | | | | | | | | | | | 0 | (3,776) | $ 0 | $ 0 | 0 | 0 | (3,776) |
Unrealized holding gains on interest rate swap cash flow hedge, net of taxes | | | | | | | | | | | | | | | 0 | 340 | 0 | 0 | 0 | 0 | 340 |
Unrealized holding gains on marketable securities, net of taxes | | | | | | | | | | | | | | | 0 | 1 | 0 | 0 | 0 | 0 | 1 |
Stock-based compensation expense | | | | | | | | | | | | | | | 0 | 0 | 0 | 0 | 0 | 804 | 804 |
Change in unfunded SERP liability, net of taxes | | | | | | | | | | | | | | | 0 | 15 | 0 | 0 | 0 | 0 | 15 |
Net earnings | | | | | | | | | | | | | | | 15,874 | 0 | 0 | 0 | $ 0 | $ 0 | 15,874 |
Forfeiture of restricted common stock | | | | | | | | | | | | | | | 0 | 0 | $ 0 | $ 6 | | | 0 |
Forfeiture of restricted common stock (in shares) | | | | | | | | | | | | | | | | | 0 | 0 | 0 | 0 | |
Purchases of common stock (in shares) | | | | | | | | | | | | | | | | | 11 | 98 | | | |
Stock-based compensation expense | | | | | | | | | | | | | | | 0 | 0 | $ 0 | $ 0 | $ 0 | $ 804 | 804 |
Change in unfunded SERP liability, net of taxes | | | | | | | | | | | | | | | 0 | 15 | 0 | 0 | 0 | 0 | 15 |
Balance at Mar. 31, 2024 | | | | | | | | | | | | | | | 322,508 | (15,457) | $ 213 | $ 1,061 | (6,737) | 45,069 | 346,657 |
Balance (in shares) at Mar. 31, 2024 | | | | | | | | | | | | | | | | | 2,131 | 10,574 | | | |
Balance at Dec. 31, 2023 | | | | | | | | | | | | | | | 307,510 | (12,037) | $ 214 | $ 1,065 | (454) | 44,260 | 340,558 |
Balance (in shares) at Dec. 31, 2023 | | | | | | | | | | | | | | | | | 2,142 | 10,620 | | | |
Net earnings | | | | | | | 5,573 | | | | | | | 29,107 | | | | | | | 34,680 |
Cash dividends declared on common stock | | | | | | | (256) | | | | | | | (1,472) | | | | | | | |
Foreign currency translation adjustment, net of taxes | | | | | | | | | | | | | | | | | | | | | (4,775) |
Unrealized holding gains on marketable securities, net of taxes | | | | | | | | | | | | | | | | | | | | | 1 |
Change in unfunded SERP liability, net of taxes | | | | | | | | | | | | | | | | | | | | | 30 |
Net earnings | | | | | | | 5,573 | | | | | | | 29,107 | | | | | | | 34,680 |
Change in unfunded SERP liability, net of taxes | | | | | | | | | | | | | | | | | | | | | 30 |
Balance at Jun. 30, 2024 | | | | | | | | | | | | | | | 340,462 | (16,732) | $ 212 | $ 1,048 | (14,629) | 46,054 | 356,415 |
Balance (in shares) at Jun. 30, 2024 | | | | | | | | | | | | | | | | | 2,121 | 10,453 | | | |
Balance at Mar. 31, 2024 | | | | | | | | | | | | | | | 322,508 | (15,457) | $ 213 | $ 1,061 | (6,737) | 45,069 | 346,657 |
Balance (in shares) at Mar. 31, 2024 | | | | | | | | | | | | | | | | | 2,131 | 10,574 | | | |
Net earnings | | | | | | | 3,028 | | | | | | | 15,778 | 18,806 | 0 | $ 0 | $ 0 | 0 | 0 | 18,806 |
Cash dividends declared on common stock | $ (127) | $ 0 | $ 0 | $ 0 | $ 0 | $ 0 | (127) | $ (725) | $ 0 | $ 0 | $ 0 | $ 0 | $ 0 | (725) | | | | | | | |
Forfeiture of restricted common stock | | | | | | | | | | | | | | | 0 | 0 | $ 0 | $ (1) | 0 | | (1) |
Forfeiture of restricted common stock (in shares) | | | | | | | | | | | | | | | | | 0 | (4) | | | |
Forfeiture of restricted common stock | | | | | | | | | | | | | | | 0 | 0 | $ 0 | $ (1) | 0 | | (1) |
Purchases of common stock | | | | | | | | | | | | | | | 0 | 0 | $ (1) | $ (12) | (7,892) | | (7,893) |
Purchases of common stock (in shares) | | | | | | | | | | | | | | | | | (10) | 117 | | | |
Purchases of common stock | | | | | | | | | | | | | | | | | | | | 12 | |
Foreign currency translation adjustment, net of taxes | | | | | | | | | | | | | | | 0 | (999) | $ 0 | $ 0 | 0 | 0 | (999) |
Unrealized holding gains on interest rate swap cash flow hedge, net of taxes | | | | | | | | | | | | | | | 0 | (291) | 0 | 0 | 0 | 0 | (291) |
Unrealized holding gains on marketable securities, net of taxes | | | | | | | | | | | | | | | | | | | | | 0 |
Stock-based compensation expense | | | | | | | | | | | | | | | 0 | 0 | 0 | 0 | 0 | 971 | 971 |
Change in unfunded SERP liability, net of taxes | | | | | | | | | | | | | | | 0 | 15 | 0 | 0 | 0 | 0 | 15 |
Net earnings | | | | | | | $ 3,028 | | | | | | | $ 15,778 | 18,806 | 0 | 0 | 0 | 0 | 0 | 18,806 |
Forfeiture of restricted common stock | | | | | | | | | | | | | | | 0 | 0 | $ 0 | $ 1 | 0 | | 1 |
Forfeiture of restricted common stock (in shares) | | | | | | | | | | | | | | | | | 0 | (4) | | | |
Forfeiture of restricted common stock | | | | | | | | | | | | | | | | | | | | 2 | |
Purchases of common stock (in shares) | | | | | | | | | | | | | | | | | 10 | (117) | | | |
Forfeiture of restricted common stock | | | | | | | | | | | | | | | | | | | | (2) | |
Stock-based compensation expense | | | | | | | | | | | | | | | 0 | 0 | $ 0 | $ 0 | 0 | 971 | 971 |
Change in unfunded SERP liability, net of taxes | | | | | | | | | | | | | | | 0 | 15 | 0 | 0 | 0 | 0 | 15 |
Balance at Jun. 30, 2024 | | | | | | | | | | | | | | | $ 340,462 | $ (16,732) | $ 212 | $ 1,048 | $ (14,629) | $ 46,054 | $ 356,415 |
Balance (in shares) at Jun. 30, 2024 | | | | | | | | | | | | | | | | | 2,121 | 10,453 | | | |