var startdate=new Date(startyear,startmonth-1,startday);

// Determine browser.
var isMinNS4 = (navigator.appName.indexOf("Netscape") >= 0 &&
                parseFloat(navigator.appVersion) >= 4) ? 1 : 0;
var isMinIE4 = (document.all) ? 1 : 0;
var isMinIE5 = (isMinIE4 && navigator.appVersion.indexOf("5.")) >= 0 ? 1 : 0;

// Deze wordt nu in calendar.lay vastgelegd:
// var weekdays=["Ma", "Di", "Wo", "Do", "Vr", "Za", "Zo"];
// var months=["Januari","Februari","Maart","April","Mei","Juni","Juli","Augustus","September","Oktober","November","December"];

function setLayerBgColor(layer, color) {
  if (isMinNS4)
    layer.bgColor = color;
  if (isMinIE4)
    layer.style.backgroundColor = color;
}

function getLayer(name)
{
  if (isMinNS4)
    return findLayer(name, document);
  if (isMinIE4)
    return eval('document.all.' + name);

  return null;
}

function findLayer(name, doc)
{
  var i, layer;
  for (i = 0; i < doc.layers.length; i++) {
    layer = doc.layers[i];
    if (layer.name == name)
      return layer;
    if (layer.document.layers.length > 0) {
      layer = findLayer(name, layer.document);
      if (layer != null)
        return layer;
    }
  }
  return null;
}

function buildCalendarPeriod(cols,maxmonths,canedit)
{
  enddate=startdate.valueOf();
  enddate += (statestring.length+0.5)*1000*60*60*24;
  enddate=new Date(enddate);
  nummonths=enddate.getFullYear()*12+enddate.getMonth()-startdate.getFullYear()*12-startdate.getMonth()+1;
  if(nummonths > maxmonths) nummonths=maxmonths;
  var rows=Math.floor((nummonths+cols-1)/cols);
  return buildCalendar(startdate.getMonth()+1,startdate.getYear(),cols,rows,nummonths,canedit);
}

function buildCalendar(startmonth,startyear,cols,rows,nummonths,canedit)
{
  if(startyear < 2000)
  {
    // required for some browsers:
    startyear = 2000+(startyear % 100);
  }
  var o="";
  o += "<table border=0>";
  for(var i=0;i<rows;i++)
  {
    if(i > 0)
    {
      o += "<tr><td>&nbsp;&nbsp;</td></tr>";
    }
    o += "<tr>";
    for(var ii=0;ii<cols;ii++)
    {
      if(ii > 0)
      {
        o += "<td>&nbsp;&nbsp;</td>";
      }
      if(i*cols+ii >= nummonths)
      {
        o += "<td>&nbsp;</td>";
      }
      else
      {
        var mon=startmonth+i*cols+ii;
        var yr=startyear;
        while(mon > 12)
        {
          mon -= 12;
          yr++;
        }
        o += "<td>";
        o += buildCalMonth(mon,yr,canedit);
        o += "</td>";
      }
    }
    o += "</tr>";
  }
  o += "</table>";
  return o;
}

function buildCalMonth(mon,yr,canedit)
{
  var firstday=getFirstDayOfMonth(mon,yr);
  var numdays=getMonthLength(mon,yr);
  var o="";

  o += "<table border=0>";
  o += "<tr><td class=monthnames colspan=7>"+months[mon-1]+" "+yr+"</td></tr>";
  o += "<tr>";
  for(var i=0;i<7;i++)
  {
    o += "<td class=weekdaynames>"+weekdays[i]+"</td>";
  }
  o += "</tr>";
  for(var row=0;row<6;row++)
  {
    o += "<tr>";
    for(var col=0;col<7;col++)
    {
      var monthday=row*7+col-firstday+1;
      o += buildCalDay(monthday,mon,yr,(monthday >=1 && monthday <= numdays),canedit);
    }
    o += "</tr>";
  }
  o += "</table>";
  return o;
}

