/*
 * Classes, prototypes, functions:
 *  CCalError
 *  CCalReport
 *  CCalInformation
 *  BuildInformation
 *  ShowError
 *  ShowReport
 *  ShowInfo
 *  HideInfo
 *  SetMainDivHeight
 *  setMaskHeight
 *  cmScroll_resize
 *  GetHeight
 *  GetWidth
 *  GetBounds
 *  FireFoxDetect
 *  MSIEDetect
 *  OperaDetect
 *  SafariDetect
 *  OperaAlldayScroll
 *  $
 *  CreateChild
 *  CreateChildWithAttrs
  *  Trim
 *  HtmlEncode
 *  getMonthNameByNumber
 *  getMonthNumberByName
 *  CheckTimeStr
 *  ConvertFromStrToDate
 *  ConvertFromDateToStr
 *  String.prototype.parseJSON
 */
 
var DAY = 0;
var WEEK = 1;
var MONTH = 2;
var YEAR = 3;
var CALENDAR_MAIN = 0;
var CALENDAR_PUBLISHED = 1;

var mydate;
var setcache;
var weekDaysNamesCalendar = new Array(), weekDaysNamesFull = new Array(), weekDaysNamesShort = new Array();
var weekendDays;
var monthLimits = new Array();
var cachedMonths = new Array();
var all_events_dates = new Array();


function CCalError(name)
{
	this._name = name;
	this._containerObj = null;
	this._messageObj = null;
	this._controlObj = null;
	this._fadeObj = null;
	this._delay = 30000;

	this.Build = function ()
	{
		var tbl = CreateChildWithAttrs(document.body, 'table', [['class', 'wm_hide']]);
		var tr = tbl.insertRow(0);
		var td = tr.insertCell(0);
		var div = CreateChildWithAttrs(td, 'div', [['class', 'wm_info_block']]);
		var shadowDiv = CreateChildWithAttrs(div, 'div', [['class', 'wm_shadow']]);
		var aDiv = CreateChildWithAttrs(shadowDiv, 'div', [['class', 'a']]);
		aDiv.innerHTML = '&nbsp;';
		var infoDiv = CreateChildWithAttrs(div, 'div', [['class', 'wm_info_message']]);
		aDiv = CreateChildWithAttrs(div, 'div', [['class', 'a']]);
		aDiv.innerHTML = '&nbsp;';
		var bDiv = CreateChildWithAttrs(div, 'div', [['class', 'b']]);
		bDiv.innerHTML = '&nbsp;';
		this._containerObj = div;
		var imageDiv = CreateChildWithAttrs(infoDiv, 'div', [['class', 'wm_info_image']]);
		this._messageObj = CreateChild(infoDiv, 'span');
		this._controlObj = new CInformation(tbl, 'wm_error_information');
	}
}

function CCalReport(name)
{
	this._name = name;
	this._containerObj = null;
	this._messageObj = null;
	this._controlObj = null;
	this._fadeObj = null;
	this._delay = 5000;

	this.Build = function ()
	{
		var tbl = CreateChildWithAttrs(document.body, 'table', [['class', 'wm_hide']]);
		var tr = tbl.insertRow(0);
		var td = tr.insertCell(0);
		var div = CreateChildWithAttrs(td, 'div', [['class', 'wm_info_block']]);
		var shadowDiv = CreateChildWithAttrs(div, 'div', [['class', 'wm_shadow']]);
		var aDiv = CreateChildWithAttrs(shadowDiv, 'div', [['class', 'a']]);
		aDiv.innerHTML = '&nbsp;';
		var infoDiv = CreateChildWithAttrs(div, 'div', [['class', 'wm_info_message']]);
		aDiv = CreateChildWithAttrs(div, 'div', [['class', 'a']]);
		aDiv.innerHTML = '&nbsp;';
		var bDiv = CreateChildWithAttrs(div, 'div', [['class', 'b']]);
		bDiv.innerHTML = '&nbsp;';
		this._containerObj = div;
		this._messageObj = infoDiv;
		this._controlObj = new CInformation(tbl, 'wm_report_information');
	}
}

CCalReport.prototype = ReportPrototype;
CCalError.prototype = ReportPrototype;

/* for control placement and displaying of information block */
function CCalInformation(cont, cls)
{
	cont.className = cls;
	this._mainContainer = cont;
	this._containerClass = cls;
	this.Hide();
}

CCalInformation.prototype = {
	Show: function ()
	{
		this._mainContainer.style.visibility = 'visible';
	},
	
	Hide: function ()
	{
		this._mainContainer.style.visibility = 'hidden';
	},

	Resize: function ()
	{
		var cont = this._mainContainer;
		cont.style.width = 'auto';
		var offsetWidth = cont.offsetWidth;
		var width = GetWidth();
		if (offsetWidth >  0.4 * width) {
			cont.style.width = '40%';
		}
		cont.style.top = this.GetScrollY() + 'px';
	},

	GetScrollY: function()
	{
		var scrollY = 0;
		if (document.body && typeof document.body.scrollTop != 'undefined') {
			scrollY += document.body.scrollTop;
			if (scrollY == 0 && document.body.parentNode && typeof document.body.parentNode != 'undefined') {
				scrollY += document.body.parentNode.scrollTop;
			}
		}
		else if (typeof window.pageXOffset != 'undefined')  {
			scrollY += window.pageYOffset;
		};
		return scrollY;
	}
};//CCalInformation.prototype

function BuildInformation(tbl)
{
	_infoMessage = $('info_message');
	_infoObj = new CCalInformation(tbl, 'wm_information');

	_reportObj = new CCalReport('_reportObj');
	_fadeEffect = new CFadeEffect('_fadeEffect');
	_reportObj.Build();
	_reportObj.SetFade(_fadeEffect);

	_errorObj = new CCalError('_errorObj');
	_errorObj.Build();
	_errorObj.SetFade(_fadeEffect);
}

function ShowError(errorDesc)
{
	_errorObj.Show(errorDesc);
}

function ShowReport(report)
{
	_reportObj.Show(report);
}

function ShowInfo(Info)
{
	_infoMessage.innerHTML = Info;
	_infoObj.Show();
	_infoObj.Resize();
}

function HideInfo()
{
	_infoObj.Hide();
}


function SetMainDivHeight() {
	var logo		= $('logo');
	var accountslist= $('accountslist');
	var toolbar		= $('toolbar');
	var upperIndent	= $('upper_indent');
	var lowerIndent = $('lower_indent');
	var calendarManager = $('right');
	var dayBody1;
	var main_div;
	var dayHeaders;
	var resCntArrow;

	switch (view) {
		case (0):
			dayBody1		= $('area_1_day');
			main_div		= $('area_2_day');
			dayHeaders		= $('day_headers_day');
		break;
		case (1):
			dayBody1	= $('area_1_week');
			main_div	= $('area_2_week');
			dayHeaders	= $('day_headers_week');
		break;
		case (2):
			main_div	= $('area_2_month');
			dayHeaders	= $('day_headers_month');
		break;
		default:
			dayBody1	= $('area_1_week');
			main_div	= $('area_2_week');
			dayHeaders	= $('day_headers_month');
	};

	var externalHeight = 0;

	externalHeight += (logo != null)?(logo.offsetHeight): 0;
	externalHeight += (accountslist != null)?(accountslist.offsetHeight): 0;
	externalHeight += (toolbar != null)?(toolbar.offsetHeight): 0;
	externalHeight += (upperIndent != null)?(upperIndent.offsetHeight): 0;
	var dhOffsetHeight = (dayHeaders != null)?(dayHeaders.offsetHeight):0;
	externalHeight += dhOffsetHeight;

	if(view == MONTH) {
		var db1offsetHeight = 0;
	} else {
		var db1offsetHeight = (dayBody1 != null)?(dayBody1.offsetHeight):0;
		externalHeight += db1offsetHeight;
	};

	externalHeight += (lowerIndent != null)?(lowerIndent.offsetHeight):0;

	if (!(typeof(main_div) == "undefined")) {
		var aHtmls = document.getElementsByTagName("HTML");
		Html = aHtmls[0];
		if (main_div) {
			var copyMargin = 0;
			var tdBorder = 1;
			externalHeight += copyMargin + tdBorder;
			var height = GetHeight() - externalHeight;
			if (height < 200) height = 200;
			main_div.style.height = height + 'px';

			var cmHeight = 360;
			if ((height + dhOffsetHeight + db1offsetHeight + tdBorder) < cmHeight) {
				height = cmHeight - dhOffsetHeight - db1offsetHeight;
				main_div.style.height = height+"px";

				if(!FireFoxDetect()) {
					Html.style.overflow = 'auto';
				} else {
					document.body.scroll = "yes";
					document.body.style.overflow = "auto";
				}
			} else {
				if(!FireFoxDetect()) {
					Html.style.overflow = 'hidden';
				} else {
					document.body.scroll = "no";
					document.body.style.overflow = "hidden";
				}
			};
			var mdh = height;//main div height - div with time or weeks(in month)
			var wto = mdh+db1offsetHeight+dhOffsetHeight; // area_2 + area_1 + days_headers

			var mlist = $("manager_list");
			var calhead1 = $("calhead1").offsetHeight;
			var mincal = $("mini_calendar_box").offsetHeight;// mincal=189;
			var mold = parseInt(mlist.style.height);
			if (calendarType == CALENDAR_MAIN) {
				var check_link_height = $('checkSharedCalendarsHeader').offsetHeight;
				var calhead2 = $("calhead2").offsetHeight;
			} else {
				var check_link_height = 0;
				var calhead2 = 0;
			};
			var mnew = (wto - calhead1 - calhead2 - mincal - 3 - check_link_height); //if (mnew<65) mnew=65; mnew+="px";

			if (mold!=mnew) {
				mlist.style.height=mnew+"px";
				calendarManager.style.height=(wto-5)+"px";
			};
			if (calendarType == CALENDAR_MAIN) cmScroll_resize();
		}
	}
}
function setMaskHeight() {
	if (MSIEDetect()) {
		var iBodyHeight = document.body.offsetHeight;
		var oEditWindow = $('edit_window');
		oEditWindow.style.height = iBodyHeight + 'px';

		if (calendarType == CALENDAR_MAIN) {
			var oManagerWindow = $('manager_window');
			oManagerWindow.style.height = iBodyHeight + 'px';

			var oConfirmWindow = $('confirm_window');
			oConfirmWindow.style.height = iBodyHeight + 'px';
			
			var oShareWindow = $('share_window');
			oShareWindow.style.height = iBodyHeight + 'px';

			var oRepeatChoose = $('repeat_choose');
			oRepeatChoose.style.height = iBodyHeight + 'px';
		}
	}
}

function cmScroll_resize() {
	var mlist = $("manager_list");
	var my_calendars = $('my_calendars');
	var shared_calendars = $('shared_calendars');

	var cn;
	var scrolled=(mlist.offsetHeight<mlist.scrollHeight);
	var wid1=scrolled?140:155; wid1+="px";
	var wid2=scrolled?100:115; wid2+="px";

	for (var i in my_calendars.childNodes) { 
		cn = my_calendars.childNodes[i];
		if ((cn != undefined) && (cn.nodeName=="DIV")&&(cn.className!="calendar_header1")) { 
			cn.firstChild.style.width=wid1; 
			cn.firstChild.childNodes[2].firstChild.firstChild.style.width=wid2; 
		}
	};
	for (var i in shared_calendars.childNodes) { 
		cn = shared_calendars.childNodes[i];
		if ((cn != undefined) && (cn.nodeName=="DIV") && (cn.className!="calendar_header1")) { 
			cn.firstChild.style.width=wid1; 
			cn.firstChild.childNodes[2].firstChild.firstChild.style.width=wid2; 
		}
	};
}

function GetHeight() {
	var height = 768;
	if (self.innerHeight)
		height = self.innerHeight;
	else if (document.documentElement && document.documentElement.clientHeight)
		height = document.documentElement.clientHeight;
	else if (document.body.clientHeight)
		height = document.body.clientHeight;
	return height;
}
function GetWidth() {
	var width = 1024;
	if (document.documentElement && document.documentElement.clientWidth)
		width = document.documentElement.clientWidth;
	else if (document.body.clientWidth)
		width = document.body.clientWidth;
	else if (self.innerWidth)
		width = self.innerWidth;
	return width;
}
function GetBounds(object) {
	var left = object.offsetLeft;
	var top = object.offsetTop;
	for (var parent = object.offsetParent; parent; parent = parent.offsetParent)
	{
		left += parent.offsetLeft;
		top += parent.offsetTop;
	};
	return {Left: left, Top: top, Width: object.offsetWidth, Height: object.offsetHeight};
}

// Check Browser Functions
function FireFoxDetect() {
	return navigator.userAgent.indexOf("Gecko") >= 0;
}
function MSIEDetect() {
	return navigator.userAgent.indexOf("MSIE") >= 0;
}
function OperaDetect() {
	return window.opera;
}
function SafariDetect() {
	var isSafari = (window.devicePixelRatio)?true:false;
	var r = navigator.userAgent.split(" ").reverse();
	var Name = r[0].slice(0, r[0].indexOf("/"));
	var Version = r[1].slice(r[1].indexOf("/")+1);
	return Obj={isSafari:isSafari, Name:Name, Version:Version};
}
function OperaAlldayScroll() {
	if (OperaDetect()) {
		var screens = new Array();
		screens.push($("area_1_day"),$("area_1_week"));
		for (i=0; i<screens.length; i++) {
			var AlldayArea = screens[i];
			var scrollWidth = AlldayArea.offsetWidth - AlldayArea.clientWidth - 1;
			if (scrollWidth<=0) {
				AlldayArea.style.overflow = "hidden";
				var AlldayAreaTbl = AlldayArea.getElementsByTagName("table");
				var AlldayAreaTblTr = AlldayAreaTbl[0].getElementsByTagName("tr");

				if (AlldayArea.style.height != null) {
					var alldayStyleHeight = parseInt(AlldayArea.style.height);
				} else {
					var alldayStyleHeight = AlldayArea.clientHeight;
				};
				if (AlldayArea.scrollHeight > alldayStyleHeight) {
					//del td
				} else {
					//add td
					var td = document.createElement("td");
					td.style.width = "16px";
					td.style.borderLeft = "1px solid #CDCDCD";
					if (setcache["showweekends"] == 1 && i==1) {
						td.className = "weekend_day";
					} else {
						td.className = "";
					};
					if (i==0) {
						$("grid_1d").style.overflow = "hidden";
					} else if (i==1) {
						$("grid_1w").style.overflow = "hidden";
					};
					AlldayAreaTblTr[0].appendChild(td);
				}
			}
		}//end for
	}
}// #Check Browser Functions#


