var myDate=new Date();
var lastDays = new Array(31,28,31,30,31,30,31,31,30,31,30,31);
var selYear;
var selMonth;
var selDay;

var FirstAccepted=0;
var LastAccepted=99999999;
var LimitDays=100;
var LimitCount=0;
var d1= myDate.getDate();
var m1= myDate.getMonth();
var y1= myDate.getFullYear();
var firstDay=new Date(y1,m1,1);
var CalDisplayOnly=false;

var first=firstDay.getDay();	
var AcceptDays = new Array();
var UseDayArray=false;
var Language=0;
var TextLen=3;
var MTextLen=3;
var caller= null;
var Tagged=0;
var loc_static=true;
var tRight='>';
var tLeft='<';
var OldCol=0;
var AssignDirectly=false;
var CloseAfterPick=false;
var SelectedDays = new Array();
var LimitMask=0;
var DateFrom=y1;
var CalendarLabel="";
var DateTo=Number(y1+1);
var StartDate=-1;
var SelCol="#007bd4";
var NSCol="#007bd4";
var Target;
var p_sender=null;
var Target2= null;
var DrawTarget='calendar';
var MaskedDays = new Array();
var MonthNames = new Array(5);
var GB=0;
var FI=1; 
var SE=2;
var NL=3;
var DE=4;
var CalAdditionNalFunction="";
MonthNames[GB]= new Array('January','February','March','April','May','June','July','August','September','October','November','December');
MonthNames[FI]= new Array('Tammikuu','Helmikuu','Maaliskuu','Huhtikuu','Toukokuu','Kesäkuu','Heinäkuu','Elokuu','Syyskuu','Lokakuu','Marraskuu','Joulukuu');
MonthNames[SE]= new Array('Januari','Februari','Mars','April','Maj','Juni','Juli','Augusti','September','Oktober','November','December');
MonthNames[NL]= new Array('Januari','Februari','Mart','April','Mei','Juni','Juli','Augustus','September','October','November','December');
MonthNames[DE]= new Array('Januar','Februar','März','April','Mai','Juni','Juli','August','September','Oktober','November','Dezember');
var DayNames = new Array(5);

DayNames[GB]= new Array('Monday','Tuesday','Wednesday','Thursday','Friday','Saturday','Sunday');
DayNames[FI]= new Array('Maanantai','Tiistai','Keskiviikko','Torstai','Perjantai','Lauantai','Sunnuntai');
DayNames[SE]= new Array('Måndag','Tisdag','Onsdag','Tordag','Fredag','Lördag','Söndag');
DayNames[NL]= new Array('Mandag','Dinsdag','Woensdag','Donderdag','Vrijdag','Zaterdag','Zondag');
DayNames[DE]= new Array('Montag','Dienstag','Mittwoch','Donnerstag','Freitag','Samstag','Sonntag');

function SetLimitDays(num)
{
LimitDays=num;
}

function UseDayAr()
{
UseDayArray=true;
}

function Cal_only_display()
{
CalDisplayOnly=true;
SelCol="#66ff66";
}

function SetCalendarLabel(label)
{
CalendarLabel=label;
}

function AssignDir()
{
AssignDirectly=true;
}
function SetStart( num)
{
StartDate=num;
}

function SetCaller(sender)
{
caller=sender;
}



function SetStatic()
{
loc_static=false;
}

function SetLanguage(num)
{
Language=num;
}
function SetClose()
{
CloseAfterPick=true;
}

function SetTextLens(pmonth,pweekday)
{
TextLen=pweekday;
MTextLen=pmonth;
}

					
function SetTarget(targ)
{
Target=targ;

} 

function SetTarget_copy(targ)
{
Target2=targ;
} 
function GetValues(comnum)
{

var fullstring='';
if (comnum!=0)
if (comnum==1)
{
	for (var i=0; i<SelectedDays.length; i++)
	if (i==SelectedDays.length-1)
	fullstring+=ParseDate(SelectedDays[i]); else
	fullstring+=ParseDate(SelectedDays[i])+',';
	Target.value=fullstring;
	if (Target2 != null)
	Target2.value=fullstring;
}

if (comnum==2)
{
Target.value=SelectedDays[0];
if (Target2 != null)
Target2.value=SelectedDays[0];

}
if (CloseAfterPick==true)
{
document.getElementById(DrawTarget).innerHTML='';
}

}

function DateAsScriptDate(day1)
{

var parseDay=0;
var parseYear=0;
var parseMonth=0;
var day=''+day1;
parseYear=day.substring(0,4);
parseMonth=day.substring(4,6);
parseDay=day.substring(6,8);
parseMonth--;
var result=parseYear*10000+parseMonth*100+parseDay*1;
return result;
}


