diff -ruN caldavzap_0.10.0.3/changelog.txt caldavzap_0.10.0.4/changelog.txt
--- caldavzap_0.10.0.3/changelog.txt	2014-03-11 23:38:57.000000000 +0100
+++ caldavzap_0.10.0.4/changelog.txt	2014-03-15 15:49:39.855418000 +0100
@@ -1,5 +1,11 @@
 CalDavZAP Changelog
 
+version 0.10.0.4 [2014-03-15]:
+- note: do not forget to execute the cache_update.sh script every time you update your configuration or any other file (otherwise your browser will use the previous version of files stored in HTML5 cache); alternatively you can update the cache.manifest manually - edit the second line beginning with "#V 20" to anything else (this file simple needs "some" change)
+- added Russian localization (ru_RU) - thanks Александр Симонов
+- fixed synchronization of removed events for servers without sync-collection report support
+- minor translation fixes
+
 version 0.10.0.3 [2014-03-12]:
 - note: do not forget to execute the cache_update.sh script every time you update your configuration or any other file (otherwise your browser will use the previous version of files stored in HTML5 cache); alternatively you can update the cache.manifest manually - edit the second line beginning with "#V 20" to anything else (this file simple needs "some" change)
 - added support for LDAP binding in auth/ldap module (see auth/plugins/ldap_conf.inc)
diff -ruN caldavzap_0.10.0.3/config.js caldavzap_0.10.0.4/config.js
--- caldavzap_0.10.0.3/config.js	2014-03-11 23:38:56.000000000 +0100
+++ caldavzap_0.10.0.4/config.js	2014-03-15 15:49:39.639418000 +0100
@@ -87,6 +87,7 @@
 //   nl_NL (Nederlands [Dutch]; thanks Johan Vromans)
 //   sk_SK (Slovenčina [Slovak])
 //   tr_TR (Türkçe [Turkish]; thanks Selcuk Pultar)
+//   ru_RU (Русский [Russian]; thanks Александр Симонов)
 //   uk_UA (Українська [Ukrainian]; thanks Serge Yakimchuck)
 var globalInterfaceLanguage='en_US';
 
diff -ruN caldavzap_0.10.0.3/lib/fullcalendar.js caldavzap_0.10.0.4/lib/fullcalendar.js
--- caldavzap_0.10.0.3/lib/fullcalendar.js	2014-03-11 23:38:56.000000000 +0100
+++ caldavzap_0.10.0.4/lib/fullcalendar.js	2014-03-15 15:49:39.467418000 +0100
@@ -2078,7 +2078,7 @@
 	BasicView.call(t, element, calendar, 'multiWeek');
 	var opt = t.opt;
 	var renderBasic = t.renderBasic;
