﻿// JScript File

function $get(id)
{
	return document.getElementById(id);
}

var Calendar =
{
	dayName :
	{
		en : new Array('Sun','Mon','Tue','Wed','Thu','Fri','Sat'),
		es : new Array('Dom','Lun','Mar','Mie','Jue','Vie','Sab'),
		de : new Array('So','Mo','Di','Mi','Do','Fr','Sa'),
		vn : new Array('CN','Hai','Ba','Tư','Năm','Sáu','Bảy')
	},
	
	monthName : 
	{
		en : new Array('January','February','March','April','May','June','July','August','September','October','November','December'),
		es : new Array('Enero','Febrero','Marzo','Abril','Mayo','Junio','Julio','Agosto','Septiembre','Octubre','Noviembre','Diciembre'),
		de : new Array('Januar','Februar','März','April','Mai','Juni','Juli','August','September','Oktober','November','Dezember'),
		vn : new Array('Tháng Giêng','Tháng Hai','Tháng Ba','Tháng Tư','Tháng Năm','Tháng Sáu','Tháng Bảy','Tháng Tám','Tháng Chín','Tháng Mười','Tháng Mười Một','Tháng Mười Hai')
	},
	
	weekString : 
	{
		en : 'Wk',
		es : 'Sem',
		de : 'KW',
		vn : 'Tuần'
	},
	
	language			: 'vn',
	curDate				: null,
	selectedMonth		: null,
	selectedYear		: null,
	startAt				: 0,
	hideNextDays		: true,
	flagClose			: false,
	flagCloseCal		: false,
	OnDocClick			: null,
	curTbx				: '',


	Init : function()
	{
		if (this.selectedMonth == null || !this.selectedYear == null)
		{
			var today			= new Date();
			this.curDate		= new Date(today.getFullYear(), today.getMonth(), today.getDate());
			this.selectedMonth	= today.getMonth();
			this.selectedYear	= today.getFullYear();
		}
		
		var aNumDays		= [31, 0, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31];
		var numDaysInMonth	= 0;
		var startDate		= new Date(this.selectedYear, this.selectedMonth, 1);

		if (this.selectedMonth == 1) 
		{
			var endDate		= new Date (this.selectedYear, this.selectedMonth + 1, 1);
			endDate			= new Date (endDate - (24 * 60 * 60 * 1000));
			numDaysInMonth	= endDate.getDate();
		} 
		else 
			numDaysInMonth = aNumDays[this.selectedMonth];
		
		var arrDays = new Array();
		for (var i = 0, j = -1 ; i < numDaysInMonth ; i++)
		{
			var d = new Date(this.selectedYear, this.selectedMonth, i + 1);
			if (d.getDay() % 7 == 0 || i == 0)
			{
				arrDays[++j]	= new Array();
				arrDays[j][0]	= this.WeekNumber(d);
			}
			arrDays[j][d.getDay() + 1] = i + 1;
		}
		
		var html = "<table width='100%' style='font-family:Verdana;font-size:10px'><tr>";
		html += "<th width='27px' style='color:#000066'>" + this.weekString[this.language] + "</th>";
		html += "<td bgcolor='#d0d0d0' width='1' rowspan='7' style='padding: 0px;'></td>";
		var curDayName = this.dayName[this.language];
		for (var i = 0 ; i < curDayName.length ; i++)
		{
			//if (i == 6)
			html += "<th width='27px' style='color:#000066'>" + curDayName[i] + "</th>";
		}
		
		html += "</tr>";
		
		var curDate		= this.curDate.getDate();
		var curMonth	= this.curDate.getMonth();
		var curYear		= this.curDate.getFullYear();
		
		for (var i = 0 ; i < arrDays.length ; i++)
		{
			var week = arrDays[i];
			html += "<tr align='right'>";
			html += "<td style='padding-right:8px'>" + week[0] + "</td>";
			for (var j = 1 ; j < week.length ; j++)
			{
				if (week[j])
				{
					var color = (j == 1) ? "#ff0000" : ((j == 7) ? "#54a6e2" : "#000066");
					html += "<td style='cursor:pointer;padding-right:4px;color:";
					if (curDate == week[j] && this.selectedMonth == curMonth && this.selectedYear == curYear)
						html += color + ";background:#fff000;border:1px solid #A0A0A0;' onclick='Calendar.onDayClick(" + week[j] + ")'";
					else if (this.hideNextDays && new Date(this.selectedYear, this.selectedMonth, week[j]) > this.curDate)
						html += "#909090;cursor:default;'";
					else
						html += color + "' onclick='Calendar.onDayClick(" + week[j] + ")'";
					html += "' title='" + week[j] + "'>" + week[j] + "</td>";
				}
				else
					html += "<td></td>";
			}
			html += "</tr>";
		}
		html += "</table>";
		
		$get('Calendar_Content').innerHTML = html;
		this.InitMonth();
		this.InitYear();
	},
	
	InitMonth : function()
	{
		var html = "";
		
		var curMonthName = this.monthName[this.language];
		for (var i = 0 ; i < curMonthName.length ; i++)
		{
			html += "<div ";
			if (i == this.curDate.getMonth())
				html += "style='font-weight:bold' ";
			html += "onclick='Calendar.onMonthSelect(" + i + ")'>" + curMonthName[i] + "</div>";
		}		
		$get('Div_MonthSelect').innerHTML = html;
		$get('Div_MonthLabel').innerHTML = curMonthName[this.selectedMonth];
	},
	
	InitYear : function()
	{
		var html = "";
		for (var i = this.selectedYear - 3 ; i <= this.selectedYear + 3 ; i++)
		{
			html += "<div ";
			if (i == this.curDate.getFullYear())
				html += "style='font-weight:bold' ";
			html += "onclick='Calendar.onYearSelect(" + i + ")'>" + i + "</div>";
		}
		
		$get('Div_YearSelect').innerHTML = html;
		$get('Div_YearLabel').innerHTML = this.selectedYear;
	},
	
	onNextMonth : function(inc)
	{
		this.selectedMonth += inc;
		if (this.selectedMonth == 12)
		{
			this.selectedMonth = 0;
			this.selectedYear++;
		}
		if (this.selectedMonth == -1)
		{
			this.selectedMonth = 11;
			this.selectedYear--;
		}
		this.Init();
	},
	
	WeekNumber : function(n) 
	{
		var year = n.getFullYear();
		var month = n.getMonth() + 1;
		if (this.startAt == 0) {
			day = n.getDate() + 1;
		} else {
			day = n.getDate();
		}

		a = Math.floor((14 - month) / 12);
		y = year + 4800 - a;
		m = month + 12 * a - 3;
		b = Math.floor(y/4) - Math.floor(y/100) + Math.floor(y/400);
		J = day + Math.floor((153 * m + 2) / 5) + 365 * y + b - 32045;
		d4 = (((J + 31741 - (J % 7)) % 146097) % 36524) % 1461;
		L = Math.floor(d4 / 1460);
		d1 = ((d4 - L) % 365) + L;
		week = Math.floor(d1/7) + 1;

		return week;
	},
	
	onMonthSelect : function(month)
	{
		Calendar.showMonth(false);
		this.selectedMonth = month;
		this.Init();
	},
	
	onYearSelect : function(year)
	{
		Calendar.showYear(false);
		this.selectedYear = year;
		this.Init();
	},
	
	onCalendarClick : function()
	{
		if (Calendar.flagClose)
		{
			Calendar.showMonth(false);
			Calendar.showYear(false);
		}
	},
	
	showMonth : function(show)
	{
		$get('Div_MonthSelect').style.display = show ? '' : 'none';
	},
	
	showYear : function(show)
	{
		$get('Div_YearSelect').style.display = show ? '' : 'none';
	},
	
	onDayClick : function(day)
	{
		Calendar.flagCloseCal = true;
		Calendar.closeClendar();
		$get(this.curTbx).value = this.selectedYear + "/" + (this.selectedMonth + 1) + "/" + day;
		$get(this.curTbx).onchange();
	},
	
	getPosLeft : function(obj)
	{
		if (obj.parentNode && obj.parentNode != document.body)
			return obj.offsetLeft + Calendar.getPosLeft(obj.parentNode);
		return obj.offsetLeft;
	},
	
	getPosTop: function(obj)
	{
		if (obj.parentNode && obj.parentNode != document.body)
			return obj.offsetTop + Calendar.getPosLeft(obj.parentNode);
		return obj.offsetTop;
	},
	
	showCalendar : function(obj, lang, tbx)
	{
		this.curTbx = tbx;
		var cal = $get('CalendarControl');
		cal.style.display	= 'block';
		
		Calendar.language = lang;
		Calendar.Init();
		
//		cal.style.left		= (Calendar.getPosLeft(obj)) + "px";
//		cal.style.top		= Calendar.getPosTop(obj) + "px";
		document.onmouseup	= Calendar.closeClendar;
	},
	
	closeClendar : function()
	{
		if (Calendar.flagCloseCal == true)
		{
			document.onmouseup		= null;
			var cal					= $get('CalendarControl');
			cal.style.display		= 'none';
		}
		Calendar.flagCloseCal	= false;
	}
}