<?php
class JqGridMod {
  var $ArrIn = array();
  var $_search = false; // Флаг поиска
  var $rows = 10; // Количество элементов на странице
  var $page = 1; // Номер старинцы запроса
  var $sidx = 'id'; // Имя поля по которому будет вестись сортировка
  var $sord = 'asc'; // Направление сортировки
  var $filters = ''; // Фильтры для поиска
  var $searchField = ''; // Фильтр по одному полю (имя)
  var $searchString = ''; // Фильтр по одному полю (значение)
  var $searchOper = ''; // Фильтр по одному полю (операция)
  var $searchSql = ''; // Поисковой запрос
  var $limit = '';
  var $order = '';
  var $TotalPages = 0;
  
  function __construct() {}
  
  function SetArrayIn($values = array()){
    if (true === isset($values['_search'])) {
      $this->_search = (bool)$values['_search'];
    } // Флаг поиска
    if (true === isset($values['rows'])) {
      $this->rows = (int)$values['rows'];
    } // Количество элементов на странице
    if (true === isset($values['page'])) {
      $this->page = (int)$values['page'];
    } // Номер старинцы запроса
    if (true === isset($values['sidx'])) {
      $this->sidx = addslashes($values['sidx']);
    } // Имя поля по которому будет вестись сортировка
    if (true === isset($values['sord'])) {
      $this->sord = addslashes($values['sord']);
    } // Направление сортировки

    if($this->_search){
      if (true === isset($values['filters'])) {
        $this->filters = $values['filters'];
      }// Фильтры для поиска
      if (true === isset($values['searchField'])) {
        $this->searchField = $values['searchField'];
      } // Фильтр по одному полю (имя)
      if (true === isset($values['searchOper'])) {
        $this->searchOper = $values['searchOper'];
      } // Фильтр по одному полю (операция)
      if (true === isset($values['searchString'])) {
        $this->searchString = $values['searchString'];
      } // Фильтр по одному полю (значение)
    }
  }
  
  function GetPage(){
    return $this->page;
  }

  function SetLimit(){
    $pageStart = ($this->page-1) * $this->rows;
    $this->limit = $pageStart .', '. $this->rows;
  }
  
  function GetLimit(){
    $this->SetLimit();
    return $this->limit;
  }
  
  function SetOrder(){
    $this->order = $this->sidx .' '. $this->sord;
  }
  
  function GetOrder(){
    $this->SetOrder();
    return $this->order;
  }
  
  function SetTotalPages($count){
    if($count > 0) {
      $this->TotalPages = ceil($count/$this->rows);
    } 
    else {
      $this->TotalPages = 0;
    }
  }
  
  function GetTotalPages($count){
    $this->SetTotalPages($count);
    return $this->TotalPages;
  }
  
  function generateSearchStringFromSearchField(){
    $where = '';
    if (true === isset($this->searchField) && true === isset($this->searchOper) && true === isset($this->searchString)) {
        $Obj['data'] = $this->searchString;
        $Obj['field'] = $this->searchField;
      if(preg_match("/^\d{2}.\d{2}.\d{4}$/",$Obj['data']) == 1){
        $Obj['data'] = SiteLibs::ParceTextDateElement($Obj['data']);   
        $Obj['data'] = addslashes($Obj['data']['Y'] ."-". $Obj['data']['M'] ."-". $Obj['data']['d']);
        $Obj['op'] = 'bw';
      } else {
        $Obj['op'] = $this->searchOper;
      }
      $Obj = (object)$Obj;
      $where = $this->searchField . $this->generateFromSearchOper($Obj);
    }
    return $where;
  }
  
  function generateSearchStringFromFilter(){
		$where = '';
		if($this->filters){
			$filters = json_decode($this->filters);
			$where .= self::generateSearchStringFromObj($filters);
		}   
		return $where;
	}
  
  function generateSearchStringFromObj($filters){
		$where = '';
		
		// Генерация условий группы фильтров
		foreach($filters->rules as $index => $rule){
      if(preg_match("/^\d{2}.\d{2}.\d{4}$/",$rule->data) == 0){
        $rule->data = addslashes($rule->data);
      }
      else{
        $rule->data = SiteLibs::ParceTextDateElement($rule->data);
        $rule->data = addslashes($rule->data['Y'] ."-". $rule->data['M'] ."-". $rule->data['d']);
      }
//			$where .= "`".preg_replace('/-|\'|\"/', '', $rule->field)."`";
			$where .= preg_replace('/-|\'|\"/', '', $rule->field);
			$where .= $this->generateFromSearchOper($rule);
				
			// Добавить логику соединения, если это не последние условие
			if(count($filters->rules) != ($index + 1)){
				$where .= " ".addslashes($filters->groupOp)." ";
      }
		}
		
		// Генерация условий подгруппы фильтров
		$isSubGroup = false;	
		if(isset($filters->groups))
			foreach($filters->groups as $groupFilters){
				$groupWhere = self::generateSearchStringFromObj($groupFilters);	
				// Если подгруппа фильтров содержит усовия, то добавить их
				if($groupWhere){
					// Добавить логику соединения, если условия подгруппы фильтров добаяляются после условий фильтров этой группы
					// или после условий других подгрупп фильтров
					if(count($filters->rules) or $isSubGroup) $where .= " ".addslashes($filters->groupOp)." ";
					$where .= $groupWhere;
					$isSubGroup = true; // Флаг, определяющий, что было хоть одно условие подгрупп фильтров	
				}
			}
		
		if($where)
			return '('.$where.')';
			
		return ''; // Условий нет
	}
  
  function generateFromSearchOper($Obj){
    $where = $Obj->searchField.'';
    switch($Obj->op){
      case 'eq': $where .= " = '".$Obj->data."'"; break;
      case 'ne': $where .= " != '".$Obj->data."'"; break;
      case 'bw': $where .= " LIKE '".$Obj->data."%'"; break;
      case 'bn': $where .= " NOT LIKE '".$Obj->data."%'"; break;
      case 'ew': $where .= " LIKE '%".$Obj->data."'"; break;
      case 'en': $where .= " NOT LIKE '%".$Obj->data."'"; break;
      case 'cn': $where .= " LIKE '%".$Obj->data."%'"; break;
      case 'nc': $where .= " NOT LIKE '%".$Obj->data."%'"; break;
      case 'nu': $where .= " IS NULL"; break;
      case 'nn': $where .= " IS NOT NULL"; break;
      case 'in': $where .= " IN ('".str_replace(",", "','", $Obj->data)."')"; break;
      case 'ni': $where .= " NOT IN ('".str_replace(",", "','", $Obj->data)."')"; break;
      case 'cnof': $where .= " LIKE '%".str_replace(" ", "%' AND " . $Obj->field . " LIKE '%", $Obj->data)."%'"; break;
    }
    return $where;
  }
  
}
?>