// 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 );

function initiateOnClick(id) {
    if (document.createEventObject) {
        document.getElementById(id).fireEvent('onclick');
    } else if (document.createEvent) {
        var evObj = document.createEvent('MouseEvents');
        evObj.initEvent('click', true, false );
        document.getElementById(id).dispatchEvent(evObj);
    }
    return false;
}
