//**********************************************************
function clsCalendar()
{
  this.USA=false;
  this.Day=new Date().getDate();
  this.Month=new Date().getMonth()+1;
  this.Year=new Date().getYear();
  this.aDayOfMonth=new Array(31,28,31,30,31,30,31,31,30,31,30,31);
  this.aArray=new Array();
  this.aMonth;
  this.aWeekDay;
  this.wnd=null;
//***
  this.idFrom=null;
  this.idTo=null;
  this.Script=null;
  this.yearFrom=null;
  this.yearTo=null;
//*** initialization
 this.Init=function(inDate)
 {
  var q,i,el;
  var dca=new Array();
   if(this.USA)
     {
      q=this.aWeekDay.pop();
      this.aWeekDay.reverse();
      this.aWeekDay.push(q);
      this.aWeekDay.reverse();
      this.USA=true;
     }
//*** 
   if(!this.toDate(inDate))
     {
      if(this.idFrom) 
        {
         if(document.getElementById(this.idFrom).tagName.toUpperCase() == "input".toUpperCase()) this.toDate(document.getElementById(this.idFrom).value);
            else this.toDate(document.getElementById(this.idFrom).innerText);
        }
     }
//*** 
   if(this.Month <= 0 || this.Month > 12) this.Month=1;
   if(this.Year <= 0) this.Year=new Date().getYear();
   this.Month--;
   if(this.Year%4 == 0) this.aDayOfMonth[1]=29;
   if((this.Day <= 0) || (this.Day > this.aDayOfMonth[this.Month])) this.Day=this.aDayOfMonth[this.Month];
//***
   dca.push("<table cellpadding=1 cellspacing=0 bgcolor=#D6D6CE bordercolordark=black bordercolorlight=white width=100% border=1>");
   dca.push("<tr bgcolor=#668899>");
   dca.push("<td class=tdUP nowrap height=22>");
//*** draw years
   if(this.yearFrom && this.yearTo) 
     {
      dca.push("<select style='font-family: Tahoma, Helvetica; font-size: 11px;' id=fldYear onChange=gvCalendar.onChange()>");
      for(i=this.yearFrom;i<=this.yearTo;i++) dca.push("<option value="+i+">"+i+"</option>");
      dca.push("</select>");
     }
      else dca.push("<span class=spn onClick=gvCalendar.prevYear()><<</span>&nbsp;<span id=fldYear></span>&nbsp;<span class=spn onClick=gvCalendar.nextYear()>>></span>");
   dca.push("</td>");
   dca.push("<td class=tdUP nowrap align=right>");
//*** draw months
   if(this.yearFrom && this.yearTo) 
     {
      dca.push("<select style='font-family: Tahoma, Helvetica; font-size: 11px;' id=fldMonth onChange=gvCalendar.onChange()>");
      for(i=0;i<12;i++) dca.push("<option value="+i+">"+this.aMonth[i]+"</option>");
      dca.push("</select>");
     } 
      else dca.push("<span class=spn onClick=gvCalendar.prevMonth()><<</span>&nbsp;<span id=fldMonth></span>&nbsp;<span class=spn onClick=gvCalendar.nextMonth()>>></span>");

   dca.push("</td>");
   dca.push("</tr>");
   dca.push("<tr>");
   dca.push("<td colspan=2><span id=divTableDays></span></td>");
   dca.push("</tr>");
   dca.push("</table>");
//*** draw
   el=this.wnd.document.createElement("DIV");
   el.innerHTML=dca.join("");
   delete dca;
   this.wnd.document.body.appendChild(el);
//*** set current
   if(this.yearFrom && this.yearTo) 
     {
      this.wnd.document.getElementById("fldMonth").options[this.Month].selected=true;    
      this.wnd.document.getElementById("fldYear").options[this.Year-this.yearFrom].selected=true;
     }
      else
     {
      this.wnd.document.getElementById("fldYear").innerText=this.Year;
      this.wnd.document.getElementById("fldMonth").innerText=this.aMonth[this.Month];
     }
   this.reDraw();
 }
//***
 this.toDate=function(str)
 {
  var reg=/(\d{1,2})\D(\d{1,2})\D(\d{2,4})/;
  var q=reg.exec(str);
   if(!q) return false;
   if(this.USA)
    {
     this.Month=parseInt(RegExp.$1);
     this.Day=parseInt(RegExp.$2);
    }
     else
    {
     this.Day=parseInt(RegExp.$1);
     this.Month=parseInt(RegExp.$2);
    }
   this.Year=parseInt(RegExp.$3);
   return true;
 }
//*** ***************************************** ***/
//*** return date ***
 this.Done=function(n)
 {
  var prm;
   this.Day=n;
   this.Month++;
   if(this.USA) prm=this.Month+"/"+this.Day+"/"+this.Year;
      else prm=this.Day+"."+this.Month+"."+this.Year;
   if(this.idTo) 
     {
      if(document.getElementById(this.idTo).tagName.toUpperCase() == "input".toUpperCase()) document.getElementById(this.idTo).value=prm;
         else document.getElementById(this.idTo).innerText=prm;
     }
//   q=new Date(this.Year,this.Month,this.Day);
//   alert(q.toLocaleString());
   if(this.Script) eval(this.Script+"('"+prm+"')");
   this.wnd.close();
 }
//*** draw table with days
 this.reDraw=function()
 {
   if(this.Day > this.aDayOfMonth[this.Month]) this.Day=this.aDayOfMonth[this.Month];
   if(this.Year%4 == 0) this.aDayOfMonth[1]=29;
      else this.aDayOfMonth[1]=28;
  var dca=new Array();
   dca.push("<table id=tableDay width=100% cellpadding=3 cellspacing=1 border=0 style='font-family: Tahoma, Helvetica; font-size: 11px;'>");
   dca.push("<tr bgcolor=white>");
   for(var i=0;i<7;i++) dca.push("<td class=tdDayHead>"+this.aWeekDay[i]+"</td>");
   dca.push("</tr>");
  var day=new Date(this.Year,this.Month,1).getDay();
   if(!this.USA)
     {
      if(day == 0) day=6;
         else day--;
     }
  var n=0,i=0,j;
   while(n < this.aDayOfMonth[this.Month])
        {
         dca.push("<tr align=right>");
         for(j=0;j<7;j++)
            {
             if((i*7+j >= day) && (n < this.aDayOfMonth[this.Month]))
               {
                dca.push("<td bgcolor=white"+
                          " onMouseOut='JavaScript: this.style.backgroundColor=\"\";this.style.color=\"\";'"+
                          " onMouseOver='JavaScript: this.style.backgroundColor=\"#7799AA\"; this.style.color=\"#FFFFFF\";'"+
                          " onClick=gvCalendar.Done("+(n+1)+") id=td"+n+" class=tdDay>"+(n+1)+"</td>");
                n++;
               }
                else dca.push("<td>&nbsp;</td>");
            }
         dca.push("</tr>");
         i++;
        }
   dca.push("</table>");
   this.wnd.document.getElementById("divTableDays").innerHTML=dca.join("");
   this.wnd.document.getElementById("td"+(this.Day-1)).bgColor="#BDEAC9";  
   delete dca;
 }
//*** on change year or month
 this.onChange=function()
 {
   this.Year=parseInt(this.wnd.document.getElementById("fldYear").value);
   this.Month=parseInt(this.wnd.document.getElementById("fldMonth").value);
   this.reDraw();
 }
//*** previous year
 this.prevYear=function()
 {
   this.Year--;
   this.wnd.document.getElementById("fldYear").innerText=this.Year;
   this.reDraw();
 }
//*** next year
 this.nextYear=function()
 {
   this.Year++;
   this.wnd.document.getElementById("fldYear").innerText=this.Year;
   this.reDraw();
 }
//*** previous month
 this.prevMonth=function()
 {
   if(this.Month != 0) this.Month--;
      else
     {
      this.Year--;
      this.wnd.document.getElementById("fldYear").innerText=this.Year;
      this.Month=11;
     } 
   this.wnd.document.getElementById("fldMonth").innerText=this.aMonth[this.Month];
   this.reDraw();
 }
//*** next month
 this.nextMonth=function()
 {
   if(this.Month < 11) this.Month++;
      else
     {
      this.Year++;
      this.wnd.document.getElementById("fldYear").innerText=this.Year;
      this.Month=0;
     } 
   this.wnd.document.getElementById("fldMonth").innerText=this.aMonth[this.Month];
   this.reDraw();
 }
//*** execute
}

