var weekend = [0,6];
var weekendColor = "#e0e0e0";
var fontface = "Verdana";
var fontsize = 1;

var gNow = new Date();
var ggWinCal;
isNav = (navigator.appName.indexOf("Netscape") != -1) ? true : false;
isIE = (navigator.appName.indexOf("Microsoft") != -1) ? true : false;

Calendar.Months = ["January", "February", "Mars", "April", "Mai", "June",
"July", "August", "September", "October", "November", "Desember"];

// Fjöldi daga í mánuði í ári sem ekki er hlaupár.
Calendar.DOMonth = [31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31];
// Fjöldi daga í mánuði í ári sem er hlaupár.
Calendar.lDOMonth = [31, 29, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31];

function Calendar(p_item, p_WinCal, p_month, p_year, p_format) {
  if ((p_month == null) && (p_year == null))  return;

  if (p_WinCal == null)
    this.gWinCal = ggWinCal;
  else
    this.gWinCal = p_WinCal;
  
  if (p_month == null) {
    this.gMonthName = null;
    this.gMonth = null;
    this.gYearly = true;
  } else {
    this.gMonthName = Calendar.get_month(p_month);
    this.gMonth = new Number(p_month);
    this.gYearly = false;
  }

  this.gYear = p_year;
  this.gFormat = p_format;
  this.gBGColor = "white";
  this.gFGColor = "black";
  this.gTextColor = "black";
  this.gHeaderColor = "black";
  this.gReturnItem = p_item;
}

Calendar.get_month = Calendar_get_month;
Calendar.get_daysofmonth = Calendar_get_daysofmonth;
Calendar.calc_month_year = Calendar_calc_month_year;
Calendar.print = Calendar_print;

function Calendar_get_month(monthNo) {
  return Calendar.Months[monthNo];
}

function Calendar_get_daysofmonth(monthNo, p_year) {
  /* 
  Athuga hvort hlaupár sé ..
  1. Ártöl sem hægt er að deila með fjórum eru venjulega hlaupár nema...
  2. Ártöl sem hægt er að deila með 100 eru ekki hlaupár, nema...
  3. Ár sem líka er hægt að deila með 400 eru hlaupár.
  */
  if ((p_year % 4) == 0) {
    if ((p_year % 100) == 0 && (p_year % 400) != 0)
      return Calendar.DOMonth[monthNo];
  
    return Calendar.lDOMonth[monthNo];
  } else
    return Calendar.DOMonth[monthNo];
}

function Calendar_calc_month_year(p_Month, p_Year, incr) {
  /*
  Kemur með eins tölustafa fylki þar sem fyrsta víðlæga stærðin er 
  útreiknaður mánuður og önnur er útreiknað ár.
  eftir beitingu á hækkun/lækkun á mánuði eins og skilgreint er í 'incr' breytunni,
  mun 'incr' venjulega hafa 1/-1 til að fara í gegn um mánuðina.
  */
  var ret_arr = new Array();
  
  if (incr == -1) {
    // Afturábak
    if (p_Month == 0) {
      ret_arr[0] = 11;
      ret_arr[1] = parseInt(p_Year) - 1;
    }
    else {
      ret_arr[0] = parseInt(p_Month) - 1;
      ret_arr[1] = parseInt(p_Year);
    }
  } else if (incr == 1) {
    // Áfram
    if (p_Month == 11) {
      ret_arr[0] = 0;
      ret_arr[1] = parseInt(p_Year) + 1;
    }
    else {
      ret_arr[0] = parseInt(p_Month) + 1;
      ret_arr[1] = parseInt(p_Year);
    }
  }
  
  return ret_arr;
}

function Calendar_print() {
  ggWinCal.print();
}

function Calendar_calc_month_year(p_Month, p_Year, incr) {
  /*
  Kemur með eins tölustafa fylki þar sem fyrsta víðlæga stærðin er 
  útreiknaður mánuður og önnur er útreiknað ár.
  eftir beitingu á hækkun/lækkun á mánuði eins og skilgreint er í 'incr' breytunni,
  mun 'incr' venjulega hafa 1/-1 til að fara í gegn um mánuðina.
  */
  var ret_arr = new Array();
  
  if (incr == -1) {
    // Afturábak
    if (p_Month == 0) {
      ret_arr[0] = 11;
      ret_arr[1] = parseInt(p_Year) - 1;
    }
    else {
      ret_arr[0] = parseInt(p_Month) - 1;
      ret_arr[1] = parseInt(p_Year);
    }
  } else if (incr == 1) {
    // Áfram
    if (p_Month == 11) {
      ret_arr[0] = 0;
      ret_arr[1] = parseInt(p_Year) + 1;
    }
    else {
      ret_arr[0] = parseInt(p_Month) + 1;
      ret_arr[1] = parseInt(p_Year);
    }
  }
  
  return ret_arr;
}
/*  
Þetta er stuðningur við Netscape Navigator 3, við verðum að búa til object og 
svo láta það vera áður en aðal objectið er skapað 
*/
new Calendar();