function $(element) {
	if (arguments.length > 1) {
		for (var i = 0, elements = [], length = arguments.length; i < length; i++)
			elements.push($(arguments[i]));
		return elements;
	};
	if (typeof element == "string") element = document.getElementById(element);
	return element;
}

function CreateChild(oParentNode,sTag) {
	var oNode = document.createElement(sTag);
	oParentNode.appendChild(oNode);
	return oNode;
}
function CreateChildWithAttrs(parent, tagName, arAttrs) {
	if (MSIEDetect()) {
		var strAttrs = '';
		var attrsLen = arAttrs.length;
		for (var i=attrsLen-1; i>=0; i--) {
			var t = arAttrs[i];
			var key = t[0];
			var val = t[1];
			strAttrs += ' ' + key + '="'+ val + '"';
		};
		tagName = '<' + tagName + strAttrs + '>';
		var node = document.createElement(tagName);
	} else {
		var node = document.createElement(tagName);
		var attrsLen = arAttrs.length;
		for (var i=attrsLen-1; i>=0; i--) {
			var t = arAttrs[i];
			var key = t[0];
			var val = t[1];
			node.setAttribute(key, val);
		}
	};
	parent.appendChild(node);
	return node;
}
function CleanNode(object) {
	while (object.firstChild) object.removeChild(object.firstChild);
}
function DeleteNode(id) {
	var obj = $(id);
	if (obj != undefined) {
		var parent = obj.parentNode;
		parent.removeChild(obj);
	}
}

function Trim(str) {
	return str.replace(/^\s+/, '').replace(/\s+$/, '');
}

function HtmlEncode(source) {
	return source.replace(/&/g, '&amp;').replace(/>/g, '&gt;').replace(/</g, '&lt;');
}

function getDayName(day)
{
	var weekDay = new Array(7);
	weekDay[1] = Lang.FullDayMonday; 
	weekDay[2] = Lang.FullDayTuesday;
	weekDay[3] = Lang.FullDayWednesday;
	weekDay[4] = Lang.FullDayThursday;
	weekDay[5] = Lang.FullDayFriday;
	weekDay[6] = Lang.FullDaySaturday;
	weekDay[0] = Lang.FullDaySunday;

	return weekDay[day];
}

function getDayShortName(day)
{
	var weekDay = new Array(7);
	weekDay[1] = Lang.DayToolMonday;
	weekDay[2] = Lang.DayToolTuesday;
	weekDay[3] = Lang.DayToolWednesday;
	weekDay[4] = Lang.DayToolThursday;
	weekDay[5] = Lang.DayToolFriday;
	weekDay[6] = Lang.DayToolSaturday;
	weekDay[0] = Lang.DayToolSunday;

	return weekDay[day];
}

function getMonthName(month)
{
	var ar = new Array(12);
	ar[0] = Lang.FullMonthJanuary;
	ar[1] = Lang.FullMonthFebruary;
	ar[2] = Lang.FullMonthMarch;
	ar[3] = Lang.FullMonthApril;
	ar[4] = Lang.FullMonthMay;
	ar[5] = Lang.FullMonthJune;
	ar[6] = Lang.FullMonthJuly;
	ar[7] = Lang.FullMonthAugust;
	ar[8] = Lang.FullMonthSeptember;
	ar[9] = Lang.FullMonthOctober;
	ar[10] = Lang.FullMonthNovember;
	ar[11] = Lang.FullMonthDecember;
  
	return ar[month];
}

function getMonthNameByNumber(monthnumber) {
	monthnumber = parseInt(monthnumber, 10);
	switch (monthnumber) {
		case 1:
			monthname = Lang.ShortMonthJanuary; break;
		case 2:
			monthname = Lang.ShortMonthFebruary; break;
		case 3:
			monthname = Lang.ShortMonthMarch; break;
		case 4:
			monthname = Lang.ShortMonthApril; break;
		case 5:
			monthname = Lang.ShortMonthMay; break;
		case 6:
			monthname = Lang.ShortMonthJune; break;
		case 7:
			monthname = Lang.ShortMonthJuly; break;
		case 8:
			monthname = Lang.ShortMonthAugust; break;
		case 9:
			monthname = Lang.ShortMonthSeptember; break;
		case 10:
			monthname = Lang.ShortMonthOctober; break;
		case 11:
			monthname = Lang.ShortMonthNovember; break;
		case 12:
			monthname = Lang.ShortMonthDecember; break;
		default:
			monthname = null; break;
	};
	return monthname;
}

function getMonthNumberByName(monthname) {
	switch (monthname) {
		case Lang.ShortMonthJanuary:
			monthnumber = "01"; break;
		case Lang.ShortMonthFebruary:
			monthnumber = "02"; break;
		case Lang.ShortMonthMarch:
			monthnumber = "03"; break;
		case Lang.ShortMonthApril:
			monthnumber = "04"; break;
		case Lang.ShortMonthMay:
			monthnumber = "05"; break;
		case Lang.ShortMonthJune:
			monthnumber = "06"; break;
		case Lang.ShortMonthJuly:
			monthnumber = "07"; break;
		case Lang.ShortMonthAugust:
			monthnumber = "08"; break;
		case Lang.ShortMonthSeptember:
			monthnumber = "09"; break;
		case Lang.ShortMonthOctober:
			monthnumber = "10"; break;
		case Lang.ShortMonthNovember:
			monthnumber = "11"; break;
		case Lang.ShortMonthDecember:
			monthnumber = "12"; break;
		default:
			monthnumber = null; break;
	};
	return monthnumber;
}

function CheckTimeStr(time)
{
	var pattern;
	if (setcache['timeformat'] == 1){
		pattern = /^(\d{1,2}):?(\d{2})?\s+(AM|PM)$/;
	} else {
		pattern = /^(\d{1,2}):(\d{2})$/;
	};

	var arr =  pattern.exec(time);
	if (arr != null) {
		var timeObj = {};
		timeObj.time = arr[0];
		timeObj.hours = arr[1];
		timeObj.minutes = ((arr[2]!="") ? arr[2] : null);
		timeObj.timeInterval = ((arr[3]!="") ? arr[3] : null);
	} else {
		return null;
	};
	return timeObj;
}

function ConvertFromStrToDate(str) {
	var date, pattern, arr;
	if(setcache['dateformat'] == 1)
	{
		pattern = /^([01]?[0-9])\/([0-3]?[0-9])\/([12][0-9]{3})$/;
		arr = pattern.exec(str);
		if (arr != null) {
			return date = new Date(arr[3], (Number(arr[1])-1), arr[2]);
		} else {
			return null;
		}
	}
	else if (setcache['dateformat'] == 2)
	{
		pattern = /^([0-3]?[0-9])\/([01]?[0-9])\/([12][0-9]{3})$/;
		arr = pattern.exec(str);
		if (arr != null) {
			return date = new Date(arr[3], (Number(arr[2])-1), arr[1]);
		} else {
			return null;
		}
	}
	else if (setcache['dateformat'] == 3)
	{
		pattern = /^([12][0-9]{3})-([01]?[0-9])-([0-3]?[0-9])$/;
		arr = pattern.exec(str);
		if (arr != null) {
			return date = new Date(arr[1], (Number(arr[2])-1), arr[3]);
		} else {
			return null;
		}
	}
	else if (setcache['dateformat'] == 4)
	{
		pattern = /^([0-3]?[0-9])\s*,\s*([12][0-9]{3})$/;
		var month = Trim(str.substr(0, str.indexOf(" ")));
		var dayYear = Trim(str.substr(str.indexOf(" "), str.length));
		var monthnumber = getMonthNumberByName(month);
		if (monthnumber==null) return null;
		arr = pattern.exec(dayYear);
		if (arr != null) {
			return date = new Date(arr[2], (Number(monthnumber)-1), arr[1]);
		} else {
			return null;
		}
	}
	else //setcache['dateformat'] == 5
	{
		var arr = str.split(" ");
		var arr1 = new Array();
		for (i=0; i<arr.length; i++) {
			if (Trim(arr[i]).length != 0) arr1.push(Trim(arr[i]));
		};

		if (arr1.length == 3) {
			var monthnumber = getMonthNumberByName(arr1[1]);
			var pattern = /^([12][0-9]{3})$/;
			var res = pattern.exec(arr1[2]);
			if (!(Number(arr1[0])<1 || Number(arr1[0])>31) && 
				(monthnumber != null) && 
				(res != null)) {
					return date = new Date(res[0], (Number(monthnumber)-1), arr1[0]);
			}
		};
		return null;
	}
}

function ConvertFromDateToStr(date) {
	var str;
	if(setcache['dateformat'] == 1)
	{
		str = fnum((date.getMonth()+1),2)+"/"+fnum(date.getDate(),2)+"/"+date.getFullYear();
	}
	else if (setcache['dateformat'] == 2)
	{
		str = fnum(date.getDate(),2)+"/"+fnum((date.getMonth()+1),2)+"/"+date.getFullYear();
	}
	else if (setcache['dateformat'] == 3)
	{
		str = date.getFullYear()+"-"+fnum((date.getMonth()+1),2)+"-"+fnum(date.getDate(),2);
	}
	else if (setcache['dateformat'] == 4)
	{
		str = getMonthNameByNumber(fnum((date.getMonth()+1),2))+" "+date.getDate()+", "+date.getFullYear();
	}
	else //setcache['dateformat'] == 5
	{
		str = date.getDate()+" "+getMonthNameByNumber(fnum((date.getMonth()+1),2))+" "+date.getFullYear();
	};
	return str;
}

function ReplaceNonDigits()
{
	var regExp = /[^0-9]/gi;
	this.value = this.value.replace(regExp, '');
}

function convertObjectVariablesToTheirTypes(obj) {
	var converted_obj = new Object();
	var pattern = /^([12][0-9]{3})-([01]?[0-9])-([0-3]?[0-9])\s*([012][0-9]):([03]0):(00)$/;
	for (var elem in obj) {
		if (Number(obj[elem]) || obj[elem] === "0") {
			converted_obj[elem] = parseFloat(obj[elem]);
		} else if (typeof obj[elem] === "string") {
			if (obj[elem] == "true" || obj[elem] == "false") {
				converted_obj[elem] = Boolean(obj[elem]);
			} else {
				var arr = pattern.exec(obj[elem]);
				if (arr != null) {
					converted_obj[elem] = new Date(arr[1], arr[2], arr[3], arr[4], arr[5], arr[6]);
				} else {
					converted_obj[elem] = obj[elem]; 
				}
			}
		} else {
			converted_obj[elem] = obj[elem];
		}
	};
	return converted_obj;
}

function PreventIEFlickering() {
	/*Use Object Detection to detect IE6*/
	var  m = document.uniqueID /*IE*/
	&& document.compatMode  /*>=IE6*/
	&& !window.XMLHttpRequest /*<=IE6*/
	&& document.execCommand;
	try{
		if(!!m){
			m("BackgroundImageCache", false, true) /* = IE6 only */
		};
	} catch(oh){};
}

function resizer(evt) {
	SetMainDivHeight();
	if (calendarType == CALENDAR_MAIN && QOpen!=0) QuickMenu.moveQuickMenu(); 
	ReRenderMonthly();
	RecalcScrollArrows();
	setMaskHeight();
}

function getXMLHTTPRequest()
{
	var transport = null;
	if(window.XMLHttpRequest) {
		transport = new XMLHttpRequest();
	} else {
		if(window.ActiveXObject) {
			try
			{
				transport = new ActiveXObject("Msxml2.XMLHTTP");
			}
			catch (err)
			{
				try
				{
					transport = new ActiveXObject("Microsoft.XMLHTTP");
				}
				catch (err2)
				{
				}
			}
		} else {
		}
	};
	return transport;
}

function servErr(jsondata, strError) {
	if (jsondata === false) {
		HideInfo();
		ShowError(strError);
		return true;
	};
	if ((jsondata['error']!=undefined)&&( jsondata['error']==true || jsondata['error']=="true" )) {
		HideInfo();
		ShowError(jsondata['description']);
		return true;
	};
	return false;
}

function eventOn(ev,func,flag) {
	if (FireFoxDetect())
	{ document.addEventListener(ev,func,flag); }
	else
	{ document.attachEvent(("on"+ev),func); }
}

function eventOff(ev,func,flag) {
	if (FireFoxDetect())
	{ document.removeEventListener(ev,func,flag); }
	else 
	{ document.detachEvent(("on"+ev),func); }
}

function loadDefaultSettings() {
	mydate = new Date();
	setcache = getSettingsParametr();
	if (setcache != undefined) {
		switch (setcache['defaulttab'])
		{
			case 1:
				view = DAY;
				$('work_area_day').style.display='block';
			break;
			case 2:
				view = WEEK;
				$('work_area_week').style.display='block';
			break;
			case 3:
				view = MONTH;
				$('work_area_month').style.display='block';
			break;
			default:
				view = WEEK;
				$('work_area_week').style.display='block';
			break;
		};
		if (setcache['weekstartson'] == 0) {
			weekDaysNamesCalendar = [
				Lang.CalendarTableDaySunday,
				Lang.CalendarTableDayMonday,
				Lang.CalendarTableDayTuesday,
				Lang.CalendarTableDayWednesday,
				Lang.CalendarTableDayThursday,
				Lang.CalendarTableDayFriday,
				Lang.CalendarTableDaySaturday
			];
			weekDaysNamesFull = [
				Lang.FullDaySunday,
				Lang.FullDayMonday,
				Lang.FullDayTuesday,
				Lang.FullDayWednesday,
				Lang.FullDayThursday,
				Lang.FullDayFriday,
				Lang.FullDaySaturday
			];
			weekDaysNamesShort = [
				Lang.DayToolSunday,
				Lang.DayToolMonday,
				Lang.DayToolTuesday,
				Lang.DayToolWednesday,
				Lang.DayToolThursday,
				Lang.DayToolFriday,
				Lang.DayToolSaturday
			];
		} else if (setcache['weekstartson'] == 1) {
			weekDaysNamesCalendar = [
				Lang.CalendarTableDayMonday,
				Lang.CalendarTableDayTuesday,
				Lang.CalendarTableDayWednesday,
				Lang.CalendarTableDayThursday,
				Lang.CalendarTableDayFriday,
				Lang.CalendarTableDaySaturday,
				Lang.CalendarTableDaySunday
			];
			weekDaysNamesFull = [
				Lang.FullDayMonday,
				Lang.FullDayTuesday,
				Lang.FullDayWednesday,
				Lang.FullDayThursday,
				Lang.FullDayFriday,
				Lang.FullDaySaturday,
				Lang.FullDaySunday
			];
			weekDaysNamesShort = [
				Lang.DayToolMonday,
				Lang.DayToolTuesday,
				Lang.DayToolWednesday,
				Lang.DayToolThursday,
				Lang.DayToolFriday,
				Lang.DayToolSaturday,
				Lang.DayToolSunday
			];
		}  else if (setcache['weekstartson'] == 6) {
			weekDaysNamesCalendar = [
				Lang.CalendarTableDaySaturday,
				Lang.CalendarTableDaySunday,
				Lang.CalendarTableDayMonday,
				Lang.CalendarTableDayTuesday,
				Lang.CalendarTableDayWednesday,
				Lang.CalendarTableDayThursday,
				Lang.CalendarTableDayFriday
			];
			weekDaysNamesFull = [
				Lang.FullDaySaturday,
				Lang.FullDaySunday,
				Lang.FullDayMonday,
				Lang.FullDayTuesday,
				Lang.FullDayWednesday,
				Lang.FullDayThursday,
				Lang.FullDayFriday
			];
			weekDaysNamesShort = [
				Lang.DayToolSaturday,
				Lang.DayToolSunday,
				Lang.DayToolMonday,
				Lang.DayToolTuesday,
				Lang.DayToolWednesday,
				Lang.DayToolThursday,
				Lang.DayToolFriday
			];
		};
	};
	weekendDays = new Array();
	if (setcache['showweekends'] == 1) {
		weekendDays = new Array(0,6);//sat, sun
	};
	getLimits(mydate);
}

