Revision a56327d7
Von Moritz Bunkus vor etwa 12 Jahren hinzugefügt
SL/Form.pm | ||
---|---|---|
jquery.multiselect2side frame_header/header
|
||
ui-lightness/jquery-ui
|
||
jquery-ui.custom
|
||
js/jscalendar/calendar-win2k-1
|
||
);
|
||
|
||
$layout->use_javascript("$_.js") for qw(
|
||
jquery common jscalendar/calendar jscalendar/lang/calendar-de
|
||
jscalendar/calendar-setup part_selection jquery-ui jquery.cookie jqModal jquery.checkall
|
||
switchmenuframe
|
||
);
|
||
$layout->use_javascript("$_.js") for (qw(
|
||
jquery jquery-ui jquery.cookie jqModal jquery.checkall
|
||
common part_selection switchmenuframe
|
||
), "jquery/ui/i18n/jquery.ui.datepicker-$::myconfig{countrycode}");
|
||
|
||
$self->{favicon} ||= "favicon.ico";
|
||
$self->{titlebar} = join ' - ', grep $_, $self->{title}, $self->{login}, $::myconfig{dbname}, $self->{version} if $self->{title} || !$self->{titlebar};
|
SL/Layout/MenuLeft.pm | ||
---|---|---|
|
||
sub javascripts_inline {
|
||
my $self = shift;
|
||
$self->SUPER::javascripts_inline;
|
||
my $sections = [ section_menu($self->menu) ];
|
||
$self->render('menu/menu', { output => 0 },
|
||
sections => $sections,
|
SL/Layout/None.pm | ||
---|---|---|
use strict;
|
||
use parent qw(SL::Layout::Base);
|
||
|
||
use List::MoreUtils qw(apply);
|
||
|
||
sub javascripts_inline {
|
||
_setup_formats(),
|
||
_setup_focus(),
|
||
... | ... | |
}
|
||
|
||
sub _setup_formats {
|
||
$::form->parse_html_template('layout/javascript_setup')
|
||
my $datefmt = apply {
|
||
s/d+/dd/gi;
|
||
s/m+/mm/gi;
|
||
s/y+/yy/gi;
|
||
} $::myconfig{dateformat};
|
||
|
||
$::form->parse_html_template('layout/javascript_setup', { datefmt => $datefmt });
|
||
}
|
||
|
||
sub _setup_focus {
|
SL/Template/Plugin/L.pm | ||
---|---|---|
return $code;
|
||
}
|
||
|
||
my $date_tag_id_idx = 0;
|
||
sub date_tag {
|
||
my ($self, $name, $value, @slurp) = @_;
|
||
|
||
my %params = _hashify(@slurp);
|
||
my $name_e = _H($name);
|
||
my $seq = _tag_id();
|
||
my $datefmt = apply {
|
||
s/d+/\%d/gi;
|
||
s/m+/\%m/gi;
|
||
s/y+/\%Y/gi;
|
||
} $::myconfig{"dateformat"};
|
||
|
||
my $cal_align = delete $params{cal_align} || 'BR';
|
||
my $onchange = delete $params{onchange};
|
||
my $str_value = blessed $value ? $value->to_lxoffice : $value;
|
||
|
||
$self->input_tag($name, $str_value,
|
||
id => $name_e,
|
||
my $id = $self->name_to_id($name) . _tag_id();
|
||
my @onchange = $params{onchange} ? (onChange => delete $params{onchange}) : ();
|
||
my @class = $params{no_cal} || $params{readonly} ? () : (class => 'datepicker');
|
||
|
||
return $self->input_tag(
|
||
$name, blessed($value) ? $value->to_lxoffice : $value,
|
||
id => $id,
|
||
size => 11,
|
||
title => _H($::myconfig{dateformat}),
|
||
onBlur => 'check_right_date_format(this)',
|
||
($onchange ? (
|
||
onChange => $onchange,
|
||
) : ()),
|
||
onblur => "check_right_date_format(this);",
|
||
%params,
|
||
) . ((!$params{no_cal} && !$params{readonly}) ?
|
||
$self->html_tag('img', undef,
|
||
src => 'image/calendar.png',
|
||
alt => $::locale->text('Calendar'),
|
||
id => "trigger$seq",
|
||
title => _H($::myconfig{dateformat}),
|
||
%params,
|
||
) .
|
||
$self->javascript(
|
||
"Calendar.setup({ inputField: '$name_e', ifFormat: '$datefmt', align: '$cal_align', button: 'trigger$seq' });"
|
||
) : '');
|
||
@class, @onchange,
|
||
);
|
||
}
|
||
|
||
sub customer_picker {
|
||
... | ... | |
JQuery selector and clicking this checkbox will also toggle all checkboxes
|
||
matching the selector.
|
||
|
||
=item C<date_tag $name, $value, cal_align =E<gt> $align_code, %attributes>
|
||
=item C<date_tag $name, $value, %attributes>
|
||
|
||
Creates a date input field, with an attached javascript that will open a
|
||
calendar on click. The javascript ist by default anchoered at the bottom right
|
||
sight. This can be overridden with C<cal_align>, see Calendar documentation for
|
||
the details, usually you'll want a two letter abbreviation of the alignment.
|
||
Right + Bottom becomes C<BL>.
|
||
calendar on click.
|
||
|
||
=item C<radio_button_tag $name, %attributes>
|
||
|
||
... | ... | |
with '.css' if it isn't already and prefixed with 'css/' if it doesn't
|
||
contain a slash.
|
||
|
||
=item C<date_tag $name, $value, cal_align =E<gt> $align_code, %attributes>
|
||
|
||
Creates a date input field, with an attached javascript that will open a
|
||
calendar on click. The javascript ist by default anchoered at the bottom right
|
||
sight. This can be overridden with C<cal_align>, see Calendar documentation for
|
||
the details, usually you'll want a two letter abbreviation of the alignment.
|
||
Right + Bottom becomes C<BL>.
|
||
|
||
=item C<tabbed \@tab, %attributes>
|
||
|
||
Will create a tabbed area. The tabs should be created with the helper function
|
js/jquery/ui/i18n/jquery.ui.datepicker-de.js | ||
---|---|---|
/* German initialisation for the jQuery UI date picker plugin. */
|
||
/* Written by Milian Wolff (mail@milianw.de). */
|
||
jQuery(function($){
|
||
$.datepicker.regional['de'] = {
|
||
closeText: 'Schließen',
|
||
prevText: '<Zurück',
|
||
nextText: 'Vor>',
|
||
currentText: 'Heute',
|
||
monthNames: ['Januar','Februar','März','April','Mai','Juni',
|
||
'Juli','August','September','Oktober','November','Dezember'],
|
||
monthNamesShort: ['Jan','Feb','Mär','Apr','Mai','Jun',
|
||
'Jul','Aug','Sep','Okt','Nov','Dez'],
|
||
dayNames: ['Sonntag','Montag','Dienstag','Mittwoch','Donnerstag','Freitag','Samstag'],
|
||
dayNamesShort: ['So','Mo','Di','Mi','Do','Fr','Sa'],
|
||
dayNamesMin: ['So','Mo','Di','Mi','Do','Fr','Sa'],
|
||
weekHeader: 'KW',
|
||
dateFormat: 'dd.mm.yy',
|
||
firstDay: 1,
|
||
isRTL: false,
|
||
showMonthAfterYear: false,
|
||
yearSuffix: ''};
|
||
$.datepicker.setDefaults($.datepicker.regional['de']);
|
||
});
|
js/jquery/ui/i18n/jquery.ui.datepicker-en-GB.js | ||
---|---|---|
/* English/UK initialisation for the jQuery UI date picker plugin. */
|
||
/* Written by Stuart. */
|
||
jQuery(function($){
|
||
$.datepicker.regional['en-GB'] = {
|
||
closeText: 'Done',
|
||
prevText: 'Prev',
|
||
nextText: 'Next',
|
||
currentText: 'Today',
|
||
monthNames: ['January','February','March','April','May','June',
|
||
'July','August','September','October','November','December'],
|
||
monthNamesShort: ['Jan', 'Feb', 'Mar', 'Apr', 'May', 'Jun',
|
||
'Jul', 'Aug', 'Sep', 'Oct', 'Nov', 'Dec'],
|
||
dayNames: ['Sunday', 'Monday', 'Tuesday', 'Wednesday', 'Thursday', 'Friday', 'Saturday'],
|
||
dayNamesShort: ['Sun', 'Mon', 'Tue', 'Wed', 'Thu', 'Fri', 'Sat'],
|
||
dayNamesMin: ['Su','Mo','Tu','We','Th','Fr','Sa'],
|
||
weekHeader: 'Wk',
|
||
dateFormat: 'dd/mm/yy',
|
||
firstDay: 1,
|
||
isRTL: false,
|
||
showMonthAfterYear: false,
|
||
yearSuffix: ''};
|
||
$.datepicker.setDefaults($.datepicker.regional['en-GB']);
|
||
});
|
js/jquery/ui/i18n/jquery.ui.datepicker-en.js | ||
---|---|---|
jquery.ui.datepicker-en-GB.js
|
js/jscalendar/calendar-setup.js | ||
---|---|---|
/* Copyright Mihai Bazon, 2002, 2003 | http://dynarch.com/mishoo/
|
||
* ---------------------------------------------------------------------------
|
||
*
|
||
* The DHTML Calendar
|
||
*
|
||
* Details and latest version at:
|
||
* http://dynarch.com/mishoo/calendar.epl
|
||
*
|
||
* This script is distributed under the GNU Lesser General Public License.
|
||
* Read the entire license text here: http://www.gnu.org/licenses/lgpl.html
|
||
*
|
||
* This file defines helper functions for setting up the calendar. They are
|
||
* intended to help non-programmers get a working calendar on their site
|
||
* quickly. This script should not be seen as part of the calendar. It just
|
||
* shows you what one can do with the calendar, while in the same time
|
||
* providing a quick and simple method for setting it up. If you need
|
||
* exhaustive customization of the calendar creation process feel free to
|
||
* modify this code to suit your needs (this is recommended and much better
|
||
* than modifying calendar.js itself).
|
||
*/
|
||
|
||
// $Id: calendar-setup.js,v 1.15 2004/02/04 08:10:03 mishoo Exp $
|
||
|
||
/**
|
||
* 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)
|
||
* firstDay | numeric: 0 to 6. "0" means display Sunday first, "1" means display Monday first, etc.
|
||
* align | alignment (default: "Br"); 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
|
||
* onSelect | function that gets called when a date is selected. You don't _have_ to supply this (the default is generally okay)
|
||
* onClose | function that gets called when the calendar is closed. [default]
|
||
* onUpdate | function that gets called after the date is updated in the input field. Receives a reference to the calendar.
|
||
* date | the date that the calendar will be initially displayed to
|
||
* showsTime | default: false; if true the calendar will include a time selector
|
||
* timeFormat | the time format; can be "12" or "24", default is "12"
|
||
* electric | if true (default) then given fields/date areas are updated for each move; otherwise they're updated only on close
|
||
* step | configures the step of the years in drop-down boxes; default: 2
|
||
* position | configures the calendar absolute position; default: null
|
||
* cache | if "true" (but default: "false") it will reuse the same calendar object, where possible
|
||
* showOthers | if "true" (but default: "false") it will show days from other months too
|
||
*
|
||
* 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/%m/%d");
|
||
param_default("daFormat", "%Y/%m/%d");
|
||
param_default("singleClick", true);
|
||
param_default("disableFunc", null);
|
||
param_default("dateStatusFunc", params["disableFunc"]); // takes precedence if both are defined
|
||
param_default("firstDay", 1); // defaults to "Sunday" first
|
||
param_default("align", "Br");
|
||
param_default("range", [1900, 2999]);
|
||
param_default("weekNumbers", true);
|
||
param_default("flat", null);
|
||
param_default("flatCallback", null);
|
||
param_default("onSelect", null);
|
||
param_default("onClose", null);
|
||
param_default("onUpdate", null);
|
||
param_default("date", null);
|
||
param_default("showsTime", false);
|
||
param_default("timeFormat", "24");
|
||
param_default("electric", true);
|
||
param_default("step", 2);
|
||
param_default("position", null);
|
||
param_default("cache", false);
|
||
param_default("showOthers", false);
|
||
|
||
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) {
|
||
var p = cal.params;
|
||
var update = (cal.dateClicked || p.electric);
|
||
if (update && p.flat) {
|
||
if (typeof p.flatCallback == "function")
|
||
p.flatCallback(cal);
|
||
else
|
||
alert("No flatCallback given -- doing nothing.");
|
||
return false;
|
||
}
|
||
if (update && p.inputField) {
|
||
p.inputField.value = cal.date.print(p.ifFormat);
|
||
if (typeof p.inputField.onchange == "function")
|
||
p.inputField.onchange();
|
||
}
|
||
if (update && p.displayArea)
|
||
p.displayArea.innerHTML = cal.date.print(p.daFormat);
|
||
if (update && p.singleClick && cal.dateClicked)
|
||
cal.callCloseHandler();
|
||
if (update && typeof p.onUpdate == "function")
|
||
p.onUpdate(cal);
|
||
};
|
||
|
||
if (params.flat != null) {
|
||
if (typeof params.flat == "string")
|
||
params.flat = document.getElementById(params.flat);
|
||
if (!params.flat) {
|
||
alert("Calendar.setup:\n Flat specified but can't find parent.");
|
||
return false;
|
||
}
|
||
var cal = new Calendar(params.firstDay, params.date, params.onSelect || onSelect);
|
||
cal.showsTime = params.showsTime;
|
||
cal.time24 = (params.timeFormat == "24");
|
||
cal.params = params;
|
||
cal.weekNumbers = params.weekNumbers;
|
||
cal.setRange(params.range[0], params.range[1]);
|
||
cal.setDateStatusHandler(params.dateStatusFunc);
|
||
cal.create(params.flat);
|
||
cal.show();
|
||
return false;
|
||
}
|
||
|
||
var triggerEl = params.button || params.displayArea || params.inputField;
|
||
triggerEl["on" + params.eventName] = function() {
|
||
var dateEl = params.inputField || params.displayArea;
|
||
var dateFmt = params.inputField ? params.ifFormat : params.daFormat;
|
||
var mustCreate = false;
|
||
var cal = window.calendar;
|
||
if (!(cal && params.cache)) {
|
||
window.calendar = cal = new Calendar(params.firstDay,
|
||
params.date,
|
||
params.onSelect || onSelect,
|
||
params.onClose || function(cal) { cal.hide(); });
|
||
cal.showsTime = params.showsTime;
|
||
cal.time24 = (params.timeFormat == "24");
|
||
cal.weekNumbers = params.weekNumbers;
|
||
mustCreate = true;
|
||
} else {
|
||
if (params.date)
|
||
cal.setDate(params.date);
|
||
cal.hide();
|
||
}
|
||
cal.showsOtherMonths = params.showOthers;
|
||
cal.yearStep = params.step;
|
||
cal.setRange(params.range[0], params.range[1]);
|
||
cal.params = params;
|
||
cal.setDateStatusHandler(params.dateStatusFunc);
|
||
cal.setDateFormat(dateFmt);
|
||
if (mustCreate)
|
||
cal.create();
|
||
cal.parseDate(dateEl.value || dateEl.innerHTML);
|
||
cal.refresh();
|
||
if (!params.position)
|
||
cal.showAtElement(params.button || params.displayArea || params.inputField, params.align);
|
||
else
|
||
cal.showAt(params.position[0], params.position[1]);
|
||
return false;
|
||
};
|
||
};
|
js/jscalendar/calendar-win2k-1.css | ||
---|---|---|
/* 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 .nav {
|
||
background: transparent url(menuarrow.gif) no-repeat 100% 100%;
|
||
}
|
||
|
||
.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 <TR> containing navigation buttons */
|
||
}
|
||
|
||
.calendar thead .daynames { /* Row <TR> containing the day names */
|
||
}
|
||
|
||
.calendar thead .name { /* Cells <TD> 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-color: #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-color: #c4c0b8;
|
||
}
|
||
|
||
/* The body part -- contains all the days in month. */
|
||
|
||
.calendar tbody .day { /* Cells <TD> containing month days dates */
|
||
width: 2em;
|
||
text-align: right;
|
||
padding: 2px 4px 2px 2px;
|
||
}
|
||
.calendar tbody .day.othermonth {
|
||
font-size: 80%;
|
||
color: #aaa;
|
||
}
|
||
.calendar tbody .day.othermonth.oweekend {
|
||
color: #faa;
|
||
}
|
||
|
||
.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 <TD> */
|
||
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 <TD> */
|
||
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 <TR> in footer (only one right now) */
|
||
}
|
||
|
||
.calendar tfoot .ttip { /* Tooltip (status bar) cell <TD> */
|
||
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) */
|
||
|
||
.calendar .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: 90%;
|
||
padding: 1px;
|
||
}
|
||
|
||
.calendar .combo .label,
|
||
.calendar .combo .label-IEfix {
|
||
text-align: center;
|
||
padding: 1px;
|
||
}
|
||
|
||
.calendar .combo .label-IEfix {
|
||
width: 4em;
|
||
}
|
||
|
||
.calendar .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;
|
||
}
|
||
|
||
.calendar .combo .hilite {
|
||
background: #048;
|
||
color: #fea;
|
||
}
|
||
|
||
.calendar td.time {
|
||
border-top: 1px solid #000;
|
||
padding: 1px 0px;
|
||
text-align: center;
|
||
background-color: #f4f0e8;
|
||
}
|
||
|
||
.calendar td.time .hour,
|
||
.calendar td.time .minute,
|
||
.calendar td.time .ampm {
|
||
padding: 0px 3px 0px 4px;
|
||
border: 1px solid #889;
|
||
font-weight: bold;
|
||
background-color: #fff;
|
||
}
|
||
|
||
.calendar td.time .ampm {
|
||
text-align: center;
|
||
}
|
||
|
||
.calendar td.time .colon {
|
||
padding: 0px 2px 0px 3px;
|
||
font-weight: bold;
|
||
}
|
||
|
||
.calendar td.time span.hilite {
|
||
border-color: #000;
|
||
background-color: #766;
|
||
color: #fff;
|
||
}
|
||
|
||
.calendar td.time span.active {
|
||
border-color: #f00;
|
||
background-color: #000;
|
||
color: #0f0;
|
||
}
|
js/jscalendar/calendar.js | ||
---|---|---|
/* Copyright Mihai Bazon, 2002, 2003 | http://dynarch.com/mishoo/
|
||
* ------------------------------------------------------------------
|
||
*
|
||
* The DHTML Calendar, version 0.9.6 "Keep cool but don't freeze"
|
||
*
|
||
* Details and latest version at:
|
||
* http://dynarch.com/mishoo/calendar.epl
|
||
*
|
||
* This script is distributed under the GNU Lesser General Public License.
|
||
* Read the entire license text here: http://www.gnu.org/licenses/lgpl.html
|
||
*/
|
||
|
||
// $Id: calendar.js,v 1.34 2004/02/06 18:53:11 mishoo Exp $
|
||
|
||
/** The Calendar object constructor. */
|
||
Calendar = function (firstDayOfWeek, dateStr, onSelected, onClose) {
|
||
// member variables
|
||
this.activeDiv = null;
|
||
this.currentDateEl = null;
|
||
this.getDateStatus = 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.firstDayOfWeek = firstDayOfWeek; // 0 for Sunday, 1 for Monday, etc.
|
||
this.showsOtherMonths = false;
|
||
this.dateStr = dateStr;
|
||
this.ar_days = null;
|
||
this.showsTime = false;
|
||
this.time24 = true;
|
||
this.yearStep = 2;
|
||
// 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 (typeof Calendar._SDN == "undefined") {
|
||
// table of short day names
|
||
if (typeof Calendar._SDN_len == "undefined")
|
||
Calendar._SDN_len = 3;
|
||
var ar = new Array();
|
||
for (var i = 8; i > 0;) {
|
||
ar[--i] = Calendar._DN[i].substr(0, Calendar._SDN_len);
|
||
}
|
||
Calendar._SDN = ar;
|
||
// table of short month names
|
||
if (typeof Calendar._SMN_len == "undefined")
|
||
Calendar._SMN_len = 3;
|
||
ar = new Array();
|
||
for (var i = 12; i > 0;) {
|
||
ar[--i] = Calendar._MN[i].substr(0, Calendar._SMN_len);
|
||
}
|
||
Calendar._SMN = 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) );
|
||
|
||
Calendar.is_ie5 = ( Calendar.is_ie && /msie 5\.0/i.test(navigator.userAgent) );
|
||
|
||
/// detect Opera browser
|
||
Calendar.is_opera = /opera/i.test(navigator.userAgent);
|
||
|
||
/// detect KHTML-based browsers
|
||
Calendar.is_khtml = /Konqueror|Safari|KHTML/i.test(navigator.userAgent);
|
||
|
||
// BEGIN: UTILITY FUNCTIONS; beware that these might be moved into a separate
|
||
// library, at some point.
|
||
|
||
Calendar.getAbsolutePos = function(el) {
|
||
var SL = 0, ST = 0;
|
||
var is_div = /^div$/i.test(el.tagName);
|
||
if (is_div && el.scrollLeft)
|
||
SL = el.scrollLeft;
|
||
if (is_div && el.scrollTop)
|
||
ST = el.scrollTop;
|
||
var r = { x: el.offsetLeft - SL, y: el.offsetTop - ST };
|
||
if (el.offsetParent) {
|
||
var tmp = this.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) {
|
||
ev || (ev = window.event);
|
||
if (Calendar.is_ie) {
|
||
ev.cancelBubble = true;
|
||
ev.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 {
|
||
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 {
|
||
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;
|
||
var s = mc.style;
|
||
s.display = "block";
|
||
if (cd.navtype < 0)
|
||
s.left = cd.offsetLeft + "px";
|
||
else {
|
||
var mcw = mc.offsetWidth;
|
||
if (typeof mcw == "undefined")
|
||
// Konqueror brain-dead techniques
|
||
mcw = 50;
|
||
s.left = (cd.offsetLeft + cd.offsetWidth - mcw) + "px";
|
||
}
|
||
s.top = (cd.offsetTop + cd.offsetHeight) + "px";
|
||
};
|
||
|
||
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 ? cal.yearStep : -cal.yearStep;
|
||
}
|
||
if (show) {
|
||
var s = yc.style;
|
||
s.display = "block";
|
||
if (cd.navtype < 0)
|
||
s.left = cd.offsetLeft + "px";
|
||
else {
|
||
var ycw = yc.offsetWidth;
|
||
if (typeof ycw == "undefined")
|
||
// Konqueror brain-dead techniques
|
||
ycw = 50;
|
||
s.left = (cd.offsetLeft + cd.offsetWidth - ycw) + "px";
|
||
}
|
||
s.top = (cd.offsetTop + cd.offsetHeight) + "px";
|
||
}
|
||
};
|
||
|
||
// 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);
|
||
ev || (ev = window.event);
|
||
Calendar.removeClass(el, "active");
|
||
if (target == el || target.parentNode == el) {
|
||
Calendar.cellClick(el, ev);
|
||
}
|
||
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 {
|
||
if (typeof el.navtype == "undefined" || (el.navtype != 50 && (el.navtype == 0 || Math.abs(el.navtype) > 2)))
|
||
Calendar.removeClass(el, "active");
|
||
Calendar.removeClass(el, "hilite");
|
||
Calendar.removeClass(el.parentNode, "rowhilite");
|
||
}
|
||
ev || (ev = window.event);
|
||
if (el.navtype == 50 && target != el) {
|
||
var pos = Calendar.getAbsolutePos(el);
|
||
var w = el.offsetWidth;
|
||
var x = ev.clientX;
|
||
var dx;
|
||
var decrease = true;
|
||
if (x > pos.x + w) {
|
||
dx = x - pos.x - w;
|
||
decrease = false;
|
||
} else
|
||
dx = pos.x - x;
|
||
|
||
if (dx < 0) dx = 0;
|
||
var range = el._range;
|
||
var current = el._current;
|
||
var count = Math.floor(dx / 10) % range.length;
|
||
for (var i = range.length; --i >= 0;)
|
||
if (range[i] == current)
|
||
break;
|
||
while (count-- > 0)
|
||
if (decrease) {
|
||
if (--i < 0)
|
||
i = range.length - 1;
|
||
} else if ( ++i >= range.length )
|
||
i = 0;
|
||
var newval = range[i];
|
||
el.firstChild.data = newval;
|
||
|
||
cal.onUpdateTime();
|
||
}
|
||
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 {
|
||
if (cal.hilitedMonth) {
|
||
Calendar.removeClass(cal.hilitedMonth, "hilite");
|
||
}
|
||
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");
|
||
}
|
||
} 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, "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) {
|
||
if (el.navtype == 50) {
|
||
el._current = el.firstChild.data;
|
||
addEvent(document, "mousemove", tableMouseOver);
|
||
} else
|
||
addEvent(document, Calendar.is_ie5 ? "mousemove" : "mouseover", tableMouseOver);
|
||
addClass(el, "hilite active");
|
||
addEvent(document, "mouseup", tableMouseUp);
|
||
} else if (cal.isPopup) {
|
||
cal._dragStart(ev);
|
||
}
|
||
if (el.navtype == -1 || el.navtype == 1) {
|
||
if (cal.timeout) clearTimeout(cal.timeout);
|
||
cal.timeout = setTimeout("Calendar.showMonthsCombo()", 250);
|
||
} else if (el.navtype == -2 || el.navtype == 2) {
|
||
if (cal.timeout) clearTimeout(cal.timeout);
|
||
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), ev || window.event);
|
||
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) == "_") {
|
||
el.ttip = el.caldate.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, ev) {
|
||
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 = new Date(el.caldate);
|
||
date = cal.date;
|
||
newdate = true;
|
||
// a date was clicked
|
||
if (!(cal.dateClicked = !el.otherMonth))
|
||
cal._init(cal.firstDayOfWeek, date);
|
||
} 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);
|
||
cal.dateClicked = false;
|
||
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 400:
|
||
Calendar.removeClass(el, "hilite");
|
||
var text = Calendar._TT["ABOUT"];
|
||
if (typeof text != "undefined") {
|
||
text += cal.showsTime ? Calendar._TT["ABOUT_TIME"] : "";
|
||
} else {
|
||
// FIXME: this should be removed as soon as lang files get updated!
|
||
text = "Help and about box text is not translated into this language.\n" +
|
||
"If you know this language and you feel generous please update\n" +
|
||
"the corresponding file in \"lang\" subdir to match calendar-en.js\n" +
|
||
"and send it back to <mishoo@infoiasi.ro> to get it into the distribution ;-)\n\n" +
|
||
"Thank you!\n" +
|
||
"http://dynarch.com/mishoo/calendar.epl\n";
|
||
}
|
||
alert(text);
|
||
return;
|
||
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.setFirstDayOfWeek(el.fdow);
|
||
return;
|
||
case 50:
|
||
var range = el._range;
|
||
var current = el.firstChild.data;
|
||
for (var i = range.length; --i >= 0;)
|
||
if (range[i] == current)
|
||
break;
|
||
if (ev && ev.shiftKey) {
|
||
if (--i < 0)
|
||
i = range.length - 1;
|
||
} else if ( ++i >= range.length )
|
||
i = 0;
|
||
var newval = range[i];
|
||
el.firstChild.data = newval;
|
||
cal.onUpdateTime();
|
||
return;
|
||
case 0:
|
||
// TODAY will bring us here
|
||
if ((typeof cal.getDateStatus == "function") && cal.getDateStatus(date, date.getFullYear(), date.getMonth(), date.getDate())) {
|
||
// 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";
|
||
if (navtype != 0 && Math.abs(navtype) <= 2)
|
||
cell.className += " nav";
|
||
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, 400).ttip = Calendar._TT["INFO"];
|
||
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;
|
Auch abrufbar als: Unified diff
Lokalisierungsdateien jquery-ui hinzugefügt
Fixt #2179.