/*************************************************
class: calendar
version: 3.1
modified: 2008.05.12
project: Moon (v. 2.3)
author: Audrius Naslenas, audrius@vpu.lt
*************************************************/

function calendar(divID) {


this.output = function (date)
//sia funkcija reikia perrasyti savu metodu
{
	alert('output: '+date);
}

this.current = function (date)
//nustato, kuria diena kalendoriuje pazymeti
{
	if (date!=null) this.oCurrent=this.str2date(date);
	return this.oCurrent.show();
}

this.month=function (date)
{//nustato kuri menesi rodyti
    this.month1st=this.str2date(date);
    this.month1st.change('d',1);
}

this.from_to = function (nuo,iki)
//min ir max datos, kurias galima pasirinkti
{
    this.oFrom=this.str2date(nuo);
	this.oTo=this.str2date(iki);
}

this.now = function ()
//sios dienos data
{
	var time=new Date();
	return ((2000+time.getYear()%100)+'.'+(time.getMonth()+1)+'.'+time.getDate());
}


this.show=function(month)
{
	if (month!=null) this.month(month);
	this._redraw();

}

this.str2date = function (stamp)
//data pavercia i datos objekta
{
	return (new myDate (stamp));
}

this.selChange = function (selObj)
//sureaguoja i metu ar menesio pakeitima
{
	kas=selObj.name;
	var dayObj=this.month1st;
	dayObj.change(kas, selObj.options[selObj.selectedIndex].value );
	this.month(dayObj.show());
	this._redraw();
}

this.nextMonth = function (next)
//sureaguoja i metu ar menesio pakeitima
{
	var inc = next ? 1:-1;
	var dayObj=this.month1st;
	var m=dayObj.getMonth() + inc;
	if (m<1 || m>12) {
		dayObj.change('y', dayObj.getYear()+inc );
		m= next ? 1:12;
	}
	dayObj.change('m', m );
	this.month(dayObj.show());
	this._redraw();
}

this._diena = function (d)
//gauna pasirinkta diena ir perduoda outputui
{
	var day=this.str2date();
	day.fromDays(d);
	this.output(day.show());
}

this._draw_years = function ()
//metu dropdown
{
	var y1,y2,yc;
	y1=this.oFrom.getYear();
	y2=this.oTo.getYear();
	yc=this.month1st.getYear();
	var s='<select name="y" onchange="'+this.objname+'.selChange(this);" class="calSelect">\n';
	for (var i=y1;i<=y2;i++)
		s+='<option value="'+i+'"'+(i==yc ? ' selected="selected"':'')+'>'+i+'</option>\n';
	s+='</select>\n';
	return s;
}

this._draw_months = function ()
//menesiu dropdown
{
	var dayObj,y1,y2,yc,m1,m2,mc;
	m1=1;m2=12;
	yc=this.month1st.getYear();
	mc=this.month1st.getMonth();
	y1=this.oFrom.getYear();
	if (y1==yc)	m1=this.oFrom.getMonth();
	y2=this.oTo.getYear();
	if (y2==yc) m2=this.oTo.getMonth();
	var s='<select name="m" onchange="'+this.objname+'.selChange(this);" class="calSelect">\n';
	for (var i=m1;i<=m2;i++)
		s+='<option value="'+(i)+'"'+(i==mc ? ' selected="selected"':'')+'>'+this.monthNames[i-1]+'</option>\n';
	s+='</select>\n';
	return s;
}

this._redraw = function ()
//perpiesia kalendoriu
{
	var s=this._content();
	var myobj=this.divObj;
	if (myobj==null) return;
	myobj.innerHTML=s;
	myobj.style.visibility="visible";
	myobj.style.display="none";
	myobj.style.display="block";
}

this._content = function ()
//sukonstruoja kalendoriaus html. atiduoda kaip string
{
    var m=this.str2date(this.month1st.show());
    m.fromDays(this.month1st-1);
	var prevMonLastDay=m.getMdays();

	m=this.month1st;
	var wFirst=m.getWday();
	var d1=wFirst>0 ? (wFirst-1): 6; //0-6

	var lastDay=m.getMdays();
	var num_weeks=Math.ceil((lastDay+d1)/7);//kiek savaiciu turi menuo
    var nStart=m-d1;

	var s='';
	//s+='<form onSubmit="return false;"  onMouseOver="status=\'\';return true;">';
	s+='<table cellspacing="0" cellpading="0" border="0" class="calTable"><thead>\n';
	s+='<tr><td colspan='+(this.horizontal ? 7:(num_weeks+1))+' class="calHead">';


	var mode= typeof(this.mode)=="undefined" || this.mode!='w' ? 'd':'w';
	if (typeof(this.mode)!="undefined") s+='<div class="calMode"><a href="" onclick="calModeSet(\'d\');return false;">'+(mode=='d' ? '<b>'+this.words[0]+'</b>':this.words[0])+'</a> <a href="" onclick="calModeSet(\'w\');return false;">'+(mode=='w' ? '<b>'+this.words[1]+'</b>':this.words[1])+'</a></div>';

	if (m>this.oFrom)
		s+='<a href="" onclick="'+this.objname+'.nextMonth(false);return false" class="calMonthPrev">&lt;&nbsp;</a>';
	s+='<strong>'+m.getYear()+' '+this.monthNames[m.getMonth()-1]+'</strong>';
    if ((m+lastDay)<=this.oTo)
		s+='<a href="" onclick="'+this.objname+'.nextMonth(true);return false" class="calMonthNext">&nbsp;&gt;</a>';
	s+=' </td></tr>\n';
	var day;
    s+='<thead><tbody>';
	if (this.horizontal){
		s+='<tr>';
		for(var i=0;i<7;i++) s+='<th'+(i>4 ? ' class="calWeekend"':'')+'>'+this.weekDays[i]+'</th>';
		s+='</tr>\n';
		for (i=0;i<num_weeks;i++){
			s+='<tr>';
			for (var j=1;j<=7;j++) {
				day=7*i+j-d1;
				if (day>lastDay) day=100+(day-lastDay);
				else if(day<1) day=100+(prevMonLastDay+day);
				s+=this._draw_cell(nStart+7*i+j-1,day,j);
			}
		    s+='</tr>';
		}
	}else{
		for (i=0;i<7;i++){
			s+='<tr>';
            s+='<th'+(i>4 ? ' class="calWeekend"':'')+'>'+this.weekDays[i]+'</th>';
			for (var j=0;j<num_weeks;j++) {
				day=7*j+i+1-d1;
				if (day>lastDay) day=100+(day-lastDay);
				else if(day<1) day=100+(prevMonLastDay+day);
				s+=this._draw_cell(nStart+7*j+i,day,i+1);
		    }
			s+='</tr>';
		}
	}
	s+='</tbody></table>';
	if (!this.hideSelects) {
		s+='<div class=calTxtSelect>'+this.txtSelect+'</div>'
		s+='<div class=calDivSelect>'+this._draw_years()+this._draw_months()+'</div>';
	}
	//s+='</form>';

	//alert(s);
	return s;
}


this._draw_cell = function (d,diena,wDay)
//nupiesia viena dienos lastele
{
	var style="";
	var s='';
	if (diena<1 || diena>99) {
		style+='calOut ';
		diena=(diena%100);
	}
    s=(diena<10 ? '':'')+diena;
	//diena=parseInt(diena,10);
	var a= (this.mode=='w' ? 7:1)+this.oCurrent;
    if (d>=this.oCurrent && d<a) style+="calCurrentday ";
	if (wDay>5) style+="calWeekend ";
	if (d==this.oToday) style+="calToday ";
	if (this.specClass[d]!=null) style+=this.specClass[d];

	if (d<this.oFrom || d>this.oTo) s='<span>'+s+'</span>';
	else s='<a href="" onclick="'+this.objname+'._diena(\''+d+'\');return false" title="'+style+'">'+s+'</a>';
	s='<td'+(style!='' ? ' class="'+style+'"' : '')+'>'+s+'</td>';
	return s;
}

this.set_class_to=function(cname,days)
{
	this.specClass=[];
	var a=days.length;
	for (var i=0;i<a;i++) {
       this.specClass[0+this.str2date(days[i])]=cname;
	}
}


//sukuria kalendoriaus html objekta (div) ir nupiesia kalendoriu


	if (typeof(calendar.instances)=="undefined") calendar.instances=[];
    this.index = calendar.instances.length;
	calendar.instances[this.index] = this;

	//properties
	this.objname="calendar.instances["+this.index+"]";//objname;
	this.divObj=null;
	this.oMonth1st=0;
	this.specClass=[];

	this.hideSelects=false;//paslepti metu ir men dropdownus
	this.horizontal=true;//kalendoriaus orientacija

    this.weekDays=["Mo", "Tu", "We", "Th", "Fr", "Sa","Su"];
	this.monthNames = ["January", "February", "March", "April", "May", "June",
							"July", "August", "September", "October", "November", "December"];
	this.txtSelect="Change year and month:";
	this.words=['Day','Week'];

	//constructor
    divID= (divID==null) ? "divCalendar" : divID;
	if (!(document.getElementById && document.getElementById(divID))) {
		document.write('<div id="'+divID+'">&nbsp;</div>');
		document.close();
	}
	if (document.getElementById) this.divObj=document.getElementById(divID);
	else eval("this.divObj="+divID);


	this.from_to('1900-01-01','2030-01-01');
	this.oToday=this.oCurrent=this.str2date(this.now());
	this.month(this.oCurrent.show());
}




