var blnMSIE = (window.navigator.userAgent.indexOf("MSIE")>=1) && (typeof(window.opera) == 'undefined');
var divCalendar, frmCalendar, calendar_target, calendar_hours, calendar_minutes, calendar_pm, calendar_timeenabled, calendar_today;
var divTime, frmTime;
var frmTaskListReloader;
var serverTimeOut;


// Функции отвечающие за календарь
function saveAndExit(datetime, str_target){ 
var m;
var d;
var y;
var h;

		m = datetime.getMonth() + 1;
		if (m.toString().length < 2) m = "0" + m;
		d = datetime.getDate();
		if (d.toString().length < 2) d = "0" + d;
		y = datetime.getFullYear();
		document.getElementById(str_target).value = d + "."+ m + "." + y;
	
	HideCalendar();
}

function dt2dtstr (dt_datetime) {
	return (new String (
			dt_datetime.getDate()+"-"+(dt_datetime.getMonth()+1)+"-"+dt_datetime.getFullYear()));
}

// datetime parsing and formatting routimes. modify them if you wish other datetime format
function str2dt (str_datetime) {
	var re_date = /^(\d+)\-(\d+)\-(\d+)$/;
	if (!re_date.exec(str_datetime))
		return (new Date ());
	return (new Date (RegExp.$3, RegExp.$2-1, RegExp.$1));
}

function date4target(str_target) {
  var d1, d2, d3;
  d1 = document.getElementById(str_target);
  d2 = document.getElementById(str_target+'D2');
  d3 = document.getElementById(str_target+'D3')
  if (d1 != null && d2 != null && d3 != null) {
  	return (d2.value + '-' + d1.value + '-' + d3.value );
  }
  else if (d1 != null && d2 == null && d3 != null) {
  	return ('1-' + d1.value + '-' + d3.value );
  }
  else {
		return (dt2dtstr((new Date())));
  }
}

function show_calendar2(str_target) {
	if (divCalendar != null && divCalendar.style.display != "none" && str_target == calendar_target)
		HideCalendar();
	else
		ShowCalendar(str_target+"_btnDat", str_target);//, date4target(str_target));
};

