/*
simple — 1 января 2015
full — 1 января 2015 (четверг)
active — Только что | Менее часа назад | Сегодня в ...
active_short — Только что | Час назад | Сегодня | Вчера ...
month — Январь
month_day — 1 января
month_date — января
484587
public static function date($format = null, $timestamp = null){
        if(is_int($format)){
            if(is_string($timestamp)){
                $formatHolder = $timestamp;
            }
            $timestamp = $format;
            $format = isset($formatHolder) ? $formatHolder : null;
        }
        if(!$timestamp) $timestamp = time();
        if(!$format) $format = 'simple';
        $months = array('..','января','февраля','марта','апреля','мая','июня','июля','августа','сентября','октября','ноября','декабря');
        $weeks = array('воскресенье','понедельник','вторник','среда','четверг','пятница','суббота');
        $date = getdate($timestamp);
        if($format == 'full'){
            return "{$date['mday']} {$months[$date['mon']]} {$date['year']} ({$weeks[$date['wday']]})";
		}else if($format == 'active'){
            if($timestamp > time() - 120) return 'Только что';
            if($timestamp > time() - 3600) return 'Менее часа назад';
            if(date('d.m.Y', $timestamp) == date('d.m.Y')) return 'Сегодня в ' . date('H:i', $timestamp);
            if(date('d.m.Y', $timestamp) == date('d.m.Y', time()-86400)) return 'Вчера в ' . date('H:i', $timestamp);
            return "{$date['mday']} {$months[$date['mon']]} {$date['year']} в " . date('H:i', $timestamp);
        }else if($format == 'active_short'){
            if($timestamp > time() - 120) return 'Только что';
            if($timestamp > time() - 3600) return 'Час назад';
            if(date('d.m.Y', $timestamp) == date('d.m.Y')) return 'Сегодня';
            if(date('d.m.Y', $timestamp) == date('d.m.Y', time()-86400)) return 'Вчера';
            return "{$date['mday']} {$months[$date['mon']]}";
        }else if($format == 'simple'){
            return "{$date['mday']} {$months[$date['mon']]} {$date['year']}";
        }else if($format == 'simpleY'){
            return "{$date['mday']} {$months[$date['mon']]} <span class='year'>{$date['year']}</span>";
        }else if($format == 'month_date'){
            return $months[$date['mon']];
        }else if($format == 'short'){
            return "{$date['mday']} {$months[$date['mon']]}";
        }else if($format == 'month_day'){
            return date('d', $timestamp)."<span> {$months[$date['mon']]}</span>";
        }else if($format == 'month'){
            $months = array('..','Январь','Февраль','Март','Апрель','Май','Июнь','Июль','Август','Сентябрь','Октябрь','Ноябрь','Декабрь');
            return "{$months[$date['mon']]}";
        }else{
            return date($format,$timestamp);
        }
    }
410332
protected function parseExtended()
	{

		$this->addFormMessagesNode();

		$this->xml->firstChild->nextSibling->setAttribute('method', 'post');

		$this->processBranch($this->xml->firstChild->nextSibling);

		/*
		 * Обработка тегов:
		 * 1. Удаление расширенных атрибутов
		 * 2. Предотвращение схлопывания пустых тегов
		 */
		$tags = $this->xml->getElementsByTagName('*');
		$collapsable = array('br', 'hr', 'input');

		for ($i = 0; $i < $tags->length; $i++)
		{
			$node = $tags->item($i);

			$isElement = $node->nodeType == XML_ELEMENT_NODE;

			if ($isElement)
			{
				$hasAttributes = $isElement && $node->hasAttributes();
				if ($hasAttributes)
				{
					$attrs = $node->attributes;
					for ($j = 0; $j < $attrs->length; $j++)
					{
						/* @var DOMAttr $attr */
						$attr = $attrs->item($j);
						if ($attr->namespaceURI == self::NS)
						{
							$this->extendedAttr($node, $attr);
							/*
							 * в extendedAttr текущий атрибут удаляется, поэтому следующим шагом рассматривается
							 * элемент с тем же индексом
							 */
							$j--;
						}
					}
				}

				if ($node->textContent === '' && !in_array($node->nodeName, $collapsable))
				{
					$cdata = $this->xml->createCDATASection('');
					$node->appendChild($cdata);
				}
			}
		}

		$id = $this->xml->firstChild->nextSibling->getAttribute('id');
		// инициализация объекта формы
		$scriptContents = "\n\$(document).ready(function () {window.$id = new EresusForm('$id');\n";

		/*
		 * Если в сессии установлен флаг isInvalid, вызываем перепроверку формы
		 */
		if ($this->mode == self::INPUT && $this->isInvalid)
		{
			$this->js []= 'validate(true);';
		}

		// необходимо для отображения сообщений об ошибках, найденных на сервере
		$this->js []= 'showFormMessages();';
		if ($this->js)
		{
			foreach ($this->js as $command)
			{
				$scriptContents .= "$id.$command\n";
			}
		}
		$scriptContents .= "});";
		$script = $this->xml->createElement('script', $scriptContents);
		$script->setAttribute('type', 'text/javascript');
		$this->xml->firstChild->nextSibling->appendChild($script);

		$this->xml->formatOutput = true;
		$html = $this->xml->saveXML($this->xml->firstChild->nextSibling); # This exclude xml declaration
		$html = preg_replace('/\s*xmlns:\w+=("|\').*?("|\')/', '', $html); # Remove ns attrs
		/*$html = preg_replace('/<\?.*\?>/', '', $html);*/
		$html = str_replace('<![CDATA[]]>', '', $html); # Remove empty <![CDATA[]]> sections

		return $html;
	}
