OSDN Git Service

update
[pukiwiki/pukiwiki.git] / plugin / calendar_viewer.inc.php
index bc63981..cafc33b 100644 (file)
 <?php
+// PukiWiki - Yet another WikiWikiWeb clone
+// $Id: calendar_viewer.inc.php,v 1.34 2005/06/05 12:46:59 henoheno Exp $
+//
+// Calendar viewer plugin - List pages that calendar/calnedar2 plugin created
+// (Based on calendar and recent plugin)
+
+// Page title's date format
+//  * See PHP date() manual for detail
+//  * '$\w' = weeklabel defined in $_msg_week
+define('PLUGIN_CALENDAR_VIEWER_DATE_FORMAT',
+       //      FALSE         // 'pagename/2004-02-09' -- As is
+       //      'D, d M, Y'   // 'Mon, 09 Feb, 2004'
+       //      'F d, Y'      // 'February 09, 2004'
+       //      '[Y-m-d]'     // '[2004-02-09]'
+               'Y/n/j ($\w)' // '2004/2/9 (Mon)'
+       );
+
+// ----
+
+define('PLUGIN_CALENDAR_VIEWER_USAGE',
+       '#calendar_viewer(pagename,this|yyyy-mm|n|x*y[,mode[,separater]])');
 /*
- * PukiWiki calendar_viewer¥×¥é¥°¥¤¥ó
+ ** pagename
+ * - A working root of calendar or calendar2 plugin
+ *   pagename/2004-12-30
+ *   pagename/2004-12-31
+ *   ...
  *
+ ** (yyyy-mm|n|this)
+ * this    - Show 'this month'
+ * yyyy-mm - Show pages at year:yyyy and month:mm
+ * n       - Show first n pages
+ * x*n     - Show first n pages from x-th page (0 = first)
  *
- *$Id: calendar_viewer.inc.php,v 1.11 2004/08/10 12:02:25 henoheno Exp $
-       calendarrecent¥×¥é¥°¥¤¥ó¤ò¸µ¤ËºîÀ®
- */
-/**
- *³µÍ×
-  calendar¥×¥é¥°¥¤¥ó¤äcalendar2¥×¥é¥°¥¤¥ó¤ÇºîÀ®¤·¤¿¥Ú¡¼¥¸¤ò°ìÍ÷ɽ¼¨¤¹¤ë¤¿¤á¤Î¥×¥é¥°¥¤¥ó¤Ç¤¹¡£
- *¹¹¿·ÍúÎò
-  -2002-11-13
-  --Á°¸å¤Ø¤Î¥ê¥ó¥¯¤Ëǯ·î¤ä¡Ö¼¡¤În·ï¡×¤Èɽ¼¨¤¹¤ë¤è¤¦¤Ë¤·¤¿¡£
- *»È¤¤Êý
-  /// #calendar_viewer(pagename,(yyyy-mm|n|this),[mode],[separater])
- **pagename
-  calendar or calendar2¥×¥é¥°¥¤¥ó¤òµ­½Ò¤·¤Æ¤ë¥Ú¡¼¥¸Ì¾
- **(yyyy-mm|n|this)
-  -yyyy-mm
-  --yyyy-mm¤Ç»ØÄꤷ¤¿Ç¯·î¤Î¥Ú¡¼¥¸¤ò°ìÍ÷ɽ¼¨
-  -n
-  --n·ï¤Î°ìÍ÷ɽ¼¨
-  -this
-  --º£·î¤Î¥Ú¡¼¥¸¤ò°ìÍ÷ɽ¼¨
- **[mode]
-  ¾Êά²Äǽ¤Ç¤¹¡£¾Êά»þ¤Î¥Ç¥Õ¥©¥ë¥È¤Ïpast
-  -past
-  --º£Æü°ÊÁ°¤Î¥Ú¡¼¥¸¤Î°ìÍ÷ɽ¼¨¥â¡¼¥É¡£¹¹¿·ÍúÎò¤äÆüµ­¸þ¤­
-  -future
-  --º£Æü°Ê¹ß¤Î¥Ú¡¼¥¸¤Î°ìÍ÷ɽ¼¨¥â¡¼¥É¡£¥¤¥Ù¥ó¥ÈͽÄê¤ä¥¹¥±¥¸¥å¡¼¥ë¸þ¤­
-  -view
-  --²áµî¤«¤é̤Íè¤Ø¤Î°ìÍ÷ɽ¼¨¥â¡¼¥É¡£É½¼¨Í޻ߤ¹¤ë¥Ú¡¼¥¸¤Ï¤¢¤ê¤Þ¤»¤ó¡£
-  -[separater]
-  ¾Êά²Äǽ¡£¥Ç¥Õ¥©¥ë¥È¤Ï-¡£¡Êcalendar2¤Ê¤é¾Êά¤ÇOK¡Ë
-  --ǯ·îÆü¤ò¶èÀڤ륻¥Ñ¥ì¡¼¥¿¤ò»ØÄê¡£
-
- *todo
-  past or future ¤Ç·îñ°Ìɽ¼¨¤¹¤ë¤È¤­¤Ë¡¢¤½¤ì¤¾¤ìÍè·î¡¢Àè·î¤Î°ìÍ÷¤Ø¤Î¥ê¥ó¥¯¤òɽ¼¨¤·¤Ê¤¤¤è¤¦¤Ë¤¹¤ë
-
+ ** [mode]
+ * past   - Show today, and the past below. Recommended for ChangeLogs and diaries (default)
+ * future - Show today, and the future below. Recommended for event planning and scheduling
+ * view   - Show all, from the past to the future
+ *
+ ** [separater]
+ * - Specify separator of yyyy/mm/dd
+ * - Default: '-' (yyyy-mm-dd)
+ *
+ * TODO
+ *  Stop showing links 'next month' and 'previous month' with past/future mode for 'this month'
+ *    #calendar_viewer(pagename,this,past)
  */
 
 function plugin_calendar_viewer_convert()
 {
-       global $WikiName,$BracketName,$vars,$get,$post,$hr,$script;
-       global $_err_calendar_viewer_param,$_err_calendar_viewer_param2;
-       global $_msg_calendar_viewer_right,$_msg_calendar_viewer_left;
-       global $_msg_calendar_viewer_restrict;
-
-       //*¥Ç¥Õ¥©¥ë¥ÈÃͤò¥»¥Ã¥È
-       //´ð½à¤È¤Ê¤ë¥Ú¡¼¥¸Ì¾
-       $pagename = "";
-       //ɽ¼¨¤¹¤ë·ï¿ôÀ©¸Â
-       $limit_page = 7;
-       //°ìÍ÷ɽ¼¨¤¹¤ëǯ·î
-       $date_YM = "";
-       //Æ°ºî¥â¡¼¥É
-       $mode = "past";
-       //ÆüÉդΥ»¥Ñ¥ì¡¼¥¿ calendar2¤Ê¤é"-" calendar¤Ê¤é""
-       $date_sep = "-";
-
-
-       //*°ú¿ô¤Î³Îǧ
-       if (func_num_args()>=2){
-               $func_vars_array = func_get_args();
-
-               $pagename = $func_vars_array[0];
-
-               if (isset($func_vars_array[3])){
-                       $date_sep = $func_vars_array[3];
-               }
-               if (preg_match("/[0-9]{4}".$date_sep."[0-9]{2}/",$func_vars_array[1])){
-                       //»ØÄêǯ·î¤Î°ìÍ÷ɽ¼¨
-                       $page_YM = $func_vars_array[1];
-                       $limit_base = 0;
-                       $limit_page = 31;       //¼êÈ´¤­¡£31Æüʬ¤ò¥ê¥ß¥Ã¥È¤È¤¹¤ë¡£
-               }else if (preg_match("/this/si",$func_vars_array[1])){
-                       //º£·î¤Î°ìÍ÷ɽ¼¨
-                       $page_YM = get_date("Y".$date_sep."m");
-                       $limit_base = 0;
-                       $limit_page = 31;
-               }else if (preg_match("/^[0-9]+$/",$func_vars_array[1])){
-                       //nÆüʬɽ¼¨
-                       $limit_pitch = $func_vars_array[1];
-                       $limit_page = $limit_pitch;
-                       $limit_base = 0;
-                       $page_YM = "";
-               }else if (preg_match("/([0-9]+)\*([0-9]+)/",$func_vars_array[1],$reg_array)){
-                       $limit_pitch = $reg_array[2];
-                       $limit_page = $reg_array[1] + $limit_pitch;
-                       $limit_base = $reg_array[1];
-                       $page_YM = "";
-               }else{
-                       return $_err_calendar_viewer_param2;
-               }
-               if (isset($func_vars_array[2])&&preg_match("/^(past|view|future)$/si",$func_vars_array[2])){
-                       //¥â¡¼¥É»ØÄê
-                       $mode = $func_vars_array[2];
-               }
+       global $vars, $get, $post, $script, $weeklabels;
+       global $_msg_calendar_viewer_right, $_msg_calendar_viewer_left;
+       global $_msg_calendar_viewer_restrict, $_err_calendar_viewer_param2;
+
+       static $viewed = array();
+
+       if (func_num_args() < 2)
+               return PLUGIN_CALENDAR_VIEWER_USAGE . '<br />' . "\n";
+
+       $func_args = func_get_args();
+
+       // Default values
+       $pagename    = $func_args[0];   // ´ð½à¤È¤Ê¤ë¥Ú¡¼¥¸Ì¾
+       $page_YM     = '';      // °ìÍ÷ɽ¼¨¤¹¤ëǯ·î
+       $limit_base  = 0;       // ÀèƬ¤«¤é¿ô¤¨¤Æ²¿¥Ú¡¼¥¸Ìܤ«¤éɽ¼¨¤¹¤ë¤« (ÀèƬ)
+       $limit_pitch = 0;       // ²¿·ï¤Å¤Äɽ¼¨¤¹¤ë¤«
+       $limit_page  = 0;       // ¥µ¡¼¥Á¤¹¤ë¥Ú¡¼¥¸¿ô
+       $mode        = 'past';  // Æ°ºî¥â¡¼¥É
+       $date_sep    = '-';     // ÆüÉդΥ»¥Ñ¥ì¡¼¥¿ calendar2¤Ê¤é '-', calendar¤Ê¤é ''
+
+       // Check $func_args[1]
+       $matches = array();
+       if (preg_match('/[0-9]{4}' . $date_sep . '[0-9]{2}/', $func_args[1])) {
+               // »ØÄêǯ·î¤Î°ìÍ÷ɽ¼¨
+               $page_YM     = $func_args[1];
+               $limit_page  = 31;
+       } else if (preg_match('/this/si', $func_args[1])) {
+               // º£·î¤Î°ìÍ÷ɽ¼¨
+               $page_YM     = get_date('Y' . $date_sep . 'm');
+               $limit_page  = 31;
+       } else if (preg_match('/^[0-9]+$/', $func_args[1])) {
+               // nÆüʬɽ¼¨
+               $limit_pitch = $func_args[1];
+               $limit_page  = $func_args[1];
+       } else if (preg_match('/(-?[0-9]+)\*([0-9]+)/', $func_args[1], $matches)) {
+               // ÀèƬ¤è¤ê¿ô¤¨¤Æ x ¥Ú¡¼¥¸Ìܤ«¤é¡¢y·ï¤Å¤Äɽ¼¨
+               $limit_base  = $matches[1];
+               $limit_pitch = $matches[2];
+               $limit_page  = $matches[1] + $matches[2]; // ÆɤßÈô¤Ð¤¹ + É½¼¨¤¹¤ë
+       } else {
+               return '#calendar_viewer(): ' . $_err_calendar_viewer_param2 . '<br />' . "\n";
+       }
 
+       // $func_args[2]: Mode setting
+       if (isset($func_args[2]) && preg_match('/^(past|view|future)$/si', $func_args[2]))
+               $mode = $func_args[2];
 
-       }else{
-               return $_err_calendar_viewer_param;
+       // $func_args[3]: Change default delimiter
+       if (isset($func_args[3])) $date_sep = $func_args[3];
+
+       // Avoid Loop etc.
+       if (isset($viewed[$pagename])) {
+               $s_page = htmlspecialchars($pagename);
+               return "#calendar_viewer(): You already view: $s_page<br />";
+       } else {
+               $viewed[$pagename] = TRUE; // Valid
        }
 
-       //*°ìÍ÷ɽ¼¨¤¹¤ë¥Ú¡¼¥¸Ì¾¤È¥Õ¥¡¥¤¥ë̾¤Î¥Ñ¥¿¡¼¥ó¡¡¥Õ¥¡¥¤¥ë̾¤Ë¤Ïǯ·î¤ò´Þ¤à
-       if ($pagename == ""){
-               //pagename̵¤·¤Îyyyy-mm-dd¤ËÂбþ¤¹¤ë¤¿¤á¤Î½èÍý
-               $pagepattern = "";
+       // °ìÍ÷ɽ¼¨¤¹¤ë¥Ú¡¼¥¸Ì¾¤È¥Õ¥¡¥¤¥ë̾¤Î¥Ñ¥¿¡¼¥ó¡¡¥Õ¥¡¥¤¥ë̾¤Ë¤Ïǯ·î¤ò´Þ¤à
+       if ($pagename == '') {
+               // pagename̵¤·¤Îyyyy-mm-dd¤ËÂбþ¤¹¤ë¤¿¤á¤Î½èÍý
+               $pagepattern     = '';
                $pagepattern_len = 0;
-               $filepattern = encode($page_YM);
+               $filepattern     = encode($page_YM);
                $filepattern_len = strlen($filepattern);
-       }else{
-               $pagepattern = strip_bracket($pagename) .'/';
+       } else {
+               $pagepattern     = strip_bracket($pagename) . '/';
                $pagepattern_len = strlen($pagepattern);
-               $filepattern = encode($pagepattern.$page_YM);
+               $filepattern     = encode($pagepattern . $page_YM);
                $filepattern_len = strlen($filepattern);
        }
 
-       //echo "$pagename:$page_YM:$mode:$date_sep:$limit_base:$limit_page";
-       //*¥Ú¡¼¥¸¥ê¥¹¥È¤Î¼èÆÀ
-       //echo $pagepattern;
-       //echo $filepattern;
-
+       // ¥Ú¡¼¥¸¥ê¥¹¥È¤Î¼èÆÀ
        $pagelist = array();
-       if ($dir = @opendir(DATA_DIR))
-               {
-                       $_date = get_date("Y".$date_sep."m".$date_sep."d");
-                       while($file = readdir($dir))
-                         {
-                           if ($file == ".." || $file == ".") continue;
-                           if (substr($file,0,$filepattern_len)!=$filepattern) continue;
-                           //echo "OK";
-                           $page = decode(trim(preg_replace("/\.txt$/"," ",$file)));
-                           //$page¤¬¥«¥ì¥ó¥À¡¼·Á¼°¤Ê¤Î¤«¥Á¥§¥Ã¥¯ ¥Ç¥Õ¥©¥ë¥È¤Ç¤Ï¡¢ yyyy-mm-dd
-                           $page = strip_bracket($page);
-                           if (plugin_calendar_viewer_isValidDate(substr($page,$pagepattern_len),$date_sep) == false) continue;
-
-                           //*modeËè¤ËÊ̾ò·ï¤Ç¤Ï¤¸¤¯
-                           //past mode¤Ç¤Ï̤Íè¤Î¥Ú¡¼¥¸¤ÏNG
-                           if (((substr($page,$pagepattern_len)) > $_date)&&($mode=="past") )continue;
-                           //future mode¤Ç¤Ï²áµî¤Î¥Ú¡¼¥¸¤ÏNG
-                           if (((substr($page,$pagepattern_len)) < $_date)&&($mode=="future") )continue;
-                           //view mode¤Ê¤éall OK
-                           $pagelist[] = $page;
-                         }
+       if ($dir = @opendir(DATA_DIR)) {
+               $_date = get_date('Y' . $date_sep . 'm' . $date_sep . 'd');
+               $page_date  = '';
+               while($file = readdir($dir)) {
+                       if ($file == '..' || $file == '.') continue;
+                       if (substr($file, 0, $filepattern_len) != $filepattern) continue;
+
+                       $page      = decode(trim(preg_replace('/\.txt$/', ' ', $file)));
+                       $page_date = substr($page, $pagepattern_len);
+
+                       // Verify the $page_date pattern (Default: yyyy-mm-dd).
+                       // Past-mode hates the future, and
+                       // Future-mode hates the past.
+                       if ((plugin_calendar_viewer_isValidDate($page_date, $date_sep) == FALSE) || 
+                               ($page_date > $_date && ($mode == 'past')) ||
+                               ($page_date < $_date && ($mode == 'future')))
+                                       continue;
+
+                       $pagelist[] = $page;
                }
+       }
        closedir($dir);
-       //echo count($pagelist);
-       //*¤³¤³¤«¤é¥¤¥ó¥¯¥ë¡¼¥É³«»Ï
-
-       $tmppage = $vars["page"];
-       $return_body = "";
-       //¤Þ¤º¥½¡¼¥È
-       if ($mode == "past"){
-               //past mode¤Ç¤Ï¿·¢ªµì
-               rsort ($pagelist);
-       }else {
-               //view mode ¤È future mode ¤Ç¤Ï¡¢µì¢ª¿·
-               sort ($pagelist);
+
+       if ($mode == 'past') {
+               rsort($pagelist);       // New => Old
+       } else {
+               sort($pagelist);        // Old => New
        }
 
-       //$limit_page¤Î·ï¿ô¤Þ¤Ç¥¤¥ó¥¯¥ë¡¼¥É
-       $tmp = $limit_base;
-       while ($tmp < $limit_page){
-               if (empty($pagelist[$tmp])) break;
-               $page = $pagelist[$tmp];
+       // Include start
+       $tmppage     = $vars['page'];
+       $return_body = '';
 
-               $get["page"] = $page;
-               $post["page"] = $page;
-               $vars["page"] = $page;
+       // $limit_page ¤Î·ï¿ô¤Þ¤Ç¥¤¥ó¥¯¥ë¡¼¥É
+       $tmp = max($limit_base, 0); // Skip minus
+       while ($tmp < $limit_page) {
+               if (! isset($pagelist[$tmp])) break;
 
-       // ¸½¾õ¤Ç±ÜÍ÷µö²Ä¤¬¤¢¤ë¾ì¹ç¤À¤±É½¼¨¤¹¤ë
-       if (check_readable($page,false,false)) {
-               $body = convert_html(get_source($page));
-       } else {
-               $body = str_replace('$1',$page,$_msg_calendar_viewer_restrict);
-       }
+               $page = $pagelist[$tmp];
+               $get['page'] = $post['page'] = $vars['page'] = $page;
+
+               // ¸½¾õ¤Ç±ÜÍ÷µö²Ä¤¬¤¢¤ë¾ì¹ç¤À¤±É½¼¨¤¹¤ë
+               if (check_readable($page, FALSE, FALSE)) {
+                       $body = convert_html(get_source($page));
+               } else {
+                       $body = str_replace('$1', $page, $_msg_calendar_viewer_restrict);
+               }
 
                $r_page = rawurlencode($page);
-               $s_page = htmlspecialchars($page);
-               $link = "<a href=\"$script?cmd=edit&amp;page=$r_page\">$s_page</a>";
-               $head = "<h1>$link</h1>\n";
+
+               if (PLUGIN_CALENDAR_VIEWER_DATE_FORMAT !== FALSE) {
+                       $time = strtotime(basename($page)); // $date_sep must be assumed '-' or ''!
+                       if ($time == -1) {
+                               $s_page = htmlspecialchars($page); // Failed. Why?
+                       } else {
+                               $week   = $weeklabels[date('w', $time)];
+                               $s_page = htmlspecialchars(str_replace(
+                                               array('$w' ),
+                                               array($week),
+                                               date(PLUGIN_CALENDAR_VIEWER_DATE_FORMAT, $time)
+                                       ));
+                       }
+               } else {
+                       $s_page = htmlspecialchars($page);
+               }
+
+               if (PKWK_READONLY) {
+                       $link   = $script . '?' . $r_page;
+               } else {
+                       $link   = $script . '?cmd=edit&amp;page=' . $r_page;
+               }
+               $link   = '<a href="' . $link . '">' . $s_page . '</a>';
+
+               $head   = '<h1>' . $link . '</h1>' . "\n";
                $return_body .= $head . $body;
 
-               $tmp++;
+               ++$tmp;
        }
 
-       //¤³¤³¤Ç¡¢Á°¸å¤Î¥ê¥ó¥¯¤òɽ¼¨
-       //?plugin=calendar_viewer&file=¥Ú¡¼¥¸Ì¾&date=yyyy-mm
-       $enc_pagename = rawurlencode(substr($pagepattern,0,$pagepattern_len -1));
+       // ¤³¤³¤Ç¡¢Á°¸å¤Î¥ê¥ó¥¯¤òɽ¼¨
+       // ?plugin=calendar_viewer&file=¥Ú¡¼¥¸Ì¾&date=yyyy-mm
+       $enc_pagename = rawurlencode(substr($pagepattern, 0, $pagepattern_len - 1));
 
-       if ($page_YM != ""){
-               //ǯ·îɽ¼¨»þ
+       if ($page_YM != '') {
+               // Ç¯·îɽ¼¨»þ
                $date_sep_len = strlen($date_sep);
-               $this_year = substr($page_YM,0,4);
-               $this_month = substr($page_YM,4+$date_sep_len,2);
-               //¼¡·î
-               $next_year = $this_year;
+               $this_year    = substr($page_YM, 0, 4);
+               $this_month   = substr($page_YM, 4 + $date_sep_len, 2);
+
+               // ¼¡·î
+               $next_year  = $this_year;
                $next_month = $this_month + 1;
-               if ($next_month >12){
-                       $next_year ++;
+               if ($next_month > 12) {
+                       ++$next_year;
                        $next_month = 1;
                }
-               $next_YM = sprintf("%04d%s%02d",$next_year,$date_sep,$next_month);
+               $next_YM = sprintf('%04d%s%02d', $next_year, $date_sep, $next_month);
 
-               //Á°·î
-               $prev_year = $this_year;
-               $prev_month = $this_month -1;
-               if ($prev_month < 1){
-                       $prev_year --;
+               // Á°·î
+               $prev_year  = $this_year;
+               $prev_month = $this_month - 1;
+               if ($prev_month < 1) {
+                       --$prev_year;
                        $prev_month = 12;
                }
-               $prev_YM = sprintf("%04d%s%02d",$prev_year,$date_sep,$prev_month);
-               if ($mode == "past"){
-                       $right_YM = $prev_YM;
-                       $right_text = $prev_YM."&gt;&gt;";
-                       $left_YM = $next_YM;
-                       $left_text = "&lt;&lt;".$next_YM;
-               }else{
-                       $left_YM = $prev_YM;
-                       $left_text = "&lt;&lt;".$prev_YM;
-                       $right_YM = $next_YM;
-                       $right_text = $next_YM."&gt;&gt;";
-               }
-       }else{
-               //n·ïɽ¼¨»þ
-               if ($limit_base >= count($pagelist)){
-                       $right_YM = "";
-               }else{
-                       $right_base = $limit_base + $limit_pitch;
-                       $right_YM = $right_base ."*".$limit_pitch;
-                       $right_text = sprintf($_msg_calendar_viewer_right,$limit_pitch);
+               $prev_YM = sprintf('%04d%s%02d', $prev_year, $date_sep, $prev_month);
+               if ($mode == 'past') {
+                       $right_YM   = $prev_YM;
+                       $right_text = $prev_YM . '&gt;&gt;'; // >>
+                       $left_YM    = $next_YM;
+                       $left_text  = '&lt;&lt;' . $next_YM; // <<
+               } else {
+                       $left_YM    = $prev_YM;
+                       $left_text  = '&lt;&lt;' . $prev_YM; // <<
+                       $right_YM   = $next_YM;
+                       $right_text = $next_YM . '&gt;&gt;'; // >>
                }
-               $left_base  = $limit_base - $limit_pitch;
-               if ($left_base >= 0) {
-                       $left_YM = $left_base . "*" . $limit_pitch;
-                       $left_text = sprintf($_msg_calendar_viewer_left,$limit_pitch);
+       } else {
+               // n·ïɽ¼¨»þ
+               if ($limit_base <= 0) {
+                       $left_YM = ''; // É½¼¨¤·¤Ê¤¤ (¤½¤ì¤è¤êÁ°¤Î¹àÌܤϤʤ¤)
+               } else {
+                       $left_YM   = $limit_base - $limit_pitch . '*' . $limit_pitch;
+                       $left_text = sprintf($_msg_calendar_viewer_left, $limit_pitch);
 
-               }else{
-                       $left_YM = "";
                }
-
-       }
-       //¥ê¥ó¥¯ºîÀ®
-       $s_date_sep = htmlspecialchars($date_sep);
-       if ($left_YM != ""){
-               $left_link = "<a href=\"$script?plugin=calendar_viewer&amp;file=$enc_pagename&amp;date=$left_YM&amp;date_sep=$s_date_sep&amp;mode=$mode\">$left_text</a>";
-       }else{
-               $left_link = "";
-       }
-       if ($right_YM != ""){
-               $right_link = "<a href=\"$script?plugin=calendar_viewer&amp;file=$enc_pagename&amp;date=$right_YM&amp;date_sep=$s_date_sep&amp;mode=$mode\">$right_text</a>";
-       }else {
-               $right_link = "";
+               if ($limit_base + $limit_pitch >= count($pagelist)) {
+                       $right_YM = ''; // É½¼¨¤·¤Ê¤¤ (¤½¤ì¤è¤ê¸å¤Î¹àÌܤϤʤ¤)
+               } else {
+                       $right_YM   = $limit_base + $limit_pitch . '*' . $limit_pitch;
+                       $right_text = sprintf($_msg_calendar_viewer_right, $limit_pitch);
+               }
        }
 
-       //past mode¤Ï<<¿· µì>> Â¾¤Ï<<µì ¿·>>
-       $return_body .= "<table width =\"100%\"><tr><td align=\"left\">";
-       $return_body .= $left_link;
-       $return_body .= "</td><td align=\"right\">";
-       $return_body .= $right_link;
-       $return_body .= "</td></tr></table>";
-
-
-       $get["page"] = $tmppage;
-       $post["page"] = $tmppage;
-       $vars["page"] = $tmppage;
+       // ¥Ê¥Ó¥²¡¼¥ÈÍѤΥê¥ó¥¯¤òËöÈø¤ËÄɲÃ
+       if ($left_YM != '' || $right_YM != '') {
+               $s_date_sep = htmlspecialchars($date_sep);
+               $left_link = $right_link = '';
+               $link = $script . '?plugin=calendar_viewer&amp;mode=' . $mode .
+                       '&amp;file=' . $enc_pagename . '&amp;date_sep=' . $s_date_sep . '&amp;';
+               if ($left_YM != '')
+                       $left_link = '<a href="' . $link .
+                               'date=' . $left_YM . '">' . $left_text . '</a>';
+               if ($right_YM != '')
+                       $right_link = '<a href="' . $link .
+                               'date=' . $right_YM . '">' . $right_text . '</a>';
+               // past mode¤Ï<<¿· µì>> Â¾¤Ï<<µì ¿·>>
+               $return_body .=
+                       '<div class="calendar_viewer">' .
+                       '<span class="calendar_viewer_left">'  . $left_link  . '</span>' .
+                       '<span class="calendar_viewer_right">' . $right_link . '</span>' .
+                       '</div>';
+       }
 
+       $get['page'] = $post['page'] = $vars['page'] = $tmppage;
 
        return $return_body;
 }
 
-function plugin_calendar_viewer_action(){
-       global $WikiName,$BracketName,$vars,$get,$post,$hr,$script;
-       $date_sep = "-";
+function plugin_calendar_viewer_action()
+{
+       global $vars, $get, $post, $script;
 
+       $date_sep = '-';
 
        $return_vars_array = array();
 
@@ -282,42 +294,38 @@ function plugin_calendar_viewer_action(){
        $vars['page'] = '*';
        if (isset($vars['file'])) $vars['page'] = $vars['file'];
 
-       $date_sep = $vars["date_sep"];
+       $date_sep = $vars['date_sep'];
 
-       $page_YM = $vars["date"];
-       if ($page_YM == ""){
-               $page_YM = get_date("Y".$date_sep."m");
-       }
-       $mode = $vars["mode"];
+       $page_YM = $vars['date'];
+       if ($page_YM == '') $page_YM = get_date('Y' . $date_sep . 'm');
+       $mode = $vars['mode'];
 
-       $args_array = array($vars["page"], $page_YM,$mode, $date_sep);
-       $return_vars_array["body"] = call_user_func_array("plugin_calendar_viewer_convert",$args_array);
+       $args_array = array($vars['page'], $page_YM, $mode, $date_sep);
+       $return_vars_array['body'] = call_user_func_array('plugin_calendar_viewer_convert', $args_array);
 
-       //$return_vars_array["msg"] = "calendar_viewer ".$vars["page"]."/".$page_YM;
-       $return_vars_array["msg"] = "calendar_viewer ".htmlspecialchars($vars["page"]);
-       if ($vars["page"] != ""){
-               $return_vars_array["msg"] .= "/";
-       }
-       if (preg_match("/\*/",$page_YM)){
-               //¤¦¡¼¤ó¡¢n·ïɽ¼¨¤Î»þ¤Ï¤Ê¤ó¤Æ¥Ú¡¼¥¸Ì¾¤Ë¤·¤¿¤é¤¤¤¤¡©
-       }else{
-               $return_vars_array["msg"] .= htmlspecialchars($page_YM);
+       //$return_vars_array['msg'] = 'calendar_viewer ' . $vars['page'] . '/' . $page_YM;
+       $return_vars_array['msg'] = 'calendar_viewer ' . htmlspecialchars($vars['page']);
+       if ($vars['page'] != '') $return_vars_array['msg'] .= '/';
+       if (preg_match('/\*/', $page_YM)) {
+               // ¤¦¡¼¤ó¡¢n·ïɽ¼¨¤Î»þ¤Ï¤Ê¤ó¤Æ¥Ú¡¼¥¸Ì¾¤Ë¤·¤¿¤é¤¤¤¤¡©
+       } else {
+               $return_vars_array['msg'] .= htmlspecialchars($page_YM);
        }
 
        $vars['page'] = $page;
        return $return_vars_array;
 }
 
-function plugin_calendar_viewer_isValidDate($aStr, $aSepList="-/ .") {
-       //$aSepList=""¤Ê¤é¡¢yyyymmdd¤È¤·¤Æ¥Á¥§¥Ã¥¯¡Ê¼êÈ´¤­(^^;¡Ë
-       if ($aSepList == "") {
-               //yyyymmdd¤È¤·¤Æ¥Á¥§¥Ã¥¯
-               return checkdate(substr($aStr,4,2),substr($aStr,6,2),substr($aStr,0,4));
-       }
-       if ( ereg("^([0-9]{2,4})[$aSepList]([0-9]{1,2})[$aSepList]([0-9]{1,2})$", $aStr, $m) ) {
-               return checkdate($m[2], $m[3], $m[1]);
+function plugin_calendar_viewer_isValidDate($aStr, $aSepList = '-/ .')
+{
+       $matches = array();
+       if ($aSepList == '') {
+               // yyymmdd¤È¤·¤Æ¥Á¥§¥Ã¥¯¡Ê¼êÈ´¤­(^^;¡Ë
+               return checkdate(substr($aStr, 4, 2), substr($aStr, 6, 2), substr($aStr, 0, 4));
+       } else if (ereg("^([0-9]{2,4})[$aSepList]([0-9]{1,2})[$aSepList]([0-9]{1,2})$", $aStr, $matches) ) {
+               return checkdate($matches[2], $matches[3], $matches[1]);
+       } else {
+               return FALSE;
        }
-       return false;
 }
-
 ?>