
//Version 7

var oCal, nbsp=String.fromCharCode(160), bCalSimple=false;

function DrawCalFld(Name, Val, MinYear, MaxYear, bCell){
var Id=Name+'_Cal', DT, Span='', Events=['Over', 'Out', 'Down', 'Up'],
	i, Text='', NoVal, Cal;

if (bCalSimple){
	DrawSimpleCal(Name, Val, MinYear, MaxYear, bCell); 
	return;
	}

NoVal=!Val; Val=Cal_InitVal(Val);	DT=Val.split('.'); if (NoVal) Val='';
for(i=0; i<Events.length; i++) Span+=' OnMouse'+Events[i]+'="return Cal_FldMouse(event)"';
for(i=0; i<3; i++){
	Text+=(i>0 ? '.' : '')+'<Span '+Span+' i='+i+'>'+DT[i]+'</Span>';
	}

D.write('<TABLE Class=CalFld Id='+Id+' CELLSPACING=0>'+
	'<tr><td Class=CalFld'+(Val ? 'Data' : 'None')+
		' OnContextMenu="return false" OnSelectStart="return false">&nbsp;'+Text+'&nbsp;'+
	'<Input Name='+Name+' Value="'+Val+'" Type=Hidden></td><td>');
if (!W.Cal_ImgDir) W.Cal_ImgDir='/images/';
Button(Cal_ImgDir+'arrowdown.gif', 'Cal_Open', 12, 11, 1, Name);
D.write('</td></tr></TABLE>');

if (!oCal) oCal=new Cal_Create();

Cal=getbyid(Id);
Cal.date=new Date(DT[2], (Val ? DT[1]-1 : 0), DT[0], 12);
Cal.fld=Cal.getElementsByTagName('INPUT')[0];
oCal.Min=MinYear; oCal.Max=MaxYear;
setTimeout('Cal_Correct("'+Id+'", "'+Val+'")', 100);
}

//--

function Cal_Correct(Id, DT1){
//Restore display after "Back"
var Cal=getbyid(Id), DT;

DT=Cal.fld.value; if (DT==DT1) return;
DT=DT.split('.'); Cal_StoreDate(Cal, +DT[0], DT[1], DT[2], true);
}

function Cal_StoreDate(Cal, d, m, y, NoFld, NoObj){
var Parts, dt, OldVal, Fld=Cal.fld;

if (!NoFld){
	OldVal=Fld.value; Fld.value=Cal_DTFmt(d, m, y);
	if (Fld.onchange && OldVal!=Fld.value) Fld.onchange();
	}

Parts=Cal_GetParts(Cal);
Cal_SetPart(Parts[0], d); Cal_SetPart(Parts[1], m); Cal_SetPart(Parts[2], y);
//Ns - force redraw with fieldsets
if (Ns){
	var St=Parts[0].parentNode.style; St.color='white'; St.color='';
	}

if (!NoObj){
	Cal.date=new Date(y, m-1, d, 12);
	//dt=Cal.date; dt.setFullYear(y); dt.setMonth(m-1); dt.setDate(d); 
	Fld.parentNode.className='CalFld'+(y.charAt(0)=='0' ? 'None' : 'Data');
	}
}

function Cal_FldMouse(e){
var T, i, dir, Cal, date; EventInit(e); T=E.type;

if (EvSrc.parentNode.className!='CalFldData' || oCal.Shown) return;

if (T=='mouseover'){	
	if (oCal.CurrFld) EvSrc.style.color='';
	EvSrc.style.color='blue';	oCal.CurrFld=EvSrc; W.status=oCal.Help;
	}
else if (T=='mouseout'){
	EvSrc.style.color=''; oCal.CurrFld=null; W.status='';
	}
else if (T=='mousedown' || (T=='mouseup' && oCal.lastmouse==T)){
	if (LeftBtn()) dir=1; else if (E.button==2) dir=-1; else return;
	if (E.shiftKey) dir=-dir;
	
	Cal=Cal_FindCal(EvSrc); date=Cal.date; i=getat(EvSrc, 'i');
	
	if (i==2){
		Y=Cal_ChangeYear(date.getFullYear(), dir); if (!Y) return;
		date.setFullYear(Y);
		}
	else if (i==1) date.setMonth(date.getMonth()+dir);
	else if (i==0) date.setDate(date.getDate()+dir);
	
	Cal_StoreDate(Cal, date.getDate(), date.getMonth()+1, date.getFullYear(),	false, true);
	}
oCal.lastmouse=T;

return Op;
}

