function DragDropCalendar (domNodeId, startDate) {

	this.table = document.getElementById (domNodeId);
	this.itemNodes = this.table.getElementsByTagName ('td');

	var selfRef = this;

	DraggableObject.prototype.customDblClick = function (event) {
		if (!event) event = window.event;

		if (event.preventDefault) {
			event.preventDefault ();
		} else if (document.body.createControlRange) {
			document.body.createControlRange().select();
		}

		if (selfRef.dragDropComplete) {
			selfRef.dragDropComplete (this.domNode.date, this.domNode.date);
		}
	}

	DraggableObject.prototype.customMouseMove = function (event) {
		var td = DragDropCalendar.findCell (event);
		if (td) {
			selfRef.highlight (this.domNode, td);
		}
	}

	DraggableObject.prototype.customMouseUp = function (event, cancel) {
		var start, end;
		for (var i = 0; i < selfRef.itemNodes.length; i++) {
			var n = selfRef.itemNodes [i].className.indexOf ('selected');
			if (n >= 0) {
				if (!start) {
					start = selfRef.itemNodes [i].date;
				}
				end = selfRef.itemNodes [i].date;
				selfRef.itemNodes [i].className = selfRef.itemNodes [i].className.substring (0, n - 1);
			}
		}

		if (start == end) {
			cancel = true;
		}

		if (!cancel && selfRef.dragDropComplete) {
			selfRef.dragDropComplete (start, end);
		}
	}

	for (var i = 0; i < this.itemNodes.length; i++) {
		this.itemNodes [i].date = new Date (startDate.getFullYear (), startDate.getMonth (), startDate.getDate () + i);
		new DraggableObject (this.itemNodes [i]);
	}
}

DragDropCalendar.findCell = function (event) {
	var t;
	if (event.target) {
		t = event.target;
	} else {
		t = event.srcElement;
	}
	while (t && t.nodeName != 'TD') {
		t = t.parentNode;
	}
	if (t && t.className.indexOf ('date') == 0) {
		return t;
	}
	return null;
}

DragDropCalendar.prototype.highlight = function (start, end) {
	var selected = false;
	for (var i = 0; i < this.itemNodes.length; i++) {
		if (this.itemNodes [i] == start) {
			selected = !selected;
		}
		if (this.itemNodes [i] == end) {
			selected = !selected;
		}
		var n = this.itemNodes [i].className.indexOf ('selected');
		if (selected || this.itemNodes [i] == start || this.itemNodes [i] == end) {
			if (n < 0) {
				this.itemNodes [i].className += ' selected';
			}
		} else {
			if (n >= 0) {
				this.itemNodes [i].className = this.itemNodes [i].className.substring (0, n - 1);
			}
		}
	}
}
