From b90c3e5f471aa227978864fc7739d9ada318d1ba Mon Sep 17 00:00:00 2001 From: Ralf Becker Date: Thu, 28 Aug 2003 16:44:06 +0000 Subject: [PATCH] reimported jsCal into phpgwapi/js now --- phpgwapi/js/jscalendar/README | 35 + phpgwapi/js/jscalendar/README-phpGW | 9 + .../js/jscalendar/bugtest-hidden-selects.html | 108 ++ phpgwapi/js/jscalendar/cal.html | 381 +++++ phpgwapi/js/jscalendar/calendar-blue.css | 178 +++ phpgwapi/js/jscalendar/calendar-brown.css | 171 ++ phpgwapi/js/jscalendar/calendar-green.css | 175 +++ phpgwapi/js/jscalendar/calendar-setup.js | 135 ++ .../js/jscalendar/calendar-setup_stripped.js | 16 + phpgwapi/js/jscalendar/calendar-system.css | 194 +++ phpgwapi/js/jscalendar/calendar-win2k-1.css | 217 +++ phpgwapi/js/jscalendar/calendar-win2k-2.css | 217 +++ .../js/jscalendar/calendar-win2k-cold-1.css | 211 +++ .../js/jscalendar/calendar-win2k-cold-2.css | 217 +++ phpgwapi/js/jscalendar/calendar.js | 1379 +++++++++++++++++ phpgwapi/js/jscalendar/calendar_stripped.js | 12 + .../js/jscalendar/doc/html/reference-Z-S.css | 0 phpgwapi/js/jscalendar/doc/html/reference.css | 34 + .../js/jscalendar/doc/html/reference.html | 1124 ++++++++++++++ phpgwapi/js/jscalendar/doc/reference.pdf | Bin 0 -> 198470 bytes phpgwapi/js/jscalendar/img.gif | Bin 0 -> 145 bytes phpgwapi/js/jscalendar/lang/calendar-br.js | 45 + phpgwapi/js/jscalendar/lang/calendar-ca.js | 45 + .../js/jscalendar/lang/calendar-cs-win.js | 34 + phpgwapi/js/jscalendar/lang/calendar-da.js | 45 + phpgwapi/js/jscalendar/lang/calendar-du.js | 45 + phpgwapi/js/jscalendar/lang/calendar-el.js | 45 + phpgwapi/js/jscalendar/lang/calendar-en.js | 45 + phpgwapi/js/jscalendar/lang/calendar-es.js | 45 + phpgwapi/js/jscalendar/lang/calendar-fr.js | 45 + .../js/jscalendar/lang/calendar-hr-utf8.js | 49 + phpgwapi/js/jscalendar/lang/calendar-hr.js | Bin 0 -> 3088 bytes phpgwapi/js/jscalendar/lang/calendar-hu.js | 45 + phpgwapi/js/jscalendar/lang/calendar-it.js | 45 + phpgwapi/js/jscalendar/lang/calendar-nl.js | 45 + phpgwapi/js/jscalendar/lang/calendar-no.js | 45 + phpgwapi/js/jscalendar/lang/calendar-pl.js | 46 + phpgwapi/js/jscalendar/lang/calendar-pt.js | 45 + phpgwapi/js/jscalendar/lang/calendar-ro.js | 45 + phpgwapi/js/jscalendar/lang/calendar-ru.js | 45 + phpgwapi/js/jscalendar/lang/calendar-sp.js | 45 + phpgwapi/js/jscalendar/lang/calendar-sw.js | 45 + phpgwapi/js/jscalendar/lang/calendar-tr.js | 58 + phpgwapi/js/jscalendar/lang/calendar-zh.js | 45 + phpgwapi/js/jscalendar/release-notes.html | 80 + phpgwapi/js/jscalendar/simple-1.html | 212 +++ phpgwapi/js/jscalendar/simple-2.html | 107 ++ 47 files changed, 6209 insertions(+) create mode 100644 phpgwapi/js/jscalendar/README create mode 100644 phpgwapi/js/jscalendar/README-phpGW create mode 100644 phpgwapi/js/jscalendar/bugtest-hidden-selects.html create mode 100644 phpgwapi/js/jscalendar/cal.html create mode 100644 phpgwapi/js/jscalendar/calendar-blue.css create mode 100644 phpgwapi/js/jscalendar/calendar-brown.css create mode 100644 phpgwapi/js/jscalendar/calendar-green.css create mode 100644 phpgwapi/js/jscalendar/calendar-setup.js create mode 100644 phpgwapi/js/jscalendar/calendar-setup_stripped.js create mode 100644 phpgwapi/js/jscalendar/calendar-system.css create mode 100644 phpgwapi/js/jscalendar/calendar-win2k-1.css create mode 100644 phpgwapi/js/jscalendar/calendar-win2k-2.css create mode 100644 phpgwapi/js/jscalendar/calendar-win2k-cold-1.css create mode 100644 phpgwapi/js/jscalendar/calendar-win2k-cold-2.css create mode 100644 phpgwapi/js/jscalendar/calendar.js create mode 100644 phpgwapi/js/jscalendar/calendar_stripped.js create mode 100644 phpgwapi/js/jscalendar/doc/html/reference-Z-S.css create mode 100644 phpgwapi/js/jscalendar/doc/html/reference.css create mode 100644 phpgwapi/js/jscalendar/doc/html/reference.html create mode 100644 phpgwapi/js/jscalendar/doc/reference.pdf create mode 100644 phpgwapi/js/jscalendar/img.gif create mode 100644 phpgwapi/js/jscalendar/lang/calendar-br.js create mode 100644 phpgwapi/js/jscalendar/lang/calendar-ca.js create mode 100644 phpgwapi/js/jscalendar/lang/calendar-cs-win.js create mode 100644 phpgwapi/js/jscalendar/lang/calendar-da.js create mode 100644 phpgwapi/js/jscalendar/lang/calendar-du.js create mode 100644 phpgwapi/js/jscalendar/lang/calendar-el.js create mode 100644 phpgwapi/js/jscalendar/lang/calendar-en.js create mode 100644 phpgwapi/js/jscalendar/lang/calendar-es.js create mode 100644 phpgwapi/js/jscalendar/lang/calendar-fr.js create mode 100644 phpgwapi/js/jscalendar/lang/calendar-hr-utf8.js create mode 100644 phpgwapi/js/jscalendar/lang/calendar-hr.js create mode 100644 phpgwapi/js/jscalendar/lang/calendar-hu.js create mode 100644 phpgwapi/js/jscalendar/lang/calendar-it.js create mode 100644 phpgwapi/js/jscalendar/lang/calendar-nl.js create mode 100644 phpgwapi/js/jscalendar/lang/calendar-no.js create mode 100644 phpgwapi/js/jscalendar/lang/calendar-pl.js create mode 100644 phpgwapi/js/jscalendar/lang/calendar-pt.js create mode 100644 phpgwapi/js/jscalendar/lang/calendar-ro.js create mode 100644 phpgwapi/js/jscalendar/lang/calendar-ru.js create mode 100644 phpgwapi/js/jscalendar/lang/calendar-sp.js create mode 100644 phpgwapi/js/jscalendar/lang/calendar-sw.js create mode 100644 phpgwapi/js/jscalendar/lang/calendar-tr.js create mode 100644 phpgwapi/js/jscalendar/lang/calendar-zh.js create mode 100644 phpgwapi/js/jscalendar/release-notes.html create mode 100644 phpgwapi/js/jscalendar/simple-1.html create mode 100644 phpgwapi/js/jscalendar/simple-2.html diff --git a/phpgwapi/js/jscalendar/README b/phpgwapi/js/jscalendar/README new file mode 100644 index 0000000000..c0af3edd1e --- /dev/null +++ b/phpgwapi/js/jscalendar/README @@ -0,0 +1,35 @@ +The DHTML Calendar +------------------- + + Author: Mihai Bazon, + http://students.infoiasi.ro/~mishoo + + This program is free software published under the + GNU Lesser General Public License. + + For the entire license text please refer to + http://www.gnu.org/licenses/lgpl + + An additional restriction is that you are not allowed + to remove the comment note present at the beginning of + the script. + +Contents +--------- + + calendar.js -- the main program file + lang/*.js -- internalization files + *.css -- color themes + cal.html -- example usage file + doc/ -- documentation, in PDF and HTML + simple-1.html -- quick setup examples [popup calendars] + simple-2.html -- quick setup example for flat calendar + +Homepage +--------- + + For details and latest versions please refer to calendar + homepage, located on my website: + + http://students.infoiasi.ro/~mishoo/site/calendar.epl + diff --git a/phpgwapi/js/jscalendar/README-phpGW b/phpgwapi/js/jscalendar/README-phpGW new file mode 100644 index 0000000000..e2e03973fa --- /dev/null +++ b/phpgwapi/js/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 diff --git a/phpgwapi/js/jscalendar/bugtest-hidden-selects.html b/phpgwapi/js/jscalendar/bugtest-hidden-selects.html new file mode 100644 index 0000000000..900bc17e8b --- /dev/null +++ b/phpgwapi/js/jscalendar/bugtest-hidden-selects.html @@ -0,0 +1,108 @@ + + + +Bug + + + + + + + + + + + + + +
+Date: +
+ + +

+
+
Visible <select>, hides and unhides as expected +
+ + +

+
Hidden <select>, it should stay hidden (but doesn't) +
+ + +

+
Hidden textbox below, it stays hidden as expected +
+ +

+ diff --git a/phpgwapi/js/jscalendar/cal.html b/phpgwapi/js/jscalendar/cal.html new file mode 100644 index 0000000000..8ea6b9506f --- /dev/null +++ b/phpgwapi/js/jscalendar/cal.html @@ -0,0 +1,381 @@ + + + + + +The Coolest DHTML Calendar - Online Demo + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

The coolest DHTML calendar, v. 0.9.3 "It's still alife"

+ +

Theme +[ +winter +| +summer +| +green +| +win2k-1 +| +win2k-2 +| +win2k-cold-1 +| +win2k-cold-2 +| +system + +] +
+Release notes for 0.9.3 +
+Setup a calendar in minutes: + popup calendar, + flat calendar. +
+Documentation: + HTML, + PDF +

+ +
+ +
+Flat calendar +
+ +

A non-popup version will appear below as soon +as the page is loaded. Note that it doesn't show the week number.

+ + +
+
+ +

+The example above uses the setDisabledHandler() member function +to setup a handler that would only enable days withing a range of 10 days, +forward or backward, from the current date. +

+ +
+ +
+ +

Easy I18N: all messages are separate JS +files (see calendar-en.js for an example). +Check the lang directory in your distribution archive to see what languages +are available. You just need to include the right one from the HTML +page.

+ +

NOTE: I made the English and Romanian +versions only. The other lang files were submitted by people. I thank them +very much, and you should too! :) Unfortunately, I lost track of these files +and the persons who sent them, so if you send me a translation file please +include a small comment with your name and email address, as you are the +author. Also, a statement that the file is distributed under the GNU LGPL +would be welcome :)

+ +
+ +
+
+
+Popup examples +
+ +
+ +Date #1: [y-m-d [ww]] -- single +click
+ +Date #2: [DD, MM d, y] +-- double click + +

+ + +this select should hide when the calendar is above it. +

+ +Date #3: [dd/mm/y] +-- single click +
+ +Date #4: [D, M d, y] -- +double click + +
+
+ +

You can find more information about this script (and how to use/customize +it) on my +page.

+ +

This is release 0.9.3. Works on MSIE 5.0, 5.5, 6.0, Opera 7, +Mozilla, Netscape 6.x, 7.0 and all other Gecko-s.

+ +

You can click on "Mo"/"Su" (first day name displayed) to +change the first day of week (Sunday/Monday) (since 0.8 this is also mapped +on the "-" button in the top-left corner). Use the navigation buttons +("<<", "<", "Today", ">", ">>") to move to the prev/next +year/month. Keep the mouse button pressed for a short time over one of +these buttons to get a menu for faster selection. You can drag the "status +bar" (that's where the tooltips appear) or title bar (that's where the +currently selected month/year shows up) to move the whole calendar.

+ +

Keyboard navigation

+ +

Starting with version 0.9.2, you can also use the keyboard to select +dates (only for popup calendars; does not work with Opera +7). The following keys are available:

+ + + +

Date formatting

+ +
    +
  • d -- the date ( ex: 1 .. 31 ) +
  • dd -- the date, zero padded ( ex: 01 .. 31 ) +
  • m -- month as a number ( ex: 1 .. 12 ) +
  • mm -- month, zero padded ( ex: 01 .. 12 ) +
  • y -- 4 digit year ( ex: 1979 ) +
  • yy -- 2 digit year, yy - 1900 ( ex: 79 ) (USING THIS IS NOT RECOMMENDED) +
  • w -- the number of the week in the year (1 or 2 digits) +
  • ww -- the number of the week, zero padded (2 digits) +
  • D -- short weekday name ( ex: Sun, Wed, Fri ) +
  • DD -- long weekday name ( ex: Sunday, Wednesday, Friday ) +
  • M -- short month name ( ex: Mar, Jan, Oct ) +
  • MM -- long month name ( ex: March, January, October ) +
+
+

Date parsing

+ +

The algorithm will first try to read the date in the specified +format.

+ +

If it doesn't work, it will try different methods to recognize a valid +date -- general behavior is: if some part of the input is the name +of a month, i.e. "Mar", then that will be considered the month, the +next/previous 1 .. 31 number will be considered the date and the next big +number (hopefully there) will be the year; if it's missing we assume the +current year. If no such name exists, then the first 1 .. 12 number will be +taken as the month, the next 1 .. 31 as the date; year selection is the same +as discussed.

+ +

Examples: 3/8/1979 as well as 03 +08 79 as well as 1979 mar 8, as well as 79+3+8 will all lead to the same date: my birthday (March +8, 1979). To try the algo, just input the date using whatever format you +like in one of the fields above and click on the "..." button. The calendar +that shows up should contain your date, otherwise you and this algorithm +don't get too well together :)

+ +
Author: Mihai +Bazon © 2002
Feel free to use / redistribute under the GNU LGPL.
Please no +not remove or alter the comment at the script start.
+ +

If you use this script on a public page it +would be nice if you would let me +know.

