
function Datum(g,m,d)
{
 this.year=1*g;
 this.month=1*m;
 this.day=1*d;
 this.days=YMDdate2int(1*g,1*m,1*d);
}

function currentDate()
{
	var nowdate=new Date();
	return new Datum(nowdate.getFullYear(),nowdate.getMonth()+1,nowdate.getDate());
}
 
function div(a,b)
{
 return (Math.floor(a/b));
}
 
function abs(a)
{
 return (Math.as(a));
}
 
function mod(a,b)
{
 return (a % b);
}
 

function isYearOver(g)
{
 return (   (div(mod(g-1,4),3))*((div(mod(g-1,100),99)*div(mod(g-1,400),399))+(1-div(mod(g-1,100),99)))==1?true:false  );
}
 
function dateStr2Date(s)
{
 var i1=s.indexOf('-');
 var i2=s.indexOf('-',i1+1);
 
 var g=s.substring(0,i1);
 var m=s.substring(i1+1,i2);
 var d=s.substring(i2+1);
 
 return new Datum(g,m,d); 
}
 
function datestr2int(s)
{
 var i1=s.indexOf('-');
 var i2=s.indexOf('-',i1+1);
 
 var g=s.substring(0,i1);
 var m=s.substring(i1+1,i2);
 var d=s.substring(i2+1);
 
 return YMDdate2int(g,m,d); 
}
 
function YMDdate2int(g,m,d)
{
 var gg=(g-1)*365 + div((g-1),4) - div((g-1),100) + div((g-1),400);
 var mm=(m-1)*30+ div(m,2) - 2*div(m,3)+ 2*div(m,6)+ 3*div(m,9)- div(m,10)+  div(m,11)  - div(m,12);
 var dd=1*d+1*(m>=3 && isYearOver(g)?0:-1);
 
 return (1*gg+1*mm+1*dd);
}
 
function date2int(datum)
{
 return (datum.days);
}
 
function int2datestr(i)
{
 return dateString(int2date(i));
}
 
function int2date(i)
{
 var g=
 (  
  1+div
   (
    (i
     -div((i+183),1461)
     +div((i+183),36524)
     -div((i+183),146096)
    )
    ,365
   )  
 );
 
 
 var j=i-YMDdate2int(g,1,1);
 var m=
 (
  isYearOver(g)
  ?
  (1+div((   j-1 -div(j,30)+div(j,60)-div(j,89)-div(j,120)-div(j,151)-div(j,212)-div(j,243)+div(j,274)-div(j,304)         ),29))
  :
  (1+div((   j-1-div(j,29)-div(j,30)+div(j,59)-div(j,89)+div(j,90)-div(j,118)-div(j,119)+div(j,120)-div(j,149)-div(j,150)+div(j,151)-div(j,180)-div(j,211)-div(j,242)-div(j,303)    ),28))
 );
 
 m=(m==0?1:m);
 
 var k=i-YMDdate2int(g,m,1);
 var d=k+1;
 
 return new Datum(g,m,d);
}
 

function dateYMDString(g,m,d)
{
 return( ('0000'.substring((''+g).length))+g  +'-'+  ((m<10?'0':'')+m) +'-'+ ((d<10?'0':'')+d));
}
 
function dateString(datum)
{
 return(dateYMDString(datum.year,datum.month,datum.day));
}
 
function isYMDDateValid(g,m,d)
{
 
 var datestr1=dateYMDString(g,m,d);
 var intdate=YMDdate2int(g,m,d);
 var datestr2=int2datestr(intdate);

 return (datestr1==datestr2);
}
 
function isDateValid(datum)
{
 return(  isYMDDateValid(datum.year,datum.month,datum.day)  );
}
 
function dow(i)
{
 return (mod(i+1,7)+1);
}
 
function dowYMD(g,m,d)
{
 return dowDate(new Datum(g,m,d));
}
 
function dowDate(datum)
{
 return dow(datum.days);
}

function guessDate(ss, f, ac)
{
	var s=ss+'-';
	var fi=0;
	var g=0;
	var m=0;
	var d=0;
	var tt='';
	var i;
	
	for (i=0;i<s.length;i++)
	{
		if (s.charAt(i)>='0' && s.charAt(i)<='9')
		{
			tt=tt+''+s.charAt(i);
		}
		else
		{
			if (f.charAt(fi)=='Y') g=1*tt;
			if (f.charAt(fi)=='M') m=1*tt;
			if (f.charAt(fi)=='D') d=1*tt;
			fi++;
			tt='';
		}
	}
	
	if (m>12 && d<=12 && ac)
	{
		i=d;
		d=m;
		m=i;
	}
	
	if (g==0 || m==0 || d==0) return new Datum(0,0,0);
	
	return new Datum(g,m,d);
}
 
 
 
 


