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;
};