function boxcalc(mode,ad) {
	var left = 0;
	var top = 0;
	var logo = $("logo");
	var toolbar = $('toolbar');
	var accountslist = $('accountslist');
	var upper_indent = $('upper_indent');
	var day_headers_day = $('day_headers_day');
	var day_headers_week = $('day_headers_week');
	var day_headers_month = $('day_headers_month');

	top += (logo != null)? logo.offsetHeight : 0;
	top += (accountslist != null)? accountslist.offsetHeight: 0;
	top += (toolbar != null)? toolbar.offsetHeight: 0;
	top += (upper_indent != null)? upper_indent.offsetHeight: 0;
	if (view == DAY) {
		top += (day_headers_day!=null)? day_headers_day.offsetHeight: 0;
	} else if (view == WEEK) {
		top += (day_headers_week!=null)? day_headers_week.offsetHeight: 0;
	} else { //view == MONTH
		top += (day_headers_month!=null)? day_headers_month.offsetHeight: 0;
	};

	if (mode<3) {
		left+=41; 
		if (ad==0) {
			var vnod=$("area_1_"+((mode==2)?"week":"day")); 
			var vhig = parseToNumber(vnod.offsetHeight);
			vhig=Number(vhig)+2;
			top+=vhig;
		}
	};
	var type="2";
	if ((ad == 1) && (mode < 3)) type="1";
	var cont="d";
	if (mode == 2) cont="w";
	if (mode == 3) cont="_month";
	var tnam = "grid_"+type+cont;
	var ddom = $(tnam);
	var width = ddom.offsetWidth;
	var height = ddom.offsetHeight;
	return {top:parseToNumber(top), left:parseToNumber(left), width:width, height:height, name:tnam, dom:ddom};
}
/*
* @param aEvent == e
* @param evobj - dom element object
*/
function invoke(aEvent,evobj) {
	area.skip = true;
	indrag = false;
	$('edit_form').style.display = 'none';
	area.resizing = false;

	obj = evobj.parentNode;/*global*/
	if (obj == undefined) return;
	var event = isplit(obj.id);
	vMid = event.id_original;
	vMmd = event.mode+1;
	vMad = event.allday;
	mybox = boxcalc(vMmd,vMad);
	inipos = coordss(aEvent,obj,vMmd,vMad,mybox,0);
	cew = (mybox.width/((vMmd == 1)?1:7));
	pickobj = {obj:obj, id:event.id_original, md:vMmd, ad:vMad, h:obj.offsetHeight};
	stx = inipos.x;
	sty = inipos.y;

	invoked_event = {
		calendar_id:mycache.ids[event.id]['calendar_id'],
		event_allday:mycache.ids[event.id]['event_allday'],
		event_name:mycache.ids[event.id]['event_name']
	};
	if (mycache.ids[event.id]['event_repeats'] == 1 && mycache.repeats[event.id_original] != undefined) {
		var exclusion = mycache.exclusions[event.id_original];
		if (exclusion != undefined) {
			invoked_event.event_timefrom = exclusion['event_timefrom'];
			invoked_event.event_timetill = exclusion['event_timetill'];
			invoked_event.calendar_id = exclusion['calendar_id'];
			invoked_event.event_allday = exclusion['event_allday'];
			invoked_event.event_name = exclusion['event_name'];
		} else {
			invoked_event.event_timefrom = mycache.repeats[event.id_original]['event_timefrom'];
			invoked_event.event_timetill = mycache.repeats[event.id_original]['event_timetill'];
		}
	} else {
		invoked_event.event_timefrom = mycache.ids[event.id]['event_timefrom'];
		invoked_event.event_timetill = mycache.ids[event.id]['event_timetill'];
	};

	tf = invoked_event["event_timefrom"];//evlink

	if ((vMmd == 3) || (vMad == 1)) {//month
		mox = obj.offsetLeft;
	} else if (vMmd == 1) {//day
		mox = 0;
	} else if (vMmd == 2) {//week
		wwd = tf.getDay(); 
		if (setcache['weekstartson'] == 0) {
			mox = (mybox.width/7)*(wwd); 
		} else {//setcache['weekstartson'] == 1
			if (wwd == 0) wwd = 7;
			mox = (mybox.width/7)*(wwd-1);
		}
	};

	moy = obj.offsetTop;
	if (invoked_event['event_allday'] == 1)//evlink
	{ 
		cellno = Math.floor((stx-mox)/cew);
		mox += cellno*cew;
	};
	leftpos = mox+mybox.left;
	toppos = moy+mybox.top;
	if ((vMmd < 3) && (vMad != 1))
	{
		scrollbox = 'area_2_'+ ((vMmd == 1)?"day":"week");
		var ofs = $(scrollbox).scrollTop; 
		toppos -= ofs;
	};

	var id_calendar = invoked_event["calendar_id"];//evlink
	eventOn("mouseup",gotcha,true);

	if (typeof(mycache_c.calendars[id_calendar]) != "undefined" && calendarType == CALENDAR_MAIN) {
		var calendar_sharing_level = mycache_c.calendars[id_calendar]['sharing_level'];
		if (calendar_sharing_level != 3 && calendar_sharing_level !=2) {
			eventOn("mousemove",emovin,true);
		}
	};
}

function docscroll() {
	if (window.pageYOffset != null) {
		return window.pageYOffset;
	};
	if (document.body.scrollTop != null) {
		return document.body.scrollTop;
	};
	return 0;
}

function coordss(aEvent,aObj, mode, ad,box,modeFinal,finlink,xflag,xhigh) {
	if (finlink==undefined) { finlink=document.body; };
	if (xflag==undefined) { xflag=0; };
	if (xhigh==undefined) { xhigh=0; };
	var xc=0;
	var xr=0;

//if (aEvent && (md==3)) aEvent=this.parent.event;
    var myEvent = aEvent ? aEvent : window.event; 
	var e=aObj;
	var mmx=myEvent.clientX-box.left;
	var mmy=myEvent.clientY-box.top;
	if (mode<3) {
		scrollbox='area_2_'+ ((mode==1)?"day":"week");
		mmy+=($(scrollbox).scrollTop);
		dbs=docscroll();
		mmy+=dbs;
	};
	if (modeFinal == 1) {
		var pageX = myEvent.clientX;
		var pageY = myEvent.clientY;
		if (FireFoxDetect()) {
			pageX = myEvent.pageX;
			pageY = myEvent.pageY;
		};
		if (OperaDetect()) {
			pageX += document.documentElement.scrollLeft - document.documentElement.clientLeft;
			pageY += document.documentElement.scrollTop - document.documentElement.clientTop;
		};
		var devx = pageX - drager.offsetLeft;
		var devy = pageY - drager.offsetTop;
		mmx -= devx; mmy -= devy;
	};
	if (mode==3) {
		var hgh=$('grid_2_month').offsetHeight; 
		if (xflag==0) 
			var corow=flor(mmy,hgh,6,modeFinal); 
		else
			var corow=flor(mmy+Math.round(xhigh/2),hgh,6,false);
		xr=corow*(hgh/6);
		var wdh=$('grid_2_month').offsetWidth;
		var colum=flor(mmx,wdh,7,modeFinal);
		xc=colum*(wdh/7);
		var coex=colum+7*corow;
		var cotime='xx:xx';
		var codate=move8(showLimits.monthFrom,coex);
	} else {
		var si=(mode==2 ? 'w' : 'd');
		codate='unknown';
		if (ad==1) { 
			cotime='xx:xx'; 
		} else {
			var hgh=$('grid_2'+si).offsetHeight;
			var corow=flor(mmy,hgh,48,modeFinal);
			var xr=corow*(hgh/48);
			var hrs=fnum(Math.floor(corow/2),2);
			var mins=((corow%2)?"30":"00");
			var cotime=hrs+":"+mins;
		};
		if (mode==1) {
			codate=to8(mydate);
		} else {
			var wdh=$('grid_2'+si).offsetWidth;
			var colum=flor(mmx,wdh,7,modeFinal);
			var xc=colum*(wdh/7);
			var codate=weekdayz[colum];
			if (e.id=='current_day_1' || e.id=='current_day_2') codate=to8(window.nowDate);
		}
	};
	return{x:mmx, y:mmy, t:cotime, d:codate, id:e.id, xcol:xc, xrow:xr}
}

function flor(coord,full,parts,round) {
	var single=full/parts;
	if (!round) {
		var sector=Math.floor(coord/single);
	} else {
		var sector=Math.round(coord/single);
	};
	if (sector<0) sector=0;
	if (sector>=parts) sector=parts-1;
	return (sector);
}

function mouse1() { setEventStyle(this.id, 'event_selected');}
function mouse0() { setEventStyle(this.id, 'event');}

function isplit(str) {
	str = String(str);
	var spl = str.split("_");
	return {type:spl[0],
		id_original:parseToNumber(spl[1])+"_"+parseToNumber(spl[2]),
		id:parseToNumber(spl[1]),
		repeat:parseToNumber(spl[2]),
		box:parseToNumber(spl[3]),
		mode:parseToNumber(spl[4]),
		allday:parseToNumber(spl[5]),
		id_object:(spl[1]+'_'+spl[2]+'_'+spl[3]+'_'+spl[4]+'_'+spl[5])
	};
}

function split_event_id(event_id) {
	event_id = String(event_id);
	var parts = event_id.split('_');
	return {id:parseToNumber(parts[0]), repeat:parseToNumber(parts[1]), original:event_id};
}

function parseToNumber(str) {
	str = parseFloat(str);
	return (isNaN(str)? 0 : str);
}
function fnum(num,digits) {
	num = String(num);
	return (('00000000'.substr(0,digits-num.length))+num);
}


/*
* @param string yyyy-mm-dd H:i:s
* @return date object
*/
function dt2date(str) {
	str = String(str);
	var zd = new Date(str.substring(0,4),str.substring(5,7)-1,str.substring(8,10),str.substring(11,13),str.substring(14,16),str.substring(17,19));
	return zd;
}
function date2dt(dt) {
	var zd = fnum(dt.getFullYear(),4)+'-'+fnum(1+dt.getMonth(),2)+'-'+fnum(dt.getDate(),2)+' '+fnum(dt.getHours(),2)+':'+fnum(dt.getMinutes(),2)+':'+fnum(dt.getSeconds(),2);
	return zd;
}
function from8(num) {
	var sof = String(num);
	var df8 = new Date(sof.substring(0,4),sof.substring(4,6)-1,sof.substring(6,8),0,0,0,0);
	return df8;
}
function to8(dt) {
	return(Number(fnum(dt.getFullYear(),4)+fnum(1+dt.getMonth(),2)+fnum(dt.getDate(),2)));
}
function range8(dt1,dt2) {
	var d1=from8(dt1);
	var d2=from8(dt2);  
	var r8 = Math.round((d2.getTime()-d1.getTime())/86400000);
	return r8;
}

function move8(dat,ofs) {
	var date00 = from8(dat); 
	var date01 = date00;
	date01.setDate(ofs + date00.getDate());
	return to8(date01);
}

