/*{ 	VA-Calendar, 
	
	(c) Vitaly Andrejev "AnVi" anvi@fromru.com, 03.2003


	vac.init(props)	- to iniialize calendar	
	vac.popup(field[,props]) - opens calendar for the specified field

	.	field - input object.
	.	props = '$prop1="svalue";$prop2=``value``;vac.propN=value';
		(``) is replaced by (").
	
	example:
		vac.init('$nMonth=6');

		<a href="javascript://" onclick="vac.popup(document.forms['frm']['date'],'vac.header=vac.dd_header;$width=180')"><img align="ABSBOTTOM"></a>
		<input type="image" onclick="return	vac.popup(form.date)" align="ABSBOTTOM">
}*/


var isOpera=navigator.userAgent.indexOf("Opera")>=0;
var isNN=(document.layers || navigator.userAgent.indexOf("Gecko")>=0);
var isIE=(document.all && !isOpera);

//-------------------------------------
function _tag(id,a,txt) {return id ?'<'+id+a+'>'+txt+'</'+id+'>' :txt; }
function _ctag(id,c,txt){return id ?'<'+id+' class='+c+'>'+txt+'</'+id+'>' :txt; }
function _2dig(n) 		{return n<10 ?"0"+n:n; }

//************************************* VACalculator Objects
//
var vac=new Object();
vac.cc		= null;			// current calendar
vac.format	= "D.M.Y";		// upper case
vac.width	= 164;
vac.height	= 170;
vac.startday= 1;			// 1 - monday, 0 - Sunday

vac.months	= new Array("January", "February", "March", "April", "May", "June", "July", "August", "September", "October", "November", "December");
vac.days	= new Array("Sun", "Mon", "Tue", "Wed", "Thu", "Fri", "Sat", "Sun");

/* en 
vac.months	= new Array("January", "February", "March", "April", "May", "June", "July", "August", "September", "October", "November", "December");
vac.days	= new Array("Sun", "Mon", "Tue", "Wed", "Thu", "Fri", "Sat", "Sun");
*/
/* de
vac.months	= new Array("Januar", "Februar", "Maerz", "April" , "Mai", "Juni", "Juli", "August",  "September", "Oktober", "November", "Dezember");
vac.days	= new Array("So","Mo","Di", "Mi", "Do", "Fr", "Sa", "So");
				  Sonntag, Montag, Dienstag, Mittwoch, Donnerstag, Freitag, Samstag, 

*/
/* ru
vac.months	= new Array("ßíâàðü", "Ôåâðàëü", "Ìàðò", "Àïðåëü", "Ìàé", "Èþíü", "Èþëü", "Àâãóñò", "Ñåíòÿáðü", "Îêòÿáðü", "Íîÿáðü", "Äåêàáðü");
vac.days	= new Array("Âñ", "Ïí", "Âò", "Ñð", "×ò", "Ïò", "Ñá", "Âñ");
*/
//------------------------------------- init 
vac.init	= function(props) {
	this._init(props);
	
	if (isNN) {		
		document.onclick = function(e) {
			if(vac.event!=e) vac.close(); vac.event=e;
			return document.routeEvent(e);
		}
		document.captureEvents(Event.CLICK);
	} else {
		if(document.onclick!=null) this._ondocclose = document.onclick;
		document.onclick = function() { vac.close(); if(vac._ondocclose!=null) vac._ondocclose(); }
	}
	if (isIE) {document.write(
		'<IFRAME frameBorder=0 id=vacFrame marginHeight=0 marginWidth=0 noResize scrolling=no src="about:blank"'+ 
		'style="BORDER: black 0px solid; DISPLAY: none; HEIGHT: 200; POSITION: absolute; WIDTH: 501; Z-INDEX: 100"'+
		'></IFRAME>');
		this.cframe = document.all['vacFrame'];	
	}
	this.init=function(){};
}
//------------------------------------- vaCalc.init 
vac._init	= function(props) {
	if (props!=null) eval(props.replace(/\$(\w+)\s*=/ig,'this.$1=').replace(/``/g,'"'));
}
//------------------------------------- vaCalc.prop
vac._prop	= function(id,def) {
	return (id=eval('this.'+id+'!=null ?this.'+id+' :vac.'+id))!=null ?id :def;
}
//------------------------------------- popup
vac.popup	= function(fld, props) {
	this.close();
	this._popup(new vaCal(fld,props), vac.event!=null ?vac.event :event);
	return false;
}
//------------------------------------- _popup
vac._popup	= function(c,e) {
	this.cc = c;
	if (!isNN) e.cancelBubble=true;
    if (this.cframe!=null) {
    	var e=e.srcElement;
    	var f=this.cframe;
       	for(var i=e,x=i.offsetLeft,y=i.offsetTop;(i=i.offsetParent)!=null;x+=i.offsetLeft,y+=i.offsetTop);
       	f.style.display	= "block";
       	f.style.width 	= c.prop('width');
       	f.style.height	= c.prop('height');
   		f.style.left=x+e.offsetWidth-parseInt(f.style.width);
    	f.style.top =y+e.offsetHeight;
    	c.close = this._fclose;
    } else {
    	var p="toolbar=0,width="+(c.prop('width')+30)+",height="+(c.prop('height')+30);
    	var x= e.screenX+c.prop('offX',-parseInt(c.prop('width')+30));
    	var y= e.screenY+c.prop('offY',14);
		c.win=window.open("","vaCalendar",p+(isOpera ?",left="+x+",top="+y :",screenx="+x+",screeny="+y));
	    c.win.focus();
       	c.close = this._wclose;
	}
    this.selectDate(c.sd= c.rdDate!=null ?c.rdDate(c) :this.rdDate(c));
}
//------------------------------------- close
vac.close 	= function(d) {
  	if (this.cc==null) return;	
  	if (d!=null) {
		if (this.cc.wrDate!=null) this.cc.wrDate(this.cc, d);
	  	else vac.wrDate(this.cc, d);
	  	this.cc.field.focus();
	}
	this.cc.close();
	this.cc=null;
}
vac._fclose 	= function() {	vac.cframe.style.display="none"; 	}
vac._wclose 	= function() {	this.win.close(); window.focus(); 	}

