/*{     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   = 180;
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;

}

