
function HsaCalendar(calendarId, putInsideDivObj, hiddenInputObj, changeAffectsId,xmlParams, updateDurationText, valueDay, valueMonth, valueYear, fieldName, apiMethodName) {

	var methodName = 'kalenteri';

	if (!putInsideDivObj) {
              alert('Calendar container missing!');
              return;
        }

	var containerObject = document.createElement('div');
	containerObject.setAttribute('id', calendarId);
	containerObject.hsa_HsaCalendarObject = this; // NOTE: Form.js needs this to access this object from the containerObject in DOM.

	putInsideDivObj.appendChild(containerObject);


	this.containerObject = containerObject;
	this.containerObjectId = calendarId;

	this.calendarId = calendarId;
	this.fieldName = fieldName;
	this.methodName = methodName;
	this.updateDurationText = updateDurationText;
	this.hiddenInputObj = hiddenInputObj;
	this.displayingYear = '';
	this.displayingMonth = '';
	this.displayingNext = false;
        this.displayingPrev = false;
	this.changeAffectsId = changeAffectsId;
	this.xmlParams = xmlParams;
	this.extraParams = '';
	// this._productCode = '';	
	this._apiMethodName = apiMethodName;

	this.valueDay = valueDay;
        this.valueMonth = valueMonth;
        this.valueYear = valueYear;

	if (valueMonth && valueYear) {
		this.displayingYear = valueYear;
		this.displayingMonth = valueMonth;
	}
}

HsaCalendar.prototype.setXmlParams = function(xmlParams) {
	this.xmlParams = xmlParams;
}

HsaCalendar.prototype.setSubscription = function(subscription) {
        this._subscription = subscription;
}

HsaCalendar.prototype.create = function(month, year, extraParams, resetVals) {
	if (month && year) {
		this.displayingMonth = month;
		this.displayingYear = year;
	}

	if (resetVals == '1') {
		this.valueDay = '';
		this.valueMonth = '';
		this.valueYear = '';
                if (this.hiddenInputObj)
                        this.hiddenInputObj.value = '';
                if (document.getElementById(this.updateDurationText))
                        document.getElementById(this.updateDurationText).lastChild.nodeValue= '-';
        }

	if (extraParams) this.extraParams = extraParams;

	this.loadingScreen();
	this.loadHsaCalendarXML(extraParams);
}

HsaCalendar.prototype.loadingScreen = function() {
	this.containerObject.innerHTML = '<div align="center">Ladataan kalenteria...</div>';
	return;
}

HsaCalendar.prototype.loadHsaCalendarXML = function() {

        var queryString = 'year=' + this.displayingYear + '&month=' + this.displayingMonth + '&fieldName=' + this.fieldName + '&calendarId=' + this.calendarId;

        if (this.xmlParams)
                queryString += '&' + this.xmlParams;

	if (this.extraParams)
		queryString += '&' + this.extraParams;

        if (this._subscription)
                queryString += '&subscription=' + this._subscription;

        if (this._apiMethodName)
                queryString += '&apiMethodName=' + this._apiMethodName;

	jQuery.ajax(Hsa.form._ajaxRequestOptionsJ(Hsa.config.backendpath + this.methodName + '.xml', queryString));
}

HsaCalendar.prototype._processHsaCalendarData = function(parentElem, xmlElem, currentDepth) {

	var xmlNext = xmlElem.getElementsByTagName('nextbutton');
	for ( var i = 0 ; i < xmlNext.length ; i++ ) {
		if (xmlNext[i].getAttribute("enabled") == '1')
			this.displayingNext = true;
		else
			this.displayingNext = false;
	}

        var xmlPrev = xmlElem.getElementsByTagName('prevbutton');
        for ( var i = 0 ; i < xmlPrev.length ; i++ ) {
                if (xmlPrev[i].getAttribute("enabled") == '1')
                        this.displayingPrev = true;
                else
                        this.displayingPrev = false;
        }

        var xmlYears = xmlElem.getElementsByTagName('year');
                for ( var i = 0 ; i < xmlYears.length ; i++ ) {
	                  if ( xmlYears[i].getAttribute("value") ) {
				this.displayingYear = xmlYears[i].getAttribute("value");
                                var xmlMonths = xmlYears[i].getElementsByTagName('month');
                                         for ( var i = 0 ; i < xmlMonths.length ; i++ ) {
						if (xmlMonths[i].getAttribute("value") ) {
							this.displayingMonth = xmlMonths[i].getAttribute("value");
							this.displayingMonthName = xmlMonths[i].getAttribute("name");
                                                        this._makeHsaCalendar(xmlMonths[i]);
                                                }
                                         }
                        }
                }
}

