<?php
/*
* @package LabCMS
* @copyright (c) 2006 Alexander Levin aka Loki (loki_angel@mail.ru)
* @support http://labcms.ru
* @license http://opensource.org/licenses/gpl-license.php GNU Public License
*/

function echo_mem()
{
	$current=xdebug_memory_usage();
	echo $current-$GLOBALS['usage']."<br />";
	$GLOBALS['usage']=$current;
}

function clean_magic_quotes()
{
	if (get_magic_quotes_gpc())
	{
		$_POST = stripslashes_deep($_POST);
		$_GET = stripslashes_deep($_GET);
		$_COOKIE = stripslashes_deep($_COOKIE);
		$_REQUEST = stripslashes_deep($_REQUEST);
	}
}

//боремся с magic_quotes
function stripslashes_deep($value)
{
	if( is_array($value) )
	{
		$value = array_map('stripslashes_deep', $value);
	}
	elseif ( !empty($value) && is_string($value) )
	{
		$value = stripslashes($value);
	}
	return $value;
}

function filterNullInSuperglobals()
{
	$_POST = filterNullRecurcive($_POST);
	$_GET = filterNullRecurcive($_GET);
	$_COOKIE = filterNullRecurcive($_COOKIE);
	$_REQUEST = filterNullRecurcive($_REQUEST);
}

function filterNullRecurcive($value)
{
	if( is_array($value) )
	{
		$value = array_map('filterNullRecurcive', $value);
	}
	elseif ( !empty($value) && is_string($value) )
	{
		$value = str_replace("\0", '', $value);
	}
	return $value;
}

function _debug($v, $group="message", $color=null, $tip=null)
{
	Debug_HackerConsole_Main::out($v, $group, $color, $tip);
}


/**
 *
 * @param string $className Class or Interface name automatically
 *              passed to this function by the PHP Interpreter
 */
function autoLoader($className)
{
	$smarty_class=strtolower($className);
	if (substr($smarty_class, 0, 16) == 'smarty_internal_'
    || in_array($smarty_class, array(
    'smarty_config_source',
    'smarty_config_compiled',
    'smarty_security',
    'smarty_cacheresource',
    'smarty_cacheresource_custom',
    'smarty_cacheresource_keyvaluestore',
    'smarty_resource',
    'smarty_resource_custom',
    'smarty_resource_uncompiled',
    'smarty_resource_recompiled',
    ))) {
        include SMARTY_SYSPLUGINS_DIR . $smarty_class . '.php';
    }

	$base=LAB_PATH_KERNEL.'/classes';
	// this is to take care of the PEAR style of naming classes
	$class = str_ireplace('_', '/', $className);
	if (file_exists($base.'/'.$class.'.php'))
		include_once $base.'/'.$class.'.php';
}

function _m($key)
{
	return LabCMS::i()->_($key);
}

function _nm($key1, $key2, $key3, $num)
{
	$key=LabCMS::i()->getNumStatus($num);
	$arr=array($key1, $key2, $key3);
	return _m($arr[$key]);
}

/**
 * функция определяющая права доступа к функциям
 *
 * @param string $rules
 * @return boolean
 * @author Loki
 */
function access($rules)
{
	return LabCMS::i()->access($rules);
}


function _url($params=array(), $action='', $type='', $href='', $redirect='', $token=false)
{
	return LabCMS::i()->url($params, $action, $type, $href, $redirect, $token);
}

/**
 * рекурсивно копирует каталог $sourse в  $destination
 *
 * @param text, text
 * @return
 * @author Loki
 * в настоящий момент не используется. Если не понадобится - надо удалить.
 */
function recurse_copy($sourse, $destination)
{
	$error="";
	if (!file_exists($destination))
	{
		@chmod(dirname($destination), 0777);
		if (!@mkdir($destination)) return "Не удалось создать директорию $destination";
		chmod($destination, 0777);
	}
		$files = scandir($sourse);
	foreach($files as $file)
	{
		if ($file!="." && $file!="..")
		{
			if (is_file($sourse.$file))
			{
				if (!file_exists($destination.$file))
				{
					if (!@copy($sourse.$file, $destination.$file)) return "Не удалось скопировать файл $destination$file";
				}
			}
			else
			{
				$error=recurse_copy($sourse.$file."/", $destination.$file."/");
				if ($error) return $error;
			}
		}
	}
}


/**
 * функция выбирает все группы пользователей находящиеся выше текущей. Для админа выбирает все группы
 *
 * @return array
 * @author Loki
 */
