http://mark.koli.ch/2009/09/use-javascript-and-jquery-to-get-user-selected-text.html
http://mark.koli.ch/2009/09/05/get-selected-text-javascript.html
Получение выделенного текста действительно легко. Хранить его (или его начальные / конечные точки) также шутка. Но как насчет вашей точки № 3? Что если текст изменится?
Если текст изменяется, то и исходный текст, и сохраненные вами исходные координаты выбора не будут соответствовать текущему измененному тексту. Вам следует помнить об аннотациях, присутствующих в текстовом документе, поэтому каждый раз, когда он изменяется, аннотации, относящиеся к этому конкретному фрагменту измененного текста, должны обновляться или удаляться (возможно, после быстрого сравнения между текстом до и после: некоторые пропущены слова? или просто некоторые слова были исправлены?), но это кажется трудной задачей.
Я думаю, что необходимо сохранить всю текстовую аннотацию в БД, чтобы избежать ее изменения и потери аннотации. Таким образом, у вас будет полный аннотированный текст. Затем вы должны также использовать своего рода флаг, чтобы указать начальный символ аннотации, и если текст изменится, вы можете рассчитать разницу в символах от текста документа до изменения и от одного после него, и найти таким образом новая начальная точка исходной аннотации (при условии, что аннотационная часть текста документа не изменилась).
Разделение текстового документа на максимально возможное количество абзацев также должно помочь, чтобы вы могли разделить разные части документа и работать над ними один за другим.
Теперь мне бы очень хотелось, чтобы это было сделано! :)