Calendar.prototype.getMonthlyCalendarCode = function() {
  var vCode = "";
  var vHeader_Code = "";
  var vData_Code = "";
  
  //  Taflan byrjar hér
  vCode = vCode + "<TABLE WIDTH='100%' BORDER=0 CELLSPACING=0 CELLPADDING=1 BGCOLOR='#000000'><tr><td>\n<TABLE WIDTH='100%' BORDER=0 CELLSPACING=1 CELLPADDING=1>";
  
  vHeader_Code = this.cal_header();
  vData_Code = this.cal_data();
  vCode = vCode + vHeader_Code + vData_Code;
  
  vCode = vCode + "</td></tr></TABLE></TABLE>";
  
  return vCode;
}

Calendar.prototype.show = function() {
  var vCode = "";
  
  this.gWinCal.document.open();

  //  Hausinn á síðunni, doctype, head, title, ...
  this.wwrite("<!DOCTYPE HTML PUBLIC '-//W3C//DTD HTML 3.2 Final//EN'>");
  this.wwrite("<html>");
  this.wwrite("<head><title>Dagatal</title>");
  this.wwrite("<link rel=stylesheet href='css/date.css' type='text/css'>");
  this.wwrite("</head>");
  
  
  this.wwrite("<body " + 
    "link=\"" + this.gLinkColor + "\" " + 
    "vlink=\"" + this.gLinkColor + "\" " +
    "alink=\"" + this.gLinkColor + "\" " +
    "text=\"" + this.gTextColor + "\">");
  this.wwriteA("<B class='small'>");
  this.wwriteA(this.gMonthName + " " + this.gYear);
  this.wwriteA("</B><BR>");

  // Takkar áfram og afturábak fyrir mánuði og ár ...
  var prevMMYYYY = Calendar.calc_month_year(this.gMonth, this.gYear, -1);
  var prevMM = prevMMYYYY[0];
  var prevYYYY = prevMMYYYY[1];

  var nextMMYYYY = Calendar.calc_month_year(this.gMonth, this.gYear, 1);
  var nextMM = nextMMYYYY[0];
  var nextYYYY = nextMMYYYY[1];
  
  this.wwrite("\n<TABLE WIDTH='100%' BORDER=1 CELLSPACING=0 CELLPADDING=0 BGCOLOR='#e0e0e0'><TR><TD ALIGN=center>\n");
  this.wwrite("<A HREF=\"" +
    "javascript:window.opener.Build(" + 
    "'" + this.gReturnItem + "', '" + this.gMonth + "', '" + (parseInt(this.gYear)-1) + "', '" + this.gFormat + "'" +
    ");" +
    "\"><b>&lt;Year</b><\/A></TD>\n<TD ALIGN=center>");
  this.wwrite("<A HREF=\"" +  "javascript:window.opener.Build(" + 
    "'" + this.gReturnItem + "', '" + prevMM + "', '" + prevYYYY + "', '" + this.gFormat + "'" +
    ");" +
    "\"><b>&lt;month</b><\/A></TD>\n<TD ALIGN=center>");
  this.wwrite("<A HREF=\"" +
    "javascript:window.opener.Build(" + 
    "'" + this.gReturnItem + "', '" + nextMM + "', '" + nextYYYY + "', '" + this.gFormat + "'" +
    ");" +
    "\"><b>month&gt;</b><\/A></TD>\n<TD ALIGN=center>");
  this.wwrite("<A HREF=\"" +
    "javascript:window.opener.Build(" + 
    "'" + this.gReturnItem + "', '" + this.gMonth + "', '" + (parseInt(this.gYear)+1) + "', '" + this.gFormat + "'" +
    ");" +
    "\"><b>Year&gt;</b><\/A></TD>\n</TR>\n</TABLE><BR>");

  // Ná í allan kóðann fyrir dagatalið í mánuðinum ...
  vCode = this.getMonthlyCalendarCode();
  this.wwrite(vCode);

  this.wwrite("</font></body></html>");
  this.gWinCal.document.close();
}

