<?php
/**
 *
 * 計劃任務
 *
 * 計劃任務程序使用說明：
 * 本程序本身並不會執行任務任務，職責是跳轉到要執行的任務網址（JS調用形式），或直接返回要執行的任務網址（客戶端形式）
 * ·為了確保任務能執行完全，建議使用Dede的客戶端工具，否則只能通過JS觸發，但JS觸發有很多不確定因素會導致任務不能完成；
 * ·JS觸發方式：在所有文檔頁面中用JS調用/plus/task.php?client=js（必須禁用計劃任務的密碼，系統配置參數->其它選項）；
 * ·自行定制客戶端：直接訪問「http://網址/plus/task.php?clientpwd=管理密碼」，會返回其中一個可執行任務的網址（沒有可用任務則返回串：notask)，然後客戶端運行這個網址即可。 
 *
 * @version        $Id: task.php 1 21:40 2010年7月8日Z tianya $
 * @package        DedeCMS.Site
 * @copyright      Copyright (c) 2007 - 2010, DesDev, Inc.
 * @license        http://help.dedecms.com/usersguide/license.html
 * @link           http://www.dedecms.com
 */
require_once(dirname(__FILE__).'/../include/common.inc.php');
require_once(DEDEINC.'/dedetag.class.php');

if(empty($client)) $client = 'dede';
if(empty($clientpwd)) $clientpwd = '';
$cfg_task_pwd = trim($cfg_task_pwd);

//驗證客戶端工具密碼
if(!empty($cfg_task_pwd) && $clientpwd != $cfg_task_pwd)
{
    echo ($client=='js' ? '' : 'notask');
    exit();
}

//取得當時間的各個值
$ntime = time();
$nformattime = GetDateTimeMk($ntime);
list($ndate, $ntime) = explode(' ', $nformattime);
list($y, $m, $d) = explode('-', $ndate);
list($hh, $mm, $ss) = explode(':', $ntime);

$daylimit = 24 * 3600;

$dsql->Execute('me', 'SELECT * FROM `#@__sys_task` WHERE islock=0 ORDER BY id ASC ');
while($arr = $dsql->GetArray())
{
    $starttime = $arr['starttime'];
    $endtime = $arr['endtime'];
    //跳過一次性運行，並且已經運行的任務
    if($arr['lastrun'] > $starttime && $arr['runtype']==1) continue;
    //超過了設定的任務結束時間
    if($endtime!=0 && $endtime < $ntime) continue;
    //未達到任務開始時間的任務
    if($starttime!=0 && $ntime < $starttime) continue;
    
    $dotime = GetMkTime($ndate.' '.$arr['runtime'].':00');
    $limittime = $daylimit * $arr['freq'];
    
    $isplay = false;
    //判斷符合執行條件的任務
    if($arr['freq'] > 1 && $ntime - $arr['lastrun'] > $limittime )
    {
        $isplay = true;
    }
    else
    {
        $ndateInt = intval( str_replace('-', '', $ndate) );
        $rdateInt = intval( str_replace('-', '', GetDateMk($arr['lastrun'])) );
        list($th, $tm) = explode(':', $arr['runtime']);
        if($ndateInt > $rdateInt 
        && ($hh > $th || ($hh==$th && $mm >= $tm) ) )
        {
            $isplay = true;
        }
    }
    //符合需執行條件的任務
    if($isplay)
    {
        $dourl = trim($arr['dourl']);
        if(!file_exists("task/$dourl"))
        {
            echo ($client=='js' ? '' : 'notask');
            exit();
        }
        else
        {
            $getConfigStr = trim($arr['parameter']);
            $getString = '';
            if(preg_match('#t:#', $getConfigStr))
            {
                $getStrings = array();
                $dtp = new DedeTagParse();
                $dtp->SetNameSpace('t', '<', '>');
                $dtp->LoadString($getConfigStr);
                if(is_array($dtp->CTags))
                {
                    foreach($dtp->CTags as $k=>$ctag)
                    {
                        $getString .= ($getString=='' ? '' : '&').$ctag->GetAtt('key').'='.urlencode($ctag->GetAtt('value'));
                    }
                }
            }
            $dsql->ExecuteNoneQuery("Update `#@__sys_task` set lastrun='".time()."', sta='運行' where id='{$arr['id']}' ");
            if($getString !='' ) $dourl .= '?'.$getString; 
            if($client=='js') header("location:{$cfg_phpurl}/task/{$dourl}");
            else echo "{$cfg_phpurl}/task/{$dourl}";
            exit();
        }
    }
}
echo ($client=='js' ? '' : 'notask');
exit();