var A_TCALDEF = {'months':['Январь', 'Февраль', 'Март', 'Апрель', 'Май', 'Июнь', 'Июль', 'Август', 'Сентябрь', 'Октябрь', 'Ноябрь', 'Декабрь'],'weekdays':['Вс','Пн', 'Вт', 'Ср', 'Чт', 'Пт', 'Сб'],'yearscroll':true,'weekstart':1,'centyear':70,'imgpath':'/d/window/img/'}
function f_tcalParseDate (s_date) {
	var re_date=/^\s*(\d{1,2})\.(\d{1,2})\.(\d{2,4})\s*$/;
	if(!re_date.exec(s_date))return alert ("Неправильная дата: '" + s_date + "'.\nДата должна быть в формате ДД.ММ.ГГГГ.")
	var n_day=Number(RegExp.$1),n_month=Number(RegExp.$2),n_year=Number(RegExp.$3);
	if(n_year<100)n_year+=(n_year<this.a_tpl.centyear?2000:1900);
	if(n_month<1||n_month>12)return alert("Месяц не верен: '"+n_month+"'.\nДолжно быть от 01 до 12.");
	var d_numdays=new Date(n_year,n_month,0);
	if(n_day>d_numdays.getDate())return alert("Число месяца не верно: '"+n_day+"'.\nДля выбранного месяца должно быть от 01 до "+d_numdays.getDate()+".");
	return new Date(n_year,n_month-1,n_day);
}
function f_tcalGenerDate(d_date){return((d_date.getDate()<10?'0':'')+d_date.getDate()+"."+(d_date.getMonth()<9?'0':'')+(d_date.getMonth()+1)+"."+d_date.getFullYear());}
function tcal(a_cfg,a_tpl) {
	if(!a_tpl)a_tpl=A_TCALDEF;
	if(!window.A_TCALS)window.A_TCALS=[];
	if(!window.A_TCALSIDX)window.A_TCALSIDX=[];
	this.s_id=a_cfg.id?a_cfg.id:A_TCALS.length;
	window.A_TCALS[this.s_id]=this;
	window.A_TCALSIDX[window.A_TCALSIDX.length]=this;
	this.f_show=f_tcalShow;
	this.f_hide=f_tcalHide;
	this.f_toggle=f_tcalToggle;
	this.f_update=f_tcalUpdate;
	this.f_relDate=f_tcalRelDate;
	this.f_parseDate=f_tcalParseDate;
	this.f_generDate=f_tcalGenerDate;
	this.s_iconId='tcalico_'+this.s_id;
	this.e_icon=f_getElement(this.s_iconId);
	this.a_cfg=a_cfg;
	this.a_tpl=a_tpl;

	if(!this.a_cfg.controlname)throw("TC: control name is not specified");
	if(this.a_cfg.formname) {
		var e_form=document.forms[this.a_cfg.formname];
		if(!e_form)throw("TC: form '"+this.a_cfg.formname+"' can not be found");
		this.e_input=e_form.elements[this.a_cfg.controlname];
	}
	else this.e_input=f_getElement(this.a_cfg.controlname);
	if(!this.e_input||!this.e_input.tagName||this.e_input.tagName!='INPUT')throw("TC: element '"+this.a_cfg.controlname+"' does not exist in "+(this.a_cfg.formname?"form '"+this.a_cfg.controlname+"'":'this document'));

	if(!this.e_icon) {
		document.write('<input type="button" value="&#9660;" id="' + this.s_iconId + '" onclick="A_TCALS[\'' + this.s_id + '\'].f_toggle()" class="tcalIcon" title="Открыть календарь" />');
		this.e_icon=f_getElement(this.s_iconId);
		var h=this.e_input.offsetHeight;
		if(h>0){this.e_icon.style.width=h+'px';	this.e_icon.style.height=h+'px';}
	}
}
function f_tcalShow(d_date){
	this.e_div=f_getElement('tcal');
	if(!this.e_div){
		this.e_div=document.createElement("DIV");
		this.e_div.id='tcal';
		document.body.appendChild(this.e_div);
	}
	this.e_iframe =  f_getElement('tcalIF')
	if(b_ieFix&&!this.e_iframe){
		this.e_iframe=document.createElement("IFRAME");
		this.e_iframe.style.filter='alpha(opacity=0)';
		this.e_iframe.id='tcalIF';
		this.e_iframe.src=this.a_tpl.imgpath + '0.gif';
		document.body.appendChild(this.e_iframe);
	}
	f_tcalHideAll();
	this.e_icon=f_getElement(this.s_iconId);
	if(!this.f_update())return;
	this.e_div.style.visibility='visible';
	if(this.e_iframe)this.e_iframe.style.visibility='visible';
	this.e_icon.value='\u00d7';
	this.e_icon.title='Закрыть календарь';
	this.b_visible=true;
}
function f_tcalHide(n_date){
	if(n_date)this.e_input.value=this.f_generDate(new Date(n_date));
	if(!this.b_visible)return;
	if(this.e_iframe)this.e_iframe.style.visibility='hidden';
	this.e_div.style.visibility='hidden';
	this.e_icon=f_getElement(this.s_iconId);
	this.e_icon.value='\u25bc';
	this.e_icon.title='Открыть календарь';
	this.b_visible=false;
}
function f_tcalToggle(){return this.b_visible?this.f_hide():this.f_show()}
function f_tcalUpdate (d_date) {
	var d_today=this.a_cfg.today?this.f_parseDate(this.a_cfg.today):f_tcalResetTime(new Date());
	var d_selected=this.e_input.value==''?(this.a_cfg.selected?this.f_parseDate(this.a_cfg.selected):d_today):this.f_parseDate(this.e_input.value);
	if(!d_date)d_date=d_selected;
	else if(typeof(d_date)=='number')d_date=f_tcalResetTime(new Date(d_date));
	else if(typeof(d_date)=='string')this.f_parseDate(d_date);
	if(!d_date)return false;
	var d_firstday=new Date(d_date);
	d_firstday.setDate(1);
	d_firstday.setDate(1-(7+d_firstday.getDay()-this.a_tpl.weekstart)%7);
	var a_class,s_html='<table class="ctrl"><tbody><tr>'
		+(this.a_tpl.yearscroll?'<td'+this.f_relDate(d_date,-1,'y')+' title="Предыдущий год">&#9668;|</td>':'')
		+'<td'+this.f_relDate(d_date, -1)+' title="Предыдущий месяц">&#9668;</td><th>'
		+this.a_tpl.months[d_date.getMonth()]+' '+d_date.getFullYear()
		+'</th><td'+this.f_relDate(d_date, 1)+' title="Следущий месяц">&#9658;</td>'
		+(this.a_tpl.yearscroll?'<td'+this.f_relDate(d_date,1,'y')+' title="Следущий год">|&#9658;</td></td>':'')
		+'</tr></tbody></table><table cellspacing="0"><tbody><tr class="wd">';
	for(var i=0;i<7;i++)s_html+='<th>'+this.a_tpl.weekdays[(this.a_tpl.weekstart+i)%7]+'</th>';
	s_html+='</tr>' ;
	var n_date,n_month,d_current=new Date(d_firstday);
	while(d_current.getMonth()==d_date.getMonth()||d_current.getMonth()==d_firstday.getMonth()){
		s_html+='<tr>';
		for(var n_wday=0;n_wday<7;n_wday++){
			a_class=[];
			n_date=d_current.getDate();
			n_month=d_current.getMonth();
			if(d_current.getMonth()!=d_date.getMonth())a_class[a_class.length]='othermonth';
			if(d_current.getDay()==0 || d_current.getDay()==6)a_class[a_class.length]='weekend';
			if(d_current.valueOf()==d_today.valueOf())a_class[a_class.length]='today';
			if(d_current.valueOf()==d_selected.valueOf())a_class[a_class.length]='selected';
			s_html+='<td onclick="A_TCALS[\''+this.s_id+'\'].f_hide('+d_current.valueOf()+')"'+(a_class.length?' class="'+a_class.join(' ')+'">':'>')+n_date+'</td>'
			d_current.setDate(++n_date);
			while(d_current.getDate()!=n_date&&d_current.getMonth()==n_month){
				d_current.setHours(d_current.getHours+1);
				d_current=f_tcalResetTime(d_current);
			}
		}
		s_html+='</tr>';
	}
	s_html+='</tbody></table>';
	this.e_div.innerHTML=s_html;
	var n_width=this.e_div.offsetWidth;
	var n_height=this.e_div.offsetHeight;
	var n_top=f_getPosition(this.e_icon,'Top')+this.e_icon.offsetHeight;
	var n_left=f_getPosition(this.e_icon,'Left')-n_width+this.e_icon.offsetWidth;
	if(n_left<0)n_left=0;
	this.e_div.style.left=n_left+'px';
	this.e_div.style.top=n_top+'px';
	if(this.e_iframe) {
		this.e_iframe.style.left=n_left+'px';
		this.e_iframe.style.top=n_top+'px';
		this.e_iframe.style.width=(n_width+6)+'px';
		this.e_iframe.style.height=(n_height+6)+'px';
	}
	return true;
}
function f_getPosition(e_elemRef,s_coord){
	var n_pos = 0,n_offset,e_elem=e_elemRef;
	while(e_elem){
		n_offset=e_elem["offset"+s_coord];
		n_pos+=n_offset;
		e_elem=e_elem.offsetParent;
	}
	if(b_ieMac)n_pos+=parseInt(document.body[s_coord.toLowerCase()+'Margin']);
	else if(b_safari)n_pos-=n_offset;
	e_elem=e_elemRef;
	while(e_elem!=document.body){
		n_offset=e_elem["scroll"+s_coord];
		if(n_offset&&e_elem.style.overflow=='scroll')n_pos-=n_offset;
		e_elem=e_elem.parentNode;
	}
	return n_pos;
}
function f_tcalRelDate(d_date,d_diff,s_units){
	var s_units=(s_units=='y'?'FullYear':'Month');
	var d_result=new Date(d_date);
	d_result['set'+s_units](d_date['get'+s_units]()+d_diff);
	if(d_result.getDate()!=d_date.getDate())d_result.setDate(0);
	return ' onclick="A_TCALS[\''+this.s_id+'\'].f_update('+d_result.valueOf()+')"';
}
function f_tcalHideAll () {
	if(window.A_TCALSIDX)for(var i=0;i<window.A_TCALSIDX.length;i++)window.A_TCALSIDX[i].f_hide();
}
function f_tcalResetTime(d_date){
	d_date.setHours(0);
	d_date.setMinutes(0);
	d_date.setSeconds(0);
	d_date.setMilliseconds(0);
	return d_date;
}
f_getElement=document.all?function(s_id){return document.all[s_id]}:function(s_id){return document.getElementById(s_id)};
if(document.addEventListener)window.addEventListener('scroll',f_tcalHideAll,false);
if(window.attachEvent)window.attachEvent('onscroll',f_tcalHideAll);
var s_userAgent=navigator.userAgent.toLowerCase(), re_webkit = /WebKit\/(\d+)/i;
var b_mac=s_userAgent.indexOf('mac')!=-1,b_ie5=s_userAgent.indexOf('msie 5')!=-1,b_ie6=s_userAgent.indexOf('msie 6')!=-1&&s_userAgent.indexOf('opera')==-1;
var b_ieFix=b_ie5||b_ie6,b_ieMac=b_mac&&b_ie5,b_safari=b_mac&&re_webkit.exec(s_userAgent)&&Number(RegExp.$1)<500;
document.writeln('<style type="text/css">');
document.writeln('input.tcalIcon{width:19px;height:19px;padding:0;border:1px solid silver;font-weight:bold;vertical-align:middle}');
document.writeln('div#tcal{position:absolute;visibility:hidden;z-index:100;width:158px;padding:2px 0 0}');
document.writeln('div#tcal table{width:100%;border:1px solid silver;border-collapse:collapse;background-color:white}');
document.writeln('div#tcal table.ctrl{border-bottom:0}');
document.writeln('div#tcal table.ctrl td{padding:0 2px 1px;white-space:nowrap;color:#4da02b}');
document.writeln('div#tcal table.ctrl th{background-color:white;color:black;border:0}');
document.writeln('div#tcal th{border:1px solid silver;text-align:center;padding:0;font-family:arial;font-size:10px;background-color:#5AAC38;color:white}');
document.writeln('div#tcal td{text-align:center;padding:0;font-family:arial;font-size:10px;cursor:pointer}');
document.writeln('div#tcal td.othermonth{color:silver}');
document.writeln('div#tcal td.weekend{background-color:#DFEED7}');
document.writeln('div#tcal td.today{border:1px solid red}');
document.writeln('div#tcal td.selected{background-color:#FFB3BE}');
document.writeln('iframe#tcalIF{position:absolute;visibility:hidden;z-index:98;border:0}');
document.writeln('</style>');