// TODO посмотреть можно ли эту функцию перенести непосредственно в модуль 
function getPossibleGroups()
{
	if (User::i()->group_id==1)
	{
		$possible_groups=Db::i()->selectCol("SELECT group_id AS ARRAY_KEY, group_name FROM ?_groups  WHERE group_id!=-1 ORDER BY group_name");
	}
	else
	{
		$possible_groups=Db::i()->selectCol("SELECT group_id AS ARRAY_KEY, group_name FROM ?_groups WHERE group_id IN (?a) AND group_id!=? AND group_id!=-1 ORDER BY group_name", User::i()->groups, User::i()->group_id);
	}
	return $possible_groups;
}

//подсветка поисковых фраз
function highlight($word, $srchstr)
{
 if ($srchstr=="") return $word;
 if (!is_array($srchstr))
  $srchstr=explode(" ", preg_replace('/[\s]+/u',' ',trim($srchstr)));
	$stemmer = new Stem_Ru();
	foreach ($srchstr as $val)
	{
    $val=$stemmer->stem_word($val);
	 $word = preg_replace('/([а-яa-z0-9]*'.preg_quote($val, "/").'[а-яa-z0-9]*)/iu', '<span class="forum_hl">\\1</span>', $word);
	}
	return $word;
}

function refresh($text='', $url=false, $time=0){
	if (!$url) $url=$_SERVER['PHP_SELF'];
	if ($text || headers_sent()) echo    '<html><head><meta http-equiv="refresh" content="'.$time.';url='.htmlspecialchars($url).'" /></head><body><h1>'.$text.'</h1></body></html>';
	else header('Location:'.$url);
	exit();
}


/**
 * Перевод кирилицы в транслит
 *
 * @param string
 * @return string
 * @author Loki
 */
function translit($st)
{
	$rus_letters=array( 'ж',  'ц',  'ч', 'ш',  'щ',    'ь', 'ю',  'я',  'ї', 'є',
						'Ж',  'Ц',  'Ч', 'Ш',  'Щ',    'Ь', 'Ю',  'Я',  'Ї', 'Є',
						'а', 'б', 'в', 'г', 'д', 'е', 'ё', 'з', 'и', 'й', 'к', 'л', 'м', 'н', 'о', 'п', 'р', 'с', 'т', 'у', 'ф', 'х', 'ъ', 'ы', 'э',
						'А', 'Б', 'В', 'Г', 'Д', 'Е', 'Ё', 'З', 'И', 'Й', 'К', 'Л', 'М', 'Н', 'О', 'П', 'Р', 'С', 'Т', 'У', 'Ф', 'Х', 'Ъ', 'Ы', 'Э');
	$eng_letters=array(	'zh', 'ts', 'ch', 'sh', 'shch', '',  'yu', 'ya', 'i', 'ie',
						'ZH', 'TS', 'CH', 'SH', 'SHCH', '',  'YU', 'YA', 'I', 'IE',
						'a', 'b', 'v', 'g', 'd', 'e', 'e', 'z', 'i', 'i', 'k', 'l', 'm', 'n', 'o', 'p', 'r', 's', 't', 'u', 'f', 'h', '',  'y', 'e',
						'A', 'B', 'V', 'G', 'D', 'E', 'E', 'Z', 'I', 'I', 'K', 'L', 'M', 'N', 'O', 'P', 'R', 'S', 'T', 'U', 'F', 'H', '',  'Y', 'E');
	$st=str_replace($rus_letters, $eng_letters, $st);

    return $st;
}
/**
 * Приведение url в съедобный вид. Поправил немного (akira)
 *
 * @param string
 * @return string
 * @author Loki
 */
 function convert_url($st)
 {
 	$st=mb_strtolower($st);
	$st=translit($st);
	if (mb_strpos($st, "/")!==0) $st="/".$st;
	$st=trim($st);
	$st=preg_replace('#[^a-z0-9/]+#u', '_', $st);
	$st = preg_replace('%/+%', '/', $st);
	if (strlen($st)>1) $st = preg_replace('%/$%i', '', $st);
	return $st;
 }
/** TODO используется в модуле фотоальбома. проверить нужна ли там и убить
 * Проверка url на сущ. в базе
 *
 * @param string
 * @return boolean
 * @author Akira
 */
 function check_url($path, $tree_id=false){
  	global $db;
  	return Db::i()->selectCell("SELECT count(*) FROM ?_tree WHERE path=? { AND tree_id != ? };",$path, ($tree_id ? $tree_id : DBSIMPLE_SKIP));
  }

/**
* Отдает xml feed. Пока реализован rss2.0
*
* @param array
* @param string
* @author Loki
*/
function feed($feed_data)
{
	$result=genereteFeed($feed_data);
	sendXmlHeaders();
	Tpl::i()->assign('_component', $result);
	LabVars::$template='blank.tpl';
}


