diff -ruN caldavzap_0.10.0.4/changelog.txt caldavzap/changelog.txt
--- caldavzap_0.10.0.4/changelog.txt	2014-03-15 15:49:39.855418000 +0100
+++ caldavzap/changelog.txt	2014-04-14 19:25:59.602044000 +0200
@@ -1,5 +1,11 @@
 CalDavZAP Changelog
 
+version 0.10.0.5 [2014-04-14]:
+- 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)
+- updated Russian localization (ru_RU)
+- fixed wrong processing of RECURRENCE-ID property in UTC (Z) timezone
+- fixed occasional wrong processing of repeating events generated in future
+
 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 Александр Симонов
diff -ruN caldavzap_0.10.0.4/data_process.js caldavzap/data_process.js
--- caldavzap_0.10.0.4/data_process.js	2014-03-15 15:49:39.919418000 +0100
+++ caldavzap/data_process.js	2014-04-14 19:25:59.638044000 +0200
@@ -4521,7 +4521,7 @@
 										var recTime = new Date(recString.parseComnpactISO8601().getTime());
 										if(recValOffsetFrom)
 										{
-											var rintOffset=valOffsetFrom.getSecondsFromOffset()*1000;
+											var rintOffset=recValOffsetFrom.getSecondsFromOffset()*1000;
 											recTime.setTime(recTime.getTime()+rintOffset);
 										}
 										if(recTime.toString()+recurrence_id_array[ir].split(';')[1] == varDate+stringUID)
@@ -4614,7 +4614,7 @@
 												var recTime = new Date(recString.parseComnpactISO8601().getTime());
 												if(recValOffsetFrom)
 												{
-													var rintOffset=valOffsetFrom.getSecondsFromOffset()*1000;
+													var rintOffset=recValOffsetFrom.getSecondsFromOffset()*1000;
 													recTime.setTime(recTime.getTime()+rintOffset);
 												}
 												if(recTime.toString()+recurrence_id_array[ir].split(';')[1] == varDate+stringUID)
@@ -4785,7 +4785,7 @@
 												var recTime = new Date(recString.parseComnpactISO8601().getTime());
 												if(recValOffsetFrom)
 												{
-													var rintOffset=valOffsetFrom.getSecondsFromOffset()*1000;
+													var rintOffset=recValOffsetFrom.getSecondsFromOffset()*1000;
 													recTime.setTime(recTime.getTime()+rintOffset);
 												}
 												if(recTime.toString()+recurrence_id_array[ir].split(';')[1] == varDate+stringUID)