HsaCalendar.prototype._makeHsaCalendar = function(monthElement) {
	var calHTML = '<div class="basicContainer calendarContainer">';

        calHTML += '<table class="calendar"><thead><tr class="month"><th class="first" colspan="7">';

	if (this.displayingPrev) {
		calHTML += '<a href="" onClick="return(false);">';
	}
	calHTML += '<div id="'+ this.containerObjectId +'_calendarLeft"><img class="previous" src="/img/cal_arrow_left.png" width="7" height="8" alt="&lt;" title="Edellinen kuukausi" /></div>';
        if (this.displayingPrev) {
		calHTML += '</a>';
	}

        if (this.displayingNext) {
		calHTML += '<a href="" onClick="return(false);">';
	}
	calHTML += '<div id="'+ this.containerObjectId +'_calendarRight"><img class="next" src="/img/cal_arrow_right.png" width="7" height="8" alt="&gt;" title="Seuraava kuukausi" /></div>';
        if (this.displayingNext) {
		calHTML += '</a>';
	}

	calHTML += this.displayingMonthName + ' ' + this.displayingYear;
	calHTML += '</th></tr>';

	calHTML += '<tr><th class="wd first">ma</th><th class="wd">ti</th><th class="wd">ke</th><th class="wd">to</th><th class="wd">pe</th><th class="wd">la</th><th class="wd">su</th></tr>';


	calHTML += '</thead><tbody>';

        var xmlDays = monthElement.getElementsByTagName('day');

        var xmlWeeks = monthElement.getElementsByTagName('week');
        var dayNames = ['ma','ti','ke','to','pe','la','su'];

	var dayIds = new Array;

        // viikko
        for ( var i = 0 ; i < xmlWeeks.length ; i++ ) {
                var daysEnabled = this._getDaysHashEnabled(xmlWeeks[i].getElementsByTagName('day'));
                var daysValue = this._getDaysHashValues(xmlWeeks[i].getElementsByTagName('day'));

                calHTML += '<tr>';

                for ( var a = 0 ; a < dayNames.length ; a++ ) {

			var iteDay = dayNames[a];
			var iteValue = daysValue[iteDay];

                        if (daysEnabled[iteDay] == '1') {

				var dayId = 'day_' + this.containerObjectId + '_' + this.displayingMonth + '_' + this.displayingYear + '_' + iteValue;
				var dayId_a = 'day_' + this.containerObjectId + '_' + this.displayingMonth + '_' + this.displayingYear + '_' + iteValue + '_a';
				dayIds.push(dayId);

				if (this.valueDay == iteValue && this.valueMonth == this.displayingMonth) {
	                              if (a == 0)
	                                       calHTML += '<td class="wd first" id="' + dayId + '">';
	                              else
	                                      calHTML += '<td class="wd" id="' + dayId + '">';

	                                calHTML += '<a href="" class="active" onClick="return(false);" id=' + dayId_a + '>' + iteValue +'</a></td>';
				} else {

                                      	if (a == 0)
                                               calHTML += '<td class="wd first" id="' + dayId + '">';
                                      	else
                                              calHTML += '<td class="wd" id="' + dayId + '">';

					calHTML += '<a href="" onClick="return(false);" id=' + dayId_a + '>' + iteValue +'</a></td>';
				}
                        } else if (daysEnabled[iteDay] == '0') {

                              if (a == 0)
                                      calHTML += '<td class="wd disabled first">';
                              else
                                      calHTML += '<td class="wd disabled">';

				calHTML += '<span>'+ iteValue +'</span>';

                                //calHTML += '<a href="" onClick="return(false);" class="disabled" id="calDay'+ this.displayingMonth + '_' + this.displayingYear + '_' + iteValue  +'">' + iteValue +'</a></td>';
                        } else {
				if (a == 0)
	                                calHTML += '<td class="wd disabled first"></td>';
				else
	                                calHTML += '<td class="wd disabled"></td>';
                        }
                }
               calHTML += '</tr>';
        }

	calHTML += '</tbody></table></div>';

        this.containerObject.innerHTML = calHTML;

	// Calendar events
	with(document) {
		var self = this;
		// dates
		for (var i=0; i<dayIds.length; i++) {
			if (document.getElementById(dayIds[i] + '_a')) {
		              Hsa.addEvent(document.getElementById(dayIds[i] + '_a'), "click", function (e) { self._calendarClickDate(e,self); }, false);
		      	}
		}

		// prev & next -buttons
	        if (this.displayingPrev)
		        Hsa.addEvent(document.getElementById(this.containerObjectId + '_calendarLeft'), "click", function (e) { self._calendarGoLeft(e,self); }, false);
                if (this.displayingNext)
		        Hsa.addEvent(document.getElementById(this.containerObjectId + '_calendarRight'), "click", function (e) { self._calendarGoRight(e,self); }, false);
	}

        // default vals
        if (this.valueDay && this.valueMonth && this.valueYear) {
                if (this.hiddenInputObj) {
                        this.hiddenInputObj.value = this.valueDay + '.' + this.valueMonth + '.' + this.valueYear;
                }
                if (document.getElementById(this.updateDurationText)) {
			document.getElementById(this.updateDurationText).lastChild.nodeValue=this.valueDay + '.' + this.valueMonth + '.' + this.valueYear;
                }
        }
}