function sendXmlHeaders()
{
	Header("Content-Type: application/xml; charset=utf-8;");	
}

function getServerName()
{
	$protocol=($_SERVER['SERVER_PORT']==443)?'https':'http';
	$port=(!in_array($_SERVER['SERVER_PORT'], array(80, 443)))?':'.$_SERVER['SERVER_PORT']:'';
	return $protocol.'://'.$_SERVER['SERVER_NAME'].$port;
}

function genereteFeed($feed_data)
{
	//тут формируем $xml

	$rss = new Rss($feed_data['title'],
					$feed_data['link'],
					$feed_data['description'],
					($feed_data['language']?$feed_data['language']:'ru-ru'),
					$feed_data['pubDate'],
					$feed_data['lastBuildDate'],
					$feed_data['managingEditor'],
					$feed_data['webMaster']);
	if (!isset($feed_data['allowed_tags']))
		$feed_data['allowed_tags']=array('<b>', '<i>', '<u>', '<p>', '<li>', '<br>', '<ul>', '<a>', '<img>', '<blockquote>');
		
	if(is_array($feed_data['feed']))
	{
		foreach ($feed_data['feed'] as $tmp)
		{
			$tmp['description']=strip_tags($tmp['description'], implode('', $feed_data['allowed_tags']));
			$tmp['description']=preg_replace('/(src|href)=("|\')?\//', "$1=$2".getServerName()."/", $tmp['description']);
			$rss->addItem(strip_tags($tmp['title']), $tmp['link'], $tmp['description'], $tmp['pubDate'], $tmp['guid']);
		}
	}
	return $rss->saveXML( );
}



/**
* Возвращает массив возможных начертаний логина
*
* @param string
* @return array
* @author Loki
*/
function possible_logins($login)
{
	$eng=array('a', '6', 'e', 'k', 'o', 'p', 'c', 'y', 'x', 'A', 'B', 'E', 'K', 'M', 'H', 'O', 'P', 'C', 'T', 'X');
	$rus=array('а', 'б', 'е', 'к', 'о', 'р', 'с', 'у', 'х', 'А', 'В', 'Е', 'К', 'М', 'Н', 'О', 'Р', 'С', 'Т', 'Х');
	$login=preg_replace('/\s+/', ' ', trim($login));
	$result[]=$login;
	$result[]=str_replace($eng, $rus, $login);
	$result[]=str_replace($rus, $eng, $login);
	return $result;
}

function rmdir_recurse($file)
{
	if (is_dir($file) && !is_link($file))
	{
		foreach(glob($file.'/*') as $sf)
		{
			if (!rmdir_recurse($sf)) return false;
		}
		return rmdir($file);
	}
	else
	{
		return unlink($file);
	}
}

function getbb($string, $mode='')
{
	//класс для работы с bbcode
	$mode=explode(',', str_replace(' ', '', $mode));
	
	$bb=new bbcode();
	if (count($mode)) foreach($mode as $action)
	{
		switch($action)
		{
			case('nolinks'):
				// Отключаем автоматические ссылки:
				$bb->autolinks = false;
				//отключаем запрещенные теги
				unset($bb->tags['url']);
				unset($bb->tags['img']);
				//отключаем смайлики
				$bb->mnemonics=array();
			break;
			
			case('nourls'):
				// Отключаем автоматические ссылки:
				$bb->autolinks = false;
				//отключаем запрещенные теги
				unset($bb->tags['url']);
				unset($bb->tags['img']);
			break;
		}
	}
	$bb->parse($string);
	return $bb->get_html();
}

function bbcode_smiles_js($x=4, $y=4)
{
	//класс для работы с bbcode
	return bbcode::smiles_js($x, $y);
}

function get_formatted_filesize($fs)
{
	if ($fs >= 1073741824)
	$fs = round($fs / 1073741824, 2) . " "._m("Гб");
	elseif ($fs >= 1048576)
	$fs = round($fs / 1048576, 2) . " "._m("Мб");
	elseif ($fs >= 1024)
	$fs = round($fs / 1024, 2) . " "._m("Кб");
	else
	$fs = $fs . " "._m("б");
	return $fs;
}

function isNotBot($key='')
{
	if ($key) exit();
	return true;
}

/**
 * Function cuts string with the HTML tags by the specified number of chars and strips empty HTML tags from the output.
 *
 * @param string $txt text to cut
 * @param int $len number of chars to keep in the resulting string
 * @param string $delim optional string of the stop-chars, used to split the text when limit reached in the middle of the current word
 * @return string
 * @author Ilya Lebedev
 */
