/*  Copyright Mihai Bazon, 2002, 2003  |  http://dynarch.com/mishoo/
 * ---------------------------------------------------------------------------
 *
 * The DHTML Calendar
 *
 * Details and latest version at:
 * http://dynarch.com/mishoo/calendar.epl
 *
 * This script is distributed under the GNU Lesser General Public License.
 * Read the entire license text here: http://www.gnu.org/licenses/lgpl.html
 *
 * This file defines helper functions for setting up the calendar.  They are
 * intended to help non-programmers get a working calendar on their site
 * quickly.  This script should not be seen as part of the calendar.  It just
 * shows you what one can do with the calendar, while in the same time
 * providing a quick and simple method for setting it up.  If you need
 * exhaustive customization of the calendar creation process feel free to
 * modify this code to suit your needs (this is recommended and much better
 * than modifying calendar.js itself).
 */
 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);
 			
 			// a quick test to ensure that the Date is not parsed to be today - in
 			// Javascript if you call Date.parseDate on some garbage that should NOT
 			// parse to a Date, it just returns you today's date.  that's no good for
 			// us as we don't want people to be selecting today's date; in fact we even
 			// have a function that makes it impossible to select today's date.  
 			// this bit of code sets the date to tomorrow if it was parsed as today.
 			if (params.date != null) {
 				if (params.date.getDayOfYear() == new Date().getDayOfYear())
 					params.date = addDaysToDate(params.date,1); 			
 			}
 			
 			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;
 	};
