// JS Calendar tweaks for Fabrik

var fabrikCalendar = null; // remember the calendar object so that we reuse
// it and avoid creating another

// This function gets called when an end-user clicks on some date
function fabrikSelected(cal, date) {
	cal.sel.value = date; // just update the value of the input field
}

// And this gets called when the end-user clicks on the _selected_ date,
// or clicks the "Close" (X) button.  It just hides the calendar without
// destroying it.
function fabrikCloseHandler(cal) {
	cal.hide();			// hide the calendar

	// don't check mousedown on document anymore (used to be able to hide the
	// calendar when someone clicks outside it, see the showCalendar function).
	Calendar.removeEvent(document, "mousedown", fabrikCheckCalendar);
	// $$$ hugh - refocus in the target field, otherwise custom JS events
	// won't fire (like onchange and onblur)
	cal.sel.focus();
}

// This gets called when the user presses a mouse button anywhere in the
// document, if the calendar is shown.  If the click was outside the open
// calendar this function closes it.
function fabrikCheckCalendar(ev) {
	var el = Calendar.is_ie ? Calendar.getElement(ev) : Calendar.getTargetElement(ev);
	for (; el != null; el = el.parentNode)
	// FIXME: allow end-user to click some link without closing the
	// calendar.  Good to see real-time stylesheet change :)
	if (el == fabrikCalendar.element || el.tagName == "A") break;
	if (el == null) {
		// calls closeHandler which should hide the calendar.
		fabrikCalendar.callCloseHandler();
		Calendar.stopEvent(ev);
	}
}

// This function shows the calendar under the element having the given id.
// It takes care of catching "mousedown" signals on document and hiding the
// calendar if the click was outside.
function fabrikShowCalendar(id,format) {
	var button_id = id + '_button';
	
	var options = Object.extend({
			showsTime:       false
	}, arguments[2] || {});
		
	var el = document.getElementById(id);
	if (fabrikCalendar != null) {
		// we already have one created, so just update it.
		fabrikCalendar.hide();		// hide the existing calendar
		fabrikCalendar.setDateFormat(format);
		fabrikCalendar.parseDate(el.value); // set it to a new date
	} else {
		// first-time call, create the calendar
		/*
		var cal = Calendar.setup({
			button: button_id,
			inputField: id,
			showsTime: true,
			onClick: fabrikSelected,
			onClose: fabrikCloseHandler,
			daFormat: format,
			ifFormat: format,
			range: [1900,2070]
		});
		*/
		var cal = new Calendar(true, null, fabrikSelected, fabrikCloseHandler);
		//var cal = Calendar(0,el.value, fabrikSelected, fabrikCloseHandler);
		fabrikCalendar = cal;		// remember the calendar in the global
		fabrikCalendar.setRange(1900, 2070);	// min/max year allowed
		fabrikCalendar.showsTime = options.showsTime;
		fabrikCalendar.setDateFormat(format);
		fabrikCalendar.create();		// create a popup calendar
		fabrikCalendar.parseDate(el.value); // set it to a new date
	}
	fabrikCalendar.sel = el;		// inform it about the input field in use
	fabrikCalendar.showAtElement(el);	// show the calendar next to the input field

	// catch mousedown on the document
	Calendar.addEvent(document, "mousedown", fabrikCheckCalendar);
	return false;
}