Calendar.prototype.showY = function() {
  var vCode = "";
  var i;
  var vr, vc, vx, vy;    // Röð, Dálkur, X-hnit, Y-hnit
  var vxf = 285;      // X-Factor
  var vyf = 200;      // Y-Factor
  var vxm = 10;      // X-margin
  var vym;        // Y-margin
  if (isIE)  vym = 75;
  else if (isNav)  vym = 25;
  
  this.gWinCal.document.open();

  this.wwrite("<html>");
  this.wwrite("<head><title>Calendar</title>");
  this.wwrite("<style type='text/css'>\n<!--");
  for (i=0; i<12; i++) {
    vc = i % 3;
    if (i>=0 && i<= 2)  vr = 0;
    if (i>=3 && i<= 5)  vr = 1;
    if (i>=6 && i<= 8)  vr = 2;
    if (i>=9 && i<= 11)  vr = 3;
    
    vx = parseInt(vxf * vc) + vxm;
    vy = parseInt(vyf * vr) + vym;

    this.wwrite(".lclass" + i + " {position:absolute;top:" + vy + ";left:" + vx + ";}");
  }
  this.wwrite("-->\n</style>");
  this.wwrite("</head>");

  this.wwrite("<body " + 
    "link=\"" + this.gLinkColor + "\" " + 
    "vlink=\"" + this.gLinkColor + "\" " +
    "alink=\"" + this.gLinkColor + "\" " +
    "text=\"" + this.gTextColor + "\">");
  this.wwrite("<FONT FACE='" + fontface + "' SIZE=2><B>");
  this.wwrite("Year : " + this.gYear);
  this.wwrite("</B><BR>");

  // Takkar áfram og afturábak fyrir mánuði og ár ...
  var prevYYYY = parseInt(this.gYear) - 1;
  var nextYYYY = parseInt(this.gYear) + 1;
  
  this.wwrite("<TABLE WIDTH='100%' BORDER=0 CELLSPACING=0 CELLPADDING=0 BGCOLOR='#e0e0e0'><TR>\n<TD ALIGN=center>\n");
  this.wwrite("[<A HREF=\"" +
    "javascript:window.opener.Build(" + 
    "'" + this.gReturnItem + "', null, '" + prevYYYY + "', '" + this.gFormat + "'" +
    ");" +
    "\" alt='Prev Year'><ár<\/A>]</TD>\n<TD ALIGN=center>");
  this.wwrite("[<A HREF=\"javascript:window.print();\">Print</A>]</TD>\n<TD ALIGN=center>");
  this.wwrite("[<A HREF=\"" +
    "javascript:window.opener.Build(" + 
    "'" + this.gReturnItem + "', null, '" + nextYYYY + "', '" + this.gFormat + "'" +
    ");" +
    "\">ár><\/A>]</TD>\n</TR>\n</TABLE><BR>");

  // Ná í allan kóðann fyrir dagatalið í mánuðinum ...
  var j;
  for (i=11; i>=0; i--) {
    if (isIE)
      this.wwrite("<DIV ID=\"layer" + i + "\" CLASS=\"lclass" + i + "\">");
    else if (isNav)
      this.wwrite("<LAYER ID=\"layer" + i + "\" CLASS=\"lclass" + i + "\">");

    this.gMonth = i;
    this.gMonthName = Calendar.get_month(this.gMonth);
    vCode = this.getMonthlyCalendarCode();
    this.wwrite(this.gMonthName + "/" + this.gYear + "<BR>");
    this.wwrite(vCode);

    if (isIE)
      this.wwrite("</DIV>");
    else if (isNav)
      this.wwrite("</LAYER>");
  }

  this.wwrite("</font><BR></body></html>");
  this.gWinCal.document.close();
}

Calendar.prototype.wwrite = function(wtext) {
  this.gWinCal.document.writeln(wtext);
}

Calendar.prototype.wwriteA = function(wtext) {
  this.gWinCal.document.write(wtext);
}

