﻿Ka.Calendar = function(id, params)
{
	// resolve input args
	if (arguments.length == 3)
	{
		var btn = Ka.$(arguments[0]);
		id = arguments[1];
		params = arguments[2];
        
		// get tb
		var tb = Ka.$(id).childNodes[0].rows[0].cells[0].childNodes[0];

		if (btn.cal == null)
		{
			if (!params) params = {};
			params.inputField = tb;
			btn.cal = new Ka.Calendar(id, params);
		}
				
		if(btn._sdCal2)
		{
			btn._sdCal2=null;
			btn._sdCal=null;
			return;
		}
		
		if(btn._sdCal)
		{
			btn._sdCal=null;
			if(btn.cal.container&&btn.cal.container.style.display!='none')
				return;
		}
		
		if(btn.cal.container&&btn.cal.container.style.display!='none')
		{
			btn._sdCal2=1;
			btn.cal.hide();
			tb.focus();
			return;
		}
        
		// parse from txt        
		var dt = btn.cal.parse(tb.value);
		if (dt)
		{
			btn.cal.params.sdate = new Date(dt.getTime());
			btn.cal.params.date = dt;
			btn.cal.date = dt;
		}

		btn.cal.show();
		return;
	}

	// create calendar
	if (params != null && params.firstDay != null) params.firstDay %= 7;

	this.id = id;
	this.params = params ? params : {};

	// default params
	// firstDay: 0-sunday, 6-saturday
	var k, def = { firstDay: 0, date: new Date(), format: 'yyyy-MM-dd', className: 'ka-calendar', autoHide: true, lang: Date.LANG };
	for (k in def)
	{
		if (typeof (this.params[k]) != typeof (def[k]))
			this.params[k] = def[k];
	}
	if (params.inputField) this.params.inputField = Ka.$(params.inputField);
	if (params.onstatus) this.params.onstatus = params.onstatus;
	if (params.onchange) this.params.onchange = params.onchange;
	if (params.dtStart) this.params.dtStart = params.dtStart;
	if (params.dtEnd) this.params.dtEnd = params.dtEnd;

	this.params.sdate = new Date(this.params.date.getTime());
	this.date = this.params.date;
	this.className = this.params.className;
	eval('Ka.Calendar_' + id + '=this;');
}
Ka.Calendar.prototype.status = function(dt)
{
	if (this.params.dtStart && dt.getTime() < this.params.dtStart.getTime()) return false;
	if (this.params.dtEnd && dt.getTime() > this.params.dtEnd.getTime()) return false;
	if (typeof(this.params.onstatus) == 'function') return (this.params.onstatus(this, dt) ? true : false);

	return true;
}
Ka.Calendar.prototype.select = function(dt)
{
	if (typeof (dt) != typeof (new Date()))
		dt = new Date(dt);
	if(!this.status(this.date = dt))return false;
	if (this.params.sdate.getMonth() != dt.getMonth())
		this.params.sdate = new Date(dt.getTime());
	if (this.params.inputField)
	{
		this.params.inputField.value = this.toString(dt, this.params.format);
		if (this.onselect) this.onselect();
	}
	if (this.params.autoHide)
	{		
		if (this.params.inputField && !this.params.inputField.disabled)
			Ka.$select(this.params.inputField);
		
		var self=this;	
		var f=function()
		{
			self.hide();
			self._sdCal2=1;
		};
		setTimeout(f,15);
	}
    else
		this.show();
	if (this.params.onchange != null)
	{
		if (typeof(this.params.onchange) == 'function')
		{
			var c=this.params.onchange;
			c(this,this.date);
		}
		else
		{
			var e=this;
			dt=this.date;
			eval(this.params.onchange+'(e,dt);');
		}
	}
	return true;
}
Ka.Calendar.prototype.setMonth = function(m,dir,key)
{
	if(dir!=null&&key!=null)
	{
		if(key.ctrl)dir*=12;
		m = m + dir;
	}
	this.params.sdate.setMonth(m);
	this.show();
}
Ka.Calendar.prototype.setYear = function(y)
{
	this.params.sdate.setFullYear(y);
	this.show(y);
}
Ka.Calendar.prototype.show = function(y)
{
	var html = (y==null?this.renderMonth():this.renderYear());
	html = '<div class="'+this.className+'">'+html+'</div>';
	if (!this.container||this.container.style.display=='none')
	{
		if (this.params.inputField&&!this.params.inputField.disabled)
			this.params.inputField.focus();
		this.container = Ka.$popup(Ka.$(this.id).childNodes[0], html, {maxWidth:-1});
		// this.container.hide = function(){if(this._cal)this._cal.wasShown=0;if(this.style.display=='none')return false;this.scrollTop=0;this.style.display='none';if(this.sc)this.sc.style.display='none';return true;};
	}
	else
	{
		this.container.setHTML(html);
	}
	if(!this.container.childNodes[0]._calMUP)
	{
		this.container._calMUP=true;
		this.container.childNodes[0]._calMUP=true;
		this.container._cal=this;
		Ka.$attach(this.container.childNodes[0],'mouseup',function(e){
			e=e||window.event;e=e.target||e.srcElement;
			while(e&&!e._cal)e=e.parentNode;
			if(e&&e._cal)e._cal.params.inputField.focus();
		});
	}
	this.wasShown=1;
}
Ka.Calendar.prototype.hide = function()
{
	if(this.container)this.container.hide();
	this.wasShown=0;
}
Ka.Calendar.prototype.renderYear = function(dt)
{
	var html = '<table border="0" cellpadding="1" cellspacing="0" class="'+this.className+'">'
		+ '<tr><td align="center" class="'+this.className+'-monr">' + this.renderYearHeader(dt) + '</td></tr>'
		+ '<tr><td align="center">' + this.renderYearMonths(dt) + '</td></tr>'
		+ '</table>';
	return html;
}
Ka.Calendar.prototype.renderYearHeader = function(dt)
{
	if (!dt) dt = this.params.sdate;
	this.renderedMode = 2;
	
	// headers
	var html = '<table border="0" cellpadding="0" cellspacing="0" style="width:100%"><tr>'
		+ '<td class="'+this.className+'-larr"><div class="'+this.className+'-larr" onmouseover="this.className=\''+this.className+'-larr '+this.className+'-hover\';" onmouseout="this.className=\''+this.className+'-larr\';" onclick="Ka.Calendar_'+this.id+'.setYear('+(dt.getFullYear()-1)+');"></div></td>'
		+ '<td nowrap="nowrap" class="'+this.className+'-mon"><span onmouseover="this.className=\''+this.className+'-hover\';" onmouseout="this.className=\'\';" onclick="Ka.Calendar_'+this.id+'.show();";>'+this.toString('yyyy')+'</span></td>'
		+ '<td class="'+this.className+'-rarr"><div class="'+this.className+'-rarr" onmouseover="this.className=\''+this.className+'-rarr '+this.className+'-hover\';" onmouseout="this.className=\''+this.className+'-rarr\';" onclick="Ka.Calendar_'+this.id+'.setYear('+(dt.getFullYear()+1)+');"></div></td>'
		+ '</tr></table>';
		
	return html;
}
Ka.Calendar.prototype.renderYearMonths = function(dt)
{
	if (!dt) dt = this.params.sdate;
	var now = new Date();
	
	var html = '<table border="0" cellpadding="0" cellspacing="0" style="width:100%">';
	
	// draw months, 4 on a line
	html += '<tr class="'+this.className+'-month">';
	for(var i=0;i<12;i++)
	{
		if (i==4||i==8)
			html += '</tr><tr class="'+this.className+'-month">';
			
		var cn = this.className + '-month';
		if (i==now.getMonth()&&dt.getFullYear()==now.getFullYear())
			cn += ' '+this.className+'-todaymon';
		if (i==dt.getMonth())
				cn += ' '+this.className+'-activemon';
			
		html += '<td class="'+cn+'" onmouseover="this.className=\''+cn+' '+this.className+'-hover\';" onmouseout="this.className=\''+cn+'\';" onclick="Ka.Calendar_'+this.id+'.setMonth('+i+','+dt.getFullYear()+');">'+this.params.lang.amn[i]+'</td>';
	}
	html += '</tr></table>';
	
	return html;
}
Ka.Calendar.prototype.renderMonth = function(dt)
{
	var html = '<table border="0" cellpadding="1" cellspacing="0" class="'+this.className+'">'
		+ '<tr><td align="center" class="'+this.className+'-monr">' + this.renderMonthHeader(dt) + '</td></tr>'
		+ '<tr><td align="center">' + this.renderMonthDays(dt) + '</td></tr>'
		+ '</table>';
	return html;
}
Ka.Calendar.prototype.renderMonthHeader = function(dt)
{
	if (!dt) dt = this.params.sdate;
	this.renderedMode = 0;
	
	// headers
	var html = '<table border="0" cellpadding="0" cellspacing="0" style="width:100%"><tr>'
		+ '<td class="'+this.className+'-larr"><div class="'+this.className+'-larr" onmouseover="this.className=\''+this.className+'-larr '+this.className+'-hover\';" onmouseout="this.className=\''+this.className+'-larr\';" onclick="Ka.Calendar_'+this.id+'.setMonth('+dt.getMonth()+',-1,Ka.Key.special(event));"></div></td>'
		+ '<td nowrap="nowrap" class="'+this.className+'-mon"><span onmouseover="this.className=\''+this.className+'-hover\';" onmouseout="this.className=\'\';" onclick="Ka.Calendar_'+this.id+'.show('+(dt.getFullYear())+');">'+this.toString('MMMM yyyy')+'</span></td>'
		+ '<td class="'+this.className+'-rarr"><div class="'+this.className+'-rarr" onmouseover="this.className=\''+this.className+'-rarr '+this.className+'-hover\';" onmouseout="this.className=\''+this.className+'-rarr\';" onclick="Ka.Calendar_'+this.id+'.setMonth('+dt.getMonth()+',+1,Ka.Key.special(event));"></div></td>'
		+ '</tr></table>';
		
	return html;
}
Ka.Calendar.prototype.renderMonthDays = function(dt)
{
	if (!dt) dt = this.params.sdate;
	var now = new Date();

	var html = '<table border="0" cellpadding="0" cellspacing="0" style="width:100%">';
	
	// draw Su-Sa days starting on the first day
	html += '<tr class="'+this.className+'-wd">';
	for(var i=0;i<7;i++)
	{
		// current day - wdc
		var cn = this.className+'-wd'+(dt.getMonth()==now.getMonth()&&dt.getFullYear()==now.getFullYear()&&now.getDay()==(i+this.params.firstDay)%7?'-today':'');
		if ((i+this.params.firstDay)%7==0) cn += ' '+this.className+'-dsu';
		if ((i+this.params.firstDay)%7==6) cn += ' '+this.className+'-dsa';
		
		html += '<td nowrap="nowrap" class="'+cn+'">';
		html += this.params.lang.awn[(i+this.params.firstDay)%7];
		html += '</td>';
		if (i!=6) html += '<td rowspan="7" class="'+this.className+'-wds'+((i+this.params.firstDay)%7==6?'a':'')+'"><div></div></td>';
	}
	html += '</tr>';
	
	// draw 6 weeks, start with specific date
	// ktory den v tyzdni je prveho (napr. v stredu a podla firstDay sa zacne)
	// cize ak 1. je v 3 den a FD je 1 tak sa zacne o -2 dni, teda 1-3
	// ak 1. den je nedela a fd je 1 tak sa zacne 1-7 (firstDay-day
	var dtDate = new Date(dt.getFullYear(), dt.getMonth(), 1);
	var wd = dtDate.getDay();
	if (wd == 0) wd = 7;
	wd = (this.params.firstDay - wd) % 7;
	dtDate.setDate(dtDate.getDate() + wd);
	
	for(var j=0;j<6;j++) // weeks
	{
		html += '<tr class="'+this.className+'-day">';
		for(var i=0;i<7;i++)
		{
			var canSelect = this.status(dtDate);
			var cn = this.className + '-day';
			if (dtDate.getMonth()!=dt.getMonth()||dtDate.getFullYear()!=dt.getFullYear())
				cn = this.className + '-otherday';
			if (dtDate.getDate()==now.getDate()&&dtDate.getMonth()==now.getMonth()&&dtDate.getFullYear()==now.getFullYear())
				cn += ' '+this.className+'-today';
			
			if ((i+this.params.firstDay)%7==0) cn += ' '+this.className+'-dsu';
			if ((i+this.params.firstDay)%7==6) cn += ' '+this.className+'-dsa';
			
			if (dtDate.getDate()==this.date.getDate()&&dtDate.getMonth()==this.date.getMonth()&&dtDate.getFullYear()==this.date.getFullYear())
				cn += ' '+this.className+'-activeday';
			if (!canSelect)
				cn += ' '+this.className+'-inactive';
				
			if (canSelect)
				html += '<td class="'+cn+'" onmouseover="this.className=\''+cn+' '+this.className+'-hover\';" onmouseout="this.className=\''+cn+'\';" onclick="Ka.Calendar_'+this.id+'.select('+dtDate.getTime()+');">';
			else
				html += '<td class="'+cn+'">';
			html += dtDate.getDate();
			html += '</td>';
			
			// advance by 1 day
			dtDate.setDate(dtDate.getDate() + 1);
		}
		html += '</tr>';
	}
		
	html += '</table></td></tr>';
	return html;
}

