var weekendColor = "#e0e0e0";
var fontface     = "Verdana";
var fontsize     = 2;

var gNow = new Date();
var ggWinCal;

Calendar.Months   = ["Ocak", "Şubat", "Mart", "Nisan", "Mayıs", "Haziran", "Temmuz", "Ağustos", "Eylül", "Ekim", "Kasım", "Aralık"];
Calendar.ShorDays = ["Pzt", "Sal", "Çar", "Per", "Cum", "Cmt", "Pzr"];

Calendar.rDOMonth = [31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31];
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;
  }
  this.gWinCal      = (p_WinCal == null) ? ggWinCal : p_WinCal;
  this.gMonthName   = Calendar.get_month(p_month);
  this.gMonth       = new Number(p_month);
  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) {
  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.rDOMonth[monthNo];
  }
}

function Calendar_print() {
	ggWinCal.print();
}

function Calendar_calc_month_year(p_Month, p_Year, incr) {
	var ret_arr = new Array();
	if (incr == -1) {
		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) {
		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;
}

Calendar.prototype.getCalendarCode = function() {
  var vCode = "";
	vCode += "    <table border=\"1\" bgcolor=\"" + this.gBGColor + "\">" + "\n";
	vCode += this.cal_header() + "\n";
	vCode += this.cal_data() + "\n";
	vCode += "    </table>";
	return vCode;
}

Calendar.prototype.show = function() {
  var vCode = "";
  this.gWinCal.document.open();
  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("<html>");
  this.wwrite("  <head>");
  this.wwrite("    <title>Takvim</title>");
  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.gMonthName + " " + this.gYear + "</b><br>");
  this.wwrite("    <table width='100%' border=1 cellspacing=0 cellpadding=0 bgcolor='#e0e0e0'>");
  this.wwrite("      <tr>");
  this.wwrite("        <td align=center>[<a href=\"javascript:window.opener.Build('" + this.gReturnItem + "', '" + this.gMonth + "', '" + (parseInt(this.gYear)-1) + "', '" + this.gFormat + "');\"><<<\/a>]</td>");
  this.wwrite("        <td align=center>[<a href=\"javascript:window.opener.Build('" + this.gReturnItem + "', '" + prevMM      + "', '" + prevYYYY                 + "', '" + this.gFormat + "');\"><<\/a>]</td>");
  this.wwrite("        <td align=center>[<a href=\"javascript:window.print();\">Yazdır</a>]</td>");
  this.wwrite("        <td align=center>[<a href=\"javascript:window.opener.Build('" + this.gReturnItem + "', '" + nextMM      + "', '" + nextYYYY                 + "', '" + this.gFormat + "');\">><\/a>]</td>");
  this.wwrite("        <td align=center>[<a href=\"javascript:window.opener.Build('" + this.gReturnItem + "', '" + this.gMonth + "', '" + (parseInt(this.gYear)+1) + "', '" + this.gFormat + "');\">>><\/a>]</td>");
  this.wwrite("      </tr>");
  this.wwrite("    </table>");
  this.wwrite("    <br>");
  this.wwrite(this.getCalendarCode());
  this.wwrite("    </font>");
  this.wwrite("  </body>");
  this.wwrite("</html>");
  this.gWinCal.document.close();
}

Calendar.prototype.wwrite = function(wtext) {
  this.gWinCal.document.writeln(wtext);
}

Calendar.prototype.cal_header = function() {
  var vCode = "";
  vCode += "      <tr>\n";
  for (i = 0; i < 7; i++)
    vCode += "        <td width='14%'><font size='2' face='" + fontface + "' color='" + this.gHeaderColor + "'><b>" + Calendar.ShorDays[i] + "</b></font></td>\n";
  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() == 0 ? 7 : vDate.getDay();
  var vDay       = 1;
  var vLastDay   = Calendar.get_daysofmonth(this.gMonth, this.gYear);
  var vOnLastDay = false;
  var vCode      = "      <tr>\n";
  for (i = 1; i < vFirstDay; i++) {
    vCode += "        <td width='14%'" + this.write_weekend_string(i) + "><font size='2' face='" + fontface + "'>&nbsp;</font></td>\n";
  }
  for (j = vFirstDay; j <= 7; j++) {
    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();\">" + this.format_day(vDay) + "</a></font></td>\n";
    vDay++;
  }
  vCode += "      </tr>\n";
  for (k = 2; k < 7; k++) {
    vCode += (k == 2) ? "" : "      </tr>\n";
    vCode += "      <tr>\n";
    for (j = 1; j <= 7; j++) {
      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();\">" + this.format_day(vDay) + "</a></font></td>\n";
      if (++vDay > vLastDay) {
        vOnLastDay = true;
        break;
      }
    }
    if (vOnLastDay) {
      break;
    }
  }
  for (m = 1; m <= (7-j); m++) {
    vCode += "        <td width='14%'" + this.write_weekend_string(j+m) + ">&nbsp;</td>\n";
  }
  vCode += "      </tr>";
  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>";
  }
  else {
    return vday;
  }
}

Calendar.prototype.write_weekend_string = function(vday) {
  return (vday == 6 || vday == 7) ? (" bgcolor=\"" + weekendColor + "\"") : "";
}

Calendar.prototype.format_data = function(p_day) {
	var vData;
	var vMonth = 1 + this.gMonth;
	vMonth = (vMonth.toString().length < 2) ? "0" + vMonth : vMonth;
	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 = 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);
  gCal.gBGColor     = "white";
  gCal.gLinkColor   = "black";
  gCal.gTextColor   = "black";
  gCal.gHeaderColor = "darkgreen";
  gCal.show();
}

function onFocus(e) {
  ggWinCal.close();
}

function onKeyDown(e) {
  if (ggWinCal.event.keyCode == 27)
    ggWinCal.close();
}

function show_calendar() {
  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=250, height=250, status=no, resizable=no, top=200, left=200, dependent=yes, alwaysRaised=yes");
  vWinCal.opener = self;
  ggWinCal = vWinCal;
  ggWinCal.document.onkeydown = onKeyDown;
  Build(p_item, p_month, p_year, p_format);
  self.onfocus = onFocus;
}