Calendar.prototype.cal_header = function() {
  var vCode = "";
  
  vCode = vCode + "<TR>";
  vCode = vCode + "<TD WIDTH='14%' bgcolor='#ffffff'><b class='small'>Sun</b></TD>\n";
  vCode = vCode + "<TD WIDTH='14%' bgcolor='#ffffff'><B class='small'>Mon</B></TD>\n";
  vCode = vCode + "<TD WIDTH='14%' bgcolor='#ffffff'><B class='small'>Tue</B></TD>\n";
  vCode = vCode + "<TD WIDTH='14%' bgcolor='#ffffff'><B class='small'>Wed</B></TD>\n";
  vCode = vCode + "<TD WIDTH='14%' bgcolor='#ffffff'><B class='small'>Thu</B></TD>\n";
  vCode = vCode + "<TD WIDTH='14%' bgcolor='#ffffff'><B class='small'>Fri</B></TD>\n";
  vCode = vCode + "<TD WIDTH='16%' bgcolor='#ffffff'><b class='small'>Sat</b></TD>\n";
  vCode = vCode + "</TR>";
  
  return vCode;
}

Calendar.prototype.cal_data = function() {
  var vDate = new Date();
  vDate.setDate(1);
  vDate.setMonth(this.gMonth);
  vDate.setFullYear(this.gYear);

  var vFirstDay=vDate.getDay();
  var vDay=1;
  var vLastDay=Calendar.get_daysofmonth(this.gMonth, this.gYear);
  var vOnLastDay=0;
  var vCode = "";

  /*
  Ná í vikudag fyrir fyrsta dag mánaðarins/ársins ...
  Setja inn eins marga tóma reiti fyrir fyrsta dag mánaðarins eins og þörf er á...
  */

  vCode = vCode + "<TR bgcolor='#ffffff' align='center'>\n";
  for (i=0; i<vFirstDay; i++) {
    vCode = vCode + "<TD WIDTH='14%'" + this.write_weekend_string(i) + "><small>&nbsp;</small></TD>\n";
  }

  // Skrifa út það sem eftir er af vikunni ...
  for (j=vFirstDay; j<7; j++) {
    vCode = vCode + "<TD WIDTH='14%'" + this.write_weekend_string(j) + "><FONT SIZE='2' FACE='" + fontface + "'>" + 
      "<A HREF='#' " + 
        "onClick=\"self.opener.document." + this.gReturnItem + ".value='" + 
        this.format_data(vDay) + 
        "';window.close();\" class='small'>" + 
        this.format_day(vDay) + 
      "</A>" + 
      "</FONT></TD>\n";
    vDay=vDay + 1;
  }
  vCode = vCode + "\n</TR>";

  // Skrifa út það sem eftir er af vikunni ...
  for (k=2; k<7; k++) {
    vCode = vCode + "<TR bgcolor='#ffffff' align='center'>\n";

    for (j=0; j<7; j++) {
      vCode = vCode + "<TD WIDTH='14%'" + this.write_weekend_string(j) + "" + this.gBGColor + "><FONT SIZE='2' FACE='" + fontface + "'>" + 
        "<A HREF='#' " + 
          "onClick=\"self.opener.document." + this.gReturnItem + ".value='" + 
          this.format_data(vDay) + 
          "';window.close();\" class='small'>" + 
        this.format_day(vDay) + 
        "</A>" + 
        "</FONT></TD>\n";
      vDay=vDay + 1;

      if (vDay > vLastDay) {
        vOnLastDay = 1;
        break;
      }
    }

    if (j == 6)
      vCode = vCode + "\n</TR>";
    if (vOnLastDay == 1)
      break;
  }
  // Setja inn síðustu daga síðustu viku svo að við fáum fallega ferhyrnta kassa
  for (m=1; m<(7-j); m++) {
    if (this.gYearly)
      vCode = vCode + "<TD WIDTH='14%'" + this.write_weekend_string(j+m) + 
      "><small>&nbsp;</small></TD>\n";
    else
      vCode = vCode + "<TD WIDTH='14%'" + this.write_weekend_string(j+m) + 
      "><small>" + m + "</small></TD>\n";
  }

  return vCode;
}

Calendar.prototype.format_day = function(vday) {
  var vNowDay = gNow.getDate();
  var vNowMonth = gNow.getMonth();
  var vNowYear = gNow.getFullYear();

  if (vday == vNowDay && this.gMonth == vNowMonth && this.gYear == vNowYear)
    return ("<FONT COLOR=\"RED\"><B>" + vday + "</B></FONT>\n");
  else
    return (vday);
}

Calendar.prototype.write_weekend_string = function(vday) {
  var i;

  // Skila sérstöku útliti á laugardögum og sunnudögum
  for (i=0; i<weekend.length; i++) {
    if (vday == weekend[i])
      return (" BGCOLOR=\"" + weekendColor + "\"");
  }
  
  return "";
}