987146
public function currentAction()
    {
        $objectId = !empty($this->getPost()->objectId) ? $this->getPost()->objectId : null;
        switch ($this->getPost()->fileTypes) {
            case 'images' :
                //zapytanie o obrazki
                $query = CmsFileQuery::imagesByObject($this->getPost()->object, $objectId);
                break;
            case 'notImages' :
                //wszystkie pliki bez obrazków
                $query = CmsFileQuery::notImagesByObject($this->getPost()->object, $objectId);
                break;
            default :
                //domyślne zapytanie o wszystkie pliki
                $query = CmsFileQuery::byObject($this->getPost()->object, $objectId);
        }

        $records = $query->find();
        foreach ($records as $record) {
            $record->data = $record->data->toArray();
        }

        //zwrot json'a z plikami
        return json_encode([
            'result' => 'OK',
            'files' => $records->toArray()
        ]);
    }
198776
private function axisMonths(): array
    {
        return [
            'JAN' => I18N::translateContext('NOMINATIVE', 'January'),
            'FEB' => I18N::translateContext('NOMINATIVE', 'February'),
            'MAR' => I18N::translateContext('NOMINATIVE', 'March'),
            'APR' => I18N::translateContext('NOMINATIVE', 'April'),
            'MAY' => I18N::translateContext('NOMINATIVE', 'May'),
            'JUN' => I18N::translateContext('NOMINATIVE', 'June'),
            'JUL' => I18N::translateContext('NOMINATIVE', 'July'),
            'AUG' => I18N::translateContext('NOMINATIVE', 'August'),
            'SEP' => I18N::translateContext('NOMINATIVE', 'September'),
            'OCT' => I18N::translateContext('NOMINATIVE', 'October'),
            'NOV' => I18N::translateContext('NOMINATIVE', 'November'),
            'DEC' => I18N::translateContext('NOMINATIVE', 'December'),
        ];
    }