HsaCalendar.prototype._calendarClickDate = function(e, self) {
        var target = window.event ? window.event.srcElement : e ? e.target : null;
		//Check for Safari 1.3 (instead of A-element it points to the textNode inside)
		if (!target.tagName) {
			target=target.parentNode;
		}

	if (self.hiddenInputObj)
		self.hiddenInputObj.value = target.innerHTML + '.' + self.displayingMonth + '.' + self.displayingYear;	

        var dayId_new = 'day_' + self.containerObjectId + '_' + self.displayingMonth + '_' + self.displayingYear + '_' + target.innerHTML + '_a';
	var dayId_cur = 'day_' + self.containerObjectId + '_' + self.displayingMonth + '_' + self.displayingYear + '_' + self.valueDay + '_a';

	if (self.valueDay && document.getElementById(dayId_cur)) document.getElementById(dayId_cur).className='';

	document.getElementById(dayId_new).className='active';

	self.valueDay = target.innerHTML;
	self.valueMonth = self.displayingMonth;
        self.valueYear = self.displayingYear;
	// update the "other" calendar if changeAffects is defined
	var hiddenInput = document.getElementById(self.changeAffectsId);
	if (hiddenInput && hiddenInput.hsa_HsaCalendarObject) {
			hiddenInput.hsa_HsaCalendarObject.valueDay = '';
			hiddenInput.hsa_HsaCalendarObject.create(self.displayingMonth ,self.displayingYear, 'otherValueDay=' + target.innerHTML + '&otherValueMonth=' + self.displayingMonth + '&otherValueYear=' + self.displayingYear, '1');
	}

	if (document.getElementById(self.updateDurationText))
		document.getElementById(self.updateDurationText).lastChild.nodeValue=target.innerHTML + '.' + self.displayingMonth + '.' + self.displayingYear;

	var queryS = self.xmlParams;
	if (queryS.length != 0)
		queryS += '&';
	queryS += 'apiMethodName=' + self._apiMethodName + '&subscription=' + self._subscription + '&year=' + self.displayingYear + '&month=' + self.displayingMonth + '&day=' + self.valueDay + '&fieldName=' + self.fieldName;

	jQuery.ajax(Hsa.form._ajaxRequestOptionsJ(Hsa.config.backendpath + 'kalenteri-click' + '.xml', queryS));
}

HsaCalendar.prototype._calendarGoLeft = function(e, self) {
        var target = window.event ? window.event.srcElement : e ? e.target : null;

        var cYear = self.displayingYear;
        var cMonth = self.displayingMonth;

        if (--cMonth == 0) {
                cMonth = 12;
                cYear--;
        }

        self.create(cMonth, cYear);
}

HsaCalendar.prototype._calendarGoRight = function(e, self) {
	var target = window.event ? window.event.srcElement : e ? e.target : null;

	var cYear = self.displayingYear;
        var cMonth = self.displayingMonth;

	if (++cMonth == 13) {
		cMonth = 1;
		cYear++;
	}

        self.create(cMonth, cYear);
}

HsaCalendar.prototype._getDaysHashEnabled = function(xmlDays) {
        var dHash = new Array;
        for ( var i = 0 ; i < xmlDays.length ; i++ ) {
                dHash[xmlDays[i].getAttribute("name")] = xmlDays[i].getAttribute("enabled"); // HUOM NEGAATIO TAHAN
        }
        return(dHash);
}

HsaCalendar.prototype._getDaysHashValues = function(xmlDays) {
        var dHash = new Array;
        for ( var i = 0 ; i < xmlDays.length ; i++ ) {
                dHash[xmlDays[i].getAttribute("name")] = xmlDays[i].getAttribute("value");
        }
        return(dHash);
}

