Вход Регистрация
Файл: upload/include/library/phpfox/validator/validator.class.php
Строк: 332
<?php
/**
 * [PHPFOX_HEADER]
 */

defined('PHPFOX') or exit('NO DICE!');

/**
 * Validatior
 * Used for site wide validation of POST forms. Includes the feature to validate
 * forms using JavaScript and PHP as a failsafe.
 * 
 * @copyright        [PHPFOX_COPYRIGHT]
 * @author            Raymond Benc
 * @package         Phpfox
 * @version         $Id: validator.class.php 4225 2012-06-07 13:27:24Z Miguel_Espinoza $
 */
final class Phpfox_Validator
{    
    
/**
     * List of all the errors.
     * 
     * @var array
     */
    
private $aErrors = array();
    
    
/**
     * Name of the curremt HTML form.
     * 
     * @var string
     */
    
private $sFormName;
    
    
/**
     * Name of the validation.
     * 
     * @var string
     */
    
private $_sName;
    
    
/**
     * List of default regex rules.
     * 
     * @var array
     */
    
private $_aDefaults;
    
    
/**
     * Check to see if we should load a parent check.
     * 
     * @var bool
     */
    
private $_bParent false;
    
    private 
$_bAllowZero false;
    
    
/**
     * Default regex rules.
     * 
     * @var array
     */
    
private $_aRegex = array(
        
'user_name' => '/^[a-zA-Z0-9_- ]{5,25}$/',
        
'email' => '/^[0-9a-zA-Z]([-.w]*[0-9a-zA-Z]?)*@([0-9a-zA-Z][-w]*[0-9a-zA-Z].)+[a-zA-Z]{2,}$/',
        
'html' => '/<(.*?)>/',
        
'url' => '~(?>[a-z+]{2,}://|www.)(?:[a-z0-9]+(?:.[a-z0-9]+)?@)?(?:(?:[a-z](?:[a-z0-9]|(?<!-)-)*[a-z0-9])(?:.[a-z](?:[a-z0-9]|(?<!-)-)*[a-z0-9])+|(?:(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?).){3}(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?))(?:/[^\/:?*"<>|n]*[a-z0-9])*/?(?:?[a-z0-9_.%]+(?:=[a-z0-9_.%:/+-]*)?(?:&[a-z0-9_.%]+(?:=[a-z0-9_.%:/+-]*)?)*)?(?:#[a-z0-9_%.]+)?~is',
        
'currency_id' => '/^[A-Z]{3,3}$/'
    
);
    
