From f697b664616ff7d56b0ccfa528a44832eba68da3 Mon Sep 17 00:00:00 2001 From: Manuel Cillero Date: Wed, 26 Jul 2017 20:02:02 +0200 Subject: [PATCH] New module 'Calendar' --- sites/all/modules/calendar/CHANGELOG.txt | 339 ++++++ sites/all/modules/calendar/LICENSE.txt | 274 +++++ sites/all/modules/calendar/calendar.css | 372 +++++++ sites/all/modules/calendar/calendar.info | 16 + sites/all/modules/calendar/calendar.install | 157 +++ sites/all/modules/calendar/calendar.module | 921 +++++++++++++++++ .../calendar_ical/calendar-view-ical.tpl.php | 55 + .../calendar/calendar_ical/calendar_ical.info | 17 + .../calendar_ical/calendar_ical.install | 54 + .../calendar_ical/calendar_ical.module | 32 + .../calendar_ical/calendar_ical.views.inc | 82 ++ .../calendar_ical/calendar_ical_admin.inc | 115 +++ .../calendar_plugin_display_ical.inc | 218 ++++ .../calendar_plugin_style_ical.inc | 254 +++++ .../modules/calendar/calendar_ical/theme.inc | 81 ++ .../translations/calendar_ical.cs.po | 117 +++ .../translations/calendar_ical.hu.po | 70 ++ .../translations/calendar_ical.pot | 169 +++ .../calendar_multiday/calendar-overlap.css | 803 +++++++++++++++ .../calendar_multiday/calendar_multiday.css | 852 +++++++++++++++ .../calendar_multiday/calendar_multiday.info | 15 + .../calendar_multiday.install | 12 + .../calendar_multiday.module | 90 ++ .../calendar_multiday/calendar_overlap.js | 87 ++ .../calendar_multiday/includes/calendar.inc | 619 +++++++++++ .../theme/calendar-datebox.tpl.php | 19 + .../theme/calendar-day-node.tpl.php | 58 ++ .../theme/calendar-day-overlap.tpl.php | 135 +++ .../theme/calendar-day.tpl.php | 81 ++ .../theme/calendar-main.tpl.php | 26 + .../theme/calendar-mini.tpl.php | 47 + .../theme/calendar-month-col.tpl.php | 16 + .../calendar-month-multiple-node.tpl.php | 28 + .../theme/calendar-month-node.tpl.php | 64 ++ .../theme/calendar-month-row.tpl.php | 18 + .../theme/calendar-month.tpl.php | 57 + .../theme/calendar-week-multiple-node.tpl.php | 27 + .../theme/calendar-week-node.tpl.php | 64 ++ .../theme/calendar-week-overlap.tpl.php | 188 ++++ .../theme/calendar-week.tpl.php | 124 +++ .../theme/calendar-year.tpl.php | 27 + .../calendar_multiday/theme/theme.inc | 972 ++++++++++++++++++ .../modules/calendar/help/attachments.html | 1 + .../modules/calendar/help/calendar.help.ini | 43 + .../all/modules/calendar/help/embedding.html | 15 + .../calendar/help/getting-started.html | 22 + .../modules/calendar/help/ical-export.html | 2 + .../modules/calendar/help/ical-import.html | 4 + sites/all/modules/calendar/help/ical.html | 1 + .../calendar/help/images/calendar_colors.jpg | Bin 0 -> 50004 bytes .../calendar/help/images/calendar_colors2.jpg | Bin 0 -> 55312 bytes .../calendar/help/images/ical_import.png | Bin 0 -> 319007 bytes sites/all/modules/calendar/help/overview.html | 3 + sites/all/modules/calendar/help/settings.html | 7 + .../modules/calendar/includes/calendar.inc | 203 ++++ .../calendar/includes/calendar.views.inc | 231 +++++ .../includes/calendar.views_default.inc | 510 +++++++++ .../calendar_plugin_display_attachment.inc | 242 +++++ .../calendar_plugin_display_block.inc | 78 ++ .../includes/calendar_plugin_display_page.inc | 297 ++++++ .../includes/calendar_plugin_style.inc | 180 ++++ .../includes/calendar_view_plugin_style.inc | 173 ++++ .../includes/translations/includes.cs.po | 235 +++++ .../all/modules/calendar/jcalendar/Readme.txt | 3 + .../calendar/jcalendar/images/cross.png | Bin 0 -> 655 bytes .../calendar/jcalendar/images/throbber.gif | Bin 0 -> 5886 bytes .../modules/calendar/jcalendar/jcalendar.css | 49 + .../modules/calendar/jcalendar/jcalendar.info | 14 + .../modules/calendar/jcalendar/jcalendar.js | 82 ++ .../calendar/jcalendar/jcalendar.module | 97 ++ .../jcalendar/translations/jcalendar.cs.po | 28 + .../jcalendar/translations/jcalendar.hu.po | 27 + .../jcalendar/translations/jcalendar.pot | 49 + .../calendar/js/calendar_colorpicker.js | 40 + sites/all/modules/calendar/readme.txt | 33 + .../calendar/theme/calendar-datebox.tpl.php | 19 + .../calendar/theme/calendar-day-node.tpl.php | 53 + .../calendar/theme/calendar-day.tpl.php | 81 ++ .../calendar/theme/calendar-main.tpl.php | 26 + .../calendar/theme/calendar-mini.tpl.php | 47 + .../calendar-month-multiple-node.tpl.php | 28 + .../theme/calendar-month-node.tpl.php | 53 + .../calendar/theme/calendar-month.tpl.php | 46 + .../theme/calendar-week-multiple-node.tpl.php | 27 + .../calendar/theme/calendar-week-node.tpl.php | 53 + .../calendar/theme/calendar-week.tpl.php | 80 ++ .../calendar/theme/calendar-year.tpl.php | 27 + sites/all/modules/calendar/theme/theme.inc | 745 ++++++++++++++ .../calendar/theme/translations/theme.cs.po | 30 + .../calendar/translations/calendar.pot | 102 ++ sites/all/modules/calendar/translations/de.po | 578 +++++++++++ .../calendar/translations/general.cs.po | 42 + .../calendar/translations/general.hu.po | 152 +++ .../calendar/translations/includes.hu.po | 198 ++++ .../calendar/translations/installer.cs.po | 30 + .../calendar/translations/installer.hu.po | 29 + .../modules/calendar/translations/root.cs.po | 79 ++ .../modules/calendar/translations/root.hu.po | 294 ++++++ .../modules/calendar/translations/theme.hu.po | 24 + 99 files changed, 13284 insertions(+) create mode 100644 sites/all/modules/calendar/CHANGELOG.txt create mode 100644 sites/all/modules/calendar/LICENSE.txt create mode 100644 sites/all/modules/calendar/calendar.css create mode 100644 sites/all/modules/calendar/calendar.info create mode 100644 sites/all/modules/calendar/calendar.install create mode 100644 sites/all/modules/calendar/calendar.module create mode 100644 sites/all/modules/calendar/calendar_ical/calendar-view-ical.tpl.php create mode 100644 sites/all/modules/calendar/calendar_ical/calendar_ical.info create mode 100644 sites/all/modules/calendar/calendar_ical/calendar_ical.install create mode 100644 sites/all/modules/calendar/calendar_ical/calendar_ical.module create mode 100644 sites/all/modules/calendar/calendar_ical/calendar_ical.views.inc create mode 100644 sites/all/modules/calendar/calendar_ical/calendar_ical_admin.inc create mode 100644 sites/all/modules/calendar/calendar_ical/calendar_plugin_display_ical.inc create mode 100644 sites/all/modules/calendar/calendar_ical/calendar_plugin_style_ical.inc create mode 100644 sites/all/modules/calendar/calendar_ical/theme.inc create mode 100644 sites/all/modules/calendar/calendar_ical/translations/calendar_ical.cs.po create mode 100644 sites/all/modules/calendar/calendar_ical/translations/calendar_ical.hu.po create mode 100644 sites/all/modules/calendar/calendar_ical/translations/calendar_ical.pot create mode 100644 sites/all/modules/calendar/calendar_multiday/calendar-overlap.css create mode 100644 sites/all/modules/calendar/calendar_multiday/calendar_multiday.css create mode 100644 sites/all/modules/calendar/calendar_multiday/calendar_multiday.info create mode 100644 sites/all/modules/calendar/calendar_multiday/calendar_multiday.install create mode 100644 sites/all/modules/calendar/calendar_multiday/calendar_multiday.module create mode 100644 sites/all/modules/calendar/calendar_multiday/calendar_overlap.js create mode 100644 sites/all/modules/calendar/calendar_multiday/includes/calendar.inc create mode 100644 sites/all/modules/calendar/calendar_multiday/theme/calendar-datebox.tpl.php create mode 100644 sites/all/modules/calendar/calendar_multiday/theme/calendar-day-node.tpl.php create mode 100644 sites/all/modules/calendar/calendar_multiday/theme/calendar-day-overlap.tpl.php create mode 100644 sites/all/modules/calendar/calendar_multiday/theme/calendar-day.tpl.php create mode 100644 sites/all/modules/calendar/calendar_multiday/theme/calendar-main.tpl.php create mode 100644 sites/all/modules/calendar/calendar_multiday/theme/calendar-mini.tpl.php create mode 100644 sites/all/modules/calendar/calendar_multiday/theme/calendar-month-col.tpl.php create mode 100644 sites/all/modules/calendar/calendar_multiday/theme/calendar-month-multiple-node.tpl.php create mode 100644 sites/all/modules/calendar/calendar_multiday/theme/calendar-month-node.tpl.php create mode 100644 sites/all/modules/calendar/calendar_multiday/theme/calendar-month-row.tpl.php create mode 100644 sites/all/modules/calendar/calendar_multiday/theme/calendar-month.tpl.php create mode 100644 sites/all/modules/calendar/calendar_multiday/theme/calendar-week-multiple-node.tpl.php create mode 100644 sites/all/modules/calendar/calendar_multiday/theme/calendar-week-node.tpl.php create mode 100644 sites/all/modules/calendar/calendar_multiday/theme/calendar-week-overlap.tpl.php create mode 100644 sites/all/modules/calendar/calendar_multiday/theme/calendar-week.tpl.php create mode 100644 sites/all/modules/calendar/calendar_multiday/theme/calendar-year.tpl.php create mode 100644 sites/all/modules/calendar/calendar_multiday/theme/theme.inc create mode 100644 sites/all/modules/calendar/help/attachments.html create mode 100644 sites/all/modules/calendar/help/calendar.help.ini create mode 100644 sites/all/modules/calendar/help/embedding.html create mode 100644 sites/all/modules/calendar/help/getting-started.html create mode 100644 sites/all/modules/calendar/help/ical-export.html create mode 100644 sites/all/modules/calendar/help/ical-import.html create mode 100644 sites/all/modules/calendar/help/ical.html create mode 100644 sites/all/modules/calendar/help/images/calendar_colors.jpg create mode 100644 sites/all/modules/calendar/help/images/calendar_colors2.jpg create mode 100644 sites/all/modules/calendar/help/images/ical_import.png create mode 100644 sites/all/modules/calendar/help/overview.html create mode 100644 sites/all/modules/calendar/help/settings.html create mode 100644 sites/all/modules/calendar/includes/calendar.inc create mode 100644 sites/all/modules/calendar/includes/calendar.views.inc create mode 100644 sites/all/modules/calendar/includes/calendar.views_default.inc create mode 100644 sites/all/modules/calendar/includes/calendar_plugin_display_attachment.inc create mode 100644 sites/all/modules/calendar/includes/calendar_plugin_display_block.inc create mode 100644 sites/all/modules/calendar/includes/calendar_plugin_display_page.inc create mode 100644 sites/all/modules/calendar/includes/calendar_plugin_style.inc create mode 100644 sites/all/modules/calendar/includes/calendar_view_plugin_style.inc create mode 100644 sites/all/modules/calendar/includes/translations/includes.cs.po create mode 100644 sites/all/modules/calendar/jcalendar/Readme.txt create mode 100644 sites/all/modules/calendar/jcalendar/images/cross.png create mode 100644 sites/all/modules/calendar/jcalendar/images/throbber.gif create mode 100644 sites/all/modules/calendar/jcalendar/jcalendar.css create mode 100644 sites/all/modules/calendar/jcalendar/jcalendar.info create mode 100644 sites/all/modules/calendar/jcalendar/jcalendar.js create mode 100644 sites/all/modules/calendar/jcalendar/jcalendar.module create mode 100644 sites/all/modules/calendar/jcalendar/translations/jcalendar.cs.po create mode 100644 sites/all/modules/calendar/jcalendar/translations/jcalendar.hu.po create mode 100644 sites/all/modules/calendar/jcalendar/translations/jcalendar.pot create mode 100644 sites/all/modules/calendar/js/calendar_colorpicker.js create mode 100644 sites/all/modules/calendar/readme.txt create mode 100644 sites/all/modules/calendar/theme/calendar-datebox.tpl.php create mode 100644 sites/all/modules/calendar/theme/calendar-day-node.tpl.php create mode 100644 sites/all/modules/calendar/theme/calendar-day.tpl.php create mode 100644 sites/all/modules/calendar/theme/calendar-main.tpl.php create mode 100644 sites/all/modules/calendar/theme/calendar-mini.tpl.php create mode 100644 sites/all/modules/calendar/theme/calendar-month-multiple-node.tpl.php create mode 100644 sites/all/modules/calendar/theme/calendar-month-node.tpl.php create mode 100644 sites/all/modules/calendar/theme/calendar-month.tpl.php create mode 100644 sites/all/modules/calendar/theme/calendar-week-multiple-node.tpl.php create mode 100644 sites/all/modules/calendar/theme/calendar-week-node.tpl.php create mode 100644 sites/all/modules/calendar/theme/calendar-week.tpl.php create mode 100644 sites/all/modules/calendar/theme/calendar-year.tpl.php create mode 100644 sites/all/modules/calendar/theme/theme.inc create mode 100644 sites/all/modules/calendar/theme/translations/theme.cs.po create mode 100644 sites/all/modules/calendar/translations/calendar.pot create mode 100644 sites/all/modules/calendar/translations/de.po create mode 100644 sites/all/modules/calendar/translations/general.cs.po create mode 100644 sites/all/modules/calendar/translations/general.hu.po create mode 100644 sites/all/modules/calendar/translations/includes.hu.po create mode 100644 sites/all/modules/calendar/translations/installer.cs.po create mode 100644 sites/all/modules/calendar/translations/installer.hu.po create mode 100644 sites/all/modules/calendar/translations/root.cs.po create mode 100644 sites/all/modules/calendar/translations/root.hu.po create mode 100644 sites/all/modules/calendar/translations/theme.hu.po diff --git a/sites/all/modules/calendar/CHANGELOG.txt b/sites/all/modules/calendar/CHANGELOG.txt new file mode 100644 index 0000000..3596234 --- /dev/null +++ b/sites/all/modules/calendar/CHANGELOG.txt @@ -0,0 +1,339 @@ +Views Calendar 6.x +================== + +See documentation at http://drupal.org/node/262064. + +Version 2.0 dev +================= + +Version 6.2.4 +============= +- Theme folder got lost in 6.2.3 release. + +Version 6.2.3 +============= +- #811704 Fix broken handling of calendar links that looses track of where you are if you click around too much. +- #720868 by dereine and KarenS, Fix argument handling for dates outside allowed range so only page views return 404. +- #1005412 by developer-x, fix multiday date id. +- #999708 Try to avoid fatal errors from duplicate functions when enabling the Multiday module. +- #1003938 Fix position of multiday navigation when displayed in a block. +- #708258 by Kars-T, remove D7 drupal_exit() call from popup. +- #372988 by joachim, Eliminate 'broken field' message in view summary when no date link is chosen. +- #870018 by crell, don't call date_limit_format thousands of times. +- #931392 by developer-x, Add multiday striping effect as an optional alternative display. +- #978442 by bwynants and KarenS, fix some remaining brokenness from ical validation fix. +- #638620 by ericduran, show add event link to user with administer nodes permissions. +- #439454 by TheRec, Darren Oh, don't show link to calendar day if there are no items. +- #389334 by Gribnif and dnotes, fix ical feed to show all repeating dates. +- #513794 by jhedstrom, add array keys to calendar links for easier theming. +- #638304 by bricef, make sure time groupings display all items. +- #697738 by Zoltan Balogh and Magnus, clean html out of translation strings. +- #452690 by aufumy and mikesteff, avoid errors if calendar min or max dates are empty. +- #469394 by extect, fix validation of calendar by removing duplicate ids. +- #522914 by jjemmett, user date_real_url() on week links. +- #704068 by gibus, add option to color calendar items by group. +- #360364 by marcushenningsen, don't link to day if there is no day view. +- #382852 by llslim, make sure replacements patterns work even if field is excluded. +- #660880 by kaare, fix method of including js in jacalendar module. +- #760316 by skwashd, arithmetric clean up ical rfc compliance. +- #613528 Fix Views option handling to set options correctly and avoid attempt to modify property of non-object error. + +Version 6.2.2 +============= +- #429446 Col element must not be in thead. +- #506944 Localize more link in jcalendar popup. +- #529826 Add check_plain(). +- #489722 Remove mistake that caused year calendar to process endlessly. +- #389294 Require the date field in calendar style, needed to identify what cell the date belongs in. +- #452690 Avoid errors when some date fields are empty (usually when there are multiple date fields in view.) +- #389294 Avoid errors when date argument or filter is not available as a date field. +- #454958 Calendar patch was broken in ical. +- #444526 Fix typo in variable name for calendar translation. +- #427996 More link logic was reversed. +- #389294 Avoid errors when date argument or filter is not available as date field. + +Version 6.2.1 +============= +- #385886 Add handling for non-node date fields. +- #360967 Add method for deleting a custom default calendar. + +Version 6.2.0 +============= +- #377760 Fix alias handling for node edit and delete links. +- Fix the way the node type filter was configured in the default view. +- Get rid of truncated field display options, Views now handles that. +- #372625 Reset year granularity after processing months on year view now that Views has changed processing order, also omit deprecated themes, we now use date_nav_title. +- #345077 Make sure duplicate copies of the date field each get to theme the raw, unaltered, data. +- #338253 Re-work date_t() to create a more robust method of handling translations of abbreviations and other short strings. +- Add more description text to the ical description and location fields to clarify that you have to add fields to the view. +- #368632 Make sure iCal exports handle multi-day dates correctly. +- Clean up inconsistent use of calendar_display and calendar_type to use only calendar_type. +- #365113 Remove agenda hour column when not grouping by hour. +- #357019 Add method to hide all items and show only count or 'more' link. +- #350229 Make sure Calendar doesn't get updated before Views. +- #341841 Add 'has-events' and 'has-no-events' classes for easier themeing. +- Make sure there is a sane defualt value for the iCal summary field to avoid theme errors. +- #364770 Add new date link needs to convert underscore to hyphen. +- #370092 Add all-day checkbox to date field and use it in calendar. +- #369573 Fix jCalendar popup when used without clean urls. +- #367627 Fit jCalendar popup into window better. +- #368632 Fix repeating date iCal export: show date only one time and add RRULE to export. +- #332273 Use field alias in iCal location and description fields to avoid problems with CCK table optimization. +- #328097 Fix some small problems found while researching this issue. The main fix was in the Date filter. +- Allow removal of displays, still no UI since they can't go on other views. +- Don't try to set date argument when another argument precedes it. +- #349409 Fix jcalendar popup. +- Add option to link calendar to content type, and add link to calendar to node, and link to node/add to calendar. +- #342119 Make sure calendar_type option is in expected format, maybe this was causing the translation problems? +- #343090 'Today' highlighting got lost in last round of theme changes, restore it. +- #340215 Make sure day and week time slots are checking >= instead of >. +- #327221 Don't add 'today' class in empty blocks. +- #341964 Get missing back/next links back in year view (needs fix in Date module, too). +- Fix some logic in stripe labels that was showing empty content type stripes and missing taxonomy stripes. + +Version 2.0 rc6 +================= + +- All day events were getting dropped. +- #341202, #339457, #337952, #329128, #337787, #341203, Fix repeating and multiple date displays. +- #303714 Make sure calendar obeys the date format chosen in the view now that the Date module has a 'time' format available. +- #340604 Seed taxonomy color stripes with #ffffff to be sure the colorpicker works right. +- #340215 Fix broken method of setting the key for start times. +- Get rid of hard-coded 'UTC' for database values in favor of consistently using date_get_timezone_db(). +- Make sure parent pre_execute() function is called so things like items per page get set. +- Set calendar item font size at a higher level to make sure all sub-elements pick it up and make it easier to override in the theme. +- Make sure node stripes aren't created when there is no stripe color set. +- Don't truncate fields if there is no truncate value. +- Fix field name code in default view, don't add '_value' to core fields! +- Make sure default view doesn't make any assumptions about available content types. +- #337635 Make sure Views doesn't limit the calendar results to 10 items in the calendar style. +- #338515 Initialize $date_field_options to avoid error when editing style. +- Consolidate error messages about missing Date arguments so we don't get the message repeated, and add more info about how to fix. +- #337635 Make sure max_items defaults to unlimited. +- Remove deprecated iCal code left over from old method of importing feeds. +- #337665 Fix bad variable name that kept month titles from showing. +- #337664 Add warning message when selecting terms if no vocabulary has been set yet. +- #337646 We only need a single Advanced Help icon for Calendar settings. + +Version 2.0 rc5 +================= + +New Features: +============= +- Update day and week view to use new configurable, agenda-style calendar views grouped by hour. +- #337004 By hotspoons: Add settings to display calendar legend colors based on taxonomy. +- #319344 By MothersClick.com: Add updated css styles, settings to truncate titles in calendar cells + and limit the number of events that display in calendar cells. +- Make default calendar view configurable so we can create default calendars for specific date fields. +- Add a date_embed_view() function to provide a way to embed views and have their navigation move + either together or separately, and document it in Advanced help. +- Start building Advanced help instructions, including how to do iCal import using Feed API. +- #290365 Add upcoming events block to default calendar. + +Other: +====== +- Rename values added to views to avoid name clashes and keep all date values together. +- #329153 Make sure day link in calendar mini block goes to full day view. +- Set day-splitting timezone to be sure it will split days using the time displayed in the calendar. +- #329418 Fix week number formatting. +- Adapt processing to make sure only selected dates display in nodes, views, and calendars. +- Improve the look of the day view by postponing the time when the item is output so we have more information in the template. +- Had the block view identifier set too early, before we know if the block is being used, causing all views to act like blocks. +- Only the month view needs the 'mini' theme, make sure it isn't used anywhere else. +- #326597 Make sure ical icon theme arguments and parameters sent to it match. +- Get the links in embedded views and blocks to work correctly using a helper function date_real_url(). +- Add option to maximum items per day to either show maximum plus 'more' link or hide all and link to day. +- Use view->date fields from either date arguments or date filters. +- Add helper function for creating calendar urls based on type or requested argument. +- Fix undefined index in new Date popup calendar option. +- Make sure 'time ago' formats will work in calendar. +- Fix logic problem in the validation of multiple dates that use the grouped value, non-multiple dates were triggering the error. +- #279679 Fix broken handling of date format selection. +- Make sure popup date switcher isn't shown in the mini calendar. +- Adjust the recent changes to the navigation header to be sure only the calendar header and not the date browser is affected. +- #292164 Keep calendar date selector description from floating out of block in IE. +- #298929 Fix code so that calendar legend doesn't display empty div when empty. +- Make some fixes to the calendar legend to be sure text added for accessibility stays invisible in all themes. +- #321831 Make sure day view gets populated. +- Rework html of Year view so month titles will match block view month title for easier css themeing. +- #174580 Add rel=nofollow to back/next links. +- #289166 Change ical link in default calendar to 'all time' link instead of single period. +- #315843 Make sure there is validation to keep you from trying to group multiple date values in the calendar. +- Add the popup calendar date selector back into the D6 version. + +Version 2.0 rc4 +================= + +- Change the jcalendar code to use the new display_ids. +- Make it possible to expose the calendar parts in the UI. To make this work better, combine year, month, day, and week handlers into a single handler. +- #311485 Make sure mini calendar has the right number of columns if using week number. +- #317660 Hard code line feeds in ical export to be sure they come through correctly in all systems. +- Start adding in Advanced help for the calendar. +- Move the colorpicker js info to the plugin so it isn't loaded everywhere. +- #314682 Add missing url() in jcalendar js code. +- #315955 Translation cleanup. +- Get colorpicker working in the Views UI again. I'm not loading the js in the best place, but at least it works now. +- Get rid of deprecated theme for ical output that is not being used in current code. +- #307544 Get rid of extra line feed at end of ical description and make sure template works correctly. +- #312170 Fix misplaced parenthesis in jCalendar theme. +- #313161 Use date_id as iCal UID to be sure it is unique. +- #303537 Display:relative should be position:relative. +- #313538 Fix color typo in calendar.css. +- #309608, #309253 Get rid of attempt to simplify the navigation query, it is too easily broken. +- #309391 Now that the Views fatal error for missing display handlers is fixed, add the ical display back. + +Version 2.0 rc2 +================= + +- #301414 Revert http://drupal.org/cvs?commit=133523, wrong way to fix that. +- #308372 Make ical display handlers are removed from views display table when Calendar iCal is disabled. +- Eliminate query for navigation display. +- Calendar ical theme was in the wrong folder, move it to the ical folder. +- #303000 The calendar ical feed was deeply sub-classed and wasn't working right, rewrite it to not require so many other classes. +- #294469 Get rid of redundant timezone conversion that showed dates without timezone conversion in UTC. +- #303999 Correct theme paths for Views themes. +- #304762 Add missing folders for translations. +- Update to new Views2 API. Now requires latest versions of Views and CCK, and files have been re-arranged. +- Replace all include_once() with require_once(). +- #301324 Rework calendar date selector to use site short date format. +- Fix css for week number to be sure it stays small in all browsers. + +Version 2.0 rc1 +================= + +- Fix jCalendar popup so it doesn't do anything on items without a nid, like remote nodes. +- Make sure Devel module doesn't add queries to Calendar Popups. +- #292306 Make sure no error is thrown if $GLOBALS['calendar_stripes'] is empty. +- Fix day theme, there is no rows array here, it is a single rendered value. +- CCK field labels were getting lost if 'widget' was selected. +- Don't omit date fields that are not used in the date argument from being displayed on calendar nodes. +- Make sure database values with empty timezone names get defaulted to use site timezone in calendar handling. +- Views 2 moves views_query_alter() and views_pre_view() into calendar.views.inc. +- Calendar legend block should now be working correctly. +- Rework the calendar legend to incorporate imported ical node colors as well as internal colors. +- Add helper function calendar_get_node_link() to construct a node link for either an internal or external node. +- #272330 Rework css to add background colors where colors are defined and group colors together in the file. +- Add 'All day' themes for use in nodes and calendar psuedo nodes. + +Version 2.0 beta4 +================= + +- #270318 Get date browser and calendar navigation working correctly when used in a block. +- Don't attach any displays but the right one for a given argument. +- #289981, #290328 Fixing broken handling of empty blocks that sometimes kept calendars from displaying in blocks. +- Clean up logic for creating calendar fields info. +- #268669 Improve logic for splitting multi-day nodes across calendar dates, patch by emok. +- Add new DATE_FORMAT_DATE for date-only format that is used throughout the calendar. +- Make sure week title gets translated by using date_format_date() instead of date_format(). +- #289775 Day link needs a leading zero. +- Make sure calendars have a min and max date even if the date argument is not the first argument. +- Tweaked the jcalendar popup html and css a bit to keep title from popping out of the box in some themes. +- Bring the 5.2 and 6.2 calendar themes into alignment so both use the same styles and themes, including tableless back/next navigation links and themeable headers. +- #285104 Make sure calendar_colors is always an array, needed for transition to new value. +- #283902 Make sure date_format() isn't used on items with no calendar dates. +- #284760 Don't make weekno a link when there is no week view, eliminate some redundant date_format() calls. +- #276421 Use farbtastic color picker to set calendar stripes, and start process of making stripes more customizable. +- #282777 Try to make calendar creation in PHP4 more efficient to speed up creation of year calendar. +- #279195 Remove deprecated calendar_week_range(). +- Set min_date_date and max_date_date in the view object so calendar can be written. +- #278267 Add a theme for the jcalendar popup. +- #259127 Remove ajax back/next navigation on mini calendar, it's not working well enough. +- #268668 Adjust comparison dates for timezone offsets to make sure multi-day events get split correctly. +- The cached ical feed cannot be used to store date objects, recreate them as needed. +- #234070 Fix broken ical title. +- #258501 Make sure calendar.inc is included when creating ical feed. +- #258515 Fix url in ical export. +- #266623 Protect against foreach() errors on empty ical feeds. +- PHP4 can't do comparisons of date objects, so alter calendar comparison code to compare formatted dates instead. +- Remove as many dependencies as possible from install files and auto-enable necessary modules. +- #272263 Make sure empty ical stream doesn't get into cache. +- #272732 Fix missing php closing tag. +- #261610 Prepare for a jQuery popup in the calendar by adding a unique id to the 'node' and altering the date theme to surpress all other dates if $node->date_id is set. +- #243172 Theme('calendar_empty') should be theme('calendar_empty_day'), patch by JohnAlbin. +- Clean up install file included files and include file paths, and auto-enable date_timezone and date_php4. +- #270818 Fix datebox theme that still defined old deprecated variable 'params'. +- #270078 Fix typo in calendar-year.tpl.php. +- #270303 Make sure iCal part of default view only gets added in if iCal is enabled. + +Version 2.0 beta3 +================= +- Update README.txt. +- Add rrule to template. +- Remove options from navigation, not really needed. +- Add in functions to get iCal export working. +- Get rid of calendar_clear_all() function that is not needed any more now that Views 2 has its own method for tracking settings. Also clean up related install and update code. +- #269349 Correct calendar handlers to match Views commit 120575, which changed the way handlers are structured. + +Version 2.0 beta2 +================= +- Fix handling of CCK dates in date argument. +- Move option to show/hide week numbers to a style setting. +- Get block view working again, remove switch calendar block because it doesn't work in this new system. +- Get the generic date argument handler pulled completely out of the Calendar module and into the Date API in a way that it can be used for any Views date field in any view. +- Rework the calendar handling to use the Date API argument in calendar displays and navigation. +- Keep the calendar displays out of the UI and instead create a default calendar view that has everything set up correctly to reduce confusion and clutter in the UI and to make it easier to create a calendar. +- Make sure month names show in year view. +- #262078 Remove deprecated function calendar_info(). +- Cleanup handling of dates with timezone names in the database. +- Pass a variable to the templates to tell if this calendar is in a block or not, and use that to determine if the links are needed. +- Get the settings working for controlling the size of the day of week names, adding an option to display the full names. +- Add a separate template for the mini calendar. + +Version 2.0 beta +================ +- #210844 Make sure empty text displays. +- #234635 Add calendar_build_nodes() to calendar_ical export processing. +- #243712 make sure default views are retrieved as well as db views. +- #235434 Using timezone name instead of timezone object in several places. +- #233513 Fix missing $selected marker. +- #233975 Don't bypass theme function. +- #242686 Fix spelling errors. +- #240297 make sure id has a value. +- Make sure new required modules get enabled during the update. +- Fix To time in calendar, was incorrectly picking up a :59 value. +- Make sure min and max dates are in localtime. +- #225459 Fix days that span multiple days. +- #220657 Revert to using the API instead of templates for drawing the calendar. +- #186875 make sure navigation is always returned as an array so it doesn't break table theme. +- Remove database timezone handling by rolling back to previous version that used offsets instead. Based on problems noted in #218479 and #220663, we cannot count on database timezone handling to be available in MYSQL or work consistently with the timezone names that PHP uses in POSTGRES, so trying to do timezone conversions in the database is not going to work. +- #219200 Make sure views is available during install. +- #218704 Fix error in setting array variable. +- Getting rid of offsets!! Alter query code to cast ISO and UNIX dates to native datetimes and do timezone conversion in the database. Much faster and more accurate. + The offset fields can now be dropped from the Date fields since we only need the timezone name to do the conversion. +- Simplify the query a bit, but it's still very complex. We need a native datetime field so we can let the db do this the right way. +- Make sure calendar works with an argument before the calendar. +- The popup calendar datepicker needs a default value in the normal datetime format. +- Add settings option to not display year, month, day, or week view and adjust links to hide any link to hidden displays. +- Get rid of separate mini args and so mini and main calendar move together. This has been often requested and we already have too much complication in tracking various filter and non-calendar arguments in the view. +- Make sure ical dates only get shown once in views with more than one date field. +- Make sure 'today', 'future', and 'past' classes don't get applied to non-date cells. +- #216365 make sure all needed files are included in the install files. +- We can't trust the database date conversion unless we have the right offset stored in the database, so only the date-specific dates have the right values for this to work. All others must be retrieved as UTC values and converted in PHP. +- Make sure functions are available during install. +- #128602 add classes for 'past' and 'future' to date boxes, not using them by default, but available to css. +- #211568 Add setup option to show first 1, 2, or 3 letters of day names in mini calendar. +- Missing a closing div tag in the month view. +- Get rid of deprecated function date_time(). +- Fix date format for day view. +- Wrong field name used to select date format. +- Set the 'today' class before incrementing the date. +- More clean up of themes to be sure both remote and local items have a reasonable display and to provide a theme to consistantly display dates. +- Fix title and url of mini calendar. +- Get iCal import working again in new version. +- Non-calendar views should now be working, so you can switch between calendar, table, list, teasers, and nodes for the display for each time period. +- Make sure $node->url is set so the link to the node works. +- Move more of the code to the .inc file. +- Clean up the date selector and add a new function to detect the calendar week from a date. +- Add a dependency on Date Timezone. +- Fix a critical typo that keeps more than one value from showing up for a day. +- Clean up theme code. +- Make the new date selector dependent on the Date Popup module. +- Rework the calendar to pull values from a template table so we can browse and navigate by calendar week. This simplifies the code and hopefully will speed up processing the calendar since the database is doing the work of constructing the calendar template instead of using PHP computations. This method is also a more accurate way of computing calendar weeks. Requires an update to populate a template table. This works because there are only 14 possible calendar templates no matter how many years you go back or forward. +- Add in the jQuery popup selector as a method to jump to different dates. +- Fix theme error in day view that repeated all previous items with each new item. +- Make sure blank nodes have the right values to create blank calendar pages. +- Standardize on use of date_format_date() to get translations done on the formatted values of date parts. +- Clean up css for month date boxes so display in Firefox and IE looks the same. +- Lost the node nid in some places which kept dates from showing up. +- Have to keep views handlers in calendar.module not in calendar_api.inc so they can be discovered when needed. +- Updating Calendar HEAD with new version of Calendar module that works with the new 5.2 Date API in Date HEAD. diff --git a/sites/all/modules/calendar/LICENSE.txt b/sites/all/modules/calendar/LICENSE.txt new file mode 100644 index 0000000..2c095c8 --- /dev/null +++ b/sites/all/modules/calendar/LICENSE.txt @@ -0,0 +1,274 @@ +GNU GENERAL PUBLIC LICENSE + + Version 2, June 1991 + +Copyright (C) 1989, 1991 Free Software Foundation, Inc. 675 Mass Ave, +Cambridge, MA 02139, USA. Everyone is permitted to copy and distribute +verbatim copies of this license document, but changing it is not allowed. + + Preamble + +The licenses for most software are designed to take away your freedom to +share and change it. By contrast, the GNU General Public License is +intended to guarantee your freedom to share and change free software--to +make sure the software is free for all its users. This General Public License +applies to most of the Free Software Foundation's software and to any other +program whose authors commit to using it. (Some other Free Software +Foundation software is covered by the GNU Library General Public License +instead.) You can apply it to your programs, too. + +When we speak of free software, we are referring to freedom, not price. Our +General Public Licenses are designed to make sure that you have the +freedom to distribute copies of free software (and charge for this service if +you wish), that you receive source code or can get it if you want it, that you +can change the software or use pieces of it in new free programs; and that +you know you can do these things. + +To protect your rights, we need to make restrictions that forbid anyone to +deny you these rights or to ask you to surrender the rights. These restrictions +translate to certain responsibilities for you if you distribute copies of the +software, or if you modify it. + +For example, if you distribute copies of such a program, whether gratis or for +a fee, you must give the recipients all the rights that you have. You must make +sure that they, too, receive or can get the source code. And you must show +them these terms so they know their rights. + +We protect your rights with two steps: (1) copyright the software, and (2) +offer you this license which gives you legal permission to copy, distribute +and/or modify the software. + +Also, for each author's protection and ours, we want to make certain that +everyone understands that there is no warranty for this free software. If the +software is modified by someone else and passed on, we want its recipients +to know that what they have is not the original, so that any problems +introduced by others will not reflect on the original authors' reputations. + +Finally, any free program is threatened constantly by software patents. We +wish to avoid the danger that redistributors of a free program will individually +obtain patent licenses, in effect making the program proprietary. To prevent +this, we have made it clear that any patent must be licensed for everyone's +free use or not licensed at all. + +The precise terms and conditions for copying, distribution and modification +follow. + + GNU GENERAL PUBLIC LICENSE + TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND + MODIFICATION + +0. This License applies to any program or other work which contains a notice +placed by the copyright holder saying it may be distributed under the terms +of this General Public License. The "Program", below, refers to any such +program or work, and a "work based on the Program" means either the +Program or any derivative work under copyright law: that is to say, a work +containing the Program or a portion of it, either verbatim or with +modifications and/or translated into another language. (Hereinafter, translation +is included without limitation in the term "modification".) Each licensee is +addressed as "you". + +Activities other than copying, distribution and modification are not covered +by this License; they are outside its scope. The act of running the Program is +not restricted, and the output from the Program is covered only if its contents +constitute a work based on the Program (independent of having been made +by running the Program). Whether that is true depends on what the Program +does. + +1. You may copy and distribute verbatim copies of the Program's source +code as you receive it, in any medium, provided that you conspicuously and +appropriately publish on each copy an appropriate copyright notice and +disclaimer of warranty; keep intact all the notices that refer to this License +and to the absence of any warranty; and give any other recipients of the +Program a copy of this License along with the Program. + +You may charge a fee for the physical act of transferring a copy, and you +may at your option offer warranty protection in exchange for a fee. + +2. You may modify your copy or copies of the Program or any portion of it, +thus forming a work based on the Program, and copy and distribute such +modifications or work under the terms of Section 1 above, provided that you +also meet all of these conditions: + +a) You must cause the modified files to carry prominent notices stating that +you changed the files and the date of any change. + +b) You must cause any work that you distribute or publish, that in whole or in +part contains or is derived from the Program or any part thereof, to be +licensed as a whole at no charge to all third parties under the terms of this +License. + +c) If the modified program normally reads commands interactively when run, +you must cause it, when started running for such interactive use in the most +ordinary way, to print or display an announcement including an appropriate +copyright notice and a notice that there is no warranty (or else, saying that +you provide a warranty) and that users may redistribute the program under +these conditions, and telling the user how to view a copy of this License. +(Exception: if the Program itself is interactive but does not normally print such +an announcement, your work based on the Program is not required to print +an announcement.) + +These requirements apply to the modified work as a whole. If identifiable +sections of that work are not derived from the Program, and can be +reasonably considered independent and separate works in themselves, then +this License, and its terms, do not apply to those sections when you distribute +them as separate works. But when you distribute the same sections as part +of a whole which is a work based on the Program, the distribution of the +whole must be on the terms of this License, whose permissions for other +licensees extend to the entire whole, and thus to each and every part +regardless of who wrote it. + +Thus, it is not the intent of this section to claim rights or contest your rights to +work written entirely by you; rather, the intent is to exercise the right to +control the distribution of derivative or collective works based on the +Program. + +In addition, mere aggregation of another work not based on the Program +with the Program (or with a work based on the Program) on a volume of a +storage or distribution medium does not bring the other work under the scope +of this License. + +3. You may copy and distribute the Program (or a work based on it, under +Section 2) in object code or executable form under the terms of Sections 1 +and 2 above provided that you also do one of the following: + +a) Accompany it with the complete corresponding machine-readable source +code, which must be distributed under the terms of Sections 1 and 2 above +on a medium customarily used for software interchange; or, + +b) Accompany it with a written offer, valid for at least three years, to give +any third party, for a charge no more than your cost of physically performing +source distribution, a complete machine-readable copy of the corresponding +source code, to be distributed under the terms of Sections 1 and 2 above on +a medium customarily used for software interchange; or, + +c) Accompany it with the information you received as to the offer to distribute +corresponding source code. (This alternative is allowed only for +noncommercial distribution and only if you received the program in object +code or executable form with such an offer, in accord with Subsection b +above.) + +The source code for a work means the preferred form of the work for +making modifications to it. For an executable work, complete source code +means all the source code for all modules it contains, plus any associated +interface definition files, plus the scripts used to control compilation and +installation of the executable. However, as a special exception, the source +code distributed need not include anything that is normally distributed (in +either source or binary form) with the major components (compiler, kernel, +and so on) of the operating system on which the executable runs, unless that +component itself accompanies the executable. + +If distribution of executable or object code is made by offering access to +copy from a designated place, then offering equivalent access to copy the +source code from the same place counts as distribution of the source code, +even though third parties are not compelled to copy the source along with the +object code. + +4. You may not copy, modify, sublicense, or distribute the Program except as +expressly provided under this License. Any attempt otherwise to copy, +modify, sublicense or distribute the Program is void, and will automatically +terminate your rights under this License. However, parties who have received +copies, or rights, from you under this License will not have their licenses +terminated so long as such parties remain in full compliance. + +5. You are not required to accept this License, since you have not signed it. +However, nothing else grants you permission to modify or distribute the +Program or its derivative works. These actions are prohibited by law if you +do not accept this License. Therefore, by modifying or distributing the +Program (or any work based on the Program), you indicate your acceptance +of this License to do so, and all its terms and conditions for copying, +distributing or modifying the Program or works based on it. + +6. Each time you redistribute the Program (or any work based on the +Program), the recipient automatically receives a license from the original +licensor to copy, distribute or modify the Program subject to these terms and +conditions. You may not impose any further restrictions on the recipients' +exercise of the rights granted herein. You are not responsible for enforcing +compliance by third parties to this License. + +7. If, as a consequence of a court judgment or allegation of patent +infringement or for any other reason (not limited to patent issues), conditions +are imposed on you (whether by court order, agreement or otherwise) that +contradict the conditions of this License, they do not excuse you from the +conditions of this License. If you cannot distribute so as to satisfy +simultaneously your obligations under this License and any other pertinent +obligations, then as a consequence you may not distribute the Program at all. +For example, if a patent license would not permit royalty-free redistribution +of the Program by all those who receive copies directly or indirectly through +you, then the only way you could satisfy both it and this License would be to +refrain entirely from distribution of the Program. + +If any portion of this section is held invalid or unenforceable under any +particular circumstance, the balance of the section is intended to apply and +the section as a whole is intended to apply in other circumstances. + +It is not the purpose of this section to induce you to infringe any patents or +other property right claims or to contest validity of any such claims; this +section has the sole purpose of protecting the integrity of the free software +distribution system, which is implemented by public license practices. Many +people have made generous contributions to the wide range of software +distributed through that system in reliance on consistent application of that +system; it is up to the author/donor to decide if he or she is willing to +distribute software through any other system and a licensee cannot impose +that choice. + +This section is intended to make thoroughly clear what is believed to be a +consequence of the rest of this License. + +8. If the distribution and/or use of the Program is restricted in certain +countries either by patents or by copyrighted interfaces, the original copyright +holder who places the Program under this License may add an explicit +geographical distribution limitation excluding those countries, so that +distribution is permitted only in or among countries not thus excluded. In such +case, this License incorporates the limitation as if written in the body of this +License. + +9. The Free Software Foundation may publish revised and/or new versions +of the General Public License from time to time. Such new versions will be +similar in spirit to the present version, but may differ in detail to address new +problems or concerns. + +Each version is given a distinguishing version number. If the Program specifies +a version number of this License which applies to it and "any later version", +you have the option of following the terms and conditions either of that +version or of any later version published by the Free Software Foundation. If +the Program does not specify a version number of this License, you may +choose any version ever published by the Free Software Foundation. + +10. If you wish to incorporate parts of the Program into other free programs +whose distribution conditions are different, write to the author to ask for +permission. For software which is copyrighted by the Free Software +Foundation, write to the Free Software Foundation; we sometimes make +exceptions for this. Our decision will be guided by the two goals of +preserving the free status of all derivatives of our free software and of +promoting the sharing and reuse of software generally. + + NO WARRANTY + +11. BECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE, +THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT +PERMITTED BY APPLICABLE LAW. EXCEPT WHEN OTHERWISE +STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR +OTHER PARTIES PROVIDE THE PROGRAM "AS IS" WITHOUT +WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, +INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES +OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR +PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND +PERFORMANCE OF THE PROGRAM IS WITH YOU. SHOULD THE +PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL +NECESSARY SERVICING, REPAIR OR CORRECTION. + +12. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR +AGREED TO IN WRITING WILL ANY COPYRIGHT HOLDER, OR +ANY OTHER PARTY WHO MAY MODIFY AND/OR +REDISTRIBUTE THE PROGRAM AS PERMITTED ABOVE, BE +LIABLE TO YOU FOR DAMAGES, INCLUDING ANY GENERAL, +SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES +ARISING OUT OF THE USE OR INABILITY TO USE THE +PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF DATA +OR DATA BEING RENDERED INACCURATE OR LOSSES +SUSTAINED BY YOU OR THIRD PARTIES OR A FAILURE OF THE +PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS), EVEN +IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF +THE POSSIBILITY OF SUCH DAMAGES. + + END OF TERMS AND CONDITIONS diff --git a/sites/all/modules/calendar/calendar.css b/sites/all/modules/calendar/calendar.css new file mode 100644 index 0000000..2148714 --- /dev/null +++ b/sites/all/modules/calendar/calendar.css @@ -0,0 +1,372 @@ +/* calendar calendar table styles */ +.calendar-calendar tr.odd, .calendar-calendar tr.even { + background-color:#fff; +} +.calendar-calendar table { + border-collapse: collapse; + border-spacing: 0; + margin:0 auto; + padding:0; + width: 100%; /* Setting at 100% causes problem in Internet Explorer. */ +} +.calendar-calendar .month-view table { + border:none; + padding:0; + margin:0; + width:100%; +} + + /* IE needs a little help to get the side by side tables to the right size */ +.calendar-calendar .year-view td { + width:32%; + padding:1px; + border:none; +} + +.calendar-calendar .year-view td table td { + width:13%; + padding:0; +} + +.calendar-calendar tr { + padding: 0; + margin: 0; + background-color: white; +} +.calendar-calendar th { + color: #fff; + background-color: #ccc; + text-align: center; + margin:0; +} +.calendar-calendar th a { + font-weight: bold; + color: #fff; + background-color: #ccc; +} +.calendar-calendar td { + width: 12%; /* 14% is about 1/7 of total table width */ + min-width: 12%; + border: 1px solid #ccc; + color: #777; + text-align: right; + vertical-align: top; + margin: 0; + padding:0; +} + +/* simplify the mini calendar by removing borders */ +.calendar-calendar .mini { + border:none; + } + +/* format for the week number in the first cell */ +.calendar-calendar td.week { + width:1%; + min-width:1%; + } +.calendar-calendar .week { + clear:both; + font-style: normal; + color: #555; + font-size: 0.8em; +} +.calendar-calendar .week a { + font-weight:normal; +} + +/* IE6 does not support min-height, using Min-Height fast hack from http://www.dustindiaz.com/min-height-fast-hack */ +.calendar-calendar .inner { + min-height:5em; + height:auto !important; + height:5em; + padding:0; + margin:0; +} +.calendar-calendar .inner div { + padding:0; + margin:0; +} +/* Make sure paragraphs buried in calendar cells use padding, not margins, for separation so the background color doesn't come through. */ +.calendar-calendar .inner p { + padding:0 0 .8em 0; + margin:0; +} +.calendar-calendar td a { + font-weight: bold; + text-decoration: none; +} +.calendar-calendar td a:hover { + text-decoration: underline; +} +.calendar-calendar td.year, +.calendar-calendar td.month { + text-align: center; +} + +/* format days of the week header cells */ +.calendar-calendar th.days { + color: #ccc; + background-color: #224; + text-align: center; + padding:1px; + margin:0; + } + +/* floating day number div */ +.calendar-calendar div.day { + float: right; + text-align: center; + padding: 0.125em 0.25em 0 0.25em; + margin: 0; + background-color: #f3f3f3; + border: 1px solid gray; + border-width: 0 0 1px 1px; + clear:both; + width:1.5em; +} + +/* individual node container */ +.calendar-calendar div.calendar { + background-color: #fff; + border: solid 1px #ddd; + text-align: left; + margin:0 .25em .25em 0; + width: 96%; + float:right; /* needed to keep IE from hiding the floating day number */ + clear:both; +} +/* No floating of day view content because there is no floating day number */ +.calendar-calendar .day-view div.calendar { + float:none; + width:98%; + margin:1% 1% 0 1%; +} + +.calendar-calendar div.title { + font-size:.8em; + text-align:center; +} + +.calendar-calendar div.title a { + color: #000; +} +.calendar-calendar div.title a:hover { + color: #c00; +} +.calendar-calendar .content { + clear:both; + padding: 3px; + padding-left: 5px; +} +.calendar div.form-item { + white-space: normal; +} + +table td.mini, +table th.mini, +table.mini td.week { + padding:0 1px 0 0; + margin:0; + } +table td.mini a { + font-weight:normal; + } +.calendar-calendar .mini-day-off { + padding:0px; +} +.calendar-calendar .mini-day-on { + padding:0px; +} +table .mini-day-on a { + text-decoration:underline; + } +.calendar-calendar .mini .title { + font-size:.8em; + } +.mini .calendar-calendar .week { + font-size:.7em; + } +.mini-row { + width:100%; + border:none; +} +.mini{ + width:32%; + vertical-align:top; + } + + +/* formatting for the legend stripe and block */ +.calendar-calendar .stripe { + height: 5px; + width: auto; + font-size:1px !important; + line-height:1px !important; +} +.calendar-calendar .day-view .stripe { + width:100%; +} +table.calendar-legend { + background-color:#ccc; + width:100%; + margin:0; + padding:0; +} +table.calendar-legend tr.odd .stripe, +table.calendar-legend tr.even .stripe { + height:12px !important; + font-size:9px !important; + line-height:10px !important; +} +.calendar-legend td { + text-align:left; +} + +.calendar-empty { + font-size:1px; + line-height:1px; +} + +/* formatting for the full day view */ +.calendar-calendar td.calendar-agenda-hour { + font-family:serif; + text-align:right; + border:none; + border-top:1px #333 dotted; + padding-top:.25em; + width:1%; +} +.calendar-calendar td.calendar-agenda-no-hours { + min-width:1%; +} +.calendar-calendar td.calendar-agenda-hour .calendar-hour { + font-size:1.2em; + font-weight:bold; +} +.calendar-calendar td.calendar-agenda-hour .calendar-ampm { + font-size:1em; +} +.calendar-calendar td.calendar-agenda-items { + border:1px #333 dotted; + text-align:left; +} +.calendar-calendar td.calendar-agenda-items div.calendar { + width:auto; + padding:.25em; + margin:0; +} +.calendar-calendar div.calendar div.inner .calendar-agenda-empty { + width:100%; + text-align:center; + vertical-align:middle; + padding:1em 0; + background-color:#fff; +} + +/* the popup date selector for jumping to a new date */ +.calendar-date-select form { + text-align:right; + float:right; + width:25%; +} +.calendar-date-select div, +.calendar-date-select input, +.calendar-date-select label { + text-align:right; + padding:0; + margin:0; + float:right; + clear:both; +} +.calendar-date-select .description { + float:right; +} +.calendar-label { + font-weight:bold; + display:block; + clear:both; +} + +.calendar-calendar div.date-nav { + background-color:#ccc; + color:#777; + padding:0.2em; + width:auto; + border:1px solid #ccc; +} +.calendar-calendar div.date-nav a, +.calendar-calendar div.date-nav h3 { + color:#777; +} +.calendar-calendar th.days { + background-color:#eee; + color:#777; + font-weight:bold; + border:1px solid #ccc; +} +.calendar-calendar td.empty { + background:#ccc; + border-color:#ccc; +} +.calendar-calendar table.mini td.empty { + background:#fff; + border-color:#fff; +} +.calendar-calendar td div.day { + border:1px solid #ccc; + border-top:none; + border-right:none; + margin-bottom:2px; +} +.calendar-calendar td .inner div, +.calendar-calendar td .inner div a { + background:#eee; +} +/* Set small font size for all items in calendar div, themes can override this. */ +/* Use x-small instead of em to avoid multiplying effect in nested items. */ +.calendar-calendar div.calendar { + border:none; + font-size:x-small; +} +.calendar-calendar td .inner div.calendar div, +.calendar-calendar td .inner div.calendar div a { + border:none; + background:#ffc; + padding:0 2px; +} +.calendar-calendar td .inner div.calendar div.calendar-more, +.calendar-calendar td .inner div.calendar div.calendar-more a { + color:#444; + background:#fff; + text-align:right; +} +.calendar-calendar td .inner .view-field, +.calendar-calendar td .inner .view-field a { + color:#444; + font-weight:normal; +} + +.calendar-calendar td span.date-display-single, +.calendar-calendar td span.date-display-start, +.calendar-calendar td span.date-display-end, +.calendar-calendar td span.date-display-separator { + font-weight:bold; +} +.calendar-calendar td .inner div.day a { + color:#4b85ac; +} +.calendar-calendar tr td.today, +.calendar-calendar tr.odd td.today, +.calendar-calendar tr.even td.today { + background-color:#C3D6E4; +} +.calendar-calendar td .inner div.calendar div div.view-data-node-data-field-date-field-date-value { + border-bottom:1px solid #ccc; +} + +/* The following are not used by default but are available for themes */ +.calendar-calendar td.past {} +.calendar-calendar td.future {} +.calendar-calendar td.has-events {} +.calendar-calendar td.has-no-events {} \ No newline at end of file diff --git a/sites/all/modules/calendar/calendar.info b/sites/all/modules/calendar/calendar.info new file mode 100644 index 0000000..a669bc8 --- /dev/null +++ b/sites/all/modules/calendar/calendar.info @@ -0,0 +1,16 @@ +; $Id: calendar.info,v 1.8 2008/04/23 23:42:53 karens Exp $ +name = Calendar +description = Views plugin to display views containing dates as Calendars. +dependencies[] = views +dependencies[] = date_api +dependencies[] = date_timezone +package = Date/Time +core = 6.x + + +; Information added by drupal.org packaging script on 2011-01-03 +version = "6.x-2.4" +core = "6.x" +project = "calendar" +datestamp = "1294072550" + diff --git a/sites/all/modules/calendar/calendar.install b/sites/all/modules/calendar/calendar.install new file mode 100644 index 0000000..9a69003 --- /dev/null +++ b/sites/all/modules/calendar/calendar.install @@ -0,0 +1,157 @@ +update.php and run the remaining updates.', array('@update-php' => base_path() .'update.php?op=selection')), 'warning', FALSE); + $ret['#abort'] = array('success' => FALSE, 'query' => t('calendar.module has updates, but cannot be updated until views.module is updated first.')); + + return $ret; + } + + variable_del('calendar_empty_arg'); + + // Can't use variable_del because we don't have a reliable + // way to find the old view names. + db_query("DELETE FROM {variable} WHERE name LIKE 'calendar_%'"); + cache_clear_all('variables', 'cache'); + return $ret; +} + +/** + * Make sure handlers for disabled Calendar iCal module don't get saved in the view. + */ +function calendar_update_6001() { + $ret = array(); + // don't attempt to upgrade if views is not yet upgraded. + if (drupal_get_installed_schema_version('views', TRUE) < 6000) { + $ret = array(); + drupal_set_message(t('Calendar module cannot be updated until after Views has been updated. Please return to update.php and run the remaining updates.', array('@update-php' => base_path() .'update.php?op=selection')), 'warning', FALSE); + $ret['#abort'] = array('success' => FALSE, 'query' => t('calendar.module has updates, but cannot be updated until views.module is updated first.')); + + return $ret; + } + if (!module_exists('calendar_ical')) { + $ret[] = update_sql("DELETE FROM {views_display} WHERE display_plugin = 'ical'"); + } + return $ret; +} + +function calendar_update_6002() { + $ret = array(); + // don't attempt to upgrade if views is not yet upgraded. + if (drupal_get_installed_schema_version('views', TRUE) < 6000) { + $ret = array(); + drupal_set_message(t('Calendar module cannot be updated until after Views has been updated. Please return to update.php and run the remaining updates.', array('@update-php' => base_path() .'update.php?op=selection')), 'warning', FALSE); + $ret['#abort'] = array('success' => FALSE, 'query' => t('calendar.module has updates, but cannot be updated until views.module is updated first.')); + + return $ret; + } + $periods = array( + 'calendar_month' => 'calendar_period_1', + 'calendar_year' => 'calendar_period_2', + 'calendar_day' => 'calendar_period_3', + 'calendar_week' => 'calendar_period_4', + 'calendar_block_view' => 'calendar_period_5', + ); + $result = db_query("SELECT * FROM {views_display} d LEFT JOIN {views_view} v ON d.vid = v.vid"); + drupal_load('module', 'views'); + while ($row = db_fetch_array($result)) { + if (in_array($row['display_plugin'], array_keys($periods))) { + $id = $row['id']; + $options = unserialize($row['display_options']); + if ($row['display_plugin'] == 'calendar_block_view') { + $options['calendar_type'] = 'month'; + $options['displays'] = array('calendar_1' => 0, 'default' => 0, 'calendar_block_1' => 'calendar_block_1'); + } + else { + $options['calendar_type'] = str_replace('calendar_', '', $row['display_plugin']); + $options['displays'] = array('calendar_1' => 'calendar_1', 'default' => 0, 'calendar_block_1' => 0); + } + $row['id'] = $periods[$row['id']]; + $row['display_plugin'] = 'calendar_period'; + $row['display_options'] = serialize($options); + db_query("UPDATE {views_display} SET id='%s', display_plugin='%s', display_options='%s' WHERE id='%s'", $row['id'], $row['display_plugin'], $row['display_options'], $id); + } + elseif ($row['display_plugin'] == 'calendar' || $row['display_plugin'] == 'calendar_block') { + db_query("UPDATE {views_display} SET id='%s' WHERE id='%s'", $row['id'] .'_1', $row['id']); + } + db_query("DELETE FROM {views_object_cache} WHERE name = '%s'", $row['name']); + } + views_invalidate_cache(); + $ret[] = array('success' => TRUE, 'query' => 'Updated calendar displays to use new handlers.'); + return $ret; +} \ No newline at end of file diff --git a/sites/all/modules/calendar/calendar.module b/sites/all/modules/calendar/calendar.module new file mode 100644 index 0000000..aa83ed1 --- /dev/null +++ b/sites/all/modules/calendar/calendar.module @@ -0,0 +1,921 @@ + 2, + 'path' => drupal_get_path('module', 'calendar') .'/includes', + ); +} + +/** + * @file + * Adds calendar filtering and displays to Views. + */ +/** + * Implementation of hook_help(). + */ +function calendar_help($section, $arg) { + switch ($section) { + case 'admin/help#calendar': + return t("

View complete documentation at !link.

", array('!link' => 'http://drupal.org/node/120710')); + } +} + +function calendar_init() { + // If the multiday module is enabled, let it control the css. + if (module_exists('calendar_multiday') || substr($_GET['q'], 0, 24) == 'admin/build/modules/list') { + return; + } + // The css for Farbtastic color picker, painless to add it here + // even though it isn't needed everywhere. + drupal_add_css('misc/farbtastic/farbtastic.css'); + drupal_add_css(drupal_get_path('module', 'calendar') .'/calendar.css'); + require_once('./'. drupal_get_path('module', 'calendar') .'/theme/theme.inc'); +} + +function calendar_theme() { + if (module_exists('calendar_multiday')) { + return array(); + } + $path = drupal_get_path('module', 'calendar'); + $base = array( + 'file' => 'theme.inc', + 'path' => "$path/theme", + ); + return array( + 'calendar_day_node' => $base + array( + 'template' => 'calendar-day-node', + 'arguments' => array('node' => NULL, 'view' => NULL), + ), + 'calendar_month_node' => $base + array( + 'template' => 'calendar-month-node', + 'arguments' => array('node' => NULL, 'view' => NULL), + ), + 'calendar_week_node' => $base + array( + 'template' => 'calendar-week-node', + 'arguments' => array('node' => NULL, 'view' => NULL), + ), + 'calendar_month_multiple_node' => $base + array( + 'template' => 'calendar-month-multiple-node', + 'arguments' => array('curday' => NULL, 'count' => NULL, 'view' => NULL, 'types' => NULL), + ), + 'calendar_week_multiple_node' => $base + array( + 'template' => 'calendar-week-multiple-node', + 'arguments' => array('curday' => NULL, 'count' => NULL, 'view' => NULL, 'types' => NULL), + ), + 'calendar_datebox' => $base + array( + 'template' => 'calendar-datebox', + 'arguments' => array( + 'date' => NULL, 'view' => NULL, 'items' => NULL, 'selected' => NULL), + ), + 'calendar_date_combo' => $base + array( + 'arguments' => array('node', 'lable', 'view'), + ), + 'calendar_empty_day' => $base + array( + 'arguments' => array('curday', 'view'), + ), + 'calendar_stripe_legend' => $base + array( + 'arguments' => array('stripe_labels'), + ), + 'calendar_stripe_stripe' => $base + array( + 'arguments' => array('node'), + ), + 'calendar_colorpicker' => $base + array( + 'arguments' => array('element'), + ), + 'calendar_colorfield' => $base + array( + 'arguments' => array('element'), + ), + 'calendar_time_row_heading' => $base + array( + 'arguments' => array('start_time', 'next_start_time', 'curday_date'), + ), + ); +} + +/** + * TODO need to identify type of timezone handling needed for each date field + */ +function calendar_offset($field_name) { + $default_offset = variable_get('date_default_timezone', 0); + $configurable_zones = variable_get('configurable_timezones', 1); +} + +/** + * A function to test the validity of various date parts + */ +function calendar_part_is_valid($value, $type) { + if ( !preg_match('/^[0-9]*$/', $value) ) { + return false; + } + $value = intval($value); + if ($value <= 0) return false; + switch ($type) { + case 'year': + if ($value < DATE_MIN_YEAR) return false; + break; + case 'month': + if ($value < 0 || $value > 12) return false; + break; + case 'day': + if ($value < 0 || $value > 31) return false; + break; + case 'week': + if ($value < 0 || $value > 53) return false; + } + return true; +} + +/** + * implementation of hook_block() + */ +function calendar_block($op = 'list', $delta = 0) { + switch ($op) { + case 'list' : + $blocks[0]['info'] = t('Calendar Legend.'); + return $blocks; + break; + case 'view' : + switch ($delta) { + case 0: + $block['subject'] = t('Calendar Legend'); + $content = theme('calendar_stripe_legend'); + $block['content'] = !empty($content) ? '
'. $content .'
' : ''; + return $block; + } + } +} + +/** + * Calendar display types + */ +function calendar_display_types() { + return array('year' => t('Year'), 'month' => t('Month'), 'day' => t('Day'), 'week' => t('Week')); +} + +/** + * Figure out which type of display to use, + * based on the current argument. + * + * @return year, month, day, or week. + */ +function calendar_current_type($view) { + if (!is_object($view) || !isset($view->argument) || !is_array($view->argument)) { + if (!empty($view->date_info->default_display)) { + return $view->date_info->default_display; + } + return FALSE; + } + $i = 0; + $date_handler = new date_sql_handler(); + foreach ($view->argument as $argument) { + if ($argument['id'] == 'date_argument') { + $parts = array_keys($date_handler->arg_parts($view->args[$i])); + break; + } + $i++; + } + return array_pop($parts); +} + +/** + * Create a stripe. + * + * @param $node - the node object + * @param $query_name - the views queryname for this date field + * @param $delta - the delta for this field, used to distinguish fields that appear more than once in the calendar + * @param $stripe - the hex code for this stripe. + * @param $label - the label to give this stripe. + * + * TODO Reconsider use of $GLOBALS as a method of triggering the legend, there + * may be a better way. + */ +function calendar_node_stripe($view, &$node, $query_name, $delta, $stripe = NULL, $label = '') { + $colors = isset($view->date_info->calendar_colors) ? $view->date_info->calendar_colors : array(); + if (empty($colors)) { + return; + } + + $type_names = node_get_types('names'); + $type = $node->raw->node_type; + if(!(isset($node->stripe))){ + $node->stripe = array(); + $node->stripe_label = array(); + } + if (!$label && array_key_exists($type, $type_names)) { + $label = $type_names[$type]; + } + if (!$stripe) { + if (array_key_exists($type, $colors)) { + $stripe = $colors[$type]; + } + else { + $stripe = ''; + } + } + + $node->stripe[] = $stripe; + $node->stripe_label[] = $label; + $GLOBALS['calendar_stripe_labels'][][$type] = array('stripe' => $stripe, 'label' => $label); + return $stripe; +} + + /** + * Create a stripe based on a taxonomy term. + * + * @param $node - the node object + * @param $query_name - the views queryname for this date field + * @param $delta - the delta for this field, used to distinguish fields that appear more than once in the calendar + * @param $stripe - the hex code for this stripe. + * @param $label - the label to give this stripe. + * + * TODO Reconsider use of $GLOBALS as a method of triggering the legend, there + * may be a better way. + */ + +function calendar_node_taxonomy_stripe($view, &$node, $query_name, $delta, $stripe = NULL, $label = '') { + $colors_taxonomy = isset($view->date_info->calendar_colors_taxonomy) ? $view->date_info->calendar_colors_taxonomy : array(); + if (empty($colors_taxonomy)) { + return; + } + + // Rename the vid added by Views to the normal name that + // taxonomy will expect, it's in the raw results. + $node->vid = $node->raw->node_vid; + $terms_for_node = taxonomy_node_get_terms($node); + if(!(isset($node->stripe))){ + $node->stripe = array(); + $node->stripe_label = array(); + } + if (count($terms_for_node)){ + foreach($terms_for_node as $term_for_node){ + if (!array_key_exists($term_for_node->tid, $colors_taxonomy)) { + continue; + } + $stripe = $colors_taxonomy[$term_for_node->tid]; + $stripe_label = $term_for_node->name; + $node->stripe[] = $stripe; + $node->stripe_label[] = $stripe_label; + $GLOBALS['calendar_stripe_labels'][][$term_for_node->tid] = array('stripe' => $stripe, 'label' => $stripe_label); + } + } + else { + $node->stripe[] = ''; + $node->stripe_label[] = ''; + } + return; +} + + +/** + * Create a stripe based on group. + * + * @param $node - the node object + * @param $query_name - the views queryname for this date field + * @param $delta - the delta for this field, used to distinguish fields that appear more than once in the calendar + * @param $stripe - the hex code for this stripe. + * @param $label - the label to give this stripe. + * + * TODO Reconsider use of $GLOBALS as a method of triggering the legend, there + * may be a better way. + */ +function calendar_node_group_stripe($view, &$node, $query_name, $delta, $stripe = NULL, $label = '') { + $colors_group = isset($view->date_info->calendar_colors_group) ? $view->date_info->calendar_colors_group : array(); + if (empty($colors_group)) { + return; + } + if (!function_exists('og_get_node_groups')) { + return; + } + + $groups_for_node = og_get_node_groups($node); + if(!(isset($node->stripe))){ + $node->stripe = array(); + $node->stripe_label = array(); + } + if (count($groups_for_node)){ + foreach($groups_for_node as $gid => $group_name){ + if (!array_key_exists($gid, $colors_group)) { + continue; + } + $stripe = $colors_group[$gid]; + $stripe_label = $group_name; + $node->stripe[] = $stripe; + $node->stripe_label[] = $stripe_label; + $GLOBALS['calendar_stripe_labels'][][$gid] = array('stripe' => $stripe, 'label' => $stripe_label); + } + } + else { + $node->stripe[] = ''; + $node->stripe_label[] = ''; + } + return $stripe; +} + + +/** + * Helper function to figure out a group gid to use in blocks. + * + * @return an array of group nodes that are relevant. + * @todo this may need more work. + */ +function calendar_og_groups($view) { + if (!$groupnode = og_get_group_context()) { + global $user; + $groupnodes = array_keys($user->og_groups); + } + else { + $groupnodes = array($groupnode->nid); + } + return $groupnodes; +} + +/** + * A selector to jump to a new date in the calendar. + * + * @param unknown_type $view + * @return unknown + */ +function calendar_date_select($view) { + return '
'. drupal_get_form('calendar_date_select_form', $view) .'
'; +} + +/** + * The date selector form. + * + * @param object $view + * @return the form element + * + * @TODO is the title desired here or does it take up too much space?? + */ +function calendar_date_select_form(&$form_state, $view) { + $format = date_limit_format(variable_get('date_format_short', 'm/d/Y - H:i'), array('year', 'month', 'day')); + $form['calendar_goto'] = array( + //'#title' => t('Calendar date'), + '#type' => module_exists('date_popup') ? 'date_popup' : 'date_select', + '#default_value' => date_format($view->date_info->min_date, 'Y-m-d'), + '#date_timezone' => date_default_timezone_name(), + '#date_format' => $format, + ); + $form['calendar_type'] = array( + '#type' => 'hidden', + '#value' => $view->date_info->calendar_type, + ); + $form['view_name'] = array( + '#type' => 'hidden', + '#value' => $view->name, + ); + $form['view_url'] = array( + '#type' => 'hidden', + '#value' => $view->get_url(), + ); + $pos = calendar_arg_position($view); + $form['calendar_previous_arg'] = array( + '#type' => 'hidden', + '#value' => $view->args[$pos], + ); + $form['submit'] = array( + '#type' => 'submit', + '#value' => t('Change date'), + ); + return $form; +} + +function calendar_arg_position($view) { + $pos = 0; + foreach ($view->argument as $argument) { + if ($argument->definition['handler'] == 'date_api_argument_handler') { + return $pos; + } + $pos++; + } +} +/** + * Get the url for a calendar node. + * + * @param $node - a calendar node object + * @param $default - a default url to use when nothing specific is provided. + */ +function calendar_get_node_link($node, $default = NULL) { + if (isset($node->url)) { + return url($node->url, array('absolute' => TRUE)); + } + elseif (empty($node->remote) && is_numeric($node->nid)) { + return url("node/$node->nid", array('absolute' => TRUE)); + } + elseif (!empty($default)) { + return url($default, array('absolute' => TRUE)); + } +} + +function calendar_groupby_times($type = '') { + $times = array(); + switch ($type) { + case 'hour': + for ($i = 0; $i <= 23; $i++) { + $times[] = date_pad($i) .':00:00'; + } + break; + case 'half': + for ($i = 0; $i <= 23; $i++) { + $times[] = date_pad($i) .':00:00'; + $times[] = date_pad($i) .':30:00'; + } + break; + default: + break; + } + return $times; +} + +/** + * Define some error messages. + */ +function calendar_errors($error) { + switch ($error) { + case 'missing_argument_default': + return t("The Date argument in this view must be set up to provide a default value set to the current date. Edit the argument, find 'Action to take if argument is not present.', choose 'Provide default argument', then select 'Current date'."); + } +} +/** + * Implementation of hook_elements. + * + * Much of the colorpicker code was adapted from the Colorpicker module. + * That module has no stable release yet nor any D6 branch. + * + * TODO Consider dropping the duplicate code and adding a dependency + * when that module is more stable, if calendar module customizations will + * work in it. + */ +function calendar_elements() { + // the Farbtastic colorpicker + $type['calendar_colorpicker'] = array( + '#attributes' => array('class' => 'calendar_colorpicker'), + '#input' => TRUE, + ); + + // a textfield to associate with the Farbtastic colorpicker + $type['calendar_colorfield'] = array( + '#attributes' => array('class' => 'calendar_colorfield'), + '#input' => TRUE, + '#validate' => array('calendar_validate_hex_color' => array()) + ); + return $type; +} + +/** + * Check to make sure the user has entered a valid 6 digit hex color. + */ +function calendar_validate_hex_color($element) { + if (!$element['#required'] && empty($element['#value'])) { + return; + } + if (!preg_match('/^#(?:(?:[a-f\d]{3}){1,2})$/i', $element['#value'])) { + form_error($element, "'". check_plain($element['#value']) ."'". t(' is not a valid hex color')); + } + else { + form_set_value($element, $element['#value']); + } +} + +/** + * Format calendar_colorpicker. + */ +function theme_calendar_colorpicker($element) { + + $output = ''; + $output .= '
'; + return theme('form_element', $element, $output); +} + +/** + * Format calendar_color textfield. + */ +function theme_calendar_colorfield($element) { + $size = isset($element['#size']) ? ' size="' . $element['#size'] . '"' : ''; + $maxlength = isset($element['#maxlength']) ? 'maxlength="'.$element['#maxlength'] .'"' : ''; + $output = ''; + if (isset($element['#calendar_colorpicker'])) { + $element['#attributes']['class'] .= ' edit-'. str_replace("_", "-", $element['#calendar_colorpicker']); + } + $output .= ''; + return theme('form_element', $element, $output); +} + +/** + * Add link to calendar to nodes. + * + * Controlled by value of 'calendar_date_link' in the view. + */ +function calendar_link($type, $object, $teaser = FALSE) { + if ($type == 'node' && !$teaser) { + $path = variable_get('calendar_date_link_'. $object->type, NULL); + if (!empty($path)) { + return array('calendar_link' => array( + 'title' => t('Calendar'), + 'href' => $path, + 'attributes' => array('title' => t('View the calendar.')), + )); + } + } +} + +/** + * Callback to remove a default calendar from the system. + */ +function calendar_remove($view_name) { + // Remove any variable that creates a default view with this name. + $calendar_options = variable_get('calendar_default_view_options', array()); + if (array_key_exists($view_name, $calendar_options)) { + unset($calendar_options[$view_name]); + } + variable_set('calendar_default_view_options', $calendar_options); + // Delete it from the database, if stored there. + if ($view = views_get_view($view_name)) { + $view->delete(); + } + views_invalidate_cache(); +} + +/** + * Formats the weekday information into table header format + * + * @ingroup event_support + * @return array with weekday table header data + */ +function calendar_week_header($view) { + $len = isset($view->date_info->style_name_size) ? $view->date_info->style_name_size : (!empty($view->date_info->mini) ? 1 : 3); + $with_week = !empty($view->date_info->style_with_weekno); + + // create week header + $untranslated_days = calendar_untranslated_days(); + if ($len == 99) { + $translated_days = date_week_days_ordered(date_week_days(TRUE)); + } + else { + $translated_days = date_week_days_ordered(date_week_days_abbr(TRUE)); + } + if ($with_week) { + $row[] = array('header' => TRUE, 'class' => "days week", 'data' => ' '); + } + foreach ($untranslated_days as $delta => $day) { + $label = $len < 3 ? drupal_substr($translated_days[$delta], 0 , $len) : $translated_days[$delta]; + $row[] = array('header' => TRUE, 'class' => "days ". $day, 'data' => $label); + } + return $row; +} +/** + * Array of untranslated day name abbreviations, forced to lowercase + * and ordered appropriately for the site setting for the first day of week. + * + * The untranslated day abbreviation is used in css classes. + */ +function calendar_untranslated_days() { + $untranslated_days = date_week_days_ordered(date_week_days_untranslated()); + foreach ($untranslated_days as $delta => $day) { + $untranslated_days[$delta] = strtolower(substr($day, 0, 3)); + } + return $untranslated_days; +} + +/** + * Take the array of items and alter it to an array of + * calendar nodes that the theme can handle. + * + * Iterate through each datefield in the view and each item + * returned by the query, and create pseudo date nodes. + * + * If there is more than one date field in the node, this will create + * multiple nodes, one each with the right calendar date for that + * field's value. If a field value has a date range that covers more than + * one day, separate nodes will be created for each day in the field's + * day range, limited to the minimum and maximum dates for the view. + * + * When we finish, we will have a distinct node for each distinct day + * and date field. + */ +function calendar_build_nodes(&$view, &$items) { + if (empty($view->date_info->min_date) || empty($view->date_info->max_date)) { + return $items; + } + // Midnights are determined based on the same timezone as the View uses + $display_timezone = date_timezone_get($view->date_info->min_date); + $display_timezone_name = timezone_name_get($display_timezone); + + // Translate the view min and max dates to UTC values + // so we can compare UTC dates to the view range. + $min_utc = drupal_clone($view->date_info->min_date); + date_timezone_set($min_utc, timezone_open('UTC')); + $max_utc = drupal_clone($view->date_info->max_date); + date_timezone_set($max_utc, timezone_open('UTC')); + $min_zone_string = array(); // Will cache $min_utc-strings in various timezones + $max_zone_string = array(); + $view->date_info->nodes_per_page = 0; + $type_names = node_get_types('names'); + $datefields = array(); + $fields = date_api_fields($view->base_table); + if (!empty($view->filter['date_filter'])) { + $date_filter = $view->filter['date_filter']; + foreach ($view->filter['date_filter']->options['date_fields'] as $name) { + $datefields[] = $fields['name'][$name]['query_name']; + } + } + if (!empty($view->argument['date_argument'])) { + $date_filter = $view->argument['date_argument']; + foreach ($view->argument['date_argument']->options['date_fields'] as $name) { + $datefields[] = $fields['name'][$name]['query_name']; + } + } + $view_fields = date_api_views_fetch_fields('node', 'field'); + $field_names = (array) array_keys($fields['name']); + $nodes = array(); + $i = 0; + foreach ($date_filter->options['date_fields'] as $name) { + $field = $fields['name'][$name]; + $field_type = strstr($field['type'], 'string') ? 'string' : 'timestamp'; + $alias = $field['query_name']; + $field_name = $field['field_name']; + $fromto = $field['fromto']; + $tz_handling = $field['tz_handling']; + $label = isset($view->field[$name]) ? $view->field[$name]['label'] : $field['field_name']; + $tz_alias = str_replace('.', '_', $field['timezone_field']); + $db_tz = date_get_timezone_db($field['tz_handling']); + $local_tz = date_get_timezone($field['tz_handling'], 'date'); + $field_name = $field['field_name']; + $rrule_field = str_replace(array('_value2', '_value'), '_rrule', $alias); + + // Set a flag to tell us if individual multi-day dates need to be + // split into separate nodes. + $split_dates = TRUE; + if (strstr($view->current_display, '_ical')) { + $split_dates = FALSE; + } + + // If there is no field for this item, just default to the site format. + if (!isset($view->field[$field_name])) { + $format = variable_get('date_format_short', 'm/d/Y - H:i'); + } + else { + if (strstr($field['type'], 'cck')) { + $format = $view->field[$field_name]->options['format']; + $cck_field_name = str_replace(array('_value2', '_value'), '', $field_name); + $format = date_formatter_format($format, $cck_field_name); + } + else { + $format = $view->field[$field_name]->options['date_format']; + $cck_field_name = NULL; + switch ($format) { + case 'long': + $format = variable_get('date_format_long', 'l, F j, Y - H:i'); + break; + case 'medium': + $format = variable_get('date_format_medium', 'D, m/d/Y - H:i'); + break; + case 'custom': + $format = $view->field[$field_name]->options['custom_date_format']; + break; + case 'time ago': + break; + default: + $format = variable_get('date_format_short', 'm/d/Y - H:i'); + break; + } + } + } + + // set the domain part of the id + $domain = check_plain($_SERVER['SERVER_NAME']); + + // If there are multiple date fields in this calendar we may get + // duplicate items from the other date fields, so add a way to + // make sure each individual date field only gets added to the + // calendar one time. + $processed = array(); + $rrule_processed = array(); + foreach ($items as $pos => $item) { + $delta = !empty($field['delta_field']) && !empty($item->{$field['delta_field']}) ? $item->{$field['delta_field']} : 0; + $real_field = $field_name; + if (substr($field['type'], 0, 3) == 'cck') { + $real_field = str_replace(array('_value2', '_value'), '', $field_name); + } + + $id = 'calendar.'. $item->{$view->base_field} .'.'. $real_field .'.'. $delta; + + // When creating iCal feeds for repeating dates we don't want all + // the multiple values, send only the first value. + if (strstr($view->current_display, '_ical')) { + if (!isset($rrule_processed[$item->nid])) { + $rrule_processed[$item->nid] = TRUE; + } + else { + continue; + } + } + + if (!in_array($id, $processed) && !empty($item->calendar_fields->$alias)) { + + // Create from and to date values for each item, adjusted to + // the correct timezone. + $values[0] = !empty($item->calendar_fields->$fromto[0]) ? $item->calendar_fields->$fromto[0] : $item->calendar_fields->$alias; + $values[1] = !empty($item->calendar_fields->$fromto[1]) ? $item->calendar_fields->$fromto[1] : $item->calendar_fields->$alias; + + $db_tz = date_get_timezone_db($tz_handling, isset($item->$tz_alias) ? $item->$tz_alias : $display_timezone_name); + $to_zone = date_get_timezone($tz_handling, isset($item->$tz_alias) ? $item->$tz_alias : $display_timezone_name); + + // Now $display_timezone determines how $item is split into + // one entry per day, while $to_zone determines how date is displayed. + // For now, use the date fields's timezone for the day splitting. + $display_timezone_name = $to_zone; + $values_display = array(); + + // Start date + $date = date_make_date($values[0], $db_tz, $field['sql_type']); + if ($db_tz != $to_zone) { + date_timezone_set($date, timezone_open($to_zone)); + } + $values[0] = date_format($date, DATE_FORMAT_DATETIME); + + if ($display_timezone_name != $to_zone) { + date_timezone_set($date, $display_timezone); + $values_display[0] = date_format($date, DATE_FORMAT_DATETIME); + } + else { + $values_display[0] = $values[0]; + } + + // End date + $date = date_make_date($values[1], $db_tz, $field['sql_type']); + if ($db_tz != $to_zone) { + date_timezone_set($date, timezone_open($to_zone)); + } + $values[1] = date_format($date, DATE_FORMAT_DATETIME); + if ($display_timezone_name != $to_zone) { + date_timezone_set($date, $display_timezone); + $values_display[1] = date_format($date, DATE_FORMAT_DATETIME); + } + else { + $values_display[1] = $values[1]; + } + + // Now $values contain start and end date of a node, + // expressed as strings in the display (local) timezone. + // $values_utc does the same in UTC timezone. + // Get calendar min and max day (not time) as strings in the + // $display_timezone. Cache in $min_zone_string and $max_zone_string, + // since many items or fields typically use the samee timezone. + if (!isset($min_zone_string[$display_timezone_name])) { + $date = drupal_clone($view->date_info->min_date); + date_timezone_set($date, $display_timezone); + $min_zone_string[$display_timezone_name] = date_format($date, DATE_FORMAT_DATE); + $date = drupal_clone($view->date_info->max_date); + date_timezone_set($date, $display_timezone); + $max_zone_string[$display_timezone_name] = date_format($date, DATE_FORMAT_DATE); + } + + // Create a node for each date within the field's date range, + // limited to the view's date range (regarding only day, not time). + $now = max($min_zone_string[$display_timezone_name], substr($values_display[0], 0, 10)); + $to = min($max_zone_string[$display_timezone_name], substr($values_display[1], 0, 10)); + $next = date_make_date($now, $display_timezone); + + if ($display_timezone_name != $to_zone) { + // Make $start and $end (derived from $node) use the timezone $to_zone, just as $values[..] do + date_timezone_set($next, timezone_open($to_zone)); + } + if (empty($to)) { + $to = $now; + } + + // $now and $next are midnight (in display timezone) on the first day where node will occur. + // $to is midnight on the last day where node will occur. + // All three were limited by the min-max date range of the view. + while ($now <= $to) { + $node = drupal_clone($item); + + // Make sure the pseudo node has the same properties a + // regular node would have. + if (isset($node->node_title) && !isset($node->title)) { + $node->title = $node->node_title; + } + if (isset($node->node_type) && !isset($node->type)) { + $node->type = $node->node_type; + } + $exceptions = array('format_interval', 'time ago'); + $node->label = $label; + $node->format = $format; + if (!in_array($node->format, $exceptions)) { + if (!isset($formats[$format])) { + $formats[$format] = date_limit_format($format, array('hour', 'minute', 'second')); + $node->format_time = $formats[$format]; + } + } + else { + $node->format_time = ''; + } + $node->url = calendar_get_node_link($node); + + //$node->$fromto[0] = $values[0]; + //$node->$fromto[1] = $values[1]; + + // Flag which datefield this node is using, in case + // there are multiple date fields in the view. + $node->datefield = $alias; + // If there are other datefields in the View, get rid + // of them in this pseudo node. There should only be one + // date in each calendar node. + foreach ($node as $key => $val) { + if ($key != $alias && in_array($key, $datefields)) { + unset($node->$key); + foreach ($fields['name'] as $other_fields) { + // If the unused date has other fields, unset them, too. + if ($other_fields['query_name'] == $key) { + foreach ($other_fields['related_fields'] as $related_field) { + $key2 = str_replace('.', '_', $related_field); + unset($node->$key2); + } + } + } + } + } + // If we don't deconstruct dates into individual date parts, + // use date values as-is. + if (!$split_dates) { + $node->calendar_start = $values[0]; + $node->calendar_end = $values[1]; + } + // Split dates get intersection of current day and the node + // value's duration (as strings in $to_zone timezone) + else { + // Get start and end of current day + $start = date_format($next, DATE_FORMAT_DATETIME); + date_modify($next, '+1 day'); + date_modify($next, '-1 second'); + $end = date_format($next, DATE_FORMAT_DATETIME); + $node->calendar_start = $values[0] < $start ? $start : $values[0]; + $node->calendar_end = !empty($values[1]) ? ($values[1] > $end ? $end : $values[1]) : $node->calendar_start; + } + $node->date_start = date_create($values[0], timezone_open($to_zone)); + $node->date_end = date_create(!empty($values[1]) ? $values[1] : $values[0], timezone_open($to_zone));; + + // Make date objects + $node->calendar_start_date = date_create($node->calendar_start, timezone_open($to_zone)); + $node->calendar_end_date = date_create($node->calendar_end, timezone_open($to_zone)); + + // Change string timezones into + // calendar_start and calendar_end are UTC dates as formatted strings + $node->calendar_start = date_format($node->calendar_start_date, DATE_FORMAT_DATETIME); + $node->calendar_end = date_format($node->calendar_end_date, DATE_FORMAT_DATETIME); + + if (substr($real_field, 0, 9) == 'field_') { + $cck_field = content_fields($cck_field_name); + $granularity = $cck_field['granularity']; + $increment = $cck_field['widget']['increment']; + } + else { + $granularity = 'second'; + $increment = 1; + } + $node->calendar_all_day = date_is_all_day($node->calendar_end, $node->calendar_end, $granularity, $increment); + + // Flag all day values specifically set in date. + $all_day_field = str_replace(array('_value2', '_value'), '_all_day', $node->datefield); + if (!empty($all_day_field) && !empty($item->$all_day_field)) { + $node->calendar_all_day = TRUE; + } + + unset($node->calendar_fields); + if (isset($node) && (empty($node->calendar_start))) { + // if no date for the node and no date in the item + // there is no way to display it on the calendar + unset($node); + } + else { + calendar_node_stripe($view, $node, $alias, $alias); + calendar_node_taxonomy_stripe($view, $node, $alias, $alias); + calendar_node_group_stripe($view, $node, $alias, $alias); + $node->date_id = $id .'.'. $pos; + + $nodes[] = $node; + unset($node); + } + $processed[] = $id; + if ($split_dates) { + date_modify($next, '+1 second'); + $now = date_format($next, DATE_FORMAT_DATE); + } + else { + break; + } + } + } + } + } + return $nodes; +} \ No newline at end of file diff --git a/sites/all/modules/calendar/calendar_ical/calendar-view-ical.tpl.php b/sites/all/modules/calendar/calendar_ical/calendar-view-ical.tpl.php new file mode 100644 index 0000000..55b51d3 --- /dev/null +++ b/sites/all/modules/calendar/calendar_ical/calendar-view-ical.tpl.php @@ -0,0 +1,55 @@ + +BEGIN:VCALENDAR +VERSION:2.0 +METHOD:PUBLISH +X-WR-CALNAME: +PRODID:-//Drupal iCal API//EN + +BEGIN:VEVENT +UID: +SUMMARY: +DTSTAMP: +DTSTART: + +DTEND: + + + + + +URL;VALUE=URI: + + +LOCATION: + + +DESCRIPTION: + +END:VEVENT + +END:VCALENDAR diff --git a/sites/all/modules/calendar/calendar_ical/calendar_ical.info b/sites/all/modules/calendar/calendar_ical/calendar_ical.info new file mode 100644 index 0000000..145be45 --- /dev/null +++ b/sites/all/modules/calendar/calendar_ical/calendar_ical.info @@ -0,0 +1,17 @@ +; $Id: calendar_ical.info,v 1.1.2.1 2008/09/05 11:03:42 karens Exp $ +name = Calendar iCal +description = Adds ical functionality to Calendar views. +dependencies[] = views +dependencies[] = date_api +dependencies[] = calendar +package = Date/Time +core = 6.x + + + +; Information added by drupal.org packaging script on 2011-01-03 +version = "6.x-2.4" +core = "6.x" +project = "calendar" +datestamp = "1294072550" + diff --git a/sites/all/modules/calendar/calendar_ical/calendar_ical.install b/sites/all/modules/calendar/calendar_ical/calendar_ical.install new file mode 100644 index 0000000..b354036 --- /dev/null +++ b/sites/all/modules/calendar/calendar_ical/calendar_ical.install @@ -0,0 +1,54 @@ + 'calendar_1', 'default' => 0, 'calendar_block_1' => 'calendar_block_1'); + $row['display_plugin'] = 'calendar_period'; + $row['display_options'] = serialize($options); + db_query("UPDATE {views_display} SET id='%s', display_plugin='%s', display_options='%s' WHERE id='%s'", 'calendar_ical_1', 'calendar_ical', $row['display_options'], $row['id']); + db_query("DELETE FROM {views_object_cache} WHERE name = '%s'", $row['name']); + } + } + $ret[] = array('success' => TRUE, 'query' => 'Updated calendar ical displays to use new handlers and ids.'); + views_invalidate_cache(); + return $ret; +} \ No newline at end of file diff --git a/sites/all/modules/calendar/calendar_ical/calendar_ical.module b/sites/all/modules/calendar/calendar_ical/calendar_ical.module new file mode 100644 index 0000000..2ae790a --- /dev/null +++ b/sites/all/modules/calendar/calendar_ical/calendar_ical.module @@ -0,0 +1,32 @@ + 2, + 'path' => drupal_get_path('module', 'calendar_ical'), + ); +} + +/** + * @file + * Adds ical functionality to Calendar. + */ +function calendar_ical_theme() { + return array( + 'calendar_ical_icon' => array( + 'arguments' => array('url'), + ), + ); +} + +function theme_calendar_ical_icon($url) { + if ($image = theme('image', drupal_get_path('module', 'date_api') .'/images/ical16x16.gif', t('Add to calendar'), t('Add to calendar'))) { + return '
'. $image .'
'; + } +} \ No newline at end of file diff --git a/sites/all/modules/calendar/calendar_ical/calendar_ical.views.inc b/sites/all/modules/calendar/calendar_ical/calendar_ical.views.inc new file mode 100644 index 0000000..63a7b33 --- /dev/null +++ b/sites/all/modules/calendar/calendar_ical/calendar_ical.views.inc @@ -0,0 +1,82 @@ + 'calendar_ical', // This just tells our themes are elsewhere. + 'display' => array( + // Parents are not really displays, just needed so the files can + // be included. + 'parent' => array( + 'no ui' => TRUE, + 'handler' => 'views_plugin_display', + 'path' => "$views_path/plugins", + 'parent' => '', + ), + 'page' => array( + 'no ui' => TRUE, + 'handler' => 'views_plugin_display_page', + 'path' => "$views_path/plugins", + 'parent' => 'parent', + ), + 'calendar_ical' => array( + 'title' => t('iCal feed'), + 'help' => t('Display the view as an iCal feed.'), + 'handler' => 'calendar_plugin_display_ical', + 'path' => "$path", + 'parent' => 'page', + 'uses hook menu' => TRUE, + 'theme' => 'views_view', + 'no ui' => TRUE, + 'no remove' => TRUE, + 'use ajax' => FALSE, + 'use pager' => FALSE, + 'accept attachments' => FALSE, + 'admin' => t('iCal feed'), + 'help topic' => 'display-ical', + ), + ), + 'style' => array( + 'parent' => array( + // this isn't really a display but is necessary so the file can + // be included. + 'no ui' => TRUE, + 'handler' => 'views_plugin_style', + 'path' => "$views_path/plugins", + 'parent' => '', + ), + 'rss' => array( + // this isn't really a display but is necessary so the file can + // be included. + 'no ui' => TRUE, + 'handler' => 'views_plugin_style_rss', + 'path' => "$views_path/plugins", + 'parent' => 'parent', + ), + 'ical' => array( + 'title' => t('iCal feed'), + 'help' => t('Generates an iCal feed from a view.'), + 'handler' => 'calendar_plugin_style_ical', + 'path' => "$path", + 'theme' => 'calendar_view_ical', + 'theme file' => 'theme.inc', + 'theme path' => "$path", + 'parent' => 'rss', + 'uses row plugin' => FALSE, + 'uses fields' => TRUE, + 'uses row plugin' => FALSE, + 'uses options' => TRUE, + 'type' => 'ical', + 'even empty' => TRUE, + ), + ), + ); + return $data; +} \ No newline at end of file diff --git a/sites/all/modules/calendar/calendar_ical/calendar_ical_admin.inc b/sites/all/modules/calendar/calendar_ical/calendar_ical_admin.inc new file mode 100644 index 0000000..9595566 --- /dev/null +++ b/sites/all/modules/calendar/calendar_ical/calendar_ical_admin.inc @@ -0,0 +1,115 @@ +name] = array( + '#type' => 'select', '#title' => t('Expire iCal cache'), + '#default_value' => variable_get('calendar_ical_expire_'. $view->name, 9676800), '#options' => $period, + '#description' => t('iCal feeds are cached to improve performance. Set an expiration time for cached feeds.') + ); + + $empty_feed = array(0 => array('name' => '', 'url' => '', 'type' => 'ical', 'stripe' => 0)); + $form[$view->name] = array( + '#type' => 'fieldset', + '#title' => t('iCal Feeds'), + '#description' => t('Use this section to set up iCal feeds that should be displayed in this calendar. They will be shown along with any internal items that match the calendar criteria.'), + '#collapsible' => TRUE, + '#collapsed' => FALSE, + '#tree' => TRUE, + ); + + // One empty input form will be added after any existing items. + $view_feeds = array_merge((array) variable_get('calendar_feeds_'. $view->name, $empty_feed), $empty_feed); + foreach ($view_feeds as $delta => $feed) { + $form[$view->name][$delta] = array( + 'type' => array( + '#title' => t('Feed type'), + '#type' => 'hidden', + '#value' => 'ical', + ), + 'name' => array( + '#title' => t('Name'), + '#type' => 'textfield', + '#default_value' => $feed['name'], + '#description' => t('The name of a feed to include in this calendar.'), + ), + 'url' => array( + '#title' => t('Url'), + '#type' => 'textarea', + '#rows' => 2, + '#default_value' => $feed['url'], + '#description' => t("The external feed url or internal file path and name. Change 'webcal://' to 'http://'."), + ), + 'calendar_colorpicker' => array( + '#type' => 'calendar_colorpicker', + '#title' => t('Stripe color'), + ), + 'stripe' => array( + '#type' => 'calendar_colorfield', + '#default_value' => isset($feed['stripe']) ? $feed['stripe'] : '#ffffff', + '#calendar_colorpicker' => $view_name .'-'. $delta .'-calendar-colorpicker', + '#description' => t("The hex color value (like #ffffff) to use for this feed's calendar stripe."), + ), + ); + } + $form['view_name'] = array( + '#type' => 'hidden', + '#value' => $view->name, + ); + $form['submit'] = array( + '#type' => 'submit', + '#value' => t('Submit'), + ); + return $form; +} + +/** + * Save requested values. + */ +function calendar_ical_setup_form_submit($form_id, $form_values) { + $view_name = $form_values['view_name']; + foreach ($form_values as $value_name => $value) { + if ($value_name == 'calendar_ical_expire_'. $view_name) { + variable_set('calendar_ical_expire_'. $view_name, $value); + } + elseif (is_array($value)) { + foreach ($value as $delta => $item) { + // Don't save empty values. + if (trim($item['url']) == '' || trim($item['name']) == '') { + unset($value[$delta]); + } + else { + // Replace 'webcal' protocol with http protocol. + $item['url'] = str_replace('webcal:', 'http:', $item['url']); + // Don't save invalid urls. + $events = date_ical_import($item['url']); + if (!is_array($events)) { + unset($value[$delta]); + } + else { + $value[$delta]['url'] = $item['url']; + } + + } + } + variable_set('calendar_feeds_'. $value_name, $value); + } + } + cache_clear_all('calendar_feeds_'. $view->name, calendar_ical_cache(), TRUE); +} diff --git a/sites/all/modules/calendar/calendar_ical/calendar_plugin_display_ical.inc b/sites/all/modules/calendar/calendar_ical/calendar_plugin_display_ical.inc new file mode 100644 index 0000000..02a6c71 --- /dev/null +++ b/sites/all/modules/calendar/calendar_ical/calendar_plugin_display_ical.inc @@ -0,0 +1,218 @@ +view->render(); + if (empty($output)) { + return drupal_not_found(); + } + print $output; + } + + function preview() { + return '
' . check_plain($this->view->render()) . '
'; + } + + /** + * Instead of going through the standard views_view.tpl.php, delegate this + * to the style handler. + */ + function render() { + return $this->view->style_plugin->render($this->view->result); + } + + function defaultable_sections($section = NULL) { + if (in_array($section, array('style_options', 'style_plugin', 'row_options', 'row_plugin',))) { + return FALSE; + } + + $sections = parent::defaultable_sections($section); + + // Tell views our sitename_title option belongs in the title section. + if ($section == 'title') { + $sections[] = 'sitename_title'; + } + elseif (!$section) { + $sections['title'][] = 'sitename_title'; + } + return $sections; + } + + function option_definition() { + $options = parent::option_definition(); + + $options['displays'] = array('default' => array()); + + // Overrides for standard stuff: + $options['style_plugin']['default'] = 'rss'; + $options['style_options']['default'] = array('mission_description' => FALSE, 'description' => ''); + $options['sitename_title']['default'] = FALSE; + $options['row_plugin']['default'] = ''; + $options['defaults']['default']['style_plugin'] = FALSE; + $options['defaults']['default']['style_options'] = FALSE; + $options['defaults']['default']['row_plugin'] = FALSE; + $options['defaults']['default']['row_options'] = FALSE; + + return $options; + } + + function options_summary(&$categories, &$options) { + // It is very important to call the parent function here: + parent::options_summary($categories, $options); + + // Since we're childing off the 'page' type, we'll still *call* our + // category 'page' but let's override it so it says feed settings. + $categories['page'] = array( + 'title' => t('iCal settings'), + ); + + if ($this->get_option('sitename_title')) { + $options['title']['value'] = t('Using the site name'); + } + + // I don't think we want to give feeds menus directly. + unset($options['menu']); + + $displays = array_filter($this->get_option('displays')); + if (count($displays) > 1) { + $attach_to = t('Multiple displays'); + } + else if (count($displays) == 1) { + $display = array_shift($displays); + if (!empty($this->view->display[$display])) { + $attach_to = $this->view->display[$display]->display_title; + } + } + + if (!isset($attach_to)) { + $attach_to = t('None'); + } + + $options['displays'] = array( + 'category' => 'page', + 'title' => t('Attach to'), + 'value' => $attach_to, + ); + } + + /** + * Provide the default form for setting options. + */ + function options_form(&$form, &$form_state) { + // It is very important to call the parent function here. + parent::options_form($form, $form_state); + + switch ($form_state['section']) { + case 'title': + $title = $form['title']; + // A little juggling to move the 'title' field beyond our checkbox. + unset($form['title']); + $form['sitename_title'] = array( + '#type' => 'checkbox', + '#title' => t('Use the site name for the title'), + '#default_value' => $this->get_option('sitename_title'), + ); + $form['title'] = $title; + $form['title']['#process'] = array('views_process_dependency'); + $form['title']['#dependency'] = array('edit-sitename-title' => array(FALSE)); + break; + case 'displays': + $form['#title'] .= t('Attach to'); + $displays = array(); + foreach ($this->view->display as $display_id => $display) { + if (!empty($display->handler) && $display->handler->accept_attachments()) { + $displays[$display_id] = $display->display_title; + } + } + $form['displays'] = array( + '#type' => 'checkboxes', + '#description' => t('The ical icon will be shown only on the selected displays.'), + '#options' => $displays, + '#default_value' => $this->get_option('displays'), + ); + break; + case 'path': + $form['path']['#description'] = t('This view will be displayed by visiting this path on your site. It is recommended that the path be something like "path/%/%/ical", putting one % in the path for each argument you have defined in the view.'); + break; + } + } + + /** + * Perform any necessary changes to the form values prior to storage. + * There is no need for this function to actually store the data. + */ + function options_submit($form, &$form_state) { + // It is very important to call the parent function here: + parent::options_submit($form, $form_state); + switch ($form_state['section']) { + case 'title': + $this->set_option('sitename_title', $form_state['values']['sitename_title']); + break; + case 'displays': + $this->set_option($form_state['section'], $form_state['values'][$form_state['section']]); + break; + } + } + + /** + * Attach to another view. + */ + function attach_to($display_id) { + $displays = $this->get_option('displays'); + if (empty($displays[$display_id])) { + return; + } + + // Defer to the feed style; it may put in meta information, and/or + // attach a feed icon. + $plugin = $this->get_plugin(); + if ($plugin) { + $clone = $this->view->clone_view(); + $clone->set_display($this->display->id); + $clone->build_title(); + $plugin->attach_to($display_id, $this->get_path(), $clone->get_title()); + } + } + + /** + * Display validation. + */ + function validate() { + $errors = parent::validate(); + + $arguments = $this->display->handler->get_option('arguments'); + $filters = $this->display->handler->get_option('filters'); + + if (!array_key_exists('date_argument', $arguments) && !array_key_exists('date_filter', $filters)) { + if (empty($this->view->date_info->arg_missing)) { + $errors[] = t("A Calendar period display will not work without a Date argument or a Date filter."); + } + $this->view->date_info->arg_missing = TRUE; + } + if (array_key_exists('date_argument', $arguments) && + ($arguments['date_argument']['default_action'] != 'default' || $arguments['date_argument']['default_argument_type'] != 'date')) { + if (empty($this->view->date_info->arg_missing_default)) { + $errors[] = calendar_errors('missing_argument_default'); + } + $this->view->date_info->arg_missing_default = TRUE; + } + + return $errors; + } +} + diff --git a/sites/all/modules/calendar/calendar_ical/calendar_plugin_style_ical.inc b/sites/all/modules/calendar/calendar_ical/calendar_plugin_style_ical.inc new file mode 100644 index 0000000..f8ddd32 --- /dev/null +++ b/sites/all/modules/calendar/calendar_ical/calendar_plugin_style_ical.inc @@ -0,0 +1,254 @@ +handler->default_display->options['fields']; + $this->options['fields'] = $fields; + } + + function query() { + // We need these values for the iCal feed. + $this->view->query->add_field('node', 'title'); + $this->view->query->add_field('node', 'type'); + parent::query(); + } + + function attach_to($display_id, $path, $title) { + $display = $this->view->display[$display_id]->handler; + $url_options = array(); + $input = $this->view->get_exposed_input(); + if ($input) { + $url_options['query'] = $input; + } + + // TODO adjust this to pick up default values when no arg is set? + $url = url($this->view->get_url(NULL, $path), $url_options); + if (empty($this->view->feed_icon)) { + $this->view->feed_icon = ''; + } + $this->view->feed_icon .= theme('calendar_ical_icon', $url); + + drupal_add_link(array( + 'rel' => 'alternate', + 'type' => 'application/calendar', + 'title' => $title, + 'href' => $url + )); + } + + /** + * Set default options + */ + function options(&$options) { + parent::options($options); + $options['summary_field'] = 'title'; + $options['description_field'] = ''; + $options['location_field'] = ''; + $options['fields'] = array(); + } + + function option_definition() { + $options = parent::option_definition(); + + $options['summary_field'] = array('default' => '', 'translatable' => TRUE); + $options['description_field'] = array('default' => '', 'translatable' => TRUE); + $options['location_field'] = array('default' => '', 'translatable' => TRUE); + + return $options; + } + + function options_form(&$form, &$form_state) { + $options = array('' => ''); + foreach ($this->options['fields'] as $field) { + $handler = views_get_handler($field['table'], $field['field'], 'field'); + $options[$field['field']] = $handler->ui_name(); + } + $form['#prefix'] = '
'. t("Map the View fields to the values they should represent in the iCal feed. Only fields that have been added to the view are available to use in this way. You can add additional fields to the view and mark them 'Exclude from display' if you only want them in the iCal feed.") .'
'; + + $form['summary_field'] = array( + '#type' => 'select', + '#title' => t('Title'), + '#default_value' => !empty($this->options['summary_field']) ? $this->options['summary_field'] : 'title', + '#options' => $options, + '#required' => TRUE, + ); + $form['description_field'] = array( + '#type' => 'select', + '#title' => t('Description'), + '#default_value' => $this->options['description_field'], + '#options' => $options, + ); + $form['location_field'] = array( + '#type' => 'select', + '#title' => t('Location'), + '#default_value' => $this->options['location_field'], + '#options' => $options, + ); + + } + + /** + * Style validation. + */ + function validate() { + $errors = parent::validate(); + + $style = $this->display->display_options['style_plugin']; + + $arguments = $this->display->handler->get_option('arguments'); + $filters = $this->display->handler->get_option('filters'); + + if (!array_key_exists('date_argument', $arguments) && !array_key_exists('date_filter', $filters)) { + if (empty($this->view->date_info->arg_missing)) { + $errors[$style] = t("The @style style requires a Date argument or a Date filter.", array('@style' => $style)); + } + $this->view->date_info->arg_missing = TRUE; + } + if (array_key_exists('date_argument', $arguments) && + ($arguments['date_argument']['default_action'] != 'default' || $arguments['date_argument']['default_argument_type'] != 'date')) { + if (empty($this->view->date_info->arg_missing_default)) { + $errors[] = calendar_errors('missing_argument_default'); + } + $this->view->date_info->arg_missing_default = TRUE; + } + + if (empty($this->options['summary_field'])) { + $errors[] = $errors[$style] = t("The @style style requires a Title field for the iCal export.", array('@style' => $style)); + } + // Make sure date fields are not set up to 'Group multiple values' + // in the calendar style. + if ($style == 'calendar_style') { + $view_fields = date_api_fields($this->view->base_table); + $view_fields = $view_fields['name']; + $fields = $this->display->handler->get_option('fields'); + foreach ($fields as $column => $field) { + $field_name = $field['table'] .".". $field['field']; + if (!empty($field['multiple'])) { + $cck_fields = content_fields(); + $real_name = $view_fields[$field_name]['real_field_name']; + if ($cck_fields[$real_name]['multiple'] && !empty($field['multiple']['group'])) { + $errors[] = t("The date field '@field' used by the display '@display_title' cannot be set to 'Group multiple values'.", array('@field' => $view_fields[$field_name]['label'], '@display_title' => $this->display->display_title)); + } + } + } + } + return $errors; + } + + function render() { + require_once('./'. drupal_get_path('module', 'calendar') .'/includes/calendar.inc'); + + // Transfer the style options to the view object so they + // can be easily accessed in the theme. + $style_options = $this->options; + $this->view->date_info->summary_field = $style_options['summary_field']; + $this->view->date_info->description_field = $style_options['description_field']; + $this->view->date_info->location_field = $style_options['location_field']; + + // Evaluate our argument values and figure out which + // calendar display we need to create. + $i = 0; + foreach ($this->view->argument as $id => $argument) { + if ($argument->field == 'date_argument') { + // TODO Decide if we want to provide a date here or not. + // Adding this now is to prevent fatal errors later if the + // view is used in unexpected ways without a date being set. + if (empty($argument->min_date)) { + $value = $argument->get_default_argument(); + $range = $argument->date_handler->arg_range($value); + $argument->min_date = $range[0]; + $argument->max_date = $range[1]; + } + $this->view->date_info->granularity = !empty($argument->granularity) ? $argument->granularity : $argument->options['granularity']; + $this->view->date_info->date_arg = !empty($this->view->args) ? $this->view->args[$argument->position] : ''; + $this->view->date_info->date_arg_pos = $i; + $this->view->date_info->year = isset($argument->year) ? $argument->year : NULL; + $this->view->date_info->month = isset($argument->month) ? $argument->month: NULL; + $this->view->date_info->day = isset($argument->day) ? $argument->day : NULL; + $this->view->date_info->week = isset($argument->week) ? $argument->week : NULL; + $this->view->date_info->min_date = $argument->min_date; + $this->view->date_info->max_date = $argument->max_date; + + // Stop after the first date argument, if there is more than one. + break; + } + $i++; + } + + // The ical display might have date filters instead of arguments. + // If we missed getting a min date from date arguments, try date filters. + if (empty($this->view->date_info->min_date)) { + foreach ($this->view->filter as $id => $filter) { + if ($filter->field == 'date_filter') { + // TODO Decide if we want to provide a date here or not. + // Adding this now is to prevent fatal errors later if the + // view is used in unexpected ways without a date being set. + if (empty($filter->min_date)) { + $value = $filter->default_value('value'); + $range = $filter->date_handler->arg_range($value); + $filter->min_date = $range[0]; + $filter->max_date = $range[1]; + } + $this->view->date_info->granularity = !empty($filter->granularity) ? $filter->granularity : $filter->options['granularity']; + $this->view->date_info->year = isset($filter->year) ? $filter->year : NULL; + $this->view->date_info->month = isset($filter->month) ? $filter->month: NULL; + $this->view->date_info->day = isset($filter->day) ? $filter->day : NULL; + $this->view->date_info->week = isset($filter->week) ? $filter->week : NULL; + $this->view->date_info->min_date = $filter->min_date; + $this->view->date_info->max_date = $filter->max_date; + if (empty($this->view->date_info->date_fields)) { + $this->view->date_info->date_fields = array(); + } + $this->view->date_info->date_fields = array_merge($this->view->date_info->date_fields, array_keys($filter->options['date_fields'])); + + // Stop after the first date filter, if there is more than one. + break; + } + } + $i++; + } + + // Render each field into an output array. + $items = array(); + $calendar_fields = date_api_fields($this->view->base_table); + $calendar_fields = array_keys($calendar_fields['alias']); + + foreach ($this->view->result as $num => $row) { + $items[$num] = $row; + // Store the raw date values before formatting the results. + foreach ($row as $key => $value) { + if (in_array($key, $calendar_fields)) { + $items[$num]->calendar_fields->$key = $value; + } + } + foreach ($this->view->field as $name => $field) { + // Some fields, like the node edit and delete links, have no alias. + $field_alias = $field->field_alias != 'unknown' ? $field->field_alias : $name; + if (!empty($field) && is_object($field)) { + $field_output = $field->theme($row); + $items[$num]->{$field_alias} = $field_output; + } + } + } + + // Massage the resulting items into formatted calendar items. + $items = calendar_build_nodes($this->view, $items); + + // Merge in items from other sources. + foreach (module_implements('calendar_add_items') as $module) { + $function = $module .'_calendar_add_items'; + if (function_exists($function)) { + if ($feeds = $function($this->view)) { + foreach ($feeds as $feed) { + $items = $feed; + } + } + } + } + return theme($this->theme_functions(), $this->view, $this->options, $items); + } +} diff --git a/sites/all/modules/calendar/calendar_ical/theme.inc b/sites/all/modules/calendar/calendar_ical/theme.inc new file mode 100644 index 0000000..a867437 --- /dev/null +++ b/sites/all/modules/calendar/calendar_ical/theme.inc @@ -0,0 +1,81 @@ +style_plugin; + + // Figure out which display which has a path we're using for this feed. If there isn't + // one, use the global $base_url + $link_display = $view->display_handler->get_link_display(); + + // Compare the link to the default home page; if it's the default home page, just use $base_url. + if (empty($vars['link'])) { + $vars['link'] = $base_url; + } + + // Keep devel module from appending queries to ical export. + $GLOBALS['devel_shutdown'] = FALSE; + + drupal_set_header('Content-Type: text/calendar; charset=utf-8'); + drupal_set_header('Content-Disposition: attachment; filename="calendar.ics"; '); + require_once('./'. drupal_get_path('module', 'date_api') .'/date_api_ical.inc'); + require_once('./'. drupal_get_path('module', 'date_api') .'/theme/theme.inc'); + require_once('./'. drupal_get_path('module', 'calendar') .'/includes/calendar.inc'); + + $events = array(); + // Get the alias name for each of our data fields. + foreach ($view->field as $name => $field) { + // Some fields, like the node edit and delete links, have no alias. + $field_alias = $field->field_alias != 'unknown' ? $field->field_alias : $name; + foreach (array('summary_field', 'description_field', 'location_field') as $data) { + if ($field->field == $view->date_info->$data) { + $$data = $field_alias; + } + } + } + // A summary field is required, default to the title. + if (empty($summary_field) || $summary_field == 'node_title') { + $summary_field = 'title'; + } + foreach ($items as $node) { + // We cannot process an event that is missing the summary info. + if (empty($node->$summary_field)) { + continue; + } + // Allow modules to affect item fields + node_invoke_nodeapi($node, 'ical item'); + unset($node->view); + $rrule_field = str_replace(array('_value2', '_value'), '_rrule', $node->datefield); + $event = array(); + $event['summary'] = strip_tags($node->$summary_field); + $event['start'] = $node->calendar_start_date; + $event['end'] = $node->calendar_end_date; + $event['description'] = !empty($description_field) && !empty($node->$description_field) ? $node->$description_field : ''; + $event['location'] = !empty($location_field) && !empty($node->$location_field) ? $node->$location_field : ''; + $event['url'] = !empty($node->url) ? $node->url : (is_numeric($node->nid) ? url("node/$node->nid", array('absolute' => TRUE)) : $node->nid); + $event['uid'] = !empty($node->date_id) ? $node->date_id : $event['url']; + $event['rrule'] = !empty($rrule_field) && !empty($node->$rrule_field) ? $node->$rrule_field : ''; + $events[$event['uid']] = $event; + + /* force UTC timezone */ + date_timezone_set($event['start'], timezone_open('UTC')); + date_timezone_set($event['end'], timezone_open('UTC')); + } + + $headertitle = filter_xss_admin($view->get_title()); + $title = variable_get('site_name', 'Drupal'); + $description = $headertitle . ($title ? ' | '. $title : ''); + + $vars['calname'] = $description; + $vars['events'] = $events; + template_preprocess_date_vcalendar($vars); +} diff --git a/sites/all/modules/calendar/calendar_ical/translations/calendar_ical.cs.po b/sites/all/modules/calendar/calendar_ical/translations/calendar_ical.cs.po new file mode 100644 index 0000000..4d943a2 --- /dev/null +++ b/sites/all/modules/calendar/calendar_ical/translations/calendar_ical.cs.po @@ -0,0 +1,117 @@ +# $Id: calendar_ical.cs.po,v 1.1.2.1 2010/10/22 20:06:37 wojtha Exp $ +# +# Czech translation of Calendar (6.x-2.2) +# Copyright (c) 2010 by the Czech translation team +# +msgid "" +msgstr "" +"Project-Id-Version: Calendar (6.x-2.2)\n" +"POT-Creation-Date: 2010-10-22 20:03+0000\n" +"PO-Revision-Date: 2010-10-07 16:49+0000\n" +"Language-Team: Czech\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=utf-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Plural-Forms: nplurals=3; plural=((((n%10)==1)&&((n%100)!=11))?(0):(((((n%10)>=2)&&((n%10)<=4))&&(((n%100)<10)||((n%100)>=20)))?(1):2));\n" + +msgid "Title" +msgstr "Nadpis" +msgid "Submit" +msgstr "Uložit" +msgid "Description" +msgstr "Popis" +msgid "Name" +msgstr "Jméno" +msgid "Url" +msgstr "Url" +msgid "Location" +msgstr "Místo" +msgid "Feed type" +msgstr "Typ zdroje" +msgid "Expire iCal cache" +msgstr "Expirace iCal mezipaměti." +msgid "" +"iCal feeds are cached to improve performance. Set an expiration time " +"for cached feeds." +msgstr "" +"Pro zlepšení výkonu jsou iCal zdroje ukládány do mezipaměti. " +"Nastavte čas expirace." +msgid "iCal Feeds" +msgstr "iCal zdroje (Feeds)" +msgid "" +"Use this section to set up iCal feeds that should be displayed in this " +"calendar. They will be shown along with any internal items that match " +"the calendar criteria." +msgstr "" +"Tato sekce slouží pro nastavení iCal zdrojů, které budou v " +"kalendáři zobrazeny. Data načtená ze zdrojů budou součástí " +"všech interních položek, které odpovídají kritériím " +"kalendáře." +msgid "The name of a feed to include in this calendar." +msgstr "Název zdroje, který má být zahrnut do kalendáře." +msgid "" +"The external feed url or internal file path and name. Change " +"'webcal://' to 'http://'." +msgstr "" +"URL externího zdroje nebo interní cesta a jméno souboru. Změňte " +"'webcal://' na 'http://'." +msgid "Add to calendar" +msgstr "Přidat do kalendáře" +msgid "Calendar iCal" +msgstr "Kalendář iCal" +msgid "Attach to" +msgstr "Přiložit k" +msgid "Stripe color" +msgstr "Barva pruhu" +msgid "" +"The hex color value (like #ffffff) to use for this feed's calendar " +"stripe." +msgstr "" +"Barva v šestnáctkovém zápisu (např. #ffffff), která se má " +"použít pro tento pruh." +msgid "Adds ical functionality to Calendar views." +msgstr "Přidá podporu iCal zdrojů do kalendářových pohledů." +msgid "Multiple displays" +msgstr "Více zobrazení" +msgid "Using the site name" +msgstr "Použití jména webu" +msgid "Use the site name for the title" +msgstr "Jako název použít název webu" +msgid "iCal feed" +msgstr "iCal zdroj" +msgid "Display the view as an iCal feed." +msgstr "Zobrazit výstup z pohledu jako iCal zdroj." +msgid "Generates an iCal feed from a view." +msgstr "Jako výstup z pohledu generovat iCal zdroj." +msgid "iCal settings" +msgstr "Nastavení pro iCal" +msgid "The ical icon will be shown only on the selected displays." +msgstr "Ikona ical bude viditelná pouze u vybraných zobrazení." +msgid "" +"This view will be displayed by visiting this path on your site. It is " +"recommended that the path be something like \"path/%/%/ical\", putting " +"one % in the path for each argument you have defined in the view." +msgstr "" +"Na zde definované adrese bude zobrazen konfigurovaný pohled. Je " +"vhodné, aby adresa měla tvar \"path/%/%/ical\", kde % reprezentuje " +"jednotlivé argumenty." +msgid "" +"A Calendar period display will not work without a Date argument or a " +"Date filter." +msgstr "" +"Pokud nebude definován argument s datumem nebo datumový filtr, potom " +"nebude zobrazení časového intervalu (period display) pracovat." +msgid "" +"Map the View fields to the values they should represent in the iCal " +"feed. Only fields that have been added to the view are available to " +"use in this way. You can add additional fields to the view and mark " +"them 'Exclude from display' if you only want them in the iCal feed." +msgstr "" +"Namapujte hodnoty z iCal zdroje na relevantní pole. Mapovat lze pouze " +"ta pole, která byla přidána v konfiguraci pohledu (view). Pokud si " +"přejete pracovat s poli pouze v rámci mapování s výhodou můžete " +"použít volby 'nezobrazovat' ('Exclude from display')." +msgid "The @style style requires a Date argument or a Date filter." +msgstr "Styl @style vyžaduje argument nebo filtr typu \"datum\"." +msgid "The @style style requires a Title field for the iCal export." +msgstr "Styl @style vyžaduje pole 'Nadpis' pro iCal export." diff --git a/sites/all/modules/calendar/calendar_ical/translations/calendar_ical.hu.po b/sites/all/modules/calendar/calendar_ical/translations/calendar_ical.hu.po new file mode 100644 index 0000000..fb1716a --- /dev/null +++ b/sites/all/modules/calendar/calendar_ical/translations/calendar_ical.hu.po @@ -0,0 +1,70 @@ +# Hungarian translation of Calendar (all releases) +# Copyright (c) 2009 by the Hungarian translation team +# +msgid "" +msgstr "" +"Project-Id-Version: Calendar (all releases)\n" +"POT-Creation-Date: 2009-11-10 16:39+0000\n" +"PO-Revision-Date: 2009-11-10 14:07+0000\n" +"Language-Team: Hungarian\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=utf-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Plural-Forms: nplurals=2; plural=(n!=1);\n" + +msgid "Title" +msgstr "Cím" +msgid "Description" +msgstr "Leírás" +msgid "Location" +msgstr "Hely" +msgid "Attach to" +msgstr "Csatolás ehhez" +msgid "Multiple displays" +msgstr "Öszzetett képernyők" +msgid "Using the site name" +msgstr "Használva a webhely nevét" +msgid "Use the site name for the title" +msgstr "A webhely nevét használja címnek" +msgid "iCal feed" +msgstr "iCal hírcsatorna" +msgid "Display the view as an iCal feed." +msgstr "Nézet megjelenítése iCal hírcsatornaként." +msgid "Generates an iCal feed from a view." +msgstr "iCal hírcsatorna előállítása nézetből." +msgid "iCal settings" +msgstr "iCal beállításai" +msgid "The ical icon will be shown only on the selected displays." +msgstr "Az ical ikon csak a kiválasztott képernyőkön fog megjelenni." +msgid "" +"This view will be displayed by visiting this path on your site. It is " +"recommended that the path be something like \"path/%/%/ical\", putting " +"one % in the path for each argument you have defined in the view." +msgstr "" +"Ez a nézet ezen az útvonalon lesz megtekinthető az oldalon. " +"Javasolt az elérési út „path/%/%/ical” szerű megadása, " +"egy-egy % jelet elhelyezve az elérési útban minden, a nézetben " +"meghatározott argumentumhoz." +msgid "" +"A Calendar period display will not work without a Date argument or a " +"Date filter." +msgstr "" +"Naptári időszak képernyő nem működik egy Dátum argumentum vagy " +"egy Dátum szűrő nélkül." +msgid "" +"Map the View fields to the values they should represent in the iCal " +"feed. Only fields that have been added to the view are available to " +"use in this way. You can add additional fields to the view and mark " +"them 'Exclude from display' if you only want them in the iCal feed." +msgstr "" +"Leképezi a View mezőket az iCal hírcsatornában ábrázolandó " +"értékekre. Ezen a módon csak a nézethez hozzáadott mezők lesznek " +"elérhetőek. További mezőket lehet hozzáadni a nézethez, amiket " +"„Megjelenítésből kizárt”-nak kell jelölni, ha azokat csak az " +"iCal hírcsatornában kívánjuk megjeleníteni." +msgid "The @style style requires a Date argument or a Date filter." +msgstr "" +"@style stílushoz szükséges egy Dátum argumentum vagy egy Dátum " +"szűrő." +msgid "The @style style requires a Title field for the iCal export." +msgstr "@style stílusnak szüksége van egy Cím mezőre az iCal exporthoz." diff --git a/sites/all/modules/calendar/calendar_ical/translations/calendar_ical.pot b/sites/all/modules/calendar/calendar_ical/translations/calendar_ical.pot new file mode 100644 index 0000000..0d1565e --- /dev/null +++ b/sites/all/modules/calendar/calendar_ical/translations/calendar_ical.pot @@ -0,0 +1,169 @@ +# $Id: calendar_ical.pot,v 1.1.2.2 2009/02/17 11:06:21 karens Exp $ +# +# LANGUAGE translation of Drupal (general) +# Copyright YEAR NAME +# Generated from files: +# calendar_ical.views.inc,v 1.1.2.6 2009/02/16 23:46:22 karens +# calendar_ical_admin.inc,v 1.1.2.2 2008/10/02 20:23:49 karens +# calendar_plugin_display_ical.inc,v 1.1.2.5 2008/11/25 16:12:36 karens +# calendar_plugin_style_ical.inc,v 1.1.2.13 2009/02/16 11:39:37 karens +# calendar_ical.module,v 1.1.2.6 2008/11/24 15:48:15 karens +# calendar_ical.info,v 1.1.2.1 2008/09/05 11:03:42 karens +# +#, fuzzy +msgid "" +msgstr "" +"Project-Id-Version: PROJECT VERSION\n" +"POT-Creation-Date: 2009-02-17 05:03-0600\n" +"PO-Revision-Date: YYYY-mm-DD HH:MM+ZZZZ\n" +"Last-Translator: NAME \n" +"Language-Team: LANGUAGE \n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=utf-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Plural-Forms: nplurals=INTEGER; plural=EXPRESSION;\n" + +#: calendar_ical.views.inc:30;42;64 +msgid "iCal feed" +msgstr "" + +#: calendar_ical.views.inc:31 +msgid "Display the view as an iCal feed." +msgstr "" + +#: calendar_ical.views.inc:65 +msgid "Generates an iCal feed from a view." +msgstr "" + +#: calendar_ical_admin.inc:22 +msgid "Expire iCal cache" +msgstr "" + +#: calendar_ical_admin.inc:24 +msgid "iCal feeds are cached to improve performance. Set an expiration time for cached feeds." +msgstr "" + +#: calendar_ical_admin.inc:30 +msgid "iCal Feeds" +msgstr "" + +#: calendar_ical_admin.inc:31 +msgid "Use this section to set up iCal feeds that should be displayed in this calendar. They will be shown along with any internal items that match the calendar criteria." +msgstr "" + +#: calendar_ical_admin.inc:42 +msgid "Feed type" +msgstr "" + +#: calendar_ical_admin.inc:47 +msgid "Name" +msgstr "" + +#: calendar_ical_admin.inc:50 +msgid "The name of a feed to include in this calendar." +msgstr "" + +#: calendar_ical_admin.inc:53 +msgid "Url" +msgstr "" + +#: calendar_ical_admin.inc:57 +msgid "The external feed url or internal file path and name. Change 'webcal://' to 'http://'." +msgstr "" + +#: calendar_ical_admin.inc:61 +msgid "Stripe color" +msgstr "" + +#: calendar_ical_admin.inc:67 +msgid "The hex color value (like #ffffff) to use for this feed's calendar stripe." +msgstr "" + +#: calendar_ical_admin.inc:77 +msgid "Submit" +msgstr "" + +#: calendar_plugin_display_ical.inc:81 +msgid "iCal settings" +msgstr "" + +#: calendar_plugin_display_ical.inc:85 +msgid "Using the site name" +msgstr "" + +#: calendar_plugin_display_ical.inc:93 +msgid "Multiple displays" +msgstr "" + +#: calendar_plugin_display_ical.inc:103 +msgid "None" +msgstr "" + +#: calendar_plugin_display_ical.inc:108;135 +msgid "Attach to" +msgstr "" + +#: calendar_plugin_display_ical.inc:127 +msgid "Use the site name for the title" +msgstr "" + +#: calendar_plugin_display_ical.inc:144 +msgid "The ical icon will be shown only on the selected displays." +msgstr "" + +#: calendar_plugin_display_ical.inc:150 +msgid "This view will be displayed by visiting this path on your site. It is recommended that the path be something like \"path/%/%/ical\", putting one % in the path for each argument you have defined in the view." +msgstr "" + +#: calendar_plugin_display_ical.inc:203 +msgid "A Calendar period display will not work without a Date argument or a Date filter." +msgstr "" + +#: calendar_plugin_style_ical.inc:70 +msgid "Map the View fields to the values they should represent in the iCal feed. Only fields that have been added to the view are available to use in this way. You can add additional fields to the view and mark them 'Exclude from display' if you only want them in the iCal feed." +msgstr "" + +#: calendar_plugin_style_ical.inc:74 +msgid "Title" +msgstr "" + +#: calendar_plugin_style_ical.inc:81 +msgid "Description" +msgstr "" + +#: calendar_plugin_style_ical.inc:87 +msgid "Location" +msgstr "" + +#: calendar_plugin_style_ical.inc:107 +msgid "The @style style requires a Date argument or a Date filter." +msgstr "" + +#: calendar_plugin_style_ical.inc:120 +msgid "The @style style requires a Title field for the iCal export." +msgstr "" + +#: calendar_plugin_style_ical.inc:134 +msgid "The date field '@field' used by the display '@display_title' cannot be set to 'Group multiple values'." +msgstr "" + +#: calendar_ical.module:29;29 +msgid "Add to calendar" +msgstr "" + +#: calendar_ical.module:0 +msgid "calendar_ical" +msgstr "" + +#: calendar_ical.info:0 +msgid "Calendar iCal" +msgstr "" + +#: calendar_ical.info:0 +msgid "Adds ical functionality to Calendar views." +msgstr "" + +#: calendar_ical.info:0 +msgid "Date/Time" +msgstr "" + diff --git a/sites/all/modules/calendar/calendar_multiday/calendar-overlap.css b/sites/all/modules/calendar/calendar_multiday/calendar-overlap.css new file mode 100644 index 0000000..3f669df --- /dev/null +++ b/sites/all/modules/calendar/calendar_multiday/calendar-overlap.css @@ -0,0 +1,803 @@ +/** Overlapping week items **/ +.calendar-calendar tr.holder { + height : 0px; + display: table-row !important; + display : none; +} + +.calendar-calendar .week-view .full div.item-wrapper, +.calendar-calendar .day-view .full div.item-wrapper { + background-color: none; + border:0px; + float:none; + margin:0px; + width : 100%; + margin-top : -24px; +} + +.calendar-calendar td .inner div, +.calendar-calendar td .inner div a { + background : none; +} + +.calendar-calendar .week-view .full div.single-day div.weekview, +.calendar-calendar .day-view .full div.single-day div.dayview { + background : #FFD8C0; + width : auto; + padding : 0px 3px; + overflow : hidden; +} + +.calendar-calendar .week-view .full div.single-day div.weekview, +.calendar-calendar .day-view .full div.single-day div.dayview { + border : 1px solid #E39364; +} + + +.calendar-calendar .week-view .header-body-divider, +.calendar-calendar .week-view .single-day-footer, +.calendar-calendar .day-view .single-day-footer, +.calendar-calendar .day-view .header-body-divider { + background : #eeeeee; + border-left : 1px solid #CCCCCC; + border-right : 1px solid #CCCCCC; + font-size : 1px; + height : 4px; + line-height : 1px; +} + +.calendar-calendar .week-view #multi-day-container, +.calendar-calendar .week-view #single-day-container, +.calendar-calendar .day-view #multi-day-container, +.calendar-calendar .day-view #single-day-container { + position : relative; + background : #ffffff; + overflow-y : scroll; + overflow-x : hidden; + border-left : 1px solid #CCCCCC; + border-bottom : 1px solid #CCCCCC; +} + +.calendar-calendar .week-view #multi-day-container, +.calendar-calendar .day-view #multi-day-container { + border-top : 1px solid #CCCCCC; +} + +.calendar-calendar .week-view #week-header-container, +.calendar-calendar .day-view #day-header-container { + width : 100%; + background : #ffffff; + border-bottom : 1px solid #CCCCCC; +} + +.calendar-calendar .week-view #multi-day-container, +.calendar-calendar .day-view #multi-day-container { + height : 57px; +} + +.calendar-calendar .week-view #multi-day-container .expand { + height : 100%; +} + +.calendar-calendar .week-view #multi-day-container table, +.calendar-calendar .day-view #multi-day-container table { + height : 100%; +} + +.calendar-calendar .week-view #multi-day-container table td, +.calendar-calendar .day-view #multi-day-container table td { + border-top : 0px; + border-bottom : 0px; + vertical-align : top; +} + +.calendar-calendar .week-view #single-day-container, +.calendar-calendar .day-view #single-day-container { + border-top : 1px solid #CCCCCC; + height : 500px; +} + +.calendar-calendar .week-view #single-day-container table td, +.calendar-calendar .day-view #single-day-container table td { + padding : 0px; + border-top : 0px; + border-bottom : 0px; +} + +.calendar-calendar .week-view #single-day-container table td.first, +.calendar-calendar .day-view #single-day-container table td.first { + border-left : 0px; +} + +.calendar-calendar .week-view #single-day-container table td.last, +.calendar-calendar .day-view #single-day-container table td.last { + border-right : 0px; +} + +.calendar-calendar .week-view #single-day-container div.first, +.calendar-calendar .day-view #single-day-container div.first { + border-top : 0px; +} + +.calendar-calendar .week-view #single-day-container div.last, +.calendar-calendar .day-view #single-day-container div.last { + border-bottom : 0px; +} + +.calendar-calendar .week-view table.full { + table-layout : fixed; + width : 925px; + margin : 0px; +} + +.calendar-calendar .day-view table.full { + table-layout : fixed; + width : 923px; + margin : 0px; +} + +.calendar-calendar td.calendar-agenda-hour .calendar-hour, +.calendar-calendar td.calendar-agenda-hour .calendar-ampm, +.calendar-calendar .week-view .full div.calendar-agenda-hour span, +.calendar-calendar .day-view .full div.calendar-agenda-hour span { + font-size : .8em; + font-weight : normal; + margin-right: 0px; +} + +.calendar-calendar .week-view .full div.calendar-agenda-hour, +.calendar-calendar .day-view .full div.calendar-agenda-hour, +.calendar-calendar .week-view .full div.calendar-agenda-items, +.calendar-calendar .day-view .full div.calendar-agenda-items { + width : 100%; + height : 47px; + border-top : 1px solid #cccccc; +} + +.calendar-calendar .week-view .full .calendar-agenda-hour div, +.calendar-calendar .day-view .full .calendar-agenda-hour div { + margin-top : 10px; +} + +.calendar-calendar .day-view .full td.calendar-time-holder, +.calendar-calendar .week-view .full td.calendar-time-holder { + width : 50px; + padding : 0px; + border : 0px; +} + +.calendar-calendar .week-view .full td.calendar-day-holder { + padding : 0px; + border : 0px; + width : 125px; +} + +.calendar-calendar .day-view .full td.calendar-day-holder { + padding : 0px; + border : 0px; + width : 873px; +} + +.calendar-calendar .week-view .full div.single-day, +.calendar-calendar .day-view .full div.single-day { + padding : 0px; +} + +.calendar-calendar .week-view .full div.single-day .inner, +.calendar-calendar .day-view .full div.single-day .inner { + position : absolute; + z-index : 1; +} + +.calendar-calendar .week-view .full td.multi-day { + padding : 1px 2px 0px 2px; +} + +.calendar-calendar .day-view .full td.multi-day div.dayview, +.calendar-calendar .week-view .full td.multi-day div.weekview { + height : 22px !important; +} + +.calendar-calendar .day-view .full td.multi-day .calendar.dayview .view-field, +.calendar-calendar .week-view .full td.multi-day .calendar.weekview .view-field { + display : inline; +} + +.calendar-calendar .week-view .full td.multi-day .inner .weekview .continuation { + height : 22px; + padding-top: 0px; + margin-right : 3px; +} + +.calendar-calendar .week-view .full td.multi-day .inner .weekview .continues, +.calendar-calendar .week-view .full td.multi-day .inner .weekview .cutoff, +.calendar-calendar .day-view .full td.multi-day .inner .dayview .continues, +.calendar-calendar .day-view .full td.multi-day .inner .dayview .cutoff { + height : 22px; + padding-top: 0px; +} + +.calendar-calendar .week-view div.single-day .view-item, +.calendar-calendar .day-view div.single-day .view-item { + position : absolute; + width : 100%; + background : none; + text-align : left; + z-index : 1; +} + +.calendar-calendar .week-view div.single-day .half-hour, +.calendar-calendar .day-view div.single-day .half-hour { + font-size : 1px; + height : 23px; + width : 100%; + position :relative; + z-index : 0; + top : 0px; + border-bottom : 1px dotted #cccccc; +} + +.calendar-calendar .week-view div.single-day .view-item .calendar, +.calendar-calendar .day-view div.single-day .view-item .calendar { + margin : 0px; +} + +.calendar-calendar .week-view div.single-day .view-item .contents, +.calendar-calendar .day-view div.single-day .view-item .contents { + overflow : hidden; +} + +.calendar-calendar div.single-day .o_0 .view-item { + top : 0px; +} + +.calendar-calendar div.single-day .o_1 .view-item { + top : 12px; +} + +.calendar-calendar div.single-day .o_2 .view-item { + top : 24px; +} + +.calendar-calendar div.single-day .o_3 .view-item { + top : 36px; +} + +.calendar-calendar div.single-day .o_4 .view-item { + top : 40px; +} + +.calendar-calendar div.single-day .d_1 .view-item .calendar { + height : 10px; +} + + +.calendar-calendar div.single-day .d_2 .view-item .calendar { + height : 22px; +} + + +.calendar-calendar div.single-day .d_3 .view-item .calendar { + height : 34px; +} + + +.calendar-calendar div.single-day .d_4 .view-item .calendar { + height : 46px; +} + + +.calendar-calendar div.single-day .d_5 .view-item .calendar { + height : 58px; +} + + +.calendar-calendar div.single-day .d_6 .view-item .calendar { + height : 70px; +} + + +.calendar-calendar div.single-day .d_7 .view-item .calendar { + height : 82px; +} + + +.calendar-calendar div.single-day .d_8 .view-item .calendar { + height : 94px; +} + + +.calendar-calendar div.single-day .d_9 .view-item .calendar { + height : 106px; +} + + +.calendar-calendar div.single-day .d_10 .view-item .calendar { + height : 118px; +} + + +.calendar-calendar div.single-day .d_11 .view-item .calendar { + height : 130px; +} + + +.calendar-calendar div.single-day .d_12 .view-item .calendar { + height : 142px; +} + + +.calendar-calendar div.single-day .d_13 .view-item .calendar { + height : 154px; +} + + +.calendar-calendar div.single-day .d_14 .view-item .calendar { + height : 166px; +} + + +.calendar-calendar div.single-day .d_15 .view-item .calendar { + height : 178px; +} + + + +.calendar-calendar div.single-day .d_16 .view-item .calendar { + height : 190px; +} + + +.calendar-calendar div.single-day .d_17 .view-item .calendar { + height : 202px; +} + +.calendar-calendar div.single-day .d_18 .view-item .calendar { + height : 214px; +} + +.calendar-calendar div.single-day .d_19 .view-item .calendar { + height : 226px; +} + +.calendar-calendar div.single-day .d_20 .view-item .calendar { + height : 238px; +} + +.calendar-calendar div.single-day .d_21 .view-item .calendar { + height : 250px; +} + +.calendar-calendar div.single-day .d_22 .view-item .calendar { + height : 262px; +} + +.calendar-calendar div.single-day .d_23 .view-item .calendar { + height : 274px; +} + +.calendar-calendar div.single-day .d_24 .view-item .calendar { + height : 286px; +} + +.calendar-calendar div.single-day .d_25 .view-item .calendar { + height : 298px; +} + +.calendar-calendar div.single-day .d_26 .view-item .calendar { + height : 310px; +} + +.calendar-calendar div.single-day .d_27 .view-item .calendar { + height : 322px; +} + +.calendar-calendar div.single-day .d_28 .view-item .calendar { + height : 334px; +} + +.calendar-calendar div.single-day .d_29 .view-item .calendar { + height : 346px; +} + +.calendar-calendar div.single-day .d_30 .view-item .calendar { + height : 358px; +} + +.calendar-calendar div.single-day .d_31 .view-item .calendar { + height : 370px; +} + +.calendar-calendar div.single-day .d_32 .view-item .calendar { + height : 382px; +} + +.calendar-calendar div.single-day .d_33 .view-item .calendar { + height : 394px; +} + +.calendar-calendar div.single-day .d_34 .view-item .calendar { + height : 406px; +} + +.calendar-calendar div.single-day .d_35 .view-item .calendar { + height : 418px; +} + +.calendar-calendar div.single-day .d_36 .view-item .calendar { + height : 430px; +} + +.calendar-calendar div.single-day .d_37 .view-item .calendar { + height : 442px; +} + +.calendar-calendar div.single-day .d_38 .view-item .calendar { + height : 454px; +} + +.calendar-calendar div.single-day .d_39 .view-item .calendar { + height : 466px; +} + +.calendar-calendar div.single-day .d_40 .view-item .calendar { + height : 478px; +} + +.calendar-calendar div.single-day .d_41 .view-item .calendar { + height : 490px; +} + +.calendar-calendar div.single-day .d_42 .view-item .calendar { + height : 502px; +} + +.calendar-calendar div.single-day .d_43 .view-item .calendar { + height : 514px; +} + +.calendar-calendar div.single-day .d_44 .view-item .calendar { + height : 526px; +} + +.calendar-calendar div.single-day .d_45 .view-item .calendar { + height : 538px; +} + +.calendar-calendar div.single-day .d_46 .view-item .calendar { + height : 550px; +} + +.calendar-calendar div.single-day .d_47 .view-item .calendar { + height : 562px; +} + +.calendar-calendar div.single-day .d_48 .view-item .calendar { + height : 574px; +} + +.calendar-calendar div.single-day .d_49 .view-item .calendar { + height : 586px; +} + +.calendar-calendar div.single-day .d_50 .view-item .calendar { + height : 598px; +} + +.calendar-calendar div.single-day .d_51 .view-item .calendar { + height : 610px; +} + +.calendar-calendar div.single-day .d_52 .view-item .calendar { + height : 622px; +} + +.calendar-calendar div.single-day .d_53 .view-item .calendar { + height : 634px; +} + +.calendar-calendar div.single-day .d_54 .view-item .calendar { + height : 646px; +} + +.calendar-calendar div.single-day .d_55 .view-item .calendar { + height : 658px; +} + +.calendar-calendar div.single-day .d_56 .view-item .calendar { + height : 670px; +} + +.calendar-calendar div.single-day .d_57 .view-item .calendar { + height : 682px; +} + +.calendar-calendar div.single-day .d_58 .view-item .calendar { + height : 694px; +} + +.calendar-calendar div.single-day .d_59 .view-item .calendar { + height : 706px; +} + +.calendar-calendar div.single-day .d_60 .view-item .calendar { + height : 718px; +} + +.calendar-calendar div.single-day .d_61 .view-item .calendar { + height : 730px; +} + +.calendar-calendar div.single-day .d_62 .view-item .calendar { + height : 742px; +} + +.calendar-calendar div.single-day .d_63 .view-item .calendar { + height : 754px; +} + +.calendar-calendar div.single-day .d_64 .view-item .calendar { + height : 766px; +} + +.calendar-calendar div.single-day .d_65 .view-item .calendar { + height : 778px; +} + +.calendar-calendar div.single-day .d_66 .view-item .calendar { + height : 790px; +} + +.calendar-calendar div.single-day .d_67 .view-item .calendar { + height : 802px; +} + +.calendar-calendar div.single-day .d_68 .view-item .calendar { + height : 814px; +} + +.calendar-calendar div.single-day .d_69 .view-item .calendar { + height : 826px; +} + +.calendar-calendar div.single-day .d_70 .view-item .calendar { + height : 838px; +} + +.calendar-calendar div.single-day .d_71 .view-item .calendar { + height : 850px; +} + +.calendar-calendar div.single-day .d_72 .view-item .calendar { + height : 862px; +} + +.calendar-calendar div.single-day .d_73 .view-item .calendar { + height : 874px; +} + +.calendar-calendar div.single-day .d_74 .view-item .calendar { + height : 886px; +} + +.calendar-calendar div.single-day .d_75 .view-item .calendar { + height : 898px; +} + +.calendar-calendar div.single-day .d_76 .view-item .calendar { + height : 910px; +} + +.calendar-calendar div.single-day .d_77 .view-item .calendar { + height : 922px; +} + +.calendar-calendar div.single-day .d_78 .view-item .calendar { + height : 934px; +} + +.calendar-calendar div.single-day .d_79 .view-item .calendar { + height : 946px; +} + +.calendar-calendar div.single-day .d_80 .view-item .calendar { + height : 958px; +} + +.calendar-calendar div.single-day .d_81 .view-item .calendar { + height : 970px; +} + +.calendar-calendar div.single-day .d_82 .view-item .calendar { + height : 982px; +} + +.calendar-calendar div.single-day .d_83 .view-item .calendar { + height : 994px; +} + +.calendar-calendar div.single-day .d_84 .view-item .calendar { + height : 1006px; +} + +.calendar-calendar div.single-day .d_85 .view-item .calendar { + height : 1018px; +} + +.calendar-calendar div.single-day .d_86 .view-item .calendar { + height : 1030px; +} + +.calendar-calendar div.single-day .d_87 .view-item .calendar { + height : 1042px; +} + +.calendar-calendar div.single-day .d_88 .view-item .calendar { + height : 1054px; +} + +.calendar-calendar div.single-day .d_89 .view-item .calendar { + height : 1066px; +} + +.calendar-calendar div.single-day .d_90 .view-item .calendar { + height : 1078px; +} + +.calendar-calendar div.single-day .d_91 .view-item .calendar { + height : 1090px; +} + +.calendar-calendar div.single-day .d_92 .view-item .calendar { + height : 1102px; +} + +.calendar-calendar div.single-day .d_93 .view-item .calendar { + height : 1114px; +} + +.calendar-calendar div.single-day .d_94 .view-item .calendar { + height : 1128px; +} + +.calendar-calendar div.single-day .d_95 .view-item .calendar { + height : 1140px; +} + +.calendar-calendar div.single-day .d_96 .view-item .calendar { + height : 1152px; +} + +.calendar-calendar .week-view div.single-day .i_0 .view-item .calendar { + margin-left : 0px; + width : 55px; +} + +.calendar-calendar .week-view div.single-day .i_1 .view-item .calendar { + margin-left : 15px; + width : 102px; +} + +.calendar-calendar .week-view div.single-day .i_2 .view-item .calendar { + margin-left : 23px; + width : 94px; +} + +.calendar-calendar .week-view div.single-day .i_3 .view-item .calendar { + margin-left : 29px; + width : 88px; +} + +.calendar-calendar .week-view div.single-day .i_4 .view-item .calendar { + margin-left : 40px; + width : 77px; +} + +.calendar-calendar .week-view div.single-day .i_5 .view-item .calendar { + margin-left : 50px; + width : 67px; +} + +.calendar-calendar .week-view div.single-day .i_6 .view-item .calendar { + margin-left : 60px; + width : 57px; +} + +.calendar-calendar .week-view div.single-day .i_7 .view-item .calendar { + margin-left : 67px; + width : 50px; +} + +.calendar-calendar .week-view div.single-day .i_8 .view-item .calendar { + margin-left : 75px; + width : 42px; +} + +.calendar-calendar .week-view div.single-day .i_9 .view-item .calendar { + margin-left : 90px; + width : 27px; +} + +.calendar-calendar .week-view div.single-day .i_0.md_0 .view-item .calendar { + width : 115px !important; + width : auto; +} + +.calendar-calendar .week-view div.single-day .i_0.md_1 .view-item .calendar { + width : 75px !important; + width : auto; +} + +.calendar-calendar .day-view div.single-day .i_0 .view-item .calendar { + margin-left : 2px; + width : 210px !important; + width : 838px; +} + +.calendar-calendar .day-view div.single-day .i_1 .view-item .calendar { + margin-left : 90px; + width : 750px; +} + +.calendar-calendar .day-view div.single-day .i_2 .view-item .calendar { + margin-left : 180px; + width : 660px; +} + +.calendar-calendar .day-view div.single-day .i_3 .view-item .calendar { + margin-left : 270px; + width : 570px; +} + +.calendar-calendar .day-view div.single-day .i_4 .view-item .calendar { + margin-left : 360px; + width : 480px; +} + +.calendar-calendar .day-view div.single-day .i_5 .view-item .calendar { + margin-left : 450px; + width : 390px; +} + +.calendar-calendar .day-view div.single-day .i_6 .view-item .calendar { + margin-left : 540px; + width : 300px; +} + +.calendar-calendar .day-view div.single-day .i_7 .view-item .calendar { + margin-left : 630px; + width : 210px; +} + +.calendar-calendar .day-view div.single-day .i_8 .view-item .calendar { + margin-left : 720px; + width : 120px; +} + +.calendar-calendar .day-view div.single-day .i_9 .view-item .calendar { + margin-left : 810px; + width : 30px; +} + +.calendar-calendar .day-view div.single-day .i_0.md_0 .view-item .calendar { + width : 838px !important; + width : auto; +} + +.calendar-calendar .day-view div.single-day .i_0.md_1 .view-item .calendar { + width : 419px !important; + width : auto; +} + +.calendar-calendar .day-view div.single-day .i_0.md_2 .view-item .calendar { + width : 350px !important; + width : auto; +} + +.single-day-footer .grippie, +.header-body-divider .grippie { + overflow: hidden; + background: #eee url(/misc/grippie.png) no-repeat center 2px; + cursor: s-resize; + height : 3px; +} diff --git a/sites/all/modules/calendar/calendar_multiday/calendar_multiday.css b/sites/all/modules/calendar/calendar_multiday/calendar_multiday.css new file mode 100644 index 0000000..44f0edc --- /dev/null +++ b/sites/all/modules/calendar/calendar_multiday/calendar_multiday.css @@ -0,0 +1,852 @@ +/* calendar calendar table styles */ +.calendar-calendar tr.odd, .calendar-calendar tr.even { + background-color:#fff; +} +.calendar-calendar table { + border-collapse: collapse; + border-spacing: 0; + margin:0 auto; + padding:0; + width: 100%; /* Setting at 100% causes problem in Internet Explorer. */ +} +.calendar-calendar .month-view table { + border:none; + padding:0; + margin:0; + width:100%; +} + + /* IE needs a little help to get the side by side tables to the right size */ +.calendar-calendar .year-view td { + width:32%; + padding:1px; + border:none; +} + +.calendar-calendar .year-view td table td { + width:13%; + padding:0; +} + +.calendar-calendar tr { + padding: 0; + margin: 0; + background-color: white; +} +.calendar-calendar th { + text-align: center; + margin:0; +} +.calendar-calendar th a { + font-weight: bold; +} +.calendar-calendar td { + width: 12%; /* 14% is about 1/7 of total table width */ + min-width: 12%; + border: 1px solid #ccc; + color: #777; + text-align: right; + vertical-align: top; + margin: 0; + padding:0; +} + +/* simplify the mini calendar by removing borders */ +.calendar-calendar .mini { + border:none; + } + +/* format for the week number in the first cell */ +.calendar-calendar td.week { + width:1%; + min-width:1%; + } +.calendar-calendar .week { + clear:both; + font-style: normal; + color: #555; + font-size: 0.8em; +} +.calendar-calendar .week a { + font-weight:normal; +} + +/* IE6 does not support min-height, using Min-Height fast hack from http://www.dustindiaz.com/min-height-fast-hack */ +.calendar-calendar .inner { + height:auto !important; + height:5em; + padding:0; + margin:0; +} +.calendar-calendar .inner div { + padding:0; + margin:0; +} +/* Make sure paragraphs buried in calendar cells use padding, not margins, for separation so the background color doesn't come through. */ +.calendar-calendar .inner p { + padding:0 0 .8em 0; + margin:0; +} +.calendar-calendar td a { + font-weight: bold; + text-decoration: none; +} +.calendar-calendar td a:hover { + text-decoration: underline; +} +.calendar-calendar td.year, +.calendar-calendar td.month { + text-align: center; +} + +/* format days of the week header cells */ +.calendar-calendar th.days { + color: #ccc; + background-color: #224; + text-align: center; + padding:1px; + margin:0; + } + +/* floating day number div */ +.calendar-calendar div.day { + float: right; + text-align: center; + padding: 0.125em 0.25em 0 0.25em; + margin: 0; + background-color: #f3f3f3; + border: 1px solid gray; + border-width: 0 0 1px 1px; + clear:both; + width:1.5em; +} + +/* individual node container */ +.calendar-calendar div.calendar { + background-color: #fff; + border: solid 1px #ddd; + text-align: left; + margin:0 .25em .25em 0; + width: 96%; + float:right; /* needed to keep IE from hiding the floating day number */ + clear:both; +} +/* No floating of day view content because there is no floating day number */ +.calendar-calendar .day-view div.calendar { + float:none; + width:98%; + margin:1% 1% 0 1%; +} + +.calendar-calendar div.title { + font-size:.8em; + text-align:center; +} + +.calendar-calendar div.title a { + color: #000; +} +.calendar-calendar div.title a:hover { + color: #c00; +} +.calendar-calendar .content { + clear:both; + padding: 3px; + padding-left: 5px; +} +.calendar div.form-item { + white-space: normal; +} + +table td.mini, +table th.mini, +table.mini td.week { + padding:0 1px 0 0; + margin:0; + } +table td.mini a { + font-weight:normal; + } +.calendar-calendar .mini-day-off { + padding:0px; +} +.calendar-calendar .mini-day-on { + padding:0px; +} +table .mini-day-on a { + text-decoration:underline; + } +.calendar-calendar .mini .title { + font-size:.8em; + } +.mini .calendar-calendar .week { + font-size:.7em; + } +.mini-row { + width:100%; + border:none; +} +.mini{ + width:32%; + vertical-align:top; + } + + +/* formatting for the legend stripe and block */ +.calendar-calendar .stripe { + height: 5px; + width: auto; + font-size:1px !important; + line-height:1px !important; +} +.calendar-calendar .day-view .stripe { + width:100%; +} +table.calendar-legend { + background-color:#ccc; + width:100%; + margin:0; + padding:0; +} +table.calendar-legend tr.odd .stripe, +table.calendar-legend tr.even .stripe { + height:12px !important; + font-size:9px !important; + line-height:10px !important; +} +.calendar-legend td { + text-align:left; +} + +.calendar-empty { + font-size:1px; + line-height:1px; +} + +/* formatting for the full day view */ +.calendar-calendar td.calendar-agenda-hour { + text-align:right; + border:none; + border-top:1px solid #CCCCCC; + padding-top:.25em; + width:1%; +} +.calendar-calendar td.calendar-agenda-no-hours { + min-width:1%; +} +.calendar-calendar td.calendar-agenda-hour .calendar-hour { + font-size:1.2em; + font-weight:bold; +} +.calendar-calendar td.calendar-agenda-hour .calendar-ampm { + font-size:1em; +} +.calendar-calendar td.calendar-agenda-items { + border:1px solid #CCCCCC; + text-align:left; +} +.calendar-calendar td.calendar-agenda-items div.calendar { + width:auto; + padding:.25em; + margin:0; +} +.calendar-calendar div.calendar div.inner .calendar-agenda-empty { + width:100%; + text-align:center; + vertical-align:middle; + padding:1em 0; + background-color:#fff; +} + +/* the popup date selector for jumping to a new date */ +.calendar-date-select form { + text-align:right; + float:right; + width:25%; +} +.calendar-date-select div, +.calendar-date-select input, +.calendar-date-select label { + text-align:right; + padding:0; + margin:0; + float:right; + clear:both; +} +.calendar-date-select .description { + float:right; +} +.calendar-label { + font-weight:bold; + display:block; + clear:both; +} + +.calendar-calendar div.date-nav { + background-color:#ccc; + color:#777; + padding:0.2em; + width:auto; + border:1px solid #ccc; +} +.calendar-calendar div.date-nav a, +.calendar-calendar div.date-nav h3 { + color:#777; + text-decoration:none; +} +.calendar-calendar th.days { + background-color:#eee; + color:#777; + font-weight:bold; + border:1px solid #ccc; +} +.calendar-calendar td.empty { + background:#ccc; + border-color:#ccc; +} +.calendar-calendar table.mini td.empty { + background:#fff; + border-color:#fff; +} +.calendar-calendar td div.day { + border:1px solid #ccc; + border-top:none; + border-right:none; + margin-bottom:2px; +} +.calendar-calendar td .inner div, +.calendar-calendar td .inner div a { + background:#eee; +} +/* Set small font size for all items in calendar div, themes can override this. */ +/* Use x-small instead of em to avoid multiplying effect in nested items. */ +.calendar-calendar div.calendar { + border:none; + font-size:x-small; +} +.calendar-calendar td .inner div.calendar div, +.calendar-calendar td .inner div.calendar div a { + border:none; + background:#ffc; + padding:0; +} +.calendar-calendar td .inner div.calendar div.calendar-more, +.calendar-calendar td .inner div.calendar div.calendar-more a { + color:#444; + background:#fff; + text-align:right; +} +.calendar-calendar td .inner .view-field, +.calendar-calendar td .inner .view-field a { + color:#444; + font-weight:normal; +} + +.calendar-calendar td span.date-display-single, +.calendar-calendar td span.date-display-start, +.calendar-calendar td span.date-display-end, +.calendar-calendar td span.date-display-separator { + font-weight:bold; +} +.calendar-calendar td .inner div.day a { + color:#4b85ac; +} +.calendar-calendar tr td.today, +.calendar-calendar tr.odd td.today, +.calendar-calendar tr.even td.today { + background-color:#C3D6E4; +} +.calendar-calendar td .inner div.calendar div div.view-data-node-data-field-date-field-date-value { +} + +/* The following are not used by default but are available for themes */ +.calendar-calendar td.past {} +.calendar-calendar td.future {} +.calendar-calendar td.has-events {} +.calendar-calendar td.has-no-events {} + +/* Multi day styles */ +.calendar-calendar tbody { + border-top : none; +} + +.calendar-calendar .month-view .full .inner, +.calendar-calendar .week-view .full .multi-day .inner { + height : auto; + min-height : auto; +} +.calendar-calendar .week-view .full .calendar-agenda-hour +.calendar-calendar .month-view .full .single-day .inner .view-item { + float : left; + width : 100%; +} + +.calendar-calendar .week-view .full .calendar-agenda-hour { + width : 6%; + min-width : 0px; + padding-right : 2px; +} + +.calendar-calendar .week-view .full .days { + width : 13%; +} + +.calendar-calendar .month-view .full div.calendar, +.calendar-calendar .week-view .full div.calendar, +.calendar-calendar .day-view div.calendar { + width : auto; +} + +.calendar-calendar .month-view .full tr.date-box, +.calendar-calendar .month-view .full tr.date-box td, +.calendar-calendar .month-view .full tr.multi-day, +.calendar-calendar .month-view .full tr.multi-day td { + height : 19px; + max-height : 19px; +} + +.calendar-calendar .month-view .full tr.single-day .no-entry, +.calendar-calendar .month-view .full tr.single-day .no-entry .inner { + height : 44px !important; + line-height : 44px; + font-size : 1px; +} + +.calendar-calendar .month-view .full tr.single-day .noentry-multi-day, +.calendar-calendar .month-view .full tr.single-day .noentry-multi-day .inner { + height : 22px !important; + line-height : 22px; + font-size : 1px; +} + +.calendar-calendar .month-view .full td, +.calendar-calendar .week-view .full td, +.calendar-calendar .day-view td { + vertical-align: top; + padding :1px 2px 0 2px +} + +.calendar-calendar .month-view .full td.date-box { + height : 1%; + border-bottom: 0px; + padding-bottom : 2px; +} + + +.calendar-calendar .month-view .full .week { + font-size : inherit; +} + +.calendar-calendar .month-view .full .week a, +.calendar-calendar .week-view .full .week a { + color:#4b85ac; +} + +.calendar-calendar .month-view .full td .inner div.day, +.calendar-calendar .month-view .full td .inner div.day a { + border :none; + background : none; + margin-bottom: 0px; +} + +.calendar-calendar .month-view .full td.date-box .inner, +.calendar-calendar .week-view .full td.date-box .inner { + min-height : inherit; +} + +.calendar-calendar .month-view .full td.multi-day, +.calendar-calendar .week-view .full td.multi-day { + border-top: 0px; + border-bottom: 0px; +} + +.calendar-calendar .week-view .full .first td.multi-day { + border-top : 1px solid #CCCCCC; +} + +.calendar-calendar .month-view .full td.single-day { + border-top: 0px; +} + +.calendar-calendar .month-view .full td.multi-day .inner, +.calendar-calendar .week-view .full td.multi-day .inner, +.calendar-calendar .day-view .full td.multi-day .inner { + min-height : inherit; + width : auto; + position : relative; +} + +.calendar-calendar .month-view .full td.multi-day.no-entry { + min-height : 0px; +} + +.calendar-calendar .month-view .full td.single-day .calendar-empty, +.calendar-calendar .month-view .full td.single-day.empty, +.calendar-calendar .month-view .full td.date-box.empty { + background : #F4F4F4; +} + +.calendar-calendar .month-view .full td.single-day .inner div, +.calendar-calendar .month-view .full td.single-day .inner div a , +.calendar-calendar .month-view .full td.multi-day .inner div, +.calendar-calendar .month-view .full td.multi-day .inner div a , +.calendar-calendar .month-view .full td .inner div.calendar.monthview div, +.calendar-calendar .month-view .full td .inner div.calendar.monthview div a, +.calendar-calendar .week-view .full td.single-day .inner div, +.calendar-calendar .week-view .full td.single-day .inner div a , +.calendar-calendar .week-view .full td.multi-day .inner div, +.calendar-calendar .week-view .full td.multi-day .inner div a , +.calendar-calendar .week-view .full td .inner div.calendar.weekview div, +.calendar-calendar .week-view .full td .inner div.calendar.weekview div a, +.calendar-calendar .day-view .full td .inner div.view-item, +.calendar-calendar .day-view .full td .inner div.calendar div, +.calendar-calendar .day-view .full td .inner div.calendar div a { + background : none; +} + +.calendar-calendar .day-view .full td .inner div.calendar div, +.calendar-calendar .day-view .full td .inner div.calendar div a { + margin : 0px 3px; +} + +.calendar-calendar .day-view .full td .inner div.calendar div.stripe { + margin : 0px; +} + +.calendar-calendar .month-view .full tr td.today, +.calendar-calendar .month-view .full tr.odd td.today, +.calendar-calendar .month-view .full tr.even td.today { + background: none; + border-left :2px solid #7C7F12; + border-right :2px solid #7C7F12; +} + +.calendar-calendar .month-view .full td.date-box.today { + border-width : 2px 2px 0px 2px; + border-style: solid; + border-color : #7C7F12; +} + +.calendar-calendar .month-view .full tr td.single-day.today { + border-bottom :2px solid #7C7F12; +} + +.calendar-calendar .month-view .full tr td.multi-day.starts-today { + border-left :2px solid #7C7F12; +} + +.calendar-calendar .month-view .full tr td.multi-day.ends-today { + border-right :2px solid #7C7F12; +} + +.calendar-calendar .month-view .full tr td.multi-day, +.calendar-calendar .month-view .full tr td.single-day { + border-top : 0px; +} + +.calendar-calendar .month-view .full tr td.multi-day, +.calendar-calendar .month-view .full tr td.date-box { + border-bottom : 0px; +} + +.calendar-calendar .month-view .full .inner .monthview, +.calendar-calendar .week-view .full .inner .weekview, +.calendar-calendar .day-view .full .inner .dayview { + -moz-border-radius : 5px; + border-radius : 5px; + width : auto; + float : none; + display : block; + margin : .25em auto; + position : relative; +} + + +.calendar-calendar .month-view .full td.single-day div.monthview, +.calendar-calendar .week-view .full td.single-day div.weekview, +.calendar-calendar .day-view .full td.single-day div.dayview { + background : #FFD8C0; + width : auto; + padding : 0px 3px; + overflow : hidden; +} + +.calendar-calendar .month-view .full td.single-day .calendar-more div.monthview { + background : none; +} + +.calendar-calendar .day-view td div.dayview { + padding : 0px; +} + +.calendar-calendar .month-view .full td.multi-day div.monthview, +.calendar-calendar .week-view .full td.multi-day div.weekview, +.calendar-calendar .day-view .full td.multi-day div.dayview { + background : #74a5d7; + height : 1.9em; + overflow : hidden; + margin : 0px auto; + color : #ffffff; + position : relative; +} + +.calendar-calendar .week-view .full td.multi-day div.weekview { + height : 3.5em; +} + +.calendar-calendar .month-view .full td.multi-day .inner .view-field, +.calendar-calendar .month-view .full td.multi-day .inner .view-field a, +.calendar-calendar .week-view .full td.multi-day .inner .view-field, +.calendar-calendar .week-view .full td.multi-day .inner .view-field a, +.calendar-calendar .day-view .full td.multi-day .inner .view-field, +.calendar-calendar .day-view .full td.multi-day .inner .view-field a { + color : #ffffff; +} + +.calendar-calendar .full td.multi-day .calendar .view-field, +.calendar-calendar .full td.single-day .calendar .view-field { +} + +.calendar-calendar .day-view .full td.multi-day div.dayview, +.calendar-calendar .week-view .full td.multi-day div.weekview { + margin-bottom: 2px; +} + +.calendar-calendar .month-view .full td.multi-day .calendar.monthview .view-field { + white-space: nowrap; + float : left; + margin-right : 3px; +} + +.calendar-calendar .week-view .full td.multi-day .calendar.weekview .view-field { + white-space: nowrap; + display : inline; + margin-right : 3px; +} + +.calendar-calendar .day-view .full td.multi-day .calendar.weekview .view-field { + display : block; +} + +.calendar-calendar .month-view .full td.multi-day .calendar.monthview .contents, +.calendar-calendar .week-view .full td.multi-day .calendar.weekview .contents { + position : absolute; + width : 3000px; + left: 5px; +} + +.calendar-calendar .day-view td .stripe, +.calendar-calendar .month-view .full td .stripe, +.calendar-calendar .week-view .full td .stripe { + -moz-border-radius : 5px 5px 0px 0px; + border-radius : 5px 5px 0px 0px; + left: 0px; + top : 0px; + position:absolute; + width : 100%; + height :3px; + z-index : 2; +} + +.calendar-calendar .full td.single-day .continuation, +.calendar-calendar .full td.single-day .continues, +.calendar-calendar .full td.single-day .cutoff { + display : none; +} + +.calendar-calendar .month-view .full td.multi-day .inner .monthview .continuation, +.calendar-calendar .week-view .full td.multi-day .inner .weekview .continuation { + float :left; + margin-right : 3px; + height : 1.9em; +} + +.calendar-calendar .week-view .full td.multi-day .inner .weekview .continuation { + height : 2.75em; + padding-top: 0.75em; + margin-right : 8px; +} + +.calendar-calendar .month-view .full td.multi-day .inner .monthview .continues, +.calendar-calendar .month-view .full td.multi-day .inner .monthview .cutoff, +.calendar-calendar .week-view .full td.multi-day .inner .weekview .continues, +.calendar-calendar .week-view .full td.multi-day .inner .weekview .cutoff { + position:absolute; + right : 0px !important; + right : -1px; + width : 10px; + text-align: left; + background : #74a5d7; + -moz-border-radius : 0px 5px 5px 0px; + border-radius : 0px 5px 5px 0px; + height : 1.9em; + padding-left: 6px; + z-index : 1; +} + +.calendar-calendar .week-view .full td.multi-day .inner .weekview .continues, +.calendar-calendar .week-view .full td.multi-day .inner .weekview .cutoff { + height : 2.75em; + padding-top: 0.75em; +} + +.calendar-calendar .month-view .full td.multi-day .inner .monthview .cutoff, +.calendar-calendar .week-view .full td.multi-day .inner .weekview .cutoff { + width : 8px; + padding-left: 0px; +} + +.calendar-calendar .week-view .full td.multi-day { + padding : 2px; +} + +.calendar-calendar .week-view td.single-day div.calendar { + width : 100%; + padding-left:0px; + padding-right : 0px; +} + +.calendar-calendar .week-view .full tr.last td.multi-day { + border-bottom:1px solid #CCCCCC; +} + +/* Restyle Header */ +.view-content .calendar-calendar { + position : relative; + margin-top : 5px; + float:left; + width: 100%; +} + +.view-content .calendar-calendar .links { + display : block; +} + +.view-content .calendar-calendar ul.links { + margin-bottom: 3px; +} + +.view-content .calendar-calendar ul { + position : absolute; + top : 8px ; + line-height : inherit; + z-index : 1; +} + +.view-content .calendar-calendar li { + float : left; + line-height : inherit ; + margin-left : 10px ; +} + +.view-content .calendar-calendar li a { + text-decoration : underline ; + line-height : inherit ; +} + +.view-content .calendar-calendar .date-nav { + background-color : transparent ; + border : 0px ; + height : 30px; + height : auto ; + min-height : 30px; +} + +.view-content .calendar-calendar .date-prev a, +.view-content .calendar-calendar .date-next a { + text-decoration : none ; + color : inherit ; + font-size : 12px; +} + +.view-content .calendar-calendar .date-nav a:hover { + text-decoration : underline ; +} + +.view-content .calendar-calendar .date-prev { + -moz-border-radius:5px 0 0 5px; + border-radius:5px 0 0 5px; + background:none repeat scroll 0 0 #dfdfdf; + float:none; + padding:5px 0; + position:absolute; + right:60px; + text-align:right; + top:0px; + width:auto; + z-index : 1; + font-size : 12px; +} + +div.block .view-content .calendar-calendar .date-prev { + left:0; + right:auto; +} + +.view-content .calendar-calendar .date-prev span { + margin-left : 10px; + font-style : bold; +} + +.view-content .calendar-calendar .date-heading { + position : relative; + width : 100%; + top : 0px; + text-align : center; + z-index : 0; + float : none; +} + +.view-content .calendar-calendar .date-heading h3 { + line-height : 30px ; + font-size : 1.7em ; +} + +.view-content .calendar-calendar .date-next { + -moz-border-radius:0px 5px 5px 0px; + border-radius:0px 5px 5px 0px; + background:none repeat scroll 0 0 #dfdfdf; + float:none; + padding:5px 0; + position:absolute; + right:0px; + text-align:right; + top:0px; + width:auto; + z-index : 1; + font-size : 12px; +} + +.view-content .calendar-calendar .date-next span { + margin-right : 10px; + font-style : bold; +} + +.view-content:after { + content: "."; + display: block; + height: 0; + clear: both; + visibility: hidden; +} + +.attachment .calendar-calendar { + margin-top : 20px ; + clear : both; +} + +.calendar-calendar th a, +.attachment .calendar-calendar th { + background-color : transparent ; + border : 0px ; +} + +.attachment .calendar-calendar th.calendar-agenda-hour { + color : #777777; + font-weight : bold; + text-align : right; +} + +.view-calendar .feed-icon { + margin-top : 5px; +} diff --git a/sites/all/modules/calendar/calendar_multiday/calendar_multiday.info b/sites/all/modules/calendar/calendar_multiday/calendar_multiday.info new file mode 100644 index 0000000..5c313f5 --- /dev/null +++ b/sites/all/modules/calendar/calendar_multiday/calendar_multiday.info @@ -0,0 +1,15 @@ +; $Id: calendar_multiday.info,v 1.1.2.2 2011/01/03 12:28:47 karens Exp $ +name = Calendar Multiday +description = "Use the calendar multiday display as an alternative to the standard display. (BETA version)" +dependencies[] = calendar +dependencies[] = views +core = 6.x +php = 5.2 +package = Date/Time + +; Information added by drupal.org packaging script on 2011-01-03 +version = "6.x-2.4" +core = "6.x" +project = "calendar" +datestamp = "1294072550" + diff --git a/sites/all/modules/calendar/calendar_multiday/calendar_multiday.install b/sites/all/modules/calendar/calendar_multiday/calendar_multiday.install new file mode 100644 index 0000000..66598cd --- /dev/null +++ b/sites/all/modules/calendar/calendar_multiday/calendar_multiday.install @@ -0,0 +1,12 @@ + 2, + 'path' => drupal_get_path('module', 'calendar_multiday'), + ); +} + +/** + * @file + * Adds calendar filtering and displays to Views. + */ +function calendar_multiday_init() { + if (substr($_GET['q'], 0, 24) == 'admin/build/modules/list') { + return; + } + drupal_add_css(drupal_get_path('module', 'calendar_multiday') .'/calendar_multiday.css'); + require_once('./'. drupal_get_path('module', 'calendar_multiday') .'/theme/theme.inc'); +} + +function calendar_multiday_theme() { + $path = drupal_get_path('module', 'calendar_multiday'); + $base = array( + 'file' => 'theme.inc', + 'path' => "$path/theme", + ); + return array( + 'calendar_day_node' => $base + array( + 'template' => 'calendar-day-node', + 'arguments' => array('node' => NULL, 'view' => NULL), + ), + 'calendar_month_node' => $base + array( + 'template' => 'calendar-month-node', + 'arguments' => array('node' => NULL, 'view' => NULL), + ), + 'calendar_week_node' => $base + array( + 'template' => 'calendar-week-node', + 'arguments' => array('node' => NULL, 'view' => NULL), + ), + 'calendar_month_multiple_node' => $base + array( + 'template' => 'calendar-month-multiple-node', + 'arguments' => array('curday' => NULL, 'count' => NULL, 'view' => NULL, 'types' => NULL), + ), + 'calendar_week_multiple_node' => $base + array( + 'template' => 'calendar-week-multiple-node', + 'arguments' => array('curday' => NULL, 'count' => NULL, 'view' => NULL, 'types' => NULL), + ), + 'calendar_datebox' => $base + array( + 'template' => 'calendar-datebox', + 'arguments' => array( + 'date' => NULL, 'view' => NULL, 'items' => NULL, 'selected' => NULL), + ), + 'calendar_date_combo' => $base + array( + 'arguments' => array('node', 'lable', 'view'), + ), + 'calendar_empty_day' => $base + array( + 'arguments' => array('curday', 'view'), + ), + 'calendar_stripe_legend' => $base + array( + 'arguments' => array('stripe_labels'), + ), + 'calendar_stripe_stripe' => $base + array( + 'arguments' => array('node'), + ), + 'calendar_colorpicker' => $base + array( + 'arguments' => array('element'), + ), + 'calendar_colorfield' => $base + array( + 'arguments' => array('element'), + ), + 'calendar_time_row_heading' => $base + array( + 'arguments' => array('start_time', 'next_start_time', 'curday_date'), + ), + 'calendar_month_col' => $base + array( + 'template' => 'calendar-month-col', + 'arguments' => array('item' => NULL), + ), + 'calendar_month_row' => $base + array( + 'template' => 'calendar-month-row', + 'arguments' => array('inner' => NULL, 'class' => NULL, 'iehint' => NULL), + ), + ); +} \ No newline at end of file diff --git a/sites/all/modules/calendar/calendar_multiday/calendar_overlap.js b/sites/all/modules/calendar/calendar_multiday/calendar_overlap.js new file mode 100644 index 0000000..2f8c4c7 --- /dev/null +++ b/sites/all/modules/calendar/calendar_multiday/calendar_overlap.js @@ -0,0 +1,87 @@ +// $Id: calendar_overlap.js,v 1.1.2.1 2010/11/28 23:31:28 karens Exp $ +/* + * Create the splitter, set the viewport size, and set the position of the scrollbar to the first item. + */ +Drupal.behaviors.calendarSetScroll = function (context) { + + // Make multi-day resizable - stolen/borrowed from textarea.js + $('.header-body-divider:not(.header-body-divider-processed)').each(function() { + var divider = $(this).addClass('header-body-divider-processed'); + var start_y = divider.offset().top; + + // Add the grippie icon + $(this).prepend('
').mousedown(startDrag); + + function startDrag(e) { + start_y = divider.offset().top; + $(document).mousemove(performDrag).mouseup(endDrag); + return false; + } + + function performDrag(e) { + var offset = e.pageY - start_y; + var mwc = $('#multi-day-container'); + var sdc = $('#single-day-container'); + var mwc_height = mwc.height(); + var sdc_height = sdc.height(); + var max_height = mwc_height + sdc_height; + mwc.height(Math.min(max_height,Math.max(0,mwc_height + offset))); + sdc.height(Math.min(max_height,Math.max(0,sdc_height - offset))); + start_y = divider.offset().top; + return false; + } + + function endDrag(e) { + $(document).unbind("mousemove", performDrag).unbind("mouseup", endDrag); + } + }); + + $('.single-day-footer:not(.single-day-footer-processed)').each(function() { + var divider = $(this).addClass('single-day-footer-processed'); + var start_y = divider.offset().top; + + // Add the grippie icon + $(this).prepend('
').mousedown(startDrag); + + function startDrag(e) { + start_y = divider.offset().top; + $(document).mousemove(performDrag).mouseup(endDrag); + return false; + } + + function performDrag(e) { + var offset = e.pageY - start_y; + var sdc = $('#single-day-container'); + sdc.height(Math.max(0,sdc.height() + offset)); + start_y = divider.offset().top; + return false; + } + + function endDrag(e) { + $(document).unbind("mousemove", performDrag).unbind("mouseup", endDrag); + } + }); + + // Size the window + calendar_resizeViewport(); +} + +// Scroll the viewport to the first item +function calendar_scrollToFirst() { + if ($('div.first_item').size() > 0 ) { + var y = $('div.first_item').offset().top - $('#single-day-container').offset().top ; + $('#single-day-container').scrollTop(y); + } +} + +// Size the single day view +function calendar_resizeViewport() { + + // Size of the browser window + var viewportHeight = window.innerHeight ? window.innerHeight : $(window).height(); + var top = $('#single-day-container').offset().top; + + // Give it a 20 pixel margin at the bottom + $('#single-day-container').height(viewportHeight - top - 20); +} + \ No newline at end of file diff --git a/sites/all/modules/calendar/calendar_multiday/includes/calendar.inc b/sites/all/modules/calendar/calendar_multiday/includes/calendar.inc new file mode 100644 index 0000000..85c5eb7 --- /dev/null +++ b/sites/all/modules/calendar/calendar_multiday/includes/calendar.inc @@ -0,0 +1,619 @@ + $item) { + if (empty($item->calendar_start_date) || empty($item->calendar_end_date)) { + continue; + } + $item_start = date_format($item->calendar_start_date, DATE_FORMAT_DATE); + $item_end = date_format($item->calendar_end_date, DATE_FORMAT_DATE); + if (($item_start >= $view->date_info->min_date_date && $item_start <= $view->date_info->max_date_date) + || ($item_end >= $view->date_info->min_date_date && $item_end <= $view->date_info->max_date_date)) { + $values[$item_start][date_format($item->date_start, 'H:i:s')][] = $item; + } + } + $items = $values; + ksort($items); + + $rows = array(); + $curday = drupal_clone($view->date_info->min_date); + + switch ($view->date_info->granularity) { + case 'year': + $rows = array(); + $view->date_info->mini = TRUE; + for ($i = 1; $i <= 12; $i++) { + $rows[$i] = calendar_build_mini_month($curday, $view, $items); + } + $view->date_info->mini = FALSE; + break; + case 'month': + $rows = ($view->date_info->mini) ? calendar_build_mini_month($curday, $view, $items) : calendar_build_month($curday, $view, $items); + break; + case 'day': + $rows = calendar_build_day($curday, $view, $items); + break; + case 'week': + $rows = calendar_build_week($curday, $view, $items); + // Merge the day names in as the first row. + $rows = array_merge(array(calendar_week_header($view)), $rows); + break; + } + return $rows; + +} +/** + * Build one month. + */ +function calendar_build_mini_month(&$curday, $view, $items) { + $month = date_format($curday, 'n'); + date_modify($curday, '-' . strval(date_format($curday, 'j')-1) . ' days'); + $rows = array(); + do { + $rows = array_merge($rows, calendar_build_mini_week($curday, $view, $items, TRUE)); + $curday_date = date_format($curday, DATE_FORMAT_DATE); + $curday_month = date_format($curday, 'n'); + } while ($curday_month == $month && $curday_date <= $view->date_info->max_date_date); + // Merge the day names in as the first row. + $rows = array_merge(array(calendar_week_header($view)), $rows); + return $rows; +} +/** + * Build one month. + */ +function calendar_build_month(&$curday, $view, $items) { + $month = date_format($curday, 'n'); + $curday_date = date_format($curday, DATE_FORMAT_DATE); + $weekdays = calendar_untranslated_days($items, $view); + date_modify($curday, '-' . strval(date_format($curday, 'j')-1) . ' days'); + $rows = array(); + do { + $init_day = clone($curday); + $today = date_format(date_now(date_default_timezone_name()), DATE_FORMAT_DATE); + $month = date_format($curday, 'n'); + $week = date_week($curday_date); + $first_day = variable_get('date_first_day', 0); + $week_rows = calendar_build_week($curday, $view, $items, TRUE); + $multiday_buckets = $week_rows['multiday_buckets']; + $singleday_buckets = $week_rows['singleday_buckets']; + + $total_rows = $week_rows['total_rows']; + + // Theme each row + $output = ""; + $final_day = clone($curday); + + $iehint = 0; + $max_multirow_cnt = 0; + $max_singlerow_cnt = 0; + + for ($i = 0; $i < $total_rows + 1; $i++) { + $inner = ""; + + // If we're displaying the week number, add it as the + // first cell in the week. + if ($i == 0 && !empty($view->date_info->style_with_weekno) && !in_array($view->date_info->granularity, array('day', 'week'))) { + $url = $view->get_path() .'/'. $view->date_info->year .'-W'. $week; + if (!empty($view->date_info->display_types['week'])) { + $weekno = l($week, $url, array('query' => !empty($view->date_info->append) ? $view->date_info->append : '')); + } + else { + // Do not link week numbers, if Week views are disabled. + $weekno = $week; + } + $item = array( + 'entry' => $weekno, + 'colspan' => 1, + 'rowspan' => $total_rows + 1, + 'id' => $view->name . '-weekno-' . $curday_date, + 'class' => 'week' + ); + $inner .= theme('calendar_month_col', $item); + } + + $curday = clone($init_day); + + // move backwards to the first day of the week + $day_wday = date_format($curday, 'w'); + date_modify($curday, '-' . strval((7 + $day_wday - $first_day) % 7) . ' days'); + + for ( $wday = 0; $wday < 7; $wday++) { + + $curday_date = date_format($curday, DATE_FORMAT_DATE); + $class = strtolower($weekdays[$wday]); + $item = NULL; + $in_month = !($curday_date < $view->date_info->min_date_date || $curday_date > $view->date_info->max_date_date || date_format($curday, 'n') != $month); + + // Add the datebox + if ($i == 0) { + $count = $in_month ? intval(count($multiday_buckets[$wday]) + count($singleday_buckets[$wday])) : FALSE; + $item = array( + 'entry' => theme('calendar_datebox', $curday_date, $view, $items, $count), + 'colspan' => 1, + 'rowspan' => 1, + 'class' => 'date-box', + 'date' => $curday_date, + 'id' => $view->name . '-' . $curday_date . '-date-box' + ); + $item['class'] .= ($curday_date == $today && $in_month ? ' today' : '') . + ($curday_date < $today ? ' past' : '') . + ($curday_date > $today ? ' future' : ''); + } + else { + $index = $i - 1; + $multi_count = count($multiday_buckets[$wday]); + + // Process multiday buckets first. If there is a multiday-bucket item in this row... + if ($index < $multi_count) { + + // If this item is filled with either a blank or an entry... + if ($multiday_buckets[$wday][$index]['filled']) { + + // Add item and add class + $item = $multiday_buckets[$wday][$index]; + $item['class'] = 'multi-day'; + $item['date'] = $curday_date; + + // Is this an entry? + if (!$multiday_buckets[$wday][$index]['avail']) { + + // If the item either starts or ends on today, + // then add tags so we can style the borders + if ($curday_date == $today && $in_month) { + $item['class'] .= ' starts-today'; + } + + // Calculate on which day of this week this item ends on.. + $end_day = clone($curday); + $span = $item['colspan'] - 1; + date_modify($end_day, '+' . $span .' day'); + $endday_date = date_format($end_day, DATE_FORMAT_DATE); + + // If it ends today, add class + if ($endday_date == $today && $in_month) { + $item['class'] .= ' ends-today'; + } + } + } + + // If this is an acutal entry, add classes regarding the state of the + // item + if ($multiday_buckets[$wday][$index]['avail']) { + $item['class'] .= ' ' . $wday . ' ' . $index . ' no-entry ' . ($curday_date == $today && $in_month ? ' today' : '') . + ($curday_date < $today ? ' past' : '') . + ($curday_date > $today ? ' future' : ''); + } + + // Else, process the single day bucket - we only do this once per day + } + elseif ($index == $multi_count) { + + $single_day_cnt = 0; + // If it's empty, add class + if (count($singleday_buckets[$wday]) == 0) { + $single_days = " "; + if ($max_multirow_cnt == 0 ) { + $class = ($multi_count > 0 ) ? 'single-day no-entry noentry-multi-day' : 'single-day no-entry'; + } + else { + $class = 'single-day'; + } + } + else { + $single_days = ""; + foreach ($singleday_buckets[$wday] as $day) { + foreach ($day as $event) { + $single_day_cnt++; + $single_days .= (isset($event['more_link'])) ? '
' . $event['entry'] . '
' : $event['entry']; + } + } + $class = 'single-day'; + } + + $rowspan = $total_rows - $index; + + // Add item... + $item = array( + 'entry' => $single_days, + 'colspan' => 1, + 'rowspan' => $rowspan, + 'class' => $class, + 'date' => $curday_date, + 'id' => $view->name . '-' . $curday_date . '-' . $index + ); + + // Hack for ie to help it properly space single day rows + if ($rowspan > 1 && $in_month && $single_day_cnt > 0) { + $max_multirow_cnt = max($max_multirow_cnt, $single_day_cnt); + } + else { + $max_singlerow_cnt = max($max_singlerow_cnt, $single_day_cnt); + } + + // If the singlerow is bigger than the multi-row, then null out + // ieheight - I'm estimating that a single row is twice the size of + // multi-row. This is really the best that can be done with ie + if ($max_singlerow_cnt >= $max_multirow_cnt || $max_multirow_cnt <= $multi_count / 2 ) { + $iehint = 0; + } + elseif ($rowspan > 1 && $in_month && $single_day_cnt > 0) { + $iehint = max($iehint, $rowspan - 1); // How many rows to adjust for? + } + + // Set the class + $item['class'] .= ($curday_date == $today && $in_month ? ' today' : '') . + ($curday_date < $today ? ' past' : '') . + ($curday_date > $today ? ' future' : ''); + } + } + + // If there isn't an item, then add empty class + if ($item != NULL) { + if (!$in_month) { + $item['class'] .= ' empty'; + } + // Style this entry - it will be a . + $inner .= theme('calendar_month_col', $item); + } + + date_modify($curday, '+1 day'); + } + + if ($i == 0) { + $output .= theme('calendar_month_row', $inner, 'date-box', $iehint); + } + elseif ($i == $total_rows) { + $output .= theme('calendar_month_row', $inner, 'single-day', $iehint); + $iehint = 0; + $max_singlerow_cnt = 0; + $max_multirow_cnt = 0; + } + else { + // Style all the columns into a row + $output .= theme('calendar_month_row', $inner, 'multi-day'); + } + } + $curday = $final_day; + + // Add the row into the row array.... + $rows[] = array('data' => $output); + + $curday_date = date_format($curday, DATE_FORMAT_DATE); + $curday_month = date_format($curday, 'n'); + } while ($curday_month == $month && $curday_date <= $view->date_info->max_date_date); + + // Merge the day names in as the first row. + $rows = array_merge(array(calendar_week_header($view)), $rows); + return $rows; +} +/** + * Build one week row. + */ +function calendar_build_mini_week(&$curday, $view, $items, $check_month = FALSE) { + $curday_date = date_format($curday, DATE_FORMAT_DATE); + $weekdays = calendar_untranslated_days($items, $view); + $today = date_format(date_now(date_default_timezone_name()), DATE_FORMAT_DATE); + $month = date_format($curday, 'n'); + $week = date_week($curday_date); + $first_day = variable_get('date_first_day', 0); + // move backwards to the first day of the week + $day_wday = date_format($curday, 'w'); + date_modify($curday, '-' . strval((7 + $day_wday - $first_day) % 7) . ' days'); + $curday_date = date_format($curday, DATE_FORMAT_DATE); + + // If we're displaying the week number, add it as the + // first cell in the week. + if (!empty($view->date_info->style_with_weekno) && !in_array($view->date_info->granularity, array('day', 'week'))) { + $url = date_real_url($view, NULL, $view->date_info->year .'-W'. $week); + if (!empty($view->date_info->display_types['week'])) { + $weekno = l($week, $url, array('query' => !empty($view->date_info->append) ? $view->date_info->append : '')); + } + else { + // Do not link week numbers, if Week views are disabled. + $weekno = $week; + } + $rows[$week][] = array( + 'data' => $weekno, + 'id' => $view->name . '-weekno-' . $curday_date, + 'class' => 'week'); + } + for ($i = 0; $i < 7; $i++) { + $curday_date = date_format($curday, DATE_FORMAT_DATE); + $class = strtolower($weekdays[$i] . ' mini'); + if ($check_month && ($curday_date < $view->date_info->min_date_date || $curday_date > $view->date_info->max_date_date || date_format($curday, 'n') != $month)) { + $class .= ' empty'; + $content = array( + 'date' => '', + 'datebox' => '', + 'empty' => theme('calendar_empty_day', $curday_date, $view), + 'link' => '', + 'all_day' => array(), + 'items' => array(), + ); + } + else { + $content = calendar_build_day($curday, $view, $items); + $class .= ($curday_date == $today ? ' today' : '') . + ($curday_date < $today ? ' past' : '') . + ($curday_date > $today ? ' future' : '') . + (empty($items[$curday_date]) ? ' has-no-events' : ' has-events'); + } + + $rows[$week][] = array( + 'data' => $content, + 'class' => $class, 'id' => $view->name . '-' . $curday_date); + date_modify($curday, '+1 day'); + } + return $rows; +} +/** + * Build one week row. + */ +function calendar_build_week(&$curday, $view, $items, $check_month = FALSE) { + $curday_date = date_format($curday, DATE_FORMAT_DATE); + $weekdays = calendar_untranslated_days($items, $view); + $month = date_format($curday, 'n'); + $first_day = variable_get('date_first_day', 0); + + // Set up buckets + $total_rows = 0; + $multiday_buckets = array( array(), array(), array(), array(), array(), array(), array()); + $singleday_buckets = array( array(), array(), array(), array(), array(), array(), array()); + + // move backwards to the first day of the week + $day_wday = date_format($curday, 'w'); + date_modify($curday, '-' . strval((7 + $day_wday - $first_day) % 7) . ' days'); + $curday_date = date_format($curday, DATE_FORMAT_DATE); + + for ($i = 0; $i < 7; $i++) { + if ($check_month && ($curday_date < $view->date_info->min_date_date || $curday_date > $view->date_info->max_date_date || date_format($curday, 'n') != $month)) { + $class = strtolower($weekdays[$i]) .' empty'; + $singleday_buckets[$i][][] = array( + 'entry' => theme('calendar_empty_day', $curday_date, $view), + 'item' => NULL + ); + } + else { + calendar_build_week_day($curday, $view, $items, $i, $multiday_buckets, $singleday_buckets); + } + $total_rows = max(count($multiday_buckets[$i]) + 1, $total_rows); + date_modify($curday, '+1 day'); + $curday_date = date_format($curday, DATE_FORMAT_DATE); + } + + $rows = array( + 'multiday_buckets' => $multiday_buckets, + 'singleday_buckets' => $singleday_buckets, + 'total_rows' => $total_rows); + return $rows; +} +/** + * Build the contents of a single day for the $rows results. + */ +function calendar_build_week_day($curday, $view, $items, $wday, &$multiday_buckets, &$singleday_buckets) { + $curday_date = date_format($curday, DATE_FORMAT_DATE); + $max_events = !empty($view->date_info->style_max_items) ? $view->date_info->style_max_items : 0; + $hide = !empty($view->date_info->style_max_items_behavior) ? ($view->date_info->style_max_items_behavior == 'hide') : FALSE; + $multiday_theme = ($view->date_info->style_multiday_theme == '1'); + $cur_cnt = 0; + $total_cnt = 0; + $types = array(); + + // If we are hiding, count before processing further + if ($max_events != CALENDAR_SHOW_ALL) { + foreach ($items as $date => $day) { + if ($date == $curday_date) { + foreach ($day as $time => $hour) { + foreach ($hour as $key => $item) { + $total_cnt++; + $types[$item->type] = $item; + } + } + } + } + } + + // If we haven't already exceeded the max or we'll showing all, then process the items + if ($max_events == CALENDAR_SHOW_ALL || !$hide || $total_cnt <= $max_events) { + // Count currently filled items + foreach ($multiday_buckets[$wday] as $bucket) { + if (!$bucket['avail']) { + $cur_cnt++; + } + } + + foreach ($items as $date => $day) { + if ($date == $curday_date) { + $count = 0; + ksort($day); + foreach ($day as $time => $hour) { + foreach ($hour as $key => $item) { + $count++; + + // Can we add an item? + if ($max_events == CALENDAR_SHOW_ALL || $cur_cnt <= $max_events) { + $all_day = $item->calendar_start_date == $item->calendar_end_date; + $theme = isset($item->calendar_node_theme) ? $item->calendar_node_theme : 'calendar_'. $view->date_info->granularity .'_node'; + + // Parse out date part + $start_ydate = date_format($item->date_start, DATE_FORMAT_DATE); + $end_ydate = date_format($item->date_end, DATE_FORMAT_DATE); + $cur_ydate = date_format($curday, DATE_FORMAT_DATE); + + $is_multi_day = ($start_ydate < $cur_ydate || $end_ydate > $cur_ydate); + + // Does this event span multi-days? + if ($multiday_theme && ($is_multi_day || $all_day)) { + + // If this the first day of the week, or is the start date of the multi-day event, + // then record this item, otherwise skip over + $day_no = date_format($curday, 'd'); + if ($wday == 0 || $start_ydate == $cur_ydate || ($view->date_info->granularity == 'month' && $day_no == 1) || ($all_day && !$is_multi_day)) { + $cur_cnt++; + + // Calculate the colspan for this event + + // If the last day of this event exceeds the end of the current month or week, + // truncate the remaining days + $diff = date_difference($view->date_info->max_date, $curday, 'days'); + $remaining_days = ($view->date_info->granularity == 'month') ? min(6 - $wday, $diff) : $diff - 1; + // The bucket_cnt defines the colspan. colspan = bucket_cnt + 1 + $days = date_difference($curday, $item->date_end, 'days'); + $bucket_cnt = max(0, min($days, $remaining_days)); + + // See if there is an avaiable slot to add an event. This will allow + // an event to precede a row filled up by a previous day event + $avail = FALSE; + $bucket_index = count($multiday_buckets[$wday]); + for ($i = 0; $i < $bucket_index; $i++) { + if ($multiday_buckets[$wday][$i]['avail']) { + $bucket_index = $i; + break; + } + } + + // Add continuation attributes + $item->continuation = ($item->date_start < $curday); + $item->continues = ( $days > $bucket_cnt ); + + // Assign the item to the available bucket + $multiday_buckets[$wday][$bucket_index] = array( + 'colspan' => $bucket_cnt + 1, + 'rowspan' => 1, + 'filled' => TRUE, + 'avail' => FALSE, + 'all_day' => $all_day, + 'item' => $item, + 'wday' => $wday, + 'entry' => theme($theme, $item, $view) + ); + + // Block out empty buckets for the next days in this event for this week + for ($i = 0; $i < $bucket_cnt; $i++) { + $bucket = &$multiday_buckets[$i + $wday + 1]; + $bucket_row_count = count($bucket); + $row_diff = $bucket_index - $bucket_row_count; + + // Fill up the preceding buckets - these are available for future + // events + for ( $j = 0; $j < $row_diff; $j++) { + $bucket[($bucket_row_count + $j) ] = array( + 'entry' => ' ', + 'colspan' => 1, + 'rowspan' => 1, + 'filled' => TRUE, + 'avail' => TRUE, + 'wday' => $wday, + 'item' => NULL + ); + } + $bucket[$bucket_index] = array( + 'filled' => FALSE, + 'avail' => FALSE + ); + } + } + } + else { + $cur_cnt++; + // Assign to single day bucket + $singleday_buckets[$wday][$time][] = array( + 'entry' => theme($theme, $item, $view), + 'item' => $item, + 'colspan' => 1, + 'rowspan' => 1, + 'filled' => TRUE, + 'avail' => FALSE, + 'wday' => $wday, + ); + } + } + else { + break; // exceeded count + } + } + } + } + } + } + + // Add a more link if necessary + if ($max_events != CALENDAR_SHOW_ALL && $total_cnt > 0 && $cur_cnt < $total_cnt) { + $singleday_buckets[$wday][][] = array( + 'entry' => theme('calendar_'. $view->date_info->calendar_type .'_multiple_node', $curday_date, $total_cnt, $view, $types), + 'more_link' => TRUE, + 'item' => NULL + ); + } +} +/** + * Build the contents of a single day for the $rows results. + */ +function calendar_build_day($curday, $view, $items) { + $curday_date = date_format($curday, DATE_FORMAT_DATE); + $selected = FALSE; + $max_events = !empty($view->date_info->style_max_items) ? $view->date_info->style_max_items : 0; + $types = array(); + $inner = array(); + $all_day = array(); + $empty = ''; + $link = ''; + $count = 0; + foreach ($items as $date => $day) { + if ($date == $curday_date) { + $count = 0; + $selected = TRUE; + ksort($day); + foreach ($day as $time => $hour) { + foreach ($hour as $key => $item) { + $count++; + $types[$item->type] = $item; + if (!$view->date_info->mini && ($max_events == CALENDAR_SHOW_ALL || $count <= $max_events || ($count > 0 && $max_events == CALENDAR_HIDE_ALL))) { + // Theme the item here unless this is a 'Day' or 'Week' view. + // Day and week views need to do more processing before rendering + // the item, so just past them the unrendered item. + $theme = isset($item->calendar_node_theme) ? $item->calendar_node_theme : 'calendar_'. $view->date_info->granularity .'_node'; + if ($item->calendar_all_day) { + $all_day[] = in_array($view->date_info->calendar_type, array('day', 'week')) ? $item : theme($theme, $item, $view); + } + else { + $key = date_format($item->date_start, 'H:i:s'); + $inner[$key][] = in_array($view->date_info->calendar_type, array('day', 'week')) ? $item : theme($theme, $item, $view); + } + } + } + } + } + } + ksort($inner); + if (empty($inner) && empty($all_day)) { + $empty = theme('calendar_empty_day', $curday_date, $view); + } + // We have hidden events on this day, use the theme('calendar_multiple_') to show a link. + if ($max_events != CALENDAR_SHOW_ALL && $count > 0 && $count > $max_events && $view->date_info->calendar_type != 'day' && !$view->date_info->mini) { + if ($view->date_info->style_max_items_behavior == 'hide' || $max_events == CALENDAR_HIDE_ALL) { + $all_day = array(); + $inner = array(); + } + $link = theme('calendar_'. $view->date_info->calendar_type .'_multiple_node', $curday_date, $count, $view, $types); + } + + $content = array( + 'date' => $curday_date, + 'datebox' => theme('calendar_datebox', $curday_date, $view, $items, $selected), + 'empty' => $empty, + 'link' => $link, + 'all_day' => $all_day, + 'items' => $inner, + ); + return $content; +} diff --git a/sites/all/modules/calendar/calendar_multiday/theme/calendar-datebox.tpl.php b/sites/all/modules/calendar/calendar_multiday/theme/calendar-datebox.tpl.php new file mode 100644 index 0000000..cad4840 --- /dev/null +++ b/sites/all/modules/calendar/calendar_multiday/theme/calendar-datebox.tpl.php @@ -0,0 +1,19 @@ + +
\ No newline at end of file diff --git a/sites/all/modules/calendar/calendar_multiday/theme/calendar-day-node.tpl.php b/sites/all/modules/calendar/calendar_multiday/theme/calendar-day-node.tpl.php new file mode 100644 index 0000000..9fba39c --- /dev/null +++ b/sites/all/modules/calendar/calendar_multiday/theme/calendar-day-node.tpl.php @@ -0,0 +1,58 @@ +nid + * that you can use to load the full object, and + * $node->type to tell the content type of the node. + * + * $fields + * An array of information for every field selected in the 'Fields' + * section of this view, formatted as requested in the View setup. + * + * Calendar info for this individual calendar item is in local time -- + * the user timezone where configurable timezones are allowed and set, + * otherwise the site timezone. If this item has extends over more than + * one day, it has been broken apart into separate nodes for each calendar + * date and calendar_start will be no earlier than the start of + * the current day and calendar_end will be no later than the end + * of the current day. + * + * $calendar_start - A formatted datetime start date for this item. + * i.e. '2008-05-12 05:26:15'. + * $calendar_end - A formatted datetime end date for this item, + * the same as the start date except for fields that have from/to + * fields defined, like Date module dates. + * $calendar_start_date - a PHP date object for the start time. + * $calendar_end_date - a PHP date object for the end time. + * + * You can use PHP date functions on the date object to display date + * information in other ways, like: + * + * print date_format($calendar_start_date, 'l, j F Y - g:ia'); + * + * @see template_preprocess_calendar_day_node. + */ +$node_class = (isset($node->class)) ? ' ' . $node->class : ''; +?> +
+
+
+ +
+ +
+ +
+ + +
+ +
+
+
+
\ No newline at end of file diff --git a/sites/all/modules/calendar/calendar_multiday/theme/calendar-day-overlap.tpl.php b/sites/all/modules/calendar/calendar_multiday/theme/calendar-day-overlap.tpl.php new file mode 100644 index 0000000..62965c9 --- /dev/null +++ b/sites/all/modules/calendar/calendar_multiday/theme/calendar-day-overlap.tpl.php @@ -0,0 +1,135 @@ + + * based on the number of columns presented. The values passed in will + * work to set the 'hour' column to 10% and split the remaining columns + * evenly over the remaining 90% of the table. + */ +//dsm('Display: '. $display_type .': '. $min_date_formatted .' to '. $max_date_formatted); +?> +
+
+ + + + + + + + + + + +
+ + + +
+
+ +
+
+ +
+
+
 
+
+ + + + + + + + + + + + +
+ + $hour): ?> + +
+ + +
+ +
+ $hour): ?> + +
+
 
+ +
+ + +
+ +
+ +
+
+
+ +
+
+ +
+ \ No newline at end of file diff --git a/sites/all/modules/calendar/calendar_multiday/theme/calendar-day.tpl.php b/sites/all/modules/calendar/calendar_multiday/theme/calendar-day.tpl.php new file mode 100644 index 0000000..25d0df9 --- /dev/null +++ b/sites/all/modules/calendar/calendar_multiday/theme/calendar-day.tpl.php @@ -0,0 +1,81 @@ + + * based on the number of columns presented. The values passed in will + * work to set the 'hour' column to 10% and split the remaining columns + * evenly over the remaining 90% of the table. + */ +//dsm('Display: '. $display_type .': '. $min_date_formatted .' to '. $max_date_formatted); +?> +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
0 ? t('Time') : ''; ?>
+ 0 ? date_t('All day', 'datetime') : ''; ?> + +
+
+ +
+
+
+ + + +
+
+ +
+
+
+
\ No newline at end of file diff --git a/sites/all/modules/calendar/calendar_multiday/theme/calendar-main.tpl.php b/sites/all/modules/calendar/calendar_multiday/theme/calendar-main.tpl.php new file mode 100644 index 0000000..1382da4 --- /dev/null +++ b/sites/all/modules/calendar/calendar_multiday/theme/calendar-main.tpl.php @@ -0,0 +1,26 @@ + + +
+ + + + +
\ No newline at end of file diff --git a/sites/all/modules/calendar/calendar_multiday/theme/calendar-mini.tpl.php b/sites/all/modules/calendar/calendar_multiday/theme/calendar-mini.tpl.php new file mode 100644 index 0000000..3a4ab5f --- /dev/null +++ b/sites/all/modules/calendar/calendar_multiday/theme/calendar-mini.tpl.php @@ -0,0 +1,47 @@ + +
+date_info->show_title): ?> + + + + + + + + + + + + + + + + + + + +
+ +
+ +
+
\ No newline at end of file diff --git a/sites/all/modules/calendar/calendar_multiday/theme/calendar-month-col.tpl.php b/sites/all/modules/calendar/calendar_multiday/theme/calendar-month-col.tpl.php new file mode 100644 index 0000000..5124e09 --- /dev/null +++ b/sites/all/modules/calendar/calendar_multiday/theme/calendar-month-col.tpl.php @@ -0,0 +1,16 @@ + +class="" colspan="" rowspan=""> +
+ +
+ diff --git a/sites/all/modules/calendar/calendar_multiday/theme/calendar-month-multiple-node.tpl.php b/sites/all/modules/calendar/calendar_multiday/theme/calendar-month-multiple-node.tpl.php new file mode 100644 index 0000000..bd745b1 --- /dev/null +++ b/sites/all/modules/calendar/calendar_multiday/theme/calendar-month-multiple-node.tpl.php @@ -0,0 +1,28 @@ + +
+
+ + date_info->style_max_items_behavior != 'more'): ?> + + + +
+ date_info->style_max_items_behavior != 'more'): ?> +
+ $count)), $link) ?> +
+
+ +
»
+ +
+
diff --git a/sites/all/modules/calendar/calendar_multiday/theme/calendar-month-node.tpl.php b/sites/all/modules/calendar/calendar_multiday/theme/calendar-month-node.tpl.php new file mode 100644 index 0000000..18a381f --- /dev/null +++ b/sites/all/modules/calendar/calendar_multiday/theme/calendar-month-node.tpl.php @@ -0,0 +1,64 @@ +nid + * that you can use to load the full object, and + * $node->type to tell the content type of the node. + * + * $fields + * An array of information for every field selected in the 'Fields' + * section of this view, formatted as requested in the View setup. + * + * Calendar info for this individual calendar item is in local time -- + * the user timezone where configurable timezones are allowed and set, + * otherwise the site timezone. If this item has extends over more than + * one day, it has been broken apart into separate nodes for each calendar + * date and calendar_start will be no earlier than the start of + * the current day and calendar_end will be no later than the end + * of the current day. + * + * $calendar_start - A formatted datetime start date for this item. + * i.e. '2008-05-12 05:26:15'. + * $calendar_end - A formatted datetime end date for this item, + * the same as the start date except for fields that have from/to + * fields defined, like Date module dates. + * $calendar_start_date - a PHP date object for the start time. + * $calendar_end_date - a PHP date object for the end time. + * + * You can use PHP date functions on the date object to display date + * information in other ways, like: + * + * print date_format($calendar_start_date, 'l, j F Y - g:ia'); + * + * @see template_preprocess_calendar_month_node. + */ +$index = 0; +?> +
+
+ +
+ + continuation) && $node->continuation)) : ?> +
«
+ +
+ +
+ + +
+ +
+ continues) && $node->continues) : ?> +
»
+ +
 
+ +
+
diff --git a/sites/all/modules/calendar/calendar_multiday/theme/calendar-month-row.tpl.php b/sites/all/modules/calendar/calendar_multiday/theme/calendar-month-row.tpl.php new file mode 100644 index 0000000..e52e1b2 --- /dev/null +++ b/sites/all/modules/calendar/calendar_multiday/theme/calendar-month-row.tpl.php @@ -0,0 +1,18 @@ + 0) ? ' iehint="' . $iehint . '"' : ''; +?> + +> + + + + + diff --git a/sites/all/modules/calendar/calendar_multiday/theme/calendar-month.tpl.php b/sites/all/modules/calendar/calendar_multiday/theme/calendar-month.tpl.php new file mode 100644 index 0000000..58711f4 --- /dev/null +++ b/sites/all/modules/calendar/calendar_multiday/theme/calendar-month.tpl.php @@ -0,0 +1,57 @@ + +
+ + + + + + + + + + + +
+ +
+
+ \ No newline at end of file diff --git a/sites/all/modules/calendar/calendar_multiday/theme/calendar-week-multiple-node.tpl.php b/sites/all/modules/calendar/calendar_multiday/theme/calendar-week-multiple-node.tpl.php new file mode 100644 index 0000000..e1f78bf --- /dev/null +++ b/sites/all/modules/calendar/calendar_multiday/theme/calendar-week-multiple-node.tpl.php @@ -0,0 +1,27 @@ + +
+
+ + date_info->style_max_items_behavior != 'more'): ?> + + + +
+ date_info->style_max_items_behavior != 'more'): ?> +
+ $count)), $link) ?> +
+
+ +
»
+ +
+
diff --git a/sites/all/modules/calendar/calendar_multiday/theme/calendar-week-node.tpl.php b/sites/all/modules/calendar/calendar_multiday/theme/calendar-week-node.tpl.php new file mode 100644 index 0000000..b8923bb --- /dev/null +++ b/sites/all/modules/calendar/calendar_multiday/theme/calendar-week-node.tpl.php @@ -0,0 +1,64 @@ +nid + * that you can use to load the full object, and + * $node->type to tell the content type of the node. + * + * $fields + * An array of information for every field selected in the 'Fields' + * section of this view, formatted as requested in the View setup. + * + * Calendar info for this individual calendar item is in local time -- + * the user timezone where configurable timezones are allowed and set, + * otherwise the site timezone. If this item has extends over more than + * one day, it has been broken apart into separate nodes for each calendar + * date and calendar_start will be no earlier than the start of + * the current day and calendar_end will be no later than the end + * of the current day. + * + * $calendar_start - A formatted datetime start date for this item. + * i.e. '2008-05-12 05:26:15'. + * $calendar_end - A formatted datetime end date for this item, + * the same as the start date except for fields that have from/to + * fields defined, like Date module dates. + * $calendar_start_date - a PHP date object for the start time. + * $calendar_end_date - a PHP date object for the end time. + * + * You can use PHP date functions on the date object to display date + * information in other ways, like: + * + * print date_format($calendar_start_date, 'l, j F Y - g:ia'); + * + * @see template_preprocess_calendar_week_node. + */ +$index = 0; +?> +
+
+ +
+ + continuation) && $node->continuation)) : ?> +
«
+ +
+ +
+ + +
+ +
+ continues) && $node->continues) : ?> +
»
+ +
 
+ +
+
diff --git a/sites/all/modules/calendar/calendar_multiday/theme/calendar-week-overlap.tpl.php b/sites/all/modules/calendar/calendar_multiday/theme/calendar-week-overlap.tpl.php new file mode 100644 index 0000000..153cea2 --- /dev/null +++ b/sites/all/modules/calendar/calendar_multiday/theme/calendar-week-overlap.tpl.php @@ -0,0 +1,188 @@ + + +
+
+ + + + + + + + + + +
  + +
+
+
+ + + + + + + 0 || !empty($start_times))) :?> + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
 
+
+ +
+
 
+ +
 
+   +
 
+
+
 
+
+ + + + + + + + + + + +
+ + + + + + $start_time): ?> + + + +
+ + +
+ +
+
 
+
+
+ + + +
+ +
+ + +
+ + +
+
+
+ + +
+
+ +
+ \ No newline at end of file diff --git a/sites/all/modules/calendar/calendar_multiday/theme/calendar-week.tpl.php b/sites/all/modules/calendar/calendar_multiday/theme/calendar-week.tpl.php new file mode 100644 index 0000000..dc1b3ea --- /dev/null +++ b/sites/all/modules/calendar/calendar_multiday/theme/calendar-week.tpl.php @@ -0,0 +1,124 @@ + + +
+ + + + 0 || !empty($start_times)) :?> + + + + + + + + + + + + 0 || !empty($start_times))) :?> + + + + + + + + + + + + + + + + + + + + + + $column): ?> + + + + + + + + + + + + + +
+ +
+ +
 
+
+ +
+
 
+ + + +
+
 
+
+
+
+
+ + + + + +
+
+
+
+
 
+
+
+
\ No newline at end of file diff --git a/sites/all/modules/calendar/calendar_multiday/theme/calendar-year.tpl.php b/sites/all/modules/calendar/calendar_multiday/theme/calendar-year.tpl.php new file mode 100644 index 0000000..2e62bea --- /dev/null +++ b/sites/all/modules/calendar/calendar_multiday/theme/calendar-year.tpl.php @@ -0,0 +1,27 @@ + + +
+ class="mini"> + + + + + + +
+
\ No newline at end of file diff --git a/sites/all/modules/calendar/calendar_multiday/theme/theme.inc b/sites/all/modules/calendar/calendar_multiday/theme/theme.inc new file mode 100644 index 0000000..b776d9f --- /dev/null +++ b/sites/all/modules/calendar/calendar_multiday/theme/theme.inc @@ -0,0 +1,972 @@ +result; + $options = $view->style_plugin->options; + $handler = $view->style_plugin; + + $vars['display_type'] = $view->date_info->granularity; + $vars['min_date_formatted'] = date_format($view->date_info->min_date, DATE_FORMAT_DATETIME); + $vars['max_date_formatted'] = date_format($view->date_info->max_date, DATE_FORMAT_DATETIME); + $view->date_info->mini = isset($view->date_info->mini) ? $view->date_info->mini : $view->date_info->granularity == 'year'; + + $url = $view->get_url(); + $view->date_info->url = $url; + $arg = $view->date_info->date_arg; + $displays = $view->date_info->display_types; + + // Set up the links to other calendar views. + $current_date = $view->date_info->min_date; + if (!empty($date->info->day)) { + $current_date = date_make_date($date_info->date_arg .' 00:00:00'); + } + elseif (!empty($view->date_info->week)) { + $week = date_week_range($view->date_info->week, $view->date_info->year); + $current_date = $week[0]; + } + elseif (!empty($view->date_info->month)) { + $current_date = date_make_date($view->date_info->year .'-'. date_pad($view->date_info->month) .'-01 00:00:00'); + } + else { + $current_date = date_make_date($view->date_info->year .'-01-01 00:00:00'); + } + if (empty($view->date_info->month) || $view->date_info->month == $view->argument['date_argument']->options['wildcard']) { + $view->date_info->month = date_format($current_date, 'm'); + } + if (empty($view->date_info->day) || $view->date_info->day == $view->argument['date_argument']->options['wildcard']) { + $view->date_info->day = date_format($current_date, 'd'); + } + if (empty($view->date_info->week) || $view->date_info->week == $view->argument['date_argument']->options['wildcard']) { + $view->date_info->week = date_week($view->date_info->year .'-'. date_pad($view->date_info->month) .'-'. date_pad($view->date_info->day)); + } + + $calendar_links = array(); + $base = array('attributes' => array('rel' => 'nofollow')); + if (!empty($displays['year'])) { + $calendar_links[] = $base + array('title' => date_t('Year', 'datetime'), 'href' => date_real_url($view, 'year')); + } + if (!empty($displays['month'])) { + $calendar_links[] = $base + array('title' => date_t('Month', 'datetime'), 'href' => date_real_url($view, 'month')); + } + if (!empty($displays['week'])) { + $calendar_links[] = $base + array('title' => date_t('Week', 'datetime'), 'href' => date_real_url($view, 'week')); + } + if (!empty($displays['day'])) { + $calendar_links[] = $base + array('title' => date_t('Day', 'datetime'), 'href' => date_real_url($view, 'day')); + } + $vars['calendar_links'] = $calendar_links; + + // If the Date Popup module is enabled, add a popup date selector. + if (!empty($view->date_info->calendar_popup)) { + $vars['calendar_popup'] = '
'. calendar_date_select($view) .'
'; + } + + // If an 'Add new ... link is provided, add it here. + // the query will bring the user back here after adding the node. + if (!empty($view->date_info->calendar_date_link) && user_access('create '. $view->date_info->calendar_date_link .' content')) { + $name = node_get_types('name', $view->date_info->calendar_date_link); + $href = 'node/add/'. str_replace('_', '-', $view->date_info->calendar_date_link); + $query = 'destination='. $view->date_info->url; + $vars['calendar_links'][] = $base + array( + 'title' => t('Add+'), + 'href' => $href, + 'query' => $query, + ); + } + + $vars['view'] = $view; + $vars['mini'] = !empty($view->date_info->mini); + $vars['block'] = !empty($view->date_info->block); + $vars['block_identifier'] = date_block_identifier($view); + +} + +/** + * Display a view as a calendar. + * + * This preprocessor does all the work needed for all types of calendar + * views and the template takes care of displaying links to related views. + */ +function template_preprocess_calendar(&$vars) { + require_once('./'. drupal_get_path('module', 'calendar_multiday') .'/includes/calendar.inc'); + $view = $vars['view']; + + // Make sure we only run through this function one time. + if (!empty($view->date_info->calendar_processed)) { + return; + } + + $result = (array) $view->result; + $options = $view->style_plugin->options; + $handler = $view->style_plugin; + + $fields = $view->field; + + // Render each field into an output array. We have to do the rendering + // here because we don't apppear to have full access to the view + // handlers in the theme functions. + $items = array(); + $calendar_fields = date_api_fields($view->base_table); + $calendar_fields = array_keys($calendar_fields['alias']); + + foreach ($result as $num => $row) { + $copy = drupal_clone($row); + $items[$num] = $row; + $items[$num]->raw = $copy; + $items[$num]->calendar_fields = new stdClass(); + + foreach ($row as $key => $value) { + if (in_array($key, $calendar_fields)) { + $items[$num]->calendar_fields->$key = $value; + } + } + foreach ($fields as $name => $field) { + // Some fields, like the node edit and delete links, have no alias. + $field_alias = $field->field_alias != 'unknown' ? $field->field_alias : $name; + if (!empty($field) && is_object($field)) { + // Theme the copy instead of the original row so duplicate date + // fields each get a fresh copy of the original data to theme. + $items[$num]->{$field_alias} = $field->theme($copy); + } + } + foreach ($fields as $name => $field) { + // Some fields, like the node edit and delete links, have no alias. + $field_alias = $field->field_alias != 'unknown' ? $field->field_alias : $name; + if (!empty($field->options['exclude'])) { + if (isset($items[$num]->{$field_alias})) unset($items[$num]->{$field_alias}); + } + } + } + + $vars['display_type'] = $view->date_info->granularity; + $vars['min_date_formatted'] = date_format($view->date_info->min_date, DATE_FORMAT_DATETIME); + $vars['max_date_formatted'] = date_format($view->date_info->max_date, DATE_FORMAT_DATETIME); + + // Massage the resulting items into formatted calendar items. + $items = calendar_build_nodes($view, $items); + + // Merge in items from other sources. + foreach (module_implements('calendar_add_items') as $module) { + $function = $module .'_calendar_add_items'; + if (function_exists($function)) { + if ($feeds = $function($view)) { + foreach ($feeds as $feed) { + $items = $feed; + } + } + } + } + + $view->date_info->mini = isset($view->date_info->mini) ? $view->date_info->mini : $view->date_info->granularity == 'year'; + + // Create the calendar day names and rows. + $rows = calendar_build_calendar($view, $items); + + $vars['items'] = $items; + $vars['rows'] = $rows; + $view->date_info->calendar_processed = TRUE; + $vars['view'] = $view; + $vars['mini'] = !empty($view->date_info->mini); + $vars['block'] = !empty($view->date_info->block); +} + +/** + * Display a month view. + */ +function template_preprocess_calendar_month(&$vars) { + // Add in all the $vars added by the main calendar preprocessor. + template_preprocess_calendar($vars); + $view = $vars['view']; + + $rows = $vars['rows']; + + if (sizeof($rows) > 1) { + $day_names = array_shift($rows); + } + else { + $day_names = $rows; + $rows = array(); + } + + $month_rows = $rows; + foreach ($rows as $weekno => $row) { + foreach ($row as $day => $data) { + $cell = $data['data']; + + // If this cell is already rendered, like the weekno column, + // move to the next item. + if (!is_array($cell)) { + $month_rows[$weekno][$day]['data'] = $cell; + continue; + } + $data = $cell['datebox']; + if ($cell['empty']) { + $data .= $cell['empty']; + } + else { + $data .= implode($cell['all_day']); + foreach ($cell['items'] as $hour => $item) { + $data .= implode($item); + } + $data .= $cell['link']; + } + if ($view->date_info->mini) { + $month_rows[$weekno][$day]['data'] = $data; + } + else { + $month_rows[$weekno][$day]['data'] = '
'. $data .'
'; + } + } + } + + $vars['rows'] = $month_rows; + $vars['day_names'] = $day_names; + + $vars['display_type'] = $view->date_info->granularity; + $vars['min_date_formatted'] = date_format($view->date_info->min_date, DATE_FORMAT_DATETIME); + $vars['max_date_formatted'] = date_format($view->date_info->max_date, DATE_FORMAT_DATETIME); +} + +/** + * Display a mini month view. + */ +function template_preprocess_calendar_mini(&$vars) { + // Add in all the $vars added by the main calendar preprocessor. + template_preprocess_calendar_month($vars); + + $view = $vars['view']; + $view->date_info->show_title = !empty($view->date_info->show_title) ? $view->date_info->show_title : FALSE; + $vars['show_title'] = $view->date_info->show_title; + $vars['view'] = $view; +} + +/** + * Display a year view. + */ +function template_preprocess_calendar_year(&$vars) { + // Add in all the $vars added by the main calendar preprocessor. + $vars['view']->date_info->style_with_weekno = FALSE; + template_preprocess_calendar($vars); + + // Get the url of the year view and remove the year argument from it. + // TODO clean this up in case there is another arg that looks like + // the year to make sure only the year gets removed. + $view = $vars['view']; + $year = date_format($view->date_info->min_date, 'Y'); + + // Construct a calendar for each month, adjusting the $view passed + // to the theme so it will produce the right results. + $view = drupal_clone($vars['view']); + $rows = $vars['rows']; + $months = array(); + foreach ($rows as $month => $month_rows) { + $view->date_info->month = $month; + $view->date_info->granularity = 'month'; + $view->date_info->mini = TRUE; + $view->date_info->hide_nav = TRUE; + $view->date_info->show_title = TRUE; + $view->date_info->url = date_real_url($view, NULL, date_pad($year, 4) .'-'. date_pad($month)); + $view->date_info->min_date = date_make_date($view->date_info->year .'-'. date_pad($month) .'-01 00:00:00', date_default_timezone_name()); + $view->date_info->max_date = drupal_clone($view->date_info->min_date); + date_modify($view->date_info->max_date, '+1 month'); + date_modify($view->date_info->max_date, '-1 second'); + $months[$month] = theme('calendar_mini', $view, $vars['options'], $month_rows); + } + $vars['months'] = $months; + $vars['view']->date_info->hide_nav = FALSE; + $vars['view']->date_info->granularity = 'year'; + +} + +/** + * Display a day overlap view. + */ +function template_preprocess_calendar_day_overlap(&$vars) { + template_preprocess_calendar_day($vars); +} + +/** + * Display a day view. + */ +function template_preprocess_calendar_day(&$vars) { + + // Add in all the $vars added by the main calendar preprocessor. + $vars['view']->style_with_weekno = FALSE; + template_preprocess_calendar($vars); + + $view = $vars['view']; + $rows = $vars['rows']; + + $item_count = 0; + $by_hour_count = 0; + $grouping_field = $view->date_info->style_groupby_field; + + $display_overlap = $view->date_info->style_theme_style == '1'; + + // Add optional css + if ($display_overlap) { + drupal_add_css(drupal_get_path('module', 'calendar_multiday') .'/calendar-overlap.css'); + drupal_add_js(drupal_get_path('module', 'calendar_multiday') . '/calendar_overlap.js'); + $overlapped_items = array(); + } + + // If we're not grouping by time, move all items into the 'all day' array. + if (empty($view->date_info->style_groupby_times)) { + // Items are already grouped into times, so we need to process each time-group. + foreach ($rows['items'] as $time => $items) { + foreach ($items as $item) { + $rows['all_day'][] = $item; + } + } + $rows['items'] = array(); + } + + $columns = array(); + + // Move all_day items into the right columns and render them. + $grouped_items = array(); + foreach ($rows['all_day'] as $item) { + if (isset($item->{$grouping_field})) { + $column = $item->{$grouping_field}; + $item->{$grouping_field} = ''; // Remove the grouping field from the results. + if (!in_array($column, $columns)) { + $columns[] = $column; + } + } + else { + $column = t('Items'); + } + $theme = isset($item->calendar_node_theme) ? $item->calendar_node_theme : 'calendar_'. $view->date_info->granularity .'_node'; + $grouped_items[$column][] = theme($theme, $item, $view); + $item_count++; + } + $vars['rows']['all_day'] = $grouped_items; + + // Moved timed items into the right columns and render them. + $start_times = $view->date_info->style_groupby_times; + $show_empty_times = $view->date_info->style_show_empty_times; + $end_start_time = '23:59:59'; + $start_time = array_shift($start_times); + $next_start_time = count($start_times) ? array_shift($start_times) : $end_start_time; + + $grouped_items = array(); + foreach ($rows['items'] as &$items) { + foreach ($items as &$item) { + $time = date_format($item->date_start, 'H:i:s'); + if (isset($item->{$grouping_field})) { + $column = $item->{$grouping_field}; + $item->{$grouping_field} = ''; // Remove the grouping field from the results. + if (!in_array($column, $columns)) { + $columns[] = $column; + } + } + else { + $column = t('Items'); + } + // Find the next time slot and fill it. Populate the skipped + // slots if the option to show empty times was chosen. + while ($time >= $next_start_time && $time < $end_start_time) { + if ((!empty($show_empty_times) || $display_overlap) && !array_key_exists($start_time, $grouped_items)) { + $grouped_items[$start_time]['values'] = array(); + } + $start_time = $next_start_time; + $next_start_time = count($start_times) ? array_shift($start_times) : $end_start_time; + } + $grouped_items[$start_time]['values'][$column][] = $item; + if ($display_overlap) { + $time_end = date_format($item->date_end, 'H:i:s'); + $item->time_start = $time; + $item->time_end = $time_end; + _calc_indents($overlapped_items, $time, $time_end, $item); + } + $item_count++; + $by_hour_count++; + } + } + + // Finish out the day's time values if we want to see empty times. + if (!empty($show_empty_times) || $display_overlap) { + while ($start_time < $end_start_time && ($start_time != NULL || $display_overlap)) { + if ($start_time == NULL) { + $start_times = $view->date_info->style_groupby_times; + $start_time = array_shift($start_times); + $next_start_time = array_shift($start_times); + } + if (!array_key_exists($start_time, $grouped_items)) { + $grouped_items[$start_time]['values'] = array(); + } + $start_time = $next_start_time; + $next_start_time = count($start_times) ? array_shift($start_times) : $end_start_time; + } + } + + // Do the headers last, once we know what the actual values are. + $i = 0; + $start_times = array_keys($grouped_items); + foreach ($start_times as $start_time) { + $next_start_time = array_key_exists($i + 1, $start_times) ? $start_times[$i + 1] : '23:59:59'; + $heading = theme('calendar_time_row_heading', $start_time, $next_start_time, $rows['date']); + $grouped_items[$start_time]['hour'] = $heading['hour']; + $grouped_items[$start_time]['ampm'] = $heading['ampm']; + foreach ($grouped_items[$start_time]['values'] as $column => &$items) { + foreach ($items as $index => &$item) { + if ($display_overlap) { + $offset = round(date_format($item->date_start, 'i') / 15); + $duration = date_convert('1970-01-01 ' . $item->time_end, DATE_DATETIME, DATE_UNIX) - + date_convert('1970-01-01 ' . $item->time_start, DATE_DATETIME, DATE_UNIX); + $duration = round($duration / (15 * 60)); + $item->class = 'd_'. $duration . ' o_'. $offset . ' i_' . $item->indent . ' md_' . min($item->max_depth, 5); + } + $theme = isset($item->calendar_node_theme) ? $item->calendar_node_theme : 'calendar_'. $view->date_info->granularity .'_node'; + $grouped_items[$start_time]['values'][$column][$index] = theme($theme, $item, $view); + } + } + $i++; + } + ksort($grouped_items); + $vars['rows']['items'] = $grouped_items; + + if (empty($columns)) { + $columns = array(t('Items')); + } + $vars['columns'] = $columns; + + $vars['agenda_hour_class'] = 'calendar-agenda-hour'; + $first_column_width = 10; + + if (empty($view->date_info->style_groupby_times)) { + $vars['agenda_hour_class'] .= ' calendar-agenda-no-hours'; + $first_column_width = 1; + } + + $vars['first_column_width'] = $first_column_width; + if (count($columns)) { + $vars['column_width'] = round((100 - $first_column_width)/count($columns)); + } + else { + $vars['column_width'] = (100 - $first_column_width); + } + $vars['item_count'] = $item_count; + $vars['by_hour_count'] = $by_hour_count; + $vars['start_times'] = $view->date_info->style_groupby_times; + return; +} + +/** + * Display a week overlap view. + */ +function template_preprocess_calendar_week_overlap(&$vars) { + template_preprocess_calendar_week($vars); +} + +/** + * Display a week view. + */ +function template_preprocess_calendar_week(&$vars) { + // Add in all the $vars added by the main calendar preprocessor. + $vars['view']->style_with_weekno = FALSE; + template_preprocess_calendar($vars); + + $view = $vars['view']; + $rows = $vars['rows']; + $item_count = 0; + $by_hour_count = 0; + $start_time = NULL; + + if (sizeof($rows) > 1) { + $day_names = array_shift($rows); + } + else { + $day_names = $rows; + $rows = array(); + } + + // Moved timed items into the right columns and render them. + $show_empty_times = $view->date_info->style_show_empty_times; + $end_start_time = '23:59:59'; + + $grouped_items = array(); + + // pass the multiday buckets + $vars['all_day'] = $rows['multiday_buckets']; + + // Remove the count for singleday + $vars['multiday_rows'] = max(0, $rows['total_rows'] - 1); + $display_overlap = ($view->date_info->style_multiday_theme == '1' && $view->date_info->style_theme_style == '1'); + $vars['display_overlap'] = $display_overlap; + + // Add optional css + if ($display_overlap) { + drupal_add_css(drupal_get_path('module', 'calendar_multiday') .'/calendar-overlap.css'); + drupal_add_js(drupal_get_path('module', 'calendar_multiday') . '/calendar_overlap.js'); + $overlapped_items = array( array(), array(), array(), array(), array(), array(), array()); + + // Locate the first item + $first_time = '23:59:59'; + $first_time_index = -1; + for ($i = 0; $i < 7; $i++) { + if (count($rows['singleday_buckets'][$i]) > 0) { + $time_slot = reset($rows['singleday_buckets'][$i]); + $time = date_format($time_slot[0]['item']->date_start, 'H:i:s'); + if ($time < $first_time) { + $first_time = $time; + $first_time_index = $i; + } + } + } + if ($first_time_index > -1) { + $rows['singleday_buckets'][$first_time_index][$first_time][0]['is_first'] = TRUE; + } + } + + // If we're not grouping by time, move all items into the 'all day' array. + if (empty($view->date_info->style_groupby_times)) { + $add_row = FALSE; + foreach ($vars['all_day'] as $index => &$day ) { + foreach ($rows['singleday_buckets'][$index] as $item) { + foreach ($item as $event) { + $day[] = $event; + $add_row = TRUE; + } + } + } + if ( $add_row ) { + $vars['multiday_rows']++; + } + } + else { + foreach ($rows['singleday_buckets'] as $wday => $singleday_row) { + $columns[] = $wday; + foreach ($singleday_row as &$row) { + $start_times = $view->date_info->style_groupby_times; + $start_time = array_shift($start_times); + $next_start_time = count($start_times) ? array_shift($start_times) : $end_start_time; + foreach ($row as &$item) { + $time = date_format($item['item']->date_start, 'H:i:s'); + if ($item['item']->calendar_all_day || ($item['item']->date_start == $item['item']->date_end)) { + $vars['all_day'][$item['wday']][] = $item; + if ($vars['multiday_rows'] == 0) { + $vars['multiday_rows']++; + } + } + else { + // Find the next time slot and fill it. Populate the skipped + // slots if the option to show empty times was chosen. + while ($time >= $next_start_time && $time < $end_start_time) { + if (($show_empty_times || $display_overlap) && !array_key_exists($start_time, $grouped_items)) { + $grouped_items[$start_time]['values'][$wday] = array(); + } + $start_time = $next_start_time; + $next_start_time = count($start_times) ? array_shift($start_times) : $end_start_time; + } + $grouped_items[$start_time]['values'][$wday][] = &$item; + if ($display_overlap) { + $date_end = date_format($item['item']->date_end, 'H:i:s'); + _calc_indents($overlapped_items[$wday], $time, $date_end, $item); + } + $item_count++; + $by_hour_count++; + } + } + } + // Finish out the day's time values if we want to see empty times. + if ($show_empty_times || $display_overlap) { + while ($start_time < $end_start_time && ($start_time != NULL || $display_overlap)) { + if ($start_time == NULL) { + $start_times = $view->date_info->style_groupby_times; + $start_time = array_shift($start_times); + $next_start_time = array_shift($start_times); + } + if (!array_key_exists($start_time, $grouped_items)) { + $grouped_items[$start_time]['values'][$wday] = array(); + } + $start_time = $next_start_time; + $next_start_time = count($start_times) ? array_shift($start_times) : $end_start_time; + } + } + ksort($grouped_items); + } + } + + // Do the headers last, once we know what the actual values are. + $i = 0; + $start_times = array_keys($grouped_items); + foreach ($start_times as $start_time) { + $next_start_time = array_key_exists($i + 1, $start_times) ? $start_times[$i + 1] : '23:59:59'; + $heading = theme('calendar_time_row_heading', $start_time, $next_start_time, (isset($row['data'])) ? $row['data']['date'] : NULL); + $grouped_items[$start_time]['hour'] = $heading['hour']; + $grouped_items[$start_time]['ampm'] = $heading['ampm']; + $grouped_items[$start_time]['time'] = $start_time; + if ($display_overlap) { + foreach ($grouped_items[$start_time]['values'] as $wday => &$items) { + foreach ($items as &$item) { + if ($display_overlap) { + $offset = round(date_format($item['item']->date_start, 'i') / 15); + $duration = date_convert($item['item']->date_end, DATE_OBJECT, DATE_UNIX) - date_convert($item['item']->date_start, DATE_OBJECT, DATE_UNIX); + $duration = round($duration / (15 * 60)); + $item['class'] = 'd_'. $duration . ' o_'. $offset . ' i_' . $item['indent'] . ' md_' . min($item['max_depth'], 5); + } + } + } + } + } + + $vars['items'] = $grouped_items; + + $vars['day_names'] = $day_names; + $vars['columns'] = $columns; + $vars['start_times'] = $view->date_info->style_groupby_times; + $vars['first_time'] = $first_time; + + $vars['agenda_hour_class'] = 'calendar-agenda-hour'; + $first_column_width = 10; + + if (empty($view->date_info->style_groupby_times)) { + $vars['agenda_hour_class'] .= ' calendar-agenda-no-hours'; + $first_column_width = 1; + } + $vars['item_count'] = $item_count; + $vars['by_hour_count'] = $by_hour_count; + return; +} + +/** + * Create the calendar date box. + */ +function template_preprocess_calendar_datebox(&$vars) { + $date = $vars['date']; + $view = $vars['view']; + + $vars['day'] = intval(substr($date, 8, 2)); + $force_view_url = !empty($view->date_info->block) ? TRUE : FALSE; + $vars['url'] = date_real_url($view, NULL, $date, $force_view_url); + $vars['link'] = l($vars['day'], $vars['url']); + $vars['granularity'] = $view->date_info->granularity; + $vars['mini'] = $view->date_info->mini; + + if ($view->date_info->mini) { + if (!empty($vars['selected'])) { + $vars['class'] = 'mini-day-on'; + } + else { + $vars['class'] = 'mini-day-off'; + } + } + else { + $vars['class'] = 'day'; + } +} + +/** + * Format an calendar node for display. + */ +function template_preprocess_calendar_node(&$vars) { + $node = $vars['node']; + $view = $vars['view']; + $fields = array(); + foreach ($view->field as $name => $field) { + // Some fields, like the node edit and delete links, have no alias. + $field_alias = $field->field_alias != 'unknown' ? $field->field_alias : $name; + if (!empty($node->$field_alias)) { + $data = $node->$field_alias; + $label = $field->options['label']; + + // CCK has some special label options. + if (!empty($field->content_field)) { + switch ($field->options['label_type']) { + case 'none': + $label = ''; + break; + case 'widget': + $label = $field->content_field['widget']['label']; + break; + } + } + $fields[$field_alias] = array( + 'id' => views_css_safe($field_alias), + 'label' => $label, + 'data' => $data, + ); + } + } + $vars['fields'] = $fields; + $vars['calendar_start'] = $node->calendar_start; + $vars['calendar_end'] = $node->calendar_end; + $vars['calendar_start_date'] = $node->calendar_start_date; + $vars['calendar_end_date'] = $node->calendar_end_date; + + // We added the node type to the results in the query, + // but it will show up as $node->node_type instead of + // $node->type. Rename it to match the normal way it + // would show up on a node object. + $vars['node']->type = $vars['node']->node_type; +} + +/** + * Format an calendar month node for display. + */ +function template_preprocess_calendar_month_node(&$vars) { + template_preprocess_calendar_node($vars); +} + +/** + * Format an calendar month node for display. + */ +function template_preprocess_calendar_month_multiple_node(&$vars) { + $view = $vars['view']; + $curday = $vars['curday']; + + // get the year month and date + $parts = explode('-', substr($curday, 0, 10)); + $year = $parts[0]; + $month = intval($parts[1]); + $day = intval($parts[2]); + + // create the link to the day + $vars['link'] = date_real_url($view, NULL, date_pad($year, 4) .'-'. date_pad($month) .'-'. date_pad($day)); +} + +/** + * Format an calendar day node for display. + */ +function template_preprocess_calendar_day_node(&$vars) { + template_preprocess_calendar_node($vars); + $node = $vars['node']; + // Remote items may have a teaser to show. + if (!empty($node->remote) && !empty($node->teaser)) { + $fields['teaser'] = '
'. ($node->teaser) ."
\n"; + } +} + +/** + * Format an calendar week node for display. + */ +function template_preprocess_calendar_week_node(&$vars) { + template_preprocess_calendar_node($vars); +} + +/** + * Format an calendar week node for display. + */ +function template_preprocess_calendar_week_multiple_node(&$vars) { + $view = $vars['view']; + $curday = $vars['curday']; + + // get the year month and date + $parts = explode('-', substr($curday, 0, 10)); + $year = $parts[0]; + $month = intval($parts[1]); + $day = intval($parts[2]); + + // create the link to the day + $vars['link'] = date_real_url($view, NULL, date_pad($year, 4) .'-'. date_pad($month) .'-'. date_pad($day)); +} + +/** + * Format the time row headings in the week and day view. + */ +function theme_calendar_time_row_heading($start_time, $next_start_time, $curday_date) { + static $format_hour, $format_ampm; + if (empty($format_hour)) { + $format = variable_get('date_format_short', 'm/d/Y - H:i'); + $format_hour = str_replace(array('a', 'A'), '', date_limit_format($format, array('hour', 'minute'))); + $format_ampm = strstr($format, 'a') ? 'a' : (strstr($format, 'A') ? 'A' : ''); + } + if ($start_time == '00:00:00' && $next_start_time == '23:59:59') { + $hour = t('All times'); + } + elseif ($start_time == '00:00:00') { + $date = date_create($curday_date .' '. $next_start_time); + $hour = t('Before @time', array('@time' => date_format($date, $format_hour))); + } + else { + $date = date_create($curday_date .' '. $start_time); + $hour = date_format($date, $format_hour); + } + if (!empty($date)) { + $ampm = date_format($date, $format_ampm); + } + else { + $ampm = ''; + } + return array('hour' => $hour, 'ampm' => $ampm); +} + +/** + * Format a node stripe legend + */ +function theme_calendar_stripe_legend() { + if (empty($GLOBALS['calendar_stripes'])) { + return ''; + } + $header = array( + array('class' => 'calendar-legend', 'data' => t('Item')), + array('class' => 'calendar-legend', 'data' => t('Key')) + ); + $rows = array(); + $output = ''; + foreach ((array) $GLOBALS['calendar_stripes'] as $label => $stripe) { + if ($stripe) { + $rows[] = array($label, '
 
'); + } + } + if (!empty($rows)) { + $output .= theme('table', $header, $rows, array('class' => 'mini calendar-legend')); + } + return $output; +} + +/** + * Format node stripes + */ +function theme_calendar_stripe_stripe($node) { + if (empty($node->stripe) || (!count($node->stripe))) { + return; + } + $output = ''; + if (is_array($node->stripe_label)) { + foreach ($node->stripe_label as $k => $stripe_label) { + if (!empty($node->stripe[$k]) && !empty($stripe_label)) { + $GLOBALS['calendar_stripes'][$stripe_label] = $node->stripe[$k]; + $output .= '
 
'."\n"; + } + } + } + return $output; +} + +/** + * Format an empty day on a calendar + * + * @param day + * The day to display. + */ +function theme_calendar_empty_day($curday, $view) { + + if ($view->date_info->calendar_type != 'day') { + return '
 
'."\n"; + } + else { + return '
'. t('Empty day') .'
'; + } +} + + +/** + * Indent items based off a nested tree structure of overlapping items + * + * @param array $overlapped_items + * Tree of overlapped items + * @param date $start + * Start time of the event + * @param date $end + * End tiem of the event + * @param array $item + * The event to add to the tree + * @param int $depth + * Current depth of the tree + * @return rc + * Returns an array with the max depth of the branch and whether an overlap occurred + */ +function _calc_indents(&$overlapped_items, $start, $end, &$item, $depth = 0) { + + // Are there any items at this depth? + if (!empty($overlapped_items)) { + + // Iterate for each item as this depth and see if we overlap + foreach ($overlapped_items as $index => &$entry) { + + // We search depth-first, so if there are children for this item, recurse into + // each child tree looking for an overlap + if (!empty($entry['children'])) { + $rc = _calc_indents($entry['children'], $start, $end, $item, $depth + 1); + + // Was there an overlap in the child tree? + if ($rc['overlap']) { + if (is_object($entry['item'])) { + $entry['item']->indent = _calc_indent($entry['depth'], $rc['max_depth']); + $entry['item']->max_depth = $rc['max_depth']; + } + else { + $entry['item']['indent'] = _calc_indent($entry['depth'], $rc['max_depth']); + $entry['item']['max_depth'] = $rc['max_depth']; + } + + // There was an overlap, pop out of this depth + return $rc; + } + } + + // No, child overlap, so check if we overlap this item + if ($start >= $entry['start'] && $start <= $entry['end']) { + + // We overlap, create an overlapping entry + $entry['children'][] = array('item' => &$item, 'depth' => $depth + 1, 'start' => $start, 'end' => $end, 'children' => array()); + if (is_object($entry['item'])) { + $max_depth = max($entry['item']->max_depth, $depth + 1); + $entry['item']->indent = _calc_indent($depth, $max_depth); + $entry['item']->max_depth = $max_depth; + } + else { + $max_depth = max($entry['item']['max_depth'], $depth + 1); + $entry['item']['indent'] = _calc_indent($depth, $max_depth); + $entry['item']['max_depth'] = $max_depth; + } + if (is_object($item)) { + $item->indent = _calc_indent($depth + 1, $max_depth); + $item->max_depth = $max_depth; + } + else { + $item['indent'] = _calc_indent($depth + 1, $max_depth); + $item['max_depth'] = $max_depth; + } + + // We overlap, so pop out of this depth + return array('overlap' => TRUE, 'max_depth' => $max_depth); + } + } + + // If there are items at this depth, but no overlap, then return no overlap and pop + // out of this depth + if ($depth > 0) { + return array('overlap' => FALSE, 'max_depth' => 0); + } + } + + // No overlap at any depth, reset the array of overlaps + if ($depth == 0) { + reset($overlapped_items); + $overlapped_items[0] = array('item' => &$item, 'depth' => $depth, 'start' => $start, 'end' => $end, 'children' => array()); + } + else { + $overlapped_items[] = array('item' => &$item, 'depth' => $depth, 'start' => $start, 'end' => $end, 'children' => array()); + } + + if (is_object($item)) { + $item->indent = _calc_indent($depth, $depth); + $item->max_depth = $depth; + } + else { + $item['indent'] = _calc_indent($depth, $depth); + $item['max_depth'] = $depth; + } + return array('overlap' => FALSE, 'max_depth' => $depth); +} + +/** + * Calculates the indent based of the current depth and the depth of this branch in the tree + * + * @param int $cur_depth + * @param int $depth + * @return number + */ +function _calc_indent( $cur_depth, $depth ) { + return round(10 * $cur_depth / ($depth + 1)); +} +/** @} End of addtogroup themeable */ diff --git a/sites/all/modules/calendar/help/attachments.html b/sites/all/modules/calendar/help/attachments.html new file mode 100644 index 0000000..3535cc2 --- /dev/null +++ b/sites/all/modules/calendar/help/attachments.html @@ -0,0 +1 @@ +

Views 2 lets you combine a number of 'displays' together in one view, including, potentially, more than one page display. Each page display can be a regular page display, with its own url, or an 'attachment' to another display. Attachments are basically one or more views that all appear at the same url of the page they are attached to, one after the other. So the calendar now creates one display that creates the back/next navigation, and attaches to it a year, month, week, or day display with the calendar for the right period.

\ No newline at end of file diff --git a/sites/all/modules/calendar/help/calendar.help.ini b/sites/all/modules/calendar/help/calendar.help.ini new file mode 100644 index 0000000..c65d429 --- /dev/null +++ b/sites/all/modules/calendar/help/calendar.help.ini @@ -0,0 +1,43 @@ +; $Id: calendar.help.ini,v 1.1.2.4 2008/10/28 11:46:19 karens Exp $ + +[advanced help settings] +name = Calendar +index name = "Calendar" + +[overview] +title = Overview + +[getting-started] +title = Getting started +parent = overview +weight = 1 + +[settings] +title = Settings +parent = overview +weight = 2 + +[attachments] +title = Attachments +parent = overview +weight = 3 + +[embedding] +title = Embedding views +parent = overview +weight = 10 + +[ical] +title = iCal +parent = overview +weight = 5 + +[ical-export] +title = iCal Export +parent = ical +weight = 1 + +[ical-import] +title = iCal Import +parent = ical +weight = 2 diff --git a/sites/all/modules/calendar/help/embedding.html b/sites/all/modules/calendar/help/embedding.html new file mode 100644 index 0000000..2d2d090 --- /dev/null +++ b/sites/all/modules/calendar/help/embedding.html @@ -0,0 +1,15 @@ +

Embedding Views

+

Embed a date browser or calendar view anywhere using the format:

date_embed_view($view_name, $display_name, $settings, $args)
+Settings are used to override some values of the view.

+

The primary setting that is useful here is a setting for 'block_identifier'. The view's block_identifier is used to control individual instances of regular and embedded views that contain date navigation so that they move separately or together. All views that use the same identifier will move together. +All views that use different identifiers will move independently. The identifier will show up in the url as a querystring, like node/275?mini=calendar/2008-10. +Page views use no block identifier, the normal identifier of the block view is 'mini'.

+

Examples:

+
+
<?php print date_embed_view('calendar', 'calendar_1'); ?>
+
This will embed the default page view of the calendar, using the regular calendar defaults.
+
<?php print date_embed_view('calendar', 'calendar_1', array('block_identifer' => 'embedded'), array('2008-W45')); ?>
+
This will embed the page view of the calendar that will use 'embedded' as an identifier, set to show the week view for week 45 of 2008.
+
<?php print date_embed_view('calendar', 'calendar_block_1', array('block_identifier' => 'mini'), array('2008-07')); ?>
+
This will embed the block view of the calendar that will use 'mini' as an identifier, set to show the month view for July 2008.
+
diff --git a/sites/all/modules/calendar/help/getting-started.html b/sites/all/modules/calendar/help/getting-started.html new file mode 100644 index 0000000..d693d5a --- /dev/null +++ b/sites/all/modules/calendar/help/getting-started.html @@ -0,0 +1,22 @@ + +
    +
  1. Create a new calendar by enabling the default calendar view and changing it to use whatever date you want in your calendar. You can create multiple calendars by cloning the default calendar view as many times as necessary.
  2. + +
  3. The calendar uses the Generic Date argument. This argument has an option to select one or more Views date fields to filter on, automatically adds them to the view, and then filters the view by the value of the selected field(s). This argument can be used on any view, not just calendar views.
  4. + +
  5. Unlike previous versions of the Calendar module, there is just a single argument instead of year, month, and day arguments. The argument value will be YYYY-MM-DD for a day, YYYY-MM for a month, YYYY for a year, and YYYY-W99 for a week. There is a default option to set the argument to the current date when the argument is empty.
  6. + +
  7. A calendar display creates calendar navigation and links to multiple displays for the year, month, day, or week views. The actual displays are created by attaching calendar views that use whatever styles are desired for those pages.
  8. + +
  9. Calendar views are attachments (note 1) to create the year, month, day, and week displays. They can be set to use any style, either a calendar style or any other Views style, like teasers or lists. They can each have their own fields and formatting. They must be attached to the main calendar page or to a calendar block.
  10. + +
  11. If you don't want to have a link to a week display, just remove the week display from the view. Ditto for any other displays you don't want to use. The links will automatically disappear for any displays that are not defined in the view.
  12. + +
  13. A calendar block will create a calendar block for the view results. This block requires the calendar argument to do its work, and uses one of the year, month, day, or week calendar view attachments created above.
  14. + +
  15. Earlier versions required that you add the date field to the 'Fields' section of the view, but this version does not require that. Add the field to the view if you want it displayed in the results, otherwise you can leave it out. The Calendar no longer over-writes normal formatting for that field, it will be displayed however you set it up in the view.
  16. + +
  17. There are templates for the top of the calendar (the links and navigation), the year, month, day, and week displays, and the individual month, week, and day nodes, so you can easily style them.
  18. + +
+ diff --git a/sites/all/modules/calendar/help/ical-export.html b/sites/all/modules/calendar/help/ical-export.html new file mode 100644 index 0000000..e420a39 --- /dev/null +++ b/sites/all/modules/calendar/help/ical-export.html @@ -0,0 +1,2 @@ +

If the Calendar iCal module is enabled, the default Calendar view will include an iCal display that you can use to create iCal exports of your calendar.

+

To use the iCal export, look for the iCal display in the calendar. The default iCal feed uses a Date filter set to show events greater to or equal to 'now'. Find the date filter on the iCal display and change it to use the date(s) used in the calendar. Then attach the iCal feed to the Calendar Page and/or the Calendar Block.

\ No newline at end of file diff --git a/sites/all/modules/calendar/help/ical-import.html b/sites/all/modules/calendar/help/ical-import.html new file mode 100644 index 0000000..d017721 --- /dev/null +++ b/sites/all/modules/calendar/help/ical-import.html @@ -0,0 +1,4 @@ +

To import nodes from an iCal feed, follow the iCal Import instructions.

+

After importing, the imported nodes now exist as regular date fields that can be added to your calendar.

+ + \ No newline at end of file diff --git a/sites/all/modules/calendar/help/ical.html b/sites/all/modules/calendar/help/ical.html new file mode 100644 index 0000000..1491485 --- /dev/null +++ b/sites/all/modules/calendar/help/ical.html @@ -0,0 +1 @@ +The Calendar module can take advantage of the iCal standard to either export or import ical feeds. \ No newline at end of file diff --git a/sites/all/modules/calendar/help/images/calendar_colors.jpg b/sites/all/modules/calendar/help/images/calendar_colors.jpg new file mode 100644 index 0000000000000000000000000000000000000000..425d4118ea55cadde08dfcb90a977d83488f6c57 GIT binary patch literal 50004 zcmeFY1yo$kwl3PZ6Er|@Xo3?wxCZGE+$~tprqSTR6B3~D-~UYjv-(Ro|>Rt7=L;%si|B2wuvAVParlU}0fm_9AfX|8`@6$`evpt+P|?saFtM<45Cy6U0LVxvD9ETNXlSUYh|<1@d;lsT z8WBB@G&-@m83uzh32$J`S4>8kiZ)V>u_GX#xl0fh_G2<~iYH7@nORub_yq)?3ki$J zzL1kwPz1fy)Y8_`)zdeycw=d0ZDVWa`qs_e!_&(<`2B~FkDo%rV&gu?CnP2%r(|X4 zUh!U!l31)-kZ1d=}#U2 znKJ$>FP3kOX^%oY!S?~j4}d=&X~r=EqbS#sz3SY)so$;v&9 z+r~#X`wxKb#2dj*|AB9aQuDWV4x$wF)37vho$?E}qz6Ev^8>)Q_Hz6#Xw-k8?vEli zb$WvfEDP+Kdpa$rt^Ui(_x!$L)Ayc_Znj&x!#_ZOv`4g8OLT!B0Ad(-XUl5}Go}8U z0f?%pw}`3(|5sIIBdM*9v`VH6wRCLS3E;U-nY$q^zdfS;HQ^sYYhL{TNJqK9c0A7d zY4OY{+o@Ew!r%cgf`lOX^UJXdc9W|W$-}${z!R>=yuYxYV^99O^1li8ZzlOaCm4Lk z@~k#FJUobdCVKv@pWy>wTJGMwMiCC<_3v44xqEA}!EO_&40y`YMV?IpFo&v#@kpT~ z9!N~pkivN6(a8Tu43uX9APOKuu>m~tEUnqd0l4a6+$^n`C?tp~f&UdXiYDwHN535F zJrJ#mV2S)pDKe~#$Dt^CUY>!)8z*M zmE%$NjX}q~&jVmB;+{nR!$4g&snY*UA+^H!BN=Vk>kO5Z0tJ^+l#uEORS5q+(Pe-g!RPj`-xb}d?)C~d z!{B174*<;CTV`F_qtE_DHzcoBua|$+f4?ukp1gLse7XAy#(#(*@$A5Unf>N42`O+e z4d0M90=Q3keV+|ps?Farfi=12fh@&DxQZ#4yEwondD5B;#Sjj`TGX?VQsvc0#CYhO zRx5T`{G*?AC_$XPdS3$R9@F|bp`Ndim$__^8I%oC!@9Bfv2ch<7^R+D_7KB$>ChtUR?@m?s4X;m`-aQxbF*bnBO=~tbO~o4e zfb-=&!uts;gvyyuNX?$>L zzBG&*lgQM-M3h|0*O)*YDsBa8D2= zVT)8*c#8^4Ph7=g*Z-bysQLr+HT=#DP^el!M|h?CXf+kYAE7H7Yph%~fFsI7LS|xq z^Agw*gnhvz)po((dq3Imw56;j-__fpG+~@#sSEO=D{{&WupY1ojTUcEyPm(^{}r_D zzk5%KlOw$fIfJjGqblYh#c>C*=;>40Oci24)|t|e8%e~*~6DP0_4d$O-ZPdgt8U-e>Nl}QY;kfvOSCFO{v3`)PMA{r! zk4g%h#z^<19!68(`kve2##E9Lk+smBn}QT29ldDi@otX;{j69pzC>SpA<`G zY`yemPkka-pT7$OxtcjsC2LzlMG~XLQ36!(Y|Sg)apEnee}v>O=_@%h=*p8L~HPg9O_qBPH~)Fy-0_^+$+np#h+6h$3=^G$(3CO zbx2pFgTqtJoMQN64Esc~l>$et(^aWZ^q-`Mm+lbRC8{fdarp9Qvto%3UNE~5tV)q_ z)}7$kyR7xCZC8RWOU-S7HBXgnTid9I;zc_4LM&&CKo9{$_(4`2HdaX zD}kE8ih?M@y_xwW0;E22)OScGzm7nN5VVzS)u|6j+ zf+ec=c%d|!J(lC}MF*?+sx03qJIHks$vnlYW}rXb0jXyUS9#Pkk|{+SzN1!21PgDG^z$37$g|9XXh?IQ=!gX zr~E!J_PI3$fcR2Z()a7@g$UDd?(SXn>SPq&cVqd9b?H732T87KP3@}sis`Jn*uG8B zc}@yu_M5?^8b(G}04DoFWX8*C^5zy;#^xnfO-s4S$*oG0owtu3<*~25{m0uTti*xc zs2^!=t0`{2Joe*9JAy&5SMQUC8!0K6@zSVF@8#>4_aYPzCL@w@-PC<90NZt$P=&tX zp{uLwwPpUotYuYyh!0cZ=cwY;?pk*lGifZT9@L1g05Rf8pRoa&2LLQ%x|iz#P@Zvq zDp2(RAl|zEatqU`y*LzeAk}*Hap+3ck{e_eJUs*JW+zq+IvD5_$-7~FJ$GT5%%vV@ zzAB(W{&+F1+|)a4zUx(KZb_DM4EP~9`KfAs2i(vCd7uRL3;v1_XxGOY+N25`=PG?Nd9Lql;+&1;()zn7w(qe z0rQ4F1yj~>nPb>`0`W7i-*^<0mqZ|Q$_SOE+`T~u)yiAzz3*}lycuDKGt;e6SENjL zy@*c_mPRN6EM4>=|EwSUgR=1d^ner}ERV;<(gk>mN6ufDO@f550rf1pZuXtJTJH{=J0^9{@ieIbLJ>!)fpPqy9ssvcFR=J6*az(&Qi7 zum(-wC)$ltG%XIBxG(+)=+WHPJ^E`HRFn@MEB=R}D3V7k#lL$d|GSI7)yI%?+IVtD z^{YR$$G`ghhkl4i{393e|BEU}iD5h{UF4bQt5D4fc@|^>9=AXE)R77%C^=4#uwWth zcQt?#Q7Y^I()(|fbp|2&3+iF+2>F(cI{W0mOgmi5qnG1%Py4Iqw6p>65~0*$u5(q0 z$_Fm6vgNEf@A1u5tRCZfJaLbAC83qbYcoUy#G z;zjEq`rvNfWlt#K_C(r3T*o8!t(zAF()Q`blgJ9uBFJT76!rGJkt#w@3lH!7jo&-U z`aqmrnVK{(V);Sj04LJ#wdrXqQ$Am;+Q;_{`hX!u1!h#w=%Sq44=quj`p+>GU%JYt zD%8|Pu4>0GnZ$gK`xGxDkMHwAJ;TM0Wa2#B@P`}(FDc~2D#@sK?+rAmJ@C5&C7Och zN9wwDZaFxt#Nc>eNtvp*WF}=!aVqF;wWJ@#g7K@s%aP8Skp8j549m`AU|EICK?VEW zA{?1Ga!+anrbR!(LV70EW6sESv;l14bWh)RrIKW6; zV5CqjQxwl#-h2BDHD>aSb8qb=ZA|&IPgQje@EWh&WvXxzXw3<){5}-jsZsY3KmUhp z!DYx2mc)Q{1Gq!PFc_{l#{L~3D?}*`h>K`F2Hk}_U7H*9jy;aO+1JHjMtir+hZ5<{ zvRPvXeL_V7d{q)N53cLHKOoYBV);5K27i$$ZBET7C0K{3<@I-@D8_ zoXLz5kktT!*9ZMlt*Q$28=i*__ba~8ZUsc55b2hi+93U!i!V#5NKJUxKX0M9YD+!L z>r{j#hKtzpGjJ=I##^3!R`Ps8mKcHYE5SsTd;?!EZL!mEp2C%+*} zK1)g=-%K9$wjIwkaXEvG*Au3Zi-RL9bx}i~3|mhht4P>0#9}bUby;2dchq`oqKHKc z@^3*T!e<}3kJy3I9ZIs*zjBfHrhPR*EdAqAvBC4%p~$=> zuNNgupRQ#1KFo(uS&M!&aFpM}(F*TdHD>ymVj}S(lI7KUPHhZ|yhx>`{P9Hmi24p2 z@#;RQY(ibKJ7Aw=gon6InoV3A{G)=ebhyl_koZVGsco zvXcr=q#eSu_0i#=rP>_?xOttF;Cx`w5pl&FnStohRZ4!yF8Q1@UiUgY~`^Q*g1i9XTWIDYn_nV{KeOT z8P0F$ZTAjdvqXWq7IbI2sC}aDk;VdrwSVrY4{GA z6O3tOcDXpzUOncD6Bw;k`p97=cr!?ZdE2VUVpKLdOU*YzzQdN5Vl@4lqozIv*O>!H zV4Q`Maxmx9Q73Lpedv~-)`~XX^OsZQoKJ?qo~8DQ+OhEd;d|GjK_ft_6d+mx(i7<{ zv*>ROxi`JIZ=}ZAZFuX^^2Rn}5TC({pgzLrOp}fh#YKo&EJ|JLR)6*B(Qq8~j$Uey z7mPI2#Fpv%L~!~S9xclDUxdr5HNg6sgsp|(r}@tK?IvC{FM}e2d*Rm5>o2s#ThmXb zN})OLAnXCq71WOowUwOR*jrG>>0F?xe}|W}DRc`4s~pqB6)lAOh$h%VWh`|+tS!?x z*Lxt<`9P;x(lMtT9Zm~CmX41uBrhBwxnB4`$BxuJFGkjMt5k88x8n>(m`dY}=jN&i z7izvb3#xEu%D1v{c?YOg>tsxi+ykobn@x^X`okjUM{YPI?M|AWjxOGelvuQpoZ|96{YQyhH( zXV|peH=wl&zW3~T0K5wWBqDkczBlSWLjC|aj8T})MDzu*CtGF+U_$gb>xQ59v|I89 zu6|)7xe4|E)tias#L`;OJcMz39Cd$1;+yj5YK`{pgaz3Mo15*~cZBL9W`S^@%l-Qm z|0dLbPmbc-%2$`d%laY*c;OFIxIemgtI)@|Gxu+j`~n_Dk|R+=_wYcdlr70+-T>IO za{P|55oMtPPYq}hrqPM80W;>Ql6Q;q89zFfyxG4U(hXLrsQx_QXz7Ui-n7Y?E$%W< zL2b*jqsZ<#nKh(=sWAR0ZkwM5FVaYItc%3K*mSw8PCvL&oNd(L)0>96@O>itn)MKL z{m>X`VX-v$W9mxcc;x83njdydUWq4lbu7vXmXO{VX!@h2NF zGn|>_&N{y1s45YYXGU z?5xo_U^FglU=mfxTnki<9fnz2Cd`rPn8JCHagYN1>X3^|TSuxUxpF5_HLpOFi6^5k zRMs(qfVf(Bm>BcZ2AN^q<5)|c5YtHO;cX&ritl}W)OOxdB3=H_Yuz9V(+q#jzvSZP7|sS51aMOx>`1BUT%d!OuApFPja8XUrpZ_KT+0H z2k+`c_q;XWy>t%Z*0dqt{y?5v8qlBGHRNC9sRQBtnLSbcIAa9FsHW1j<(g)?`So^Z z>SHG-vHE1`UMBCx`Ye5P)f*lYZG2?1OhZ3tyJR9E?UDYa19v>5Dz>ak=K zq#uJ^5p{@9p3y`8Ye?OMY^3lquA?ts!4*HzdzwC73yKpR-u7AvfO$YBTuNzzYU>`e z%~MjVl46$BN&Wfo)bGeYF}=xxWd0e-jJ}bc$kH+hKVu^t?Da(a6A+cVSE|!>VQi9C zLrL|C?X><1ntuIz?>> zG85L>Y7-mbj>@_a(AaEqu`{@+clPlGdb?-Qq2stCD7C?h0kKlMXj)t{`}hnumyeidP7`H;i528Yo5ZtLBbj} z{R`5r`pz-|KZNGm2h=o6vp}DeEidS>h5S9l0!myZ$ftkLaAbU6=;oL5ZftID2k+5b za@li7tjKpQENRDcQjfeBQ`?We$n0E?s5MV)G|DMOedje-&PHl>v#0VfQma9+W7Y7~ z(3^kj@b&X`aBrURqMU`bz~r6|i&`%n_Xu5;6llBN8Csue7g!$&`XzBrx}Nj=Les#A z)y7ID5~;227d4BYR8v2}jzRR@-NEN?b0l0(C{k<_^HAgqr|-rWBJb>;ALBJeyn&6g zgn*b%=T-%woiT-6iuR=RHIWM5kdct)c`Mj-O7mBzoWj8@B5qOAlM8Oieby~DmRrg^ zg?t>&@uc@etwPd)j32EK&AVXOn_7?{*<2FWsr2xx~JGo3@6;79;XEbjtYG@v*n8?s(e%$nP6cSBZ2V?!@w54BLYJ*=K2uSs4ZCFF7buk5i2+YvcD1;IXV(p*b<> zb1$GD02R9I)d3^scAW;LX$@~vf_itsPrg^hzUVs%jBO>rB8L;U?dyHJWK;^O8s#m5p&`^H zn?Hm*u5i(P@-me1hGfZfaddCC5o4M>547t0l!YN_;pJFwkd#GD%tfIPT6-aDT+FG( z*E0c))3%G+V@Q2-V}d+n9K;}VZwy=gy{($QPh&PsH+dL@UX{W8(qDziNZF zb7_(AIJuxJI*He37rcF*4YRkLlxUBwPvywGQmsh#JNei>t{@D6n_fRDEdyW7$yKd5 z#_pSQ#pFDrLxpplWPU(BPGCgP|8eq9aZ%7Dyt$SlCOjSwRamBn8J|G-K-i+Ku1s{NhAT2(OTw7c zP4dil!PmUfqET!L=UEdS_RQ(v#@&ynTu5Pk@o??Hs0(|IggGW~T3MdKF@Plf_Vw+xmr4)^hUa$zj-0_6F_701B zGAsKu3a8l4LQrK`7R{YdJzH_r8iJwGB}l^O#SQLZkerr=nA^sI9*gFu3-p?!Pk%xm z0EBA^;;ke|Wr~1UCp1@+qeSMJYW9|Iy%sf?up7PaM#ZrOt!O}Wv!2(O5>vIl<|!Y- z4U{;FDOVKL0*rkMg|-wh$XAZThWxR%!z=|^-mX3StU9w60kBzUs9DS*j$5E%L4w>W zL!5m*95~Bm47(#u_FUh@^6EMa2BA+x=6k5HnXQU*x5kzv;u|Nw0NJuD#S7VYlX(Kx zfKV54Io-yiPTk_Sv3AeXjR%W4V&X$Te^YA;fd*lsg!J~3BgYQ3!>;Y-!YSvAEs!hY zo^;)ejx>c(atq&Yy=IXDS5keZn5a+}%$19xM?b@b8Dc4z>uo6XEk0GQl3FCY&~3L>wSw893Vg%VVo2ZEwQaM;oyY5gNJW|5nEiq{>g2D zR|geqTbq!8-^um7>U$;Er(ITanXFds_d5lB7HuoYo+YKS?cVO$C0x1O=xPMK`~`K;)>9=V{If{J3Y#E4 z10~)MivjgUXv}y6G=eLUb`aT4oon|Tm`eu_mfbY(%L-98q){R=6d?x?t;bTSp6%lX z`*Dy1m18Kw+)y;B2VvwDQ&OyJtR3YdHv4XB@|(u`7xjUrDI~1bpNSN-IV6s$XwD>B zWzAL%h0h8OxPZOh|Au|#r|f?*$6X+)ZVFH|s^t;CsYteRAk ziUpf*IsomFVbFNDad~LzL1}i=iLw1G2?qA?J}U)Jj$KZ@`j^hPbk~9$lArjuR%+9l z?qA&k!@;cDqBTE18PSiB+iQcDv1Uwc-F0}YQX%*j?uu{@MY;rhXinOusP|cyt_0?U z!2!%YR)!O5$#7zdjZNU$=_RGuhp9!RN;R>AwtXvS#n5m=?-ROWK_C|qR8>F6xExVG zqJ}TEnX6fUEH!ax{kHCGNLBbs`aUW=0u2QtS9Q`R{_8I7m-V=vrQYGklH5a zI(R=kAv%2%w-p!HK{9A4b9Thh7w2$jx3Q0|`Xe{m*;v9eLc(KKyYWLU{Zq9Cb zIeo`R^ZW;^J|9Apdg(M8A8YVzJW3Qs$pjYcLIaf(I}*la*L$3uk@Qv~pGR3)5b{`d zYenX#1KjkUOXkV(iXf1Nh42E`2sNHwzr(Twlx-QoK?}F zI=^%u%XDs_I1sF@vyM%Dl=1P%#9W!C##=Cmi0crqP#&kDm){Byh9L>pj*o~1WmT;mzP9CuQs1PHMG(Y1V>$wIXS_HeaJLZKTah9gAyn~ZP z$HZfNQi z09YjDZnd6~28{*X+Ogd7iv;bGL;&tEs-8+Q*u@$ONt-|{t+Q^$d%M~ z5IUwXKT_qdi{shc1?X}6I)GQczqJAzNrP9Iv0&|oHpIPWUqZv^g$#d?wM%~ifn~2f zLEHx5V;0lox1xj4t?*k-xbMruKy$^Nz13>O}qX2mrVOCHbbHNC6%G-OA?}@5l zrt~*~8@4$*kreN`nW3SCA!GqOPymamtwb)et%e=&)i(u7#dbwwDzsrgd89^fZFUo) z8D%h-sV#QSE5`V1EHmC?&jCyMsbMJ>K66VuMSSCIGiflv=82M_=S_nbK0jcy68GB4f}Kismi;u z&EuS9_dORnjx5CW(&_SSP6~qsUZ~!>&sO}&c2a1Anpm^8A1evK3SGTl#4^+&QGF>Y z<&dfXx;Y1k5ZM@P;SXFR0>&5@{r=hh$38UOy~G6`!QIxJ*%mZN$QOW<8IGjKkZW;U z5)QO&e&$dm@7>j|QVlg&{|?}}qa zp=$*r80T01DJYZwiXr|ep?=j^RfXQLY)+QZD?zXg zBhNGME?4|XcKriDPa=NviE5-9<@^sG>a$scgZ-7*aS}6*mwX@lTzmYa9so#odyl~B zi5H*G>?Fq1BaBK%!uL4Nlg=6oEW>P{5)_`&JE$%)X%7T=!V7lz!cqo0opusybzp+E zyt!3*SPlvagyfH8etvoY1dKN)qU7AX^cJACRh2IzdvR<)&8T{s*EIFa(K5zNt~QdD zoK+ZzJ_9)C9D1vu8OHfkS$>DL)I5{|4*KjURX;2Rq)9VPJ67H*qqevAML>wE%Fov2 zNav`!?|@jXj_=I%4CqFJ#A;4moRHtU3y)B(ey?t!tWJn8_)+?P%udkHke|%1PTPgM z2Ye#jgFzP)1N)fCsj`bupeKK~SC`bJUNEql>dUh2B8OXJ?%FuO%eojbOGNn1+xO6} zJo~bnf8y;_z0cjtox2T!hIs{I>W^R5E@_SKoTaFL&1sGm{Kn_Pb2+b4S2F>x4mwyh zyt~(KvisWl>VUI82xeglap`rd*}s93N$&K(>V1{;lHJtJaGIp01{4T9+!^Tro`+J@zq|PdIn1{c zhg_ManqoOB4eLw<&{2ZZorFe6`@uBaQ;@PIDVR*Ffh{t9a<-MNaYcNu6NX=R5s!HJgnYgY6*}j;S2;h=)U_j1gZeBW#u0-@KFTX?$Hr_enwpE zutMEOkBTyBEfG&~%rurNOE%G$r+9Jb;X@GgJR(Mm2oVj8VPpaP)kQOGESpTd`4>Ky zgmmtThQ^R3C2*sO#A2Cg>|3?U?xtAo&Pd@7q%H;PH6_uW30E_JRD&2ZNB#kF9lAGg z3=WC99{zf!`Rn`WtC;EE0{I6w3*=p<;OU^afi2zN9=F`_K*1C^X=#p27}T(eCZ5&V z1CFz)sjLP*JC{EAD|0z0Qfy%xuAiFle5CgTJRuVvv;23#z{BRe`Iq5?FnC2D zAp}hQx9op~u#Y%Yf*d&;(<@$TRo=PBN-}Cp;#U7PFKF9j;+XtJT%9n$|EY|Rt0RQe z#4nRe_sgGtS^3<agaKZuhZ(RS3)1r5$=SkOeb=wU#xjw^STZpY>$Z;nvi}|C6w=R9G&j|K z=`7o9wdIz5^C_{#rN-m5n~l%^;tNE{95BK0^zJ@)gz!^yEg`H`>Fh#dZH%Y~D8h7U zceW!xe_$)~yzLo#yD>3#+f@zL;$e3^MeXM6+oaxp_fIZFBuJBZ)~s*pUV}si#;j6x zOT2wJJn?6k>AU*F$ZD$Q$46%{LOrF-Z5RFauC-bpp+TFTLL4ZvubkvRdKf8~KQxI8 zKp*pNi5SiqR@l&ig$A98Twa!OV@bsGKf#Z(uL*a|)$6RWAF^kxl_Pk3)5R^J;W{ib z@y}jOWJ%&n_mQr2nuf7w@N`k|m&Q4Cq;424w<2Q!bs=ntVidx^U3KG2rV`fw&I`6} z7f#i@muc4Ek^h%p^iPkd8k(&beHK@umzi0Mp}~*HzVrx}n*5{B)R?d1nk(!?B0hWj;t?Iv z9Bh_>14GI^FlGFoy{oklONiA(6(Jk{35BKE)XXmd^U9nER23O6_w=b^DN+Z2*rQzM z$4eOL?4n9o)mpLrbEo@(8k0HDSs>neFADRwvK=+tw8-|X_|*{R1RcdSIgVjCAkz(a zL1KSEx#eupdID^HnwK?WXQ43zn~nY^`L_8$p;=O-n)&@ucMGIwL?F%4k^QAapEbOX zRSfU2>3}w1=5gOw_+Yx_ldL2P|>GNGOxGRJ|M7>q)MFTMV8`t{7Py54mTu zQUJ`q*3<s;OBj)r)j~F{4+k+ z$ZaLaFJ3TtWw-4ojxyJN)fhv`hua&;D)QMrN%|!K9j)w;N2)?*frA5G)h8uURGFQC zedY}-?CdBFscc^izg$j6Wo1Ui>WQ`Zb;GxqG_rlg)q;N`l;B|j69m(yuqH}cer$^s z36J#841lbha+No>V3f2J!I&n5CMY6%R1KA1YhEEU+vbeqKV1-jP!=R#R;#@L#0Abw zo+06lTvwczh%Qodm0SD>(5TF5RxzzDC5cfBfBia-MDUw)=+AOr!8X zJvs9&nk&&eiHKP6`$=TGaz96lW`cKpBMaRJy5-*cx4j-Bhp#dRpi!TFt~FaVcmZ8n zZ&nZ9kJ}Bd9yAerxAT}Te42LXQ=PG&;#9{|NB)#o&y)rqQ=B!i8O5+`Qn5t~T)z^p zySFy*;**&L8@Yp#uc)r$-_R>-#qQquD+;T38C^aF&vV*xRr7;O)mN?JIcrM56y$2D z!wNLj;+w$_fU2@`u4m=J0^R8xG9CDBgC=hI z(RHQD{UxW4ND;s4vC>XFRw(xZ{*qRJYNj~W#UG+`5$iu)epTU8+ETtN8|sKcR{x{n z#yGdSYbbRt*uoN?iR+@D=(Vu?skr4R?0wxBJnYnbTc;eAechU?m&{A}V*7ep69L<< z%3-)TNbP6cmUG6gQaa-J-}U6X;_LgSD2bXQze2O3Z32Cx7d3N`w8m#o-wWC1STz1J zYs0`0-aaorTnXUkA2(0wR&=lTa^!e5?p6L}oOS7|>MK*{$h=17>``^Z8}c<&udhPo z7)6!7MZFx~w`cJ1++Wk1N`ptE3m3cn$%3+w#)@3aH-BeD#W(-!?Drq|)Y3>_e5$JE zRDn{Cjl}H~vp*(?7wz$dDi}iA#3NtvB9QQ1yHlnqZj3?W-*_C*&yp30Mxri-Yj*mm z)J7Y9N21y<@B<=&qU3950SGC%ZB9{K)p`6I%%{=jU_D(v`R$~owl3YEdkF3W;D`ug znt8m|KNJy&;<#apYLnY5hc>Ji_$!iUq#U4z*@m$T(U=?wK>g3F&wsMzCa-GuFXuTR z#N<39;J!MsybHKQHMtu41VjVV)>4n{ENn%oF9rF-{7|kZ?fb*@lh^`dL9NJv`PQxx zV9`51?O1jn*8J+Q{tYGb51&yO&ZI*mD?Ltef>i&mhucLWn+yj875^)aY@cPPs?ey^ObmA`R;Ksa?;~;BX zV%gE(%zHxFnWGda=%P}KIq3eSH^-^YNRTJ$mCnxcY-Rs|2a;aSNe+Ybdq4DvEiWpc zunJ|{Ix2}ww`cpk>ErCX($rlIOij*4BK-Qwo$>zk0JK2koZI>lx{%lNJE0^jGzW7- zWrt5>@v1u`>IPpD(ZBW0^&s$i?X?GP%qq`t+(pdHyk07tCFktLAb9Mi4zFykJZvvd z5oajbi-j`bCvU#Eyd0mpQh0GUnc7ad$Hlx(t>XJ-YeIBr1--vVw8y50m^YH~4-&SN z1**3~#a2^~!d5=}HUNDJHGEvD2jnaEeM>h)lRg1ikw`4)tjj#a1gtrmV^F6xUW+e` z6{haa|4nbA=x>?o7PA(tDwp(%c;SJAN_3x{lHe#4101DKcM~@>fgt9-p?0UkGz##)g z2K7m5fcPurW4p(C!;b6N`a9?YcQEru90DOKr0aE#`!;X&t09GscEem<9le>o_hxc2 z!SKv`BEG1^G@Zi_2|qc@5)4xd*NCDx%Q*AiM}2#p&$-;>0i=rYijZMm)t%&D=a`3 zZr-``&y~{{`lY*j$HoTePFS*%Fz>#qkI9aU)b_w7M%XMcP7BorCyLG2hV{vN@qdy_ zrvXH07KKY+vY-GJ+;G7R{QEqC$sIgqb!z~WZUxDBrF>wPu2qVzaVGU~1G29Z{5}95 zEFT8wYk1_$*SYIj*IV>e_B~cNh%tD%6zFg3Gjsytt*mE4RUu&+p;)Yf`&g$;X9e&Q zQS9%>4GcxhHj<@Xg9C`vcmpT7qZBob2py20<3(B zc+%JI90eN@*~o`$GYrp)`%%xhF!pDxVm?i!fAjL-G^-<5&f9q=ul$*E)Fm&AWR%K? z_rKuHzCqVxu(r{ie^OeCpK_{f=Z5Hj{TaX?1I@KXrzt~}tT7JGT6d=-ZH?><;%sT& z#Lj=MtMrP=lGmg_QZ-&U@;;98MxLA5y8TB5s2JPp*?zghCJ2(ESd#7a{Kd>W{*M5M zE5CYyVlOw~V_LgV6x6wcoHu*-96oEzN0~T(hEM*fwP+{aWlbpK7E@^$R!=ApLk7$& z?7s=`MoV2>Pl1h1w9-+8tD(SX{%@N$aNNMo_qEeFQk2bq3+nu%YZsM*U3-kqGHRVvwHw+_^n8lJyEA>x&T!S~3%Y>KIxg55il zc8Bg9IXBjGs0F2bNYxe*%|;<3EZl${SL2-14lv4yGlx@q@G~HkRLeWoTT92_LqaaG zl7*L}+mo8{qnBk!XT9QHr1|29`R8|jim7&po!33qz-t4$27~3N8LkBlpCDs-pZi=q z$Q*fJ$av8^M#H0o-jB)WHisyOS~1zosPFn;e%l-kV#9v=cgaX5 z8B_W2GX|*E1(HX7Lq*u*Bu#P+U@0&-n0F zAIa+L`M=0ciZ*`sXq)s$RkdV|qD65^)*(WE4g8(`*~%{x&kQ8S@57}Yi&fpPBI1Z` z@49Y_TINi~Y;KgUIsdVh2Y{`=T=xF6ttupo0o8+N>k0`O3nu-=ce!_u|J%1Mj);DD z_8(c3-+lnpwQL?|VzOj~q5d8mdc;=LyC6NQT#Xws>?op_8Fv@=R>^R=b&l5>Uf_tr zDpQL*j2bl72#STz8XmPkpOio4TnmZ(d$nO+gQ1OF2QGyS9^BV^qIn3tOZBOEQ7(x+ zIktD;e$Pvfe~@^90`->?^`y0$4+LfHMFGf7$5AS(G#hzyg8QxWPzx&a)IVp^?7vxK zq%aeX9>iF;N=hwUM(`nqX>ElGnOj-Q$;)_8%Cbb zAp$&QlXIC6n&43`Fz9tXZf3{Emme*_B+T~4h;2g;(V+v2W*LycA zTwS9$ImQOyr@=JdVr1RjZAIqyJsVhRdCqm*-L6pUU9DU&b`Q}p*m*`l=ti+2q3fc@)SYPRjKG!t{r|zCOCv9I0OsQAp~~_1eegb2TdSAn#LixySs(p?rx0)mjJ!Yu)xw!ajnwkba?3c?&>h)}Xawu0P_s&A9>}p)MXUlE2@$h((ee^jq#MTt8 zQcn?R3{G+rr>Cq4Jflhu-PtbKbgLh)XkVt*-O~*tIn0O?`Ivz$$W{CJRgf7Mm2?2e zq56u}R#3J;>~<=<;=lbTl@lVY% zH4fslYy3;#6ls0=7jC^Nn8t-9FtLWb#nK}F5>%eg88{Je8RWpw{n#v3UUqpPAr&+_ z)@1hDm04k8L7Bq8yhb1^r!DYJTlbT5-igpUjeR0Fc`8V;L!9P?xV4Av>ZD0ynrfng zKl}5FuM!&=;;d@H-Eyc73navf1xY3@)_iUV>4SIGKC-%Ig5P{a_cE8XMGP6hMW}Q& zG}U22@1w44npjYo3++62Zk?W`q*p?!B(TADuqgy3tl^&j$g{=F(71zxHg-h7EC1>* z5cFTbPs+42lRf>HWunpUfwtz_^8~~UgPnA}s1s5{X)cWywF0s}nQnCKa9>E( zkZ4<@wwcJN4O+ry!0dFm;--apA_~qZ1)iE@^21)YmAfsCCD3v#)S1@0-B0subX1Aw zC5~M)RgTu5WIm$FF|nME)Ug_s1D+_{7l9aQ`=PL0XMMY6XB+9d>iRkl9H54}&KDoQ z4$O1{+B0i%w~)8q9k3UDkgut}cAD#q9Pt<|VUA8POltSd0ztj2ySlpGxP%w94|aLK`@U$F=lncTU@dM@ClyvL zQyN60>GuK&ImQVUly)SaGC?=&)-LIUb-*%-$xw=38o*1z&Nw z-ZR`R(mL73*eC|4lzi>{T`%>tZ(&xnrq|qa;!fvfHL)kO2~H`UTg<78Vg)CXVl5@& z3b$XZd=16FqjN5Y*5ER0CgMs_Y6Xc29i|GRKt5m~DMSbLt%+#uD9^dqX>#LsZN%-7 za{}vQr@P%{Dm36oZkL9PP^goEXd+h%=f>1zZ4q!r1@j@70*2&`AT!wwTcNv_yn;pD zF@%Qn-NL2g%jaKA1pD(XMC4F%h1E}_7JPMo09vV25bQVi_lG3!Luz``I$B;U;8^z` zjLF?AdK%hP2jTLTBfGH<3NLXF63168mTOXeFz=6v_9@Ccm2;MhK!^!IMc2(cIrF-a zE4j|KPHNU;I^rXp?a(njSu1(Zi(Bhzng`?iwnXEzFWZoL%;d|qBzR}CPS1B{Ca0Ww zGVc(TT5!LAh%@jl!Fr47WmHr}wZ&JUQOv>VJRrEwk)ds* z)R>i406bP|*esq_tvO}2MMPx8LBF8Tzxw;ief&br7Jc8j&1{`gCvaxo?O>tqJ5RSm zQ&|mjz@ZD@DCYxJQXh$$ce=MpKKo6+;i49lo?g>+bG|#(Y2OdOtDGBN*)rdW+z}%| z5KPR^=nt6&F|c2dc>bPeT3r4)t~YF>=TorH9-+SJY+988Is=l&|CDwccDl>( zsGhi#{0*)m6~A&1l|vUKgd84Pn9jNtAwr|Hr7Cys9#ib2imX6TPn8Nz$Fj`zs6e>a zWNx-k5Js=m50|4T+y9kaNWX#`GcW^LGKT)X*q){zef+J(ig<};?t71mv^bK*iA*h%gF(Iy@6}2 zN(61*{?UW7r^Uygy+T)2v~fW*q1$ z0Ft}6Pd*QA6?*a(a$uvH73#jJY+^sBy!2fRk2SBPbrmf)$HKugvdx90CPdHOG>Bo) zD9+%(1Yj1L+qD+?)<4n!|9xgG?p}E9hX)aqX3bHu(MS>|*B#B0Vkk~+Vtdv}oAfa~ zX~`_cV&Ojk`BOrRh`zLCD0Cj~Lac&-xgU>vC}qnS*yR_LdD=_@?8ROniTh_T!Q>)| zo|;4V?emykAhn$e(%n4R>DeW|lHvfNgHd`INJ2Dhp%*DgUM;+JYOH7{2vIu)MWtFG<;loaS;B<4 zo6ydXiA?tHiJrdIh4HY6LdbfQRaU}!)Kd#)Bh}Cc0S`oAfSq9(FFX9*9<`d(b8WaJ zd;j?DXAjY7`T%1hR4eFP|I}n!z3SI5a+}LS5H-WF?6j0?Ve_oI%u(P7KwB`mQ0p*= zcal(R{AygrKWdj$5B7?kj^QQm@zoJRqmYJY9W(yKP6E1gcuRWP4csV4Q2`Gn*4=8$2qXOnFZJnuLMT;EKBdZNwQs7wZ>t+Ujo?pm!M zuLa>Ig|Z=`2NF0bPL`bUPnB?e zeN~+(XdL-W$$sq3pjIkjm0z~&o{rW_+Nqlfpi__i1bUPa_roe=6F)K!4~`6}d{w#U zTg;E6G$&ur3!i`FV;4bkyQk=el}J>{MJ-9zBf7;*Htd@Atiq;X)=+^%(`|Z&=&1vP zG+Tr80n%DVsmmLI{4OibWJkT=_3`o1=Vso0bZ|YWW3gUzJw6Hw;KM+yt&=enzaK6Z5Y|jeoUI4$j8VRKuak)f21qmhF!fXk#7x0jP!F4^m~Pj%HW zb{DpjX9UmS2YZx|ZVbTNk@}9UDejyxmG6KEjhjEVu)c7$C5ALTRQM1;)Ub{+y7o;xR=Aw&(1lVyPa5>8Vxbj58xvHO zyM9pu;7g(Nz8#VwEpQ`=)~C#ej0?5XGIb`^aUsWHW{HHJQeURyMTPc_bJ;N`T0*kn z)9Etwm;kpvk(R@hyrU9pz|Xt$b1`k%HN2hBb@^M$DacARKjFN}$XNrJ)~Y`K15kW} zah9u${;X5JToe3Rd+r#e><~|QEl+Ja^TWQ`OEu08g^dc+M~z{fMtFL5h6k{z5|XJ; zg9F4z@>=hKL8tRX+ zc_AkbDep%>2iV$cetF?9lQl!kRMX4RVCYI}3KHb;`;1^Vk_K@)g5bA)+FMat6EIwU zjVQrIl;?$|g@yU+ph6hvQz>|Ff2oXePZD^PlrO!IZxugC9wOh%A%cT4or?+zQpFSv z5E(P#`S2JzM$)9E?e`Q66m*InxHGUi!J5j311V?eV^v15vnmNZfY+Mk8mgTvXfQBJ zK~6eO@X{`(t^Crl{IEYQ!(F=63tEt&FRt}yA^~Rz44dU$gd&CFvrc8`IQq8B9 zp^zTI(;;EMM`s>GwKci=igr#+#bBOAgo&OcBJf_Uggm9fN$7A;`@!ZauVdZ$Xg`D- zLWD)ZZ~P1q@kl4XBX1Rx%WTeNA#BNW8wvdeT#onQ5vzHNt+J)rhsD2&^&@P-w~gFde2Ugy_Qa1XD=?Q zZai#I5#)mU?3jlpPq1f#@i_e+t(9NzSV$I#Wq|Hgt7+Bl{R<

q)Wg1&lsy0CnGyx2;@xrFijNdBu0~+*qVRZ2nx$%_bYYw$jkQTm zv%uW@-4#V79K!$%!L!3>@ech9gyuM&r2dmWrp5){0V_SW4JPIx*s(f`LTj5i=)Ty1 z&lj#^g}m^mg==gIev~_ViVAxc9`VBx#bN_cagp#lu5}E1Re}KbPIONZAg$RZj{d@1YDnt4-)VNY zdDL`VsA_dAHd)$VMg_%s=w=uXq<-0pDhA3O{Zos^IFNTQ2cPhO+*hgvM>0A43Fah5D(GWkK!CFO#UjTj|}t&mzh9 zH?1Hh3k_1T5$wIh`1;%}I})T2NMJy3MTpcMraQ&)`waRq2y#!iT(#_^L=xPXi{tC$;BH@dL*V zI&}~LMa&yPt0x;QJaVifB&1!Y?-@8d&Cx4z3&{bmTFx8_+Dlv|4tcRg5_4edB&ef^ z)MMkVMaiM~39DCW5AhJycF;%g$^y;EP*8Bt9feQR?@g-6ApfMeu$$Bi_x~Wff=gE# z-!|7X!^buer82}GoaFf;h(QF~H9m?WI*Taek$LC*M<}#&I_Vt87san7ORlLFA(x+y z`bTW^k5eaf#;_5^dbY5!x?k}6e@BtP`s1QmL*aLx+*?YSe&qkWM=s?-x!saN^V;`h%vac{5g{#X(~woT?}x@h=O@`KwvCkf`@epDzbh7G zR-p8KzrB>aX6xxc27PBFoR&Rtq+9Eng-YG$y*bJB^MJmG{|LLtRRfM>Z8KxMQ~9w6 z1Hnx80E{&0@2abkp2Qv}XszpgWcv8m8^^wBp5sLHky&^-lcxEi;q56BWTV*?^Ynob zX^$6QDSbgyI7Zh|zPhoiiST|#uOP*WAY+}r^#e9BhaKG*Wpw3GfyTPlPsf#mIfKap z01Hw7nX;A=!`clBrDfcM7jvFvuaRaQ)Kny>m^S0R8IwNlTW}ZY_u0C<+Z22rN|FQv zgyBCa6|>&YZ>gU$GP%vI>vP>)^Zgjt2jD=?7jJqKR?o;89VN@2k9aWT4Im7rX}1a( zsNgnn?lM5C2zFximX%%wr`;w3RGKTRJcns-s*cISGD4&B=m_lPCJAJ)9;DqAH)a`~&14 z`KYQtqK(8jD#-tjc-Mas^0da1p`OfVw%zUd$QF-Dkd*s2E=OizT$fx@RLKA|f7=hG zJ*Zo^9wJ84`)&WDpNAAZRz`dMbHC;PL#ML+K{cZp6l%Esp10`{|I}l!A3iuEWOW;C z^Z`*B%i?aL_vFo2@2tVKyd#$#*lZ8UXab=@n+t}Qy;8#;FA$<;hSQjJJbtMh(IRUo zIF-N7gP;*m?5Lqkvf(~JgWp0TUTw$uwb&STur$t88HS)1=^`se)NN;5R|q^V$o77{ zGQYALC`1ZH%b?8_gUW0Hf^K@uCiz!1U!w$k2@lxtYst?P-||4-c}H|RsAHYrEv>Vu8=0}wcTMQk zyRpUI7F(XdsP2fluZBw*3vufZF}(;0vU9$sf9_S3O4^dox^@zm&derVM=D+TMYJ}Q zOWsb{ub@QPI~}my#kv8HKe=(eN>I105&RRd75EQ;fr&BC`xZ%w|vpqlAa=SJV_^_e(<6e>YWB3z<9U{ zf*I}{@fGfu4eN~Zj5U%K{1T>k-R3SpzKKW|fywmoUSRZJijOo~BeZ9lLkz&-J*S5c zXpBx!c%DSo0d57aoC|7X>cb^JDad$0WU7Mwh0Ja9Xw?#16g>#B(FM5{wBT#vqoY`J z@bx^8Qd?tN(D0@4L~*wEn+3O!!NCjywsO=JNFNFn%yW!CC11CBF(+p_e}Kbvlzhn| z;?UxWX{a8(edex0WK z7K1o0CnCBDB*zxZh_Yc)mwe0N@6NX!3Cr@`*wIYczHL@&E9n^xk4ooD` zg(p>^c1CRplZoSt#M20p>`_sgx1`Dy58Q`RDD;oPWoLN%_y^+5V^{^1yZT=5-Q~ZFl@g^!0L%k-Mu!y})?(OO2v_9PliSQ}}p; z?UTN;CZdPQHTy>n7#cA z6dHeNB6QaI#o-#4Tz$*N58%pcmAcwmt3+Bs`VK({LN*@%1wreYXXi6@J9oyLHHWtd zR$<*!JrU}ln^eGMtYF_XSlmiysDIie#+CR~3yi{uQ^bYIIH?u0JD+kGTwU<$+N8_Q zrHCsDEymK%!&;J~v-ImXVFLDy52{m~Z|U(S2U zBUd?bb^HUsE;aYsFM}-KpU%S;z$?MD|6%KX?lK}ZkVv9()!`{B!+wQ!)?b@CE zrJDXE_jk%Q^}!2YJk(%HuSW8k0nU&AjxAgM5Vl&0wEQdq`MiEd^0gHVrZKFdnZEL8D)67-iS7c{}z^4j1!6S@pm^1yF>-$Eao&r=Sm|$+0 z)Xlu!*TztbdTvNm*L#D@OFa<@L8K}_q%MH7vnC|mP3)9NiC+ST5vz{!nI9!W&j}aD z9{w~@^qs9kSC0yf__g-70y8VtausX?B83W028bJP)z~MdX9C; zvf|FAt7Sut=c>=?_GwafV8>{Ike4gZjtNxV3ydMIUwXEZ zY*Ln|JCj=+{Phq0l=!qCNZFuyX*0^`%gDh^-aY?h+=W^KZ--QC1sPt04#s;aedJa+ z8B=blkC4`8a()g>Gb+z6c$FynKC?(b10*=W%+Qrn64Jhp@|^SAvS02y2i94LmgDxW zeJk3$8U>4*?-HEvQkb2f8>@ou;dKDc3jA?0Vgm5#V5dk44z|pP?R?X-tGBa6ErVO4 zTcT^>)>XFmx?EVe*}1yZ^yJEI_^WK6OwL!? zS>mvl*E&VjcRLO7c5Tm2bW>n$}sJ@$dU7vXmg zoTjH>CpC-kD+wUBS5ng~Ia_?Pk%Priv>|KuP#XvZ;T7k^Kxp<-vnEvzffTp~7zzr@ zwWYD9b$TBzS5fin&qOMcugB*tb&j-Cg?PJ4`ikS7IpSx6bPcI z*VA7^OWlDeJ$CIC3^O(250AZ4gxkqDO)V3;zJ@onlC=`7hjrq={6w>=>WQ9|)I>QR z7Ph19=pH}l^^vm#u1NCLHF*5#H7%2LggsKvNUL~9YEZS&%;W2%u9{FC@&$U@J_o9I zF8Amuwa>Pdq_-_MTrGr-u?6JS*RO3w)g28#A`x}o3({aG zw^&Ee=iWjEydK4?=kR zIKy^iyH5)c1aiM|Jq@B=ftPJ*WZ6mBB?fpsC~HR8>Ww# z04y_N;%aRPShV;=?#tm(fdcW<-X87;n!XGNMNNT1q)3DgFAdQ%H!d(`m zzr-Xvr=#1ZJns!wkhMhpJgIyzj{lZu$i99`Yk4i6LYr3S7GDqPDHUGLPDlR>cAwbE z-{G(UzAlA=iu35gRsQp2#NX2sh&>GdhVspSb{>(#K884}Pan0@&GgY%aEx%0EkZ+{j7IjhgV%A8D<1Xpq!uIDE?*1_PiJen zPE=?^7$W`pFjvwL311w`=R2f8o9KIr0UE%?YHlO25f-8x!Q;i~ViiA&P$BZg5HNM) z7s+{PJh43+#~^HN2qT?E6sskQ@Y0eFHR?G0HH@!kP|b-*NpyY1$b}EG5Mw3&Mxa5& zY`3`_<5icUijs?+H33|Sm_d#(BeMO#WK7mGdPjmv@juK#z&U-nGKh0rly{&^=A<#YLj07EnZg@+^vXBoCFs+fbw?(AEyVIzFRQSsS#w zq$q2%IboJ)mZ;@?@?t!n5H>mx*Gk4rbyno_AmHmuxFYB6*P}}#LI)cMSp_lNMmPp+a5#h%|=ePZh*p_3wY({uhFzzv|()w!SrvP)FEQ(kva7n!TdES{d0S zW)#H<+`3KkWcUWpvi&r3U2L4N8N~8sj?R_C@v#1&%~%$&j_kBpJR{Ib;{j;;w^oP}(~Wi2tWqr-9Mn?aJ5^MXP_q{_pJ2~vWOLcoAQ z?KCGC1_{UixHnXD{HXKVN>gh4;{-#c4Rm#HA5=SX_I~IDv)dg}EKW+K_hGrh>@xo$ zS*&&dDBF~ZMvi2}^6n8u&LCS~UN8-M%6eVPNm!#F{-JE^{j!2}S}AMQ_!n<&^(JdD z-sh-M=o@lGbh+^LzYET~Pv=8kM-};LWyP6F-Sa_Uv}^-R_3<>%Qxmzmi8yk-yuriz z^%YlaJjIvqJB3YmL_!uxiHU>~AB3}jk>VZ0S|k0mgl??wi4#h@6@ekBk*%Wj5kq#s z7ZZA&N|B9gTf^HHvPE9p6jS=xKD0GQ`U=GET#Q}Gk7+y( z$*T1qD35p+*)HEL6(`r%x1B|8y%cGGp(VAd?-4bt*JNa58vn57ulX1hWDl+qO6`V# zFMSU%v!9Gs6lfpM%_{-Yl!YTa^6?7Z)ROC6>pa*;qS&!ettf@Bw8U0Zt#~heM@ZuZ zl4x&E4Tt~e_W@3Q1<$@Ma1Iv{6F!Q#EhLpCB9Oo)k6;yK&OCvMOqU`81v+;8s|%%D zRE>Ym{sO#-|Jys5egIT|01gr-iVOac75)>Je!geJ3MIOJF^cX{^asF3Fu%?beKt5e z9y3Ie5v3YFW&nHiwqy&cv;6mo8KkdV&YckW*cgG2I~@f_&USPO|CXaMxpc!`NHG`S zS-|Jm2xev$Vhr%K_Z*j_?gJw$*>|01m{8_|JQzI$TSp`?_^RZKOF_k$eN;57e(c51 z;t9KR*Rb!cSFkyCV~MA-Q+9g3ZtR*QEexw<_sG>^+_-PV@#YFzal@XOt*NEl-xdQ6 zz>~~PsgbZhA96qHaw^cD|@o@ zywR~3jMf?Y(seOF2Xjds74=w%IdQ)Lg`E`1pUqxE4A)TH?AF&XgOy6=RJUum_8ZvS z8wtz^gG*b8u?#aRugALD4Q|RPCgx55ou9n;^1S-Lk$sI&M#>8z(cIC(FLPk@(imSpt2Q zR1qaD^3zjJHY~Y6`t|1}RDS<{s@cC;!dxcgU(DEbw#s^$ZFZzF%wa z_qoP2jYha&(`-wKx*jQ z;d;ajSKd9hXS6>659CrDegGt{!>@P6@3{P!Gt*B>#kXk@`@H24vki=G>HCg8S-ZPJ zXxcucV{PY)?uB1rz3cYWnARXOO<%!uSuE_-DjDMLM}D=L;y0dj`!ww!Z9|JK zd3hIz$aVYxur?8up9^2t1 zv9W_WQuUmow389Dup;S<_b{M_GB?PR@@)816>FcQN+XNdyO%VYR`wt=Vx<+`p*oAh z$o`Yjv&!fm5Af}a8hxvh<=BmaI7DD8o{`@@$EC>#l_Fg$6?in+^w@aY$k)hFBDG2& z`(-85tK+Ne!IUDVAsq#6ZEaL)z)8;4&!K$@L!BS$*`5v(dsYAfsi;U91y@s2x<(8B zJ+b6R(!|)5u3b5_NzG{{+b>aMA9wIGWHD?c{X4IVKh%QBlabF&|p}tXDj!=t8I~ldUB|BWa;K~Rt|6t zRz1%#OqHOkqVjX-V}^nGd=jWWu*E5_ptGOQt3^00*HL@YWTvSuE_TPp286O?|8yJu zdsN`xXuyBCx_<_a|APhT*&mu{BrWS$gY;L3xB%_x_VQuf-8*X$P4?T&j{JDWyW1T3 z6v|t~oO7dLnxXD1apyvD4x93rtoOQ04s(b*hXIfXs0t`s%-TDPjh$d>cjy`NPjP;3|v&0r$6 z=lS^l>35&m(KfO$g@wL)Kb}5pq2dJtw(e;g(g*X^5!w|tHg0v7jQy2s!EXsrXtL8h z^F9Y`gE2x%bK@1`uZ2k_&d8zmisw!kHZbfiLdeNcl9ekbxEQ922ghF|nn6c6Khb`QC&wvF_rR1uYN}czyD0Gz zvGF1|A-xJJj*F~dwK#v>ops%CT(_2*)ZFMGMR_bt!IpNO(sBV2|3;y7_b_~4#Py)*P6@b`X2Sud8y(drNJFW^S!lHdm`yL!{rHd>K z0ivLY8Pia9l8;?`8;7%szDs%3hybfn<_unGacGE6Ei^F(wXOSzT3G6kY$#V+#h0cB zA(b41@Fe#p3Glxt)?YuZb&^Q*KG;EqRtuuwlpNl|efTt`8m5QtGL*u83qs|YbpF*uW&m5_cX;8lmWV!QPudCEX`S-lpv zIz4Z*QK2w32xYF1kTu5GU|W?nxOJ_Sn_y^SW4UYLK1PYGsQlE-PoQsL9sark9v9(p zo}IE&&adBs;wnHD!6wLAlh47KQyX<#R{FR=*RWdtfYhFG;kaTxY`~%0>$J2#RJ?5D zri}{nv5wuO&?8>AbBt1dUqLT8M|0~|Csmf|HXerN5+q5I_OV^HfM%6H&IcoXJ?)j6 ziu8{N( zo7uS;TJAkH>qL!y{_NUl>jm5D4KKxbC;pui*1h_8aksark9fu#cUheR=60p!`9W1Eu7Qm3chn zFbLeOBpHcN)bXjdZwT)A%zS1n@U^*pr|1@GwPm-sMa%xgaHP)M;YLiXkk_neQD=l{ zvN2J=BS-dIaIW*Pg=bw|M+gA(F~Q|g-fUY$hDxo)a_4j!0;Qf6onmd?)z zto={PQsh6a|2=W~*DS+-cN^{RN&u4kSqN|W6=9y5+V3lcSAjRew$Y19O~xy)WEF_) z0W{eW7}NgFoGRKK+EbXl-%1N5cdqwTZZ>o7W~RiqHKxQ5&&m*VLg9w-rfe5U_-$FC z?`Tn>@A97EotWJD=Yk&qsZzv;Z;9{sGpe$ySA$`p?6lX0h}Swp3-Qr1-E!j@eQl`m zYx^9r4b!CRoy)9fsX4Q|BH>fI{sFK-RG-L4wAiw(j%e}rXNy^}??L>Q#diDNdUt_{ z${{}h^9a>q;MAaw%C&Trh&-o9AZX3qVs<>4ZYw#=2?KE`V-*u&!iCV9Pv-$!X1;JWH?i+Z0#tX zP8+2+xel+NkQKXc(YiaOcB<39R@>8d6XvX0`D}Fnc|P-88>GmK7f!O1A3oVx{#grgpKZ1w=R4jZH#@7( z;5EXp{{8Ear4HuLh)JQQE4WSv5>}f-5z`cpUp=a$Ecrlm?HXtJ(S!~U&r`)CXXvrp z=z<~e(NZ_5nT_LqJ=bEt8;&Vb8%7Q@F4@GCuK{e@+jyzx*|qJ&O%X-hJV-kk05}8s zJ*gRK3FSgBbB$M7n$yd6ZDQ!;xK7nnb-ah0=jYK2SVPbH9K!9~VQ$LO$_nP+vSCGg zA##jClEf7&w%9rI!0o6y%7b=yzdxVw^Ic%bmf)WHmqQPtvH?h*-h&W^)cwrR{+$(_ zmyFK*9J>0)1=8B z4&oo?hn}sG39g6ht|dvLPfw$WRqvoRw$&a?45@^#O4i$&q!(=Z=?RzNI>jZ9RyT9Xz;ty<#zQwc$Gf~@a!Zo*nF>zYL z)${S^kwo&x&qp!Q9my(=uUz+D);Qgjd$S8Dju%&ZsoB25kH&J`a3j48SBp}-Cui@a zy+fZkB5_Ld5JV4 zBEPd#ccV~XjiAgxJGGoHjDrRA+KGm&_?olXq*usna^IF>E0d#g;u`qgPVKZ7fdSa{_^?3%D;UbG zaV-6S^ZU_Evr4qi5!zkZmuPxhex2-8Av$+cb;tBKUH4ec=%6U0ThRt~Hw;&gs_SYM z=qdDs+;xShfwE%q_R^*oTZzDL!?A1sH1w@PSQs0ksy_1D|TnskUUMp~dU( z7F|)+svY^#c0MKq&w(fmGS}JQSd~;_AD1lOHC!#FXe|Xx4xgbMrUvZojpQd|(1VM; z{n0JHNrf*46b_zc)?M65F6~(B_ZUs7_Hq3jF&Gg=xgU&``YdeD9b8+=)Zgxfec`EV zA#2?UCG~R>ZVBVlexOrd5jtdB-GObJ%I_MRRz~lq%)4!UHWG5U?~;o^^ApwI7zp(T zEPw?f0xHegY@SZ3mw9_HF+XTG#eN=*8&%o}i33K6hNd7rF>m+Ak`A3s>u9u{+~Mq0 zQ{1R`f$1esJnG0e9>KfRiz1Dl4a9 z`YNCpgn63Z*&jF=0-|n|?R0q(5WkOgJLh{i;Ts4rr^WjII!ft%b(E5Ch0G5?=hzPb zW_(b~w!yggH+1g1ht+qZX^Zi9w*m-n?7O?KEf+g2?M0~uee2;Symy4$xW1!J*}f|{ zhBu0|-$LAN?gAGXe*gdo>U-5j=^xF|S}Gk3`~dhQ-LP!M+yCoR?f&bhisK@J%Re>y z{r|?fmUDBuR){FqqOvAnp1^6NjZ9{w6woE|FMc$ukU$d!La#UBn;(5UaZ|Wqp&(4A zkHpO8+1+ua8Ac!Ri`|6h#Kv5xqO;=IGNSEDkPH6Gmlx`$R4wgj#Z|=OKjx;0+s0Bw zw-T$Ss5xV8TfOIKxIa3OyC3`PN< z?nO;bzBbvF(Ttbizp}|q0T#Kg@_8^dMO0-b#}M&vN_cE|S}-Q&SfpEPLbz0Hp_xAb z`wZmVOcAz^E=|dG6z->b(7-jU99=3Z@@#6gPQbS3ADo-OX5n9#>_M-n<6W2P1xH?- z`LM3mtB&?Zu^4A(AtPa+I>2ezX{d=T<7Pg($>a~Yc3Q+bJp`B*cPC9yQ{xWiKiS~ybww!9Pxt)j`H z7X#*AVD}|OLcxV2Ro&dYy1nLfM(#rG!Rt?<_;lX@-M+$OvSM#SY)^${CQr{>Y|uW} z3WS1eJBv1vptta?9R3-t32sy8>PcHJ8b0_Q@$QCPLEDNZT3%3TiHk;Ll#r2L0~e{q zBo|14RD4%_>R^B{`E-kXHTH(v@ro}jA`Wv2mtRka+ELO1Yr;RaKlwDr@`9%BvF(jg z4t&v|SZmtW$_B>~>|DpD{J@+Nyv8E;e)9N^Fqd>;G1|JRTx%Ua>#BfSLes8YT9Ys@M>;Wpu-9rVBa(JJ;RB(Xz zCHkgqhbW?Y(3=X9<+GhT3niQ}eW_?^2JroSQ)eTM-;B0TLfJt9e+th2+==~p{r^tT zmiO-x(kKsq092T-^DZ^|^M1uM%Ks2{)y+7}YU{szRy@{r|5+P47#rkp*rofsjzD>; z1lTfGR=mmvOvMOMpg}UDvsg$Zn<^_%6(`hD;7`Ej=sE)|JW;uBPLHBZ#qXCDTBm(h zM^l#De}P4lWqAm}O3^fXNGBY(1@)SC`tB%r_^Q6v_#HeUcOVrbp5cq&+Ga%E)W>Vh z=QQ`5VeNYS@}OGP`7RMdxI&ZTK5dg-+#`FeHpoX}Ea!%aw!)nm`9r&W-TvTJ0n1HI z?9LU|ww35^Hj7WSP$92ib;jUjC;uAQqrA~%D87UCJS@aX^hD9xcJflQjU+@_msMe9 zg$h}4MDR4{{fkMc*0>US@&tTIPB3IHJB&n=Pc#;_d{$m?FO(pRT1z!tej>X$jy310 znL$K8SJy`t0Fg+fN>|D3GyRa*R|=K~g9lPQ8=t>YMfWTUjns&1Rz}_Ry$XqVluGW{ z0|ka|9knO6+F={Wx%iAKLZ-itf~{~8+COesJrkf}H5X(Q#K@z9tLx5O%~D@c^X2T9 z+#q|2e1yCL`U622s&e(KMc^{aBL$$U^)xHcC|?LZ+Z_b%a1nHN(>PvPZ!kL^uRXp} z2|G4;HY}p^f-z-F8RnfND2BiB^lCWXdaR^7$Ku{I6j@-3dc7EC-gDC*^Of4i|D(LM8;QcvGNPybUH zJBA_m06fDr!fE3h!Y@>s8V#mXY;F%_Dfp@9`E&I4xApJ8d)cRO{vhxEQPV*zu1 z`JIbuo|TUN%qk;iI@?_!@{UrEcdh@i24HQPba{0-QIt6LSd3Ats{ZrT;{}nu_~u3> z&@M?#Ab62PcEuh!e?^1ITZePc)Y)s|dhc?qS^RTLim8FSUAv}cB^+)^AuLVw!1Wr( z0^o(#ms9&~`CS>OaYNncV=MYtl&pJXml%;Zk9EZm33@eEHPT+4>!2eF~;mUu5 zpuzs+tlAStK$m+zK?H*5St0iQ9lRJK5D0=m0wDIST2_1A(SDOU-oN$ke*ZhU9wYxg zt87bW83A+te54I;rw{e$DWbTEb^JMnOkmDNNp>B9k}V{%Q5b=q^D**sGm{X}b=jvE zitMvH`B^z6XwZK}2}uz2<0mBF?|Jq7{~@c*|J)md%7e0Lfq(|;lmF(${i{CXzq(DF z|3?`%64wHad31zm384NW?C#okTQ)`U*NOz1lQ7AEbPgy0-Of(wPI1V9&k6M1{7xw6 zZe%JWXmQ=+sTOIFD)g&C`O^>GnqRlBB@|(`YYZiF|3J zay4i~R-WiILC~&i<%C_ao1|UA<0N%*hT{}!Ke)P?q;WRkw#f7kzzt*L)-C#1@oxyR z{EbiecR81lE8JP%6~rU){nj93`D)@O&~3KMd)nSw( z_7A{2H+=*ry7>O?p5YHb_-KsC4}h+31poEVNCfA6?t?V z+JWP6(`ZDM>$8VH-^>HV%q@~l_&202KLE4{TyxXoHk>#N5@VoA~AFu=}tF0?m)h34oqQ}k-Jc9yMMl2Nz8#RBK4{B7rJ#eIx#(z4XND1~N{S0<0!Rt;?K5YwSUI#TRsy=yWR2gtew7wR0& zdcH`_Tp@a)N1nbfTh=|9KIf2(Md&Tc2*hjvkLUDE@Y2^Z&I>;MG)ZX1T2aI_8kFYQ z;atcbZyDIQr}9$7o7^7v_G9=wD0`M_czOoLtY4AAAfCf()}Wv?Gb@lZ6K)UgRt2RdlcuunOcklwM! ze-d7-<{^*zLT8z|)M}?jM!qX(0(aSj)uN2w{QP3d5FiTEH;nQ!&ZEck@XzGa#w}64 z6__iD=*bJ0WhePYPjx6A9WmQhaHhUW6#G9zT2U{0R6A_t~091Y-@)mY7nIw z1Oz3B(m|?32p}LJy*E)nAvCGdqzF=^g&Gl%7J8LlLeW8bCx8@bp@~4~ARzF)*E`NQ zGv2x1toyB5-;etvYn|jhXXm{8ob0@3@8{XO31xH)a(qUF*f*a*F0FwVy_d4~Uab^n z&@2;LDP|X5hWf1Y*UWkZCwyg%xM>IGe?rQ-vd~DE-RT;A1}CXA3Qd zUf?{fw2|;~kIB-y{tp7XeD4y{H#U8UuBr8!2SYBt_>M#}zwcFvvsxuX#7A{NUz5Hp zn)i_^C04gD6B$7^veArwe9>pA&y_LD-^JUd{#i$Icfc5e>(F=*m`xJorp?3asQcK@b-B4wjZ*63SmG$m9uH*aT_pi34elkqa@lHJ1Noqh(x~F1n&JsFc%g?2QgvP9qxR*?eQDU~Z}$%gv+pq$!v-hT9%P zB(jq~#zY|v(@=u#TZFTcd9}FOLd>QJQwf&dG&{KFY0j}a1v#72Mtg*ouc1P0vJCVX z`A2a;;-3HClM1wz6ZiZURX;<~HD6R}*>1hmatXj6C1GF4)OpZmf8v>SnK`fbNWZOd7Vgul509vV`iNSOHIFm_`<$Q1kFlJlkr$R zG+ZolWQ=*-pMaroNJ*KFW>wf0Pg!rW5_)z4-0I&<()8}Sc?S~@iUsoK=9dO*^DLUu z;_m>EVo&`}_&J{$&kxwZz^;VHl zmIbK?va-xuWLctW-JY%mH-822T_fme2*fA0Q4GY4eo$n1&u-Ja>kNLCPk);HZ8LU~ zw69UJx+2oNxFMV)VskE|a`RkziCf$#guyS|aj6CN=quFlXYeDOj`jis+q!|*E4HW@ zF{5kcba8hu$Yd`}o<8Ujr%$CtQ}aN@4LNMA)gcK7xXa7cJrdl#Zmpt)fxppFo|^?w zNi0O@#TfxEis(mDve%J|n(0_)`UL4SUE9T1Ti438^D#ycUQV(=yO}H|{rA5?C>AKI z4L{cit>iQ5Gv7Swb99YTu=Ve7vs=D%cjmpQpo=0r_l~3K zBP~XG$A4Cvsq&7M`?sW(|D97r<4U}kD>PpF6oaMF@D9i<9^^@bw8^y;2Gd{>_KjJs z!jGaBs4kmcioaRKSTz}OwupuX85FrfX*CqUe=k_Qc-4ITiUKnnNOWN$FFKP67q-aP zStqHks=SI5GiFDayUkdP5Yiale=XVJ!k8yhw1UQVZ55hSo~kX&ZiVlv6OfM4rGN#r z@2{VTuW&Gem9#K8aNa2~Xbq<;F0SS*mf7~Wy-i#k(H$*jEj6@pa-=x%)aeyA&~Enqb@G??P8I7)*UTeRftG zR1uwF*rwqsEWhvJWV15=&^y5jlE|_mBE}F_fZUN!0dHy1AKvXydSLJpI?-+jRjtjZ zb~ZUjNm`A|wM>GRU{|vEN_%cd&$BmyTdP@SKeV4TJcxwT3uqHhuo@@^70ml*K2C0R zv|=cs;eeR4YMqsWzhNtMeA_gxql;909sIFTpx(N;IWk>Y7cc%)9zrM5V(lzIkRfwV z5tndV@Jg_;piTdv`J*kpJ0Yn1DAj5$0%dssp;N}~oWLP!A|HPbI#!`o8JV^he!}du zrsF4%UXpzd?iNF!79XZWmz#R5-INjn9sUeTjw|f*z1{5A>=7KOxlZP8)-o2YI=`==XPNkH#Y5i>3%jm_(ldIwvL0^V^DdpP0Mqq z1jXmfNppQ^5ppbhl#sq4;uD@2Nl``>chFE;Npr3<*yX65BrDu3T&voDhA)S?n0-uT z92)F&0iW#r7}eXxQT8loa(Tne77ksBwrzZK^QXV|~N( zr3m4>FfB1-iZQUF#*=xmmud25x~VR@euv}B1gEx5Zd?G3rIm1fk$!Y@WxHVn|EAm_ zVQ5HOXEdeat3QRB$C()1HzL9_mTd=O&l@!nZ`zfYpfL{fi% zPX9iZ|NVPn9f|cNo`b+WO=q!`C?V-YUS?d{f$*VF^f3r6;~G}k zKZ)pk0z>yf8-$JI#00;02zDYhTDm@X@6n2XepJ(Av)g8ov3I<5P-r`i0EVQ%oQvDo z?}RZuJO*XWvOa;gNla=`@p zkOK&6vYo04rtvH?Nbc&}iYNkR`}d@kG&w(-EDZF+<~?YtpQpNB71?q;j*ryx0~@{gEh;gLXXmYe6xOyb&~D^Gn{!p5U)dj5~G-nuf zWLn6z)X-v4O7RmajJy(eV`UF+4e)St7QupOb(vky)au9d=K5*|P+s=+T4gT0;n?IX z@vGKG8h%dw4iG(D8I~{5bQP3O`Mim$i|{@BYMA58@;g)qL+OGjTW}qD-2DOTS@j0< zvNB%T>b(+$*`wPM*Y%TsB+Scup6UJeE@X3fqM}@2JxHl`r-Mi|CO`6Cb$hlty;z`q zf8OE+tu2Xr=W&BnDt>Lx3^2lRcIVyN!)niBdhXWhNdD-q!EpD)`n(jQ4@=i4-q31R z`Cq{68yY2_x*E`_Jn2}0GRWj7#XidX6 zv+%3k&?g#L;M#g6JB06^(;hO{sX`29nt|GYV!;{pdJHT!gY>t08r_$BI z|Fp$KW20d5k4hvG8tTS<_@rSQ)Z@q(1)I$#0P+Ryw)PARc|A|Rt2^Nq9yw~j`M|4- zWVw=}l#(27M||(z)YS!-awp?IZXne%qWD3lSNc|6w}um>X;U9DoPqY2)H2(iDI*c9 zGLd76FFZP*aG>yU55e`SbBTq@8)l$m>6=Nt$K*d1bt5!fbjj;iJO9hFq$09!Dw`Pb z=pUSE%IC6uT10lxkH0d#BkB-X4uD=kI9T-C3l^NY5V@DrRa|M_Ds*rd!oD z&$kdqe?I-G{s&^yMhVUU065=&;6(}t*)jhT;{R99xqnCBADpFm=LWaM!esI96|gJj z267Z#T!UCCqS!O#kI~T^B}wBJ2P(ndA8F9uQ{Bc#d};_P&KpHRyA0;)O#6zD)R)|2 zJ1^YYKujl15rhTN#X1P{=S;_uMTkXCW>^f?oGaW99DSkz@DmH@k3lCK0Q7#av?H!? zR6Fb#=E$`={vRMemo#Yy~Y@1r!Xx2W973cxS ztp`#4o86(Z3nY~`427qdpSHLg^K?G;1X5S1tcY^}(Z9PPfY57zP$tB>@gd=s@fSM9 zV^A}D#%?HciDIAy?&J#&E3&9g7C8q@Tq(sy_N;kQAYuN;de%UlV22BnoxV!pHVd0* z7~$#q6RzTZ5f=JeUw-Oom_3`fB*Z^fk&`*xV#V1;fErq#yW0I$hrO?eB#5rZeX`Kw zoer4$<>{QZquyePJz*Lr0eOU-PF<+giuPyAg3Lvfs-X%4hd_b7=yM9)*LS6gp|Q4n zqc3-osezz8hwL%vZDPY06LhfJ`7q~)rcZakmw+JVhrw4GdP-snm^zTCFKqr_ zF~B@at!qsM`VjAhQ4|LH#ze(KvzXLjgLxw#)6;ImJ5!G%Tx)d8G6#X=0Re4klu{iI zblo_@Koa;JJgF$NW3*hyCS$U9Yu)dpBFjGK)yD$+tR2{AhKH*mU57CdO*cynW$Z1R zmU&>aSNnZrr>Onj5}T$nIvOFzSdP|GZ9Ke8O7Sx2PwJL@hFncml{MvYZ(#}tKUECg z4|vnc-tPExDBtpYF`~w%Yil;h28S?2;OsnCeq21izYy-E4#H&JVgpF@jS~jt4U((bYH`oInOZ& zQox3hd92>ZjH@0C>FAiGGSX|z`=IxhCSCn%fJg#&=TvkZ1c(+d28&CV;w^qV7QG_Q z4s6|Deh+5eKiTYfh^Q|uOKoSx6Jk|n;ZG{w+O*iy&47I!JWExxLQJX#@{2l~xJ*ki zh?xLmKCo;n|H*00)Rdivn)BEuSRA;M>OU&C=;*0C&kll9rrY@JUHM^7Ji6CyFkn+SBADt*KBcPt)Gwm3pb}{-y7=ghGxp&XaPU z=)%%Ygpeeqj0@zRWRHW~lw^@yTKR(ZAVvF7=LTv3c2mI76a7wAMF2yZv}+dt4|MRM zCYi2Y?0JGs9ee^qKHj}}sRBs<{*3=+Vd|VL9%M+c8|I!t?buSey-VJ|dg!?jo0&D8 zz17MYZCGx6skU|D!0aJ>4_YDr7RUwx5rt`CR4700wEtvGsXu<50UtkqPVV(snOE$h zfZ7Vn*#3b(!UeWo-f_lgCEuER3R4xeG3aa1T5>MOo*}e_)Q1K#Uq>Fy{(xgyAbv3M zE+*UH;}IJsXz~{9<$lh%Fu}56P(CXLUlt~)eTr|H6eJU_zv#c>jmz+#E{DDa z8#R{mXV||XUK?){ToTY&Kt6iM#l3*Kk~N)Pj$JthRphtpMwoVe@D^^@nctpDip!MC zc6H{`AN(RiRxu_dM>X+|7=BK+pVxtxR~~9oryndjGqw&8Noij=wkK=#u{~>Y#>Ew$ zcNdv-290X@ovlIV5Q!G3d{!)z*e63wex^>Ix$7r$vHxa6QI+-!$5(4HX)A&TAKwb? z3J3Q#AZTo+Ltk&xM+SK2P6iju*RF*F>>s))M1E$tfLaHi6o@Izs!y$J)$mD;?$pC| zuOMt|i)IOuQ@PDt^T7^tqTh<1&W-v&!Gnn=oU6@)DAwoign7@wp~zbDvz_ibIej`k z7bo9;0A|}kuesLWXp0&h&&V6YZ_EYb`Da`vx^dEG8xCh-+vo$G#u9}nBdeWC0$Qrm`NUf;Z(;t7;!4pcL^#jP{w4-_4t t{RbZD?|P}H{S_bNe`+88uf~68XDrgbW^Df7c{%@c=-7YqJxs?V{{w3qq1*rf literal 0 HcmV?d00001 diff --git a/sites/all/modules/calendar/help/images/calendar_colors2.jpg b/sites/all/modules/calendar/help/images/calendar_colors2.jpg new file mode 100644 index 0000000000000000000000000000000000000000..ab152e2d3d91227b38ed010088db2ff9bc4b326d GIT binary patch literal 55312 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 z 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

_e*vybGqh0jqIDGOeB;jJ8FufV105n=;iA!se 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 2.0 for Drupal 6 +Calendar 2.0 for Drupal 6 entailed a complete rewrite in order work with Views 2. There are a lot of changes from earlier versions, so I strongly suggest you start with the default calendar view provided and add and edit it to get the results you want. + diff --git a/sites/all/modules/calendar/help/settings.html b/sites/all/modules/calendar/help/settings.html new file mode 100644 index 0000000..39ad8d9 --- /dev/null +++ b/sites/all/modules/calendar/help/settings.html @@ -0,0 +1,7 @@ +

Calendar settings are now all done in the view instead of on a separate settings page in the administration area.

+ +

See the screenshots below for the place to edit the legend colors.

+ +

+ +

\ No newline at end of file diff --git a/sites/all/modules/calendar/includes/calendar.inc b/sites/all/modules/calendar/includes/calendar.inc new file mode 100644 index 0000000..a7c7fa5 --- /dev/null +++ b/sites/all/modules/calendar/includes/calendar.inc @@ -0,0 +1,203 @@ + $item) { + if (empty($item->calendar_start_date) || empty($item->calendar_end_date)) { + continue; + } + $item_start = date_format($item->calendar_start_date, DATE_FORMAT_DATE); + $item_end = date_format($item->calendar_end_date, DATE_FORMAT_DATE); + if (($item_start >= $view->date_info->min_date_date && $item_start <= $view->date_info->max_date_date) + || ($item_end >= $view->date_info->min_date_date && $item_end <= $view->date_info->max_date_date)) { + $values[$item_start][date_format($item->calendar_start_date, 'H:i:s')][] = $item; + } + } + $items = $values; + ksort($items); + + $rows = array(); + $curday = drupal_clone($view->date_info->min_date); + + switch ($view->date_info->granularity) { + case 'year': + $rows = array(); + $view->date_info->mini = TRUE; + for ($i = 1; $i <= 12; $i++) { + $rows[$i] = calendar_build_month($curday, $view, $items); + } + $view->date_info->mini = FALSE; + break; + + case 'month': + $rows = calendar_build_month($curday, $view, $items); + break; + + case 'day': + $rows = calendar_build_day($curday, $view, $items); + break; + + case 'week': + $rows = calendar_build_week($curday, $view, $items); + + // Merge the day names in as the first row. + $rows = array_merge(array(calendar_week_header($view)), $rows); + break; + } + return $rows; + +} + +/** + * Build one month. + */ +function calendar_build_month(&$curday, $view, $items) { + $month = date_format($curday, 'n'); + date_modify($curday, '-' . strval(date_format($curday, 'j')-1) . ' days'); + + $rows = array(); + do { + $rows = array_merge($rows, calendar_build_week($curday, $view, $items, TRUE)); + $curday_date = date_format($curday, DATE_FORMAT_DATE); + $curday_month = date_format($curday, 'n'); + } while ($curday_month == $month && $curday_date <= $view->date_info->max_date_date); + + // Merge the day names in as the first row. + $rows = array_merge(array(calendar_week_header($view)), $rows); + return $rows; +} + +/** + * Build one week row. + */ +function calendar_build_week(&$curday, $view, $items, $check_month = FALSE) { + $curday_date = date_format($curday, DATE_FORMAT_DATE); + $weekdays = calendar_untranslated_days($items, $view); + $today = date_format(date_now(date_default_timezone_name()), DATE_FORMAT_DATE); + $month = date_format($curday, 'n'); + $week = date_week($curday_date); + $first_day = variable_get('date_first_day', 0); + + // move backwards to the first day of the week + $day_wday = date_format($curday, 'w'); + date_modify($curday, '-' . strval((7 + $day_wday - $first_day) % 7) . ' days'); + $curday_date = date_format($curday, DATE_FORMAT_DATE); + + // If we're displaying the week number, add it as the + // first cell in the week. + if (!empty($view->date_info->style_with_weekno) && !in_array($view->date_info->granularity, array('day', 'week'))) { + $url = date_real_url($view, NULL, $view->date_info->year .'-W'. $week); + if (!empty($view->date_info->display_types['week'])) { + $weekno = l($week, $url, array('query' => !empty($view->date_info->append) ? $view->date_info->append : '')); + } + else { + // Do not link week numbers, if Week views are disabled. + $weekno = $week; + } + $rows[$week][] = array( + 'data' => $weekno, + 'id' => $view->name . '-weekno-' . $curday_date, + 'class' => 'week'); + } + for ($i = 0; $i < 7; $i++) { + $curday_date = date_format($curday, DATE_FORMAT_DATE); + $class = strtolower($weekdays[$i] . + ($view->date_info->mini ? ' mini' : '')); + if ($check_month && ($curday_date < $view->date_info->min_date_date || $curday_date > $view->date_info->max_date_date || date_format($curday, 'n') != $month)) { + $class .= ' empty'; + $content = array( + 'date' => '', + 'datebox' => '', + 'empty' => theme('calendar_empty_day', $curday_date, $view), + 'link' => '', + 'all_day' => array(), + 'items' => array(), + ); + } + else { + $content = calendar_build_day($curday, $view, $items); + $class .= ($curday_date == $today ? ' today' : '') . + ($curday_date < $today ? ' past' : '') . + ($curday_date > $today ? ' future' : '') . + (empty($items[$curday_date]) ? ' has-no-events' : ' has-events'); + } + + $rows[$week][] = array( + 'data' => $content, + 'class' => $class, 'id' => $view->name . '-' . $curday_date); + date_modify($curday, '+1 day'); + } + return $rows; +} + +/** + * Build the contents of a single day for the $rows results. + */ +function calendar_build_day($curday, $view, $items) { + $curday_date = date_format($curday, DATE_FORMAT_DATE); + $selected = FALSE; + $max_events = !empty($view->date_info->style_max_items) ? $view->date_info->style_max_items : 0; + $types = array(); + $inner = array(); + $all_day = array(); + $empty = ''; + $link = ''; + $count = 0; + foreach ($items as $date => $day) { + if ($date == $curday_date) { + $count = 0; + $selected = TRUE; + ksort($day); + foreach ($day as $time => $hour) { + foreach ($hour as $key => $item) { + $count++; + $types[$item->type] = $item; + if (!$view->date_info->mini && ($max_events == CALENDAR_SHOW_ALL || $count <= $max_events || ($count > 0 && $max_events == CALENDAR_HIDE_ALL))) { + // Theme the item here unless this is a 'Day' or 'Week' view. + // Day and week views need to do more processing before rendering + // the item, so just past them the unrendered item. + $theme = isset($item->calendar_node_theme) ? $item->calendar_node_theme : 'calendar_'. $view->date_info->granularity .'_node'; + if ($item->calendar_all_day) { + $all_day[] = in_array($view->date_info->calendar_type, array('day', 'week')) ? $item : theme($theme, $item, $view); + } + else { + $key = date_format($item->calendar_start_date, 'H:i:s'); + $inner[$key][] = in_array($view->date_info->calendar_type, array('day', 'week')) ? $item : theme($theme, $item, $view); + } + } + } + } + } + } + ksort($inner); + if (empty($inner) && empty($all_day)) { + $empty = theme('calendar_empty_day', $curday_date, $view); + } + // We have hidden events on this day, use the theme('calendar_multiple_') to show a link. + if ($max_events != CALENDAR_SHOW_ALL && $count > 0 && $count > $max_events && $view->date_info->calendar_type != 'day' && !$view->date_info->mini) { + if ($view->date_info->style_max_items_behavior == 'hide' || $max_events == CALENDAR_HIDE_ALL) { + $all_day = array(); + $inner = array(); + } + $link = theme('calendar_'. $view->date_info->calendar_type .'_multiple_node', $curday_date, $count, $view, $types); + } + + $content = array( + 'date' => $curday_date, + 'datebox' => theme('calendar_datebox', $curday_date, $view, $items, $selected), + 'empty' => $empty, + 'link' => $link, + 'all_day' => $all_day, + 'items' => $inner, + ); + return $content; +} + diff --git a/sites/all/modules/calendar/includes/calendar.views.inc b/sites/all/modules/calendar/includes/calendar.views.inc new file mode 100644 index 0000000..01a9369 --- /dev/null +++ b/sites/all/modules/calendar/includes/calendar.views.inc @@ -0,0 +1,231 @@ +name) { + require_once('./'. drupal_get_path('module', 'date_api') .'/date_api_elements.inc'); + $format = date_limit_format(variable_get('date_format_short', 'm/d/Y - H:i'), array('year', 'month', 'day')); + $date = date_convert_from_custom($_POST['calendar_goto']['date'], $format); + switch ($_POST['calendar_type']) { + case 'year': + $arg = date_pad(date_part_extract($date, 'year'), 4); + break; + case 'month': + $arg = date_pad(date_part_extract($date, 'year'), 4) .'-'. date_pad(date_part_extract($date, 'month')); + break; + case 'week': + $arg = date_pad(date_part_extract($date, 'year'), 4) .'-W'. date_pad(date_week($date)); + break; + default: + $arg = date_pad(date_part_extract($date, 'year'), 4) .'-'. date_pad(date_part_extract($date, 'month')) .'-'. date_pad(date_part_extract($date, 'day')); + break; + + } + drupal_goto(str_replace($_POST['calendar_previous_arg'], $arg, $_POST['view_url'])); + exit(); + } +} + +function calendar_views_pre_view(&$view, &$display_id, &$args) { + // +} + +/** + * @file + * + * Creates calendar displays of Views results. + * + * Create a new calendar by enabling or cloning the default calendar, + * changing the date argument to use the correct date field(s), and setting + * up the year, month, day, week, and block views with the desired styles + * and fields. + * + * Unlike previous versions of the Calendar module, there is just a single + * Date argument instead of year, month, and day arguments. The argument + * value will be YYYY-MM-DD for a day, YYYY-MM for a month, YYYY for a + * year, and YYYY-W99 for a week. There is a default option to set the + * argument to the current date when the argument is empty. + * + * A calendar display creates calendar navigation and links to + * multiple displays for the year, month, day, or week views. The actual + * displays are created by attaching calendar views that use whatever + * styles are desired for those pages. + * + * Calendar views are attachments to create the year, month, day, + * and week displays. They can be set to use any style, either a + * calendar style or any other Views style, like teasers or lists. + * If you don't want to use one of them, don't attach it to + * anything. Only the attached views will show up in the calendar. + * + * A calendar block will create a calendar block for the + * view results. Attach a block view to the block and set up the + * desired style in the block view. + */ +/** + * Implementation of hook_views_plugins + */ +function calendar_views_plugins() { + $path = drupal_get_path('module', 'calendar'); + $theme_path = $path; + if (module_exists('calendar_multiday')) { + $theme_path = drupal_get_path('module', 'calendar_multiday'); + } + + $views_path = drupal_get_path('module', 'views'); + require_once "./$theme_path/theme/theme.inc"; + + $data = array( + 'module' => 'calendar', // This just tells our themes are elsewhere. + 'display' => array( + // Parents are not really displays, just needed so the files can + // be included. + 'parent' => array( + 'no ui' => TRUE, + 'handler' => 'views_plugin_display', + 'path' => "$views_path/plugins", + 'parent' => '', + ), + 'page' => array( + 'no ui' => TRUE, + 'handler' => 'views_plugin_display_page', + 'path' => "$views_path/plugins", + 'parent' => 'parent', + ), + 'block' => array( + 'no ui' => TRUE, + 'handler' => 'views_plugin_display_block', + 'path' => "$views_path/plugins", + 'parent' => 'parent', + ), + 'attachment' => array( + 'no ui' => TRUE, + 'handler' => 'views_plugin_display_attachment', + 'path' => "$views_path/plugins", + 'parent' => 'parent', + ), + 'calendar_attachment' => array( + 'handler' => 'calendar_plugin_display_attachment', + 'path' => "$path/includes", + 'parent' => 'attachment', + 'no ui' => TRUE, + ), + // Main calendar display plugin. + 'calendar' => array( + 'title' => t('Calendar page'), + 'help' => t('Calendar page. Attach Calendar period attachments to this page, set to show the year, month, day, and week views.'), + 'handler' => 'calendar_plugin_display_page', + 'path' => "$path/includes", + 'parent' => 'page', + 'theme' => 'views_view', + 'no ui' => TRUE, + //'no remove' => TRUE, + 'uses hook menu' => TRUE, + 'uses hook block' => FALSE, + 'use ajax' => TRUE, + 'use pager' => FALSE, + 'accept attachments' => TRUE, + 'admin' => t('Calendar page'), + 'help topic' => 'getting-started', + 'js' => array( + 'misc/farbtastic/farbtastic.js', + drupal_get_path('module', 'calendar') .'/js/calendar_colorpicker.js', + ), + ), + // Calendar block display plugin. + 'calendar_block' => array( + 'title' => t('Calendar block'), + 'help' => t('Calendar page. Attach a Calendar period attachment to this block, set to show the year, month, day, or week view.'), + 'handler' => 'calendar_plugin_display_block', + 'path' => "$path/includes", + 'parent' => 'block', + 'theme' => 'views_view', + 'no ui' => TRUE, + //'no remove' => TRUE, + 'uses hook block' => TRUE, + 'use ajax' => TRUE, + 'use pager' => FALSE, + 'use more' => TRUE, + 'accept attachments' => TRUE, + 'admin' => t('Calendar block'), + 'help topic' => 'getting-started', + ), + // Display plugins for calendar displays. + 'calendar_period' => array( + 'title' => t('Calendar period'), + 'help' => t('An attachment for a Year, Month, Day, or Week calendar display, using any style you choose. Attach to a Calendar page and/or a Calendar block.'), + 'handler' => 'calendar_plugin_display_attachment', + 'path' => "$path/includes", + 'file' => 'calendar_plugin_display_attachment.inc', + 'parent' => 'calendar_attachment', + 'theme' => 'views_view', + 'no ui' => TRUE, + //'no remove' => TRUE, + 'use ajax' => TRUE, + 'use pager' => TRUE, + 'admin' => t('Calendar page year, month, week, or day view'), + 'help topic' => 'getting-started', + ), + ), + 'style' => array( + 'parent' => array( + // this isn't really a display but is necessary so the file can + // be included. + 'no ui' => TRUE, + 'handler' => 'views_plugin_style', + 'path' => "$views_path/plugins", + 'parent' => '', + ), + // Style plugin for the navigation. + 'calendar_nav' => array( + 'title' => t('Calendar navigation'), + 'help' => t('Creates back/next navigation and calendar links.'), + 'handler' => 'calendar_plugin_style', + 'path' => "$path/includes", + 'parent' => 'parent', + 'theme' => 'calendar_main', + 'theme file' => 'theme.inc', + 'theme path' => "$theme_path/theme", + 'uses row plugin' => FALSE, + 'uses fields' => TRUE, + 'uses options' => FALSE, + 'type' => 'calendar', // Only used on calendar page or block displays. + 'even empty' => TRUE, + ), + 'calendar_style' => array( + 'title' => t('Calendar'), + 'help' => t('Displays Views results in a calendar.'), + 'handler' => 'calendar_view_plugin_style', + 'path' => "$path/includes", + 'parent' => 'calendar_nav', + 'theme' => 'calendar_month', + 'theme file' => 'theme.inc', + 'theme path' => "$theme_path/theme", + 'additional themes' => array( + 'calendar_year' => 'style', + 'calendar_day' => 'style', + 'calendar_week' => 'style', + 'calendar_mini' => 'style', + ), + 'uses row plugin' => FALSE, + 'uses fields' => TRUE, + 'uses options' => TRUE, + 'type' => 'normal', + 'even empty' => TRUE, + ), + ), + ); + + if (module_exists('calendar_multiday')) { + $data['style']['calendar_style']['additional themes'] += array( + 'calendar_day_overlap' => 'style', + 'calendar_week_overlap' => 'style', + ); + } + + return $data; +} \ No newline at end of file diff --git a/sites/all/modules/calendar/includes/calendar.views_default.inc b/sites/all/modules/calendar/includes/calendar.views_default.inc new file mode 100644 index 0000000..121d52a --- /dev/null +++ b/sites/all/modules/calendar/includes/calendar.views_default.inc @@ -0,0 +1,510 @@ + 'example_event', + * 'description' => 'An example event calendar for the date field.', + * 'path' => 'example_event', + * 'types' => array('example_content_type'), + * 'date_fields' => array('field_example_date'), + * ); + * $options[] = $option; + * variable_set('calendar_default_view_options', $options); + * +*/ +function calendar_views_default_views() { + $views = array(); + + // Construct the default view with default options. + $view = calendar_views_construct(); + $views[$view->name] = $view; + + // Then see if there are any custom calendars to be created + // using variable_get(). + $calendar_options = variable_get('calendar_default_view_options', array()); + + foreach ((array) $calendar_options as $calendar_option) { + $view = calendar_views_construct($calendar_option); + $views[$view->name] = $view; + } + return $views; +} + +/** + * + * Construct a default calendar to match specified options. + * Views calls it without options, so the basic + * default view will use the default values. + * + * @param $options: an optional array of options to + * create default calendars. + * + * Possible options include: + * @param string $name: + * The view name, if empty, defaults to 'calendar'. + * @param string $description: + * The view description, if empty, defaults to generic description. + * @param string $path: + * The view url, if empty, defaults to 'calendar'. + * @param array $types: + * Array of content types to limit the calendar to those types. + * If empty, defaults to no type filter. + * @param array $date_fields: + * Date fields used to filter the calendar. + * If empty, defaults to array('changed') for node.changed. + * @param array $display_fields: + * Fields to display in the calendar. + * If empty, defaults to title and date fields. + * + * @return the default calendar array. + */ +function calendar_views_construct($options = NULL) { + +$name = NULL; +$description = NULL; +$path = NULL; +$types = NULL; +$date_fields = NULL; +$display_fields = NULL; + +if (empty($options)) { + $disabled = TRUE; +} +else { + $disabled = FALSE; + extract($options); +} +if (empty($name)) { + $name = 'calendar'; +} +if (empty($description)) { + $description = 'A multi-dimensional calendar view with back/next navigation.'; +} +if (empty($path)) { + $path = 'calendar'; +} +if (empty($types)) { + $types = array(); +} +if (empty($date_fields)) { + $date_fields = array('changed'); +} +$colors = array(); +$date_link_type = ''; +foreach ($types as $type => $label) { + $colors[0][$type] = '#ffffff'; + $date_link_type = $type; +} +// Can handle core node date fields or CCK date fields. + +$fields = array(); +$alias_fields = $date_fields; +$sort_fields = array(); +$upcoming_fields = array(); + +foreach ($date_fields as $key => $field_name) { + if (substr($field_name, 0, 6) == 'field_') { + $table = 'node_data_'. $field_name; + $alias_fields[$key] = $field_name .'_value'; + $alias = $table .'.'. $field_name .'_value'; + $cck_field = TRUE; + } + else { + $table = 'node'; + $alias_fields[$key] = $field_name; + $alias = $table .'.'. $field_name; + $cck_field = FALSE; + } + $fields[$alias] = $alias; + + // Add a sort for each date field: + $sort_fields[$field_name] = array( + 'order' => 'ASC', + 'delta' => '-1', + 'id' => $field_name . ($cck_field ? '_value' : ''), + 'table' => $table, + 'field' => $field_name . ($cck_field ? '_value' : ''), + 'relationship' => 'none', + ); +} + +// Set up fields section with some of the basic options. +// Won't handle all possible options, but should cover +// the main ones needed for Drupal core and CCK fields. + +if (empty($display_fields)) { + $display_fields = array('title' => array()); + foreach ($date_fields as $field) { + $display_fields[$field] = array(); + } +} + +foreach ($display_fields as $key => $value) { + $cck_field = substr($key, 0, 6) == 'field_' ? TRUE : FALSE; + $date_field = $cck_field && in_array($key, $date_fields) ? TRUE : FALSE; + $display_fields[$key]['label'] = ''; + $display_fields[$key]['link_to_node'] = $key == 'title' ? 1 : 0; + $display_fields[$key]['exclude'] = 0; + $display_fields[$key]['id'] = $date_field ? $key .'_value' : $key; + $display_fields[$key]['field'] = $date_field ? $key .'_value' : $key; + $display_fields[$key]['table'] = $cck_field ? 'node_data_'. $key : 'node'; + $display_fields[$key]['relationship'] = 'none'; + if (in_array($key, array('changed'))) { + $display_fields[$key]['date_format'] = 'small'; + } + elseif ($cck_field) { + $display_fields[$key]['label_type'] = 'none'; + $display_fields[$key]['format'] = 'time'; + $display_fields[$key]['multiple'] = array( + 'group' => 0, + 'multiple_number' => '', + 'multiple_from' => '', + 'multiple_reversed' => 0, + ); + } + // Upcoming and iCal fields should display the whole date, not just time. + $upcoming_fields[$key] = $display_fields[$key]; + $upcoming_fields[$key]['format'] = 'default'; +} + +$filters = array( + 'status' => array( + 'operator' => '=', + 'value' => 1, + 'group' => '0', + 'exposed' => FALSE, + 'expose' => array( + 'operator' => FALSE, + 'label' => '', + ), + 'id' => 'status', + 'table' => 'node', + 'field' => 'status', + 'relationship' => 'none', + ), +); +// Limit to types provided: +if (!empty($types)) { + $filters += array( + 'type' => array( + 'operator' => 'in', + 'value' => drupal_map_assoc(array_keys($types)), + 'group' => '0', + 'exposed' => FALSE, + 'expose' => array( + 'operator' => FALSE, + 'label' => '', + ), + 'id' => 'type', + 'table' => 'node', + 'field' => 'type', + 'relationship' => 'none', + ), + ); +} +// Filters for Upcoming and iCal views: +$upcoming_filters = $filters + array( + 'date_filter' => array( + 'operator' => '>=', + 'value' => array( + 'value' => NULL, + 'min' => NULL, + 'max' => NULL, + 'default_date' => 'now', + 'default_to_date' => '', + ), + 'group' => '0', + 'exposed' => FALSE, + 'expose' => array( + 'operator' => FALSE, + 'label' => '', + ), + 'date_fields' => $fields, + 'granularity' => 'day', + 'form_type' => 'date_select', + 'default_date' => 'now', + 'default_to_date' => '', + 'id' => 'date_filter', + 'table' => 'node', + 'field' => 'date_filter', + 'override' => array( + 'button' => 'Use default', + ), + 'relationship' => 'none', + ), +); + +$view = new view; +$view->name = $name; +$view->description = $description; +$view->tag = 'Calendar'; +$view->view_php = ''; +$view->base_table = 'node'; +$view->is_cacheable = FALSE; +$view->api_version = 2; +$view->disabled = $disabled; /* Edit this to true to make a default view disabled initially */ + +// Defaults. +$handler = $view->new_display('default', 'Defaults', 'default'); +$handler->override_option('fields', $display_fields); +$handler->override_option('sorts', $sort_fields); + +$handler->override_option('arguments', array( + 'date_argument' => array( + 'default_action' => 'default', + 'style_plugin' => 'default_summary', + 'style_options' => array(), + 'wildcard' => 'all', + 'wildcard_substitution' => 'All', + 'title' => '', + 'default_argument_type' => 'date', + 'default_argument' => '', + 'validate_type' => 'none', + 'validate_fail' => 'not found', + 'date_fields' => $fields, + 'year_range' => '-3:+3', + 'date_method' => 'OR', + 'granularity' => 'month', + 'id' => 'date_argument', + 'table' => 'node', + 'field' => 'date_argument', + 'relationship' => 'none', + 'default_argument_user' => 0, + 'default_argument_fixed' => '', + 'default_argument_php' => '', + 'validate_argument_node_type' => array(), + 'validate_argument_node_access' => 0, + 'validate_argument_nid_type' => 'nid', + 'validate_argument_vocabulary' => array( + ), + 'validate_argument_type' => 'tid', + 'validate_argument_php' => '', + 'override' => array( + 'button' => 'Override', + ), + 'default_options_div_prefix' => '', + ), +)); +$handler->override_option('filters', $filters); +$handler->override_option('access', array( + 'type' => 'none', + 'role' => array(), + 'perm' => '', +)); +$handler->override_option('title', 'Calendar'); +if (!empty($header)) { + $handler->override_option('header', $header); + // The only format we can be sure of is filtered. + $handler->override_option('header_format', '1'); +} +$handler->override_option('header_empty', 1); +$handler->override_option('items_per_page', 0); +$handler->override_option('use_more', 0); +$handler->override_option('style_plugin', 'calendar_nav'); +$handler->override_option('style_options', array( +)); + +// Calendar page. +$handler = $view->new_display('calendar', 'Calendar page', 'calendar_1'); +$handler->override_option('style_options', array()); +$handler->override_option('path', $path); +$handler->override_option('menu', array( + 'type' => 'none', + 'title' => '', + 'weight' => 0, + 'name' => 'navigation', +)); +$handler->override_option('tab_options', array( + 'type' => 'none', + 'title' => '', + 'weight' => 0, +)); +$handler->override_option('calendar_colors', array($colors)); +$handler->override_option('calendar_colors_vocabulary', array()); +$handler->override_option('calendar_colors_taxonomy', array()); +$handler->override_option('calendar_colors_group', array()); +$handler->override_option('calendar_popup', 0); +$handler->override_option('calendar_date_link', $date_link_type); +// Calendar block. +$handler = $view->new_display('calendar_block', 'Calendar block', 'calendar_block_1'); +$handler->override_option('style_options', array()); +$handler->override_option('block_description', 'Calendar'); +$handler->override_option('block_caching', -1); + +// Year view. +$handler = $view->new_display('calendar_period', 'Year view', 'calendar_period_1'); +$handler->override_option('style_plugin', 'calendar_style'); +$handler->override_option('style_options', array( + 'display_type' => 'year', + 'name_size' => 1, + 'max_items' => 0, +)); +$handler->override_option('attachment_position', 'after'); +$handler->override_option('inherit_arguments', TRUE); +$handler->override_option('inherit_exposed_filters', TRUE); +$handler->override_option('displays', array( + 'calendar_1' => 'calendar_1', + 'default' => 0, + 'calendar_block_1' => 0, +)); +$handler->override_option('calendar_type', 'year'); + +// Month view. +$handler = $view->new_display('calendar_period', 'Month view', 'calendar_period_2'); +$handler->override_option('style_plugin', 'calendar_style'); +$handler->override_option('style_options', array( + 'display_type' => 'month', + 'name_size' => '99', + 'with_weekno' => '1', + 'date_fields' => NULL, + 'max_items' => 0, +)); + +if (module_exists('calendar_multiday')) { + $handler->override_option['style_options']['multiday_theme'] = 1; +} + +$handler->override_option('attachment_position', 'after'); +$handler->override_option('inherit_arguments', TRUE); +$handler->override_option('inherit_exposed_filters', TRUE); +$handler->override_option('displays', array( + 'calendar_1' => 'calendar_1', + 'default' => 0, + 'calendar_block_1' => 0, +)); +$handler->override_option('calendar_type', 'month'); + +// Day view. +$handler = $view->new_display('calendar_period', 'Day view', 'calendar_period_3'); +$handler->override_option('style_plugin', 'calendar_style'); +$handler->override_option('style_options', array( + 'name_size' => '99', + 'with_weekno' => 0, + 'max_items' => 0, + 'max_items_behavior' => 'more', + 'groupby_times' => 'hour', + 'groupby_times_custom' => '', + 'groupby_field' => '', +)); + +if (module_exists('calendar_multiday')) { + $handler->override_option['style_options']['theme_style'] = 1; +} + +$handler->override_option('attachment_position', 'after'); +$handler->override_option('inherit_arguments', TRUE); +$handler->override_option('inherit_exposed_filters', TRUE); +$handler->override_option('displays', array( + 'calendar_1' => 'calendar_1', + 'default' => 0, + 'calendar_block_1' => 0, +)); +$handler->override_option('calendar_type', 'day'); + +// Week view. +$handler = $view->new_display('calendar_period', 'Week view', 'calendar_period_4'); +$handler->override_option('style_plugin', 'calendar_style'); +$handler->override_option('style_options', array( + 'name_size' => '99', + 'with_weekno' => 0, + 'max_items' => 0, + 'max_items_behavior' => 'more', + 'groupby_times' => 'hour', + 'groupby_times_custom' => '', + 'groupby_field' => '', +)); + +if (module_exists('calendar_multiday')) { + $handler->override_option['style_options']['theme_style'] = 1; +} + +$handler->override_option('attachment_position', 'after'); +$handler->override_option('inherit_arguments', TRUE); +$handler->override_option('inherit_exposed_filters', TRUE); +$handler->override_option('displays', array( + 'calendar_1' => 'calendar_1', + 'default' => 0, + 'calendar_block_1' => 0, +)); +$handler->override_option('calendar_type', 'week'); + +// Block view. +$handler = $view->new_display('calendar_period', 'Block view', 'calendar_period_5'); +$handler->override_option('style_plugin', 'calendar_style'); +$handler->override_option('style_options', array( + 'display_type' => 'month', + 'name_size' => '1', +)); +$handler->override_option('attachment_position', 'after'); +$handler->override_option('inherit_arguments', TRUE); +$handler->override_option('inherit_exposed_filters', TRUE); +$handler->override_option('displays', array( + 'calendar_1' => 0, + 'default' => 0, + 'calendar_block_1' => 'calendar_block_1', +)); +$handler->override_option('calendar_type', 'month'); + + +// iCal feed. +if (module_exists('calendar_ical')) { +$handler = $view->new_display('calendar_ical', 'iCal feed', 'calendar_ical_1'); +$handler->override_option('arguments', array()); +$handler->override_option('filters', $upcoming_filters); +$handler->override_option('style_plugin', 'ical'); +$handler->override_option('style_options', array( + 'mission_description' => FALSE, + 'description' => '', + 'summary_field' => 'node_title', + 'description_field' => '', + 'location_field' => '', +)); +$handler->override_option('row_plugin', ''); +$handler->override_option('path', $path .'/ical'); +$handler->override_option('menu', array( + 'type' => 'none', + 'title' => '', + 'weight' => 0, + 'name' => 'navigation', +)); +$handler->override_option('tab_options', array( + 'type' => 'none', + 'title' => '', + 'weight' => 0, +)); +$handler->override_option('displays', array( + 'calendar_1' => 'calendar_1', + 'default' => 0, + 'calendar_block_1' => 'calendar_block_1', +)); +$handler->override_option('sitename_title', FALSE); +} + +// Upcoming events block. +$handler = $view->new_display('block', 'Upcoming', 'block_1'); +$handler->override_option('fields', $upcoming_fields); +$handler->override_option('arguments', array()); +$handler->override_option('filters', $upcoming_filters); +$handler->override_option('use_more', 1); +$handler->override_option('items_per_page', 5); +$handler->override_option('style_plugin', 'list'); +$handler->override_option('style_options', array( + 'grouping' => '', + 'type' => 'ul', +)); +$handler->override_option('title', 'Upcoming'); +$handler->override_option('block_description', 'Upcoming'); +$handler->override_option('block_caching', -1); + +return $view; +} diff --git a/sites/all/modules/calendar/includes/calendar_plugin_display_attachment.inc b/sites/all/modules/calendar/includes/calendar_plugin_display_attachment.inc new file mode 100644 index 0000000..c63390d --- /dev/null +++ b/sites/all/modules/calendar/includes/calendar_plugin_display_attachment.inc @@ -0,0 +1,242 @@ +view->date_info->forbid)) { + return ''; + } + return $this->view->style_plugin->render($this->view->result); + } + + /** + * Create an array of possible display periods. + */ + function display_types($type = 'month') { + $types = calendar_display_types(); + return $types[$type]; + } + + /** + * Identify the period of this display. + */ + function calendar_type() { + $types = calendar_display_types(); + $default = $this->get_option('calendar_type'); + if (!array_key_exists($default, $types)) $default = 'month'; + return $default; + } + + + /** + * Inspect argument and view information to see which calendar + * period we should show. The argument tells us what to use + * if there is no value, the view args tell us what to use + * if there are values. + */ + function display_granularity($display_id) { + + $arguments = $this->view->get_items('argument', $display_id); + $wildcard = ''; + $argument = ''; + $default_granularity = ''; + $i = 0; + foreach ($arguments as $argument) { + if ($argument['id'] == 'date_argument') { + $pos = $i; + $default_granularity = $argument['granularity']; + $wildcard = $argument['wildcard']; + $argument = !empty($this->view->args) && !empty($this->view->args[$pos]) ? $this->view->args[$pos] : ''; + break; + } + $i++; + } + // TODO Anything else we need to do for 'all' arguments? + if ($argument == $wildcard) { + $view_granularity = $default_granularity; + } + elseif (!empty($argument)) { + require_once('./'. drupal_get_path('module', 'date_api') .'/date_api_sql.inc'); + $date_handler = new date_sql_handler(); + $view_granularity = $date_handler->arg_granularity($argument); + } + else { + $view_granularity = $default_granularity; + } + return $view_granularity; + } + + /** + * Display validation. + */ + function validate() { + $errors = parent::validate(); + + $arguments = $this->display->handler->get_option('arguments'); + if (!in_array('date_argument', array_keys($arguments))) { + if (empty($this->view->date_info->arg_missing)) { + $errors[] = t("A Calendar period display will not work without a Date argument."); + } + $this->view->date_info->arg_missing = TRUE; + } + elseif ($arguments['date_argument']['default_action'] != 'default' || $arguments['date_argument']['default_argument_type'] != 'date') { + if (empty($this->view->date_info->arg_missing_default)) { + $errors[] = calendar_errors('missing_argument_default'); + } + $this->view->date_info->arg_missing_default = TRUE; + } + + return $errors; + } + + /** + * Attach only the appropriate displays for the current argument. + */ + function attach_to($display_id) { + $display_granularity = $this->calendar_type(); + $view_granularity = $this->display_granularity($display_id); + + // If this is not the right display to show, + // don't attach it, just exit. + if ($view_granularity != $display_granularity) { + unset($this->display); + return; + } + + $this->view->date_info->parent_id = $display_id; + + // See if we're attaching to a block rather than a page. + if (substr($display_id, 0, 14) == 'calendar_block') { + $this->view->date_info->mini = TRUE; + $this->view->date_info->block = TRUE; + $this->view->date_info->calendar_popup = FALSE; + if (!isset($this->view->date_info->block_identifier)) { + $this->view->date_info->block_identifier = 'mini'; + } + } + elseif (substr($display_id, 0, 9) == 'calendar_') { + $this->view->date_info->calendar_colors = $this->view->display[$display_id]->handler->options['calendar_colors']; + $this->view->date_info->calendar_colors_taxonomy = $this->view->display[$display_id]->handler->options['calendar_colors_taxonomy']; + $this->view->date_info->calendar_colors_group = $this->view->display[$display_id]->handler->options['calendar_colors_group']; + $this->view->date_info->calendar_popup = $this->view->display[$display_id]->handler->options['calendar_popup']; + $this->view->date_info->calendar_date_link = $this->view->display[$display_id]->handler->options['calendar_date_link']; + } + parent::attach_to($display_id); + } + + function pre_execute() { + // Make sure parent function is called so things like items per page get set. + parent::pre_execute(); + $this->view->date_info->display_granularity = $this->calendar_type(); + $this->view->date_info->calendar_type = $this->calendar_type(); + } + + function query() { + // If we are using legend colors based on taxonomy, make sure the + // node vid field is added to the query so the theme can use it. + if (!empty($this->view->date_info->calendar_colors_taxonomy)) { + if (empty($this->additional_fields)) $this->additional_fields = array(); + $this->view->query->add_field('node', 'vid'); + } + parent::query(); + } + + /** + * Override some of the parent options. + */ + function options(&$display) { + parent::options($display); + $display['inherit_argments'] = TRUE; + $display['inherit_filters'] = TRUE; + $display['attachment_position'] = 'after'; + } + + /** + * Add custom option definitions. + */ + function option_definition() { + $options = parent::option_definition(); + $options['calendar_type'] = array('default' => $this->calendar_type()); + return $options; + } + + function options_form(&$form, &$form_state) { + // It is very important to call the parent function here: + parent::options_form($form, $form_state); + + switch ($form_state['section']) { + case 'calendar_type': + $form['#title'] .= t('Calendar period'); + $form['calendar_type'] = array( + '#type' => 'select', + '#description' => t('Select the calendar time period for this display.'), + '#default_value' => $this->calendar_type(), + '#options' => calendar_display_types(), + ); + break; + } + } + + /** + * Perform any necessary changes to the form values prior to storage. + * There is no need for this function to actually store the data. + */ + function options_submit($form, &$form_state) { + // It is very important to call the parent function here: + parent::options_submit($form, $form_state); + switch ($form_state['section']) { + case 'calendar_type': + $this->set_option($form_state['section'], $form_state['values'][$form_state['section']]); + break; + } + } + + /** + * Provide the summary for attachment options in the views UI. + * + * This output is returned as an array. + */ + function options_summary(&$categories, &$options) { + parent::options_summary($categories, $options); + $types = calendar_display_types(); + $categories['calendar_settings'] = array( + 'title' => t('Calendar settings'), + ); + + $options['calendar_type'] = array( + 'category' => 'calendar_settings', + 'title' => t('Calendar period'), + 'value' => $types[$this->calendar_type()], + ); + } + + /** + * Take away the option to change these values. + */ + function defaultable_sections($section = NULL) { + if (in_array($section, array('inherit_argments', 'inherit_filters', 'attachment_position',))) { + return FALSE; + } + return parent::defaultable_sections($section); + } + +} diff --git a/sites/all/modules/calendar/includes/calendar_plugin_display_block.inc b/sites/all/modules/calendar/includes/calendar_plugin_display_block.inc new file mode 100644 index 0000000..a5b6e8d --- /dev/null +++ b/sites/all/modules/calendar/includes/calendar_plugin_display_block.inc @@ -0,0 +1,78 @@ +display->handler->get_option('arguments'); + if (!in_array('date_argument', array_keys($arguments))) { + if (empty($this->view->date_info->arg_missing)) { + $errors[] = t("The Calendar period display '@display_title' will not work without a Date argument.", array('@display_title' => $this->definition['title'])); + } + $this->view->date_info->arg_missing = TRUE; + } + elseif ($arguments['date_argument']['default_action'] != 'default' || $arguments['date_argument']['default_argument_type'] != 'date') { + if (empty($this->view->date_info->arg_missing_default)) { + $errors[] = calendar_errors('missing_argument_default'); + } + $this->view->date_info->arg_missing_default = TRUE; + } + return $errors; + } + + function get_style_type() { return 'calendar'; } + + function defaultable_sections($section = NULL) { + if (in_array($section, array('style_plugin', 'row_options', 'row_plugin', 'items_per_page'))) { + return FALSE; + } + return parent::defaultable_sections($section); + } + + /** + * Override some of the parent options. + */ + function options(&$display) { + parent::options($display); + $display['style_plugin'] = 'calendar_nav'; + $display['items_per_page'] = 0; + $display['row_plugin'] = ''; + $display['defaults']['style_plugin'] = FALSE; + $display['defaults']['style_options'] = FALSE; + $display['defaults']['items_per_page'] = FALSE; + $display['defaults']['row_plugin'] = FALSE; + $display['defaults']['row_options'] = FALSE; + } + + /** + * The display block handler returns the structure necessary for a block. + * + * TODO This can be removed when the patch at http://drupal.org/node/290328 + * gets into an official release. + */ + function execute() { + // Prior to this being called, the $view should already be set to this + // display, and arguments should be set on the view. + $info['content'] = $this->view->render(); + $info['subject'] = filter_xss_admin($this->view->get_title()); + if (!empty($this->view->result) || $this->get_option('empty') || !empty($this->view->style_plugin->definition['even empty'])) { + return $info; + } + } +} diff --git a/sites/all/modules/calendar/includes/calendar_plugin_display_page.inc b/sites/all/modules/calendar/includes/calendar_plugin_display_page.inc new file mode 100644 index 0000000..3dd6b1b --- /dev/null +++ b/sites/all/modules/calendar/includes/calendar_plugin_display_page.inc @@ -0,0 +1,297 @@ +view->date_info->forbid)) { + drupal_not_found(); + exit; + } + return parent::render(); + } + + /** + * Display validation. + */ + function validate() { + $errors = parent::validate(); + + $arguments = $this->display->handler->get_option('arguments'); + if (!in_array('date_argument', array_keys($arguments))) { + if (empty($this->view->date_info->arg_missing)) { + $errors[] = t("The Calendar display '@display_title' will not work without a Date argument.", array('@display_title' => $this->definition['title'])); + } + $this->view->date_info->arg_missing = TRUE; + } + elseif ($arguments['date_argument']['default_action'] != 'default' || $arguments['date_argument']['default_argument_type'] != 'date') { + if (empty($this->view->date_info->arg_missing_default)) { + $errors[] = calendar_errors('missing_argument_default'); + } + $this->view->date_info->arg_missing_default = TRUE; + } + + return $errors; + } + + function get_style_type() { return 'calendar'; } + + function defaultable_sections($section = NULL) { + if (in_array($section, array('style_plugin', 'row_options', 'row_plugin', 'items_per_page'))) { + return FALSE; + } + return parent::defaultable_sections($section); + } + + /** + * Override some of the parent options. + */ + function options(&$display) { + parent::options($display); + $display['style_plugin'] = 'calendar_nav'; + $display['items_per_page'] = 0; + $display['row_plugin'] = ''; + $display['defaults']['style_plugin'] = FALSE; + $display['defaults']['style_options'] = FALSE; + $display['defaults']['row_plugin'] = FALSE; + $display['defaults']['row_options'] = FALSE; + $display['defaults']['items_per_page'] = FALSE; + } + + /** + * Add custom option definitions. + */ + function option_definition () { + $options = parent::option_definition(); + $options['calendar_colors'] = array('default' => array()); + $options['calendar_colors_vocabulary'] = array('default' => array()); + $options['calendar_colors_taxonomy'] = array('default' => array()); + $options['calendar_colors_group'] = array('default' => array()); + $options['calendar_popup'] = array('default' => 0); + $options['calendar_date_link'] = array('default' => ''); + return $options; + } + + /** + * Provide the summary for attachment options in the views UI. + * + * This output is returned as an array. + */ + function options_summary(&$categories, &$options) { + // It is very important to call the parent function here: + parent::options_summary($categories, $options); + + $categories['calendar_settings'] = array( + 'title' => theme('advanced_help_topic', 'calendar', 'settings') . t('Calendar settings'), + ); + + $colors = $this->get_option('calendar_colors'); + $colors_taxonomy = $this->get_option('calendar_colors_taxonomy'); + $options['calendar_colors'] = array( + 'category' => 'calendar_settings', + 'title' => t('Legend Content Types'), + 'value' => t('Edit'), + ); + $options['calendar_colors_vocabulary'] = array( + 'category' => 'calendar_settings', + 'title' => t('Legend Vocabularies'), + 'value' => t('Edit'), + ); + $options['calendar_colors_taxonomy'] = array( + 'category' => 'calendar_settings', + 'title' => t('Legend Terms'), + 'value' => t('Edit'), + ); + if (function_exists('og_all_groups_options')) { + $colors_group = $this->get_option('calendar_colors_group'); + $options['calendar_colors_group'] = array( + 'category' => 'calendar_settings', + 'title' => t('Legend Groups'), + 'value' => t('Edit'), + ); + } + $popup_options = $this->popup_options(); + $default = $this->get_option('calendar_popup'); + $options['calendar_popup'] = array( + 'category' => 'calendar_settings', + 'title' => t('Date changer'), + 'value' => isset($default) ? $popup_options[$default] : $popup_options[0], + ); + $default = $this->get_option('calendar_date_link'); + $options['calendar_date_link'] = array( + 'category' => 'calendar_settings', + 'title' => t('Add new date link'), + 'value' => !empty($default) ? check_plain(node_get_types('name', $default)) : t('None'), + ); + + } + + function popup_options() { + return array(0 => t('No'), 1 => t('Yes')); + } + + function options_form(&$form, &$form_state) { + // It is very important to call the parent function here: + parent::options_form($form, $form_state); + + switch ($form_state['section']) { + case 'calendar_popup': + $form['#title'] .= t('Date changer'); + $form['calendar_popup'] = array( + '#type' => 'radios', + '#default_value' => $this->get_option('calendar_popup'), + '#options' => $this->popup_options(), + '#description' => t('Display a popup calendar date selector?'), + ); + break; + + case 'calendar_date_link': + $form['#title'] .= t('Add new date link'); + $form['calendar_date_link'] = array( + '#type' => 'radios', + '#default_value' => $this->get_option('calendar_date_link'), + '#options' => array('' => t('No link')) + node_get_types('names'), + '#description' => t('Display a link to add a new date of the specified content type. Displayed only to users with appropriate permissions.'), + ); + break; + + case 'calendar_colors': + $method = 'types'; + // TODO Move the embedded styles other than the color into a stylesheet. + $form['#title'] .= t('Content Type Legend Colors'); + $form['calendar_colors']['#tree'] = TRUE; + $form['calendar_colors']['#prefix'] .= '

'. t('Set a hex color value (like #ffffff) to use in the calendar legend for each content type. Types with empty values will have no stripe in the calendar and will not be added to the legend.') .'

'; + $form['calendar_colors']['colorpicker'] = array( + '#type' => 'calendar_colorpicker', + '#prefix' => '
', + '#suffix' => '
', + ); + $colors = $this->get_option('calendar_colors'); + + switch ($method) { + case 'types': + $color_types = node_get_types('names'); + break; + } + foreach ($color_types as $key => $name) { + $form['calendar_colors']['color'][$key] = array( + '#title' => $name, + '#type' => 'calendar_colorfield', + '#default_value' => isset($colors[$key]) ? $colors[$key] : '#ffffff', + '#calendar_colorpicker' => 'calendar-colors-colorpicker', + '#prefix' => '
', + '#suffix' => '
', + ); + } + $form['calendar_colors']['color']['#suffix'] = '
'; + break; + + case 'calendar_colors_vocabulary': + $taxonomies = taxonomy_get_vocabularies(); + $options = array(); + foreach ($taxonomies as $vid => $vocab) { + $options[$vid] = $vocab->name; + } + $colors_vocabulary = $this->get_option('calendar_colors_vocabulary'); + $form['#title'] .= t('Vocabulary Legend Types'); + $form['calendar_colors_vocabulary'] = array( + '#type' => 'checkboxes', + '#default_value' => isset($colors_vocabulary) ? $colors_vocabulary : array(), + '#multiple' => TRUE, + '#options' => $options, + ); + $form['calendar_colors_vocabulary']['#prefix'] .= '
'. t('Select vocabularies to use for setting calendar legend colors by taxonomy term. This works best for vocabularies with only a limited number of possible terms.') .'
'; + break; + + case 'calendar_colors_taxonomy': + $taxonomies = (array) $this->get_option('calendar_colors_vocabulary'); + $colors_taxonomy = $this->get_option('calendar_colors_taxonomy'); + $form['#title'] .= t('Taxonomy Legend Colors'); + $form['calendar_colors_taxonomy']['#prefix'] = ''; + if (empty($taxonomies)) { + $form['calendar_colors_taxonomy']['#prefix'] .= '
'. t('Please select Legend vocabularies first!') .'
'; + } + $form['calendar_colors_taxonomy']['#prefix'] .= '

'. t('Set a hex color value (like #ffffff) to use in the calendar legend for each taxonomy term. Terms with empty values will have no stripe in the calendar and will not be added to the legend.') .'

'; + $form['calendar_colors_taxonomy']['#tree'] = TRUE; + $form['calendar_colors_taxonomy']['colorpicker'] = array( + '#type' => 'calendar_colorpicker', + '#prefix' => '
', + '#suffix' => '
', + ); + foreach ($taxonomies as $vid => $taxonomy){ + $vocab = taxonomy_get_tree($vid); + foreach ($vocab as $tid => $term){ + $form['calendar_colors_taxonomy']['color'][$term->tid] = array( + '#title' => t($term->name), + '#type' => 'calendar_colorfield', + '#default_value' => isset($colors_taxonomy[$term->tid]) ? $colors_taxonomy[$term->tid] : '#ffffff', + '#calendar_colorpicker' => 'calendar-colors-taxonomy-colorpicker', + '#prefix' => '
', + '#suffix' => '
', + ); + } + } + $form['calendar_colors_taxonomy']['color']['#suffix'] = '
'; + break; + + case 'calendar_colors_group': + $colors_group = $this->get_option('calendar_colors_group'); + $form['#title'] .= t('Group Legend Colors'); + $form['calendar_colors_group']['#prefix'] = ''; + $form['calendar_colors_group']['#prefix'] .= '

' . t('Set a hex color value (like #ffffff) to use in the calendar legend for each group. Groups with empty values will have no stripe in the calendar and will not be added to the legend.') .'

'; + $form['calendar_colors_group']['#tree'] = TRUE; + $form['calendar_colors_group']['colorpicker'] = array( + '#type' => 'calendar_colorpicker', + '#prefix' => '
', + '#suffix' => '
', + ); + $groups = og_all_groups_options(); + foreach ($groups as $gid => $group_name){ + $form['calendar_colors_group']['color'][$gid] = array( + '#title' => t($group_name), + '#type' => 'calendar_colorfield', + '#default_value' => isset($colors_group[$gid]) ? $colors_group[$gid] : '#ffffff', + '#calendar_colorpicker' => 'calendar-colors-group-colorpicker', + '#prefix' => '
', + '#suffix' => '
', + ); + } + $form['calendar_colors_group']['color']['#suffix'] = '
'; + break; + } + } + + /** + * Perform any necessary changes to the form values prior to storage. + * There is no need for this function to actually store the data. + */ + function options_submit($form, &$form_state) { + // It is very important to call the parent function here: + parent::options_submit($form, $form_state); + switch ($form_state['section']) { + case 'calendar_popup': + $this->set_option($form_state['section'], $form_state['values'][$form_state['section']]['popup']); + break; + case 'calendar_colors': + case 'calendar_colors_taxonomy': + case 'calendar_colors_group': + $this->set_option($form_state['section'], $form_state['values'][$form_state['section']]['color']); + break; + case 'calendar_colors_vocabulary': + $this->set_option($form_state['section'], array_filter($form_state['values'][$form_state['section']])); + break; + case 'calendar_date_link': + $this->set_option($form_state['section'], ($form_state['values'][$form_state['section']])); + variable_set('calendar_date_link_'. $form_state['values']['calendar_date_link'], $this->display->handler->get_option('path')); + break; + } + } + +} diff --git a/sites/all/modules/calendar/includes/calendar_plugin_style.inc b/sites/all/modules/calendar/includes/calendar_plugin_style.inc new file mode 100644 index 0000000..3e29831 --- /dev/null +++ b/sites/all/modules/calendar/includes/calendar_plugin_style.inc @@ -0,0 +1,180 @@ +date_info)) { + $view->date_info = new StdClass(); + } + $view->date_info->display_types = $this->display_types(); + } + + function display_types($granularity = NULL, $option_type = 'names') { + $ids = array(); + $names = array(); + foreach (calendar_display_types() as $name => $type) { + foreach ($this->view->display as $id => $display) { + if ($display->display_plugin == 'calendar_period') { + if (!empty($display->display_options['calendar_type']) && $display->display_options['calendar_type'] == $name) { + $attachments = array_filter($display->display_options['displays']); + if (isset($attachments['calendar_1'])) { + $ids[$name] = $id; + $names[$name] = $display->display_title; + } + } + } + } + } + if ($granularity) { + return $$option_type[$granularity]; + } + return $$option_type; + } + + /** + * Calendar argument date fields used in this view. + */ + function date_fields() { + $date_fields = array(); + $calendar_fields = date_api_fields($this->view->base_table); + $arguments = $this->display->handler->get_option('arguments'); + foreach ($arguments as $name => $argument) { + if (isset($argument['date_fields'])) { + foreach ($argument['date_fields'] as $date_field) { + $field = $calendar_fields['name'][$date_field]; + $handler = views_get_handler($field['table_name'], $field['field_name'], 'field'); + if ($handler) { + $date_fields[$date_field] = $field; + $date_fields[$date_field]['name'] = $handler->ui_name(); + } + } + } + } + return ($date_fields); + } + + /** + * Style validation. + */ + function validate() { + $errors = parent::validate(); + if (empty($this->display->display_options['style_plugin'])) { + return $errors; + } + $style = $this->display->display_options['style_plugin']; + + $arguments = $this->display->handler->get_option('arguments'); + if (!in_array('date_argument', array_keys($arguments))) { + if (empty($this->view->date_info->arg_missing)) { + $errors[$style] = t("The @style style requires a Date argument.", array('@style' => $style)); + } + $this->view->date_info->arg_missing = TRUE; + $this->date_info->arg_fields = array(); + } + else { + $this->date_info->arg_fields = $arguments['date_argument']['date_fields']; + if ($arguments['date_argument']['default_action'] != 'default' || $arguments['date_argument']['default_argument_type'] != 'date') { + if (empty($this->view->date_info->arg_missing_default)) { + $errors[] = calendar_errors('missing_argument_default'); + } + $this->view->date_info->arg_missing_default = TRUE; + } + } + + // Make sure date fields are not set up to 'Group multiple values' + // in the calendar style. + if ($style == 'calendar_style') { + $view_fields = date_api_fields($this->view->base_table); + $view_fields = $view_fields['name']; + $fields = $this->display->handler->get_option('fields'); + $has_fields = FALSE; + foreach ($fields as $column => $field) { + $field_name = $field['table'] .".". $field['field']; + if (in_array($field_name, $this->date_info->arg_fields)) { + $has_fields = TRUE; + } + if (!empty($field['multiple']) && array_key_exists($field_name, $view_fields)) { + $cck_fields = content_fields(); + $real_name = $view_fields[$field_name]['real_field_name']; + if ($cck_fields[$real_name]['multiple'] && !empty($field['multiple']['group'])) { + $errors[] = t("The date field '@field' used by the display '@display_title' cannot be set to 'Group multiple values'.", array('@field' => $view_fields[$field_name]['label'], '@display_title' => $this->display->display_title)); + } + } + } + // The calendar needs the values from the date fields to split + // the nodes into calendar cells, so make sure the field gets + // added into the query. + if (!$has_fields) { + $errors[] = t('The date argument date fields must be added to this query. You can exclude them if you do not want them displayed in the calendar.'); + } + } + return $errors; + } + + function query() { + + require_once('./'. drupal_get_path('module', 'date_api') .'/date_api_sql.inc'); + + $style_options = $this->view->style_plugin->options; + + // Evaluate our argument values and figure out which + // calendar display we need to create. + $i = 0; + foreach ($this->view->argument as $id => $argument) { + if ($argument->field == 'date_argument') { + // TODO Decide if we want to provide a date here or not. + // Adding this now is to prevent fatal errors later if the + // view is used in unexpected ways without a date being set. + if (empty($argument->min_date)) { + $value = $argument->get_default_argument(); + $range = $argument->date_handler->arg_range($value); + $argument->min_date = $range[0]; + $argument->max_date = $range[1]; + } + $this->view->date_info->granularity = !empty($argument->granularity) ? $argument->granularity : $argument->options['granularity']; + $this->view->date_info->date_arg = !empty($this->view->args) && count($this->view->args) > $argument->position ? $this->view->args[$argument->position] : ''; + $this->view->date_info->date_arg_pos = $i; + $this->view->date_info->year = isset($argument->year) ? $argument->year : NULL; + $this->view->date_info->month = isset($argument->month) ? $argument->month: NULL; + $this->view->date_info->day = isset($argument->day) ? $argument->day : NULL; + $this->view->date_info->week = isset($argument->week) ? $argument->week : NULL; + $this->view->date_info->min_date = $argument->min_date; + $this->view->date_info->max_date = $argument->max_date; + $this->view->date_info->min_date_date = date_format($this->view->date_info->min_date, DATE_FORMAT_DATE); + $this->view->date_info->max_date_date = date_format($this->view->date_info->max_date, DATE_FORMAT_DATE); + $this->view->date_info->forbid = isset($argument->forbid) ? $argument->forbid : FALSE; + + // Stop after the first date argument, if there is more than one. + break; + } + $i++; + } + $this->view->date_info->display_types = $this->display_types(); + $keys = drupal_map_assoc(array_keys(calendar_display_types())); + $this->view->date_info->calendar_type = $keys[$this->view->date_info->granularity]; + + // bring the node type into the query so we can use it in the theme + if ($this->view->base_table == 'node') { + $this->view->query->add_field('node', 'type'); + } + + parent::query(); + } + + /** + * Render the calendar navigation style. + */ + function render() { + return theme($this->theme_functions(), $this->view, $this->options, array()); + } +} + diff --git a/sites/all/modules/calendar/includes/calendar_view_plugin_style.inc b/sites/all/modules/calendar/includes/calendar_view_plugin_style.inc new file mode 100644 index 0000000..82c5944 --- /dev/null +++ b/sites/all/modules/calendar/includes/calendar_view_plugin_style.inc @@ -0,0 +1,173 @@ +display->handler->get_option('calendar_type'); + $view->date_info->style_name_size = $this->options['name_size']; + $view->date_info->style_with_weekno = $this->options['with_weekno']; + $view->date_info->style_multiday_theme = $this->options['multiday_theme']; + $view->date_info->style_theme_style = $this->options['theme_style']; + $view->date_info->style_max_items = $this->options['max_items']; + $view->date_info->style_max_items_behavior = $this->options['max_items_behavior']; + if (!empty($this->options['groupby_times_custom'])) { + $view->date_info->style_groupby_times = explode(',', $this->options['groupby_times_custom']); + } + else { + $view->date_info->style_groupby_times = calendar_groupby_times($this->options['groupby_times']); + } + $view->date_info->style_groupby_field = $this->options['groupby_field']; + + // TODO make this an option setting. + $view->date_info->style_show_empty_times = !empty($this->options['groupby_times_custom']) ? TRUE : FALSE; + + // Make sure views does't try to limit the number of items in this view. + $this->view->pager['items_per_page'] = 0; + + } + + /** + * Set default options + */ + function options(&$options) { + $options['name_size'] = 3; + $options['with_weekno'] = 0; + $options['multiday_theme'] = '1'; + $options['theme_style'] = '1'; + $options['max_items'] = 0; + $options['max_items_behavior'] = 'more'; + $options['groupby_times'] = 'hour'; + $options['groupby_times_custom'] = ''; + $options['groupby_field'] = ''; + } + + /** + * Style options. + */ + function options_form(&$form, &$form_state) { + $calendar_type = $this->display->handler->get_option('calendar_type'); + $form['name_size'] = array( + '#title' => t('Calendar day of week names'), + '#default_value' => $this->options['name_size'], + '#type' => in_array($calendar_type, array('year', 'month', 'week')) ? 'radios' : 'value', + '#options' => array(1 => t('First letter of name'), 2 => t('First two letters of name'), 3 => t('Abbreviated name'), 99 => t('Full name')), + '#description' => t('The way day of week names should be displayed in a calendar.'), + ); + + $form['with_weekno'] = array( + '#title' => t('Show week numbers'), + '#default_value' => $this->options['with_weekno'], + '#type' => in_array($calendar_type, array('month')) ? 'radios' : 'value', + '#options' => array(0 => t('No'), 1 => t('Yes')), + '#description' => t('Whether or not to show week numbers in the left column of calendar weeks and months.'), + ); + $form['max_items'] = array( + '#title' => t('Maximum items'), + '#type' => in_array($calendar_type, array('month')) ? 'select' : 'value', + '#options' => array(CALENDAR_SHOW_ALL => t('Unlimited'), CALENDAR_HIDE_ALL => t('No items'), 3 => t('3 items'), 5 => t('5 items'), 10 => t('10 items')), + '#default_value' => $calendar_type != 'day' ? $this->options['max_items'] : 0, + '#description' => t('Maximum number of items to show in calendar cells, used to keep the calendar from expanding to a huge size when there are lots of items in one day. '), + ); + $form['max_items_behavior'] = array( + '#title' => t('Too many items'), + '#type' => in_array($calendar_type, array('month')) ? 'select' : 'value', + '#options' => array('more' => t("Show maximum, add 'more' link"), 'hide' => t('Hide all, add link to day')), + '#default_value' => $calendar_type != 'day' ? $this->options['max_items_behavior'] : 'more', + '#description' => t('Behavior when there are more than the above number of items in a single day. When there more items than this limit, a link to the day view will be displayed.'), + ); + $form['groupby_times'] = array( + '#title' => t('Time grouping'), + '#type' => in_array($calendar_type, array('day', 'week')) ? 'select' : 'value', + '#default_value' => $this->options['groupby_times'], + '#description' => t("Group items together into time periods based on their start time."), + '#options' => array('' => t('None'), 'hour' => t('Hour'), 'half' => t('Half hour'), 'custom' => t('Custom')), + ); + $form['groupby_times_custom'] = array( + '#title' => t('Custom time grouping'), + '#type' => in_array($calendar_type, array('day', 'week')) ? 'textarea' : 'value', + '#default_value' => $this->options['groupby_times_custom'], + '#description' => t("When choosing the 'custom' Time grouping option above, create custom time period groupings as a comma-separated list of 24-hour times in the format HH:MM:SS, like '00:00:00,08:00:00,18:00:00'. Be sure to start with '00:00:00'. All items after the last time will go in the final group."), + ); + // Create a list of fields that are available for grouping and truncation, + // excluding the date fields in the view from the grouping options. + $field_options = array(); + $date_field_options = array(); + $fields = $this->display->handler->get_option('fields'); + $date_fields = array_keys($this->date_fields()); + foreach ($fields as $field_name => $field) { + $handler = views_get_handler($field['table'], $field['field'], 'field'); + if (!in_array($field['table'] .'.'. $field['field'], $date_fields)) { + $field_options[$field['table'] .'_'. $field['field']] = $handler->ui_name(); + } + else { + $date_field_options[$field['table'] .'_'. $field['field']] = $handler->ui_name(); + } + } + $form['groupby_field'] = array( + '#title' => t('Field grouping'), + '#type' => in_array($calendar_type, array('day')) ? 'select' : 'value', + '#default_value' => $this->options['groupby_field'], + '#description' => t("Optionally group items into columns by a field value, for instance select the content type to show items for each content type in their own column, or use a location field to organize items into columns by location."), + '#options' => array('' => '') + $field_options, + ); + + if (module_exists('calendar_multiday')) { + $form['multiday_theme'] = array( + '#title' => t('Multi-day style'), + '#default_value' => $this->options['multiday_theme'], + '#type' => in_array($calendar_type, array('month', 'week')) ? 'select' : 'value', + '#options' => array(0 => t('Display multi-day item as a single column'), 1 => t('Display multi-day item as a multiple column row')), + '#description' => t('If selected, items which span multiple days will displayed as a multi-column row. If not selected, items will be displayed as an individual column.'), + ); + $form['theme_style'] = array( + '#title' => t('Overlapping time style'), + '#default_value' => $this->options['theme_style'], + '#type' => in_array($calendar_type, array('day', 'week')) ? 'select' : 'value', + '#options' => array(0 => t('Do not display overlapping items'), 1 => t('Display overlapping items')), + '#description' => t('Select whether calendar items are displayed as overlapping items.'), + ); + } + + foreach ($form as $key => $value) { + if ($value['#type'] == 'value') { + $form[$key]['#value'] = $value['#default_value']; + } + } + } + + /** + * Render the calendar attachment style. + */ + function render() { + $calendar_type = $this->display->handler->get_option('calendar_type'); + // Adjust the theme to match the currently selected default. + // Only the month view needs the special 'mini' class, + // which is used to retrieve a different, more compact, theme. + if (!empty($this->view->date_info->mini) && $this->view->date_info->granularity == 'month') { + $this->definition['theme'] = 'calendar_mini'; + } + elseif ( module_exists('calendar_multiday') && $calendar_type == 'week') { + $this->view->date_info->mini = FALSE; + $this->definition['theme'] = ($this->view->style_options['multiday_theme'] == '1' && $this->view->style_options['theme_style'] == '1') ? 'calendar_'. $this->view->date_info->granularity .'_overlap' : 'calendar_'. $this->view->date_info->granularity; + } + elseif ( module_exists('calendar_multiday') && $calendar_type == 'day') { + $this->view->date_info->mini = FALSE; + $this->definition['theme'] = ($this->view->style_options['theme_style'] == '1') ? 'calendar_'. $this->view->date_info->granularity .'_overlap' : 'calendar_'. $this->view->date_info->granularity; + } + else { + $this->view->date_info->mini = FALSE; + $this->definition['theme'] ='calendar_'. $this->view->date_info->granularity; + } + $this->view->date_info->hide_admin_links = TRUE; + return theme($this->theme_functions(), $this->view, $this->options, array()); + } +} \ No newline at end of file diff --git a/sites/all/modules/calendar/includes/translations/includes.cs.po b/sites/all/modules/calendar/includes/translations/includes.cs.po new file mode 100644 index 0000000..7e8c140 --- /dev/null +++ b/sites/all/modules/calendar/includes/translations/includes.cs.po @@ -0,0 +1,235 @@ +# $Id: includes.cs.po,v 1.1.2.1 2010/10/22 20:06:37 wojtha Exp $ +# +# Czech translation of Calendar (6.x-2.2) +# Copyright (c) 2010 by the Czech translation team +# +msgid "" +msgstr "" +"Project-Id-Version: Calendar (6.x-2.2)\n" +"POT-Creation-Date: 2010-10-22 20:03+0000\n" +"PO-Revision-Date: 2010-09-29 22:09+0000\n" +"Language-Team: Czech\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=utf-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Plural-Forms: nplurals=3; plural=((((n%10)==1)&&((n%100)!=11))?(0):(((((n%10)>=2)&&((n%10)<=4))&&(((n%100)<10)||((n%100)>=20)))?(1):2));\n" + +msgid "Edit" +msgstr "Upravit" +msgid "Maximum items" +msgstr "Maximální počet položek" +msgid "Custom" +msgstr "Vlastní" +msgid "Unlimited" +msgstr "Neomezené" +msgid "Full name" +msgstr "Celé jméno" +msgid "Hour" +msgstr "Hodina" +msgid "No link" +msgstr "Žádný odkaz" +msgid "First letter of name" +msgstr "První písmeno jména" +msgid "First two letters of name" +msgstr "První dvě písmena jména" +msgid "Abbreviated name" +msgstr "Zkrácené jméno" +msgid "Show week numbers" +msgstr "Zobrazit čísla týdnů" +msgid "3 items" +msgstr "3 položky" +msgid "5 items" +msgstr "5 položek" +msgid "10 items" +msgstr "10 položek" +msgid "" +"Maximum number of items to show in calendar cells, used to keep the " +"calendar from expanding to a huge size when there are lots of items in " +"one day. " +msgstr "" +"Maximální počet položek zobrazených v buňce kalendáře. " +"Slouží k omezení rozměrů kalendáře při větším počtu " +"položek v jednom dni. " +msgid "Too many items" +msgstr "Příliš mnoho položek" +msgid "Show maximum, add 'more' link" +msgstr "Zobrazit maximální počet, připojit odkaz 'více'" +msgid "Hide all, add link to day" +msgstr "Skrýt vše, přidat odkaz na den" +msgid "" +"Behavior when there are more than the above number of items in a " +"single day. When there more items than this limit, a link to the day " +"view will be displayed." +msgstr "" +"Pokud je počet denních položek vyšší než definuje limit, potom " +"je zobrazen odkaz do pohledu reprezentujícího den." +msgid "Calendar page" +msgstr "Stránka kalendáře" +msgid "" +"Calendar page. Attach Calendar period attachments to this page, set to " +"show the year, month, day, and week views." +msgstr "" +"Stránka kalendáře. Přidat ke stránce s obdobím kalendáře, " +"určenou k zobrazení ročního, měsíčního, denního nebo " +"týdenního pohledu." +msgid "Calendar block" +msgstr "Blok kalendáře" +msgid "" +"Calendar page. Attach a Calendar period attachment to this block, set " +"to show the year, month, day, or week view." +msgstr "" +"Stránka kalendáře. Přidat k bloku přílohu s obdobím " +"kalendáře, určenou k zobrazení ročního, měsíčního, denního " +"nebo týdenního pohledu." +msgid "" +"An attachment for a Year, Month, Day, or Week calendar display, using " +"any style you choose. Attach to a Calendar page and/or a Calendar " +"block." +msgstr "" +"Příloha pro zobrazení kalendáře na rok, měsíc, den nebo týden " +"používá styl, který jste vybral. Přiložte ke stránce a/nebo " +"bloku kalendáře." +msgid "Calendar page year, month, week, or day view" +msgstr "Pohled stránky kalendáře pro rok, měsíc, týden nebo den" +msgid "Calendar navigation" +msgstr "Navigace kalendáře" +msgid "Creates back/next navigation and calendar links." +msgstr "Vytvoří navigaci \"zpět/další\" a odkazy kalendáře." +msgid "Displays Views results in a calendar." +msgstr "Zobrazuje výsledek Views v kalendáři." +msgid "A Calendar period display will not work without a Date argument." +msgstr "" +"Zobrazení období v kalendáři nebude fungovat bez argumentu typu " +"\"datum\"." +msgid "Select the calendar time period for this display." +msgstr "Vyberte časové období kalendáře pro toto zobrazení." +msgid "" +"The Calendar period display '@display_title' will not work without a " +"Date argument." +msgstr "" +"Pohled na období kalendáře '@display_title' nebude fungovat bez " +"data, jako argumentu." +msgid "" +"The Calendar display '@display_title' will not work without a Date " +"argument." +msgstr "" +"Pohled na kalendář '@display_title' nebude fungovat bez data, jako " +"argumentu." +msgid "Legend Content Types" +msgstr "Typy obsahu legendy" +msgid "Legend Vocabularies" +msgstr "Slovníky legendy" +msgid "Legend Terms" +msgstr "Termíny legendy" +msgid "Date changer" +msgstr "Změna datumu" +msgid "Add new date link" +msgstr "Přidej nový odkaz na datum" +msgid "Display a popup calendar date selector?" +msgstr "Zobrazit popup kalendář pro výběr data?" +msgid "" +"Display a link to add a new date of the specified content type. " +"Displayed only to users with appropriate permissions." +msgstr "" +"Zobrazit odkaz pro přidání nového data zadaného typu obsahu. " +"Zobrazí se pouze uživatelům s odpovídajícím oprávněním." +msgid "Content Type Legend Colors" +msgstr "Barevná legenda typů obsahu" +msgid "" +"

Set a hex color " +"value (like #ffffff) to use in the calendar legend for each content " +"type. Types with empty values will have no stripe in the calendar and " +"will not be added to the legend.

" +msgstr "" +"

Nastavte " +"šestnáctkovou hodnotu barvy (např. #ffffff) pro každý typ obsahu, " +"který je v kalendáři použit. Pokud nebude typu přiřazena barva, " +"potom nebude tento typ v kalendáři nijak zvýrazněn a ani nebude " +"zahrnut do legendy.

" +msgid "Vocabulary Legend Types" +msgstr "Typy slovníků v legendě" +msgid "" +"
Select " +"vocabularies to use for setting calendar legend colors by taxonomy " +"term. This works best for vocabularies with only a limited number of " +"possible terms.
" +msgstr "" +"
Vyberte slovník " +"jehož termíny chcete barevně odlišovat. Je vhodné používat " +"slovníky s omezeným počtem termínů.
" +msgid "Taxonomy Legend Colors" +msgstr "Barvy taxonomie v legendě" +msgid "" +"
Please select Legend vocabularies " +"first!
" +msgstr "" +"
Nejdříve prosím zvolte slovníky " +"legendy!
" +msgid "" +"

Set a hex " +"color value (like #ffffff) to use in the calendar legend for each " +"taxonomy term. Terms with empty values will have no stripe in the " +"calendar and will not be added to the legend.

" +msgstr "" +"

Nastavte " +"šestnáctkovou hodnotu barvy (např. #ffffff) pro každý termín, " +"který je v kalendáři použít. Pokud nebude termínu přiřazena " +"barva, potom nebude tento termín v kalendáři nijak zvýrazněn a " +"ani nebude zahrnut do legendy.

" +msgid "The @style style requires a Date argument." +msgstr "Styl @style vyžaduje argument typu \"datum\"." +msgid "" +"The date argument date fields must be added to this query. You can " +"exclude them if you do not want them displayed in the calendar." +msgstr "" +"Pole, které slouží jako argument datumu musí být součástí " +"dotazu. Avšak není nutné jej zobrazovat." +msgid "Calendar day of week names" +msgstr "Názvy dnů v kalendáři" +msgid "The way day of week names should be displayed in a calendar." +msgstr "" +"Způsob jakým mají být v kalendáři zobrazena názvy dní v " +"týdnu." +msgid "" +"Whether or not to show week numbers in the left column of calendar " +"weeks and months." +msgstr "" +"Uvádět čísla týdnů v levém sloupci při zobrazení týdne nebo " +"měsíce?" +msgid "No items" +msgstr "Žádné položky" +msgid "Time grouping" +msgstr "Seskupení podle času" +msgid "Group items together into time periods based on their start time." +msgstr "" +"Seskup položky do časových období podle jejich počátečního " +"času." +msgid "Half hour" +msgstr "Půl hodiny" +msgid "Custom time grouping" +msgstr "Vlastní seskupování podle času" +msgid "" +"When choosing the 'custom' Time grouping option above, create custom " +"time period groupings as a comma-separated list of 24-hour times in " +"the format HH:MM:SS, like '00:00:00,08:00:00,18:00:00'. Be sure to " +"start with '00:00:00'. All items after the last time will go in the " +"final group." +msgstr "" +"Když je výše zvoleno vlastní seskupování dle času, je nutné " +"vytvořit vlastní časové intervaly jako čárkami oddělený seznam " +"ve 24-hodinovém formátu HH:MM:SS (např. " +"'00:00:00,08:00:00,18:00:00'). Ujistěte se, že začínáte časem " +"'00:00:00'. Všechny položky po posledním čase budou zařazeny do " +"konečné skupiny." +msgid "Field grouping" +msgstr "Seskupování polí" +msgid "" +"Optionally group items into columns by a field value, for instance " +"select the content type to show items for each content type in their " +"own column, or use a location field to organize items into columns by " +"location." +msgstr "" +"Volitelně je možné seskupit položky do sloupců dle hodnoty pole. " +"Např. vyberte typ obsahu pro zobrazení počtu položek každého " +"typu obsahu ve vlastním sloupci, nebo použijte políčko místa pro " +"roztřídění položek do sloupců dle místa." diff --git a/sites/all/modules/calendar/jcalendar/Readme.txt b/sites/all/modules/calendar/jcalendar/Readme.txt new file mode 100644 index 0000000..ac0a3bf --- /dev/null +++ b/sites/all/modules/calendar/jcalendar/Readme.txt @@ -0,0 +1,3 @@ +Just some credits. + +The throbber is from thickbox and the x is from a jquery tooltip library, although I cannot remember which. diff --git a/sites/all/modules/calendar/jcalendar/images/cross.png b/sites/all/modules/calendar/jcalendar/images/cross.png new file mode 100644 index 0000000000000000000000000000000000000000..1514d51a3cf1b67e1c5b9ada36f1fd474e2d214a GIT binary patch literal 655 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 Dl)1NK literal 0 HcmV?d00001 diff --git a/sites/all/modules/calendar/jcalendar/jcalendar.css b/sites/all/modules/calendar/jcalendar/jcalendar.css new file mode 100644 index 0000000..19976e2 --- /dev/null +++ b/sites/all/modules/calendar/jcalendar/jcalendar.css @@ -0,0 +1,49 @@ +div#calpopup { + display: block; + border: thin solid gray; + /* This is css3 stuff that will not work in IE<=8. + * What is here is a curved border for firefox and webkit + * and a drop shadow that will only appear in webkit. + **/ + -moz-border-radius: 1em; + -webkit-border-radius: 1em; + -webkit-box-shadow: 10px 10px 5px #888; + /* End CSS3 stuff */ + background-color: white; + width: 25%; + position: absolute; + top: 20em; + left: 20em; + + /* CSS to make sure that the popup is on top */ + z-index: 800; +} + +div#calpopup-body div.node { + margin: 0; + border: 0; +} + +div#calpopup-body { + margin: 1em; + max-height: 20em; + overflow-y: auto; + /* IE7 Hack + * This keeps the date from sticking in one place while scrolling. + */ + position: relative; +} + +#popup-close { + text-align: right; + padding: 1em 1em 0 1em; +} + +div#nodelink { + margin: 1em; +} + +img#popthrobber { + text-align: center; + margin: 3em; +} diff --git a/sites/all/modules/calendar/jcalendar/jcalendar.info b/sites/all/modules/calendar/jcalendar/jcalendar.info new file mode 100644 index 0000000..3305cfd --- /dev/null +++ b/sites/all/modules/calendar/jcalendar/jcalendar.info @@ -0,0 +1,14 @@ +; $Id: jcalendar.info,v 1.1.4.2 2008/06/23 14:55:01 karens Exp $ +name = Calendar Popup +description = "Replaces the links to calendar items with a javascript popup that gracefully regresses if javascript is not enabled" +dependencies[] = calendar +dependencies[] = views +core = 6.x +package = Date/Time + +; Information added by drupal.org packaging script on 2011-01-03 +version = "6.x-2.4" +core = "6.x" +project = "calendar" +datestamp = "1294072550" + diff --git a/sites/all/modules/calendar/jcalendar/jcalendar.js b/sites/all/modules/calendar/jcalendar/jcalendar.js new file mode 100644 index 0000000..e387785 --- /dev/null +++ b/sites/all/modules/calendar/jcalendar/jcalendar.js @@ -0,0 +1,82 @@ +if (Drupal.jsEnabled) { + $(document).ready(function() { + // I am assuming that all of the links are refering to an internal node + + // add the attribute rel=facebox to all of the links I want to have a popup + $('div.view-field > a').attr('class', 'popup'); + + // on click of a link + $('a.popup').click(function(a) { + + // Make sure that other stuff is closed. This seems to cause a problem in Fx2 and IE7. + $('div#calpopup').fadeOut(); + $('div#calpopup').remove(); + + // create div to hold data and add it to the end of the body + var div = $('
').attr('style','display: none'); + div.appendTo(document.body); + + // Locate Popup + var offset = $(this).offset(); + // Check position with window width. + var offset_left = offset.left + 5; + if ($(window).width() < $('#calpopup').width() + offset.left) { + offset_left -= $('#calpopup').width() + 5; + if (offset_left < 0) { + offset_left = 0; + } + } + var offset_top = offset.top + 25; + if ($(window).height() < $('#calpopup').height() + offset_top) { + offset_top -= $('#calpopup').height() + 25; + if (offset_top < 0) { + offset_top = 0; + } + } + $('#calpopup').css('left', offset_left); + $('#calpopup').css('top', offset_top); + + // Show Popup + $('#calpopup').fadeIn('slow'); + + // If sucessful call this + function domCallback(msg) { + $('#calpopup-body').html(msg); + } + + // Get NodeID and ItemID + var ids = $(this).parent().parent().attr('class'); + var arrs = ids.split(" "); + var arr = arrs[0].split("."); + var nid = arr[1]; + var id = arr[4]; + + // fill the div with data + $.ajax({ + type: "GET", + url: Drupal.settings.basePath + "?q=jcalendar/getnode/"+nid+"/"+ids, + success: function(msg){ + domCallback(msg); + } + }); + + // On click of the close image + $('img#popup-close-img').click(function(x) { + $('div#calpopup').fadeOut(); + $('div#calpopup').remove(); + }); + + $(document).click(function(y) { + var $tgt = $(y.target); + if (!$tgt.parents().is('div#calpopup')) { + $('div#calpopup').fadeOut(); + $('div#calpopup').remove(); + $(document).unbind("click"); + } + }); + + // Don't Follow the real link + return false; + }); + }); +} diff --git a/sites/all/modules/calendar/jcalendar/jcalendar.module b/sites/all/modules/calendar/jcalendar/jcalendar.module new file mode 100644 index 0000000..da3cc6a --- /dev/null +++ b/sites/all/modules/calendar/jcalendar/jcalendar.module @@ -0,0 +1,97 @@ +'. t("Creates a popup for calendar dates.") .'

'; + break; + } + return $output; +} // function jcalendar_help + +/** +* Get calendar node for popup +* @param integer nid Node id. +* @param string id Date field unique id. +* @return string HTML for node +*/ +function get_calendar_node($nid, $id) { + $GLOBALS['devel_shutdown'] = FALSE; + if (is_numeric($nid)) { + if ($node = node_load($nid)) { + if (node_access("view", $node)) { + $node->date_id = $id; + $node->date_repeat_show = FALSE; + print theme('jcalendar_view', $node); + } + } + }} + +/** +* Implemetation of hook_menu() +*/ +function jcalendar_menu() { + + $items['jcalendar/getnode'] = array( + 'title' => 'Get Calendar Node', + 'page callback' => 'get_calendar_node', + 'page arguments' => array(2, 3), + 'access callback' => TRUE, + 'type' => MENU_CALLBACK, + ); + return $items; +} + +/** +* Override the calendar view to inject javascript. +* @param view Which view we are using. +* @return unknown as of yet. +*/ +function jcalendar_views_pre_view(&$view, &$display_id) { + static $js_added = false; + if ($js_added) { + return; + } + foreach ($view->display as $display) { + if ($display->display_plugin == 'calendar') { + $js_added = true; + $path = drupal_get_path('module', 'jcalendar'); + $settings['jcalendar']['path'] = base_path() . $path; + drupal_add_js($settings, 'setting'); + drupal_add_js($path .'/jcalendar.js'); + drupal_add_css($path .'/jcalendar.css'); + } + } +} + +/** + * Implementation of hook_theme(). + */ +function jcalendar_theme() { + return array( + 'jcalendar_view' => array('arguments' => array('node' => NULL)), + ); +} + +/** + * Overrideable theme for the jcalendar popup view. + * + * Defaults to show the standard teaser view of the node. + */ +function theme_jcalendar_view($node) { + $output = node_view($node, TRUE); + $output .= ''; + return $output; +} \ No newline at end of file diff --git a/sites/all/modules/calendar/jcalendar/translations/jcalendar.cs.po b/sites/all/modules/calendar/jcalendar/translations/jcalendar.cs.po new file mode 100644 index 0000000..f467d56 --- /dev/null +++ b/sites/all/modules/calendar/jcalendar/translations/jcalendar.cs.po @@ -0,0 +1,28 @@ +# $Id: jcalendar.cs.po,v 1.1.2.1 2010/10/22 20:06:37 wojtha Exp $ +# +# Czech translation of Calendar (6.x-2.2) +# Copyright (c) 2010 by the Czech translation team +# +msgid "" +msgstr "" +"Project-Id-Version: Calendar (6.x-2.2)\n" +"POT-Creation-Date: 2010-10-22 20:03+0000\n" +"PO-Revision-Date: 2010-09-29 20:42+0000\n" +"Language-Team: Czech\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=utf-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Plural-Forms: nplurals=3; plural=((((n%10)==1)&&((n%100)!=11))?(0):(((((n%10)>=2)&&((n%10)<=4))&&(((n%100)<10)||((n%100)>=20)))?(1):2));\n" + +msgid "Creates a popup for calendar dates." +msgstr "Vytvoří popup okno pro data kalendáře" +msgid "Calendar Popup" +msgstr "Calendar Popup" +msgid "" +"Replaces the links to calendar items with a javascript popup that " +"gracefully regresses if javascript is not enabled" +msgstr "" +"Nahradí odkaz na položku kalendáře vyskakovacím oknem. Vyžaduje " +"povolený javascript." +msgid "Get Calendar Node" +msgstr "Získej uzel kalendáře" diff --git a/sites/all/modules/calendar/jcalendar/translations/jcalendar.hu.po b/sites/all/modules/calendar/jcalendar/translations/jcalendar.hu.po new file mode 100644 index 0000000..ed06d73 --- /dev/null +++ b/sites/all/modules/calendar/jcalendar/translations/jcalendar.hu.po @@ -0,0 +1,27 @@ +# Hungarian translation of Calendar (all releases) +# Copyright (c) 2009 by the Hungarian translation team +# +msgid "" +msgstr "" +"Project-Id-Version: Calendar (all releases)\n" +"POT-Creation-Date: 2009-11-10 16:39+0000\n" +"PO-Revision-Date: 2009-10-31 09:55+0000\n" +"Language-Team: Hungarian\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=utf-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Plural-Forms: nplurals=2; plural=(n!=1);\n" + +msgid "Creates a popup for calendar dates." +msgstr "Hozzárendel egy felugró ablakot a naptár napjaihoz." +msgid "Calendar Popup" +msgstr "Calendar Popup" +msgid "" +"Replaces the links to calendar items with a javascript popup that " +"gracefully regresses if javascript is not enabled" +msgstr "" +"Egy javscript felugró ablakra cseréli a naptár elemek " +"hivatkozásait, ami elegánsan eltűnik, ha a javascript nem " +"engedélyezett." +msgid "Get Calendar Node" +msgstr "Naptár tartalom lekérdezése" diff --git a/sites/all/modules/calendar/jcalendar/translations/jcalendar.pot b/sites/all/modules/calendar/jcalendar/translations/jcalendar.pot new file mode 100644 index 0000000..36c0b58 --- /dev/null +++ b/sites/all/modules/calendar/jcalendar/translations/jcalendar.pot @@ -0,0 +1,49 @@ +# $Id: jcalendar.pot,v 1.1.2.1 2009/02/17 11:06:21 karens Exp $ +# +# LANGUAGE translation of Drupal (general) +# Copyright YEAR NAME +# Generated from files: +# jcalendar.module,v 1.1.4.15 2009/01/10 20:14:16 karens +# jcalendar.info,v 1.1.4.2 2008/06/23 14:55:01 karens +# +#, fuzzy +msgid "" +msgstr "" +"Project-Id-Version: PROJECT VERSION\n" +"POT-Creation-Date: 2009-02-17 05:04-0600\n" +"PO-Revision-Date: YYYY-mm-DD HH:MM+ZZZZ\n" +"Last-Translator: NAME \n" +"Language-Team: LANGUAGE \n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=utf-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Plural-Forms: nplurals=INTEGER; plural=EXPRESSION;\n" + +#: jcalendar.module:18 +msgid "Creates a popup for calendar dates." +msgstr "" + +#: jcalendar.module:90 +msgid "more" +msgstr "" + +#: jcalendar.module:48 +msgid "Get Calendar Node" +msgstr "" + +#: jcalendar.module:0 +msgid "jcalendar" +msgstr "" + +#: jcalendar.info:0 +msgid "Calendar Popup" +msgstr "" + +#: jcalendar.info:0 +msgid "Replaces the links to calendar items with a javascript popup that gracefully regresses if javascript is not enabled" +msgstr "" + +#: jcalendar.info:0 +msgid "Date/Time" +msgstr "" + diff --git a/sites/all/modules/calendar/js/calendar_colorpicker.js b/sites/all/modules/calendar/js/calendar_colorpicker.js new file mode 100644 index 0000000..aa28fe8 --- /dev/null +++ b/sites/all/modules/calendar/js/calendar_colorpicker.js @@ -0,0 +1,40 @@ +// $Id: calendar_colorpicker.js,v 1.1.4.3 2008/11/21 22:04:56 karens Exp $ +/** + * Implementation of hook_elements. + * + * Much of the colorpicker code was adapted from the Colorpicker module. + * That module has no stable release yet nor any D6 branch. + */ +/* + * Bind the colorpicker event to the form element + */ +Drupal.behaviors.calendarColorpicker = function (context) { + + // do we have multiple calendar_colors? + if ($("div.calendar_colorpicker").size() > 0) { + + // loop over each calendar_color type + $("div.calendar_colorpicker").each(function() { + + // create the farbtastic colorpicker + var farb = $.farbtastic(this); + + // get the id of the current matched colorpicker wrapper div + var id = $(this).attr("id"); + + // get the calendar_color_textfields associated with this calendar_color + $("input.calendar_colorfield").filter("." + id).each(function () { + // set the background colors of all of the textfields appropriately + farb.linkTo(this); + + // when clicked, they get linked to the farbtastic colorpicker that they are associated with + $(this).click(function () { + farb.linkTo(this); + }); + + }); + + }); + } +}; + diff --git a/sites/all/modules/calendar/readme.txt b/sites/all/modules/calendar/readme.txt new file mode 100644 index 0000000..b8f67de --- /dev/null +++ b/sites/all/modules/calendar/readme.txt @@ -0,0 +1,33 @@ +Creates calendar displays of Views results. + +Create a new calendar by enabling or cloning the default calendar, +changing the date argument to use the correct date field(s), and setting +up the year, month, day, week, and block views with the desired styles +and fields. + +Unlike previous versions of the Calendar module, there is just a single +Date argument instead of year, month, and day arguments. The argument +value will be YYYY-MM-DD for a day, YYYY-MM for a month, YYYY for a +year, and YYYY-W99 for a week. There is a default option to set the +argument to the current date when the argument is empty. + +A calendar display creates calendar navigation and links to +multiple displays for the year, month, day, or week views. The actual +displays are created by attaching calendar views that use whatever +styles are desired for those pages. + +Calendar views are attachments to create the year, month, day, +and week displays. They can be set to use any style, either a +calendar style or any other Views style, like teasers or lists. +If you don't want to use one of them, don't attach it to +anything. Only the attached views will show up in the calendar. + +A calendar block will create a calendar block for the +view results. Attach a block view to the block and set up the +desired style in the block view. + +If the Calendar iCal module is enabled, an iCal feed can be +attached to the view. + + + diff --git a/sites/all/modules/calendar/theme/calendar-datebox.tpl.php b/sites/all/modules/calendar/theme/calendar-datebox.tpl.php new file mode 100644 index 0000000..85f09e2 --- /dev/null +++ b/sites/all/modules/calendar/theme/calendar-datebox.tpl.php @@ -0,0 +1,19 @@ + +
\ No newline at end of file diff --git a/sites/all/modules/calendar/theme/calendar-day-node.tpl.php b/sites/all/modules/calendar/theme/calendar-day-node.tpl.php new file mode 100644 index 0000000..3f1ab67 --- /dev/null +++ b/sites/all/modules/calendar/theme/calendar-day-node.tpl.php @@ -0,0 +1,53 @@ +nid + * that you can use to load the full object, and + * $node->type to tell the content type of the node. + * + * $fields + * An array of information for every field selected in the 'Fields' + * section of this view, formatted as requested in the View setup. + * + * Calendar info for this individual calendar item is in local time -- + * the user timezone where configurable timezones are allowed and set, + * otherwise the site timezone. If this item has extends over more than + * one day, it has been broken apart into separate nodes for each calendar + * date and calendar_start will be no earlier than the start of + * the current day and calendar_end will be no later than the end + * of the current day. + * + * $calendar_start - A formatted datetime start date for this item. + * i.e. '2008-05-12 05:26:15'. + * $calendar_end - A formatted datetime end date for this item, + * the same as the start date except for fields that have from/to + * fields defined, like Date module dates. + * $calendar_start_date - a PHP date object for the start time. + * $calendar_end_date - a PHP date object for the end time. + * + * You can use PHP date functions on the date object to display date + * information in other ways, like: + * + * print date_format($calendar_start_date, 'l, j F Y - g:ia'); + * + * @see template_preprocess_calendar_day_node. + */ +?> +
+
+ + +
+ +
+ + +
+ +
+
diff --git a/sites/all/modules/calendar/theme/calendar-day.tpl.php b/sites/all/modules/calendar/theme/calendar-day.tpl.php new file mode 100644 index 0000000..c8cf307 --- /dev/null +++ b/sites/all/modules/calendar/theme/calendar-day.tpl.php @@ -0,0 +1,81 @@ + + * based on the number of columns presented. The values passed in will + * work to set the 'hour' column to 10% and split the remaining columns + * evenly over the remaining 90% of the table. + */ +//dsm('Display: '. $display_type .': '. $min_date_formatted .' to '. $max_date_formatted); +?> +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
0 ? t('Time') : ''; ?>
+ 0 ? date_t('All day', 'datetime') : ''; ?> + +
+
+ +
+
+
+ + + +
+
+ +
+
+
+
\ No newline at end of file diff --git a/sites/all/modules/calendar/theme/calendar-main.tpl.php b/sites/all/modules/calendar/theme/calendar-main.tpl.php new file mode 100644 index 0000000..e736b9d --- /dev/null +++ b/sites/all/modules/calendar/theme/calendar-main.tpl.php @@ -0,0 +1,26 @@ + + +
+ + + + +
\ No newline at end of file diff --git a/sites/all/modules/calendar/theme/calendar-mini.tpl.php b/sites/all/modules/calendar/theme/calendar-mini.tpl.php new file mode 100644 index 0000000..fcbc71a --- /dev/null +++ b/sites/all/modules/calendar/theme/calendar-mini.tpl.php @@ -0,0 +1,47 @@ + +
+date_info->show_title): ?> + + + + + + + + + + + + + + + + + + + +
+ +
+ +
+
\ No newline at end of file diff --git a/sites/all/modules/calendar/theme/calendar-month-multiple-node.tpl.php b/sites/all/modules/calendar/theme/calendar-month-multiple-node.tpl.php new file mode 100644 index 0000000..f7c9204 --- /dev/null +++ b/sites/all/modules/calendar/theme/calendar-month-multiple-node.tpl.php @@ -0,0 +1,28 @@ + +
+
+ + date_info->style_max_items_behavior != 'more'): ?> + + + +
+ date_info->style_max_items_behavior != 'more'): ?> +
+ $count)), $link) ?> +
+
+ +
»
+ +
+
diff --git a/sites/all/modules/calendar/theme/calendar-month-node.tpl.php b/sites/all/modules/calendar/theme/calendar-month-node.tpl.php new file mode 100644 index 0000000..7db254b --- /dev/null +++ b/sites/all/modules/calendar/theme/calendar-month-node.tpl.php @@ -0,0 +1,53 @@ +nid + * that you can use to load the full object, and + * $node->type to tell the content type of the node. + * + * $fields + * An array of information for every field selected in the 'Fields' + * section of this view, formatted as requested in the View setup. + * + * Calendar info for this individual calendar item is in local time -- + * the user timezone where configurable timezones are allowed and set, + * otherwise the site timezone. If this item has extends over more than + * one day, it has been broken apart into separate nodes for each calendar + * date and calendar_start will be no earlier than the start of + * the current day and calendar_end will be no later than the end + * of the current day. + * + * $calendar_start - A formatted datetime start date for this item. + * i.e. '2008-05-12 05:26:15'. + * $calendar_end - A formatted datetime end date for this item, + * the same as the start date except for fields that have from/to + * fields defined, like Date module dates. + * $calendar_start_date - a PHP date object for the start time. + * $calendar_end_date - a PHP date object for the end time. + * + * You can use PHP date functions on the date object to display date + * information in other ways, like: + * + * print date_format($calendar_start_date, 'l, j F Y - g:ia'); + * + * @see template_preprocess_calendar_month_node. + */ +?> +
+
+ + +
+ +
+ + +
+ +
+
diff --git a/sites/all/modules/calendar/theme/calendar-month.tpl.php b/sites/all/modules/calendar/theme/calendar-month.tpl.php new file mode 100644 index 0000000..903d378 --- /dev/null +++ b/sites/all/modules/calendar/theme/calendar-month.tpl.php @@ -0,0 +1,46 @@ + +
+ + + + + + + + + + + + + + + + + +
+ +
+ +
+
\ No newline at end of file diff --git a/sites/all/modules/calendar/theme/calendar-week-multiple-node.tpl.php b/sites/all/modules/calendar/theme/calendar-week-multiple-node.tpl.php new file mode 100644 index 0000000..4830fdc --- /dev/null +++ b/sites/all/modules/calendar/theme/calendar-week-multiple-node.tpl.php @@ -0,0 +1,27 @@ + +
+
+ + date_info->style_max_items_behavior != 'more'): ?> + + + +
+ date_info->style_max_items_behavior != 'more'): ?> +
+ $count)), $link) ?> +
+
+ +
»
+ +
+
diff --git a/sites/all/modules/calendar/theme/calendar-week-node.tpl.php b/sites/all/modules/calendar/theme/calendar-week-node.tpl.php new file mode 100644 index 0000000..9302601 --- /dev/null +++ b/sites/all/modules/calendar/theme/calendar-week-node.tpl.php @@ -0,0 +1,53 @@ +nid + * that you can use to load the full object, and + * $node->type to tell the content type of the node. + * + * $fields + * An array of information for every field selected in the 'Fields' + * section of this view, formatted as requested in the View setup. + * + * Calendar info for this individual calendar item is in local time -- + * the user timezone where configurable timezones are allowed and set, + * otherwise the site timezone. If this item has extends over more than + * one day, it has been broken apart into separate nodes for each calendar + * date and calendar_start will be no earlier than the start of + * the current day and calendar_end will be no later than the end + * of the current day. + * + * $calendar_start - A formatted datetime start date for this item. + * i.e. '2008-05-12 05:26:15'. + * $calendar_end - A formatted datetime end date for this item, + * the same as the start date except for fields that have from/to + * fields defined, like Date module dates. + * $calendar_start_date - a PHP date object for the start time. + * $calendar_end_date - a PHP date object for the end time. + * + * You can use PHP date functions on the date object to display date + * information in other ways, like: + * + * print date_format($calendar_start_date, 'l, j F Y - g:ia'); + * + * @see template_preprocess_calendar_week_node. + */ +?> +
+
+ + +
+ +
+ + +
+ +
+
diff --git a/sites/all/modules/calendar/theme/calendar-week.tpl.php b/sites/all/modules/calendar/theme/calendar-week.tpl.php new file mode 100644 index 0000000..869b039 --- /dev/null +++ b/sites/all/modules/calendar/theme/calendar-week.tpl.php @@ -0,0 +1,80 @@ + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + +
0 ? t('Time') : ''; ?> + +
+ 0 ? date_t('All day', 'datetime') : ''; ?> + + +
+
+ +
+
+
+ + + +
+
+ +
+
+
+
\ No newline at end of file diff --git a/sites/all/modules/calendar/theme/calendar-year.tpl.php b/sites/all/modules/calendar/theme/calendar-year.tpl.php new file mode 100644 index 0000000..8b36f5d --- /dev/null +++ b/sites/all/modules/calendar/theme/calendar-year.tpl.php @@ -0,0 +1,27 @@ + + +
+ class="mini"> + + + + + + +
+
\ No newline at end of file diff --git a/sites/all/modules/calendar/theme/theme.inc b/sites/all/modules/calendar/theme/theme.inc new file mode 100644 index 0000000..c89a0c0 --- /dev/null +++ b/sites/all/modules/calendar/theme/theme.inc @@ -0,0 +1,745 @@ +result; + $options = $view->style_plugin->options; + $handler = $view->style_plugin; + + $vars['display_type'] = $view->date_info->granularity; + $vars['min_date_formatted'] = !empty($view->date_info->min_date) ? date_format($view->date_info->min_date, DATE_FORMAT_DATETIME) : ''; + $vars['max_date_formatted'] = !empty($view->date_info->end_date) ? date_format($view->date_info->max_date, DATE_FORMAT_DATETIME) : ''; + $view->date_info->mini = isset($view->date_info->mini) ? $view->date_info->mini : $view->date_info->granularity == 'year'; + + $url = $view->get_url(); + $view->date_info->url = $url; + $arg = $view->date_info->date_arg; + $displays = $view->date_info->display_types; + + // Set up the links to other calendar views. + $current_date = $view->date_info->min_date; + if (!empty($date->info->day)) { + $current_date = date_make_date($date_info->date_arg .' 00:00:00'); + } + elseif (!empty($view->date_info->week)) { + $week = date_week_range($view->date_info->week, $view->date_info->year); + $current_date = $week[0]; + } + elseif (!empty($view->date_info->month)) { + $current_date = date_make_date($view->date_info->year .'-'. date_pad($view->date_info->month) .'-01 00:00:00'); + } + else { + $current_date = date_make_date($view->date_info->year .'-01-01 00:00:00'); + } + if (empty($view->date_info->month) || $view->date_info->month == $view->argument['date_argument']->options['wildcard']) { + $view->date_info->month = date_format($current_date, 'm'); + } + if (empty($view->date_info->day) || $view->date_info->day == $view->argument['date_argument']->options['wildcard']) { + $view->date_info->day = date_format($current_date, 'd'); + } + if (empty($view->date_info->week) || $view->date_info->week == $view->argument['date_argument']->options['wildcard']) { + $view->date_info->week = date_week($view->date_info->year .'-'. date_pad($view->date_info->month) .'-'. date_pad($view->date_info->day)); + } + + $calendar_links = array(); + $base = array('attributes' => array('rel' => 'nofollow')); + if (!empty($displays['year'])) { + $calendar_links['calendar calendar-year'] = $base + array('title' => date_t('Year', 'datetime'), 'href' => date_real_url($view, 'year')); + } + if (!empty($displays['month'])) { + $calendar_links['calendar calendar-month'] = $base + array('title' => date_t('Month', 'datetime'), 'href' => date_real_url($view, 'month')); + } + if (!empty($displays['week'])) { + $calendar_links['calendar calendar-week'] = $base + array('title' => date_t('Week', 'datetime'), 'href' => date_real_url($view, 'week')); + } + if (!empty($displays['day'])) { + $calendar_links['calendar calendar-day'] = $base + array('title' => date_t('Day', 'datetime'), 'href' => date_real_url($view, 'day')); + } + $vars['calendar_links'] = $calendar_links; + + // If the Date Popup module is enabled, add a popup date selector. + if (!empty($view->date_info->calendar_popup)) { + $vars['calendar_popup'] = '
'. calendar_date_select($view) .'
'; + } + + // If an 'Add new ... link is provided, add it here. + // the query will bring the user back here after adding the node. + if (!empty($view->date_info->calendar_date_link) + && (user_access("administer nodes") || user_access('create '. $view->date_info->calendar_date_link .' content'))) { + $name = node_get_types('name', $view->date_info->calendar_date_link); + $href = 'node/add/'. str_replace('_', '-', $view->date_info->calendar_date_link); + $query = 'destination='. $view->date_info->url; + $vars['calendar_links']['calendar calendar-add'] = $base + array( + 'title' => t('Add+'), + 'href' => $href, + 'query' => $query, + ); + } + + $vars['view'] = $view; + $vars['mini'] = !empty($view->date_info->mini); + $vars['block'] = !empty($view->date_info->block); + $vars['block_identifier'] = date_block_identifier($view); + +} + +/** + * Display a view as a calendar. + * + * This preprocessor does all the work needed for all types of calendar + * views and the template takes care of displaying links to related views. + */ +function template_preprocess_calendar(&$vars) { + require_once('./'. drupal_get_path('module', 'calendar') .'/includes/calendar.inc'); + $view = $vars['view']; + + // Make sure we only run through this function one time. + if (!empty($view->date_info->calendar_processed)) { + return; + } + + $result = (array) $view->result; + $options = $view->style_plugin->options; + $handler = $view->style_plugin; + + $fields = $view->field; + + // Render each field into an output array. We have to do the rendering + // here because we don't apppear to have full access to the view + // handlers in the theme functions. + $items = array(); + $calendar_fields = date_api_fields($view->base_table); + $calendar_fields = array_keys($calendar_fields['alias']); + + foreach ($result as $num => $row) { + $copy = drupal_clone($row); + $items[$num] = $row; + $items[$num]->raw = $copy; + $items[$num]->calendar_fields = new stdClass(); + + foreach ($row as $key => $value) { + if (in_array($key, $calendar_fields)) { + $items[$num]->calendar_fields->$key = $value; + } + } + foreach ($fields as $name => $field) { + // Some fields, like the node edit and delete links, have no alias. + $field_alias = $field->field_alias != 'unknown' ? $field->field_alias : $name; + if (!empty($field) && is_object($field)) { + // Theme the copy instead of the original row so duplicate date + // fields each get a fresh copy of the original data to theme. + $items[$num]->{$field_alias} = $field->theme($copy); + } + if (!empty($field->options['exclude'])) { + if (isset($items[$num]->{$field_alias})) unset($items[$num]->{$field_alias}); + } + } + } + + $vars['display_type'] = $view->date_info->granularity; + $vars['min_date_formatted'] = date_format($view->date_info->min_date, DATE_FORMAT_DATETIME); + $vars['max_date_formatted'] = date_format($view->date_info->max_date, DATE_FORMAT_DATETIME); + + // Massage the resulting items into formatted calendar items. + $items = calendar_build_nodes($view, $items); + + // Merge in items from other sources. + foreach (module_implements('calendar_add_items') as $module) { + $function = $module .'_calendar_add_items'; + if (function_exists($function)) { + if ($feeds = $function($view)) { + foreach ($feeds as $feed) { + $items = $feed; + } + } + } + } + + $view->date_info->mini = isset($view->date_info->mini) ? $view->date_info->mini : $view->date_info->granularity == 'year'; + + // Create the calendar day names and rows. + $rows = calendar_build_calendar($view, $items); + + $vars['items'] = $items; + $vars['rows'] = $rows; + + $view->date_info->calendar_processed = TRUE; + $vars['view'] = $view; + $vars['mini'] = !empty($view->date_info->mini); + $vars['block'] = !empty($view->date_info->block); +} + +/** + * Display a month view. + */ +function template_preprocess_calendar_month(&$vars) { + // Add in all the $vars added by the main calendar preprocessor. + template_preprocess_calendar($vars); + $view = $vars['view']; + + $rows = $vars['rows']; + + if (sizeof($rows) > 1) { + $day_names = array_shift($rows); + } + else { + $day_names = $rows; + $rows = array(); + } + + $month_rows = $rows; + foreach ($rows as $weekno => $row) { + foreach ($row as $day => $data) { + $cell = $data['data']; + + // If this cell is already rendered, like the weekno column, + // move to the next item. + if (!is_array($cell)) { + $month_rows[$weekno][$day]['data'] = $cell; + continue; + } + $data = $cell['datebox']; + if ($cell['empty']) { + $data .= $cell['empty']; + } + else { + $data .= implode($cell['all_day']); + foreach ($cell['items'] as $hour => $item) { + $data .= implode($item); + } + $data .= $cell['link']; + } + if ($view->date_info->mini) { + $month_rows[$weekno][$day]['data'] = $data; + } + else { + $month_rows[$weekno][$day]['data'] = '
'. $data .'
'; + } + } + } + + $vars['rows'] = $month_rows; + $vars['day_names'] = $day_names; + + $vars['display_type'] = $view->date_info->granularity; + $vars['min_date_formatted'] = date_format($view->date_info->min_date, DATE_FORMAT_DATETIME); + $vars['max_date_formatted'] = date_format($view->date_info->max_date, DATE_FORMAT_DATETIME); +} + +/** + * Display a mini month view. + */ +function template_preprocess_calendar_mini(&$vars) { + // Add in all the $vars added by the main calendar preprocessor. + template_preprocess_calendar_month($vars); + + $view = $vars['view']; + $view->date_info->show_title = !empty($view->date_info->show_title) ? $view->date_info->show_title : FALSE; + $vars['show_title'] = $view->date_info->show_title; + $vars['view'] = $view; +} + +/** + * Display a year view. + */ +function template_preprocess_calendar_year(&$vars) { + // Add in all the $vars added by the main calendar preprocessor. + $vars['view']->date_info->style_with_weekno = FALSE; + template_preprocess_calendar($vars); + + // Get the url of the year view and remove the year argument from it. + // TODO clean this up in case there is another arg that looks like + // the year to make sure only the year gets removed. + $view = $vars['view']; + $year = date_format($view->date_info->min_date, 'Y'); + + // Construct a calendar for each month, adjusting the $view passed + // to the theme so it will produce the right results. + $view = drupal_clone($vars['view']); + $rows = $vars['rows']; + $months = array(); + foreach ($rows as $month => $month_rows) { + $view->date_info->month = $month; + $view->date_info->granularity = 'month'; + $view->date_info->mini = TRUE; + $view->date_info->hide_nav = TRUE; + $view->date_info->show_title = TRUE; + $view->date_info->url = date_real_url($view, NULL, date_pad($year, 4) .'-'. date_pad($month)); + $view->date_info->min_date = date_make_date($view->date_info->year .'-'. date_pad($month) .'-01 00:00:00', date_default_timezone_name()); + $view->date_info->max_date = drupal_clone($view->date_info->min_date); + date_modify($view->date_info->max_date, '+1 month'); + date_modify($view->date_info->max_date, '-1 second'); + $months[$month] = theme('calendar_mini', $view, $vars['options'], $month_rows); + } + $vars['months'] = $months; + $vars['view']->date_info->hide_nav = FALSE; + $vars['view']->date_info->granularity = 'year'; + +} + +/** + * Display a day view. + */ +function template_preprocess_calendar_day(&$vars) { + + // Add in all the $vars added by the main calendar preprocessor. + $vars['view']->style_with_weekno = FALSE; + template_preprocess_calendar($vars); + + $view = $vars['view']; + $rows = $vars['rows']; + + $item_count = 0; + $by_hour_count = 0; + $grouping_field = $view->date_info->style_groupby_field; + + // If we're not grouping by time, move all items into the 'all day' array. + if (empty($view->date_info->style_groupby_times)) { + // Items are already grouped into times, so we need to process each time-group. + foreach ($rows['items'] as $time => $items) { + foreach($items as $item) { + $rows['all_day'][] = $item; + } + } + $rows['items'] = array(); + } + + $columns = array(); + + // Move all_day items into the right columns and render them. + $grouped_items = array(); + foreach ($rows['all_day'] as $item) { + if (isset($item->{$grouping_field})) { + $column = $item->{$grouping_field}; + $item->{$grouping_field} = ''; // Remove the grouping field from the results. + if (!in_array($column, $columns)) { + $columns[] = $column; + } + } + else { + $column = t('Items'); + } + $theme = isset($item->calendar_node_theme) ? $item->calendar_node_theme : 'calendar_'. $view->date_info->granularity .'_node'; + $grouped_items[$column][] = theme($theme, $item, $view); + $item_count++; + } + $vars['rows']['all_day'] = $grouped_items; + + // Moved timed items into the right columns and render them. + $start_times = $view->date_info->style_groupby_times; + $show_empty_times = $view->date_info->style_show_empty_times; + $end_start_time = '23:59:59'; + $start_time = array_shift($start_times); + $next_start_time = count($start_times) ? array_shift($start_times) : $end_start_time; + + $grouped_items = array(); + foreach ($rows['items'] as $time => $items) { + foreach ($items as $item) { + if (isset($item->{$grouping_field})) { + $column = $item->{$grouping_field}; + $item->{$grouping_field} = ''; // Remove the grouping field from the results. + if (!in_array($column, $columns)) { + $columns[] = $column; + } + } + else { + $column = t('Items'); + } + // Find the next time slot and fill it. Populate the skipped + // slots if the option to show empty times was chosen. + while ($time >= $next_start_time && $time < $end_start_time) { + if ((!empty($show_empty_times)) && !array_key_exists($start_time, $grouped_items)) { + $grouped_items[$start_time]['values'] = array(); + } + $start_time = $next_start_time; + $next_start_time = count($start_times) ? array_shift($start_times) : $end_start_time; + } + $theme = isset($item->calendar_node_theme) ? $item->calendar_node_theme : 'calendar_'. $view->date_info->granularity .'_node'; + $grouped_items[$start_time]['values'][$column][] = theme($theme, $item, $view); + $item_count++; + $by_hour_count++; + } + } + + // Finish out the day's time values if we want to see empty times. + if (!empty($show_empty_times)) { + while ($start_time < $end_start_time) { + if (!array_key_exists($start_time, $grouped_items)) { + $grouped_items[$start_time]['values'] = array(); + } + $start_time = $next_start_time; + $next_start_time = count($start_times) ? array_shift($start_times) : $end_start_time; + } + } + + // Do the headers last, once we know what the actual values are. + $i = 0; + $start_times = array_keys($grouped_items); + foreach ($start_times as $start_time) { + $next_start_time = array_key_exists($i + 1, $start_times) ? $start_times[$i + 1] : '23:59:59'; + $heading = theme('calendar_time_row_heading', $start_time, $next_start_time, $rows['date']); + $grouped_items[$start_time]['hour'] = $heading['hour']; + $grouped_items[$start_time]['ampm'] = $heading['ampm']; + $i++; + } + ksort($grouped_items); + $vars['rows']['items'] = $grouped_items; + + if (empty($columns)) { + $columns = array(t('Items')); + } + $vars['columns'] = $columns; + + $vars['agenda_hour_class'] = 'calendar-agenda-hour'; + $first_column_width = 10; + + if (empty($view->date_info->style_groupby_times)) { + $vars['agenda_hour_class'] .= ' calendar-agenda-no-hours'; + $first_column_width = 1; + } + + $vars['first_column_width'] = $first_column_width; + if (count($columns)) { + $vars['column_width'] = round((100 - $first_column_width)/count($columns)); + } + else { + $vars['column_width'] = (100 - $first_column_width); + } + $vars['item_count'] = $item_count; + $vars['by_hour_count'] = $by_hour_count; + return; +} + +/** + * Display a week view. + */ +function template_preprocess_calendar_week(&$vars) { + // Add in all the $vars added by the main calendar preprocessor. + $vars['view']->style_with_weekno = FALSE; + template_preprocess_calendar($vars); + + $view = $vars['view']; + $rows = $vars['rows']; + $item_count = 0; + $by_hour_count = 0; + + if (sizeof($rows) > 1) { + $day_names = array_shift($rows); + } + else { + $day_names = $rows; + $rows = array(); + } + + // Moved timed items into the right columns and render them. + $show_empty_times = $view->date_info->style_show_empty_times; + $end_start_time = '23:59:59'; + + $grouped_items = array(); + $vars['rows'] = $rows[0]; + foreach ($rows[0] as $weekno => $row) { + $vars['rows'][$weekno] = $row['data']; + + // If we're not grouping by time, move all items into the 'all day' array. + if (empty($view->date_info->style_groupby_times)) { + foreach ($row['data']['items'] as $item) { + $row['data']['all_day'] = array_merge($row['data']['all_date'], $item); + } + $row['data']['items'] = array(); + } + + $columns[] = $weekno; + $start_times = $view->date_info->style_groupby_times; + $start_time = array_shift($start_times); + $next_start_time = count($start_times) ? array_shift($start_times) : $end_start_time; + foreach ($row['data']['all_day'] as $key => $item) { + $theme = isset($item->calendar_node_theme) ? $item->calendar_node_theme : 'calendar_'. $view->date_info->granularity .'_node'; + $vars['rows'][$weekno]['all_day'][$key] = theme($theme, $item, $view); + $item_count++; + } + foreach ($row['data']['items'] as $time => $items) { + foreach ($items as $item) { + // Find the next time slot and fill it. Populate the skipped + // slots if the option to show empty times was chosen. + while ($time >= $next_start_time && $time < $end_start_time) { + if (($show_empty_times) && !array_key_exists($start_time, $grouped_items)) { + $grouped_items[$start_time]['values'][$weekno] = array(); + } + $start_time = $next_start_time; + $next_start_time = count($start_times) ? array_shift($start_times) : $end_start_time; + } + $theme = isset($item->calendar_node_theme) ? $item->calendar_node_theme : 'calendar_'. $view->date_info->granularity .'_node'; + $grouped_items[$start_time]['values'][$weekno][] = theme($theme, $item, $view); + $item_count++; + $by_hour_count++; + } + } + + // Finish out the day's time values if we want to see empty times. + if ($show_empty_times) { + while ($start_time < $end_start_time) { + if (!array_key_exists($start_time, $grouped_items)) { + $grouped_items[$start_time]['values'][$weekno] = array(); + } + $start_time = $next_start_time; + $next_start_time = count($start_times) ? array_shift($start_times) : $end_start_time; + } + } + } + ksort($grouped_items); + + // Do the headers last, once we know what the actual values are. + $i = 0; + $start_times = array_keys($grouped_items); + foreach ($start_times as $start_time) { + $next_start_time = array_key_exists($i + 1, $start_times) ? $start_times[$i + 1] : '23:59:59'; + $heading = theme('calendar_time_row_heading', $start_time, $next_start_time, $row['data']['date']); + $grouped_items[$start_time]['hour'] = $heading['hour']; + $grouped_items[$start_time]['ampm'] = $heading['ampm']; + } + + $vars['items'] = $grouped_items; + + $vars['day_names'] = $day_names; + $vars['columns'] = $columns; + $vars['start_times'] = $view->date_info->style_groupby_times; + + $vars['agenda_hour_class'] = 'calendar-agenda-hour'; + $first_column_width = 10; + + if (empty($view->date_info->style_groupby_times)) { + $vars['agenda_hour_class'] .= ' calendar-agenda-no-hours'; + $first_column_width = 1; + } + $vars['item_count'] = $item_count; + $vars['by_hour_count'] = $by_hour_count; + return; +} + +/** + * Create the calendar date box. + */ +function template_preprocess_calendar_datebox(&$vars) { + $date = $vars['date']; + $view = $vars['view']; + + $vars['day'] = intval(substr($date, 8, 2)); + $force_view_url = !empty($view->date_info->block) ? TRUE : FALSE; + $vars['url'] = date_real_url($view, NULL, $date, $force_view_url); + $vars['link'] = !empty($view->date_info->display_types['day']) ? l($vars['day'], $vars['url']) : $vars['day']; + $vars['granularity'] = $view->date_info->granularity; + $vars['mini'] = $view->date_info->mini; + + if ($view->date_info->mini) { + if (!empty($vars['selected'])) { + $vars['class'] = 'mini-day-on'; + } + else { + $vars['class'] = 'mini-day-off'; + } + } + else { + $vars['class'] = 'day'; + } +} + +/** + * Format an calendar node for display. + */ +function template_preprocess_calendar_node(&$vars) { + $node = $vars['node']; + $view = $vars['view']; + $fields = array(); + foreach ($view->field as $name => $field) { + // Some fields, like the node edit and delete links, have no alias. + $field_alias = $field->field_alias != 'unknown' ? $field->field_alias : $name; + if (!empty($node->$field_alias)) { + $data = $node->$field_alias; + $label = $field->options['label']; + + // CCK has some special label options. + if (!empty($field->content_field)) { + switch ($field->options['label_type']) { + case 'none': + $label = ''; + break; + case 'widget': + $label = $field->content_field['widget']['label']; + break; + } + } + $fields[$field_alias] = array( + 'id' => views_css_safe($field_alias), + 'label' => $label, + 'data' => $data, + ); + } + } + $vars['fields'] = $fields; + $vars['calendar_start'] = $node->calendar_start; + $vars['calendar_end'] = $node->calendar_end; + $vars['calendar_start_date'] = $node->calendar_start_date; + $vars['calendar_end_date'] = $node->calendar_end_date; + + // We added the node type to the results in the query, + // but it will show up as $node->node_type instead of + // $node->type. Rename it to match the normal way it + // would show up on a node object. + $vars['node']->type = $vars['node']->node_type; +} + +/** + * Format an calendar month node for display. + */ +function template_preprocess_calendar_month_node(&$vars) { + template_preprocess_calendar_node($vars); +} + +/** + * Format an calendar month node for display. + */ +function template_preprocess_calendar_month_multiple_node(&$vars) { + $view = $vars['view']; + $curday = $vars['curday']; + + // get the year month and date + $parts = explode('-', substr($curday, 0, 10)); + $year = $parts[0]; + $month = intval($parts[1]); + $day = intval($parts[2]); + + // create the link to the day + $vars['link'] = date_real_url($view, NULL, date_pad($year, 4) .'-'. date_pad($month) .'-'. date_pad($day)); +} + +/** + * Format an calendar day node for display. + */ +function template_preprocess_calendar_day_node(&$vars) { + template_preprocess_calendar_node($vars); + $node = $vars['node']; + // Remote items may have a teaser to show. + if (!empty($node->remote) && !empty($node->teaser)) { + $fields['teaser'] = '
'. ($node->teaser) ."
\n"; + } +} + +/** + * Format an calendar week node for display. + */ +function template_preprocess_calendar_week_node(&$vars) { + template_preprocess_calendar_node($vars); +} + +/** + * Format an calendar week node for display. + */ +function template_preprocess_calendar_week_multiple_node(&$vars) { + $view = $vars['view']; + $curday = $vars['curday']; + + // get the year month and date + $parts = explode('-', substr($curday, 0, 10)); + $year = $parts[0]; + $month = intval($parts[1]); + $day = intval($parts[2]); + + // create the link to the day + $vars['link'] = date_real_url($view, NULL, date_pad($year, 4) .'-'. date_pad($month) .'-'. date_pad($day)); +} + +/** + * Format the time row headings in the week and day view. + */ +function theme_calendar_time_row_heading($start_time, $next_start_time, $curday_date) { + static $format_hour, $format_ampm; + if (empty($format_hour)) { + $format = variable_get('date_format_short', 'm/d/Y - H:i'); + $format_hour = str_replace(array('a', 'A'), '', date_limit_format($format, array('hour', 'minute'))); + $format_ampm = strstr($format, 'a') ? 'a' : (strstr($format, 'A') ? 'A' : ''); + } + if ($start_time == '00:00:00' && $next_start_time == '23:59:59') { + $hour = t('All times'); + } + elseif ($start_time == '00:00:00') { + $date = date_create($curday_date .' '. $next_start_time); + $hour = t('Before @time', array('@time' => date_format($date, $format_hour))); + } + else { + $date = date_create($curday_date .' '. $start_time); + $hour = date_format($date, $format_hour); + } + if (!empty($date)) { + $ampm = date_format($date, $format_ampm); + } + else { + $ampm = ''; + } + return array('hour' => $hour, 'ampm' => $ampm); +} + +/** + * Format a node stripe legend + */ +function theme_calendar_stripe_legend() { + if (empty($GLOBALS['calendar_stripes'])) { + return ''; + } + $header = array( + array('class' => 'calendar-legend', 'data' => t('Item')), + array('class' => 'calendar-legend', 'data' => t('Key')) + ); + $rows = array(); + $output = ''; + foreach ((array) $GLOBALS['calendar_stripes'] as $label => $stripe) { + if($stripe){ + $rows[] = array($label, '
 
'); + } + } + if (!empty($rows)) { + $output .= theme('table', $header, $rows, array('class' => 'mini calendar-legend')); + } + return $output; +} + +/** + * Format node stripes + */ +function theme_calendar_stripe_stripe($node) { + if (empty($node->stripe) || (!count($node->stripe))) { + return; + } + $output = ''; + if(is_array($node->stripe_label)){ + foreach($node->stripe_label as $k => $stripe_label){ + if(!empty($node->stripe[$k]) && !empty($stripe_label)) { + $GLOBALS['calendar_stripes'][$stripe_label] = $node->stripe[$k]; + $output.= '
 
'."\n"; + } + } + } + return $output; +} + +/** + * Format an empty day on a calendar + * + * @param day + * The day to display. + */ +function theme_calendar_empty_day($curday, $view) { + + if ($view->date_info->calendar_type != 'day') { + return '
 
'."\n"; + } + else { + return '
'. t('Empty day') .'
'; + } +} + +/** @} End of addtogroup themeable */ diff --git a/sites/all/modules/calendar/theme/translations/theme.cs.po b/sites/all/modules/calendar/theme/translations/theme.cs.po new file mode 100644 index 0000000..45f832a --- /dev/null +++ b/sites/all/modules/calendar/theme/translations/theme.cs.po @@ -0,0 +1,30 @@ +# $Id: theme.cs.po,v 1.1.2.1 2010/10/22 20:06:37 wojtha Exp $ +# +# Czech translation of Calendar (6.x-2.2) +# Copyright (c) 2010 by the Czech translation team +# +msgid "" +msgstr "" +"Project-Id-Version: Calendar (6.x-2.2)\n" +"POT-Creation-Date: 2010-10-22 20:03+0000\n" +"PO-Revision-Date: 2010-09-29 21:22+0000\n" +"Language-Team: Czech\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=utf-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Plural-Forms: nplurals=3; plural=((((n%10)==1)&&((n%100)!=11))?(0):(((((n%10)>=2)&&((n%10)<=4))&&(((n%100)<10)||((n%100)>=20)))?(1):2));\n" + +msgid "Item" +msgstr "Položka" +msgid "Items" +msgstr "Položky" +msgid "Key" +msgstr "Klíč" +msgid "Add+" +msgstr "Přidat+" +msgid "All times" +msgstr "Všechny časy" +msgid "Before @time" +msgstr "Před @time" +msgid "Empty day" +msgstr "Den bez události" diff --git a/sites/all/modules/calendar/translations/calendar.pot b/sites/all/modules/calendar/translations/calendar.pot new file mode 100644 index 0000000..5817f90 --- /dev/null +++ b/sites/all/modules/calendar/translations/calendar.pot @@ -0,0 +1,102 @@ +# $Id$ +# +# LANGUAGE translation of Drupal (general) +# Copyright YEAR NAME +# Generated from files: +# calendar.module,v 1.121.2.35 2009/02/14 16:51:50 karens +# calendar.info,v 1.8 2008/04/23 23:42:53 karens +# calendar.install,v 1.13.2.10 2009/02/15 13:39:01 karens +# +#, fuzzy +msgid "" +msgstr "" +"Project-Id-Version: PROJECT VERSION\n" +"POT-Creation-Date: 2009-02-17 05:01-0600\n" +"PO-Revision-Date: YYYY-mm-DD HH:MM+ZZZZ\n" +"Last-Translator: NAME \n" +"Language-Team: LANGUAGE \n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=utf-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Plural-Forms: nplurals=INTEGER; plural=EXPRESSION;\n" + +#: calendar.module:28 +msgid "

View complete documentation at !link.

" +msgstr "" + +#: calendar.module:141 +msgid "Calendar Legend." +msgstr "" + +#: calendar.module:147 +msgid "Calendar Legend" +msgstr "" + +#: calendar.module:159 +msgid "Year" +msgstr "" + +#: calendar.module:159 +msgid "Month" +msgstr "" + +#: calendar.module:159 +msgid "Day" +msgstr "" + +#: calendar.module:159 +msgid "Week" +msgstr "" + +#: calendar.module:339 +msgid "Change date" +msgstr "" + +#: calendar.module:423 +msgid "The Date argument in this view must be set up to provide a default value set to the current date. Edit the argument, find 'Action to take if argument is not present.', choose 'Provide default argument', then select 'Current date'." +msgstr "" + +#: calendar.module:460 +msgid " is not a valid hex color" +msgstr "" + +#: calendar.module:501 calendar.info:0 +msgid "Calendar" +msgstr "" + +#: calendar.module:503 +msgid "View the calendar." +msgstr "" + +#: calendar.module:0 +msgid "calendar" +msgstr "" + +#: calendar.install:146;169;185 +msgid "Calendar module cannot be updated until after Views has been updated. Please return to
update.php and run the remaining updates." +msgstr "" + +#: calendar.install:147;170;186 +msgid "calendar.module has updates, but cannot be updated until views.module is updated first." +msgstr "" + +#: (duplicate) calendar.install:26 ;35 +msgid "Calendar requirements" +msgstr "" + +#: (duplicate) calendar.install:27 +msgid "The Calendar module requires a more current version of the Date API. Please check for a newer version." +msgstr "" + +#: (duplicate) calendar.install:36 +msgid "The Calendar module requires the latest version of the Date API, be sure you are installing the latest versions of both modules." +msgstr "" + +#: calendar.info:0 +msgid "Views plugin to display views containing dates as Calendars." +msgstr "" + +#: calendar.info:0 +msgid "Date/Time" +msgstr "" + diff --git a/sites/all/modules/calendar/translations/de.po b/sites/all/modules/calendar/translations/de.po new file mode 100644 index 0000000..d1c4e19 --- /dev/null +++ b/sites/all/modules/calendar/translations/de.po @@ -0,0 +1,578 @@ +# $Id$ +# +# LANGUAGE translation of Drupal (general) +# Copyright 2009 NAME +# Generated from files: +# calendar.module,v 1.121.2.38 2009/03/17 18:03:36 karens +# calendar.info,v 1.8 2008/04/23 23:42:53 karens +# calendar.views.inc,v 1.1.2.9 2009/01/23 21:05:41 karens +# calendar.install,v 1.13.2.11 2009/03/17 18:03:36 karens +# calendar_ical.info,v 1.1.2.1 2008/09/05 11:03:42 karens +# jcalendar.info,v 1.1.4.2 2008/06/23 14:55:01 karens +# calendar_ical.views.inc,v 1.1.2.6 2009/02/16 23:46:22 karens +# calendar_ical_admin.inc,v 1.1.2.2 2008/10/02 20:23:49 karens +# calendar_plugin_display_ical.inc,v 1.1.2.5 2008/11/25 16:12:36 karens +# calendar_view_plugin_style.inc,v 1.1.2.19 2009/02/17 18:09:35 karens +# calendar_plugin_style_ical.inc,v 1.1.2.17 2009/04/28 22:47:29 karens +# calendar_plugin_style.inc,v 1.1.2.15 2009/05/11 23:52:15 karens +# calendar_ical.module,v 1.1.2.6 2008/11/24 15:48:15 karens +# calendar_plugin_display_attachment.inc,v 1.1.2.17 2009/03/17 18:03:36 karens +# calendar_plugin_display_page.inc,v 1.1.2.20 2009/07/24 19:44:09 karens +# calendar_plugin_display_block.inc,v 1.1.2.10 2008/12/06 14:56:15 karens +# jcalendar.module,v 1.1.4.16 2009/07/28 21:38:07 karens +# calendar-month-multiple-node.tpl.php,v 1.1.2.5 2009/02/14 16:51:50 karens +# calendar-week-multiple-node.tpl.php,v 1.1.2.4 2008/11/20 12:29:14 karens +# calendar-day.tpl.php,v 1.7.2.9 2009/07/28 21:50:50 karens +# calendar-week.tpl.php,v 1.5.2.6 2009/02/16 23:46:22 karens +# theme.inc,v 1.10.2.72 2009/07/02 14:42:08 karens +# +msgid "" +msgstr "" +"Project-Id-Version: PROJECT VERSION\n" +"POT-Creation-Date: 2009-10-19 14:31+0200\n" +"PO-Revision-Date: 2009-10-19 18:32+0100\n" +"Last-Translator: Thomas Zahreddin \n" +"Language-Team: German \n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Plural-Forms: nplurals=2; plural=(n != 1);\n" +"X-Poedit-Language: German\n" +"X-Poedit-Country: Germany\n" +"X-Poedit-SourceCharset: utf8\n" + +#: calendar.module:28 +msgid "

View complete documentation at !link.

" +msgstr " Komplette Dokumentation

" + +#: calendar.module:138 +msgid "Calendar Legend." +msgstr "Kalender Legende." + +#: calendar.module:144 +msgid "Calendar Legend" +msgstr "Kalender Legende." + +#: calendar.module:156 +msgid "Year" +msgstr "Jahr" + +#: calendar.module:156 +msgid "Month" +msgstr "Monat" + +#: calendar.module:156 +msgid "Day" +msgstr "Tag" + +#: calendar.module:156 +msgid "Week" +msgstr "Woche" + +#: calendar.module:336 +msgid "Change date" +msgstr "Datum ändern" + +#: calendar.module:394 +msgid "The Date argument in this view must be set up to provide a default value set to the current date. Edit the argument, find 'Action to take if argument is not present.', choose 'Provide default argument', then select 'Current date'." +msgstr "Für das Datum als Argument muss in dieser Ansicht ein Standardwert eingerichtet werden z.B. das aktuelle Datum. Legen Sie fest, wie sich das System verhält, 'Wenn kein Argument vorhanden ist, dann ... \", wird dieses durch das \"Standard-Argument \" ersetzt, z.B. das aktuelles Datum ." + +#: calendar.module:431 +msgid " is not a valid hex color" +msgstr " Keine gültige Farbe (im Hex-Format)" + +#: calendar.module:472 +#: calendar.info:0 +#: includes/calendar.views.inc:195 +msgid "Calendar" +msgstr "Kalender" + +#: calendar.module:474 +msgid "View the calendar." +msgstr "Kalender anzeigen" + +#: calendar.install:147;170;186 +msgid "Calendar module cannot be updated until after Views has been updated. Please return to update.php and run the remaining updates." +msgstr "Calendar-Modul kann erst aktualisiert werden, nachdem Views aktualisiert wurde. Bitte auf update.php die ausstehenden Updates durchfürhren." + +#: calendar.install:148;171;187 +msgid "calendar.module has updates, but cannot be updated until views.module is updated first." +msgstr "Bitte das Views Modul für diese Version des Calendar.module aktualisieren." + +#: (duplicate) calendar.install:26 +#: ;35 +msgid "Calendar requirements" +msgstr "Anforderungen des Moduls Calendar" + +#: (duplicate) calendar.install:27 +msgid "The Calendar module requires a more current version of the Date API. Please check for a newer version." +msgstr "Das Calendar Modul ist auf eine aktuelle Version des Moduls Date API angewiesen. Bitte prüfen Sie die Version beider Module. Bitte überprüfen Sie für eine neuere Version." + +#: (duplicate) calendar.install:36 +msgid "The Calendar module requires the latest version of the Date API, be sure you are installing the latest versions of both modules." +msgstr "[fuzzy] Das Calendar Modul ist auf eine aktuelle Version des Moduls Date API angewiesen. Bitte prüfen Sie die Version beider Module." + +#: calendar.info:0 +msgid "Views plugin to display views containing dates as Calendars." +msgstr "Plugin für Views zur Anzeige von Kalendern." + +#: calendar.info:0 +#: calendar_ical/calendar_ical.info:0 +#: jcalendar/jcalendar.info:0 +msgid "Date/Time" +msgstr "Datum / Zeit" + +#: calendar_ical/calendar_ical.views.inc:30;42;64 +msgid "iCal feed" +msgstr "ical NewsFeed" + +#: calendar_ical/calendar_ical.views.inc:31 +msgid "Display the view as an iCal feed." +msgstr "Die Ansicht als Newsfeed anzeigen, mit ical-Daten." + +#: calendar_ical/calendar_ical.views.inc:65 +msgid "Generates an iCal feed from a view." +msgstr " Generiert einen ical-Newsfeed aus einer Ansicht." + +#: calendar_ical/calendar_ical_admin.inc:22 +msgid "Expire iCal cache" +msgstr "iCal Cache leeren" + +#: calendar_ical/calendar_ical_admin.inc:24 +msgid "iCal feeds are cached to improve performance. Set an expiration time for cached feeds." +msgstr "iCal-Feeds zwischenspeichern, um die Leistung zu verbessern. Legen Sie eine Ablaufzeit für NewsFeeds im Cache fest." + +#: calendar_ical/calendar_ical_admin.inc:30 +msgid "iCal Feeds" +msgstr "RSS-Newsfeeds mit iCal-Dateien" + +#: calendar_ical/calendar_ical_admin.inc:31 +msgid "Use this section to set up iCal feeds that should be displayed in this calendar. They will be shown along with any internal items that match the calendar criteria." +msgstr "Einen iCal-Feed einrichten, dessen Einträge in diesem Kalender angezeigt werden. Sie werden mit den Kalendereinträgen, die den Kriterien entsprechen, zusammen angezeigt." + +#: calendar_ical/calendar_ical_admin.inc:42 +msgid "Feed type" +msgstr "Typ des RSS-Newsfeed" + +#: calendar_ical/calendar_ical_admin.inc:47 +msgid "Name" +msgstr "Name" + +#: calendar_ical/calendar_ical_admin.inc:50 +msgid "The name of a feed to include in this calendar." +msgstr "Der Name eines RSS-Newsfeeds, der in einen Kalender aufgenommen wird." + +#: calendar_ical/calendar_ical_admin.inc:53 +msgid "Url" +msgstr "URL" + +#: calendar_ical/calendar_ical_admin.inc:57 +msgid "The external feed url or internal file path and name. Change 'webcal://' to 'http://'." +msgstr "Die Feed-URL externe oder interne Dateipfade und -namen. Wandele \"webcal://' zu 'http:// '." + +#: calendar_ical/calendar_ical_admin.inc:61 +msgid "Stripe color" +msgstr "Die Farbe der Streifen" + +#: calendar_ical/calendar_ical_admin.inc:67 +msgid "The hex color value (like #ffffff) to use for this feed's calendar stripe." +msgstr "Eine Farbe hexadezimal z.B. #ffffff angegeben, um einen RSS-Newsfeed eines Kalenders mit Streifen zu versehen." + +#: calendar_ical/calendar_ical_admin.inc:77 +msgid "Submit" +msgstr "Speichern" + +#: calendar_ical/calendar_plugin_display_ical.inc:81 +msgid "iCal settings" +msgstr "iCal Einstellungen" + +#: calendar_ical/calendar_plugin_display_ical.inc:85 +msgid "Using the site name" +msgstr "Der Name der Website wird verwendet" + +#: calendar_ical/calendar_plugin_display_ical.inc:93 +msgid "Multiple displays" +msgstr "Mehrere Anzeigen" + +#: calendar_ical/calendar_plugin_display_ical.inc:103 +#: includes/calendar_view_plugin_style.inc:87 +msgid "None" +msgstr "Keine" + +#: calendar_ical/calendar_plugin_display_ical.inc:108;135 +msgid "Attach to" +msgstr "Anhängen an" + +#: calendar_ical/calendar_plugin_display_ical.inc:127 +msgid "Use the site name for the title" +msgstr "Den Namen der Website für den Titel verwenden." + +#: calendar_ical/calendar_plugin_display_ical.inc:144 +msgid "The ical icon will be shown only on the selected displays." +msgstr "Die iCal Symbol wird nur auf den ausgewählten Displays angezeigt." + +#: calendar_ical/calendar_plugin_display_ical.inc:150 +msgid "This view will be displayed by visiting this path on your site. It is recommended that the path be something like \"path/%/%/ical\", putting one % in the path for each argument you have defined in the view." +msgstr "Diese Ansicht wird dem Benutzer unter diesem Pfad auf Ihrer Website angezeigt werden. Es wird empfohlen, dass die URL so etwas wie \"pfad_zur_Ansicht/%/%/ical\", enthält, jedes % ist eine Variable für das Modul Views." + +#: calendar_ical/calendar_plugin_display_ical.inc:203 +msgid "A Calendar period display will not work without a Date argument or a Date filter." +msgstr "Zur Anzeige eines Zeitraums im Kalender ist ein Datum oder ein Datumsfilter erforderlich." + +#: calendar_ical/calendar_plugin_style_ical.inc:70 +msgid "Map the View fields to the values they should represent in the iCal feed. Only fields that have been added to the view are available to use in this way. You can add additional fields to the view and mark them 'Exclude from display' if you only want them in the iCal feed." +msgstr "Felder aus der Ansicht Feldern im iCal-Feed zuordnen. Nur Felder, die der Ansicht hinzugefügt wurden, lassen sich in dieser Weise nutzen. Sie können zusätzliche Felder zur Ansicht hinzufügen und markieren diese mit \"Ausschließen aus der Anzeige\", wenn die Felder nur im iCal-Feed.erscheinen sollen." + +#: calendar_ical/calendar_plugin_style_ical.inc:74 +msgid "Title" +msgstr "Titel" + +#: calendar_ical/calendar_plugin_style_ical.inc:81 +msgid "Description" +msgstr "Beschreibung" + +#: calendar_ical/calendar_plugin_style_ical.inc:87 +msgid "Location" +msgstr "Standort" + +#: calendar_ical/calendar_plugin_style_ical.inc:107 +msgid "The @style style requires a Date argument or a Date filter." +msgstr "@style erfordert ein Datum als Argument oder einen Datums Filter." + +#: calendar_ical/calendar_plugin_style_ical.inc:120 +msgid "The @style style requires a Title field for the iCal export." +msgstr "@style erfordert ein Feld Titel für iCal." + +#: calendar_ical/calendar_plugin_style_ical.inc:134 +#: includes/calendar_plugin_style.inc:106 +msgid "The date field '@field' used by the display '@display_title' cannot be set to 'Group multiple values'." +msgstr "Das Feld mit Datum '@field' verwendet zur Anzeige über '@display_title' kann nicht zum gruppieren verwendet werden." + +#: calendar_ical/calendar_ical.module:29;29 +msgid "Add to calendar" +msgstr "Zum Kalender hinzufügen" + +#: calendar_ical/calendar_ical.info:0 +msgid "Calendar iCal" +msgstr "Kalender iCal" + +#: calendar_ical/calendar_ical.info:0 +msgid "Adds ical functionality to Calendar views." +msgstr "iCals zu Kalenderansichten hinzufügen." + +#: includes/calendar.views.inc:114;127 +msgid "Calendar page" +msgstr "Kalenderblatt" + +#: includes/calendar.views.inc:115 +msgid "Calendar page. Attach Calendar period attachments to this page, set to show the year, month, day, and week views." +msgstr "Kalenderblatt Einen Kalender Zeitraum als Anhänge zu dieser Seite hinzufügen, kann auf Jahr, Monat, Tag und Woche gesetzt werden." + +#: includes/calendar.views.inc:136;149 +msgid "Calendar block" +msgstr "Kalender-Block" + +#: includes/calendar.views.inc:137 +msgid "Calendar page. Attach a Calendar period attachment to this block, set to show the year, month, day, or week view." +msgstr "Kalenderblatt Einen Kalender Zeitraum als Anhange zu diesem Block hinzufügen, kann auf Jahr, Monat, Tag und Woche gesetzt werden." + +#: includes/calendar.views.inc:154 +#: includes/calendar_plugin_display_attachment.inc:185;224 +msgid "Calendar period" +msgstr "Kalender Zeitraum" + +#: includes/calendar.views.inc:155 +msgid "An attachment for a Year, Month, Day, or Week calendar display, using any style you choose. Attach to a Calendar page and/or a Calendar block." +msgstr "Ein Anhang für ein Jahr, Monat, Tag oder Woche im Kalender anzeigen. Eine Kalender-Seite und / oder einen Kalender-Block hinzufügen." + +#: includes/calendar.views.inc:165 +msgid "Calendar page year, month, week, or day view" +msgstr "Kalender für Jahres-, Monats-, Wochen-oder Tagesansicht" + +#: includes/calendar.views.inc:180 +msgid "Calendar navigation" +msgstr "Kalender Navigation" + +#: includes/calendar.views.inc:181 +msgid "Creates back/next navigation and calendar links." +msgstr "Erstellt zurück-, weiter- und Kalender-Links." + +#: includes/calendar.views.inc:196 +msgid "Displays Views results in a calendar." +msgstr "Ansicht als Kalender ausgeben" + +#: includes/calendar_plugin_display_attachment.inc:94 +msgid "A Calendar period display will not work without a Date argument." +msgstr "Zur Anzeige eines Zeitraums ist ein Datum oder ein Datumsfilter erforderlich." + +#: includes/calendar_plugin_display_attachment.inc:188 +msgid "Select the calendar time period for this display." +msgstr "Wählen Sie den Kalender Zeitraum für diese Anzeige." + +#: includes/calendar_plugin_display_attachment.inc:219 +#: includes/calendar_plugin_display_page.inc:79 +msgid "Calendar settings" +msgstr "Die Einstellungen für Kalender" + +#: includes/calendar_plugin_display_block.inc:26 +msgid "The Calendar period display '@display_title' will not work without a Date argument." +msgstr "Zur Anzeige eines Zeitraums '@display_title' ist ein Datum oder ein Datumsfilter erforderlich." + +#: includes/calendar_plugin_display_page.inc:22 +msgid "The Calendar display '@display_title' will not work without a Date argument." +msgstr "Zur Anzeige eines Zeitraums '@display_title' ist ein Datum oder ein Datumsfilter erforderlich." + +#: includes/calendar_plugin_display_page.inc:86 +msgid "Legend Content Types" +msgstr "Legende für Inhaltstypen" + +#: includes/calendar_plugin_display_page.inc:87;92;97 +msgid "Edit" +msgstr "Bearbeiten" + +#: includes/calendar_plugin_display_page.inc:91 +msgid "Legend Vocabularies" +msgstr "Legende für Vokabularien" + +#: includes/calendar_plugin_display_page.inc:96 +msgid "Legend Terms" +msgstr "Legende für Begriffe" + +#: includes/calendar_plugin_display_page.inc:103;125 +msgid "Date changer" +msgstr "[fuzzy] !date – !username" + +#: includes/calendar_plugin_display_page.inc:109;135 +msgid "Add new date link" +msgstr "Einen Link für Datum hinzufügen" + +#: includes/calendar_plugin_display_page.inc:116 +#: includes/calendar_view_plugin_style.inc:65 +msgid "No" +msgstr "Nein" + +#: includes/calendar_plugin_display_page.inc:116 +#: includes/calendar_view_plugin_style.inc:65 +msgid "Yes" +msgstr "Ja" + +#: includes/calendar_plugin_display_page.inc:130 +msgid "Display a popup calendar date selector?" +msgstr "Einen Popup-Kalender zu Datumsauswahl anzeigen?" + +#: includes/calendar_plugin_display_page.inc:139 +msgid "No link" +msgstr "Kein Link" + +#: includes/calendar_plugin_display_page.inc:140 +msgid "Display a link to add a new date of the specified content type. Displayed only to users with appropriate permissions." +msgstr "Anzeigen eines Links, um ein Datum zu einem Inhaltstpy hinzuzufügen. Nur für Benutzer mit entsprechenden Berechtigungen anzeigen." + +#: includes/calendar_plugin_display_page.inc:147 +msgid "Content Type Legend Colors" +msgstr "Inhaltstyp Farblegende" + +#: includes/calendar_plugin_display_page.inc:149 +msgid "

Set a hex color value (like #ffffff) to use in the calendar legend for each content type. Types with empty values will have no stripe in the calendar and will not be added to the legend.

" +msgstr "

Legen Sie einen Hex-Farbwert (zB # FFFFFF) für die Legende des Kalenders an. Die Legende nimmt nur existierende Werte auf.

" + +#: includes/calendar_plugin_display_page.inc:182 +msgid "Vocabulary Legend Types" +msgstr "Legende für Vokabularien" + +#: includes/calendar_plugin_display_page.inc:189 +msgid "
Select vocabularies to use for setting calendar legend colors by taxonomy term. This works best for vocabularies with only a limited number of possible terms.
" +msgstr "
Wählen Sie Vokabularien für die Legende von Kalendern auswählen, um die Farben durch Taxonomie Begriffe zu definieren. Dies funktioniert am besten mit Vokabularien, die eine begrenzten Anzahl von Begriffen enthalten.
" + +#: includes/calendar_plugin_display_page.inc:195 +msgid "Taxonomy Legend Colors" +msgstr "Farben in der Legende für Taxonomie" + +#: includes/calendar_plugin_display_page.inc:198 +msgid "
Please select Legend vocabularies first!
" +msgstr "
Bitte wählen Sie für die Legende zuerst ein Vokabular!
" + +#: includes/calendar_plugin_display_page.inc:200 +msgid "

Set a hex color value (like #ffffff) to use in the calendar legend for each taxonomy term. Terms with empty values will have no stripe in the calendar and will not be added to the legend.

" +msgstr "

Legen Sie einen Hex-Farbwert (zB # FFFFFF) für die Legende des Kalenders für jeden einzelnen Taxonomie-Begriff fest. Die Legende nimmt nur existierende Werte auf.

" + +#: includes/calendar_plugin_style.inc:75 +msgid "The @style style requires a Date argument." +msgstr "@style erfordert ein Datumsargument." + +#: includes/calendar_plugin_style.inc:114 +msgid "The date argument date fields must be added to this query. You can exclude them if you do not want them displayed in the calendar." +msgstr "Das Argument für das Datum muss dieser Abfrage hinzugefügt werden. Schließen Sie aus, was nicht im Kalender angezeigt werden soll." + +#: includes/calendar_view_plugin_style.inc:55 +msgid "Calendar day of week names" +msgstr "[fuzzy] Der Name des Wochentages" + +#: includes/calendar_view_plugin_style.inc:58 +msgid "First letter of name" +msgstr "Ersten Buchstaben des Namens" + +#: includes/calendar_view_plugin_style.inc:58 +msgid "First two letters of name" +msgstr "Die ersten beiden Buchstaben des Namens" + +#: includes/calendar_view_plugin_style.inc:58 +msgid "Abbreviated name" +msgstr "Abgekürzter Name" + +#: includes/calendar_view_plugin_style.inc:58 +msgid "Full name" +msgstr "Vollständiger Name" + +#: includes/calendar_view_plugin_style.inc:59 +msgid "The way day of week names should be displayed in a calendar." +msgstr "Die Art und Weise, wie die Namen von Wochentagen in Kalendern angezeigt werden." + +#: includes/calendar_view_plugin_style.inc:62 +msgid "Show week numbers" +msgstr "Wochennummer anzeigen" + +#: includes/calendar_view_plugin_style.inc:66 +msgid "Whether or not to show week numbers in the left column of calendar weeks and months." +msgstr "Wochennummer in der linken Spalte anzeigen bei Wochen und Monaten." + +#: includes/calendar_view_plugin_style.inc:69 +msgid "Maximum items" +msgstr "Maximale Anzahl von Elementen" + +#: includes/calendar_view_plugin_style.inc:71 +msgid "Unlimited" +msgstr "Unbegrenzt" + +#: includes/calendar_view_plugin_style.inc:71 +msgid "No items" +msgstr "Keine Einträge" + +#: includes/calendar_view_plugin_style.inc:71 +msgid "3 items" +msgstr "3 Einträge" + +#: includes/calendar_view_plugin_style.inc:71 +msgid "5 items" +msgstr "5 Einträge" + +#: includes/calendar_view_plugin_style.inc:71 +msgid "10 items" +msgstr "10 Einträge" + +#: includes/calendar_view_plugin_style.inc:73 +msgid "Maximum number of items to show in calendar cells, used to keep the calendar from expanding to a huge size when there are lots of items in one day. " +msgstr "Maximale Anzahl von Einträgen in Kalender Zellen, um den Kalender überschaubar zu halten, wenn es um sehr viele Termine an einem Tag gibt. " + +#: includes/calendar_view_plugin_style.inc:76 +msgid "Too many items" +msgstr "Zu viele Einträge" + +#: includes/calendar_view_plugin_style.inc:78 +msgid "Show maximum, add 'more' link" +msgstr "Das Maximum und einen Link für weitere anzeigen" + +#: includes/calendar_view_plugin_style.inc:78 +msgid "Hide all, add link to day" +msgstr "Alles ausblenden, Link für Tag hinzufügen" + +#: includes/calendar_view_plugin_style.inc:80 +msgid "Behavior when there are more than the above number of items in a single day. When there more items than this limit, a link to the day view will be displayed." +msgstr "Verhalten, wenn es mehr als die oben Anzahl der Elemente in einem einzigen Tag. Wenn mehr Einträge für einen Tag vorhanden sind, als das Maximum vorsieht, so wir ein Link für den Tag eingeblendet." + +#: includes/calendar_view_plugin_style.inc:83 +msgid "Time grouping" +msgstr "Gruppierung nach Zeit" + +#: includes/calendar_view_plugin_style.inc:86 +msgid "Group items together into time periods based on their start time." +msgstr "Einträge gruppieren nach der Zeit" + +#: includes/calendar_view_plugin_style.inc:87 +msgid "Hour" +msgstr "Stunden" + +#: includes/calendar_view_plugin_style.inc:87 +msgid "Half hour" +msgstr "Eine halbe Stunde" + +#: includes/calendar_view_plugin_style.inc:87 +msgid "Custom" +msgstr "Benutzerdefiniert" + +#: includes/calendar_view_plugin_style.inc:90 +msgid "Custom time grouping" +msgstr "Benutzerdefiniert nach Zeiträumen gruppieren" + +#: includes/calendar_view_plugin_style.inc:93 +msgid "When choosing the 'custom' Time grouping option above, create custom time period groupings as a comma-separated list of 24-hour times in the format HH:MM:SS, like '00:00:00,08:00:00,18:00:00'. Be sure to start with '00:00:00'. All items after the last time will go in the final group." +msgstr "Bei der Wahl der benutzerdefinierten Zeiträume für die Gruppierungsoption oben, benutzerdefinierte Zeiträume als Komma-separierte Liste im 24-Stunden-Format HH: MM: SS, wie '00: 00:00,08:00:00, 18:00:00 angeben. Achten Sie darauf, mit '00:00:00 ' zu beginnen. Alle Einträge nach dem letzten Zeitraum erscheinen in der letzten Gruppe." + +#: includes/calendar_view_plugin_style.inc:111 +msgid "Field grouping" +msgstr "Gruppierungsfeld" + +#: includes/calendar_view_plugin_style.inc:114 +msgid "Optionally group items into columns by a field value, for instance select the content type to show items for each content type in their own column, or use a location field to organize items into columns by location." +msgstr "Optional Gruppieren von Elementen in Spalten durch einen Feldwert, zum Beispiel wählen Sie den Inhaltstyp, um Elemente für jedenInhaltstyp in einer eigenen Spalte zu zeigen oder einen Feld Ort verwenden, um Einträge in Spalten nach dem Ort zu ordnen." + +#: jcalendar/jcalendar.module:18 +msgid "Creates a popup for calendar dates." +msgstr "Ein Popup für Kalenderdaten erstellen." + +#: jcalendar/jcalendar.module:90 +#: theme/calendar-month-multiple-node.tpl.php:25 +#: theme/calendar-week-multiple-node.tpl.php:24 +msgid "more" +msgstr "Weiter" + +#: jcalendar/jcalendar.module:48 +msgid "Get Calendar Node" +msgstr "Kalendereintrag abrufen" + +#: jcalendar/jcalendar.info:0 +msgid "Calendar Popup" +msgstr "Kalender Popup " + +#: jcalendar/jcalendar.info:0 +msgid "Replaces the links to calendar items with a javascript popup that gracefully regresses if javascript is not enabled" +msgstr "Wenn Javascript verfügbar ist, werden Links zu Kalendereinträgen mit einem Javascript-Popup, ersetzt. Ist Javascript nicht verfügbar wird auf reguläre Links zurückgefallen." + +#: theme/calendar-day.tpl.php:41 +#: theme/calendar-week.tpl.php:36 +msgid "Time" +msgstr "Zeit" + +#: theme/calendar-month-multiple-node.tpl.php:21 +#: theme/calendar-week-multiple-node.tpl.php:20 +msgid "Click to see all @count events" +msgstr "Alle @count Termine anzeigen" + +#: theme/theme.inc:59 +msgid "Add+" +msgstr "[fuzzy] Hinzufügen" + +#: theme/theme.inc:305;331;374 +msgid "Items" +msgstr "Einträge" + +#: theme/theme.inc:647 +msgid "All times" +msgstr "Immer" + +#: theme/theme.inc:651 +msgid "Before @time" +msgstr "Vor @time" + +#: theme/theme.inc:674 +msgid "Item" +msgstr "Eintrag" + +#: theme/theme.inc:675 +msgid "Key" +msgstr "Schlüssel" + +#: theme/theme.inc:721 +msgid "Empty day" +msgstr "Tag ohne Eintrag" + diff --git a/sites/all/modules/calendar/translations/general.cs.po b/sites/all/modules/calendar/translations/general.cs.po new file mode 100644 index 0000000..26dd85a --- /dev/null +++ b/sites/all/modules/calendar/translations/general.cs.po @@ -0,0 +1,42 @@ +# $Id: general.cs.po,v 1.1.2.1 2010/10/22 20:06:37 wojtha Exp $ +# +# Czech translation of Calendar (6.x-2.2) +# Copyright (c) 2010 by the Czech translation team +# +msgid "" +msgstr "" +"Project-Id-Version: Calendar (6.x-2.2)\n" +"POT-Creation-Date: 2010-10-22 20:03+0000\n" +"PO-Revision-Date: 2010-09-29 20:42+0000\n" +"Language-Team: Czech\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=utf-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Plural-Forms: nplurals=3; plural=((((n%10)==1)&&((n%100)!=11))?(0):(((((n%10)>=2)&&((n%10)<=4))&&(((n%100)<10)||((n%100)>=20)))?(1):2));\n" + +msgid "more" +msgstr "více" +msgid "Yes" +msgstr "Ano" +msgid "No" +msgstr "Ne" +msgid "None" +msgstr "Žádné" +msgid "Time" +msgstr "Čas" +msgid "Calendar" +msgstr "Kalendář" +msgid "Date/Time" +msgstr "Datum/čas" +msgid "Calendar settings" +msgstr "Nastavení kalendáře" +msgid "Click to see all @count events" +msgstr "Klikněte pro zobrazení všech událostí - celkem: @count" +msgid "" +"The date field '@field' used by the display '@display_title' cannot be " +"set to 'Group multiple values'." +msgstr "" +"V definici zobrazení '@display_title' nelze u pole reprezentujícího " +"datum '@field' učinit nastavení 'Seskupit více hodnot'." +msgid "Calendar period" +msgstr "Období kalendáře" diff --git a/sites/all/modules/calendar/translations/general.hu.po b/sites/all/modules/calendar/translations/general.hu.po new file mode 100644 index 0000000..263a79c --- /dev/null +++ b/sites/all/modules/calendar/translations/general.hu.po @@ -0,0 +1,152 @@ +# Hungarian translation of Calendar (all releases) +# Copyright (c) 2009 by the Hungarian translation team +# +msgid "" +msgstr "" +"Project-Id-Version: Calendar (all releases)\n" +"POT-Creation-Date: 2009-11-10 16:39+0000\n" +"PO-Revision-Date: 2009-11-10 14:13+0000\n" +"Language-Team: Hungarian\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=utf-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Plural-Forms: nplurals=2; plural=(n!=1);\n" + +msgid "Submit" +msgstr "Beküldés" +msgid "Item" +msgstr "Elem" +msgid "List" +msgstr "Lista" +msgid "more" +msgstr "tovább" +msgid "Yes" +msgstr "Igen" +msgid "No" +msgstr "Nem" +msgid "None" +msgstr "Nincs" +msgid "Name" +msgstr "Név" +msgid "Time" +msgstr "Idő" +msgid "Views" +msgstr "Nézetek" +msgid "Maximum items" +msgstr "Maximális elemszám" +msgid "Year" +msgstr "Év" +msgid "Url" +msgstr "Webcím" +msgid "Feed type" +msgstr "Hírcsatorna típusa" +msgid "Month" +msgstr "Hónap" +msgid "Unlimited" +msgstr "Korlátlan" +msgid "Calendar" +msgstr "Naptár" +msgid "Week" +msgstr "Hét" +msgid "Day" +msgstr "Nap" +msgid "Table" +msgstr "Táblázat" +msgid "Full name" +msgstr "Teljes név" +msgid "Key" +msgstr "Kulcs" +msgid "Teasers" +msgstr "Bevezetők" +msgid "Expire iCal cache" +msgstr "iCal gyorsítótár lejárata" +msgid "" +"iCal feeds are cached to improve performance. Set an expiration time " +"for cached feeds." +msgstr "" +"Az iCal hírcsatornák a teljesítmény javítása érdekében " +"gyorsítótárazva vannak. Be kell állítani egy lejárati időt a " +"gyorsítótárazott hírcsatornákhoz." +msgid "iCal Feeds" +msgstr "iCal hírcsatornák" +msgid "" +"Use this section to set up iCal feeds that should be displayed in this " +"calendar. They will be shown along with any internal items that match " +"the calendar criteria." +msgstr "" +"Itt lehet beállítani a naptárban megjeleníteni kívánt iCal " +"hírcsatornákat. Azokkal a belső elemekkel együtt fognak " +"megjelenni, amik megegyeznek a naptár feltételeivel." +msgid "The name of a feed to include in this calendar." +msgstr "A naptárba beillesztett hírcsatorna neve." +msgid "" +"The external feed url or internal file path and name. Change " +"'webcal://' to 'http://'." +msgstr "" +"A külső hírcsatorna URL-je vagy a belső fájl elérési útja és " +"neve. Módosítani kell a „webcal://” előtagot „http://” " +"formára." +msgid "Add to calendar" +msgstr "Hozzáadás a naptárhoz" +msgid "Calendar iCal" +msgstr "iCal naptár" +msgid "Date/Time" +msgstr "Dátum/Idő" +msgid "Calendar settings" +msgstr "Naptár beállításai" +msgid "First letter of name" +msgstr "A név első betűje" +msgid "First two letters of name" +msgstr "A név első két betűje" +msgid "Abbreviated name" +msgstr "Rövidített név" +msgid "Show week numbers" +msgstr "Hetek számának megjelenítése" +msgid "3 items" +msgstr "3 elem" +msgid "5 items" +msgstr "5 elem" +msgid "10 items" +msgstr "10 elem" +msgid "" +"Maximum number of items to show in calendar cells, used to keep the " +"calendar from expanding to a huge size when there are lots of items in " +"one day. " +msgstr "" +"A naptár cellákban megjelenített elemek számának felső határa, " +"megakadályozza a naptár nagyra növését ha egy napon nagyon sok " +"elem van. " +msgid "Too many items" +msgstr "Túl sok elem" +msgid "Show maximum, add 'more' link" +msgstr "Maximum megjelenítése, „tovább” hivatkozás hozzáadása" +msgid "Hide all, add link to day" +msgstr "Összes elrejtése, hivatkozás hozzáadása a naphoz" +msgid "" +"Behavior when there are more than the above number of items in a " +"single day. When there more items than this limit, a link to the day " +"view will be displayed." +msgstr "" +"A viselkedés, ha a fentinél több elem van egy napon. Ha a " +"korlátnál több elem van, egy, a napi nézetre mutató hivatkozás " +"fog megjelenni." +msgid "Stripe color" +msgstr "Sáv színe" +msgid "" +"The hex color value (like #ffffff) to use for this feed's calendar " +"stripe." +msgstr "" +"A hírcsatorna naptársávjához használt szín tizenhatos " +"számrendszerbeli értéke (például #ffffff)." +msgid "Click to see all @count events" +msgstr "Kattintás az összes (@count) esemény megtekintéséhez" +msgid "Adds ical functionality to Calendar views." +msgstr "Ical hozzáadása a Calendar nézetekhez." +msgid "" +"The date field '@field' used by the display '@display_title' cannot be " +"set to 'Group multiple values'." +msgstr "" +"„@display_title” képernyő által használt „@field” mezőn " +"nem beállítható a „Több érték csoportosítása”." +msgid "Calendar period" +msgstr "Naptári időszak" diff --git a/sites/all/modules/calendar/translations/includes.hu.po b/sites/all/modules/calendar/translations/includes.hu.po new file mode 100644 index 0000000..07247a4 --- /dev/null +++ b/sites/all/modules/calendar/translations/includes.hu.po @@ -0,0 +1,198 @@ +# Hungarian translation of Calendar (all releases) +# Copyright (c) 2009 by the Hungarian translation team +# +msgid "" +msgstr "" +"Project-Id-Version: Calendar (all releases)\n" +"POT-Creation-Date: 2009-11-10 16:39+0000\n" +"PO-Revision-Date: 2009-11-10 14:13+0000\n" +"Language-Team: Hungarian\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=utf-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Plural-Forms: nplurals=2; plural=(n!=1);\n" + +msgid "Edit" +msgstr "Szerkesztés" +msgid "Custom" +msgstr "Egyedi" +msgid "Hour" +msgstr "Óra" +msgid "No link" +msgstr "Nincs hivatkozás" +msgid "Calendar page" +msgstr "Naptár oldal" +msgid "" +"Calendar page. Attach Calendar period attachments to this page, set to " +"show the year, month, day, and week views." +msgstr "" +"Naptár oldal. Naptári időszak csatolmányok vannak az oldalhoz " +"csatolva, amik az éves, havi, napi és heti nézetek " +"megjelenítésére vannak beállítva." +msgid "Calendar block" +msgstr "Naptár blokk" +msgid "" +"Calendar page. Attach a Calendar period attachment to this block, set " +"to show the year, month, day, or week view." +msgstr "" +"Naptár oldal. Egy Naptári időszak csatolmány van a blokkhoz " +"csatolva, ami az éves, havi, napi és heti nézetek " +"megjelenítésére van beállítva." +msgid "" +"An attachment for a Year, Month, Day, or Week calendar display, using " +"any style you choose. Attach to a Calendar page and/or a Calendar " +"block." +msgstr "" +"Egy csatolmány az Éves, Havi, Napi vagy Heti naptár " +"megjelenítéséhez, tetszőlegesen választott stílussal. Egy " +"Naptár oldalhoz és/vagy egy Naptár blokkhoz van csatolva." +msgid "Calendar page year, month, week, or day view" +msgstr "Naptár oldal éves, havi, heti vagy napi nézet." +msgid "Calendar navigation" +msgstr "Naptár navigáció" +msgid "Creates back/next navigation and calendar links." +msgstr "" +"Előző/következő navigációt és naptári hivatkozásokat hoz " +"létre." +msgid "Displays Views results in a calendar." +msgstr "Views eredmények megjelenítése egy naptárban." +msgid "A Calendar period display will not work without a Date argument." +msgstr "" +"A naptári időszak képernyő nem működik dátum argumentum " +"nélkül." +msgid "Select the calendar time period for this display." +msgstr "Naptári időszak kiválasztása ehhez a képernyőhöz." +msgid "" +"The Calendar period display '@display_title' will not work without a " +"Date argument." +msgstr "" +"„@display_title” naptári időszak képernyő nem fog működni " +"dátum argumentum nélkül." +msgid "" +"The Calendar display '@display_title' will not work without a Date " +"argument." +msgstr "" +"„@display_title” naptárképernyő nem fog működni dátum " +"argumentum nélkül." +msgid "Legend Content Types" +msgstr "Tartalomtípusok magyarázat" +msgid "Legend Vocabularies" +msgstr "Szótárak magyarázat" +msgid "Legend Terms" +msgstr "Kifejezések magyarázat" +msgid "Date changer" +msgstr "Dátumváltó" +msgid "Add new date link" +msgstr "Új dátumhivatkozás hozzáadása" +msgid "Display a popup calendar date selector?" +msgstr "Megjelenjen egy felugró-naptár dátumválasztó?" +msgid "" +"Display a link to add a new date of the specified content type. " +"Displayed only to users with appropriate permissions." +msgstr "" +"Megjelenít egy hivatkozást amivel új dátumot lehet hozzáadni a " +"meghatározott tartalomtípushoz. Csak a megfelelő jogosultságokkal " +"rendelkező felhasználóknak jelenik meg." +msgid "Content Type Legend Colors" +msgstr "Tartalomtípus magyarázatok színei" +msgid "" +"

Set a hex color " +"value (like #ffffff) to use in the calendar legend for each content " +"type. Types with empty values will have no stripe in the calendar and " +"will not be added to the legend.

" +msgstr "" +"

Egy szín " +"tizenhatos számrendszerbeli értékét kell megadni (például " +"#ffffff) ami a tartalomtípusoknál a naptár magyarázatban lesz " +"használva. Azok a típusok, melyeknek értéke üres, nem lesznek " +"csíkozva és nem lesznek hozzáadva a magyarázathoz.

" +msgid "Vocabulary Legend Types" +msgstr "Szótár magyarázattípusok" +msgid "" +"
Select " +"vocabularies to use for setting calendar legend colors by taxonomy " +"term. This works best for vocabularies with only a limited number of " +"possible terms.
" +msgstr "" +"
Ki kell választani " +"a taxonómia kifejezésekhez tartozó naptár magyarázatok színeinek " +"beállításához használt szótárat. Azoknál a szótáraknál " +"működik a legjobban, ahol a lehetséges kifejezések száma " +"korlátozott.
" +msgid "Taxonomy Legend Colors" +msgstr "Taxonómia magyarázatok színei" +msgid "" +"
Please select Legend vocabularies " +"first!
" +msgstr "" +"
Először Szótár magyarázatot kell " +"választani!
" +msgid "" +"

Set a hex " +"color value (like #ffffff) to use in the calendar legend for each " +"taxonomy term. Terms with empty values will have no stripe in the " +"calendar and will not be added to the legend.

" +msgstr "" +"

Egy " +"szín hexadecimális kódját kell megadni (pl. #ffffff) ami a " +"taxonómia kifejezéseknél a naptár magyarázatban lesz használva. " +"Az üres érétket tartalmazó kifejezések nem lesznek csíkozva a " +"naptárban és nem lesznek hozzáadva a magyarázathoz.

" +msgid "The @style style requires a Date argument." +msgstr "@style stílushoz szükséges egy Dátum argumentum." +msgid "" +"The date argument date fields must be added to this query. You can " +"exclude them if you do not want them displayed in the calendar." +msgstr "" +"A dátum argumentum dátummezőket hozzá kell adni ehhez a " +"lekérdezéshez. A mezőket el lehet rejteni, ha nem kell " +"megjeleníteni azokat a naptárban." +msgid "Calendar day of week names" +msgstr "A hét napjainak elnevezése a naptárban" +msgid "The way day of week names should be displayed in a calendar." +msgstr "" +"A mód ahogy a hét napjainak neveit meg kell jeleníteni a " +"naptárban." +msgid "" +"Whether or not to show week numbers in the left column of calendar " +"weeks and months." +msgstr "" +"A hetek száma legyen-e mutatva a heti és havi naptárak bal oldali " +"oszlopában." +msgid "No items" +msgstr "Nincsenek elemek" +msgid "Time grouping" +msgstr "Időcsoportosítás" +msgid "Group items together into time periods based on their start time." +msgstr "Elemek csoportosítása időszakok szerint a kezdési idő alapján." +msgid "Half hour" +msgstr "Fél óra" +msgid "Custom time grouping" +msgstr "Egyéni időcsoportosítás" +msgid "" +"When choosing the 'custom' Time grouping option above, create custom " +"time period groupings as a comma-separated list of 24-hour times in " +"the format HH:MM:SS, like '00:00:00,08:00:00,18:00:00'. Be sure to " +"start with '00:00:00'. All items after the last time will go in the " +"final group." +msgstr "" +"Ha az „egyéni” Időcsoportosítás lett fentebb kiválasztva, " +"létre kell hozni egy egyéni időszak szerinti csoportosítást, ahol " +"egy vesszővel elválasztott listában 24 órás időpontokat kell " +"megadni ÓÓ:PP:MM formában, például így: " +"„00:00:00,08:00:00,18:00:00”. A listának „00:00:00” " +"értékkel kell kezdődnie. Az utolsó időpont utáni elemek az " +"utolsó csoportba kerülnek." +msgid "Field grouping" +msgstr "Mezőcsoportosítás" +msgid "" +"Optionally group items into columns by a field value, for instance " +"select the content type to show items for each content type in their " +"own column, or use a location field to organize items into columns by " +"location." +msgstr "" +"Az elemeket oszlopokba lehet csoportosítani egy mező értéke " +"szerint, például a tartalomtípust kiválasztva, a " +"tartalomtípusokhoz tartozó elemek a saját oszlopukban jelennek meg, " +"vagy egy helyszín mezőt használva, az elemek helyszín szerint " +"lesznek oszlopokba rendezve." diff --git a/sites/all/modules/calendar/translations/installer.cs.po b/sites/all/modules/calendar/translations/installer.cs.po new file mode 100644 index 0000000..b0d9f9e --- /dev/null +++ b/sites/all/modules/calendar/translations/installer.cs.po @@ -0,0 +1,30 @@ +# $Id: installer.cs.po,v 1.1.2.1 2010/10/22 20:06:37 wojtha Exp $ +# +# Czech translation of Calendar (6.x-2.2) +# Copyright (c) 2010 by the Czech translation team +# +msgid "" +msgstr "" +"Project-Id-Version: Calendar (6.x-2.2)\n" +"POT-Creation-Date: 2010-10-22 20:03+0000\n" +"PO-Revision-Date: 2010-09-29 20:42+0000\n" +"Language-Team: Czech\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=utf-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Plural-Forms: nplurals=3; plural=((((n%10)==1)&&((n%100)!=11))?(0):(((((n%10)>=2)&&((n%10)<=4))&&(((n%100)<10)||((n%100)>=20)))?(1):2));\n" + +msgid "Calendar requirements" +msgstr "Požadavky modulu Calendar" +msgid "" +"The Calendar module requires a more current version of the Date API. " +"Please check for a newer version." +msgstr "" +"Modul Calendar vyžaduje novější verzi modulu Date API. Proveďte " +"prosím aktualizaci." +msgid "" +"The Calendar module requires the latest version of the Date API, be " +"sure you are installing the latest versions of both modules." +msgstr "" +"Modul Calendar vyžaduje poslední verzi modulu Date API, ujistěte se " +"prosím, že instalujete poslední verze obou modulů." diff --git a/sites/all/modules/calendar/translations/installer.hu.po b/sites/all/modules/calendar/translations/installer.hu.po new file mode 100644 index 0000000..47d2f31 --- /dev/null +++ b/sites/all/modules/calendar/translations/installer.hu.po @@ -0,0 +1,29 @@ +# Hungarian translation of Calendar (all releases) +# Copyright (c) 2009 by the Hungarian translation team +# +msgid "" +msgstr "" +"Project-Id-Version: Calendar (all releases)\n" +"POT-Creation-Date: 2009-11-10 16:39+0000\n" +"PO-Revision-Date: 2009-10-31 09:56+0000\n" +"Language-Team: Hungarian\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=utf-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Plural-Forms: nplurals=2; plural=(n!=1);\n" + +msgid "Calendar requirements" +msgstr "Calendar előfeltételei" +msgid "" +"The Calendar module requires a more current version of the Date API. " +"Please check for a newer version." +msgstr "" +"A Calendar modulnak a Date API frissebb verziójára van szüksége. " +"Telepíteni kell egy újabb verziót." +msgid "" +"The Calendar module requires the latest version of the Date API, be " +"sure you are installing the latest versions of both modules." +msgstr "" +"A Naptár modulhoz a Date API legfrissebb változata szükséges. Meg " +"kell győződni arról, hogy mindkét modul legfrissebb verziója van " +"telepítve." diff --git a/sites/all/modules/calendar/translations/root.cs.po b/sites/all/modules/calendar/translations/root.cs.po new file mode 100644 index 0000000..bf0dbcb --- /dev/null +++ b/sites/all/modules/calendar/translations/root.cs.po @@ -0,0 +1,79 @@ +# $Id: root.cs.po,v 1.1.2.1 2010/10/22 20:06:37 wojtha Exp $ +# +# Czech translation of Calendar (6.x-2.2) +# Copyright (c) 2010 by the Czech translation team +# +msgid "" +msgstr "" +"Project-Id-Version: Calendar (6.x-2.2)\n" +"POT-Creation-Date: 2010-10-22 20:03+0000\n" +"PO-Revision-Date: 2010-09-29 20:43+0000\n" +"Language-Team: Czech\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=utf-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Plural-Forms: nplurals=3; plural=((((n%10)==1)&&((n%100)!=11))?(0):(((((n%10)>=2)&&((n%10)<=4))&&(((n%100)<10)||((n%100)>=20)))?(1):2));\n" + +msgid "Year" +msgstr "Rok" +msgid "Month" +msgstr "Měsíc" +msgid "Week" +msgstr "Týden" +msgid "Day" +msgstr "Den" +msgid "

View complete documentation at !link.

" +msgstr "

Kompletní dokumentace je na adrese !link.

" +msgid "Calendar Legend." +msgstr "Legenda kalendáře." +msgid "Calendar Legend" +msgstr "Legenda kalendáře" +msgid " is not a valid hex color" +msgstr " není platná barva v šestnáctkovém zápisu" +msgid "Change date" +msgstr "Změnit datum" +msgid "Calendar requirements" +msgstr "Požadavky modulu Calendar" +msgid "" +"The Calendar module requires a more current version of the Date API. " +"Please check for a newer version." +msgstr "" +"Modul Calendar vyžaduje novější verzi modulu Date API. Proveďte " +"prosím aktualizaci." +msgid "" +"The Calendar module requires the latest version of the Date API, be " +"sure you are installing the latest versions of both modules." +msgstr "" +"Modul Calendar vyžaduje poslední verzi modulu Date API, ujistěte se " +"prosím, že instalujete poslední verze obou modulů." +msgid "Views plugin to display views containing dates as Calendars." +msgstr "" +"Plugin modulu Views pro zobrazování datumů prostřednictvím " +"kalendářů." +msgid "" +"The Date argument in this view must be set up to provide a default " +"value set to the current date. Edit the argument, find 'Action to take " +"if argument is not present.', choose 'Provide default argument', then " +"select 'Current date'." +msgstr "" +"V rámci tohoto pohledu je potřeba nastavit argument reprezentující " +"datum tak, aby jeho výchozí hodnota odpovídala aktuálnímu datu. " +"Upravte argument a vyhledejte položku 'Jakou akci spustit, pokud " +"nebyl nalezen žádný argument', zvolte 'Poskytnout výchozí " +"argument', z nabídky vyberte 'Aktuální datum'." +msgid "View the calendar." +msgstr "Zobrazit kalendář." +msgid "" +"Calendar module cannot be updated until after Views has been updated. " +"Please return to update.php and run the " +"remaining updates." +msgstr "" +"Modul Calendar nemůže být aktualizován, dokud není aktualizován " +"modul Views. Opakujte update.php a " +"spusťte zbývající aktualizace." +msgid "" +"calendar.module has updates, but cannot be updated until views.module " +"is updated first." +msgstr "" +"Modul kalendář má k dispozici aktualizace, ale nebude aktualizován " +"dokud nebude nejdříve aktualizován modul Views." diff --git a/sites/all/modules/calendar/translations/root.hu.po b/sites/all/modules/calendar/translations/root.hu.po new file mode 100644 index 0000000..5fcae88 --- /dev/null +++ b/sites/all/modules/calendar/translations/root.hu.po @@ -0,0 +1,294 @@ +# Hungarian translation of Calendar (all releases) +# Copyright (c) 2009 by the Hungarian translation team +# +msgid "" +msgstr "" +"Project-Id-Version: Calendar (all releases)\n" +"POT-Creation-Date: 2009-11-10 16:39+0000\n" +"PO-Revision-Date: 2009-11-10 14:07+0000\n" +"Language-Team: Hungarian\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=utf-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Plural-Forms: nplurals=2; plural=(n!=1);\n" + +msgid "Setup" +msgstr "Beállítás" +msgid "Nodes" +msgstr "Tartalmak" +msgid "Display options" +msgstr "Megjelenítési beállítások" +msgid "next" +msgstr "előző" +msgid "Mon" +msgstr "h" +msgid "Tue" +msgstr "k" +msgid "Wed" +msgstr "sze" +msgid "Thu" +msgstr "cs" +msgid "Fri" +msgstr "p" +msgid "Sat" +msgstr "szo" +msgid "Sun" +msgstr "v" +msgid "all day" +msgstr "egész nap" +msgid "All day" +msgstr "Egész nap" +msgid "Full Nodes" +msgstr "Teljes nézet" +msgid "You can only set on Default Sort on one field." +msgstr "Az Alapértelmezett rendezésnél csak egy mező adható meg." +msgid "The Calendar View requires at least one field." +msgstr "" +msgid "Calendar arguments must be set to 'Display All Values'." +msgstr "" +msgid "" +"The Calendar requres as arguments Calendar: Year, Calendar: Month, and " +"Calendar: Day, or Calendar: Year and Calendar: Week" +msgstr "" +msgid "" +"Calendar CCK Date fields must be set to 'Do not group multiple " +"values'." +msgstr "" +msgid "Time format" +msgstr "Időformátum" +msgid "The format to use for the time-only date display." +msgstr "" +msgid "Year display" +msgstr "Év képernyő" +msgid "Month display" +msgstr "Hónap képernyő" +msgid "Week display" +msgstr "Hét képernyő" +msgid "Day display" +msgstr "Nap képernyő" +msgid "Block display" +msgstr "Blokk képernyő" +msgid "Wildcard argument" +msgstr "" +msgid "" +"A character or short text string to use for empty calendar arguments. " +"For instance, 'all' would create the url 2007/12/all to show all days " +"in December of 2007. Note that non-ASCII characters will not display " +"correctly in urls." +msgstr "" +msgid "Calendar: Year" +msgstr "Calendar: Év" +msgid "Filter by the calendar year (YYYY)." +msgstr "" +msgid "Calendar: Month" +msgstr "Calendar: Hónap" +msgid "" +"Filter by the calendar month (1-12). Place this argument after a " +"'Year' argument." +msgstr "" +msgid "Calendar: Day" +msgstr "Calendar: Nap" +msgid "" +"Filter by the calendar day (1-31). Place this argument after a 'Year' " +"and a 'Month' argument." +msgstr "" +msgid "Calendar: Week" +msgstr "Calendar: Hét" +msgid "" +"Filter by the week number (1-52). Place this argument after a 'Year' " +"argument and use a 'W' in front of the week number in the url." +msgstr "" +msgid "calendar" +msgstr "naptár" +msgid "" +"Calendar view of any date field, add a date field to the view to use " +"it." +msgstr "" +msgid "

View complete documentation at !link.

" +msgstr "

A teljes dokumentáció itt !link található.

" +msgid "Calendar setup." +msgstr "Naptár beállítása." +msgid "Calendar Legend." +msgstr "Naptár magyarázat." +msgid "Switch Calendar." +msgstr "Naptár váltása." +msgid "Calendar Legend" +msgstr "Naptár magyarázat" +msgid "Switch Calendar" +msgstr "Naptár váltása" +msgid "Switch" +msgstr "Váltás" +msgid "iCal" +msgstr "iCal" +msgid "iCal setup." +msgstr "iCal beállítása." +msgid "Calendar: iCal Feed" +msgstr "Calendar: iCal hírcsatorna" +msgid "

Stripe options

" +msgstr "

Csíkozás beállításai

" +msgid "Stripe" +msgstr "Csíkozás" +msgid "The color stripe to use for this feed (not working yet)." +msgstr "" +msgid "" +"Add this as the last argument to a calendar view to provide an iCal " +"feed of the view." +msgstr "" +msgid "Week @week @year" +msgstr "@year @week. hét" +msgid "Week of @date" +msgstr "@date hete" +msgid "prev" +msgstr "következő" +msgid "view this item" +msgstr "megtekintés" +msgid "!month / !day" +msgstr "!month / !day" +msgid "" +"Adds date calendar themes to views that can display any type of date " +"field, and creates default calendar views." +msgstr "" +msgid "Adds ical functionality to calendar views." +msgstr "" +msgid " is not a valid hex color" +msgstr " érvénytelen hexadecimális szín" +msgid "Dates" +msgstr "Dátumok" +msgid "The Calendar View requires at least one date field." +msgstr "" +msgid "" +"The Calendar requires as arguments Calendar: Year, Calendar: Month, " +"and Calendar: Day, or Calendar: Year and Calendar: Week" +msgstr "" +msgid "Mini day name size" +msgstr "" +msgid "The way day of week names should be displayed in a mini calendar." +msgstr "" +msgid "Full day name size" +msgstr "" +msgid "The way day of week names should be displayed in a full size calendar." +msgstr "" +msgid "" +"Whether or not to display a clickable week number link on the left " +"side of each calendar week." +msgstr "" +msgid "Popup date selector" +msgstr "" +msgid "" +"Whether or not to display a popup date selector to change the calendar " +"period. (Only works when the Date Popup module is enabled.)" +msgstr "" +msgid "Truncate length" +msgstr "" +msgid "" +"Truncate size for titles in month and week view so things fit better " +"into the calendar cell. For instance, change the title from 'Very Very " +"Very Long Name' to something like 'Very Very...'." +msgstr "" +msgid "" +"Choose the way the calendar entries should be displayed. Selecting " +"'None' will hide links to that option." +msgstr "" +msgid "Date year range" +msgstr "Dátum évtartomány" +msgid "" +"Set the allowable minimum and maximum year range for this view, either " +"a -X:+X offset from the current year, like '-3:+3' or an absolute " +"minimum and maximum year, like '2005:2010'. When the argument is set " +"to a date outside the range, the page will be returned as 'Page not " +"found (404)'." +msgstr "" +msgid "" +"

Content Type

Set a hex color value (like #ffffff) to use in " +"the calendar legend for each content type. Types with empty values " +"will have no stripe in the calendar and will not be added to the " +"legend.

" +msgstr "" +msgid "Legend colors" +msgstr "Magyarázat színei" +msgid "Date year range must be in the format -9:+9 or 2005:2010." +msgstr "A dátum évtartományát -9:+9 vagy 2005:2010 formában kell megadni." +msgid "Calendar settings have been updated." +msgstr "" +msgid "Calendar legend settings have been updated." +msgstr "" +msgid "Feed @delta" +msgstr "@delta hírcsatorna" +msgid "iCal url" +msgstr "" +msgid "" +"The ical url, either an external feed url or internal file path and " +"name. Change 'webcal://' to 'http://'." +msgstr "" +msgid "Default link" +msgstr "" +msgid "" +"A url to use to link back to ical items without a url, generally the " +"public link to the calendar these items are coming from." +msgstr "" +msgid "Calendar Setup" +msgstr "" +msgid "Customize calendar settings options." +msgstr "" +msgid "Legend" +msgstr "" +msgid "Calendar Switcher." +msgstr "" +msgid "Calendar Switcher" +msgstr "" +msgid "Change date" +msgstr "Dátum változtatása" +msgid "‹ !period " +msgstr "" +msgid " !period ›" +msgstr "" +msgid "more»" +msgstr "" +msgid "Calendar requirements" +msgstr "Calendar előfeltételei" +msgid "" +"The Calendar module requires a more current version of the Date API. " +"Please check for a newer version." +msgstr "" +"A Calendar modulnak a Date API frissebb verziójára van szüksége. " +"Telepíteni kell egy újabb verziót." +msgid "" +"The Calendar module requires the latest version of the Date API, be " +"sure you are installing the latest versions of both modules." +msgstr "" +"A Naptár modulhoz a Date API legfrissebb változata szükséges. Meg " +"kell győződni arról, hogy mindkét modul legfrissebb verziója van " +"telepítve." +msgid "Views plugin to display views containing dates as Calendars." +msgstr "" +"Views beépülő, dátumokat és naptárakat tartalmazó nézetek " +"megjelenítéséhez." +msgid "" +"The Date argument in this view must be set up to provide a default " +"value set to the current date. Edit the argument, find 'Action to take " +"if argument is not present.', choose 'Provide default argument', then " +"select 'Current date'." +msgstr "" +"A Dátum argumentumot ebben a nézetben úgy kell beállítani, hogy " +"az alapértelmezett értéke az aktuális dátum legyen. Szerkeszteni " +"kell az argumentumot, a „Műveletvégzés, ha az argumentum nincs " +"jelen” részben ki kell választani az „Alapértelmezett " +"argumentum megadása” beállítást és a „Jelenlegi dátum”-ot " +"kell beállítani." +msgid "View the calendar." +msgstr "A naptár megtekintése." +msgid "" +"Calendar module cannot be updated until after Views has been updated. " +"Please return to update.php and run the " +"remaining updates." +msgstr "" +"A Calendar modult nem lehet frissíteni amíg a Views nincs " +"frissítve. Vissza kell térni az update.php-hez és lefuttatni a hátralévő " +"frissítéseket." +msgid "" +"calendar.module has updates, but cannot be updated until views.module " +"is updated first." +msgstr "" +"A calendar.modul-hoz frissítések érhetőek el, de nem lehet " +"frissíteni a views.modul frissítése előtt." diff --git a/sites/all/modules/calendar/translations/theme.hu.po b/sites/all/modules/calendar/translations/theme.hu.po new file mode 100644 index 0000000..48cac6d --- /dev/null +++ b/sites/all/modules/calendar/translations/theme.hu.po @@ -0,0 +1,24 @@ +# Hungarian translation of Calendar (all releases) +# Copyright (c) 2009 by the Hungarian translation team +# +msgid "" +msgstr "" +"Project-Id-Version: Calendar (all releases)\n" +"POT-Creation-Date: 2009-11-10 16:39+0000\n" +"PO-Revision-Date: 2009-10-30 17:25+0000\n" +"Language-Team: Hungarian\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=utf-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Plural-Forms: nplurals=2; plural=(n!=1);\n" + +msgid "Items" +msgstr "Elemek" +msgid "Add+" +msgstr "Hozzáadás+" +msgid "All times" +msgstr "Mindig" +msgid "Before @time" +msgstr "@time előtt" +msgid "Empty day" +msgstr "Üres nap"