@@ -4891,7 +4891,7 @@
 
 					if(!checkRepeat)
 						globalEventList.repeatable.splice(globalEventList.repeatable.length, 0, 
-						{collection: inputCollection, wkst:wkst,lastYear:lastYear,rCount:rCount,rulePartsArray:pars.slice(),lastGenDate:lastGenDate,start: start, end:end, title: title, allDay: all, rid: rid, evid: evid, note: note, displayValue: inputEvent.displayValue, alertTime: alertTime, alertNote: alertNote, frequency: frequency, interval: interval, location: location, realUntil: realUntil, realUntilDate: realUntilDate, repeatStart: repeatStart, repeatEnd: repeatEnd, byMonthDay: byMonthDay,realRepeatCount:realRepeatCount, repeatCount: repeatCount, uid: inputEvent.uid, vcalendar: vcalendar, etag: inputEvent.etag, evcolor: inputEvent.evcolor, isDrawn: true,alertTimeOut:alertTimeOut, timeZone:tzName, realStart:realStart, realEnd:realEnd, byDay:byDay, rec_id:rec_id, rec_id_array:recurrence_id_array, exDates:exDates,  stringUID:stringUID, classType:classType,compareString:compareString,priority:priority,status:status});
+						{collection: inputCollection, wkst:wkst,lastYear:lastYear,rCount:rCount,rulePartsArray:pars.slice(),lastGenDate:lastGenDate,start: start, end:end, title: title, allDay: all, rid: rid, evid: evid, note: note, displayValue: inputEvent.displayValue, alertTime: alertTime, alertNote: alertNote, frequency: frequency, interval: interval, location: location, realUntil: realUntil, realUntilDate: realUntilDate, repeatStart: repeatStart, repeatEnd: repeatEnd, byMonthDay: byMonthDay,realRepeatCount:realRepeatCount, repeatCount: repeatCount, uid: inputEvent.uid, vcalendar: vcalendar, etag: inputEvent.etag, evcolor: inputEvent.evcolor, isDrawn: true,alertTimeOut:alertTimeOut, timeZone:tzName, realStart:realStart, realEnd:realEnd, byDay:byDay, rec_id:rec_id, rec_id_array:recurrence_id_array, exDates:exDates,  stringUID:stringUID, classType:classType, avail:avail, hrefUrl:hrefUrl, compareString:compareString,priority:priority,status:status});
 				}
 				else
 				{
diff -ruN caldavzap_0.10.0.4/interface.js caldavzap/interface.js
--- caldavzap_0.10.0.4/interface.js	2014-03-15 15:49:40.051418000 +0100
+++ caldavzap/interface.js	2014-04-14 19:25:59.722044000 +0200
@@ -747,12 +747,19 @@
 			
 	var td='', td2='';
 	var valOffsetFrom='',intOffset='';
-	var varDate=new Date(inputRepeatEvent.start.getTime());
-	var varEndDate=new Date(inputRepeatEvent.end.getTime());
+	if(inputRepeatEvent.realStart)
+		var varDate=new Date(inputRepeatEvent.realStart.getTime());
+	else
+		var varDate=new Date(inputRepeatEvent.start.getTime());
+	if(inputRepeatEvent.realEnd)
+		var varEndDate=new Date(inputRepeatEvent.realEnd.getTime());
+	else
+		var varEndDate=new Date(inputRepeatEvent.end.getTime());
 	var repeatFromLine=new Date(prevLimit.getFullYear(), prevLimit.getMonth(), prevLimit.getDate(), 0, 0, 0);
 	var repeatCount=inputRepeatEvent.repeatCount;
 	var realRepeatCount=inputRepeatEvent.repeatCount;
 	var byMonthDay=inputRepeatEvent.byMonthDay;
+	var realStart,realEnd;
 	if(inputRepeatEvent.realUntilDate=='')
 		untilDate=toLimit;
 	else
@@ -837,7 +844,7 @@
 									var recTime = new Date(recString.parseComnpactISO8601().getTime());
 									if(recValOffsetFrom)
 									{
-										var rintOffset=valOffsetFrom.getSecondsFromOffset()*1000;
+										var rintOffset=recValOffsetFrom.getSecondsFromOffset()*1000;
 										recTime.setTime(recTime.getTime()+rintOffset);
 									}
 									if(recTime.toString()+inputRepeatEvent.rec_id_array[ir].split(';')[1] == varDate+inputRepeatEvent.stringUID)
@@ -993,13 +1000,13 @@
 							{
 								if(globalSettings.timezonesupport && inputRepeatEvent.timeZone in timezones)
 								{
-									var recValOffsetFrom=getOffsetByTZ(tzName, varDate);
+									var recValOffsetFrom=getOffsetByTZ(inputRepeatEvent.timeZone, varDate);
 									var recTime = new Date(recString.parseComnpactISO8601().getTime());
 									if(recValOffsetFrom)
 									{
-										var rintOffset=valOffsetFrom.getSecondsFromOffset()*1000;
+										var rintOffset=recValOffsetFrom.getSecondsFromOffset()*1000;
 										recTime.setTime(recTime.getTime()+rintOffset);
-									}
+									}	
 									if(recTime.toString()+inputRepeatEvent.rec_id_array[ir].split(';')[1] == varDate+inputRepeatEvent.stringUID)
 										checkCont=true;
 								}
@@ -1308,13 +1315,13 @@
 							var recString = inputRepeatTodo.recurrence_id_array[ir].split(';')[0];
 							if(recString.charAt(recString.length-1)=='Z')
 							{
-								if(globalSettings.timezonesupport && tzName in timezones)
+								if(globalSettings.timezonesupport && inputRepeatTodo.tzName in timezones)
 								{
-									var recValOffsetFrom=getOffsetByTZ(tzName, varDate);
+									var recValOffsetFrom=getOffsetByTZ(inputRepeatTodo.tzName, varDate);
 									var recTime = new Date(recString.parseComnpactISO8601().getTime());
 									if(recValOffsetFrom)
 									{
-										var rintOffset=valOffsetFrom.getSecondsFromOffset()*1000;
+										var rintOffset=recValOffsetFrom.getSecondsFromOffset()*1000;
 										recTime.setTime(recTime.getTime()+rintOffset);
 									}
 									if(recTime.toString()+inputRepeatTodo.recurrence_id_array[ir].split(';')[1] == varDate+inputRepeatTodo.stringUID)
@@ -1465,13 +1472,13 @@
 								var recString = inputRepeatTodo.recurrence_id_array[ir].split(';')[0];
 								if(recString.charAt(recString.length-1)=='Z')
 								{
-									if(globalSettings.timezonesupport && tzName in timezones)
+									if(globalSettings.timezonesupport && inputRepeatTodo.tzName in timezones)
 									{
-										var recValOffsetFrom=getOffsetByTZ(tzName, varDate);
+										var recValOffsetFrom=getOffsetByTZ(inputRepeatTodo.tzName, varDate);
 										var recTime = new Date(recString.parseComnpactISO8601().getTime());
 										if(recValOffsetFrom)
 										{
-											var rintOffset=valOffsetFrom.getSecondsFromOffset()*1000;
+											var rintOffset=recValOffsetFrom.getSecondsFromOffset()*1000;
 											recTime.setTime(recTime.getTime()+rintOffset);
 										}
 										if(recTime.toString()+inputRepeatTodo.recurrence_id_array[ir].split(';')[1] == varDate+inputRepeatTodo.stringUID)
diff -ruN caldavzap_0.10.0.4/localization.js caldavzap/localization.js
--- caldavzap_0.10.0.4/localization.js	2014-03-15 15:49:39.827418000 +0100
+++ caldavzap/localization.js	2014-04-14 19:25:59.578044000 +0200
@@ -3326,7 +3326,7 @@
 localizationCalDAV['ru_RU']=
 {
 	_default_title_format_month_: 'MMMM yyyy',
-	_default_title_format_week_: 'd{ \'–\' d[ MMM][ yyyy] } MMM yyyy',
+	_default_title_format_week_: 'd MMM yyyy{ \'–\' d MMM yyyy}',
 	_default_title_format_day_: 'd MMM yyyy, dddd',
 	_default_title_format_table_: 'MMM yyyy, ddd',
 	_default_column_format_agenda_: 'd MMM, ddd',
@@ -3337,8 +3337,8 @@
 	txtTodo: 'Задачи',
 	txtTodoLists: 'Списки задач',
 	txtSubscribed: 'Подписки',
-	fullCalendarMonth: 'Месяц',
-	fullCalendarMultiWeek: 'Пол-месяца',
+	fullCalendarMonth: 'Шесть недель',
+	fullCalendarMultiWeek: 'Три недели',
 	fullCalendarAgendaWeek: 'Неделя',
 	fullCalendarAgendaDay: 'День',
 	fullCalendarTable: 'Таблица',
diff -ruN caldavzap_0.10.0.4/main.js caldavzap/main.js
--- caldavzap_0.10.0.4/main.js	2014-03-15 15:49:39.755418000 +0100
+++ caldavzap/main.js	2014-04-14 19:25:59.518044000 +0200
@@ -111,7 +111,7 @@
 var globalAvailableAppsArray=new Array();
 var globalEnableAppSwitch=true;
 var globalAppName='CalDavZAP';
-var globalVersion='0.10.0.4';
+var globalVersion='0.10.0.5';
 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.4/vtodo.js caldavzap/vtodo.js
--- caldavzap_0.10.0.4/vtodo.js	2014-03-15 15:49:39.959418000 +0100
+++ caldavzap/vtodo.js	2014-04-14 19:25:59.658044000 +0200
@@ -3457,7 +3457,7 @@
 								var recTime = new Date(recString.parseComnpactISO8601().getTime());
 								if(recValOffsetFrom)
 								{
-									var rintOffset=valOffsetFrom.getSecondsFromOffset()*1000;
+									var rintOffset=recValOffsetFrom.getSecondsFromOffset()*1000;
 									recTime.setTime(recTime.getTime()+rintOffset);
 								}
 								if(recTime.toString()+recurrence_id_array[ir].split(';')[1] == varDate+stringUID)
@@ -3640,7 +3640,7 @@
 									var recTime = new Date(recString.parseComnpactISO8601().getTime());
 									if(recValOffsetFrom)
 									{
-										var rintOffset=valOffsetFrom.getSecondsFromOffset()*1000;
+										var rintOffset=recValOffsetFrom.getSecondsFromOffset()*1000;
 										recTime.setTime(recTime.getTime()+rintOffset);
 									}
 									if(recTime.toString()+recurrence_id_array[ir].split(';')[1] == $.fullCalendar.parseDate(realStart)+stringUID)
@@ -3676,7 +3676,7 @@
 									var recTime = new Date(recString.parseComnpactISO8601().getTime());
 									if(recValOffsetFrom)
 									{
-										var rintOffset=valOffsetFrom.getSecondsFromOffset()*1000;
+										var rintOffset=recValOffsetFrom.getSecondsFromOffset()*1000;
 										recTime.setTime(recTime.getTime()+rintOffset);
 									}
 									if(recTime.toString()+recurrence_id_array[ir].split(';')[1] == $.fullCalendar.parseDate(realEnd)+stringUID)
@@ -3870,7 +3870,7 @@
 											var recTime = new Date(recString.parseComnpactISO8601().getTime());
 											if(recValOffsetFrom)
 											{
-												var rintOffset=valOffsetFrom.getSecondsFromOffset()*1000;
+												var rintOffset=recValOffsetFrom.getSecondsFromOffset()*1000;
 												recTime.setTime(recTime.getTime()+rintOffset);
 											}
 											if(recTime.toString()+recurrence_id_array[ir].split(';')[1] == $.fullCalendar.parseDate(realStart)+stringUID)
@@ -3903,7 +3903,7 @@
 											var recTime = new Date(recString.parseComnpactISO8601().getTime());
 											if(recValOffsetFrom)
 											{
-												var rintOffset=valOffsetFrom.getSecondsFromOffset()*1000;
+												var rintOffset=recValOffsetFrom.getSecondsFromOffset()*1000;
 												recTime.setTime(recTime.getTime()+rintOffset);
 											}
 											if(recTime.toString()+recurrence_id_array[ir].split(';')[1] == $.fullCalendar.parseDate(realEnd)+stringUID)