function InitCalendar(idFrom,idTo,yearFrom,yearTo,inDate,Script,usa)
{
 var aMonth=new Array(new Array("January","February","March","April","May","June","July","August","September","October","November","December"),
                      new Array("January","February","March","April","May","June","July","August","September","October","November","December"));
 var aWeekDay=new Array(new Array("M","T","W","T","F","S","S"),new Array("M","T","W","T","F","S","S"));
 var prm="scrollbars=0,location=0,menubar=0,toolbar=0,status=0,resizable=0,width=167,height=180,left=0,top=0";
 var dca=new Array();
  dca.push("<html>\n");
  dca.push("<head>\n");
  dca.push("<meta http-equiv=\"Content-Type\" content=\"text/html; charset=Windows-1251\">\n");
  dca.push("<style type=\"text/css\">\n");
  dca.push("body,td { font-family: \"MS Sans Serif\", sans-serif; font-size: 10px; }\n");
  dca.push(".tdDayHead { color: #FFFFFF; background-color: #668899; text-align: center; border: 1px solid #FFFFFF; }\n");
  dca.push(".tdDay { cursor: hand; border: 1px solid #333333; }\n");
  dca.push(".tdUP { color: white; font-family: Tahoma, Helvetica; font-size: 11px; border-color: white black black white; border: 1px; }\n");
  dca.push(".spn { cursor: hand; cursor: pointer; }\n");
  dca.push("</style>\n");
  dca.push("<Script Language=JavaScript id=scriptCalendar>\n");
  dca.push("var gvCalendar;\n");
  dca.push("<\/Script>\n");
  dca.push("</head>\n");
  dca.push("<body bgcolor=#D6D6CE bottommargin=0 leftmargin=0 marginheight=0 marginwidth=0 rightmargin=0 topmargin=0>\n");
  dca.push("</body>\n");
  dca.push("</html>\n");

 var wnd=window.open("","Calendar",prm);
  wnd.document.write(dca.join(""));
  wnd.document.close();
  delete dca;

  wnd.gvCalendar=new clsCalendar();

  wnd.gvCalendar.USA=usa;
  wnd.gvCalendar.wnd=wnd;
  wnd.gvCalendar.idFrom=idFrom;
  wnd.gvCalendar.idTo=idTo;
  wnd.gvCalendar.Script=Script;
  wnd.gvCalendar.yearFrom=yearFrom;
  wnd.gvCalendar.yearTo=yearTo;
  if(wnd.gvCalendar.USA)
    {
     wnd.gvCalendar.aMonth=aMonth[0];
     wnd.gvCalendar.aWeekDay=aWeekDay[0];
    }
     else
    {
     wnd.gvCalendar.aMonth=aMonth[1];
     wnd.gvCalendar.aWeekDay=aWeekDay[1];
    }

  wnd.gvCalendar.Init();
}
