<?php
namespace imcat;

// Element基本html元素类
class basElm{    

    
// 选项的key-val相同
    
static function convOpts($arr){
        
$res = [];
        foreach(
$arr as $k=>$v){ 
            
$res[$v] = $v;
        }
        return 
$res;
    }

    
// option,"upd|更新;del|删除;show|启用", 符号;\n表示一行, 符号|=分开键值
    //        "upd,更新;del|删除\nshow=启用"
    
static function setOption($cfgs$val=''$title='-(def)-'$fpid=0){
        if(empty(
$cfgs)) return '';
        
$title $title=='-(def)-' basLang::show('core.opt_first') : $title;
        if(
is_string($cfgs)){
            if(!
strpos($cfgs,'(')){ // 排除:class::func(pa,p2,..)
                
$cfgs str_replace(array(';','|',','),array("\n",'=','='),$cfgs);
            }
            
$cfgs self::text2arr($cfgs);
        }
        if(
$title$cfgs = array(''=>$title) + $cfgs
        
$str $pid '';
        foreach(
$cfgs as $k=>$v){ 
            
$v is_string($v) ? (empty($v)?$k:$v) : $v['title']; // isset($v['title']) 某些环境下出错...
            
if(strstr($k,'^group^')){
                
$str .= "\n<optgroup label='$v'></optgroup>";
                
$pid str_replace('^group^','',$k);
            }else{
                
$def "$val"==="$k'selected' ''
                
$pids $fpid " pid='$pid'" '';
                
$str .= "\n<option value='$k$def$pids>$v</option>";    
            }
        }
        return 
$str;
    }
    
// checkbox,
    
static function setCBox($k0,$cfgs,$val='',$brn=0){
        
$cfgs self::text2arr($cfgs);
        
$varr = empty($val) ? array() : explode(',',$val);
        
$str "\n<input id='fm[$k0][]' name='fm[$k0][]' type='hidden' value='' />"
        
$i 0$j 0;
        foreach(
$cfgs as $k=>$v){ $i++; $j++;
            
$v is_string($v) ? (empty($v)?$k:$v) : $v['title'];
            
$def in_array($k,$varr) ? " checked='checked' " '';
            if(
$brn && $j>$brn) { $str .= "<br>"$j=1; }
            
$str .= "\n<label><input type='checkbox' class='rdcb' name='fm[$k0][]' id='fm_{$k0}_$i' value='$k$def>$v</label>";
        }
        return 
$str;
    } 
// array_shift(), array_filter()
    // radio,
    
static function setRadio($k0,$cfgs,$val='',$brn=0){
        
$cfgs self::text2arr($cfgs);
        
$str ""$i 0$j 0;
        foreach(
$cfgs as $k=>$v){ $i++; $j++;
            
$v is_string($v) ? (empty($v)?$k:$v) : $v['title'];
            
$def "$val"==="$k" checked='checked' " '';
            if(
$brn && $j>$brn) { $str .= "<br>"$j=1; }
            
$str .= "\n<label><input type='radio' class='rdcb' name='fm[$k0]' id='fm_{$k0}_$i' value='$k$def>$v</label> ";
        }
        return 
$str;
    }
    
    
// arr2text: full,外观图;side,侧面图;inn,内部图;att,附件图;
    
static function arr2text($arr,$row=';',$col=','){ 
        if(
is_string($arr)){
            
$arr str_replace(array(';',','),array("\n",'='),$arr);
            
$arr self::text2arr($arr);
        }
        
$s '';
        foreach(
$arr as $k=>$v){
            
$s .= "$k$col$v$row";
        }
        return 
$s;
    }
    
// form: text2arr
    
static function text2arr($text){
        if(empty(
$text)){ return []; }
        
$_groups glbConfig::read('groups');
        
$text is_array($text) ? $text trim($text);
        if(
is_array($text)){
            if(!empty(
$text['fmextra']) && !empty($text['fmexstr']) && $text['fmextra']=='winpop'){
                return 
self::text2arr($text['fmexstr']);
            }elseif(isset(
$text['title']) && !empty($text['cfgs'])){
                return 
self::text2arr($text['cfgs']);
            }
            return 
$text;
        }elseif(isset(
$_groups[$text])){ 
            
$rei glbConfig::read($text); 
            
$rei $rei['i'];
            foreach(
$rei as $k=>$v){ 
                
$re[$k] = $v['title'];
            }
        }elseif(
preg_match("/^bext_paras\.\w+$/",$text)){ //bext_paras.logmode_cn
            
$re glbDBExt::getExtp(substr($text,11));
        }elseif(
preg_match("/^\w+\.\w+$/",$text)){ //corder.ordstat
            
$t explode('.',$text);
            
$mcfg glbConfig::read($t[0]); 
            if(!empty(
$mcfg['i'][$t[1]])){
                foreach(
$mcfg['i'] as $k=>$v){ if($v['pid']==$t[1]){
                    
$re[$k] = $v['title'];
                } }
            }elseif(isset(
$mcfg['f'])){
                
$re self::text2arr($mcfg['f'][$t[1]]['cfgs']);
            }else{ 
$re=[]; } //dump($mcfg);
        
}elseif(preg_match("/^(\w+)::(\w+)\(([\w\ \,]{0,24})\)$/",$text)){
            
$text str_replace(array("\r","\n",' '),'',$text);
            
preg_match("/^(\w+)::(\w+)\(([\w\,]{0,24})\)$/",$text,$ma);
            
$cfile $ma[1]; $method $ma[2];
            
$pa explode(',',$ma[3].',,,,');
            foreach (
$pa as $pk=>$pv) {
                
$pa[$pk] = strlen($pa[$pk])>$pa[$pk] : null;
            } 
// \imcat\class::func(pa,p2,..)
            
$re basClass::obj($cfile)->$method($pa[0],$pa[1],$pa[2],$pa[3],$pa[4],$pa[5]);
        }else{
            
$text self::linestrim($text);
            
$text str_replace(array("\n","\r"),array('&','&'),$text);
            
parse_str($text$re); 
        } 
        return 
$re;
    }
    
// re: 0:直接返回, kv:key=val, text:字符串
    
static function line2arr($text$re=0$extf=''$no=1){ 
        if(!empty(
$extf)){ $text str_replace($extf,"\n",$text); }
        
$text self::linestrim($text);
        
$text explode("\n",$text);
        
$text array_filter($text);
        if(!
$re) return $text// 直接返回数组
        
if($re=='text') return implode("\n"$text); // 返回文本
        // kv:key=val //  返回键值对数组
        
$res = array(); 
        foreach (
$text as $row){
            
$row trim($row); if(empty($row)){ continue; }
            
$pos strpos($row,'='); 
            if(
$pos>0){
                
$key substr($row,0,$pos);
                
$res[$key] = substr($row,$pos+1);
            }else{
                
$res[$no] = $row;
            }
            
$no++;
        } 
// print_r($res);
        
return $res;
    }
    
// 多行文本,删除每行前后空白; 删除=号前后空白
    
static function linestrim($text=''$trimeq=1){
        if(empty(
$text)){ return ''; }
        
$text preg_replace_callback("/\s*([\n|\r])+\s*/i", function($itms){
            return 
"\n"// 去每行两边空白
        
}, trim($text));
        if(!
$trimeq){
            return 
$text;
        }
        
$text preg_replace_callback("/\s*[\=]+\s*/i", function($itms){
            return 
"="// 去=号两边空白
        
}, $text);
        return 
$text;
    }

    
// 格式化标签
    
static function fmtFlag($flag){  
        if(
is_string($flag) && strpos($flag,'(*)')){ $af explode('(*)',$flag); }
        else{ 
$af is_array($flag) ? $flag : array("<$flag>","</$flag>"); }
        return 
$af;
    } 
    
// 获取xml/html标签 的一个值 或 一个innerHTML
    // 标签法 ($data,'<div class="content">(*)</div>') 
    
static function getVal($xStr,$flag){  
        return 
self::getPos($xStr,$flag);
    }  
    
// 获取xml/html标签 的一个值 或 一个innerHTML
    // 定点法 ($data,'<div class="content">(*)id="link"')
    
static function getPos($xStr,$flag){  
        
$af self::fmtFlag($flag); 
        
$p1 strpos($xStr$af[0]); 
        
$xStr is_int($p1) ? substr($xStr,$p1+strlen($af[0])) : '';
        
$p2 strpos($xStr$af[1]); 
        
$xStr is_int($p2) ? substr($xStr0$p2) : '';
        return 
$xStr;
    }
    
// 获取xml/html标签 的一组值 或 一组innerHTML 加参数$no获取单个下标
    // 标签法 ($data,'<li class="cls22">(*)</li>') 或 ($data,'<li class(*)</li>')
    
static function getArr($xStr,$flag,$no=-1){  
        
$af self::fmtFlag($flag); 
        
$re self::getTags($xStr,$af[0],$af[1]);
        if(
$no==-1) return $re;
        else return isset(
$re[$no]) ? $re[$no] : '';
    }
    
// 获取xml/html标签 的一组值 或 一组innerHTML 加参数$no获取单个下标
    // 正则法 ($data,'<li class="cls1">(*)</li>') //  [\\d]{1,4}  
    
static function getPreg($xStr,$flg1,$reg="[^\n|\r]{1,1200}",$no=-1){  
        
$flag preg_quote($flg1); // =\(\*\)
        
$flag str_replace("/","\\/",$flag);
        
$flag str_replace('\(\*\)',"($reg)",$flag); 
        
preg_match_all("/$flag/i",$xStr,$m);
        if(
$no==-2){
            return 
$m;
        }elseif(
$no==-1){
            return 
$m[1];
        }else{ 
            return isset(
$m[1][$no]) ? $m[1][$no] : '';
        }
    }
    
// 获取xml/html标签 的一组属性 加参数$no获取单个下标
    // ($data,'witdh','val',1) 或 ($data,'href','url')
    
static function getAttr($str,$flag,$reg='key',$no=-1){ 
        if(
strlen($reg)<=3){
            
$a = array(
                
'key' => '[\w]{2,24}',
                
'url' => '[^"|\'|>| ]{1,120}'//"\S*", 
                
'val' => '[^>]{1,255}',
            );
            
$reg $a[$reg];
        } 
        
preg_match_all("/\b$flag=[\"|']*($reg)[\"|']*/i",$str,$attr); 
        
$ra = empty($attr[1]) ? array() : $attr[1];
        
$re = ($no==-|| strlen($no)==0) ? $ra : (isset($ra[$no]) ? $ra[$no] : ''); 
        return 
$re;
    }

    static function 
getLinks($html,$re=0){
        
preg_match_all("/<a(.*?)href=\"(.*?)\"(.*?)>(.*?)<\/a>/i",$html,$urls);
        
$re = array();
        foreach(
$urls[2] as $key=>$val) {
            
$re[$key] = array($val,$urls[4][$key]);
        }
        return 
$re;
    }

    
// 取一组tag<ul>资料
    // ($str,'a'), ($str,'li'), ($str,'<div class="logo">','</div>')
    
static function getTags($str,$tg1='ul',$tg2=''){
        if(empty(
$tg2)){
            
$tg2 "</$tg1>"$tg1 "<$tg1"
        }
        
$uls explode($tg1,$str); 
        
$res = array();
        foreach (
$uls as $i=>$row) {
            if(
$i==0) continue;
            
$tmp explode($tg2,$row);
            if(isset(
$tmp[1])){
                
$res[] = $tg1.$tmp[0].$tg2;
            }
        }
        return 
$res;
    }
    
// 去tag<img>
    
static function moveTag($str,$tag='img',$close=0){
        
$str preg_replace("/<{$tag}[^>]*>/is"''$str);
        if(!
$close) return $str;
        
$str str_replace("</$tag>"''$str);
        return 
$str;
    }
    
// 去<tag属性>
    
static function moveAttr($html){
        
$html preg_replace('/<(\w+)[^>]*>/i''<\1>'$html);
        return 
$html;
    }
    
}