Ka.Calendar.prototype.parse = function(s,format)
{
	if (!format) format = this.params.format;
	
	return Date.parseDate(s,format,this.params.lang);
}
Date.LANG={
	mn: ['January', 'February', 'March', 'April', 'May', 'June', 'July', 'August', 'September', 'October', 'November', 'December'],
	amn: ['Jan', 'Feb', 'Mar', 'Apr', 'May', 'Jun', 'Jul', 'Aug', 'Sep', 'Oct', 'Nov', 'Dec'],
	wn: ['Sunday', 'Monday', 'Tuesday', 'Wednesday', 'Thursday', 'Friday', 'Saturday'],
	awn: ['S', 'M', 'T', 'W', 'T', 'F', 'S'],
	tt: ['AM', 'PM']
};
Date.parseDate=function(s,format,lang)
{
	if (!format)format='yyyy-MM-dd';
	if(!lang)lang=Date.LANG;
	format=(''+format).replace(/^[\s]+|[\s+]$/,'');
	s=(''+s).replace(/\s+/g, ' ').replace(/^[\s]+|[\s+]$/,'');
	if(!s)return null;
	var date=new Date();
	
	var p_compare = function(A,B)
	{
		A=(''+A).replace(/^[\s]+|[\s+]$/,'').toLowerCase();
		B=(''+B).replace(/^[\s]+|[\s+]$/,'').toLowerCase();
		return (A==B);
	}
	
	var p_no = function(s1,pos)
	{
		var no1 = '', len = 0;
		while(pos<s1.length)
		{
			var c1 = s1.charAt(pos);
			if ('0123456789'.indexOf(c1,0)!=-1) no1 += c1;
			else break;
			pos++;
			len++;
		}
		if (no1=='') return null;
		return {v:parseInt(no1,10),l:len};
	}
	
	// deformat string
	var y = date.getFullYear();	
	var m = 1;
	var d = 1;
	var hh = 0, mm = 0, ss = 0, wd, msec = 0, usePM = false;
	var str = '', strE = '', inQ = false, inDQ = false, pos = 0, n = 0;
	format = ''+format;
	for(var i=0;i<=format.length;i++)
	{
		var c = (i==format.length?'':format.charAt(i));
		switch (c)
		{
			case '"':
				if (!inQ)
				{
					inDQ = !inDQ;
					// use char strE
					if (strE!='')
					{
						if (!p_compare(strE,s.substr(pos,strE.length))) return null;
						pos += strE.length;
					}
					strE = '';
				}
				break;
			case "'":
				if (!inDQ)
				{
					inQ = !inQ;
					// use char strE
					if (strE!='')
					{
						if (!p_compare(strE,s.substr(pos,strE.length))) return null;
						pos += strE.length;
					}
					strE = '';					
				}
				break;
			default:
				if (strE==''||strE.charAt(strE.length-1)!=c||i==format.length)
				{
					if (inQ||inDQ)
					{
						// use char strE
						if (strE!='')
						{
							if (!p_compare(strE,s.substr(pos,strE.length))) return null;
							pos += strE.length;
						}
					}
					else
					{						
						// use format strE
						// remove trailing whitespaces
						while(pos<s.length&&' \t\r\n'.indexOf(s.charAt(pos),0)!=-1)pos++;
						strE = strE.replace(/^[\s]+|[\s+]$/,'');
						switch (strE)
						{
							case 'D':
								wd = p_no(s,pos);
								if(wd==null) return null;
								pos += wd.l;
								wd = wd.v;
								break;
							case 'd':
							case 'dd':
								// look for numbers
								d = p_no(s,pos);
								if(d==null) return null;
								pos += d.l;
								d = d.v;
								break;
							case 'ddd':
							case 'dddd':
								// check what weekday is used
								var awnFound = false, awnItems = (strE=='ddd'?lang.awn:lang.wn);
								for(var awn=0;awn<awnItems.length;awn++)
									if (p_compare(awnItems[awn],s.substr(pos,awnItems[awn].length)))
									{
										awnFound = true;
										wd = awn;
										pos += awnItems[awn].length;
										break;
									}
								if (!awnFound) return null;
							case 'M':
							case 'MM':
								m = p_no(s,pos);
								if(m==null) return null;
								pos += m.l;
								m = m.v;
								break;
							case 'MMM':
							case 'MMMM':
								// check what month is used
								var awnFound = false, awnItems = (strE=='MMM'?lang.amn:lang.mn);
								for(var awn=0;awn<awnItems.length;awn++)
									if (p_compare(awnItems[awn],s.substr(pos,awnItems[awn].length)))
									{
										awnFound = true;
										m = (awn + 1);
										pos += awnItems[awn].length;
										break;
									}
								if (!awnFound) return null;							
								break;
							case 'y':
							case 'yy':
							case 'yyy':
							case 'yyyy':							
								y = p_no(s,pos);
								if(y==null) return null;
								pos += y.l;
								y = y.v;
								if (strE=='y'||strE=='yy')
								{
									if (y<10) y = (Math.floor(date.getFullYear() / 10)*10) + y;
									else if (y<100) y = (Math.floor(date.getFullYear() / 100)*100) + y;
								}
								break;
							case 'H':
							case 'HH':
							case 'h':
							case 'hh':
								var hhh = p_no(s,pos);
								if(hhh==null) break; // ignore HH
								pos += hhh.l;
								hh = hhh.v;
								break;
							case 'm':
							case 'mm':
								var mmm = p_no(s,pos);
								if(mmm==null) break; // ignore mm
								pos += mmm.l;
								mm = mmm.v;
								break;
							case 's':
							case 'ss':
								var sss = p_no(s,pos);
								if(sss==null) break; // ignore ss
								pos += sss.l;
								ss = sss.v;
								break;
							case 't':
							case 'tt':
								// check what tt is used
								var awnFound = false, awnItems = lang.tt;
								for(var awn=0;awn<awnItems.length;awn++)
									if (p_compare(strE=='t'?awnItems[awn].substr(0,1):awnItems[awn],s.substr(pos,strE=='t'?1:awnItems[awn].length)))
									{
										awnFound = true;
										usePM = (awn==1);
										pos += awnItems[awn].length;
										break;
									}
								if (!awnFound) break; // ignore								
								break;
							default:
								// use char strE
								if (strE!='')
								{
									if (!p_compare(strE,s.substr(pos,strE.length))) break; // ignore unknown chars
									pos += strE.length;
								}		
								break;				
						}
					}
					strE = '';
				}
				strE += c;	
				break;
		}	
	}
		
	if (y == null || m == null || d == null) return null;
	
	if (usePM && hh <= 12) hh += 12;
	
	return new Date(y, Math.min(m-1,11), Math.min(d,31), Math.min(23,hh), Math.min(59,mm), Math.min(59,ss), Math.min(999,msec));
}
Date.prototype.print=function(format,lang)
{
	var dt=this;
	if(!format)format = 'yyyy-MM-dd';
	if(!lang)lang = Date.LANG;
	if(!lang.firstDay)lang.firstDay=1;
	
	var y = dt.getFullYear();	
	var m = dt.getMonth()+1;
	var d = dt.getDate();
	var w = dt.getDay();
	var h = dt.getHours(), hh=h%12;
	var min = dt.getMinutes();
	var sec = dt.getSeconds();
	var k, s = {};
	
	s['dddd'] = lang.wn[w];												// weekday name
	s['ddd'] = lang.awn[w];												// weekday abbr name
	s['dd'] = (d<10?'0':'')+d;											// day, 2 digits (01 to 31)
	s['d'] = d; // month day											// day, 1 digit (1 to 31)
	s['D'] = 1+(w<lang.firstDay?7:0)+(w-lang.firstDay);	// week day number (1 to 7, based on firstDay)
	s['MMMM'] = lang.mn[m-1];											// month, full name
	s['MMM'] = lang.amn[m-1];											// month, abbr name
	s['MM'] = (m<10?'0':'')+m;											// month, 2 digits (01 to 12)
	s['M'] = m;															// month, 1 digit (1 to 12)
	s['yyyy'] = y;														// full year
	s['yyy'] = (''+y).substr(1, 3);										// year, 3 digits (i.e. 008)
	s['yy'] = (''+y).substr(2, 2);										// year, 2 digits (i.e. 08)
	s['y'] = (''+y).substr(3, 1);										// year, 1 digit (i.e. 8)
	s['HH'] = (h<10?'0':'')+h;
	s['H'] = h;
	s['hh'] = (hh<10?'0':'')+hh;
	s['h'] = hh;
	s['mm'] = (min<10?'0':'')+min;
	s['m'] = min;
	s['ss'] = (sec<10?'0':'')+sec;
	s['s'] = sec;
	s['tt'] = lang.tt[h<12?0:1];
	s['t'] = (''+lang.tt[h<12?0:1]).substr(0,1);
	
	// format string
	var str = '', strE = '', inQ = false, inDQ = false;
	format = ''+format;
	for(var i=0;i<=format.length;i++)
	{
		var c = (i==format.length?'':format.charAt(i));
		switch (c)
		{
			case '"':
				if (!inQ)
				{
					inDQ = !inDQ;
					str += strE;
					strE = '';
				}
				break;
			case "'":
				if (!inDQ)
				{
					inQ = !inQ;
					str += strE;
					strE = '';					
				}
				break;
			default:
				if (strE==''||strE.charAt(strE.length-1)!=c||i==format.length)
				{
					if (inQ||inDQ) str += strE;
					else
					{
						if (s[strE]!=null) str += s[strE];
						else if (strE.length > 4)
						{
							var se = strE.substr(0,4);
							if (s[se]!=null) str += s[se];
							else str += strE;
						}
						else if (strE.length > 2)
						{
							var se = strE.substr(0,2);
							if (s[se]!=null) str += s[se];
							else str += strE;					
						}
						else str += strE;
					}
					strE = '';
				}
				strE += c;	
				break;
		}	
	}
	
	return str;
}