function gtime(date,hz) {
	if (hz == undefined) var hz=0;
	var dt = new Date(date);
	var chour = dt.getHours();
	var cmin = dt.getMinutes(); 
	if ((chour == 0) && (cmin == 0) && (hz == 24)) {
		chour = 24;
		dt.setTime(dt.getTime()-86400000);
	};
	var cyear = dt.getFullYear();
	var cmonth = 1+dt.getMonth();
	var cday = dt.getDate();
	var cdate = fnum(cday,2)+"/"+fnum(cmonth,2)+"/"+String(cyear);
	var climit = String(cyear)+fnum(cmonth,2)+fnum(cday,2);
	var ctime = fnum(chour,2)+':'+fnum(cmin,2);

	var cfh = chour+(cmin/60);
	var cdatetime = cdate+' '+ctime;
	var cweek = dt.getDay();
	if (cweek==0) cweek=7;
	var nmonth = [, Lang.FullMonthJanuary, Lang.FullMonthFebruary, Lang.FullMonthMarch, Lang.FullMonthApril,
	 Lang.FullMonthMay, Lang.FullMonthJune, Lang.FullMonthJuly, Lang.FullMonthAugust, Lang.FullMonthSeptember,
	 Lang.FullMonthOctober, Lang.FullMonthNovember, Lang.FullMonthDecember][cmonth];
 	var smonth = [, Lang.ShortMonthJanuary, Lang.ShortMonthFebruary, Lang.ShortMonthMarch, Lang.ShortMonthApril,
	 Lang.ShortMonthMay, Lang.ShortMonthJune, Lang.ShortMonthJuly, Lang.ShortMonthAugust, Lang.ShortMonthSeptember,
	 Lang.ShortMonthOctober, Lang.ShortMonthNovember, Lang.ShortMonthDecember][cmonth];

	var utime = ctime;
	if (setcache['timeformat']==1) utime = ((chour == 0)? '12' : ((chour > 12)? chour -12 : chour)) + ((cmin == 0) ? ' ' : ':'+ fnum(cmin,2) + ' ') + ((chour <12) ? "AM" : "PM");
	var udate=cdate;
	if (setcache['dateformat']==1) udate=fnum(cday,2)+"/"+fnum(cmonth,2)+"/"+String(cyear); 
	else if (setcache['dateformat']==3) udate=String(cyear)+'-'+fnum(cmonth,2)+"-"+fnum(cday,2); 
	else if (setcache['dateformat']==4) udate=smonth+' '+fnum(cday,2)+', '+String(cyear); 
	else {//setcache['dateformat']==5)
		udate=fnum(cday,2)+' '+smonth+' '+String(cyear);
	};

	var nweek = [, Lang.FullDayMonday, Lang.FullDayTuesday, Lang.FullDayWednesday, Lang.FullDayThursday,
	 Lang.FullDayFriday, Lang.FullDaySaturday, Lang.FullDaySunday][cweek];
	var inmonth = GetDaysInMonth(cmonth,cyear);
	var dobj = dt;
	var v8=to8(dt);
	return {day: cday,
			month: cmonth,
			year: cyear,
			date: cdate,/**/
			limit: climit,/**/
			hour: chour, /**/
			min: cmin, /**/
			time: ctime, 
			fh: cfh, 
			datetime: cdatetime, /**/
			week: cweek, 
			nweek: nweek, /**/
			nmonth: nmonth, /**/
			smonth: smonth, /**/
			udate: udate, 
			utime: utime, 
			inmonth: inmonth, 
			dobj: dobj, 
			to8: v8
		};
}

function GetDaysInMonth(month,year)
{
	month = ( month<1 ) ? 0 : (( month>12 ) ? 11 : month - 1);
	var arDaysInMonth_Usual = [31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31];
	var arDaysInMonth_Leap 	= [31, 29, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31];
	if ( (year % 4) == 0 && (year % 100) != 0 || (year % 400) == 0 ) 
		return arDaysInMonth_Leap[month];
	else
		return arDaysInMonth_Usual[month];
}

function strip(divName, step, currentClass) {
	var even = false;
	var evenClass = currentClass + "_odd";
	var oddClass = currentClass;
	var mainDiv = $(divName);
	var firstClass;
	if (!mainDiv) { return; };
	var divs = mainDiv.getElementsByTagName("div");
	for (var i = 0; i < divs.length;) {
		firstClass = divs[i].getAttributeNode("class").value;
		if (firstClass == currentClass && even) {
			divs[i].className = evenClass;
		};
		even = !even;
		i = i+step;
	}
}

function loadView(viewpar) {
	$('edit_form').style.display='none';
	$('main_block').style.display='block';

	if (viewpar == undefined) {
		view = (view == undefined) ? WEEK : view;
	} else {
		view = viewpar;
	};

	switch (view)
	{
		case DAY:
			if (calendarType == CALENDAR_MAIN) {
				if (parent && parent.WebMail) parent.WebMail.SetTitle(Lang.TitleDay);
				else document.title = calendarTitle + ' - ' + Lang.Calendar + ' - ' + Lang.TitleDay;
				$('grid_2d').onmousedown=function(aEvent) { makevent(aEvent,1,0); };
				$('grid_1d').onmousedown=function(aEvent) { makevent(aEvent,1,1); };
			};
			$('tab_1').className='time_tabs_outer_activ';
			$('tab_2').className='time_tabs_outer';
			$('tab_3').className='time_tabs_outer';
			$('work_area_day').style.display='block';
			$('work_area_week').style.display='none';
			$('work_area_month').style.display='none';
			$('time_title_1').style.display='block';
			$('time_title_2').style.display='none';
			$('time_title_3').style.display='none';
			strip('grid_2d', 1, 'hrule');
			calendarInManager.RefreshCalendarSelector(mydate.getDate(), mydate.getMonth()+1, mydate.getFullYear());
			areaChoice(1);
			var obj_daily = $('area_2_day');
			iScrollTop = obj_daily.scrollTop;
			iScrollTop += (typeof windowScrollTop != "undefined" ? windowScrollTop : 0);
		break;
		case WEEK:
			if (calendarType == CALENDAR_MAIN) {
				if (parent && parent.WebMail) parent.WebMail.SetTitle(Lang.TitleWeek);
				else document.title = calendarTitle + ' - ' + Lang.Calendar + ' - ' + Lang.TitleWeek;
				$('grid_2w').onmousedown=function(aEvent) { makevent(aEvent,1,0); };
				$('grid_1w').onmousedown=function(aEvent) { makevent(aEvent,1,1); };
			};
			$('tab_2').className='time_tabs_outer_activ';
			$('tab_1').className='time_tabs_outer';
			$('tab_3').className='time_tabs_outer';
			$('work_area_day').style.display='none';
			$('work_area_week').style.display='block';
			$('work_area_month').style.display='none';
			$('time_title_1').style.display='none';
			$('time_title_2').style.display='block';
			$('time_title_3').style.display='none';
			strip("grid_2w", 1, 'hrule');
			calendarInManager.RefreshCalendarSelector(mydate.getDate(), mydate.getMonth()+1, mydate.getFullYear());
			areaChoice(2);
			var obj_weekly = $('area_2_week');
			iScrollTop = obj_weekly.scrollTop;
			iScrollTop += (typeof windowScrollTop != "undefined" ? windowScrollTop : 0);
		break;
		case MONTH:
			if (calendarType == CALENDAR_MAIN) {
				if (parent && parent.WebMail) parent.WebMail.SetTitle(Lang.TitleMonth);
				else document.title = calendarTitle + ' - ' + Lang.Calendar + ' - ' + Lang.TitleMonth;
				$('grid_2_month').onmousedown=function(aEvent) { makevent(aEvent,3,0); };
			};
			$('tab_3').className='time_tabs_outer_activ';
			$('tab_1').className='time_tabs_outer';
			$('tab_2').className='time_tabs_outer';
			$('work_area_day').style.display='none';
			$('work_area_week').style.display='none';
			$('work_area_month').style.display='block';
			$('time_title_1').style.display='none';
			$('time_title_2').style.display='none';
			$('time_title_3').style.display='block';
			calendarInManager.RefreshCalendarSelector(mydate.getDate(), mydate.getMonth()+1, mydate.getFullYear());
			areaChoice(3);
			ReRenderMonthly();
			iScrollTop = 0;
		break;
	}
}

function dateBrowse(jd) {
	if (view == MONTH) {
		var mydate1 = mydate;
		var month1 = mydate1.getMonth();
		var mydate2 = new Date(mydate);
		mydate2.setMonth(mydate2.getMonth() + jd);
		var month2 = mydate2.getMonth();
		
		if ((jd > 0 && (month2 - month1) > 1) || 
			(jd < 0 && ((month1 - month2) < 1 && !(month1 == 0 && month2 == 11)))
		){
			mydate2.setDate(0);
		};
		
		mydate = mydate2;
	} else {
		var step = (view == DAY) ? 1 : 7;
		mydate.setDate(mydate.getDate() + step*jd);
	};
	load_date();
	calendarInManager.RefreshCalendarSelector(mydate.getDate(), mydate.getMonth()+1, mydate.getFullYear());
}

function switch2date(dt) {
	mydate = new Date(dt.substr(0,4), (Number(dt.substr(4,2))-1), dt.substr(6,2));
	load_date();
	loadView(view);
}

function load_date() {
	Grid.FillGrid(mydate);
	fillEvents();
	HideInfo();
}

function ReRenderMonthly() {
	if (view == MONTH) {
		var events_parts = new Array();
		var i = 0;
		var hcol = 0;

		var month_container = $("area_2_month");
		var month_container_height = parseToNumber(month_container.offsetHeight);
		var cell_height = Math.floor(month_container_height/6-20);//6-number of rows 20-height of cell header

		var event_container, iddata, event_id, periods_num, evdata, event_timefrom, from, allday, daysNumber, evmove, till;
		if (mycache_c != undefined) {
		for (var calendar_id in mycache_c.calendars) {
			var calname = 'container_'+parseToNumber(calendar_id)+'_5';
			var calendar_container = $(calname);
			if (calendar_container != undefined) {
				var calendar_childs = calendar_container.childNodes.length; //calendar_childs - events elements
				for (var child = 0; child < calendar_childs; child++) {
					event_container = calendar_container.childNodes[child]; 
					iddata = isplit(event_container.id);
					event_id = iddata.id_original;
					periods_num = iddata.box; //define if this event is long for few week (this event will be cut for few pieces with ids event_id_peace0_..., event_id_peace1_...)
					evdata = mycache.ids[iddata.id];
					if (evdata['event_repeats'] == 1 && mycache.repeats[event_id] != undefined) {
						if (mycache.exclusions[event_id] != undefined) {
							event_timefrom = mycache.exclusions[event_id]['event_timefrom'];
						} else {
							event_timefrom = mycache.repeats[event_id]["event_timefrom"];
						}
					} else {
						event_timefrom = evdata["event_timefrom"];
					};
					var fh = event_timefrom.getHours() + (event_timefrom.getMinutes()/60);
					var day_of_week = event_timefrom.getDay();
					event_timefrom = to8(event_timefrom);

					if (periods_num != 0) { //multiline event
						if (setcache['weekstartson'] == 0) {//first day - sunday
							evmove = periods_num * 7 - day_of_week;
						} else {
							evmove = periods_num * 7 - (((day_of_week == 0)?7:day_of_week) - 1);
						};
						from = move8(event_timefrom,evmove);
					} else {
						from = event_timefrom;
					};
					allday = parseToNumber(evdata["event_allday"]);
					if (allday==1) {
						daysNumber=Math.round(parseToNumber(event_container.style.width)/(100/7)); //number of days in this allday piece of event
					} else {
						daysNumber = 1;
					};
					till = move8(from, daysNumber-1);
					events_parts[i] = {
						event_container:event_container,
						event_id:event_id,
						from:from,
						allday:allday,
						daysNumber:daysNumber,
						till:till,
						fh:fh
					};
					i++;
				}
			}
		};
		};
//sort arrays
		var events_parts_len = events_parts.length;
		for (var i=0; i<(events_parts_len-1); i++) {
			for (var j=(i+1); j<events_parts_len; j++) {
				var part_i = events_parts[i];
				var part_j = events_parts[j];
				if (part_i.daysNumber < part_j.daysNumber) {
					events_parts[j] = part_i;
					events_parts[i] = part_j;
				} else if ((!part_i.allday) && (!part_j.allday)) {
					if ((part_i.from == part_j.from) && (part_i.fh > part_j.fh)) {
						events_parts[j] = part_i;
						events_parts[i] = part_j;
					}
				}
			}
		};
//delete all more elements
		for (var date in more_dates) {
			var more_element = $('more_'+date);
			if (more_element != undefined && (more_element.parentNode == month_container)) {
				month_container.removeChild(more_element);
			}
		};
		
		more_dates = new Array();
		for (var i=0; i<events_parts.length; i++) {
			var part_i = events_parts[i];
			hcol=1;
			var passed = false;
			while (!passed) {
				for (var j=0; j<i; j++) {
					var part_j = events_parts[j];
					if ( (hcol == part_j.col) && (mcros(part_i, part_j)) ) {
						hcol++;
						continue;
					}
				};
				passed=true;
			};
			part_i.col=hcol;
			var number_of_days = range8(showLimits.monthFrom, part_i.from);
			var offsetTop = Math.floor(number_of_days/7); //cell row  there event must be
			offsetTop = Math.round((month_container_height/6)*offsetTop); //offset from top in pixels, depends on window height
			offsetTop=20+27*(hcol-1)+offsetTop; //position with offset in cell
			part_i.event_container.style.top = offsetTop+"px";

			var display_link = ((27*hcol) > (cell_height-15));
			part_i.event_container.style.display = display_link ? "none" : "inline";

			if (display_link) {
				for (var j=0; j<events_parts[i].daysNumber; j++) {
					var daymore = move8(events_parts[i].from, j);
					if (more_dates[daymore] == undefined) {
						more_dates[daymore] = new Array();
					};
					more_dates[daymore].push(events_parts[i].event_id);
				}
			}
		};

		for (var date in more_dates) {
			var links_number = more_dates[date].length;
			var vrange = range8(showLimits.monthFrom, date);
			var visrow = Math.floor(vrange/7);
			var viscol = vrange%7;
			var vistxt = Lang.MonthMoreLink.replace('%d', links_number);
			var more_element = document.createElement('div');
			more_element.className = "more_link";
			var more_text = document.createTextNode(vistxt);
			more_element.appendChild(more_text);
			more_element.style.top = ((visrow+1)*(month_container_height/6)-16)+"px";
			more_element.style.left = (3+(100/7)*viscol)+"%";
			more_element.id = 'more_'+date;
			more_element.onclick = showfetch;
			month_container.appendChild(more_element);
		}
	};
	hidefetch();
}

function mcros(h,z) {
	var A1=h.from;
	var A2=h.till;
	var B1=z.from;
	var B2=z.till;
	var ad1=h.allday;
	var ad2=z.allday;
	if (ad1+ad2==2) return ( ((A1>=B1)&&(A1<=B2)) || ((A2>=B1)&&(A2<=B2)) || ((B1>=A1)&&(B1<=A2)) || ((B2>=A1)&&(B2<=A2)) ); //return ( ((A1>=B1)&&(A2<=B2)) || ((B1>=A1)&&(B2<=A2)) || ((B1>A1)&&(B1<A2)) || ((B2>A1)&&(B2<A2)) || ((A1>B1)&&(A1<B2)) || ((A2>B1)&&(A2<B2)) );
	if (ad1+ad2==0) return (A1==B1);
	if (ad1==1) return ((B1>=A1)&&(B1<=A2));
	if (ad2==1) return ((A1>=B1)&&(A1<=B2));
}

