var calendar_ajaxObj = new Object();
calendar_ajaxObj.xmlHTTP = null;

function emptyHTMLElement(node) {
	for(var i = (node.childNodes.length - 1); i >= 0; --i) {
		node.removeChild(node.childNodes[i]);
	}
}

function vcevents_openCalendar(event, input_field_id, ajax_url, date_format, locale, year_month) {
	if(typeof XMLHttpRequest == 'function') {
		calendar_ajaxObj.xmlHTTP = new XMLHttpRequest();
	} else {
		try {
			calendar_ajaxObj.xmlHTTP = new ActiveXObject("Msxml2.XMLHTTP");
		} catch(e) {
			try {
				calendar_ajaxObj.xmlHTTP = new ActiveXObject("Microsoft.XMLHTTP");
			} catch(e) {
				calendar_ajaxObj.xmlHTTP = null;
			}
		}
	}
	if(calendar_ajaxObj.xmlHTTP) {
		calendar_ajaxObj.xmlHTTP.onreadystatechange = function () {
			if((calendar_ajaxObj.xmlHTTP.readyState == 4) && (calendar_ajaxObj.xmlHTTP.status == 200)) {
				vcevents_drawCalendar();
			}
		};
		calendar_ajaxObj.input_field_id = input_field_id;
		calendar_ajaxObj.ajax_url = ajax_url;
		calendar_ajaxObj.date_format = date_format;
		calendar_ajaxObj.locale = locale;
		ajax_url += '?date_format=' + encodeURIComponent(date_format) + '&locale=' + encodeURIComponent(locale);
		if(year_month == '') {
			ajax_url += '&date=' + encodeURIComponent(document.getElementById(input_field_id).value);
		} else {
			ajax_url += '&year=' + year_month.substr(0, 4) + '&month=' + year_month.substr(4, 2);
		}
		calendar_ajaxObj.xmlHTTP.open('GET', ajax_url, true);
		calendar_ajaxObj.xmlHTTP.send(null);
		if(event != null) {
			var calendarElement = document.getElementById('tx_vcevents_calendar');
			calendarElement.style.position = 'absolute';
			calendarElement.style.left = event.clientX + 'px';
			calendarElement.style.top = event.clientY + 'px';
		}
	}
}

