/*
InfCloud - the open source CalDAV/CardDAV Web Client
Copyright (C) 2011-2015
    Jan Mate <jan.mate@inf-it.com>
    Andrej Lezo <andrej.lezo@inf-it.com>
    Matej Mihalik <matej.mihalik@inf-it.com>

This program is free software: you can redistribute it and/or modify
it under the terms of the GNU Affero General Public License as
published by the Free Software Foundation, either version 3 of the
License, or (at your option) any later version.

This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
GNU Affero General Public License for more details.

You should have received a copy of the GNU Affero General Public License
along with this program. If not, see <http://www.gnu.org/licenses/>.
*/

function AppleSupportNextDateArray()
{
	this.nextDates={};
	this.reset=function()
	{
		this.nextDates={};
	};
}

function addAndEditTODO(deleteMode)
{
	var inputUID='';
	if($('#uidTODO').val()!='')
		var coll = globalResourceCalDAVList.getTodoCollectionByUID($('#uidTODO').val().substring(0, $('#uidTODO').val().lastIndexOf('/')+1));
	else
		var coll = globalResourceCalDAVList.getTodoCollectionByUID($('#todo_calendar').val());
	var res = getAccount(coll.accountUID);
	var tmp=res.href.match(vCalendar.pre['hrefRex']);
	var origUID=tmp[1]+res.userAuth.userName+'@'+tmp[2];

	if($('#etagTODO').val()!='')
		inputUID=$('#uidTODO').val();
	else if($('#todo_calendar').val()!='choose')
		inputUID=$('#todo_calendar').val()+'';
	else
		return false;

	todoToVcalendar('EDIT',origUID, inputUID, $('#etagTODO').val(), '',deleteMode);
}

function interResourceEditTODO(operation, delUID)
{
	var inputUID='';
	if($('#uidTODO').val()!='')
		var coll = globalResourceCalDAVList.getTodoCollectionByUID($('#uidTODO').val().substring(0, $('#uidTODO').val().lastIndexOf('/')+1));
	else
		var coll = globalResourceCalDAVList.getTodoCollectionByUID($('#todo_calendar').val());
	var res = getAccount(coll.accountUID);
	var tmp=res.href.match(vCalendar.pre['hrefRex']);
	var origUID=tmp[1]+res.userAuth.userName+'@'+tmp[2];

	if(operation != 'MOVE_IN')
		$('#etagTODO').val('');
	var srcUID=$('#uidTODO').val().substring($('#uidTODO').val().lastIndexOf('/')+1, $('#uidTODO').val().length);

	inputUID=$('#todo_calendar').val()+srcUID;
	todoToVcalendar(operation, origUID, inputUID, '', delUID, false);
}

function saveTodo(deleteMode)
{
	$('#todo_details_template').scrollTop(0);
	var calUID=$('#uidTODO').val().substring(0, $('#uidTODO').val().lastIndexOf('/'));
	var newUID=$('#todo_calendar').val().substring(0, $('#todo_calendar').val().length-1);
	if($('#todo_details_template').find('img[data-type=invalidVerySmall],img[data-type=invalidSmall]').filter(function(){return this.style.display!='none'}).length>0)
	{
		show_editor_loader_messageCalendar('vtodo', 'message_error', localization[globalInterfaceLanguage].txtErorInputTodo);
		return false;
	}

	if($('#todo_calendar').val()!='choose')
	{
		if($('#nameTODO').val()=='')
			$('#name').val(localization[globalInterfaceLanguage].pholderNewTODO);

		if($('#todo_type').val()=='start' || $('#todo_type').val()=='due' || $('#todo_type').val()=='both')
		{
			if($('#date_toTODO').val()!='' && $('#date_fromTODO').val()!='')
			{
				var a=$.datepicker.parseDate(globalSettings.datepickerformat.value, $('#date_fromTODO').val());
				var a2=$.datepicker.parseDate(globalSettings.datepickerformat.value, $('#date_toTODO').val());
				var datetime_from=$.fullCalendar.formatDate(a, 'yyyy-MM-dd');
				var datetime_to=$.fullCalendar.formatDate(a2, 'yyyy-MM-dd');
				var time_from='00:00';
				var time_to='00:00';
				if($('#time_fromTODO').val()!='' && $('#time_toTODO').val()!='')
				{
					time_from=new Date(Date.parse("01/02/1990, "+$('#time_fromTODO').val()));
					time_from=$.fullCalendar.formatDate(time_from, 'HH:mm' );
					time_to=new Date(Date.parse("01/02/1990, "+$('#time_toTODO').val()));
					time_to=$.fullCalendar.formatDate(time_to, 'HH:mm' );
				}
				if($('#todo_type').val()=='both' && $.fullCalendar.parseDate(datetime_from+'T'+time_from+'Z')>$.fullCalendar.parseDate(datetime_to+'T'+time_to+'Z'))
				{
					show_editor_loader_messageCalendar('vtodo', 'message_error', localization[globalInterfaceLanguage].txtErrorDatesTodo);
					return false;
				}
			}

			if($('#date_toTODO').val()!='' || $('#date_fromTODO').val()!='')
			{
				if(newUID==calUID || $('#etagTODO').val()=='')
					addAndEditTODO(deleteMode);
//				else if(calUID.substring(0, calUID.lastIndexOf('/'))==newUID.substring(0, newUID.lastIndexOf('/')))
//				{
//					var delUID=$('#uidTODO').val();
//					interResourceEditTODO('MOVE_IN',delUID);
//				}
				else if(/*calUID.substring(0, calUID.lastIndexOf('/'))!=newUID.substring(0, newUID.lastIndexOf('/')) && */$('#etagTODO').val()!='')
				{
					var delUID=$('#uidTODO').val();
					interResourceEditTODO('MOVE_OTHER',delUID);
				}
			}
			else
				show_editor_loader_messageCalendar('vtodo', 'message_error', localization[globalInterfaceLanguage].txtDateTimeErrorTodo);
		}
		else
		{
			if((newUID==calUID) || ($('#etagTODO').val()==''))
				addAndEditTODO(deleteMode);
//			else if(calUID.substring(0, calUID.lastIndexOf('/'))==newUID.substring(0, newUID.lastIndexOf('/')))
//			{
//				var delUID=$('#uidTODO').val();
//				interResourceEditTODO('MOVE_IN',delUID);
//			}
			else if(/*calUID.substring(0, calUID.lastIndexOf('/'))!=newUID.substring(0, newUID.lastIndexOf('/')) && */ $('#etagTODO').val()!='')
			{
				var delUID=$('#uidTODO').val();
				interResourceEditTODO('MOVE_OTHER',delUID);
			}
		}
	}
	else
		show_editor_loader_messageCalendar('vtodo', 'message_error', localization[globalInterfaceLanguage].txtNotChooseTodo);
}

function deleteTodo()
{
	var delUID=$('#uidTODO').val();

	if(delUID!='')
		deleteVcalendarFromCollection(delUID,'vtodo');
}

function getRepeatTodoObject(inputRepeatObj)
{
	var appleTodoMode = false;
	var tzArray=new Array();
	var tzString='';
	var isTimeZone=false;
	var origTimezone = '';
	var vCalendarText = inputRepeatObj.vCalendarText;
	var sel_option = '';
	var inputTodos=jQuery.grep(globalEventList.displayTodosArray[inputRepeatObj.rid],function(e){if(e.id==inputRepeatObj.uidTodo && ((globalSettings.appleremindersmode.value || e.repeatCount<2) || !e.repeatCount))return true});
	if(globalSettings.appleremindersmode.value && inputTodos.length==1)
	{
		if(inputRepeatObj.recurrenceId!='' || inputRepeatObj.futureStart!='')
			appleTodoMode = true;
	}
	for(var iE=0;iE<inputTodos.length;iE++)
	{
		if(tzArray.indexOf(inputTodos[iE].timeZone)==-1)
		{
			if(!appleTodoMode && inputRepeatObj.deleteMode && (inputRepeatObj.vcalendarHash==hex_sha256(inputTodos[iE].vcalendar)))
				continue;
			var component=buildTimezoneComponent(inputTodos[iE].timeZone);
			if(component!='' && (inputRepeatObj.vcalendarHash!=hex_sha256(inputTodos[iE].vcalendar)))
			{
				tzArray[tzArray.length]=inputTodos[iE].timeZone;
				tzString+=component;
				if(tzString.lastIndexOf('\r\n')!=(tzString.length-2))
					tzString+='\r\n';
				isTimeZone=true;
			}
			else if(component!='' && (inputRepeatObj.vcalendarHash==hex_sha256(inputTodos[iE].vcalendar)))
				origTimezone+=component;
		}
	}
	if(isTimeZone)
	{
		if(vCalendarText.lastIndexOf('\r\n')!=(vCalendarText.length-2))
			vCalendarText+='\r\n';
		vCalendarText+=tzString;
	}

	var newFirst = vCalendarText;
	var origRepeatRule = '';
	var realTodo='';
	var origVcalendarString='';
	var todoStringArray=new Array();
	if(inputTodos.length>0)
	{
		var rid=inputRepeatObj.uidTodo.substring(0, inputRepeatObj.uidTodo.lastIndexOf('/')+1);
		if(rid && globalEventList.todos[rid][inputRepeatObj.uidTodo].uid!=undefined)
			origVcalendarString=globalEventList.todos[rid][inputRepeatObj.uidTodo].vcalendar;
		while(origVcalendarString.match(vCalendar.pre['vtodo'])!=null)
		{
			if(origVcalendarString.substring(origVcalendarString.indexOf('BEGIN:VTODO')-2, origVcalendarString.indexOf('BEGIN:VTODO'))=='\r\n')
			{
				var partTodo=origVcalendarString.substring(origVcalendarString.indexOf('BEGIN:VTODO')-2,origVcalendarString.indexOf('END:VTODO')+'END:VTODO'.length);
				origVcalendarString=origVcalendarString.replace(partTodo, '');
			}
			else
			{
				var partTodo=origVcalendarString.substring(origVcalendarString.indexOf('BEGIN:VTODO'),origVcalendarString.indexOf('END:VTODO')+'END:VTODO'.length);
				origVcalendarString=origVcalendarString.replace(partTodo, '');
				partTodo+='\r\n';
			}
			todoStringArray[todoStringArray.length]=partTodo;
		}
	}
	var beginVcalendar = vCalendarText;
	var futureMode = false;
	for(var j=0;j<inputTodos.length;j++)
	{
		todoStringArray.splice(todoStringArray.indexOf(inputTodos[j].vcalendar),1);
		if((inputRepeatObj.futureStart== '' &&  inputRepeatObj.vcalendarHash!=hex_sha256(inputTodos[j].vcalendar)) || inputTodos[j].rec_id!=inputRepeatObj.recurrenceId)
		{
			var stringUIDcurrent=inputTodos[j].vcalendar.match(vCalendar.pre['contentline_UID']);
			if(stringUIDcurrent!=null)
				stringUIDcurrent=stringUIDcurrent[0].match(vCalendar.pre['contentline_parse'])[4];
			if((inputRepeatObj.deleteMode && inputRepeatObj.vcalendarHash==hex_sha256(inputTodos[j].vcalendar)) || (inputRepeatObj.deleteMode && !inputTodos[j].rec_id && inputRepeatObj.vcalendarUID==stringUIDcurrent) || appleTodoMode)
			{
				var ruleString=inputTodos[j].vcalendar.match(vCalendar.pre['contentline_RRULE2']);
				var origRuleString=ruleString;
				origRepeatRule = ruleString;
				var exDate=inputTodos[j].start;
				var process_elem=vCalendar.tplC['VTcontentline_EXDATE'];
				process_elem=process_elem.replace('##:::##group_wd##:::##', '');
				process_elem=process_elem.replace('##:::##params_wsc##:::##', '');

				exDate=inputRepeatObj.recurrenceId.parseComnpactISO8601();

				if(globalSettings.timezonesupport.value)
					sel_option=inputRepeatObj.timezoneTODO;

				if(sel_option!='local')
				{
					var valOffsetFrom=getOffsetByTZ(sel_option, exDate);
					var intOffset = valOffsetFrom.getSecondsFromOffset()*-1;
					exDate = new Date(exDate.setSeconds(intOffset));
				}
				else
					exDate=new Date(exDate.setSeconds(getLocalOffset(exDate)));

				exDate=$.fullCalendar.formatDate(exDate, "yyyyMMdd'T'HHmmss'Z'");
				process_elem=process_elem.replace('##:::##AllDay##:::##', vcalendarEscapeValue(''));
				process_elem=process_elem.replace('##:::##TZID##:::##','');
				process_elem=process_elem.replace('##:::##value##:::##', vcalendarEscapeValue(exDate));
				if(inputTodos[j].finalString.length>2);
					inputTodos[j].vcalendar=inputTodos[j].vcalendar.replace(ruleString,ruleString+(inputTodos[j].finalString.substring(2,inputTodos[j].finalString.length)));
				if(!appleTodoMode)
					inputTodos[j].vcalendar=inputTodos[j].vcalendar.replace(ruleString,ruleString+process_elem);
			}
			else
			{
				var endPart = (inputTodos[j].vcalendar+'\r\n').match(vCalendar.pre['endVTODO']);
				if(endPart!=null)
				{
					if(inputTodos[j].finalString.length>2)
						inputTodos[j].vcalendar=inputTodos[j].vcalendar.replace(endPart[0].substring(0,endPart[0].length-2),(inputTodos[j].finalString)+endPart[0].substring(2,endPart[0].length));
				}
			}

			var origVcalendar = inputTodos[j].vcalendar;
			if(appleTodoMode && typeof globalAppleSupport.nextDates[inputTodos[j].id] != 'undefined')
			{
				var startPart='',endPart='';
				if(origVcalendar.match(vCalendar.pre['contentline_DTSTART'])!=null && origVcalendar.match(vCalendar.pre['contentline_DUE'])!=null)
				{
					startPart = origVcalendar.match(vCalendar.pre['contentline_DTSTART'])[0].match(vCalendar.pre['contentline_parse'])[4];
					endPart = origVcalendar.match(vCalendar.pre['contentline_DUE'])[0].match(vCalendar.pre['contentline_parse'])[4];
				}

				var isUTC=false;
				if(globalSettings.timezonesupport.value)
					sel_option=inputRepeatObj.timezoneTODO;

				if(sel_option=='UTC')
					isUTC=true;

				var newStart = new Date(globalAppleSupport.nextDates[inputTodos[j].id].getTime());
				var valOffsetFrom=getOffsetByTZ(sel_option,newStart );
				var intOffset='';
				if(typeof globalSessionTimeZone!='undefined' && globalSessionTimeZone!=null && globalSessionTimeZone!='')
					intOffset=getOffsetByTZ(globalSessionTimeZone, newStart).getSecondsFromOffset();
				else
					intOffset=newStart.getTimezoneOffset()*60*-1;

				intOffset = valOffsetFrom.getSecondsFromOffset() - intOffset;

				newStart.setSeconds(intOffset);
				var datetime_to=$.fullCalendar.formatDate(newStart, "yyyyMMdd'T'HHmmss");
				inputTodos[j].vcalendar = inputTodos[j].vcalendar.replace(endPart,vcalendarEscapeValue(datetime_to+(isUTC ? 'Z' : '')));
				inputTodos[j].vcalendar = inputTodos[j].vcalendar.replace(startPart,vcalendarEscapeValue(datetime_to+(isUTC ? 'Z' : '')));
				if(inputTodos[j].after!='')
					inputTodos[j].vcalendar = changeRuleForFuture(inputTodos[j], inputTodos[j].after);
				origVcalendar = inputTodos[j].vcalendar;
			}

			if(origVcalendar.indexOf('\r\n')==0 && vCalendarText.lastIndexOf('\r\n')==(vCalendarText.length-2))
				vCalendarText+=origVcalendar.substring(2,origVcalendar.length);
			else if((origVcalendar.indexOf('\r\n')==0 && vCalendarText.lastIndexOf('\r\n')!=(vCalendarText.length-2)) || (origVcalendar.indexOf('\r\n')!=0 && vCalendarText.lastIndexOf('\r\n')==(vCalendarText.length-2)) )
				vCalendarText+=origVcalendar;
			else
				vCalendarText+='\r\n'+origVcalendar;
		}
		else if(inputRepeatObj.futureStart.split(';')[0]!='' && inputRepeatObj.futureStart.split(';')[1]!=inputTodos[j].start && inputRepeatObj.futureStart.split(';')[1]!=inputTodos[j].end)
		{
			var ruleString=inputTodos[j].vcalendar.match(vCalendar.pre['contentline_RRULE2']);
			if(inputTodos[j].finalString.length>2);
				inputTodos[j].vcalendar=inputTodos[j].vcalendar.replace(ruleString,ruleString+(inputTodos[j].finalString.substring(2,inputTodos[j].finalString.length)));
			if(inputRepeatObj.futureStart.split(';')[0]>1 && inputRepeatObj.vcalendarHash==hex_sha256(inputTodos[j].vcalendar))
				inputTodos[j].vcalendar=changeRuleForFuture(inputTodos[j], inputRepeatObj.futureStart.split(';')[0]);
			if(inputTodos[j].vcalendar.indexOf('\r\n')==0 && vCalendarText.lastIndexOf('\r\n')==(vCalendarText.length-2))
				vCalendarText+=inputTodos[j].vcalendar.substring(2,inputTodos[j].vcalendar.length);
			else if((inputTodos[j].vcalendar.indexOf('\r\n')==0 && vCalendarText.lastIndexOf('\r\n')!=(vCalendarText.length-2)) || (inputTodos[j].vcalendar.indexOf('\r\n')!=0 && vCalendarText.lastIndexOf('\r\n')==(vCalendarText.length-2)) )
				vCalendarText+=inputTodos[j].vcalendar;
			else
				vCalendarText+='\r\n'+inputTodos[j].vcalendar;
			futureMode=true;
		}
		else if(inputRepeatObj.deleteMode && inputRepeatObj.futureStart.split(';')[0]!='' && (inputRepeatObj.futureStart.split(';')[1]==inputTodos[j].start || inputRepeatObj.futureStart.split(';')[1]==inputTodos[j].end))
		{
			var ruleString=inputTodos[j].vcalendar.match(vCalendar.pre['contentline_RRULE2']);
			if(inputTodos[j].finalString.length>2);
				inputTodos[j].vcalendar=inputTodos[j].vcalendar.replace(ruleString,ruleString+(inputTodos[j].finalString.substring(2,inputTodos[j].finalString.length)));

			if(inputRepeatObj.vcalendarHash==hex_sha256(inputTodos[j].vcalendar))
				inputTodos[j].vcalendar=changeRuleForFuture(inputTodos[j], 2);
			if(inputTodos[j].vcalendar.indexOf('\r\n')==0 && vCalendarText.lastIndexOf('\r\n')==(vCalendarText.length-2))
				vCalendarText+=inputTodos[j].vcalendar.substring(2,inputTodos[j].vcalendar.length);
			else if((inputTodos[j].vcalendar.indexOf('\r\n')==0 && vCalendarText.lastIndexOf('\r\n')!=(vCalendarText.length-2)) || (inputTodos[j].vcalendar.indexOf('\r\n')!=0 && vCalendarText.lastIndexOf('\r\n')==(vCalendarText.length-2)) )
				vCalendarText+=inputTodos[j].vcalendar;
			else
				vCalendarText+='\r\n'+inputTodos[j].vcalendar;
		}
		else
			realTodo=inputTodos[j];
	}
	vCalendarText=vCalendarText.replace(realTodo.vcalendar,'');

	if(!appleTodoMode)
		for(var ip=0; ip<todoStringArray.length;ip++)
		{
			if(todoStringArray[ip].indexOf('\r\n')==0 && vCalendarText.lastIndexOf('\r\n')==(vCalendarText.length-2))
				vCalendarText+=todoStringArray[ip].substring(2,todoStringArray[ip].length);
			else if((todoStringArray[ip].indexOf('\r\n')==0 && vCalendarText.lastIndexOf('\r\n')!=(vCalendarText.length-2)) || (todoStringArray[ip].indexOf('\r\n')!=0 && vCalendarText.lastIndexOf('\r\n')==(vCalendarText.length-2)) )
				vCalendarText+=todoStringArray[ip];
			else
				vCalendarText+='\r\n'+todoStringArray[ip];
		}
	return {
		tzArray:tzArray,
		tzString:tzString,
		isTimeZone:isTimeZone,
		origTimezone:origTimezone,
		vCalendarText:vCalendarText,
		realTodo:realTodo,
		sel_option: sel_option,
		futureMode:futureMode,
		appleTodoMode:appleTodoMode,
		newFirst:newFirst,
		beginVcalendar:beginVcalendar
	};
}