1011638
function getDateTranslation(date, locale, name, width, form, extended) {
    switch (name) {
        case TranslationType.Months:
            return getLocaleMonthNames(locale, form, width)[date.getMonth()];
        case TranslationType.Days:
            return getLocaleDayNames(locale, form, width)[date.getDay()];
        case TranslationType.DayPeriods:
            var /** @type {?} */ currentHours_1 = date.getHours();
            var /** @type {?} */ currentMinutes_1 = date.getMinutes();
            if (extended) {
                var /** @type {?} */ rules = getLocaleExtraDayPeriodRules(locale);
                var /** @type {?} */ dayPeriods_1 = getLocaleExtraDayPeriods(locale, form, width);
                var /** @type {?} */ result_1;
                rules.forEach(function (rule, index) {
                    if (Array.isArray(rule)) {
                        // morning, afternoon, evening, night
                        var _a = rule[0], hoursFrom = _a.hours, minutesFrom = _a.minutes;
                        var _b = rule[1], hoursTo = _b.hours, minutesTo = _b.minutes;
                        if (currentHours_1 >= hoursFrom && currentMinutes_1 >= minutesFrom &&
                            (currentHours_1 < hoursTo ||
                                (currentHours_1 === hoursTo && currentMinutes_1 < minutesTo))) {
                            result_1 = dayPeriods_1[index];
                        }
                    }
                    else {
                        // noon or midnight
                        var hours = rule.hours, minutes = rule.minutes;
                        if (hours === currentHours_1 && minutes === currentMinutes_1) {
                            result_1 = dayPeriods_1[index];
                        }
                    }
                });
                if (result_1) {
                    return result_1;
                }
            }
            // if no rules for the day periods, we use am/pm by default
            return getLocaleDayPeriods(locale, form, /** @type {?} */ (width))[currentHours_1 < 12 ? 0 : 1];
        case TranslationType.Eras:
            return getLocaleEraNames(locale, /** @type {?} */ (width))[date.getFullYear() <= 0 ? 0 : 1];
    }
}
1049012
public static function check()
    {
        // Проверим значение установленной текущей локализации, если оно не входит в список доступных локализаций
        // установим локализацию по умолчанию
        if (!in_array(strtolower(self::$current_locale), self::$locales)) self::$current_locale = self::DEF;
    }
1371734
public static function getLocalMonthName($date, $short=false) {
		if(empty($date))
			return false;
		
		$month = date('m', strtotime($date));

		$bulan = array('Januari', 'Februari', 'Maret', 'April', 'Mei', 'Juni', 'Juli', 'Agustus', 'September', 'Oktober', 'November', 'Desember');
		$shortBulan = array('Jan', 'Feb', 'Mar', 'Apr', 'Mei', 'Jun', 'Jul', 'Agu', 'Sep', 'Okt', 'Nov', 'Des');

		if($short == true)
			return $shortBulan[$month-1];
		else
			return $bulan[$month-1];
	}
275679
static function parse($text, $vars=[], $tpl_left = '{', $tpl_right = '}', $filter = FILTER_SANITIZE_SPECIAL_CHARS)
    {
        if ($filter) $vars = filter_var_array($vars, $filter);
        // По циклу проходимся по всем переменным заменяя значения в {} на значения в массиве
        if (is_array($vars)){
            foreach ($vars as $key => $value){
                if (is_scalar($value)) $text = str_replace($tpl_left.$key.$tpl_right, $value, $text);
            }
        }
        return $text;
    }
580975
static function cache_namespace($user_perms = true)
	{
		$ns_parts = array();
		if(empty($_SERVER['HTTP_HOST']))
			$ns_parts[] = 'cli';
		elseif(!preg_match('/^\d+\.\d+\.\d+\.\d+$/', $_SERVER['HTTP_HOST'])) // Если это доменное имя
			$ns_parts[] = str_replace(':', '=', strtolower($_SERVER['HTTP_HOST']));
		elseif($_SERVER['HTTP_HOST'] != gethostbyname(gethostname()))
			$ns_parts[] = 'unknown';

		$ns_parts[] = Cfg::get('project.name');

		if($user_perms && !empty($_SERVER['USER']))
			$ns_parts[] = strtolower($_SERVER['USER']);

		if(($cs = Cfg::get('internal_charset')) && $cs != 'utf-8')
			$ns_parts[] = 'i'.$cs;

		if(($cs = Cfg::get('output_charset')) && $cs != 'utf-8')
			$ns_parts[] = 'o'.$cs;

		if(!empty($_SERVER['BORS_INSTANCE']))
			$ns_parts[] = $_SERVER['BORS_INSTANCE'];

		return array_filter($ns_parts);
	}
