diff -r 000000000000 -r 414e01d06fd5 lib/TWiki/Contrib/JSCalendarContrib.pm --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/lib/TWiki/Contrib/JSCalendarContrib.pm Sat Jan 26 15:50:53 2008 +0100 @@ -0,0 +1,188 @@ +=begin twiki + +Read [[%ATTACHURL%/doc/html/reference.html][the Mishoo documentation]] or +[[%ATTACHURL%][visit the demo page]] for detailed information on using the +calendar widget. + +This package also includes a small Perl module to make using the calendar +easier from TWiki plugins. This module includes the functions: + +=cut + +package TWiki::Contrib::JSCalendarContrib; + +use strict; + +require TWiki::Func; # The plugins API + +use vars qw( $VERSION $RELEASE $SHORTDESCRIPTION ); + +$VERSION = '$Rev: 16236 (22 Jan 2008) $'; +$RELEASE = 'TWiki-4'; +$SHORTDESCRIPTION = "[[http://dynarch.com/mishoo/calendar.epl][Mishoo JSCalendar]], packaged for use by plugins, skins and add-ons"; + +# Max width of different mishoo format components +my %w = ( + a => 3, # abbreviated weekday name + A => 9, # full weekday name + b => 3, # abbreviated month name + B => 9, # full month name + C => 2, # century number + d => 2, # the day of the month ( 00 .. 31 ) + e => 2, # the day of the month ( 0 .. 31 ) + H => 2, # hour ( 00 .. 23 ) + I => 2, # hour ( 01 .. 12 ) + j => 3, # day of the year ( 000 .. 366 ) + k => 2, # hour ( 0 .. 23 ) + l => 2, # hour ( 1 .. 12 ) + m => 2, # month ( 01 .. 12 ) + M => 2, # minute ( 00 .. 59 ) + n => 1, # a newline character + p => 2, # ``PM'' or ``AM'' + P => 2, # ``pm'' or ``am'' + S => 2, # second ( 00 .. 59 ) + s => 12,# number of seconds since Epoch + t => 1, # a tab character + U => 2, # the week number + u => 1, # the day of the week ( 1 .. 7, 1 = MON ) + W => 2, # the week number + w => 1, # the day of the week ( 0 .. 6, 0 = SUN ) + V => 2, # the week number + y => 2, # year without the century ( 00 .. 99 ) + Y => 4, # year including the century ( ex. 1979 ) +); + +=begin twiki + +---+++ TWiki::Contrib::JSCalendarContrib::renderDateForEdit($name, $value, $format [, \%cssClass]) -> $html + +This is the simplest way to use calendars from a plugin. + * =$name= is the name of the CGI parameter for the calendar + (it should be unique), + * =$value= is the current value of the parameter (may be undef) + * =$format= is the format to use (optional; the default is set + in =configure=). The HTML returned will display a date field + and a drop-down calendar. + * =\%options= is an optional hash containing base options for + the textfield. +Example: + +use TWiki::Contrib::JSCalendarContrib; +... +my $fromDate = TWiki::Contrib::JSCalendarContrib::renderDateForEdit( + 'from', '1 April 1999'); +my $toDate = TWiki::Contrib::JSCalendarContrib::renderDateForEdit( + 'to', undef, '%Y'); + + +=cut + +sub renderDateForEdit { + my ($name, $value, $format, $options) = @_; + + $format ||= $TWiki::cfg{JSCalendarContrib}{format} || '%e %B %Y'; + + addHEAD('twiki'); + + # Work out how wide it has to be from the format + # SMELL: add a space because pattern skin default fonts on FF make the + # box half a character too narrow if the exact size is used + my $wide = $format.' '; + $wide =~ s/(%(.))/$w{$2} ? ('_' x $w{$2}) : $1/ge; + $options ||= {}; + $options->{name} = $name; + $options->{id} = 'id_'.$name; + $options->{value} = $value || ''; + $options->{size} ||= length($wide); + + return CGI::textfield($options) + . CGI::image_button( + -name => 'img_'.$name, + -onclick => + "javascript: return showCalendar('id_$name','$format')", + -src=> TWiki::Func::getPubUrlPath() . '/' . + TWiki::Func::getTwikiWebname() . + '/JSCalendarContrib/img.gif', + -alt => 'Calendar', + -align => 'middle'); +} + +=begin twiki + +---+++ TWiki::Contrib::JSCalendarContrib::addHEAD($setup) + +This function will automatically add the headers for the calendar to the page +being rendered. It's intended for use when you want more control over the +formatting of your calendars than =renderDateForEdit= affords. =$setup= is +the name of +the calendar setup module; it can either be omitted, in which case the method +described in the Mishoo documentation can be used to create calendars, or it +can be ='twiki'=, in which case a Javascript helper function called +'showCalendar' is added that simplifies using calendars to set a value in a +text field. For example, say we wanted to display the date with the calendar +icon _before_ the text field, using the format =%Y %b %e= + +# Add styles and javascript for the calendar +use TWiki::Contrib::JSCalendarContrib; +... + +sub commonTagsHandler { + .... + # Enable 'showCalendar' + TWiki::Contrib::JSCalendarContrib::addHEAD( 'twiki' ); + + my $cal = CGI::image_button( + -name => 'img_datefield', + -onclick => + "return showCalendar('id_datefield','%Y %b %e')", + -src=> TWiki::Func::getPubUrlPath() . '/' . + TWiki::Func::getTwikiWebname() . + '/JSCalendarContrib/img.gif', + -alt => 'Calendar', + -align => 'middle' ) + . CGI::textfield( + { name => 'date', id => "id_datefield" }); + .... +} + +The first parameter to =showCalendar= is the id of the textfield, and the second parameter is the . See the Mishoo documentation for details of the '$e %B %Y' parameter. + +=addHEAD= can be called from =commonTagsHandler= for adding the header to all pages, or from =beforeEditHandler= just for edit pages etc. + +=cut + +sub addHEAD { + my $setup = shift; + $setup ||= 'calendar-setup'; + my $style = $TWiki::cfg{JSCalendarContrib}{style} || 'blue'; + my $lang = $TWiki::cfg{JSCalendarContrib}{lang} || 'en'; + my $base = '%PUBURLPATH%/%TWIKIWEB%/JSCalendarContrib'; + eval { + require TWiki::Contrib::BehaviourContrib; + if (defined(&TWiki::Contrib::BehaviourContrib::addHEAD)) { + TWiki::Contrib::BehaviourContrib::addHEAD(); + } else { + TWiki::Func::addToHEAD( + 'BEHAVIOURCONTRIB', + ''); + } + }; + my $head = < + \@import url('$base/calendar-$style.css'); + .calendar {z-index:2000;} + + + +HERE + TWiki::Func::addToHEAD( 'JSCALENDARCONTRIB', $head ); + + # Add the setup separately; there might be different setups required + # in a single HTML page. + $head = < +HERE + TWiki::Func::addToHEAD( 'JSCALENDARCONTRIB_'.$setup, $head ); +} + +1;