function breakword ($txt,$len,$delim='\s;,.!?:#') {
    $txt = preg_replace_callback ("#(</?[a-z]+(?:>|\s[^>]*>)|[^<]+)#mi"
                                  ,create_function('$a'
                                                  ,'static $len = '.$len.';'
                                                  .'$len1 = $len-1;'
                                                  .'$delim = \''.str_replace("#","\\#",$delim).'\';'
                                                  .'if ($len<=0) return "";'
                                                  .'if ("<" == $a[0]{0}) return $a[0];'
                                                  .'$res = preg_split("#(.{0,$len1}+(?=[$delim]))|(.{0,$len}[^$delim]*)#ms",$a[0],2,PREG_SPLIT_DELIM_CAPTURE);'
                                                  .'if ($res[1]) { $len -= strlen($res[1])+1; $res = $res[1];}'
                                                  .'else         { $len -= strlen($res[2]); $res = $res[2];}'
                                                 // .'$res = rtrim($res);/*preg_replace("#[$delim]+$#m","",$res);*/'
                                                  .'return $res;')
                                  ,$txt);
     while (preg_match("#<([a-z]+)[^>]*>\s*</\\1>#mi",$txt)) {
         $txt = preg_replace("#<([a-z]+)[^>]*>\s*</\\1>#mi","",$txt);
     }
     return $txt;
}

function getFreq($time)
{
	$changefreq='always';
	if($time<time()-3600) $changefreq='hourly';
	if($time<time()-3600*24) $changefreq='daily';
	if($time<time()-3600*24*7) $changefreq='weekly';
	if($time<time()-3600*24*30) $changefreq='monthly';
	if($time<time()-3600*24*365) $changefreq='yearly';
	return $changefreq;
}

function canonicalPath($path)
{
	// resolve relative path 
	if (!preg_match('/^([\/\\\\]|[a-zA-Z]:[\/\\\\])/', $path)) { 
	    $_path = rtrim($cwd, '/\\') . DS . ltrim($path, '/\\'); 
	} else { 
	    $_path = $path; 
	} 
	// don't we all just love windows? 
	$_path = str_replace( '\\', '/', $_path ); 
	// resolve simples 
	$_path = preg_replace('#(/\./(\./)*)|/{2,}#', '/', $_path); 
	// resolve parents 
	while (true) {
	    $_parent = strpos($_path, '/../'); 
	    if ($_parent === false) { 
		break;
	    } else if ($_parent === 0) { 
		$_path = substr($_path, 3); 
		break;
	    } 
	    $_pos = strrpos($_path, '/', $_parent - strlen($_path) -1); 
	    if ($_pos === false) {
		// don't we all just love windows? 
		$_pos = $_parent; 
	    }
	    $_path = substr_replace($_path, '', $_pos, $_parent + 3 - $_pos); 
	} 
	if (DS != '/') {
	    // don't we all just love windows? 
	    $_path = str_replace( '/', '\\', $_path ); 
	}
	// this is only required for directories 
	$_path = rtrim($_path, '/\\');
	return $_path;
}

function getModulePath($module)
{
	return LabCMS::i()->getModuleNodePath($module);
}

function addBreadcrumb($name=false, $path=false, $html=false)
{
	$result=array();
	$result['path']=$path;
	if ($html) $result['name_html']=$name;
	else $result['name']=$name;
	LabVars::$breadcrumb[]=$result;
}

function real_json_encode($a=false)
{
	if (is_null($a)) return 'null';
	if ($a === false) return 'false';
	if ($a === true) return 'true';
	if (is_scalar($a))
	{
		if (is_float($a))
		{
			// Always use "." for floats.
			return floatval(str_replace(",", ".", strval($a)));
		}
		
		if (is_string($a))
		{
			static $jsonReplaces = array(array("\\", "/", "\n", "\t", "\r", "\b", "\f", '"'), array('\\\\', '\\/', '\\n', '\\t', '\\r', '\\b', '\\f', '\"'));
			return '"' . str_replace($jsonReplaces[0], $jsonReplaces[1], $a) . '"';
		}
		else
			return $a;
	}
	$isList = true;
	for ($i = 0, reset($a); $i < count($a); $i++, next($a))
	{
		if (key($a) !== $i)
		{
			$isList = false;
			break;
		}
	}
	$result = array();
	if ($isList)
	{
		foreach ($a as $v) $result[] = real_json_encode($v);
		return '[' . join(',', $result) . ']';
	}
	else
	{
		foreach ($a as $k => $v) $result[] = real_json_encode($k).':'.real_json_encode($v);
		return '{' . join(',', $result) . '}';
	}
}