Теперь у нас имеются методы взаимодействия с сервером со встроен¬ными в них функциями обратного вызова, и можно перейти к созда¬нию методов, наполняющих приложение AjaxMail функционально¬стью. При разработке алгоритма выполнения любой операции очень важно понимать, как должен вести себя интерфейс и чего ожидает пользователь.
Для начала рассмотрим операцию удаления сообщения. Когда пользо¬ватель щелкает по изображению с красным крестиком, сообщение, расположенное рядом, должно быть удалено (перемещено в корзину). Возможность нажатия кнопок броузера Forward и Back здесь необходимо исключить, поскольку едва ли целесообразно предоставлять пользова¬телю возможность вернуться к списку сообщений, удаленных ранее. То есть для выполнения операции удаления надо применить метод ге-quest(). Кроме того надо понять, должен ли изменяться пользователь¬ский интерфейс в результате выполнения этой операции? Да, конечно, выбранное сообщение должно быть удалено из списка. Таким образом, чтобы удалить сообщение, необходимо воспользоваться методом re¬quest ) с функцией обратного вызова loadAndRender( ):
deleteMessage:- function (sld) {
this.nextNotice = sDeleteMailNotice; this.request("delete", loadAndRender,
sld);
Методу должен быть передан числовой идентификатор сообщения, подлежащего удалению. В ходе подготовки к выполнению операции в свойство nextNotice записывается текст уведомления, которое будет выведено после удаления сообщения. Затем вызывается метод ге-quest(), которому передается строка с названием выполняемой операции delete, ссылка на функцию обратного вызова loadAnc" и идентификатор удаляемого сообщения. После удаления сс пользователь получит уведомление и сможет продолжить с приложением, будучи уверенным, что электронное письмо ремещено в корзину. Для восстановления удаленного письма няется точно такая же методология.
Просматривая содержимое папки Trash, пользователь может щ по изображению с зеленой стрелкой, чтобы восстановить в сообщение (переместить его в папку Inbox). По существу one-становления ничем не отличается от операции удаления; вся заключается в том, куда перемещается сообщение. Поэтому. тельно, что методы чрезвычайно похожи друг на друга:
restoreMessage: function (sld) {
this.nextNotice = sRestoreMailNotice; this.request("restore", loadAndRender, sld);

Этот метод записывает текст уведомления, которое должно бы» дено после выполнения операции, и затем с помощью метода восстанавливает сообщение, представленное идентификатором
Для работы с папкой Trash предусмотрена еще одна специфич рация - очистка корзины (empty). При опустошении корзины щения, содержащиеся в ней, безвозвратно удаляются. Эта интересна тем, что в зависимости от режима работы прило ведет себя по-разному. Если пользователь к моменту ее в просматривал папку Inbox, то пользовательский интерфейс не изменяться, надо только вывести уведомление по завершении ции. Если же пользователь просматривал содержимое папки пользовательский интерфейс должен обновиться, чтобы по* корзина опустела. Таким образом, метод emptyTrash() работает сколько более сложному алгоритму:
emptyTrash: function () {
if (confirm(sEmptyTrashConfirm)) {
this.nextNotice = sEmptyTrashNotice; if (this.info.folder == TRASH) {
this.request("empty", loadAndRender);
} else { .
this.request("empty", execute);
)
},
Первым делом этот метод запрашивает у пользователя под на выполнение операции. Функция JavaScript conf irm() выво ран диалоговое окно с текстом sEmptyTrashConfirm и кнопками eel (Отмена). Если пользователь нажмет кнопку ОК, функция возвратит значение true, и, следовательно, папка Trash должна быть очищена. В этом случае, как и в предыдущих методах, в свойство next-Notice записывается текст уведомления. Затем проверяется, какая папка является текущей. Если это Trash, то методу request() передается ссылка на функцию loadAndRender(), которая обновит содержимое эк¬рана, в противном случае - ссылка на функцию execute(), которая не обновляет пользовательский интерфейс.
До сих пор в этом разделе рассматривались методы выполнения опера¬ций над электронными письмами. Теперь рассмотрим метод getMessa-ges(), который фактически отвечает за получение от сервера списка сообщений в заданной папке. Метод принимает в качестве аргументов идентификатор папки и номер страницы и затем обращается к методу navigate() для получения требуемой информации:
' getMessages: function (iFolder, iPage) {
this.info.folder = iFolder;
this.info.page = iPage;
this.navigate("getfolder");
' }. I
Чтобы получить корректный список сообщений, в свойства folder и page объекта info надо записать соответствующие значения. Эти значения по¬надобятся в методе navigate() для сборки строки запроса URL. Данный метод также применяется в методах nextPage() и prevPage() для органи¬зации перехода на другую страницу сообщений в заданном каталоге:
nextPage: function () {
• this.getMessages(this.info.folder, this.info.page+1);

prevPage: function () {
this.getMessages(this.info.folder, this.info.page-1);

Оба метода работают с текущей папкой сообщений, но изменяют зна¬чение свойства page. Так, метод nextPage() увеличивает номер текущей страницы на единицу, a prevPage() уменьшает.
Иногда пользователь хочет лишь обновить информацию о папке, не вы¬ходя из нее. Например, для того чтобы проверить наличие новых сооб¬щений, пользователь может щелкнуть по ссылке Inbox, находясь в этой же папке. В этом случае не требуется добавлять лишнюю запись в жур¬нал посещений броузера, поскольку бессмысленно возвращаться к пред¬ставлению с устаревшей информацией о папке. Таким образом, обнов¬лять содержимое экрана следует посредством метода request(), а не navigateQ:
refreshFolder: function (iFolder) { this.info.folder = iFolder; this.info.page = 1;
Этот метод очень напоминает метод getMessages() в том смысле, бует значение идентификатора папки, которое он записывает в во info, folder. Номер страницы устанавливается равным 1, п при любом обновлении просмотр следует начинать с первой А поскольку в результате выполнения операции ожидается и пользовательского интерфейса, методу request() передается на функцию loadAndRenderQ.