+ + diff --git a/phpgwapi/js/jscalendar/calendar-blue.css b/phpgwapi/js/jscalendar/calendar-blue.css new file mode 100644 index 0000000000..502e19b219 --- /dev/null +++ b/phpgwapi/js/jscalendar/calendar-blue.css @@ -0,0 +1,178 @@ +/* The main calendar widget. DIV containing a table. */ + +div.calendar { position: relative; } + +.calendar, .calendar table { + border: 1px solid #556; + font-size: 11px; + color: #000; + cursor: default; + background: #eef; + font-family: tahoma,verdana,sans-serif; +} + +/* Header part -- contains navigation buttons and day names. */ + +.calendar .button { /* "<<", "<", ">", ">>" buttons have this class */ + text-align: center; /* They are the navigation buttons */ + padding: 2px; /* Make the buttons seem like they're pressing */ +} + +.calendar thead .title { /* This holds the current "month, year" */ + font-weight: bold; /* Pressing it will take you to the current date */ + text-align: center; + background: #fff; + color: #000; + padding: 2px; +} + +.calendar thead .headrow { /* Row containing navigation buttons */ + background: #778; + color: #fff; +} + +.calendar thead .daynames { /* Row containing the day names */ + background: #bdf; +} + +.calendar thead .name { /* Cells containing the day names */ + border-bottom: 1px solid #556; + padding: 2px; + text-align: center; + color: #000; +} + +.calendar thead .weekend { /* How a weekend day name shows in header */ + color: #a66; +} + +.calendar thead .hilite { /* How do the buttons in header appear when hover */ + background: #aaf; + color: #000; + border: 1px solid #04f; + padding: 1px; +} + +.calendar thead .active { /* Active (pressed) buttons in header */ + background: #77c; + padding: 2px 0px 0px 2px; +} + +/* The body part -- contains all the days in month. */ + +.calendar tbody .day { /* Cells containing month days dates */ + width: 2em; + color: #456; + text-align: right; + padding: 2px 4px 2px 2px; +} + +.calendar table .wn { + padding: 2px 3px 2px 2px; + border-right: 1px solid #000; + background: #bdf; +} + +.calendar tbody .rowhilite td { + background: #def; +} + +.calendar tbody .rowhilite td.wn { + background: #eef; +} + +.calendar tbody td.hilite { /* Hovered cells */ + background: #def; + padding: 1px 3px 1px 1px; + border: 1px solid #bbb; +} + +.calendar tbody td.active { /* Active (pressed) cells */ + background: #cde; + padding: 2px 2px 0px 2px; +} + +.calendar tbody td.selected { /* Cell showing today date */ + font-weight: bold; + border: 1px solid #000; + padding: 1px 3px 1px 1px; + background: #fff; + color: #000; +} + +.calendar tbody td.weekend { /* Cells showing weekend days */ + color: #a66; +} + +.calendar tbody td.today { /* Cell showing selected date */ + font-weight: bold; + color: #00f; +} + +.calendar tbody .disabled { color: #999; } + +.calendar tbody .emptycell { /* Empty cells (the best is to hide them) */ + visibility: hidden; +} + +.calendar tbody .emptyrow { /* Empty row (some months need less than 6 rows) */ + display: none; +} + +/* The footer part -- status bar and "Close" button */ + +.calendar tfoot .footrow { /* The in footer (only one right now) */ + text-align: center; + background: #556; + color: #fff; +} + +.calendar tfoot .ttip { /* Tooltip (status bar) cell */ + background: #fff; + color: #445; + border-top: 1px solid #556; + padding: 1px; +} + +.calendar tfoot .hilite { /* Hover style for buttons in footer */ + background: #aaf; + border: 1px solid #04f; + color: #000; + padding: 1px; +} + +.calendar tfoot .active { /* Active (pressed) style for buttons in footer */ + background: #77c; + padding: 2px 0px 0px 2px; +} + +/* Combo boxes (menus that display months/years for direct selection) */ + +.combo { + position: absolute; + display: none; + top: 0px; + left: 0px; + width: 4em; + cursor: default; + border: 1px solid #655; + background: #def; + color: #000; + font-size: smaller; +} + +.combo .label { + width: 100%; + text-align: center; +} + +.combo .hilite { + background: #acf; +} + +.combo .active { + border-top: 1px solid #46a; + border-bottom: 1px solid #46a; + background: #eef; + font-weight: bold; +} diff --git a/phpgwapi/js/jscalendar/calendar-brown.css b/phpgwapi/js/jscalendar/calendar-brown.css new file mode 100644 index 0000000000..e1e8457df9 --- /dev/null +++ b/phpgwapi/js/jscalendar/calendar-brown.css @@ -0,0 +1,171 @@ +/* The main calendar widget. DIV containing a table. */ + +div.calendar { position: relative; } + +.calendar, .calendar table { + border: 1px solid #655; + font-size: 11px; + color: #000; + cursor: default; + background: #ffd; + font-family: tahoma,verdana,sans-serif; +} + +/* Header part -- contains navigation buttons and day names. */ + +.calendar .button { /* "<<", "<", ">", ">>" buttons have this class */ + text-align: center; /* They are the navigation buttons */ + padding: 2px; /* Make the buttons seem like they're pressing */ +} + +.calendar thead .title { /* This holds the current "month, year" */ + font-weight: bold; /* Pressing it will take you to the current date */ + text-align: center; + background: #654; + color: #fed; + padding: 2px; +} + +.calendar thead .headrow { /* Row containing navigation buttons */ + background: #edc; + color: #000; +} + +.calendar thead .name { /* Cells containing the day names */ + border-bottom: 1px solid #655; + padding: 2px; + text-align: center; + color: #000; +} + +.calendar thead .weekend { /* How a weekend day name shows in header */ + color: #f00; +} + +.calendar thead .hilite { /* How do the buttons in header appear when hover */ + background: #faa; + color: #000; + border: 1px solid #f40; + padding: 1px; +} + +.calendar thead .active { /* Active (pressed) buttons in header */ + background: #c77; + padding: 2px 0px 0px 2px; +} + +.calendar thead .daynames { /* Row containing the day names */ + background: #fed; +} + +/* The body part -- contains all the days in month. */ + +.calendar tbody .day { /* Cells containing month days dates */ + width: 2em; + text-align: right; + padding: 2px 4px 2px 2px; +} + +.calendar table .wn { + padding: 2px 3px 2px 2px; + border-right: 1px solid #000; + background: #fed; +} + +.calendar tbody .rowhilite td { + background: #ddf; +} + +.calendar tbody .rowhilite td.wn { + background: #efe; +} + +.calendar tbody td.hilite { /* Hovered cells */ + background: #ffe; + padding: 1px 3px 1px 1px; + border: 1px solid #bbb; +} + +.calendar tbody td.active { /* Active (pressed) cells */ + background: #ddc; + padding: 2px 2px 0px 2px; +} + +.calendar tbody td.selected { /* Cell showing today date */ + font-weight: bold; + border: 1px solid #000; + padding: 1px 3px 1px 1px; + background: #fea; +} + +.calendar tbody td.weekend { /* Cells showing weekend days */ + color: #f00; +} + +.calendar tbody td.today { font-weight: bold; } + +.calendar tbody .disabled { color: #999; } + +.calendar tbody .emptycell { /* Empty cells (the best is to hide them) */ + visibility: hidden; +} + +.calendar tbody .emptyrow { /* Empty row (some months need less than 6 rows) */ + display: none; +} + +/* The footer part -- status bar and "Close" button */ + +.calendar tfoot .footrow { /* The in footer (only one right now) */ + text-align: center; + background: #988; + color: #000; +} + +.calendar tfoot .ttip { /* Tooltip (status bar) cell */ + border-top: 1px solid #655; + background: #dcb; + color: #840; +} + +.calendar tfoot .hilite { /* Hover style for buttons in footer */ + background: #faa; + border: 1px solid #f40; + padding: 1px; +} + +.calendar tfoot .active { /* Active (pressed) style for buttons in footer */ + background: #c77; + padding: 2px 0px 0px 2px; +} + +/* Combo boxes (menus that display months/years for direct selection) */ + +.combo { + position: absolute; + display: none; + top: 0px; + left: 0px; + width: 4em; + cursor: default; + border: 1px solid #655; + background: #ffe; + color: #000; + font-size: smaller; +} + +.combo .label { + width: 100%; + text-align: center; +} + +.combo .hilite { + background: #fc8; +} + +.combo .active { + border-top: 1px solid #a64; + border-bottom: 1px solid #a64; + background: #fee; + font-weight: bold; +} diff --git a/phpgwapi/js/jscalendar/calendar-green.css b/phpgwapi/js/jscalendar/calendar-green.css new file mode 100644 index 0000000000..c59aaa5aa7 --- /dev/null +++ b/phpgwapi/js/jscalendar/calendar-green.css @@ -0,0 +1,175 @@ +/* The main calendar widget. DIV containing a table. */ + +div.calendar { position: relative; } + +.calendar, .calendar table { + border: 1px solid #565; + font-size: 11px; + color: #000; + cursor: default; + background: #efe; + font-family: tahoma,verdana,sans-serif; +} + +/* Header part -- contains navigation buttons and day names. */ + +.calendar .button { /* "<<", "<", ">", ">>" buttons have this class */ + text-align: center; /* They are the navigation buttons */ + padding: 2px; /* Make the buttons seem like they're pressing */ + background: #676; + color: #fff; + font-size: 90%; +} + +.calendar thead .title { /* This holds the current "month, year" */ + font-weight: bold; /* Pressing it will take you to the current date */ + text-align: center; + padding: 2px; + background: #250; + color: #efa; +} + +.calendar thead .headrow { /* Row containing navigation buttons */ +} + +.calendar thead .name { /* Cells containing the day names */ + border-bottom: 1px solid #565; + padding: 2px; + text-align: center; + color: #000; +} + +.calendar thead .weekend { /* How a weekend day name shows in header */ + color: #a66; +} + +.calendar thead .hilite { /* How do the buttons in header appear when hover */ + background: #afa; + color: #000; + border: 1px solid #084; + padding: 1px; +} + +.calendar thead .active { /* Active (pressed) buttons in header */ + background: #7c7; + padding: 2px 0px 0px 2px; +} + +.calendar thead .daynames { /* Row containing the day names */ + background: #dfb; +} + +/* The body part -- contains all the days in month. */ + +.calendar tbody .day { /* Cells containing month days dates */ + width: 2em; + color: #564; + text-align: right; + padding: 2px 4px 2px 2px; +} + +.calendar table .wn { + padding: 2px 3px 2px 2px; + border-right: 1px solid #000; + background: #dfb; +} + +.calendar tbody .rowhilite td { + background: #dfd; +} + +.calendar tbody .rowhilite td.wn { + background: #efe; +} + +.calendar tbody td.hilite { /* Hovered cells */ + background: #efd; + padding: 1px 3px 1px 1px; + border: 1px solid #bbb; +} + +.calendar tbody td.active { /* Active (pressed) cells */ + background: #dec; + padding: 2px 2px 0px 2px; +} + +.calendar tbody td.selected { /* Cell showing today date */ + font-weight: bold; + border: 1px solid #000; + padding: 1px 3px 1px 1px; + background: #f8fff8; + color: #000; +} + +.calendar tbody td.weekend { /* Cells showing weekend days */ + color: #a66; +} + +.calendar tbody td.today { font-weight: bold; color: #0a0; } + +.calendar tbody .disabled { color: #999; } + +.calendar tbody .emptycell { /* Empty cells (the best is to hide them) */ + visibility: hidden; +} + +.calendar tbody .emptyrow { /* Empty row (some months need less than 6 rows) */ + display: none; +} + +/* The footer part -- status bar and "Close" button */ + +.calendar tfoot .footrow { /* The in footer (only one right now) */ + text-align: center; + background: #565; + color: #fff; +} + +.calendar tfoot .ttip { /* Tooltip (status bar) cell */ + padding: 2px; + background: #250; + color: #efa; +} + +.calendar tfoot .hilite { /* Hover style for buttons in footer */ + background: #afa; + border: 1px solid #084; + color: #000; + padding: 1px; +} + +.calendar tfoot .active { /* Active (pressed) style for buttons in footer */ + background: #7c7; + padding: 2px 0px 0px 2px; +} + +/* Combo boxes (menus that display months/years for direct selection) */ + +.combo { + position: absolute; + display: none; + top: 0px; + left: 0px; + width: 4em; + cursor: default; + border: 1px solid #565; + background: #efd; + color: #000; + font-size: smaller; +} + +.combo .label { + width: 100%; + text-align: center; +} + +.combo .hilite { + background: #af8; +} + +.combo .active { + border-top: 1px solid #6a4; + border-bottom: 1px solid #6a4; + background: #efe; + font-weight: bold; +} diff --git a/phpgwapi/js/jscalendar/calendar-setup.js b/phpgwapi/js/jscalendar/calendar-setup.js new file mode 100644 index 0000000000..4c3ace149e --- /dev/null +++ b/phpgwapi/js/jscalendar/calendar-setup.js @@ -0,0 +1,135 @@ +/* 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. + */ + +// $Id$ + +/** + * 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", "y/mm/dd"); + param_default("daFormat", "y/mm/dd"); + param_default("singleClick", true); + param_default("disableFunc", null); + param_default("mondayFirst", false); + 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; + }; +}; diff --git a/phpgwapi/js/jscalendar/calendar-setup_stripped.js b/phpgwapi/js/jscalendar/calendar-setup_stripped.js new file mode 100644 index 0000000000..7a89ddd3e8 --- /dev/null +++ b/phpgwapi/js/jscalendar/calendar-setup_stripped.js @@ -0,0 +1,16 @@ +/* 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. + */ +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/mm/dd");param_default("daFormat","y/mm/dd");param_default("singleClick",true);param_default("disableFunc",null);param_default("mondayFirst",false);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;};}; \ No newline at end of file diff --git a/phpgwapi/js/jscalendar/calendar-system.css b/phpgwapi/js/jscalendar/calendar-system.css new file mode 100644 index 0000000000..34db1f62af --- /dev/null +++ b/phpgwapi/js/jscalendar/calendar-system.css @@ -0,0 +1,194 @@ +/* The main calendar widget. DIV containing a table. */ + +.calendar { + position: relative; + display: none; + border: 1px solid; + border-color: #fff #000 #000 #fff; + font-size: 11px; + cursor: default; + background: Window; + color: WindowText; + font-family: tahoma,verdana,sans-serif; +} + +.calendar table { + border: 1px solid; + border-color: #fff #000 #000 #fff; + font-size: 11px; + cursor: default; + background: Window; + color: WindowText; + font-family: tahoma,verdana,sans-serif; +} + +/* Header part -- contains navigation buttons and day names. */ + +.calendar .button { /* "<<", "<", ">", ">>" buttons have this class */ + text-align: center; + padding: 1px; + border: 1px solid; + border-color: ButtonHighlight ButtonShadow ButtonShadow ButtonHighlight; + background: ButtonFace; +} + +.calendar thead .title { /* This holds the current "month, year" */ + font-weight: bold; + padding: 1px; + border: 1px solid #000; + background: ActiveCaption; + color: CaptionText; + text-align: center; +} + +.calendar thead .headrow { /* Row containing navigation buttons */ +} + +.calendar thead .daynames { /* Row containing the day names */ +} + +.calendar thead .name { /* Cells containing the day names */ + border-bottom: 1px solid ButtonShadow; + padding: 2px; + text-align: center; + background: ButtonFace; + color: ButtonText; +} + +.calendar thead .weekend { /* How a weekend day name shows in header */ + color: #f00; +} + +.calendar thead .hilite { /* How do the buttons in header appear when hover */ + border-width: 2px; + padding: 0px; +} + +.calendar thead .active { /* Active (pressed) buttons in header */ + border-width: 1px; + padding: 2px 0px 0px 2px; + border-color: ButtonShadow ButtonHighlight ButtonHighlight ButtonShadow; +} + +/* The body part -- contains all the days in month. */ + +.calendar tbody .day { /* Cells containing month days dates */ + width: 2em; + text-align: right; + padding: 2px 4px 2px 2px; +} + +.calendar table .wn { + padding: 2px 3px 2px 2px; + border-right: 1px solid ButtonShadow; + background: ButtonFace; + color: ButtonText; +} + +.calendar tbody .rowhilite td { + background: #eee; + color: #000; +} + +.calendar tbody td.hilite { /* Hovered cells */ + padding: 1px 3px 1px 1px; + border-top: 1px solid #fff; + border-right: 1px solid #000; + border-bottom: 1px solid #000; + border-left: 1px solid #fff; +} + +.calendar tbody td.active { /* Active (pressed) cells */ + padding: 2px 2px 0px 2px; + border: 1px solid; + border-color: ButtonShadow ButtonHighlight ButtonHighlight ButtonShadow; +} + +.calendar tbody td.selected { /* Cell showing selected date */ + font-weight: bold; + border: 1px solid; + border-color: ButtonShadow ButtonHighlight ButtonHighlight ButtonShadow; + padding: 2px 2px 0px 2px; +} + +.calendar tbody td.weekend { /* Cells showing weekend days */ + color: #f00; +} + +.calendar tbody td.today { /* Cell showing today date */ + font-weight: bold; + color: #00f; +} + +.calendar tbody td.disabled { color: GrayText; } + +.calendar tbody .emptycell { /* Empty cells (the best is to hide them) */ + visibility: hidden; +} + +.calendar tbody .emptyrow { /* Empty row (some months need less than 6 rows) */ + display: none; +} + +/* The footer part -- status bar and "Close" button */ + +.calendar tfoot .footrow { /* The in footer (only one right now) */ +} + +.calendar tfoot .ttip { /* Tooltip (status bar) cell */ + background: ButtonFace; + padding: 1px; + border: 1px solid; + border-color: ButtonShadow ButtonHighlight ButtonHighlight ButtonShadow; + color: ButtonText; + text-align: center; +} + +.calendar tfoot .hilite { /* Hover style for buttons in footer */ + border-top: 1px solid #fff; + border-right: 1px solid #000; + border-bottom: 1px solid #000; + border-left: 1px solid #fff; + padding: 1px; + background: #e4e0d8; +} + +.calendar tfoot .active { /* Active (pressed) style for buttons in footer */ + padding: 2px 0px 0px 2px; + border-top: 1px solid #000; + border-right: 1px solid #fff; + border-bottom: 1px solid #fff; + border-left: 1px solid #000; +} + +/* Combo boxes (menus that display months/years for direct selection) */ + +.combo { + position: absolute; + display: none; + width: 4em; + top: 0px; + left: 0px; + cursor: default; + border: 1px solid; + border-color: ButtonHighlight ButtonShadow ButtonShadow ButtonHighlight; + background: Menu; + color: MenuText; + font-size: smaller; + padding: 1px; +} + +.combo .label { + text-align: center; + padding: 1px; +} + +.combo .active { + padding: 0px; + border: 1px solid #000; +} + +.combo .hilite { + background: Highlight; + color: HighlightText; +} diff --git a/phpgwapi/js/jscalendar/calendar-win2k-1.css b/phpgwapi/js/jscalendar/calendar-win2k-1.css new file mode 100644 index 0000000000..7521c66534 --- /dev/null +++ b/phpgwapi/js/jscalendar/calendar-win2k-1.css @@ -0,0 +1,217 @@ +/* The main calendar widget. DIV containing a table. */ + +.calendar { + position: relative; + display: none; + border-top: 2px solid #fff; + border-right: 2px solid #000; + border-bottom: 2px solid #000; + border-left: 2px solid #fff; + font-size: 11px; + color: #000; + cursor: default; + background: #d4d0c8; + font-family: tahoma,verdana,sans-serif; +} + +.calendar table { + border-top: 1px solid #000; + border-right: 1px solid #fff; + border-bottom: 1px solid #fff; + border-left: 1px solid #000; + font-size: 11px; + color: #000; + cursor: default; + background: #d4d0c8; + font-family: tahoma,verdana,sans-serif; +} + +/* Header part -- contains navigation buttons and day names. */ + +.calendar .button { /* "<<", "<", ">", ">>" buttons have this class */ + text-align: center; + padding: 1px; + border-top: 1px solid #fff; + border-right: 1px solid #000; + border-bottom: 1px solid #000; + border-left: 1px solid #fff; +} + +.calendar thead .title { /* This holds the current "month, year" */ + font-weight: bold; + padding: 1px; + border: 1px solid #000; + background: #848078; + color: #fff; + text-align: center; +} + +.calendar thead .headrow { /* Row containing navigation buttons */ +} + +.calendar thead .daynames { /* Row containing the day names */ +} + +.calendar thead .name { /* Cells containing the day names */ + border-bottom: 1px solid #000; + padding: 2px; + text-align: center; + background: #f4f0e8; +} + +.calendar thead .weekend { /* How a weekend day name shows in header */ + color: #f00; +} + +.calendar thead .hilite { /* How do the buttons in header appear when hover */ + border-top: 2px solid #fff; + border-right: 2px solid #000; + border-bottom: 2px solid #000; + border-left: 2px solid #fff; + padding: 0px; + background: #e4e0d8; +} + +.calendar thead .active { /* Active (pressed) buttons in header */ + padding: 2px 0px 0px 2px; + border-top: 1px solid #000; + border-right: 1px solid #fff; + border-bottom: 1px solid #fff; + border-left: 1px solid #000; + background: #c4c0b8; +} + +/* The body part -- contains all the days in month. */ + +.calendar tbody .day { /* Cells containing month days dates */ + width: 2em; + text-align: right; + padding: 2px 4px 2px 2px; +} + +.calendar table .wn { + padding: 2px 3px 2px 2px; + border-right: 1px solid #000; + background: #f4f0e8; +} + +.calendar tbody .rowhilite td { + background: #e4e0d8; +} + +.calendar tbody .rowhilite td.wn { + background: #d4d0c8; +} + +.calendar tbody td.hilite { /* Hovered cells */ + padding: 1px 3px 1px 1px; + border-top: 1px solid #fff; + border-right: 1px solid #000; + border-bottom: 1px solid #000; + border-left: 1px solid #fff; +} + +.calendar tbody td.active { /* Active (pressed) cells */ + padding: 2px 2px 0px 2px; + border-top: 1px solid #000; + border-right: 1px solid #fff; + border-bottom: 1px solid #fff; + border-left: 1px solid #000; +} + +.calendar tbody td.selected { /* Cell showing selected date */ + font-weight: bold; + border-top: 1px solid #000; + border-right: 1px solid #fff; + border-bottom: 1px solid #fff; + border-left: 1px solid #000; + padding: 2px 2px 0px 2px; + background: #e4e0d8; +} + +.calendar tbody td.weekend { /* Cells showing weekend days */ + color: #f00; +} + +.calendar tbody td.today { /* Cell showing today date */ + font-weight: bold; + color: #00f; +} + +.calendar tbody .disabled { color: #999; } + +.calendar tbody .emptycell { /* Empty cells (the best is to hide them) */ + visibility: hidden; +} + +.calendar tbody .emptyrow { /* Empty row (some months need less than 6 rows) */ + display: none; +} + +/* The footer part -- status bar and "Close" button */ + +.calendar tfoot .footrow { /* The in footer (only one right now) */ +} + +.calendar tfoot .ttip { /* Tooltip (status bar) cell */ + background: #f4f0e8; + padding: 1px; + border: 1px solid #000; + background: #848078; + color: #fff; + text-align: center; +} + +.calendar tfoot .hilite { /* Hover style for buttons in footer */ + border-top: 1px solid #fff; + border-right: 1px solid #000; + border-bottom: 1px solid #000; + border-left: 1px solid #fff; + padding: 1px; + background: #e4e0d8; +} + +.calendar tfoot .active { /* Active (pressed) style for buttons in footer */ + padding: 2px 0px 0px 2px; + border-top: 1px solid #000; + border-right: 1px solid #fff; + border-bottom: 1px solid #fff; + border-left: 1px solid #000; +} + +/* Combo boxes (menus that display months/years for direct selection) */ + +.combo { + position: absolute; + display: none; + width: 4em; + top: 0px; + left: 0px; + cursor: default; + border-top: 1px solid #fff; + border-right: 1px solid #000; + border-bottom: 1px solid #000; + border-left: 1px solid #fff; + background: #e4e0d8; + font-size: smaller; + padding: 1px; +} + +.combo .label { + text-align: center; + padding: 1px; +} + +.combo .active { + background: #c4c0b8; + padding: 0px; + border-top: 1px solid #000; + border-right: 1px solid #fff; + border-bottom: 1px solid #fff; + border-left: 1px solid #000; +} + +.combo .hilite { + background: #048; + color: #fea; +} diff --git a/phpgwapi/js/jscalendar/calendar-win2k-2.css b/phpgwapi/js/jscalendar/calendar-win2k-2.css new file mode 100644 index 0000000000..398e78efec --- /dev/null +++ b/phpgwapi/js/jscalendar/calendar-win2k-2.css @@ -0,0 +1,217 @@ +/* The main calendar widget. DIV containing a table. */ + +.calendar { + position: relative; + display: none; + border-top: 2px solid #fff; + border-right: 2px solid #000; + border-bottom: 2px solid #000; + border-left: 2px solid #fff; + font-size: 11px; + color: #000; + cursor: default; + background: #d4c8d0; + font-family: tahoma,verdana,sans-serif; +} + +.calendar table { + border-top: 1px solid #000; + border-right: 1px solid #fff; + border-bottom: 1px solid #fff; + border-left: 1px solid #000; + font-size: 11px; + color: #000; + cursor: default; + background: #d4c8d0; + font-family: tahoma,verdana,sans-serif; +} + +/* Header part -- contains navigation buttons and day names. */ + +.calendar .button { /* "<<", "<", ">", ">>" buttons have this class */ + text-align: center; + padding: 1px; + border-top: 1px solid #fff; + border-right: 1px solid #000; + border-bottom: 1px solid #000; + border-left: 1px solid #fff; +} + +.calendar thead .title { /* This holds the current "month, year" */ + font-weight: bold; + padding: 1px; + border: 1px solid #000; + background: #847880; + color: #fff; + text-align: center; +} + +.calendar thead .headrow { /* Row containing navigation buttons */ +} + +.calendar thead .daynames { /* Row containing the day names */ +} + +.calendar thead .name { /* Cells containing the day names */ + border-bottom: 1px solid #000; + padding: 2px; + text-align: center; + background: #f4e8f0; +} + +.calendar thead .weekend { /* How a weekend day name shows in header */ + color: #f00; +} + +.calendar thead .hilite { /* How do the buttons in header appear when hover */ + border-top: 2px solid #fff; + border-right: 2px solid #000; + border-bottom: 2px solid #000; + border-left: 2px solid #fff; + padding: 0px; + background: #e4d8e0; +} + +.calendar thead .active { /* Active (pressed) buttons in header */ + padding: 2px 0px 0px 2px; + border-top: 1px solid #000; + border-right: 1px solid #fff; + border-bottom: 1px solid #fff; + border-left: 1px solid #000; + background: #c4b8c0; +} + +/* The body part -- contains all the days in month. */ + +.calendar tbody .day { /* Cells containing month days dates */ + width: 2em; + text-align: right; + padding: 2px 4px 2px 2px; +} + +.calendar table .wn { + padding: 2px 3px 2px 2px; + border-right: 1px solid #000; + background: #f4e8f0; +} + +.calendar tbody .rowhilite td { + background: #e4d8e0; +} + +.calendar tbody .rowhilite td.wn { + background: #d4c8d0; +} + +.calendar tbody td.hilite { /* Hovered cells */ + padding: 1px 3px 1px 1px; + border-top: 1px solid #fff; + border-right: 1px solid #000; + border-bottom: 1px solid #000; + border-left: 1px solid #fff; +} + +.calendar tbody td.active { /* Active (pressed) cells */ + padding: 2px 2px 0px 2px; + border-top: 1px solid #000; + border-right: 1px solid #fff; + border-bottom: 1px solid #fff; + border-left: 1px solid #000; +} + +.calendar tbody td.selected { /* Cell showing selected date */ + font-weight: bold; + border-top: 1px solid #000; + border-right: 1px solid #fff; + border-bottom: 1px solid #fff; + border-left: 1px solid #000; + padding: 2px 2px 0px 2px; + background: #e4d8e0; +} + +.calendar tbody td.weekend { /* Cells showing weekend days */ + color: #f00; +} + +.calendar tbody td.today { /* Cell showing today date */ + font-weight: bold; + color: #00f; +} + +.calendar tbody .disabled { color: #999; } + +.calendar tbody .emptycell { /* Empty cells (the best is to hide them) */ + visibility: hidden; +} + +.calendar tbody .emptyrow { /* Empty row (some months need less than 6 rows) */ + display: none; +} + +/* The footer part -- status bar and "Close" button */ + +.calendar tfoot .footrow { /* The in footer (only one right now) */ +} + +.calendar tfoot .ttip { /* Tooltip (status bar) cell */ + background: #f4e8f0; + padding: 1px; + border: 1px solid #000; + background: #847880; + color: #fff; + text-align: center; +} + +.calendar tfoot .hilite { /* Hover style for buttons in footer */ + border-top: 1px solid #fff; + border-right: 1px solid #000; + border-bottom: 1px solid #000; + border-left: 1px solid #fff; + padding: 1px; + background: #e4d8e0; +} + +.calendar tfoot .active { /* Active (pressed) style for buttons in footer */ + padding: 2px 0px 0px 2px; + border-top: 1px solid #000; + border-right: 1px solid #fff; + border-bottom: 1px solid #fff; + border-left: 1px solid #000; +} + +/* Combo boxes (menus that display months/years for direct selection) */ + +.combo { + position: absolute; + display: none; + width: 4em; + top: 0px; + left: 0px; + cursor: default; + border-top: 1px solid #fff; + border-right: 1px solid #000; + border-bottom: 1px solid #000; + border-left: 1px solid #fff; + background: #e4d8e0; + font-size: smaller; + padding: 1px; +} + +.combo .label { + text-align: center; + padding: 1px; +} + +.combo .active { + background: #d4c8d0; + padding: 0px; + border-top: 1px solid #000; + border-right: 1px solid #fff; + border-bottom: 1px solid #fff; + border-left: 1px solid #000; +} + +.combo .hilite { + background: #408; + color: #fea; +} diff --git a/phpgwapi/js/jscalendar/calendar-win2k-cold-1.css b/phpgwapi/js/jscalendar/calendar-win2k-cold-1.css new file mode 100644 index 0000000000..f12852e8ec --- /dev/null +++ b/phpgwapi/js/jscalendar/calendar-win2k-cold-1.css @@ -0,0 +1,211 @@ +/* The main calendar widget. DIV containing a table. */ + +.calendar { + position: relative; + display: none; + border-top: 2px solid #fff; + border-right: 2px solid #000; + border-bottom: 2px solid #000; + border-left: 2px solid #fff; + font-size: 11px; + color: #000; + cursor: default; + background: #c8d0d4; + font-family: tahoma,verdana,sans-serif; +} + +.calendar table { + border-top: 1px solid #000; + border-right: 1px solid #fff; + border-bottom: 1px solid #fff; + border-left: 1px solid #000; + font-size: 11px; + color: #000; + cursor: default; + background: #c8d0d4; + font-family: tahoma,verdana,sans-serif; +} + +/* Header part -- contains navigation buttons and day names. */ + +.calendar .button { /* "<<", "<", ">", ">>" buttons have this class */ + text-align: center; + padding: 1px; + border-top: 1px solid #fff; + border-right: 1px solid #000; + border-bottom: 1px solid #000; + border-left: 1px solid #fff; +} + +.calendar thead .title { /* This holds the current "month, year" */ + font-weight: bold; + padding: 1px; + border: 1px solid #000; + background: #788084; + color: #fff; + text-align: center; +} + +.calendar thead .headrow { /* Row containing navigation buttons */ +} + +.calendar thead .daynames { /* Row containing the day names */ +} + +.calendar thead .name { /* Cells containing the day names */ + border-bottom: 1px solid #000; + padding: 2px; + text-align: center; + background: #e8f0f4; +} + +.calendar thead .weekend { /* How a weekend day name shows in header */ + color: #f00; +} + +.calendar thead .hilite { /* How do the buttons in header appear when hover */ + border-top: 2px solid #fff; + border-right: 2px solid #000; + border-bottom: 2px solid #000; + border-left: 2px solid #fff; + padding: 0px; + background: #d8e0e4; +} + +.calendar thead .active { /* Active (pressed) buttons in header */ + padding: 2px 0px 0px 2px; + border-top: 1px solid #000; + border-right: 1px solid #fff; + border-bottom: 1px solid #fff; + border-left: 1px solid #000; + background: #b8c0c4; +} + +/* The body part -- contains all the days in month. */ + +.calendar tbody .day { /* Cells containing month days dates */ + width: 2em; + text-align: right; + padding: 2px 4px 2px 2px; +} + +.calendar table .wn { + padding: 2px 3px 2px 2px; + border-right: 1px solid #000; + background: #e8f4f0; +} + +.calendar tbody .rowhilite td { + background: #d8e4e0; +} + +.calendar tbody .rowhilite td.wn { + background: #c8d4d0; +} + +.calendar tbody td.hilite { /* Hovered cells */ + padding: 1px 3px 1px 1px; + border: 1px solid; + border-color: #fff #000 #000 #fff; +} + +.calendar tbody td.active { /* Active (pressed) cells */ + padding: 2px 2px 0px 2px; + border: 1px solid; + border-color: #000 #fff #fff #000; +} + +.calendar tbody td.selected { /* Cell showing selected date */ + font-weight: bold; + padding: 2px 2px 0px 2px; + border: 1px solid; + border-color: #000 #fff #fff #000; + background: #d8e0e4; +} + +.calendar tbody td.weekend { /* Cells showing weekend days */ + color: #f00; +} + +.calendar tbody td.today { /* Cell showing today date */ + font-weight: bold; + color: #00f; +} + +.calendar tbody .disabled { color: #999; } + +.calendar tbody .emptycell { /* Empty cells (the best is to hide them) */ + visibility: hidden; +} + +.calendar tbody .emptyrow { /* Empty row (some months need less than 6 rows) */ + display: none; +} + +/* The footer part -- status bar and "Close" button */ + +.calendar tfoot .footrow { /* The in footer (only one right now) */ +} + +.calendar tfoot .ttip { /* Tooltip (status bar) cell */ + background: #e8f0f4; + padding: 1px; + border: 1px solid #000; + background: #788084; + color: #fff; + text-align: center; +} + +.calendar tfoot .hilite { /* Hover style for buttons in footer */ + border-top: 1px solid #fff; + border-right: 1px solid #000; + border-bottom: 1px solid #000; + border-left: 1px solid #fff; + padding: 1px; + background: #d8e0e4; +} + +.calendar tfoot .active { /* Active (pressed) style for buttons in footer */ + padding: 2px 0px 0px 2px; + border-top: 1px solid #000; + border-right: 1px solid #fff; + border-bottom: 1px solid #fff; + border-left: 1px solid #000; +} + +/* Combo boxes (menus that display months/years for direct selection) */ + +.combo { + position: absolute; + display: none; + width: 4em; + top: 0px; + left: 0px; + cursor: default; + border-top: 1px solid #fff; + border-right: 1px solid #000; + border-bottom: 1px solid #000; + border-left: 1px solid #fff; + background: #d8e0e4; + font-size: smaller; + padding: 1px; +} + +.combo .label { + text-align: center; + padding: 1px; +} + +.combo .active { + background: #c8d0d4; + padding: 0px; + border-top: 1px solid #000; + border-right: 1px solid #fff; + border-bottom: 1px solid #fff; + border-left: 1px solid #000; +} + +.combo .hilite { + background: #048; + color: #aef; +} diff --git a/phpgwapi/js/jscalendar/calendar-win2k-cold-2.css b/phpgwapi/js/jscalendar/calendar-win2k-cold-2.css new file mode 100644 index 0000000000..a8ca89e3bb --- /dev/null +++ b/phpgwapi/js/jscalendar/calendar-win2k-cold-2.css @@ -0,0 +1,217 @@ +/* The main calendar widget. DIV containing a table. */ + +.calendar { + position: relative; + display: none; + border-top: 2px solid #fff; + border-right: 2px solid #000; + border-bottom: 2px solid #000; + border-left: 2px solid #fff; + font-size: 11px; + color: #000; + cursor: default; + background: #c8d4d0; + font-family: tahoma,verdana,sans-serif; +} + +.calendar table { + border-top: 1px solid #000; + border-right: 1px solid #fff; + border-bottom: 1px solid #fff; + border-left: 1px solid #000; + font-size: 11px; + color: #000; + cursor: default; + background: #c8d4d0; + font-family: tahoma,verdana,sans-serif; +} + +/* Header part -- contains navigation buttons and day names. */ + +.calendar .button { /* "<<", "<", ">", ">>" buttons have this class */ + text-align: center; + padding: 1px; + border-top: 1px solid #fff; + border-right: 1px solid #000; + border-bottom: 1px solid #000; + border-left: 1px solid #fff; +} + +.calendar thead .title { /* This holds the current "month, year" */ + font-weight: bold; + padding: 1px; + border: 1px solid #000; + background: #788480; + color: #fff; + text-align: center; +} + +.calendar thead .headrow { /* Row containing navigation buttons */ +} + +.calendar thead .daynames { /* Row containing the day names */ +} + +.calendar thead .name { /* Cells containing the day names */ + border-bottom: 1px solid #000; + padding: 2px; + text-align: center; + background: #e8f4f0; +} + +.calendar thead .weekend { /* How a weekend day name shows in header */ + color: #f00; +} + +.calendar thead .hilite { /* How do the buttons in header appear when hover */ + border-top: 2px solid #fff; + border-right: 2px solid #000; + border-bottom: 2px solid #000; + border-left: 2px solid #fff; + padding: 0px; + background: #d8e4e0; +} + +.calendar thead .active { /* Active (pressed) buttons in header */ + padding: 2px 0px 0px 2px; + border-top: 1px solid #000; + border-right: 1px solid #fff; + border-bottom: 1px solid #fff; + border-left: 1px solid #000; + background: #b8c4c0; +} + +/* The body part -- contains all the days in month. */ + +.calendar tbody .day { /* Cells containing month days dates */ + width: 2em; + text-align: right; + padding: 2px 4px 2px 2px; +} + +.calendar table .wn { + padding: 2px 3px 2px 2px; + border-right: 1px solid #000; + background: #e8f4f0; +} + +.calendar tbody .rowhilite td { + background: #d8e4e0; +} + +.calendar tbody .rowhilite td.wn { + background: #c8d4d0; +} + +.calendar tbody td.hilite { /* Hovered cells */ + padding: 1px 3px 1px 1px; + border-top: 1px solid #fff; + border-right: 1px solid #000; + border-bottom: 1px solid #000; + border-left: 1px solid #fff; +} + +.calendar tbody td.active { /* Active (pressed) cells */ + padding: 2px 2px 0px 2px; + border-top: 1px solid #000; + border-right: 1px solid #fff; + border-bottom: 1px solid #fff; + border-left: 1px solid #000; +} + +.calendar tbody td.selected { /* Cell showing selected date */ + font-weight: bold; + border-top: 1px solid #000; + border-right: 1px solid #fff; + border-bottom: 1px solid #fff; + border-left: 1px solid #000; + padding: 2px 2px 0px 2px; + background: #d8e4e0; +} + +.calendar tbody td.weekend { /* Cells showing weekend days */ + color: #f00; +} + +.calendar tbody td.today { /* Cell showing today date */ + font-weight: bold; + color: #00f; +} + +.calendar tbody .disabled { color: #999; } + +.calendar tbody .emptycell { /* Empty cells (the best is to hide them) */ + visibility: hidden; +} + +.calendar tbody .emptyrow { /* Empty row (some months need less than 6 rows) */ + display: none; +} + +/* The footer part -- status bar and "Close" button */ + +.calendar tfoot .footrow { /* The in footer (only one right now) */ +} + +.calendar tfoot .ttip { /* Tooltip (status bar) cell */ + background: #e8f4f0; + padding: 1px; + border: 1px solid #000; + background: #788480; + color: #fff; + text-align: center; +} + +.calendar tfoot .hilite { /* Hover style for buttons in footer */ + border-top: 1px solid #fff; + border-right: 1px solid #000; + border-bottom: 1px solid #000; + border-left: 1px solid #fff; + padding: 1px; + background: #d8e4e0; +} + +.calendar tfoot .active { /* Active (pressed) style for buttons in footer */ + padding: 2px 0px 0px 2px; + border-top: 1px solid #000; + border-right: 1px solid #fff; + border-bottom: 1px solid #fff; + border-left: 1px solid #000; +} + +/* Combo boxes (menus that display months/years for direct selection) */ + +.combo { + position: absolute; + display: none; + width: 4em; + top: 0px; + left: 0px; + cursor: default; + border-top: 1px solid #fff; + border-right: 1px solid #000; + border-bottom: 1px solid #000; + border-left: 1px solid #fff; + background: #d8e4e0; + font-size: smaller; + padding: 1px; +} + +.combo .label { + text-align: center; + padding: 1px; +} + +.combo .active { + background: #c8d4d0; + padding: 0px; + border-top: 1px solid #000; + border-right: 1px solid #fff; + border-bottom: 1px solid #fff; + border-left: 1px solid #000; +} + +.combo .hilite { + background: #048; + color: #aef; +} diff --git a/phpgwapi/js/jscalendar/calendar.js b/phpgwapi/js/jscalendar/calendar.js new file mode 100644 index 0000000000..ceaf185f61 --- /dev/null +++ b/phpgwapi/js/jscalendar/calendar.js @@ -0,0 +1,1379 @@ +/* Copyright Mihai Bazon, 2002, 2003 | http://students.infoiasi.ro/~mishoo + * --------------------------------------------------------------------------- + * + * The DHTML Calendar, version 0.9.3 "It's still alive & keeps rocking" + * + * 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. + */ + +// $Id$ + +/** The Calendar object constructor. */ +Calendar = function (mondayFirst, dateStr, onSelected, onClose) { + // member variables + this.activeDiv = null; + this.currentDateEl = null; + this.checkDisabled = null; + this.timeout = null; + this.onSelected = onSelected || null; + this.onClose = onClose || null; + this.dragging = false; + this.hidden = false; + this.minYear = 1970; + this.maxYear = 2050; + this.dateFormat = Calendar._TT["DEF_DATE_FORMAT"]; + this.ttDateFormat = Calendar._TT["TT_DATE_FORMAT"]; + this.isPopup = true; + this.weekNumbers = true; + this.mondayFirst = mondayFirst; + this.dateStr = dateStr; + this.ar_days = null; + // HTML elements + this.table = null; + this.element = null; + this.tbody = null; + this.firstdayname = null; + // Combo boxes + this.monthsCombo = null; + this.yearsCombo = null; + this.hilitedMonth = null; + this.activeMonth = null; + this.hilitedYear = null; + this.activeYear = null; + // Information + this.dateClicked = false; + + // one-time initializations + if (!Calendar._DN3) { + // table of short day names + var ar = new Array(); + for (var i = 8; i > 0;) { + ar[--i] = Calendar._DN[i].substr(0, 3); + } + Calendar._DN3 = ar; + // table of short month names + ar = new Array(); + for (var i = 12; i > 0;) { + ar[--i] = Calendar._MN[i].substr(0, 3); + } + Calendar._MN3 = ar; + } +}; + +// ** constants + +/// "static", needed for event handlers. +Calendar._C = null; + +/// detect a special case of "web browser" +Calendar.is_ie = ( /msie/i.test(navigator.userAgent) && + !/opera/i.test(navigator.userAgent) ); + +// short day names array (initialized at first constructor call) +Calendar._DN3 = null; + +// short month names array (initialized at first constructor call) +Calendar._MN3 = null; + +// BEGIN: UTILITY FUNCTIONS; beware that these might be moved into a separate +// library, at some point. + +Calendar.getAbsolutePos = function(el) { + var r = { x: el.offsetLeft, y: el.offsetTop }; + if (el.offsetParent) { + var tmp = Calendar.getAbsolutePos(el.offsetParent); + r.x += tmp.x; + r.y += tmp.y; + } + return r; +}; + +Calendar.isRelated = function (el, evt) { + var related = evt.relatedTarget; + if (!related) { + var type = evt.type; + if (type == "mouseover") { + related = evt.fromElement; + } else if (type == "mouseout") { + related = evt.toElement; + } + } + while (related) { + if (related == el) { + return true; + } + related = related.parentNode; + } + return false; +}; + +Calendar.removeClass = function(el, className) { + if (!(el && el.className)) { + return; + } + var cls = el.className.split(" "); + var ar = new Array(); + for (var i = cls.length; i > 0;) { + if (cls[--i] != className) { + ar[ar.length] = cls[i]; + } + } + el.className = ar.join(" "); +}; + +Calendar.addClass = function(el, className) { + Calendar.removeClass(el, className); + el.className += " " + className; +}; + +Calendar.getElement = function(ev) { + if (Calendar.is_ie) { + return window.event.srcElement; + } else { + return ev.currentTarget; + } +}; + +Calendar.getTargetElement = function(ev) { + if (Calendar.is_ie) { + return window.event.srcElement; + } else { + return ev.target; + } +}; + +Calendar.stopEvent = function(ev) { + if (Calendar.is_ie) { + window.event.cancelBubble = true; + window.event.returnValue = false; + } else { + ev.preventDefault(); + ev.stopPropagation(); + } + return false; +}; + +Calendar.addEvent = function(el, evname, func) { + if (el.attachEvent) { // IE + el.attachEvent("on" + evname, func); + } else if (el.addEventListener) { // Gecko / W3C + el.addEventListener(evname, func, true); + } else { // Opera (or old browsers) + el["on" + evname] = func; + } +}; + +Calendar.removeEvent = function(el, evname, func) { + if (el.detachEvent) { // IE + el.detachEvent("on" + evname, func); + } else if (el.removeEventListener) { // Gecko / W3C + el.removeEventListener(evname, func, true); + } else { // Opera (or old browsers) + el["on" + evname] = null; + } +}; + +Calendar.createElement = function(type, parent) { + var el = null; + if (document.createElementNS) { + // use the XHTML namespace; IE won't normally get here unless + // _they_ "fix" the DOM2 implementation. + el = document.createElementNS("http://www.w3.org/1999/xhtml", type); + } else { + el = document.createElement(type); + } + if (typeof parent != "undefined") { + parent.appendChild(el); + } + return el; +}; + +// END: UTILITY FUNCTIONS + +// BEGIN: CALENDAR STATIC FUNCTIONS + +/** Internal -- adds a set of events to make some element behave like a button. */ +Calendar._add_evs = function(el) { + with (Calendar) { + addEvent(el, "mouseover", dayMouseOver); + addEvent(el, "mousedown", dayMouseDown); + addEvent(el, "mouseout", dayMouseOut); + if (is_ie) { + addEvent(el, "dblclick", dayMouseDblClick); + el.setAttribute("unselectable", true); + } + } +}; + +Calendar.findMonth = function(el) { + if (typeof el.month != "undefined") { + return el; + } else if (typeof el.parentNode.month != "undefined") { + return el.parentNode; + } + return null; +}; + +Calendar.findYear = function(el) { + if (typeof el.year != "undefined") { + return el; + } else if (typeof el.parentNode.year != "undefined") { + return el.parentNode; + } + return null; +}; + +Calendar.showMonthsCombo = function () { + var cal = Calendar._C; + if (!cal) { + return false; + } + var cal = cal; + var cd = cal.activeDiv; + var mc = cal.monthsCombo; + if (cal.hilitedMonth) { + Calendar.removeClass(cal.hilitedMonth, "hilite"); + } + if (cal.activeMonth) { + Calendar.removeClass(cal.activeMonth, "active"); + } + var mon = cal.monthsCombo.getElementsByTagName("div")[cal.date.getMonth()]; + Calendar.addClass(mon, "active"); + cal.activeMonth = mon; + mc.style.left = cd.offsetLeft + "px"; + mc.style.top = (cd.offsetTop + cd.offsetHeight) + "px"; + mc.style.display = "block"; +}; + +Calendar.showYearsCombo = function (fwd) { + var cal = Calendar._C; + if (!cal) { + return false; + } + var cal = cal; + var cd = cal.activeDiv; + var yc = cal.yearsCombo; + if (cal.hilitedYear) { + Calendar.removeClass(cal.hilitedYear, "hilite"); + } + if (cal.activeYear) { + Calendar.removeClass(cal.activeYear, "active"); + } + cal.activeYear = null; + var Y = cal.date.getFullYear() + (fwd ? 1 : -1); + var yr = yc.firstChild; + var show = false; + for (var i = 12; i > 0; --i) { + if (Y >= cal.minYear && Y <= cal.maxYear) { + yr.firstChild.data = Y; + yr.year = Y; + yr.style.display = "block"; + show = true; + } else { + yr.style.display = "none"; + } + yr = yr.nextSibling; + Y += fwd ? 2 : -2; + } + if (show) { + yc.style.left = cd.offsetLeft + "px"; + yc.style.top = (cd.offsetTop + cd.offsetHeight) + "px"; + yc.style.display = "block"; + } +}; + +// event handlers + +Calendar.tableMouseUp = function(ev) { + var cal = Calendar._C; + if (!cal) { + return false; + } + if (cal.timeout) { + clearTimeout(cal.timeout); + } + var el = cal.activeDiv; + if (!el) { + return false; + } + var target = Calendar.getTargetElement(ev); + Calendar.removeClass(el, "active"); + if (target == el || target.parentNode == el) { + Calendar.cellClick(el); + } + var mon = Calendar.findMonth(target); + var date = null; + if (mon) { + date = new Date(cal.date); + if (mon.month != date.getMonth()) { + date.setMonth(mon.month); + cal.setDate(date); + cal.dateClicked = false; + cal.callHandler(); + } + } else { + var year = Calendar.findYear(target); + if (year) { + date = new Date(cal.date); + if (year.year != date.getFullYear()) { + date.setFullYear(year.year); + cal.setDate(date); + cal.dateClicked = false; + cal.callHandler(); + } + } + } + with (Calendar) { + removeEvent(document, "mouseup", tableMouseUp); + removeEvent(document, "mouseover", tableMouseOver); + removeEvent(document, "mousemove", tableMouseOver); + cal._hideCombos(); + _C = null; + return stopEvent(ev); + } +}; + +Calendar.tableMouseOver = function (ev) { + var cal = Calendar._C; + if (!cal) { + return; + } + var el = cal.activeDiv; + var target = Calendar.getTargetElement(ev); + if (target == el || target.parentNode == el) { + Calendar.addClass(el, "hilite active"); + Calendar.addClass(el.parentNode, "rowhilite"); + } else { + Calendar.removeClass(el, "active"); + Calendar.removeClass(el, "hilite"); + Calendar.removeClass(el.parentNode, "rowhilite"); + } + var mon = Calendar.findMonth(target); + if (mon) { + if (mon.month != cal.date.getMonth()) { + if (cal.hilitedMonth) { + Calendar.removeClass(cal.hilitedMonth, "hilite"); + } + Calendar.addClass(mon, "hilite"); + cal.hilitedMonth = mon; + } else if (cal.hilitedMonth) { + Calendar.removeClass(cal.hilitedMonth, "hilite"); + } + } else { + var year = Calendar.findYear(target); + if (year) { + if (year.year != cal.date.getFullYear()) { + if (cal.hilitedYear) { + Calendar.removeClass(cal.hilitedYear, "hilite"); + } + Calendar.addClass(year, "hilite"); + cal.hilitedYear = year; + } else if (cal.hilitedYear) { + Calendar.removeClass(cal.hilitedYear, "hilite"); + } + } + } + return Calendar.stopEvent(ev); +}; + +Calendar.tableMouseDown = function (ev) { + if (Calendar.getTargetElement(ev) == Calendar.getElement(ev)) { + return Calendar.stopEvent(ev); + } +}; + +Calendar.calDragIt = function (ev) { + var cal = Calendar._C; + if (!(cal && cal.dragging)) { + return false; + } + var posX; + var posY; + if (Calendar.is_ie) { + posY = window.event.clientY + document.body.scrollTop; + posX = window.event.clientX + document.body.scrollLeft; + } else { + posX = ev.pageX; + posY = ev.pageY; + } + cal.hideShowCovered(); + var st = cal.element.style; + st.left = (posX - cal.xOffs) + "px"; + st.top = (posY - cal.yOffs) + "px"; + return Calendar.stopEvent(ev); +}; + +Calendar.calDragEnd = function (ev) { + var cal = Calendar._C; + if (!cal) { + return false; + } + cal.dragging = false; + with (Calendar) { + removeEvent(document, "mousemove", calDragIt); + removeEvent(document, "mouseover", stopEvent); + removeEvent(document, "mouseup", calDragEnd); + tableMouseUp(ev); + } + cal.hideShowCovered(); +}; + +Calendar.dayMouseDown = function(ev) { + var el = Calendar.getElement(ev); + if (el.disabled) { + return false; + } + var cal = el.calendar; + cal.activeDiv = el; + Calendar._C = cal; + if (el.navtype != 300) with (Calendar) { + addClass(el, "hilite active"); + addEvent(document, "mouseover", tableMouseOver); + addEvent(document, "mousemove", tableMouseOver); + addEvent(document, "mouseup", tableMouseUp); + } else if (cal.isPopup) { + cal._dragStart(ev); + } + if (el.navtype == -1 || el.navtype == 1) { + cal.timeout = setTimeout("Calendar.showMonthsCombo()", 250); + } else if (el.navtype == -2 || el.navtype == 2) { + cal.timeout = setTimeout((el.navtype > 0) ? "Calendar.showYearsCombo(true)" : "Calendar.showYearsCombo(false)", 250); + } else { + cal.timeout = null; + } + return Calendar.stopEvent(ev); +}; + +Calendar.dayMouseDblClick = function(ev) { + Calendar.cellClick(Calendar.getElement(ev)); + if (Calendar.is_ie) { + document.selection.empty(); + } +}; + +Calendar.dayMouseOver = function(ev) { + var el = Calendar.getElement(ev); + if (Calendar.isRelated(el, ev) || Calendar._C || el.disabled) { + return false; + } + if (el.ttip) { + if (el.ttip.substr(0, 1) == "_") { + var date = null; + with (el.calendar.date) { + date = new Date(getFullYear(), getMonth(), el.caldate); + } + el.ttip = date.print(el.calendar.ttDateFormat) + el.ttip.substr(1); + } + el.calendar.tooltips.firstChild.data = el.ttip; + } + if (el.navtype != 300) { + Calendar.addClass(el, "hilite"); + if (el.caldate) { + Calendar.addClass(el.parentNode, "rowhilite"); + } + } + return Calendar.stopEvent(ev); +}; + +Calendar.dayMouseOut = function(ev) { + with (Calendar) { + var el = getElement(ev); + if (isRelated(el, ev) || _C || el.disabled) { + return false; + } + removeClass(el, "hilite"); + if (el.caldate) { + removeClass(el.parentNode, "rowhilite"); + } + el.calendar.tooltips.firstChild.data = _TT["SEL_DATE"]; + return stopEvent(ev); + } +}; + +/** + * A generic "click" handler :) handles all types of buttons defined in this + * calendar. + */ +Calendar.cellClick = function(el) { + var cal = el.calendar; + var closing = false; + var newdate = false; + var date = null; + if (typeof el.navtype == "undefined") { + Calendar.removeClass(cal.currentDateEl, "selected"); + Calendar.addClass(el, "selected"); + closing = (cal.currentDateEl == el); + if (!closing) { + cal.currentDateEl = el; + } + cal.date.setDate(el.caldate); + date = cal.date; + newdate = true; + // a date was clicked + cal.dateClicked = true; + } else { + if (el.navtype == 200) { + Calendar.removeClass(el, "hilite"); + cal.callCloseHandler(); + return; + } + date = (el.navtype == 0) ? new Date() : new Date(cal.date); + // unless "today" was clicked, we assume no date was clicked so + // the selected handler will know not to close the calenar when + // in single-click mode. + cal.dateClicked = (el.navtype == 0); + var year = date.getFullYear(); + var mon = date.getMonth(); + function setMonth(m) { + var day = date.getDate(); + var max = date.getMonthDays(m); + if (day > max) { + date.setDate(max); + } + date.setMonth(m); + }; + switch (el.navtype) { + case -2: + if (year > cal.minYear) { + date.setFullYear(year - 1); + } + break; + case -1: + if (mon > 0) { + setMonth(mon - 1); + } else if (year-- > cal.minYear) { + date.setFullYear(year); + setMonth(11); + } + break; + case 1: + if (mon < 11) { + setMonth(mon + 1); + } else if (year < cal.maxYear) { + date.setFullYear(year + 1); + setMonth(0); + } + break; + case 2: + if (year < cal.maxYear) { + date.setFullYear(year + 1); + } + break; + case 100: + cal.setMondayFirst(!cal.mondayFirst); + return; + case 0: + // TODAY will bring us here + if ((typeof cal.checkDisabled == "function") && cal.checkDisabled(date)) { + // remember, "date" was previously set to new + // Date() if TODAY was clicked; thus, it + // contains today date. + return false; + } + break; + } + if (!date.equalsTo(cal.date)) { + cal.setDate(date); + newdate = true; + } + } + if (newdate) { + cal.callHandler(); + } + if (closing) { + Calendar.removeClass(el, "hilite"); + cal.callCloseHandler(); + } +}; + +// END: CALENDAR STATIC FUNCTIONS + +// BEGIN: CALENDAR OBJECT FUNCTIONS + +/** + * This function creates the calendar inside the given parent. If _par is + * null than it creates a popup calendar inside the BODY element. If _par is + * an element, be it BODY, then it creates a non-popup calendar (still + * hidden). Some properties need to be set before calling this function. + */ +Calendar.prototype.create = function (_par) { + var parent = null; + if (! _par) { + // default parent is the document body, in which case we create + // a popup calendar. + parent = document.getElementsByTagName("body")[0]; + this.isPopup = true; + } else { + parent = _par; + this.isPopup = false; + } + this.date = this.dateStr ? new Date(this.dateStr) : new Date(); + + var table = Calendar.createElement("table"); + this.table = table; + table.cellSpacing = 0; + table.cellPadding = 0; + table.calendar = this; + Calendar.addEvent(table, "mousedown", Calendar.tableMouseDown); + + var div = Calendar.createElement("div"); + this.element = div; + div.className = "calendar"; + if (this.isPopup) { + div.style.position = "absolute"; + div.style.display = "none"; + } + div.appendChild(table); + + var thead = Calendar.createElement("thead", table); + var cell = null; + var row = null; + + var cal = this; + var hh = function (text, cs, navtype) { + cell = Calendar.createElement("td", row); + cell.colSpan = cs; + cell.className = "button"; + Calendar._add_evs(cell); + cell.calendar = cal; + cell.navtype = navtype; + if (text.substr(0, 1) != "&") { + cell.appendChild(document.createTextNode(text)); + } + else { + // FIXME: dirty hack for entities + cell.innerHTML = text; + } + return cell; + }; + + row = Calendar.createElement("tr", thead); + var title_length = 6; + (this.isPopup) && --title_length; + (this.weekNumbers) && ++title_length; + + hh("-", 1, 100).ttip = Calendar._TT["TOGGLE"]; + this.title = hh("", title_length, 300); + this.title.className = "title"; + if (this.isPopup) { + this.title.ttip = Calendar._TT["DRAG_TO_MOVE"]; + this.title.style.cursor = "move"; + hh("×", 1, 200).ttip = Calendar._TT["CLOSE"]; + } + + row = Calendar.createElement("tr", thead); + row.className = "headrow"; + + this._nav_py = hh("«", 1, -2); + this._nav_py.ttip = Calendar._TT["PREV_YEAR"]; + + this._nav_pm = hh("‹", 1, -1); + this._nav_pm.ttip = Calendar._TT["PREV_MONTH"]; + + this._nav_now = hh(Calendar._TT["TODAY"], this.weekNumbers ? 4 : 3, 0); + this._nav_now.ttip = Calendar._TT["GO_TODAY"]; + + this._nav_nm = hh("›", 1, 1); + this._nav_nm.ttip = Calendar._TT["NEXT_MONTH"]; + + this._nav_ny = hh("»", 1, 2); + this._nav_ny.ttip = Calendar._TT["NEXT_YEAR"]; + + // day names + row = Calendar.createElement("tr", thead); + row.className = "daynames"; + if (this.weekNumbers) { + cell = Calendar.createElement("td", row); + cell.className = "name wn"; + cell.appendChild(document.createTextNode(Calendar._TT["WK"])); + } + for (var i = 7; i > 0; --i) { + cell = Calendar.createElement("td", row); + cell.appendChild(document.createTextNode("")); + if (!i) { + cell.navtype = 100; + cell.calendar = this; + Calendar._add_evs(cell); + } + } + this.firstdayname = (this.weekNumbers) ? row.firstChild.nextSibling : row.firstChild; + this._displayWeekdays(); + + var tbody = Calendar.createElement("tbody", table); + this.tbody = tbody; + + for (i = 6; i > 0; --i) { + row = Calendar.createElement("tr", tbody); + if (this.weekNumbers) { + cell = Calendar.createElement("td", row); + cell.appendChild(document.createTextNode("")); + } + for (var j = 7; j > 0; --j) { + cell = Calendar.createElement("td", row); + cell.appendChild(document.createTextNode("")); + cell.calendar = this; + Calendar._add_evs(cell); + } + } + + var tfoot = Calendar.createElement("tfoot", table); + + row = Calendar.createElement("tr", tfoot); + row.className = "footrow"; + + cell = hh(Calendar._TT["SEL_DATE"], this.weekNumbers ? 8 : 7, 300); + cell.className = "ttip"; + if (this.isPopup) { + cell.ttip = Calendar._TT["DRAG_TO_MOVE"]; + cell.style.cursor = "move"; + } + this.tooltips = cell; + + div = Calendar.createElement("div", this.element); + this.monthsCombo = div; + div.className = "combo"; + for (i = 0; i < Calendar._MN.length; ++i) { + var mn = Calendar.createElement("div"); + mn.className = "label"; + mn.month = i; + mn.appendChild(document.createTextNode(Calendar._MN3[i])); + div.appendChild(mn); + } + + div = Calendar.createElement("div", this.element); + this.yearsCombo = div; + div.className = "combo"; + for (i = 12; i > 0; --i) { + var yr = Calendar.createElement("div"); + yr.className = "label"; + yr.appendChild(document.createTextNode("")); + div.appendChild(yr); + } + + this._init(this.mondayFirst, this.date); + parent.appendChild(this.element); +}; + +/** keyboard navigation, only for popup calendars */ +Calendar._keyEvent = function(ev) { + if (!window.calendar) { + return false; + } + (Calendar.is_ie) && (ev = window.event); + var cal = window.calendar; + var act = (Calendar.is_ie || ev.type == "keypress"); + if (ev.ctrlKey) { + switch (ev.keyCode) { + case 37: // KEY left + act && Calendar.cellClick(cal._nav_pm); + break; + case 38: // KEY up + act && Calendar.cellClick(cal._nav_py); + break; + case 39: // KEY right + act && Calendar.cellClick(cal._nav_nm); + break; + case 40: // KEY down + act && Calendar.cellClick(cal._nav_ny); + break; + default: + return false; + } + } else switch (ev.keyCode) { + case 32: // KEY space (now) + Calendar.cellClick(cal._nav_now); + break; + case 27: // KEY esc + act && cal.hide(); + break; + case 37: // KEY left + case 38: // KEY up + case 39: // KEY right + case 40: // KEY down + if (act) { + var date = cal.date.getDate() - 1; + var el = cal.currentDateEl; + var ne = null; + var prev = (ev.keyCode == 37) || (ev.keyCode == 38); + switch (ev.keyCode) { + case 37: // KEY left + (--date >= 0) && (ne = cal.ar_days[date]); + break; + case 38: // KEY up + date -= 7; + (date >= 0) && (ne = cal.ar_days[date]); + break; + case 39: // KEY right + (++date < cal.ar_days.length) && (ne = cal.ar_days[date]); + break; + case 40: // KEY down + date += 7; + (date < cal.ar_days.length) && (ne = cal.ar_days[date]); + break; + } + if (!ne) { + if (prev) { + Calendar.cellClick(cal._nav_pm); + } else { + Calendar.cellClick(cal._nav_nm); + } + date = (prev) ? cal.date.getMonthDays() : 1; + el = cal.currentDateEl; + ne = cal.ar_days[date - 1]; + } + Calendar.removeClass(el, "selected"); + Calendar.addClass(ne, "selected"); + cal.date.setDate(ne.caldate); + cal.callHandler(); + cal.currentDateEl = ne; + } + break; + case 13: // KEY enter + if (act) { + cal.callHandler(); + cal.hide(); + } + break; + default: + return false; + } + return Calendar.stopEvent(ev); +}; + +/** + * (RE)Initializes the calendar to the given date and style (if mondayFirst is + * true it makes Monday the first day of week, otherwise the weeks start on + * Sunday. + */ +Calendar.prototype._init = function (mondayFirst, date) { + var today = new Date(); + var year = date.getFullYear(); + if (year < this.minYear) { + year = this.minYear; + date.setFullYear(year); + } else if (year > this.maxYear) { + year = this.maxYear; + date.setFullYear(year); + } + this.mondayFirst = mondayFirst; + this.date = new Date(date); + var month = date.getMonth(); + var mday = date.getDate(); + var no_days = date.getMonthDays(); + date.setDate(1); + var wday = date.getDay(); + var MON = mondayFirst ? 1 : 0; + var SAT = mondayFirst ? 5 : 6; + var SUN = mondayFirst ? 6 : 0; + if (mondayFirst) { + wday = (wday > 0) ? (wday - 1) : 6; + } + var iday = 1; + var row = this.tbody.firstChild; + var MN = Calendar._MN3[month]; + var hasToday = ((today.getFullYear() == year) && (today.getMonth() == month)); + var todayDate = today.getDate(); + var week_number = date.getWeekNumber(); + var ar_days = new Array(); + for (var i = 0; i < 6; ++i) { + if (iday > no_days) { + row.className = "emptyrow"; + row = row.nextSibling; + continue; + } + var cell = row.firstChild; + if (this.weekNumbers) { + cell.className = "day wn"; + cell.firstChild.data = week_number; + cell = cell.nextSibling; + } + ++week_number; + row.className = "daysrow"; + for (var j = 0; j < 7; ++j) { + cell.className = "day"; + if ((!i && j < wday) || iday > no_days) { + // cell.className = "emptycell"; + cell.innerHTML = " "; + cell.disabled = true; + cell = cell.nextSibling; + continue; + } + cell.disabled = false; + cell.firstChild.data = iday; + if (typeof this.checkDisabled == "function") { + date.setDate(iday); + if (this.checkDisabled(date)) { + cell.className += " disabled"; + cell.disabled = true; + } + } + if (!cell.disabled) { + ar_days[ar_days.length] = cell; + cell.caldate = iday; + cell.ttip = "_"; + if (iday == mday) { + cell.className += " selected"; + this.currentDateEl = cell; + } + if (hasToday && (iday == todayDate)) { + cell.className += " today"; + cell.ttip += Calendar._TT["PART_TODAY"]; + } + if (wday == SAT || wday == SUN) { + cell.className += " weekend"; + } + } + ++iday; + ((++wday) ^ 7) || (wday = 0); + cell = cell.nextSibling; + } + row = row.nextSibling; + } + this.ar_days = ar_days; + this.title.firstChild.data = Calendar._MN[month] + ", " + year; + // PROFILE + // this.tooltips.firstChild.data = "Generated in " + ((new Date()) - today) + " ms"; +}; + +/** + * Calls _init function above for going to a certain date (but only if the + * date is different than the currently selected one). + */ +Calendar.prototype.setDate = function (date) { + if (!date.equalsTo(this.date)) { + this._init(this.mondayFirst, date); + } +}; + +/** + * Refreshes the calendar. Useful if the "disabledHandler" function is + * dynamic, meaning that the list of disabled date can change at runtime. + * Just * call this function if you think that the list of disabled dates + * should * change. + */ +Calendar.prototype.refresh = function () { + this._init(this.mondayFirst, this.date); +}; + +/** Modifies the "mondayFirst" parameter (EU/US style). */ +Calendar.prototype.setMondayFirst = function (mondayFirst) { + this._init(mondayFirst, this.date); + this._displayWeekdays(); +}; + +/** + * Allows customization of what dates are enabled. The "unaryFunction" + * parameter must be a function object that receives the date (as a JS Date + * object) and returns a boolean value. If the returned value is true then + * the passed date will be marked as disabled. + */ +Calendar.prototype.setDisabledHandler = function (unaryFunction) { + this.checkDisabled = unaryFunction; +}; + +/** Customization of allowed year range for the calendar. */ +Calendar.prototype.setRange = function (a, z) { + this.minYear = a; + this.maxYear = z; +}; + +/** Calls the first user handler (selectedHandler). */ +Calendar.prototype.callHandler = function () { + if (this.onSelected) { + this.onSelected(this, this.date.print(this.dateFormat)); + } +}; + +/** Calls the second user handler (closeHandler). */ +Calendar.prototype.callCloseHandler = function () { + if (this.onClose) { + this.onClose(this); + } + this.hideShowCovered(); +}; + +/** Removes the calendar object from the DOM tree and destroys it. */ +Calendar.prototype.destroy = function () { + var el = this.element.parentNode; + el.removeChild(this.element); + Calendar._C = null; +}; + +/** + * Moves the calendar element to a different section in the DOM tree (changes + * its parent). + */ +Calendar.prototype.reparent = function (new_parent) { + var el = this.element; + el.parentNode.removeChild(el); + new_parent.appendChild(el); +}; + +// This gets called when the user presses a mouse button anywhere in the +// document, if the calendar is shown. If the click was outside the open +// calendar this function closes it. +Calendar._checkCalendar = function(ev) { + if (!window.calendar) { + return false; + } + var el = Calendar.is_ie ? Calendar.getElement(ev) : Calendar.getTargetElement(ev); + for (; el != null && el != calendar.element; el = el.parentNode); + if (el == null) { + // calls closeHandler which should hide the calendar. + window.calendar.callCloseHandler(); + return Calendar.stopEvent(ev); + } +}; + +/** Shows the calendar. */ +Calendar.prototype.show = function () { + var rows = this.table.getElementsByTagName("tr"); + for (var i = rows.length; i > 0;) { + var row = rows[--i]; + Calendar.removeClass(row, "rowhilite"); + var cells = row.getElementsByTagName("td"); + for (var j = cells.length; j > 0;) { + var cell = cells[--j]; + Calendar.removeClass(cell, "hilite"); + Calendar.removeClass(cell, "active"); + } + } + this.element.style.display = "block"; + this.hidden = false; + if (this.isPopup) { + window.calendar = this; + Calendar.addEvent(document, "keydown", Calendar._keyEvent); + Calendar.addEvent(document, "keypress", Calendar._keyEvent); + Calendar.addEvent(document, "mousedown", Calendar._checkCalendar); + } + this.hideShowCovered(); +}; + +/** + * Hides the calendar. Also removes any "hilite" from the class of any TD + * element. + */ +Calendar.prototype.hide = function () { + if (this.isPopup) { + Calendar.removeEvent(document, "keydown", Calendar._keyEvent); + Calendar.removeEvent(document, "keypress", Calendar._keyEvent); + Calendar.removeEvent(document, "mousedown", Calendar._checkCalendar); + } + this.element.style.display = "none"; + this.hidden = true; + this.hideShowCovered(); +}; + +/** + * Shows the calendar at a given absolute position (beware that, depending on + * the calendar element style -- position property -- this might be relative + * to the parent's containing rectangle). + */ +Calendar.prototype.showAt = function (x, y) { + var s = this.element.style; + s.left = x + "px"; + s.top = y + "px"; + this.show(); +}; + +/** Shows the calendar near a given element. */ +Calendar.prototype.showAtElement = function (el, opts) { + var p = Calendar.getAbsolutePos(el); + if (!opts || typeof opts != "string") { + this.showAt(p.x, p.y + el.offsetHeight); + return true; + } + this.show(); + var w = this.element.offsetWidth; + var h = this.element.offsetHeight; + this.hide(); + var valign = opts.substr(0, 1); + var halign = "l"; + if (opts.length > 1) { + halign = opts.substr(1, 1); + } + // vertical alignment + switch (valign) { + case "T": p.y -= h; break; + case "B": p.y += el.offsetHeight; break; + case "C": p.y += (el.offsetHeight - h) / 2; break; + case "t": p.y += el.offsetHeight - h; break; + case "b": break; // already there + } + // horizontal alignment + switch (halign) { + case "L": p.x -= w; break; + case "R": p.x += el.offsetWidth; break; + case "C": p.x += (el.offsetWidth - w) / 2; break; + case "r": p.x += el.offsetWidth - w; break; + case "l": break; // already there + } + this.showAt(p.x, p.y); +}; + +/** Customizes the date format. */ +Calendar.prototype.setDateFormat = function (str) { + this.dateFormat = str; +}; + +/** Customizes the tooltip date format. */ +Calendar.prototype.setTtDateFormat = function (str) { + this.ttDateFormat = str; +}; + +/** + * Tries to identify the date represented in a string. If successful it also + * calls this.setDate which moves the calendar to the given date. + */ +Calendar.prototype.parseDate = function (str, fmt) { + var y = 0; + var m = -1; + var d = 0; + var a = str.split(/\W+/); + if (!fmt) { + fmt = this.dateFormat; + } + var b = fmt.split(/\W+/); + var i = 0, j = 0; + for (i = 0; i < a.length; ++i) { + if (b[i] == "D" || b[i] == "DD") { + continue; + } + if (b[i] == "d" || b[i] == "dd") { + d = parseInt(a[i], 10); + } + if (b[i] == "m" || b[i] == "mm") { + m = parseInt(a[i], 10) - 1; + } + if ((b[i] == "y") || (b[i] == "yy")) { + y = parseInt(a[i], 10); + (y < 100) && (y += (y > 29) ? 1900 : 2000); + } + if (b[i] == "M" || b[i] == "MM") { + for (j = 0; j < 12; ++j) { + if (Calendar._MN[j].substr(0, a[i].length).toLowerCase() == a[i].toLowerCase()) { m = j; break; } + } + } + } + if (y != 0 && m != -1 && d != 0) { + this.setDate(new Date(y, m, d)); + return; + } + y = 0; m = -1; d = 0; + for (i = 0; i < a.length; ++i) { + if (a[i].search(/[a-zA-Z]+/) != -1) { + var t = -1; + for (j = 0; j < 12; ++j) { + if (Calendar._MN[j].substr(0, a[i].length).toLowerCase() == a[i].toLowerCase()) { t = j; break; } + } + if (t != -1) { + if (m != -1) { + d = m+1; + } + m = t; + } + } else if (parseInt(a[i], 10) <= 12 && m == -1) { + m = a[i]-1; + } else if (parseInt(a[i], 10) > 31 && y == 0) { + y = parseInt(a[i], 10); + (y < 100) && (y += (y > 29) ? 1900 : 2000); + } else if (d == 0) { + d = a[i]; + } + } + if (y == 0) { + var today = new Date(); + y = today.getFullYear(); + } + if (m != -1 && d != 0) { + this.setDate(new Date(y, m, d)); + } +}; + +Calendar.prototype.hideShowCovered = function () { + function getStyleProp(obj, style){ + var value = obj.style[style]; + if (!value) { + if (document.defaultView && typeof (document.defaultView.getComputedStyle) == "function") { // Gecko, W3C + value = document.defaultView. + getComputedStyle(obj, "").getPropertyValue(style); + } else if (obj.currentStyle) { // IE + value = obj.currentStyle[style]; + } else { + value = obj.style[style]; + } + } + return value; + }; + + var tags = new Array("applet", "iframe", "select"); + var el = this.element; + + var p = Calendar.getAbsolutePos(el); + var EX1 = p.x; + var EX2 = el.offsetWidth + EX1; + var EY1 = p.y; + var EY2 = el.offsetHeight + EY1; + + for (var k = tags.length; k > 0; ) { + var ar = document.getElementsByTagName(tags[--k]); + var cc = null; + + for (var i = ar.length; i > 0;) { + cc = ar[--i]; + + p = Calendar.getAbsolutePos(cc); + var CX1 = p.x; + var CX2 = cc.offsetWidth + CX1; + var CY1 = p.y; + var CY2 = cc.offsetHeight + CY1; + + if (this.hidden || (CX1 > EX2) || (CX2 < EX1) || (CY1 > EY2) || (CY2 < EY1)) { + if (!cc.__msh_save_visibility) { + cc.__msh_save_visibility = getStyleProp(cc, "visibility"); + } + cc.style.visibility = cc.__msh_save_visibility; + } else { + if (!cc.__msh_save_visibility) { + cc.__msh_save_visibility = getStyleProp(cc, "visibility"); + } + cc.style.visibility = "hidden"; + } + } + } +}; + +/** Internal function; it displays the bar with the names of the weekday. */ +Calendar.prototype._displayWeekdays = function () { + var MON = this.mondayFirst ? 0 : 1; + var SUN = this.mondayFirst ? 6 : 0; + var SAT = this.mondayFirst ? 5 : 6; + var cell = this.firstdayname; + for (var i = 0; i < 7; ++i) { + cell.className = "day name"; + if (!i) { + cell.ttip = this.mondayFirst ? Calendar._TT["SUN_FIRST"] : Calendar._TT["MON_FIRST"]; + cell.navtype = 100; + cell.calendar = this; + Calendar._add_evs(cell); + } + if (i == SUN || i == SAT) { + Calendar.addClass(cell, "weekend"); + } + cell.firstChild.data = Calendar._DN3[i + 1 - MON]; + cell = cell.nextSibling; + } +}; + +/** Internal function. Hides all combo boxes that might be displayed. */ +Calendar.prototype._hideCombos = function () { + this.monthsCombo.style.display = "none"; + this.yearsCombo.style.display = "none"; +}; + +/** Internal function. Starts dragging the element. */ +Calendar.prototype._dragStart = function (ev) { + if (this.dragging) { + return; + } + this.dragging = true; + var posX; + var posY; + if (Calendar.is_ie) { + posY = window.event.clientY + document.body.scrollTop; + posX = window.event.clientX + document.body.scrollLeft; + } else { + posY = ev.clientY + window.scrollY; + posX = ev.clientX + window.scrollX; + } + var st = this.element.style; + this.xOffs = posX - parseInt(st.left); + this.yOffs = posY - parseInt(st.top); + with (Calendar) { + addEvent(document, "mousemove", calDragIt); + addEvent(document, "mouseover", stopEvent); + addEvent(document, "mouseup", calDragEnd); + } +}; + +// BEGIN: DATE OBJECT PATCHES + +/** Adds the number of days array to the Date object. */ +Date._MD = new Array(31,28,31,30,31,30,31,31,30,31,30,31); + +/** Constants used for time computations */ +Date.SECOND = 1000 /* milliseconds */; +Date.MINUTE = 60 * Date.SECOND; +Date.HOUR = 60 * Date.MINUTE; +Date.DAY = 24 * Date.HOUR; +Date.WEEK = 7 * Date.DAY; + +/** Returns the number of days in the current month */ +Date.prototype.getMonthDays = function(month) { + var year = this.getFullYear(); + if (typeof month == "undefined") { + month = this.getMonth(); + } + if (((0 == (year%4)) && ( (0 != (year%100)) || (0 == (year%400)))) && month == 1) { + return 29; + } else { + return Date._MD[month]; + } +}; + +/** Returns the number of the week. The algorithm was "stolen" from PPK's + * website, hope it's correct :) http://www.xs4all.nl/~ppk/js/week.html */ +Date.prototype.getWeekNumber = function() { + var now = new Date(this.getFullYear(), this.getMonth(), this.getDate(), 0, 0, 0); + var then = new Date(this.getFullYear(), 0, 1, 0, 0, 0); + var time = now - then; + var day = then.getDay(); + (day > 3) && (day -= 4) || (day += 3); + return Math.round(((time / Date.DAY) + day) / 7); +}; + +/** Checks dates equality (ignores time) */ +Date.prototype.equalsTo = function(date) { + return ((this.getFullYear() == date.getFullYear()) && + (this.getMonth() == date.getMonth()) && + (this.getDate() == date.getDate())); +}; + +/** Prints the date in a string according to the given format. */ +Date.prototype.print = function (frm) { + var str = new String(frm); + var m = this.getMonth(); + var d = this.getDate(); + var y = this.getFullYear(); + var wn = this.getWeekNumber(); + var w = this.getDay(); + var s = new Array(); + s["d"] = d; + s["dd"] = (d < 10) ? ("0" + d) : d; + s["m"] = 1+m; + s["mm"] = (m < 9) ? ("0" + (1+m)) : (1+m); + s["y"] = y; + s["yy"] = new String(y).substr(2, 2); + s["w"] = wn; + s["ww"] = (wn < 10) ? ("0" + wn) : wn; + with (Calendar) { + s["D"] = _DN3[w]; + s["DD"] = _DN[w]; + s["M"] = _MN3[m]; + s["MM"] = _MN[m]; + } + var re = /(.*)(\W|^)(d|dd|m|mm|y|yy|MM|M|DD|D|w|ww)(\W|$)(.*)/; + while (re.exec(str) != null) { + str = RegExp.$1 + RegExp.$2 + s[RegExp.$3] + RegExp.$4 + RegExp.$5; + } + return str; +}; + +// END: DATE OBJECT PATCHES + +// global object that remembers the calendar +window.calendar = null; diff --git a/phpgwapi/js/jscalendar/calendar_stripped.js b/phpgwapi/js/jscalendar/calendar_stripped.js new file mode 100644 index 0000000000..38b9b9aad7 --- /dev/null +++ b/phpgwapi/js/jscalendar/calendar_stripped.js @@ -0,0 +1,12 @@ +/* Copyright Mihai Bazon, 2002, 2003 | http://students.infoiasi.ro/~mishoo + * --------------------------------------------------------------------------- + * + * The DHTML Calendar, version 0.9.3 "It's still alive & keeps rocking" + * + * 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. + */ +Calendar=function(mondayFirst,dateStr,onSelected,onClose){this.activeDiv=null;this.currentDateEl=null;this.checkDisabled=null;this.timeout=null;this.onSelected=onSelected||null;this.onClose=onClose||null;this.dragging=false;this.hidden=false;this.minYear=1970;this.maxYear=2050;this.dateFormat=Calendar._TT["DEF_DATE_FORMAT"];this.ttDateFormat=Calendar._TT["TT_DATE_FORMAT"];this.isPopup=true;this.weekNumbers=true;this.mondayFirst=mondayFirst;this.dateStr=dateStr;this.ar_days=null;this.table=null;this.element=null;this.tbody=null;this.firstdayname=null;this.monthsCombo=null;this.yearsCombo=null;this.hilitedMonth=null;this.activeMonth=null;this.hilitedYear=null;this.activeYear=null;this.dateClicked=false;if(!Calendar._DN3){var ar=new Array();for(var i=8;i>0;){ar[--i]=Calendar._DN[i].substr(0,3);}Calendar._DN3=ar;ar=new Array();for(var i=12;i>0;){ar[--i]=Calendar._MN[i].substr(0,3);}Calendar._MN3=ar;}};Calendar._C=null;Calendar.is_ie=(/msie/i.test(navigator.userAgent)&&!/opera/i.test(navigator.userAgent));Calendar._DN3=null;Calendar._MN3=null;Calendar.getAbsolutePos=function(el){var r={x:el.offsetLeft,y:el.offsetTop};if(el.offsetParent){var tmp=Calendar.getAbsolutePos(el.offsetParent);r.x+=tmp.x;r.y+=tmp.y;}return r;};Calendar.isRelated=function(el,evt){var related=evt.relatedTarget;if(!related){var type=evt.type;if(type=="mouseover"){related=evt.fromElement;}else if(type=="mouseout"){related=evt.toElement;}}while(related){if(related==el){return true;}related=related.parentNode;}return false;};Calendar.removeClass=function(el,className){if(!(el&&el.className)){return;}var cls=el.className.split(" ");var ar=new Array();for(var i=cls.length;i>0;){if(cls[--i]!=className){ar[ar.length]=cls[i];}}el.className=ar.join(" ");};Calendar.addClass=function(el,className){Calendar.removeClass(el,className);el.className+=" "+className;};Calendar.getElement=function(ev){if(Calendar.is_ie){return window.event.srcElement;}else{return ev.currentTarget;}};Calendar.getTargetElement=function(ev){if(Calendar.is_ie){return window.event.srcElement;}else{return ev.target;}};Calendar.stopEvent=function(ev){if(Calendar.is_ie){window.event.cancelBubble=true;window.event.returnValue=false;}else{ev.preventDefault();ev.stopPropagation();}return false;};Calendar.addEvent=function(el,evname,func){if(el.attachEvent){el.attachEvent("on"+evname,func);}else if(el.addEventListener){el.addEventListener(evname,func,true);}else{el["on"+evname]=func;}};Calendar.removeEvent=function(el,evname,func){if(el.detachEvent){el.detachEvent("on"+evname,func);}else if(el.removeEventListener){el.removeEventListener(evname,func,true);}else{el["on"+evname]=null;}};Calendar.createElement=function(type,parent){var el=null;if(document.createElementNS){el=document.createElementNS("http://www.w3.org/1999/xhtml",type);}else{el=document.createElement(type);}if(typeof parent!="undefined"){parent.appendChild(el);}return el;};Calendar._add_evs=function(el){with(Calendar){addEvent(el,"mouseover",dayMouseOver);addEvent(el,"mousedown",dayMouseDown);addEvent(el,"mouseout",dayMouseOut);if(is_ie){addEvent(el,"dblclick",dayMouseDblClick);el.setAttribute("unselectable",true);}}};Calendar.findMonth=function(el){if(typeof el.month!="undefined"){return el;}else if(typeof el.parentNode.month!="undefined"){return el.parentNode;}return null;};Calendar.findYear=function(el){if(typeof el.year!="undefined"){return el;}else if(typeof el.parentNode.year!="undefined"){return el.parentNode;}return null;};Calendar.showMonthsCombo=function(){var cal=Calendar._C;if(!cal){return false;}var cal=cal;var cd=cal.activeDiv;var mc=cal.monthsCombo;if(cal.hilitedMonth){Calendar.removeClass(cal.hilitedMonth,"hilite");}if(cal.activeMonth){Calendar.removeClass(cal.activeMonth,"active");}var mon=cal.monthsCombo.getElementsByTagName("div")[cal.date.getMonth()];Calendar.addClass(mon,"active");cal.activeMonth=mon;mc.style.left=cd.offsetLeft+"px";mc.style.top=(cd.offsetTop+cd.offsetHeight)+"px";mc.style.display="block";};Calendar.showYearsCombo=function(fwd){var cal=Calendar._C;if(!cal){return false;}var cal=cal;var cd=cal.activeDiv;var yc=cal.yearsCombo;if(cal.hilitedYear){Calendar.removeClass(cal.hilitedYear,"hilite");}if(cal.activeYear){Calendar.removeClass(cal.activeYear,"active");}cal.activeYear=null;var Y=cal.date.getFullYear()+(fwd?1:-1);var yr=yc.firstChild;var show=false;for(var i=12;i>0;--i){if(Y>=cal.minYear&&Y<=cal.maxYear){yr.firstChild.data=Y;yr.year=Y;yr.style.display="block";show=true;}else{yr.style.display="none";}yr=yr.nextSibling;Y+=fwd?2:-2;}if(show){yc.style.left=cd.offsetLeft+"px";yc.style.top=(cd.offsetTop+cd.offsetHeight)+"px";yc.style.display="block";}};Calendar.tableMouseUp=function(ev){var cal=Calendar._C;if(!cal){return false;}if(cal.timeout){clearTimeout(cal.timeout);}var el=cal.activeDiv;if(!el){return false;}var target=Calendar.getTargetElement(ev);Calendar.removeClass(el,"active");if(target==el||target.parentNode==el){Calendar.cellClick(el);}var mon=Calendar.findMonth(target);var date=null;if(mon){date=new Date(cal.date);if(mon.month!=date.getMonth()){date.setMonth(mon.month);cal.setDate(date);cal.dateClicked=false;cal.callHandler();}}else{var year=Calendar.findYear(target);if(year){date=new Date(cal.date);if(year.year!=date.getFullYear()){date.setFullYear(year.year);cal.setDate(date);cal.dateClicked=false;cal.callHandler();}}}with(Calendar){removeEvent(document,"mouseup",tableMouseUp);removeEvent(document,"mouseover",tableMouseOver);removeEvent(document,"mousemove",tableMouseOver);cal._hideCombos();_C=null;return stopEvent(ev);}};Calendar.tableMouseOver=function(ev){var cal=Calendar._C;if(!cal){return;}var el=cal.activeDiv;var target=Calendar.getTargetElement(ev);if(target==el||target.parentNode==el){Calendar.addClass(el,"hilite active");Calendar.addClass(el.parentNode,"rowhilite");}else{Calendar.removeClass(el,"active");Calendar.removeClass(el,"hilite");Calendar.removeClass(el.parentNode,"rowhilite");}var mon=Calendar.findMonth(target);if(mon){if(mon.month!=cal.date.getMonth()){if(cal.hilitedMonth){Calendar.removeClass(cal.hilitedMonth,"hilite");}Calendar.addClass(mon,"hilite");cal.hilitedMonth=mon;}else if(cal.hilitedMonth){Calendar.removeClass(cal.hilitedMonth,"hilite");}}else{var year=Calendar.findYear(target);if(year){if(year.year!=cal.date.getFullYear()){if(cal.hilitedYear){Calendar.removeClass(cal.hilitedYear,"hilite");}Calendar.addClass(year,"hilite");cal.hilitedYear=year;}else if(cal.hilitedYear){Calendar.removeClass(cal.hilitedYear,"hilite");}}}return Calendar.stopEvent(ev);};Calendar.tableMouseDown=function(ev){if(Calendar.getTargetElement(ev)==Calendar.getElement(ev)){return Calendar.stopEvent(ev);}};Calendar.calDragIt=function(ev){var cal=Calendar._C;if(!(cal&&cal.dragging)){return false;}var posX;var posY;if(Calendar.is_ie){posY=window.event.clientY+document.body.scrollTop;posX=window.event.clientX+document.body.scrollLeft;}else{posX=ev.pageX;posY=ev.pageY;}cal.hideShowCovered();var st=cal.element.style;st.left=(posX-cal.xOffs)+"px";st.top=(posY-cal.yOffs)+"px";return Calendar.stopEvent(ev);};Calendar.calDragEnd=function(ev){var cal=Calendar._C;if(!cal){return false;}cal.dragging=false;with(Calendar){removeEvent(document,"mousemove",calDragIt);removeEvent(document,"mouseover",stopEvent);removeEvent(document,"mouseup",calDragEnd);tableMouseUp(ev);}cal.hideShowCovered();};Calendar.dayMouseDown=function(ev){var el=Calendar.getElement(ev);if(el.disabled){return false;}var cal=el.calendar;cal.activeDiv=el;Calendar._C=cal;if(el.navtype!=300)with(Calendar){addClass(el,"hilite active");addEvent(document,"mouseover",tableMouseOver);addEvent(document,"mousemove",tableMouseOver);addEvent(document,"mouseup",tableMouseUp);}else if(cal.isPopup){cal._dragStart(ev);}if(el.navtype==-1||el.navtype==1){cal.timeout=setTimeout("Calendar.showMonthsCombo()",250);}else if(el.navtype==-2||el.navtype==2){cal.timeout=setTimeout((el.navtype>0)?"Calendar.showYearsCombo(true)":"Calendar.showYearsCombo(false)",250);}else{cal.timeout=null;}return Calendar.stopEvent(ev);};Calendar.dayMouseDblClick=function(ev){Calendar.cellClick(Calendar.getElement(ev));if(Calendar.is_ie){document.selection.empty();}};Calendar.dayMouseOver=function(ev){var el=Calendar.getElement(ev);if(Calendar.isRelated(el,ev)||Calendar._C||el.disabled){return false;}if(el.ttip){if(el.ttip.substr(0,1)=="_"){var date=null;with(el.calendar.date){date=new Date(getFullYear(),getMonth(),el.caldate);}el.ttip=date.print(el.calendar.ttDateFormat)+el.ttip.substr(1);}el.calendar.tooltips.firstChild.data=el.ttip;}if(el.navtype!=300){Calendar.addClass(el,"hilite");if(el.caldate){Calendar.addClass(el.parentNode,"rowhilite");}}return Calendar.stopEvent(ev);};Calendar.dayMouseOut=function(ev){with(Calendar){var el=getElement(ev);if(isRelated(el,ev)||_C||el.disabled){return false;}removeClass(el,"hilite");if(el.caldate){removeClass(el.parentNode,"rowhilite");}el.calendar.tooltips.firstChild.data=_TT["SEL_DATE"];return stopEvent(ev);}};Calendar.cellClick=function(el){var cal=el.calendar;var closing=false;var newdate=false;var date=null;if(typeof el.navtype=="undefined"){Calendar.removeClass(cal.currentDateEl,"selected");Calendar.addClass(el,"selected");closing=(cal.currentDateEl==el);if(!closing){cal.currentDateEl=el;}cal.date.setDate(el.caldate);date=cal.date;newdate=true;cal.dateClicked=true;}else{if(el.navtype==200){Calendar.removeClass(el,"hilite");cal.callCloseHandler();return;}date=(el.navtype==0)?new Date():new Date(cal.date);cal.dateClicked=(el.navtype==0);var year=date.getFullYear();var mon=date.getMonth();function setMonth(m){var day=date.getDate();var max=date.getMonthDays(m);if(day>max){date.setDate(max);}date.setMonth(m);};switch(el.navtype){case-2:if(year>cal.minYear){date.setFullYear(year-1);}break;case-1:if(mon>0){setMonth(mon-1);}else if(year-->cal.minYear){date.setFullYear(year);setMonth(11);}break;case 1:if(mon<11){setMonth(mon+1);}else if(year0;--i){cell=Calendar.createElement("td",row);cell.appendChild(document.createTextNode(""));if(!i){cell.navtype=100;cell.calendar=this;Calendar._add_evs(cell);}}this.firstdayname=(this.weekNumbers)?row.firstChild.nextSibling:row.firstChild;this._displayWeekdays();var tbody=Calendar.createElement("tbody",table);this.tbody=tbody;for(i=6;i>0;--i){row=Calendar.createElement("tr",tbody);if(this.weekNumbers){cell=Calendar.createElement("td",row);cell.appendChild(document.createTextNode(""));}for(var j=7;j>0;--j){cell=Calendar.createElement("td",row);cell.appendChild(document.createTextNode(""));cell.calendar=this;Calendar._add_evs(cell);}}var tfoot=Calendar.createElement("tfoot",table);row=Calendar.createElement("tr",tfoot);row.className="footrow";cell=hh(Calendar._TT["SEL_DATE"],this.weekNumbers?8:7,300);cell.className="ttip";if(this.isPopup){cell.ttip=Calendar._TT["DRAG_TO_MOVE"];cell.style.cursor="move";}this.tooltips=cell;div=Calendar.createElement("div",this.element);this.monthsCombo=div;div.className="combo";for(i=0;i0;--i){var yr=Calendar.createElement("div");yr.className="label";yr.appendChild(document.createTextNode(""));div.appendChild(yr);}this._init(this.mondayFirst,this.date);parent.appendChild(this.element);};Calendar._keyEvent=function(ev){if(!window.calendar){return false;}(Calendar.is_ie)&&(ev=window.event);var cal=window.calendar;var act=(Calendar.is_ie||ev.type=="keypress");if(ev.ctrlKey){switch(ev.keyCode){case 37:act&&Calendar.cellClick(cal._nav_pm);break;case 38:act&&Calendar.cellClick(cal._nav_py);break;case 39:act&&Calendar.cellClick(cal._nav_nm);break;case 40:act&&Calendar.cellClick(cal._nav_ny);break;default:return false;}}else switch(ev.keyCode){case 32:Calendar.cellClick(cal._nav_now);break;case 27:act&&cal.hide();break;case 37:case 38:case 39:case 40:if(act){var date=cal.date.getDate()-1;var el=cal.currentDateEl;var ne=null;var prev=(ev.keyCode==37)||(ev.keyCode==38);switch(ev.keyCode){case 37:(--date>=0)&&(ne=cal.ar_days[date]);break;case 38:date-=7;(date>=0)&&(ne=cal.ar_days[date]);break;case 39:(++datethis.maxYear){year=this.maxYear;date.setFullYear(year);}this.mondayFirst=mondayFirst;this.date=new Date(date);var month=date.getMonth();var mday=date.getDate();var no_days=date.getMonthDays();date.setDate(1);var wday=date.getDay();var MON=mondayFirst?1:0;var SAT=mondayFirst?5:6;var SUN=mondayFirst?6:0;if(mondayFirst){wday=(wday>0)?(wday-1):6;}var iday=1;var row=this.tbody.firstChild;var MN=Calendar._MN3[month];var hasToday=((today.getFullYear()==year)&&(today.getMonth()==month));var todayDate=today.getDate();var week_number=date.getWeekNumber();var ar_days=new Array();for(var i=0;i<6;++i){if(iday>no_days){row.className="emptyrow";row=row.nextSibling;continue;}var cell=row.firstChild;if(this.weekNumbers){cell.className="day wn";cell.firstChild.data=week_number;cell=cell.nextSibling;}++week_number;row.className="daysrow";for(var j=0;j<7;++j){cell.className="day";if((!i&&jno_days){cell.innerHTML=" ";cell.disabled=true;cell=cell.nextSibling;continue;}cell.disabled=false;cell.firstChild.data=iday;if(typeof this.checkDisabled=="function"){date.setDate(iday);if(this.checkDisabled(date)){cell.className+=" disabled";cell.disabled=true;}}if(!cell.disabled){ar_days[ar_days.length]=cell;cell.caldate=iday;cell.ttip="_";if(iday==mday){cell.className+=" selected";this.currentDateEl=cell;}if(hasToday&&(iday==todayDate)){cell.className+=" today";cell.ttip+=Calendar._TT["PART_TODAY"];}if(wday==SAT||wday==SUN){cell.className+=" weekend";}}++iday;((++wday)^ 7)||(wday=0);cell=cell.nextSibling;}row=row.nextSibling;}this.ar_days=ar_days;this.title.firstChild.data=Calendar._MN[month]+", "+year;};Calendar.prototype.setDate=function(date){if(!date.equalsTo(this.date)){this._init(this.mondayFirst,date);}};Calendar.prototype.refresh=function(){this._init(this.mondayFirst,this.date);};Calendar.prototype.setMondayFirst=function(mondayFirst){this._init(mondayFirst,this.date);this._displayWeekdays();};Calendar.prototype.setDisabledHandler=function(unaryFunction){this.checkDisabled=unaryFunction;};Calendar.prototype.setRange=function(a,z){this.minYear=a;this.maxYear=z;};Calendar.prototype.callHandler=function(){if(this.onSelected){this.onSelected(this,this.date.print(this.dateFormat));}};Calendar.prototype.callCloseHandler=function(){if(this.onClose){this.onClose(this);}this.hideShowCovered();};Calendar.prototype.destroy=function(){var el=this.element.parentNode;el.removeChild(this.element);Calendar._C=null;};Calendar.prototype.reparent=function(new_parent){var el=this.element;el.parentNode.removeChild(el);new_parent.appendChild(el);};Calendar._checkCalendar=function(ev){if(!window.calendar){return false;}var el=Calendar.is_ie?Calendar.getElement(ev):Calendar.getTargetElement(ev);for(;el!=null&&el!=calendar.element;el=el.parentNode);if(el==null){window.calendar.callCloseHandler();return Calendar.stopEvent(ev);}};Calendar.prototype.show=function(){var rows=this.table.getElementsByTagName("tr");for(var i=rows.length;i>0;){var row=rows[--i];Calendar.removeClass(row,"rowhilite");var cells=row.getElementsByTagName("td");for(var j=cells.length;j>0;){var cell=cells[--j];Calendar.removeClass(cell,"hilite");Calendar.removeClass(cell,"active");}}this.element.style.display="block";this.hidden=false;if(this.isPopup){window.calendar=this;Calendar.addEvent(document,"keydown",Calendar._keyEvent);Calendar.addEvent(document,"keypress",Calendar._keyEvent);Calendar.addEvent(document,"mousedown",Calendar._checkCalendar);}this.hideShowCovered();};Calendar.prototype.hide=function(){if(this.isPopup){Calendar.removeEvent(document,"keydown",Calendar._keyEvent);Calendar.removeEvent(document,"keypress",Calendar._keyEvent);Calendar.removeEvent(document,"mousedown",Calendar._checkCalendar);}this.element.style.display="none";this.hidden=true;this.hideShowCovered();};Calendar.prototype.showAt=function(x,y){var s=this.element.style;s.left=x+"px";s.top=y+"px";this.show();};Calendar.prototype.showAtElement=function(el,opts){var p=Calendar.getAbsolutePos(el);if(!opts||typeof opts!="string"){this.showAt(p.x,p.y+el.offsetHeight);return true;}this.show();var w=this.element.offsetWidth;var h=this.element.offsetHeight;this.hide();var valign=opts.substr(0,1);var halign="l";if(opts.length>1){halign=opts.substr(1,1);}switch(valign){case "T":p.y-=h;break;case "B":p.y+=el.offsetHeight;break;case "C":p.y+=(el.offsetHeight-h)/2;break;case "t":p.y+=el.offsetHeight-h;break;case "b":break;}switch(halign){case "L":p.x-=w;break;case "R":p.x+=el.offsetWidth;break;case "C":p.x+=(el.offsetWidth-w)/2;break;case "r":p.x+=el.offsetWidth-w;break;case "l":break;}this.showAt(p.x,p.y);};Calendar.prototype.setDateFormat=function(str){this.dateFormat=str;};Calendar.prototype.setTtDateFormat=function(str){this.ttDateFormat=str;};Calendar.prototype.parseDate=function(str,fmt){var y=0;var m=-1;var d=0;var a=str.split(/\W+/);if(!fmt){fmt=this.dateFormat;}var b=fmt.split(/\W+/);var i=0,j=0;for(i=0;i29)?1900:2000);}if(b[i]=="M"||b[i]=="MM"){for(j=0;j<12;++j){if(Calendar._MN[j].substr(0,a[i].length).toLowerCase()==a[i].toLowerCase()){m=j;break;}}}}if(y!=0&&m!=-1&&d!=0){this.setDate(new Date(y,m,d));return;}y=0;m=-1;d=0;for(i=0;i31&&y==0){y=parseInt(a[i],10);(y<100)&&(y+=(y>29)?1900:2000);}else if(d==0){d=a[i];}}if(y==0){var today=new Date();y=today.getFullYear();}if(m!=-1&&d!=0){this.setDate(new Date(y,m,d));}};Calendar.prototype.hideShowCovered=function(){function getStyleProp(obj,style){var value=obj.style[style];if(!value){if(document.defaultView&&typeof(document.defaultView.getComputedStyle)=="function"){value=document.defaultView.getComputedStyle(obj,"").getPropertyValue(style);}else if(obj.currentStyle){value=obj.currentStyle[style];}else{value=obj.style[style];}}return value;};var tags=new Array("applet","iframe","select");var el=this.element;var p=Calendar.getAbsolutePos(el);var EX1=p.x;var EX2=el.offsetWidth+EX1;var EY1=p.y;var EY2=el.offsetHeight+EY1;for(var k=tags.length;k>0;){var ar=document.getElementsByTagName(tags[--k]);var cc=null;for(var i=ar.length;i>0;){cc=ar[--i];p=Calendar.getAbsolutePos(cc);var CX1=p.x;var CX2=cc.offsetWidth+CX1;var CY1=p.y;var CY2=cc.offsetHeight+CY1;if(this.hidden||(CX1>EX2)||(CX2EY2)||(CY23)&&(day-=4)||(day+=3);return Math.round(((time/Date.DAY)+day)/7);};Date.prototype.equalsTo=function(date){return((this.getFullYear()==date.getFullYear())&&(this.getMonth()==date.getMonth())&&(this.getDate()==date.getDate()));};Date.prototype.print=function(frm){var str=new String(frm);var m=this.getMonth();var d=this.getDate();var y=this.getFullYear();var wn=this.getWeekNumber();var w=this.getDay();var s=new Array();s["d"]=d;s["dd"]=(d<10)?("0"+d):d;s["m"]=1+m;s["mm"]=(m<9)?("0"+(1+m)):(1+m);s["y"]=y;s["yy"]=new String(y).substr(2,2);s["w"]=wn;s["ww"]=(wn<10)?("0"+wn):wn;with(Calendar){s["D"]=_DN3[w];s["DD"]=_DN[w];s["M"]=_MN3[m];s["MM"]=_MN[m];}var re=/(.*)(\W|^)(d|dd|m|mm|y|yy|MM|M|DD|D|w|ww)(\W|$)(.*)/;while(re.exec(str)!=null){str=RegExp.$1+RegExp.$2+s[RegExp.$3]+RegExp.$4+RegExp.$5;}return str;};window.calendar=null; \ No newline at end of file diff --git a/phpgwapi/js/jscalendar/doc/html/reference-Z-S.css b/phpgwapi/js/jscalendar/doc/html/reference-Z-S.css new file mode 100644 index 0000000000..e69de29bb2 diff --git a/phpgwapi/js/jscalendar/doc/html/reference.css b/phpgwapi/js/jscalendar/doc/html/reference.css new file mode 100644 index 0000000000..42e9283536 --- /dev/null +++ b/phpgwapi/js/jscalendar/doc/html/reference.css @@ -0,0 +1,34 @@ +html { margin: 0px; padding: 0px; background-color: #08f; color: #444; font-family: georgia,serif; } +body { margin: 2em 8%; background-color: #fff; padding: 1em; border: 2px ridge #048; } + +a:link, a:visited { text-decoration: none; color: #00f; } +a:hover { color: #f00; text-decoration: underline; } +a:active { color: #f84; } + +h1, h2, h3, h4, h5, h6 { font-family: tahoma,verdana,sans-serif; } + +h2, h3 { font-weight: normal; } + +h1 a:hover, h2 a:hover, h3 a:hover, h4 a:hover, h5 a:hover, h6 a:hover { text-decoration: none; } + +h1 { font-size: 170%; border: 2px ridge #048; letter-spacing: 2px; color: #000; margin-left: -2em; margin-right: -2em; +background-color: #fff; padding: 2px 1em; background-color: #def; } +h2 { font-size: 140%; color: #222; } +h3 { font-size: 120%; color: #444; } + +h1.title { font-size: 300%; font-family: georgia,serif; font-weight: normal; color: #846; letter-spacing: -1px; +border: none; +padding: none; +background-color: #fff; +border-bottom: 3px double #624; padding-bottom: 2px; margin-left: 8%; margin-right: 8%; } + +.colophon { padding-top: 2em; color: #999; font-size: 90%; font-family: georgia,"times new roman",serif; } +.colophon a:link, .colophon a:visited { color: #755; } +.colophon a:hover { color: #422; text-decoration: underline; } + +.footnote { font-size: 90%; font-style: italic; font-family: georgia,"times new roman",serif; margin: 0px 3em; } +.footnote sup { font-size: 120%; padding: 0px 0.3em; position: relative; top: -0.2em; } + +.small { font-size: 90%; } + +.verbatim { background-color: #eee; padding: 0.2em 1em; border: 1px solid #aaa; } diff --git a/phpgwapi/js/jscalendar/doc/html/reference.html b/phpgwapi/js/jscalendar/doc/html/reference.html new file mode 100644 index 0000000000..944ef99ed1 --- /dev/null +++ b/phpgwapi/js/jscalendar/doc/html/reference.html @@ -0,0 +1,1124 @@ + + + + + +DHTML Calendar Widget + + + + + + +

+

+

+

+

+

+

+

+

+

+

+ + + +

+

+ + + +

+

+ + +

+

+ +

+



DHTML Calendar Widget

+

+
+Mihai Bazon, <mishoo@infoiasi.ro>

July 9, 2003

+

+

+calendar version: 0.9.3
+document version: 0.1 +
+

+
+

+

+

+
+
+ +“Though a program be but three lines of code, someday it will have to be +maintained.”
+— The Tao of Programming +
+ +
+ +

Contents

+

+    1  Overview
+        1.1  How does this thing work?
+        1.2  Project files
+        1.3  License
+

+

+    2  Quick startup
+        2.1  Installing a popup calendar
+        2.2  Installing a flat calendar
+        2.3  Calendar.setup in detail
+

+

+    3  The Calendar object overview
+        3.1  Creating a calendar
+        3.2  Order does matter ;-)
+        3.3  Caching the object
+        3.4  Callback functions
+