//------------------------------------- selectDate
vac.selectDate = function(d) {
	this.cc.cd = new Date(d);
  	var w= this.cframe!=null ?vacFrame :this.cc.win;

  	w.document.open();
  	w.document.write(this.render());
  	w.document.close();
}
vac.moveDate = function(dy,dm) {
	var d=new Date(this.cc.cd.getFullYear()+dy, this.cc.cd.getMonth()+dm,1),i;
	if ((i=this.cc.prop('minYear',0)) && i>d.getFullYear()) d.setFullYear(i);
	if ((i=this.cc.prop('maxYear',0)) && i<d.getFullYear()) d.setFullYear(i);
	this.selectDate(d);
}
//------------------------------------- reFormat
vac.reFormat = function() {
  var f = this.format;
  f = f.replace(/\W/g, '\\W');
  f = f.replace(/D/, '(\\d{1,2})');
  f = f.replace(/M/, '(\\d{1,2})');
  f = f.replace(/Y/, '(\\d{4})');

  return new RegExp(f);
}
//------------------------------------- parseDate
vac.parseDate = function(str) {
	var re=this.reFormat(),r;
	if ((r=re.exec(str))!=null) {
  		var f = this.format.replace(/\W/g,'');
		return new Date(parseInt(r[f.indexOf('Y')+1],10),parseInt(r[f.indexOf('M')+1],10)-1,parseInt(r[f.indexOf('D')]+1,10));
    }
    return new Date();
}
vac.formatDate = function(d) {
	var f=this.format;
	f = f.replace(/Y/, d.getFullYear());
	f = f.replace(/M/, _2dig(d.getMonth()+1));
	f = f.replace(/D/, _2dig(d.getDate()));
	return f;
}
//------------------------------------- rdDate
vac.rdDate	= function(c) {
    var re=this.reFormat(),v=c.field.value;
    return (v!="" && re.test(v)) ?vac.parseDate(v) :new Date();
}
//------------------------------------- wrDate
vac.wrDate	= function(c,d) {
	c.field.value=this.formatDate(d);
}

