function popCalendar(button,str_target, str_datetime, round) {
  if (typeof(round) == "undefined") round = 'down';
	var calendar=document.getElementById('calendar');
  if (calendar.style.visibility == 'visible') {
	  calendar.style.visibility = 'hidden';
	  return;
	}

	calendar.style.visibility = 'visible';
	
	var p = fGetXY(button);
	calendar.style.left = p[0]-155 + 'px';
	calendar.style.top = p[1] + 'px';
	show_calendar(str_target, str_datetime, round);
}

function fGetXY(aTag){
  var p=[0,0];
  while(aTag!=null){
  	p[0]+=aTag.offsetLeft;
  	p[1]+=aTag.offsetTop;
  	aTag=aTag.offsetParent;
  }
  return p;
}

function show_calendar(str_target, str_datetime, round) {

	var arr_months = ["Январь", "Февраль", "Март", "Апрель", "Май", "Июнь",
		"Июль", "Август", "Сентябрь", "Октябрь", "Ноябрь", "Декабрь"];
	var week_days = ["Вс", "Пн", "Вт", "Ср", "Чт", "Пт", "Сб"];
	var n_weekstart = 1; // day week starts from (normally 0 or 1)

	var dt_datetime = (str_datetime == null || str_datetime =="" ?  new Date() : str2dt(str_datetime+' 00:00:00'));
	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_firstday = new Date(dt_datetime);
	dt_firstday.setDate(1);
	dt_firstday.setDate(1-(7+dt_firstday.getDay()-n_weekstart)%7);
	if(round!='up'){
    var str_thatMonth = dt_datetime.getFullYear() + '-' + (dt_datetime.getMonth()+1) + '-1';
	  var str_thatYear = dt_datetime.getFullYear() + '-1-1';
	}
	else{
	  var dt_lastday = new Date(dt_datetime);
	  dt_lastday.setDate(1);
	  dt_lastday.setMonth( dt_lastday.getMonth() +1 );
	  dt_lastday.setDate(0);
    var str_thatMonth = dt_datetime.getFullYear() + '-' + /*(dt_datetime.getMonth()+1)*/(dt_lastday.getMonth()+1) + '-' + dt_lastday.getDate();
	  var str_thatYear = dt_datetime.getFullYear() + '-12-31';
  }
	
	// html generation
	var str_buffer = new String (
		"<html>\n"+
		"<head>\n"+
		"	<title>Calendar</title>\n"+
		"	<link rel=\"STYLESHEET\" type=\"text/css\" href=\"/include/cs.rstyle/css_new.css\">\n"+
		"</head>\n"+
		"<body scroll=no>\n"+
		"<table class=calendar cellspacing=\"0\" border=\"0\" width=\"100%\">\n"+
		"<tr><td colspan=2>\n"+
		"<table class=calendar cellspacing=\"0\" cellpadding=\"0\" border=\"0\" width=\"100%\">\n"+
		"<tr>\n	<td><a href=\"javascript:parent.show_calendar('"+
		str_target+"', '"+ dt2dtstr(dt_prev_month)+"','"+round+"');\">"+
		"<img src=\"/admin/images/left.gif\" width=\"22\" height=\"22\" border=\"0\""+
		" alt=\"предыдущий месяц\"></a></td>\n"+
		"	<td colspan=\"5\" align=center>"+
		
		"<a style=\"text-decoration:none\" href=\"javascript:parent."+str_target+
					".value='"+str_thatMonth+"'; parent.document.getElementById('calendar').style.visibility = 'hidden';\"><font color='black'>"+arr_months[dt_datetime.getMonth()]+"</font></a> "+
					
    "<a style=\"text-decoration:none\" href=\"javascript:parent."+str_target+
					".value='"+str_thatYear+"'; parent.document.getElementById('calendar').style.visibility = 'hidden';\"><font color='black'>"+dt_datetime.getFullYear()+"</font></a> "+
					
		"	<td align=\"right\"><a href=\"javascript:parent.show_calendar('"
		+str_target+"', '"+dt2dtstr(dt_next_month)+"','"+round+"');\">"+
		"<img src=\"/admin/images/right.gif\" width=\"22\" height=\"22\" border=\"0\""+
		" alt=\"следующий месяц\"></a></td>\n</tr></table><table class=calendar cellspacing=\"0\" cellpadding=\"1\" border=\"0\" width=\"100%\" style=\"border:2px inset white\">\n"
	);

	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 width=14% bgcolor=\"#888888\" align=center>"+
		"<font color=white>" + week_days[(n_weekstart+n)%7]+"</font></td>\n";
	// print calendar table
	str_buffer += "</tr>\n";
	while (dt_current_day.getMonth() == dt_datetime.getMonth() ||
		dt_current_day.getMonth() == dt_firstday.getMonth()) {
		// 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
					str_buffer += "	<td style=\"border: 1px inset white\" bgcolor=\"000099\" align=\"right\">";
				else if (dt_current_day.getDay() == 0 || dt_current_day.getDay() == 6)
					// weekend days
					str_buffer += "	<td bgcolor=\"#eeeeee\" align=\"right\">";
				else
					// print working days of current month
					str_buffer += "	<td bgcolor=\"white\" align=\"right\">";

					str_buffer += "<a style=\"text-decoration:none\" href=\"javascript:parent."+str_target+
					".value='"+dt2dtstr(dt_current_day)+"'; parent.document.getElementById('calendar').style.visibility = 'hidden';\">";
				if (dt_current_day.getDate() == dt_datetime.getDate() &&
					dt_current_day.getMonth() == dt_datetime.getMonth())
					// print current date
					str_buffer += "<font color=white>";					
				else if (dt_current_day.getMonth() == dt_datetime.getMonth())
					// print days of current month
					str_buffer += "<font color=black>";
				else 
					// print days of other months
					str_buffer += "<font color=gray>";
				str_buffer += dt_current_day.getDate()+"</font></a>&nbsp;</td>\n";
				dt_current_day.setDate(dt_current_day.getDate()+1);
		}
		// print row footer
		str_buffer += "</tr>\n";
	}
	// print calendar footer
	/*str_buffer +=
		"<form name=\"cal\">\n</table></td></tr><tr><td valign=middle>"+
		"<font align=right color=\"black\">"+
		"&nbsp;Время:</font></td><td valign=middle><input type=\"text\" name=\"time\" value=\""+dt2tmstr(dt_datetime)+
		"\" size=\"8\" maxlength=\"8\">\n" +
		"</td>\n</form>\n</tr>\n</table>\n" +
		"</body>\n" +
		"</html>\n";*/

	//var vWinCal = document.all.calendar; 
	/*	"width=200,height=250,status=no,resizable=yes,top=200,left=200");*/
	calendar.opener = self;
	var calc_doc = calendar.document;
	calc_doc.write (str_buffer);
	calc_doc.close();
}
// datetime parsing and formatting routimes. modify them if you wish other datetime format
function str2dt (str_datetime) {
	var re_date = /^(\d+)\-(\d+)\-(\d+)\s+(\d+)\:(\d+)\:(\d+)$/;
	if (!re_date.exec(str_datetime))
		return new Date ();
	return (new Date (RegExp.$1, RegExp.$2-1, RegExp.$3, RegExp.$4, RegExp.$5, RegExp.$6));
}
function dt2dtstr (dt_datetime) {
	return (new String (
			dt_datetime.getFullYear()+"-"+(dt_datetime.getMonth()+1)+"-"+dt_datetime.getDate()+" "));
}
function dt2tmstr (dt_datetime) {
    h = dt_datetime.getHours();
	m = dt_datetime.getMinutes();
	s = dt_datetime.getSeconds();
	if (h<10) h = '0'+h;
	if (m<10) m = '0'+m;
	if (s<10) s = '0'+s;
	return (new String (
			h+":"+m+":"+s));
}