function Cal_SetPart(Part, Val){
Part.childNodes[0].data=Cal_Pad(Val);
}

function Cal_GetParts(Cal){
if (!Cal.parts) Cal.parts=Cal.getElementsByTagName('SPAN');
return Cal.parts;
}

//--

function Cal_SetRange(MinYear, MaxYear){

if (!oCal) return;
oCal.Min=MinYear; oCal.Max=MaxYear;
}

function Cal_Disable(Fld, Dis){
var Par, NewCl='';

if (Fld.disabled==Dis) return; Fld.disabled=Dis;
Par=Fld.parentNode;

Class=['CalFldData', 'CalFldDis']; Ind=(Dis ? 0 : 1);
if (Par.className==Class[Ind]) Par.className=Class[1-Ind];

Button_Disable(getbyid(Fld.name+'_Button'), Dis);
}

//--

function Cal_Create(){

D.write('<Table CellSpacing=0 Name=Calendar Id=Calendar '+
	'OnContextMenu="return false"><TR><TD Height="100%" VALIGN=Top>'+
	'<TABLE Height="100%"><TR><TD Class=CalDays Id=CalDaysHolder>'+
	Cal_DaysTbl()+'</TD></TR><TR><TD Height=1>'); Cal_YearBox();
D.write('</TD></TR></TABLE></TD><TD>'+Cal_MonthList()+'</TD></TR></Table>');

this.Cal=getbyid('Calendar');
this.DaysTbl=getbyid('CalDaysHolder').getElementsByTagName('TABLE')[0];
this.F=Cal_FindForm(this.Cal); this.Shown=false;
this.Help='Left button - next, Right button - previous, Shift - inverse';
}

function Cal_DaysTbl(){
var Week='Su,Mo,Tu,We,Th,Fr,Sa'.split(','), i, Text, Buffer;

Text='<Table CellSpacing=0><TR Class=Week>';
//Week <Col Width="10%" Span=7>
for(i=0; i<7; i++) Text+='<TD>'+Week[i]+'</TD>';
Text+='</TR>';
//Days
for(var RowNo=0; RowNo<6; RowNo++){
	Buffer='';
	for(i=0; i<7; i++) Buffer+='<TD>.</TD>';
	Text+=('<TR>'+Buffer+'</TR>');
	}
Text+='</TR></Table>'; return Text;
}

function Cal_Update(YDelta){
var Year;

Year=+oCal.F.Year.value;

if (YDelta!=0){
	Year=Cal_ChangeYear(Year, YDelta); if (!Year) return;
	oCal.F.Year.value=Year;
	}
Cal_Draw(oCal.Day, oCal.F.MonSel.value, Year);
}

function Cal_ChangeYear(Y, Delta){
var Test;

Test=Cal_BadYear(Y);
//already bad - set closest
if (Test) return (Test<0 ? oCal.Min : oCal.Max);
//try to change
var NextY=Y+=Delta; return (Cal_BadYear(NextY) ? 0 : NextY);
}

function Cal_BadYear(Y){
//-1 / 0 / 1, 0 means good
return (oCal.Min && Y<oCal.Min ? -1 : (oCal.Max && Y>oCal.Max ?  1 : 0));
}

function Cal_YearBox(){

D.write('<Table CellSpacing=0 Width="100%"><TR><TD Align=Center>');
Button(Cal_ImgDir+'arrowleft.gif', 'Cal_PrevY', 11, 11);
D.write('</TD><TD Align=Center><Input Name=Year ReadOnly></TD><TD Align=Center>');
Button(Cal_ImgDir+'arrowright.gif', 'Cal_NextY', 11, 11);
D.write('</TD></TR></table>');
}