function hidefetch() {
	if (shownfetch == 2) { 
		shownfetch=1;
		return;
	};
	if (shownfetch==0) return;
	var mel=$('mfet');
	if (mel!=null) document.body.removeChild(mel);
	shownfetch=0;
}
/*
function gridLimits(dt8,glarge) {
	var from0, till0, froff;
	var g8 = gtime(from8(dt8)); 
	var kt8 = move8(dt8,-((g8.day)-1));
	var kt = gtime(from8(kt8));
	var kw = kt.week;
	var km = kt.inmonth;
	var lnums = 1;
	for (var i=1; i<=km; i++) {
		kw++; 
		if (kw>7) {
			kw=1;
			if (i<km) lnums++;
		};
	};
	if (glarge) { 
		froff=-((6-lnums)*7+kt.week-1);
	} else {
		froff=-((( (lnums<6) && (kw!=1) )?7:0)+kt.week-1);
	};
	if (setcache['weekstartson'] == 0) {
		from0 = move8(kt8,froff-1);
		till0 = move8(kt8,froff+(glarge?48:41)-1);
	} else {//setcache['weekstartson'] == 1
		from0 = move8(kt8,froff);
		till0 = move8(kt8,froff+(glarge?48:41));
	};

	return { from: from0, till: till0 };
}*/

/*
* get parameters of date
* @param date - dateobj
* @param hz bool
* @params array of parameters
* @ return obj
*/
function getDateParams(dt, hz, params) {
	if (params == undefined) return;
	if (hz == undefined) hz = false;
	var date = new Date(dt);
	var chour = date.getHours();
	var cmin = date.getMinutes();
	if ((chour == 0) && (cmin == 0) && hz) {
		chour = 24;
		date.setTime(date.getTime()-86400000);
	};
	var obj = {};
	for (var i=0; i<params.length; i++) {
		switch (params[i]) {
		case 'WEEK':
			obj.week = date.getDay();
		break;
		case 'FH':
			obj.fh = chour+(cmin/60);
		break;
		case 'TO8':
			obj.to8 = to8(date);
		break;
		};
	};
	return obj;
}

function addToArray(addToArr, addFromArr) {
	if (addToArr.common.length == 0) {
		addToArr.common = addFromArr.common;
	} else {
		for (var i in addFromArr.common) {
			var exist = false;
			for (var j=0; j<addToArr.common.length; j++) {
				if (addToArr.common[j] == addFromArr.common[i]) {
					exist = true;
					break;
				}
			};
			if (!exist) addToArr.common.push(addFromArr.common[i]);
		}
	};
	if (addToArr.allday.length == 0) {
		addToArr.allday = addFromArr.allday;
	} else {
		for (var i in addFromArr.allday) {
			var exist = false;
			for (var j=0; j<addToArr.allday.length; j++) {
				if (addToArr.allday[j] == addFromArr.allday[i]) {
					exist = true;
					break;
				}
			};
			if (!exist) addToArr.allday.push(addFromArr.allday[i]);
		}
	};
	return addToArr;
};

function cacheLoad(date) {
	getLimits(date);
	var todayYear = date.getFullYear();
	var todayMonth = date.getMonth();
	var monthStart = to8(monthLimits[todayYear][todayMonth].bigStart);
	var monthEnd = to8(monthLimits[todayYear][todayMonth].bigEnd);

	var allow_add = true;
	for (var i=0; i<cachedMonths.length; i++) {
		if (todayMonth == cachedMonths[i][0] && todayYear == cachedMonths[i][1]) {
			allow_add = false;
			break;
		}
	};

	if (allow_add) {
		ShowInfo(Lang.InfoLoading);
		var res = '';
		var req = getXMLHTTPRequest();
		var url = processing_url+'?action=get_events&from='+monthStart+'&till='+monthEnd+'&nocache=' + Math.random();
		if (req)
		{
			try {
				req.open("GET",url,false);
				req.send(null);
				res = req.responseText;
			} catch(e) { };
			var events_result = res.parseJSON();
			if (!servErr(events_result,Lang.ErrorLoadEvents)) {
				cachedMonths.push(new Array(todayMonth, todayYear));
				var events = new Array();
				for (var i in events_result) {
					if (i == 'events') {
						events = events_result[i];
					} else if (i == 'exclusions') {
						for (var j  in events_result[i]) {
							var allow_add = false;
							for (var k in mycache_c.calendars) {
								if (events_result[i][j]['calendar_id'] == k) {
									allow_add = true;
									break;
								};
							};
							if (!allow_add) {
								events_result[i][j]['is_deleted'] = 1;
							};
							if (mycache.exclusions[j] == undefined) mycache.exclusions[j] = events_result[i][j];
						}
					}
				};
				for (var i in events) {
					var event = events[i];
					addEventToCache(event);
				};
			};
		};
		HideInfo();
	}/* else {
		if (view == MONTH) {
		
		} else {
			addEventToWeekAndDayPosCache();
		}
	};*/
}

function addEventToCache(event) {
	if (event == undefined) return;
	var datas = {common:new Array(), allday:new Array()};
	var id = event['event_id'];
	if (typeof(event["event_timefrom"]) == 'string') {
		var obj_timefrom = dt2date(event["event_timefrom"]); /*need to use dt2date */
		var obj_timetill = dt2date(event["event_timetill"]);
	} else {
		var obj_timefrom = event["event_timefrom"];
		var obj_timetill = event["event_timetill"];
	};

	if (to8(obj_timetill) < showLimits.monthFrom && event.event_repeats == 0) return datas;

	event.event_timefrom = obj_timefrom;
	event.event_timetill = obj_timetill;
	if (event.repeat_until != undefined) {
		if (event.repeat_until == "") event.repeat_until = null;
		if (event.repeat_until != null && typeof(event.repeat_until) == 'string') {
			event.repeat_until = dt2date(event.repeat_until);
		}
	};

	var ev_obj = {};
	mycache.ids[id] = event;
	
	if (event['event_repeats'] == 1 && typeof(event['repeat_end'] !== "undefined") && event['repeat_end'] !== "") {
		var event_timefrom, event_timetill, period, repeat_times;
		var repeat_end = parseToNumber(event['repeat_end']);
		var repeat_order = parseToNumber(event['repeat_order']);
		var repeat_period = parseToNumber(event['repeat_period']);
		if (repeat_end == 0) {
			var calcEndDate = new Array(mydate.getMonth(), mydate.getFullYear());
			for (var i=0; i<cachedMonths.length; i++) {
				if (calcEndDate[0] <= cachedMonths[i][0] && calcEndDate[1] <= cachedMonths[i][1]) {
					calcEndDate = cachedMonths[i];
				}
			};
			var end_date = to8(monthLimits[calcEndDate[1]][calcEndDate[0]].bigEnd);
		} else {
			var end_date = to8(event.repeat_until);
		};

		if (event.week_number == "") event.week_number = null;
		var weekDays = new Array(event['sun'], event['mon'], event['tue'], event['wed'], event['thu'], event['fri'], event['sat']);
		var weekDayChecked = new Array();
		var weekDateStartF = new Array();
		var weekDateStartT = new Array();
		var day = obj_timefrom.getDay();
		for (var i=0, j=0; i<weekDays.length; i++) {
			if (weekDays[i] == 1) {
				weekDayChecked[j] = i;
				weekDateStartF[j] = new Date(obj_timefrom.getFullYear(), obj_timefrom.getMonth(), obj_timefrom.getDate()-(day-i), obj_timefrom.getHours(), obj_timefrom.getMinutes());
				weekDateStartT[j] = new Date(obj_timetill.getFullYear(), obj_timetill.getMonth(), obj_timetill.getDate()-(day-i), obj_timetill.getHours(), obj_timetill.getMinutes());
				j++;
			}
		};

		var timefrom8 = to8(obj_timefrom);
		var timetill8 = to8(obj_timetill);
			var i = 0, ev_num = 0, cnt = 0, week_cnt = 0;
			if (weekDayChecked[0] < day) {
				for (var k=0; k<weekDayChecked.length; k++) {
					if (day == weekDayChecked[k]) {
						cnt = k;
						break;
					}
				}
			};

			event_timefrom = obj_timefrom;
			event_timetill = obj_timetill;
			while (timefrom8 <= end_date) {
				var id_original = id+"_"+ev_num;
				//var exclusion = mycache.exclusions[id_original];
				ev_obj = {
					event_id: id_original,
					event_timefrom: event_timefrom,
					event_timetill: event_timetill,
					event_allday: event.event_allday
				};
				if (mycache.repeats[id_original] == undefined) {
					mycache.repeats[id_original] = ev_obj;
					var datas_arr = addEventToDaysAndPosCache(ev_obj);
					datas = addToArray(datas, datas_arr);
				};
				ev_num++;
				event_timefrom = new Date(obj_timefrom);
				event_timetill = new Date(obj_timetill);
				if (repeat_period == DAY) {//day 
					i++;
					event_timefrom.setDate(obj_timefrom.getDate() + repeat_order*i);
					event_timetill.setDate(obj_timetill.getDate() + repeat_order*i);
				} else if (repeat_period == WEEK) {//week
					if (weekDayChecked[cnt+1] != undefined) {
						cnt++;
					} else {
						cnt = 0;
						week_cnt++;
					};
					event_timefrom = new Date(weekDateStartF[cnt]);
					event_timetill = new Date(weekDateStartT[cnt]);
					event_timefrom.setDate(weekDateStartF[cnt].getDate() + 7*repeat_order*week_cnt);
					event_timetill.setDate(weekDateStartT[cnt].getDate() + 7*repeat_order*week_cnt);
				} else if (repeat_period == MONTH || repeat_period == YEAR) {//month, year
					if (event['week_number'] == null) {
						var allow = true;
						while (allow) {
							i++;
							if (repeat_period == MONTH){
								event_timefrom.setMonth(obj_timefrom.getMonth() + i*repeat_order);
								event_timetill.setMonth(obj_timetill.getMonth() + i*repeat_order);
							} else {
								event_timefrom.setFullYear(obj_timefrom.getFullYear() + i*repeat_order);
								event_timetill.setFullYear(obj_timetill.getFullYear() + i*repeat_order);
							};
							if (event_timefrom.getDate() == obj_timefrom.getDate()) {
								allow = false;
							} else {
								event_timefrom = new Date(obj_timefrom);
								event_timetill = new Date(obj_timetill);
							}
						}
					} else {
						i++;
						if (repeat_period == MONTH) {
							var start_date_f = new Date(obj_timefrom.getFullYear(), (obj_timefrom.getMonth() + i*repeat_order), 1, obj_timefrom.getHours(), obj_timefrom.getMinutes());
							var start_date_t = new Date(obj_timefrom.getFullYear(), (obj_timefrom.getMonth() + i*repeat_order), 1, obj_timetill.getHours(), obj_timetill.getMinutes());
						} else {
							var start_date_f = new Date((obj_timefrom.getFullYear()+i*repeat_order), (obj_timefrom.getMonth() + 1), 1, obj_timefrom.getHours(), obj_timefrom.getMinutes());
							var start_date_t = new Date((obj_timefrom.getFullYear()+i*repeat_order), (obj_timefrom.getMonth() + 1), 1, obj_timetill.getHours(), obj_timetill.getMinutes());
						};
						event_timefrom = getDayInMonth(start_date_f, event['week_number'], weekDayChecked[0]);
						event_timetill = getDayInMonth(start_date_t, event['week_number'], weekDayChecked[0]);
					};
				};
				timefrom8 = to8(event_timefrom);
			};

	} else {
		var this_day = mycache.days[to8(obj_timefrom)];
		var allow_add = false;
		if (this_day == undefined) {
			allow_add = true;
		} else {
			allow_add = true;
			for (var j in this_day) {
				if (this_day[j] == id+'_0') {
					allow_add = false;
					break;
				}
			}
		}
		if (allow_add){
			ev_obj = {
				event_id: id+'_0',
				event_timefrom: obj_timefrom,
				event_timetill: obj_timetill,
				event_allday: event.event_allday
			};
			var datas_arr = addEventToDaysAndPosCache(ev_obj);
			datas = addToArray(datas, datas_arr);
		}
	};
	return datas;
}

function addOneRepeatEventToCache(event) {
	if (event == undefined) return;

	var event_id = event['event_id']+'_'+event['id_repeat'];
	var exclusion = mycache.exclusions[event_id];
	if (exclusion != undefined) {
		if (exclusion['is_deleted']==1) { allow_add = false; };
		exclusion['event_timefrom'] = dt2date(exclusion['event_timefrom']);
		exclusion['event_timetill'] = dt2date(exclusion['event_timetill']);
		var event_timefrom = to8(exclusion['event_timefrom']);
		var event_timetill = to8(exclusion['event_timetill']);
		var event_allday = exclusion['event_allday'];
		var obj_timetill = exclusion['event_timetill'];
	} else if (mycache.repeats[event_id] != undefined) {
		var event_timefrom = to8(mycache.repeats[event_id]['event_timefrom']);
		var event_timetill = to8(mycache.repeats[event_id]['event_timetill']);
		var event_allday = mycache.repeats[event_id]['event_allday'];
		var obj_timetill = mycache.repeats[event_id]['event_timetill'];
	} else {
		return;
	};

	var datas = {common: new Array(), allday: new Array()};
	if (event_timefrom <= showLimits.day && event_timetill>=showLimits.day) {
		mycache.d[event_id] = render_calc_day_single(event_id);
		render_event(event_id, 0);
	};
	if (event_timefrom <= showLimits.weekTill && event_timetill >= showLimits.weekFrom) {
		mycache.w[event_id] = render_calc_week_single(event_id);
		render_event(event_id, 1);
	};
	if (event_timefrom <= showLimits.monthTill && event_timetill >= showLimits.monthFrom) {
		mycache.m[event_id] = render_calc_month_single(event_id);
		render_event(event_id, 2);
	};
	var hours = getDateParams(obj_timetill, false, new Array('FH'));
	if (hours.fh == 0) event_timetill = move8(event_timetill,-1);
	do {
		if (mycache.days[event_timefrom] == undefined) {
			mycache.days[event_timefrom] = new Array();
		};
		mycache.days[event_timefrom].push(event_id);
		if (event_allday == 1) {
			datas.allday.push(event_timefrom);
		} else {
			datas.common.push(event_timefrom);
		};
		if (all_events_dates[event_timefrom] == undefined) {
			all_events_dates[event_timefrom] = true;
		};
		event_timefrom = move8(event_timefrom,1);
	} while (event_timefrom <= event_timetill);
	return datas;
}