/**********************************************************/
/**********************************************************/
/**********************************************************/

function myDate(stamp)
/* gauna tekstine data (pvz 2004-05-29, arba 2004.05.29) 
   pavirsta i datos objekta
*/
{


//methods definitions
this.getYear = function ()
{
	return(this.y);
}

this.getMonth = function ()
{
	return(this.m);
}

this.getDay = function ()
{
	return(this.d);
}

this.getWday = function ()
//kelinta svaites diena 1 - pirmadienis, 7 - sekmadienis
{
	var M=(this.m>2 ? (this.m-2):(this.m+10)) ;
	var c=Math.floor(this.y/100);
	var Y=this.y % 100;
	if (this.m<=2) Y-- ;
	var s=this.d+Math.floor( (13*M-1)/5 )+Y+Math.floor(c/4)+Math.floor(Y/4)-2*c;
	s=s % 7;
	if (s<1) s+=7;
	return s;
}

this.getMdays = function ()
//kiek sis menuo turi dienu
{
    var s =( ( Math.floor(this.m+this.m/8) % 2 ) ? 31:30);
	if (this.m==2) { //jei vasaris
		var Y=this.y;
		s= (Y % 400==0 || ((Y % 4==0) && (Y % 100)) ) ? 29 : 28;
	}
   return s;
}
	
this.toDays = function ()
//pasako kiek dienu praejo nuo metu pradzios (kaip analogiska mysql funkcija)
{
	var y,m,d,c,k;
	y=this.y;
	m=this.m;
	d=this.d;
	c=Math.floor((y-1)/100);//simtmeciu skaicius
	k=y*365+Math.floor((y-1)/4)+Math.floor(c/4)-c;
	var mon=new Array('', 0,31,59,90,120,151,181,212,243,273,304,334);
	k+=mon[m]+d;
	if (m>2 && (y % 4 == 0)) {
		if	(y % 100 !=0 || (Math.floor(y/100) % 4 ==0) ) k+=1;
	}
	return k;
}

this.fromDays = function (days)
//atvirkstine toDays funkcija
{
	days=Math.abs(parseInt(days,10));
	if (days<366 || days>3652424) {
		this.y=this.m=this.d=0;
		return (false);
	}
	var mon=new Array(0, 0,31,59,90,120,151,181,212,243,273,304,334);
	var c,y,m,d,hasd,i;
	y=Math.floor(days*100/36525);
	c=Math.floor((y-1)/100);
	d=days-y*365-Math.floor((y-1)/4)-Math.floor(c/4)+c;
	while (d > (hasd=((y % 4==0 && (y % 400==0 || y % 100)) ? 366:365)) ) {
		d-=hasd;	y++;
	}
	while (d<1) d+=(--y % 4==0 && (y % 400==0 || y % 100)) ? 366:365;
	if (hasd===366) for (i=3;i<=12;i++) mon[i]+=1;
	for (i=12;i>=1;i--) {
    	if (mon[i]<d) {
			m=i;
			d=d-mon[i];
			break;
		}
	}
	this.y=y;
	this.m=m;
	this.d=d;
}

this.show = function (delim)
{
	if (delim==null) delim='-';
	var s='';
	if (this.y<10) s+='0';
	if (this.y<100) s+='0';
	if (this.y<1000) s+='0';
	return s+this.y+delim+(this.m<10 ? '0':'')+this.m+delim+(this.d<10 ? '0':'')+this.d;
}

this.change = function (key,value)
{
	if (key=='y') this.y=value;
	else if (key=='m') this.m=value;
	else if (key=='d') this.d=value;
	if (this.getMdays() < this.d) this.d=this.getMdays();
}

this.valueOf = function ()
{
	return this.toDays();
}

this.toString = function ()
{
	return this.show('-');
}


	
	//properties
	this.y=0;
	this.m=0;
	this.d=0;
	
	//contructor
    if (typeof(stamp)=="undefined") {
		var time=new Date();
		stamp=((2000+time.getYear()%100)+'.'+(time.getMonth()+1)+'.'+time.getDate());
	}

    //if (typeof(stamp)!="string") alert(stamp);
	stamp=stamp.replace(/-/g,'.');
	var re_date = /^(\d+)\.(\d+)\.(\d+)$/;
    var myMatch = re_date.exec(stamp);
	if (!myMatch) {
	  	alert("Blogas datos formatas: "+ stamp);
        this.y=this.m=this.d=0;
    } else {
		this.y=parseInt(myMatch[1],10);
		this.m=parseInt(myMatch[2],10);
		this.d=parseInt(myMatch[3],10);
		if (this.getMdays() < this.d) this.d=this.getMdays();
	}

	
}