<?php
//iClalendarの出力パス
    DEFINE("ICS_PATH","/foo/bar/diary.ics");
    
//iCalendarのURL
    DEFINE("ICS_URL","http://www.example.com/diary.ics");
    
//iCalendarのカレンダー名
    DEFINE("CALENDAR_NAME","diary");

//入力フォームの高さ
	DEFINE("ROWS_HEIGHT","15");
    
//入力フォームの幅
	DEFINE("COLS_WIDTH","45");
    
//入力フォームのタイトル
	DEFINE("TITLE","**Diary入力");
    
//XHTML非準拠の機能を使用するか？
    DEFINE("NON_XHTML","false");

    DEFINE("VERSION","1.3");

    class plugin_diary_export_for_ics{
    	function date(){
    		preg_match("/^.*\/(.*)-(.*)-(.*)/", $this->ePage, $date);
    		$this->eDate = $date[1].$date[2].$date[3];
    	}
    	
    	function plugin_diary_export_for_ics($calendar_name = CALENDAR_NAME){
    		$this->CALENDAR_NAME = $calendar_name;
    	}
    	
    	function header(){
            define("VENDER","nobu_s");
            define("PRODUCT","pukiwiki_diary_export_for_ical");
    		$header  = "BEGIN:VCALENDAR\r\n";
    		$header .= "CALSCALE:GREGORIAN\r\n";
    		$header .= "X-WR-TIMEZONE:Asia/Tokyo\r\n";
    		$header .= "X-WR-RELCALID:".md5(ICS_URL)."\r\n";
    		$header .= "PRODID:-//".VENDER."//".PRODUCT." Ver.".VERSION."//EN\r\n";
    		$header .= "X-WR-CALNAME:".$this->CALENDAR_NAME."\r\n";
    		$header .= "VERSION:2.0\r\n";
    		$header .= "BEGIN:VTIMEZONE\r\n";
    		$header .= "LAST-MODIFIED:".date("Ymd\THis")."\r\n";
    		$header .= "TZID:Asia/Tokyo\r\n";
    		$header .= "BEGIN:STANDARD\r\n";
    		$header .= "DTSTART:19371231T150000\r\n";
    		$header .= "TZOFFSETTO:+0900\r\n";
    		$header .= "TZNAME:JST\r\n";
    		$header .= "TZOFFSETFROM:+0000\r\n";
    		$header .= "END:STANDARD\r\n";
    		$header .= "END:VTIMEZONE\r\n";
    		return $header;
    	}
    	
    	function footer(){
    		$footer = "END:VCALENDAR\r\n";
    		return $footer;
    	}
    	function unix_comp($sdate,$edate){
    		$sdate_array = split("/",$sdate);
    		$edate_array = split("/",$edate);
    		$sdate_unix = mktime(0,0,0,abs($sdate_array[1]),abs($sdate_array[2]),$sdate_array[0]);
    		$edate_unix = mktime(0,0,0,abs($edate_array[1]),abs($edate_array[2]),$edate_array[0]);
    		return ($edate_unix-$sdate_unix)/60/60/24;
    	}
        
    	function exportDiaryData($data){
            global $script;
    		$string = "";
    		$this->eData ="";
            $url = $script."?"."cmd=read&page=diary&date=".$this->eDate;
    		foreach ($data as $i) {
    			$string .= $i."\n";
    		}
    		$string_array = split("\*\*", $string);
    		$title_count = count($string_array);
    		for ($i=1; $i<$title_count; ++$i) {
    			preg_match("/^(.*)\\n\\n(.*)/", $string_array[$i], $parse_data);
                preg_match("/^\[(.*)\](.*)[\(\[]/", $parse_data[1], $title);
                $title[2] = preg_replace("/\(.*\)$/", "$1", trim($title[2]));
    			$this->eTitle = $title[2]."[".$title[1]."]";
    			$this->eBody  = str_replace("~", "", $parse_data[2]);
    			if (preg_match("/^.*\((.*):(.*)\)/", $parse_data[1], $time)) {
    				$date = "TZID=Asia/Tokyo:".$this->eDate."T".sprintf("%02d",$time[1]).$time[2]."00";
                    $duration = "PT1H";
    			} else {
    				$date = "VALUE=DATE:".$this->eDate;
    			    $duration = "P1D";
                }
    			$this->eData .= "BEGIN:VEVENT\r\n";
    			$this->eData .= "DTSTAMP:".$this->eLastupdate."\r\n";
    			$this->eData .= "SUMMARY:".$this->eTitle."\r\n";
    			$this->eData .= "DTSTART;".$date."\r\n";
    			$this->eData .= "UID:".md5(microtime())."\r\n";
    			$this->eData .= "DURATION:".$duration."\r\n";
                $this->eData .= "URL:".$url."\r\n";
    			$this->eData .= "DESCRIPTION:".$this->eBody."\r\n";
    			$this->eData .= "END:VEVENT\r\n";
    			$this->eTitle_tmp = $this->eTitle;
    		}
    		return $this->eData;
    	}
    	
    	function update($time){
    		$time = $time-32400;
    		$this->eLastupdate = date("Ymd\THis", $time);
    	}
    }

    function plugin_diary_action(){
        global $post,$script,$hr,$vars,$get;
        $msg_str = array("戻る","を編集しました。","カテゴリ別");
        if($get["export"] == "ical"){
            $data = new plugin_diary_export_for_ics();
        	$output  = $data->header();
    		//diaryデータの検索
    		$puki_page = "";
    		if ($dir = @opendir(DATA_DIR)) {
    		    while ($file = readdir($dir)) {
    	            $file = decode(trim(preg_replace("/\.txt$/", " ", $file)));
    	            if (preg_match("/^diary\/(.*)-(.*)-(.*)/", $file, $date_array)) {
    	                $file_date = $date_array[1].$date_array[2].$date_array[3];
    	                if (date("Ymd") <= $file_date) {
    	                    $puki_page[] = $file;
    	                }
    	            }
    		    }
    		}
    		//diaryデータの出力
    		foreach ($puki_page as $i) {
    		    $puki_data[$i] = get_source($i);
    			$data->ePage = $i;
    			$data->date();
    			$update = get_filetime($i);
    			$data->update($update);
    			$output .= $data->exportDiaryData($puki_data[$i]);
    		}
    		//フッターの出力
    		$output .= $data->footer();
    		$utf_body = mb_convert_encoding($output, "UTF-8", "EUC-JP");
    		$fp = fopen(ICS_PATH, 'w');
    		fputs($fp,$utf_body);
    		fclose($fp);
        	if ($get[dummy] == "ics") {
        	    header("Location: ".ICS_URL);
        	}
        	$print_string = "<pre>".$output."</pre>";
        	return array("msg"=>ICS_URL."の内容", "body"=>$print_string);
        }
        if ($get["mode"]=="write"){
            $post["year"]  = mb_convert_kana($post["year"],"KVa");
            $post["month"] = mb_convert_kana($post["month"],"KVa");
            $post["day"]   = mb_convert_kana($post["day"],"KVa");
            if ( abs($post["month"]) > 12 ) $post["month"] = 12;
            for ( $i = abs($post["day"]); $i > 0; $i--) {
                if ( checkdate(abs($post["month"]), $i, $post["year"]) ) {
                    $post["day"] = $i;
                    break;
                }
            }
            $url_date = sprintf("%04d%02d%02d",$post["year"],$post["month"],$post["day"]);
            if ($url_date==$post["old"]){
                $date = sprintf("%04d-%02d-%02d",$post["year"],$post["month"],$post["day"]);
                $title = $post["refer"]."/".$date;
                $body = $post["body"];
                page_write($title,$body);
                $html_body = convert_html($body);
                $html_body.= "<hr>";
                $html_body.= convert_html("[[{$msg_str[0]}>$script?cmd=read&page={$post["refer"]}&date=$url_date]]");
                if($post["category"] != ""){
                    header("Location: $script?cmd=read&page={$post["refer"]}&date=$url_date&category_list=".urlencode($post["category_list"]));
                }else{
                    return array("msg" => $title.$msg_str[1],"body" => $html_body);
                }
            }else{
                header("Location: $script?cmd=read&page={$post["refer"]}&date=$url_date");
                exit;
            }
        }
    }
    
    function plugin_diary_convert(){
        global $post,$script,$hr,$vars,$get;
        $args = func_get_args();
        if(count($args) == 1 && $args[0] == "category_result"){
            $page_list = "";
            $year_list = "";
        //セレクトボックスの初期値取得
            $year = get_date("Y");
            $month = (isset($post["month"])) ? $post["month"] : sprintf("%02d",get_date("m"));
        //対象ファイル名の取得とセレクトボックスの年範囲取得
            if ($dir = @opendir(DATA_DIR)) {
                while($file = readdir($dir)) {
                    if ($file != ".." and !$file != ".") {
                        $file = decode(trim(preg_replace("/\.txt$/"," ",$file)));
                        if (preg_match("/^diary\/$year-$month-/",$file)){
                            $file_list[] = $file;
                        }
                        preg_match("/\/(.*)-(.*)-(.*)/",$file,$date);
                        if ($date[1] != null ){
                            $year_list[] = $date[1];
                        }
                    }
                }
            }
            $tmp = array_unique($year_list);
            sort($tmp);
            
        //セレクトボックスの作成
            $year_str = "";
            foreach ($tmp as $i){
                if($i == get_date("Y")){
                    $selected = " selected=\"selected\"";
                }
                $year_str .= "<option value=\"".$i."\"$selected>".$i."</option>";
                    $selected = "";
            }
            for ($i=1;$i<13;++$i){
                $selected = ($i == abs($month)) ? " selected=\"selected\"" : "" ;
                $month_str .="<option value=\"".sprintf("%02d",$i)."\"$selected>".sprintf("%02d",$i)."</option>";
            }
        //セレクトボックスフォーム作成
            $form_str = "";
            $form_str = "
                    <div><form method=\"post\" action=\"$script?cmd=read&amp;page=".$vars["page"]."\">
                    <div>
                    <select name=\"year\">
                            $year_str</select>
                    年
                    <select name=\"month\">
                            $month_str
                    </select>
                    月
                    <input type=\"hidden\" name=\"category\" value=\"ALL\" />
                    <input type=\"submit\" value=\"カテゴリ別表示\" />
                    </div></form></div>
                    ";
            
        //出力用データのソート
            sort ($file_list);
            foreach( $file_list as $file ) {
                $str_list = "";
            //アンカーの削除
                $reg_str = '^(\*{1,3}.*)\[#[A-Za-z][\w-]+\](.*)$';
                $str_line = preg_replace("/".$reg_str."/m",'$1$2',get_source($file));
                foreach($str_line as $i){
                    $str_list .= $i;
                }
                $str_list_array = array_splice(split("\*\*",$str_list),1);
            //array_multisort用に配列作成
                foreach($str_list_array as $i){
                    $tmp_file_date[] = $file;
                    preg_match("/^\[.*\]/",$i,$category);
                    $tmp_category[] = $category[0];
                    $tmp_str[] = preg_replace("/^\[.*\](.*)/","$1",$i);
                }
            }
            array_multisort($tmp_category,$tmp_file_date,$tmp_str);
        //出力用データの書き出し
            $str_count = count($tmp_str);
            $str_list = "";
            for($i=0; $i<$str_count; ++$i){
                if($old_category != $tmp_category[$i]){
                    $str_list .= "*".$tmp_category[$i]."\n";
                }
                $str_list .= "**[[●>".$tmp_file_date[$i]."]]".$tmp_str[$i]."\n";
                $old_category = $tmp_category[$i];
            }
        //出力
            $body = convert_html($str_list);
            $body = $form_str."<br />".$body;
            $title = $year."-".$month." ".$msg_str[2];
            return $body;
        }
        $year=get_date("Y");
        $month=get_date("m");
        $day=get_date("d");
        if(isset($_GET[date])){
            $year=substr($_GET[date],0,4);
            $month=substr($_GET[date],4,2);
            $day=substr($_GET[date],6,2);
        }
        $old_date=$year.$month.$day;
        $refer=$vars["page"];
        $body_array=preg_replace('/^(\*{1,3}.*)\[#[A-Za-z][\w-]+\](.*)$/m','$1$2',get_source($refer."/".$year."-".$month."-".$day));
        $body="";
        foreach($body_array as $i){
            $body.=$i;
        }
        plugin_diary_check_config($refer);
        $category_array = plugin_diary_read_config($refer);
        $listbox = "<option>リストから選択</option>";
        foreach($category_array as $i){
            $listbox.="<option value=\"**[$i]\">$i</option>\n";
        }
        $add_category = urldecode($get["category_list"]);
        
        if(NON_XHTML == "true"){
            $non_xhtml_selectbox = " OnChange=\"document.forms['diary'].body.value += document.forms['diary'].category_list.options[document.forms['diary'].category_list.selectedIndex].value.concat('\\n')\"";
        }
		$rows_height = ROWS_HEIGHT;
		$cols_width  = COLS_WIDTH;
		$title = convert_html(TITLE);
        return <<<EOF
	$title
    <form name="diary" enctype="multipart/form-data" action="$script?plugin=diary&amp;mode=write" method="post">
        <table>
            <tr>
                <td align="right" valign="top">日付 : </td>
                <td>
                    <input type="hidden" name="old" value="$old_date" />
                    <input type="hidden" name="refer" value="$refer" />
                    <input class="field" name="year" tabindex="1" 
                        accesskey="Y" size="4" value="$year" /> 年
                    <input class="field" name="month" tabindex="2"
                         accesskey="M" size="2" value="$month" /> 月
                    <input class="field" name="day" tabindex="3"
                         accesskey="D" size="2" value="$day" /> 日
                    <input type="submit" tabindex="4"
                         accesskey="E" name="edit" value="この日付の日記を編集" />
                </td>
            </tr>
            <tr>
                <td align="right" valign="top">本文 : </td>
                <td><textarea name="body" tabindex="5" accesskey="C" cols=$cols_width rows=$rows_height>$body\n$add_category\n</textarea></td>
            </tr>
            <tr>
                <td align="right" valign="top">カテゴリ : </td>
                <td>
                    <select name="category_list"$non_xhtml_selectbox>$listbox</select>
                    <input type="submit" name="category" value="選択">
                    <a href="$script?cmd=edit&amp;page=:config/plugin/diary/$refer">[ リスト編集 ]</a>
                </td>
            </tr>
            <tr>
                <td colspan="2" align="center"><input type="submit" tabindex="999" accesskey="A" name="append" value="追記" /></td>
            </tr>
        </table>
    </form>
EOF;
    }

    function plugin_diary_check_config($page){
        $config = new Config('plugin/diary/'.$page);
        if (!$config->read()){
            $body = "*category\n";
        $body.= "|name|h\n";
        $body.= "|その他|\n";
        page_write(":config/plugin/diary/$page",$body);
        }
    }

    function plugin_diary_read_config($page){
        $config = new Config('plugin/diary/'.$page);
        $config->read();
        return $config->get("category");
    }
/* vim:set ts=4 sw=4 sts=0: */
?>
