function CorrectWeekDay(weekDay) {
    weekDay--;
	if(weekDay==-1){weekDay=6;}
	return weekDay;
}


function SetDateOfDateObj(InDateObj,DateToSet) {
    var OutDateObj=new Date(InDateObj.getFullYear(),InDateObj.getMonth(),DateToSet,InDateObj.getHours(),InDateObj.getMinutes(),InDateObj.getSeconds(),InDateObj.getMilliseconds());
	return OutDateObj;
}


function IsYearBissextile(InDateObj) {
    var BissextileFlag;
	if(((parseInt(InDateObj.getFullYear(),10)%4==0)&&(parseInt(InDateObj.getFullYear(),10)%100!=0))||(parseInt(InDateObj.getFullYear(),10)%400==0)){BissextileFlag=true;}
	else{BissextileFlag=false;}
	return BissextileFlag;
}


function Calendar(toDay,markupActualDay,CalObjID,ForceCalHeadAltStyle) {

	var CurToDay=toDay;
	var NCurToDay=CurToDay;
	var GlobalCalAr=new Array();
	var GlobalCalBegin="";
	var GlobalCalString="";
	var monthNames=new Array("Януари","Февруари","Март","Април","Май","Юни","Юли","Август","Септември","Октомври","Ноември","Декември");

	var thisDay=CurToDay.getDate();
	var year=CurToDay.getFullYear();

	var constThisDay = 1;
	var constHoliDay = 2;
	
	var CTitleClass="CalTitle"+ForceCalHeadAltStyle.toString();
	

// begin table - header row			
				GlobalCalBegin+="<table border=\"0\" width=\"126\" border=\"0\" cellspacing=\"0\" cellpadding=\"0\">";
				GlobalCalBegin+="<tr height=\"15\">";
				GlobalCalBegin+="<td width=\"126\" height=\"15\" colspan=\"7\" class=\""+CTitleClass+"\">"+monthNames[CurToDay.getMonth()]+" "+year+"<\/td>";
				GlobalCalBegin+="<\/tr>";

// days names row
				GlobalCalBegin+="<tr height=\"15\">";
				GlobalCalBegin+="<td width=\"18\" height=\"15\" class=\"WorkDay\">Пн<\/td>";
				GlobalCalBegin+="<td width=\"18\" height=\"15\" class=\"WorkDay\">Вт<\/td>";
				GlobalCalBegin+="<td width=\"18\" height=\"15\" class=\"WorkDay\">Ср<\/td>";
				GlobalCalBegin+="<td width=\"18\" height=\"15\" class=\"WorkDay\">Чт<\/td>";
				GlobalCalBegin+="<td width=\"18\" height=\"15\" class=\"WorkDay\">Пт<\/td>";
				GlobalCalBegin+="<td width=\"18\" height=\"15\" class=\"HoliDay\">Сб<\/td>";
				GlobalCalBegin+="<td width=\"18\" height=\"15\" class=\"HoliDay\">Нд<\/td>";
				GlobalCalBegin+="<\/tr>";

//writing calendar

				GlobalCalBegin+="<tr height=\"15\">";

	var currentMonth=CurToDay.getMonth();

	CurToDay=SetDateOfDateObj(CurToDay,1);
	//	CurToDay.setDate(1);

	var calendarTCellsCounter=0;

	while(currentMonth==CurToDay.getMonth()){
		var finishRow=true;
		for(weekDay=0;((weekDay<7 && finishRow)||(!finishRow && (currentMonth==CurToDay.getMonth()))); weekDay++){
			var CurCellHTML="";
			var CurCellHTMLArIndex=GlobalCalAr.length;
			var CellWillBeOverwrited=false;
			if((weekDay!=CorrectWeekDay(CurToDay.getDay()))||(currentMonth!=CurToDay.getMonth())){
				CurCellHTML+="<td width=\"18\" height=\"15\" class=\"CalEmpty\"><\/td>";
			}
			else{
				var visClassConst=0;
				var visClass="StdDay"; 

				if((CurToDay.getDate()==thisDay) && markupActualDay){visClassConst+=constThisDay;}
				if((CorrectWeekDay(CurToDay.getDay())==5)||(CorrectWeekDay(CurToDay.getDay())==6)){visClassConst+=constHoliDay;}

				switch (visClassConst){
					case 0:
						visClass="StdDay";
						break;
					case 1:
						visClass="ThisDay";
						break;
					case 2:
						visClass="StdHDay";
						break;
					case 3:
						visClass="ThisHDay";
						break;
				}
				if((calendarTCellsCounter-(calendarTCellsCounter%35))>0){
					CurCellHTMLArIndex = calendarTCellsCounter%35;
					CellWillBeOverwrited=true;
					finishRow=false;
				}
				CurCellHTML+="<td width=\"18\" height=\"15\" class=\""+visClass+"\">";
				CurCellHTML+=CurToDay.getDate();
				CurCellHTML+="<\/td>";
				CurToDay=SetDateOfDateObj(CurToDay,CurToDay.getDate()+1);
				// CurToDay.setDate(CurToDay.getDate()+1);
			}

			calendarTCellsCounter++;
			if(!CellWillBeOverwrited){GlobalCalAr.length+=1;}			
			GlobalCalAr[CurCellHTMLArIndex]=CurCellHTML;
		}
		
		if(finishRow){    
			var CurRowEndHTML="";
				
				CurRowEndHTML+="<\/tr>";

				GlobalCalAr.length+=1;
				GlobalCalAr[GlobalCalAr.length-1]=CurRowEndHTML;
			
			if(currentMonth==CurToDay.getMonth()){
				var  NextRowBeginNewHTML="";

				NextRowBeginNewHTML+="<tr height=\"15\">";

				GlobalCalAr.length+=1;
				GlobalCalAr[GlobalCalAr.length-1]=NextRowBeginNewHTML;
			}
		}
		else{GlobalCalAr[GlobalCalAr.length-1]="";}
	}

	for(cc=0;cc<GlobalCalAr.length;cc++){GlobalCalString+=GlobalCalAr[cc];}

	var AddEmptyRowHTML="";
	if((toDay.getMonth()==1)&&(!IsYearBissextile(toDay))&&(SetDateOfDateObj(toDay,1).getDay()==1)){
		AddEmptyRowHTML+="<tr height=\"15\">";
		for(ecc=0;ecc<=6;ecc++){AddEmptyRowHTML+="<td width=\"18\" height=\"15\" class=\"CalEmpty\"><\/td>";}
		AddEmptyRowHTML+="<\/tr>";
	}

	document.getElementById(CalObjID).innerHTML=GlobalCalBegin+GlobalCalString+AddEmptyRowHTML+"<\/table>";
}
