
	//'######################################################################
	//'#  Função: Setup Calendario
	//'#  Criado: Gustavo - 17/08/2006
	//'#  Ultima Atualizacao:
	//'######################################################################

	Calendar.setup = function (params) 
	{
		function param_default(pname, def) 
		{
			if (typeof params[pname] == "undefined") 
			{ 
				params[pname] = def; 
			}
		};

		param_default("inputField",     null);
		param_default("displayArea",    null);
		param_default("button",         null);
		param_default("eventName",      "click");
		param_default("ifFormat",       "%Y/%m/%d");
		param_default("daFormat",       "%Y/%m/%d");
		param_default("singleClick",    true);
		param_default("disableFunc",    null);
		param_default("dateStatusFunc", params["disableFunc"]);
		param_default("dateText",       null);
		param_default("firstDay",       null);
		param_default("align",          "Br");
		param_default("range",          [1900, 2999]);
		param_default("weekNumbers",    true);
		param_default("flat",           null);
		param_default("flatCallback",   null);
		param_default("onSelect",       null);
		param_default("onClose",        null);
		param_default("onUpdate",       null);
		param_default("date",           null);
		param_default("showsTime",      false);
		param_default("timeFormat",     "24");
		param_default("electric",       true);
		param_default("step",           2);
		param_default("position",       null);
		param_default("cache",          false);
		param_default("showOthers",     false);
		param_default("multiple",       null);

		var tmp = ["inputField", "displayArea", "button"];
		for (var i in tmp)
		{
			if (typeof params[tmp[i]] == "string")
			{
				params[tmp[i]] = document.getElementById(params[tmp[i]]);
			}
		}
		if (!(params.flat || params.multiple || params.inputField || params.displayArea || params.button)) 
		{
			alert("Calendar.setup:\n  Nothing to setup (no fields found).  Please check your code");
			return false;
		}
		
		function onSelect(cal) 
		{
			var p = cal.params;
			var update = (cal.dateClicked || p.electric);
			if (update && p.inputField)
			{
				p.inputField.value = cal.date.print(p.ifFormat);
				if (typeof p.inputField.onchange == "function")
					p.inputField.onchange();
			}
			if (update && p.displayArea)
				p.displayArea.innerHTML = cal.date.print(p.daFormat);
			if (update && typeof p.onUpdate == "function")
				p.onUpdate(cal);
			if (update && p.flat)
			{
				if (typeof p.flatCallback == "function")
				p.flatCallback(cal);
			}
			if (update && p.singleClick && cal.dateClicked)
				cal.callCloseHandler();
		};
		if (params.flat != null) 
		{
			if (typeof params.flat == "string")
			params.flat = document.getElementById(params.flat);
			if (!params.flat) 
			{
				alert("Calendar.setup:\n  Flat specified but can't find parent.");
				return false;
			}
			var cal = new Calendar(params.firstDay, params.date, params.onSelect || onSelect);
			cal.showsOtherMonths = params.showOthers;
			cal.showsTime = params.showsTime;
			cal.time24 = (params.timeFormat == "24");
			cal.params = params;
			cal.weekNumbers = params.weekNumbers;
			cal.setRange(params.range[0], params.range[1]);
			cal.setDateStatusHandler(params.dateStatusFunc);
			cal.getDateText = params.dateText;
			if (params.ifFormat)
			{
				cal.setDateFormat(params.ifFormat);
			}
			if (params.inputField && typeof params.inputField.value == "string")
			{
				cal.parseDate(params.inputField.value);
			}
			cal.create(params.flat);
			cal.show();
			return false;
		}

		var triggerEl = params.button || params.displayArea || params.inputField;
		triggerEl["on" + params.eventName] = function() {
		var dateEl = params.inputField || params.displayArea;
		var dateFmt = params.inputField ? params.ifFormat : params.daFormat;
		var mustCreate = false;
		var cal = window.calendar;
		if (dateEl)
			params.date = Date.parseDate(dateEl.value || dateEl.innerHTML, dateFmt);
		if (!(cal && params.cache)) 
		{
			window.calendar = cal = new Calendar(params.firstDay,
							     params.date,
							     params.onSelect || onSelect,
							     params.onClose || function(cal) { cal.hide(); });
			cal.showsTime = params.showsTime;
			cal.time24 = (params.timeFormat == "24");
			cal.weekNumbers = params.weekNumbers;
			mustCreate = true;
		}
		else
		{
			if (params.date)
				cal.setDate(params.date);
			cal.hide();
		}
		if (params.multiple) {
			cal.multiple = {};
			for (var i = params.multiple.length; --i >= 0;) {
				var d = params.multiple[i];
				var ds = d.print("%Y%m%d");
				cal.multiple[ds] = d;
				}
			}
			cal.showsOtherMonths = params.showOthers;
			cal.yearStep = params.step;
			cal.setRange(params.range[0], params.range[1]);
			cal.params = params;
			cal.setDateStatusHandler(params.dateStatusFunc);
			cal.getDateText = params.dateText;
			cal.setDateFormat(dateFmt);
			if (mustCreate)
				cal.create();
			cal.refresh();
			if (!params.position)
				cal.showAtElement(params.button || params.displayArea || params.inputField, params.align);
			else
				cal.showAt(params.position[0], params.position[1]);
			return false;
		};	

		return cal;
	};
