<?php
namespace imcat;

// Static相关
class vopStatic{

    
//生成一个广告类别的缓存
    
static function advType($mod,$type=''){
        
$cfg = glbConfig::read($mod);
        
$dtpl = array(
            
'1'=> "<a href='{url}' target='_blank'>{title}</a>",
            
'2'=> "<a href='{url}' target='_blank'><img src='{mpic}' name='{title}' alt='{title}' /></a>",
            
'3'=> "{detail}",
        );
        
$tpl = empty($cfg['i'][$type]['cfgs']) ? $dtpl[$cfg['etab']] : $cfg['i'][$type]['cfgs']; 
        if(!
strpos($tpl,'target')) $tpl = str_replace('<a',"<a target='_blank'",$tpl);
        
$data = ''; $rep = array('title','color','url','urlorg','mpic','detail');
        
$list = glbDBObj::dbObj()->table("advs_$mod")->where("catid='$type' AND `show`='1'")->select();
        if(
$list){
            foreach(
$list as $r){
                
$istr = $tpl;
                
$r['urlorg'] = $r['url'];
                if(
in_array($cfg['etab'],array(1,2))){ 
                    
$r['url'] = PATH_ROOT."/plus/api/redir.php?advs:".comConvert::sysBase64("$mod,$r[aid],$r[url]");
                }
                foreach(
$rep as $key){
                    
$istr = str_replace('{'.$key.'}',$r[$key],$istr);
                }
                
$istr = str_replace(array('{root}','{$root}'),PATH_ROOT,$istr);
                if(
$cfg['etab']==3 && !empty($r['url'])){
                    
$_arep = explode('[=]',$r['url']); 
                    
$istr = str_replace($_arep[0],$_arep[1],$istr);
                }
                
$data .= "$istr\r\n";
            }
        }
        
$data = comStore::revSaveDir($data);
        
$file = tagCache::caPath($mod,$type,0);
        
comFiles::chkDirs($file,'ctpl'); 
        
comFiles::put(DIR_CTPL."/$file",$data);
        return 
$data;
    }

    
//广告Static(按类别)
    
static function advMod($mod,$aids=array()){
        
$cfg = glbConfig::read($mod);
        if(
$cfg['etab']==4) return;
        if(
$mod=='adpush') return;
        
$ids = '';
        if(
is_array($aids)){
            foreach(
$aids as $id=>$v){ 
                if(empty(
$id)) continue;
                
$ids .= (empty($ids) ? '' : ',')."'$id'";            
            }
        }else{
            
$ids = "'$aids'";    
        }
        if(!
$ids) return;
        
$whr = $ids=="'(all)'" ? '1=1' : "aid IN($ids)";
        
$types = array(); $data = '';
        
$list = glbDBObj::dbObj()->field('DISTINCT catid')->table("advs_$mod")->where($whr)->select(); //frame=0 AND 
        
if($list){
            foreach(
$list as $r){
                
$caid = $r['catid'];
                if(!isset(
$cfg['i'][$caid])) break;
                
$ditm = self::advType($mod,$caid);
                
$data .= "[$caid]-{$cfg['i'][$caid]['title']}:::<br>$ditm <hr class='ma10 cF0F'> ";
            }
        }
        return 
$data;
    }

    
// showRes
    
static function showRes($res){
        
$msg = basLang::show('core.vops_batres')."<br><br>\n";
        
$msg .= $res['msg'] ? $res['msg']."<br>" : basLang::show('core.vops_dores',"[{$res['ok']}/{$res['cnt']}]")."<br>\n";
        
$msg .= "[".date('Y-m-d H:i:s')."]<br>\n";
        if(
$res['next']){ 
            
$msg .= "<br>\n".basLang::show('core.vops_3secnext')."<br>\n";
            
$js = "setTimeout(\"location.href='{$res['url']}';\",3000);"; 
            
$js = basJscss::jscode($js);
        }else{
            
$msg .= "<br>\n".basLang::show('core.vops_end')."<br>\n";
            
$js = '';    
        }
        
glbHtml::page(basLang::show('core.vops_res'));
        
glbHtml::page('body');
        echo 
"\n<p>$msg</p>\n<hr>\n$js";
        unset(
$res['msg']); basDebug::varShow($res);
        
glbHtml::page('end');
    }
    