function draw_calendar(str_target, str_datetime) {

	var aryDateTime;
	var arr_months = ["January", "February", "March", "April", "May", "June",
		"July", "August", "September", "October", "November", "December"];
	var week_days = ["Sun", "Mon", "Tue", "Wed", "Thu", "Fri", "Sat"];
	var n_weekstart = 1; // day week starts from (normally 0 or 1)
	

	if (str_datetime == null)
	{	
	aryDateTime = retrieveDate(document.getElementById(str_target).value);

		if (! aryDateTime[0])
		{var dt_datetime = new Date();
		}
		else
		{	
			if (aryDateTime[1] == -1)
			{
				var dt_datetime = new Date();
			}
			else
			{
				var dt_datetime = str2dt(aryDateTime[1].toString() +"-"+aryDateTime[2].toString() +"-"+ aryDateTime[3].toString());
			}	
		}
	}
	else
	{
		var dt_datetime = (str_datetime == null || str_datetime =="" ?  new Date() : str2dt(str_datetime));
	}

	var dt_prev_month = new Date(dt_datetime);

	dt_prev_month.setMonth(dt_datetime.getMonth()-1);
	var dt_next_month = new Date(dt_datetime);
	dt_next_month.setMonth(dt_datetime.getMonth()+1);
	var dt_prev_year = new Date(dt_datetime);
	dt_prev_year.setFullYear(dt_prev_year.getFullYear()-1);
	var dt_next_year = new Date(dt_datetime);
	dt_next_year.setFullYear(dt_datetime.getFullYear()+1);
	var dt_firstday = new Date(dt_datetime);
	dt_firstday.setDate(1);
	dt_firstday.setDate(1-(7+dt_firstday.getDay()-n_weekstart)%7);
	var dt_lastday = new Date(dt_next_month);
	dt_lastday.setDate(0);

  var b = (document.getElementById(str_target+"D2") != null);
	
	// html generation (feel free to tune it for your particular application)
	// print calendar header
	var str_buffer = new String (
		"<table style=\"BORDER-RIGHT: 1px outset black; BORDER-TOP:1px outset black;BORDER-LEFT: 1px outset black;BORDER-BOTTOM: 1px outset black ;\" cellpadding=\"0\" cellspacing=\"0\" width=\"100%\" height=\"100%\" ><tr><td><table style=\"BORDER-RIGHT: 1px outset white; BORDER-TOP:1px outset white;BORDER-LEFT: 1px outset white; BORDER-BOTTOM: 1px outset white ;\" cellpadding=\"0\" cellspacing=\"0\"  height=\"100%\" width=\"100%\">\n"+
		"<tr><td align=\"right\" class='CalendarTitle'><div style=\"float:left; text-transform:uppercase; font-weight:bold;\"> &nbsp;calendar</div><a href=\"javascript:HideCalendar()\"><image src=\"/img/close.gif\" border=\"0\" width=\"16\" height=\"15\" alt=\"Close\"></a></td></tr>"+
		"<tr><td class='CalendarBorder'>\n");

		str_buffer += "<table  border=\"0\" height=\"100%\" width=\"100%\">\n"+				
		"<tr>\n";
	
    str_buffer += 
		"<td align=\"right\"><a class=\"Calendar\" href=\"javascript:draw_calendar('"+
		str_target+"', '"+ dt2dtstr(dt_prev_month)+"');\">"+
		"<img src=\"/img/prev.gif\" width=\"19\" height=\"19\" border=\"0\" "+
		" alt=\"Previous month\"></a></td>\n"+
		"<td style='width:90px' class=\"CalendarHeader\" align=\"center\">"	+arr_months[dt_datetime.getMonth()] + "</td>\n"+
		"	<td  align=\"left\"><a class=\"Calendar\" href=\"javascript:draw_calendar('"
		+str_target+"', '"+dt2dtstr(dt_next_month)+"');\">"+
		"<img src=\"/img/next.gif\" width=\"19\" height=\"19\" border=\"0\""+
		" alt=\"Next month\"></a></td>\n"+

		"<td >&nbsp;&nbsp;</td>\n"+

		"<td align=\"right\"><a class=\"Calendar\" href=\"javascript:draw_calendar('"+
		str_target+"', '"+ dt2dtstr(dt_prev_year)+"');\">"+
		"<img src=\"/img/prev.gif\" width=\"19\" height=\"19\" border=\"0\""+
		" alt=\"Previous year\"></a></td>\n"+
		"<td class=\"CalendarHeader\" align=\"center\">"+dt_datetime.getFullYear()+"</td>\n"+
		"	<td  align=\"left\"><a class=\"Calendar\" href=\"javascript:draw_calendar('"
		+str_target+"', '"+dt2dtstr(dt_next_year)+"');\">"+
		"<img src=\"/img/next.gif\" width=\"19\" height=\"19\" border=\"0\""+
		" alt=\"Next year\"></a></td>\n"+

		"</tr>\n" +
		"<tr><td colspan='7'><table cellspacing='1' cellpadding='1' border='0' width='100%' height=\"100%\">";

	  var dt_current_day = new Date(dt_firstday);
	  // print weekdays titles
	  str_buffer += "<tr>\n";
	  for (var n=0; n<7; n++)
	  	str_buffer += "	<td class=\"CalendarTitle\">"+
	  	week_days[(n_weekstart+n)%7]+"</td>\n";
	  // print calendar table
	  str_buffer += "</tr>\n";
	  var rows = 0;
	  while (dt_current_day.getMonth() == dt_datetime.getMonth() ||
	  	dt_current_day.getMonth() == dt_firstday.getMonth() || (rows < 6) ) {
	  	// print row heder
	  	str_buffer += "<tr>\n";
	  	for (var n_current_wday=0; n_current_wday<7; n_current_wday++) {
	  			if (dt_current_day.getDate() == dt_datetime.getDate() &&
	  				dt_current_day.getMonth() == dt_datetime.getMonth())
	  				// print current date
						if (calendar_today)
						{
							if (dt_current_day.getDay() == 0 || dt_current_day.getDay() == 6)
								str_buffer += "	<td class=\"CalendarWeekEnd\" ";
							else
								str_buffer += "	<td class=\"CalendarBody\" ";
						}
						else
						{
							str_buffer += "	<td class=\"CalendarCurrent\" ";
						}
	 				
	  			else if (dt_current_day.getDay() == 0 || dt_current_day.getDay() == 6)
	  				// weekend days
	  				str_buffer += "	<td class=\"CalendarWeekEnd\" ";
	  			else
	  				// print working days of current month
	  				str_buffer += "	<td class=\"CalendarBody\" ";

					str_buffer += "onclick=\"javascript:calendar_today=false; saveAndExit(new Date (" + dt_current_day.getFullYear() + "," + dt_current_day.getMonth() + "," + dt_current_day.getDate() + "),'" + str_target +"');\" ";

	  			if (dt_current_day.getMonth() == dt_datetime.getMonth())
	  				// print days of current month
	  				str_buffer += " style=\"color:#000000;\" ";
	  			else 
	  				// print days of other months
	  				str_buffer += " style=\"color:#A9A9A9;\" ";
	  			
	  			str_buffer += "align=\"right\">";

	  			str_buffer += dt_current_day.getDate()+"</a></td>\n";
	  			dt_current_day.setDate(dt_current_day.getDate()+1);
	  	}
	  	// print row footer
	  	str_buffer += "</tr>\n";
	  	rows++;
	  }
	  str_buffer +=
		"</table></table>\n";
	
	str_buffer +=
		"</tr></table>\n" +
		"</td></tr></table></td></tr></table>\n" //+

	if (!blnMSIE){
		str_buffer +=
			"<INPUT id=CalendarFocusController type=text style='height:0;width:0;'/>\n"
	}
	divCalendar.innerHTML = str_buffer;
}