+

+    4  The Calendar object API reference
+        4.1  Calendar constructor
+        4.2  Useful member variables (properties)
+        4.3  Public methods
+            4.3.1  Calendar.create
+            4.3.2  Calendar.callHandler
+            4.3.3  Calendar.callCloseHandler
+            4.3.4  Calendar.hide
+            4.3.5  Calendar.setDateFormat
+            4.3.6  Calendar.setTtDateFormat
+            4.3.7  Calendar.setDisabledHandler
+            4.3.8  Calendar.show
+            4.3.9  Calendar.showAt
+            4.3.10  Calendar.showAtElement
+            4.3.11  Calendar.setDate
+            4.3.12  Calendar.setMondayFirst
+            4.3.13  Calendar.parseDate
+            4.3.14  Calendar.setRange
+

+

+    5  Side effects
+

+

+    6  Sponsors
+

+

+

+

+

+ +

1  Overview

The DHTML Calendar widget1 +is an (HTML) user interface element that gives end-users a friendly way to +input dates. It works in a web browser. The first versions only provided +support for popup calendars, while starting with version 0.9 it also supports +“flat” display. A “flat” calendar is a calendar that stays visible in the +page all the time. In this mode it could be very useful for “blog” pages and +other pages that require the calendar to be always present.

+