function Cal_MonthList(){
var Months=("January,February,March,April,May,June,July,August,September,October"+
	",November,December").split(','),
	MonSel='<Select Name=MonSel OnChange="Cal_Update(0)" ondblclick="Cal_Close(true)" Size=12>', i, DT;

for(i=0; i<12; i++){
	MonSel+='<Option Value='+i+'>'+Months[i]+'</Option>';
	}
MonSel+='</Select>'; return MonSel;
}

function Cal_Draw(Day, Month, Year){
var DT, ToDay, MonLen, Dow, i, SelDay, Cl, Rows, Row, RowNo=1, TD;

Rows=oCal.DaysTbl.getElementsByTagName('TR');

//init
DT=new Date(); ToDay=DT.getDate();
DT.setDate(1); DT.setHours(12, 0, 0, 0);

if (Year) DT.setFullYear(Year); else Year=DT.getFullYear();
if (Month!=null) DT.setMonth(Month); else Month=DT.getMonth();
SelDay=(Day ? Day : ToDay);

MonLen=Cal_GetMonthLen(DT);

//prev month
Dow=DT.getDay(); Row=Rows[RowNo].childNodes;
for(i=0; i<Dow; i++) Cal_TD(Row[i], nbsp);

//this month
oCal.DayExists=false;
for(i=1; i<=MonLen; i++){
	if (i!=SelDay) Cl='';
	else{
		Cl='SelDay'; oCal.DayExists=true;
		}
	Cal_TD(Row[Dow], i, 'Day_'+i, Cl); Dow++;
	if (Dow>=7){
		Dow=0; RowNo++; Row=Rows[RowNo].childNodes;
		}
	}

//next month
while(true){
	if (Dow>=7){
		RowNo++; if (RowNo>=7) break;
		Dow=0; Row=Rows[RowNo].childNodes;
		}
	Cal_TD(Row[Dow], nbsp); Dow++;
	}

}

function Cal_TD(TD, Val, id, Cl){
TD.childNodes[0].nodeValue=Val; TD.id=id;	TD.className=Cl;
}

function Cal_Toggle(Button){
var CalS=oCal.Cal.style;

if (!oCal.Shown){
	var aPos, y, m, d, DT, Cmd, Fld, Cal;
	
	Cal=Cal_FindCal(Button); Fld=Cal.fld;
	if (Fld){
		DT=Fld.value; DT=(DT ? DT.split('.') : Cal_Today());
		y=DT[2]; m=DT[1]-1; d=+DT[0];
		}
	Cal_Draw(d, m, y); oCal.Fld=Fld; oCal.Day=d;
	aPos=Cal_GetPos(Cal);

	CalS.left=aPos[0]+'px'; CalS.top=aPos[1]+'px';
	CalS.visibility='visible'; oCal.Shown=true;

	Cmd='oCal.OMD=D.onmousedown; D.onmousedown=Cal_OMD;'+
		'oCal.OKP=D.onkeypress; D.onkeypress=Cal_OKP;'+
		'oCal.F.MonSel.value='+m+'; ';
	oCal.F.Year.value=y;
	
	if (Op){
		Cells=oCal.Cal.childNodes[0].childNodes[0].childNodes;
		oCal.Cal.style.width=Cells[0].offsetWidth+Cells[1].offsetWidth+10+'px';
		}
	setTimeout(Cmd, 100);	oCal.But=Button;
	if (!Op && !Gec && !IE7) Cal_HideSel();
	}
else{
	CalS.visibility='hidden'; CalS.left='0px'; CalS.top='0px';
	oCal.Shown=false; oCal.But=null;
	D.onmousedown=oCal.OMD;	D.onkeypress=oCal.OKP;
	if (!Op && !Gec) Cal_ShowSel();
	W.focus();
	}
}

function Cal_ShowSel(){
var HiddenSel=oCal.HiddenSel, i;

if (!HiddenSel) return;
for(i=0; i<HiddenSel.length; i++) HiddenSel[i].style.visibility='visible';
oCal.HiddenSel=null;
}