795893
public static function lastMonthRange()
    {
        $begin = mktime(0, 0, 0, date('m') - 1, 1, date('Y'));
        $end = mktime(23, 59, 59, date('m') - 1, date('t', $begin), date('Y'));

        return [$begin, $end];
    }
759733
function convertGrammar( $word, $case ) {
		global $wgGrammarForms;
		if ( isset( $wgGrammarForms['ru'][$case][$word] ) ) {
			return $wgGrammarForms['ru'][$case][$word];
		}

		# These rules are not perfect, but they are currently only used for site names so it doesn't
		# matter if they are wrong sometimes. Just add a special case for your site name if necessary.

		# join and array_slice instead mb_substr
		$ar = array();
		preg_match_all( '/./us', $word, $ar );
		if ( !preg_match( "/[a-zA-Z_]/us", $word ) )
			switch ( $case ) {
				case 'genitive': # родительный падеж
					if ( ( join( '', array_slice( $ar[0], -4 ) ) == 'вики' ) || ( join( '', array_slice( $ar[0], -4 ) ) == 'Вики' ) )
						{ }
					elseif ( join( '', array_slice( $ar[0], -1 ) ) == 'ь' )
						$word = join( '', array_slice( $ar[0], 0, -1 ) ) . 'я';
					elseif ( join( '', array_slice( $ar[0], -2 ) ) == 'ия' )
						$word = join( '', array_slice( $ar[0], 0, -2 ) ) . 'ии';
					elseif ( join( '', array_slice( $ar[0], -2 ) ) == 'ка' )
						$word = join( '', array_slice( $ar[0], 0, -2 ) ) . 'ки';
					elseif ( join( '', array_slice( $ar[0], -2 ) ) == 'ти' )
						$word = join( '', array_slice( $ar[0], 0, -2 ) ) . 'тей';
					elseif ( join( '', array_slice( $ar[0], -2 ) ) == 'ды' )
						$word = join( '', array_slice( $ar[0], 0, -2 ) ) . 'дов';
					elseif ( join( '', array_slice( $ar[0], -3 ) ) == 'ник' )
						$word = join( '', array_slice( $ar[0], 0, -3 ) ) . 'ника';
					break;
				case 'dative':  # дательный падеж
					# stub
					break;
				case 'accusative': # винительный падеж
					# stub
					break;
				case 'instrumental':  # творительный падеж
					# stub
					break;
				case 'prepositional': # предложный падеж
					# stub
					break;
			}
		return $word;
	}
104125
private function buildScheduleRegex()
    {
        $numbers = array(
            'min'   => '[0-5]?\d',
            'hour'  => '[01]?\d|2[0-3]',
            'day'   => '0?[1-9]|[12]\d|3[01]',
            'month' => '[1-9]|1[012]',
            'dow'   => '[0-7]'
        );
        foreach ($numbers as $field => $number) {
            $range = "($number)(-($number)(\/\d+)?)?";
            $field_re[$field] = "\*(\/\d+)?|$range(,$range)*";
        }

        $months = array(
            '[Jj][Aa][Nn]', '[Ff][Ee][Bb]', '[Mm][Aa][Rr]', '[Aa][Pp][Rr]',
            '[Mm][Aa][Yy]', '[Jj][Uu][Nn]', '[Jj][Uu][Ll]', '[Aa][Uu][Gg]',
            '[Ss][Ee][Pp]', '[Oo][Cc][Tt]', '[Nn][Oo][Vv]', '[Dd][Ee][Cc]',
        );
        foreach ($months as $m) {
            $field_re['month'] .= '|' . $m . '\w*';
        }

        $days = array(
            '[Mm][Oo][Nn]', '[Tt][Uu][Ee]', '[Ww][Ee][Dd]', '[Tt][Hh][Uu]',
            '[Ff][Rr][Ii]', '[Ss][Aa][Tt]', '[Ss][Uu][Nn]',
        );
        foreach ($days as $d) {
            $field_re['dow'] .= '|' . $d . '\w*';
        }

        $fields_re = '(' . join(')\s+(', $field_re) . ')';

        $specials = '@reboot|@yearly|@annually|@monthly|@weekly|@daily|@midnight|@hourly';

        return "/^($fields_re|($specials))$/";
    }
