Main Page | Modules | Directories | File List | File Members

calendar-setup.js

Go to the documentation of this file.
00001 /* 
00002  * The Zapatec DHTML Calendar
00003  *
00004  * Copyright (c) 2004 by Zapatec, Inc.
00005  * http://www.zapatec.com
00006  * 1700 MLK Way, Berkeley, California,
00007  * 94709, U.S.A. 
00008  * All rights reserved.
00009  *
00010  * Original version written by Mihai Bazon,
00011  * http://www.bazon.net/mishoo/calendar.epl
00012  *
00013  * This file defines helper functions for setting up the calendar.  They are
00014  * intended to help non-programmers get a working calendar on their site
00015  * quickly.  This script should not be seen as part of the calendar.  It just
00016  * shows you what one can do with the calendar, while in the same time
00017  * providing a quick and simple method for setting it up.  If you need
00018  * exhaustive customization of the calendar creation process feel free to
00019  * modify this code to suit your needs (this is recommended and much better
00020  * than modifying calendar.js itself).
00021  */
00022 
00023 // $Id: calendar-setup.js 1909 2006-02-08 16:59:53Z slip $
00024 
00025 //test for the right path
00026 Zapatec.Setup = function () {};
00027 Zapatec.Setup.test = true;
00028 
00081 Zapatec.Calendar.setup = function (params) {
00082         function param_default(pname, def) { if (typeof params[pname] == "undefined") { params[pname] = def; } };
00083         param_default("inputField",     null);
00084         param_default("displayArea",    null);
00085         param_default("button",         null);
00086         param_default("eventName",      "click");
00087         param_default("ifFormat",       "%Y/%m/%d");
00088         param_default("daFormat",       "%Y/%m/%d");
00089         param_default("singleClick",    true);
00090         param_default("disableFunc",    null);
00091         param_default("dateStatusFunc", params["disableFunc"]); // takes precedence if both are defined
00092         param_default("dateText",       null);
00093         param_default("firstDay",       null);
00094         param_default("align",          "Br");
00095         param_default("range",          [1900, 2999]);
00096         param_default("weekNumbers",    true);
00097         param_default("flat",           null);
00098         param_default("flatCallback",   null);
00099         param_default("onSelect",       null);
00100         param_default("onClose",        null);
00101         param_default("onUpdate",       null);
00102         param_default("date",           null);
00103         param_default("showsTime",      false);
00104         param_default("sortOrder",      "asc");
00105         param_default("timeFormat",     "24");
00106         param_default("timeInterval",   null);
00107         param_default("electric",       true);
00108         param_default("step",           2);
00109         param_default("position",       null);
00110         param_default("cache",          false);
00111         param_default("showOthers",     false);
00112         param_default("multiple",       null);
00113         param_default("saveDate",       null);
00114         param_default("fdowClick",      false);
00115         param_default("titleHtml",      null);
00116         param_default("disableFdowChange", false);
00117         if ((params.numberMonths > 12) || (params.numberMonths < 1)) {
00118                 params.numberMonths = 1;
00119         } else {
00120                 param_default("numberMonths",   1);
00121         }
00122         if (params.numberMonths > 1) {
00123                 params.showOthers = false;
00124         }
00125         params.numberMonths = parseInt(params.numberMonths, 10);
00126         if ((params.controlMonth > params.numberMonths) || (params.controlMonth < 1)) {
00127                 params.controlMonth = 1;
00128         } else {
00129                 param_default("controlMonth",   1);
00130         }
00131         params.controlMonth = parseInt(params.controlMonth, 10);
00132         param_default("vertical",       false);
00133         if (params.monthsInRow > params.numberMonths) {
00134                 params.monthsInRow = params.numberMonths;
00135         }
00136         param_default("monthsInRow",    params.numberMonths);
00137         params.monthsInRow = parseInt(params.monthsInRow, 10);
00138         if (params.multiple) {
00139                 params.singleClick = false;
00140         }
00141         
00142         var tmp = ["inputField", "displayArea", "button"];
00143         for (var i in tmp) {
00144                 if (typeof params[tmp[i]] == "string") {
00145                         params[tmp[i]] = document.getElementById(params[tmp[i]]);
00146                 }
00147         }
00148         if (!(params.flat || params.multiple || params.inputField || params.displayArea || params.button)) {
00149                 alert("Calendar.setup:\n  Nothing to setup (no fields found).  Please check your code");
00150                 return false;
00151         }
00152         if (((params.timeInterval) && ((params.timeInterval !== Math.floor(params.timeInterval)) || ((60 % params.timeInterval !== 0) && (params.timeInterval % 60 !== 0)))) || (params.timeInterval > 360)) {
00153                 alert("timeInterval option can only have the following number of minutes:\n1, 2, 3, 4, 5, 6, 10, 15, 30,  60, 120, 180, 240, 300, 360 ");
00154                 params.timeInterval = null;
00155         }
00156         if (params.date && !Date.parse(params.date)) {
00157                 alert("Start Date Invalid: " + params.date + ".\nSee date option.\nDefaulting to today.");
00158                 params.date = null;
00159         }
00160         if (params.saveDate) { //If saveDate is on We're saving the date in a cookie
00161                 param_default("cookiePrefix", window.location.href + "--" + params.button.id);
00162                 //fetch the cookie
00163                 var cookieName = params.cookiePrefix;
00164                 var newdate = Zapatec.Utils.getCookie(cookieName);
00165                 if (newdate != null) { //if there's a cookie
00166                         //set the value of the text field
00167                         document.getElementById(params.inputField.id).value = newdate;
00168                 }
00169         }
00170 
00171         function onSelect(cal) {
00172                 var p = cal.params;
00173                 var update = (cal.dateClicked || p.electric);
00174                 if (update && p.flat) {
00175                         if (typeof p.flatCallback == "function")
00176                         {
00177                            if (!p.multiple) //User can call function submitFlatDates directly in Calendar object to handle the submission of multiple dates.
00178                                 p.flatCallback(cal);
00179                         } else
00180                                 alert("No flatCallback given -- doing nothing.");
00181                         return false;
00182                 }
00183                 if (update && p.inputField) {
00184                         p.inputField.value = cal.currentDate.print(p.ifFormat);
00185                         if (typeof p.inputField.onchange == "function")
00186                                 p.inputField.onchange();
00187                 }
00188                 if (update && p.displayArea)
00189                         p.displayArea.innerHTML = cal.currentDate.print(p.daFormat);
00190                 if (update && p.singleClick && cal.dateClicked)
00191                         cal.callCloseHandler();
00192                 if (update && typeof p.onUpdate == "function")
00193                         p.onUpdate(cal);
00194                 if (p.saveDate) { //save date in cookie
00195                         //unique name of the cookie is the name of the button  + href
00196                         var cookieName = p.cookiePrefix;
00197                         Zapatec.Utils.writeCookie(cookieName, p.inputField.value, null, '/', p.saveDate);
00198                 } 
00199         };
00200 
00201         if (params.flat != null) {
00202                 if (typeof params.flat == "string")
00203                         params.flat = document.getElementById(params.flat);
00204                 if (!params.flat) {
00205                         alert("Calendar.setup:\n  Flat specified but can't find parent.");
00206                         return false;
00207                 }
00208                 var cal = new Zapatec.Calendar(params.firstDay, params.date, params.onSelect || onSelect);
00209                 cal.disableFdowClick = params.disableFdowChange;
00210                 cal.showsOtherMonths = params.showOthers;
00211                 cal.showsTime = params.showsTime;
00212                 cal.time24 = (params.timeFormat == "24");
00213                 cal.timeInterval = params.timeInterval;
00214                 cal.params = params;
00215                 cal.weekNumbers = params.weekNumbers;
00216                 cal.sortOrder = params.sortOrder.toLowerCase();
00217                 cal.setRange(params.range[0], params.range[1]);
00218                 cal.setDateStatusHandler(params.dateStatusFunc);
00219                 cal.getDateText = params.dateText;
00220                 cal.numberMonths = params.numberMonths;
00221                 cal.controlMonth = params.controlMonth;
00222                 cal.vertical = params.vertical;
00223                 cal.yearStep = params.step;
00224                 cal.monthsInRow = params.monthsInRow;
00225                 cal.helpButton = !params.noHelp;
00226                 if (params.ifFormat) {
00227                         cal.setDateFormat(params.ifFormat);
00228                 }
00229                 
00230                 if (params.inputField && params.inputField.type == "text" && typeof params.inputField.value == "string") {
00231                         cal.parseDate(params.inputField.value);
00232                 }
00233 
00234                 if (params.multiple) {
00235                    cal.setMultipleDates(params.multiple);
00236                 }
00237                 cal.create(params.flat);
00238                 cal.show();
00239                 return cal;
00240         }
00241 
00242         var triggerEl = params.button || params.displayArea || params.inputField;
00243         triggerEl["on" + params.eventName] = function() {
00244                 var dateEl = params.inputField || params.displayArea;
00245                 //FIX for Enter key!
00246                 if (triggerEl.blur) {triggerEl.blur();}
00247                 var dateFmt = params.inputField ? params.ifFormat : params.daFormat;
00248                 var mustCreate = false;
00249                 var cal = window.calendar;
00250 
00251                 // Exit if calendar is NOT hidden and user tries to create another calendar (Click or SpaceBar)
00252                 // Rev 1.9 - this needs to be integrated, it broke the multiple month feature
00253                 //if (cal && !cal.hidden) return false;
00254 
00255                 if (!(cal && params.cache)) {
00256                         window.calendar = cal = new Zapatec.Calendar(params.firstDay,
00257                                                              params.date,
00258                                                              params.onSelect || onSelect,
00259                                                              params.onClose || function(cal) {
00260                                                                      if (params.cache)
00261                                                                              cal.hide();
00262                                                                      else
00263                                                                              cal.destroy();
00264                                                              });
00265                         cal.disableFdowClick = params.disableFdowChange;
00266                         cal.showsTime = params.showsTime;
00267                         cal.time24 = (params.timeFormat == "24");
00268                         cal.timeInterval = params.timeInterval;
00269                         cal.weekNumbers = params.weekNumbers;
00270                         cal.numberMonths = params.numberMonths;
00271                         cal.controlMonth = params.controlMonth;
00272                         cal.vertical = params.vertical;
00273                         cal.monthsInRow = params.monthsInRow;                   
00274                         cal.historyDateFormat = params.ifFormat || params.daFormat;
00275                         cal.helpButton = !params.noHelp;
00276                         mustCreate = true;
00277                 } else {
00278                         if (params.date)
00279                                 cal.setDate(params.date);
00280                         cal.hide();
00281                 }
00282 
00283                 if (params.multiple) {
00284                    cal.setMultipleDates(params.multiple);
00285                 }
00286                 
00287                 cal.showsOtherMonths = params.showOthers;
00288                 cal.yearStep = params.step;
00289                 cal.setRange(params.range[0], params.range[1]);
00290                 cal.params = params;
00291                 cal.setDateStatusHandler(params.dateStatusFunc);
00292                 cal.getDateText = params.dateText;
00293                 cal.setDateFormat(dateFmt);
00294                 if (mustCreate)
00295                         cal.create();
00296                 if (dateEl) {
00297                         var dateValue;
00298                         //figure out if the it's in value or innerHTML
00299                         if (dateEl.value) {
00300                                 dateValue = dateEl.value;
00301                         } else {
00302                                 dateValue = dateEl.innerHTML;
00303                         }
00304                         if (dateValue != "") { //if there is a date to initialize from
00305                                 var parsedDate = Date.parseDate(dateEl.value || dateEl.innerHTML, dateFmt);
00306                                 //This check for when webmaster initializes the box with something like
00307                                 //"check in"
00308                                 if (parsedDate != null) { //if it's parsable
00309                                 cal.setDate(parsedDate);
00310                                 }
00311                         }
00312                 }
00313                 if (!params.position)
00314                         cal.showAtElement(params.button || params.displayArea || params.inputField, params.align);
00315                 else
00316                         cal.showAt(params.position[0], params.position[1]);
00317                 return false;
00318         };
00319 
00320         if (params.closeEventName) {
00321                 triggerEl["on" + params.closeEventName] = function() {
00322                         if (window.calendar)
00323                                 window.calendar.callCloseHandler();
00324                 };
00325         }
00326 
00327         return cal;
00328 };
00329 
00330