function DateAdd(day1)
{
var parseDay=0;
var parseYear=0;
var parseMonth=0;
var day=''+day1;
parseYear=day.substring(0,4);
parseMonth=day.substring(4,6);
parseDay=day.substring(6,8);
parseDay++;
if (parseDay>lastDays[parseMonth])
{
parseDay=1;
parseMonth++;
}

if (parseMonth==13)
{
	parseMonth=1;
	parseYear++;
}

var result=parseYear*10000+parseMonth*100+parseDay*1;

return result;
}

function ParseDate(day1)
{
var parseDay=0;
var parseYear=0;
var parseMonth=0;
var day=''+day1;
parseYear=day.substring(0,4);
parseMonth=day.substring(4,6);
parseDay=day.substring(6,8);
parseMonth++;
if (parseMonth==13)
{
	parseMonth=1;
	parseYear++;
}

var result=parseYear*10000+parseMonth*100+parseDay*1;

return result;
}

function SetBegin(p_year,p_month,p_day)
{
var fixed = new Date(p_year,p_month-1,p_day);
d1 = fixed.getDate();
m1 = fixed.getMonth();
y1 = fixed.getFullYear();
firstDay = new Date(y1,m1,1);
first=firstDay.getDay();

Tagged=y1*10000+m1*100+d1*1;
LimitCount++;
AddDay(Tagged);
DrawCalendar();
var element = document.getElementById("sel"+(d1+1)+"");
OldCol="#ffffff";

}


function SetShownYears(start,stop)
{
DateFrom=start;
DateTo=stop;
}

function SetFirstAccept(num)
{
FirstAccepted=num;

}


function SetLastAccept(num)
{
LastAccepted=num;

}


function DaysInMonth(month,year)
{
if ((month==1)&&(year%4==0)&&((year%100!=0)||(year%400==0)))
{
	return 29;
}else
{
	return lastDays[month];
}
}


function SetLimitMask(mask)
{
for (var i=0;i<mask.length;i++)
MaskedDays[i]=mask.substring(i,i+1);

}

function SetSender(sender)
{
p_sender=sender;
}

function findPos(obj) {
	var curleft = curtop = 0;
	if (obj.offsetParent) {
		curleft = obj.offsetLeft
		curtop = obj.offsetTop
		while (obj = obj.offsetParent) {
			curleft += obj.offsetLeft
			curtop += obj.offsetTop
		}
	}
	return [curleft,curtop];
}

function SetLimitMask2(mask)
{
var ParseDate;

for (var l=0;l<7;l++)
MaskedDays[l]=0;

for (var i=0;i<mask.length;i++)
{
ParseDate=mask.charAt(i);
	if (ParseDate!=0)
	{
		MaskedDays[ParseDate-1]=1;
	}
}


}

function ClearCalendar()
{
	SelectedDays.length=0;
	LimitCount=0;
	DrawCalendar();
}

function SetCalendar(addMonth)
{
if (addMonth==1)
m1++; 
if (addMonth==-1)
m1--;

if (m1==12)
{
	m1=0;
	y1++;
}
if (m1==-1)
{
	m1=11;
	y1--;
}

firstDay=new Date(y1,m1,1);
first=firstDay.getDay();
DrawCalendar();
}
function SetCalendarNoDraw(addMonth)
{
if (addMonth==1)
m1++; 
if (addMonth==-1)
m1--;

if (m1==12)
{
	m1=0;
	y1++;
}
if (m1==-1)
{
	m1=11;
	y1--;
}

firstDay=new Date(y1,m1,1);
first=firstDay.getDay();
}

function SetCalendarY(addYear)
{
y1+= addYear;
firstDay=new Date(y1,m1,1);
first=firstDay.getDay();
DrawCalendar();
}


function AddDay(day)
{
SelectedDays[SelectedDays.length]=day;
}


function InArray(day)
{
for(var i=0; i<SelectedDays.length;i++)
{
	if (day==SelectedDays[i])
	{
		return true;
		break;
	}
}
return false;
}

function InAcceptDays(day)
{
for(var i=0; i<AcceptDays.length;i++)
{
	if (day==AcceptDays[i])
	{
		return true;
		break;
	}
}
return false;
}


function SetNavigationStrings(pleft,pright)
{
tRight=pright;
tLeft=pleft;
}

function RemoveDay(day)
{
var TempArray = new Array();
for(var i=0; i<SelectedDays.length;i++)
if (day!=SelectedDays[i])
{
	TempArray[TempArray.length]=SelectedDays[i];
}
 
SelectedDays=TempArray;
}