/*
* @param int week_number 0- first week, 3 -4th week, 4 - last week
*/
function getDayInMonth(date, week_number, week_day) {
	week_number = parseToNumber(week_number);
	week_day = parseToNumber(week_day);
	week_day = (week_day == 0)? 7:week_day;
	var offset = 0;
	if (week_number == 4) {
		var this_month = new Date(date.getFullYear(), date.getMonth()+1, 0);
		var this_month_day = this_month.getDay();
		this_month_day = (this_month_day == 0) ? 7:this_month_day;
		if (this_month_day < week_day) {
			offset = - 7;
		} else {
			offset = 0;
		};
	} else {
		var this_month = new Date(date.getFullYear(), date.getMonth(), 1);
		var this_month_day = this_month.getDay();
		this_month_day = (this_month_day == 0) ? 7:this_month_day;
		if (this_month_day <= week_day) {
			offset = 7*week_number;
		} else {
			offset = 7*(week_number + 1);
		};
	};
	this_month = new Date(this_month.getFullYear(), this_month.getMonth(), (this_month.getDate() + week_day - this_month_day + offset), date.getHours(), date.getMinutes());
	return this_month;
}

function addEventToDaysAndPosCache(event) {
	var allow_add = true;
	var datas = {common: new Array(), allday: new Array()};
	var exclusion = mycache.exclusions[event.event_id];
	if (exclusion != undefined) {
		if (exclusion['is_deleted']==1) { allow_add = false; };
		if (typeof(exclusion['event_timefrom']) != 'object') exclusion['event_timefrom'] = dt2date(exclusion['event_timefrom']);
		if (typeof(exclusion['event_timetill']) != 'object') exclusion['event_timetill'] = dt2date(exclusion['event_timetill']);
		var event_timefrom = to8(exclusion['event_timefrom']);
		var event_timetill = to8(exclusion['event_timetill']);
	} else {
		var event_timefrom = to8(event.event_timefrom);
		var event_timetill = to8(event.event_timetill);
	};

	if (allow_add){
		//if (event_timefrom <= showLimits.day && event_timetill>=showLimits.day) {
			mycache.d[event.event_id] = render_calc_day_single(event.event_id);
		//};
		//if (event_timefrom <= showLimits.weekTill && event_timetill >= showLimits.weekFrom) {
			mycache.w[event.event_id] = render_calc_week_single(event.event_id);
	//	};
		//if (event_timefrom <= showLimits.monthTill && event_timetill >= showLimits.monthFrom) {
			mycache.m[event.event_id] = render_calc_month_single(event.event_id);
	//	};
		var hours = getDateParams(event.event_timetill, false, new Array('FH'));
		if (hours.fh == 0) event_timetill = move8(event_timetill,-1);
		do {
			if (mycache.days[event_timefrom] == undefined) {
				mycache.days[event_timefrom] = new Array();
			};
			mycache.days[event_timefrom].push(event.event_id);
			if (event.event_allday == 1) {
				datas.allday.push(event_timefrom);
			} else {
				datas.common.push(event_timefrom);
			};
			if (all_events_dates[event_timefrom] == undefined) {
				all_events_dates[event_timefrom] = true;
			};
			event_timefrom = move8(event_timefrom,1);
		} while (event_timefrom <= event_timetill);
	};
	return datas;
}
/*
* @param event_timefrom, event_timetill in format yyyy-mm-dd
*/
function addEventToWeekAndDayPosCache() {
	var day_cache = mycache.days[showLimits.day];
	if (day_cache != undefined) {
		for (var i=0; i<day_cache.length; i++) {
			var event_id = day_cache[i];
			mycache.d[event_id] = render_calc_day_single(event_id);
			//render_event(event_id, 0);
		}
	};

	var curdate = showLimits.weekFrom;
	do {
		var cache = mycache.days[curdate];
		if (cache != undefined) {
			for (var i=0; i<cache.length; i++) {
				var event_id = cache[i];
				mycache.w[event_id] = render_calc_week_single(event_id);
				//render_event(event_id, 1);
			}
		};
		curdate = move8(curdate,1);
	} while (curdate <= showLimits.weekTill)
}

function buildEvents() {
	var view = new Array();
	view[0] = new Array(showLimits.day, showLimits.day);
	view[1] = new Array(showLimits.weekFrom, showLimits.weekTill);
	view[2] = new Array(showLimits.monthFrom, showLimits.monthTill);

	for (var mode=0; mode<view.length; mode++) {
		var startDay = view[mode][0];
		var endDay = view[mode][1];
		while (startDay <= endDay) {
			if (mycache.days[startDay] != undefined) {
				for (var i in mycache.days[startDay]) {
					render_event(mycache.days[startDay][i], mode);
				}
			};
			startDay = move8(startDay,1);
		}
	};
}
function buildEvent(dates, event_id) {
	for (var i in dates.common) {
		if (dates.common[i] == showLimits.day) {
			for (var j in mycache.days[showLimits.day]) {
				var id = mycache.days[showLimits.day][j];
				var splitted = id.split("_");
				if (splitted[0] == event_id) render_event(id, 0);
			}
		};
		if ((dates.common[i] >= showLimits.weekFrom) && (dates.common[i] <= showLimits.weekTill)) {
			for (var j in mycache.days[dates.common[i]]) {
				var id = mycache.days[dates.common[i]][j];
				var splitted = id.split("_");
				if (splitted[0] == event_id) render_event(id, 1);
			}
		};
		if ((dates.common[i] >= showLimits.monthFrom) && (dates.common[i] <= showLimits.monthTill)) {
			for (var j in mycache.days[dates.common[i]]) {
				var id = mycache.days[dates.common[i]][j];
				var splitted = id.split("_");
				if (splitted[0] == event_id) render_event(id, 2);
			}
		};
	};
	for (var i in dates.allday) {
		if (dates.allday[i] == showLimits.day) {
			for (var j in mycache.days[showLimits.day]) {
				var id = mycache.days[showLimits.day][j];
				var splitted = id.split("_");
				if (splitted[0] == event_id) render_event(id, 0);
			}
		};
		if ((dates.allday[i] >= showLimits.weekFrom) && (dates.allday[i] <= showLimits.weekTill)) {
			for (var j in mycache.days[dates.allday[i]]) {
				var id = mycache.days[dates.allday[i]][j];
				var splitted = id.split("_");
				if (splitted[0] == event_id) render_event(id, 1);
			}
		};
		if ((dates.allday[i] >= showLimits.monthFrom) && (dates.allday[i] <= showLimits.monthTill)) {
			for (var j in mycache.days[dates.allday[i]]) {
				var id = mycache.days[dates.allday[i]][j];
				var splitted = id.split("_");
				if (splitted[0] == event_id) render_event(id, 2);
			}
		};
	}
}
/*
function LoadAllYearEvents(todaydate) {
	ShowInfo(Lang.InfoLoading);
	var days = new Array();
	var date = fnum(todaydate.getFullYear(),4)+fnum((todaydate.getMonth()+1),2)+fnum(todaydate.getDate(),2);
	var res = '';
	var req = getXMLHTTPRequest();
	var url = processing_url+'?action=get_year_events&date='+date+'&nocache=' + Math.random();
	if (req)
	{
		try {
			req.open("GET",url,false);
			req.send(null);
			res = req.responseText;
		} catch(e) { };
		var parsed_data = res.parseJSON();
		if (!servErr(parsed_data,Lang.ErrorLoadEvents)) { 
			for (var i in parsed_data) {
				days[parsed_data[i]] = true;
			}
		}
	};
	HideInfo();
	return days;
}*/

/*arrow for day and week*/
function scrollArrowDown(maxEventPos1)
{
	if(view == WEEK) var par = 'week';
	if(view == DAY) var par = 'day';
	var arrow = $('area_2_' + par);
	arrow.scrollTop = maxEventPos1 + 24 - arrow.offsetHeight;
}

function scrollArrowUp(minEventPos1)
{
	if(view == WEEK) var par = 'week';
	if(view == DAY) var par = 'day';
	var arrow = $('area_2_' + par);
	arrow.scrollTop = minEventPos1 - 24;
}

function setEventStyle(idStr, classStr) {
	var obj = isplit(idStr);
	var id_main = $(idStr);
	var i = obj.box;
	if (i > 0) {
		var id = id_main;
		while (id != undefined) {
			id.className = classStr;
			i--;
			var id_str = obj.type+ '_' + obj.id_original + '_' + i + '_' + obj.mode + '_' + obj.allday;
			id = $(id_str);
		}
	};
	i = 0;
	var id = id_main;
	while (id != undefined) {
		id.className = classStr;
		i++;
		var id_str = obj.type+ '_' + obj.id_original + '_' + i + '_' + obj.mode + '_' + obj.allday;
		var id = $(id_str);
	}
}

function copyar(arr) {
	var tar=new Array();
	for (var i in arr) { 
		var arit=arr[i]; 
		var itype=typeof(arit); 
		if (itype=="object") arit=copyar(arr[i]);
		tar[i]=arit;
	};
	return(tar);
}

/* create a number of event containers for current calendar
* @param id - calendar id
* @param color - calendar color number
* result : 
* container_id_1, container_id_2 - for day
* container_id_3, container_id_4 - for week
* container_id_5 - for month
*/
function renderContainerForEvent(id, color)
{
	var div1 = document.createElement('div');
	div1.className = 'eventcontainer_'+color;
	div1.id = 'container_'+id+'_1';
	$('grid_1d').appendChild(div1);
	var div2 = document.createElement('div');
	div2.className = 'eventcontainer_'+color;
	div2.id = 'container_'+id+'_2';
	$('grid_2d').appendChild(div2);

	var div3 = document.createElement('div');
	div3.className = 'eventcontainer_'+color;
	div3.id = 'container_'+id+'_3';
	$('grid_1w').appendChild(div3);
	var div4 = document.createElement('div');
	div4.className = 'eventcontainer_'+color;
	div4.id = 'container_'+id+'_4';
	$('grid_2w').appendChild(div4);

	var div5 = document.createElement('div');
	div5.className = 'eventcontainer_'+color;
	div5.id = 'container_'+id+'_5';
	$('grid_2_month').appendChild(div5);
}

/* deletes all events in calendar eventcontainer */
function calendarsContainersClear() {
	for (var i in mycache_c.calendars) {
		for (var j=1; j<=5; j++) {
			var container = $('container_'+mycache_c.calendars[i]['calendar_id']+"_"+j);
			if (container != undefined) CleanNode(container);
		}
	}
}

/*
* @param event object
* return positions object
* basedom - parent dom of this event
* arrindex - ?
* divWidth - width of event block in %
* divHeight - height of event block in ex
* divLeft - left offset of event block
* divTop - top offset of event block
* divOff - ?
*/
function render_calc_week_single(event_id) {
	var real_event = split_event_id(event_id);
	var timefrom, timetill;

	if (mycache.exclusions[event_id] != undefined) {
		var event_data = mycache.exclusions[event_id];
		timefrom = event_data.event_timefrom;
		timetill = event_data.event_timetill;
	} else {
		var event_data = mycache.ids[real_event.id];
		if (real_event.repeat != 0) {
			var repeat_data = mycache.repeats[event_id];
			timefrom = repeat_data.event_timefrom;
			timetill = repeat_data.event_timetill;
		} else {
			timefrom = event_data.event_timefrom;
			timetill = event_data.event_timetill;
		};
	};

	var allday = (event_data.event_allday == "1");
	var ddr = new Array();
	var params_arr = new Array('FH', 'WEEK', 'TO8');
	var df = getDateParams(from8(showLimits.weekFrom), false, params_arr);
	var dt = getDateParams(from8(showLimits.weekTill), false, params_arr);
	var tf = getDateParams(timefrom, false, params_arr);
	var tt = getDateParams(timetill, true, params_arr);

	var basedom = "container_" + event_data.calendar_id + (allday?"_3":"_4");
	var days = 1;
	var arrindex = -1;
	if (allday) {
		arrindex = 0;
		if (tf.to8<df.to8) { tf=df; arrindex+=1; };
		if (tt.to8>dt.to8) { tt=dt; arrindex+=2; };
		days = 1+range8(tf.to8,tt.to8);
	};

	if (setcache['weekstartson'] == 0) {
		var divLeft = (100/7)*tf.week;
	} else {//setcache['weekstartson'] == 1
		if (tf.week == 0) tf.week = 7;
		var divLeft = (100/7)*(tf.week-1);
	};

	var divWidth = (100/7)*days;
	if (allday) {
		var divTop = 0;
		var divHeight = "3.9ex";
	} else {
		var divTop = (9*tf.fh)+"ex";
		var divHeight = ((9*(tt.fh-tf.fh))-0.6)+"ex";
	};
	ddr[0]={dom:basedom, arrindex:arrindex, divWidth:divWidth, divHeight:divHeight, divLeft:divLeft, divTop:divTop, divOff:0};
	return(ddr);
}

function render_calc_day_single(event_id) {
	var real_event = split_event_id(event_id);
	var my8 = to8(mydate);
	var ddr = new Array();
	var timefrom, timetill;

	if (mycache.exclusions[event_id] != undefined) {
		var event_data = mycache.exclusions[event_id];
		timefrom = event_data.event_timefrom;
		timetill = event_data.event_timetill;
	} else {
		var event_data = mycache.ids[real_event.id];
		if (real_event.repeat != 0) {
			var repeat_data = mycache.repeats[event_id];
			timefrom = repeat_data.event_timefrom;
			timetill = repeat_data.event_timetill;
		} else {
			timefrom = event_data.event_timefrom;
			timetill = event_data.event_timetill;
		};
	};

	var tf_hours = getDateParams(timefrom, false, new Array('FH'));
	var tt_hours = getDateParams(timetill, true, new Array('FH'));
	var allday = (event_data.event_allday == "1");

	var basedom = 'container_' + event_data.calendar_id + (allday?'_1':'_2');
	var arrindex = -1;
	if (allday) { 
		arrindex = 0;
		if (to8(timefrom) < my8) arrindex += 1;
		if (to8(timetill) > my8) arrindex += 2; 
		var divTop = 0;
		var divHeight = '3.9ex';
	} else {
		var divTop = (9*tf_hours.fh)+'ex';
		var divHeight = (9*(tt_hours.fh-tf_hours.fh)-0.6)+'ex';
	};
	ddr[0]={dom:basedom, arrindex:arrindex, divWidth:100, divHeight:divHeight, divLeft:0, divTop:divTop, divOff:0};
	return(ddr);
}