//------------------------------------- Render the Calendar header
vac.r1_header = function(d) {
return '<tr>'+
"<td align=right><nobr><a class=navi href='javascript:moveDate(-1,0)'>&nbsp;&#171;&nbsp;</a><a class=navi href='javascript:moveDate(0,-1)'>&nbsp;&#139;&nbsp;</a></nobr></td>"+
"<td align=center width=80%>"+this.months[d.getMonth()]+" "+d.getFullYear()+"</td>"+
"<td align=left><nobr><a class=navi href='javascript:moveDate(0,1)'>&nbsp;&#155;&nbsp;</a><a class=navi href='javascript:moveDate(1,0)'>&nbsp;&#187;&nbsp;</a></nobr></td>"+
"</tr>";
}
//-------------------------------------
vac.r2_header = function(d) {
return '<tr>'+
"<td align=right><nobr>&nbsp;<a class=navi href='javascript:moveDate(-10,0)'>&nbsp;&#171;&nbsp;</a><a class=navi href='javascript:moveDate(-1,0)'>&nbsp;&#139;&nbsp;</a></nobr></td>"+
"<td align=center width=80%>"+d.getFullYear()+"</td>"+
"<td align=left><nobr><a class=navi href='javascript:moveDate(1,0)'>&nbsp;&#155;&nbsp;</a><a class=navi href='javascript:moveDate(10,0)'>&nbsp;&#187;&nbsp;</a>&nbsp;</nobr></td>"+
"</tr><tr>"+
"<td align=right><nobr>&nbsp;<a class=navi href='javascript:moveDate(0,-1)'>&nbsp;&#139;&nbsp;</a></nobr></td>"+
"<td align=center>"+this.months[d.getMonth()]+"</td>"+
"<td align=left><nobr><a class=navi href='javascript:moveDate(0,1)'>&nbsp;&#155;&nbsp;</a>&nbsp;</nobr></td>"+
"</tr>";
}
//-------------------------------------
vac.dd_header = function(d) {
var s =	'<tr><form>'+
"<td><select name=mn onchange='selectDate(new Date(form.yr.value,form.mn.value))'>";
for(var i=0; i<12; i++) s+='<option value="'+i+'"'+(d.getMonth()==i?' selected':'')+'>'+this.months[i]+'</option>';
s+="</select><select name=yr onchange='selectDate(new Date(form.yr.value,form.mn.value))'>";
for(var c=new Date(), i=this.cc.prop('maxYear',c.getFullYear()),y=this.cc.prop('minYear',1900); i>=y; i--) s+='<option value="'+i+'"'+(d.getFullYear()==i?' selected':'')+'>'+i+"</option>";
return s+"</select></td></form></tr>"
}
//-------------------------------------
vac.mdd_header = function(d) {
var s =	'<tr><td align=right></td><form>'+
"<td><select name=my onchange='selectDate(new Date(this.value.substr(0,4),parseInt(this.value.substr(4)),1))'>";
for(var i=0,c=new Date(),n=this.cc.prop('nMonth',13); i<n; i++,c.setMonth(c.getMonth()+1))
	s+='<option value="'+c.getFullYear()+''+c.getMonth()+'"'+(d.getFullYear()==c.getFullYear()&&d.getMonth()==c.getMonth()?' selected':'')+'>'+c.getFullYear()+" "+this.months[c.getMonth()]+"</option>";
return s+'</select></td></form></tr>';
}
//------------------------------------- Render the Calendar
vac.header = vac.r1_header;
vac.render = function() {
var o 	= this.cframe!=null ?'parent' :'opener';
var d 	= this.cc.cd;
var sd	= this.cc.sd;
var dd 	= new Date();
var s	=
"<html><head>\n<title>"+this.cc.prop('title','VA-Calendar')+"</title>"+this.css+
"<SCRIPT Language=JavaScript>function _o(){ return (window."+o+" && !window."+o+".closed) ?window."+o+" :null;}\n"+
  	"function selectDate(d)	{ if(o=_o()) o.vac.selectDate(d); }"+
  	"function moveDate(y,m)	{ if(o=_o()) o.vac.moveDate(y,m); }"+
 	"function selectDay(d)	{ if(o=_o()) { o.vac.cc.cd.setDate(d); o.vac.close(o.vac.cc.cd);} }"+
"</SCRIPT>\n"+
"</head>\n"+
'<body margin=0>\n\n'+
'<table align=center width=100% height=100% cellspacing=0 cellpadding=0 class=brd>'+
'<tr><td height=10>\n<table width=100% cellpadding=2 cellspacing=0 border=0 class=hdr>'+this.header(d)+'</table></td></tr>'+
'<tr><td><table cellpadding=0 cellspacing=0 width=100% height=100% class=cal>';
for (var i=this.startday; i<this.startday+7; i++) s+="<td class=days>"+this.days[i]+"</td>"; 		s+="</tr>";

var t=new Date(d);	t.setDate(1);
var fd=t.getDay();
for (var ld=29; ld<32; ld++) {
	t.setDate(ld);  if (ld!=t.getDate()) break;
}	ld--;

var day=1;
var sday=(sd.getFullYear()==d.getFullYear() && sd.getMonth()==d.getMonth()) ?sd.getDate() :0;
var dday=(dd.getFullYear()==d.getFullYear() && dd.getMonth()==d.getMonth()) ?dd.getDate() :0;
  
if (this.startday && fd==0) fd=7;

for (var r=0,t; r<6; r++) {	s+="<tr>";
	for (var i=this.startday; i<this.startday+7; i++) {
    	if (r*7+i<fd || day>ld) s+="<td class=day>&nbsp;</td>"; else {
    		t=sday==day ?'selday' : !(i%7) ?'sunday':'day';
        	s+="<td width=14% class="+t+"><a class="+t+" href='javascript:selectDay("+day+")'>"+_tag(dday==day?'b':'','',(day++))+"</a></td>";
      	}
    }   s+="</tr>";
}
return s+"</table></td></tr></table>\n</body></html>";
}

//===================================== vaCal - Object
function vaCal(fld,props) {
	this.init=vac._init;
	this.prop=vac._prop;
	this.field= fld;
	this.init(props);
//	this.offX	- the calendar position relative to a click spot (not IE only)
//	this.offY	/
//	this.title	- calculator title (for a window mode only)
//	this.minYear	= 1920;
//	this.maxYear	= null;
//	this.nMonths	= 13;

}