function ShowDays()
{
for(var i=0; i<SelectedDays.length;i++)
ParseDate(alert(SelectedDays[i]));	
}

function Toggle(who)
{


if ( CalDisplayOnly==false )
{
	var element = document.getElementById("sel"+who);
	if (InArray((y1*10000)+(m1*100)+who)==true)
	{
		LimitCount--;
		element.style.backgroundColor=OldCol;
		RemoveDay((y1*10000)+(m1*100)+who);
	}else
	{
		if (InArray((y1*10000)+(m1*100)+who)==false && LimitCount<LimitDays)
		{
			OldCol=element.style.backgroundColor;
			AddDay((y1*10000)+(m1*100)+who);
			LimitCount++;
			element = document.getElementById("sel"+who);
			element.style.backgroundColor=SelCol;
		}
		if ( LimitDays==1 )
		{
			ClearCalendar();
			OldCol=element.style.backgroundColor;
			AddDay((y1*10000)+(m1*100)+who);
			element = document.getElementById("sel"+who);
			element.style.backgroundColor=SelCol;
		}
	}

if ( AssignDirectly==true )
GetValues(1);
}
if ( CalAdditionNalFunction!="" )
CalAdditionNalFunction();
}

function RemoveNotAcceptedDays()
{
	for(var i=0; i<SelectedDays.length;i++)
	{
		if ( !InAcceptDays(SelectedDays[i]))
		{
			LimitCount--;
			RemoveDay( SelectedDays[i] );
		}
	}
	
	GetValues(1);

}

function SetYear(val)
{
y1=val;
firstDay=new Date(y1,m1,1);
first=firstDay.getDay();
DrawCalendar();
}


function SetFirstDay(day)
{

}


function SetMonth(val)
{				
m1=val;
firstDay=new Date(y1,m1,1);
first=firstDay.getDay();
DrawCalendar();
}


function AddAcceptDays(aray)
{
AcceptDays.length=0;
for (var i=0; i<aray.length; i++)
AcceptDays[AcceptDays.length]=DateAsScriptDate(aray[i]);
UseDayArray=true;
}

function AddSelectedDays(aray)
{
SelectedDays.length=0;
for (var i=0; i<aray.length; i++)
SelectedDays[SelectedDays.length]=DateAsScriptDate(aray[i]);
UseDayArray=true;
}

function showDates()
{
alert(AcceptDays);
alert("selected" +SelectedDays);
}




function YearTool()
{
var BuildString=0;

BuildString="<select onchange='SetYear(this.options[this.selectedIndex].value);' name='year'>";

for (var i=DateFrom; i<=DateTo; i++)
{
	if (y1==i)
	BuildString+="<option selected value="+i+">"+i+""; else
	BuildString+="<option value="+i+">"+i+"";
}
BuildString+="</select>";
return BuildString;
}



function MonthTool()
{
var BuildString=0;
BuildString="<select onchange='SetMonth(this.options[this.selectedIndex].value);' name='month'>";
for (var i=0; i<12; i++)
if (m1==i)
BuildString+="<option selected value="+i+">"+MonthNames[Language][i].substring(0,MTextLen)+""; else
BuildString+="<option value="+i+">"+MonthNames[Language][i].substring(0,MTextLen)+"";
BuildString+="</select>";
return BuildString;
}

function GetDayPlus(day1,plus)
{

var parseDay=0;
var parseYear=0;
var parseMonth=0;
var day=''+day1;
plus=plus*1;
parseYear=day.substring(0,4);
parseMonth=day.substring(4,6);
parseDay=day.substring(6,8);

parseDay=(parseDay*1)+(plus*1);

if (parseDay>DaysInMonth(parseMonth-1,parseYear))
{
parseDay=parseDay-DaysInMonth(parseMonth-1,parseYear);

parseMonth=(parseMonth*1)+1;
}
if ( parseMonth>12)
{
parseMonth=1;
parseYear++;
}
<!-- if ( parseYear>DateTo) -->
	parseYear=DateTo;
	
var result=parseYear*10000+(parseMonth-1)*100+parseDay*1;

return result;
}

function ShowDate(day)
{
document.getElementById('calendar_day_view').innerHTML=y1+'.'+(m1*1+1)+'.'+day;
}


function ClearCalendarDisplay()
{
document.getElementById('calendar_day_view').innerHTML=""+y1+"."+(m1*1+1)+"."+d1+"";
}