-	var formatDate = calendar.formatDate;
+	var formatDates = calendar.formatDates;
 
 	function render(date, delta) {
 		if (delta) {
@@ -6765,7 +6765,7 @@
 			initFilters();
 		} else {
 			clearEvents();
-			filterTable.find('.fc-filter-table-footer').text('* completed at or after '+formatDates(date, null, opt('columnFormat', 'todo')));
+			filterTable.find('.fc-filter-table-footer').text(opt('buttonText', 'filtersFooter').replace('%date%', formatDates(date, null, opt('columnFormat', 'todo'))));
 			if(opt('showDatepicker')) {
 				dateInfoNumberDiv.html(date.getDate());
 				dateInfoText.html(formatDates(date, null, opt('titleFormat', 'todo')));
diff -ruN caldavzap_0.10.0.3/localization.js caldavzap_0.10.0.4/localization.js
--- caldavzap_0.10.0.3/localization.js	2014-03-11 23:38:57.000000000 +0100
+++ caldavzap_0.10.0.4/localization.js	2014-03-15 15:49:39.827418000 +0100
@@ -440,6 +440,44 @@
 	txtCacheButton: 'Yeniden yükle'
 }
 
+localization['ru_RU']=	/* thanks Александр Симонов */
+{
+	_name_: 'Русский',
+	_default_datepicker_format_: 'dd.mm.yy',
+	_default_AMPM_format_: false,
+
+	altLogo: 'Лого',
+	altLogout: 'Выход',
+	buttonLogin: 'Вход',
+	pholderUsername: 'Имя',
+	pholderPassword: 'Пароль',
+	txtResources: 'Ресурсы',
+	txtSearch: 'Поиск',
+	txtNote: 'Примечание',
+
+	buttonEdit: 'Изменить',
+	buttonSave: 'Сохранить',
+	buttonDelete: 'Удалить',
+
+	unsupportedBrowser: 'Ваш браузер не поддерживается!',
+
+	errUnableSync: 'Ошибка: \'невозможно синхронизировать ресурс\': попробуйте позже!',
+	errHttpCommon: 'код ошибки %%',
+	errHttp401: 'не авторизован',
+	errHttp403: 'запрещен',
+	errHttp405: 'метод не разрешен',
+	errHttp408: 'таймаут запроса',
+	errHttp412: 'кто-то другой уже произвел изменения на сервере',
+	errHttp500: 'внутренняя ошибка сервера',
+	errHttp501: 'не реализовано',
+
+	loadingResources: 'Загрузка ресурсов (%act% из %total%)...',
+	updateNotification: '%name% версии %new_ver% доступен (сейчас у вас версия %curr_ver%) - %url%',
+
+	txtCacheText: 'На сервере доступно обновление. Перезагрузите страницу!',
+	txtCacheButton: 'Перезагрузить'
+}
+
 localization['uk_UA']=	/* Serge Yakimchuck <yakim@yakim.org.ua> */
 {
 	_name_: 'Українська',
@@ -3285,6 +3323,261 @@
 	CalDAVerrTodoHttp410: 'Yapılacak artık sunucuda mevcut değil'
 }
 
+localizationCalDAV['ru_RU']=
+{
+	_default_title_format_month_: 'MMMM yyyy',
+	_default_title_format_week_: 'd{ \'–\' d[ MMM][ yyyy] } MMM yyyy',
+	_default_title_format_day_: 'd MMM yyyy, dddd',
+	_default_title_format_table_: 'MMM yyyy, ddd',
+	_default_column_format_agenda_: 'd MMM, ddd',
+	_default_time_format_list_: 'dd.MM.yyyy',
+
+	txtCalendar: 'Календарь',
+	txtCalendars: 'Календари',
+	txtTodo: 'Задачи',
+	txtTodoLists: 'Списки задач',
+	txtSubscribed: 'Подписки',
+	fullCalendarMonth: 'Месяц',
+	fullCalendarMultiWeek: 'Пол-месяца',
+	fullCalendarAgendaWeek: 'Неделя',
+	fullCalendarAgendaDay: 'День',
+	fullCalendarTable: 'Таблица',
+	fullCalendarTodayButton: 'Сегодня',
+	fullCalendarAllDay: 'Весь день',
+	CalDAVsearch: 'Поиск',
+	resourceEnable: 'Отобразить все календари в этом ресурсе',
+	resourceDisable: 'Скрыть все календари в этом ресурсе',
+	allEnable: 'Отобразить все календари',
+	allDisable: 'Скрыть все календари',
+	timezone: 'Врем. зона',
+	txtTimezonePicker: 'Вр. зона:',
+	loadingRList: 'Загрузка списка ресурсов...',
+	renderingE: 'Отображение календарей...',
+	timezoneChange: 'Применение временной зоны ...',
+	localTime: 'Местное время',
+	customTimezone: 'Заказная (местное время)',
+	loadPrevMonth: 'Загрузить предыдущий месяц',
+	loadNextMonth: 'Загрузить следующий месяц',
+	repeatBoxButton: 'Настройки повторения',
+	repeatBoxContent: '- повторяющееся событие.',
+	repeatBoxQuestion: 'С какими экземплярами события вы хотите работать?',
+	allEvsButton: 'Со всеми',
+	allFutureButton: 'С этим и со всеми будущими',
+	eventOnlyButton: 'Только с этим',
+	repeatBoxContentTODO: '- повторяющаяся задача.',
+	repeatBoxQuestionTODO: 'С какими экземплярами задачи вы хотите работать?',
+	allEvsButtonTODO: 'Со всеми',
+	allFutureButtonTODO: 'С этим и со всеми будущими',
+	eventOnlyButtonTODO: 'Только с этим',
+	txtStatus: 'Состояние',
+	eventAvailability : 'Доступность',
+	eventAvailabilityBusy : 'Занят',
+	eventAvailabilityFree : 'Свободен',
+	eventType: 'Приватность',
+	eventTypePublic: 'Публичное',
+	eventTypePrivate: 'Приватное',
+	eventTypeConfidential: 'Конфиденциальное',
+	txtPriority: 'Приоритет',
+	txtPriorityNone: 'Нет',
+	txtPriorityLow: 'Низкий',
+	txtPriorityMedium: 'Средний',
+	txtPriorityHigh: 'Высокий',
+	eventURL : 'URL',
+	repeatInterval: 'каждый(ую)',
+	repeatDays: 'день',
+	repeatWeeks: 'неделю',
+	repeatMonths: 'месяц',
+	repeatYears: 'год',
+	repeatChangeTxt: 'было изменено на сервере!',
+	repeatChangeTxtClose: 'Закройте и откройте событие заново',
+	repeatTodoChangeTxtClose: 'Закройте и откройте задачу заново',
+	calendarLoader: 'Перезагрузка...',
+	resizeLoader: 'Изменение размера...',
+
+	monthNames: ['Январь','Февраль','Март','Апрель','Май','Июнь',
+	'Июль','Август','Сентябрь','Октябрь','Ноябрь','Декабрь'],
+	monthNamesShort: ['янв', 'фев', 'мар', 'апр', 'мая', 'июн',
+	'июл', 'авг', 'сен', 'окт', 'ноя', 'дек'],
+	dayNames: ['Воскресенье', 'Понедельник', 'Вторник', 'Среда', 'Четверг', 'Пятница', 'Суббота'],
+	dayNamesShort: ['Вск', 'Пон', 'Втр', 'Срд', 'Чтв', 'Птн', 'Суб'],
+	dayNamesMin: ['Вс','Пн','Вт','Ср','Чт','Пт','Сб'],
+
+	// TODOS
+	pholderNameTODO: 'Название',
+	pholderNewTODO: 'новая задача',
+	txtTypeTODO: 'Тип',
+	txtTypeTODONone: 'Простая',
+	txtTypeTODOStart: 'С датой/временем начала',
+	txtTypeTODODue: 'С датой/временем окончания',
+	txtTypeTODOBoth: 'С датой/временем начала и окончания',
+	txtDateFromTODO: 'Начало',
+	txtDateToTODO: 'Окончание',
+	txtCompletedOn: 'Выполнена',
+
+	pholderDateFromTODO: 'Дата начала',
+	pholderTimeFromTODO: 'Время начала',
+	pholderDateToTODO: 'Дата окончания',
+	pholderTimeToTODO: 'Время окончания',
+	pholderCompletedOnDate: 'Дата выполнения',
+	pholderCompletedOnTime: 'Время выполнения',
+
+	txtStatusFiltersHeaderTODO: 'Отбор по состоянию',
+	txtStatusFiltersFooterTODO: '* выполненных %date% или позже',
+	txtStatusNeedsActionTODO: 'Новая',
+	txtStatusCompletedTODO: 'Выполнена',
+	txtStatusInProcessTODO: 'В процессе',
+	txtStatusCancelledTODO: 'Отменена',
+	txtPercentCompletedTODO: 'Выполнено на',
+
+	txtCalendarTODO: 'Календарь',
+	txtSelectCalendarTODO: 'Выберите календарь',
+	txtAlertTODO: 'Уведомление',
+	txtAlertNoneTODO: 'Нет',
+	txtAlertMessageTODO: 'Сообщение',
+	txtAlertOnDateTODO: 'По дате',
+	txtAlertWeeksBeforeTODO: 'За N недель до',
+	txtAlertDaysBeforeTODO: 'За N дней до',
+	txtAlertHoursBeforeTODO: 'За N часов до',
+	txtAlertMinutesBeforeTODO: 'За N минут до',
+	txtAlertSecondsBeforeTODO: 'За N секунд до',
+	txtAlertWeeksAfterTODO: 'Через N недель после',
+	txtAlertDaysAfterTODO: 'Через N дней после',
+	txtAlertHoursAfterTODO: 'Через N часов после',
+	txtAlertMinutesAfterTODO: 'Через N минут после',
+	txtAlertSecondsAfterTODO: 'Через N секунд после',
+
+	pholderAfterBeforeValTODO: 'Значение',
+	pholderAlarmDateTODO: 'Дата уведомления',
+	pholderAlarmTimeTODO: 'Время уведомления',
+
+	pholderNoteTODO: 'Примечание',
+	txtNoteTODO: 'Примечание',
+
+	todoPrevNav: 'Показать предыдущий экземпляр',
+	todoNextNav: 'Показать следующий экземпляр',
+	todoUncompletedPrevNav: 'Показать предыдущий невыполненный экземпляр',
+	todoUncompletedNextNav: 'Показать следующий невыполненный экземпляр',
+
+	buttonSaveTODO: 'Сохранить',
+	buttonEditTODO: 'Изменить',
+	buttonResetTODO: 'Отменить',
+	buttonCloseTODO: 'Закрыть',
+	buttonDeleteTODO: 'Удалить',
+
+	// EVENTS
+	pholderName: 'Название',
+	pholderNewEvent: 'Новое событие',
+	txtLocation: 'Место',
+	pholderLocation: 'Местоположение',
+
+	txtAllDay: 'Весь день',
+	from: 'Начало',
+	to: 'Конец',
+
+	pholderDateFrom: 'Дата начала',
+	pholderTimeFrom: 'Время начала',
+	pholderDateTo: 'Дата окончания',
+	pholderTimeTo: 'Время окончания',
+
+	txtStatusNone: 'Не указано',
+	txtStatusTentative: 'Неизвестно',
+	txtStatusConfirmed: 'Подтверждено',
+	txtStatusCancelled: 'Отменено',
+
+	txtRepeat: 'Повторять',
+	txtNoRepeat: 'Не повторять',
+	txtRepeatDay: 'Каждый божий день',
+	txtRepeatWeek: 'Каждую неделю',
+	txtRepeatWeekend: 'Каждый выходной',
+	txtRepeatMonth: 'Раз в месяц',
+	txtRepeatTwoWeek: 'Раз в две недели',
+	txtRepeatYear: 'Раз в год',
+	txtRepeatCustomWeek: 'Раз в неделю (настр.)',
+	txtRepeatCustomMonth: 'Раз в месяц (настр.)',
+	txtRepeatCustomYear: 'Раз в год (настр.)',
+	txtRepeatWork: 'Каждый рабочий день',
+	txtRepeatOnDate: 'По дате',
+	txtRepeatAfter: 'Через N повторений',
+	txtRepeatNever: 'Никогда',
+	pholderUntilDate: 'Повторять до',
+	pholderRepeatCount: 'Повторять раз',
+	txtRepeatCustomWeekLabel: 'в',
+	txtRepeatCustomMonthLabel: 'по дням',
+	txtRepeatCustomMonthEvery: 'Каждый(ую/ое)',
+	txtRepeatCustomMonthFirst: 'Первый(ую/ое)',
+	txtRepeatCustomMonthSecond: 'Второй(ую/ое)',
+	txtRepeatCustomMonthThird: 'Третий(ью/ье)',
+	txtRepeatCustomMonthFourth: 'Четвертый(ую/ое)',
+	txtRepeatCustomMonthFifth: 'Пятый(ую/ое)',
+	txtRepeatCustomMonthLast: 'Крайний(юю/ее)',
+	txtRepeatCustomMonthCustom: 'Указать дни (настр.)',
+	txtRepeatCustomMonthMonth: 'День месяца',
+	txtRepeatCustomYearLabel1: 'по дням',
+	txtRepeatCustomYearLabel2: 'по месяцам',
+
+	txtRepeatEnd: 'и закончить',
+	txtEventCalendar: 'Календарь',
+	txtSelectCalendar: 'Выберите календарь',
+	txtAlert: 'Уведомление',
+	txtAlertNone: 'Нет',
+	txtAlertMessage: 'Сообщение',
+	txtAlertOnDate: 'По дате',
+	txtAlertWeeksBefore: 'За N недель до',
+	txtAlertDaysBefore: 'За N дней до',
+	txtAlertHoursBefore: 'За N часов до',
+	txtAlertMinutesBefore: 'За N минут до',
+	txtAlertSecondsBefore: 'За N секунд до',
+	txtAlertWeeksAfter: 'Через N недель после',
+	txtAlertDaysAfter: 'Через N дней после',
+	txtAlertHoursAfter: 'Через N часов после',
+	txtAlertMinutesAfter: 'Через N мирнут после',
+	txtAlertSecondsAfter: 'Через N секунд после',
+
+	pholderAfterBeforeVal: 'Значение',
+	pholderAlarmDate: 'Дата уведомления',
+	pholderAlarmTime: 'Время уведомления',
+
+	pholderNote: 'Примечание',
+
+	eventPrevNav: 'Показать предыдущий экземпляр',
+	eventNextNav: 'Показать следующий экземпляр',
+
+	buttonReset: 'Отменить',
+	buttonClose: 'Закрыть',
+
+	txtAllSavedTodo: 'Задача успешно сохранена!',
+	txtAllSaved: 'Событие успешно сохранено!',
+
+	txtAllDeletedTodo: 'Задача успешно удалена!',
+	txtAllDeleted: 'Событие успешно удалено!',
+
+	txtNotChooseTodo: 'Ошибка: необходимо выбрать календарь!',
+	txtNotChoose: 'Ошибка: необходимо выбрать календарь!',
+
+	txtErrorDates: 'Ошибка: дата начала не может быть позже даты окончания!',
+	txtErrorDatesTodo: 'Ошибка: дата начала не может быть позже даты окончания!',
+
+	txtErorInputTodo: 'Исправьте неверные значения!',
+	txtDateTimeErrorTodo: 'Укажите дату и время!',
+
+	txtErorInput: 'Ошибка: исправьте подсвеченные неверные значения!',
+
+	txtAlertsH: 'Уведомления',
+	buttonAlert: 'Очистить уведомления',
+
+	altAddEvent: 'Добавить событие',
+	altAddTodo: 'Добавить задачу',
+
+	loadingCalendars: 'Загрузка календарей (%act% из %total%) ...',
+
+	errUnableSaveBeginCalDAV: 'Ошибка: \'не могу сохранить событие\': %%!',
+	errUnableDeleteBeginCalDAV: 'Ошибка: \'не могу удалить событие\': %%!',
+	CalDAVerrHttp410: 'Событие более не существует на сервере',
+	errUnableSaveTodoBeginCalDAV: 'Ошибка: \'не могу сохранить задачу\': %%!',
+	errUnableDeleteTodoBeginCalDAV: 'Ошибка: \'не могу удалить задачу\': %%!',
+	CalDAVerrTodoHttp410: 'Задача более не существует на сервере'
+}
+
 localizationCalDAV['uk_UA']=
 {
 	_default_title_format_month_: 'MMM yyyy',
diff -ruN caldavzap_0.10.0.3/main.js caldavzap_0.10.0.4/main.js
--- caldavzap_0.10.0.3/main.js	2014-03-11 23:38:57.000000000 +0100
+++ caldavzap_0.10.0.4/main.js	2014-03-15 15:49:39.755418000 +0100
@@ -111,7 +111,7 @@
 var globalAvailableAppsArray=new Array();
 var globalEnableAppSwitch=true;
 var globalAppName='CalDavZAP';
-var globalVersion='0.10.0.3';
+var globalVersion='0.10.0.4';
 var globalVersionCheckURL=(location.protocol=='file:' ? 'http:' : location.protocol)+'//www.inf-it.com/versioncheck/'+globalAppName+'/?v='+globalVersion;
 var globalXClientHeader=globalAppName+' '+globalVersion+' (Inf-IT CalDAV Web Client)';
 var globalResourceNumberCount=0;
diff -ruN caldavzap_0.10.0.3/vcalendar.js caldavzap_0.10.0.4/vcalendar.js
--- caldavzap_0.10.0.3/vcalendar.js	2014-03-11 23:38:57.000000000 +0100
+++ caldavzap_0.10.0.4/vcalendar.js	2014-03-15 15:49:39.935418000 +0100
@@ -199,11 +199,28 @@
 
 	this.removeOldEvents=function(inputUidBase, inputTimestamp, isEvent)
 	{
-		for(var i=0; i<globalResourceCalDAVList.collections.length;i++)
-			if(globalResourceCalDAVList.collections[i].uid!=undefined)
-				for(event in globalEventList.events[globalResourceCalDAVList.collections[i].uid])
-					if(event.timestamp!=undefined && event.uid.indexOf(inputUidBase)==0 && event.timestamp<inputTimestamp)
-						globalEventList.removeOldEvent(event.uid, true, isEvent);
+		if(isEvent)
+		{
+			for(var i=0; i<globalResourceCalDAVList.collections.length;i++)
+				if(globalResourceCalDAVList.collections[i].uid!=undefined)
+					for(var key in globalEventList.events[globalResourceCalDAVList.collections[i].uid])
+					{
+						var event = globalEventList.events[globalResourceCalDAVList.collections[i].uid][key];
+						if(event.timestamp!=undefined && event.uid.indexOf(inputUidBase)==0 && event.timestamp<inputTimestamp)
+							globalEventList.removeOldEvent(event.uid, true, isEvent);
+					}
+		}
+		else
+		{
+			for(var i=0; i<globalResourceCalDAVList.TodoCollections.length;i++)
+				if(globalResourceCalDAVList.TodoCollections[i].uid!=undefined)
+					for(var key in globalEventList.todos[globalResourceCalDAVList.TodoCollections[i].uid])
+					{
+						var event = globalEventList.todos[globalResourceCalDAVList.TodoCollections[i].uid][key];
+						if(event.timestamp!=undefined && event.uid.indexOf(inputUidBase)==0 && event.timestamp<inputTimestamp)
+							globalEventList.removeOldEvent(event.uid, true, isEvent);
+					}
+		}
 	}
 
 	this.removeOldEvent=function(inputUid, fromInterface, isEvent)
