Файл: lib/panel.control.lib.php
Строк: 1593
<?php
 /** Модуль управления панелью оптимизатора
 * @author [Eugene]
 * @copyright 2011
 * @url http://forwebm.net
 */
 if (!@defined('W_ENGINED_L')) exit('Can`t access to this file data!');
 //-------------------------------------------------------------------------------------
 require_once W_LIBPATH.'/confi/panel.conf.php';
 //-------------------------------------------------------------------------------------
 /** объект результатов элемента */
 class w_panelresultvalues extends w_defext {
  /** таблица для хранения истории проверок панели оптимизатора
  *   Может принимать значения идентичных таблиц.
  *   Таблица `phistlist` - альтернативная и предназначена для отдельного использования истории,
  *   если необходимо использовать историю панели совместно с историей проверок в инструменте 
  *   анализа сайта - необходимо указать таблицу `chhistory`    
  */    
  const TABLE_HISTORY = 'phistlist';
      
  private $last_temp = array();
  private $now_temp = array();    
  protected
   $control,
   $result_last,
   $result_now,
   $url,
   $url_obj;  
  
  function __construct(w_Control_obj $control, $result_last, $result_now, $url) {
   parent::__construct();
   $this->control = $control;  
   $this->result_last = $result_last;
   $this->result_now = $result_now;
   $this->url = $url;
   $this->url_obj = false;       
  }//__construct
  
  /** инициализация последних проверок по URL с загрузкой из истории */
  static function LoadAndCreate(w_Control_obj $control, $url, $specifyparam=false) {
   if (!$url = $control->strtolower($control->CorrectSymplyString($url))) { return false; }
   //get all by url
   if (!$specifyparam) {        
    $list = $control->db->mPost(
     "select iditem, datecreate, valuesid from {$control->tables_list[self::TABLE_HISTORY]} where ".
     "urlident='$url' order by datecreate DESC limit 2"
    );
   } else {
    //short days by param check
    $specifyparam = $control->CorrectSymplyString($specifyparam);    
    $list = $control->db->mPost(
     "select iditem, datecreate, valuesid from {$control->tables_list[self::TABLE_HISTORY]} where ".
     "urlident='$url' and LOCATE('[$specifyparam]',valuesid)<>0 order by datecreate DESC limit 2"
    );    
   } 
   $row1 = $control->db->GetLineArray($list);
   $row2 = (!$row1) ? false : $control->db->GetLineArray($list);
   return new w_panelresultvalues($control, (!$row2) ? false : $row2, (!$row1) ? false : $row1, $url);       
  }//LoadAndCreate
  
  function GetURL() { return $this->url; }
  function GetValueData($islast=false, $default='') { return $this->GetResultElement('valuesid', $islast, $default); }
  function GetValueDate($islast=false, $default='') { return $this->GetResultElement('datecreate', $islast, $default); }
  
  function GetResultElement($name, $islast=false, $default='') {
   $data = ($islast) ? $this->result_last : $this->result_now;
   return (!$name) ? $data : (($data) ? $data[$name] : $default);
  }//GetResultElement  
  
  /** значение по идентификатору */
  protected function ReadValue($identifier, $islast=false) {
   if (!$identifier) { return false; }
   $exists = ($islast) ? isset($this->last_temp[$identifier]) : isset($this->now_temp[$identifier]);
   $temp_value = ($exists) ? (($islast) ? $this->last_temp[$identifier] : $this->now_temp[$identifier]) : null;
   if ($temp_value !== null) { return $temp_value; }   
   $temp_value = $this->control->ReadOption($identifier, $this->GetValueData($islast));  
   return ($islast) ? ($this->last_temp[$identifier] = $temp_value) : ($this->now_temp[$identifier] = $temp_value);     
  }//ReadValue
  
  /**  создание нового значения */
  protected function CreateNewValue($identifier, $value) {
   $data = '';
   if ($value === false) { $value = ''; }
   $data = $this->control->WriteOption($identifier, $value, $data);
   if (!$data) { return false; }
   $this->result_now = array(
    'datecreate' => $this->GetThisDate(),
    'urlident'   => $this->url,
    'valuesid'   => $data   
   );
   $this->control->db->INSERTAction(self::TABLE_HISTORY, $this->result_now, true);
   if ($this->now_temp) { $this->now_temp = array(); }
   return true;       
  }//CreateNewValue
  
  protected function _CheckForCanUpdate($identifier, $onlyifnot=true) {            
   if (!$this->result_now) { return true; } elseif ($this->GetValueDate() != $this->GetThisDate()) {
    $this->result_last = $this->result_now;
    $this->last_temp = $this->now_temp;
    $this->result_now = false;
    $this->now_temp = array();
    return true;    
   }   
   return ($onlyifnot && $this->ReadValue($identifier)) ? false : true;
  }//_CheckForCanUpdate
  
  /** проверка доступности обновления данных */
  function CheckForCanUpdate($identifier, $onlyifnot=true, $quickcheck=true) {
   if (!$identifier) { return false; } 
   if ($quickcheck) { return $this->_CheckForCanUpdate($identifier, $onlyifnot); }     
   //check current date record 
   $result = $this->control->db->GetLineArray($this->control->db->mPost(
    "select iditem, datecreate, valuesid from {$this->control->tables_list[self::TABLE_HISTORY]} where ".
    "datecreate='".$this->GetThisDate()."' and urlident='{$this->url}' limit 1"
   ));
   if ($result) {
       if ($result['datecreate'] != $this->GetValueDate()) {
     $this->result_last = $this->result_now;
     $this->last_temp = $this->now_temp;
    }    
    $this->result_now = $result;
    $this->now_temp = array();    
   }      
   return $this->_CheckForCanUpdate($identifier, $onlyifnot);       
  }//CheckForCanUpdate   
  
  /** обновитьдобавить значение
  * @return false or 0 - not need update   
  */
  function UpdateValue($identifier, $newvalue, $onlyifnot=true) {      
   if (!$this->CheckForCanUpdate($identifier, $onlyifnot, false)) { return 0; }       
   if (!$this->result_now) { return $this->CreateNewValue($identifier, $newvalue); }  
   $value = $this->ReadValue($identifier);   
   if ($value !== false && $value == $newvalue) { return 0; }
   $data = $this->control->WriteOption($identifier, $newvalue, $this->result_now['valuesid']);
   if ($data === false) { return 0; }
   $this->control->db->UPDATEAction(
    self::TABLE_HISTORY, array('valuesid' => $data), "iditem='{$this->result_now['iditem']}'", "1", true
   );
   //restore temp info
   $this->result_now['valuesid'] = $data;
   if ($this->now_temp) { $this->now_temp = array(); }
   return true;       
  }//UpdateValue
  
  /** установка объекта url */
  function SetURLObj($obj) { $this->url_obj = $obj; }
  
  protected function GetCorrectDate($date, $notnow=false) {
   if (!$date) { $date = ($notnow) ? false : $this->GetThisDate(); } elseif ($this->strpos($date, ':') !== false) {
    $date2 = $date;
    $date  = $this->StrFetch($date2, " ");
    if (!$date) { $date = ($notnow) ? false : $this->GetThisDate(); }
   }
   return $date;    
  }//GetCorrectDate
  
  protected function CheckCorrectDate($date) { 
   return @preg_match("/d{4}-d{2}-d{2}/", $this->GetCorrectDate($date, true));
  }//CheckCorrectDate
  
  /** текущее значение идентификатора */
  function GetCurrentValue($identifier, $paramdata, $named='value') {
   if (isset($this->now_temp[$identifier.'_full'])) { 
    return (!$named) ? $this->now_temp[$identifier.'_full'] : ((isset($this->now_temp[$identifier.'_full'][$named])) ? 
    $this->now_temp[$identifier.'_full'][$named] : false);    
   }   
   $Lvalue = false;
   switch ($paramdata['type']) {
    //string data
    case '1':    
     switch ($identifier) {
      //date update
      case 'dateupdated':
       $value = $this->GetValueDate(false, false);
       if ($value && $paramdata['showdiffdays']) { $Lvalue = $this->GetThisDate(); /*$this->GetValueDate(true, false);*/ }       
      break;
      //date expire
      case 'id_domain_expire':
       $value  = $this->ReadValue($identifier);
       //get last value, if current not exists
       if ($value === false && $this->ReadValue($identifier, true) !== false) { 
           $value = $this->ReadValue($identifier, true);
       }
       if ($value) {
        if ($paramdata['showdiffdays']) { $Lvalue = $this->GetThisDate(); }
       } //elseif ($value !== false) { $value = 'n/a'; }
      break;          
      //string values
      default: 
       $value = $this->ReadValue($identifier);
       //get last value, if current not exists
       if ($value === false && $this->ReadValue($identifier, true) !== false) { 
           $value = $this->ReadValue($identifier, true);
       }    
      break;
     }
     //set if empty
     if ($value !== false && isset($paramdata['ifemptydata']) && $value == '') {
      $value = $paramdata['ifemptydata'];
      //reset lvalue
      if ($Lvalue) { $Lvalue = false; }          
     }    
    break;
    //image data
    case '2':
     $value = ($this->url_obj) ? $this->url_obj->ReplaceCorrect($paramdata['imagefile']) : $paramdata['imagefile'];
    break;
    //control data
    case '3': return ($named == 'value') ? 1 : 0;    
    //ather datas
    default:
     $value  = $this->ReadValue($identifier);     
     $Lvalue = (isset($paramdata['nodisplaydiff']) && $paramdata['nodisplaydiff']) ? false : $this->ReadValue($identifier, true);
     //replace values, if last exists and current don't exists
     if ($Lvalue !== false && $value === false) {
      $value  = $Lvalue;
      $Lvalue = false;     
     }
    break;
   }   
   //check value   
   if ($value === false) { return false; }
   //combine
   $result = array(
    'value'    => $value,
    'link'     => '',
    'diff'     => false,
    'diffreal' => false
   );
   //get link to hand view
   if ($paramdata['linktoview']) {
    if (@defined($paramdata['linktoview'])) { $result['link'] = @constant($paramdata['linktoview']); } else {
     $result['link'] = $paramdata['linktoview'];
    }
    if ($result['link']) { $result['link'] = @str_replace('[MY_HOST]', W_HOSTMYSITE, $result['link']); }    
   }
   if ($this->url_obj) { $result['link'] = $this->url_obj->ReplaceCorrect($result['link']); }
   /* get difference value */
   if ($Lvalue !== false) {
    //string data
    if ($paramdata['type'] == '1') {
     switch ($identifier) {
      //date update
      case 'dateupdated':
       if ($this->CheckCorrectDate($value) && $this->CheckCorrectDate($Lvalue)) {
        $result['diff'] = $this->control->GetDateDiff($Lvalue, $value);
       }       
      break;
      //date expire
      case 'id_domain_expire':
       if ($this->CheckCorrectDate($value)) {
        $result['diff'] = $this->control->GetDateDiff($Lvalue, $value);        
       }       
      break;
     }    
    }
    //int values
    elseif ($value != $Lvalue && @is_numeric($value) && @is_numeric($Lvalue)) {
     $result['diff'] = $value - $Lvalue;     
    }        
   }
   $result['diffreal'] = $result['diff'];   
   //correct bumeric values
   if ($paramdata['type'] == '0' && $this->url_obj) {
    //current
    if ($result['value'] !== false) { $result['value'] = $this->url_obj->format_number($result['value']); }
    //diff 
    if ($result['diffreal'] !== false) { $result['diffreal'] = $this->url_obj->format_number($result['diffreal']); }
   }    
   
   //correct value view
   if (isset($paramdata['left-t'])) $result['value'] = $paramdata['left-t'].$result['value'];
   if (isset($paramdata['right-t'])) $result['value'] .= $paramdata['right-t'];  
   
   //save and return
   $this->now_temp[$identifier.'_full'] = $result;
   return (!$named) ? $result : ((isset($result[$named])) ? $result[$named] : false);
  }//GetCurrentValue     
    
 }//w_panelresultvalues 
 //------------------------------------------------------------------------------------- 
 /** объект управления */
 class w_panelcontrolobjid extends w_defext {
  /* параметры по умолчанию */     
  const W_DEFAULT_PARAMS = '[UPDATEONLYIFNOT]1[/UPDATEONLYIFNOT]';
  /* кол-во сайтов максимально для экспорта (0 - all) */
  const W_EXPORT_URLS_COUNTMAX = 40; 
  /* разделитель .csv файла экспорта */
  const W_CSV_DELIMITER = ';';      
  protected 
   $control,
   $result,
   /* параметры панели:
      
      LOCKED - причина запрета доступа к панели!
      
      
      NOEXISTSURL  - если 1 - в панель будет возможным добавлять несуществующие сайты (default - 0)
      COUNTONGRAPH - кол-во дат на графике, по умолчанию - 0, все.
      NODISPLAYSELECTPARAM - если 1 - окно выбора параметров для обновления не будет отображаться 
                             (обновляться будут все параметры), иначе будет выдан запрос на 
                             желаемые параметры для обновлеия (default - 0)
      NODISPLAYNOTNEEDUPDATEDLOG - 1 - в лог не будут записываться данные, если обновление для данного параметра не требуется
                            (default - 0)
      
      UPDATEONLYIFNOT - если 1 - значения будут обновляться при доступности обновляния только если 
                        значение пустое. (default - 1)
                        
      YXMLLOGIN - пусто или логин для Яндекс.XML
      YXMLKEY - пусто или ключ для Яндекс.XML
      
      CANADDEXISTSPARAM - разрешить  нет добавление параметра повторно
      
   
   */
   $params,
   $temp_params,
   $temp_global_params,
   $run_params; 
   
  /* список доступных параметров для анализа в панели оптимизатора */ 
  public static $paramslistforuse = array();    
  /* параметры, которые обновлять не следует */
  public static $paramnoupdated = '[url][dateupdated][controlpanel]';
  /* параметры, которые не обновлять никогда */
  public static $paramnoupdatedever = '[url][controlpanel]';
  /* не экспортировать следующие типы параметров */
  public static $noexportfollowtypes = array('2', '3');
  
  /* доступные для загрузки идентификаторы (активируются как настройки параметра) */
  public static $opt_can_be_saved = '[colorminus][colorplus][showdiffdays][color][bgcolor][width][nodisplaydiff][colorno][coloryes][returnasstring][canwrap][swithifdayslost][yxmllogin][yxmlkey][nouseyandexxml][align]';
  
  /** ошибка доступа к панели */
  var $error = '';
  /** длина коротких имен */
  var $shortnamecount = 30;
  /** панель открыта первый раз */
  var $panelisnewnowtouse = true;
  /** временный объект обработки строки */
  var $line_obj = false;
  /** врменный список параметров идентификации */
  var $tempcolorlisten = false;
  var $tempcolorlisten_save = false;
  /** флаг отображения панели */
  var $paneldisplayed = false;
  /* управление пользователем, его панелью */
  var $manageID = false;
  var $manageIDinfo = false; 
  var $manageRealID = false;
  var $manageRealName = false;
  
  function __construct(w_Control_obj $control) {
   global $_SEOPANELCONFIGUREBLOCK;    
   parent::__construct();
   $this->run_params = $_SEOPANELCONFIGUREBLOCK;      
   $this->control = $control;
   $this->params = '';
   $this->manageID = ($this->control->isadminstatus && $_GET['manageuser']) ? 
   $this->CorrectSymplyString($_GET['manageuser']) : false; 
   if ($this->manageID) {
    $this->manageIDinfo = $this->control->GetUserInfo($this->manageID, true);    
   }    
   $this->manageRealID = ($this->manageIDinfo) ? $this->manageID : $this->control->userdata['iduser'];
   $this->manageRealName = ($this->manageIDinfo) ? $this->manageIDinfo['username'] : $this->control->userdata['username'];
   $this->result = array();
   $this->temp_params = array(); 
   $this->temp_global_params = array();
   self::$paramslistforuse = (isset($this->run_params['list'])) ? $this->run_params['list'] : array();
   $this->shortnamecount = $this->run_params['shortsectionnamecount'];
   if ($this->shortnamecount < 10) { $this->shortnamecount = 10; }   
  }//__construct
  
  function GetDifferenceNameShort() { return $this->shortnamecount - 3; }
  
  function RestoreTempIdents($issave=false) { 
   if ($issave) { $this->tempcolorlisten_save = array(); } else {
    $this->tempcolorlisten = array(); 
   }
  }//RestoreTempIdents
  
  function AddTempIdents($ident, $subname=false, $issave=false) {
   $arr = ($issave) ? $this->tempcolorlisten_save : $this->tempcolorlisten;
   if (!@is_array($arr)) { $this->RestoreTempIdents($issave); }
   if ($issave) {
    $this->tempcolorlisten_save[] = $ident.(($subname) ? ('_'.$subname) : '');
   } else {
    $this->tempcolorlisten[] = $ident.(($subname) ? ('_'.$subname) : '');
   } 
  }//AddTempIdents
  
  /** получение информации о секции */
  function GetSectionInfo($name) {
   global $section_info;    
   return (isset($section_info[$name])) ? $section_info[$name] : '';       
  }//GetSectionInfo
  
  /** установка информации о секции
  * @name - string идентификатор информации о секции
  * @value - string значение
  */
  function SetSectionInfo($name, $value) {
   global $section_info;
   //add, if empty
   //if (!isset($section_info[$name])) { return $section_info[$name] = $value; }
   //check no exists   
   //if (!@is_array($value)) { return false; }
   //$data = $section_info[$name];   
   //for ($i=0; $i<=@count($value)-1; $i++) {
    //if (@in_array($value[$i], $data)) { 
     //unset($value[$i]);
    //}    
   //}
   //update or add   
   $section_info[$name] = $value;       
  }//SetSectionInfo
  
  /** добавление информации о секции */
  function AddSectionInfoNew($name, $value) {
   global $section_info;
   if (isset($section_info[$name])) { return $section_info[$name][] = $value; }    
   $section_info[$name] = array($value);
   return $value;       
  }//AddSectionInfoNew   
  
  /** методы быстрой установки информации о секции */
  function SetSection_stitle($stringident) { $this->SetSectionInfo('stitle', $this->GetText($stringident)); }
  function SetSection_file($filename) { $this->SetSectionInfo('file', $filename); }
  function SetSection_title($stringident) {     
   $this->SetSectionInfo('title', $this->GetText($stringident).' - '.$this->GetSectionInfo('title')); 
  }//SetSection_title  
  
  /** получение пути всего */
  function GetAllSectionWay() {
   global $section_way;
   return $section_way;    
  }//GetAllSectionWay
  
  /** добавление пути секции
  * @stringident - идентификатор строкового ресурса текущего языка
  * @path - пусть от /panel/
  */
  function AddSectionWay($stringident, $path='') {
   global $section_way;
   return $section_way[] = array(
    'name' => $this->control->GetText($stringident),
    'path' => W_SITEPATH.'panel/'.$path    
   );       
  }//AddSectionWay
  
  /** экранирование метода вывода текста по ресурсам */
  function GetText($name, $list=false, $def=false) { return $this->control->GetText($name, $list, $def); }
    
  /** установка ошибки, возврат false */
  function SetError($str) { $this->error = $str; return false; }
  
  /** запрос по ajax */
  function IsAjax() { return @defined('W_IS_AJAX_MODE_RUN'); }
  
  /** возвращает параметр из массива $this->result
  *   В качестве пути по массиву указывается ключ с разделителем,
  *   пример:
  *   GetResult('item')
  *   или
  *   GetResult('item.subitem')
  *   или 
  *   GetResult('item.subitem.subitem')
  *   и т.д. В качестве вложения используется точка в имени ключа результата        
  */
  function GetResult($name='', $subname='', $data=false) {
   $data = ($data !== false) ? $data : $this->result; 
   if (!$data) { return false; }    
   if (!$name) { return $data; }
   if ($subname) { $name .= '.'.$subname; }    
   $s   = $name;
   $s1  = $this->StrFetch($s, '.');
   $val = false;
   while ($s || $s1) {
       if (($val === false && !isset($data[$s1])) || ($val !== false && !isset($val[$s1]))) { return false; }
    $val = ($val === false) ? $data[$s1] : $val[$s1];    
    $s1  = $this->StrFetch($s, '.');    
   }
   return $val; 
  }//GetResult
  
  /** инициализация js, css файлов */
  protected function InitJsFiles() {
   $this->SetSectionInfo('csslist', array(
    //'jquery.tablesorter.pager.css', 
    'panel/css.css', 'ui/jquery-ui-1.8.11.custom.css'
   ));   
   $this->SetSectionInfo('jslist', array(
    //'jquery.tablesorter.min.js', 'jquery.tablesorter.pager.js', 
    'jquery.ui.custom.min.js'
   ));       
  }//InitJsFiles
  
  /** получение параметра панели */
  function GetPanelOption($name) { 
   if (isset($this->temp_params[$name])) { return $this->temp_params[$name]; }
   return $this->temp_params[$name] = $this->control->ReadOption($name, $this->params); 
  }//GetPanelOption
  
  /** запись параметра настройки панели */
  protected function WritePanelOption($name, $value) {
   if (!$value) { $value = '0'; }
   if (!$this->params) { $this->params = ''; } 
   $res = $this->control->WriteOption($name, $value, $this->params);
   if ($res !== false) { $this->params = $res; }        
   return $this->params;
  }//WritePanelOption
  
  /** сохранение параметров панели */
  protected function SavePanelOptions() {
   $this->control->db->UPDATEAction('poptionst', array(   
    'paramsdata' => $this->params    
   ), "userid='{$this->manageRealID}'", "1");       
  }//SavePanelOptions
  
  /** инициализация параметров */
  protected function PreloadParamsPanel() {
   $this->params = self::W_DEFAULT_PARAMS;
   if ($this->temp_params) { $this->temp_params = array(); }
   $this->panelisnewnowtouse = true;
   $list = $this->control->db->GetLineArray($this->control->db->mPost(
    "select paramsdata from {$this->control->tables_list['poptionst']} where ".
    "userid='{$this->manageRealID}' limit 1"
   ));
   if ($list) {
    $this->params = $list['paramsdata'];
    $this->panelisnewnowtouse = false;
   } else {
    $this->control->db->INSERTAction('poptionst', array(
     'userid'     => $this->manageRealID,
     'paramsdata' => $this->CorrectSymplyString(self::W_DEFAULT_PARAMS)
    ));    
   }       
  }//PreloadParamsPanel
  
  /** подготовка раздела к использованию */
  protected function PrepereToStartPanel() {
   $this->control->smarty->assign('PANEL_CONTROL', $this);
   if (!$this->control->IsOnline()) { return $this->SetError($this->GetText('younotonlineuser')); }
   //admin check
   if ($this->run_params['accessforadminonly'] && !$this->control->isadminstatus) { 
       return $this->SetError($this->GetText('accessdinedbyadmin')); 
   }
   //init params
   $this->PreloadParamsPanel();
   //check for blocked to use panel
   if ($error = $this->GetPanelOption('LOCKED')) {
    return $this->SetError($this->GetText('p_youlockedinpanel', array($error)));    
   }   
   //connect to js files   
   $this->InitJsFiles();
   return true;       
  }//PrepereToStartPanel
  
  /** создание списка разделов */
  protected function GenerateSectionsList() {
   $this->result['sections'] = array(
    'data' => array()
   );
   $result = $this->control->db->mPost(
    "select * from {$this->control->tables_list['psections']} where username='{$this->manageRealName}'".
    " order by shortident ASC"
   );
   $isselected = 0;
   while ($row = $this->control->db->GetLineArray($result)) {
       $row['urlcount'] = $this->GetCountURLSinSectionByID($row['iditem']);
    $this->result['sections']['data'][] = $row;
    if ($row['isactive']) { $isselected = $row['iditem']; }    
   }   
   $this->result['sections']['selected'] = $isselected;
   $this->result['sections']['allcount'] = $this->GetCountURLSinSectionByID(0);      
   return $this->result['sections'];    
  }//GenerateSectionsList 
  
  protected function AjaxError($str) { print 'error:'.$str; exit; }
  
  /** обработка ajax элементов */
  protected function ActionWithAjax() {
   //if (!$this->control->IsOnline()) { $this->AjaxError($this->GetText('younotonlineuser')); }
   if ($this->error) { $this->AjaxError($this->error); }
   switch ($_POST['action']) {
       
       /* добавление нового раздела */
       case '1':
        $_POST['data'] = $this->substr($this->CorrectSymplyString($_POST['data']), 0, 120);        
        if (!$_POST['data']) { $this->AjaxError($this->GetText('p_selectnewsection')); }
        //check exists
        $item = $this->control->db->GetLineArray($this->control->db->mPost(
      "select iditem from {$this->control->tables_list['psections']} where username='{$this->manageRealName}'".
      " and Lower(sectname)=Lower('{$_POST['data']}') limit 1"    
     ));
     if ($item) { $this->AjaxError($this->GetText('p_sectisexistsalr', array($_POST['data']))); }
        //create record
        if (!$this->control->db->INSERTAction('psections', array(
      'datecreate' => $this->GetThisDateTime(),
      'username'   => $this->manageRealName,
      'sectname'   => $_POST['data']          
     ))) { $this->AjaxError('Error write new section record!'); }
        //ok, finished
        $ident     = $this->control->db->InseredIndex();
        $shortname = ($this->strlen($_POST['data']) > $this->shortnamecount) ? 
     $this->substr($_POST['data'], 0, $this->shortnamecount - 3).'...' : $_POST['data'];
        print "{id:'$ident', name:'{$_POST['data']}', shortname:'$shortname'}";
       break;
       
    /* удаление раздела */
    case '2':
     $_POST['data'] = $this->CorrectSymplyString($_POST['data']);
     if (!$_POST['data']) { $this->AjaxError($this->GetText('p_selectnewsection')); }
     $this->control->db->delete($this->control->tables_list['psections'], 
      "iditem='{$_POST['data']}' and username='{$this->manageRealName}'", "1"
     );     
     print $_POST['data'];
    break;
    
    /* сортировка разделов */
    case '3':
     $_POST['data'] = $this->CorrectSymplyString($_POST['data']);        
        if (!$_POST['data']) { print '0'; exit; }
        $incerident = 0;
        $s = $this->StrFetch($_POST['data'], ',');
        while ($s || $_POST['data']) {
      $s = $this->CorrectSymplyString($s);
      $this->control->db->UPDATEAction('psections', array('shortident' => $incerident), "iditem='$s'", "1");      
      $incerident++;         
      $s = $this->StrFetch($_POST['data'], ',');        
     }
     print '1';
    break;
    
    /* изменение названия раздела */
    case '4':
     if (!$_POST['idsect'] = $this->CorrectSymplyString($_POST['idsect'])) { 
      $this->AjaxError($this->GetText('p_identsectnotfou')); 
     }
     //prepere
     if (!$_POST['data'] = $this->substr($this->CorrectSymplyString($_POST['data']), 0, 120)) {
      $this->AjaxError($this->GetText('p_selectnewsection'));    
     }        
        //ok, get then identifier
        $item = $this->control->db->GetLineArray($this->control->db->mPost(
      "select iditem, sectname from {$this->control->tables_list['psections']} ".
      "where iditem='{$_POST['idsect']}' and username='{$this->manageRealName}' limit 1"    
     ));
     if (!$item) { $this->AjaxError($this->GetText('p_identsectnotfou')); }
     //save check
        if ($item['sectname'] != $_POST['data']) {
         //ok, check exists this name
      $item2 = $this->control->db->GetLineArray($this->control->db->mPost(
       "select iditem from {$this->control->tables_list['psections']} ".
       "where iditem<>'{$item['iditem']}' and username='{$this->manageRealName}' and ".
       " Lower(sectname)=Lower('{$_POST['data']}') limit 1"    
      ));
      if ($item2) { $this->AjaxError($this->GetText('p_sectisexistsalr', array($_POST['data']))); }
      //write    
      $this->control->db->UPDATEAction('psections', array('sectname' => $_POST['data']), "iditem='{$item['iditem']}'", "1");
     }
     //combine
        $shortname = ($this->strlen($_POST['data']) > $this->shortnamecount) ? 
     $this->substr($_POST['data'], 0, $this->shortnamecount-3).'...' : $_POST['data'];
        $count = $this->GetCountURLSinSectionByID($item['iditem']);
        print "{id:'{$item['iditem']}', name:'{$_POST['data']}', shortname:'$shortname', countu:'$count'}";
    break;
    
    /* добавление нового сайта */
    case '5':     
     $url = new ss_HTTP_obj();
     if (!$url->SetURL($this->CorrectSymplyString($_POST['data']))) { return $this->AjaxError('Error in parse URL!'); }     
     //url is ok, check exists
     $res = $this->control->db->GetLineArray($this->control->db->mPost(
      "select iditem from {$this->control->tables_list['psitelist']} where userid='{$this->manageRealID}'".
      " and Lower(urlid)=Lower('{$url->url_host}') limit 1"
     ));
     if ($res) { $this->AjaxError($this->GetText('p_urlisexiststhis', array($url->url_host))); }
     //check for exists real, if enabled
     if (!$this->GetPanelOption('NOEXISTSURL') && !$url->RequestGET($url->url_host)) {     
      $this->AjaxError($url->res_error);
     }
     //ok, check section
     $_POST['sk'] = $this->CorrectSymplyString($_POST['sk']);
     $_POST['sk'] = (!@is_numeric($_POST['sk']) || !$_POST['sk']) ? 0 : $_POST['sk'];
     //ok, add new
     $urlinfo = array(
      'userid'     => $this->manageRealID,
      'urlid'      => $url->url_host,
      'sectionid'  => $_POST['sk'],
      'paramsdata' => '',
      'shortident' => $this->GetCountURLSinSectionByID(0) + 1
     );
     if (!$this->control->db->INSERTAction('psitelist', $urlinfo, true)) { 
      $this->AjaxError('Error in write new record data! [MySql error]'); 
     }
     $urlinfo['iditem'] = $this->control->db->InseredIndex();
     //get and combine url info. preload data     
     $html = $this->GenerateURLdataLineAsHtml($url, $urlinfo);
     if ($html === false) { $this->AjaxError('No url data found! [not valid html template]'); }
     print $html;    
    break;
    
    /* загрузка сайтов раздела */
    case '6':
     $_POST['data'] = $this->CorrectSymplyString($_POST['data']);
     if (!$_POST['data'] || !@is_numeric($_POST['data'])) { $_POST['data'] = 0; }
     //ok, next to listen     
     $res = '';
     $list = $this->control->db->mPost(
      "select * from {$this->control->tables_list['psitelist']} where userid='{$this->manageRealID}'".
      (($_POST['data']) ? " and sectionid='{$_POST['data']}'" : "")." order by shortident ASC"
     );
     //if no empty, get all
     if ($list) { 
      $url = new ss_HTTP_obj();    
      while ($row = $this->control->db->GetLineArray($list)) {
       if (!$url->SetURL($row['urlid'])) { continue; }
       //sum source
       if ($tdata = $this->GenerateURLdataLineAsHtml($url, $row)) {    $res .= $tdata; }        
      }
     } 
     if (!$_POST['nosave']) {
      //set current section as active
      $this->control->db->UPDATEAction('psections', array('isactive' => 0), 
       "username='{$this->manageRealName}' and iditem<>'{$_POST['data']}'"
      );
      $this->control->db->UPDATEAction('psections', array('isactive' => 1), 
       "iditem='{$_POST['data']}' and username='{$this->manageRealName}'", "1"
      );
     }
     //out 
     print $res;    
    break;
    
    /* удаление сайтов */
    case '7':
     $_POST['data'] = $this->CorrectSymplyString($_POST['data']);
     if (!$_POST['data']) { print ''; exit; }
     $result = '';
     $s = $this->StrFetch($_POST['data'], ',');
     while ($s || $_POST['data']) {
      $s = $this->CorrectSymplyString($s);
      if ($s) {
       $this->control->db->Delete(
        $this->control->tables_list['psitelist'], "iditem='$s' and userid='{$this->manageRealID}' limit 1"
       );
       $result .= (($result) ? ",$s" : $s);
      }    
      $s = $this->StrFetch($_POST['data'], ',');    
     } 
     print $result;
    break;
    
    /* перемещение сайтов по разделам */
    case '8':
     $_POST['data'] = $this->CorrectSymplyString($_POST['data']); if (!$_POST['data']) { print ''; exit; }
     $_POST['to']   = (!$_POST['to'] || !@is_numeric($_POST['to'])) ? 0 : $this->CorrectSymplyString($_POST['to']);
     $_POST['from'] = (!$_POST['from'] || !@is_numeric($_POST['from'])) ? 0 : $this->CorrectSymplyString($_POST['from']);
     $result = '';     
     $s = $this->StrFetch($_POST['data'], ',');
     while ($s || $_POST['data']) {
      $s = $this->CorrectSymplyString($s);
      if (@is_numeric($s)) {           
       //check for get data
       $res = $this->control->db->GetLineArray($this->control->db->mPost(
        "select iditem, sectionid from {$this->control->tables_list['psitelist']} where ".
        "iditem='$s' and userid='{$this->manageRealID}' and sectionid<>'{$_POST['to']}' limit 1"
       ));
       if ($res) {
        //update record info
        $this->control->db->UPDATEAction('psitelist', array('sectionid' => $_POST['to']), "iditem='{$res['iditem']}'", "1");
        //combine answer
        $result .= ($result) ? ';' : '';
        $result .= '{urlid: "'.$res['iditem'].'", fromsection: "'.
                   $res['sectionid'].'", tosection: "'.$_POST['to'].'", fromactive: "'.$_POST['from'].'"}'; 
       }    
      }
      $s = $this->StrFetch($_POST['data'], ',');
     }
     print $result;    
    break;
    
    /* сохранение позиции сайтов в разделе */
    case '9':     
     $_POST['data'] = $this->CorrectSymplyString($_POST['data']);        
     //$_POST['sk']   = $this->CorrectSymplyString($_POST['sk']);
        if (!$_POST['data']/* || $_POST['sk'] == '' || !@is_numeric($_POST['sk'])*/) { print ''; exit; }       
        $incerident = 0;
        $s = $this->StrFetch($_POST['data'], ',');
        while ($s || $_POST['data']) {
      $s = $this->CorrectSymplyString($s);
      $this->control->db->UPDATEAction('psitelist', array('shortident' => $incerident), "iditem='$s'", "1");      
      $incerident++;         
      $s = $this->StrFetch($_POST['data'], ',');        
     }
     print '';
    break;
    
    /* получение ссылки предпросмотра */
    case '10':
     if (!$_POST['data'] = $this->CorrectSymplyString($_POST['data'])) {
      $this->AjaxError('Error in get URL parameter!');    
     }
     $res = $this->control->db->GetLineArray($this->control->db->mPost(
      "select urlid from {$this->control->tables_list['psitelist']} where ".
      "iditem='{$_POST['data']}' and userid='{$this->manageRealID}' limit 1"
     ));
     if (!$res) { $this->AjaxError('URL not found!'); }
     
     $html = new ss_HTTP_obj();
     if (!$html->SetURL($res['urlid'])) { $this->AjaxError('Error in parse URL!'); }
     
     print $html->ReplaceCorrect(ss_BlockConstantValue::URL_ATHER_RESOLUTION);
    break;
    
    /* инициализация, обработка графика */
    case '11': $this->ActionHistoryURLElements($_POST['data']); break;
    
    /* обновление показателей  */
    case '12': $this->ActionUpdateParamElement(); break;
    
    /* получение параметров панели */
    case '13': print $this->control->smarty->fetch('seo-panel/panel_global_options.tpl'); break;
    
    /* сохранение параметров панели */
    case '14':          
     $ok = 
     $this->WritePanelOption('NOEXISTSURL', ($this->CheckPostValue('NOEXISTSURL')) ? 1 : 0) && 
     $this->WritePanelOption('NODISPLAYSELECTPARAM', ($this->CheckPostValue('NODISPLAYSELECTPARAM')) ? 1 : 0) &&
     $this->WritePanelOption('NODISPLAYNOTNEEDUPDATEDLOG', ($this->CheckPostValue('NODISPLAYNOTNEEDUPDATEDLOG')) ? 1 : 0) &&
     $this->WritePanelOption('COUNTONGRAPH', (!@is_numeric($_POST['COUNTONGRAPH'])) ? 0 : $_POST['COUNTONGRAPH']) &&
     
     $this->WritePanelOption('YXMLLOGIN', $this->CorrectSymplyString($_POST['YXMLLOGIN'])) &&     
     $this->WritePanelOption('YXMLKEY', $this->CorrectSymplyString($_POST['YXMLKEY'])) &&
     
     $this->WritePanelOption('CANADDEXISTSPARAM', ($this->CheckPostValue('CANADDEXISTSPARAM')) ? 1 : 0);
     
     if (!$ok) { $this->AjaxError('Error in save params'); }
     
     $this->SavePanelOptions();
    break;
    
    /* добавление нового параметра */
    case '15':
     $_POST['data'] = $this->CorrectSymplyString($_POST['data']);
     if (!$_POST['data'] || !isset(self::$paramslistforuse[$_POST['data']])) { $this->AjaxError('Unknow parameter ID'); }
     //check enabled
     if (self::$paramslistforuse[$_POST['data']]['disabled']) { $this->AjaxError($this->GetText('p_paramisdisabledn')); }
     //check to add, exists list
     if (!$this->GetPanelOption('CANADDEXISTSPARAM')) {
      $param = $this->control->db->GetLineArray($this->control->db->mPost(
       "select iditem from {$this->control->tables_list['pparamstb']} where userid='{$this->manageRealID}' and ".
       "paramid='{$_POST['data']}' limit 1"
      ));
      if ($param) { $this->AjaxError($this->GetText('paramisexistsalridyp', 
       array($this->GetText(self::$paramslistforuse[$_POST['data']]['name']))
       ));
      }
     }
     //add new
     if (!$this->control->db->INSERTAction('pparamstb', array(
      'datecreate' => $this->GetThisDate(),
      'userid'     => $this->manageRealID,
      'paramid'    => $_POST['data'],
      'paramsdata' => '',
      'shortident' => $this->control->GetCountInTable(
       'iditem', 'pparamstb', "where userid='{$this->manageRealID}'"
      ) + 1
     ), true)) { $this->AjaxError('Error in write new Param record [MySQL error]'); }
     print '2'; 
    break;
    
    /* получение списка параметров */
    case '16': 
     $this->PreloadParamsList();
     print $this->control->smarty->fetch('seo-panel/list_params_data.tpl'); 
    break;
    
    /* порядок параметров */
    case '17':
     $_POST['data'] = $this->CorrectSymplyString($_POST['data']);
        if (!$_POST['data']) { print ''; exit; }       
        $incerident = 0;
        $s = $this->StrFetch($_POST['data'], ',');
        while ($s || $_POST['data']) {
      $s = $this->CorrectSymplyString($s);
      $this->control->db->UPDATEAction('pparamstb', array(
       'shortident' => $incerident
      ), "iditem='$s' and userid='{$this->manageRealID}'", "1");      
      $incerident++;         
      $s = $this->StrFetch($_POST['data'], ',');        
     }
     print '';     
    break;
    
    /* удаление параметров */
    case '18':    
     $_POST['data'] = $this->CorrectSymplyString($_POST['data']);
        if (!$_POST['data']) { print ''; exit; }       
        $incerident = 0;
        $s = $this->StrFetch($_POST['data'], ',');
        while ($s || $_POST['data']) {
      $s = $this->CorrectSymplyString($s);
      $this->control->db->Delete(
       $this->control->tables_list['pparamstb'], "iditem='$s' and userid='{$this->manageRealID}'", "1"  
      );      
      $incerident++;         
      $s = $this->StrFetch($_POST['data'], ',');        
     }
     print ''; 
    break;
    
    /* получение настроек параметра */
    case '19':
     if (!$_POST['data'] = $this->CorrectSymplyString($_POST['data'])) { print ''; exit; }
     //get param
     $param = $this->GetAndLoadOneParamOptions($_POST['data']);
     if (!$param) {
      $this->AjaxError(($this->error) ? $this->error : 'Error in get parameter Info');    
     }
     //ok, action to get     
     $this->control->smarty->assign('val', $param);     
     print $this->control->smarty->fetch('seo-panel/param_options_element.tpl');     
    break;
    
    /* сохранение настроек параметра */
    case '20':
     if (!$_POST['dataid'] = $this->CorrectSymplyString($_POST['dataid'])) { $this->AjaxError('Unknow param ID'); } 
     //ok, get param
     $param = $this->GetAndLoadOneParamOptions($_POST['dataid']);
     if (!$param) {
      $this->AjaxError(($this->error) ? $this->error : 'Error in get parameter Info');    
     }     
     //ok, process to write
     foreach ($param['data'] as $name => &$value) {
      if (!$this->CanConfThisOpt($name)) { continue; }
      //ok, check for value
      if (isset($_POST[$name.'_elemwidth'])) { $value = $this->CorrectSymplyString($_POST[$name.'_elemwidth']); } 
      elseif (isset($_POST[$name.'_ch_sel_param'])) { $value = ($this->CheckPostValue($name.'_ch_sel_param')) ? 1 : 0; }
      elseif (isset($_POST[$name.'_elemcc'])) { $value = $this->CorrectSymplyString($_POST[$name.'_elemcc']); }    
     }
     //save values data
     if ($error = $this->WriteParamOptions($param)) { $this->AjaxError($error); }
     print '1';
    break;
    /* */     
    
    default: $this->AjaxError('Unknow action ID');
   }   
   exit;    
  }//ActionWithAjax
  
  /** сохранение настройки параметра */
  protected function WriteParamOptions($param) {
   if (!$param) { return 'Unknow param data!'; }
   $str = ''; 
   foreach ($param['data'] as $name => $value) {
       if (!$this->CanConfThisOpt($name)) { continue; }
       $data = $this->control->WriteOption($name, $value, $str);
       if ($data !== false) { $str = $data; }
   }
   if ($param['text'] != $str) {
    $this->control->db->UPDATEAction('pparamstb', array(
     'paramsdata' => $str     
    ), "iditem='{$param['id']}' and userid='{$this->manageRealID}'", "1", true);    
   } 
   return '';   
  }//WriteParamOptions 
  
  function CanConfThisOpt($ident) { return $ident && $this->strpos(self::$opt_can_be_saved, "[$ident]") !== false;  }
  
  protected function ReturnNil() { print ''; return false; }
  
  /** выполнение обновления элемента */
  protected function ActionUpdateParamElement() {
   if (!$_POST['url'] = $this->CorrectSymplyString($_POST['url'])) { $this->AjaxError('Incorrect URL ID'); }
   if (!$_POST['opt'] = $this->CorrectSymplyString($_POST['opt'])) { $this->AjaxError('Incorrect Param ID'); }  
   //get and load param info
   $settings = $this->GetAndLoadOneParamOptions($_POST['opt']);
   if (!$settings) {
    if ($this->error) { $this->AjaxError($this->error); } else { $this->AjaxError('Error in get parameter info!'); }
   }
   //check for disabled param
   if (isset($settings['data']['disabled']) && $settings['data']['disabled']) {
    $this->AjaxError('Param is disabled!');
   }
   //quick check for not need in update   
   $doupdate = false;   
   switch ($settings['data']['type']) {
    //string, numeric values
    case '0':
    case '1':
     //url param, never update     
     if ($settings['sid'] == 'url') { return $this->ReturnNil(); }
     //date update param, update in template
     elseif ($settings['sid'] == 'dateupdated') { break; }     
     //check for exists plugin id to execute
     if (!$settings['data']['pluginid']) { $this->AjaxError('Unknow Plugin ID to Exec param!'); }
     $doupdate = true;               
    break;    
    //images, update in template
    case '2': break;
    //control panel, never update
    case '3': return $this->ReturnNil();    
    //unknow param type
    default: $this->AjaxError('Unknow param type!');
   }        
   //param granted, get url by identifier
   $urlinfo = $this->control->db->GetLineArray($this->control->db->mPost(
    "select * from {$this->control->tables_list['psitelist']} where ".
    "iditem='{$_POST['url']}' and userid='{$this->manageRealID}' limit 1"
   ));
   if (!$urlinfo) { $this->AjaxError('URL not found!'); }   
   //init url by myself
   $html = new ss_HTTP_obj();
   if (!$html->SetURL($urlinfo['urlid'])) { $this->AjaxError('Error in parse URL!'); }
   //create and load update params info records   
   if (!$element = w_panelresultvalues::LoadAndCreate($this->control, $html->url_real_host)) {
    $this->AjaxError('Error in initialize update object!');        
   }
   $element->SetURLObj($html);    
   //update only if need this
   if ($doupdate) {        
    //check for can update element
    if (!$element->CheckForCanUpdate($settings['sid'], ($this->GetPanelOption('UPDATEONLYIFNOT')) ? true : false)) {
     print '1'; return true;
    }         
    //action to parse params requist     
    $sleep = (isset($settings['data']['sleep'])) ? $settings['data']['sleep'] : false;
    //sleep, if need
    if ($sleep) { @sleep($sleep); }
    //set global exec params
    $this->SetGlobalExecParams(false, $settings['data']);   
    //exec plugin
    $params = (isset($settings['data']['pluginparams']) && $settings['data']['pluginparams']) ? 
    $settings['data']['pluginparams'] : false;
    //run
    if (!$html->RunPluginEx($settings['data']['pluginid'], $error, $value, $params)) {
     $this->AjaxError(($error) ? $error : 'Error in Exec Param plugin!');    
    }
    //ok, get value
    $result = (!$settings['data']['pluginvaluepath']) ? $value : 
    $this->GetResult($settings['data']['pluginvaluepath'], '', ($value) ? $value : array());
    //no update empty values
    //if ($result === false) { return $this->AjaxError('Param result value is Null'); }    
    //ok, update
    if ($element->UpdateValue($settings['sid'], $result, ($this->GetPanelOption('UPDATEONLYIFNOT')) ? true : false) === 0) {
     print '1'; return true;    
    } 
   }    
   //object is loaded succesfully, set for template
   $this->line_obj = $element;
   $this->result['urllineinfo'] = $urlinfo;   
   $this->control->smarty->assign('val', $settings);   
   //get html line source   
   print $this->control->smarty->fetch('seo-panel/url_param_data.tpl');   
  }//ActionUpdateParamElement
  
  /** yandex xml */
  function GetYandexXML($plugin) {
   return (
    isset($this->temp_global_params['yxmllogin']) && isset($this->temp_global_params['yxmlkey']) && 
    $this->temp_global_params['yxmllogin'] && $this->temp_global_params['yxmlkey']    
   ) ? array(
    'username' => $this->temp_global_params['yxmllogin'],
    'key'      => $this->temp_global_params['yxmlkey']
   ) : false;       
  }//GetYandexXML
  
  /** источник данных яндекса */
  function GetYandexServerPath($plugin, $datasource_list) {
   return (!$this->temp_global_params['yandexserverpath']) ? false : $this->temp_global_params['yandexserverpath'];
  }//GetYandexServerPath
  
  /** установка глобальных параметров плагина */
  protected function SetGlobalExecParams($restore=false, $paramopt=false) {
   global $_SS_READ_YANDEX_XML_API_PROG_PL, $_SS_READ_SOURCE_DATA_TYPE_NUMBER_PL;
   //yandex XML
   if ($restore || ($paramopt && isset($paramopt['nouseyandexxml']) && $paramopt['nouseyandexxml'])) {
       $_SS_READ_YANDEX_XML_API_PROG_PL = false; 
   } else {
    //check for get from param specially
    if ($paramopt && $paramopt['yxmllogin'] && $paramopt['yxmlkey']) {
     $this->temp_global_params['yxmllogin'] = $paramopt['yxmllogin'];
     $this->temp_global_params['yxmlkey']   = $paramopt['yxmlkey'];    
    } else {
     //global 
     $this->temp_global_params['yxmllogin'] = $this->GetPanelOption('YXMLLOGIN');
     $this->temp_global_params['yxmlkey']   = $this->GetPanelOption('YXMLKEY');        
    }
    //check for admin xml data
    if (!$this->temp_global_params['yxmllogin'] && !$this->temp_global_params['yxmlkey'] &&
         $paramopt['adminxmllogin'] && $paramopt['adminxmlkey']
       ) {
      
      $this->temp_global_params['yxmllogin'] = $paramopt['adminxmllogin'];
      $this->temp_global_params['yxmlkey']   = $paramopt['adminxmlkey'];  
        
    }
    //set by default prog        
    $_SS_READ_YANDEX_XML_API_PROG_PL = array($this, 'GetYandexXML');    
   }
   //тип получения данных для Яндекса
   if ($restore || !$paramopt || !$paramopt['valuefromserv']) { 
       $_SS_READ_SOURCE_DATA_TYPE_NUMBER_PL = false; 
   } else {
    $this->temp_global_params['yandexserverpath'] = $paramopt['valuefromserv'];
    $_SS_READ_SOURCE_DATA_TYPE_NUMBER_PL = array($this, 'GetYandexServerPath');
   } 
  }//SetGlobalExecParams
  
  /** обработка запросов отображения графика истории сайта */
  protected function ActionHistoryURLElements($ident) {
   if (!$ident = $this->CorrectSymplyString($ident)) { $this->AjaxError('Error get URL ident!'); }
   //get url by identifier
   $res = $this->control->db->GetLineArray($this->control->db->mPost(
    "select urlid from {$this->control->tables_list['psitelist']} where ".
    "iditem='$ident' and userid='{$this->manageRealID}' limit 1"
   ));
   if (!$res) { $this->AjaxError('URL not found!'); }
   //ok, process
   $html = new ss_HTTP_obj();
   if (!$html->SetURL($res['urlid'])) { $this->AjaxError('Error in parse URL!'); }
   //check for loading params list
   if (!$this->PreloadParamsList()) { $this->AjaxError('No params found!'); }   
   //connect to history object module
   require_once W_SITEDIR.'/lib/p.history.lib.php';
   if (!$history = w_historyparamslisten::CreateFromURL($this->control, $html->url_real_host, w_panelresultvalues::TABLE_HISTORY)) { 
    unset($html);
    $this->AjaxError('Error in initialize history object!');        
   }
   $history->SetShowURL($html->url_host);
   unset($html);
   //ok, process elements
   $items = array();
   foreach ($this->GetResult('params') as $item) {
    if ($item['data']['type'] == 0) {
     $items[] = $item['sid'];         
    }    
   }   
   //check for not empty list of params
   if (!$items) { $this->AjaxError('No params found!'); }
   //action to get params list   
   if ($_POST['getparams']) {
    print $history->GenerateLineCharSettengsXML($items);
    return true;    
   }
   //action to get data CSV
   if ($_POST['getdata']) {
       $count = ($this->GetPanelOption('COUNTONGRAPH')) ? $this->GetPanelOption('COUNTONGRAPH') : 0;            
    print $history->GenerateLineChartDataCSV($items, $count);
    return true;
   }      
  }//ActionHistoryURLElements
  
  /** генерация строки 1 сайта */
  protected function GenerateURLdataLineAsHtml($url, $urlinfo) {
   $this->line_obj = false;        
   //check for create list params
   if (!$this->PreloadParamsList()) { return false; }
   //create and load url info   
   if (!$line_obj = w_panelresultvalues::LoadAndCreate($this->control, $url->url_real_host)) { return false; }
   $line_obj->SetURLObj($url);
   $this->line_obj = $line_obj;
   $this->result['urllineinfo'] = $urlinfo;
   //get html line source   
   $line = $this->control->smarty->fetch('seo-panel/url_line_data.tpl');
   //unset line data
   unset($line_obj);
   $this->line_obj = false; 
   return $line;
  }//GenerateURLdataLineAsHtml 
  
  /** кол-во сайтов в разделе */
  function GetCountURLSinSectionByID($sectid) {
   $sectid = $this->CorrectSymplyString($sectid);
   return $this->control->GetCountInTable('iditem', 'psitelist', 
    "where userid='{$this->manageRealID}'".((!$sectid) ? '' : " and sectionid='$sectid'")
   );       
  }//GetCountURLSinSectionByID
  
  /** создание списка параметров по умолчанию */
  protected function CreateDefaultParamsList() {       
   $params_list = array();    
   $this->control->db->Delete($this->control->tables_list['pparamstb'], "userid='{$this->manageRealID}'");
   //action
   $incerindex = 0;
   foreach (self::$paramslistforuse as $id => $data) {
       if ($data['disabled'] || !$data['default']) { continue; }
    $item = array(
     'id'   => false,
     'sid'  => $id,
     'data' => $data
    );
    //write record
    if (!$this->control->db->INSERTAction('pparamstb', array(
     'datecreate' => $this->GetThisDateTime(),
     'userid'     => $this->manageRealID,
     'paramid'    => $id,
     'paramsdata' => '',
     'shortident' => $incerindex     
    ))) { continue; }
    //ok, follow to add item
    $item['id'] = $this->control->db->InseredIndex();
    //parse name as long name, and date format get
    $item['data']['name'] = $this->CorrectSymplyString($this->GetText($data['name'], false, 'No name'));
    if ($item['data']['dateformat']) { 
     $item['data']['dateformat'] = $this->GetText($item['data']['dateformat'], false, ''); 
    }
    $params_list[] = $item;    
    $incerindex++;
   }  
   return $params_list;     
  }//CreateDefaultParamsList
  
  /** загрузка параметров плагина */
  protected function LoadParamOptions($paramidentifier, $optionsdata) {   
   if (!isset(self::$paramslistforuse[$paramidentifier]) || 
      (isset(self::$paramslistforuse[$paramidentifier]['disabled']) && 
       self::$paramslistforuse[$paramidentifier]['disabled'])) { return false;
   }
   if (!$optionsdata) { return true; }
   foreach (self::$paramslistforuse[$paramidentifier] as $name => &$value) {
    if ($this->strpos(self::$opt_can_be_saved, "[$name]") === false) { continue; }
    $val = $this->control->ReadOption($name, $optionsdata);
    if ($val !== false) { $value = $val; }    
   }
   return true;       
  }//LoadParamOptions
  
  /** загрузка параметров панели */
  protected function LoadParamsListWorkSpace() {
   $params_list = array();
   $list = $this->control->db->mPost("select iditem, paramid, paramsdata from ".
    "{$this->control->tables_list['pparamstb']} where userid='{$this->manageRealID}' ".
    "order by shortident ASC"
   );
   while ($row = $this->control->db->GetLineArray($list)) {
    if (!$this->LoadParamOptions($row['paramid'], $row['paramsdata'])) { continue; }
    $item = array(
     'id'   => $row['iditem'],
     'sid'  => $row['paramid'],
     'data' => self::$paramslistforuse[$row['paramid']]
    );
    $item['data']['name'] = $this->CorrectSymplyString($this->GetText($item['data']['name'], false, 'No name'));
    if ($item['data']['dateformat']) { 
     $item['data']['dateformat'] = $this->GetText($item['data']['dateformat'], false, ''); 
    }
    $params_list[] = $item;    
   }
   return $params_list;    
  }//LoadParamsListWorkSpace
  
  /** загрузка единичного параметра панели */
  protected function GetAndLoadOneParamOptions($paramid) {
   $list = $this->control->db->GetLineArray($this->control->db->mPost("select iditem, paramid, paramsdata from ".
    "{$this->control->tables_list['pparamstb']} where iditem='$paramid' and userid='{$this->manageRealID}' limit 1"
   ));
   if (!$list) { return $this->SetError('Parameter not found or disabled!'); }
   //loading param options
   $this->LoadParamOptions($list['paramid'], $list['paramsdata']);  
   $data = self::$paramslistforuse[$list['paramid']]; 
   if ($data) {
    $data['name'] = $this->CorrectSymplyString($this->GetText($data['name'], false, 'No name'));
    if ($data['dateformat']) { $data['dateformat'] = $this->GetText($data['dateformat'], false, ''); }  
   }
   //return elements as options
   return array(
    'id'   => $list['iditem'],
    'sid'  => $list['paramid'],
    'data' => $data,
    'text' => (!$list) ? '' : $list['paramsdata']
   );    
  }//GetAndLoadOneParamOptions 
  
  /** инициализация списка параметров */
  protected function PreloadParamsList() {
   if (!isset($this->result['params'])) {
    $this->result['params'] = ($this->panelisnewnowtouse) ? $this->CreateDefaultParamsList() : 
    $this->LoadParamsListWorkSpace();
   }
   return $this->result['params'];    
  }//PreloadParamsList 
  
  /** export current data as natural values */
  protected function ActionToExportDataValues() {
   $res = '';
   if (!$_GET['data'] = $this->CorrectSymplyString($_GET['data'])) { return $this->SetError('No Data found!'); }
   $incer = 1;
   $url = new ss_HTTP_obj();
   $str = $this->StrFetch($_GET['data'], ',');
   while ($_GET['data'] || $str) {
       if (self::W_EXPORT_URLS_COUNTMAX > 0) {       
        if ($incer > self::W_EXPORT_URLS_COUNTMAX) { break; }
        $incer++;
    }
    if ($str) {
     $list = $this->control->db->GetLineArray($this->control->db->mPost(
      "select * from {$this->control->tables_list['psitelist']} where userid='{$this->manageRealID}'".
      " and iditem='$str' limit 1"
     ));     
     //ok, load site info asline data
     $line = '';
     if ($list && $url->SetURL($list['urlid'])) {
      //load or check params list
      if (!$this->PreloadParamsList()) { return false; }
      //create and load url info   
      if ($line_obj = w_panelresultvalues::LoadAndCreate($this->control, $url->url_real_host)) { 
       $line_obj->SetURLObj($url);
       $header = '';
       foreach ($this->GetResult('params') as $param) {
        //combine header line, if first time action
        $canexport = !@in_array($param['data']['type'], self::$noexportfollowtypes);
        if (!$res && $canexport) {
         if ($header) { $header .= self::W_CSV_DELIMITER; }
         $header .= $param['data']['name'];         
        }
        //values data
        if ($canexport) {        
         switch ($param['sid']) {
          case 'url': $value = $list['urlid']; break;
          default   : $value = $line_obj->GetCurrentValue($param['sid'], $param['data'], 'value');    
         }
         $line .= ((($line) ? self::W_CSV_DELIMITER : '').$value);
        }
       }
       if (!$res && $header) { $res .= $header."rn"; }
       if ($line) { $res .= $line."rn"; }           
      }     
     }
    }
    $str = $this->StrFetch($_GET['data'], ',');
   }
   if (!$res) { return $this->SetError('No Data found!'); }
   //$res = @iconv('UTF-8', 'WINDOWS-1251', $res);   
   $this->control->WriteDownLoadFileHeader('export_'.$this->GetThisDate().'.csv', $this->strlen($res));
   print $res;
   return true;
  }//ActionToExportDataValues
  
  /** выполнение */
  function ActionElements() {      
   if (!$this->PrepereToStartPanel()) { return false; }
   //ok, action begin
   if ($this->IsAjax()) { return $this->ActionWithAjax(); }
   /* check for export action */
   if ($_GET['export'] && $_GET['data']) { 
       $this->ActionToExportDataValues(); if ($this->error) { print $this->error; } exit; 
   }
   /* css */
   $this->AddSectionInfoNew('csslist', 'colordlg/colorpicker.php');
   //combine sections list
   $this->GenerateSectionsList();
   //get params list, if is first start - create default list and return then
   $this->PreloadParamsList();
   //get update display params options
   $this->result['displayselectparam'] = ($this->GetPanelOption('NODISPLAYSELECTPARAM') ? 0 : 1);
   //list params for not updated
   $this->result['paramsnoupdated'] = self::$paramnoupdated;
   $this->result['paramsnoupdatedever'] = self::$paramnoupdatedever;   
   //display not need updated
   $this->result['displaynoupdateneed'] = ($this->GetPanelOption('NODISPLAYNOTNEEDUPDATEDLOG') ? 0 : 1);
   //return all params
   $this->result['deflistpr'] = self::$paramslistforuse;
   $this->paneldisplayed = true;        
  }//ActionElements    
    
 }//w_panelcontrolobjid 
 //------------------------------------------------------------------------------------- 
 /* Copyright (с) 2011 forwebm.net */
?>