function todoToVcalendar(operation, accountUID, inputUID, inputEtag, delUID, deleteMode)
{
	var vtodo=false;
	var vCalendarText='',
	groupCounter=0;
	var repeatHash = 'form';
	if(delUID!='')
		var rid=delUID.substring(0, delUID.lastIndexOf('/')+1);
	else
		var rid=inputUID.substring(0, inputUID.lastIndexOf('/')+1);
	// vCalendar BEGIN (required by RFC)
	if(vCalendar.tplM['VTbegin'][repeatHash]!=null && (process_elem=vCalendar.tplM['VTbegin'][repeatHash][0])!=undefined)
		vCalendarText+=vCalendar.tplM['VTbegin'][repeatHash][0];
	else
	{
		process_elem=vCalendar.tplC['VTbegin'];
		process_elem=process_elem.replace('##:::##group_wd##:::##', '');
		vCalendarText+=process_elem;
	}

	// VERSION (required by RFC)
	if(vCalendar.tplM['VTcontentline_VERSION'][repeatHash]!=null && (process_elem=vCalendar.tplM['VTcontentline_VERSION'][repeatHash][0])!=undefined)
	{
		// replace the object and related objects' group names (+ append the related objects after the processed)
		parsed=('\r\n'+process_elem).match(RegExp('\r\n((?:'+vCalendar.re['group']+'\\.)?)', 'm'));
		if(parsed[1]!='') // if group is present, replace the object and related objects' group names
			process_elem=('\r\n'+process_elem).replace(RegExp('\r\n'+parsed[1].replace('.', '\\.'), 'mg'), '\r\nitem'+(groupCounter++)+'.').substring(2);
	}
	else
	{
		process_elem=vCalendar.tplC['VTcontentline_VERSION'];
		process_elem=process_elem.replace('##:::##group_wd##:::##', '');
	}
	process_elem=process_elem.replace('##:::##version##:::##', '2.0');
	vCalendarText+=process_elem;

	// CALSCALE
	if(vCalendar.tplM['VTcontentline_CALSCALE'][repeatHash]!=null && (process_elem=vCalendar.tplM['VTcontentline_CALSCALE'][repeatHash][0])!=undefined)
	{
		// replace the object and related objects' group names (+ append the related objects after the processed)
		parsed=('\r\n'+process_elem).match(RegExp('\r\n((?:'+vCalendar.re['group']+'\\.)?)', 'm'));
		if(parsed[1]!='') // if group is present, replace the object and related objects' group names
			process_elem=('\r\n'+process_elem).replace(RegExp('\r\n'+parsed[1].replace('.', '\\.'), 'mg'), '\r\nitem'+(groupCounter++)+'.').substring(2);
	}
	else
	{
		process_elem=vCalendar.tplC['VTcontentline_CALSCALE'];
		process_elem=process_elem.replace('##:::##group_wd##:::##', '');
	}
	process_elem=process_elem.replace('##:::##calscale##:::##', 'GREGORIAN');
	vCalendarText+=process_elem;

	var resultTodoObj = getRepeatTodoObject({
		rid:rid,
		uidTodo:$('#uidTODO').val(),
		vcalendarHash: $('#vcalendarHashTODO').val(),
		vcalendarUID: $('#vcalendarUIDTODO').val(),
		recurrenceId: $('#recurrenceIDTODO').val(),
		timezoneTODO: $('#timezoneTODO').val(),
		futureStart: $('#futureStartTODO').val(),
		deleteMode: deleteMode,
		vCalendarText:vCalendarText
	});
	vCalendarText = resultTodoObj.vCalendarText;
	var tzArray=resultTodoObj.tzArray;
	var tzString=resultTodoObj.tzString;
	var isTimeZone=resultTodoObj.isTimeZone;
	var origTimezone =resultTodoObj.origTimezone;
	var appleTodoMode=resultTodoObj.appleTodoMode;
	var realTodo = resultTodoObj.realTodo;
	var newFirst = resultTodoObj.newFirst;
	var sel_option = resultTodoObj.sel_option;

	//until here will function TODOCLICK
	var origEvent='';
	if(deleteMode || resultTodoObj.futureMode)
	{
		if(vCalendarText.lastIndexOf('\r\n')!=(vCalendarText.length-2))
			vCalendarText+='\r\n';
		if(!isTimeZone && ( appleTodoMode || (resultTodoObj.futureMode && origTimezone!='')))
		{
			vCalendarText+=origTimezone;
			if(vCalendarText.lastIndexOf('\r\n')!=(vCalendarText.length-2))
				vCalendarText+='\r\n';
		}
		// PRODID
		if(vCalendar.tplM['VTcontentline_PRODID'][repeatHash]!=null && (process_elem=vCalendar.tplM['VTcontentline_PRODID'][repeatHash][0])!=undefined)
		{
			// replace the object and related objects' group names (+ append the related objects after the processed)
			parsed=('\r\n'+process_elem).match(RegExp('\r\n((?:'+vCalendar.re['group']+'\\.)?)', 'm'));
			if(parsed[1]!='') // if group is present, replace the object and related objects' group names
				process_elem=('\r\n'+process_elem).replace(RegExp('\r\n'+parsed[1].replace('.', '\\.'), 'mg'), '\r\nitem'+(groupCounter++)+'.').substring(2);
		}
		else
		{
			process_elem=vCalendar.tplC['VTcontentline_PRODID'];
			process_elem=process_elem.replace('##:::##group_wd##:::##', '');
			process_elem=process_elem.replace('##:::##params_wsc##:::##', '');
		}
		process_elem=process_elem.replace('##:::##value##:::##', '-//Inf-IT//'+globalAppName+' '+globalVersion+'//EN');
		vCalendarText+=process_elem;

		if(typeof vCalendar.tplM['VTunprocessed'][repeatHash]!='undefined' && vCalendar.tplM['VTunprocessed'][repeatHash]!='' && vCalendar.tplM['VTunprocessed'][repeatHash]!=null)
			vCalendarText+=vCalendar.tplM['VTunprocessed'][repeatHash].replace(RegExp('^\r\n'), '');

		vCalendar.tplM['VTunprocessed'][repeatHash]=new Array();
		// vCalendar END (required by RFC)

		if(vCalendar.tplM['VTend'][repeatHash]!=null && (process_elem=vCalendar.tplM['VTend'][repeatHash][0])!=undefined)
			vCalendarText+=vCalendar.tplM['VTend'][repeatHash][0];
		else
		{
			process_elem=vCalendar.tplC['VTend'];
			process_elem=process_elem.replace('##:::##group_wd##:::##', '');
			vCalendarText+=process_elem;
		}
		if(deleteMode)
		{
			var fixedArr = checkAndFixMultipleUID(vCalendarText,false);
			var inputS = fixedArr[0];
			fixedArr.splice(0,1);
			return putVcalendarToCollection(accountUID, inputUID, inputEtag, inputS, delUID,'vtodo',false,deleteMode,fixedArr);
		}
		else if(resultTodoObj.futureMode)
		{
			origEvent = vCalendarText;
			vCalendarText = resultTodoObj.beginVcalendar;
		}
	}

	var timeZoneAttr='';
	if(typeof globalSessionTimeZone!='undefined' && globalSessionTimeZone)
		sel_option=globalSessionTimeZone;
	var isUTC=false;

	var origFirst=vCalendarText;
	if(appleTodoMode)
		vCalendarText='';
	if($('#todo_type').val()!='none')
	{
		if(globalSettings.timezonesupport.value)
			sel_option=$('#timezoneTODO').val();

		if(sel_option=='UTC')
		{
			isUTC=true;
			timeZoneAttr='';
		}
		else if(sel_option=='local')
			timeZoneAttr='';
		else if(sel_option=='custom')
			timeZoneAttr=';'+vcalendarEscapeValue('TZID='+realTodo.timeZone);
		else
			timeZoneAttr=';'+vcalendarEscapeValue('TZID='+sel_option);

		if(vCalendarText.lastIndexOf('\r\n')!=(vCalendarText.length-2))
			vCalendarText+='\r\n';

		if(globalSettings.rewritetimezonecomponent.value || !vCalendar.tplM['VTunprocessedVTIMEZONE'][repeatHash])
		{
			if(tzArray.indexOf(sel_option)==-1)
				vCalendarText+= buildTimezoneComponent(sel_option);
		}
		else
			vCalendarText+=vCalendar.tplM['VTunprocessedVTIMEZONE'][repeatHash];
	}
	origFirst+=vCalendarText;
	// ---------------------------------------------------------------------------------------------------- //
	if(vCalendar.tplM['VTbeginVTODO'][repeatHash]!=null && (process_elem=vCalendar.tplM['VTbeginVTODO'][repeatHash][0])!=undefined)
		vCalendarText+=vCalendar.tplM['VTbeginVTODO'][repeatHash][0];
	else
	{
		process_elem=vCalendar.tplC['VTbeginVTODO'];
		process_elem=process_elem.replace('##:::##group_wd##:::##', '');
		vCalendarText+=process_elem;
		vtodo=true;
	}
	var d, utc;
	d=new Date();
	utc=d.getUTCFullYear()+(d.getUTCMonth()+1<10 ? '0': '')+(d.getUTCMonth()+1)+(d.getUTCDate()<10 ? '0': '')+d.getUTCDate()+'T'+(d.getUTCHours()<10 ? '0': '')+d.getUTCHours()+(d.getUTCMinutes()<10 ? '0': '')+d.getUTCMinutes()+(d.getUTCSeconds()<10 ? '0': '')+d.getUTCSeconds()+'Z';
	var create=true;

	if($('#recurrenceIDTODO').val()=='')
		var checkVal='orig';
	else
		var checkVal=$('#recurrenceIDTODO').val();

	var created='';
	for(vev in vCalendar.tplM['VTcontentline_CREATED'][repeatHash])
	{
		if(vev==checkVal)
			created=vCalendar.tplM['VTcontentline_CREATED'][repeatHash][vev];
	}

	if(created!='')
	{
		process_elem=created;
		// replace the object and related objects' group names (+ append the related objects after the processed)
		parsed=('\r\n'+process_elem).match(RegExp('\r\n((?:'+vCalendar.re['group']+'\\.)?)', 'm'));
		if(parsed[1]!='') // if group is present, replace the object and related objects' group names
			process_elem=('\r\n'+process_elem).replace(RegExp('\r\n'+parsed[1].replace('.', '\\.'), 'mg'), '\r\nitem'+(groupCounter++)+'.').substring(2);
	}
	else
	{
		process_elem=vCalendar.tplC['VTcontentline_CREATED'];
		process_elem=process_elem.replace('##:::##group_wd##:::##', '');
		process_elem=process_elem.replace('##:::##params_wsc##:::##', '');
		process_elem=process_elem.replace('##:::##value##:::##', vcalendarEscapeValue(utc));
	}
	vCalendarText+=process_elem;

	if(vCalendar.tplM['VTcontentline_LM'][repeatHash]!=null && (process_elem=vCalendar.tplM['VTcontentline_LM'][repeatHash][0])!=undefined)
	{
		// replace the object and related objects' group names (+ append the related objects after the processed)
		parsed=('\r\n'+process_elem).match(RegExp('\r\n((?:'+vCalendar.re['group']+'\\.)?)', 'm'));
		if(parsed[1]!='') // if group is present, replace the object and related objects' group names
			process_elem=('\r\n'+process_elem).replace(RegExp('\r\n'+parsed[1].replace('.', '\\.'), 'mg'), '\r\nitem'+(groupCounter++)+'.').substring(2);
	}
	else
	{
		process_elem=vCalendar.tplC['VTcontentline_LM'];
		process_elem=process_elem.replace('##:::##group_wd##:::##', '');
		process_elem=process_elem.replace('##:::##params_wsc##:::##', '');
	}
	process_elem=process_elem.replace('##:::##value##:::##', vcalendarEscapeValue(utc));
	vCalendarText+=process_elem;

	if(vCalendar.tplM['VTcontentline_DTSTAMP'][repeatHash]!=null && (process_elem=vCalendar.tplM['VTcontentline_DTSTAMP'][repeatHash][0])!=undefined)
	{
		// replace the object and related objects' group names (+ append the related objects after the processed)
		parsed=('\r\n'+process_elem).match(RegExp('\r\n((?:'+vCalendar.re['group']+'\\.)?)', 'm'));
		if(parsed[1]!='') // if group is present, replace the object and related objects' group names
			process_elem=('\r\n'+process_elem).replace(RegExp('\r\n'+parsed[1].replace('.', '\\.'), 'mg'), '\r\nitem'+(groupCounter++)+'.').substring(2);
	}
	else
	{
		process_elem=vCalendar.tplC['VTcontentline_DTSTAMP'];
		process_elem=process_elem.replace('##:::##group_wd##:::##', '');
		process_elem=process_elem.replace('##:::##params_wsc##:::##', '');
	}
	process_elem=process_elem.replace('##:::##value##:::##', vcalendarEscapeValue(utc));
	vCalendarText+=process_elem;

	// UID (required by RFC)
	if(!appleTodoMode && $("#futureStartTODO").val()=='' && (operation!='MOVE_IN'&& operation!='MOVE_OTHER') && vCalendar.tplM['VTcontentline_UID'][repeatHash]!=null && (process_elem=vCalendar.tplM['VTcontentline_UID'][repeatHash][0])!=undefined)
	{
		// replace the object and related objects' group names (+ append the related objects after the processed)
		parsed=('\r\n'+process_elem).match(RegExp('\r\n((?:'+vCalendar.re['group']+'\\.)?)', 'm'));
		if(parsed[1]!='') // if group is present, replace the object and related objects' group names
			process_elem=('\r\n'+process_elem).replace(RegExp('\r\n'+parsed[1].replace('.', '\\.'), 'mg'), '\r\nitem'+(groupCounter++)+'.').substring(2);
	}
	else
	{
		process_elem=vCalendar.tplC['VTcontentline_UID'];
		process_elem=process_elem.replace('##:::##group_wd##:::##', '');
		process_elem=process_elem.replace('##:::##params_wsc##:::##', '');
	}
	var newUID=globalEventList.getNewUID();
	// it is VERY small probability, that for 2 newly created events the same UID is generated (but not impossible :( ...)
	process_elem=process_elem.replace('##:::##uid##:::##', newUID);
	vCalendarText+=process_elem;

	if(vCalendar.tplM['VTcontentline_SUMMARY'][repeatHash]!=null && (process_elem=vCalendar.tplM['VTcontentline_SUMMARY'][repeatHash][0])!=undefined)
	{
		// replace the object and related objects' group names (+ append the related objects after the processed)
		parsed=('\r\n'+process_elem).match(RegExp('\r\n((?:'+vCalendar.re['group']+'\\.)?)', 'm'));
		if(parsed[1]!='') // if group is present, replace the object and related objects' group names
			process_elem=('\r\n'+process_elem).replace(RegExp('\r\n'+parsed[1].replace('.', '\\.'), 'mg'), '\r\nitem'+(groupCounter++)+'.').substring(2);
	}
	else
	{
		process_elem=vCalendar.tplC['VTcontentline_SUMMARY'];
		process_elem=process_elem.replace('##:::##group_wd##:::##', '');
		process_elem=process_elem.replace('##:::##params_wsc##:::##', '');
	}
	if($('#nameTODO').val()=='')
		process_elem=process_elem.replace('##:::##value##:::##', vcalendarEscapeValue("New TODO"));
	else
		process_elem=process_elem.replace('##:::##value##:::##', vcalendarEscapeValue($('#nameTODO').val()));
	//process_elem=process_elem.replace('##:::##value##:::##',vcalendarEscapeValue('zmena'));
	vCalendarText+=process_elem;

	if($('#statusTODO').val()!='NONE')
	{
		//if((value=$('[id="vcalendar_editor"] [data-type="\\%note"]').find('textarea').val())!='')
		//{
		if(vCalendar.tplM['VTcontentline_STATUS'][repeatHash]!=null && (process_elem=vCalendar.tplM['VTcontentline_STATUS'][repeatHash][0])!=undefined)
		{
			// replace the object and related objects' group names (+ append the related objects after the processed)
			parsed=('\r\n'+process_elem).match(RegExp('\r\n((?:'+vCalendar.re['group']+'\\.)?)', 'm'));
			if(parsed[1]!='') // if group is present, replace the object and related objects' group names
				process_elem=('\r\n'+process_elem).replace(RegExp('\r\n'+parsed[1].replace('.', '\\.'), 'mg'), '\r\nitem'+(groupCounter++)+'.').substring(2);
		}
		else
		{
			process_elem=vCalendar.tplC['VTcontentline_STATUS'];
			process_elem=process_elem.replace('##:::##group_wd##:::##', '');
			process_elem=process_elem.replace('##:::##params_wsc##:::##', '');
		}
		process_elem=process_elem.replace('##:::##value##:::##', vcalendarEscapeValue($('#statusTODO').val()));
		vCalendarText+=process_elem;
	}

	if($('#percenteCompleteValue').val()!='')
	{
		if(vCalendar.tplM['VTcontentline_PERCENT-COMPLETE'][repeatHash]!=null && (process_elem=vCalendar.tplM['VTcontentline_PERCENT-COMPLETE'][repeatHash][0])!=undefined)
		{
			// replace the object and related objects' group names (+ append the related objects after the processed)
			parsed=('\r\n'+process_elem).match(RegExp('\r\n((?:'+vCalendar.re['group']+'\\.)?)', 'm'));
			if(parsed[1]!='') // if group is present, replace the object and related objects' group names
				process_elem=('\r\n'+process_elem).replace(RegExp('\r\n'+parsed[1].replace('.', '\\.'), 'mg'), '\r\nitem'+(groupCounter++)+'.').substring(2);
		}
		else
		{
			process_elem=vCalendar.tplC['VTcontentline_PERCENT-COMPLETE'];
			process_elem=process_elem.replace('##:::##group_wd##:::##', '');
			process_elem=process_elem.replace('##:::##params_wsc##:::##', '');
		}
		process_elem=process_elem.replace('##:::##value##:::##', vcalendarEscapeValue($('#percenteCompleteValue').val()));
		vCalendarText+=process_elem;
	}

	if($('#priority_TODO').val()!='0')
	{
		if(vCalendar.tplM['VTcontentline_PRIORITY'][repeatHash]!=null && (process_elem=vCalendar.tplM['VTcontentline_PRIORITY'][repeatHash][0])!=undefined)
		{
			// replace the object and related objects' group names (+ append the related objects after the processed)
			parsed=('\r\n'+process_elem).match(RegExp('\r\n((?:'+vCalendar.re['group']+'\\.)?)', 'm'));
			if(parsed[1]!='') // if group is present, replace the object and related objects' group names
				process_elem=('\r\n'+process_elem).replace(RegExp('\r\n'+parsed[1].replace('.', '\\.'), 'mg'), '\r\nitem'+(groupCounter++)+'.').substring(2);
		}
		else
		{
			process_elem=vCalendar.tplC['VTcontentline_PRIORITY'];
			process_elem=process_elem.replace('##:::##group_wd##:::##', '');
			process_elem=process_elem.replace('##:::##params_wsc##:::##', '');
		}
		process_elem=process_elem.replace('##:::##value##:::##', vcalendarEscapeValue($('#priority_TODO').val()));
		vCalendarText+=process_elem;
	}

	if($('#noteTODO').val()!='')
	{
		// NOTE
		if(vCalendar.tplM['VTcontentline_NOTE'][repeatHash]!=null && (process_elem=vCalendar.tplM['VTcontentline_NOTE'][repeatHash][0])!=undefined)
		{
			// replace the object and related objects' group names (+ append the related objects after the processed)
			parsed=('\r\n'+process_elem).match(RegExp('\r\n((?:'+vCalendar.re['group']+'\\.)?)', 'm'));
			if(parsed[1]!='') // if group is present, replace the object and related objects' group names
				process_elem=('\r\n'+process_elem).replace(RegExp('\r\n'+parsed[1].replace('.', '\\.'), 'mg'), '\r\nitem'+(groupCounter++)+'.').substring(2);
		}
		else
		{
			process_elem=vCalendar.tplC['VTcontentline_NOTE'];
			process_elem=process_elem.replace('##:::##group_wd##:::##', '');
			process_elem=process_elem.replace('##:::##params_wsc##:::##', '');
		}
		process_elem=process_elem.replace('##:::##value##:::##', vcalendarEscapeValue($('#noteTODO').val()));
		vCalendarText+=process_elem;
	}

	if($('#typeTODO').val()!='')
	{
		// CLASS
		if(vCalendar.tplM['VTcontentline_CLASS'][repeatHash]!=null && (process_elem=vCalendar.tplM['VTcontentline_CLASS'][repeatHash][0])!=undefined)
		{
			// replace the object and related objects' group names (+ append the related objects after the processed)
			parsed=('\r\n'+process_elem).match(RegExp('\r\n((?:'+vCalendar.re['group']+'\\.)?)', 'm'));
			if(parsed[1]!='') // if group is present, replace the object and related objects' group names
				process_elem=('\r\n'+process_elem).replace(RegExp('\r\n'+parsed[1].replace('.', '\\.'), 'mg'), '\r\nitem'+(groupCounter++)+'.').substring(2);
		}
		else
		{
			process_elem=vCalendar.tplC['VTcontentline_CLASS'];
			process_elem=process_elem.replace('##:::##group_wd##:::##', '');
			process_elem=process_elem.replace('##:::##params_wsc##:::##', '');
			if(typeof vCalendar.tplM['VTcontentline_CLASS'][repeatHash] =='undefined' || vCalendar.tplM['VTcontentline_CLASS'][repeatHash]==null || vCalendar.tplM['VTcontentline_CLASS'][repeatHash].length==0)
				process_elem='';
		}

		if($('.row_typeTODO').css('display')!='none')
		{
			process_elem=vCalendar.tplC['VTcontentline_CLASS'];
			process_elem=process_elem.replace('##:::##group_wd##:::##', '');
			process_elem=process_elem.replace('##:::##params_wsc##:::##', '');
			process_elem=process_elem.replace('##:::##value##:::##', vcalendarEscapeValue($('#typeTODO').val().toUpperCase()));
		}
		vCalendarText+=process_elem;
	}

	if($('#url_TODO').val()!='')
	{
		if(vCalendar.tplM['VTcontentline_URL'][repeatHash]!=null && (process_elem=vCalendar.tplM['VTcontentline_URL'][repeatHash][0])!=undefined)
		{
			// replace the object and related objects' group names (+ append the related objects after the processed)
			parsed=('\r\n'+process_elem).match(RegExp('\r\n((?:'+vCalendar.re['group']+'\\.)?)', 'm'));
			if(parsed[1]!='') // if group is present, replace the object and related objects' group names
				process_elem=('\r\n'+process_elem).replace(RegExp('\r\n'+parsed[1].replace('.', '\\.'), 'mg'), '\r\nitem'+(groupCounter++)+'.').substring(2);
		}
		else
		{
			process_elem=vCalendar.tplC['VTcontentline_URL'];
			process_elem=process_elem.replace('##:::##group_wd##:::##', '');
			process_elem=process_elem.replace('##:::##params_wsc##:::##', '');
		}
		process_elem=process_elem.replace('##:::##value##:::##', vcalendarEscapeValue($('#url_TODO').val()));
		vCalendarText+=process_elem;
	}

	//RFC OPTIONAL
	if(vCalendar.tplM['VTcontentline_LOCATION'][repeatHash]!=null && (process_elem=vCalendar.tplM['VTcontentline_LOCATION'][repeatHash][0])!=undefined)
	{
		// replace the object and related objects' group names (+ append the related objects after the processed)
		parsed=('\r\n'+process_elem).match(RegExp('\r\n((?:'+vCalendar.re['group']+'\\.)?)','m'));
		if(parsed[1]!='')	// if group is present, replace the object and related objects' group names
			process_elem=('\r\n'+process_elem).replace(RegExp('\r\n'+parsed[1].replace('.','\\.'),'mg'),'\r\nitem'+(groupCounter++)+'.').substring(2);
	}
	else
	{
		process_elem=vCalendar.tplC['VTcontentline_LOCATION'];
		process_elem=process_elem.replace('##:::##group_wd##:::##','');
		process_elem=process_elem.replace('##:::##params_wsc##:::##','');
	}

	if($('#location_TODO').val()!='')
	{
		process_elem=process_elem.replace('##:::##value##:::##',vcalendarEscapeValue($('#location_TODO').val()));
		vCalendarText+=process_elem;
	}

	if($('#repeat_TODO').val()!='no-repeat')
	{
		var interval=$("#repeat_interval_detail_TODO").val();
		var byDay='';
		var isCustom=false;
		var monthDay='';
		var bymonth='';
		var wkst='';
		if(interval==1 || interval=='')
			interval='';
		else interval=";INTERVAL="+$("#repeat_interval_detail_TODO").val();

		var frequency=$('#repeat_TODO').val();
		if(frequency=='TWO_WEEKLY')
		{
			frequency='WEEKLY';
			interval=";INTERVAL="+2;
		}
		else if(frequency=='BUSINESS')
		{
			frequency='WEEKLY';
			byDay=';BYDAY=';
			if(globalSettings.weekenddays.value.length>0)
			{
				for(var i=0;i<7;i++)
					if(globalSettings.weekenddays.value.indexOf(i)==-1)
						byDay+=i+',';
				byDay=byDay.substring(0,byDay.length-1);
				byDay=byDay.replace(1,'MO').replace(2,'TU').replace(3,'WE').replace(4,'TH').replace(5,'FR').replace(6,'SA').replace(0,'SU');
			}
			else
			{
				byDay='SA,SU';
			}
			interval='';
		}
		else if(frequency=='WEEKEND')
		{
			frequency='WEEKLY';
			byDay=';BYDAY=';
			if(globalSettings.weekenddays.value.length>0)
			{
				for(var i=0;i<globalSettings.weekenddays.value.length;i++)
					byDay+=globalSettings.weekenddays.value[i]+',';
				byDay=byDay.substring(0,byDay.length-1);
				byDay=byDay.replace(1,'MO').replace(2,'TU').replace(3,'WE').replace(4,'TH').replace(5,'FR').replace(6,'SA').replace(0,'SU');
			}
			else
			{
				byDay='SA,SU';
			}
			interval='';
		}
		else if(frequency=='CUSTOM_WEEKLY')
		{
			frequency='WEEKLY';
			var byDayArray=$('#week_custom_TODO .customTable td.selected');
			if(byDayArray.length>0)
			{
				byDay=';BYDAY=';
				for(var ri=0;ri<byDayArray.length;ri++)
					byDay+=$(byDayArray[ri]).attr('data-type')+',';
				byDay=byDay.substring(0,byDay.length-1);
				byDay=byDay.replace(1,'MO').replace(2,'TU').replace(3,'WE').replace(4,'TH').replace(5,'FR').replace(6,'SA').replace(0,'SU');
				if(globalSettings.mozillasupport.value==null || !globalSettings.mozillasupport.value)
					if(realTodo!='')
					{
						if(realTodo.wkst!='')
							wkst=';WKST='+realTodo.wkst.replace(1,'MO').replace(2,'TU').replace(3,'WE').replace(4,'TH').replace(5,'FR').replace(6,'SA').replace(0,'SU');
					}
					else
						wkst=';WKST='+globalSettings.datepickerfirstdayofweek.value.toString().replace(1,'MO').replace(2,'TU').replace(3,'WE').replace(4,'TH').replace(5,'FR').replace(6,'SA').replace(0,'SU');
			}
		}
		else if(frequency=='CUSTOM_MONTHLY')
		{
			frequency='MONTHLY';
			var byDayFirstPart='';
			var monthCustomOption = $('#repeat_month_custom_select_TODO').val();
			if(monthCustomOption!='custom' && $('#repeat_month_custom_select2_TODO').val()!='DAY')
			{
				if(monthCustomOption!='')
					byDay=';BYDAY=';
				switch(monthCustomOption)
				{
					case 'every':
						byDayFirstPart='';
						break;
					case 'first':
						byDayFirstPart='1';
						break;
					case 'second':
						byDayFirstPart='2';
						break;
					case 'third':
						byDayFirstPart='3';
						break;
					case 'fourth':
						byDayFirstPart='4';
						break;
					case 'fifth':
						byDayFirstPart='5';
						break;
					case 'last':
						byDayFirstPart='-1';
						break;
					default:
						byDayFirstPart='';
						break;
				}
				byDay+= byDayFirstPart+$('#repeat_month_custom_select2_TODO').val();
			}
			else if(monthCustomOption!='custom' && $('#repeat_month_custom_select2_TODO').val()=='DAY')
			{
				byDay='';
				switch(monthCustomOption)
				{
					case 'every':
						monthDay=';BYMONTHDAY=';
						for(var p=1;p<32;p++)
							monthDay+=p+',';
						monthDay=monthDay.substring(0,monthDay.length-1);
						break;
					case 'first':
						monthDay=';BYMONTHDAY=1';
						break;
					case 'second':
						monthDay=';BYMONTHDAY=2';
						break;
					case 'third':
						monthDay=';BYMONTHDAY=3';
						break;
					case 'fourth':
						monthDay=';BYMONTHDAY=4';
						break;
					case 'fifth':
						monthDay=';BYMONTHDAY=5';
						break;
					case 'last':
						monthDay=';BYMONTHDAY=-1';
						break;
					default:
						byDayFirstPart='';
						monthDay='';
						break;
				}
			}
			else
			{
				var monthDayArray = $('#month_custom2_TODO .selected');
				if(monthDayArray.length>0)
				{
					monthDay=';BYMONTHDAY=';
					for(var ri=0;ri<monthDayArray.length;ri++)
						monthDay+=$(monthDayArray[ri]).attr('data-type')+',';
					monthDay=monthDay.substring(0,monthDay.length-1);
				}
			}
		}
		else if(frequency=='CUSTOM_YEARLY')
		{
			frequency='YEARLY';
			var byDayFirstPart='';
			var monthCustomOption = $('#repeat_year_custom_select1_TODO').val();
			var monthArray = $('#year_custom3_TODO .selected');
			if(monthArray.length>0)
			{
				bymonth=';BYMONTH=';
				for(var ri=0;ri<monthArray.length;ri++)
				{
					var val = parseInt($(monthArray[ri]).attr('data-type'),10);
					if(!isNaN(val))
						bymonth+=(val+1)+',';
				}
				bymonth=bymonth.substring(0,bymonth.length-1);
			}
			if(monthCustomOption!='custom' && $('#repeat_year_custom_select2_TODO').val()!='DAY')
			{
				if(monthCustomOption!='')
					byDay=';BYDAY=';
				switch(monthCustomOption)
				{
					case 'every':
						byDayFirstPart='';
						break;
					case 'first':
						byDayFirstPart='1';
						break;
					case 'second':
						byDayFirstPart='2';
						break;
					case 'third':
						byDayFirstPart='3';
						break;
					case 'fourth':
						byDayFirstPart='4';
						break;
					case 'fifth':
						byDayFirstPart='5';
						break;
					case 'last':
						byDayFirstPart='-1';
						break;
					default:
						byDayFirstPart='';
						break;
				}
				byDay+= byDayFirstPart+$('#repeat_month_custom_select2_TODO').val();
			}
			else if(monthCustomOption!='custom' && $('#repeat_year_custom_select2_TODO').val()=='DAY')
			{
				byDay='';
				switch(monthCustomOption)
				{
					case 'every':
						monthDay=';BYMONTHDAY=';
						for(var p=1;p<32;p++)
							monthDay+=p+',';
						monthDay=monthDay.substring(0,monthDay.length-1);
						break;
					case 'first':
						monthDay=';BYMONTHDAY=1';
						break;
					case 'second':
						monthDay=';BYMONTHDAY=2';
						break;
					case 'third':
						monthDay=';BYMONTHDAY=3';
						break;
					case 'fourth':
						monthDay=';BYMONTHDAY=4';
						break;
					case 'fifth':
						monthDay=';BYMONTHDAY=5';
						break;
					case 'last':
						monthDay=';BYMONTHDAY=-1';
						break;
					default:
						byDayFirstPart='';
						monthDay='';
						break;
				}
			}
			else
			{
				var monthDayArray = $('#year_custom1_TODO .selected');
				if(monthDayArray.length>0)
				{
					monthDay=';BYMONTHDAY=';
					for(var ri=0;ri<monthDayArray.length;ri++)
						monthDay+=$(monthDayArray[ri]).attr('data-type')+',';
					monthDay=monthDay.substring(0,monthDay.length-1);
				}
			}
		}
		else if($('#repeat_TODO option:selected').attr('data-type')=="custom_repeat")
			isCustom=true;

		if(vCalendar.tplM['VTcontentline_RRULE'][repeatHash]!=null && (process_elem=vCalendar.tplM['VTcontentline_RRULE'][repeatHash][0])!=undefined)
		{
			// replace the object and related objects' group names (+ append the related objects after the processed)
			parsed=('\r\n'+process_elem).match(RegExp('\r\n((?:'+vCalendar.re['group']+'\\.)?)', 'm'));
			if(parsed[1]!='') // if group is present, replace the object and related objects' group names
				process_elem=('\r\n'+process_elem).replace(RegExp('\r\n'+parsed[1].replace('.', '\\.'), 'mg'), '\r\nitem'+(groupCounter++)+'.').substring(2);
		}
		else
		{
			process_elem=vCalendar.tplC['VTcontentline_RRULE'];
			process_elem=process_elem.replace('##:::##group_wd##:::##', '');
			process_elem=process_elem.replace('##:::##params_wsc##:::##', '');
		}

		if(!isCustom)
		{
			if($('#repeat_end_details_TODO').val()=="on_date")
			{
				var dateUntil=$.datepicker.parseDate(globalSettings.datepickerformat.value, $('#repeat_end_date_TODO').val());
				var datetime_until='';
				if($('#todo_type').val()=='start')
					var tForR=new Date(Date.parse("01/02/1990, "+$('#time_fromTODO').val()));
				else
					var tForR=new Date(Date.parse("01/02/1990, "+$('#time_toTODO').val()));
				dateUntil.setHours(tForR.getHours());
				dateUntil.setMinutes(tForR.getMinutes());
				dateUntil.setSeconds(tForR.getSeconds());
				if(globalSettings.timezonesupport.value && sel_option in timezones)
					var valOffsetFrom=getOffsetByTZ(sel_option, dateUntil);
				if(valOffsetFrom)
				{
					var intOffset=valOffsetFrom.getSecondsFromOffset()*1000*-1;
					dateUntil.setTime(dateUntil.getTime()+intOffset);
				}
				datetime_until=$.fullCalendar.formatDate(dateUntil, "yyyyMMdd'T'HHmmss'Z'");
				process_elem=process_elem.replace('##:::##value##:::##', vcalendarEscapeValue("FREQ="+frequency)+interval+";UNTIL="+datetime_until+bymonth+monthDay+byDay+wkst);
			}
			else if($('#repeat_end_details_TODO').val()=="after")
				process_elem=process_elem.replace('##:::##value##:::##', vcalendarEscapeValue("FREQ="+frequency)+interval+";COUNT="+(parseInt($('#repeat_end_after_TODO').val()))+bymonth+monthDay+byDay+wkst);
			else
				process_elem=process_elem.replace('##:::##value##:::##', vcalendarEscapeValue("FREQ="+frequency)+interval+bymonth+monthDay+byDay+wkst);
		}
		else
			process_elem=process_elem.replace('##:::##value##:::##', $('#repeat_TODO').val());
		vCalendarText+=process_elem;

		if(realTodo.repeatStart || realTodo.repeatEnd)
		{
			if(realTodo.repeatStart)
				var a=$.datepicker.parseDate(globalSettings.datepickerformat.value, $('#date_fromTODO').val());
			else
				var a=$.datepicker.parseDate(globalSettings.datepickerformat.value, $('#date_toTODO').val());
			if(realTodo.repeatStart)
				var repeatStart=realTodo.repeatStart;
			else
				var repeatStart=realTodo.repeatEnd;

			var b=new Date(1970,1,1,0,0,0);
			if(realTodo.repeatStart)
				b=new Date(Date.parse("01/02/1990, "+$('#time_fromTODO').val() ));
			else
				b=new Date(Date.parse("01/02/1990, "+$('#time_toTODO').val() ));
			a.setHours(b.getHours());
			a.setMinutes(b.getMinutes());
			a.setSeconds(b.getSeconds());

			var offsetDate=a-repeatStart;
			for(var iter in vCalendar.tplM['VTcontentline_EXDATE'][repeatHash])
			{
				if(isNaN(iter))
					continue;

				var exStr=('\r\n'+vCalendar.tplM['VTcontentline_EXDATE'][repeatHash][iter]).match(vCalendar.pre['contentline_parse']);
				var exVal=exStr[4].parseComnpactISO8601();
				if(exVal)
				{
					if(exStr[4].indexOf('T')==-1)
					{
						//HERE
						if(realTodo.repeatStart)
							var timePart = new Date(Date.parse("01/02/1990, "+$('#time_fromTODO').val() ));
						else
							var timePart = new Date(Date.parse("01/02/1990, "+$('#time_toTODO').val() ));
						var time_from = $.fullCalendar.formatDate(b, 'HHmmss');
						exVal = (exStr[4] + 'T' + time_from).parseComnpactISO8601();
						if(sel_option!='local')
						{
							var valOffsetFrom=getOffsetByTZ(sel_option, exVal);
							var intOffset = valOffsetFrom.getSecondsFromOffset()*-1;
							exVal = new Date(exVal.setSeconds(intOffset));
						}
					}
					else if(exStr[4].indexOf('T')!=-1)
					{
						if(sel_option!='local')
						{
							var valOffsetFrom=getOffsetByTZ(sel_option, exVal);
							var origValOffset = getOffsetByTZ(realTodo.timeZone, exVal);
							var intOffset = (valOffsetFrom.getSecondsFromOffset() - origValOffset.getSecondsFromOffset())*-1;
							exVal = new Date(exVal.setSeconds(intOffset));
						}
						else
						{
							var origValOffset = getOffsetByTZ(realTodo.timeZone, exVal);
							exVal = new Date(exVal.setSeconds(origValOffset.getSecondsFromOffset()));
						}
					}

					var value=new Date(exVal.getTime()+offsetDate);
					process_elem=vCalendar.tplC['VTcontentline_EXDATE'];
					process_elem=process_elem.replace('##:::##group_wd##:::##', '');
					process_elem=process_elem.replace('##:::##params_wsc##:::##', '');
					newValue=$.fullCalendar.formatDate(value, "yyyyMMdd'T'HHmmss")+(sel_option!='local' ? 'Z' : '');
					process_elem=process_elem.replace('##:::##AllDay##:::##', vcalendarEscapeValue(''));
					process_elem=process_elem.replace('##:::##TZID##:::##', vcalendarEscapeValue(''));
					process_elem=process_elem.replace('##:::##value##:::##', vcalendarEscapeValue(newValue));
					vCalendarText+=process_elem;
				}
			}
		}
	}

	//RECURRENCE-ID
	if($('#recurrenceIDTODO').val() && !appleTodoMode)
	{
		if(vCalendar.tplM['VTcontentline_REC_ID'][repeatHash]!=null && (process_elem=vCalendar.tplM['VTcontentline_REC_ID'][repeatHash][0])!=undefined)
		{
			// replace the object and related objects' group names (+ append the related objects after the processed)
			parsed=('\r\n'+process_elem).match(RegExp('\r\n((?:'+vCalendar.re['group']+'\\.)?)', 'm'));
			if(parsed[1]!='') // if group is present, replace the object and related objects' group names
				process_elem=('\r\n'+process_elem).replace(RegExp('\r\n'+parsed[1].replace('.', '\\.'), 'mg'), '\r\nitem'+(groupCounter++)+'.').substring(2);
		}
		else
		{
			process_elem=vCalendar.tplC['VTcontentline_REC_ID'];
			process_elem=process_elem.replace('##:::##group_wd##:::##', '');
			process_elem=process_elem.replace('##:::##params_wsc##:::##', '');
		}

		var rec_id=$('#recurrenceIDTODO').val()
		if(rec_id.indexOf('T')==-1)
		{
			process_elem=process_elem.replace('##:::##AllDay##:::##', ';'+vcalendarEscapeValue('VALUE=DATE'));
			process_elem=process_elem.replace('##:::##TZID##:::##', vcalendarEscapeValue(''));
			process_elem=process_elem.replace('##:::##value##:::##', vcalendarEscapeValue(rec_id));
		}
		else
		{
			process_elem=process_elem.replace('##:::##AllDay##:::##', vcalendarEscapeValue(''));
			process_elem=process_elem.replace('##:::##TZID##:::##',timeZoneAttr);
			if(isUTC && rec_id.charAt(rec_id.length-1)!='Z')
				rec_id+='Z';
			process_elem=process_elem.replace('##:::##value##:::##', vcalendarEscapeValue(rec_id));
		}
		vCalendarText+=process_elem;
	}

	var a=$('#todoDetailsTable').find("tr[data-id]");
	var lastDataId=0;
	for(var i=0;i<a[a.length-1].attributes.length;i++)
		if(a[a.length-1].attributes[i].nodeName=="data-id")
		{
			lastDataId=a[a.length-1].attributes[i].value;
			break;
		}

	var alarmIterator=0;
	var alarmUniqueArray = new Array();
	for(var t=0;t<lastDataId;t++)
	{
		if($(".alertTODO[data-id="+(t+1)+"]").length>0)
		{
			var alarmText = '';
			if($(".alertTODO[data-id="+(t+1)+"]").val()!='none')
			{
				if(vCalendar.tplM['VTbeginVALARM'][repeatHash]!=null && (process_elem=vCalendar.tplM['VTbeginVALARM'][repeatHash][0])!=undefined)
					alarmText+=vCalendar.tplM['VTbeginVALARM'][repeatHash][0];
				else
				{
					process_elem=vCalendar.tplC['VTbeginVALARM'];
					process_elem=process_elem.replace('##:::##group_wd##:::##', '');
					alarmText+=process_elem;
					vevent=true;
				}

				if($(".alertTODO[data-id="+(t+1)+"]").val()=='message')
				{
					if($(".alert_message_detailsTODO[data-id="+(t+1)+"]").val()=='on_date')
					{
						if(vCalendar.tplM['VTcontentline_TRIGGER'][repeatHash]!=null && (process_elem=vCalendar.tplM['VTcontentline_TRIGGER'][repeatHash][0])!=undefined)
						{
							parsed=('\r\n'+process_elem).match(RegExp('\r\n((?:'+vCalendar.re['group']+'\\.)?)', 'm'));
							if(parsed[1]!='') // if group is present, replace the object and related objects' group names
								process_elem=('\r\n'+process_elem).replace(RegExp('\r\n'+parsed[1].replace('.', '\\.'), 'mg'), '\r\nitem'+(groupCounter++)+'.').substring(2);
						}
						else
						{
							process_elem=vCalendar.tplC['VTcontentline_TRIGGER'];
							process_elem=process_elem.replace('##:::##group_wd##:::##', '');
							process_elem=process_elem.replace('##:::##params_wsc##:::##', '');
						}

						var dateTo=$.datepicker.parseDate(globalSettings.datepickerformat.value,$(".message_date_inputTODO[data-id="+(t+1)+"]").val());
						var datetime_to=$.fullCalendar.formatDate(dateTo, 'yyyy-MM-dd');
						var aDate=new Date(Date.parse("01/02/1990, "+$(".message_time_inputTODO[data-id="+(t+1)+"]").val()));
						var time_to=$.fullCalendar.formatDate(aDate, 'HH:mm:ss');
						var alarmDT=$.fullCalendar.parseDate(datetime_to+'T'+time_to);

						if(globalSettings.timezonesupport.value)
							sel_option=$('#timezoneTODO').val();

						if($('.timezone_rowTODO').css('display')=='none')
							sel_option='local';

						if(sel_option!='local')
						{
							var valOffsetFrom=getOffsetByTZ(sel_option, alarmDT);
							var intOffset = valOffsetFrom.getSecondsFromOffset()*-1;
							alarmDT = new Date(alarmDT.setSeconds(intOffset));
						}
						else
						{
							var intOffset = getLocalOffset(alarmDT);
							alarmDT = new Date(alarmDT.setSeconds(intOffset));
						}

						var newValue=$.fullCalendar.formatDate(alarmDT, "yyyyMMdd'T'HHmmss")+'Z';
						process_elem=process_elem.replace('##:::##VALUE=DATE-TIME##:::##', ';VALUE=DATE-TIME');
						process_elem=process_elem.replace('##:::##VALUE=DURATION##:::##', '');
						process_elem=process_elem.replace('##:::##value##:::##', vcalendarEscapeValue(newValue));
						alarmText+=process_elem;
					}
					else
					{
						var duration='';
						var before_after=$(".before_after_inputTODO[data-id="+(t+1)+"]").val();

						if($(".alert_message_detailsTODO[data-id="+(t+1)+"]").val()=='minutes_before')
							duration="-PT"+before_after+"M";
						if($(".alert_message_detailsTODO[data-id="+(t+1)+"]").val()=='hours_before')
							duration="-PT"+before_after+"H";
						if($(".alert_message_detailsTODO[data-id="+(t+1)+"]").val()=='days_before')
							duration="-P"+before_after+"D";
						if($(".alert_message_detailsTODO[data-id="+(t+1)+"]").val()=='weeks_before')
							duration="-P"+before_after+"W";
						if($(".alert_message_detailsTODO[data-id="+(t+1)+"]").val()=='seconds_before')
							duration="-PT"+before_after+"S";
						if($(".alert_message_detailsTODO[data-id="+(t+1)+"]").val()=='minutes_after')
							duration="PT"+before_after+"M";
						if($(".alert_message_detailsTODO[data-id="+(t+1)+"]").val()=='hours_after')
							duration="PT"+before_after+"H";
						if($(".alert_message_detailsTODO[data-id="+(t+1)+"]").val()=='days_after')
							duration="P"+before_after+"D";
						if($(".alert_message_detailsTODO[data-id="+(t+1)+"]").val()=='weeks_after')
							duration="P"+before_after+"W";
						if($(".alert_message_detailsTODO[data-id="+(t+1)+"]").val()=='seconds_after')
							duration="PT"+before_after+"S";

						if(vCalendar.tplM['VTcontentline_TRIGGER'][repeatHash]!=null && (process_elem=vCalendar.tplM['VTcontentline_TRIGGER'][repeatHash][0])!=undefined)
						{
							parsed=('\r\n'+process_elem).match(RegExp('\r\n((?:'+vCalendar.re['group']+'\\.)?)', 'm'));
							if(parsed[1]!='') // if group is present, replace the object and related objects' group names
								process_elem=('\r\n'+process_elem).replace(RegExp('\r\n'+parsed[1].replace('.', '\\.'), 'mg'), '\r\nitem'+(groupCounter++)+'.').substring(2);
						}
						else
						{
							process_elem=vCalendar.tplC['VTcontentline_TRIGGER'];
							process_elem=process_elem.replace('##:::##group_wd##:::##', '');
							process_elem=process_elem.replace('##:::##params_wsc##:::##', '');
						}
						process_elem=process_elem.replace('##:::##VALUE=DATE-TIME##:::##', '');
						process_elem=process_elem.replace('##:::##VALUE=DURATION##:::##', ';VALUE=DURATION');
						process_elem=process_elem.replace('##:::##value##:::##', duration);
						alarmText+=process_elem;
					}

					if(vCalendar.tplM['VTcontentline_ACTION'][repeatHash]!=null && (process_elem=vCalendar.tplM['VTcontentline_ACTION'][repeatHash][0])!=undefined)
					{
						parsed=('\r\n'+process_elem).match(RegExp('\r\n((?:'+vCalendar.re['group']+'\\.)?)', 'm'));
						if(parsed[1]!='') // if group is present, replace the object and related objects' group names
							process_elem=('\r\n'+process_elem).replace(RegExp('\r\n'+parsed[1].replace('.', '\\.'), 'mg'), '\r\nitem'+(groupCounter++)+'.').substring(2);
					}
					else
					{
						process_elem=vCalendar.tplC['VTcontentline_ACTION'];
						process_elem=process_elem.replace('##:::##group_wd##:::##', '');
						process_elem=process_elem.replace('##:::##params_wsc##:::##', '');
					}
					process_elem=process_elem.replace('##:::##value##:::##', vcalendarEscapeValue('DISPLAY'));
					alarmText+=process_elem;
					
					if(vCalendar.tplM['VTcontentline_DESCRIPTION']!=null && (process_elem=vCalendar.tplM['VTcontentline_DESCRIPTION'][0])!=undefined)
					{
						parsed=('\r\n'+process_elem).match(RegExp('\r\n((?:'+vCalendar.re['group']+'\\.)?)', 'm'));
						if(parsed[1]!='') // if group is present, replace the object and related objects' group names
							process_elem=('\r\n'+process_elem).replace(RegExp('\r\n'+parsed[1].replace('.', '\\.'), 'mg'), '\r\nitem'+(groupCounter++)+'.').substring(2);
					}
					else
					{
						process_elem=vCalendar.tplC['VTcontentline_DESCRIPTION'];
						process_elem=process_elem.replace('##:::##group_wd##:::##', '');
						process_elem=process_elem.replace('##:::##params_wsc##:::##', '');
					}
					process_elem=process_elem.replace('##:::##value##:::##', vcalendarEscapeValue('Reminder'));
					alarmText+=process_elem;
					
				}

				if(typeof vCalendar.tplM['VTunprocessedVALARM'][repeatHash]!='undefined' && vCalendar.tplM['VTunprocessedVALARM'][repeatHash]!='' && vCalendar.tplM['VTunprocessedVALARM'][repeatHash]!=null)
				{
					if(vCalendar.tplM['VTunprocessedVALARM'][repeatHash][t]!=undefined)
					{
						tmp=vCalendar.tplM['VTunprocessedVALARM'][repeatHash][t].replace(RegExp('^\r\n'), '').replace(RegExp('\r\n$'), '');
						if(tmp.indexOf('\r\n')==0)
							tmp=tmp.substring(2, tmp.length);
						if(tmp.lastIndexOf('\r\n')!=(tmp.length-2))
							tmp+='\r\n';
						alarmText+=tmp;
					}
				}

				if(vCalendar.tplM['VTendVALARM'][repeatHash]!=null && (process_elem=vCalendar.tplM['VTendVALARM'][repeatHash][0])!=undefined)
					alarmText+=vCalendar.tplM['VTendVALARM'][repeatHash][0];
				else
				{
					process_elem=vCalendar.tplC['VTendVALARM'];
					process_elem=process_elem.replace('##:::##group_wd##:::##', '');
					alarmText+=process_elem;
				}
				if(alarmUniqueArray.indexOf(alarmText)==-1)
				{
					alarmUniqueArray.push(alarmText);
					vCalendarText+=alarmText;
				}
			}
		}
	}

	if($('#todo_type').val()=='start' || $('#todo_type').val()=='due' || $('#todo_type').val()=='both')
	{
		if($('#date_fromTODO').val()=='' && $('#date_toTODO').val()=='')
		{
			alert("Not enough data!");
			return false;
		}

		if(($('#todo_type').val()=='start' || ($('#todo_type').val()=='both' && !appleTodoMode)) && $('#date_fromTODO').val()!='')
		{
			if(vCalendar.tplM['VTcontentline_E_DTSTART'][repeatHash]!=null && (process_elem=vCalendar.tplM['VTcontentline_E_DTSTART'][repeatHash][0])!=undefined)
			{
				// replace the object and related objects' group names (+ append the related objects after the processed)
				parsed=('\r\n'+process_elem).match(RegExp('\r\n((?:'+vCalendar.re['group']+'\\.)?)', 'm'));
				if(parsed[1]!='') // if group is present, replace the object and related objects' group names
					process_elem=('\r\n'+process_elem).replace(RegExp('\r\n'+parsed[1].replace('.', '\\.'), 'mg'), '\r\nitem'+(groupCounter++)+'.').substring(2);
			}
			else
			{
				process_elem=vCalendar.tplC['VTcontentline_E_DTSTART'];
				process_elem=process_elem.replace('##:::##group_wd##:::##', '');
				process_elem=process_elem.replace('##:::##params_wsc##:::##', '');
			}

			var dateFrom=$.datepicker.parseDate(globalSettings.datepickerformat.value, $('#date_fromTODO').val());
			var datetime_from=$.fullCalendar.formatDate(dateFrom, 'yyyyMMdd');
			var timeFrom=new Date(Date.parse("01/02/1990, "+$('#time_fromTODO').val()));
			var time_from=((timeFrom.getHours())<10 ? '0'+(timeFrom.getHours()): (timeFrom.getHours()))+''+((timeFrom.getMinutes())<10 ? '0'+(timeFrom.getMinutes()): (timeFrom.getMinutes()))+'00';

			process_elem=process_elem.replace('##:::##AllDay##:::##', vcalendarEscapeValue(''));
			process_elem=process_elem.replace('##:::##TZID##:::##', timeZoneAttr);
			process_elem=process_elem.replace('##:::##value##:::##', vcalendarEscapeValue(datetime_from+'T'+time_from+(isUTC ? 'Z' : '')));

			if(appleTodoMode)
			{
				var process_elem2 = '';
				if(vCalendar.tplM['VTcontentline_DUE'][repeatHash]!=null && (process_elem2=vCalendar.tplM['VTcontentline_DUE'][repeatHash][0])!=undefined)
				{
					// replace the object and related objects' group names (+ append the related objects after the processed)
					parsed=('\r\n'+process_elem2).match(RegExp('\r\n((?:'+vCalendar.re['group']+'\\.)?)', 'm'));
					if(parsed[1]!='') // if group is present, replace the object and related objects' group names
						process_elem2=('\r\n'+process_elem2).replace(RegExp('\r\n'+parsed[1].replace('.', '\\.'), 'mg'), '\r\nitem'+(groupCounter++)+'.').substring(2);
				}
				else
				{
					process_elem2=vCalendar.tplC['VTcontentline_DUE'];
					process_elem2=process_elem2.replace('##:::##group_wd##:::##', '');
					process_elem2=process_elem2.replace('##:::##params_wsc##:::##', '');
				}
				process_elem2=process_elem2.replace('##:::##AllDay##:::##', vcalendarEscapeValue(''));
				process_elem2=process_elem2.replace('##:::##TZID##:::##',timeZoneAttr);
				process_elem2=process_elem2.replace('##:::##value##:::##', vcalendarEscapeValue(datetime_from+'T'+time_from+(isUTC ? 'Z' : '')));
				vCalendarText+=process_elem2;
			}
			vCalendarText+=process_elem;
		}

		if(($('#todo_type').val()=='due' || $('#todo_type').val()=='both') && $('#date_toTODO').val()!='')
		{
			if(vCalendar.tplM['VTcontentline_DUE'][repeatHash]!=null && (process_elem=vCalendar.tplM['VTcontentline_DUE'][repeatHash][0])!=undefined)
			{
				// replace the object and related objects' group names (+ append the related objects after the processed)
				parsed=('\r\n'+process_elem).match(RegExp('\r\n((?:'+vCalendar.re['group']+'\\.)?)', 'm'));
				if(parsed[1]!='') // if group is present, replace the object and related objects' group names
					process_elem=('\r\n'+process_elem).replace(RegExp('\r\n'+parsed[1].replace('.', '\\.'), 'mg'), '\r\nitem'+(groupCounter++)+'.').substring(2);
			}
			else
			{
				process_elem=vCalendar.tplC['VTcontentline_DUE'];
				process_elem=process_elem.replace('##:::##group_wd##:::##', '');
				process_elem=process_elem.replace('##:::##params_wsc##:::##', '');
			}

			var dateTo=$.datepicker.parseDate(globalSettings.datepickerformat.value,$('#date_toTODO').val());
			var datetime_to=$.fullCalendar.formatDate(dateTo, 'yyyyMMdd');
			var timeTo=new Date(Date.parse("01/02/1990, "+$('#time_toTODO').val()));
			var time_to=((timeTo.getHours())<10 ? '0'+(timeTo.getHours()): (timeTo.getHours()))+''+((timeTo.getMinutes())<10 ? '0'+(timeTo.getMinutes()): (timeTo.getMinutes()))+'00';

			process_elem=process_elem.replace('##:::##AllDay##:::##', vcalendarEscapeValue(''));
			process_elem=process_elem.replace('##:::##TZID##:::##',timeZoneAttr);
			process_elem=process_elem.replace('##:::##value##:::##', vcalendarEscapeValue(datetime_to+'T'+time_to+(isUTC ? 'Z' : '')));

			if(globalSettings.appleremindersmode.value)
			{
				var process_elem2 = '';
				if(vCalendar.tplM['VTcontentline_E_DTSTART'][repeatHash]!=null && (process_elem2=vCalendar.tplM['VTcontentline_E_DTSTART'][repeatHash][0])!=undefined)
				{
					// replace the object and related objects' group names (+ append the related objects after the processed)
					parsed=('\r\n'+process_elem2).match(RegExp('\r\n((?:'+vCalendar.re['group']+'\\.)?)', 'm'));
					if(parsed[1]!='') // if group is present, replace the object and related objects' group names
						process_elem2=('\r\n'+process_elem2).replace(RegExp('\r\n'+parsed[1].replace('.', '\\.'), 'mg'), '\r\nitem'+(groupCounter++)+'.').substring(2);
				}
				else
				{
					process_elem2=vCalendar.tplC['VTcontentline_E_DTSTART'];
					process_elem2=process_elem2.replace('##:::##group_wd##:::##', '');
					process_elem2=process_elem2.replace('##:::##params_wsc##:::##', '');
				}
				process_elem2=process_elem2.replace('##:::##AllDay##:::##', vcalendarEscapeValue(''));
				process_elem2=process_elem2.replace('##:::##TZID##:::##',timeZoneAttr);
				process_elem2=process_elem2.replace('##:::##value##:::##', vcalendarEscapeValue(datetime_to+'T'+time_to+(isUTC ? 'Z' : '')));
				vCalendarText+=process_elem2;
			}
			vCalendarText+=process_elem;
		}
	}

	if(realTodo!='')
	{
		if(realTodo.type!='')
		{
			if(realTodo.repeatStart)
			{
				var a=$.datepicker.parseDate(globalSettings.datepickerformat.value, $('#date_fromTODO').val());
				var b=new Date(Date.parse("01/02/1990, "+$('#time_fromTODO').val() ));
			}
			else if(realTodo.repeatEnd)
			{
				var a=$.datepicker.parseDate(globalSettings.datepickerformat.value, $('#date_toTODO').val());
				var b=new Date(Date.parse("01/02/1990, "+$('#time_toTODO').val() ));
			}

			if(realTodo.repeatStart)
				var repeatStart=realTodo.repeatStart;
			else if(realTodo.repeatEnd)
				var repeatEnd=realTodo.repeatEnd;
			a.setHours(b.getHours());
			a.setMinutes(b.getMinutes());
			a.setSeconds(b.getSeconds());
			var changeDate=new Date(a.getTime());
			var offsetDate=0;

			if(realTodo.repeatStart)
				offsetDate=changeDate-repeatStart;
			else if(realTodo.repeatEnd)
				offsetDate=changeDate-repeatEnd;

			var realEventUID=realTodo.vcalendar.match(vCalendar.pre['contentline_UID']);

			if(realEventUID!=null)
				realEventUID=realEventUID[0].match(vCalendar.pre['contentline_parse'])[4];

			if(offsetDate!=0)
			{
				var vcalendarOrig=vCalendarText;
				var eventArray=new Array(),backupEventArray= new Array();
				while(vcalendarOrig.match(vCalendar.pre['vtodo'])!=null)
				{
					if(vcalendarOrig.substring(vcalendarOrig.indexOf('BEGIN:VTODO')-2, vcalendarOrig.indexOf('BEGIN:VTODO'))=='\r\n')
					{
						var partEvent=vcalendarOrig.substring(vcalendarOrig.indexOf('BEGIN:VTODO')-2,vcalendarOrig.indexOf('END:VTODO')+'END:VTODO'.length);
						vcalendarOrig=vcalendarOrig.replace(partEvent, '');
					}
					else
					{
						var partEvent=vcalendarOrig.substring(vcalendarOrig.indexOf('BEGIN:VTODO'),vcalendarOrig.indexOf('END:VTODO')+'END:VTODO'.length);
						vcalendarOrig=vcalendarOrig.replace(partEvent, '');
						partEvent+='\r\n';
					}
					eventArray[eventArray.length]=partEvent;
					backupEventArray[backupEventArray.length]=partEvent;
				}
				if(eventArray.length==0)
					console.log("Error: '"+inputUID+"': unable to parse vTodo");

				for(var it=0;it<eventArray.length;it++)
				{
					var findUid=eventArray[it].match(vCalendar.pre['contentline_UID']);
					if(findUid!=null)
					{
						if(findUid[0].match(vCalendar.pre['contentline_parse'])[4]!=realEventUID)
						continue;
					}
					var findRec=eventArray[it].match(vCalendar.pre['contentline_RECURRENCE_ID']);
					if(findRec!=null)
					{
						var parsed=findRec[0].match(vCalendar.pre['contentline_parse']);
						process_elem=vCalendar.tplC['VTcontentline_REC_ID'];
						process_elem=process_elem.replace('##:::##group_wd##:::##', parsed[1]);
						process_elem=process_elem.replace('##:::##params_wsc##:::##', '');

						var value=parsed[4].parseComnpactISO8601();
						if(value)
						{
							value=new Date(value.getTime()+offsetDate)

							var newValue=$.fullCalendar.formatDate(value, "yyyyMMdd'T'HHmmss");
							if(isUTC)
								newValue+='Z';

							process_elem=process_elem.replace('##:::##AllDay##:::##', vcalendarEscapeValue(''));
							process_elem=process_elem.replace('##:::##TZID##:::##', timeZoneAttr);
							process_elem=process_elem.replace('##:::##value##:::##', vcalendarEscapeValue(newValue));
							eventArray[it]=eventArray[it].replace(findRec[0],'\r\n'+process_elem);
						}
					}
					vCalendarText=vCalendarText.replace(backupEventArray[it],eventArray[it]);
				}
			}
		}
	}

	if($('.completedOnTr').css('display')!='none')
	{
		if(vCalendar.tplM['VTcontentline_COMPLETED'][repeatHash]!=null && (process_elem=vCalendar.tplM['VTcontentline_COMPLETED'][repeatHash][0])!=undefined)
		{
			// replace the object and related objects' group names (+ append the related objects after the processed)
			parsed=('\r\n'+process_elem).match(RegExp('\r\n((?:'+vCalendar.re['group']+'\\.)?)', 'm'));
			if(parsed[1]!='') // if group is present, replace the object and related objects' group names
				process_elem=('\r\n'+process_elem).replace(RegExp('\r\n'+parsed[1].replace('.', '\\.'), 'mg'), '\r\nitem'+(groupCounter++)+'.').substring(2);
		}
		else
		{
			process_elem=vCalendar.tplC['VTcontentline_COMPLETED'];
			process_elem=process_elem.replace('##:::##group_wd##:::##', '');
			process_elem=process_elem.replace('##:::##params_wsc##:::##', '');
		}
		if($('.completedOnTr .date').val()!='' && $('.completedOnTr .time').val()!='')
		{
			var completedDate=$.datepicker.parseDate(globalSettings.datepickerformat.value, $('.completedOnTr .date').val());
			var timeCompleted=new Date(Date.parse("01/02/1990, "+$('#completedOnTime').val()));
			var datetime_completed=$.fullCalendar.parseDate($.fullCalendar.formatDate(completedDate, "yyyy'-'MM'-'dd")+'T'+$.fullCalendar.formatDate(timeCompleted, "HH':'mm'-'ss"));

			if(globalSettings.timezonesupport.value)
				sel_option=$('#timezoneTODO').val();

			if($('.timezone_rowTODO').css('display')=='none')
				sel_option='local';

			if(sel_option!='local')
			{
				var valOffsetFrom=getOffsetByTZ(sel_option, datetime_completed);
				var intOffset = valOffsetFrom.getSecondsFromOffset()*-1;
				datetime_completed = new Date(datetime_completed.setSeconds(intOffset));
			}
			var newValue=$.fullCalendar.formatDate(datetime_completed, "yyyyMMdd'T'HHmmss")+'Z';

			process_elem=process_elem.replace('##:::##value##:::##', vcalendarEscapeValue(newValue));
			vCalendarText+=process_elem;
		}
	}

	if(appleTodoMode)
	{
		if(vCalendarText.indexOf('\r\n')==0 && newFirst.lastIndexOf('\r\n')==(newFirst.length-2))
			newFirst+=vCalendarText.substring(2,vCalendarText.length);
		else if((vCalendarText.indexOf('\r\n')==0 && newFirst.lastIndexOf('\r\n')!=(newFirst.length-2)) || (vCalendarText.indexOf('\r\n')!=0 && newFirst.lastIndexOf('\r\n')==(newFirst.length-2)) )
			newFirst+=vCalendarText;
		else
			newFirst+='\r\n'+vCalendarText;
	}

	if($('#recurrenceIDTODO').val()=='')
		var checkVal='orig';
	else
		var checkVal=$('#recurrenceIDTODO').val();

	if(typeof vCalendar.tplM['VTunprocessedVTODO'][repeatHash]!='undefined' && vCalendar.tplM['VTunprocessedVTODO'][repeatHash]!=null)
	{
		for(vev in vCalendar.tplM['VTunprocessedVTODO'][repeatHash])
			if(vev==checkVal)
				vCalendarText+=vCalendar.tplM['VTunprocessedVTODO'][repeatHash][vev].replace(RegExp('^\r\n'), '');
	}
	if(appleTodoMode)
		vCalendarText = '';

	if(vCalendar.tplM['VTendVTODO'][repeatHash]!=null && (process_elem=vCalendar.tplM['VTendVTODO'][repeatHash][0])!=undefined)
	{
		if(!appleTodoMode)
			vCalendarText+=vCalendar.tplM['VTendVTODO'][repeatHash][0];
		else
			newFirst+=vCalendar.tplM['VTendVTODO'][repeatHash][0];
	}
	else
	{
		process_elem=vCalendar.tplC['VTendVTODO'];
		process_elem=process_elem.replace('##:::##group_wd##:::##', '');
		if(!appleTodoMode)
			vCalendarText+=process_elem;
		else
			newFirst+=process_elem;
	}

	// PRODID
	if(vCalendar.tplM['VTcontentline_PRODID'][repeatHash]!=null && (process_elem=vCalendar.tplM['VTcontentline_PRODID'][repeatHash][0])!=undefined)
	{
		// replace the object and related objects' group names (+ append the related objects after the processed)
		parsed=('\r\n'+process_elem).match(RegExp('\r\n((?:'+vCalendar.re['group']+'\\.)?)', 'm'));
		if(parsed[1]!='') // if group is present, replace the object and related objects' group names
			process_elem=('\r\n'+process_elem).replace(RegExp('\r\n'+parsed[1].replace('.', '\\.'), 'mg'), '\r\nitem'+(groupCounter++)+'.').substring(2);
	}
	else
	{
		process_elem=vCalendar.tplC['VTcontentline_PRODID'];
		process_elem=process_elem.replace('##:::##group_wd##:::##', '');
		process_elem=process_elem.replace('##:::##params_wsc##:::##', '');
	}
	process_elem=process_elem.replace('##:::##value##:::##', '-//Inf-IT//'+globalAppName+' '+globalVersion+'//EN');
	vCalendarText+=process_elem;

	if(typeof vCalendar.tplM['VTunprocessed'][repeatHash]!='undefined' && vCalendar.tplM['VTunprocessed'][repeatHash]!='' && vCalendar.tplM['VTunprocessed'][repeatHash]!=null)
	{
		if(!appleTodoMode)
			vCalendarText+=vCalendar.tplM['VTunprocessed'][repeatHash].replace(RegExp('^\r\n'), '');
		else
			origFirst+=vCalendar.tplM['VTunprocessed'][repeatHash].replace(RegExp('^\r\n'), '');;
	}

	vCalendar.tplM['VTunprocessed'][repeatHash]=new Array();

	// vCalendar END (required by RFC)
	if(vCalendar.tplM['VTend'][repeatHash]!=null && (process_elem=vCalendar.tplM['VTend'][repeatHash][0])!=undefined)
		vCalendarText+=vCalendar.tplM['VTend'][repeatHash][0];
	else
	{
		process_elem=vCalendar.tplC['VTend'];
		process_elem=process_elem.replace('##:::##group_wd##:::##', '');
		vCalendarText+=process_elem;
	}

	var textArray = new Array();
	if(appleTodoMode)
	{
		newFirst += vCalendarText;
		if(origFirst.lastIndexOf('\r\n')!=(origFirst.length-2))
			origFirst += '\r\n';
		origFirst += vCalendarText;
		var fixed = checkAndFixMultipleUID(newFirst,false);
		if(fixed.length==1)
			textArray[textArray.length]=origFirst;
		else
			textArray=fixed;
		vCalendarText = newFirst;
	}
	else if(resultTodoObj.futureMode && origEvent!='')
	{
		var fixed = checkAndFixMultipleUID(origEvent,false);
		if(fixed.length==1)
			textArray[textArray.length]=origEvent;
		else
			textArray=fixed;
	}
	var fixedArr = checkAndFixMultipleUID(vCalendarText,false);
	fixedArr = $.merge(textArray,fixedArr);
	var inputS = fixedArr[0];
	fixedArr.splice(0,1);
	if(operation=='MOVE_IN')
		return moveVcalendarToCollection(accountUID, inputUID, inputEtag, inputS, delUID, 'vtodo', false, deleteMode, fixedArr);
	else
		return putVcalendarToCollection(accountUID, inputUID, inputEtag, inputS, delUID,'vtodo',false,deleteMode,fixedArr);
}

