Полный текст см. по ссылке. Также опубликовано на Клерк.ру: http://www.klerk.ru/soft/articles/320470/ (В статье есть недочет, касающийся описанного алгоритма работы в программе - см. комментарии на Клерк.ру)