function ShowCalendar(strObjPos, str_target)//, str_datetime)
{ 

	if (divCalendar == null) {
		divCalendar = document.createElement('DIV');
		divCalendar.id = "divCalendar";
		divCalendar.backgroundColor = "#A9A9A9";
		divCalendar.style.display = "none";
		divCalendar.style.zIndex = 99998;
		divCalendar.style.position = "absolute";
		divCalendar.style.whiteSpace = "nowrap";
		divCalendar.width = 240;
		divCalendar.style.width = "240px";
		divCalendar.style.height = "180px";
//		divCalendar.style.border = "1px solid black";
		divCalendar.onmouseout= new Function('prepareForHideCalendar(true);');
		divCalendar.onmouseover= new Function('prepareForHideCalendar(false);');
		document.body.appendChild(divCalendar);
	}

	if (frmCalendar == null && blnMSIE) {
		frmCalendar = document.createElement("IFRAME");
		frmCalendar.id = "frmCalendar";
		frmCalendar.src="javascript:false;";
		frmCalendar.scrolling="no"; 
		frmCalendar.frameborder="0";
		frmCalendar.style.position = "absolute"; 
		frmCalendar.style.top = "0px";
		frmCalendar.style.left = "0px";
		frmCalendar.style.display = "none";
		frmCalendar.style.width = "240px";
		frmCalendar.style.height = "180px";
		document.body.appendChild(frmCalendar);
	}
	var t=0;
	var l=0;
	var state=false;
	var cNode = document.getElementById(strObjPos);
	while(cNode.tagName!='BODY'){ 
       		l+=cNode.offsetLeft; 
       		t+=cNode.offsetTop; 
       		cNode=cNode.offsetParent; 
    	}
  t++;

 	var objPos = document.getElementById(strObjPos);

	draw_calendar(str_target, null);
	divCalendar.style.top = (t+objPos.offsetHeight);
  divCalendar.style.left = l;
  divCalendar.style.display = "block";
	if ((l + divCalendar.offsetWidth) > document.body.clientWidth)
		{
			l = document.body.clientWidth - divCalendar.offsetWidth;
			divCalendar.style.left = l;
		}
	
  divCalendar.focus();

  if(blnMSIE){
  frmCalendar.style.top = (t+objPos.offsetHeight);
  frmCalendar.style.left = l;
  frmCalendar.style.width = divCalendar.style.posWidth ;
  frmCalendar.style.height = divCalendar.style.posHeight;
  frmCalendar.style.zIndex = divCalendar.style.zIndex - 1;
  frmCalendar.style.display = "block";
  frmCalendar.style.backgroundColor = "black";
  }
	calendar_target = str_target;
}

function HideCalendar()
{ 
	if (divCalendar != null) {
  	divCalendar.style.display = "none";
	}
	if (frmCalendar != null && blnMSIE ) {
	  frmCalendar.style.display = "none";
	}
}