    static function 
batList($mod,$tpl){ 
        
$re = array('msg'=>'','cnt'=>0,'ok'=>0,'next'=>'','min'=>'','max'=>'',);
        
$lists = vopTpls::entry($tpl,'ehlist','static');
        
$listn = $lists[$mod]; $msg = '';
        foreach(
$listn as $key=>$v){ 
            if(!
strpos($v,'/')) continue; //first,close
            
$key = $key=='m' ? "" : "-$key";
            
$msg .= vopStatic::toFile("$mod$key")."<br>\n";     
        }
        
$re['msg'] = $msg;
        return 
$re;
    }
    static function 
batDetail($mod,$tpl){ 
        
$re = array('msg'=>'','cnt'=>0,'ok'=>0,'next'=>'','min'=>'','max'=>'',);
        
$data = self::batKids($mod); $msg = ''; 
        
$vcfg = glbConfig::vcfg($mod);
        if(!empty(
$data)){
            foreach(
$data as $key=>$row){ 
                
$oid = $key;
                if(empty(
$re['min']) || $oid<$re['min']) $re['min'] = $oid;
                if(empty(
$re['max']) || $oid>$re['max']) $re['max'] = $oid;
                if(empty(
$vcfg['c']['stypes']) || in_array($row['type'],$vcfg['c']['stypes'])){ 
                    
$da = is_array($vcfg['d']) ? $vcfg['d'] : array('0'=>1); 
                    foreach (
$da as $ka => $va) {
                        
$msg .= vopStatic::toFile("$mod.$key".(empty($ka)?'':".$ka"))."<br>\n";
                    }
                    
$re['cnt']++;
                }else{
                    
$msg .= "[$mod.$key][{$row['type']}] Skip...<br>\n";
                }
            }
            
$re['next'] = 1; 
        }else{
            
$re['msg'] = 'No Data';
            
$re['next'] = 0;    
        } 
        
$re['msg'] = $msg;
        if(
$re['next']){
            
$offset = basReq::val('order')=='ASC' ? $re['max'] : $re['min'];
            
$re['url'] = basReq::getURep(0,'offset',$offset);
        }
        return 
$re; 
    }
    
// mod,limit(1-500),order(did:ASC),stype,offset
    
static function batKids($mod){
        
$mcfg = glbConfig::read($mod); $whrstr = '';
        
$stype = basReq::val('stype'); $offset = basReq::val('offset');
        
$limit = basReq::val('limit',10,'N'); if($limit<1) $limit = 10;
        
$order = basReq::val('order','DESC');
        if(
in_array($mcfg['pid'],array('docs','advs'))){ 
            
$stype && $whrstr .= basSql::whrTree($mcfg['i'],'catid',$stype);
            
$ftype = ',catid';    
            
$tabid = "docs_$mod";
        }elseif(
in_array($mcfg['pid'],array('users'))){
            
$stype && $whrstr .= " AND grade='$stype'";
            
$ftype = ',grade';    
            
$tabid = "users_$mod";
        }else{
            
$ftype = '';    
        }
        
$kname = substr($mcfg['pid'],0,1).'id';
        
$omod = in_array(strtoupper($order),array('ASC','DESC','EQ')) ? strtoupper($order) : 'DESC';
        
$offset = basReq::val('offset');
        if(
$offset){
            if(
strstr($omod,'DESC')){
                
$op = '<';
            }elseif(
strstr($omod,'ASC')){
                
$op = '>';
            }else{ 
// EQ
                
$op = '=';
            }
            
$whrstr .= " AND $kname$op'$offset'";
        } 
        
$whrstr = $whrstr ? substr($whrstr,5) : '1=1'; 
        
$data = glbDBObj::dbObj()->field("$kname$ftype,`show`")->table($tabid)->where($whrstr)->order("$kname $omod")->limit($limit)->select(); 
        
$re = array();
        if(!empty(
$data)){
            foreach(
$data as $row){ 
                
$type = $ftype ? $row[substr($ftype,1)] : $ftype;
                
$re[$row[$kname]] = array('show'=>$row['show'],'type'=>$type);
            }
        }
        return 
$re;
    }
    