+The calendar is compatible with most popular browsers nowadays. While it’s +created using web standards and it should generally work with any compliant +browser, the following browsers were found to work: Mozilla (the main +development platform), Netscape 6.0 or better, all other Gecko-based browsers, +Internet Explorer 5.0 or better for Windows2, Opera 73.

+

+You can find the latest info and version at the calendar homepage:

+

+

+ +

+

+ +

1.1  How does this thing work?

DHTML is not “another kind of HTML”. It’s merely a naming convention. DHTML +refers to the combination of HTML, CSS, JavaScript and DOM. DOM (Document +Object Model) is a set of interfaces that glues the other three together. In +other words, DOM allows dynamic modification of an HTML page through a program. +JavaScript is our programming language, since that’s what browsers like. CSS +is a way to make it look good ;-).

+

+Using DOM calls, the program dynamically creates a <table> element +that contains a calendar for the given date and then inserts it in the document +body. Then it shows this table at a specified position. Usually the position +is related to some element in which the date needs to be displayed/entered, +such as an input field.

+

+By assigning a certain CSS class to the table we can control the look of the +calendar through an external CSS file; therefore, in order to change the +colors, backgrounds, rollover effects and other stuff, you can only change a +CSS file—modification of the program itself is not necessary.

+

+

+ +

