//
// Copyright © Anygraaf Oy. All rights reserved.
//

AgDateLocale = {
	en: {
		n: ['Jan', 'Feb', 'Mar', 'Apr', 'May', 'Jun', 'Jul', 'Aug', 'Sep', 'Oct', 'Nov', 'Dec'],
		N: ['January', 'February', 'March', 'April', 'May', 'June', 'July', 'August', 'September', 'October', 'November', 'December'],
		l: ['Sun', 'Mon', 'Tue', 'Wed', 'Thu', 'Fri', 'Sat'],
		L: ['Sunday', 'Monday', 'Tuesday', 'Wednesday', 'Thursday', 'Friday', 'Saturday'],
		a: ['am', 'pm'],
		A: ['AM', 'PM'],
		datetime: '%l, %D %n %Y %H:%I:%S',
		date: '%D %n %Y',
		time: '%H:%I:%S'
	},
	fi: {
		n: ['Tam', 'Hel', 'Maa', 'Huh', 'Tou', 'Kes', 'Hei', 'Elo', 'Syy', 'Lok', 'Mar', 'Jou'],
		N: ['Tammikuuta', 'Helmikuuta', 'Maaliskuuta', 'Huhtikuuta', 'Toukokuuta', 'Kesäkuuta', 'Heinäkuuta', 'Elokuuta', 'Syyskuuta', 'Lokakuuta', 'Marraskuuta', 'Joulukuuta'],
		l: ['Su', 'Ma', 'Ti', 'Ke', 'To', 'Pe', 'La'],
		L: ['Sunnuntai', 'Maanantai', 'Tiistai', 'Keskiviikko', 'Torstai', 'Perjantai', 'Lauantai'],
		Lna: ['Sunnuntaina', 'Maanantaina', 'Tiistaina', 'Keskiviikkona', 'Torstaina', 'Perjantaina', 'Lauantaina'],
		a: ['am', 'pm'],
		A: ['AM', 'PM'],
		datetime: '%w.%m.%Y %H:%I:%S',
		date: '%d.%m.%Y',
		time: '%H:%I:%S'
	}
}
function AgDateString(date, locale)
{
	var loc = AgDateLocale[locale || AgLocale];
	return AgDateFormat(date, loc.date, locale);
}
function AgDateFormat(date, format, locale)
{
	var locale = AgDateLocale[locale || AgLocale];
	var out = format;
	var y = date.getFullYear(),
		m = date.getMonth(),
		d = date.getDate(),
		w = date.getDay(),
		h = date.getHours(),
		i = date.getMinutes(),
		s = date.getSeconds(),
		w = date.getDay()
		z = date.getTimezoneOffset();
	out = AgDateFormatReplace(
		out,
		{
			'%y': ('' + y).slice(2),
			'%Y': y,
			'%m': m + 1,
			'%M': AgDateFormatZeroPadding(m + 1,2),
			'%n': locale['n'][m],
			'%N': locale['N'][m],
			'%d': d,
			'%D': AgDateFormatZeroPadding(d,2),
			'%l': locale['l'][w],
			'%L': locale['L'][w],
			'%w': w,
			'%h': h,
			'%H': AgDateFormatZeroPadding(h,2),
			'%g': h % 12 || 12,
			'%G': AgDateFormatZeroPadding(h % 12 || 12,2),
			'%i': i,
			'%I': AgDateFormatZeroPadding(i,2),
			'%s': s,
			'%S': AgDateFormatZeroPadding(s,2),
			'%a': locale['a'][Math.floor(h / 12 || 1)],
			'%A': locale['A'][Math.floor(h / 12 || 1)]
		}
	);
	return out;
}
function AgDateFormatReplace (string, patterns)
{
	for (var i in patterns)
		string = string.replace(new RegExp(i, 'g'), patterns[i]);
	return string;
}
function AgDateFormatZeroPadding (n,len)
{
	var out = new String(n);
	while(out.length < len)
		out = '0'+out;
	return out;
}
function AgFormatDate(date)
{
	var ret = date.getFullYear();
	if(date.getMonth()+1 < 10)
		ret += "0";
	ret += String(date.getMonth()+1);
	if(date.getDate() < 10)
		ret += "0";
	ret += String(date.getDate());
	return ret;
}

