// Here are held the actions of calendar component
// CSS classes with prefix "calendar".

/**
 * addEvent function found at http://www.scottandrew.com/weblog/articles/cbs-events
 * Modified by gsm to cover older browsers (not IE4+ and without recent DOM support)
 */

function addEvent(obj, evType, fn) {
	if (obj.addEventListener) {
		obj.addEventListener(evType, fn, true);
		return true;
	} else if (obj.attachEvent) {
		var r = obj.attachEvent("on"+evType, fn);
		return r;
	} else if(
		     (typeof obj["on"+evType] == "function")
		  && (typeof obj["on"+evType].apply == "function" )
		) {
		var oldFn = obj["on"+evType];
		obj["on"+evType] = function( args ){
			oldFn.apply( obj, args );
			return fn.apply( obj, args );
		};
		return true;
	} else {
		obj["on"+evType] = fn;
		return true;
	}
}

	// If ESC is pressed, hide the calendar
	document.onkeypress = function hidecal1 () {
		var keyCode = null;
		if(    (typeof arguments[0] != "undefined")
		    && (typeof arguments[0].keyCode != "undefined")){
	
			keyCode = arguments[0].keyCode;
	
		}else if( (typeof window.event != "undefined")
		    && (typeof window.event.keyCode != "undefined")){
	
			keyCode = window.event.keyCode;
	
		}
		if (keyCode==27) {
			hideCalendar();
		}
	}
	
	// false, if not IE browser.
	var	ie=document.all;
	// false, if dealing with browser not compatible to DOM standard.
	var	dom=document.getElementById;
	// false, if not dealing with Netscape4.X browser.
	var ns4=document.layers;
	
	// Position horisontally, where calendar will be displayed. To display it under the button use value -1.
	var	fixedX = -1;
	// Position vertically, where calendar will be displayed. To display it under the button use value -1.
	var	fixedY = -1;
	// If 0, then week's first day is Sunday, if 1, then Monday.
	var	startAt = 1;
	// If 0, then week's number will not be displayed, if 1, then will be
	var	showWeekNumber = 0;
	// If 0, then today's date will not be displayed with special colour, if 1 then it will be
	var	showToday = 1;
	// Week's column heading
	var weekString = "Wk";
	// Message on date selection. "[date]" will be replaced with date.
	var selectDateMessage = "Select [date] as date.";
	
	// Today's date
	var today = new Date();
	// Day
	var dateNow = today.getDate();
	// Month
	var monthNow = today.getMonth();
	// Year
	var yearNow = today.getFullYear();
	
	// true, when page is loaded and you can use the calendar component
	var bPageLoaded=false;
	
	// true, if calendar comopnent is visible; false, if not.
	var bShow =	false;
	
	// Link to an object, where calendar HTML code is held. <div id="calendar"></div>
	var	crossobj;
	// Link to an object, where month's selection HTML code is held. <div id="selectMonth"></div>
	var crossMonthObj;
	// Link to an object, where year's selection HTML code is held. <div id="selectYear"></div>
	var crossYearObj;
	// Link to input, where date is displayed
	var date;
	// Selected month
	var monthSelected;
	// Selected year
	var yearSelected;
	// Selected day
	var dateSelected;
	// Selected month object
	var omonthSelected;
	// Selected day object
	var oyearSelected;
	// Selected year object
	var odateSelected;
	// true, if selection of the months is ready; false, if not ready
	var monthConstructed;
	// true, if selection of the years is ready; false, if not ready
	var yearConstructed;
	// Months selection interval
	var intervalID1;
	// Years selection interval
	var intervalID2;
	// Months selection timeout.
	var timeoutID1;
	// Years selection timeout.
	var timeoutID2;
	// Object where selected date is held
	var ctlToPlaceValue;
	// Link to a last button which called calendar
	var ctlNow;
	// The format of the date is held here
	var dateFormat;
	// First year that is displayed on the list
	var nStartingYear;
	
	// Calendar type 'ad', 'plain'
	var calType = 'plain';
	
	// Function called after ad dialog is closed with OK button
	var onDateSelected = null;
	
	// CSS for date.
	var	styleAnchor="text-decoration:none;color:black;"
	// CSS additional style for selected date
	var	styleLightBorder="border-style:solid;border-width:1px;border-color:#a0a0a0;"

	// CSS additional style for selected date in past
	var	stylePastLightBorder="border-style:solid;border-width:1px;border-color:yellow;"
	
	// Months array
	var monthName = new Array("Jaanuar","Veebruar","M&auml;rts","Aprill","Mai","Juuni","Juuli","August","September","Oktoober","November","Detsember");
		
	// Weekdays array
	var dayName;

	// collected undefined variables
	var timeline, formatChar;
	
	if (startAt==0)
	{
		dayName = new Array ("P","E","T","K","N","R","L")
	}
	else
	{
		dayName = new Array ("E","T","K","N","R","L","P")
	}
	
	// HTML object where calendar will be written
	if (dom)
	{
		document.write ("<div class='cal-container' onclick='bShow=true' id='calendar' style='z-index:+999;'>")
		document.write ('<div class="cal-header" id="sulgemine"></div>')
		document.write ('<div class="cal-body">')
			document.write ('<div id="kuuvalik" class="cal-months"></div>')
			document.write ('<div class="cal-days-pad"><div id="sisu" class="cal-days"></div></div>')
			document.write ('<div id="aastavalik" class="cal-years"></div>')
			document.write ('<div id="buttons"></div>')
		document.write ('</div>')
	
		document.write ('</div>')
		document.write ('<div id="selectMonth" style="z-index:+999;position:absolute;visibility:hidden;"></div>')
		document.write ('<div id="selectYear" style="z-index:+999;position:absolute;visibility:hidden;"></div>')
		
	}
	
	/**
	 * Initialization
	 */