function buildCalDay(day,mon,yr,valid,canedit)
{
  var o="";
  var divname="cal_"+day+"_"+mon+"_"+yr;
  var clickfunc="calClick("+day+","+mon+","+yr+")";
  var mousedownfunc="calMouseDown("+day+","+mon+","+yr+")";
  var state,col;
  var isactive;
  if(valid)
  {
    state=getState(day,mon,yr);
    if(state == '-')
    {
      isactive=false;
      col=unknowncolor;
    }
    else
    {
      isactive=true;
      col=statecolors[state-0];
    }
  }
  else
  {
    col=undefcolor;
    isactive=false;
  }
  if(canedit && valid && isactive)
  {
    o += "<td class=calboxtd valign=center bgcolor=#000000>";
  }
  else
  {
    o += "<td class=calboxtd valign=center bgcolor="+col+">";
  }
  var txt;
  if(isMinNS4)
  {
    if(valid)
    {
      txt="";
      if(day < 10) txt += "&nbsp;";
      txt += "&nbsp;"+day+"&nbsp;";
      if(day < 10) txt += "&nbsp;";
    }
    else
    {
      txt = "&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;";
    }
  }
  else
  {
    if(valid)
    {
      txt = ""+day;
    }
    else
    {
      txt = "";
    }
  }
  if(isactive)
  {
    if(isMinNS4)
    {
      if(canedit)
      {
        o += "<a href=\"javascript:"+clickfunc+"\">";
        o += "<div id="+divname+" class=calbox style=\"background-color: "+col+"; layer-background-color: "+col+";\">";
      }
      o += txt;
      if(canedit)
      {
        o += "</div>";
        o += "</a>";
      }
    }
    else
    {
      if(canedit)
      {
        o += "<div id="+divname+" class=calbox ";
        o += "onMouseDown="+mousedownfunc+" ";
        o += "style=\"background-color: "+col+";\">";
      }
      o += txt;
      if(canedit)
      {
        o += "</div>";
      }
    }
  }
  else
  {
//    o += "<div class=calbox style=\"background-color: "+col+"; layer-background-color: "+col+";\">";
    o += txt;
//    o += "</div>";
  }
  o += "</td>";
  return o;
}

// get the number of days in a certain month
//   mon: 1-12
//   yr: eg 2001
function getMonthLength(mon,yr)
{
  var d1=new Date(yr,mon-1,1);
  var d2;
  if(mon >= 11)
  {
    d2=new Date(yr+1,mon-12,1);
  }
  else
  {
    d2=new Date(yr,mon,1);
  }
  return Math.round((d2-d1)/1000/60/60/24);
}

// returns the state at the specified date, or -1 if unknown
function getState(day,mon,yr)
{
  var d1=new Date(yr,mon-1,day);
  var dayindex=Math.round((d1-startdate)/1000/60/60/24);
  if( (dayindex < 0) || (dayindex >= statestring.length) )
  {
    return -1;
  }
  return statestring.charAt(dayindex);
}

// set the state at the specified date
function setState(day,mon,yr,newstate)
{
  var d1=new Date(yr,mon-1,day);
  var dayindex=Math.round((d1-startdate)/1000/60/60/24);
  if( (dayindex < 0) || (dayindex > statestring.length) )
  {
    return;
  }
  newstate += "0";
  newstate=""+newstate.charAt(0);
  statestring=statestring.substring(0,dayindex)+newstate+statestring.substring(dayindex+1,statestring.length);
}

function setCalDayColor(day,mon,yr,newcolor)
{
  var divname="cal_"+day+"_"+mon+"_"+yr;
  d=getLayer(divname);
  setLayerBgColor(d,newcolor);
}

// get the first day of the month
//   0=monday, etc
function getFirstDayOfMonth(mon,yr)
{
  var d1=new Date(yr,mon-1,1);
  return (d1.getDay()+6)%7;
}

//window.captureEvents(event.CLICK);
//window.onClick = calClick;

function calClick(day,mon,yr)
{
  var state=getState(day,mon,yr);
  state++;
// rood/groen (2) of rood/oranje/groen (1)
//  if(state > 2) state=0;
  if(state > 1) state=0;
  setState(day,mon,yr,state);
  setCalDayColor(day,mon,yr,statecolors[state]);
}

function calMouseDown(day,mon,yr)
{
  var state=getState(day,mon,yr);
  state++;
// rood/groen (2) of rood/oranje/groen (1)
//  if(state > 2) state=0;
  if(state > 1) state=0;
  setState(day,mon,yr,state);
  setCalDayColor(day,mon,yr,statecolors[state]);
  window.event.returnValue = false;
}

function bodyMouseDown()
{
}