function AgLoadFormattedDate(date)
{
	var out = new Date();
	var datestr = new String(date);
	var y = parseInt(datestr.substr(0,4));
	var m = (datestr[4] == "0"?parseInt(datestr.substr(5,1)):parseInt(datestr.substr(4,2)));
	var d = (datestr[6] == "0"?parseInt(datestr.substr(7,1)):parseInt(datestr.substr(6,2)));
	out.setFullYear(y,m-1,d);
	out.setHours(0,0,0,0);
	return out;
}

function AgWeekNumber(date)
{
    var year = date.getFullYear(),
		month = date.getMonth()+1,
		day = date.getDate();

    var a = Math.floor((14-(month))/12);
    var y = year+4800-a;
    var m = (month)+(12*a)-3;
    var jd = day + Math.floor(((153*m)+2)/5) + 
                 (365*y) + Math.floor(y/4) - Math.floor(y/100) + 
                 Math.floor(y/400) - 32045;

    var d4 = (jd+31741-(jd%7))%146097%36524%1461;
    var L = Math.floor(d4/1460);
    var d1 = ((d4-L)%365)+L;
    NumberOfWeek = Math.floor(d1/7) + 1;
    return NumberOfWeek;        
}

function AgWeekDayIndex(day, offset)
{
	day -= offset;
	if(day < 0)
		return 7+day;
	else return day;
}
function AgWeekDayStr(day)
{
	switch (day)
	{
		case 0: return "ma";
		case 1: return "ti";
		case 2: return "ke";
		case 3: return "to";
		case 4: return "pe";
		case 5: return "la";
		case 6: return "su"; 
	}
}
function AgCalendar (retFunc)
{
	this.m_date = new Date();
	this.m_currDate = new Date();
	this.m_currStartDate = new Date();
	if(!AgIsSet(this.m_mainDiv))
		this.m_mainDiv = document.createElement("div");
	this.m_retFunc = retFunc
	
	Init();
	function Init()
	{
		var body = document.getElementsByTagName("body")[0];
		this.m_mainDiv.className = "calendar";
		var pos = AgGetMouse();
		this.m_mainDiv.style.position="absolute";
		this.m_mainDiv.style.top = pos.y+"px";
		this.m_mainDiv.style.left = pos.x+"px";
		body.appendChild(this.m_mainDiv);
		Draw();
	}
	function Draw ()
	{
		m_currDate = new Date(m_currStartDate);
		var child;
		while( child = this.m_mainDiv.firstChild )
			this.m_mainDiv.removeChild(child);
			
		var controlT = document.createElement("table"); m_mainDiv.appendChild(controlT);
		var controlTB = document.createElement("tbody"); controlT.appendChild(controlTB);
		var controlTR = document.createElement("tr"); controlTB.appendChild(controlTR);
		controlT.className = "control";
	
		var controlTD = document.createElement("td"); controlTR.appendChild(controlTD);
		var prevMonth = document.createElement("a"); controlTD.appendChild(prevMonth);
		prevMonth.appendChild(document.createTextNode("<"));
		prevMonth.change = this.m_currDate.getMonth();
		prevMonth.onclick = AgCalendarClickHelper;
		prevMonth.calendar = this; prevMonth.href="#";
	
		var controlTD = document.createElement("td"); controlTR.appendChild(controlTD);
		var monthSel = document.createElement("select"); controlTD.appendChild(monthSel);
		monthSel.calendar = this;
		monthSel.onchange = AgCalendarClickHelper;
		for(var i=1; i < 13; i++)
		{
			var option = document.createElement("option");
			option.value = i;
			option.appendChild(document.createTextNode(i));
			if(i == this.m_currDate.getMonth()+1)
				option.defaultSelected = option.selected = true;
			monthSel.appendChild(option);
		}
		
		var controlTD = document.createElement("td"); controlTR.appendChild(controlTD);
		var nextMonth = document.createElement("a"); controlTD.appendChild(nextMonth);
		nextMonth.appendChild(document.createTextNode(">"));
		nextMonth.change = this.m_currDate.getMonth()+2;
		nextMonth.onclick = AgCalendarClickHelper;
		nextMonth.calendar = this; nextMonth.href="#";
		
		var controlTD = document.createElement("td"); controlTR.appendChild(controlTD);
		var prevYear = document.createElement("a"); controlTD.appendChild(prevYear);
		prevYear.appendChild(document.createTextNode("<"));
		prevYear.change = this.m_currDate.getFullYear()-1;
		prevYear.onclick = AgCalendarClickHelper;
		prevYear.calendar = this; prevYear.href="#";
		
		var controlTD = document.createElement("td"); controlTR.appendChild(controlTD);
		var yearSel = document.createElement("select"); controlTD.appendChild(yearSel);
		yearSel.calendar = this;
		yearSel.onchange = AgCalendarClickHelper;
		for(var i=0; i < 5; i++)
		{
			var y = this.m_currStartDate.getFullYear()-i+2;
			var option = document.createElement("option");
			option.value = y;
			option.appendChild(document.createTextNode(y));
			if(this.m_currStartDate.getFullYear() == y)
				option.defaultSelected = option.selected = true;
			yearSel.appendChild(option);
		}
		
		var controlTD = document.createElement("td"); controlTR.appendChild(controlTD);
		var nextYear = document.createElement("a"); controlTD.appendChild(nextYear);
		nextYear.appendChild(document.createTextNode(">"));
		nextYear.change = this.m_currDate.getFullYear()+1;
		nextYear.onclick = AgCalendarClickHelper;
		nextYear.calendar = this; nextYear.href="#";
		
		var close = document.createElement("a");
		close.appendChild(document.createTextNode("Close"));
		close.calendar = this;
		close.onclick = AgCalendarClose;
		close.href = "#";
		close.className = "close";
		this.m_mainDiv.appendChild(close);
		var table = document.createElement("table");
		var thead = document.createElement("thead");
		var tr = document.createElement("tr");
		var th = document.createElement("th");
		tr.appendChild(th);
		for(var i=0; i < 7; i++)
		{
			th = document.createElement("th");
			th.appendChild(document.createTextNode(AgWeekDayStr(i)));
			tr.appendChild(th);
		}
		thead.appendChild(tr);
		table.appendChild(thead);
		
		this.m_currDate.setDate(1);
		var month = this.m_currDate.getMonth();
		var tbody = document.createElement("tbody");
		var tr = document.createElement("tr");
		if(AgWeekDayIndex(this.m_currDate.getDay(),1) != 0)
		{
			var td = document.createElement("td");
			td.appendChild(document.createTextNode(AgWeekNumber(this.m_currDate)));
			tr.appendChild(td);
			for(var i=0; i < AgWeekDayIndex(this.m_currDate.getDay(),1); i++)
			{
				var td = document.createElement("td");
				tr.appendChild(td);
			}
		}
		while(this.m_currDate.getMonth() == month)
		{
			if(AgWeekDayIndex(this.m_currDate.getDay(),1) == 0)
			{
				tbody.appendChild(tr);
				tr = document.createElement("tr");
				var td = document.createElement("td");
				td.appendChild(document.createTextNode(AgWeekNumber(this.m_currDate)));
				tr.appendChild(td);
			}
			var td = document.createElement("td");
			var a = document.createElement("a");
			a.appendChild(document.createTextNode(this.m_currDate.getDate()));
			a.href = '#';
			a.onclick = AgCalendarClickHelper;
			a.calendar = this;
			a.date = new Date(this.m_currDate);
			td.appendChild(a);
			if(	this.m_currDate.getDate() == this.m_date.getDate() &&
				this.m_currDate.getMonth() == this.m_date.getMonth()  &&
				this.m_currDate.getFullYear() == this.m_date.getFullYear())
					a.className = "today";
			tr.appendChild(td);
			this.m_currDate.setDate(this.m_currDate.getDate()+1);
		}
		tbody.appendChild(tr);
		table.appendChild(tbody);
		this.m_mainDiv.appendChild(table);
	}
	this.Select = Select;
	function Select(date)
	{
		Close();
		this.m_retFunc(date);
	}
	this.Change = Change;
	function Change(num)
	{
		if(num < 13)
			this.m_currStartDate.setMonth(num-1)
		else if(num > 1900)
			this.m_currStartDate.setFullYear(num)
		Draw();
	}
	this.Close = Close;
	function Close ()
	{
		var body = document.getElementsByTagName("body")[0];
		//this.m_mainDiv.style.display = "none";
		body.removeChild(this.m_mainDiv);
	}
}
function AgCalendarClickHelper ()
{
	if(AgIsSet(this.date))
		this.calendar.Select(this.date);
	else if(AgIsSet(this.change))
	{
		this.calendar.Change(this.change);
	}
	else
		this.calendar.Change(parseInt(this.options[this.selectedIndex].value));
	return false; // Prevents page refreshing on some browsers
}
function AgCalendarClose ()
{
	this.calendar.Close();
}
function AgFormatSqlTime(str)
{
	var out = "" + str.substr(0,2) + ":" + str.substr(2,2) + ":" + str.substr(4,2);
	return out;
}