function fullVcalendarToTodoData(inputEvent, formMode)
{
	var vcalendar='';
	if(formMode)
		var repeatHash = 'form';
	else
		var repeatHash = inputEvent.repeatHash;
	CalDAVeditor_cleanup(repeatHash);

	var rid=inputEvent.id.substring(0, inputEvent.id.lastIndexOf('/')+1);
	if(rid)
		if(globalEventList.todos[rid][inputEvent.id].uid!=undefined)
			vcalendar=globalEventList.todos[rid][inputEvent.id].vcalendar;
	if(!vcalendar)
		return false;
	var vcalendar_full=vcalendar.split('\r\n');
	if((parsed=('\r\n'+vcalendar_full[0]+'\r\n').match(vCalendar.pre['contentline_parse']))==null)
		return false;
	//BEGIN, END VCALENDAR

	vCalendar.tplM['VTbegin'][repeatHash]=new Array();
	vCalendar.tplM['VTbegin'][repeatHash][0]=vCalendar.tplC['VTbegin'].replace(/##:::##group_wd##:::##/g, vcalendar_begin_group=parsed[1]);
	// parsed (contentline_parse)=[1]->"group.", [2]->"name", [3]->";param;param", [4]->"value"
	if((parsed=('\r\n'+vcalendar_full[vcalendar_full.length-2]+'\r\n').match(vCalendar.pre['contentline_parse']))==null)
		return false;
	// values not directly supported by the editor (old values are kept intact)
	vCalendar.tplM['VTend'][repeatHash]=new Array();
	vCalendar.tplM['VTend'][repeatHash][0]=vCalendar.tplC['VTend'].replace(/##:::##group_wd##:::##/g, vcalendar_end_group=parsed[1]);

	if(vcalendar_begin_group!=vcalendar_end_group)
		return false; // the vCalendar BEGIN and END "group" are different

	// remove the vCalendar BEGIN and END
	vcalendar='\r\n'+vcalendar_full.slice(1, vcalendar_full.length-2).join('\r\n')+'\r\n';

	//FIX TIMEZONE
	var beginTimeZone=vcalendar.indexOf('BEGIN:VTIMEZONE');
	var startEndTimeZone=vcalendar.indexOf('END:VTIMEZONE');
	var endTimeZone=0;
	var vTimeZone='';
	while(beginTimeZone!=-1 && startEndTimeZone!=-1)
	{
		for(i=(startEndTimeZone+2);i<vcalendar.length;i++)
		{
			if(vcalendar.charAt(i)=='\n')
			{
				endTimeZone=i+1;
				break;
			}
		}
		vTimeZone=vcalendar.substring(beginTimeZone, endTimeZone);
		vcalendar=vcalendar.substring(0, beginTimeZone)+vcalendar.substring(endTimeZone, vcalendar.length);
		beginTimeZone=vcalendar.indexOf('BEGIN:VTIMEZONE');
		startEndTimeZone=vcalendar.indexOf('END:VTIMEZONE');
	}

	vcalendar_element=vcalendar.match(vCalendar.pre['contentline_VERSION']);
	if(vcalendar_element!=null)
	{
		parsed=vcalendar_element[0].match(vCalendar.pre['contentline_parse']);
		version=vcalendarUnescapeValue(parsed[4]);
		vCalendar.tplM['VTcontentline_VERSION'][repeatHash] = new Array();
		vCalendar.tplM['VTcontentline_VERSION'][repeatHash][0]=vCalendar.tplC['VTcontentline_VERSION'];
		vCalendar.tplM['VTcontentline_VERSION'][repeatHash][0]=vCalendar.tplM['VTcontentline_VERSION'][repeatHash][0].replace(/##:::##group_wd##:::##/g, parsed[1]);
		vCalendar.tplM['VTcontentline_VERSION'][repeatHash][0]=vCalendar.tplM['VTcontentline_VERSION'][repeatHash][0].replace(/##:::##params_wsc##:::##/g, parsed[3]);

		vcalendar=vcalendar.replace(vcalendar_element[0], '\r\n');

		if(parsed[1]!='')
		{
			var re=RegExp('\r\n'+parsed[1].replace('.','\\..*')+'\r\n', 'im');
			while ((vcalendar_element_related=vcalendar.match(re))!=null)
			{
				// append the parameter to its parent
				vCalendar.tplM['VTcontentline_VERSION'][repeatHash][0]+=vcalendar_element_related[0].substr(2);
				// remove the processed parameter
				vcalendar=vcalendar.replace(vcalendar_element_related[0], '\r\n');
			}
		}
	}

	vcalendar_element=vcalendar.match(vCalendar.pre['contentline_CALSCALE']);
	if(vcalendar_element!=null)
	{
		parsed=vcalendar_element[0].match(vCalendar.pre['contentline_parse']);
		version=vcalendarUnescapeValue(parsed[4]);
		vCalendar.tplM['VTcontentline_CALSCALE'][repeatHash] = new Array();
		vCalendar.tplM['VTcontentline_CALSCALE'][repeatHash][0]=vCalendar.tplC['VTcontentline_CALSCALE'];
		vCalendar.tplM['VTcontentline_CALSCALE'][repeatHash][0]=vCalendar.tplM['VTcontentline_CALSCALE'][repeatHash][0].replace(/##:::##group_wd##:::##/g, parsed[1]);
		vCalendar.tplM['VTcontentline_CALSCALE'][repeatHash][0]=vCalendar.tplM['VTcontentline_CALSCALE'][repeatHash][0].replace(/##:::##params_wsc##:::##/g, parsed[3]);
		vcalendar=vcalendar.replace(vcalendar_element[0], '\r\n');

		if(parsed[1]!='')
		{
			var re=RegExp('\r\n'+parsed[1].replace('.','\\..*')+'\r\n', 'im');
			while ((vcalendar_element_related=vcalendar.match(re))!=null)
			{
				// append the parameter to its parent
				vCalendar.tplM['VTcontentline_CALSCALE'][repeatHash][0]+=vcalendar_element_related[0].substr(2);
				// remove the processed parameter
				vcalendar=vcalendar.replace(vcalendar_element_related[0], '\r\n');
			}
		}
	}

	//PRODID
	vcalendar_element=vcalendar.match(RegExp('\r\n'+vCalendar.re['contentline_PRODID'], 'mi'));
	if(vcalendar_element!=null)
	{
		parsed=vcalendar_element[0].match(vCalendar.pre['contentline_parse']);

		vCalendar.tplM['VTcontentline_PRODID'][repeatHash] = new Array();
		vCalendar.tplM['VTcontentline_PRODID'][repeatHash][0]=vCalendar.tplC['VTcontentline_PRODID'];
		vCalendar.tplM['VTcontentline_PRODID'][repeatHash][0]=vCalendar.tplM['VTcontentline_PRODID'][repeatHash][0].replace(/##:::##group_wd##:::##/g, parsed[1]);
		vCalendar.tplM['VTcontentline_PRODID'][repeatHash][0]=vCalendar.tplM['VTcontentline_PRODID'][repeatHash][0].replace(/##:::##params_wsc##:::##/g, parsed[3]);
		vcalendar=vcalendar.replace(vcalendar_element[0], '\r\n');
		if(parsed[1]!='')
		{
			var re=RegExp('\r\n'+parsed[1].replace('.','\\..*')+'\r\n', 'im');
			while ((vcalendar_element_related=vcalendar.match(re))!=null)
			{
				// append the parameter to its parent
				vCalendar.tplM['VTcontentline_PRODID'][repeatHash][0]+=vcalendar_element_related[0].substr(2);
				// remove the processed parameter
				vcalendar=vcalendar.replace(vcalendar_element_related[0], '\r\n');
			}
		}
	}
	// -------------------VTODO---------------------- //
	var todoArray=new Array();
	while(vcalendar.match(vCalendar.pre['vtodo'])!=null)
	{
		if(vcalendar.substring(vcalendar.indexOf('BEGIN:VTODO')-2, vcalendar.indexOf('BEGIN:VTODO'))=='\r\n')
		{
			var partTodo=vcalendar.substring(vcalendar.indexOf('BEGIN:VTODO')-2,vcalendar.indexOf('END:VTODO')+'END:VTODO'.length);
			vcalendar=vcalendar.replace(partTodo, '');
		}
		else
		{
			var partTodo=vcalendar.substring(vcalendar.indexOf('BEGIN:VTODO'),vcalendar.indexOf('END:VTODO')+'END:VTODO'.length);
			vcalendar=vcalendar.replace(partTodo, '');
			partTodo+='\r\n';
		}
		todoArray[todoArray.length]=partTodo;
	}
	if(todoArray.length==0)
		console.log("Error: '"+inputEvent.id+"': unable to parse vTodo");

	for(var it=0;it<todoArray.length;it++)
	{
		var vtodo=todoArray[it];
		var vtodo_full=vtodo.split('\r\n');
		var isThisTODO=false;
		if(vtodo==null)
			return false;

		//BEGIN
		if((parsed=('\r\nBEGIN:VTODO\r\n').match(vCalendar.pre['contentline_parse']))==null)
			return false;
		//BEGIN, END VCALENDAR
		vCalendar.tplM['VTbeginVTODO'][repeatHash] = new Array();
		vCalendar.tplM['VTbeginVTODO'][repeatHash][0]=vCalendar.tplC['VTbeginVTODO'].replace(/##:::##group_wd##:::##/g, vcalendar_begin_group=parsed[1]);
		// parsed (contentline_parse)=[1]->"group.", [2]->"name", [3]->";param;param", [4]->"value"
		if((parsed=('\r\n'+vcalendar_full[vtodo_full.length-2]+'\r\n').match(vCalendar.pre['contentline_parse']))==null)
			return false;
		// values not directly supported by the editor (old values are kept intact)
		vCalendar.tplM['VTendVTODO'][repeatHash] = new Array();
		vCalendar.tplM['VTendVTODO'][repeatHash][0]=vCalendar.tplC['VTendVTODO'].replace(/##:::##group_wd##:::##/g, vcalendar_end_group=parsed[1]);
		if(vcalendar_begin_group!=vcalendar_end_group)
			return false; // the vCalendar BEGIN and END "group" are different

		// remove the vCalendar BEGIN and END
		vtodo='\r\n'+vtodo_full.slice(2, vtodo_full.length-1).join('\r\n')+'\r\n';
		var created='',recurr_id='', frequency='';

		//RECURRENCE-ID
		var rec='';
		vcalendar_element=vtodo.match(vCalendar.pre['contentline_RECURRENCE_ID']);
		if(vcalendar_element!=null)
		{
			parsed=vcalendar_element[0].match(vCalendar.pre['contentline_parse']);
			var rec=parsed[4];
			vCalendar.tplM['VTcontentline_REC_ID'][repeatHash]= new Array();
			vCalendar.tplM['VTcontentline_REC_ID'][repeatHash][0]=vCalendar.tplC['VTcontentline_REC_ID'];
			vCalendar.tplM['VTcontentline_REC_ID'][repeatHash][0]=vCalendar.tplM['VTcontentline_REC_ID'][repeatHash][0].replace(/##:::##group_wd##:::##/g, parsed[1]);
			var pars=vcalendarSplitParam(parsed[3]);
			var parString='';

			for(var i=0;i<pars.length;i++)
			{
				if((pars[i]!='VALUE=DATE') && (pars[i].indexOf('TZID=')==-1) && (pars[i]!=''))
					parString+=';'+pars[i];
			}

			vCalendar.tplM['VTcontentline_REC_ID'][repeatHash][0]=vCalendar.tplM['VTcontentline_REC_ID'][repeatHash][0].replace(/##:::##params_wsc##:::##/g, parString);
			vtodo=vtodo.replace(vcalendar_element[0], '\r\n');
			if(parsed[1]!='')
			{
				var re=RegExp('\r\n'+parsed[1].replace('.','\\..*')+'\r\n', 'im');
				while ((vcalendar_element_related=vtodo.match(re))!=null)
				{
					// append the parameter to its parent
					vCalendar.tplM['VTcontentline_REC_ID'][repeatHash][0]+=vcalendar_element_related[0].substr(2);
					// remove the processed parameter
					vtodo=vtodo.replace(vcalendar_element_related[0], '\r\n');
				}
			}
		}
		if(rec=='')
			rec='orig';
		else
			recurr_id=rec;

		//CREATED
		vcalendar_element=vtodo.match(RegExp('\r\n'+vCalendar.re['contentline_CREATED'], 'mi'));
		if(vcalendar_element!=null)
		{
			parsed=vcalendar_element[0].match(vCalendar.pre['contentline_parse']);
			vCalendar.tplM['VTcontentline_CREATED'][repeatHash]={};
			vCalendar.tplM['VTcontentline_CREATED'][repeatHash][rec]=vCalendar.tplC['VTcontentline_CREATED'];
			vCalendar.tplM['VTcontentline_CREATED'][repeatHash][rec]=vCalendar.tplM['VTcontentline_CREATED'][repeatHash][rec].replace(/##:::##group_wd##:::##/g, parsed[1]);
			vCalendar.tplM['VTcontentline_CREATED'][repeatHash][rec]=vCalendar.tplM['VTcontentline_CREATED'][repeatHash][rec].replace(/##:::##params_wsc##:::##/g, parsed[3]);
			created = parsed[4];
			vCalendar.tplM['VTcontentline_CREATED'][repeatHash][rec]=vCalendar.tplM['VTcontentline_CREATED'][repeatHash][rec].replace(/##:::##value##:::##/g,parsed[4]);
			vtodo=vtodo.replace(vcalendar_element[0], '\r\n');
			if(parsed[1]!='')
			{
				var re=RegExp('\r\n'+parsed[1].replace('.','\\..*')+'\r\n', 'im');
				while ((vcalendar_element_related=vtodo.match(re))!=null)
				{
					// append the parameter to its parent
					vCalendar.tplM['VTcontentline_CREATED'][repeatHash][rec]+=vcalendar_element_related[0].substr(2);
					// remove the processed parameter
					vtodo=vtodo.replace(vcalendar_element_related[0], '\r\n');
				}
			}
		}

		//RRULE
		vcalendar_element=vtodo.match(vCalendar.pre['contentline_RRULE2']);
		if(vcalendar_element!=null)
		{
			parsed=vcalendar_element[0].match(vCalendar.pre['contentline_parse']);
			vCalendar.tplM['VTcontentline_RRULE'][repeatHash] = new Array();
			vCalendar.tplM['VTcontentline_RRULE'][repeatHash][0]=vCalendar.tplC['VTcontentline_RRULE'];
			vCalendar.tplM['VTcontentline_RRULE'][repeatHash][0]=vCalendar.tplM['VTcontentline_RRULE'][repeatHash][0].replace(/##:::##group_wd##:::##/g, parsed[1]);
			var pars=parsed[4].split(';');
			var parString='';

			for(var i=0;i<pars.length;i++)
			{
				if((pars[i].indexOf('FREQ=')==-1) && (pars[i].indexOf('COUNT=')==-1) && (pars[i].indexOf('UNTIL=')==-1) && (pars[i]!='') && (pars[i].indexOf('INTERVAL=')==-1) && (pars[i].indexOf('BYDAY=')==-1)
				&& (pars[i].indexOf('BYMONTHDAY=')==-1) && (pars[i].indexOf('BYMONTH=')==-1) && (pars[i].indexOf('WKST=')==-1))
					parString+=';'+pars[i];
				if(pars[i].indexOf('FREQ=')!=-1)
					frequency=pars[i].split('FREQ=')[1];
			}
			vCalendar.tplM['VTcontentline_RRULE'][repeatHash][0]=vCalendar.tplM['VTcontentline_RRULE'][repeatHash][0].replace(/##:::##params_wsc##:::##/g, parsed[3]);
			vCalendar.tplM['VTcontentline_RRULE'][repeatHash][0]=vCalendar.tplM['VTcontentline_RRULE'][repeatHash][0].replace(/##:::##value##:::##/g, '##:::##value##:::##'+parString);
			vtodo=vtodo.replace(vcalendar_element[0], '\r\n');
			if(parsed[1]!='')
			{
				var re=RegExp('\r\n'+parsed[1].replace('.','\\..*')+'\r\n', 'im');
				while ((vcalendar_element_related=vtodo.match(re))!=null)
				{
					// append the parameter to its parent
					vCalendar.tplM['VTcontentline_RRULE'][repeatHash][0]+=vcalendar_element_related[0].substr(2);
					// remove the processed parameter
					vtodo=vtodo.replace(vcalendar_element_related[0], '\r\n');
				}
			}
		}
		var tmpR=''
		if(frequency!='')
			tmpR=inputEvent.id+'#'+created+'#'+frequency;
		else
			tmpR=inputEvent.id+'#'+created+'#'+recurr_id;
		if(tmpR==repeatHash)
			isThisTODO=true;
		//SUMMARY
		vcalendar_element=vtodo.match(vCalendar.pre['contentline_SUMMARY']);
		if(vcalendar_element!=null)
		{
			parsed=vcalendar_element[0].match(vCalendar.pre['contentline_parse']);
			title=vcalendarUnescapeValue(parsed[4]);
			vCalendar.tplM['VTcontentline_SUMMARY'][repeatHash] = new Array();
			vCalendar.tplM['VTcontentline_SUMMARY'][repeatHash][0]=vCalendar.tplC['VTcontentline_SUMMARY'];
			vCalendar.tplM['VTcontentline_SUMMARY'][repeatHash][0]=vCalendar.tplM['VTcontentline_SUMMARY'][repeatHash][0].replace(/##:::##group_wd##:::##/g, parsed[1]);
			vCalendar.tplM['VTcontentline_SUMMARY'][repeatHash][0]=vCalendar.tplM['VTcontentline_SUMMARY'][repeatHash][0].replace(/##:::##params_wsc##:::##/g, parsed[3]);

			vtodo=vtodo.replace(vcalendar_element[0], '\r\n');

			if(parsed[1]!='')
			{
				var re=RegExp('\r\n'+parsed[1].replace('.','\\..*')+'\r\n', 'im');
				while ((vcalendar_element_related=vtodo.match(re))!=null)
				{
					// append the parameter to its parent
					vCalendar.tplM['VTcontentline_SUMMARY'][repeatHash][0]+=vcalendar_element_related[0].substr(2);
					// remove the processed parameter
					vtodo=vtodo.replace(vcalendar_element_related[0], '\r\n');
				}
			}
		}

		vcalendar_element=vtodo.match(RegExp('\r\n'+vCalendar.re['contentline_TRANSP'], 'mi'));
		if(vcalendar_element!=null)
		{
			parsed=vcalendar_element[0].match(vCalendar.pre['contentline_parse']);
			vCalendar.tplM['VTcontentline_TRANSP'][repeatHash] = new Array();
			vCalendar.tplM['VTcontentline_TRANSP'][repeatHash][0]=vCalendar.tplC['VTcontentline_TRANSP'];
			vCalendar.tplM['VTcontentline_TRANSP'][repeatHash][0]=vCalendar.tplM['VTcontentline_TRANSP'][repeatHash][0].replace(/##:::##group_wd##:::##/g, parsed[1]);
			vCalendar.tplM['VTcontentline_TRANSP'][repeatHash][0]=vCalendar.tplM['VTcontentline_TRANSP'][repeatHash][0].replace(/##:::##params_wsc##:::##/g, parsed[3]);
			vtodo=vtodo.replace(vcalendar_element[0], '\r\n');

			if(parsed[1]!='')
			{
				var re=RegExp('\r\n'+parsed[1].replace('.','\\..*')+'\r\n', 'im');
				while ((vcalendar_element_related=vtodo.match(re))!=null)
				{
					// append the parameter to its parent
					vCalendar.tplM['VTcontentline_TRANSP'][repeatHash][0]+=vcalendar_element_related[0].substr(2);
					// remove the processed parameter
					vtodo=vtodo.replace(vcalendar_element_related[0], '\r\n');
				}
			}
		}

		vcalendar_element=vtodo.match(vCalendar.pre['contentline_STATUS']);
		if(vcalendar_element!=null)
		{
			parsed=vcalendar_element[0].match(vCalendar.pre['contentline_parse']);
			title=vcalendarUnescapeValue(parsed[4]);
			vCalendar.tplM['VTcontentline_STATUS'][repeatHash] = new Array();
			vCalendar.tplM['VTcontentline_STATUS'][repeatHash][0]=vCalendar.tplC['VTcontentline_STATUS'];
			vCalendar.tplM['VTcontentline_STATUS'][repeatHash][0]=vCalendar.tplM['VTcontentline_STATUS'][repeatHash][0].replace(/##:::##group_wd##:::##/g, parsed[1]);
			vCalendar.tplM['VTcontentline_STATUS'][repeatHash][0]=vCalendar.tplM['VTcontentline_STATUS'][repeatHash][0].replace(/##:::##params_wsc##:::##/g, parsed[3]);

			vtodo=vtodo.replace(vcalendar_element[0], '\r\n');

			if(parsed[1]!='')
			{
				var re=RegExp('\r\n'+parsed[1].replace('.','\\..*')+'\r\n', 'im');
				while ((vcalendar_element_related=vtodo.match(re))!=null)
				{
					// append the parameter to its parent
					vCalendar.tplM['VTcontentline_STATUS'][repeatHash][0]+=vcalendar_element_related[0].substr(2);
					// remove the processed parameter
					vtodo=vtodo.replace(vcalendar_element_related[0], '\r\n');
				}
			}
		}

		//LOCATION
		vcalendar_element=vtodo.match(RegExp('\r\n'+vCalendar.re['contentline_LOCATION'], 'mi'));
		if(vcalendar_element!=null)
		{
			parsed=vcalendar_element[0].match(vCalendar.pre['contentline_parse']);
			//note=String(vcalendar_element).split(':')[1];
			title=vcalendarUnescapeValue(parsed[4]);
			vCalendar.tplM['VTcontentline_LOCATION'][repeatHash] = new Array();
			vCalendar.tplM['VTcontentline_LOCATION'][repeatHash][0]=vCalendar.tplC['VTcontentline_LOCATION'];
			vCalendar.tplM['VTcontentline_LOCATION'][repeatHash][0]=vCalendar.tplM['VTcontentline_LOCATION'][repeatHash][0].replace(/##:::##group_wd##:::##/g, parsed[1]);
			vCalendar.tplM['VTcontentline_LOCATION'][repeatHash][0]=vCalendar.tplM['VTcontentline_LOCATION'][repeatHash][0].replace(/##:::##params_wsc##:::##/g, parsed[3]);
			vtodo=vtodo.replace(vcalendar_element[0], '\r\n');

			if(parsed[1]!='')
			{
				var re=RegExp('\r\n'+parsed[1].replace('.','\\..*')+'\r\n', 'im');
				while ((vcalendar_element_related=vtodo.match(re))!=null)
				{
					// append the parameter to its parent
					vCalendar.tplM['VTcontentline_LOCATION'][repeatHash][0]+=vcalendar_element_related[0].substr(2);
					// remove the processed parameter
					vtodo=vtodo.replace(vcalendar_element_related[0], '\r\n');
				}
			}
		}

		//URL
		vcalendar_element=vtodo.match(RegExp('\r\n'+vCalendar.re['contentline_URL'], 'mi'));
		if(vcalendar_element!=null)
		{
			parsed=vcalendar_element[0].match(vCalendar.pre['contentline_parse']);
			//note=String(vcalendar_element).split(':')[1];
			title=vcalendarUnescapeValue(parsed[4]);
			vCalendar.tplM['VTcontentline_URL'][repeatHash] = new Array();
			vCalendar.tplM['VTcontentline_URL'][repeatHash][0]=vCalendar.tplC['VTcontentline_URL'];
			vCalendar.tplM['VTcontentline_URL'][repeatHash][0]=vCalendar.tplM['VTcontentline_URL'][repeatHash][0].replace(/##:::##group_wd##:::##/g, parsed[1]);
			vCalendar.tplM['VTcontentline_URL'][repeatHash][0]=vCalendar.tplM['VTcontentline_URL'][repeatHash][0].replace(/##:::##params_wsc##:::##/g, parsed[3]);
			vtodo=vtodo.replace(vcalendar_element[0], '\r\n');

			if(parsed[1]!='')
			{
				var re=RegExp('\r\n'+parsed[1].replace('.','\\..*')+'\r\n', 'im');
				while ((vcalendar_element_related=vtodo.match(re))!=null)
				{
					// append the parameter to its parent
					vCalendar.tplM['VTcontentline_URL'][repeatHash][0]+=vcalendar_element_related[0].substr(2);
					// remove the processed parameter
					vtodo=vtodo.replace(vcalendar_element_related[0], '\r\n');
				}
			}
		}

		vcalendar_element=vtodo.match(vCalendar.pre['contentline_PERCENT-COMPLETE']);
		if(vcalendar_element!=null)
		{
			parsed=vcalendar_element[0].match(vCalendar.pre['contentline_parse']);

			//note=String(vcalendar_element).split(':')[1];
			title=vcalendarUnescapeValue(parsed[4]);
			vCalendar.tplM['VTcontentline_PERCENT-COMPLETE'][repeatHash] = new Array();
			vCalendar.tplM['VTcontentline_PERCENT-COMPLETE'][repeatHash][0]=vCalendar.tplC['VTcontentline_PERCENT-COMPLETE'];
			vCalendar.tplM['VTcontentline_PERCENT-COMPLETE'][repeatHash][0]=vCalendar.tplM['VTcontentline_PERCENT-COMPLETE'][repeatHash][0].replace(/##:::##group_wd##:::##/g, parsed[1]);
			vCalendar.tplM['VTcontentline_PERCENT-COMPLETE'][repeatHash][0]=vCalendar.tplM['VTcontentline_PERCENT-COMPLETE'][repeatHash][0].replace(/##:::##params_wsc##:::##/g, parsed[3]);

			vtodo=vtodo.replace(vcalendar_element[0], '\r\n');

			if(parsed[1]!='')
			{
				var re=RegExp('\r\n'+parsed[1].replace('.','\\..*')+'\r\n', 'im');
				while ((vcalendar_element_related=vtodo.match(re))!=null)
				{
					// append the parameter to its parent
					vCalendar.tplM['VTcontentline_PERCENT-COMPLETE'][repeatHash][0]+=vcalendar_element_related[0].substr(2);
					// remove the processed parameter
					vtodo=vtodo.replace(vcalendar_element_related[0], '\r\n');
				}
			}
		}

		vcalendar_element=vtodo.match(vCalendar.pre['contentline_PRIORITY']);
		if(vcalendar_element!=null)
		{
			parsed=vcalendar_element[0].match(vCalendar.pre['contentline_parse']);

			//note=String(vcalendar_element).split(':')[1];
			title=vcalendarUnescapeValue(parsed[4]);
			vCalendar.tplM['VTcontentline_PRIORITY'][repeatHash] = new Array();
			vCalendar.tplM['VTcontentline_PRIORITY'][repeatHash][0]=vCalendar.tplC['VTcontentline_PRIORITY'];
			vCalendar.tplM['VTcontentline_PRIORITY'][repeatHash][0]=vCalendar.tplM['VTcontentline_PRIORITY'][repeatHash][0].replace(/##:::##group_wd##:::##/g, parsed[1]);
			vCalendar.tplM['VTcontentline_PRIORITY'][repeatHash][0]=vCalendar.tplM['VTcontentline_PRIORITY'][repeatHash][0].replace(/##:::##params_wsc##:::##/g, parsed[3]);

			vtodo=vtodo.replace(vcalendar_element[0], '\r\n');

			if(parsed[1]!='')
			{
				var re=RegExp('\r\n'+parsed[1].replace('.','\\..*')+'\r\n', 'im');
				while ((vcalendar_element_related=vtodo.match(re))!=null)
				{
					// append the parameter to its parent
					vCalendar.tplM['VTcontentline_PRIORITY'][repeatHash][0]+=vcalendar_element_related[0].substr(2);
					// remove the processed parameter
					vtodo=vtodo.replace(vcalendar_element_related[0], '\r\n');
				}
			}
		}

		// ---------------- VALARM --------------- //
		var valarm=vtodo.match(vCalendar.pre['valarm']);
		if(valarm!=null)
		{
			vtodo=vtodo.replace(valarm[0], '');
			vCalendar.tplM['VTalarm_STRING'][repeatHash]='';
			var alarmString='';
			var alarmArray=new Array();

			for(var i=0;i<valarm[0].length;i++)
			{
				if(valarm[0].substring(i-'END:VALARM'.length, i)=='END:VALARM')
				{
					alarmArray[alarmArray.length]=alarmString+'\r\n';
					if(isThisTODO)
						vCalendar.tplM['VTalarm_STRING'][repeatHash]+=alarmString+'\r\n';
					alarmString='';
				}
				alarmString+=valarm[0][i];
			}
			for(var j=0;j<alarmArray.length;j++)
			{
				checkA=alarmArray[j].match(vCalendar.re['valarm']);
				if(checkA!=null)
				{
					var valarm_full=checkA[0].split('\r\n');

					//BEGIN
					if((parsed=('\r\n'+valarm_full[0]+'\r\n').match(vCalendar.pre['contentline_parse']))==null)
						return false;
					//BEGIN, END VCALENDAR
					vCalendar.tplM['VTbeginVALARM'][repeatHash] = new Array();
					vCalendar.tplM['VTbeginVALARM'][repeatHash][j]=vCalendar.tplC['VTbeginVALARM'].replace(/##:::##group_wd##:::##/g, vcalendar_begin_group=parsed[1]);
					// parsed (contentline_parse)=[1]->"group.", [2]->"name", [3]->";param;param", [4]->"value"
					if((parsed=('\r\n'+valarm_full[valarm_full.length-2]+'\r\n').match(vCalendar.pre['contentline_parse']))==null)
						return false;
					// values not directly supported by the editor (old values are kept intact)
					vCalendar.tplM['VTendVALARM'][repeatHash] = new Array();
					vCalendar.tplM['VTendVALARM'][repeatHash][j]=vCalendar.tplC['VTendVALARM'].replace(/##:::##group_wd##:::##/g, vcalendar_end_group=parsed[1]);

					if(vcalendar_begin_group!=vcalendar_end_group)
						return false; // the vCalendar BEGIN and END "group" are different

					// remove the vCalendar BEGIN and END
					alarmArray[j]='\r\n'+valarm_full.slice(1, valarm_full.length-2).join('\r\n')+'\r\n';

					trigger=alarmArray[j].match(vCalendar.pre['contentline_TRIGGER']);
					if(trigger!=null)
					{

						parsed=(trigger[0]+'\r\n').match(vCalendar.pre['contentline_parse']);
						vCalendar.tplM['VTcontentline_TRIGGER'][repeatHash] = new Array();
						vCalendar.tplM['VTcontentline_TRIGGER'][repeatHash][j]=vCalendar.tplC['VTcontentline_TRIGGER'];
						vCalendar.tplM['VTcontentline_TRIGGER'][repeatHash][j]=vCalendar.tplM['VTcontentline_TRIGGER'][repeatHash][j].replace(/##:::##group_wd##:::##/g, parsed[1]);

						var pars=vcalendarSplitParam(parsed[3]);
						var parString='';
						for(var i=0;i<pars.length;i++)
						{
							if((pars[i]!='VALUE=DATE-TIME') && (pars[i]!='VALUE=DURATION') && (pars[i]!=''))
								parString+=';'+pars[i];
						}

						vCalendar.tplM['VTcontentline_TRIGGER'][repeatHash][j]=vCalendar.tplM['VTcontentline_TRIGGER'][repeatHash][j].replace(/##:::##params_wsc##:::##/g, parString);

						alarmArray[j]=alarmArray[j].replace(trigger[0], '\r\n');

						if(parsed[1]!='')
						{
							var re=RegExp('\r\n'+parsed[1].replace('.','\\..*')+'\r\n', 'im');
							while ((vcalendar_element_related=vtodo.match(re))!=null)
							{
								// append the parameter to its parent
								vCalendar.tplM['VTcontentline_TRIGGER'][repeatHash][j]+=vcalendar_element_related[0].substr(2);
								// remove the processed parameter
								vtodo=vtodo.replace(vcalendar_element_related[0], '\r\n');
							}
						}

					}

					note=alarmArray[j].match(vCalendar.pre['contentline_NOTE']);
					if(note!=null)
					{
						parsed=note[0].match(vCalendar.pre['contentline_parse']);
						vCalendar.tplM['VTcontentline_VANOTE'][repeatHash] = new Array();
						vCalendar.tplM['VTcontentline_VANOTE'][repeatHash][j]=vCalendar.tplC['VTcontentline_VANOTE'];
						vCalendar.tplM['VTcontentline_VANOTE'][repeatHash][j]=vCalendar.tplM['VTcontentline_VANOTE'][repeatHash][j].replace(/##:::##group_wd##:::##/g, parsed[1]);
						vCalendar.tplM['VTcontentline_VANOTE'][repeatHash][j]=vCalendar.tplM['VTcontentline_VANOTE'][repeatHash][j].replace(/##:::##params_wsc##:::##/g, parsed[3]);

						alarmArray[j]=alarmArray[j].replace(note[0], '\r\n');

						if(parsed[1]!='')
						{
							var re=RegExp('\r\n'+parsed[1].replace('.','\\..*')+'\r\n', 'im');
							while ((vcalendar_element_related=vtodo.match(re))!=null)
							{
								// append the parameter to its parent
								vCalendar.tplM['VTcontentline_VANOTE'][repeatHash][j]+=vcalendar_element_related[0].substr(2);
								// remove the processed parameter
								vtodo=vtodo.replace(vcalendar_element_related[0], '\r\n');
							}
						}
					}

					action=(alarmArray[j]).match(vCalendar.pre['contentline_ACTION']);
					if(action!=null)
					{
						parsed=action[0].match(vCalendar.pre['contentline_parse']);
						vCalendar.tplM['VTcontentline_ACTION'][repeatHash] = new Array();
						vCalendar.tplM['VTcontentline_ACTION'][repeatHash][j]=vCalendar.tplC['VTcontentline_ACTION'];
						vCalendar.tplM['VTcontentline_ACTION'][repeatHash][j]=vCalendar.tplM['VTcontentline_ACTION'][repeatHash][j].replace(/##:::##group_wd##:::##/g, parsed[1]);
						vCalendar.tplM['VTcontentline_ACTION'][repeatHash][j]=vCalendar.tplM['VTcontentline_ACTION'][repeatHash][j].replace(/##:::##params_wsc##:::##/g, parsed[3]);

						alarmArray[j]=alarmArray[j].replace(action[0], '\r\n');

						if(parsed[1]!='')
						{
							var re=RegExp('\r\n'+parsed[1].replace('.','\\..*')+'\r\n', 'im');
							while ((vcalendar_element_related=vtodo.match(re))!=null)
							{
								// append the parameter to its parent
								vCalendar.tplM['VTcontentline_ACTION'][repeatHash][j]+=vcalendar_element_related[0].substr(2);
								// remove the processed parameter
								vtodo=vtodo.replace(vcalendar_element_related[0], '\r\n');
							}
						}
					}

					var checkUnprocess=$.trim(alarmArray[j]);
					vCalendar.tplM['VTunprocessedVALARM'][repeatHash] = new Array();
					if(checkUnprocess!='')
						vCalendar.tplM['VTunprocessedVALARM'][repeatHash][j]=alarmArray[j];
				}
			}
		}

		//NOTE
		vcalendar_element=vtodo.match(vCalendar.pre['contentline_NOTE']);
		if(vcalendar_element!=null)
		{
			parsed=vcalendar_element[0].match(vCalendar.pre['contentline_parse']);
			vCalendar.tplM['VTcontentline_NOTE'][repeatHash]=new Array();
			vCalendar.tplM['VTcontentline_NOTE'][repeatHash][0]=vCalendar.tplC['VTcontentline_NOTE'];
			vCalendar.tplM['VTcontentline_NOTE'][repeatHash][0]=vCalendar.tplM['VTcontentline_NOTE'][repeatHash][0].replace(/##:::##group_wd##:::##/g, parsed[1]);
			vCalendar.tplM['VTcontentline_NOTE'][repeatHash][0]=vCalendar.tplM['VTcontentline_NOTE'][repeatHash][0].replace(/##:::##params_wsc##:::##/g, parsed[3]);

			vtodo=vtodo.replace(vcalendar_element[0], '\r\n');

			if(parsed[1]!='')
			{
				var re=RegExp('\r\n'+parsed[1].replace('.','\\..*')+'\r\n', 'im');
				while ((vcalendar_element_related=vtodo.match(re))!=null)
				{
					// append the parameter to its parent
					vCalendar.tplM['VTcontentline_NOTE'][repeatHash][0]+=vcalendar_element_related[0].substr(2);
					// remove the processed parameter
					vtodo=vtodo.replace(vcalendar_element_related[0], '\r\n');
				}
			}
		}

		//NOTE
		vcalendar_element=vtodo.match(vCalendar.pre['contentline_CLASS']);
		if(vcalendar_element!=null)
		{
			parsed=vcalendar_element[0].match(vCalendar.pre['contentline_parse']);
			vCalendar.tplM['VTcontentline_CLASS'][repeatHash]=new Array()
			vCalendar.tplM['VTcontentline_CLASS'][repeatHash][0]=vCalendar.tplC['VTcontentline_CLASS'];
			vCalendar.tplM['VTcontentline_CLASS'][repeatHash][0]=vCalendar.tplM['VTcontentline_CLASS'][repeatHash][0].replace(/##:::##group_wd##:::##/g, parsed[1]);
			vCalendar.tplM['VTcontentline_CLASS'][repeatHash][0]=vCalendar.tplM['VTcontentline_CLASS'][repeatHash][0].replace(/##:::##params_wsc##:::##/g, parsed[3]);
			vCalendar.tplM['VTcontentline_CLASS'][repeatHash][0]=vCalendar.tplM['VTcontentline_CLASS'][repeatHash][0].replace(/##:::##value##:::##/g, parsed[4]);

			vtodo=vtodo.replace(vcalendar_element[0], '\r\n');

			if(parsed[1]!='')
			{
				var re=RegExp('\r\n'+parsed[1].replace('.','\\..*')+'\r\n', 'im');
				while ((vcalendar_element_related=vtodo.match(re))!=null)
				{
					// append the parameter to its parent
					vCalendar.tplM['VTcontentline_CLASS'][repeatHash][0]+=vcalendar_element_related[0].substr(2);
					// remove the processed parameter
					vtodo=vtodo.replace(vcalendar_element_related[0], '\r\n');
				}
			}
		}
		//END

		vcalendar_element=vtodo.match(vCalendar.pre['contentline_DUE']);
		if(vcalendar_element!=null)
		{
			parsed=vcalendar_element[0].match(vCalendar.pre['contentline_parse']);
			vCalendar.tplM['VTcontentline_DUE'][repeatHash]= new Array();
			vCalendar.tplM['VTcontentline_DUE'][repeatHash][0]=vCalendar.tplC['VTcontentline_DUE'];
			vCalendar.tplM['VTcontentline_DUE'][repeatHash][0]=vCalendar.tplM['VTcontentline_DUE'][repeatHash][0].replace(/##:::##group_wd##:::##/g, parsed[1]);

			var pars=vcalendarSplitParam(parsed[3]);
			var parString='';

			for(var i=0;i<pars.length;i++)
			{
				if((pars[i]!='VALUE=DATE') && (pars[i].indexOf('TZID=')==-1) && (pars[i]!=''))
					parString+=';'+pars[i];
			}

			vCalendar.tplM['VTcontentline_DUE'][repeatHash][0]=vCalendar.tplM['VTcontentline_DUE'][repeatHash][0].replace(/##:::##params_wsc##:::##/g, parString);

			vtodo=vtodo.replace(vcalendar_element[0], '\r\n');

			if(parsed[1]!='')
			{
				var re=RegExp('\r\n'+parsed[1].replace('.','\\..*')+'\r\n', 'im');
				while ((vcalendar_element_related=vtodo.match(re))!=null)
				{
					// append the parameter to its parent
					vCalendar.tplM['VTcontentline_DUE'][repeatHash][0]+=vcalendar_element_related[0].substr(2);
					// remove the processed parameter
					vtodo=vtodo.replace(vcalendar_element_related[0], '\r\n');
				}
			}
		}

		//START
		vcalendar_element=vtodo.match(vCalendar.pre['contentline_DTSTART']);
		if(vcalendar_element!=null)
		{
			parsed=vcalendar_element[0].match(vCalendar.pre['contentline_parse']);
			vCalendar.tplM['VTcontentline_E_DTSTART'][repeatHash] = new Array();
			vCalendar.tplM['VTcontentline_E_DTSTART'][repeatHash][0]=vCalendar.tplC['VTcontentline_E_DTSTART'];
			vCalendar.tplM['VTcontentline_E_DTSTART'][repeatHash][0]=vCalendar.tplM['VTcontentline_E_DTSTART'][repeatHash][0].replace(/##:::##group_wd##:::##/g, parsed[1]);

			var pars=vcalendarSplitParam(parsed[3]);
			var parString='';

			for(var i=0;i<pars.length;i++)
			{
				if(pars[i]!='VALUE=DATE' && pars[i].indexOf('TZID=')==-1 && pars[i]!='')
					parString+=';'+pars[i];
			}

			vCalendar.tplM['VTcontentline_E_DTSTART'][repeatHash][0]=vCalendar.tplM['VTcontentline_E_DTSTART'][repeatHash][0].replace(/##:::##params_wsc##:::##/g, parString);

			vtodo=vtodo.replace(vcalendar_element[0], '\r\n');

			if(parsed[1]!='')
			{
				var re=RegExp('\r\n'+parsed[1].replace('.','\\..*')+'\r\n', 'im');
				while ((vcalendar_element_related=vtodo.match(re))!=null)
				{
					// append the parameter to its parent
					vCalendar.tplM['VTcontentline_E_DTSTART'][repeatHash][0]+=vcalendar_element_related[0].substr(2);
					// remove the processed parameter
					vtodo=vtodo.replace(vcalendar_element_related[0], '\r\n');
				}
			}
		}

		//UID
		vcalendar_element=vtodo.match(RegExp('\r\n'+vCalendar.re['contentline_UID'], 'mi'));
		if(vcalendar_element!=null)
		{
			parsed=vcalendar_element[0].match(vCalendar.pre['contentline_parse']);
			vCalendar.tplM['VTcontentline_UID'][repeatHash] = new Array();
			vCalendar.tplM['VTcontentline_UID'][repeatHash][0]=vCalendar.tplC['VTcontentline_UID'];
			vCalendar.tplM['VTcontentline_UID'][repeatHash][0]=vCalendar.tplM['VTcontentline_UID'][repeatHash][0].replace(/##:::##group_wd##:::##/g, parsed[1]);
			vCalendar.tplM['VTcontentline_UID'][repeatHash][0]=vCalendar.tplM['VTcontentline_UID'][repeatHash][0].replace(/##:::##params_wsc##:::##/g, parsed[3]);
			vCalendar.tplM['VTcontentline_UID'][repeatHash][0]=vCalendar.tplM['VTcontentline_UID'][repeatHash][0].replace(/##:::##uid##:::##/g,parsed[4]);

			vtodo=vtodo.replace(vcalendar_element[0], '\r\n');

			if(parsed[1]!='')
			{
				var re=RegExp('\r\n'+parsed[1].replace('.','\\..*')+'\r\n', 'im');
				while ((vcalendar_element_related=vtodo.match(re))!=null)
				{
					// append the parameter to its parent
					vCalendar.tplM['VTcontentline_UID'][repeatHash][0]+=vcalendar_element_related[0].substr(2);
					// remove the processed parameter
					vtodo=vtodo.replace(vcalendar_element_related[0], '\r\n');
				}
			}
		}

		//LAST-MODIFIED
		vcalendar_element=vtodo.match(RegExp('\r\n'+vCalendar.re['contentline_LM'], 'mi'));
		if(vcalendar_element!=null)
		{
			parsed=vcalendar_element[0].match(vCalendar.pre['contentline_parse']);
			vCalendar.tplM['VTcontentline_LM'][repeatHash]=new Array();
			vCalendar.tplM['VTcontentline_LM'][repeatHash][0]=vCalendar.tplC['VTcontentline_LM'];
			vCalendar.tplM['VTcontentline_LM'][repeatHash][0]=vCalendar.tplM['VTcontentline_LM'][repeatHash][0].replace(/##:::##group_wd##:::##/g, parsed[1]);
			vCalendar.tplM['VTcontentline_LM'][repeatHash][0]=vCalendar.tplM['VTcontentline_LM'][repeatHash][0].replace(/##:::##params_wsc##:::##/g, parsed[3]);

			vtodo=vtodo.replace(vcalendar_element[0], '\r\n');

			if(parsed[1]!='')
			{
				var re=RegExp('\r\n'+parsed[1].replace('.','\\..*')+'\r\n', 'im');
				while ((vcalendar_element_related=vtodo.match(re))!=null)
				{
					// append the parameter to its parent
					vCalendar.tplM['VTcontentline_LM'][repeatHash][0]+=vcalendar_element_related[0].substr(2);
					// remove the processed parameter
					vtodo=vtodo.replace(vcalendar_element_related[0], '\r\n');
				}
			}
		}

		//DTSTAMP
		vcalendar_element=vtodo.match(RegExp('\r\n'+vCalendar.re['contentline_DTSTAMP'], 'mi'));
		if(vcalendar_element!=null)
		{
			parsed=vcalendar_element[0].match(vCalendar.pre['contentline_parse']);
			vCalendar.tplM['VTcontentline_DTSTAMP'][repeatHash] = new Array();
			vCalendar.tplM['VTcontentline_DTSTAMP'][repeatHash][0]=vCalendar.tplC['VTcontentline_DTSTAMP'];
			vCalendar.tplM['VTcontentline_DTSTAMP'][repeatHash][0]=vCalendar.tplM['VTcontentline_DTSTAMP'][repeatHash][0].replace(/##:::##group_wd##:::##/g, parsed[1]);
			vCalendar.tplM['VTcontentline_DTSTAMP'][repeatHash][0]=vCalendar.tplM['VTcontentline_DTSTAMP'][repeatHash][0].replace(/##:::##params_wsc##:::##/g, parsed[3]);

			vtodo=vtodo.replace(vcalendar_element[0], '\r\n');

			if(parsed[1]!='')
			{
				var re=RegExp('\r\n'+parsed[1].replace('.','\\..*')+'\r\n', 'im');
				while ((vcalendar_element_related=vtodo.match(re))!=null)
				{
					// append the parameter to its parent
					vCalendar.tplM['VTcontentline_DTSTAMP'][repeatHash][0]+=vcalendar_element_related[0].substr(2);
					// remove the processed parameter
					vtodo=vtodo.replace(vcalendar_element_related[0], '\r\n');
				}
			}
		}

			var i=-1;
			while(vtodo.match(vCalendar.pre['contentline_EXDATE'])!= null)
			{
				i++;
				vcalendar_element=vtodo.match(vCalendar.pre['contentline_EXDATE']);
				if(vcalendar_element!=null)
				{
					parsed=vcalendar_element[0].match(vCalendar.pre['contentline_parse']);
					vCalendar.tplM['VTcontentline_EXDATE'][repeatHash]=new Array();
					vCalendar.tplM['VTcontentline_EXDATE'][repeatHash][i]=vCalendar.tplC['VTcontentline_EXDATE'];
					vCalendar.tplM['VTcontentline_EXDATE'][repeatHash][i]=vCalendar.tplM['VTcontentline_EXDATE'][repeatHash][i].replace(/##:::##group_wd##:::##/g, parsed[1]);
					var pars=vcalendarSplitParam(parsed[3]);
					var parString='', dateStr='';

					for(var j=0;j<pars.length;j++)
					{
						if(pars[j]!='VALUE=DATE' && pars[j]!='')
							parString+=';'+pars[j];
						if(pars[j]=='VALUE=DATE')
							dateStr=pars[j];
					}

					if(dateStr.indexOf('VALUE=DATE')!=-1)
						vCalendar.tplM['VTcontentline_EXDATE'][repeatHash][i]=vCalendar.tplM['VTcontentline_EXDATE'][repeatHash][i].replace(/##:::##AllDay##:::##/g, ';VALUE=DATE');
					else
						vCalendar.tplM['VTcontentline_EXDATE'][repeatHash][i]=vCalendar.tplM['VTcontentline_EXDATE'][repeatHash][i].replace(/##:::##AllDay##:::##/g, '');

					vCalendar.tplM['VTcontentline_EXDATE'][repeatHash][i]=vCalendar.tplM['VTcontentline_EXDATE'][repeatHash][i].replace(/##:::##TZID##:::##/g, '');
					vCalendar.tplM['VTcontentline_EXDATE'][repeatHash][i]=vCalendar.tplM['VTcontentline_EXDATE'][repeatHash][i].replace(/##:::##params_wsc##:::##/g, parString);
					vCalendar.tplM['VTcontentline_EXDATE'][repeatHash][i]=vCalendar.tplM['VTcontentline_EXDATE'][repeatHash][i].replace(/##:::##value##:::##/g,parsed[4]);
					vtodo=vtodo.replace(vcalendar_element[0], '\r\n');
					if(parsed[1]!='')
					{
						var re=RegExp('\r\n'+parsed[1].replace('.','\\..*')+'\r\n', 'im');
						while ((vcalendar_element_related=vtodo.match(re))!=null)
						{
							// append the parameter to its parent
							vCalendar.tplM['VTcontentline_EXDATE'][repeatHash][i]+=vcalendar_element_related[0].substr(2);
							// remove the processed parameter
							vtodo=vtodo.replace(vcalendar_element_related[0], '\r\n');
						}
					}
				}
			}

		//COMPLETED
		vcalendar_element=vtodo.match(RegExp('\r\n'+vCalendar.re['contentline_COMPLETED'], 'mi'));
		if(vcalendar_element!=null)
		{
			parsed=vcalendar_element[0].match(vCalendar.pre['contentline_parse']);
			vCalendar.tplM['VTcontentline_COMPLETED'][repeatHash] = {};
			vCalendar.tplM['VTcontentline_COMPLETED'][repeatHash][rec]=vCalendar.tplC['VTcontentline_COMPLETED'];
			vCalendar.tplM['VTcontentline_COMPLETED'][repeatHash][rec]=vCalendar.tplM['VTcontentline_COMPLETED'][repeatHash][rec].replace(/##:::##group_wd##:::##/g, parsed[1]);
			vCalendar.tplM['VTcontentline_COMPLETED'][repeatHash][rec]=vCalendar.tplM['VTcontentline_COMPLETED'][repeatHash][rec].replace(/##:::##params_wsc##:::##/g, parsed[3]);
			vtodo=vtodo.replace(vcalendar_element[0], '\r\n');
			if(parsed[1]!='')
			{
				var re=RegExp('\r\n'+parsed[1].replace('.','\\..*')+'\r\n', 'im');
				while ((vcalendar_element_related=vtodo.match(re))!=null)
				{
					// append the parameter to its parent
					vCalendar.tplM['VTcontentline_COMPLETED'][repeatHash][rec]+=vcalendar_element_related[0].substr(2);
					// remove the processed parameter
					vtodo=vtodo.replace(vcalendar_element_related[0], '\r\n');
				}
			}
		}

		if(vcalendar.indexOf('\r\n')==0)
			vcalendar=vcalendar.substring(2, vcalendar.length-2);

		if(vcalendar.lastIndexOf('\r\n')!=(vcalendar.length-2))
			vcalendar+='\r\n';
		vCalendar.tplM['VTunprocessedVTODO'][repeatHash]={};
		vCalendar.tplM['VTunprocessedVTODO'][repeatHash][rec]=vtodo;
	//	if(vTimeZone!='')
	//		vcalendar+=vTimeZone;
		isThisTODO=false;
	}

	if(vcalendar.indexOf('\r\n')==0)
		vcalendar=vcalendar.substring(2, vcalendar.length-2);

	if(vcalendar.lastIndexOf('\r\n')!=(vcalendar.length-2))
		vcalendar+='\r\n';

	vCalendar.tplM['VTunprocessedVTIMEZONE'][repeatHash]=vTimeZone;
	vCalendar.tplM['VTunprocessed'][repeatHash]=vcalendar;
}

function vcalendarTodoData(inputCollection, inputEvent, isNew)
{
	var vcalendarOrig=inputEvent.vcalendar;
	var todoArray=new Array();
	var preTodoArray=new Array();
	if((check=inputEvent.vcalendar.match(vCalendar.pre['vtodo']))==null)
	{
		console.log("Error: '"+inputEvent.uid+"': unable to parse vTodo");
		return false;
	}

	//CHECK CALSCALE
	var elem=vcalendarOrig.match(vCalendar.pre['contentline_CALSCALE']);
	if(elem!=null)
	{
		var calscale=elem[0].match(vCalendar.pre['contentline_parse'])[4];
		if(calscale!='GREGORIAN')
		{
			console.log("Error:'"+inputEvent.uid+"': Unsupported calscale in:"+vcalendarOrig);
			return false;
		}
	}
	//CHECK VERSION
	var elemV=vcalendarOrig.match(vCalendar.pre['contentline_VERSION']);
	if(elemV!=null)
	{
		var ver=elemV[0].match(vCalendar.pre['contentline_parse'])[4];
		if(ver!='2.0')
		{
			console.log("Error:'"+inputEvent.uid+"': Unsupported version ("+ver+") in:"+vcalendarOrig);
			return false;
		}
	}
	//FIX TIMEZONE
	var beginTimeZone=vcalendarOrig.indexOf('BEGIN:VTIMEZONE');
	var startEndTimeZone=vcalendarOrig.indexOf('END:VTIMEZONE');
	var endTimeZone=0;
	while(vcalendarOrig.indexOf('BEGIN:VTIMEZONE')!=-1)
		if(beginTimeZone!=-1 && startEndTimeZone!=-1)
		{
			for(i=(startEndTimeZone+2);i<vcalendarOrig.length;i++)
			{
				if(vcalendarOrig.charAt(i)=='\n')
				{
					endTimeZone=i+1;
					break;
				}
			}
			vTimeZone=vcalendarOrig.substring(beginTimeZone, endTimeZone);
			vcalendarOrig=vcalendarOrig.substring(0, beginTimeZone)+vcalendarOrig.substring(endTimeZone, vcalendarOrig.length);
		}

	var rid=inputEvent.uid.substring(0, inputEvent.uid.lastIndexOf('/')+1);
	var evid=inputEvent.uid.substring(inputEvent.uid.lastIndexOf('/')+1, inputEvent.uid.length);
	var recurrence_id_array=new Array();
		while(vcalendarOrig.match(vCalendar.pre['vtodo'])!=null)
		{
			if(vcalendarOrig.substring(vcalendarOrig.indexOf('BEGIN:VTODO')-2, vcalendarOrig.indexOf('BEGIN:VTODO'))=='\r\n')
			{
				var partTodo=vcalendarOrig.substring(vcalendarOrig.indexOf('BEGIN:VTODO')-2,vcalendarOrig.indexOf('END:VTODO')+'END:VTODO'.length);
				vcalendarOrig=vcalendarOrig.replace(partTodo, '');
			}
			else
			{
				var partTodo=vcalendarOrig.substring(vcalendarOrig.indexOf('BEGIN:VTODO'),vcalendarOrig.indexOf('END:VTODO')+'END:VTODO'.length);
				vcalendarOrig=vcalendarOrig.replace(partTodo, '');
				partTodo+='\r\n';
			}
			var rec_array=partTodo.match(vCalendar.pre['contentline_RECURRENCE_ID']);
			var uidString=partTodo.match(vCalendar.pre['contentline_UID']);

			if(uidString!=null && rec_array!=null)
				recurrence_id_array[recurrence_id_array.length]=rec_array[0].match(vCalendar.pre['contentline_parse'])[4]+';'+uidString[0].match(vCalendar.pre['contentline_parse'])[4];

			todoArray[todoArray.length]=partTodo;
		}

	if(todoArray.length==0)
		return false;
	var repeatHashEquals = false;
	for(var toIt=0; toIt<todoArray.length; toIt++)
	{
		var oo='',
		note='',
		start='',
		end='',
		title='',
		all=false,
		frequency='',
		until='',
		complete='',
		isUntilDate=false,
		alertTime=new Array(),
		alertNote=new Array(),
		alertTimeOut=new Array(),
		valOffsetFrom='',
		tzName='local',
		classType='',
		url='',
		tmpObj='',
		isRepeat=false,
		intOffset='',
		realStart='',
		realEnd='',
		interval='',
		until='',
		completedOn='',
		location='',
		isUntilDate=false,
		wkst='',
		byMonthDay='',
		byDay='',
		rec_id='',
		created='',
		repeatHash='',
		returnForValue = true,
		pars=new Array();
		var rid=inputEvent.uid.substring(0, inputEvent.uid.lastIndexOf('/')+1);
		var status='',filterStatus='',renderPriority=0,
		percent="0",
		priority="0",
		alarms=new Array();
		var vcalendar=inputEvent.vcalendar;
		var dates = new Array();
		var vcalendar=todoArray[toIt];
		var stringUID=vcalendar.match(vCalendar.pre['contentline_UID']);
		if(stringUID!=null)
			stringUID=stringUID[0].match(vCalendar.pre['contentline_parse'])[4];

		var exDates=new Array();
		var exDate=null;
		var exDate_array=new Array();
		var vcalendar2=vcalendar+'';

		while(vcalendar2.match(vCalendar.pre['contentline_EXDATE'])!= null)
		{
			exDate=vcalendar2.match(vCalendar.pre['contentline_EXDATE']);
			exDate_array[exDate_array.length]=exDate[0];
			vcalendar2=vcalendar2.replace(exDate,'\r\n');
		}

		vcalendar_element=vcalendar.match(vCalendar.pre['contentline_RRULE2']);
		if(vcalendar_element!=null)
		{
			parsed=vcalendar_element[0].match(vCalendar.pre['contentline_parse']);
//			if(parsed[4].indexOf('BYSETPOS')!=-1 || parsed[4].indexOf('BYWEEKNO')!=-1)
//			{
//				console.log("Error:'"+inputEvent.uid+"': Unsupported recurrence rule in todo:"+vcalendar);
//				return false;
//			}
			pars=parsed[4].split(';');
			var parString='';
			if(pars.length>0)
				isRepeat=true;
			for(var i=0;i<pars.length;i++)
			{
				if(pars[i].indexOf('FREQ=')!=-1)
					frequency=pars[i].split('=')[1];
				else if(pars[i].indexOf('INTERVAL=')!=-1)
					interval=pars[i].split('=')[1];
				else if(pars[i].indexOf('COUNT=')!=-1)
				{
					until=pars[i].split('=')[1];
					if(until==0)
					{
						returnForValue = false;
						break
					}
					else if(isNaN(until))
					{
							returnForValue = false;
							break
					}
				}
				else if(pars[i].indexOf('UNTIL=')!=-1)
				{
					isUntilDate=true;
					until=pars[i].split('=')[1];
				}
				else if(pars[i].indexOf('WKST=')!=-1)
				{
					wkst=pars[i].split('=')[1].replace(/\d*MO/,1).replace(/\d*TU/,2).replace(/\d*WE/,3).replace(/\d*TH/,4).replace(/\d*FR/,5).replace(/\d*SA/,6).replace(/\d*SU/,0);
					if(globalSettings.mozillasupport.value!=null && globalSettings.mozillasupport.value)
						wkst='';
				}
				else if(pars[i].indexOf('BYMONTHDAY=')!=-1)
					byMonthDay=pars[i].split('=')[1];
				else if(pars[i].indexOf('BYDAY=')!=-1)
				{
					byDay=pars[i].split('=')[1];
					byDay=byDay.replace(/\d*MO/,1).replace(/\d*TU/,2).replace(/\d*WE/,3).replace(/\d*TH/,4).replace(/\d*FR/,5).replace(/\d*SA/,6).replace(/\d*SU/,0).split(',');
					if(byDay.length>1 &&(frequency=='MONTHLY'||frequency=='YEARLY'))
					{
						console.log("Error:'"+inputEvent.uid+"': Unsupported recurrence rule in todo:"+vcalendar);
						return false;
					}
				}
			}
			if(!returnForValue)
				return false;
			if(!interval)
				interval=1;
		}
		var help1 = '';
		vcalendar_element=vcalendar.match(vCalendar.pre['contentline_DTSTART']);
		if(vcalendar_element!=null)
		{
			parsed=vcalendar_element[0].match(vCalendar.pre['contentline_parse']);
			start=parsed[4];

			help1=start;
			if(help1.indexOf("T")==-1)
			{
				help1=help1.substring(0, 4)+'-'+help1.substring(4, 6)+'-'+help1.substring(6, 8);
				all=true;
			}
			else
			{
				help1=help1.substring(0, 4)+'-'+help1.substring(4, 6)+'-'+help1.substring(6, 8)+'T'+help1.substring(9, 11)+':'+help1.substring(11, 13)+':'+help1.substring(13, 15);
				all=false;
			}

			var t=$.fullCalendar.parseDate(help1);
			start=help1;
			if(t==null)
				return false;
			if((t.toString())=='Invalid Date')
				return false;
			if(exDate_array!=null)
				for(var j=0;j<exDate_array.length;j++)
				{
					var exString=(exDate_array[j]+'\r\n').match(vCalendar.pre['contentline_parse'])[4];
					if(exString.indexOf('T')!=-1 && exString.indexOf('Z')!=-1)
						var utcTime=exString.parseComnpactISO8601().setSeconds(getLocalOffset(exString.parseComnpactISO8601())*-1);
					else if(exString.indexOf('T')!=-1 && exString.indexOf('Z')==-1)
						var utcTime=exString.parseComnpactISO8601();
					else
					{
						if(start.indexOf('T')!=-1)
							exString += 'T' + $.fullCalendar.formatDate(t,'HHmmss');

						var utcTime=exString.parseComnpactISO8601();
					}
					exDates[exDates.length]=new Date(utcTime).toString();
				}

			var dtStartTimezone=parsed[3].split('=');
			if(!all)
			{
				if(parsed[4].charAt(parsed[4].length-1)=='Z')
					tzName='UTC';

				if(dtStartTimezone.length>1 || tzName=='UTC')
				{
					if(tzName!='UTC')
						tzName=$.trim(dtStartTimezone[1]);
					var finTZ = checkTimezone(tzName);
					if(finTZ!=null)
						tzName = finTZ;
					if(globalSettings.timezonesupport.value && tzName in timezones)
					{
						valOffsetFrom=getOffsetByTZ(tzName, t);
						intOffset=(getLocalOffset(t)*-1*1000)-valOffsetFrom.getSecondsFromOffset()*1000;
					}
				}
				else if(processedTimezones.indexOf(tzName)==-1)
				{
					if(timeZonesEnabled.indexOf(tzName)==-1)
						timeZonesEnabled.push('local');
					processedTimezones.push('local');
				}
				if(tzName!='' && tzName != 'local')
					if(processedTimezones.indexOf(tzName)==-1)
					{
						if(timeZonesEnabled.indexOf(tzName)==-1)
							timeZonesEnabled.push(tzName);
						processedTimezones.push(tzName);
					}
			}
			realStart=start;
			if(help1.indexOf("T")!=-1)
			{
				if(intOffset!='')
					t.setTime(t.getTime()+intOffset);

				start=$.fullCalendar.formatDate(t,'u');
			}
			inputEvent.start=$.fullCalendar.parseDate(start);
		}

		vcalendar_element=vcalendar.match(vCalendar.pre['contentline_DUE']);
		if(vcalendar_element!=null)
		{
			parsed=vcalendar_element[0].match(vCalendar.pre['contentline_parse']);
			end=parsed[4];

			var help=end;
			var oldEnd = '';
			if(help.indexOf("T")==-1)
			{

				help=help.substring(0, 4)+'-'+help.substring(4, 6)+'-'+help.substring(6, 8);

				var d=$.fullCalendar.parseDate(help);
				var da=new Date(d.getTime());
				if(help1.indexOf("T")==-1)
					da.setDate(da.getDate()-1);
				help=$.fullCalendar.formatDate(da, "yyyy-MM-dd");
				all=true;
				oldEnd = help;
				if(help1.indexOf("T")!=-1)
				{
					all=false;
					help+='T00:00:00';
					if(tzName == 'UTC')
						help+='Z';
				}
			}
			else
			{
				help=help.substring(0, 4)+'-'+help.substring(4, 6)+'-'+help.substring(6, 8)+'T'+help.substring(9, 11)+':'+help.substring(11, 13)+':'+help.substring(13, 15);
				oldEnd = help;
				all=false;
			}

			end=help;
			var t1=$.fullCalendar.parseDate(end);
			if(t1==null)
				return false;

			if((t1.toString())=='Invalid Date')
				return false;

			if(exDate_array!=null && exDates.length==0)
				for(var j=0;j<exDate_array.length;j++)
				{
					var exString=(exDate_array[j]+'\r\n').match(vCalendar.pre['contentline_parse'])[4];
					if(exString.indexOf('T')!=-1 && exString.indexOf('Z')!=-1)
						var utcTime=exString.parseComnpactISO8601().setSeconds(getLocalOffset(exString.parseComnpactISO8601())*-1);
					else if(exString.indexOf('T')!=-1 && exString.indexOf('Z')==-1)
						var utcTime=exString.parseComnpactISO8601();
					else
					{
						if(end.indexOf('T')!=-1)
							exString += 'T' + $.fullCalendar.formatDate(t1,'HHmmss');

						var utcTime=exString.parseComnpactISO8601();
					}
					exDates[exDates.length]=new Date(utcTime).toString();
				}
			if(intOffset=='' && (help1.indexOf("T")!=-1 || oldEnd.indexOf("T")!=-1))
			{
				var dtStartTimezone=parsed[3].split('=');

				if(parsed[4].charAt(parsed[4].length-1)=='Z')
					tzName='UTC';
				if(dtStartTimezone.length>1 || tzName=='UTC')
				{
					if(tzName!='UTC' && oldEnd.indexOf("T")!=-1)
						tzName=$.trim(dtStartTimezone[1]);
					var finTZ = checkTimezone(tzName);
					if(finTZ!=null)
						tzName = finTZ;
					if(globalSettings.timezonesupport.value && tzName in timezones)
					{
						valOffsetFrom=getOffsetByTZ(tzName, t1);
						intOffset=(getLocalOffset(t1)*-1*1000)-valOffsetFrom.getSecondsFromOffset()*1000;
					}
				}
			}

			realEnd=help;
			if(globalSettings.appleremindersmode.value)
				realStart=help;
			if(help.indexOf("T")!=-1)
			{
				if(intOffset!='')
					t1.setTime(t1.getTime()+intOffset);
				end=$.fullCalendar.formatDate(t1,'u');
			}
			inputEvent.end=end;
			if(globalSettings.appleremindersmode.value)
				start=end;
		}
		if(globalSettings.appleremindersmode.value && realEnd=='' && realStart!='')
		{
			realStart='';
			start='';
		}

		var finalAString='';
		var valarm=vcalendar.match(vCalendar.pre['valarm']);
		if(valarm!=null)
		{
			vcalendar=vcalendar.replace(valarm[0], '');

			var alarmString='';
			var alarmArray=new Array();
			for(var i=0;i<valarm[0].length;i++)
			{
				if(valarm[0].substring(i-'END:VALARM'.length, i)=='END:VALARM')
				{
					alarmArray[alarmArray.length]=alarmString+'\r\n';
					alarmString='';
				}
				alarmString+=valarm[0][i];
			}

			for(var j=0;j<alarmArray.length;j++)
			{
				if(alarmArray[j].indexOf('\r\n')==0 && finalAString.lastIndexOf('\r\n')==(finalAString.length-2))
					finalAString+=alarmArray[j].substring(2,alarmArray[j].length);
				else if((alarmArray[j].indexOf('\r\n')==0 && finalAString.lastIndexOf('\r\n')!=(finalAString.length-2)) || (alarmArray[j].indexOf('\r\n')!=0 && finalAString.lastIndexOf('\r\n')==(finalAString.length-2)) )
					finalAString+=alarmArray[j];
				else
					finalAString+='\r\n'+alarmArray[j];
				checkA=alarmArray[j].match(vCalendar.re['valarm']);
				if(checkA!=null)
				{
					action=(alarmArray[j]).match(vCalendar.pre['contentline_ACTION']);
					if(action!=null)
						parsed=action[0].match(vCalendar.pre['contentline_parse']);
					else
						break;

					trigger=alarmArray[j].match(vCalendar.pre['contentline_TRIGGER']);
					if(trigger!=null)
					{
						parsed=(trigger[0]+'\r\n').match(vCalendar.pre['contentline_parse']);

						if(parsed!=null)
						{
							value=parsed[4];
							var checkD=value.match(vCalendar.pre['date-time-value']);
							var intOffsetA='';
							var tzNameA='';
							if(checkD!=null)
							{
								if(parsed[3])
									var dtStartTimezoneA=parsed[3].split('=');
								var alarmTimeA=$.fullCalendar.parseDate(value.substring(0, 4)+'-'+value.substring(4, 6)+'-'+value.substring(6, 8)+'T'+value.substring(9, 11)+':'+value.substring(11, 13)+':'+value.substring(13, 15));
								if(value.charAt(value.length-1)=='Z')
									tzNameA='UTC';
								if(dtStartTimezoneA.length>1 || tzNameA=='UTC')
								{
									if(tzNameA!='UTC' && dtStartTimezoneA[0]==';TZID')
										tzNameA=$.trim(dtStartTimezoneA[1]);
									var finTZ = checkTimezone(tzNameA);
									if(finTZ!=null)
										tzNameA = finTZ;
									if(globalSettings.timezonesupport.value && tzNameA in timezones)
									{
										var valOffsetFromA=getOffsetByTZ(tzNameA, alarmTimeA);
										if(tzName != 'local')
											intOffsetA=getOffsetByTZ(tzName, alarmTimeA).getSecondsFromOffset()*1000-valOffsetFromA.getSecondsFromOffset()*1000;
										else
											intOffsetA=-1*getLocalOffset(alarmTimeA)*1000-valOffsetFromA.getSecondsFromOffset()*1000;
									}
								}
								else if(processedTimezones.indexOf(tzName)==-1)
								{
									if(timeZonesEnabled.indexOf(tzName)==-1)
										timeZonesEnabled.push('local');
									processedTimezones.push('local');
								}
								if(tzNameA!='' && tzName != 'local')
									if(processedTimezones.indexOf(tzNameA)==-1)
									{
										if(timeZonesEnabled.indexOf(tzNameA)==-1)
											timeZonesEnabled.push(tzNameA);
										processedTimezones.push(tzNameA);
									}
								if(intOffsetA!='')
									alarmTimeA.setTime(alarmTimeA.getTime()+intOffsetA);
								alertTime[j]=$.fullCalendar.formatDate(alarmTimeA,"yyyy-MM-dd'T'HH:mm:ss");
							}
							else
							{
								alertTime[j]=0;

								if(value.indexOf('W')!=-1)
									alertTime[j]=parseAlarmWeek(value);
								else if(value.indexOf('D')!=-1)
									alertTime[j]=parseAlarmDay(value);
								else if(value.indexOf('T')!=-1)
									alertTime[j]=parseAlarmTime(value);

								if(parsed[4].charAt(0)=="-")
									alertTime[j]="-"+alertTime[j];
								else
									alertTime[j]="+"+alertTime[j];
							}
						}
					}
					else
						break;

					alnote=alarmArray[j].match(vCalendar.pre['contentline_NOTE']);
					if(alnote!=null)
					{
						parsed=alnote[0].match(vCalendar.pre['contentline_parse']);
						alertNote[j]=parsed[4];
					}
					else
						alertNote[j]='Default note';
				}
			}
		}

		vcalendar_element=vcalendar.match(vCalendar.pre['contentline_LOCATION']);
		if(vcalendar_element!=null)
		{
			parsed=vcalendar_element[0].match(vCalendar.pre['contentline_parse']);
			location=vcalendarUnescapeValue(parsed[4]);
		}
		vcalendar_element=vcalendar.match(vCalendar.pre['contentline_NOTE']);
		if(vcalendar_element!=null)
		{
			parsed=vcalendar_element[0].match(vCalendar.pre['contentline_parse']);
			note=vcalendarUnescapeValue(parsed[4]);
		}

		vcalendar_element=vcalendar.match(vCalendar.pre['contentline_CLASS']);
		if(vcalendar_element!=null)
		{
			parsed=vcalendar_element[0].match(vCalendar.pre['contentline_parse']);
			classType=vcalendarUnescapeValue(parsed[4]);
		}

		vcalendar_element=vcalendar.match(vCalendar.pre['contentline_URL']);
		if(vcalendar_element!=null)
		{
			parsed=vcalendar_element[0].match(vCalendar.pre['contentline_parse']);
			url=vcalendarUnescapeValue(parsed[4]);
		}

		//NEEDS-ACTION
		//COMPLETED
		//IN-PROCESS
		//CANCELLED
		//PERCENT-COMPLETE

		vcalendar_element=vcalendar.match(vCalendar.pre['contentline_RECURRENCE_ID']);
		if(vcalendar_element!=null)
		{
			parsed=vcalendar_element[0].match(vCalendar.pre['contentline_parse']);
			var rec=parsed[4];
			/*if(rec.indexOf("T")==-1)
			{
				rec=rec.substring(0, 4)+'/'+rec.substring(4, 6)+'/'+rec.substring(6, 8);
				var d=$.fullCalendar.parseDate(rec);
				var da=new Date(d.getTime()-1*24*60*60*1000);
				var day=da.getDate();

				if(day<10)
					day='0'+day;

				var month=da.getMonth();
				month++;
				if(month<10)
					month='0'+month;

				rec=da.getFullYear()+'-'+month+'-'+day;
			}
			else
				rec=rec.substring(0, 4)+'-'+rec.substring(4, 6)+'-'+rec.substring(6, 8)+'T'+rec.substring(9, 11)+':'+rec.substring(11, 13)+':'+rec.substring(13, 15);
			rec_id=$.fullCalendar.parseDate(rec);*/
			//if(!rec_id || rec_id=='Invalid Date')
			//	rec_id='';
			rec_id=rec;
		}

		vcalendar_element=vcalendar.match(vCalendar.pre['contentline_SUMMARY']);
		if(vcalendar_element!=null)
		{
			parsed=vcalendar_element[0].match(vCalendar.pre['contentline_parse']);
			title=vcalendarUnescapeValue(parsed[4]);
		}
		vcalendar_element=vcalendar.match(vCalendar.pre['contentline_CREATED']);
		if(vcalendar_element!=null)
		{
			parsed=vcalendar_element[0].match(vCalendar.pre['contentline_parse']);
			created=vcalendarUnescapeValue(parsed[4]);
		}

		vcalendar_element=vcalendar.match(vCalendar.pre['contentline_STATUS']);
		if(vcalendar_element!=null)
		{
			parsed=vcalendar_element[0].match(vCalendar.pre['contentline_parse']);
			status=vcalendarUnescapeValue(parsed[4]);
		}
		if(globalSettings.appleremindersmode.value  && (status=='IN-PROCESS' || status=='CANCELLED'))
			status = 'NEEDS-ACTION';
		switch(status)
		{
			case 'NEEDS-ACTION':
				filterStatus = 'filterAction';
				break;
			case 'COMPLETED':
				filterStatus = 'filterCompleted';
				break;
			case 'IN-PROCESS':
				filterStatus = 'filterProgress';
				break;
			case 'CANCELLED':
				filterStatus = 'filterCanceled';
				break;
			default:
				filterStatus = 'filterAction';
				break;
		}

		vcalendar_element=vcalendar.match(vCalendar.pre['contentline_COMPLETED']);
		if(vcalendar_element!=null)
		{
			parsed=vcalendar_element[0].match(vCalendar.pre['contentline_parse']);
			var tmpDate=parsed[4];

			if(tmpDate.indexOf("T")!=-1)
				tmpDate=tmpDate.substring(0, 4)+'-'+tmpDate.substring(4, 6)+'-'+tmpDate.substring(6, 8)+'T'+tmpDate.substring(9, 11)+':'+tmpDate.substring(11, 13)+':'+tmpDate.substring(13, 15);

			var t1=$.fullCalendar.parseDate(tmpDate);
			if(t1==null || ((t1.toString())=='Invalid Date'))
				completedOn='';
			else
				completedOn=new Date(t1.getTime());

			if(completedOn!='')
			{
				var intOffsetA='';
				var dtStartTimezoneA = new Array();
				if(parsed[3])
					dtStartTimezoneA=parsed[3].split('=');
				if(parsed[4].charAt(parsed[4].length-1)=='Z')
					tzNameA='UTC';
				if(dtStartTimezoneA.length>1 || tzNameA=='UTC')
				{
					if(tzNameA!='UTC')
						tzNameA=$.trim(dtStartTimezoneA[1]);
					var finTZ = checkTimezone(tzNameA);
					if(finTZ!=null)
						tzNameA = finTZ;
					if(globalSettings.timezonesupport.value && tzNameA in timezones)
					{
						var valOffsetFromA=getOffsetByTZ(tzNameA, completedOn);
						intOffsetA=getOffsetByTZ(tzName, completedOn).getSecondsFromOffset()*1000-valOffsetFromA.getSecondsFromOffset()*1000;
					}
				}
				else if(processedTimezones.indexOf(tzName)==-1)
				{
					if(timeZonesEnabled.indexOf(tzName)==-1)
						timeZonesEnabled.push('local');
					processedTimezones.push('local');
				}
				if(tzName!='' && tzName != 'local')
					if(processedTimezones.indexOf(tzNameA)==-1)
					{
						if(timeZonesEnabled.indexOf(tzNameA)==-1)
							timeZonesEnabled.push(tzNameA);
						processedTimezones.push(tzNameA);
					}

				if(intOffsetA!='')
					completedOn.setTime(completedOn.getTime()+intOffsetA);
			}
		}
		if(status=='COMPLETED' && completedOn=='' &&  end!='' && typeof end=='object')
			completedOn=new Date(end.getTime());

		vcalendar_element=vcalendar.match(vCalendar.pre['contentline_PERCENT-COMPLETE']);
		if(vcalendar_element!=null)
		{
			parsed=vcalendar_element[0].match(vCalendar.pre['contentline_parse']);
			complete=vcalendarUnescapeValue(parsed[4]);
			percent=complete;
		}
		vcalendar_element=vcalendar.match(vCalendar.pre['contentline_PRIORITY']);
		if(vcalendar_element!=null)
		{
			parsed=vcalendar_element[0].match(vCalendar.pre['contentline_parse']);
			priority=vcalendarUnescapeValue(parsed[4]);
			var priorN = parseInt(priority,10);
			if(!isNaN(priorN))
			{
				if(priority>5 && priority<10)
					renderPriority=3;
				else if(priority<5 && priority>0)
					renderPriority=1;
				else if(priority==5)
					renderPriority=2;
				else
					renderPriority=0;
			}
		}

		var evid=inputEvent.uid.substring(inputEvent.uid.lastIndexOf('/')+1, inputEvent.uid.length);
		var todos='',
		p=0;
		var isChange=false;
		if(isRepeat &&(realStart || realEnd))
			repeatHash=inputEvent.uid+'#'+created+'#'+frequency;
		else if(!isRepeat)
			repeatHash=inputEvent.uid+'#'+created+'#'+rec_id;

		if(percent!='' && percent!='0' && percent!='100' && percent!='50')
		{
			if(typeof globalTodolistStatusArray[repeatHash]=='undefined')
				globalTodolistStatusArray[repeatHash] = {};
			globalTodolistStatusArray[repeatHash].percent = percent;
		}

		if(!isNew && !repeatHashEquals)
		{
			var checkForChangeTodo=findEventInArray(inputEvent.uid, false, globalCalTodo!=null ? globalCalTodo.repeatHash : null);
			if(checkForChangeTodo!='')
			{
				if(checkForChangeTodo.etag!=inputEvent.etag || ($('#showTODO').val()==inputEvent.uid && ($('#repeatTodo').val()=="true" || $('#recurrenceIDTODO').val()!='') && !repeatHashEquals))
				{
					for(var it=0; it<checkForChangeTodo.alertTimeOut.length; it++)
						clearTimeout(checkForChangeTodo.alertTimeOut[it]);
					if($('#showTODO').val()==inputEvent.uid)
					{
						if($('#repeatTodo').val()=="true" || $('#recurrenceIDTODO').val()!='')
						{
							if(!(typeof globalCalTodo!='undefined' && globalCalTodo!=null && globalCalTodo.repeatHash == repeatHash))
							{
								var name=globalCalTodo.title;
								//showTodoForm({title: name, id:inputEvent.uid}, 'show','', true);
								$('#editAllTODO').css('visibility','hidden');
								$('#editFutureTODO').css('visibility','hidden');
								$('#editOnlyOneTODO').css('visibility','hidden');
								$('#repeatConfirmBoxContentTODO').html('<b>'+name+"</b> "+localization[globalInterfaceLanguage].repeatChangeTxt);
								$('#repeatConfirmBoxQuestionTODO').html(localization[globalInterfaceLanguage].repeatTodoChangeTxtClose);
							}
							else
							{
								isChange=true;
								repeatHashEquals=true;
								$('#todoList').fullCalendar('selectEvent');
							}
						}
						else
							isChange=true;
					}
				}
			}
		}

		var res=0;
		var index=0;
		for(var p=0;p<globalResourceCalDAVList.TodoCollections.length;p++)
			if(typeof globalResourceCalDAVList.TodoCollections[p].uid !='undefined' && globalResourceCalDAVList.TodoCollections[p].uid==inputCollection.uid)
			{
				index=p;
				break;
			}
		var re=new RegExp('^(https?://)([^@/]+(?:@[^@/]+)?)@([^/]+)(.*/)([^/]+/)([^/]+/)([^/]*)', 'i');
		var tmp=rid.match(re);
		var firstPart=index.pad(String(globalResourceCalDAVList.TodoCollections.length).length);

		var compareString=(firstPart + title).toLowerCase();
		var isall=false;
		if(isRepeat &&(realStart || realEnd))
		{
			var firstDateSaved = false;
			if(globalAppleSupport.nextDates[inputEvent.uid]!=undefined)
				delete globalAppleSupport.nextDates[inputEvent.uid];
			var ruleString=vcalendar.match(vCalendar.pre['contentline_RRULE2'])[0].match(vCalendar.pre['contentline_parse'])[4];
			inputEvent.isRepeat=true;

			if(realStart)
				var varDate=new Date($.fullCalendar.parseDate(realStart).getTime());
			else if(realEnd)
				var varDate=new Date($.fullCalendar.parseDate(realEnd).getTime());

			if(realEnd)
				var varEndDate=new Date($.fullCalendar.parseDate(realEnd).getTime());

			var lastGenDate='';
			var repeatStart='', repeatEnd='';
			if(realStart)
				repeatStart=new Date(varDate.getTime());
			if(realEnd)
				repeatEnd=new Date(varEndDate.getTime());
			var untilDate='',
			realUntilDate='',
			realUntil='';
			if(until!=='')
			{
				if(isUntilDate)
				{
					if(until.indexOf('T')!=-1)
					{
						var uString = until.substring(0, 4)+'-'+until.substring(4, 6)+'-'+until.substring(6, 8)+'T'+until.substring(9, 11)+':'+until.substring(11, 13)+':'+until.substring(13, 15);
						var ut=$.fullCalendar.parseDate(uString);
						if(ut==null)
							return false;
						if(ut.toString()=='Invalid Date')
							return false;

						if(globalSettings.timezonesupport.value && tzName in timezones)
							valOffsetFrom=getOffsetByTZ(tzName, ut);
						if(valOffsetFrom)
						{
							var intOffset=valOffsetFrom.getSecondsFromOffset()*1000;
							ut.setTime(ut.getTime()+intOffset);
						}
						untilDate = new Date(ut.getTime());
					}
					else
					{
						untilDate=$.fullCalendar.parseDate(until.substring(0, 4)+'-'+until.substring(4, 6)+'-'+until.substring(6, 8));
						if(realStart!='')
						{
							untilDate.setHours($.fullCalendar.parseDate(realStart).getHours());
							untilDate.setMinutes($.fullCalendar.parseDate(realStart).getMinutes());
							untilDate.setSeconds($.fullCalendar.parseDate(realStart).getSeconds());
						}
						else if(realEnd!='')
						{
							untilDate.setHours($.fullCalendar.parseDate(realEnd).getHours());
							untilDate.setMinutes($.fullCalendar.parseDate(realEnd).getMinutes());
							untilDate.setSeconds($.fullCalendar.parseDate(realEnd).getSeconds());
						}
					}

					realUntil='';
				}
				else
				{
					untilDate='';
					realUntil=until;

				}
				realUntilDate=untilDate;
				inputEvent.untilDate=untilDate;
			}
			else
			{
				untilDate=globalToLoadedLimitTodo;
				realUntilDate='';
				inputEvent.untilDate='never';
			}
			var repeatCount=0, realRepeatCount=0;


			var repeatLimit = new Date(globalToLoadedLimitTodo.getTime());
			repeatLimit.setMonth(repeatLimit.getMonth() + 2);

			var dayDifference=0;
			if(realEnd)
				dayDifference=varEndDate.getTime()-varDate.getTime();
			var lastGenDate=generateTodoRepeatInstances({
				dayDifference:dayDifference,
				untilDate:realUntilDate,
				repeatStart:repeatStart,
				repeatEnd:repeatEnd,
				futureRLimit:repeatLimit,
				stringUID:stringUID,
				recurrence_id_array:recurrence_id_array,
				exDates:exDates,
				alertTime:alertTime,
				ignoreAlarms:inputCollection.ignoreAlarms,
				isChange:isChange,
				todoArray:todoArray,
				preTodoArray:preTodoArray,
				realRepeatCount:realRepeatCount,
				repeatCount:repeatCount,
				items:new todoItems(start,end, realUntilDate, frequency, interval, realUntil, wkst,  repeatStart, repeatEnd, repeatCount, realRepeatCount, byDay, location,  note, title, inputEvent.uid, vcalendar, inputEvent.etag, alertTime, alertNote, status, filterStatus, rec_id, repeatHash,  percent, inputEvent.displayValue, rid, compareString, tzName, realStart, realEnd, alertTimeOut,classType,url,completedOn, toIt, priority,renderPriority, finalAString,ruleString)
			});
		}
		else
		{
			if(end!='' && typeof end == 'string')
			{
				var ttt = $.fullCalendar.parseDate(end);
				end=new Date(ttt.getTime());
			}
			if(!inputCollection.ignoreAlarms)
				alertTimeOut=setAlertTimeouts(true, alertTime, start,end, {title:title, status:status},true, inputEvent.uid);

			var tmpObj=new todoItems(start, end, '', '', '', '', '',  '', '', '', '', '', location, note, title, inputEvent.uid, vcalendar, inputEvent.etag, alertTime, alertNote, status, filterStatus, rec_id, repeatHash,  percent, inputEvent.displayValue, rid, compareString, tzName, realStart, realEnd, alertTimeOut,classType,url,completedOn,toIt, priority,renderPriority, finalAString,'');
			preTodoArray.splice(preTodoArray.length, 0, tmpObj);
			if(isChange)
				globalCalTodo=tmpObj;
		}
		deleteEventFromArray(inputEvent.uid);
		$.merge(globalEventList.displayTodosArray[rid],preTodoArray);
	}
}