function Cal_HideSel(){
var colSel=D.getElementsByTagName('SELECT'), 
	i, Sel, Len, CalRect, ObjRect, N=0, HiddenSel;

Len=colSel.length; if (Len==1) return;
CalRect=Cal_GetObjRect(oCal.Cal); HiddenSel=[];

for(i=0; i<Len; i++){
	Sel=colSel[i]; if (Sel.name=='MonSel') continue;
	ObjRect=Cal_GetObjRect(Sel);
	if (RectOverlap(CalRect, ObjRect)){
		Sel.style.visibility='hidden'; HiddenSel[N++]=Sel;
		}
	}
oCal.HiddenSel=HiddenSel;
}

function Cal_GetObjRect(o){
var aPos=AbsPos(o);
return [aPos[0], aPos[1], aPos[0]+o.offsetWidth, aPos[1]+o.offsetHeight];
}

function RectOverlap(Rect1, Rect2){
return (
	LineOverlap([Rect1[0], Rect1[2]], [Rect2[0], Rect2[2]]) &&
	LineOverlap([Rect1[1], Rect1[3]], [Rect2[1], Rect2[3]]));
}

function LineOverlap(Line1, Line2){
var Left, Right;

if (Line1[0]<Line2[0]){Left=Line1; Right=Line2;}
else{Left=Line2; Right=Line1;}
return (Left[1]>Right[0]);
}

//--

function Cal_OMD(e){
var Day, Last;

EventInit(e);

if (!Contains(oCal.Cal, EvSrc)) Cal_Close();
else if (Contains(oCal.DaysTbl, EvSrc)){
	Day=+EvSrc.childNodes[0].data;
	if (Day){
		if (oCal.DayExists) getbyid('Day_'+oCal.Day).className='';
		EvSrc.className='SelDay'; oCal.Day=Day; oCal.DayExists=true;
		if (LeftBtn()) setTimeout('Cal_Close(true)', 100);
		}
	}
}

function Cal_OKP(e){
EventInit(e); if (E.keyCode==27) Cal_Close();
}

//--

function Cal_Open(Up){
var But;

if (!Up){
	//open?!
	if (oCal.Shown) Cal_Close();
	But=EvSrc;
	}
Cal_Toggle(But);
}


function Cal_GetPos(Cal){
var oRoot=GetPosRoot(), ScrTop=oRoot.scrollTop, Above, Below, CalFldH=Cal.offsetHeight, 
	X, Y, Diff, CalH=oCal.Cal.offsetHeight, aPos;

aPos=AbsPos(Cal); X=aPos[0]; Y=aPos[1];
//Y
Diff=ScrTop+oRoot.clientHeight-Y-CalFldH-CalH;
if (Diff<0){ //doesn't fit below
	Above=Y-ScrTop;
	if (Above>=CalH) Y-=CalH;
	else{ //doesn't fit above
		Below=Diff+CalH;
		if (Above<Below) Y+=CalFldH+Diff;
		else Y-=Above;
		}
	}
else Y+=CalFldH;

//X
Diff=oRoot.scrollLeft+oRoot.clientWidth-X-oCal.Cal.offsetWidth;
if (Diff<0) X+=Diff;

return [X, Y];
}


function Cal_Close(Save){
var Fld;

if (Save){
	if (!oCal.DayExists) return;
	Fld=oCal.Fld;
	Cal_StoreDate(Cal_FindCal(Fld), oCal.Day, +oCal.F.MonSel.value+1, 
		oCal.F.Year.value);
	}
Button_Toggle(oCal.But, true); Cal_Toggle();
}

//--

function Cal_GetMonthLen(pDT){
//Get number of days for the month in pDT
var DT=new Date(pDT), Mon;

//clear
DT.setDate(1); DT.setHours(0, 0, 0, 0);
//next month
Mon=DT.getMonth()+1;
if (Mon>=12){
	Mon=0; DT.setFullYear(DT.getFullYear()+1);
	}
DT.setMonth(Mon);
//a little back
DT.setHours(-12); return DT.getDate();
}

function Cal_PrevY(){Cal_Update(-1);}
function Cal_NextY(){Cal_Update(1);}

