<?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
*/
	if (empty(LabConfig::$mcfg['activate']) || !empty(LabConfig::$cfg['debug_mode'])) return;
	
	LabVars::$vars['js_css_files']=LAB_PATH_DATA.'/external';

	//массив для кэширования времени файла
	$times=array();
	
	if (LabConfig::$mcfg['concat_type']==1)
	{
		foreach (LabCMS::i()->getSkinJS() as $item)
		{
			$js[dirname($item)][]=$item;
		}
		if (LabCMS::i()->getSkinJS()) foreach($js as $item)
		{
			LabVars::$js[]=GetCompressedFile($item, 'js');
		}
		foreach (LabCMS::i()->getSkinCSS() as $item)
		{
			$css[dirname($item['path'])][]=$item['path'];
		}
		if (LabCMS::i()->getSkinCSS()) foreach($css as $item)
		{
			LabVars::$css[]=array('path'=>GetCompressedFile($item, 'css'), 'media'=>'all');
		}
	}
	elseif(LabConfig::$mcfg['concat_type']==2)
	{
		LabVars::$js=array(GetCompressedFile(LabCMS::i()->getSkinJS(), 'js'));
		$css=array();
		foreach(LabCMS::i()->getSkinCSS() as $item)
		{
			$css[]=$item['path'];
		}
		LabVars::$css=array(array('path'=>GetCompressedFile($css, 'css'), 'media'=>'all'));
	}

	function GetCompressedFile($arr, $type)
	{
		$file_name=md5(implode('', $arr).(($type=='js')?LabConfig::$mcfg['compress_js']:LabConfig::$mcfg['compress_css']));
		if (file_exists(LabVars::$vars['js_css_files'].'/'.$file_name.'.'.$type))
		{
			if (LabConfig::$mcfg['check'])
			{
				if (!IsAllFilesOlder($arr, $file_name.'.'.$type)) CreateCompressedFile($arr, $type, $file_name);
			}
		}
		else
		{
			CreateCompressedFile($arr, $type, $file_name);
		}
		return str_replace(LAB_PATH_ROOT, '', LabVars::$vars['js_css_files']).'/'.$file_name.'.'.$type.'?'.LabConfig::$cfg['lastCacheReset'];
	}
	
	function CreateCompressedFile($arr, $type, $name)
	{
		$data=ConcatAllFiles($arr, $type);
		if (!is_dir(LabVars::$vars['js_css_files'])) mkdir(LabVars::$vars['js_css_files'], 0777);
		if (file_put_contents(LabVars::$vars['js_css_files'].'/'.$name.'.'.$type, $data)) return true;
		return false;
	}
	
	function ConcatAllFiles($arr, $type)
	{
		$data='';
		foreach($arr as $file)
		{
			if ($type=='css') $data.='@media '.basename($file, '.css').'{'.resolve_css_imports(LAB_PATH_ROOT.$file).'}';
			if ($type=='js') $data.=file_get_contents(LAB_PATH_ROOT.$file);
		}
		
		$data=str_replace("\r\n", "\n", $data);
		
		if ($type=='js')
		{
			include_once dirname(__FILE__)."/class.JavaScriptPacker.php";
			$compressor = new JavaScriptPacker($data, (LabConfig::$mcfg['compress_js'])?'Normal':'None', true, false);
			$data = $compressor->pack();
		}
		elseif($type=='css' && LabConfig::$mcfg['compress_css'])
		{
			include_once dirname(__FILE__)."/class.CompressionAutomate.php";
			$compressor=new CompressionAutomate($data);
			$data=$compressor->GetData();
		}
		
		return $data;
	}
	
	function IsAllFilesOlder($files, $file)
	{
		foreach($files as $item)
		{
			if (getFileTime(LAB_PATH_ROOT.$item)>getFileTime(LabVars::$vars['js_css_files'].'/'.$file)) return false;
		}
		return true;
	}

	function getFileTime($file)
	{
		global $times;
		$key=md5($file);
		if (!isset($times[$key]))
		{
			$times[$key]=filemtime($file);
		}
		return $times[$key];
	}
	
	function resolve_css_imports($src)
	{
		$content=getFileWithReplaceRelativePath($src);
		/* удаляем из первоначального содержимого @import внутри комментариев */
		$content = preg_replace("!/\*\s*@import.*?\*/!is", "", $content);
		/* выбираем все @import */
		preg_match_all('/@import\s*(url)?\s*\(?([^;]+?)\)?;/i', $content, $imports, PREG_SET_ORDER);
		if (is_array($imports))
		{
			foreach ($imports as $import)
			{
				$src = false;
				/* очищаем найденный путь к файлу от пробелов и кавычек */
				if (isset($import[2]))
				{
					$src = $import[2];
					$src = trim($src, '\'" ');
				}
				if ($src)
				{
					/* запускаем рекурсию для обнаруженного файла, чтобы разрешить все @import	уже внутри него */
					$content = str_replace($import[0], resolve_css_imports(LAB_PATH_ROOT.$src), $content);
					/* изменяем все пути для CSS-изображений и ресурсов (относительно заданного	файла) на абсолютные (относительн корня документа) */
					//$content = $this->resolve_relative_paths($src, $content);
				}
			}
		}
		return $content;
	}
	
	function getFileWithReplaceRelativePath($src)
	{
		$content = file_get_contents($src);
		$base=str_replace(LAB_PATH_ROOT,'',dirname($src)).'/';
		preg_match_all('/url\s*\(\s*([\'|"]?)(.+?)\1\s*\)/', $content, $strings);
		if(count($strings[2]))
			foreach($strings[2] as $key=>$url)
			{
				if (substr($url, 0, 1)=='/') continue;
				if (substr($url, 0, 7)=='http://') continue;
				if (substr($url, 0, 8)=='https://') continue;
				if (substr($url, 0, 5)=='data:') continue;
				$new_url=str_replace($url, $base.$url,$strings[0][$key]);
				$content=str_replace($strings[0][$key], $new_url, $content);
			}
		return $content;
	}