Ka.Calendar.prototype.toString = function(dt,format)
{
	if(!format&&!dt)
	{
		format = 'yyyy-MM-dd';
		dt = this.params.sdate;
	}
	else if(!format&&typeof(dt)=='string')
	{
		format = dt;
		dt = this.params.sdate;
	}
	
	this.params.lang.firstDay=this.params.firstDay;	
	return dt.print(format,this.params.lang);
}
Ka.Calendar.processKey = function(e,evt)
{
	evt = window.event || evt;
	if (!evt) return;
	
	var key = evt.keyCode;
	var btn = e.parentNode.parentNode.cells[1].childNodes[0];
	if(key==Ka.Key.DOWN&&(btn.cal==null||btn.cal.container.style.display!='block'))
	{
		btn.onclick();
		return false;
	}	
	
	if (btn.cal==null) return true;	
	
	var dt = btn.cal.params.sdate;	
	if (!dt) dt = new Date();
	var bVisible = btn.cal.container.style.display=='block';
	if (bVisible){
	var spk = Ka.Key.special(evt);
	switch (key)
	{
		case Ka.Key.DOWN:
			if (btn.cal.renderedMode==2) btn.cal.params.sdate.setMonth(dt.getMonth()+4);
			else btn.cal.params.sdate.setDate(dt.getDate()+7);
			break;
		case Ka.Key.UP:
			if (btn.cal.renderedMode==2) btn.cal.params.sdate.setMonth(dt.getMonth()-4);
			else btn.cal.params.sdate.setDate(dt.getDate()-7);
			break;
		case Ka.Key.LEFT:
			if (btn.cal.renderedMode==2) btn.cal.params.sdate.setMonth(dt.getMonth()-(spk.ctrl?12:1));
			else if (spk.ctrl) btn.cal.params.sdate.setMonth(dt.getMonth()-1);
			else btn.cal.params.sdate.setDate(dt.getDate()-1);
			break;			
		case Ka.Key.RIGHT:
			if (btn.cal.renderedMode==2) btn.cal.params.sdate.setMonth(dt.getMonth()+(spk.ctrl?12:1));
			else if (spk.ctrl) btn.cal.params.sdate.setMonth(dt.getMonth()+1);
			else btn.cal.params.sdate.setDate(dt.getDate()+1);
			break;
		case Ka.Key.ENTER:
			btn.cal.select(dt);
			return false;
		case Ka.Key.ESC:
			btn.cal.hide();
			return false;
		default:
			return true;		
	}}
	else
		return true;
	
	btn.cal.date = new Date(btn.cal.params.sdate.getTime());
	btn.cal.show();	
	
	return false;
}
/**
 * Creates the calendar.
 * @id id of the element
 * @params = { name: 'post_name', value: '12/03/2009', format: 'dd/MM/yyyy', onstatus:function status check }
 */
