<?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])>0 ? $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($xStr, 0, $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==-1 || 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;
    }
    
}