function vcevents_drawCalendar() {
	var i,j;
	var xml = calendar_ajaxObj.xmlHTTP.responseXML;
	var calendarElement = document.getElementById('tx_vcevents_calendar');
	var contentElement = document.getElementById('tx_vcevents_calendar_content');
	if(! contentElement) {
		var closeDIV = calendarElement.appendChild(document.createElement('div'));
		closeDIV.id = 'tx_vcevents_calendar_close';

		contentElement = calendarElement.appendChild(document.createElement('div'));
		contentElement.id = 'tx_vcevents_calendar_content';

		var closeA = closeDIV.appendChild(document.createElement('a'));
		closeA.href = 'javascript:vcevents_closeCalendar(\'\');';
		closeA.appendChild(document.createTextNode('X'));
	} else {
		emptyHTMLElement(contentElement);
	}

	var month = xml.getElementsByTagName('month')[0];

	// table
	var tableElement = contentElement.appendChild(document.createElement('table'));
	tableElement.border = tableElement.cellSpacing = tableElement.cellPadding = 0;
	tableElement.className = 'vcevents-calendar-table';

	var tbodyElement = tableElement.appendChild(document.createElement('tbody'));

	var navigationElement = tbodyElement.appendChild(document.createElement('tr')).appendChild(document.createElement('td'));
	navigationElement.colSpan = 8;

	// table for month navigation
	var navTableElement = navigationElement.appendChild(document.createElement('table'));
	navTableElement.border = navTableElement.cellSpacing = navTableElement.cellPadding = 0;
	navTableElement.className = 'vcevents-calendar-navigation-table';

	var navTRElement = navTableElement.appendChild(document.createElement('tbody')).appendChild(document.createElement('tr'));;

	var navLeftTDElement = navTRElement.appendChild(document.createElement('td'));
	navLeftTDElement.className = 'vcevents-calendar-navigation-left';

	var navLeftAElement = navLeftTDElement.appendChild(document.createElement('a'));
	navLeftAElement.href = 'javascript:vcevents_openCalendar(null, \'' + calendar_ajaxObj.input_field_id + '\',\'' + calendar_ajaxObj.ajax_url + '\',\'' + calendar_ajaxObj.date_format + '\',\'' + calendar_ajaxObj.locale + '\',\'' + month.getAttribute('left') + '\');';
	navLeftAElement.appendChild(document.createTextNode('<<'));

	var navMiddleTDElement = navTRElement.appendChild(document.createElement('td'));
	navMiddleTDElement.className = 'vcevents-calendar-navigation-middle';
	navMiddleTDElement.appendChild(document.createTextNode(month.getAttribute('name')));

	var navRightTDElement = navTRElement.appendChild(document.createElement('td'));
	navRightTDElement.className = 'vcevents-calendar-navigation-right';

	var navRightAElement = navRightTDElement.appendChild(document.createElement('a'));
	navRightAElement.href = 'javascript:vcevents_openCalendar(null, \'' + calendar_ajaxObj.input_field_id + '\',\'' + calendar_ajaxObj.ajax_url + '\',\'' + calendar_ajaxObj.date_format + '\',\'' + calendar_ajaxObj.locale + '\',\'' + month.getAttribute('right') + '\');';
	navRightAElement.appendChild(document.createTextNode('>>'));

	// column headers
	var headersTRElement = tbodyElement.appendChild(document.createElement('tr'));
	var headers = xml.getElementsByTagName('headers')[0].getElementsByTagName('header');
	var headerTDElement;
	for(i = 0; i < headers.length; i++) {
		headerTDElement = headersTRElement.appendChild(document.createElement('td'));
		headerTDElement.className = 'vcevents-calendar-day-header';
		headerTDElement.appendChild(document.createTextNode(headers[i].firstChild.data));
	}

	// weeks
	var weekTRElement, dayTDElement, dayAElement;
	for(i = 0; i < month.childNodes.length; ++i) {
		weekTRElement = tbodyElement.appendChild(document.createElement('tr'));
		weekTRElement.className = 'vcevents-calendar-week';
		weekNumberTDElement = weekTRElement.appendChild(document.createElement('td'));
		weekNumberTDElement.className = 'vcevents-calendar-weeknumber';
		weekNumberTDElement.appendChild(document.createTextNode(month.childNodes[i].getAttribute('number')));
		for(j = 0; j < month.childNodes[i].childNodes.length; ++j) {
			dayTDElement = weekTRElement.appendChild(document.createElement('td'));
			if(month.childNodes[i].childNodes[j].getAttribute('currentmonth') == '0') {
				dayTDElement.className = 'vcevents-calendar-day-other-month';
			} else if(month.childNodes[i].childNodes[j].firstChild.data == document.getElementById(calendar_ajaxObj.input_field_id).value) {
				dayTDElement.className = 'vcevents-calendar-day-selected';
			} else {
				dayTDElement.className = 'vcevents-calendar-day';
			}
			dayAElement = dayTDElement.appendChild(document.createElement('a'));
			dayAElement.appendChild(document.createTextNode(month.childNodes[i].childNodes[j].getAttribute('number')));
			dayAElement.href = 'javascript:vcevents_closeCalendar(\'' + month.childNodes[i].childNodes[j].firstChild.data + '\');';
		}
	}
	
	calendarElement.style.display = 'block';
	var bgElement = document.getElementById('tx_vcevents_calendar_background');
	if(bgElement) {
		bgElement.style.display = 'block';
	}
}

function vcevents_closeCalendar(dateString) {
	if(dateString != '') {
		document.getElementById(calendar_ajaxObj.input_field_id).value = dateString;
	}
	document.getElementById('tx_vcevents_calendar').style.display = 'none';
	var bgElement = document.getElementById('tx_vcevents_calendar_background');
	if(bgElement) {
		bgElement.style.display = 'none';
	}
}