Calendar.prototype.format_data = function(p_day) {
  var vData;
  var vMonth = 1 + this.gMonth;
  vMonth = (vMonth.toString().length < 2) ? "0" + vMonth : vMonth;
  var vMon = Calendar.get_month(this.gMonth).substr(0,3).toUpperCase();
  var vFMon = Calendar.get_month(this.gMonth).toUpperCase();
  var vY4 = new String(this.gYear);
  var vY2 = new String(this.gYear.substr(2,2));
  var vDD = (p_day.toString().length < 2) ? "0" + p_day : p_day;

  switch (this.gFormat) {
    case "DD\/MM\/YYYY" :
      vData = vMonth + "\/" + vDD + "\/" + vY4;
      break;
    case "DD\/MM\/YY" :
      vData = vMonth + "\/" + vDD + "\/" + vY2;
      break;
    case "DD-MM-YYYY" :
      vData = vMonth + "-" + vDD + "-" + vY4;
      break;
    case "DD-MM-YY" :
      vData = vMonth + "-" + vDD + "-" + vY2;
      break;

    case "DD\/MON\/YYYY" :
      vData = vDD + "\/" + vMon + "\/" + vY4;
      break;
    case "DD\/MON\/YY" :
      vData = vDD + "\/" + vMon + "\/" + vY2;
      break;
    case "DD-MON-YYYY" :
      vData = vDD + "-" + vMon + "-" + vY4;
      break;
    case "DD-MON-YY" :
      vData = vDD + "-" + vMon + "-" + vY2;
      break;

    case "DD\/MONTH\/YYYY" :
      vData = vDD + "\/" + vFMon + "\/" + vY4;
      break;
    case "DD\/MONTH\/YY" :
      vData = vDD + "\/" + vFMon + "\/" + vY2;
      break;
    case "DD-MONTH-YYYY" :
      vData = vDD + "-" + vFMon + "-" + vY4;
      break;
    case "DD-MONTH-YY" :
      vData = vDD + "-" + vFMon + "-" + vY2;
      break;

    case "DD\/MM\/YYYY" :
      vData = vDD + "\/" + vMonth + "\/" + vY4;
      break;
    case "DD\/MM\/YY" :
      vData = vDD + "\/" + vMonth + "\/" + vY2;
      break;
    case "DD-MM-YYYY" :
      vData = vDD + "-" + vMonth + "-" + vY4;
      break;
    case "DD-MM-YY" :
      vData = vDD + "-" + vMonth + "-" + vY2;
      break;

    default :
      vData = vDD + "\." + vMonth + "\." + vY4;
  }

  return vData;
}

function Build(p_item, p_month, p_year, p_format) {
  var p_WinCal = ggWinCal;
  gCal = new Calendar(p_item, p_WinCal, p_month, p_year, p_format);

  // Stilla liti dagatalsins hér..
  gCal.dBGColor="white";
  gCal.gBGColor="white";
  gCal.gLinkColor="black";
  gCal.gTextColor="black";
  gCal.gHeaderColor="darkblue";

  // Birta viðeigandi birtingaformat
  if (gCal.gYearly)  gCal.showY();
  else  gCal.show();
}

function show_calendar() {
  /* 
    p_month : 0-11 fyrir Jan-Des; 12 fyrir alla mánuði.
    p_year  : 4-tölustafa ártal
    p_format: Dagsetningaformat (mm/dd/ár, dd/mm/yy, ...)
    p_item  : Skila.
  */

  p_item = arguments[0];
  if (arguments[1] == null)
    p_month = new String(gNow.getMonth());
  else
    p_month = arguments[1];
  if (arguments[2] == "" || arguments[2] == null)
    p_year = new String(gNow.getFullYear().toString());
  else
    p_year = arguments[2];
  if (arguments[3] == null)
    p_format = "DD.MM.YYYY";
  else
    p_format = arguments[3];

  vWinCal = window.open("", "Calendar", 
    "width=220,height=180,status=no,resizable=no,top=200,left=200");
  vWinCal.opener = self;
  ggWinCal = vWinCal;

  Build(p_item, p_month, p_year, p_format);
}
/*
Árlegur dagatalskóði byrjar hér
*/
function show_yearly_calendar(p_item, p_year, p_format) {
  // Sækja grunneigindi ..
  if (p_year == null || p_year == "")
    p_year = new String(gNow.getFullYear().toString());
  if (p_format == null || p_format == "")
    p_format = "DD.MM.YYYY";

  var vWinCal = window.open("", "Calendar", "scrollbars=yes");
  vWinCal.opener = self;
  ggWinCal = vWinCal;

  Build(p_item, null, p_year, p_format);
}