function prepareForHideCalendar(prepare)
{ 
	if (divCalendar == null) 
		return;
	if(prepare) {
		if (blnMSIE){
		  if (divCalendar.style.display == 'none') return;
	 		divCalendar.onblur=HideCalendar;
 			divCalendar.focus();
	 	}else {
			if (document.getElementById('CalendarFocusController').style.display == 'none') return;
		 	document.getElementById('CalendarFocusController').onblur=HideCalendar;
 			document.getElementById('CalendarFocusController').focus();
	 	}
 	}else {
		if (blnMSIE){
	 		divCalendar.onblur=null;
	 	}else {
		 	document.getElementById('CalendarFocusController').onblur=null;
	 	}
 	}
}


function retrieveDate(dtString)
{
	var reDate1 = /^\s*\d{1,2}.\d{1,2}.\d{4}/;
	var reDate2 = /^\s*\d{4}-\d{1,2}-\d{1,2}/;
	var reDate3 = /^\s*\d{1,2}.\d{1,2}.\d{1,2}/;
	var retVal = new Array(false, 0, 0, 0);
									//   isdate,d,m,y
	var aryDate;									
	var strDate = "";
	var strDate2 = "";
	var aryTime;
	var strTime = "";
	var strTime2 = "";
	var chkDate;
	var tmpYear;

	dtString = dtString.toLowerCase();
	
	if (dtString == "today")
	{
		retVal[0] = true;
		retVal[1] = -1;
		return retVal;
	}
	
	// Get Date Part

	if (reDate1.test(dtString))
	{
		strDate = reDate1.exec(dtString);
		if (strDate.length != 1) return retVal;
		strDate2 = strDate[0].replace(/\s/g, "");
		aryDate = strDate2.split(".");
		retVal[1] = Number(aryDate[0]);
		retVal[2] = Number(aryDate[1]);
		retVal[3] = Number(aryDate[2]);
	}
	else
	if (reDate2.test(dtString))
	{
	  strDate = reDate2.exec(dtString);
	  if (strDate.length != 1) return retVal;
	  strDate2=strDate[0].replace(/\s/g, "");
	  aryDate = strDate2.split("-");
    retVal[3] = Number(aryDate[0]);
	  retVal[2] = Number(aryDate[1]);
	  retVal[1] = Number(aryDate[2]);
	}
	else
	if (reDate3.test(dtString))
	{
	  strDate = reDate3.exec(dtString);
	  if (strDate.length != 1) return retVal;
	  strDate2=strDate[0].replace(/\s/g, "");
	  aryDate = strDate2.split(".");
    retVal[1] = Number(aryDate[0]);
	  retVal[2] = Number(aryDate[1]);
	  retVal[3] = Number(aryDate[2]);
	  if (retVal[3] >= 30)
	    retVal[3] = retVal[3] + 1900;
	  else
	    retVal[3] = retVal[3] + 2000;
	}
	else return retVal;

	  chkDate = new Date(retVal[2].toString() + "/" + retVal[1].toString() + "/" + retVal[3].toString());
	
		if ((chkDate.getDate() != retVal[1]) || (chkDate.getMonth() + 1 != retVal[2]) || (chkDate.getFullYear() != retVal[3]))
		{
		return retVal;
		}

		dtString = dtString.slice(strDate[0].length);
		
		if (/^\s*$/.test(dtString))
		{
			retVal[0] = true; 
			return retVal;
		}
	

retVal[0] = false;
		
return retVal;
}
// End Of Календарь

// Сервисные функции

function getObj(id)
{
 return document.getElementById(id);
}


// Функции для управления списком задач

function clearTaskList()
{
 var hObj=getObj("taskList");
 var optLen = hObj.options.length;
 for(var i=0; i < optLen; i++)
 {
  hObj.remove(0);
 }
}

function addTaskList(taskId, taskName, taskDescription)
{
 var hObj=getObj("taskList");
 var optionObj = document.createElement("OPTION");
 hObj.options.add(optionObj);
 optionObj.innerHTML = taskName;
 optionObj.value = taskId;
}

function finishReloadTaskList()
{
  clearTimeout(serverTimeOut);
  document.body.style.cursor="default";
  restoreEnabledStatus();	
}

function server_TimeOut()
{
  finishReloadTaskList()
	alert("Сервер не отвечает. Попробуйте позже.")
}

function relogin()
{
	document.location = "/remote.cgi/login";
}
