Consolidated Statements of Shareholders' Equity (Unaudited) - USD ($) $ in Thousands | Common Stock [Member] | Additional Paid-in Capital [Member] | Retained Earnings [Member] | AOCI Attributable to Parent [Member] | Total |
Balance (in shares) at Dec. 31, 2018 | 26,984,747 | | | | |
Balance at Dec. 31, 2018 | $ 27 | $ 258,502 | $ 291,460 | $ (8,492) | $ 541,497 |
Common shares issued on exercise of options and other, net of shares withheld for tax obligations (in shares) | 19,950 | | | | |
Common shares issued on exercise of options and other, net of shares withheld for tax obligations | $ 0 | (420) | 0 | 0 | (420) |
Stock-based compensation expense | $ 0 | 3,040 | 0 | 0 | 3,040 |
Repurchases of common stock (in shares) | (157,716) | | | | |
Repurchases of common stock | $ 0 | (1,511) | (15,798) | 0 | (17,309) |
Net income | 0 | 0 | 15,511 | 0 | 15,511 |
Other comprehensive income | | | | | |
Foreign currency translation adjustment | $ 0 | 0 | 0 | 476 | 476 |
Comprehensive income | | | | | 15,987 |
Common shares issued on exercise of options and other, net of shares withheld for tax obligations (in shares) | 19,950 | | | | |
Common shares issued on exercise of options and other, net of shares withheld for tax obligations | $ 0 | (420) | 0 | 0 | (420) |
Stock-based compensation expense | $ 0 | 3,040 | 0 | 0 | 3,040 |
Repurchases of common stock (in shares) | (157,716) | | | | |
Repurchases of common stock | $ 0 | (1,511) | (15,798) | 0 | (17,309) |
Net income | $ 0 | 0 | 15,511 | 0 | 15,511 |
Balance (in shares) at Dec. 31, 2018 | 26,984,747 | | | | |
Balance at Dec. 31, 2018 | $ 27 | 258,502 | 291,460 | (8,492) | 541,497 |
Balance (in shares) at Mar. 31, 2019 | 26,846,981 | | | | |
Balance at Mar. 31, 2019 | $ 27 | 259,611 | 291,173 | (8,016) | 542,795 |
Balance (in shares) at Dec. 31, 2018 | 26,984,747 | | | | |
Balance at Dec. 31, 2018 | $ 27 | 258,502 | 291,460 | (8,492) | 541,497 |
Net income | | | | | 48,469 |
Other comprehensive income | | | | | |
Comprehensive income | | | | | 46,317 |
Net income | | | | | 48,469 |
Balance (in shares) at Dec. 31, 2018 | 26,984,747 | | | | |
Balance at Dec. 31, 2018 | $ 27 | 258,502 | 291,460 | (8,492) | 541,497 |
Balance (in shares) at Sep. 30, 2019 | 26,759,109 | | | | |
Balance at Sep. 30, 2019 | $ 27 | 265,178 | 309,536 | (10,644) | 564,097 |
Balance (in shares) at Mar. 31, 2019 | 26,846,981 | | | | |
Balance at Mar. 31, 2019 | $ 27 | 259,611 | 291,173 | (8,016) | 542,795 |
Common shares issued on exercise of options and other, net of shares withheld for tax obligations (in shares) | 75,785 | | | | |
Common shares issued on exercise of options and other, net of shares withheld for tax obligations | $ 0 | 245 | 0 | 0 | 245 |
Stock-based compensation expense | $ 0 | 3,486 | 0 | 0 | 3,486 |
Repurchases of common stock (in shares) | (40,669) | | | | |
Repurchases of common stock | $ 0 | (390) | (3,711) | 0 | (4,101) |
Net income | 0 | 0 | 16,166 | 0 | 16,166 |
Other comprehensive income | | | | | |
Foreign currency translation adjustment | | 0 | 0 | (478) | (478) |
Comprehensive income | | | | | 15,688 |
Common shares issued on exercise of options and other, net of shares withheld for tax obligations (in shares) | 75,785 | | | | |
Common shares issued on exercise of options and other, net of shares withheld for tax obligations | $ 0 | 245 | 0 | 0 | 245 |
Stock-based compensation expense | $ 0 | 3,486 | 0 | 0 | 3,486 |
Repurchases of common stock (in shares) | (40,669) | | | | |
Repurchases of common stock | $ 0 | (390) | (3,711) | 0 | (4,101) |
Net income | $ 0 | 0 | 16,166 | 0 | 16,166 |
Balance (in shares) at Mar. 31, 2019 | 26,846,981 | | | | |
Balance at Mar. 31, 2019 | $ 27 | 259,611 | 291,173 | (8,016) | 542,795 |
Balance (in shares) at Jun. 30, 2019 | 26,882,097 | | | | |
Balance at Jun. 30, 2019 | $ 27 | 262,952 | 303,628 | (8,494) | 558,113 |
Common shares issued on exercise of options and other, net of shares withheld for tax obligations (in shares) | 5,089 | | | | |
Common shares issued on exercise of options and other, net of shares withheld for tax obligations | $ 0 | 241 | 0 | 0 | 241 |
Stock-based compensation expense | $ 0 | 3,212 | 0 | 0 | 3,212 |
Repurchases of common stock (in shares) | (128,077) | | | | |
Repurchases of common stock | $ 0 | (1,227) | (10,884) | 0 | (12,111) |
Net income | 0 | 0 | 16,792 | 0 | 16,792 |
Other comprehensive income | | | | | |
Foreign currency translation adjustment | | 0 | 0 | (2,150) | (2,150) |
Comprehensive income | | | | | 14,642 |
Common shares issued on exercise of options and other, net of shares withheld for tax obligations (in shares) | 5,089 | | | | |
Common shares issued on exercise of options and other, net of shares withheld for tax obligations | $ 0 | 241 | 0 | 0 | 241 |
Stock-based compensation expense | $ 0 | 3,212 | 0 | 0 | 3,212 |
Repurchases of common stock (in shares) | (128,077) | | | | |
Repurchases of common stock | $ 0 | (1,227) | (10,884) | 0 | (12,111) |
Net income | $ 0 | 0 | 16,792 | 0 | 16,792 |
Balance (in shares) at Jun. 30, 2019 | 26,882,097 | | | | |
Balance at Jun. 30, 2019 | $ 27 | 262,952 | 303,628 | (8,494) | 558,113 |
Balance (in shares) at Sep. 30, 2019 | 26,759,109 | | | | |
Balance at Sep. 30, 2019 | $ 27 | 265,178 | 309,536 | (10,644) | $ 564,097 |
Balance (in shares) at Dec. 31, 2019 | 26,786,459 | | | | 26,786,459 |
Balance at Dec. 31, 2019 | $ 27 | 268,059 | 324,722 | (7,018) | $ 585,790 |
Common shares issued on exercise of options and other, net of shares withheld for tax obligations (in shares) | 23,525 | | | | |
Common shares issued on exercise of options and other, net of shares withheld for tax obligations | $ 0 | (902) | 0 | 0 | (902) |
Stock-based compensation expense | $ 0 | 3,033 | 0 | 0 | 3,033 |
Repurchases of common stock (in shares) | (161,460) | | | | |
Repurchases of common stock | $ 0 | (1,616) | (9,569) | 0 | (11,185) |
Net income | 0 | 0 | 13,984 | 0 | 13,984 |
Other comprehensive income | | | | | |
Foreign currency translation adjustment | $ 0 | 0 | 0 | (2,980) | (2,980) |
Comprehensive income | | | | | 11,004 |
Common shares issued on exercise of options and other, net of shares withheld for tax obligations (in shares) | 23,525 | | | | |
Common shares issued on exercise of options and other, net of shares withheld for tax obligations | $ 0 | (902) | 0 | 0 | (902) |
Stock-based compensation expense | $ 0 | 3,033 | 0 | 0 | 3,033 |
Repurchases of common stock (in shares) | (161,460) | | | | |
Repurchases of common stock | $ 0 | (1,616) | (9,569) | 0 | (11,185) |
Net income | $ 0 | 0 | 13,984 | 0 | $ 13,984 |
Balance (in shares) at Dec. 31, 2019 | 26,786,459 | | | | 26,786,459 |
Balance at Dec. 31, 2019 | $ 27 | 268,059 | 324,722 | (7,018) | $ 585,790 |
Balance (in shares) at Mar. 31, 2020 | 26,648,524 | | | | |
Balance at Mar. 31, 2020 | $ 27 | 268,574 | 329,137 | (9,998) | $ 587,740 |
Balance (in shares) at Dec. 31, 2019 | 26,786,459 | | | | 26,786,459 |
Balance at Dec. 31, 2019 | $ 27 | 268,059 | 324,722 | (7,018) | $ 585,790 |
Net income | | | | | 41,288 |
Other comprehensive income | | | | | |
Comprehensive income | | | | | 41,782 |
Net income | | | | | $ 41,288 |
Balance (in shares) at Dec. 31, 2019 | 26,786,459 | | | | 26,786,459 |
Balance at Dec. 31, 2019 | $ 27 | 268,059 | 324,722 | (7,018) | $ 585,790 |
Balance (in shares) at Sep. 30, 2020 | 26,753,545 | | | | 26,753,545 |
Balance at Sep. 30, 2020 | $ 27 | 278,996 | 353,322 | (6,524) | $ 625,821 |
Balance (in shares) at Mar. 31, 2020 | 26,648,524 | | | | |
Balance at Mar. 31, 2020 | $ 27 | 268,574 | 329,137 | (9,998) | 587,740 |
Common shares issued on exercise of options and other, net of shares withheld for tax obligations (in shares) | 96,186 | | | | |
Common shares issued on exercise of options and other, net of shares withheld for tax obligations | $ 0 | 400 | 0 | 0 | 400 |
Stock-based compensation expense | $ 0 | 3,639 | 0 | 0 | 3,639 |
Repurchases of common stock (in shares) | (38,154) | | | | |
Repurchases of common stock | $ 0 | (382) | (3,119) | 0 | (3,501) |
Net income | 0 | 0 | 12,607 | 0 | 12,607 |
Other comprehensive income | | | | | |
Foreign currency translation adjustment | | 0 | 0 | 364 | 364 |
Comprehensive income | | | | | 12,971 |
Common shares issued on exercise of options and other, net of shares withheld for tax obligations (in shares) | 96,186 | | | | |
Common shares issued on exercise of options and other, net of shares withheld for tax obligations | $ 0 | 400 | 0 | 0 | 400 |
Stock-based compensation expense | $ 0 | 3,639 | 0 | 0 | 3,639 |
Repurchases of common stock (in shares) | (38,154) | | | | |
Repurchases of common stock | $ 0 | (382) | (3,119) | 0 | (3,501) |
Net income | $ 0 | 0 | 12,607 | 0 | 12,607 |
Balance (in shares) at Mar. 31, 2020 | 26,648,524 | | | | |
Balance at Mar. 31, 2020 | $ 27 | 268,574 | 329,137 | (9,998) | 587,740 |
Balance (in shares) at Jun. 30, 2020 | 26,706,556 | | | | |
Balance at Jun. 30, 2020 | $ 27 | 272,231 | 338,625 | (9,634) | 601,249 |
Common shares issued on exercise of options and other, net of shares withheld for tax obligations (in shares) | 46,989 | | | | |
Common shares issued on exercise of options and other, net of shares withheld for tax obligations | $ 0 | 2,820 | | | 2,820 |
Stock-based compensation expense | $ 0 | 3,945 | 0 | 0 | 3,945 |
Repurchases of common stock (in shares) | 0 | | | | |
Repurchases of common stock | $ 0 | 0 | 0 | 0 | 0 |
Net income | 0 | 0 | 14,697 | 0 | 14,697 |
Other comprehensive income | | | | | |
Foreign currency translation adjustment | $ 0 | 0 | 0 | 3,110 | 3,110 |
Comprehensive income | | | | | 17,807 |
Common shares issued on exercise of options and other, net of shares withheld for tax obligations (in shares) | 46,989 | | | | |
Common shares issued on exercise of options and other, net of shares withheld for tax obligations | $ 0 | 2,820 | | | 2,820 |
Stock-based compensation expense | $ 0 | 3,945 | 0 | 0 | 3,945 |
Repurchases of common stock (in shares) | 0 | | | | |
Repurchases of common stock | $ 0 | 0 | 0 | 0 | 0 |
Net income | $ 0 | 0 | 14,697 | 0 | 14,697 |
Balance (in shares) at Jun. 30, 2020 | 26,706,556 | | | | |
Balance at Jun. 30, 2020 | $ 27 | 272,231 | 338,625 | (9,634) | $ 601,249 |
Balance (in shares) at Sep. 30, 2020 | 26,753,545 | | | | 26,753,545 |
Balance at Sep. 30, 2020 | $ 27 | $ 278,996 | $ 353,322 | $ (6,524) | $ 625,821 |