function render_calc_month_single(event_id) {
	var real_event = split_event_id(event_id);
	var timefrom, timetill;
	if (mycache.exclusions[event_id] != undefined) {
		var event_data = mycache.exclusions[event_id];
		timefrom = event_data.event_timefrom;
		timetill = event_data.event_timetill;
	} else {
		var event_data = mycache.ids[real_event.id];
		if (real_event.repeat != 0) {
			var repeat_data = mycache.repeats[event_id];
			timefrom = repeat_data.event_timefrom;
			timetill = repeat_data.event_timetill;
		} else {
			timefrom = event_data.event_timefrom;
			timetill = event_data.event_timetill;
		};
	};

	var thisMonth = timefrom.getMonth();
	var thisYear = timefrom.getFullYear();
	var monthFrom = monthLimits[thisYear][thisMonth].bigStart;
	var monthTill = monthLimits[thisYear][thisMonth].bigEnd;
	var monthFrom8 = to8(monthFrom);
	var monthTill8 = to8(monthTill);

	var params_arr1 = new Array('FH', 'WEEK');
	var df = getDateParams(monthFrom, false, params_arr1);
	df.to8 = monthFrom8;
	var dt = getDateParams(monthTill, false, params_arr1);
	dt.to8 = monthTill8;

	var params_arr = new Array('FH', 'WEEK', 'TO8');
	var tf = getDateParams(timefrom, false, params_arr);
	var tt = getDateParams(timetill, true, params_arr);

	var allday = (event_data.event_allday == "1"); 
	var basedom = "container_"+event_data.calendar_id+'_5';

	var ddr = new Array();
	var colum = Math.round(range8(monthFrom8,tf.to8)%7);
	if (allday) {
		var arrindex = 0;
		var ind = 0;
		var t8;
		if (timetill > monthTill) {
			tt = dt;
			arrindex+=2;
		};
		var colum = Math.round(range8(monthFrom8,tf.to8)%7);
		var dcur = tf.to8;
		var dfin = tt.to8;
		var decont = true;
		do {
			var dwid = 7-colum;
			var dmov = move8(dcur,dwid-1);
			if (dmov>dfin) {
				dwid=1+range8(dcur,dfin);
				dmov = dfin;
			};
			var divLeft = (100/7)*colum;
			var divWidth = dwid*(100/7);
			var arri = arrindex;
			if ((arrindex == 1 && dcur != df.to8) || 
				(arrindex == 2 && dmov != dt.to8) || 
				(arrindex == 3 && (dmov != dt.to8 || dcur != df.to8))
			) arri=0;
			
			ddr[ind] = {dom:basedom, arrindex:arri, divWidth:divWidth, divHeight:"3.9ex", divLeft:divLeft, divTop:0, divOff:0, days:dwid};
			ind++;
			colum = 0;
			dcur = move8(dcur,dwid);
			//if (dcur > dfin || dcur > showLimits.monthTill) decont = false;
			if (dcur > dfin || dcur > monthTill8) decont = false;
		} while (decont);
	} else {
		var divLeft = (100/7)*colum;
		var divWidth = 100/7;
		ddr[0] = {dom:basedom, arrindex:-1, divWidth:divWidth, divHeight:"3.9ex", divLeft:divLeft, divTop:0, divOff:0, days:1};
	};
	return ddr;
}

function amcros(h,z) {
	var A1=h.st;
	var A2=h.en;
	var B1=z.st;
	var B2=z.en;
	var rval = ( ((A1>=B1)&&(A1<=B2)) || ((A2>=B1)&&(A2<=B2)) || ((B1>=A1)&&(B1<=A2)) || ((B2>=A1)&&(B2<=A2)) );
	return rval;
}

function getNumberOfColor(color_id)
{
	color_id = Number(color_id);
	var calendar_color;
	switch (color_id) {
		case (1):
			calendar_color = "#ef9554";
			break;
		case (2):
			calendar_color = "#f58787";
			break;
		case (3):
			calendar_color = "#6fd0ce"; 
			break;
		case (4):
			calendar_color = "#90bbe0";
			break;
		case (5):
			calendar_color = "#baa2f3";
			break;
		case (6):
			calendar_color = "#f68bcd";
			break;
		case (7):
			calendar_color = "#d987da";
			break;
		case (8):
			calendar_color = "#4affb8";
			break;
		case (9):
			calendar_color = "#9f9fff";
			break;
		case (10):
			calendar_color = "#5cc9c9";
			break;
		case (11):
			calendar_color = "#76cb76";
			break;
		case (12):
			calendar_color = "#aec9c9";
			break;
		case (15):
			calendar_color = "#797979";
			break;
		default:
			calendar_color = "#ef9554";
			break;
	};
	return calendar_color;
}

function tmove(arr, i, mcol) {
	var arr_len = arr.length;
	var mallow = true;
	var mdata = new Array();
	var mcoun = 0;
	var colide = true;
	var gi = arr[i];
	var col = gi.col;
	var wid = gi.wid;
	if ((col+wid) > mcol) 
		mallow = false;
	else {
		colide = false;
		for (var j=0; j<arr_len; j++) {
			var gj = arr[j]; 
			if ((i!=j) && (gj.col == (col+wid)) && (tcross(gi,gj))) colide = true;
		};
		for (var j=0; j<arr_len; j++) {
			var gj = arr[j];
			var cj = gj.col;
			var wj = gj.wid;
			if ((i==j) || (cj<=col) || (!tcross(gi,gj))) continue;
			if ((cj+wj)>mcol) {
				var mallow=false;
				break;
			};
			var ca = tmove(arr, j, mcol);
			if  (!ca.allow) {
				var mallow = false;
				break;
			};
			mdata[mcoun]=j;
			mcoun++;
		}
	};
	return { colide: colide, allow: mallow, data: mdata, count: mcoun};
}

/*
* @param obj - event_object
* return length of current event in hours
*/
function getEventLenInHours(obj) {
	var hours_from = getDateParams(obj['event_timefrom'], false, new Array('FH'));
	var hours_till = getDateParams(obj['event_timetill'], true, new Array('FH'));
	return (hours_till.fh - hours_from.fh);
}

function tcross(objA,objB) {
	var A1obj = getDateParams(objA.data['event_timefrom'], false, new Array('FH'));
	var A1 = A1obj.fh;
	var A2obj = getDateParams(objA.data['event_timetill'], true, new Array('FH'));
	var A2 = A2obj.fh;

	var B1obj = getDateParams(objB.data['event_timefrom'], false, new Array('FH'));
	var B1 = B1obj.fh;
	var B2obj = getDateParams(objB.data['event_timetill'], true, new Array('FH'));
	var B2 = B2obj.fh;
	return ( ((A1>=B1)&&(A2<=B2)) || ((B1>=A1)&&(B2<=A2)) || ((B1>A1)&&(B1<A2)) || ((B2>A1)&&(B2<A2)) || ((A1>B1)&&(A1<B2)) || ((A2>B1)&&(A2<B2)) );
}

function tsort(arr) {
	var len = arr.length;
	for (var i=0; i<(len-1); i++) {
		for (var j=(i+1); j<len; j++) { 
			if (arr[i].len < arr[j].len) {
				var buf = arr[j]; 
				arr[j] = arr[i];
				arr[i] = buf;
			}
		}
	};
	return arr;
}
/* cut end */

function atcalc(obj) {
	var st = to8(obj['event_timefrom']);
	var en = to8(obj['event_timetill']);
	var le = 1+range8(st,en);
	return {len:le, start:st, end:en};
}


/*
	monthLimits[year][month] = {
		smallStart
		smallEnd
		bigStart
		bigEnd
	}
*/
function getLimits(date) {
	var weekstartson = setcache['weekstartson']; //6 1 0 any
	var add_days = new Array(), week_num = new Array();
	var year = date.getFullYear();
	var current_month = date.getMonth();
	var current_day = date.getDay();

	add_days[weekstartson] = 0;
	for (var j=weekstartson+1; j<7; j++) {
		add_days[j] = add_days[j-1] + 1;
	};
	for (var k = 0; k<weekstartson; k++) {
		add_days[k] = add_days[j-1] + 1*(k+1);//k+1;
	};

	var loadYears = new Array();
	loadYears[0] = year;
	if (current_month == 0) {
		loadYears.push(year-1);
	};
	if (current_month == 11) {
		loadYears.push(year+1);
	};

	for (var i=0; i<loadYears.length; i++) {
		var year_add = loadYears[i];
		if (monthLimits[year_add] == undefined) {
			monthLimits[year_add] = new Array();
			for (var month=0; month<12; month++){
				var firstDate = new Date(year_add, month, 1, 12 , 0, 0);
				var firstDay = firstDate.getDay();
				var lastDate = new Date(year_add, month+1, 0, 12 , 0, 0);
				var lastDay = lastDate.getDay();

				var days_num = GetDaysInMonth(month+1, year_add);
				week_num[month] = Math.ceil((days_num + add_days[firstDay])/7);

				monthLimits[year_add][month] = {};
				if (week_num[month] == 6) {
					var startDate = new Date(firstDate.getTime() - add_days[firstDay]*86400000);
					monthLimits[year_add][month].smallStart = startDate; //from top
					monthLimits[year_add][month].bigStart = startDate; // from top
				} else if (week_num[month] == 5) {
					monthLimits[year_add][month].smallStart =  new Date(firstDate.getTime() - add_days[firstDay]*86400000);  //1 off top
					monthLimits[year_add][month].bigStart =  new Date(firstDate.getTime() - (7 + add_days[firstDay])*86400000); // 1 off top
				} else {//4
					monthLimits[year_add][month].smallStart = new Date(firstDate.getTime() - add_days[firstDay]*86400000); //2 off top
					monthLimits[year_add][month].bigStart = new Date(firstDate.getTime() - (14 + add_days[firstDay])*86400000);; // 1 off top
				};
				monthLimits[year_add][month].smallEnd = new Date(lastDate.getTime() + (6 - add_days[lastDay])*86400000);
				monthLimits[year_add][month].bigEnd = new Date(lastDate.getTime() + (6 - add_days[lastDay] + 7)*86400000);
			};
		};
	};

	if (date == mydate) {
		showLimits = {
			day : to8(mydate),
			weekFrom : to8(new Date(year, current_month, (mydate.getDate() - add_days[current_day]))),
			weekTill : to8(new Date(year, current_month, (mydate.getDate() + 6 - add_days[current_day]))),
			monthFrom : to8(monthLimits[year][current_month].bigStart),
			monthTill : to8(monthLimits[year][current_month].smallEnd)
		};
	};
}

function fillEvents() {
	calendarsContainersClear();
	cacheLoad(mydate);
	buildEvents();
	if (mycache.days == null) return;
	render_day('BOTH');
	render_week('BOTH');
	setWorkAreaOffset();
	$("allspan").onclick = function(e) { hidefetch(); };
	RecalcScrollArrows();
	ReRenderMonthly();
}
function renderScreens(render_dates) {
	if (render_dates == undefined) return;
	var section;
	var date = new Array();
	var allowDay = false;
	var allowWeek = false;
	var allday_section_d = false, allday_section_w = false;
	var common_section_d = false, common_section_w = false;
	for (var i in render_dates.allday) {
		if (render_dates.allday[i] == showLimits.day) {
			allowDay = true;
			allday_section_d = true;
		};
		if ((render_dates.allday[i] < showLimits.weekTill) && (render_dates.allday[i] > showLimits.weekFrom)) {
			allowWeek = true;
			allday_section_w = true;
		};
		if (allday_section_d && allday_section_w) break;
	};
	for (var i in render_dates.common) {
		if (render_dates.common[i] == showLimits.day) {
			allowDay = true;
			common_section_d = true;
		};
		if ((render_dates.common[i] >= showLimits.weekFrom) && (render_dates.common[i] <= showLimits.weekTill)) {
			allowWeek = true;
			common_section_w = true;
		};
		if (common_section_d && common_section_w) break;
	};

	if (common_section_d && allday_section_d) {
		section = 'BOTH';
	} else if (allday_section_d) {
		section = 'ALLADAY';
	} else {
		section = 'COMMON';
	};
	if (allowDay) render_day(section);
	if (common_section_w && allday_section_w) {
		section = 'BOTH';
	} else if (allday_section_w) {
		section = 'ALLADAY';
	} else {
		section = 'COMMON';
	};
	if (allowWeek) {
		if (section == 'COMMON' || section == 'BOTH') {
			render_week(section, render_dates.common);
		} else {
			render_week(section);
		}
	};

	RecalcScrollArrows();
	ReRenderMonthly();
	calendarInManager.RefreshCalendarSelector(mydate.getDate(), mydate.getMonth()+1, mydate.getFullYear());
}

function render_day(section) {
	var arr = createAllEventsArray(section, showLimits.day);
	reRenderCommonSection(arr.common, 0);
	reRenderAlldaySection(arr.allday, 0);
}
/*
* @param render_allday_section - string 
ALLDAY - allow render allday section,
COMMON - render common section only
BOTH - render both sections
* @param render_common_days - optional array of dates in format yyyy-mm-dd
*/
function render_week(section, common_days_arr) {
	var week_days = new Array();
	if (section != 'COMMON') {
		var week_cur = showLimits.weekFrom;
		var week_till = showLimits.weekTill;
		while (week_cur <= week_till) {
			week_days.push(week_cur);
			week_cur = move8(week_cur,1);
		};
	} else {
		week_days = common_days_arr;
	};

	var alldays = new Array();
	for (var i=0; i<week_days.length; i++) {
		var arr = createAllEventsArray(section, week_days[i]);
		if (section == 'BOTH' && common_days_arr != undefined) {
			for (var j=0; j<common_days_arr.length; j++) {
				if (common_days_arr[j] == week_days[i]) {
					reRenderCommonSection(arr.common, 1);
					break;
				}
			};
		} else {
			reRenderCommonSection(arr.common, 1);
		};
		if (section != 'COMMON') {
			if (alldays.length == 0) {
				alldays = arr.allday;
			} else {
				for (var j in arr.allday) {
					var allow_add = false;
					if (alldays.length == 0) {
						alldays = arr.allday;
						break;
					} else {
						for (var k in alldays) {
							if (arr.allday[j].event_id == alldays[k].event_id) {
								allow_add = true;
								break;
							}
						};
						if (!allow_add) alldays.push(arr.allday[j]);
					}
				}
			};
		};
	};
	if (section != 'COMMON') reRenderAlldaySection(alldays, 1);
}
function render_month() {
	var startDay = showLimits.monthFrom;
	var endDay = showLimits.monthTill;
	while (startDay <= endDay) {
		if (mycache.days[startDay] != undefined) {
			for (var i in mycache.days[startDay]) {
				render_event(mycache.days[startDay][i], 2);
			}
		};
		startDay = move8(startDay,1);
	}
}