var cal_inited = false;
	this.init = function() {
    if(cal_inited) return;
    cal_inited = true;
		if (!ns4)
		{
			crossobj=(dom)?document.getElementById("calendar").style : ie? document.all.calendar : document.calendar;
			hideCalendar();
	
			crossMonthObj=(dom)?document.getElementById("selectMonth").style : ie? document.all.selectMonth	: document.selectMonth;
	
			crossYearObj=(dom)?document.getElementById("selectYear").style : ie? document.all.selectYear : document.selectYear;
	
			monthConstructed=false;
			yearConstructed=false;
	
			// Closing
			sHTML1  = '<a href="javascript:;" onclick="hideCalendar();" class="cal-close"><img src="../gfx/cal_close.gif"></a>'
			sHTML1 += '<div class="cal-close-bg" style="padding: 3px;">&nbsp;</div>'
			
			document.getElementById("sulgemine").innerHTML = sHTML1;
	
			// selection of the month
	
			sHTML1 ='<img src="../gfx/cal_left.gif"   class="cal-select-left"  onclick="decMonth()"></td>';
			sHTML1+='<img src="../gfx/cal_right.gif"  class="cal-select-right" onclick="incMonth()">';
			sHTML1+='<img src="../gfx/cal_down.gif"   class="cal-select-down"  onclick="popUpMonth()">';
			sHTML1+='<div class="cal-select" id="spanMonth" onclick="popUpMonth()"></div>';
	
			document.getElementById("kuuvalik").innerHTML = sHTML1;
	
			// selection of the year
	
			sHTML1 ='<img src="../gfx/cal_left.gif"  class="cal-select-left"  onclick="changeYear(-1)">';
			sHTML1+='<img src="../gfx/cal_right.gif" class="cal-select-right" onclick="changeYear(1)">';
			sHTML1+='<img src="../gfx/cal_down.gif"  class="cal-select-down"  onclick="popUpYear()">';
			sHTML1+='<div class="cal-select" id="spanYear" onclick="popUpYear()"></div>';
	
			document.getElementById("aastavalik").innerHTML = sHTML1;
	
	
	
			// Today's date
	
	        
			//document.getElementById("currentDate").innerHTML = dateNow+". "+monthName[monthNow]+" "+yearNow;
	
			bPageLoaded=true;
		}
	}
	
	function init() {
    if(cal_inited) return;
    cal_inited = true;
		if (!ns4)
		{
			crossobj=(dom)?document.getElementById("calendar").style : ie? document.all.calendar : document.calendar;
			hideCalendar();
	
			crossMonthObj=(dom)?document.getElementById("selectMonth").style : ie? document.all.selectMonth	: document.selectMonth;
	
			crossYearObj=(dom)?document.getElementById("selectYear").style : ie? document.all.selectYear : document.selectYear;
	
			monthConstructed=false;
			yearConstructed=false;
	
			// Closing
			sHTML1  = '<a href="javascript:;" onclick="hideCalendar();" class="cal-close"><img src="../gfx/cal_close.gif"></a>'
			sHTML1 += '<div class="cal-close-bg" style="padding: 3px;">&nbsp;</div>'
			
			document.getElementById("sulgemine").innerHTML = sHTML1;
	
			// selection of the month
	
			sHTML1 ='<img src="../gfx/cal_left.gif"   class="cal-select-left"  onclick="decMonth()"></td>';
			sHTML1+='<img src="../gfx/cal_right.gif"  class="cal-select-right" onclick="incMonth()">';
			sHTML1+='<img src="../gfx/cal_down.gif"   class="cal-select-down"  onclick="popUpMonth()">';
			sHTML1+='<div class="cal-select" id="spanMonth" onclick="popUpMonth()"></div>';
	
			document.getElementById("kuuvalik").innerHTML = sHTML1;
	
			// selection of the year
	
			sHTML1 ='<img src="../gfx/cal_left.gif"  class="cal-select-left"  onclick="changeYear(-1)">';
			sHTML1+='<img src="../gfx/cal_right.gif" class="cal-select-right" onclick="changeYear(1)">';
			sHTML1+='<img src="../gfx/cal_down.gif"  class="cal-select-down"  onclick="popUpYear()">';
			sHTML1+='<div class="cal-select" id="spanYear" onclick="popUpYear()"></div>';
	
			document.getElementById("aastavalik").innerHTML = sHTML1;
	
	
	
			// Today's date
	
	        
			//document.getElementById("currentDate").innerHTML = dateNow+". "+monthName[monthNow]+" "+yearNow;
	
			bPageLoaded=true;
		}
	}
	
	///// FUNCTIONS
	
	
	
	/* hides <select> and <applet> objects (for	IE only) */
	function hideElement( elmID, overDiv )
	{
	  if( ie )
	  {
		for( i = 0;	i <	document.all.tags( elmID ).length; i++ )
		{
		  obj =	document.all.tags( elmID )[i];
		  if( !obj || !obj.offsetParent	)
		  {
			continue;
		  }
	
		  // Find the element's	offsetTop and offsetLeft relative to the BODY tag.
		  objLeft	= obj.offsetLeft;
		  objTop	= obj.offsetTop;
		  objParent	= obj.offsetParent;
	
		  while( objParent.tagName.toUpperCase() !=	"BODY" )
		  {
			objLeft	 +=	objParent.offsetLeft;
			objTop	 +=	objParent.offsetTop;
			objParent =	objParent.offsetParent;
			if (objParent.tagName == "HTML") break;
		  }
	
		  objHeight	= obj.offsetHeight;
		  objWidth = obj.offsetWidth;
	
		  if(( overDiv.offsetLeft +	overDiv.offsetWidth	) <= objLeft );
		  else if((	overDiv.offsetTop +	overDiv.offsetHeight ) <= objTop );
		  else if( overDiv.offsetTop >=	( objTop + objHeight ));
		  else if( overDiv.offsetLeft >= ( objLeft + objWidth ));
		  else
		  {
			obj.style.visibility = "hidden";
		  }
		}
	  }
	}
	
	/*
	* unhides <select> and <applet>	objects	(for IE	only)
	*/
	function showElement( elmID	)
	{
	  if( ie )
	  {
		for( i = 0;	i <	document.all.tags( elmID ).length; i++ )
		{
		  obj =	document.all.tags( elmID )[i];
	
		  if( !obj || !obj.offsetParent	)
		  {
			continue;
		  }
	
		  obj.style.visibility = "";
		}
	  }
	}
	
	function HolidayRec	(d,	m, y, desc)
	{
		this.d = d
		this.m = m
		this.y = y
		this.desc =	desc
	}
	
	var	HolidaysCounter	= 0
	var	Holidays = new Array()
	
	function addHoliday	(d,	m, y, desc)
	{
		Holidays[HolidaysCounter++]	= new HolidayRec ( d, m, y,	desc )
	}
	
	
	function AdPublishDateRec	(d,	m, y)
	{
		this.d = d
		this.m = m
		this.y = y
	}
	
	var	AdPublishDatesCounter	= 0
	var	AdPublishDates = new Array()
	
	function addPublishDatesFromList(dateString)
	{
	    var arr = dateString.split(';');
            for (i = 0; i < arr.length; i++) {
                if (arr[i] != '') addAdPublishDateString(arr[i]);
            }
	}
        
        function addAdPublishDate	(d,	m, y)
	{
		AdPublishDates[AdPublishDatesCounter++]	= new AdPublishDateRec ( parseInt(d,10), parseInt(m, 10), parseInt(y,10 ) )
	}
	
	function addAdPublishDateString(dateString)
	{
	    dateArray = dateString.split('.');
		addAdPublishDate(dateArray[0],	dateArray[1], dateArray[2]);
	}
        
        function clearAdPublishDates()	{
	    AdPublishDatesCounter = 0;
            AdPublishDates = new Array();
	}
	
	function removeAdPublishDate(d, m, y)
	{
	    for (i=0; i< AdPublishDatesCounter; i++) {
	        adDate = AdPublishDates[i];
	        if ((adDate.d==d)&&(adDate.m==m)&&(adDate.y==y)) {
	            // remove this date
	            for (j=i; j < AdPublishDatesCounter-1; j++) {
	                AdPublishDates[j] = AdPublishDates[j+1];
	            }
	            
	            AdPublishDatesCounter--;
	            break;
	        }
	    }
	}
	
	
	function PaperPublishDateRec	(d,	m, y)
	{
		this.d = d
		this.m = m
		this.y = y
	}
	
	var	PaperPublishDatesCounter	= 0
	var	PaperPublishDates = new Array()
	
        function addPaperPublishDateString(dateString)
	{
	    dateArray = dateString.split('.');
		addPaperPublishDate(dateArray[0],	dateArray[1], dateArray[2]);
	}
        
        function clearPaperPublishDates() {
            PaperPublishDatesCounter = 0;
            PaperPublishDates = new Array();
        }
        
	function addPaperPublishDate	(d,	m, y)
	{
		PaperPublishDates[PaperPublishDatesCounter++]	= new PaperPublishDateRec ( parseInt(d,10), parseInt(m, 10), parseInt(y,10 ))
	}
	
	function swapImage(srcImg, destImg){
		if (ie)	{ document.getElementById(srcImg).setAttribute("src",imgDir	+ destImg) }
	}
	
	
	/**
	 * Hide the calendar component
	 */
	function hideCalendar()	{
		crossobj.visibility="hidden"
		if (crossMonthObj != null){crossMonthObj.visibility="hidden"}
		if (crossYearObj !=	null){crossYearObj.visibility="hidden"}
	
		showElement( 'SELECT' );
		showElement( 'APPLET' );
	}
	
	/**
	 * If number is < 10, a 0 is added
	 * @param num - number (presumably 0-99).
	 * @return number, where 0 is added when necessary.
	 */
	function padZero(num) {
		return (num < 10) ? '0' + num : num ;
	}
	
	/**
	 * dateFormat is taken and date elements are replaced with values
	 * @param d - day
	 * @param m - month
	 * @param y - year
	 * @return date in requested format
	 */
	function constructDate(d,m,y)
	{
		var sTmp = dateFormat;
		sTmp = sTmp.replace	("dd","<e>");
		sTmp = sTmp.replace	("d","<d>");
		sTmp = sTmp.replace	("<e>",padZero(d));
		sTmp = sTmp.replace	("<d>",d);
		sTmp = sTmp.replace	("mmm","<o>");
		sTmp = sTmp.replace	("mm","<n>");
		sTmp = sTmp.replace	("m","<m>");
		sTmp = sTmp.replace	("<m>",m+1);
		sTmp = sTmp.replace	("<n>",padZero(m+1));
		sTmp = sTmp.replace	("<o>",monthName[m]);
		return sTmp.replace	("yyyy",y);
	}
	
	/**
	 * Hide the calendar and display the date in the field
	 */
	function closeCalendar() {
		hideCalendar();
		date.value = padZero(dateSelected) + formatChar + padZero(parseInt(monthSelected)+1) + formatChar + yearSelected;
	}
	
	/**
	 * Begin months scroll desc (Feb->Jan->Dec)
	 */
	function StartDecMonth()
	{
		intervalID1=setInterval("decMonth()",80);
	}
	
	/**
	 * Begin months scroll asc (Jan->Feb_>Mar)
	 */
	function StartIncMonth()
	{
		intervalID1=setInterval("incMonth()",80);
	}
	
	/**
	 * Selected month will be decreased by one
	 * If month=jan, year will be reduced by one and month will be selected as dec
	 * @see constructCalendar();
	 */
	function decMonth () {
		monthSelected--;
		if (monthSelected<0)
		{
			monthSelected=11;
			yearSelected--;
		}
		constructCalendar();
	}
	
	/**
	 * Selected month will be increased by one
	 * If month=dec, year will be increased by one and month will be selected as jan
	 * @see constructCalendar();
	 */
	function incMonth () {
		monthSelected++;
		if (monthSelected>11)
		{
			monthSelected=0;
			yearSelected++;
		}
		constructCalendar();
	}
	
	/**
	 * Selection on months
	 */
	function constructMonth() {
		popDownYear();
		if (!monthConstructed) {
			sHTML =	"";
			for (i=0; i<12;	i++) {
				sName =	monthName[i];
				if (i==monthSelected){
					sName = "<B>" +	sName + "</B>";
				}
				sHTML += '<a href="javascript:;" id="m' + i + '" onclick="monthConstructed=false; monthSelected=' + i + '; constructCalendar(); popDownMonth(); event.cancelBubble=true">' + sName + '</a>';
			}
			document.getElementById("selectMonth").innerHTML  = '<div class="cal-select-dropdown" onmouseover="clearTimeout(timeoutID1);" onmouseout="clearTimeout(timeoutID1); timeoutID1=setTimeout(\'popDownMonth()\',100); event.cancelBubble=true">' + sHTML + '</div>';
			monthConstructed=true;
		}
	}
	
	/**
	 * Display the selection of months
	 * @see constructMonth()
	 */
	function popUpMonth() {
		constructMonth()
		crossMonthObj.visibility = (dom||ie)? "visible"	: "show"
		crossMonthObj.left = parseInt(crossobj.left) + 20 + 'px'
		crossMonthObj.top =	parseInt(crossobj.top) + 37 + 'px'
	
		hideElement( 'SELECT', document.getElementById("selectMonth") );
		hideElement( 'APPLET', document.getElementById("selectMonth") );
	}
	
	/**
	 * Hide the selection of months
	 */
	function popDownMonth()	{
		crossMonthObj.visibility= "hidden"
	}
	
	/**
	 * Years selecton first year will be decreased by one, selected year will be displayed bold
	 */
	function decYear() {
		for	(i=0; i<7; i++){
			newYear	= (i+nStartingYear)-1
			if (newYear==yearSelected) { txtYear =	"<B>"	+ newYear +	"</B>" }
			else { txtYear =	newYear }
			document.getElementById("y"+i).innerHTML = txtYear
		}
		nStartingYear --;
		bShow=true
	}
	
	/**
	 * Years selecton first year will be increased by one, selected year will be displayed bold
	 */
	function incYear() {
		for	(i=0; i<7; i++){
			newYear	= (i+nStartingYear)+1;
			if (newYear==yearSelected) { txtYear = "<B>" + newYear + "</B>"; }
			else { txtYear = newYear; }
			document.getElementById("y"+i).innerHTML = txtYear;
		}
		nStartingYear ++;
		bShow = true;
	}
	
	/**
	 * Selected year will be added the number that is passed on. Years selection will be closed. Calendar will be updated
	 * @see constructCalendar()
	 * @param x - positive for increasing; negative for decreasing.
	 */
	function changeYear(x) {
		yearSelected+=parseInt(x);
		yearConstructed=false;
		constructCalendar();
		popDownYear();
	}
	
	/**
	 * The passed on year will be selected. Years selection will be closed. Caledar will be updated
	 * @see constructCalendar()
	 * @param nYear - year number
	 */
	function selectYear(nYear) {
		yearSelected=parseInt(nYear+nStartingYear);
		yearConstructed=false;
		constructCalendar();
		popDownYear();
	}
	
	/**
	 * Years selection is put together
	 *
	 */
	function constructYear() {
		popDownMonth()
		sHTML =	""
		if (!yearConstructed) {
	
			sHTML += '<a href="javascript:;" class="cal-select-dropdown-scroller" onmouseout="clearInterval(intervalID1);" onmousedown="clearInterval(intervalID1); intervalID1=setInterval(\'decYear()\',30)" onmouseup="clearInterval(intervalID1);"><img src="../gfx/cal_scrollup.gif" /></a>'
			j =	0
			nStartingYear =	yearSelected-3
			for	(i=(yearSelected-3); i<=(yearSelected+3); i++) {
				sName =	i;
				if (i==yearSelected){
					sName =	"<B>" +	sName +	"</B>"
				}
	
				sHTML += '<a href="javascript:;" id="y' + j + '" onClick="selectYear('+j+');event.cancelBubble=true">' + sName + '</a>';
				j ++;
			}
			sHTML += '<a href="javascript:;" class="cal-select-dropdown-scroller" onmouseout="clearInterval(intervalID2);" onmousedown="clearInterval(intervalID2); intervalID2=setInterval(\'incYear()\',30)" onmouseup="clearInterval(intervalID2);"><img src="../gfx/cal_scrolldown.gif" /></a>'
	
			document.getElementById("selectYear").innerHTML  = '<div class="cal-select-dropdown" onmouseover="clearTimeout(timeoutID2);" onmouseout="clearTimeout(timeoutID2); timeoutID2=setTimeout(\'popDownYear()\',100);">' + sHTML + '</div>';
	
	
			yearConstructed	= true
		}
	}
	
	/**
	 * Years selection is displayed
	 * @see constructYear()
	 */
	function popUpYear() {
		var	leftOffset
	
		constructYear()
		crossYearObj.visibility	= (dom||ie)? "visible" : "show"
	
		crossYearObj.top = (document.getElementById("calendar").offsetTop + document.getElementById("calendar").offsetHeight - 2) + 'px';
	
		leftOffset = parseInt(crossobj.left) + document.getElementById("spanYear").offsetLeft + 0
	
		crossYearObj.left =	leftOffset + 'px'
	
	
	}
	
	/**
	 * Hiding of years selection
	 */
	function popDownYear() {
		clearInterval(intervalID1)
		clearTimeout(timeoutID1)
		clearInterval(intervalID2)
		clearTimeout(timeoutID2)
		crossYearObj.visibility= "hidden"
	}
	
	/**
	 * Weeks number is calculated
	 *
	 * @param n - Date tyypi objekt
	 * @return number of the week that corresponds to the date which was passed on
	 */
	function WeekNbr(n) {
		year = n.getFullYear();
		month	= n.getMonth() + 1;
		if (startAt == 0)	{
		 day = n.getDate() + 1;
		}
		else {
		 day = n.getDate();
		}
	
		a	= Math.floor((14-month)	/ 12);
		y	= year + 4800 -	a;
		m	= month	+ 12 * a - 3;
		b	= Math.floor(y/4) -	Math.floor(y/100) +	Math.floor(y/400);
		J	= day +	Math.floor((153	* m	+ 2) / 5) +	365	* y	+ b	- 32045;
		d4 = (((J	+ 31741	- (J % 7)) % 146097) % 36524) %	1461;
		L	= Math.floor(d4	/ 1460);
		d1 = ((d4	- L) % 365)	+ L;
		week = Math.floor(d1/7) +	1;
	
		return week;
	}
	
	/**
	 * Calendar is put together
	 */
	function constructCalendar () {
	  if ('plain' == calType) {
	    constructPlainCalendar();
	  }
	  else if ('ad' == calType) {
	    constructAdCalendar();
	  }
	}
	function constructPlainCalendar () {
		var	aNumDays = Array (31,0,31,30,31,30,31,31,30,31,30,31)
	
		var	dateMessage
		var	startDate =	new	Date (yearSelected,monthSelected,1)
		var	endDate
		var sStyle
	
		if (monthSelected==1)
		{
			endDate	= new Date (yearSelected,monthSelected+1,1);
			endDate	= new Date (endDate	- (24*60*60*1000));
			numDaysInMonth = endDate.getDate()
		}
		else
		{
			numDaysInMonth = aNumDays[monthSelected];
		}
	
		datePointer	= 0
		dayPointer = startDate.getDay()	- startAt
	
		if (dayPointer<0)
		{
			dayPointer = 6
		}
	
		// Begin
	
		sHTML = ''
	
		if (showWeekNumber==1){ sHTML += '<div>'+weekString+'</div>' }
		for	(i=0; i<7; i++)	{ sHTML += '<div class="cal-day-name">'+dayName[i]+'</div>' }
		if (showWeekNumber==1) { sHTML += '<div>'+WeekNbr(startDate)+'</div>' }
	
		// Empty arese before month's first day
		for ( var i=1; i<=dayPointer;i++ ) {
			sHTML += '<div class="cal-day-blank">&nbsp;</div>'
		}
	
		// Days in rows by weeks
		for	( datePointer=1; datePointer<=numDaysInMonth; datePointer++	)
		{
			dayPointer++;
			sStyle=styleAnchor
			if ((datePointer==odateSelected) &&	(monthSelected==omonthSelected)	&& (yearSelected==oyearSelected))
			{ 
				today = new Date();
				if (datePointer <= today.getDate() 
				 	&& monthSelected <= today.getMonth()
				 	&& yearSelected <= today.getYear()) { /* removed  stylePastLightBorder  */
					sStyle+=stylePastLightBorder
				 } else {
					sStyle+=styleLightBorder
				}
			}
	
			sHint = ''
			for	(k=0;k<HolidaysCounter;k++)
			{
				if ((parseInt(Holidays[k].d)==datePointer)&&(parseInt(Holidays[k].m)==(monthSelected+1)))
				{
					if ((parseInt(Holidays[k].y)==0)||((parseInt(Holidays[k].y)==yearSelected)&&(parseInt(Holidays[k].y)!=0)))
					{
						sStyle+='background: #FFDDDD;'
						sHint+=sHint==""?Holidays[k].desc:"\n"+Holidays[k].desc
					}
				}
			}
	
			var	regexp=	/\"/g
			sHint=sHint.replace(regexp,'&quot;')
	
			dateMessage	= 'onmousemove="window.status=\''+selectDateMessage.replace('[date]',constructDate(datePointer,monthSelected,yearSelected))+'\'" onmouseout="window.status=\'\'" '
	
			/* Display days */
	
			if (timeline == 'disabledpast' && (datePointer<dateNow && monthSelected<monthNow && yearSelected<=yearNow || monthSelected<monthNow && yearSelected<=yearNow || datePointer<dateNow && monthSelected<=monthNow && yearSelected<=yearNow || yearSelected<yearNow) )
				{ sHTML += '<div class="cal-day-disabled">'+datePointer+'</div>' }
			else if (timeline == 'disabledfuture' && (datePointer > dateNow && monthSelected>monthNow && yearSelected>=yearNow || monthSelected>monthNow && yearSelected>=yearNow || datePointer>dateNow && monthSelected>=monthNow && yearSelected>=yearNow || yearSelected>yearNow) )
				{ sHTML += '<div class="cal-day-disabled">'+datePointer+'</div>' }
			else if (timeline == 'disablednone' && false && (datePointer > dateNow && monthSelected>monthNow && yearSelected>=yearNow || monthSelected>monthNow && yearSelected>=yearNow || datePointer>dateNow && monthSelected>=monthNow && yearSelected>=yearNow || yearSelected>yearNow) )
				{ sHTML += '<div class="cal-day-disabled">'+datePointer+'</div>' }
	
			else if ((datePointer==odateSelected) && (monthSelected==omonthSelected) && (yearSelected==oyearSelected))
				{ sHTML += '<a href="javascript:;" class="cal-day-today" onclick="dateSelected='+datePointer+';closeCalendar();">'+datePointer+'</a>'}
			else if (dayPointer % 7 == (startAt * -1) + 1 || dayPointer % 7 == (startAt * -1) + 7)
				{ sHTML += '<a href="javascript:;" class="cal-day-weekend" onclick="dateSelected='+datePointer+';closeCalendar();">'+datePointer+'</a>' }
			else
				{ sHTML += '<a href="javascript:;" class="cal-day" onclick="dateSelected='+datePointer+';closeCalendar();">'+datePointer+'</a>' }
			sHTML += ''
		}
	
		// Empty arease after month's last day
		if ((dayPointer+startAt	- 1) % 7 !=	0)
		{
			for	( var i=(dayPointer+startAt	- 1) % 7 ; i<=6; i++ )
			{
				sHTML += '<div class="cal-day-blank">&nbsp;</div>'
			}
		}
	
		// Display
	
		sHTML += '<div class="cal-clear">&nbsp;</div>'
		document.getElementById("sisu").innerHTML   = sHTML
		document.getElementById("spanMonth").innerHTML = monthName[monthSelected]
		document.getElementById("spanYear").innerHTML =	yearSelected
		
	            
	    document.getElementById("buttons").innerHTML =  "";	
	}
	
	
	/**
	 * Calendar with ad publishing dates is put together
	 */
	function constructAdCalendar () {
	var	aNumDays = Array (31,0,31,30,31,30,31,31,30,31,30,31)

	var	dateMessage
	var	startDate =	new	Date (yearSelected,monthSelected,1)
	var	endDate

	if (monthSelected==1)
	{
		endDate	= new Date (yearSelected,monthSelected+1,1);
		endDate	= new Date (endDate	- (24*60*60*1000));
		numDaysInMonth = endDate.getDate()
	}
	else
	{
		numDaysInMonth = aNumDays[monthSelected];
	}

	datePointer	= 0
	dayPointer = startDate.getDay()	- startAt

	if (dayPointer<0)
	{
		dayPointer = 6
	}

	// Begin

	sHTML = ''

	if (showWeekNumber==1){ sHTML += '<div>'+weekString+'</div>' }
	for	(i=0; i<7; i++)	{ sHTML += '<div class="cal-day-name">'+dayName[i]+'</div>' }
	if (showWeekNumber==1) { sHTML += '<div>'+WeekNbr(startDate)+'</div>' }

	// Empty arese before month's first day
	for ( var i=1; i<=dayPointer;i++ ) {
		sHTML += '<div class="cal-day-blank">&nbsp;</div>'
	}

	// Days in rows by weeks
	for	( datePointer=1; datePointer<=numDaysInMonth; datePointer++	)
	{
	  dayHtml = '';
	  sClass = '';
		dayPointer++;
		


		for	(k=0;k<PaperPublishDatesCounter;k++)
		{
		  
			if ((parseInt(PaperPublishDates[k].d)==datePointer)&&(parseInt(PaperPublishDates[k].m)==(monthSelected+1))&&(parseInt(PaperPublishDates[k].y)==yearSelected))
			{
			   sClass = "cal-day-paper";
			}
		}	
		
		today = new Date();
		todayYear = today.getYear() > 1900 ? today.getYear() : today.getYear() + 1900;
		todayMonth = today.getMonth() + 1;
		todayDate = today.getDate();
		for	(k=0; k < AdPublishDatesCounter; k++)
		{
		  
			if ((parseInt(AdPublishDates[k].d)==datePointer)&&(parseInt(AdPublishDates[k].m)==(monthSelected+1))&&(parseInt(AdPublishDates[k].y)==yearSelected))
			{
				d = new Date(AdPublishDates[k].y, AdPublishDates[k].m-1, AdPublishDates[k].d);
				if ( today > d ) {
					sClass="cal-day-ad-past";
				} else {
			   		sClass = "cal-day-ad";
			   	}
			}
		}	
	

        
		if (sClass=='') {
            dayHtml = '<div class="cal-day-nopaper">'+datePointer+'</div>';
        } 
        else {
            dayHtml= '<a href="javascript:;" class="'+sClass+'" id="day-'+datePointer+'" onclick="dateClick(\''+datePointer+'\', this);">'+datePointer+'</a>';
        }


			 
			
		
			
	  // disable past or future
		if (timeline == 'disabledpast' && (datePointer<dateNow && monthSelected<monthNow && yearSelected<=yearNow || monthSelected<monthNow && yearSelected<=yearNow || datePointer<dateNow && monthSelected<=monthNow && yearSelected<=yearNow || yearSelected<yearNow) )
			{ sHTML += '<div class="cal-day-disabled">'+datePointer+'</div>'; dayHtml = ''; }
		else if (timeline == 'disabledfuture' && (datePointer > dateNow && monthSelected>monthNow && yearSelected>=yearNow || monthSelected>monthNow && yearSelected>=yearNow || datePointer>dateNow && monthSelected>=monthNow && yearSelected>=yearNow || yearSelected>yearNow) )
			{ sHTML += '<div class="cal-day-disabled">'+datePointer+'</div>'; dayHtml = ''; }
      
      			
		sHTML += dayHtml;
	}

	// Empty arease after month's last day
	if ((dayPointer+startAt	- 1) % 7 !=	0)
	{
		for	( var i=(dayPointer+startAt	- 1) % 7 ; i<=6; i++ )
		{
			sHTML += '<div class="cal-day-blank">&nbsp;</div>'
		}
	}

	// Display

	sHTML += '<div class="cal-clear">&nbsp;</div>'
	document.getElementById("sisu").innerHTML   = sHTML
	document.getElementById("spanMonth").innerHTML = monthName[monthSelected]
	document.getElementById("spanYear").innerHTML =	yearSelected
	
            sHTML1='<div class="cal-buttons" onclick="okPressed()">OK</div>'; 
            document.getElementById("buttons").innerHTML =  sHTML1;
	
}
	
	function dateClick(datePointer, element) {
	  //alert(element.className);
	  if (element.className == 'cal-day-paper') {
	    element.className = 'cal-day-ad'
	    addAdPublishDate(datePointer, monthSelected+1, yearSelected);
	  }
	  else if (element.className == 'cal-day-ad') {
	    element.className = 'cal-day-paper';
	    removeAdPublishDate(datePointer, monthSelected+1, yearSelected);
	  }
	  
	  dateSelected=datePointer;
	  //closeCalendar();
	}
	
	function okPressed() {
	    result = '';
	    for (i=0; i < AdPublishDatesCounter; i++) {
	        rec = AdPublishDates[i];
	        result += rec.d + '.' + rec.m + '.' + rec.y;
	        if (i+1 != AdPublishDatesCounter)  result += ';';
	    }
	    
	    date.value = result;
	    hideCalendar();
	    if (onDateSelected) onDateSelected();
            document.getElementById(date.id + '_link').href = 'javascript:;';
            initiateOnClick(date.id + '_link');
	}
	
	/**
	 * Display the calendar component
	 * Separators that are recognised: " ", "/", ".", "-" -
	 * By default today's date is used.
	 * To mark the year use "yyyy", month "m" or "mm",
	 * day "d" v?i "dd". Format description must include all these three
	 * If something is missing, today's date is used.
	 *
	 * @see constructCalendar()
	 *
	 * @param ct1 - object that calls
	 * @param ct2 - form inputfield object, where the date is held that user entered
	 * @param ct3 - form inputfield object, where date must be inserted
	 * @param format - date's format
	 */
	function popUpCalendar(ctl,ctl2,ctl3,format,ctl4) {
  popUpCalendarCustom(ctl,ctl2,ctl3,format,ctl4, 'plain');
}
 