1.2  Project files

Here’s a description of the project files, excluding documentation and example +files.

+

+

+

    +

    +
  • the main program file (calendar.js). This defines all the logic +behind the calendar widget.

    +

    +

    +
  • the CSS files (calendar-*.css). Loading one of them is +necessary in order to see the calendar as intended.

    +

    +

    +
  • the language definition files (lang/calendar-*.js). They are +plain JavaScript files that contain all texts that are displayed by the +calendar. Loading one of them is necessary.

    +

    +

    +
  • helper functions for quick setup of the calendar +(calendar-setup.js). You can do fine without it, but starting with +version 0.9.3 this is the recommended way to setup a calendar.

    +

    +

    +

+

+

+ +

1.3  License

+
+ +© Mihai Bazon, 2002 – 2003, <mishoo@infoiasi.ro>
+http://students.infoiasi.ro/~mishoo +
+

+The calendar is released under the +GNU Lesser General Public +License. This basically means that you are allowed to use it for anything you +like, except selling it for profit or claiming it’s authorship. You can read +the entire license text here.

+

+

+ +

2  Quick startup

+

+Installing the calendar used to be quite a task until version 0.9.3. Starting +with 0.9.3 I have included the file calendar-setup.js whose goal is to +assist you to setup a popup or flat calendar within minutes.

+