Ka.Calendar.create = function(id,params)
{
	if(!params)params={};
	params.name=params.name||id;
	var p={firstDay:1,className:'ka-calendar',format:(params.format||'dd/MM/yyyy'),onstatus:params.onstatus};
	var w=parseInt(params.width||'100px');
	eval('Ka.Calendar_'+id+'_params=p;');
	var html = '<div id="'+id+'" style="display:inline-block;width:'+w+'px;vertical-align:baseline" onmousedown="this.KaPopupDiscard=1;">'
		+ '<table border="0" cellpadding="0" cellspacing="0" class="ka-calendar-control" style="width:'+w+'px;"><tr>'
		+ '<td width="99%"><input id="'+id+'_Txt" type="text" name="'+(''+params.name).htmlAttributeEscape()+'" value="'+(''+params.value).htmlAttributeEscape()+'" maxlength="32" size="12" class="ka-calendar-txt" onkeydown="return Ka.Calendar.processKey(this,event);" onfocus="var b=this.parentNode.parentNode.cells[1].childNodes[0];b._sdCal=1;b.onclick();" autocomplete="off" style="width:100%;" /></td>'
		+ '<td valign="middle" align="center" class="ka-calendar-btn"><div id="'+id+'_Btn" class="ka-calendar-btn" onclick="Ka.Calendar(this,\''+id+'\',Ka.Calendar_'+id+'_params);"></div></td>'
		+ '</tr></table></div>';
		
	document.write(html);
}
Ka.Calendar.s = {
	c:Ka.Img.preload(Ka.rootURL+'js/calendar/cal_left.png').src,
	a:Ka.Img.preload(Ka.rootURL+'js/calendar/cal_lefts.png').src,
	l:Ka.Img.preload(Ka.rootURL+'js/calendar/cal_mr.png').src,
	e:Ka.Img.preload(Ka.rootURL+'js/calendar/cal_right.png').src,
	n:Ka.Img.preload(Ka.rootURL+'js/calendar/cal_rights.png').src,
	d:Ka.Img.preload(Ka.rootURL+'js/calendar/cal_wds.png').src,
	o:Ka.Img.preload(Ka.rootURL+'js/calendar/cal_wdsa.png').src,
	r:Ka.Img.preload(Ka.rootURL+'js/calendar/calendar-dd.png').src
};
document.appendCss(Ka.rootURL+'js/calendar/calendar.css');