function popUpCalendarCustom(ctl,ctl2,ctl3,format,ctl4, type) {
    if (!bPageLoaded) {
    init();
    }
    if (!bPageLoaded) return;
    
	timeline = ctl4;
	var	leftpos=0
	var	toppos=0
	calType = type;

	if (crossobj.visibility ==	"hidden" ) {
		ctlToPlaceValue = ctl2;
		dateFormat=format.toLowerCase();
		date = ctl3;

		// Is the separator valid

		formatChar = " "
		aFormat	= dateFormat.split(formatChar)
		if (aFormat.length<3)
		{
			formatChar = "/"
			aFormat	= dateFormat.split(formatChar)
			if (aFormat.length<3)
			{
				formatChar = "."
				aFormat	= dateFormat.split(formatChar)
				if (aFormat.length<3)
				{
					formatChar = "-"
					aFormat	= dateFormat.split(formatChar)
					if (aFormat.length<3)
					{
						// invalid date	format
						formatChar=""
					}
				}
			}
		}

		// Are all three components there
		tokensChanged =	0
		if ( formatChar	!= "" )
		{
			// use user's date
			aData = date.value.split(formatChar)

			for	(i=0;i<3;i++)
			{
				if ((aFormat[i]=="d") || (aFormat[i]=="dd"))
				{
					dateSelected = parseInt(aData[i], 10)
					tokensChanged ++
				}
				else if	((aFormat[i]=="m") || (aFormat[i]=="mm"))
				{
					monthSelected =	parseInt(aData[i], 10) - 1
					tokensChanged ++
				}
				else if	(aFormat[i]=="yyyy")
				{
					yearSelected = parseInt(aData[i], 10)
					tokensChanged ++
				}
				else if	(aFormat[i]=="mmm")
				{
					for	(j=0; j<12;	j++)
					{
						if (aData[i]==monthName[j])
						{
							monthSelected=j
							tokensChanged ++
						}
					}
				}
			}
		}

		var dateCheck = new Date(yearSelected,monthSelected,dateSelected);

		// If something is missing, today's date will be used
		if ((tokensChanged!=3)||isNaN(dateSelected)||isNaN(monthSelected)||isNaN(yearSelected)||dateCheck.getDate()!=dateSelected||dateCheck.getMonth()!=monthSelected||dateCheck.getFullYear()!=yearSelected)
		{
			dateSelected = dateNow
			monthSelected =	monthNow
			yearSelected = yearNow
		}

		odateSelected=dateSelected
		omonthSelected=monthSelected
		oyearSelected=yearSelected

		
      constructCalendar (1, monthSelected, yearSelected);

    cal	= document.getElementById("calendar");

		// Display the calendar under the button
		// If calendar isn't visible, move it upwards
		cal_height = cal.offsetHeight - 30;

		aTag = ctl
		do
		{
			aTag = aTag.offsetParent;
			if (aTag.tagName == "HTML") break;
			leftpos += aTag.offsetLeft-aTag.scrollLeft;
      toppos += aTag.offsetTop;
		}
		while(aTag.tagName!="BODY");
		cal_top = ctl.offsetTop + toppos - 20;
		cal_bottom = cal_top + cal_height;
		


		top_pos = 0;		
		if (window.pageYOffset)
		{
			  top_pos = window.pageYOffset
		}
		else if (document.documentElement && document.documentElement.scrollTop)
		{
			top_pos = document.documentElement.scrollTop
		}
		else if (document.body)
		{
			  top_pos = document.body.scrollTop
		}
		
		window_height = 0;
		
		if (window.innerHeight)
		{
			window_height = window.innerHeight
		}
		else if (document.documentElement && document.documentElement.clientHeight)
		{
			window_height = document.documentElement.clientHeight
		}
		else if (document.body)
		{
			window_height = document.body.clientHeight
		}
		
		scroll_bottom = top_pos + window_height;		
		if (cal_bottom > scroll_bottom)
		{
			cal_top = cal_top - (cal_bottom - scroll_bottom) - ctl.offsetHeight - 45;
		}

		left_pos = 0;		
		if (window.pageXOffset)
		{
			  left_pos = window.pageXOffset
		}
		else if (document.documentElement && document.documentElement.scrollLeft)
		{
			left_pos = document.documentElement.scrollLeft
		}
		else if (document.body)
		{
			  left_pos = document.body.scrollLeft
		}
		
		window_width = 0;
		if (window.innerWidth)
		{
			window_width = window.innerWidth
		}
		else if (document.documentElement && document.documentElement.clientWidth)
		{
			window_width = document.documentElement.clientWidth
		}
		else if (document.body)
		{
			window_width = document.body.clientWidth
		}
	
	    cal_left = ctl.offsetLeft + leftpos + 30;
	    if (left_pos+window_width < cal_left + 215) {
	      cal_left = left_pos+window_width -205;
	    }

		// Display
		crossobj.top = (fixedY==-1 ? cal_top : fixedY) + 'px';
		crossobj.left = (fixedX==-1 ? cal_left : fixedX) + 'px';
		crossobj.visibility=(dom||ie)? "visible" : "show"
		
		hideElement( 'SELECT', cal );
		hideElement( 'APPLET', cal );

		bShow = true;
	}
	else
	{
		hideCalendar()
		if (ctlNow!=ctl) {popUpCalendarCustom(ctl, ctl2, ctl3, format, ctl4, calType)}
	}
	ctlNow = ctl
}

addEvent( window, "load", init );