+First you have to include the needed scripts and style-sheet. Make sure you do +this in your document’s <head> section, also make sure you put the +correct paths to the scripts.

+

+

+
<style type="text/css">@import url(calendar-win2k-1.css)</style>
+<script type="text/javascript" src="calendar.js"></script>
+<script type="text/javascript" src="lang/calendar-en.js"></script>
+<script type="text/javascript" src="calendar-setup.js"></script>
+

+

+

+ +

2.1  Installing a popup calendar

+

+Now suppose you have the following HTML:

+

+

+
<form ...>
+  <input type="text" id="data" name="data" />
+  <button id="trigger">...</button>
+</form>
+

+

+You want the button to popup a calendar widget when clicked? Just +insert the following code immediately after the HTML form:

+

+

+
<script type="text/javascript">
+  Calendar.setup(
+    {
+      inputField  : "data",      // ID of the input field
+      ifFormat    : "M d, y",    // the date format
+      button      : "trigger"    // ID of the button
+    }
+  );
+</script>
+

+

+The Calendar.setup function, defined in calendar-setup.js +takes care of “patching” the button to display a calendar when clicked. The +calendar is by default in single-click mode and linked with the given input +field, so that when the end-user selects a date it will update the input field +with the date in the given format and close the calendar. If you are a +long-term user of the calendar you probably remember that for doing this you +needed to write a couple functions and add an “onclick” handler for the +button by hand.

+

+By looking at the example above we can see that the function +Calendar.setup receives only one parameter: a JavaScript object. +Further, that object can have lots of properties that tell to the setup +function how would we like to have the calendar. For instance, if we would +like a calendar that closes at double-click instead of single-click we would +also include the following: singleClick:false.

+

+For a list of all supported parameters please see the section +2.3.

+

+

+ +

2.2  Installing a flat calendar

+

+Here’s how to configure a flat calendar, using the same Calendar.setup +function. First, you should have an empty element with an ID. This element +will act as a container for the calendar. It can be any block-level element, +such as DIV, TABLE, etc. We will use a DIV in this example.

+

+

+
<div id="calendar-container"></div>
+

+

+Then there is the JavaScript code that sets up the calendar into the +“calendar-container” DIV. The code can occur anywhere in HTML +after the DIV element.

+

+

+
<script type="text/javascript">
+  function dateChanged(calendar) {
+    // Beware that this function is called even if the end-user only
+    // changed the month/year.  In order to determine if a date was
+    // clicked you can use the dateClicked property of the calendar:
+    if (calendar.dateClicked) {
+      // OK, a date was clicked, redirect to /yyyy/mm/dd/index.php
+      var y = calendar.date.getFullYear();
+      var m = calendar.date.getMonth();     // integer, 0..11
+      var d = calendar.date.getDate();      // integer, 1..31
+      // redirect...
+      window.location = "/" + y + "/" + m + "/" + d + "/index.php";
+    }
+  };
+
+  Calendar.setup(
+    {
+      flat         : "calendar-container", // ID of the parent element
+      flatCallback : dateChanged           // our callback function
+    }
+  );
+</script>
+

+

+

+ +

2.3  Calendar.setup in detail

+

+Following there is the complete list of properties interpreted by +Calendar.setup. All of them have default values, so you can pass only those +which you would like to customize. Anyway, you must pass at least one +of inputField, displayArea or button, for a popup +calendar, or flat for a flat calendar. Otherwise you will get a +warning message saying that there’s nothing to setup.

+

+

+ + + + + + + + + + + + + + +
property type description default +
inputField +string The ID of your input field. +null +
displayArea +string This is the ID of a <span>, <div>, or any other element that you would like to use to display the current date. This is generally useful only if the input field is hidden, as an area to display the date. +null +
button +string The ID of the calendar “trigger”. This is an element (ordinarily a button or an image) that will dispatch a certain event (usually “click”) to the function that creates and displays the calendar. +null +
eventName +string The name of the event that will trigger the calendar. The name should be without the “on” prefix, such as “click” instead of “onclick”. Virtually all users will want to let this have the default value (“click”). Anyway, it could be useful if, say, you want the calendar to appear when the input field is focused and have no trigger button (in this case use “focus” as the event name). +“click” +
ifFormat +string The format string that will be used to enter the date in the input field. This format will be honored even if the input field is hidden. +“y/mm/dd” +
daFormat +string Format of the date displayed in the displayArea (if specified). +“y/mm/dd” +
singleClick +boolean Wether the calendar is in “single-click mode” or “double-click mode”. If true (the default) the calendar will be created in single-click mode. +true +
disableFunc +function A function that receives a JS Date object. It should return +true if that date has to be disabled, false otherwise. +null +
mondayFirst +boolean If “true” then the calendar will display with Monday being the first day of week. +false +
weekNumbers +boolean If “true” then the calendar will display week numbers. +true +
align +string Alignment of the calendar, relative to the reference element. The +reference element is dynamically chosen like this: if a displayArea is +specified then it will be the reference element. Otherwise, the input field +is the reference element. For the meaning of the alignment characters +please section 4.3.10. +“Bl” +
range +array An array having exactly 2 elements, integers. (!) The first [0] element is the minimum year that is available, and the second [1] element is the maximum year that the calendar will allow. +[1900, 2999] +
flat +string If you want a flat calendar, pass the ID of the parent object in +this property. If not, pass null here (or nothing at all as +null is the default value. +null +
flatCallback +function You should provide this function if the calendar is flat. It +will be called when the date in the calendar is changed with a reference to +the calendar object. See section 2.2 for an example +of how to setup a flat calendar. +null + +
+ +

+

+ +

3  The Calendar object overview

+

+Basically you should be able to setup the calendar with the function presented +in the last section. However, if for some reason Calendar.setup +doesn’t provide all the functionality that you need and you want to tweak into +the process of creating and configuring the calendar “by hand”, then this +section is the way to go.

+

+The file calendar.js implements the functionality of the calendar. +All (well, almost all) functions and variables are embedded in the JavaScript +object “Calendar”.

+

+You can instantiate a Calendar object by calling the constructor, like +this: var cal = new Calendar(...). We will discuss the parameters +later. After creating the object, the variable cal will contain a +reference to it. You can use this reference to access further options of the +calendar, for instance:

+

+

+
cal.weekNumbers = false; // do not display week numbers
+cal.setDateFormat("y.mm.dd"); // set this format: 2003.12.31
+cal.setDisabledHandler(function(date) {
+  // verify date and return true if it has to be disabled
+  if (date.getFullYear() == 2004) {
+    // disable all dates from 2004
+    return false;
+  }
+});
+

+

+etc. Prior to version +0.9.3 this was the only way to configure it. The Calendar.setup +function, documented in section 2, basically does the same +things (actually more) in order to setup the calendar, based on the parameters +that you provided.

+

+

+ +

3.1  Creating a calendar

The calendar is created by following some steps (even the function +Calendar.setup, described in section 2, does the +same):

+

+

+

    +

    +
  1. Instantiate a Calendar object. Details about this in +section 4.1.

    +

    +

    +
  2. optional   Set the weekNumbers property to false if you don’t want +the calendar to display week numbers. This step must take place before +calling Calendar.create.

    +

    +

    +
  3. optional   Set the range of years available for selection (see section +4.3.14). The default range is [1970..2050].

    +

    +

    +
  4. optional   Set the disabledHandler property. You should pass +here a function that receives a JavaScript Date object and returns +true if the given date should be disabled, false otherwise (details in +section 4.3.7).

    +

    +

    +
  5. optional   Set a date format. Your handler function, passed to the +calendar constructor, will be called when a date is selected with a reference +to the calendar and a date string in this format.

    +

    +

    +
  6. Create the HTML elements related to the calendar. This step +practically puts the calendar in your HTML page. You simply call +Calendar.create(). You can give an optional parameter if you wanna +create a flat calendar (details in section 4.3.1).

    +

    +

    +
  7. optional   Initialize the calendar to a certain date, for instance from +the input field.

    +

    +

    +
  8. Show the calendar (details in section 4.3.8).

    +

    +

    +

+

+

+ +

3.2  Order does matter ;-)

As you could see in the previous section, there are more steps to be followed +in order to setup the calendar. This happens because there are two different +things that need to be accomplished: first there is the JavaScript object, that +is created with new Calendar(...). Secondly there are the HTML +elements that actually lets you see and manipulate the calendar.

+

+

+[ Those that did UI4 programming, no matter in what +language and on what platform, may be familiar with this concept. First there +is the object in memory that lets you manipulate the UI element, and secondly +there is the UI element (known as “control”, “window”, “widget”, etc.), +also in memory but you don’t usually access it directly. ] +

+By instantiating the calendar we create the JavaScript object. It lets us +configure some properties and it also knows how to create the UI element (the +HTML elements actually) that will eventually be what the end-user sees on +screen. Creation of the HTML element is accomplished by the function +Calendar.create. It knows how to create popup or flat calendars. +This function is described in section 4.3.1.

+

+Some properties need to be set prior to creating the HTML elements, because +otherwise they wouldn’t have any effect. Such a property is +weekNumbers—it has the default value “true”, and if you don’t +want the calendar to display the week numbers you have to set it to false. If, +however, you do that after calling Calendar.create the calendar +would still display the week numbers, because the HTML elements are already +created (including the <td>-s in the <table> element that +should contain the week numbers). For this reason the order of the steps above +is important.

+

+Another example is when you want to show the calendar. The “create” function +does create the HTML elements, but they are initially hidden (have the style +“display: none”) unless the calendar is a flat calendar that should be always +visible in the page. Obviously, the Calendar.show function should be +called after calling Calendar.create.

+

+

+ +

3.3  Caching the object

Suppose the end-user has popped up a calendar and selects a date. The calendar +then closes. What really happens now?

+

+There are two approaches. The first (used in very old versions of the +calendar) was to drop completely the Calendar object and when the end-user pops +up the calendar again to create another one. This approach is bad for more +reasons:

+

+

+

    +

    +
  • creating the JavaScript object and HTML elements is time-consuming

    +

    +

    +
  • we may loose some end-user preferences (i.e. he might prefer to have +Monday for the first day of week and probably already clicked it the first time +when the calendar was opened, but now he has to do it again)

    +

    +

    +

+

+The second approach, implemented by the Calendar.setup function, is to +cache the JavaScript object. It does this by checking the global variable +window.calendar and if it is not null it assumes it is the created +Calendar object. When the end-user closes the calendar, our code will only +call “hide” on it, therefore keeping the JavaScript object and the +HTML elements in place.

+

+

+ +

3.4  Callback functions

You might rightfully wonder how is the calendar related to the input field? +Who tells it that it has to update that input field when a date is +selected, or that it has to jump to that URL when a date is clicked in +flat mode?

+

+All this magic is done through callback functions. The calendar doesn’t know +anything about the existence of an input field, nor does it know where to +redirect the browser when a date is clicked in flat mode. It just calls your +callback when a particular event is happening, and you’re responsible to handle +it from there. For a general purpose library I think this is the best model of +making a truly reusable thing.

+

+The calendar supports the following user callbacks:

+

+

+

    +

    +
  • onSelect   — this gets called when the end-user changes the date in the +calendar. Documented in section 4.1.

    +

    +

    +
  • onClose   — this gets called when the calendar should close. It’s +user’s responsibility to close the calendar. Details in section +4.1.

    +

    +

    +
  • disabledHandler   — this function gets called for any day in a month, +just before displaying the month. It is called with a JavaScript Date +object and should return true if that date should be disabled +or false otherwise. Details in section 4.3.7.

    +

    +

    +

+

+

+ +

4  The Calendar object API reference

+

+

+ +

4.1  Calendar constructor

+

+Synopsis:

+

+

+
var calendar = Calendar(mondayFirst, date, onSelect, onClose);
+

+

+Parameters are as follows:

+

+

+

    +

    +
  • mondayFirst   — boolean, if it’s true the calendar will have +Monday as first day of week, if false weeks start on Sunday.

    +

    +

    +
  • date   — a JavaScript Date object or null. If null +is passed then the calendar will default to today date. Otherwise it will +initialize on the given date.

    +

    +

    +
  • onSelect   — your callback for the “onChange” event. See above.

    +

    +

    +
  • onClose   — your callback for the “onClose” event. See above.

    +

    +

    +

+

+

+ +

The onSelect event

+

+Here is a typical implementation of this function:

+

+

+
function onSelect(calendar, date) {
+  var input_field = document.getElementById("date");
+  input_field.value = date;
+};
+

+

+date is in the format selected with calendar.setDateFormat +(see section 4.3.5). This code simply updates the +input field. If you want the calendar to be in single-click mode then you +should also close the calendar after you updated the input field, so we come to +the following version:

+

+

+
function onSelect(calendar, date) {
+  var input_field = document.getElementById("date");
+  input_field.value = date;
+  if (calendar.dateClicked) {
+    calendar.callCloseHandler(); // this calls "onClose" (see above)
+  }
+};
+

+

+Note that we checked the member variable dateClicked and +only hide the calendar if it’s true. If this variable is false it +means that no date was actually selected, but the user only changed the +month/year using the navigation buttons or the menus. We don’t want to hide +the calendar in that case.

+

+

+ +

The onClose event

+

+This event is triggered when the calendar should close. It should hide or +destroy the calendar object—the calendar itself just triggers the event, but +it won’t close itself.

+

+A typical implementation of this function is the following:

+

+

+
function onClose(calendar) {
+  calendar.hide();
+  // or calendar.destroy();
+};
+

+

+

+ +

4.2  Useful member variables (properties)

+

+After creating the Calendar object you can access the following properties:

+

+

+

    +

    +
  • date — is a JavaScript Date object. It will always +reflect the date shown in the calendar (yes, even if the calendar is hidden).

    +

    +

    +
  • isPopup — if this is true then the current Calendar object is +a popup calendar. Otherwise (false) we have a flat calendar. This variable is +set from Calendar.create and has no meaning before this function was +called.

    +

    +

    +
  • dateClicked — particularly useful in the onSelect +handler, this variable tells us if a date was really clicked. That’s because +the onSelect handler is called even if the end-user only changed the +month/year but did not select a date. We don’t want to close the calendar in +that case.

    +

    +

    +
  • weekNumbers — if true (default) then the calendar +displays week numbers. If you don’t want week numbers you have to set this +variable to false before calling Calendar.create.

    +

    +

    +
  • mondayFirst — if true then the calendar uses Monday +as first day of week, otherwise Sunday. This variable is set from constructor, +but you still have a chance to modify it before calling +Calendar.create.

    +

    +

    +

+

+There are lots of other member variables, but one should access them only +through member functions so I won’t document them here.

+

+

+ +

4.3  Public methods

+ +

4.3.1  Calendar.create

+

+This function creates the afferent HTML elements that are needed to display the +calendar. You should call it after setting the calendar properties. Synopsis: +

+
calendar.create(); // creates a popup calendar
+  // -- or --
+calendar.create(document.getElementById(parent_id)); // makes a flat calendar
+

+

+It can create a popup calendar or a flat calendar. If the “parent” argument +is present (it should be a reference—not ID—to an HTML element) then +a flat calendar is created and it is inserted in the given element.

+

+At any moment, given a reference to a calendar object, we can inspect if it’s a +popup or a flat calendar by checking the boolean member variable +isPopup:

+

+

+
if (calendar.isPopup) {
+   // this is a popup calendar
+} else {
+   // this is a flat calendar
+}
+

+

+

+ +

4.3.2  Calendar.callHandler

+

+This function calls the first user callback (the +onSelect handler) with the required parameters.

+

+

+ +

4.3.3  Calendar.callCloseHandler

+

+This function calls the second user callback (the +onClose handler). It’s useful when you want to have a +“single-click” calendar—just call this in your onSelect handler, +if a date was clicked.

+

+

+ +

4.3.4  Calendar.hide

+

+Call this function to hide the calendar. The calendar object and HTML elements +will not be destroyed, thus you can later call one of the show +functions on the same element.

+

+

+ +

4.3.5  Calendar.setDateFormat

+

+This function configures the format in which the calendar reports the date to +your “onSelect” handler. Call it like this:

+

+

+
calendar.setDateFormat("y/mm/dd");
+

+

+As you can see, it receives only one parameter, the required format. The magic +characters are the following:

+

+

+ + + + + + + + + + + + + + +
d the date ( ex: 1 .. 31 )
dd the date, zero padded ( ex: 01 .. 31 )
m month as a number ( ex: 1 .. 12 )
mm month, zero padded ( ex: 01 .. 12 )
y 4 digit year ( ex: 1979 )
yy 2 digit year, yy - 1900 ( ex: 79 ) (USING THIS IS NOT RECOMMENDED)
w the number of the week in the year (1 or 2 digits)
ww the number of the week, zero padded (2 digits)
D short weekday name ( ex: Sun, Wed, Fri )
DD long weekday name ( ex: Sunday, Wednesday, Friday )
M short month name ( ex: Mar, Jan, Oct )
MM long month name ( ex: March, January, October )

+WARNING!    The format specifiers are likely to change. +The current is a complete mess, in that that, for instance, you can’t have a +format like this: “ymmdd”—you have to separate them through non-word +characters, like for example “y-mm-dd”. In next versions of calendar the +format will probably use a “%” prefix, like in strftime from +ANSI-C, so the format above will be possible to write like this: +“%y%mm%dd”.

+

+

+ +

4.3.6  Calendar.setTtDateFormat

+

+Has the same prototype as Calendar.setDateFormat, but refers to the +format of the date displayed in the “status bar” when the mouse is over some +date.

+

+

+ +

4.3.7  Calendar.setDisabledHandler

+

+This function allows you to specify a callback function that checks if a +certain date must be disabled by the calendar. You are responsible to write +the callback function. Synopsis:

+

+

+
function disallowDate(date) {
+  // date is a JS Date object
+  if (  date.getFullYear() == 2003 &&
+        date.getMonth()    == 6 /* July, it's zero-based */ &&
+        date.getDate()     == 5  ) {
+    return true; // disable July 5 2003
+  }
+  return false; // enable other dates
+};
+
+calendar.setDisabledHandler(disallowDate);
+

+

+If you change this function in “real-time”, meaning, without creating a new +calendar, then you have to call calendar.refresh() to make it +redisplay the month and take into account the new disabledHandler. +Calendar.setup does this, so you have no such trouble with it.

+

+Note that disallowDate should be very fast, as it is called for each +date in the month. Thus, it gets called, say, 30 times before displaying the +calendar, and 30 times when the month is changed. Tests I’ve done so far show +that it’s still good, but in the future I might switch it to a different design +(for instance, to call it once per month and to return an array of dates that +must be disabled).

+

+

+ +

4.3.8  Calendar.show

+

+Call this function do show the calendar. It basically sets the CSS “display” +property to “block”. It doesn’t modify the calendar position.

+

+This function only makes sense when the calendar is in popup mode.

+

+

+ +

4.3.9  Calendar.showAt

+

+Call this to show the calendar at a certain (x, y) position. Prototype:

+

+

+
calendar.showAt(x, y);
+

+

+The parameters are absolute coordinates relative to the top left +corner of the page, thus they are page coordinates not screen +coordinates.

+

+After setting the given coordinates it calls Calendar.show. This function only +makes sense when the calendar is in popup mode.

+

+

+ +

4.3.10  Calendar.showAtElement

+

+This function is useful if you want to display the calendar near some element. +You call it like this:

+

+

+
calendar.showAtElement(element, align);
+

+

+where element is a reference to your element (for instance it can be the input +field that displays the date) and align is an optional parameter, of type string, +containing one or two characters. For instance, if you pass "Br" as +align, the calendar will appear below the element and with its right +margin continuing the element’s right margin.

+

+As stated above, align may contain one or two characters. The first character +dictates the vertical alignment, relative to the element, and the second +character dictates the horizontal alignment. If the second character is +missing it will be assumed "l" (the left margin of the calendar will +be at the same horizontal position as the left margin of the element).

+

+The characters given for the align parameters are case sensitive. This +function only makes sense when the calendar is in popup mode. After computing +the position it uses Calendar.showAt to display the calendar there.

+

+

+ +

Vertical alignment

The first character in “align” can take one of the following values:

+

+

+

    +

    +
  • T — completely above the reference element (bottom margin of +the calendar aligned to the top margin of the element).

    +

    +

    +
  • t — above the element but may overlap it (bottom margin of the calendar aligned to +the bottom margin of the element).

    +

    +

    +
  • c — the calendar displays vertically centered to the reference +element. It might overlap it (that depends on the horizontal alignment).

    +

    +

    +
  • b — below the element but may overlap it (top margin of the calendar aligned to +the top margin of the element).

    +

    +

    +
  • B — completely below the element (top margin of the calendar +aligned to the bottom margin of the element).

    +

    +

    +

+

+

+ +

Horizontal alignment

The second character in “align” can take one of the following values:

+

+

+

    +

    +
  • L — completely to the left of the reference element (right +margin of the calendar aligned to the left margin of the element).

    +

    +

    +
  • l — to the left of the element but may overlap it (left margin +of the calendar aligned to the left margin of the element).

    +

    +

    +
  • c — horizontally centered to the element. Might overlap it, +depending on the vertical alignment.

    +

    +

    +
  • r — to the right of the element but may overlap it (right +margin of the calendar aligned to the right margin of the element).

    +

    +

    +
  • R — completely to the right of the element (left margin of the +calendar aligned to the right margin of the element).

    +

    +

    +

+

+

+ +

Default values

If the “align” parameter is missing the calendar will choose +“Bl”. This resembles the behavior of older versions (prior to +0.9.3) which did not support custom alignment.

+

+

+ +

4.3.11  Calendar.setDate

+

+Receives a JavaScript Date object. Sets the given date in the +calendar. If the calendar is visible the new date is displayed immediately.

+

+

+
calendar.setDate(new Date()); // go today
+

+

+

+ +

4.3.12  Calendar.setMondayFirst

+

+Changes the first day of week. If the parameter is true then Monday +will be the first day of week, otherwise Sunday.

+

+

+
calendar.setMondayFirst(false); // use Sunday
+

+

+

+ +

4.3.13  Calendar.parseDate

+

+Use this function to parse a date given as string and to move the calendar to +that date.

+

+The algorithm tries to parse the date according to the format that was +previously set with Calendar.setDateFormat; if that fails, it still +tries to get some valid date out of it (it doesn’t read your thoughts, though).

+

+

+
calendar.parseDate("2003/07/06");
+

+

+

+ +

4.3.14  Calendar.setRange

+

+Sets the range of years that are allowed in the calendar. Synopsis:

+

+

+
calendar.setRange(1970, 2050);
+

+

+

+ +

5  Side effects

The calendar code was intentionally embedded in an object to make it have as +less as possible side effects. However, there are some—not harmful, after +all. Here is a list of side effects; you can count they already happened after +calendar.js was loaded.

+

+

+

    +

    +
  1. The global variable window.calendar will be set to null. This +variable is used by the calendar code, especially when doing drag & drop for +moving the calendar. In the future I might get rid of it, but for now it +didn’t harm anyone.

    +

    +

    +
  2. The JavaScript Date object is modified. We add some properties +and functions that are very useful to our calendar. It made more sense to add +them directly to the Date object than to the calendar itself. +Complete list:

    +

    +

    +

      +

      +
    1. Date._MD = new Array(31,28,31,30,31,30,31,31,30,31,30,31); +

      +
    2. Date.SECOND = 1000 /* milliseconds */; +

      +
    3. Date.MINUTE = 60 * Date.SECOND; +

      +
    4. Date.HOUR = 60 * Date.MINUTE; +

      +
    5. Date.DAY = 24 * Date.HOUR; +

      +
    6. Date.WEEK = 7 * Date.DAY;

      +

      +

      +
    7. Date.prototype.getMonthDays(month) — returns the number of days +of the given month, or of the current date object if no month was given.

      +

      +

      +
    8. Date.prototype.getWeekNumber() — returns the week number of the +date in the current object.

      +

      +

      +
    9. Date.prototype.equalsTo(other_date) — compare the current date +object with other_date and returns true if the dates are +equal. It ignores time.

      +

      +

      +
    10. Date.prototype.print(format) — returns a string with the +current date object represented in the given format. It implements the format +specified in section 4.3.5.

      +

      +

      +

    +

    +

    +

+

+

+ +

6  Sponsors

The following people either sponsored, donated money to the project or bought +developer licenses (listed in reverse chronological order). Your name could be here +too! If you wish to sponsor the project (for instance request a feature and +pay me for implementing it) or donate some money please +please contact me at mishoo@infoiasi.ro.

+

+

+

+

+

+
+ +Thank you!
+— mishoo@infoiasi.ro +
+

+

+

+

1 +by the term “widget” I understand a single element of user interface. +But that’s in Linux world. For those that did lots of Windows +programming the term “control” might be more familiar +

+

2 people report that the calendar does +not work with IE5/Mac. I don’t have access to a Macintosh, +therefore—sorry—I can’t fix it.

+

3 under Opera 7 the calendar still lacks some functionality, such as +keyboard navigation; also Opera doesn’t seem to allow disabling text +selection when one drags the mouse on the page; despite all that, the +calendar is still highly functional under Opera 7 and looks as good as +in other supported browsers.

+

4 user interface

+
+
+Last modified: Mon, July 7, 2003, 5:18 pm
+HTML conversion by TeX2page 4r8f
+
+ + diff --git a/phpgwapi/js/jscalendar/doc/reference.pdf b/phpgwapi/js/jscalendar/doc/reference.pdf new file mode 100644 index 0000000000000000000000000000000000000000..544db53ded259c6a0802a878afc828f9dc9769d0 GIT binary patch literal 198470 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 z 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