    static function 
delList($mod,$tpl){ 
        
$re = array('msg'=>'','cnt'=>0,'ok'=>0,'next'=>'','min'=>'','max'=>'',);
        
$lists = vopTpls::entry($tpl,'ehlist','static');
        
$listn = $lists[$mod]; $msg = '';
        foreach(
$listn as $key=>$v){
            
$key = $key=='m' ? "" : $key;
            
$file = self::getPath($mod,$key,0);
            
$res = @unlink(DIR_HTML.'/'.$file); $res = var_export($res,1);
            
$msg .= "{$res}:".$file."<br>\n";
        }
        
$re['msg'] = $msg;
        return 
$re;
    }
    static function 
delDetail($mod,$sub=''){ 
        static 
$fext, $msg;
        if(empty(
$fext)){
            
$mcfg = glbConfig::vcfg($mod); 
            
$fext = $mcfg['c']['stext'];
            
$msg = '';
        } 
        
$dfix = basReq::val('offset');
        
$elen = strlen($fext);
        
$ndir = DIR_HTML."/$mod$sub";
        if(!
is_dir("$ndir")){ return false; };
        
$handle = opendir("$ndir");
        while((
$file = readdir($handle)) !== false){
            if(
$file != "." && $file != ".."){
                if(
in_array($file,array('index.htm','index.html'))) continue;
                if(
is_dir("$ndir/$file")){
                    if(empty(
$sub) && $file=='home'){ continue; }
                    if(empty(
$sub) && $dfix && strstr($file,$dfix)){ continue; }
                    
self::delDetail($mod,"$sub/$file");
                }else{
                    if(
substr($file,-$elen,$elen)==$fext){
                        
$res = @unlink("$ndir/$file"); $res = var_export($res,1);
                        
$msg .= "{$res}:$sub/$file<br>\n";
                    }
                }
            }
        }
        
$re = array('cnt'=>substr_count($msg,'<br>'),'ok'=>substr_count($msg,'true:'),'next'=>'',);
        
$re['msg'] = $msg;
        return 
$re;
    }
    
//生成Static文件(当前模板)
    
static function toFile($q=''){ 
        
basEnv::runCbase(); //重置参数
        
defined('RUN_STATIC') || define('RUN_STATIC',1);
        static 
$vop; if(empty($vop)) $vop = new vopApp(0);
        
ob_start(); 
        
$err = $vop->run($q); 
        if(empty(
$vop->ucfg)){ 
            return 
$vop->err ? $vop->err : "($q)Error! Has NO set tpl!"; 
        }
        
$re = ob_get_contents();
        
$kid = $vop->mod=='home' ? 'home' : $vop->key;
        
$vext = empty($vop->view) ? '' : ".$vop->view";
        
$file = self::getPath($vop->mod,$kid.$vext,0); 
        
$msg = $file.' : '.basStr::showNumber(strlen($re),'Byte').'';
        
comFiles::chkDirs($file,'html');
        
comFiles::put(DIR_HTML.'/'.$file,"$re\n<!--$msg-->");
        
ob_end_clean(); 
        return 
$msg;
    }
    
    
//获得Static文件路径(当前模板):
    
static function getPath($mod,$kid,$isfull=1){
        
$kid || $kid = 'home';
        
$dir = comStore::getResDir($mod,$kid,$isfull);
        if(
$isfull){
            
$dir = DIR_HTML.substr($dir,strlen(DIR_URES));     
        }
        
$mcfg = glbConfig::vcfg($mod);
        return 
$dir.(empty($mcfg['c']['stext']) ? '.htm' : $mcfg['c']['stext']);
    }
    
    
//updKid:更新(add,del,edit)一个Kid的静态
    
static function updKid($mod,$kid,$act='upd',$itype=''){
        global 
$_cbase;
        
$tplbak = $_cbase['tpl']['vdir'];
        
$vcfg = vopTpls::etr1('tpl'); 
        
$re = array(); 
        foreach(
$vcfg as $tpl=>$suit){
            if(
strpos($_cbase['tpl']['no_static'],$tpl)) continue;
            
$file = DIR_VIEWS."/$tpl/_config/vc_$mod.php";
            if(
file_exists($file)){
                include 
$file; 
                
$kc = "_vc_$mod"; $cfg = $$kc;
                if(
$itype && !empty($cfg['c']['stypes']) && !in_array($itype,$cfg['c']['stypes'])){ 
                    continue; 
// 忽略不需要生成静态的页面
                
} 
                if(
$cfg['c']['vmode']=='static'){
                    if(
$act=='del'){
                        
$_cbase['tpl']['vdir'] = $tpl; 
                        
$re[$tpl] = self::getPath($mod,$kid,1);
                    }else{
                        
$re[$tpl] = "$mod.$kid";
                    }
                }
            }
        }
        
$_cbase['tpl']['vdir'] = $tplbak;
        return 
$re; 
    }
    
    
//是否需要生成静态
    
static function chkNeed($mkv=''){ 
        
$moda = vopUrl::imkv(array('mkv'=>$mkv),'a');
        
$kid = $moda[0]=='home' ? 'home' : $moda[1]; 
        
$vcfg = glbConfig::vcfg($moda[0]); 
        if(@
$vcfg['c']['vmode']!='static') return 0;
        
$vext = empty($moda[2]) ? '' : ".$moda[2]";
        
$file = self::getPath($moda[0],$kid.$vext,0); 
        
$flag = !extCache::cfGet("/$file",$vcfg['c']['stexp'],'html');
        return 
$flag;    
    }

}