function Cal_FindForm(o){
while(o && o.tagName!='FORM') o=o.parentNode;
return o;
}

function Cal_FindCal(o){
while(o && o.className!='CalFld') o=o.parentNode;
return o;
}

function Cal_Today(){
var DT=new Date; 

return [DT.getDate(), DT.getMonth()+1, DT.getFullYear()];
}

function Cal_Pad(s){
if (typeof(s)=='number') s=s.toString();
return (s.length>1 ? s : '0'+s);
}

function Cal_DTFmt(d, m, y){
return (y>0 ? Cal_Pad(d)+'.'+Cal_Pad(m)+'.'+y : '');
}

function Cal_TodayStr(){
var DT=Cal_Today(); return Cal_DTFmt(DT[0], DT[1], DT[2]);
}

function Cal_GetTime(){
var DT=new Date;
return Cal_Pad(DT.getHours())+Cal_Pad(DT.getMinutes())+Cal_Pad(DT.getSeconds());
}

function Cal_SetDate(Fld, DT){

if (bCalSimple) return;
if (!DT){Fld.value=''; DT=Cal_InitVal(DT);}
else{DT=Cal_InitVal(DT); Fld.value=DT;}
DT=DT.split('.');
Cal_StoreDate(getbyid(Fld.name+'_Cal'), +DT[0], DT[1], DT[2], true);
}

function Cal_BadFld(Fld, Msg, bConfirm){

if (bCalSimple) return BadField(Fld.form[Fld.name+'_Day'], Msg, bConfirm);
var Cal=getbyid(Fld.name+'_Cal');
ScrollTo(Cal); 
if (Fld.value) Cal=Cal.rows[0].cells[0];
return BadField(Cal, Msg, true, bConfirm);
}

function Cal_InitVal(Val){
var M;

if (!Val) Val='00.00.0000';
else if (Val=='today') Val=Cal_TodayStr();
else if (Val && Val.charAt(2)!='.'){ //YYYYMMDD, YYYY.MM.DD, YYYY-MM-DD -> DD.MM.YYYY
	if (M=Val.match(/(\d{4})[.-]?(\d{2})[.-]?(\d{2})/)){
		Val=M[3]+'.'+M[2]+'.'+M[1];
		//Val=Val.substr(6)+'.'+Val.substr(4, 2)+'.'+Val.substr(0, 4);
		}
	else Val='00.00.0000';
	}
return Val;
}

function Cal_ReverseVal(Fld){
var DT=Fld.value;

if (DT=='00.00.0000') return '';
return (DT ? DT.substr(6)+DT.substr(3, 2)+DT.substr(0, 2) : DT);
}

function Cal_ReverseDT(DT){
return DT.getFullYear()+Cal_Pad(DT.getMonth()+1)+Cal_Pad(DT.getDate());
}

/*function Cal_Str2DT(DTStr){
//YYYYMMDD -> Date
return new Date(DTStr.substr(0, 4), +DTStr.substr(4, 2)-1, DTStr.substr(6, 2), 12, 0, 0);
}*/

function Cal_Init(){
//Specify ?testua=Safari in the end of URL for testing

if (!Gec) return false;
var Nav=W.navigator.userAgent, bSafari;

bSafari=(Nav.indexOf('Safari/')!=-1);
if (bSafari){
	Nav.match(/Safari\/(\d)/);
	//allow full calendar for Safari 3 (511)
	if (RegExp.$1>=5) return;
	}

if (bSafari || Nav.indexOf('AOL/')!=-1
	|| W.location.search.indexOf('testua=Safari')!=-1){	// || true
	D.write('<Script Src="/js/calendar_simple.js"></Script>');
	bCalSimple=true;
	}
}

function Cal_AddMinutes(Fld, Minutes){
//Note: the initial time is always 12:00
var Cal=getbyid(Fld.name+'_Cal'), date=Cal.date;

date.setMinutes(Minutes+date.getMinutes());
Cal_StoreDate(Cal, date.getDate(), date.getMonth()+1, date.getFullYear(),	false, true);
}

Cal_Init();