    public function 
allowZero()
    {
        
$this->_bAllowZero true;
        return 
$this;
    }
    
/**
     * Class constructor used to load default validator rules.
     * Found in the file: include/setting/validator.sett.php
     * 
     */
    
public function __construct()
    {        
        
// Require validation rule set
        
require_once(PHPFOX_DIR_SETTING 'validator.sett.php');
        
        
$this->_aRegex['user_name'] = '/^[a-zA-Z0-9_- ]{' Phpfox::getParam('user.min_length_for_username') . ',' Phpfox::getParam('user.max_length_for_username') . '}$/';
        
        ((
$sPlugin Phpfox_Plugin::get('validator_construct')) ? eval($sPlugin) : false);
    }
    
    
/**
     * Verify a regex pattern against a string value.
     *
     * @param string $sPattern Regex pattern to check.
     * @param string $sValue String value.
     * @return bool TRUE if string passed, FALSE if string failed; comes with error message.
     */
    
public function verify($sPattern$sValue)
    {        
        if (!isset(
$this->_aDefaults[$sPattern]))
        {
            return 
Phpfox_Error::trigger('Invalid pattern.'E_USER_ERROR);
        }

        if (!
preg_match($this->_aDefaults[$sPattern]['pattern'], $sValue))
        {
            return (isset(
$this->_aDefaults[$sPattern]['pattern']) ? Phpfox_Error::set($this->_aDefaults[$sPattern]['title']) : false);
        }
        
        return 
true;
    }
    
    
/**
     * Check a string value against multiple regex checks.
     *
     * @param string $sString Value to check.
     * @param array $aParams ARRAY of regex checks to perform.
     * @return bool FALSE if string failed, TRUE if string passed.
     */
    
public function check($sString$aParams = array())
    {
        if (!
is_array($aParams))
        {
            
$aParams = array($aParams);
        }
        
        
$bFailed 0;        
        foreach (
$aParams as $sRegex)
        {
            if (
preg_match($this->_aRegex[$sRegex], $sString))
            {                
                
$bFailed++;                    
            }            
        }        
        
        return (
$bFailed false true);
    }
    
    
/**
     * Process a form and perform regex checks on all the values.
     *
     * @param array $aParams ARRAY of regex checks.
     * @param array $aValues ARRAY of form values.
     * @return mixed Returns all the values cleaned if everything is okay, however if something failed a regex check we return FALSE.
     */
    
public function process($aParams$aValues)
    {
        foreach (
$aValues as $sValueKey => $sValue)
        {
            if (!isset(
$aParams[$sValueKey]))
            {
                unset(
$aValues[$sValueKey]);
            }
        }        
        
         
$sDebug '';
        foreach (
$aParams as $sKey => $aParam)
        {            
            if (!
is_array($aParam))
            {
                
$aParam = array('type' => $aParam);
            }
            
            if (!
is_array($aParam['type']))
            {
                
$aParam['type'] = array($aParam['type']);
            }            
            
            
$bFailed false;
            foreach (
$aParam['type'] as $sType)
            {                
                switch (
$sType)
                {
                    case 
'array:required':
                    case 
'array':
                        
                        if (
$sType == 'array:required')
                        {
                            if (empty(
$aValues[$sKey]))
                            {
                                
$bFailed true;
                                
$sDebug 'Value for array is empty.';                                        
                            }                            
                        }
                    
                        if (
$bFailed === false && isset($aValues[$sKey]) && !is_array($aValues[$sKey]))
                        {
                            
$bFailed true;
                            
$sDebug 'Value is not an array.';        
                        }
                            
                        break;            
                    case 
'phrase':
                    case 
'phrase:required':
                        
                        if (
$sType == 'phrase:required')
                        {
                            if (empty(
$aValues[$sKey]))
                            {
                                
$bFailed true;
                                
$sDebug 'Value for phrase is empty.';                                        
                            }                            
                        }            
                        
                        if (
$bFailed === false && isset($aValues[$sKey]) && !is_array($aValues[$sKey]))
                        {
                            
$bFailed true;
                            
$sDebug 'Value for phrase is not an array.';        
                        }
                        
                        if (
$bFailed === false)
                        {
                            
$iPhraseCount 0;
                            foreach (
$aValues[$sKey] as $sLanguage => $sPhrase)
                            {
                                if (!empty(
$sPhrase))
                                {
                                    
$iPhraseCount++;
                                }
                            }
                            
                            if (
$iPhraseCount === 0)
                            {
                                
$bFailed true;
                                
$sDebug 'Phrase values are all empty.';
                            }
                        }                    
                        
                        break;
                    case 
'php_code':
                    case 
'php_code:required':
                        
                        if (
$sType == 'php_code:required')
                        {
                            if (empty(
$aValues[$sKey]))
                            {
                                
$bFailed true;
                                
$sDebug 'Value for PHP code is empty.';                                        
                            }                            
                        }
                        
                        if (
$bFailed === false)
                        {
                            if (!empty(
$aValues[$sKey]))
                            {
                                
$aValues[$sKey] = Phpfox::getLib('parse.format')->phpCode($aValues[$sKey]);    
                            }
                        }
                        
                        break;        
                    case 
'currency:required':
                        if (!isset(
$aValues[$sKey]))
                        {
                            
$bFailed true;    
                            
$sDebug 'Value not found.';
                        }
                        else 
                        {
                            if (!
is_array($aValues[$sKey]))
                            {
                                
$bFailed true;
                                
$sDebug 'Value is not an array.';
                            }
                        }            
                        
                        if (
$bFailed === false)
                        {
                            
$aValues[$sKey] = (array) $aValues[$sKey];
                            
                            foreach (
$aValues[$sKey] as $sCurrency => $mValue)
                            {
                                if (empty(
$mValue) && strlen($mValue) < 1)
                                {
                                    
// unset($aValues[$sKey][$sCurrency]);
                                    
$bFailed true;
                                    
$sDebug 'Value of array is empty.';                                        
                                    
                                    break;
                                }
                                
                                
$sPrice str_replace(array(' '','), ''$mValue);
                                
$aParts explode('.'$sPrice);        
                                if (
count($aParts) > 2)
                                {
                                    
$iCnt 0;
                                    
$sPrice '';
                                    foreach (
$aParts as $sPart)
                                    {
                                        
$iCnt++;
                                        
$sPrice .= (count($aParts) == $iCnt '.' '') . $sPart;
                                    }                                                            
                                }    
                                
                                if (!
is_numeric($sPrice))
                                {
                                    unset(
$aValues[$sKey][$sCurrency]);
                                }    
                            }
                            
                            if (!
count($aValues[$sKey]))
                            {
                                
$bFailed true;
                                
$sDebug 'Value of array is empty.';                                
                            }
                        }                
                        break;                    
                    case 
'price:required':
                        
                        if (empty(
$aValues[$sKey]) && (int) $aValues[$sKey] !== 0)
                        {
                            
$bFailed true;
                            
$sDebug 'Value not found.';
                        }
                        else 
                        {
                            
$sPrice str_replace(array(' '','), ''$aValues[$sKey]);
                            
$aParts explode('.'$sPrice);        
                            if (
count($aParts) > 2)
                            {
                                
$iCnt 0;
                                
$sPrice '';
                                foreach (
$aParts as $sPart)
                                {
                                    
$iCnt++;
                                    
$sPrice .= (count($aParts) == $iCnt '.' '') . $sPart;
                                }
                            }
                            
                            if (
is_numeric($sPrice))
                            {
                                
$aValues[$sKey] = $sPrice;
                            }
                            else 
                            {
                                
$bFailed true;
                                
$sDebug 'Value is not a numeric value.';                                
                            }
                        }
                                            
                        break;                    
                    case 
'string:required':
                    case 
'string':
                        
$bCatchZero true;
                        if (
$this->_bAllowZero == true && $aValues[$sKey] == '0')
                        {
                            
$bCatchZero false;
                        }
                        if (
$sType == 'string:required' && empty($aValues[$sKey]) && $bCatchZero)
                        {
                            
$bFailed true;
                            
$sDebug 'Value not found.';
                        }
                        
                        if (!empty(
$aValues[$sKey]) && !is_string($aValues[$sKey]) && $bCatchZero)
                        {
                            
$bFailed true;
                            
$sDebug 'Value is not a string.';
                        }
                        
                        break;
                    case 
'int:required':                        
                        if (!isset(
$aValues[$sKey]))
                        {
                            
$bFailed true;                            
                            
$sDebug 'Value not found.';
                        }
                        else 
                        {
                            if (!
is_numeric($aValues[$sKey]))
                            {
                                
$bFailed true;
                                
$sDebug 'Value is not a numeric value.';
                            }
                        }            
                        
                        if (
$bFailed === false)
                        {
                            
$aValues[$sKey] = (int) $aValues[$sKey];
                        }
                        break;
                    case 
'int':
                        if (isset(
$aValues[$sKey]))
                        {
                            if (!
is_numeric($aValues[$sKey]))
                            {
                                
$bFailed true;
                                
$sDebug 'Value is not a numeric value.';                                
                            }
                            else 
                            {
                                
$aValues[$sKey] = (int) $aValues[$sKey];
                            }
                        }
                        break;
                    case 
'boolean':
                        if (isset(
$aValues[$sKey]))
                        {
                            if (!
is_bool($aValues[$sKey]))
                            {
                                
$bFailed true;
                                
$sDebug 'Value is not a boolean value.';                                
                            }                                            
                        }
                        break;
                    case 
'product_id':
                    case 
'product_id:required':
                        
                        if (
$sType == 'php_code:required')
                        {
                            if (empty(
$aValues[$sKey]))
                            {
                                
$bFailed true;
                                
$sDebug 'Product ID is missing.';                                        
                            }                                                        
                        }                            
                        
                        break;
                    case 
'module_id':
                    case 
'module_id:required':
                        
                        if (
$sType == 'module_id:required')
                        {
                            if (empty(
$aValues[$sKey]))
                            {
                                
$bFailed true;
                                
$sDebug 'Module ID is missing.';                                        
                            }                                                        
                        }                        
                        
                        if ((
$bFailed === false && $sType == 'module_id:required') || ($sType == 'module_id' && !empty($aValues[$sKey])))
                        {
                            if (!
Phpfox::isModule($aValues[$sKey]))
                            {
                                
$bFailed true;
                                
$sDebug 'Not a valid module.';
                            }
                        }
                        
                        break;
                    default:                        
                        if (
preg_match('/^regex:(.*?)$/'$sType$aMatches))
                        {
                            if (isset(
$this->_aRegex[$aMatches[1]]) && !preg_match($this->_aRegex[$aMatches[1]], $aValues[$sKey]))
                            {
                                
$bFailed true;
                                
$sDebug 'Regex "' $aMatches[1] . '" failed.';
                            }            
                        }
                        else 
                        {
                            return 
Phpfox_Error::trigger('Not a valid validation type: ' $sTypeE_USER_ERROR);
                        }
                        break;
                }
                
                if (
$bFailed)
                {
                    
Phpfox_Error::set((isset($aParam['message']) ? $aParam['message'] : $sDebug) . ((PHPFOX_DEBUG && isset($aParam['message'])) ? ' DEBUG: ' $sDebug ''));
                }                
            }
            
            if (
$bFailed === false)
            {
                if (isset(
$aParam['convert']))
                {
                    
$aValues[$sKey] = Phpfox::getLib('parse.input')->convert($aValues[$sKey]);
                }
            }
        }        
                
        return 
$aValues;
    }
    
    
/**
     * Build a form validation check.
     *
     * @param array $aParams ARRAY of settings.
     * @return object Return self.
     */
    
public function set($aParams)
    {
        
$this->sFormName 'Validation_' $aParams['sFormName'];
        
$this->_sName $aParams['sFormName'];
        
$this->aFields $aParams['aParams'];    
        
        if (isset(
$aParams['bParent']))
        {
            
$this->_bParent true;
        }
        
        return 
$this;
    }
    
    
/**
     * Create the JS form onsubmit=""
     *
     * @param bool $bReturn TRUE to include the "return" in the JavaScript code.
     * @return    string    Call to JS function
     */
    
public function getJsForm($bReturn true)
    {
        return (
$bReturn 'return ' '') . $this->sFormName .'()' . ($bReturn ';' '');
    }

    
/**
     * Server Side check
     *
     * @param    array    $aVal    holds all the post arrays
     * @return    boolean    Check if everything is valid or not
     */
    
public function isValid($aVal)
    {        
        foreach(
$this->aFields as $sFieldKey => $aFieldValue)
        {
            
$this->_checkRoutine($aFieldValue$sFieldKey'php', (isset($aVal[$sFieldKey]) ? $aVal[$sFieldKey] : null));
        }
        
        return 
Phpfox_Error::isPassed();
    }

    
/**
     * Client side check
     * 
     * @return    string    Javascript data needed for a specific form
     */
    
public function createJS()
    {
        
$sStr "n" '<div id="' $this->_sName '_msg"></div>';
        
$sStr .= "n" '<script type="text/javascript">' "n";
         
$sStr .= "function " $this->sFormName "()n{n";
         
$sStr .= "t" '$('#' . $this->_sName . '_msg').hide('');' . "n";
         
$sStr .= "t" '$('#' . $this->_sName . '_msg').html('');' . "n";
         
$sStr .= "t" "var bIsValid = true;n";         
        
$sStr  .= "tvar bReturn = false;n";
        
        foreach (
$this->aFields as $sFieldKey => $aFieldValue)
        {
            if (
is_string($aFieldValue))
            {
                
$sStr .= "t".'$(".error_message").each(function(){if ($(this).text() == "'.$aFieldValue.'"){bReturn=true;$(this).hide("slow",function(){$(this).show();})}});';
            }
            
$sStr .= $this->_checkRoutine($aFieldValue$sFieldKey'js');
        }
        
        
$sStr .= "t" "if (bReturn) return false;nt if ( bIsValid ) { return true; } $('#" $this->_sName "_msg').show(); window.location.hash = '#pem'; return false;n";
        
$sStr .= '}' "n</script>n";

        return 
$sStr;
    }
    
    
/**
     * Method is used to check if POST data fields is valid
     * for either PHP or Javascript.
     *
     * @param    array    $aFieldValue    is the array of field values
     * @param    string    $sFieldKey        is the KEY or form ID
     * @param    string    $sType            is the type of form
     * @param    string    $sValue            is the value, only for PHP
     * @return    mixed    PHP returns bool|JS returns JS layout    
     */
    
private function _checkRoutine($aFieldValue$sFieldKey$sType 'php'$sValue '')
    {
        if (
$sType == 'js' && $sFieldKey == 'image_verification' && Phpfox::getParam('captcha.recaptcha'))
        {
            
$sFieldKey 'recaptcha_response_field';
        }
        
        if (!
is_array($aFieldValue))
        {
            
$aFieldValue = array(
                
'title' => $aFieldValue,
                
'def' => 'required'
            
);
        }        
        
        
$sStr '';
         if ( isset(
$aFieldValue['pattern']) )
         {
             if ( 
$sType == 'php' && !preg_match($aFieldValue['pattern'], $sValue) )
             {
                 
Phpfox_Error::set($aFieldValue['title']);
             }
             else
             {
                 
$sStr .= $this->_createIfJS('oJs.value(''. $sFieldKey .'').search('$aFieldValue['pattern'] .') == -1'$aFieldValue['title'], $sFieldKey);
             }
         }
         elseif ( isset(
$aFieldValue['maxlen']) )
         {
            if ( 
$sType == 'php' && strlen($sValue) > $aFieldValue['maxlen'] )
            {
                
Phpfox_Error::set($aFieldValue['title']);
            }
            else
            {                        
                
$sStr .= $this->_createIfJS('$('#'. $sFieldKey .'').val().length > '. $aFieldValue['maxlen'] .'', $aFieldValue['title'], $sFieldKey);
            
}             
         }
         elseif ( isset(
$aFieldValue['def']) )
         {
              if (
$aFieldValue['def'] == 'required')
              {
                 if (
$sType == 'php' && $sFieldKey == 'image_verification')
                {
                    if (
Phpfox::isModule('captcha') && !Phpfox::getService('captcha')->checkHash($sValue))
                    {
                        
Phpfox_Error::set(Phpfox::getPhrase('captcha.captcha_failed_please_try_again'));
                    }
                }
                  else 
                  {                      
                      if (
$sType == 'php')
                      {
                          if (isset(
$aFieldValue['php_id']))
                          {
                              if (
strpos($aFieldValue['php_id'], ']'))
                              {
                                  
$aParts explode('['$aFieldValue['php_id']);
                                  
$aPostArray Phpfox::getLib('request')->getArray($aParts[0]);
                                  
$aKeyParts explode('_'$sFieldKey);
                                  if (isset(
$aPostArray[$aKeyParts[(count($aKeyParts) - 1)]]))
                                  {
                                      
$sValue $aPostArray[$aKeyParts[(count($aKeyParts) - 1)]];
                                  }
                              }
                          }
                          
                          if (empty(
$sValue) && $sValue != '0')
                          {
                              
Phpfox_Error::set($aFieldValue['title']);
                          }
                          elseif (
Phpfox::getLib('parse.format')->isEmpty($sValue))
                          {                                                            
                              
Phpfox_Error::set($aFieldValue['title']);
                          }                     
                      }
                      else
                      {
                          ((
$sPlugin Phpfox_Plugin::get('validator_check_routine_default')) ? eval($sPlugin) : false);
                          
                          if (!isset(
$bSkipDefaultCheck))
                          {
                              if (
$this->_bParent === true)
                              {
                                  
$sStr .= $this->_createIfJS('$('#' . $this->_sName . '').find('.' . $sFieldKey . '').val() == ''', $aFieldValue['title'], $sFieldKey);    
                              
}
                              else 
                              {
                                  
$sStr .= $this->_createIfJS('' . (($sFieldKey == 'text' && Phpfox::getParam('core.wysiwyg') == 'tinymce') ? '(Editor.sEditor == 'tinymce' && typeof(tinyMCE) == 'object' && tinyMCE.activeEditor.getContent().replace(/</?[^>]+>/gi, '').length == 0) || (typeof(tinyMCE) != 'object' && $('#'. $sFieldKey .'').val() == '') || (Editor.sEditor != 'tinymce' && typeof(tinyMCE) == 'object' && $('#'. $sFieldKey .'').val() == '')' : '$('#'. $sFieldKey .'').val() == ''') . '', $aFieldValue['title'], $sFieldKey);
                              
}
                          }
                      }
                  }
              }
              elseif ( 
$aFieldValue['def'] == 'checkbox' )
              {
                  if (
$sType == 'php' && empty($sValue))
                  {
                      
Phpfox_Error::set($aFieldValue['title']);
                  }
                  else
                  {
                      
$sStr .= $this->_createIfJS('!$('#'. $sFieldKey .'').get(0).checked', $aFieldValue['title'], $sFieldKey);
                  
}
              }
             elseif ( isset(
$this->_aDefaults[$aFieldValue['def']]) )
             {
                
$aDefault $this->_aDefaults[$aFieldValue['def']];                
                
$sFieldTitle = (isset($aFieldValue['title']) ? $aFieldValue['title'] : $aDefault['title']);
                
$sFieldGuide = (isset($aDefault['guide']) ? $aDefault['guide'] : '');
                if ( isset(
$aDefault['pattern']) )
                {
                    if ( 
$sType == 'php' && !preg_match($aDefault['pattern'], $sValue) )
                    {
                        
Phpfox_Error::set($sFieldTitle);
                    }
                    else
                    {
                        
$sStr .= $this->_createIfJS('$('#'. $sFieldKey .'').val().search('. $aDefault['pattern'] .') == -1', $sFieldTitle, $sFieldKey, $sFieldGuide);
                    
}                        
                }
                
                if ( isset(
$aDefault['minlen']) )
                {
                    if ( 
$sType == 'php' && strlen($sValue) < $aDefault['minlen'] )
                    {
                        
Phpfox_Error::set($aDefault['title']);
                    }
                    else
                    {
                        
$sStr .= $this->_createIfJS('$('#'. $sFieldKey .'').val().length < '. $aDefault['minlen'] .'', $aDefault['title'], $sFieldKey);
                    
}                        
                }    
                
                if ( isset(
$aDefault['maxlen']) )
                {
                    if ( 
$sType == 'php' && strlen($sValue) > $aDefault['maxlen'] )
                    {
                        
Phpfox_Error::set($aDefault['title']);
                    }
                    else
                    {                        
                        
$sStr .= $this->_createIfJS('$('#'. $sFieldKey .'').val().length > '. $aDefault['maxlen'] .'', $aDefault['title'], $sFieldKey);
                    
}
                }    
             }
         }
         else
         {
             if (
$sType == 'php')
             {
                 
Phpfox_Error::set($aFieldValue['title']);    
             }
             else
             {
                 
$sStr .= $this->_createIfJS('oJs.value(''. $sFieldKey .'') == '''$aFieldValue['title']);
             }                 
         }
        
$sStr .= "n";

        return (
$sType != 'php' $sStr '');
    }

    
/**
     * Creates a JS IF statment
     *
     * @param    string    $sIfStatment    is the JS IF statment will plan to execute
     * @param    string    $sTitle    is the error message if the check has failed
     * @param string $sFieldKey Field ID/Class if using a parent check.
     * @param string $sInfoGuide Info guide to explain the error in more detail.
     * @return    string    JS Content returned
     */
    
private function _createIfJS($sIfStatment$sTitle$sFieldKey ''$sInfoGuide '')
    {
        
$sStr "t";
        
$sStr .= "if (" $sIfStatment ")nt{n";
        
$sStr .= "tt" "bIsValid = false; n";
        
$sStr .= "tt" '$('#' . $this->_sName . '_msg').message(''. str_replace("'", "'", $sTitle) .'', 'error');' . "n";
        
if ($sFieldKey)
        {
            if (
$this->_bParent === true)
            {
                
$sStr .= "tt" '$('#' . $this->_sName . '').find('.' . $sFieldKey . '').addClass('alert_input');' . "n";
            
}
            else 
            {
                
$sStr .= "tt" '$('#'. $sFieldKey .'').addClass('alert_input');' . "n";
            
}
            if (!empty(
$sInfoGuide))
            {
                
$sStr .= "tt" 'oJs.className('FormInfo_'. $sFieldKey .'', 'FormInfo');' "ntt" .'oJs.id('FormInfo_'. $sFieldKey .'').innerHTML='' . $sInfoGuide . '';' "n";
            }
        }
        
$sStr .= "t" '}' "n";
        return 
$sStr;
    }
}

?>
Онлайн: 1
Реклама