var weekend			= [5,6];
var weekendColor	= "#e0e0e0";
var fontface		= "Verdana";
var fontsize		= 2;
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",	  "March",  "April", "May", "june",
					"July", "August", "September", "October",	"November", "December" ];

// Set Non-Leap and Leap year Month days..
Calendar.DOMonth	= [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;

	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) {
	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){
	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;
}

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;
}*/

new Calendar();

Calendar.prototype.getMonthlyCalendarCode = function() {
	var vCode			= "";
	var vHeader_Code	= "";
	var vData_Code		= "";
	
	// Begin Table Drawing code here..
	vHeader_Code	= this.cal_header();
	vData_Code		= this.cal_data();
	vCode			= vCode + vHeader_Code + vData_Code;
	vCode			= vCode + "\n</table>";
	
	return vCode;
}

Calendar.prototype.show = function() {
	var vCode = "";
	
	this.gWinCal.document.open();

	// Setup the page...
	this.wwrite("<html>");
	this.wwrite("<head>\n<style type=\"text/css\">");
	this.wwrite(".monthyear{\n\tfont-family: Verdana, Tahoma, \"MS Sans Serif\", \"MS Serif\", Arial, Courier;");
	this.wwrite("\tfont-size: 11px;\n\tcolor: #000000;\n\tfont-weight: bold;\n}");
	this.wwrite(".weekdays{\n\tfont-family: Verdana, Tahoma, \"MS Sans Serif\", \"MS Serif\", Arial, Courier;");
	this.wwrite("\tfont-size: 10px;\n\tcolor: #006300;\n\tfont-weight: bold;\n\ttext-align: center;\n\tbackground-color: #9CFFCE;\n}");
	this.wwrite(".days{\n\tfont-family: Verdana, Tahoma, \"MS Sans Serif\", \"MS Serif\", Arial, Courier;");
	this.wwrite("\tfont-size: 10px;\n\tfont-weight: bold;\n\ttext-align: right;\n\tbackground-color: #FFFFCC;\n}");
	this.wwrite(".wedays{\n\tfont-family: Verdana, Tahoma, \"MS Sans Serif\", \"MS Serif\", Arial, Courier;");
	this.wwrite("\tfont-size: 10px;\n\ttext-align: right;\n\tfont-weight: bold;\n\tbackground-color: #FFE4C4;\n}");
	this.wwrite("</style>\n<title>Takvim</title></head>\n");
	
	this.wwrite("<body link=\"" + this.gLinkColor + "\" vlink=\"" + this.gLinkColor + "\" " +
		"alink=\"" + this.gLinkColor + "\" text=\"" + this.gTextColor + "\" marginwidth=\"0\"" +
		" marginheight=\"0\" topmargin=\"0\" leftmargin=\"5\" rightmargin=\"5\" bottommargin=\"5\">");

	// Show navigation buttons
	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("<table width=\"100%\" align=\"center\" cellpadding=\"1\" cellspacing=\"1\" border=\"0\">");
	this.wwrite("<tr>");
	this.wwrite("\t<td colspan=\"2\" class=\"monthyear\" align=\"left\">" + 
				"\n\t\t[<a href=\"javascript:window.opener.Build('" + this.gReturnItem + "', '" + this.gMonth +
				"', '" + (parseInt(this.gYear)-1) + "', '" + this.gFormat + "')\">&lt;&lt;</a>]&nbsp;" +
				"\n\t\t[<a href=\"javascript:window.opener.Build('" + this.gReturnItem + "', '" + prevMM +
				"', '" + prevYYYY + "', '" + this.gFormat + "')\">&lt;</a>]\n\t</td>");
	this.wwrite("\t<td colspan=\"3\" class=\"monthyear\" align=\"center\">" + this.gMonthName + " " + this.gYear + "</td>");
	this.wwrite("\t<td colspan=\"2\" class=\"monthyear\" align=\"right\">" +
				"\n\t\t[<a href=\"javascript:window.opener.Build('" + this.gReturnItem + "', '" + nextMM +
				"', '" + nextYYYY + "', '" + this.gFormat + "')\">&gt;</a>]&nbsp;" +
				"\n\t\t[<a href=\"javascript:window.opener.Build('" + this.gReturnItem + "', '" + this.gMonth +
				"', '" + (parseInt(this.gYear)+1) + "', '" + this.gFormat + "')\">&gt;&gt;</a>]\n\t</td>");
	this.wwrite("</tr>");
	
	// Get the complete calendar code for the month..
	vCode = this.getMonthlyCalendarCode();
	this.wwrite(vCode);

	this.wwrite("\n</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 + "\n\t<td width=\"15%\" class=\"weekdays\"><b>Mon</b></td>";
	vCode = vCode + "\n\t<td width=\"14%\" class=\"weekdays\"><b>Tue</b></td>";
	vCode = vCode + "\n\t<td width=\"14%\" class=\"weekdays\"><b>Wed</b></td>";
	vCode = vCode + "\n\t<td width=\"14%\" class=\"weekdays\"><b>Thu</b></td>";
	vCode = vCode + "\n\t<td width=\"14%\" class=\"weekdays\"><b>Fri</b></td>";
	vCode = vCode + "\n\t<td width=\"14%\" class=\"weekdays\"><b>Sat</b></td>";
	vCode = vCode + "\n\t<td width=\"15%\" class=\"weekdays\"><b>Sun</b></td>";
	vCode = vCode + "\n</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	= convert_wdays(vDate.getDay());
	var vDay		= 1;
	var vLastDay	= Calendar.get_daysofmonth(this.gMonth, this.gYear);
	var vOnLastDay	= 0;
	var vCode		= "";
	
	vCode = vCode + "\n<tr>";
	for (i = 0; i < vFirstDay; i++){
		vCode = vCode + "\n\t<td" + this.write_weekend_string(i) + ">&nbsp;</td>";
	}

	// Write rest of the 1st week
	for (j = vFirstDay; j < 7; j++){
		vCode =	vCode + "\n\t<td" + this.write_weekend_string(j) +
				"><a href=\"#\" onClick=\"self.opener.document." + this.gReturnItem + ".value='" +
				this.format_data(vDay) + "';window.close();\">" + this.format_day(vDay) + "</a>" + "&nbsp;</td>";
		vDay=vDay + 1;
	}
	vCode = vCode + "\n</tr>";

	// Write the rest of the weeks
	for (k = 2; k < 7; k++){
		vCode = vCode + "\n<tr>";
		
		for (j = 0; j < 7; j++){
			vCode =	vCode + "\n\t<td" + this.write_weekend_string(j) +
					"><a href=\"#\" onClick=\"self.opener.document." + this.gReturnItem + ".value='" +
					this.format_data(vDay) + "';window.close();\">" + this.format_day(vDay) + "</a>&nbsp;</td>";
			vDay = vDay + 1;

			if (vDay > vLastDay) {
				vOnLastDay = 1;
				break;
			}
		}

		if (j == 6)
			vCode = vCode + "\n</tr>";
		if (vOnLastDay == 1)
			break;
			
		vCode = vCode + "\n</tr>";
	}
	
	// Fill up the rest of last week with proper blanks, so that we get proper square blocks
	for (m = 1; m < (7-j); m++){
		vCode = vCode + "\n\t<td" + this.write_weekend_string(j+m) + ">&nbsp;</td>";
	}
	
	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) {
	var i;

	// Return special formatting for the weekend day.
	for (i = 0; i < weekend.length; i++) {
		if (vday == weekend[i])
			return (" class=\"wedays\"");
	}
	
	return " class=\"days\"";
}

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 = 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);

	// Customize your Calendar here..
	gCal.gBGColor		= "white";
	gCal.gLinkColor		= "black";
	gCal.gTextColor		= "black";

	gCal.show();
}

function show_calendar(){
	/* 
		p_month : 0-11 for Jan-Dec; 12 for All Months.
		p_year	: 4-digit year
		p_format: Date format (mm/dd/yyyy, dd/mm/yy, ...,)
		p_item	: Return Item.
	*/

	p_item = arguments[0];
	if (arguments[1] == null || arguments[1] == "")
		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 || arguments[3] == "")
		p_format = "DD.MM.YYYY";
	else
		p_format = arguments[3];

	vWinCal			= window.open("", "Calendar", "width=250,height=125,status=no,resizable=no,top=200,left=200");
	vWinCal.opener	= self;
	ggWinCal		= vWinCal;

	Build(p_item, p_month, p_year, p_format);
}

function convert_wdays(n_wd){
	switch(n_wd){
		case 0 :
			return 6;
			break;
		case 1 :
			return 0;
			break;
		case 2 :
			return 1;
			break;
		case 3 :
			return 2;
			break;
		case 4 :
			return 3;
			break;
		case 5 :
			return 4;
			break;
		case 6 :
			return 5;
			break;
	}
}