931852
function keywords($keywords, $usr_id = 0) {
        //удалить старые кейворды
        $this->keyword_remove_by_user($usr_id);
        $keywords = explode(',', $keywords);
        //добавить новые
        $ret = array();
        foreach ($keywords as $keyword) {
            $k = $this->keyword_add($keyword, $usr_id);
            if ($k) {
                $ret[$k] = $k;
            }
        }
        //возвратить строку с ключевиками с разделителями
        return implode(', ', $ret);
    }
472562
function(date, full) {
			return ((full == true) ? this.months[date] : ((this.months[date].length > 3) ? this.months[date].substring(0, 3) : this.months[date]))
		}
748491
static function in($value, &$error, $args)
    {
        if (sizeof($args) == 1 && is_array($args[0])) $args = $args[0];
        if (!in_array($value, $args)){
            $value = null;
            $error = new Error('Значение не в списке допустимых', 'in');
        }
        return $value;
    }
1194361
private function getFullName()
    {
        //替换日期事件
        $t = time();
        $d = explode('-', date("Y-y-m-d-H-i-s"));
        $format = $this->config["pathFormat"];
        $format = str_replace("{yyyy}", $d[0], $format);
        $format = str_replace("{yy}", $d[1], $format);
        $format = str_replace("{mm}", $d[2], $format);
        $format = str_replace("{dd}", $d[3], $format);
        $format = str_replace("{hh}", $d[4], $format);
        $format = str_replace("{ii}", $d[5], $format);
        $format = str_replace("{ss}", $d[6], $format);
        $format = str_replace("{time}", $t, $format);
        //过滤文件名的非法自负,并替换文件名
        $oriName = substr($this->oriName, 0, strrpos($this->oriName, '.'));
        $oriName = preg_replace("/[\|\?\"\<\>\/\*\\\\]+/", '', $oriName);
        $format = str_replace("{filename}", $oriName, $format);
        //替换随机字符串
        $randNum = rand(1, 99999999) . rand(1, 99999999);
        if (preg_match("/\{rand\:([\d]*)\}/i", $format, $matches)) {
            $format = preg_replace("/\{rand\:[\d]*\}/i", substr($randNum, 0, $matches[1]), $format);
        }
        $ext = $this->getFileExt();
        return $format . $ext;
    }
1279198
function add($error, $message = '', $is_temp = false)
    {
        // Если был временным
        if (!$is_temp || ($error instanceof Error && !$error->is_temp)) $this->untemp();
        // Добавление подчиненного
        if (is_array($error)){
            foreach ($error as $e){
                $this->add($e, $message, $is_temp);
            }
        }else{
            if (!$error instanceof Error) $error = new Error($message, $error);
            if ($is_temp || $error->is_temp){
                $this->temps[$error->code] = $error;
                $this->temps[$error->code]->is_temp = true;
                $this->temps[$error->code]->parent = $this;
            }else{
                $this->children[$error->code] = $error;
                $this->children[$error->code]->parent = $this;
            }
            if ($message) $error->message = $message;
        }
        return $this;
    }