From b32fe49d9bf9ecefc4c74230fd32e575554d250d Mon Sep 17 00:00:00 2001 From: Ralf Becker Date: Sun, 17 Aug 2003 23:05:57 +0000 Subject: [PATCH] wrapper-class and setup-file for jsCalendar --- phpgwapi/inc/class.jscalendar.inc.php | 115 ++++++++++++++ phpgwapi/inc/jscalendar-setup.php | 213 ++++++++++++++++++++++++++ phpgwapi/inc/jscalendar/README-phpGW | 9 ++ 3 files changed, 337 insertions(+) create mode 100644 phpgwapi/inc/class.jscalendar.inc.php create mode 100644 phpgwapi/inc/jscalendar-setup.php create mode 100644 phpgwapi/inc/jscalendar/README-phpGW diff --git a/phpgwapi/inc/class.jscalendar.inc.php b/phpgwapi/inc/class.jscalendar.inc.php new file mode 100644 index 0000000000..edc8bc4e24 --- /dev/null +++ b/phpgwapi/inc/class.jscalendar.inc.php @@ -0,0 +1,115 @@ + * +* -------------------------------------------- * +* This program is free software; you can redistribute it and/or modify it * +* under the terms of the GNU General Public License as published by the * +* Free Software Foundation; either version 2 of the License, or (at your * +* option) any later version. * +\**************************************************************************/ + +/* $Id$ */ + +/*! +@class jscalendar +@author ralfbecker +@abstract wrapper for the jsCalendar +@discussion the constructor load the necessary javascript-files +*/ +class jscalendar +{ + /*! + @function jscalendar + @syntax jscalendar( $do_header=True ) + @author ralfbecker + @abstract constructor of the class + @param $do_header if true, necessary javascript and css gets loaded, only needed for input + */ + function jscalendar($do_header=True) + { + $this->phpgwapi_inc_url = $GLOBALS['phpgw_info']['server']['webserver_url'].'/phpgwapi/inc'; + $this->dateformat = $GLOBALS['phpgw_info']['user']['preferences']['common']['dateformat']; + + if ($do_header && !strstr($GLOBALS['phpgw_info']['flags']['java_script'],'jscalendar')) + { + $GLOBALS['phpgw_info']['flags']['java_script'] .= +' + + +'; + } + } + + /*! + @function input + @syntax input( $name,$date,$year=0,$month=0,$day=0 ) + @author ralfbecker + @abstract creates an inputfield for the jscalendar (returns the necessary html and js) + @param $name name and id of the input-field (it also names the id of the img $name.'-toggle') + @param $date date as string or unix timestamp (in users localtime) + @param $year,$month,$day if $date is not used + */ + function input($name,$date,$year=0,$month=0,$day=0) + { + //echo "

jscalendar::input(name='$name', date='$date'='".date('Y-m-d',$date)."', year='$year', month='$month', day='$day')

\n"; + + if ($date && (is_int($date) || is_numeric($date))) + { + $year = intval($GLOBALS['phpgw']->common->show_date($date,'Y')); + $month = intval($GLOBALS['phpgw']->common->show_date($date,'n')); + $day = intval($GLOBALS['phpgw']->common->show_date($date,'d')); + } + if ($year && $month && $day) + { + $date = date($this->dateformat,mktime(12,0,0,$month,$day,$year)); + } + return +' + +'; + } + + /*! + @function input2date + @syntax input2date( $datestr,$raw='raw',$day='day',$month='month',$year='year' ) + @author ralfbecker + @abstract converts the date-string back to an array with year, month, day and a timestamp + @param $datestr content of the inputfield generated by jscalendar::input() + @param $raw key of the timestamp-field in the returned array or False of no timestamp + @param $day,$month,$year keys for the array, eg. to set mday instead of day + */ + function input2date($datestr,$raw='raw',$day='day',$month='month',$year='year') + { + if ($datestr === '') + { + return False; + } + $fields = split('[./-]',$datestr); + foreach(split('[./-]',$this->dateformat) as $n => $field) + { + $date[$field] = intval($fields[$n]); + } + $ret = array( + $year => $date['Y'], + $month => $date['m'], + $day => $date['d'] + ); + if ($raw) + { + $ret[$raw] = mktime(12,0,0,$date['m'],$date['d'],$date['Y']); + } + //echo "

jscalendar::input2date('$datestr','$raw',$day','$month','$year') = "; print_r($ret); echo "

\n"; + + return $ret; + } +} \ No newline at end of file diff --git a/phpgwapi/inc/jscalendar-setup.php b/phpgwapi/inc/jscalendar-setup.php new file mode 100644 index 0000000000..7f37938ad1 --- /dev/null +++ b/phpgwapi/inc/jscalendar-setup.php @@ -0,0 +1,213 @@ + * +* -------------------------------------------- * +* This program is free software; you can redistribute it and/or modify it * +* under the terms of the GNU General Public License as published by the * +* Free Software Foundation; either version 2 of the License, or (at your * +* option) any later version. * +\**************************************************************************/ + +/* $Id$ */ + +$GLOBALS['phpgw_info']['flags'] = Array( + 'currentapp' => 'calendar', // can't be phpgwapi + 'noheader' => True, + 'nonavbar' => True, + 'noappheader' => True, + 'noappfooter' => True, + 'nofooter' => True, + 'nocachecontrol' => True // allow cacheing +); + +include('../../header.inc.php'); + +$dateformat = $GLOBALS['phpgw_info']['user']['preferences']['common']['dateformat']; +$jsDateFormat = str_replace(array('Y','d','m'),array('y','dd','mm'),$dateformat); +$dayFirst = strpos($dateformat,'d') < strpos($dateformat,'m'); +$jsLongDateFormat = 'DD, '.($dayFirst ? 'd' : 'MM').($dateformat[1] == '.' ? '. ' : ' ').($dayFirst ? 'MM' : 'd'); + +/* Copyright Mihai Bazon, 2002, 2003 | http://students.infoiasi.ro/~mishoo + * --------------------------------------------------------------------------- + * + * The DHTML Calendar + * + * Details and latest version at: + * http://students.infoiasi.ro/~mishoo/site/calendar.epl + * + * Feel free to use this script under the terms of the GNU Lesser General + * Public License, as long as you do not remove or alter this notice. + * + * 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 function "patches" an input field (or other element) to use a calendar + * widget for date selection. + * + * The "params" is a single object that can have the following properties: + * + * prop. name | description + * ------------------------------------------------------------------------------------------------- + * inputField | the ID of an input field to store the date + * displayArea | the ID of a DIV or other element to show the date + * button | ID of a button or other element that will trigger the calendar + * eventName | event that will trigger the calendar, without the "on" prefix (default: "click") + * ifFormat | date format that will be stored in the input field + * daFormat | the date format that will be used to display the date in displayArea + * singleClick | (true/false) wether the calendar is in single click mode or not (default: true) + * mondayFirst | (true/false) if true Monday is the first day of week, Sunday otherwise (default: false) + * align | alignment (default: "Bl"); if you don't know what's this see the calendar documentation + * range | array with 2 elements. Default: [1900, 2999] -- the range of years available + * weekNumbers | (true/false) if it's true (default) the calendar will display week numbers + * flat | null or element ID; if not null the calendar will be a flat calendar having the parent with the given ID + * flatCallback | function that receives a JS Date object and returns an URL to point the browser to (for flat calendar) + * disableFunc | function that receives a JS Date object and should return true if that date has to be disabled in the calendar + * + * None of them is required, they all have default values. However, if you + * pass none of "inputField", "displayArea" or "button" you'll get a warning + * saying "nothing to setup". + */ + +?> +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", ""); + param_default("daFormat", ""); + param_default("singleClick", true); + param_default("disableFunc", null); + param_default("mondayFirst", ); + param_default("align", "Bl"); + param_default("range", [1900, 2999]); + param_default("weekNumbers", true); + param_default("flat", null); + param_default("flatCallback", 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.inputField || params.displayArea || params.button)) { + alert("Calendar.setup:\n Nothing to setup (no fields found). Please check your code"); + return false; + } + + function onSelect(cal) { + if (cal.params.flat) { + if (typeof cal.params.flatCallback == "function") { + cal.params.flatCallback(cal); + } else { + alert("No flatCallback given -- doing nothing."); + } + return false; + } + if (cal.params.inputField) { + cal.params.inputField.value = cal.date.print(cal.params.ifFormat); + } + if (cal.params.displayArea) { + cal.params.displayArea.innerHTML = cal.date.print(cal.params.daFormat); + } + if (cal.params.singleClick && cal.dateClicked) { + cal.callCloseHandler(); + } + }; + + if (params.flat != null) { + 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.mondayFirst, null, onSelect); + cal.params = params; + cal.weekNumbers = params.weekNumbers; + cal.setRange(params.range[0], params.range[1]); + cal.setDisabledHandler(params.disableFunc); + 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; + if (!window.calendar) { + window.calendar = new Calendar(params.mondayFirst, null, onSelect, function(cal) { cal.hide(); }); + window.calendar.weekNumbers = params.weekNumbers; + mustCreate = true; + } else { + window.calendar.hide(); + } + window.calendar.setRange(params.range[0], params.range[1]); + window.calendar.params = params; + window.calendar.setDisabledHandler(params.disableFunc); + window.calendar.setDateFormat(dateFmt); + if (mustCreate) { + window.calendar.create(); + } + window.calendar.parseDate(dateEl.value || dateEl.innerHTML); + window.calendar.refresh(); + window.calendar.showAtElement(params.displayArea || params.inputField, params.align); + return false; + }; +}; + +// translations +// ** I18N +Calendar._DN = new Array +("", + "", + "", + "", + "", + "", + "", + ""); +Calendar._MN = new Array +("", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + ""); + +// tooltips +Calendar._TT = {}; +Calendar._TT["TOGGLE"] = ""; +Calendar._TT["PREV_YEAR"] = ""; +Calendar._TT["PREV_MONTH"] = ""; +Calendar._TT["GO_TODAY"] = ""; +Calendar._TT["NEXT_MONTH"] = ""; +Calendar._TT["NEXT_YEAR"] = ""; +Calendar._TT["SEL_DATE"] = ""; +Calendar._TT["DRAG_TO_MOVE"] = ""; +Calendar._TT["PART_TODAY"] = " ()"; +Calendar._TT["MON_FIRST"] = ""; +Calendar._TT["SUN_FIRST"] = ""; +Calendar._TT["CLOSE"] = ""; +Calendar._TT["TODAY"] = ""; + +// date formats +Calendar._TT["DEF_DATE_FORMAT"] = ""; +Calendar._TT["TT_DATE_FORMAT"] = ""; + +Calendar._TT["WK"] = ""; diff --git a/phpgwapi/inc/jscalendar/README-phpGW b/phpgwapi/inc/jscalendar/README-phpGW new file mode 100644 index 0000000000..e2e03973fa --- /dev/null +++ b/phpgwapi/inc/jscalendar/README-phpGW @@ -0,0 +1,9 @@ +This directory contains the (unchanged) Version 0.9.3 of jsCalendar + +jsCalendar is called by the jscalendar wrapper-class in the phpGW API + +Instead of jscalendar-setup.js and a lang/*.js file it loads jscalendar-setup.php, +which sets all jscalendar preferences (partly from the users prefs) and read the +translations from the database for the language the user has spec. in his prefs. + +RalfBecker@outdoor-training.de