function check_date(fld) {
    var value = fld.value;
    if (!value) return;
    var dt = value.split(" ");
    if (!dt[0]) dt[0] = '0000-00-00';
    if (!dt[1]) dt[1] = '00:00:00';
    
    var regexp = /-|\./;
    var dat =  dt[0].split(regexp);
    
    dat[0] = parseInt(dat[0])+"";
    if (!dat[0] || dat[0]=='NaN') dat[0] = '2000';
    else if (dat[0].length>3) dat[0] = dat[0].substring(0,4);
    else if (parseInt(dat[0])<50) dat[0] = (parseInt(dat[0])+2000)+"";
    else dat[0] = (parseInt(dat[0])+1900)+"";
    
    dat[1] = parseInt(dat[1])+"";
    if (!dat[1] || dat[1]=='NaN') dat[1] = '01';
    else if (parseInt(dat[1])>12) dat[1] = '12';
    else if (parseInt(dat[1])<10) dat[1] = "0"+dat[1];
    
    dat[2] = parseInt(dat[2])+"";
    if (!dat[2] || dat[2]=='NaN') dat[2] = '01';
    else if (parseInt(dat[2])>31) dat[2] = '31';
    else if (parseInt(dat[2])<10) dat[2] = "0"+dat[2];
    
    var t =  dt[1].split(":");
 
    t[0] = parseInt(t[0])+"";
    if (!t[0] || t[0]=='NaN') t[0] = '00';
    else if (parseInt(t[0])>23) t[0] = '23';
    else if (parseInt(t[0])<10) t[0] = "0"+t[0];
  
    t[1] = parseInt(t[1])+"";
    if (!t[1] || t[1]=='NaN') t[1] = '00';
    else if (parseInt(t[1])>59) t[1] = '59';
    else if (parseInt(t[1])<10) t[1] = "0"+t[1];  
    
    t[2] = parseInt(t[2])+"";
    if (!t[2] || t[2]=='NaN') t[2] = '00';
    else if (parseInt(t[2])>59) t[2] = '59';
    else if (parseInt(t[2])<10) t[2] = "0"+t[2];  
   
    fld.value = dat[0]+'-'+dat[1]+'-'+dat[2] + ' ' + t[0]+':'+t[1]+':'+t[2];
}