function createAllEventsArray(section, this_day) {
	var cacheDays = mycache.days;
	var cacheIds = mycache.ids;
	this_day = Number(this_day);
	var common_section = new Array();
	var allday_section = new Array();

	if (cacheDays[this_day] != undefined) {
		var commondaysNum = 0;
		var alldaysNum = 0;
		var allday_exist = new Array();
		var event_allday = 0, eventData = {};

		for (var j in cacheDays[this_day]) {
			var event_id = String(cacheDays[this_day][j]);
			var real_event = split_event_id(event_id);

			if (cacheIds[real_event.id]["event_repeats"] == 1 && mycache.repeats[event_id] != undefined) {
				if (mycache.exclusions[event_id] != undefined) {
					eventData = mycache.exclusions[event_id];
					event_allday = mycache.exclusions[event_id]['event_allday'];
				} else {
					eventData = mycache.repeats[event_id];
					event_allday = cacheIds[real_event.id]['event_allday'];
				}
			} else {
				eventData = cacheIds[real_event.id];
				event_allday = eventData['event_allday'];
			};

			if (event_allday == '1') {
				if (section != 'COMMON' && allday_exist[event_id] == undefined) {
					var atc = atcalc(eventData);
					allday_section[alldaysNum] = {len:atc.len, st:atc.start, en:atc.end, col:1, event_id:event_id};
					allday_exist[event_id] = true;
					alldaysNum++;
				}
			} else {
				if (section != 'ALLDAY') {
					var len = getEventLenInHours(eventData);
					common_section[commondaysNum] = {len:len, wid:1, data:eventData, event_id:event_id};
					commondaysNum++;
				}
			}
		}; // выбираем все события приходящиеся на данный день и формируем из них новый массив. Все события с флогом allday = 0
	};
	return {common:common_section, allday:allday_section};
}

function reRenderCommonSection(arr, mode) {
	var daysInPeriod = (mode == 0) ? 1 : 7;
	var eventPosCache = (mode == 0) ? mycache.d : mycache.w;
//рассчитаем параметры событий для common секции
	var len = arr.length;
	if (len > 0) {
		arr = tsort(arr);
		var mcol = 1;
		var col;
		for (var i=0; i<len; i++) {
			col=1;
			for (var j=0; j<i; j++) {
				if (tcross(arr[j], arr[i]) && (arr[j].col >= col)) {
					col = 1 + arr[j].col;
					if (col>mcol) mcol = col;
				}
			};
			arr[i].col = col;
		};// вычисляет вертикальную колонку в которой будет стоять событие

		do {
			var gone = false;
			for (var i=0; i<len; i++) { 
				var movd = tmove(arr, i, mcol); 
				if (movd.allow || !movd.colide) {
					gone = true;
					arr[i].wid = arr[i].wid + 1;
					for (var j=0; j<movd.count; j++) {
						var jk = movd.data[j];
						arr[jk].col = arr[jk].col + 1;
					}
				}
			}
		} while (gone);

		for (var i=0; i<len; i++) {
			var event_id_i = arr[i].event_id;
			if (eventPosCache[event_id_i] != undefined) {
				var mycj = eventPosCache[event_id_i][0];
				var width = arr[i].wid * (mycj.divWidth/mcol);
				var ofs = (arr[i].col - 1) * (100/daysInPeriod/mcol);
				var left = ofs + mycj.divLeft;
				var event_id = $('event_'+event_id_i+'_0_'+mode+'_0');
				if (event_id != undefined) {
					event_id.style.width = width+'%';
					event_id.style.left = left+'%';
				}
			}
		}// рассчитать значения ширины и смещения от начала колонки события 
	};//end if len>0
}

function reRenderAlldaySection(arr, mode) {
	var daysInPeriod = (mode == 0) ? 1 : 7;
	var allday_rows = 1; // number of allday events in allday section located one under another
	len = arr.length;
	if (len > 0) {
		arr = tsort(arr);
		for (var i=0; i<len; i++) {
			var prev_param = arr[i];
			var hcol = 1;
			var passed = false;
			while (!passed) {
				for (var j=0; j<i; j++) {
					var next_param = arr[j];
					if ((hcol == next_param.col) && amcros(prev_param, next_param)) { hcol++; continue; }
				};
				passed=true;
			};
			arr[i].col = hcol;
			if (hcol > allday_rows) allday_rows = hcol;
			var offsetTop = 27*(hcol-1);
			var ev_id = arr[i].event_id;
			var event_id = $('event_'+ev_id+'_0_'+mode+'_1');
			if (event_id != undefined) {
				event_id.style.top = offsetTop+'px';
			}
		};
	};
	var mainbody_height = parseToNumber($("mainbody").offsetHeight) - (MSIEDetect() ? 0 : 1);
	var halfhigh = Math.floor(mainbody_height/2)-10;
	var minhigh = 53; // 2*27=54 ???
	var allday_section_height = 8 + allday_rows*27; //8-number of free pixels in allday section independently of allday events number 27-standart height of allday event
	if (allday_section_height < minhigh) allday_section_height = minhigh;
	var vwin = (allday_section_height > halfhigh) ? halfhigh : allday_section_height;

	$("grid_1"+((mode==1)?"w":"d")).style.height = allday_section_height+"px";
	$("current_day_1").style.height = allday_section_height+"px";
	var weekend1 = $("weekend_1_0");
	var weekend2 = $("weekend_1_6");
	//var topsection_height = weekend1.parentNode.style.height;
	//topsection_height = (topsection_height == undefined || !isNaN(topsection_height)) ? "100%" : topsection_height;
	//weekend_1.style.height = topsection_height; 
	if (weekend1 != undefined) weekend1.style.height = allday_section_height+"px";
	if (weekend2 != undefined)  weekend2.style.height = allday_section_height+"px";
	$("area_1_"+((mode==1)?"week":"day")).style.height = vwin+"px";
	var dayheaders = $("day_headers_"+((mode==1)?"week":"day")).offsetHeight;
	//$("area_2_"+((mode==1)?"week":"day")).style.height = (mainbody_height-28-vwin)+"px";
	$("area_2_"+((mode==1)?"week":"day")).style.height = (mainbody_height-dayheaders - 3 -vwin)+"px";
}

function setWorkAreaOffset() {
	if (typeof(area) != "undefined") {
		WorkAreaOffsetLeft = findPosX(area); //areaX
		WorkAreaOffsetTop = findPosY(area);  //areaY
	}
}

function scrollArea()
{
	if (view == WEEK) var par = 'week';
	if (view == DAY) var par = 'day';
	if (view != MONTH){
		var obj = $('area_2_' + par);
		var events = Traverse(obj, "event");
		var val = getEventsPos(events); 
		if (val.minEv > (setcache['workdaystarts']*54) || val.minEv == -1){
			obj.scrollTop = setcache['workdaystarts']*54;
		}else{
			obj.scrollTop = val.minEv;
		}
	}
}

function Traverse(item, className)
{
	var res = new Array();
	var resCnt = 0;

	for (var it = item.firstChild;it;it = it.nextSibling) {
		if (it.className == className){
			res[resCnt++] = it;
		};
		var res1 = Traverse(it, className);
		var it1;
		for(var i = 0; it1 = res1[i]; i++){
			res[resCnt++] = it1;
		}
	};
	return res;
}

function getEventsPos(events)
{
	var minEventPos2 = -1;
	var maxEventPos2 = 0;
	var event;
	for (var i = 0; event = events[i]; i++) {
		var top = event.offsetTop;
		var bottom = top + event.offsetHeight;
		if (maxEventPos2 < bottom)
			maxEventPos2 = bottom;
		if (minEventPos2 > top || minEventPos2 == -1)
			minEventPos2 = top;
	};
	return {minEv:minEventPos2, maxEv:maxEventPos2}
}

function ShowArrows(arrowUp, arrowDown, obj, e)
{
	var top = obj.scrollTop;
	var bottom = top + obj.offsetHeight;
	var w = maxEventPos;
	var v = minEventPos;

	if (navigator.userAgent.indexOf("MSIE") < 0) {
		arrowUp = $('arrow_layer_week_'+e).childNodes[1];
		arrowDown = $('arrow_layer_week_'+e).childNodes[3];
	} else {
		arrowUp = $('arrow_layer_week_'+e).childNodes[0];
		arrowDown = $('arrow_layer_week_'+e).childNodes[1];
	};
	arrowUp.onclick = function() {scrollArrowUp(v)};
	arrowDown.onclick = function() {scrollArrowDown(w)};

	arrowDown.style.display = bottom < w? 'block' : 'none';

	if (top > v && v!=(-1))
		arrowUp.style.display = 'block';
	else
		arrowUp.style.display = 'none';
}

function eventsInDay(events, left)
{
	var event;
	var res = new Array();
	var resCnt = 0;
	var lef = Math.floor(left - 14.2857);
	left = Math.floor(left);
	for (var i = 0; event = events[i]; i++)
	{
		var even_left = Math.floor(event.style.left.substring(0, event.style.left.length-1));
		if (lef <=even_left && even_left < left) res[resCnt++] = event;
	};

	return res;
}

function ShowScrollArrows()
{
	if(view == WEEK) var par = 'week';
	if(view == DAY) var par = 'day';
	var area = $('area_2_' + par);
	var arrow_up = $('arrow_up_' + par);
	var arrow_down = $('arrow_down_' + par);
	var arrow_layer = new Array();

	if(view == DAY)
	{
		if (eventsChanged)
		{
			var vl = 14.2857;
			var events = Traverse(area, "event");
			var val = getEventsPos(events);
			maxEventPos = val.maxEv;
			minEventPos = val.minEv;

			eventsChanged = false;

			arrow_up.onclick = function() {scrollArrowUp(minEventPos)};
			arrow_down.onclick = function() {scrollArrowDown(maxEventPos)};	
		};

		var top = area.scrollTop;
		var bottom = top + area.offsetHeight;

		arrow_down.style.display = bottom < maxEventPos ? 'block' : 'none';
		arrow_up.style.display = (top > minEventPos && minEventPos!=(-1)) ? 'block' : 'none';
		arrow_layer[1]	= $('arrow_layer_day');
	};
	if(view == WEEK)
	{
		if (eventsChanged)
		{
			var vl = 14.2857;
			var events = Traverse(area, "event");
			for(var e = 1; e < 8; e++)
			{
				masEvents[e] = eventsInDay(events, vl);
				vl += 14.2857;
			};
			eventsChanged = false;
		};
		for(var e = 1; e < 8; e++)
		{
			var val = getEventsPos(masEvents[e]);
			maxEventPos = val.maxEv;
			minEventPos = val.minEv;
			ShowArrows(arrow_up, arrow_down, area, e);
		};
		for(var i = 1; i<8; i++) arrow_layer[i] = $('arrow_layer_week_'+i);
	};
	if (arrow_layer !== null && arrow_layer.length!=0) {
		for (var i = 1; resCntArrow = arrow_layer[i]; i++){
			resCntArrow.style.height = area.clientHeight + 'px';
		};
	};
}

function RecalcScrollArrows()
{
	eventsChanged = true;
	ShowScrollArrows();
}

function findPosX(obj) {
	var currleft = 0; 
	if (obj.offsetParent) {
		while (obj.offsetParent) {      
			currleft += obj.offsetLeft;
			obj = obj.offsetParent;
		}
	} else if (obj.x) currleft += obj.x;
	return currleft;
}

function findPosY(obj) {
	var currtop = 0;
	if (obj.offsetParent)
		while (obj.offsetParent) {
			currtop += obj.offsetTop;
			obj = obj.offsetParent;
	}
	else if (obj.y) currtop += obj.y;
	return currtop;
}

function areaChoice(numb)
{
	switch(numb)
	{
		case (1):
		  area = $('grid_2d');
		  break;
		case (2):
		  area = $('grid_2w');
		  break;
		case (3):
		  area = $('grid_2_month');
		  break;
		default: 
		  area = $('grid_2w');
	};
	var divSelectArea = $("divCheckPanel");
	if (divSelectArea != undefined)
	{
		divSelectArea.parentNode.removeChild(divSelectArea);
	};
	area.resizing = false;
	if (calendarType == CALENDAR_MAIN) area.onmouseover = getCoords;
	SetMainDivHeight();
	scrollArea();
	RecalcScrollArrows();
}

function getFirstDayWeek(firstdayDate)
{
	var now1 = new Date(firstdayDate);
	var d1 = new Date(firstdayDate);
	if (setcache['weekstartson'] == 0) {
		d1.setDate(now1.getDate() - now1.getDay());
	} else { //setcache['weekstartson'] == 1
		d1.setDate(now1.getDate() - now1.getDay() + 1);
	};
	return d1;
}

function getLastDayWeek(lastdayDate)
{
	var now2 = new Date(lastdayDate);
	var d1 = new Date(lastdayDate);
	if (setcache['weekstartson']==0) {
		d1.setDate(now2.getDate() - now2.getDay());
	} else {//setcache['weekstartson']==1
		d1.setDate(now2.getDate() - now2.getDay() + 1); 
	};
	var d2 = new Date(d1);
	d2.setDate(d1.getDate() + 6);
	return d2;
}

function DaysDiff(D1, D2) {
	return Math.round((D1-D2)/864e5);
}

function getFirstLastDayInMonthView(date)
{
	var d = new Date(getFirstDayWeek(date));
	var days_in_month = GetDaysInMonth(date.getMonth()+1, date.getYear());
	var lastdayDate = new Date(date.getFullYear(),date.getMonth(),days_in_month); //last day of month
	var ld = new Date(getLastDayWeek(lastdayDate));
	var num_week = (DaysDiff(ld, d)+1)/7;

	if(num_week == 5){
		d.setDate(d.getDate() - 7);
	} else if (num_week == 4) {
		d.setDate(d.getDate() - 14);
		ld.setDate(ld.getDate());
	};
	return new Array(d, ld);
}
/*
 * Based on json.js (2007-07-03)
 * Modified by AfterLogic Corporation
 */
String.prototype.parseJSON = function (filter) {
	var j;

	function walk(k, v) {
		var i;
		if (v && typeof v === 'object') {
			for (i in v) {
				if (v.hasOwnProperty(i)) {
					v[i] = walk(i, v[i]);
				}
			}
		};
		return filter(k, v);
	}

	if (/^[,:{}\[\]0-9.\-+Eaeflnr-u \n\r\t]+$/.test(this.
		replace(/\\./g, '@').
		replace(/"[^"\\\n\r]*"/g, ''))) {
			j = eval('(' + this + ')');
			if (typeof filter === 'function') {
				j = walk('', j);
			};
			return j;
	};

	return false;
};