function isToday(day)
{
if ((myDate.getFullYear()*10000)+(myDate.getMonth()*100)+(myDate.getDate())==day)
return true; else return false;
}

function SetDrawTarget(tar)
{
DrawTarget=tar;
}

function DaysLeftThisMonth()
{
	for(var i=0; i<AcceptDays.length;i++)
	{
		var parseMonth=AcceptDays[i];
		parseMonth+="";
		parseMonth=parseMonth.substring(4,6);
		
		if ( parseMonth==(m1) )
		{
			return true;
			break;
		}
	}
	SetCalendarNoDraw(1);
	return true;
	

}

function DrawCalendar(evt)
{
DaysLeftThisMonth();
var calString="";
 
calString="<table>";
var DayInd=0;	
var OverMonth=1;

if ( CalendarLabel!="" )
calString+="<tr><th colspan='7' >"+CalendarLabel+"</th></tr>"

var minusDay=0;
var LastDay=DaysInMonth(m1,y1);
calString+="<tr><th><input type='button' value='"+tLeft+"'OnClick='SetCalendar(-1);'></th><th colspan='5'>"+YearTool()+""+MonthTool()+"</th><th><input type='button' value='"+tRight+"' OnClick='SetCalendar(1);'></th></tr>";
calString+="<TR>";

var FixedInd=StartDate;
for (var dd=StartDate; dd<7+StartDate; dd++)
{
	if (FixedInd>6)
	FixedInd=0;
	if (FixedInd<0)
	FixedInd=6;
	calString+="<th>"+DayNames[Language][FixedInd].substring(0,TextLen)+'</th>';
	FixedInd++;
}

calString+="</TR>";
FixedInd=StartDate;
for (var i=0; i<6; i++)
{
	calString+="<tr>";
	for (var l=0; l<7; l++)
		{
			FixedInd++;
			if (FixedInd>=first && DayInd<LastDay )
			{
			
				DayInd++; 
				if (isToday( (y1*10000)+(m1*100)+DayInd)  )
				var Today='color:#007bd4;';
				else Today='';
				var CantSelect='#999999;'
				if (MaskedDays[l]==0 || (y1*10000)+(m1*100)+DayInd>LastAccepted || (y1*10000)+(m1*100)+DayInd<FirstAccepted || ((UseDayArray==true)&&(InAcceptDays((y1*10000)+(m1*100)+DayInd)==false)))
				calString+="<td id='sel"+DayInd+"' onmouseout='ClearCalendarDisplay();' onmouseover='ShowDate("+DayInd+");' style='"+Today+" text-decoration: line-through; background:"+CantSelect+";'>"+DayInd+"</td>";
				else
				if (InArray((y1*10000)+(m1*100)+DayInd)==true)
				calString+="<td id='sel"+DayInd+"' style='"+Today+"  background:"+SelCol+";' OnClick='Toggle("+DayInd+");'>"+DayInd+"</td>";	else
				calString+="<td id='sel"+DayInd+"' style='"+Today+"' onmouseout='ClearCalendarDisplay();' onmouseover='ShowDate("+DayInd+");' OnClick='Toggle("+DayInd+");'>"+DayInd+"</td>";
		
				
			} else
			{
			if (DayInd<LastDay)
			{
				if (m1==0)
				minusDay=DaysInMonth(11,y1-1)-(first-(FixedInd+1));
				else
				minusDay=DaysInMonth(m1-1,y1)-(first-(FixedInd+1));
				calString+="<td style='color:#a3a3a3;' OnClick='SetCalendar(-1);'>"+minusDay+"</td>";
			}else
			{
				calString+="<td style='color:#a3a3a3;' OnClick='SetCalendar(1);'>"+OverMonth+"</td>";
				OverMonth+=1;
			}
			
			}
		}
		calString+="</tr>";
	}
calString+="<tr><td align='center' id='calendar_day_view' colspan='7'>"+y1+"."+(m1*1+1)+"."+d1+"</td></tr>";
calString+="</table>";		

var handle = document.getElementById(DrawTarget);
handle.innerHTML=calString;

if (loc_static==false)
{
	//var evt = (evt) ? evt : ((window.event) ? window.event : null);
	handle.style.position='absolute';
	//if (evt && caller.id=='calendar_caller')
	//{	
		//handle.style.left=evt.clientX +'px';
		//handle.style.top=evt.clientY +'px';
		
		
	//}
if (evt)
	{ 
		handle.style.left=findPos(p_sender)[0]+'px'; //evt.clientX +'px';
		handle.style.top=findPos(p_sender)[1]+'px';   //evt.clientY +'px';

	}
	
}
  
}