K(vA2j4 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 literal 0 HcmV?d00001 diff --git a/phpgwapi/js/jscalendar/img.gif b/phpgwapi/js/jscalendar/img.gif new file mode 100644 index 0000000000000000000000000000000000000000..e15a4a4445482677100bdebe0c8b5d621c14f438 GIT binary patch literal 145 zcmZ?wbhEHb6k-r!Sj5J_z|e5uzySv1ng9R)KXc{`kPl=4NyVQmj0_BH3_3tIP^Az9 z19Mo$t~>8ky_gRetG4r`;<20bf&ea313?Kh<{UyJ%Ls@}L6JL%-jsWo{X3=Gx)=N>w3 literal 0 HcmV?d00001 diff --git a/phpgwapi/js/jscalendar/lang/calendar-br.js b/phpgwapi/js/jscalendar/lang/calendar-br.js new file mode 100644 index 0000000000..d7db4b46ef --- /dev/null +++ b/phpgwapi/js/jscalendar/lang/calendar-br.js @@ -0,0 +1,45 @@ +// ** I18N +Calendar._DN = new Array +("Domingo", + "Segunda", + "Tera", + "Quarta", + "Quinta", + "Sexta", + "Sbado", + "Domingo"); +Calendar._MN = new Array +("Janeiro", + "Fevereiro", + "Maro", + "Abril", + "Maio", + "Junho", + "Julho", + "Agosto", + "Setembro", + "Outubro", + "Novembro", + "Dezembro"); + +// tooltips +Calendar._TT = {}; +Calendar._TT["TOGGLE"] = "Altera primeiro dia da semana"; +Calendar._TT["PREV_YEAR"] = "Ano anterior(hold for menu)"; +Calendar._TT["PREV_MONTH"] = "Ms anterior (hold for menu)"; +Calendar._TT["GO_TODAY"] = "Hoje"; +Calendar._TT["NEXT_MONTH"] = "Ms seguinte (hold for menu)"; +Calendar._TT["NEXT_YEAR"] = "ano seguinte (hold for menu)"; +Calendar._TT["SEL_DATE"] = "Seleciona uma data"; +Calendar._TT["DRAG_TO_MOVE"] = "Arrasta calendrio"; +Calendar._TT["PART_TODAY"] = " (hoje)"; +Calendar._TT["MON_FIRST"] = "Inicia na segunda-feira"; +Calendar._TT["SUN_FIRST"] = "Inicia no domingo"; +Calendar._TT["CLOSE"] = "Fechar"; +Calendar._TT["TODAY"] = "Hoje"; + +// date formats +Calendar._TT["DEF_DATE_FORMAT"] = "dd-mm-y"; +Calendar._TT["TT_DATE_FORMAT"] = "DD, dd de MM de y"; + +Calendar._TT["WK"] = "sem"; diff --git a/phpgwapi/js/jscalendar/lang/calendar-ca.js b/phpgwapi/js/jscalendar/lang/calendar-ca.js new file mode 100644 index 0000000000..3498d7659d --- /dev/null +++ b/phpgwapi/js/jscalendar/lang/calendar-ca.js @@ -0,0 +1,45 @@ +// ** I18N +Calendar._DN = new Array +("Diumenge", + "Dilluns", + "Dimarts", + "Dimecres", + "Dijous", + "Divendres", + "Dissabte", + "Diumenge"); +Calendar._MN = new Array +("Gener", + "Febrer", + "Mar", + "Abril", + "Maig", + "Juny", + "Juliol", + "Agost", + "Setembre", + "Octubre", + "Novembre", + "Desembre"); + +// tooltips +Calendar._TT = {}; +Calendar._TT["TOGGLE"] = "Canvia el primer dia de la setmana"; +Calendar._TT["PREV_YEAR"] = "Any anterior (mantenir per a menu)"; +Calendar._TT["PREV_MONTH"] = "Mes anterior (mantenir per a menu)"; +Calendar._TT["GO_TODAY"] = "Anar a avui"; +Calendar._TT["NEXT_MONTH"] = "Mes segent (mantenir per a menu)"; +Calendar._TT["NEXT_YEAR"] = "Any segent (mantenir per a menu)"; +Calendar._TT["SEL_DATE"] = "Seleccionar data"; +Calendar._TT["DRAG_TO_MOVE"] = "Arrastrar per a moure"; +Calendar._TT["PART_TODAY"] = " (avui)"; +Calendar._TT["MON_FIRST"] = "Mostrar dilluns primer"; +Calendar._TT["SUN_FIRST"] = "Mostrar diumenge primer"; +Calendar._TT["CLOSE"] = "Tancar"; +Calendar._TT["TODAY"] = "Avui"; + +// date formats +Calendar._TT["DEF_DATE_FORMAT"] = "dd-mm-yy"; +Calendar._TT["TT_DATE_FORMAT"] = "D, M d"; + +Calendar._TT["WK"] = "sem"; diff --git a/phpgwapi/js/jscalendar/lang/calendar-cs-win.js b/phpgwapi/js/jscalendar/lang/calendar-cs-win.js new file mode 100644 index 0000000000..b34213f50a --- /dev/null +++ b/phpgwapi/js/jscalendar/lang/calendar-cs-win.js @@ -0,0 +1,34 @@ +/* + calendar-cs-win.js + language: Czech + encoding: windows-1250 + author: Lubos Jerabek (xnet@seznam.cz) +*/ + +// ** I18N +Calendar._DN = new Array('Nedle','Pondl','ter','Steda','tvrtek','Ptek','Sobota','Nedle'); +Calendar._DN3 = new Array('Ne','Po','t','St','t','P','So','Ne'); +Calendar._MN = new Array('Leden','nor','Bezen','Duben','Kvten','erven','ervenec','Srpen','Z','jen','Listopad','Prosinec'); +Calendar._MN3 = new Array('Led','no','Be','Dub','Kv','rv','vc','Srp','Z','j','Lis','Pro'); + +// tooltips +Calendar._TT = {}; +Calendar._TT["TOGGLE"] = "Zmna prvnho dne v tdnu"; +Calendar._TT["PREV_YEAR"] = "Pedchoz rok (pidr pro menu)"; +Calendar._TT["PREV_MONTH"] = "Pedchoz msc (pidr pro menu)"; +Calendar._TT["GO_TODAY"] = "Dnen datum"; +Calendar._TT["NEXT_MONTH"] = "Dal msc (pidr pro menu)"; +Calendar._TT["NEXT_YEAR"] = "Dal rok (pidr pro menu)"; +Calendar._TT["SEL_DATE"] = "Vyber datum"; +Calendar._TT["DRAG_TO_MOVE"] = "Chy a thni, pro pesun"; +Calendar._TT["PART_TODAY"] = " (dnes)"; +Calendar._TT["MON_FIRST"] = "Uka jako prvn Pondl"; +Calendar._TT["SUN_FIRST"] = "Uka jako prvn Nedli"; +Calendar._TT["CLOSE"] = "Zavt"; +Calendar._TT["TODAY"] = "Dnes"; + +// date formats +Calendar._TT["DEF_DATE_FORMAT"] = "d.m.yy"; +Calendar._TT["TT_DATE_FORMAT"] = "DD, 5.MM y"; + +Calendar._TT["WK"] = "wk"; diff --git a/phpgwapi/js/jscalendar/lang/calendar-da.js b/phpgwapi/js/jscalendar/lang/calendar-da.js new file mode 100644 index 0000000000..f0fff7e748 --- /dev/null +++ b/phpgwapi/js/jscalendar/lang/calendar-da.js @@ -0,0 +1,45 @@ +// ** I18N +Calendar._DN = new Array +("Sndag", + "Mandag", + "Tirsdag", + "Onsdag", + "Torsdag", + "Fredag", + "Lrdag", + "Sndag"); +Calendar._MN = new Array +("January", + "Februar", + "Marts", + "April", + "Maj", + "Juni", + "Juli", + "August", + "September", + "Oktober", + "November", + "December"); + +// tooltips +Calendar._TT = {}; +Calendar._TT["TOGGLE"] = "Skift frste ugedag"; +Calendar._TT["PREV_YEAR"] = "t r tilbage (hold for menu)"; +Calendar._TT["PREV_MONTH"] = "n mned tilbage (hold for menu)"; +Calendar._TT["GO_TODAY"] = "G til i dag"; +Calendar._TT["NEXT_MONTH"] = "n mned frem (hold for menu)"; +Calendar._TT["NEXT_YEAR"] = "t r frem (hold for menu)"; +Calendar._TT["SEL_DATE"] = "Vlg dag"; +Calendar._TT["DRAG_TO_MOVE"] = "Trk vinduet"; +Calendar._TT["PART_TODAY"] = " (i dag)"; +Calendar._TT["MON_FIRST"] = "Vis mandag frst"; +Calendar._TT["SUN_FIRST"] = "Vis sndag frst"; +Calendar._TT["CLOSE"] = "Luk vinduet"; +Calendar._TT["TODAY"] = "I dag"; + +// date formats +Calendar._TT["DEF_DATE_FORMAT"] = "y-mm-dd"; +Calendar._TT["TT_DATE_FORMAT"] = "D d. M, y"; + +Calendar._TT["WK"] = "wk"; diff --git a/phpgwapi/js/jscalendar/lang/calendar-du.js b/phpgwapi/js/jscalendar/lang/calendar-du.js new file mode 100644 index 0000000000..2200448051 --- /dev/null +++ b/phpgwapi/js/jscalendar/lang/calendar-du.js @@ -0,0 +1,45 @@ +// ** I18N +Calendar._DN = new Array +("Zondag", + "Maandag", + "Dinsdag", + "Woensdag", + "Donderdag", + "Vrijdag", + "Zaterdag", + "Zondag"); +Calendar._MN = new Array +("Januari", + "Februari", + "Maart", + "April", + "Mei", + "Juni", + "Juli", + "Augustus", + "September", + "Oktober", + "November", + "December"); + +// tooltips +Calendar._TT = {}; +Calendar._TT["TOGGLE"] = "Toggle startdag van de week"; +Calendar._TT["PREV_YEAR"] = "Vorig jaar (indrukken voor menu)"; +Calendar._TT["PREV_MONTH"] = "Vorige month (indrukken voor menu)"; +Calendar._TT["GO_TODAY"] = "Naar Vandaag"; +Calendar._TT["NEXT_MONTH"] = "Volgende Maand (indrukken voor menu)"; +Calendar._TT["NEXT_YEAR"] = "Volgend jaar (indrukken voor menu)"; +Calendar._TT["SEL_DATE"] = "Selecteer datum"; +Calendar._TT["DRAG_TO_MOVE"] = "Sleep om te verplaatsen"; +Calendar._TT["PART_TODAY"] = " (vandaag)"; +Calendar._TT["MON_FIRST"] = "Toon Maandag eerst"; +Calendar._TT["SUN_FIRST"] = "Toon Zondag eerst"; +Calendar._TT["CLOSE"] = "Sluiten"; +Calendar._TT["TODAY"] = "Vandaag"; + +// date formats +Calendar._TT["DEF_DATE_FORMAT"] = "y-mm-dd"; +Calendar._TT["TT_DATE_FORMAT"] = "D, M d"; + +Calendar._TT["WK"] = "wk"; diff --git a/phpgwapi/js/jscalendar/lang/calendar-el.js b/phpgwapi/js/jscalendar/lang/calendar-el.js new file mode 100644 index 0000000000..eeeb40b9bd --- /dev/null +++ b/phpgwapi/js/jscalendar/lang/calendar-el.js @@ -0,0 +1,45 @@ +// ** 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"] = "dd-mm-y"; +Calendar._TT["TT_DATE_FORMAT"] = "D, d M"; + +Calendar._TT["WK"] = "wk"; diff --git a/phpgwapi/js/jscalendar/lang/calendar-en.js b/phpgwapi/js/jscalendar/lang/calendar-en.js new file mode 100644 index 0000000000..bc075bb74b --- /dev/null +++ b/phpgwapi/js/jscalendar/lang/calendar-en.js @@ -0,0 +1,45 @@ +// ** I18N +Calendar._DN = new Array +("Sunday", + "Monday", + "Tuesday", + "Wednesday", + "Thursday", + "Friday", + "Saturday", + "Sunday"); +Calendar._MN = new Array +("January", + "February", + "March", + "April", + "May", + "June", + "July", + "August", + "September", + "October", + "November", + "December"); + +// tooltips +Calendar._TT = {}; +Calendar._TT["TOGGLE"] = "Toggle first day of week"; +Calendar._TT["PREV_YEAR"] = "Prev. year (hold for menu)"; +Calendar._TT["PREV_MONTH"] = "Prev. month (hold for menu)"; +Calendar._TT["GO_TODAY"] = "Go Today"; +Calendar._TT["NEXT_MONTH"] = "Next month (hold for menu)"; +Calendar._TT["NEXT_YEAR"] = "Next year (hold for menu)"; +Calendar._TT["SEL_DATE"] = "Select date"; +Calendar._TT["DRAG_TO_MOVE"] = "Drag to move"; +Calendar._TT["PART_TODAY"] = " (today)"; +Calendar._TT["MON_FIRST"] = "Display Monday first"; +Calendar._TT["SUN_FIRST"] = "Display Sunday first"; +Calendar._TT["CLOSE"] = "Close"; +Calendar._TT["TODAY"] = "Today"; + +// date formats +Calendar._TT["DEF_DATE_FORMAT"] = "y-mm-dd"; +Calendar._TT["TT_DATE_FORMAT"] = "D, M d"; + +Calendar._TT["WK"] = "wk"; diff --git a/phpgwapi/js/jscalendar/lang/calendar-es.js b/phpgwapi/js/jscalendar/lang/calendar-es.js new file mode 100644 index 0000000000..1aafa4b8ca --- /dev/null +++ b/phpgwapi/js/jscalendar/lang/calendar-es.js @@ -0,0 +1,45 @@ +// ** I18N +Calendar._DN = new Array +("Domingo", + "Lunes", + "Martes", + "Mircoles", + "Jueves", + "Viernes", + "Sbado", + "Domingo"); +Calendar._MN = new Array +("Enero", + "Febrero", + "Marzo", + "Abril", + "Mayo", + "Junio", + "Julio", + "Agosto", + "Septiembre", + "Octubre", + "Noviembre", + "Diciembre"); + +// tooltips +Calendar._TT = {}; +Calendar._TT["TOGGLE"] = "Cambia el primer da de la semana"; +Calendar._TT["PREV_YEAR"] = "Ao anterior (mantener para menu)"; +Calendar._TT["PREV_MONTH"] = "Mes anterior (mantener para menu)"; +Calendar._TT["GO_TODAY"] = "Ir a hoy"; +Calendar._TT["NEXT_MONTH"] = "Mes siguiente (mantener para menu)"; +Calendar._TT["NEXT_YEAR"] = "Ao siguiente (mantener para menu)"; +Calendar._TT["SEL_DATE"] = "Seleccionar fecha"; +Calendar._TT["DRAG_TO_MOVE"] = "Arrastrar para mover"; +Calendar._TT["PART_TODAY"] = " (hoy)"; +Calendar._TT["MON_FIRST"] = "Mostrar lunes primero"; +Calendar._TT["SUN_FIRST"] = "Mostrar domingo primero"; +Calendar._TT["CLOSE"] = "Cerrar"; +Calendar._TT["TODAY"] = "Hoy"; + +// date formats +Calendar._TT["DEF_DATE_FORMAT"] = "dd-mm-yy"; +Calendar._TT["TT_DATE_FORMAT"] = "D, M d"; + +Calendar._TT["WK"] = "sem"; diff --git a/phpgwapi/js/jscalendar/lang/calendar-fr.js b/phpgwapi/js/jscalendar/lang/calendar-fr.js new file mode 100644 index 0000000000..aa15d50435 --- /dev/null +++ b/phpgwapi/js/jscalendar/lang/calendar-fr.js @@ -0,0 +1,45 @@ +// ** I18N +Calendar._DN = new Array +("Dimanche", + "Lundi", + "Mardi", + "Mercredi", + "Jeudi", + "Vendredi", + "Samedi", + "Dimanche"); +Calendar._MN = new Array +("Janvier", + "Fvrier", + "Mars", + "Avril", + "Mai", + "Juin", + "Juillet", + "Aot", + "Septembre", + "Octobre", + "Novembre", + "Dcembre"); + +// tooltips +Calendar._TT = {}; +Calendar._TT["TOGGLE"] = "Changer le premier jour de la semaine"; +Calendar._TT["PREV_YEAR"] = "Anne prc. (maintenir pour menu)"; +Calendar._TT["PREV_MONTH"] = "Mois prc. (maintenir pour menu)"; +Calendar._TT["GO_TODAY"] = "Atteindre date du jour"; +Calendar._TT["NEXT_MONTH"] = "Mois suiv. (maintenir pour menu)"; +Calendar._TT["NEXT_YEAR"] = "Anne suiv. (maintenir pour menu)"; +Calendar._TT["SEL_DATE"] = "Choisir une date"; +Calendar._TT["DRAG_TO_MOVE"] = "Dplacer"; +Calendar._TT["PART_TODAY"] = " (Aujourd'hui)"; +Calendar._TT["MON_FIRST"] = "Commencer par lundi"; +Calendar._TT["SUN_FIRST"] = "Commencer par dimanche"; +Calendar._TT["CLOSE"] = "Fermer"; +Calendar._TT["TODAY"] = "Aujourd'hui"; + +// date formats +Calendar._TT["DEF_DATE_FORMAT"] = "y-mm-dd"; +Calendar._TT["TT_DATE_FORMAT"] = "D, M d"; + +Calendar._TT["WK"] = "wk"; diff --git a/phpgwapi/js/jscalendar/lang/calendar-hr-utf8.js b/phpgwapi/js/jscalendar/lang/calendar-hr-utf8.js new file mode 100644 index 0000000000..baf01b179c --- /dev/null +++ b/phpgwapi/js/jscalendar/lang/calendar-hr-utf8.js @@ -0,0 +1,49 @@ +/* Croatian language file for the DHTML Calendar version 0.9.2 +* Author Krunoslav Zubrinic , June 2003. +* 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. +*/ +Calendar._DN = new Array +("Nedjelja", + "Ponedjeljak", + "Utorak", + "Srijeda", + "Četvrtak", + "Petak", + "Subota", + "Nedjelja"); +Calendar._MN = new Array +("Siječanj", + "Veljača", + "Ožujak", + "Travanj", + "Svibanj", + "Lipanj", + "Srpanj", + "Kolovoz", + "Rujan", + "Listopad", + "Studeni", + "Prosinac"); + +// tooltips +Calendar._TT = {}; +Calendar._TT["TOGGLE"] = "Promjeni dan s kojim počinje tjedan"; +Calendar._TT["PREV_YEAR"] = "Prethodna godina (dugi pritisak za meni)"; +Calendar._TT["PREV_MONTH"] = "Prethodni mjesec (dugi pritisak za meni)"; +Calendar._TT["GO_TODAY"] = "Idi na tekući dan"; +Calendar._TT["NEXT_MONTH"] = "Slijedeći mjesec (dugi pritisak za meni)"; +Calendar._TT["NEXT_YEAR"] = "Slijedeća godina (dugi pritisak za meni)"; +Calendar._TT["SEL_DATE"] = "Izaberite datum"; +Calendar._TT["DRAG_TO_MOVE"] = "Pritisni i povuci za promjenu pozicije"; +Calendar._TT["PART_TODAY"] = " (today)"; +Calendar._TT["MON_FIRST"] = "Prikaži ponedjeljak kao prvi dan"; +Calendar._TT["SUN_FIRST"] = "Prikaži nedjelju kao prvi dan"; +Calendar._TT["CLOSE"] = "Zatvori"; +Calendar._TT["TODAY"] = "Danas"; + +// date formats +Calendar._TT["DEF_DATE_FORMAT"] = "dd-mm-y"; +Calendar._TT["TT_DATE_FORMAT"] = "DD, dd.mm.y"; + +Calendar._TT["WK"] = "Tje"; \ No newline at end of file diff --git a/phpgwapi/js/jscalendar/lang/calendar-hr.js b/phpgwapi/js/jscalendar/lang/calendar-hr.js new file mode 100644 index 0000000000000000000000000000000000000000..be9a021bed0f12c1b0bfb44a7e0e369dccc37640 GIT binary patch literal 3088 zcmcJR>rWF=5XFa2Cd5Bt!zVOa41O{`VnYRyLL0ZBXbdT|;?id*tpTHdy81hFyKT1* zQlnD%n@~&)4Fn2u487deB5&D4j#uVJ9c1)jEh+Gc*4FN+P3$_Vv4Ek zIW>oQ7rm98b}65#`)@kG=cDm8<36LBqZgY(shnE$bt)09&?;6yI+$!-_MD&af2Gai`x47*-?MIOSk&2Z!GDwgDl-p!EuvQji*`<~H!>E7 zU=-de=RUbJW-f8BLNmE?ccspr0qa*YyUN6xosFGoF_rZ+i~OEFUC71$5?sVX%&RM^ zw~Gw!qY*<|oy@3YKUVtAU6zB2^D+SSw6ECpe>!JHI_l1u7oYRy_h4Td8}Pfypn3~y zI?r}yR{nc1*>P{R%v#KRpR<;RlFUk(=&F0wc@^!gS<1AkVS`5+?eIvm%AmLK94g#O zL6hI?`z_}syN^VwSjl#HiuQ`pr{P{{Q6kXpXc~u9t9!EM{6yT%>Ib$WTc_V=P8hqOPMo72XdBGj&_>`4 ztlz`;VhyL9j1ld_&H)^~z7>-q2c~p8oiY0Nn07#N;-^)BqvH&oU1vkLkaE?n)_{>a zoJo3W%Vd23`|pWx!dq=#)-mc!@0|M3`~S{*jA@=WrV%Oo|E-M}mWqD&=iw?_GrO*~ zQ}_=mR5hp$RQIi=lvhCgd8#p-bU2BlsVJ(imH=q*tI>-L1|#aoG!+eaJOv#X(lhp4^9|MdvLysxM9wpFWdsZdXg fJr}Uim!Bf!JVI_Ff^xhq$~)Tw&G`LR8R`Ew-{ITh literal 0 HcmV?d00001 diff --git a/phpgwapi/js/jscalendar/lang/calendar-hu.js b/phpgwapi/js/jscalendar/lang/calendar-hu.js new file mode 100644 index 0000000000..b4fa8378e6 --- /dev/null +++ b/phpgwapi/js/jscalendar/lang/calendar-hu.js @@ -0,0 +1,45 @@ +// ** I18N +Calendar._DN = new Array +("Vasrnap", + "Htf", + "Kedd", + "Szerda", + "Cstrtk", + "Pntek", + "Szombat", + "Vasrnap"); +Calendar._MN = new Array +("janur", + "februr", + "mrcius", + "prilis", + "mjus", + "jnius", + "jlius", + "augusztus", + "szeptember", + "oktber", + "november", + "december"); + +// tooltips +Calendar._TT = {}; +Calendar._TT["TOGGLE"] = "Toggle first day of week"; +Calendar._TT["PREV_YEAR"] = "Elz v (hold for menu)"; +Calendar._TT["PREV_MONTH"] = "Elz hnap (hold for menu)"; +Calendar._TT["GO_TODAY"] = "Mai napra ugrs"; +Calendar._TT["NEXT_MONTH"] = "Kv. hnap (hold for menu)"; +Calendar._TT["NEXT_YEAR"] = "Kv. v (hold for menu)"; +Calendar._TT["SEL_DATE"] = "Vlasszon dtumot"; +Calendar._TT["DRAG_TO_MOVE"] = "Drag to move"; +Calendar._TT["PART_TODAY"] = " (ma)"; +Calendar._TT["MON_FIRST"] = "Htf legyen a ht els napja"; +Calendar._TT["SUN_FIRST"] = "Vasrnap legyen a ht els napja"; +Calendar._TT["CLOSE"] = "Bezr"; +Calendar._TT["TODAY"] = "Ma"; + +// date formats +Calendar._TT["DEF_DATE_FORMAT"] = "y-mm-dd"; +Calendar._TT["TT_DATE_FORMAT"] = "M d, D"; + +Calendar._TT["WK"] = "ht"; diff --git a/phpgwapi/js/jscalendar/lang/calendar-it.js b/phpgwapi/js/jscalendar/lang/calendar-it.js new file mode 100644 index 0000000000..05a37cd0be --- /dev/null +++ b/phpgwapi/js/jscalendar/lang/calendar-it.js @@ -0,0 +1,45 @@ +// ** I18N +Calendar._DN = new Array +("Domenica", + "Luned", + "Marted", + "Mercoled", + "Gioved", + "Venerd", + "Sabato", + "Domenica"); +Calendar._MN = new Array +("Gennaio", + "Febbraio", + "Marzo", + "Aprile", + "Maggio", + "Giugno", + "Luglio", + "Agosto", + "Settembre", + "Ottobre", + "Novembre", + "Dicembre"); + +// tooltips +Calendar._TT = {}; +Calendar._TT["TOGGLE"] = "Modifica il primo giorno della settimana"; +Calendar._TT["PREV_YEAR"] = "Anno prec. (tieni premuto per menu)"; +Calendar._TT["PREV_MONTH"] = "Mese prec. (tieni premuto per menu)"; +Calendar._TT["GO_TODAY"] = "Vai a oggi"; +Calendar._TT["NEXT_MONTH"] = "Mese succ. (tieni premuto per menu)"; +Calendar._TT["NEXT_YEAR"] = "Anno succ. (tieni premuto per menu)"; +Calendar._TT["SEL_DATE"] = "Seleziona data"; +Calendar._TT["DRAG_TO_MOVE"] = "Trascina per spostare"; +Calendar._TT["PART_TODAY"] = " (oggi)"; +Calendar._TT["MON_FIRST"] = "Parti da luned"; +Calendar._TT["SUN_FIRST"] = "Parti da domenica"; +Calendar._TT["CLOSE"] = "Chiudi"; +Calendar._TT["TODAY"] = "Oggi"; + +// date formats +Calendar._TT["DEF_DATE_FORMAT"] = "y-mm-dd"; +Calendar._TT["TT_DATE_FORMAT"] = "D, M d"; + +Calendar._TT["WK"] = "wk"; diff --git a/phpgwapi/js/jscalendar/lang/calendar-nl.js b/phpgwapi/js/jscalendar/lang/calendar-nl.js new file mode 100644 index 0000000000..2ddc68be40 --- /dev/null +++ b/phpgwapi/js/jscalendar/lang/calendar-nl.js @@ -0,0 +1,45 @@ +// ** I18N +Calendar._DN = new Array +("Zondag", + "Maandag", + "Dinsdag", + "Woensdag", + "Donderdag", + "Vrijdag", + "Zaterdag", + "Zondag"); +Calendar._MN = new Array +("Januari", + "Februari", + "Maart", + "April", + "Mei", + "Juni", + "Juli", + "Augustus", + "September", + "Oktober", + "November", + "December"); + +// tooltips +Calendar._TT = {}; +Calendar._TT["TOGGLE"] = "Selecteer de eerste week-dag"; +Calendar._TT["PREV_YEAR"] = "Vorig jaar (ingedrukt voor menu)"; +Calendar._TT["PREV_MONTH"] = "Vorige maand (ingedrukt voor menu)"; +Calendar._TT["GO_TODAY"] = "Ga naar Vandaag"; +Calendar._TT["NEXT_MONTH"] = "Volgende maand (ingedrukt voor menu)"; +Calendar._TT["NEXT_YEAR"] = "Volgend jaar (ingedrukt voor menu)"; +Calendar._TT["SEL_DATE"] = "Selecteer datum"; +Calendar._TT["DRAG_TO_MOVE"] = "Klik en sleep om te verplaatsen"; +Calendar._TT["PART_TODAY"] = " (vandaag)"; +Calendar._TT["MON_FIRST"] = "Toon Maandag eerst"; +Calendar._TT["SUN_FIRST"] = "Toon Zondag eerst"; +Calendar._TT["CLOSE"] = "Sluiten"; +Calendar._TT["TODAY"] = "Vandaag"; + +// date formats +Calendar._TT["DEF_DATE_FORMAT"] = "dd-mm-y"; +Calendar._TT["TT_DATE_FORMAT"] = "DD, d MM"; + +Calendar._TT["WK"] = "wk"; diff --git a/phpgwapi/js/jscalendar/lang/calendar-no.js b/phpgwapi/js/jscalendar/lang/calendar-no.js new file mode 100644 index 0000000000..3325e34a4f --- /dev/null +++ b/phpgwapi/js/jscalendar/lang/calendar-no.js @@ -0,0 +1,45 @@ +// ** I18N +Calendar._DN = new Array +("Sndag", + "Mandag", + "Tirsdag", + "Onsdag", + "Torsdag", + "Fredag", + "Lrdag", + "Sndag"); +Calendar._MN = new Array +("Januar", + "Februar", + "Mars", + "April", + "Mai", + "Juni", + "Juli", + "August", + "September", + "Oktober", + "November", + "Desember"); + +// tooltips +Calendar._TT = {}; +Calendar._TT["TOGGLE"] = "Skift frste ukedag"; +Calendar._TT["PREV_YEAR"] = "Et r tilbake (hold for meny)"; +Calendar._TT["PREV_MONTH"] = "En mned tilbake (hold for meny)"; +Calendar._TT["GO_TODAY"] = "G til i dag"; +Calendar._TT["NEXT_MONTH"] = "En mned fram (hold for meny)"; +Calendar._TT["NEXT_YEAR"] = "Et r fram (hold for meny)"; +Calendar._TT["SEL_DATE"] = "Velg dag"; +Calendar._TT["DRAG_TO_MOVE"] = "Dra vinduet"; +Calendar._TT["PART_TODAY"] = " (i dag)"; +Calendar._TT["MON_FIRST"] = "Vis mandag frst"; +Calendar._TT["SUN_FIRST"] = "Vis sndag frst"; +Calendar._TT["CLOSE"] = "Lukk vinduet"; +Calendar._TT["TODAY"] = "I dag"; + +// date formats +Calendar._TT["DEF_DATE_FORMAT"] = "y-mm-dd"; +Calendar._TT["TT_DATE_FORMAT"] = "D d. M, y"; + +Calendar._TT["WK"] = "wk"; diff --git a/phpgwapi/js/jscalendar/lang/calendar-pl.js b/phpgwapi/js/jscalendar/lang/calendar-pl.js new file mode 100644 index 0000000000..c1ef76929c --- /dev/null +++ b/phpgwapi/js/jscalendar/lang/calendar-pl.js @@ -0,0 +1,46 @@ +// Polish| dariush pietrzak, eyck@ghost.anime.pl +// ** I18N +Calendar._DN = new Array +("Niedziela", + "Poniedziaek", + "Wtorek", + "roda", + "Czwartek", + "Pitek", + "Sobota", + "Niedziela"); +Calendar._MN = new Array +("Stycze", + "Luty", + "Marzec", + "Kwiecie", + "Maj", + "Czerwiec", + "Lipiec", + "Sierpie", + "Wrzesie", + "Padziernik", + "Listopad", + "Grudzie"); + +// tooltips +Calendar._TT = {}; +Calendar._TT["TOGGLE"] = "Zmie pierwszy dzie tygodnia"; +Calendar._TT["PREV_YEAR"] = "Poprzedni rok (przytrzymaj dla menu)"; +Calendar._TT["PREV_MONTH"] = "Poprzedni miesic (przytrzymaj dla menu)"; +Calendar._TT["GO_TODAY"] = "Id do dzisiaj"; +Calendar._TT["NEXT_MONTH"] = "Nastpny miesic (przytrzymaj dla menu)"; +Calendar._TT["NEXT_YEAR"] = "Nastpny rok (przytrzymaj dla menu)"; +Calendar._TT["SEL_DATE"] = "Wybierz dat"; +Calendar._TT["DRAG_TO_MOVE"] = "Przecignij by przesun"; +Calendar._TT["PART_TODAY"] = " (dzisiaj)"; +Calendar._TT["MON_FIRST"] = "Wywietl poniedziaek jako pierwszy"; +Calendar._TT["SUN_FIRST"] = "Wywietl niedziel jako pierwsz"; +Calendar._TT["CLOSE"] = "Zamknij"; +Calendar._TT["TODAY"] = "Dzisiaj"; + +// date formats +Calendar._TT["DEF_DATE_FORMAT"] = "y-mm-dd"; +Calendar._TT["TT_DATE_FORMAT"] = "D, M d"; + +Calendar._TT["WK"] = "wk"; diff --git a/phpgwapi/js/jscalendar/lang/calendar-pt.js b/phpgwapi/js/jscalendar/lang/calendar-pt.js new file mode 100644 index 0000000000..1184dfa6d6 --- /dev/null +++ b/phpgwapi/js/jscalendar/lang/calendar-pt.js @@ -0,0 +1,45 @@ +// ** I18N +Calendar._DN = new Array +("Domingo", + "Segunda", + "Tera", + "Quarta", + "Quinta", + "Sexta", + "Sbado", + "Domingo"); +Calendar._MN = new Array +("Janeiro", + "Fevereiro", + "Maro", + "Abril", + "Maio", + "Junho", + "Julho", + "Agosto", + "Setembro", + "Outubro", + "Novembro", + "Dezembro"); + +// tooltips +Calendar._TT = {}; +Calendar._TT["TOGGLE"] = "Trocar o primeiro dia da semana"; +Calendar._TT["PREV_YEAR"] = "Ano Anterior (mantenha para menu)"; +Calendar._TT["PREV_MONTH"] = "Ms Anterior (mantenha para menu)"; +Calendar._TT["GO_TODAY"] = "Ir para hoje"; +Calendar._TT["NEXT_MONTH"] = "Prximo Ms (mantenha para menu)"; +Calendar._TT["NEXT_YEAR"] = "Prximo Ano (mantenha para menu)"; +Calendar._TT["SEL_DATE"] = "Escolha Data"; +Calendar._TT["DRAG_TO_MOVE"] = "Arraste para mover"; +Calendar._TT["PART_TODAY"] = " (hoje)"; +Calendar._TT["MON_FIRST"] = "Mostrar Segunda primeiro"; +Calendar._TT["SUN_FIRST"] = "Mostrar Domingo primeiro"; +Calendar._TT["CLOSE"] = "Fechar"; +Calendar._TT["TODAY"] = "Hoje"; + +// date formats +Calendar._TT["DEF_DATE_FORMAT"] = "a-mm-dd"; +Calendar._TT["TT_DATE_FORMAT"] = "D, M d"; + +Calendar._TT["WK"] = "sm"; diff --git a/phpgwapi/js/jscalendar/lang/calendar-ro.js b/phpgwapi/js/jscalendar/lang/calendar-ro.js new file mode 100644 index 0000000000..e125fa9a96 --- /dev/null +++ b/phpgwapi/js/jscalendar/lang/calendar-ro.js @@ -0,0 +1,45 @@ +// ** I18N +Calendar._DN = new Array +("Duminic", + "Luni", + "Mari", + "Miercuri", + "Joi", + "Vineri", + "Smbt", + "Duminic"); +Calendar._MN = new Array +("Ianuarie", + "Februarie", + "Martie", + "Aprilie", + "Mai", + "Iunie", + "Iulie", + "August", + "Septembrie", + "Octombrie", + "Noiembrie", + "Decembrie"); + +// tooltips +Calendar._TT = {}; +Calendar._TT["TOGGLE"] = "Schimb prima zi din sptmn"; +Calendar._TT["PREV_YEAR"] = "Anul precedent (lung pt menu)"; +Calendar._TT["PREV_MONTH"] = "Luna precedent (lung pt menu)"; +Calendar._TT["GO_TODAY"] = "Data de azi"; +Calendar._TT["NEXT_MONTH"] = "Luna urmtoare (lung pt menu)"; +Calendar._TT["NEXT_YEAR"] = "Anul urmtor (lung pt menu)"; +Calendar._TT["SEL_DATE"] = "Selecteaz data"; +Calendar._TT["DRAG_TO_MOVE"] = "Trage pentru a mica"; +Calendar._TT["PART_TODAY"] = " (astzi)"; +Calendar._TT["MON_FIRST"] = "Prima zi -> Luni"; +Calendar._TT["SUN_FIRST"] = "Prima zi -> Duminic"; +Calendar._TT["CLOSE"] = "nchide"; +Calendar._TT["TODAY"] = "Astzi"; + +// date formats +Calendar._TT["DEF_DATE_FORMAT"] = "dd-mm-y"; +Calendar._TT["TT_DATE_FORMAT"] = "D, d M"; + +Calendar._TT["WK"] = "wk"; diff --git a/phpgwapi/js/jscalendar/lang/calendar-ru.js b/phpgwapi/js/jscalendar/lang/calendar-ru.js new file mode 100644 index 0000000000..459cec5792 --- /dev/null +++ b/phpgwapi/js/jscalendar/lang/calendar-ru.js @@ -0,0 +1,45 @@ +// ** 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"] = "y-mm-dd"; +Calendar._TT["TT_DATE_FORMAT"] = "D, M d"; + +Calendar._TT["WK"] = ""; diff --git a/phpgwapi/js/jscalendar/lang/calendar-sp.js b/phpgwapi/js/jscalendar/lang/calendar-sp.js new file mode 100644 index 0000000000..14a356d372 --- /dev/null +++ b/phpgwapi/js/jscalendar/lang/calendar-sp.js @@ -0,0 +1,45 @@ +// ** I18N +Calendar._DN = new Array +("Domingo", + "Lunes", + "Martes", + "Miercoles", + "Jueves", + "Viernes", + "Sabado", + "Domingo"); +Calendar._MN = new Array +("Enero", + "Febrero", + "Marzo", + "Abril", + "Mayo", + "Junio", + "Julio", + "Augosto", + "Septiembre", + "Octubrer", + "Noviembre", + "Diciembre"); + +// tooltips +Calendar._TT = {}; +Calendar._TT["TOGGLE"] = "Primer dia de la semana"; +Calendar._TT["PREV_YEAR"] = "Ao anterior (Presione para menu)"; +Calendar._TT["PREV_MONTH"] = "Mes Anterior (Presione para menu)"; +Calendar._TT["GO_TODAY"] = "Ir a Hoy"; +Calendar._TT["NEXT_MONTH"] = "Mes Siguiente (Presione para menu)"; +Calendar._TT["NEXT_YEAR"] = "Ao Siguiente (Presione para menu)"; +Calendar._TT["SEL_DATE"] = "Seleccione fecha"; +Calendar._TT["DRAG_TO_MOVE"] = "Arrastre y mueva"; +Calendar._TT["PART_TODAY"] = " (Hoy)"; +Calendar._TT["MON_FIRST"] = "Lunes Primero"; +Calendar._TT["SUN_FIRST"] = "Domingo Primero"; +Calendar._TT["CLOSE"] = "Cerrar"; +Calendar._TT["TODAY"] = "Hoy"; + +// date formats +Calendar._TT["DEF_DATE_FORMAT"] = "dd-mm-yy"; +Calendar._TT["TT_DATE_FORMAT"] = "D, d M"; + +Calendar._TT["WK"] = "Smn"; diff --git a/phpgwapi/js/jscalendar/lang/calendar-sw.js b/phpgwapi/js/jscalendar/lang/calendar-sw.js new file mode 100644 index 0000000000..cdd31e8d80 --- /dev/null +++ b/phpgwapi/js/jscalendar/lang/calendar-sw.js @@ -0,0 +1,45 @@ +// ** I18N +Calendar._DN = new Array +("Sndag", + "Mndag", + "Tisdag", + "Onsdag", + "Torsdag", + "Fredag", + "Lrdag", + "Sndag"); +Calendar._MN = new Array +("Januari", + "Februari", + "Mars", + "April", + "Maj", + "Juni", + "Juli", + "Augusti", + "September", + "Oktober", + "November", + "December"); + +// tooltips +Calendar._TT = {}; +Calendar._TT["TOGGLE"] = "Skifta frsta veckodag"; +Calendar._TT["PREV_YEAR"] = "Frra ret (tryck fr meny)"; +Calendar._TT["PREV_MONTH"] = "Frra mnaden (tryck fr meny)"; +Calendar._TT["GO_TODAY"] = "G till dagens datum"; +Calendar._TT["NEXT_MONTH"] = "Nsta mnad (tryck fr meny)"; +Calendar._TT["NEXT_YEAR"] = "Nsta r (tryck fr meny)"; +Calendar._TT["SEL_DATE"] = "Vlj dag"; +Calendar._TT["DRAG_TO_MOVE"] = "Flytta fnstret"; +Calendar._TT["PART_TODAY"] = " (idag)"; +Calendar._TT["MON_FIRST"] = "Visa Mndag frst"; +Calendar._TT["SUN_FIRST"] = "Visa Sndag frst"; +Calendar._TT["CLOSE"] = "Stng fnstret"; +Calendar._TT["TODAY"] = "Idag"; + +// date formats +Calendar._TT["DEF_DATE_FORMAT"] = "y-mm-dd"; +Calendar._TT["TT_DATE_FORMAT"] = "DD, d MM y"; + +Calendar._TT["WK"] = "wk"; diff --git a/phpgwapi/js/jscalendar/lang/calendar-tr.js b/phpgwapi/js/jscalendar/lang/calendar-tr.js new file mode 100644 index 0000000000..f2c906c46c --- /dev/null +++ b/phpgwapi/js/jscalendar/lang/calendar-tr.js @@ -0,0 +1,58 @@ +////////////////////////////////////////////////////////////////////////////////////////////// +// Turkish Translation by Nuri AKMAN +// Location: Ankara/TURKEY +// e-mail : nuriakman@hotmail.com +// Date : April, 9 2003 +// +// Note: if Turkish Characters does not shown on you screen +// please include falowing line your html code: +// +// +// +////////////////////////////////////////////////////////////////////////////////////////////// + +// ** I18N +Calendar._DN = new Array +("Pazar", + "Pazartesi", + "Sal", + "aramba", + "Perembe", + "Cuma", + "Cumartesi", + "Pazar"); +Calendar._MN = new Array +("Ocak", + "ubat", + "Mart", + "Nisan", + "Mays", + "Haziran", + "Temmuz", + "Austos", + "Eyll", + "Ekim", + "Kasm", + "Aralk"); + +// tooltips +Calendar._TT = {}; +Calendar._TT["TOGGLE"] = "Haftann ilk gnn kaydr"; +Calendar._TT["PREV_YEAR"] = "nceki Yl (Men iin basl tutunuz)"; +Calendar._TT["PREV_MONTH"] = "nceki Ay (Men iin basl tutunuz)"; +Calendar._TT["GO_TODAY"] = "Bugn'e git"; +Calendar._TT["NEXT_MONTH"] = "Sonraki Ay (Men iin basl tutunuz)"; +Calendar._TT["NEXT_YEAR"] = "Sonraki Yl (Men iin basl tutunuz)"; +Calendar._TT["SEL_DATE"] = "Tarih seiniz"; +Calendar._TT["DRAG_TO_MOVE"] = "Tamak iin srkleyiniz"; +Calendar._TT["PART_TODAY"] = " (bugn)"; +Calendar._TT["MON_FIRST"] = "Takvim Pazartesi gnnden balasn"; +Calendar._TT["SUN_FIRST"] = "Takvim Pazar gnnden balasn"; +Calendar._TT["CLOSE"] = "Kapat"; +Calendar._TT["TODAY"] = "Bugn"; + +// date formats +Calendar._TT["DEF_DATE_FORMAT"] = "dd-mm-y"; +Calendar._TT["TT_DATE_FORMAT"] = "d MM y, DD"; + +Calendar._TT["WK"] = "Hafta"; diff --git a/phpgwapi/js/jscalendar/lang/calendar-zh.js b/phpgwapi/js/jscalendar/lang/calendar-zh.js new file mode 100644 index 0000000000..4549c2aac0 --- /dev/null +++ b/phpgwapi/js/jscalendar/lang/calendar-zh.js @@ -0,0 +1,45 @@ +// ** Translated by ATang ** 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"] = "y-mm-dd"; +Calendar._TT["TT_DATE_FORMAT"] = "D, M d"; + +Calendar._TT["WK"] = ""; diff --git a/phpgwapi/js/jscalendar/release-notes.html b/phpgwapi/js/jscalendar/release-notes.html new file mode 100644 index 0000000000..efb3fa2ecd --- /dev/null +++ b/phpgwapi/js/jscalendar/release-notes.html @@ -0,0 +1,80 @@ + + + + jscalendar-0.9.3 release notes + + + +

jscalendar-0.9.3 release notes

+ +

This release compiled at Wednesday, 9 Jul 2003 (00:39).

+ +

New stuff

+ +
    + +
  • Opera 7 compatibility — keyboard navigation is + still not available; text selection can't be disabled, leading to an + ugly effect when walking through the month/year menus.
  • + +
  • Ability to align the calendar relative to the input field (or any + other element). Vertical: top, center, bottom. Horizontal: left, + center, right. This is established as a new parameter for + showAtElement.
  • + +
  • Added dateClicked property (boolean). This can be + inspected in the "onSelect" handler to determine if a date was + really clicked or the user only changed month/year using the menus. + You need to check this for "single-click" calendars and + only close/hide the calendar if it's true.
  • + +
  • Full documentation in HTML + and PDF format is now available in the + distribution archive.
  • + +
  • New language definition files: HU, HR, PT, ZH. Thanks those who + submitted!
  • + +
+ +

Bug status

+ +

This covers only those bugs that have been reported at SourceForge.

+ +
    + +
  1. #703,238 — fixed
  2. +
  3. #703,814 — fixed
  4. +
  5. #716,777 — closed (was fixed already in 0.9.2-1)
  6. +
  7. #723,335 — fixed
  8. +
  9. #715,122 — feature request; implemented.
  10. +
  11. #721,206 — fixed (added "refresh()" function)
  12. +
  13. #721,833 — fixed (bug concerning the "yy" format + parsing)
  14. +
  15. #721,833 — won't fix (we won't set the time to + midnight; time might actually be useful when we implement support + for time selection). + +
+ +
+
Mihai Bazon
+ + +Last modified on Tue Jul 8 21:52:23 2003 + + + + + + diff --git a/phpgwapi/js/jscalendar/simple-1.html b/phpgwapi/js/jscalendar/simple-1.html new file mode 100644 index 0000000000..779f3f9dec --- /dev/null +++ b/phpgwapi/js/jscalendar/simple-1.html @@ -0,0 +1,212 @@ + + + + +Simple calendar setups [popup calendar] + + + + + + + + + + + + + + + + + +

DHTML Calendar — for the impatient

+ +
+

+ This page lists some common setups for the popup calendar. In + order to see how to do any of them please see the source of this + page. For each example it's structured like this: there's the + <form> that contains the input field, and following there is + the JavaScript snippet that setups that form. An example of + flat calendar is available in another page. +

+

+ The code in this page uses a helper function defined in + "calendar-setup.js". With it you can setup the calendar in + minutes. If you're not that impatient, ;-) complete documenation is + available. +

+
+ + + +
+ +

Basic setup: one input field only. Clicking in the input field +activates the calendar. Default date format is "y/mm/dd". The calendar +defaults to "single-click mode".

+ +

Note: for some reason this example works +only with Mozilla. It seems that IE and Opera can't set the onclick handler +correctly for the input field.

+ +
+ +
+ + + + + +
+ +

Input field with a trigger button. Clicking the button activates +the calendar. Note that this one needs double-click (singleClick parameter +is explicitely set to false).

+ +
+ +
+ + + + + +
+ +

Input field with a trigger image. Note that the Calendar.setup +function doesn't care if the trigger is a button, image, or anything else. +Also in this example we setup a different alignment, just to show how it's +done. The input field is read-only (that is set from HTML).

+ +
+ + + +
+
+ + + + + +
+ +

Hidden field, display area. The calendar now puts the date into 2 +elements: one is an input field of type "hidden"—so that the user +can't directly see or modify it— and one is a <span> element in +which the date is displayed. Note that if the trigger is not specified the +calendar will use the displayArea (or inputField as in the first example). +The display area can have it's own format. This is useful if, for instance, +we need to store one format in the database (thus pass it in the input +field) but we wanna show a friendlier format to the end-user.

+ +
+ +
+ +

Your birthday: + Click to open date selector.

+ + + + + +
+ +

Hidden field, display area, trigger image. Very similar to the +previous example. The difference is that we also have a trigger image.

+ +
+ +
+ +

Your birthday: -- not entered -- .

+ + + + + +
+ +

Hidden field, display area. Very much like the previous examples, +but we now disable some dates (all weekends, that is, Saturdays and +Sundays).

+ +
+ +
+ +

Your birthday: + Click to open date selector.

+ + + + + + diff --git a/phpgwapi/js/jscalendar/simple-2.html b/phpgwapi/js/jscalendar/simple-2.html new file mode 100644 index 0000000000..8c41504f85 --- /dev/null +++ b/phpgwapi/js/jscalendar/simple-2.html @@ -0,0 +1,107 @@ + + + + +Simple calendar setup [flat calendar] + + + + + + + + + + + + + + + + + +

DHTML Calendar — for the impatient

+ +
+

+ This page demonstrates how to setup a flat calendar. Examples of + popup calendars are available in another page. +

+

+ The code in this page uses a helper function defined in + "calendar-setup.js". With it you can setup the calendar in + minutes. If you're not that impatient, ;-) complete documenation is + available. +

+
+ + + +
+ +
+ + + +

The positioning of the DIV that contains the calendar is entirely your +job. For instance, the "calendar-container" DIV from this page has the +following style: "float: right; margin-left: 1em; margin-bottom: 1em".

+ +

Following there is the code that has been used to create this calendar. +You can find the full description of the Calendar.setup() function +in the calendar documenation.

+ +
<div style="float: right; margin-left: 1em; margin-bottom: 1em;"
+id="calendar-container"></div>
+
+<script type="text/javascript">
+  function dateChanged(calendar) {
+    // Beware that this function is called even if the end-user only
+    // changed the month/year.  In order to determine if a date was
+    // clicked you can use the dateClicked property of the calendar:
+    if (calendar.dateClicked) {
+      // OK, a date was clicked, redirect to /yyyy/mm/dd/index.php
+      var y = calendar.date.getFullYear();
+      var m = calendar.date.getMonth();     // integer, 0..11
+      var d = calendar.date.getDate();      // integer, 1..31
+      // redirect...
+      window.location = "/" + y + "/" + m + "/" + d + "/index.php";
+    }
+  };
+
+  Calendar.setup(
+    {
+      flat         : "calendar-container", // ID of the parent element
+      flatCallback : dateChanged           // our callback function
+    }
+  );
+</script>
+ + +