Index: branches/5.0.x/core/units/helpers/sections_helper.php
===================================================================
--- branches/5.0.x/core/units/helpers/sections_helper.php	(revision 13571)
+++ branches/5.0.x/core/units/helpers/sections_helper.php	(revision 13572)
@@ -1,306 +1,358 @@
 <?php
 /**
 * @version	$Id$
 * @package	In-Portal
 * @copyright	Copyright (C) 1997 - 2009 Intechnic. All rights reserved.
 * @license      GNU/GPL
 * In-Portal is Open Source software.
 * This means that this software may have been modified pursuant
 * the GNU General Public License, and as distributed it includes
 * or is derivative of works licensed under the GNU General Public License
 * or other free or open source software licenses.
 * See http://www.in-portal.org/license for copyright notices and details.
 */
 
 	defined('FULL_PATH') or die('restricted access!');
 
 	/**
 	 * Processes sections info from the configs
 	 *
 	 */
 	class kSectionsHelper extends kHelper {
 
 		/**
 		 * Holds information about all sections
 		 *
 		 * @var Array
 		 */
 		var $Tree = Array();
 
 		/**
+		 * Checks, that we are in debug mode
+		 *
+		 * @var bool
+		 */
+		var $debugMode = false;
+
+		/**
+		 * Checks, that we are in super admin mode
+		 *
+		 * @var bool
+		 */
+		var $superAdminMode = false;
+
+		/**
 		 * Set's prefix and special
 		 *
 		 * @param string $prefix
 		 * @param string $special
 		 * @access public
 		 */
 		function Init($prefix, $special, $event_params = null)
 		{
 			parent::Init($prefix, $special, $event_params);
+
+			$this->debugMode = $this->Application->isDebugMode();
+			$this->superAdminMode = $this->Application->RecallVar('super_admin');
+
 			$this->BuildTree();
 		}
 
 		/**
 		 * Builds xml for tree in left frame in admin
 		 *
 		 * @param Array $params
 		 */
 		function BuildTree()
 		{
 			if (!isset($this->Application->Memcached) || !($data = $this->Application->Memcached->get('master:sections_parsed'))) {
 				$data = $this->Conn->GetOne('SELECT Data FROM '.TABLE_PREFIX.'Cache WHERE VarName = "sections_parsed"');
 			}
 			if ($data) {
 				$this->Tree = unserialize($data);
 				return ;
 			}
 
 			if (!(defined('IS_INSTALL') && IS_INSTALL)) {
 				// don't reread all configs during install, because they are reread on every install step
 				$this->Application->UnitConfigReader->ReReadConfigs();
 			}
 
 			$this->Tree = Array ();
 
 			// 1. build base tree (don't update parent with children list yet)
 
 			// 1.1. process prefixes without priority
 			$prioritized_prefixes = Array ();
 			$prefixes = array_keys($this->Application->UnitConfigReader->configData);
 
 			foreach ($prefixes as $prefix) {
 				$config =& $this->Application->UnitConfigReader->configData[$prefix];
 
 				if (array_key_exists('ConfigPriority', $config)) {
 					$prioritized_prefixes[$prefix] = $config['ConfigPriority'];
 					continue;
 				}
 				$this->_processPrefixSections($prefix);
 			}
 
 			// 2. process prefixes with priority
 			asort($prioritized_prefixes);
 			foreach ($prioritized_prefixes as $prefix => $priority) {
 				$this->_processPrefixSections($prefix);
 			}
 
 			// 2. apply section ajustments
 			foreach ($prefixes as $prefix) {
 				$config =& $this->Application->UnitConfigReader->configData[$prefix];
 				$section_ajustments = getArrayValue($config, 'SectionAdjustments');
 				if (!$section_ajustments) continue;
 
 				foreach ($section_ajustments as $section_name => $ajustment_params) {
 					if (is_array($ajustment_params)) {
 						if (!array_key_exists($section_name, $this->Tree)) {
 							// don't process ajustments for non-existing sections
 							continue;
 						}
 
 						$this->Tree[$section_name] = array_merge_recursive2($this->Tree[$section_name], $ajustment_params);
 					}
 					else {
 						// then remove section
 						unset($this->Tree[$section_name]);
 					}
 				}
 			}
 
 			// 3.
 			foreach ($this->Tree as $section_name => $section_params) {
 				// 3.1. update parent -> children references
 				$parent_section = $section_params['parent'];
 				$section_order = "{$section_params['priority']}";
 
 				if (!isset($parent_section)) {
 					// don't process parent section of "in-portal:root" section
 					continue;
 				}
 
 				if (!array_key_exists('children', $this->Tree[$parent_section])) {
 					$this->Tree[$parent_section]['children'] = Array ();
 				}
 
 				if (array_key_exists($section_order, $this->Tree[$parent_section]['children'])) {
 					trigger_error(
 						'Section "<strong>' . $section_name . '</strong>" has replaced section "<strong>' .
 						$this->Tree[$parent_section]['children'][$section_order] .
 						'</strong>" (parent section: "<strong>' . $parent_section .
 						'</strong>"; duplicate priority: <strong>' . $section_order . '</strong>)',
 						E_USER_WARNING
 					);
 				}
 
 				$this->Tree[$parent_section]['children'][$section_order] = $section_name;
 
 				if ($section_params['type'] == stTAB) {
 					// if this is tab, then mark parent section as TabOnly
 					$this->Tree[$parent_section]['tabs_only'] = true;
 				}
 
 				// 3.2. process icons here, because they also can be ajusted
 				if (isset($section_params['icon']) && preg_match('/([^:]+):(.*)/', $section_params['icon'], $regs)) {
 					$this->Tree[$section_name]['icon'] = $regs[2];
 					$this->Tree[$section_name]['icon_module'] = $regs[1]; // set "icon_module" used in "combined_header" block
 					$module_folder = trim( $this->Application->findModule('Name', $regs[1], 'Path'), '/');
 					if ($module_folder == '') {
 						$module_folder = 'core';
 					}
 				}
 				else {
 					$module_folder = $this->Application->getUnitOption($section_params['SectionPrefix'], 'ModuleFolder');
 					if (!array_key_exists('icon_module', $section_params)) {
 						$this->Tree[$section_name]['icon_module'] = $module_folder; // set "icon_module" used in "combined_header" block
 					}
 				}
 
 				// this is to display HELP icon instead of missing one.. can be replaced with some other icon to draw attention
 				$icon_file = $module_folder.'/admin_templates/img/icons/icon24_'.$this->Tree[$section_name]['icon'];
 
 				/*$core_file = FULL_PATH.'/core/admin_templates/img/icons/icon24_' . $this->Tree[$section_name]['icon'].'.gif';
 				if ($module_folder != 'core' && file_exists($core_file) && file_exists(FULL_PATH.'/'.$icon_file.'.gif')) {
 					if (crc32(file_get_contents($core_file)) == crc32(file_get_contents(FULL_PATH.'/'.$icon_file.'.gif'))) {
 						trigger_error('Section "<strong>' . $section_name . '</strong>" uses icon copy from "Core" module', E_USER_NOTICE);
 					}
 				}*/
 
 //				if (!file_exists(FULL_PATH.'/'.$icon_file.'.png')) {
 //					$this->Tree[$section_name]['icon'] = 'help';
 //					$this->Tree[$section_name]['icon_module'] = 'core';
 //				}
 			}
 			$this->Application->HandleEvent( new kEvent('adm:OnAfterBuildTree') );
 
 			if (isset($this->Application->Memcached)) {
 				$this->Application->Memcached->set('master:sections_parsed',serialize($this->Tree), 0, 0);
 				return;
 			}
 
 			$this->Conn->Query('REPLACE '.TABLE_PREFIX.'Cache (VarName, Data, Cached) VALUES ("sections_parsed", '.$this->Conn->qstr(serialize($this->Tree)).', '.adodb_mktime().')');
 		}
 
 		function _processPrefixSections($prefix)
 		{
 			$config =& $this->Application->UnitConfigReader->configData[$prefix];
 			$sections = getArrayValue($config, 'Sections');
 			if (!$sections) {
 				return ;
 			}
 
 //			echo 'Prefix: ['.$prefix.'] has ['.count($sections).'] sections<br />';
 
 			foreach ($sections as $section_name => $section_params) {
 				// we could also skip not allowed sections here in future
 				if ( isset($section_params['SectionPrefix']) ) {
 					$section_prefix = $section_params['SectionPrefix'];
 				}
 				elseif ( $this->Application->getUnitOption($prefix, 'SectionPrefix') ) {
 					$section_prefix = $this->Application->getUnitOption($prefix, 'SectionPrefix');
 				}
 				else {
 					$section_prefix = $prefix;
 				}
 				$section_params['SectionPrefix'] = $section_prefix;
 				$section_params['url']['m_opener'] = 'r';
 				$section_params['url']['no_pass_through'] = 1;
 				$pass_section = getArrayValue($section_params, 'url', 'pass_section');
 
 				if ($pass_section) {
 					unset($section_params['url']['pass_section']);
 					$section_params['url']['section'] = $section_name;
 					if (!isset($section_params['url']['module'])) {
 						$module_name = $this->Application->findModule('Path', $config['ModuleFolder'].'/', 'Name');
 						$section_params['url']['module'] = $module_name;
 					}
 				}
 
 				if (!isset($section_params['url']['t'])) {
 					$section_params['url']['t'] = 'index';
 				}
 
 				if (!isset($section_params['onclick'])) {
 					$section_params['onclick'] = 'checkEditMode()';
 				}
 
 				if (!isset($section_params['container'])) {
 					$section_params['container'] = 0; // for js tree printing to xml
 				}
 
 				$current_data = isset($this->Tree[$section_name]) ? $this->Tree[$section_name] : Array();
 
 				if ($current_data) {
 					trigger_error('Section "<strong>' . $section_name . '</strong>" declaration (originally defined in "<strong>' . $current_data['SectionPrefix'] . '</strong>") was overwriten from "<strong>' . $prefix . '</strong>"', E_USER_WARNING);
 				}
 
 				$this->Tree[$section_name] = array_merge_recursive2($current_data, $section_params);
 			}
 		}
 
 		/**
 		 * Returns details information about section
 		 *
 		 * @param string $section_name
 		 * @return Array
 		 */
 		function &getSectionData($section_name)
 		{
 			if (isset($this->Tree[$section_name])) {
 				$ret =& $this->Tree[$section_name];
 			}
 			else {
 				$ret = Array();
 			}
 			return $ret;
 		}
 
 		/**
 		 * Returns first child, that is not a folder
 		 *
 		 * @param string $section_name
 		 * @param Array $tree
 		 * @return stirng
 		 */
 		function getFirstChild($section_name, $check_permission = false)
 		{
 			$section_data =& $this->getSectionData($section_name);
 
 			$children = isset($section_data['children']) && $section_data['children'] ? $section_data['children'] : false;
 			if ($children) {
 				// get 1st child
 				ksort($children, SORT_NUMERIC);
 				foreach ($children as $child_priority => $child_section) {
-					$section_data =& $this->getSectionData($child_section);
-
-					$perm_section = $this->getPermSection($child_section);
-					$perm_status = $check_permission ? $this->Application->CheckPermission($perm_section.'.view') : true;
-					if ((isset($section_data['show_mode']) && $section_data['show_mode']) || !$perm_status) {
+					if (!$this->sectionVisible($child_section, $check_permission)) {
 						continue;
 					}
 
 					break;
 				}
 
 				return $this->getFirstChild($child_section, $check_permission);
 			}
 
 			return $section_name;
 		}
 
 		/**
+		 * Checks if given section is visible by it's definition and optionally by user permission
+		 *
+		 * @param string $section_name
+		 * @param bool $check_permission
+		 * @return bool
+		 */
+		function sectionVisible($section_name, $check_permission = false)
+		{
+			$section_data =& $this->getSectionData($section_name);
+
+			if (isset($section_data['show_mode']) && is_numeric($section_data['show_mode'])) {
+				$show_mode = $section_data['show_mode'];
+
+				// if super admin section -> show in super admin mode & debug mode
+				$show_section = $show_mode == smNORMAL || ((($show_mode & smSUPER_ADMIN) == smSUPER_ADMIN) && ($this->superAdminMode || $this->debugMode));
+
+				if (!$show_section) {
+					// if section is in debug mode only && debug mode -> show
+					$show_section = (($show_mode & smDEBUG) == smDEBUG) && $this->debugMode;
+				}
+
+				if (!$show_section) {
+					// visibility by section definition
+					return false;
+				}
+			}
+
+			// visibility by section permission
+			if ($check_permission) {
+				$perm_section = $this->getPermSection($section_name);
+
+				return $this->Application->CheckPermission($perm_section.'.view');
+			}
+
+			return true;
+		}
+
+		/**
 		 * Returns section for permission checking based on given section
 		 *
 		 * @param string $section_name
 		 * @return string
 		 */
 		function getPermSection($section_name)
 		{
 			$ret = $section_name;
 			$section_data =& $this->getSectionData($section_name);
 
 			if ($section_data && isset($section_data['perm_prefix'])) {
 				// this section uses other section permissions
 				$ret = $this->Application->getUnitOption($section_data['perm_prefix'].'.main', 'PermSection');
 			}
 			return $ret;
 		}
 	}
\ No newline at end of file
Index: branches/5.0.x/core/units/admin/admin_tag_processor.php
===================================================================
--- branches/5.0.x/core/units/admin/admin_tag_processor.php	(revision 13571)
+++ branches/5.0.x/core/units/admin/admin_tag_processor.php	(revision 13572)
@@ -1,1142 +1,1118 @@
 <?php
 /**
 * @version	$Id$
 * @package	In-Portal
 * @copyright	Copyright (C) 1997 - 2009 Intechnic. All rights reserved.
 * @license      GNU/GPL
 * In-Portal is Open Source software.
 * This means that this software may have been modified pursuant
 * the GNU General Public License, and as distributed it includes
 * or is derivative of works licensed under the GNU General Public License
 * or other free or open source software licenses.
 * See http://www.in-portal.org/license for copyright notices and details.
 */
 
 	defined('FULL_PATH') or die('restricted access!');
 
 	class AdminTagProcessor extends kDBTagProcessor {
 
 		function SetConst($params)
 		{
 			$name = $this->SelectParam($params, 'name,const');
 			safeDefine($name, $params['value']);
 		}
 
 		/**
 		 * Allows to execute js script after the page is fully loaded
 		 *
 		 * @param Array $params
 		 * @return string
 		 */
 		function AfterScript($params)
 		{
 			$after_script = $this->Application->GetVar('after_script');
 			if ($after_script) {
 				return '<script type="text/javascript">'.$after_script.'</script>';
 			}
 			return '';
 		}
 
 		/**
 		 * Returns section title with #section# keyword replaced with current section
 		 *
 		 * @param Array $params
 		 * @return string
 		 */
 		function GetSectionTitle($params)
 		{
 			if (array_key_exists('default', $params)) {
 				return $params['default'];
 			}
 
 			return $this->Application->Phrase( replaceModuleSection($params['phrase']) );
 		}
 
 		/**
 		 * Returns section icon with #section# keyword replaced with current section
 		 *
 		 * @param Array $params
 		 * @return string
 		 */
 		function GetSectionIcon($params)
 		{
 			return replaceModuleSection($params['icon']);
 		}
 
 		/**
 		 * Returns version of module by name
 		 *
 		 * @param Array $params
 		 * @return string
 		 */
 		function ModuleVersion($params)
 		{
 			return $this->Application->findModule('Name', $params['module'], 'Version');
 		}
 
 		/**
 		 * Used in table form section drawing
 		 *
 		 * @param Array $params
 		 * @return string
 		 */
 		function DrawTree($params)
 		{
 			static $deep_level = 0;
 
 			// when processings, then sort children by priority (key of children array)
 			$ret = '';
 			$section_name = $params['section_name'];
 			$params['name'] = $this->SelectParam($params, 'name,render_as,block');
 			$sections_helper =& $this->Application->recallObject('SectionsHelper');
+			/* @var $sections_helper kSectionsHelper */
+
 			$section_data =& $sections_helper->getSectionData($section_name);
 
 			$params['children_count'] = isset($section_data['children']) ? count($section_data['children']) : 0;
 			$params['deep_level'] = $deep_level++;
 			$template = $section_data['url']['t'];
 			unset($section_data['url']['t']);
 			$section_data['section_url'] = $this->Application->HREF($template, '', $section_data['url']);
 			$ret .= $this->Application->ParseBlock( array_merge_recursive2($params, $section_data) );
 			if (!isset($section_data['children'])) {
 				return $ret;
 			}
 
-			$debug_mode = $this->Application->isDebugMode();
-			$super_admin_mode = $this->Application->RecallVar('super_admin');
-
 			ksort($section_data['children'], SORT_NUMERIC);
 			foreach ($section_data['children'] as $section_name) {
-				$section_data =& $sections_helper->getSectionData($section_name);
-
-				if (isset($section_data['show_mode']) && is_numeric($section_data['show_mode'])) {
-					$show_mode = $section_data['show_mode'];
-					// if super admin section -> show in super admin mode & debug mode
-					$show_section = $show_mode == smNORMAL || ((($show_mode & smSUPER_ADMIN) == smSUPER_ADMIN) && ($super_admin_mode || $debug_mode));
-					if (!$show_section) {
-						// if section is in debug mode only && debug mode -> show
-						$show_section = (($show_mode & smDEBUG) == smDEBUG) && $debug_mode;
-					}
-					if (!$show_section) {
-						continue;
-					}
+				if (!$sections_helper->sectionVisible($section_name)) {
+					continue;
 				}
 
 				$params['section_name'] = $section_name;
 				$ret .= $this->DrawTree($params);
 				$deep_level--;
 			}
 
 
 			return $ret;
 		}
 
 
 		function SectionInfo($params)
 		{
 			$section = $params['section'];
 			if ($section == '#session#') {
 				$section = $this->Application->RecallVar('section');
 			}
 
 			$sections_helper =& $this->Application->recallObject('SectionsHelper');
 			/* @var $sections_helper kSectionsHelper */
 
 			$section_data =& $sections_helper->getSectionData($section);
 			if (!$section_data) {
 				trigger_error('Use of undefined section "<strong>' . $section . '</strong>" in "<strong>' . __METHOD__ . '</strong>"', E_USER_ERROR);
 				return '';
 			}
 
 
 			if (array_key_exists('parent', $params) && $params['parent']) {
 				do {
 					$section = $section_data['parent'];
 					$section_data =& $sections_helper->getSectionData($section);
 				} while (array_key_exists('use_parent_header', $section_data) && $section_data['use_parent_header']);
 			}
 
 			$info = $params['info'];
 			switch ($info) {
 				case 'module_path':
 					if (isset($params['module']) && $params['module']) {
 						$module = $params['module'];
 					}
 					elseif (isset($section_data['icon_module'])) {
 						$module = $section_data['icon_module'];
 					}
 					else {
 						$module = '#session#';
 					}
 					$res = $this->ModulePath(array('module' => $module));
 					break;
 
 				case 'perm_section':
 					$res = $sections_helper->getPermSection($section);
 					break;
 
 				case 'label':
 					$res = $section_data['label'];
 					if ($section != 'in-portal:root') {
 						// don't translate label for top section, because it's already translated
 						$no_editing = array_key_exists('no_editing', $params) ? $params['no_editing'] : false;
 
 						$res = $this->Application->Phrase($res, !$no_editing);
 					}
 					break;
 
 				default:
 					$res = $section_data[$info];
 					break;
 			}
 
 			if (array_key_exists('as_label', $params) && $params['as_label']) {
 				$res = $this->Application->Phrase($res);
 			}
 
 			return $res;
 		}
 
 
 		function PrintSection($params)
 		{
 			$section_name = $params['section_name'];
 			if ($section_name == '#session#') {
 				$section_name = $this->Application->RecallVar('section');
 			}
 
 			$sections_helper =& $this->Application->recallObject('SectionsHelper');
 			/* @var $sections_helper kSectionsHelper */
 
 			if (isset($params['use_first_child']) && $params['use_first_child']) {
 				$section_name = $sections_helper->getFirstChild($section_name, true);
 			}
 
 			$section_data =& $sections_helper->getSectionData($section_name);
 
 			$params['name'] = $this->SelectParam($params, 'name,render_as,block');
 			$params['section_name'] = $section_name;
 
 			$template = $section_data['url']['t'];
 			unset($section_data['url']['t']);
 
 			$section_data['section_url'] = $this->Application->HREF($template, '', $section_data['url']);
 			$ret = $this->Application->ParseBlock( array_merge_recursive2($params, $section_data) );
 
 			return $ret;
 		}
 
 		/**
 		 * Used in XML drawing for tree
 		 *
 		 * @param Array $params
 		 * @return string
 		 */
 		function PrintSections($params)
 		{
 			// when processings, then sort children by priority (key of children array)
 			$ret = '';
 			$section_name = $params['section_name'];
 			if ($section_name == '#session#') {
 				$section_name = $this->Application->RecallVar('section');
 			}
 
 			$sections_helper =& $this->Application->recallObject('SectionsHelper');
 			/* @var $sections_helper kSectionsHelper */
 
 			$section_data =& $sections_helper->getSectionData($section_name);
 
 			$params['name'] = $this->SelectParam($params, 'name,render_as,block');
 			if (!isset($section_data['children'])) {
 				return '';
 			}
 
-			$debug_mode = $this->Application->isDebugMode();
-			$super_admin_mode = $this->Application->RecallVar('super_admin');
-
 			ksort($section_data['children'], SORT_NUMERIC);
 			foreach ($section_data['children'] as $section_name) {
 				$params['section_name'] = $section_name;
 				$section_data =& $sections_helper->getSectionData($section_name);
 
-				if (isset($section_data['show_mode']) && is_numeric($section_data['show_mode'])) {
-					$show_mode = $section_data['show_mode'];
-					// if super admin section -> show in super admin mode & debug mode
-					$show_section = $show_mode == smNORMAL || ((($show_mode & smSUPER_ADMIN) == smSUPER_ADMIN) && ($super_admin_mode || $debug_mode));
-					if (!$show_section) {
-						// if section is in debug mode only && debug mode -> show
-						$show_section = (($show_mode & smDEBUG) == smDEBUG) && $debug_mode;
-					}
-					if (!$show_section) {
-						continue;
-					}
+				if (!$sections_helper->sectionVisible($section_name)) {
+					continue;
 				}
 
 				if (isset($section_data['tabs_only']) && $section_data['tabs_only']) {
 					$perm_status = false;
 					$folder_label = $section_data['label'];
 					ksort($section_data['children'], SORT_NUMERIC);
 					foreach ($section_data['children'] as $priority => $section_name) {
 						// if only tabs in this section & none of them have permission, then skip section too
 
 						$section_name = $sections_helper->getPermSection($section_name);
 						$perm_status = $this->Application->CheckPermission($section_name.'.view', 1);
 						if ($perm_status) {
 							break;
 						}
 					}
 					if (!$perm_status) {
 						// no permission for all tabs -> don't display tree node either
 						continue;
 					}
 
 					$params['section_name'] = $section_name;
 					$section_data =& $sections_helper->getSectionData($section_name);
 					$section_data['label'] = $folder_label; // use folder label in tree
 					$section_data['is_tab'] = 1;
 				}
 				else  {
 					$section_name = $sections_helper->getPermSection($section_name);
 					if (!$this->Application->CheckPermission($section_name.'.view', 1)) continue;
 				}
 
 				$params['children_count'] = isset($section_data['children']) ? count($section_data['children']) : 0;
 
 				// remove template, so it doesn't appear as additional parameter in url
 				$template = $section_data['url']['t'];
 				unset($section_data['url']['t']);
 
 				$section_data['section_url'] = $this->Application->HREF($template, '', $section_data['url']);
 
 				$late_load = getArrayValue($section_data, 'late_load');
 				if ($late_load) {
 					$t = $late_load['t'];
 					unset($late_load['t']);
 					$section_data['late_load'] = $this->Application->HREF($t, '', $late_load);
 					$params['children_count'] = 99;
 				}
 				else {
 					$section_data['late_load'] = '';
 				}
 
 				// restore template
 				$section_data['url']['t'] = $template;
 
 				$ret .= $this->Application->ParseBlock( array_merge_recursive2($params, $section_data) );
 				$params['section_name'] = $section_name;
 			}
 
 			return preg_replace("/\r\n|\n/", '', $ret);
 		}
 
 		function ListSectionPermissions($params)
 		{
 			$section_name = isset($params['section_name']) ? $params['section_name'] : $this->Application->GetVar('section_name');
 			$sections_helper =& $this->Application->recallObject('SectionsHelper');
 			$section_data =& $sections_helper->getSectionData($section_name);
 
 			$block_params = array_merge_recursive2($section_data, Array('name' => $params['render_as'], 'section_name' => $section_name));
 
 			$ret = '';
 			foreach ($section_data['permissions'] as $perm_name) {
 				if (preg_match('/^advanced:(.*)/', $perm_name) != $params['type']) continue;
 				$block_params['perm_name'] = $perm_name;
 				$ret .= $this->Application->ParseBlock($block_params);
 			}
 			return $ret;
 		}
 
 		function ModuleInclude($params)
 		{
 			foreach ($params as $param_name => $param_value) {
 				$params[$param_name] = replaceModuleSection($param_value);
 			}
 
 			$m =& $this->Application->recallObject('m_TagProcessor');
 			return $m->ModuleInclude($params);
 		}
 
 		function TodayDate($params)
 		{
 			return date($params['format']);
 		}
 
 		function TreeEditWarrning($params)
 		{
 			$ret = $this->Application->Phrase($params['label']);
 			$ret = str_replace(Array('&lt;', '&gt;', 'br/', 'br /', "\n", "\r"), Array('<', '>', 'br', 'br', '', ''), $ret);
 			if (getArrayValue($params, 'escape')) {
 				$ret = addslashes($ret);
 			}
 			$ret = str_replace('<br>', '\n', $ret);
 			return $ret;
 		}
 
 		/**
 		 * Draws section tabs using block name passed
 		 *
 		 * @param Array $params
 		 */
 		function ListTabs($params)
 		{
 			$sections_helper =& $this->Application->recallObject('SectionsHelper');
 			$section_data =& $sections_helper->getSectionData($params['section_name']);
 
 			$ret = '';
 			$block_params = Array('name' => $params['render_as']);
 			ksort($section_data['children'], SORT_NUMERIC);
 			foreach ($section_data['children'] as $priority => $section_name) {
 				if (!$this->Application->CheckPermission($section_name.'.view', 1)) continue;
 
 				$tab_data =& $sections_helper->getSectionData($section_name);
 				$block_params['t'] = $tab_data['url']['t'];
 				$block_params['title'] = $tab_data['label'];
 				$block_params['main_prefix'] = $section_data['SectionPrefix'];
 				$ret .= $this->Application->ParseBlock($block_params);
 			}
 
 
 			return $ret;
 		}
 
 		/**
 		 * Returns list of module item tabs that have view permission in current category
 		 *
 		 * @param Array $params
 		 */
 		function ListCatalogTabs($params)
 		{
 			$ret = '';
 			$special = isset($params['special']) ? $params['special'] : '';
 			$replace_main = isset($params['replace_m']) && $params['replace_m'];
 			$skip_prefixes = isset($params['skip_prefixes']) ? explode(',', $params['skip_prefixes']) : Array();
 
 			$block_params = $this->prepareTagParams($params);
 			$block_params['name'] = $params['render_as'];
 
 			foreach ($this->Application->ModuleInfo as $module_name => $module_info) {
 				$prefix = $module_info['Var'];
 
 				if ($prefix == 'm' && $replace_main) {
 					$prefix = 'c';
 				}
 
 				if (in_array($prefix, $skip_prefixes) || !$this->Application->prefixRegistred($prefix) || !$this->Application->getUnitOption($prefix, 'CatalogItem')) {
 					continue;
 				}
 
 				$icon = $this->Application->getUnitOption($prefix, 'CatalogTabIcon');
 				if (strpos($icon, ':') !== false) {
 					list ($icon_module, $icon) = explode(':', $icon, 2);
 				}
 				else {
 					$icon_module = 'core';
 				}
 
 				$label = $this->Application->getUnitOption($prefix, $params['title_property']);
 				$block_params['title'] = $label;
 				$block_params['prefix'] = $prefix;
 				$block_params['icon_module'] = $icon_module;
 				$block_params['icon'] = $icon;
 				$ret .= $this->Application->ParseBlock($block_params);
 			}
 			return $ret;
 		}
 
 		/**
 		 * Renders inividual catalog tab based on prefix and title_property given
 		 *
 		 * @param Array $params
 		 * @return string
 		 */
 		function CatalogTab($params)
 		{
 			$icon = $this->Application->getUnitOption($params['prefix'], 'CatalogTabIcon');
 			if (strpos($icon, ':') !== false) {
 				list ($icon_module, $icon) = explode(':', $icon, 2);
 			}
 			else {
 				$icon_module = 'core';
 			}
 
 			$block_params = $this->prepareTagParams($params);
 			$block_params['name'] = $params['render_as'];
 			$block_params['icon_module'] = $icon_module;
 			$block_params['icon'] = $icon;
 			$block_params['title'] = $this->Application->getUnitOption($params['prefix'], $params['title_property']);
 
 			return $this->Application->ParseBlock($block_params);
 		}
 
 		/**
 		 * Allows to construct link for opening any type of catalog item selector
 		 *
 		 * @param Array $params
 		 * @return string
 		 */
 		function SelectorLink($params)
 		{
 			$mode = 'catalog';
 			if (isset($params['mode'])) { // {catalog, advanced_view}
 				$mode = $params['mode'];
 				unset($params['mode']);
 			}
 
 			$params['t'] = 'catalog/item_selector/item_selector_'.$mode;
 			$params['m_cat_id'] = $this->Application->findModule('Name', 'Core', 'RootCat');
 
 			$default_params = Array('no_amp' => 1, 'pass' => 'all,'.$params['prefix']);
 			unset($params['prefix']);
 
 			$pass_through = Array();
 			if (isset($params['tabs_dependant'])) { // {yes, no}
 				$pass_through['td'] = $params['tabs_dependant'];
 				unset($params['tabs_dependant']);
 			}
 
 			if (isset($params['selection_mode'])) { // {single, multi}
 				$pass_through['tm'] = $params['selection_mode'];
 				unset($params['selection_mode']);
 			}
 
 			if (isset($params['tab_prefixes'])) { // {all, none, <comma separated prefix list>}
 				$pass_through['tp'] = $params['tab_prefixes'];
 				unset($params['tab_prefixes']);
 			}
 
 			if ($pass_through) {
 				// add pass_through to selector url if any
 				$params['pass_through'] = implode(',', array_keys($pass_through));
 				$params = array_merge_recursive2($params, $pass_through);
 			}
 
 			// user can override default parameters (except pass_through of course)
 			$params = array_merge_recursive2($default_params, $params);
 
 			$main_processor =& $this->Application->recallObject('m_TagProcessor');
 	    	return $main_processor->T($params);
 		}
 
 		function TimeFrame($params)
 		{
 			$w = adodb_date('w');
 			$m = adodb_date('m');
 			$y = adodb_date('Y');
 			//FirstDayOfWeek is 0 for Sunday and 1 for Monday
 			$fdow = $this->Application->ConfigValue('FirstDayOfWeek');
 			if ($fdow && $w == 0) $w = 7;
 			$today_start = adodb_mktime(0,0,0,adodb_date('m'),adodb_date('d'),$y);
 			$first_day_of_this_week = $today_start - ($w - $fdow)*86400;
 			$first_day_of_this_month = adodb_mktime(0,0,0,$m,1,$y);
 			$this_quater = ceil($m/3);
 			$this_quater_start = adodb_mktime(0,0,0,$this_quater*3-2,1,$y);
 
 			switch ($params['type']) {
 				case 'last_week_start':
 					$timestamp = $first_day_of_this_week - 86400*7;
 					break;
 				case 'last_week_end':
 					$timestamp = $first_day_of_this_week - 1;
 					break;
 
 				case 'last_month_start':
 					$timestamp = $m == 1 ? adodb_mktime(0,0,0,12,1,$y-1) : adodb_mktime(0,0,0,$m-1,1,$y);
 					break;
 				case 'last_month_end':
 					$timestamp = $first_day_of_this_month = adodb_mktime(0,0,0,$m,1,$y) - 1;
 					break;
 
 				case 'last_quater_start':
 					$timestamp = $this_quater == 1 ? adodb_mktime(0,0,0,10,1,$y-1) : adodb_mktime(0,0,0,($this_quater-1)*3-2,1,$y);
 					break;
 				case 'last_quater_end':
 					$timestamp = $this_quater_start - 1;
 					break;
 
 				case 'last_6_months_start':
 					$timestamp = $m <= 6 ? adodb_mktime(0,0,0,$m+6,1,$y-1) : adodb_mktime(0,0,0,$m-6,1,$y);
 					break;
 
 				case 'last_year_start':
 					$timestamp = adodb_mktime(0,0,0,1,1,$y-1);
 					break;
 				case 'last_year_end':
 					$timestamp = adodb_mktime(23,59,59,12,31,$y-1);
 					break;
 			}
 
 
 			if (isset($params['format'])) {
 				$format = $params['format'];
 				if(preg_match("/_regional_(.*)/", $format, $regs))
 				{
 					$lang =& $this->Application->recallObject('lang.current');
 					$format = $lang->GetDBField($regs[1]);
 				}
 				return adodb_date($format, $timestamp);
 			}
 
 			return $timestamp;
 
 		}
 
 		/**
 		 * Redirect to cache rebuild template, when required by installator
 		 *
 		 * @param Array $params
 		 */
 		function CheckPermCache($params)
 		{
 			// we have separate session between install wizard and admin console, so store in cache
 			$sql = 'SELECT Data
 					FROM '.TABLE_PREFIX.'Cache
 					WHERE VarName = "ForcePermCacheUpdate"';
 			$global_mark = $this->Conn->GetOne($sql);
 
 			$local_mark = $this->Application->RecallVar('PermCache_UpdateRequired');
 
 			if ($global_mark || $local_mark) {
 				$this->Application->RemoveVar('PermCache_UpdateRequired');
 
 				if ($this->Application->ConfigValue('QuickCategoryPermissionRebuild')) {
 					$updater =& $this->Application->recallObject('kPermCacheUpdater');
 					/* @var $updater kPermCacheUpdater */
 
 					$updater->OneStepRun();
 				}
 				else {
 					// update with progress bar
 					return true;
 				}
 			}
 
 			return false;
 		}
 
 		/**
 		 * Checks if current protocol is SSL
 		 *
 		 * @param Array $params
 		 * @return int
 		 */
 		function IsSSL($params)
 		{
 			return (PROTOCOL == 'https://')? 1 : 0;
 		}
 
 		function PrintColumns($params)
 		{
 			$picker_helper =& $this->Application->RecallObject('ColumnPickerHelper');
 			$picker_helper->SetGridName($this->Application->GetLinkedVar('grid_name'));
 			/* @var $picker_helper kColumnPickerHelper */
 
 			$main_prefix = $this->Application->RecallVar('main_prefix');
 			$cols = $picker_helper->LoadColumns($main_prefix);
 
 			$this->Application->Phrases->AddCachedPhrase('__FREEZER__', '-------------');
 
 			$o = '';
 			if (isset($params['hidden']) && $params['hidden']) {
 				foreach ($cols['hidden_fields'] as $col) {
 					$title = $this->Application->Phrase($cols['titles'][$col]);
 					$o .= "<option value='$col'>".$title;
 				}
 			}
 			else {
 				foreach ($cols['order'] as $col) {
 					if (in_array($col, $cols['hidden_fields'])) continue;
 					$title = $this->Application->Phrase($cols['titles'][$col]);
 					$o .= "<option value='$col'>".$title;
 				}
 			}
 			return $o;
 		}
 
 		/**
 		 * Allows to set popup size (key - current template name)
 		 *
 		 * @param Array $params
 		 */
 		function SetPopupSize($params)
 		{
 			$width = $params['width'];
 			$height = $params['height'];
 
 			if ($this->Application->GetVar('ajax') == 'yes') {
 				// during AJAX request just output size
 				die($width.'x'.$height);
 			}
 
 			if (!$this->UsePopups($params)) {
 				return ;
 			}
 
 			$t = $this->Application->GetVar('t');
 			$sql = 'SELECT *
 					FROM '.TABLE_PREFIX.'PopupSizes
 					WHERE TemplateName = '.$this->Conn->qstr($t);
 			$popup_info = $this->Conn->GetRow($sql);
 			if (!$popup_info) {
 				// create new popup size record
 				$fields_hash = 	Array (
 										'TemplateName'	=>	$t,
 										'PopupWidth'	=>	$width,
 										'PopupHeight'	=>	$height,
 								);
 				$this->Conn->doInsert($fields_hash, TABLE_PREFIX.'PopupSizes');
 			}
 			elseif ($popup_info['PopupWidth'] != $width || $popup_info['PopupHeight'] != $height) {
 				// popup found and size in tag differs from one in db -> update in db
 				$fields_hash = 	Array (
 										'PopupWidth'	=>	$width,
 										'PopupHeight'	=>	$height,
 								);
 				$this->Conn->doUpdate($fields_hash, TABLE_PREFIX.'PopupSizes', 'PopupId = '.$popup_info['PopupId']);
 			}
 		}
 
 		/**
 		 * Returns popup size (by template), if not cached, then parse template to get value
 		 *
 		 * @param Array $params
 		 * @return string
 		 */
 		function GetPopupSize($params)
 		{
 			$t = $this->Application->GetVar('template_name');
 			$sql = 'SELECT *
 					FROM '.TABLE_PREFIX.'PopupSizes
 					WHERE TemplateName = '.$this->Conn->qstr($t);
 			$popup_info = $this->Conn->GetRow($sql);
 			if (!$popup_info) {
 				$this->Application->InitParser();
 				$this->Application->ParseBlock(array('name' => $t)); // dies when SetPopupSize tag found & in ajax requrest
 				return '750x400'; // tag SetPopupSize not found in template -> use default size
 			}
 			return $popup_info['PopupWidth'].'x'.$popup_info['PopupHeight'];
 		}
 
 		/**
 		 * Allows to check if popups are generally enabled OR to check for "popup" or "modal" mode is enabled
 		 *
 		 * @param Array $params
 		 * @return bool
 		 */
 		function UsePopups($params)
 		{
 			if ($this->Application->GetVar('_force_popup')) {
 				return true;
 			}
 
 			$use_popups = (int)$this->Application->ConfigValue('UsePopups');
 
 			if (array_key_exists('mode', $params)) {
 				$mode_mapping = Array ('popup' => 1, 'modal' => 2);
 				return $use_popups == $mode_mapping[ $params['mode'] ];
 			}
 
 			return $use_popups;
 		}
 
 		function UseToolbarLabels($params)
 		{
 			return (int)$this->Application->ConfigValue('UseToolbarLabels');
 		}
 
 		/**
 		 * Checks if debug mode enabled (optionally) and specified constant is on
 		 *
 		 * @param Array $params
 		 * @return bool
 		 */
 		function ConstOn($params)
 		{
 			$constant_name = $this->SelectParam($params, 'name,const');
 			$debug_mode = isset($params['debug_mode']) && $params['debug_mode'] ? $this->Application->isDebugMode() : true;
 			return $debug_mode && constOn($constant_name);
 		}
 
 		/**
 		 * Builds link to last template in main frame of admin
 		 *
 		 * @param Array $params
 		 * @return string
 		 */
 		function MainFrameLink($params)
 		{
 			$persistent = isset($params['persistent']) && $params['persistent'];
 			if ($persistent && $this->Application->ConfigValue('RememberLastAdminTemplate')) {
 				// check last_template in persistent session
 				$last_template = $this->Application->RecallPersistentVar('last_template_popup');
 			}
 			else {
 				// check last_template in session
 				$last_template = $this->Application->RecallVar('last_template_popup'); // because of m_opener=s there
 			}
 
 			if (!$last_template) {
 				$params['persistent'] = 1;
 				return $persistent ? false : $this->MainFrameLink($params);
 			}
 
 			list($index_file, $env) = explode('|', $last_template);
 			$vars = $this->Application->HttpQuery->processQueryString($env, 'pass');
 			$recursion_templates = Array ('login', 'index', 'no_permission');
 
 			if (isset($vars['admin']) && $vars['admin'] == 1) {
 				// index template doesn't begin recursion on front-end (in admin frame)
 				$vars['m_theme'] = '';
 
 				if (isset($params['m_opener']) && $params['m_opener'] == 'r') {
 					// front-end link for highlighting purposes
 					$vars['t'] = 'index';
 					$vars['m_cat_id'] = $this->Application->findModule('Name', 'Core', 'RootCat');
 				}
 
 				unset($recursion_templates[ array_search('index', $recursion_templates)]);
 			}
 
 			if (in_array($vars['t'], $recursion_templates)) {
 				// prevents redirect recursion OR old in-portal pages
 				$params['persistent'] = 1;
 				return $persistent ? false : $this->MainFrameLink($params);
 			}
 
 			$vars = array_merge_recursive2($vars, $params);
 			$t = $vars['t'];
 			unset($vars['t'], $vars['persistent']);
 
 			// substitute language in link to current (link will work, even when language will be changed)
 			$vars['m_lang'] = $this->Application->GetVar('m_lang');
 
 			return $this->Application->HREF($t, '', $vars, $index_file);
 		}
 
 		/**
 		 * Returns menu frame width or 200 in case, when invalid width specified in config
 		 *
 		 * @param Array $params
 		 * @return string
 		 */
 		function MenuFrameWidth($params)
 		{
 			$width = (int)$this->Application->ConfigValue('MenuFrameWidth');
 
 			return $width > 0 ? $width : 200;
 		}
 
 		function AdminSkin($params)
 		{
 			$skin_helper =& $this->Application->recallObject('SkinHelper');
 			/* @var $skin_helper SkinHelper */
 
 			return $skin_helper->AdminSkinTag($params);
 		}
 
 		function PrintCompileErrors($params)
 		{
 			$block_params = $this->prepareTagParams($params);
 			$block_params['name'] = $params['render_as'];
 
 			$errors = $this->Application->RecallVar('compile_errors');
 			if (!$errors) {
 				return ;
 			}
 
 			$ret = '';
 			$errors = unserialize($errors);
 
 			foreach ($errors as $an_error) {
 				$block_params['file'] = str_replace(FULL_PATH, '', $an_error['file']);
 				$block_params['line'] = $an_error['line'];
 				$block_params['message'] = $an_error['msg'];
 
 				$ret .= $this->Application->ParseBlock($block_params);
 			}
 
 			$this->Application->RemoveVar('compile_errors');
 
 			return $ret;
 		}
 
 		function CompileErrorCount($params)
 		{
 			$errors = $this->Application->RecallVar('compile_errors');
 			if (!$errors) {
 				return 0;
 			}
 
 			return count( unserialize($errors) );
 		}
 
 		function ExportData($params)
 		{
 			$export_helper =& $this->Application->recallObject('CSVHelper');
 			/* @var $export_helper kCSVHelper */
 			$result = $export_helper->ExportData( $this->SelectParam($params, 'var,name,field') );
 			return ($result === false) ? '' : $result;
 		}
 
 		function ImportData($params)
 		{
 			$import_helper =& $this->Application->recallObject('CSVHelper');
 			/* @var $import_helper kCSVHelper */
 			$result = $import_helper->ImportData( $this->SelectParam($params, 'var,name,field') );
 			return ($result === false) ? '' : $result;
 		}
 
 		function PrintCSVNotImportedLines($params)
 		{
 			$import_helper =& $this->Application->recallObject('CSVHelper');
 			/* @var $import_helper kCSVHelper */
 			return  $import_helper->GetNotImportedLines();
 		}
 
 		/**
 		 * Returns input field name to
 		 * be placed on form (for correct
 		 * event processing)
 		 *
 		 * @param Array $params
 		 * @return string
 		 * @access public
 		 */
 		function InputName($params)
 		{
 			list($id, $field) = $this->prepareInputName($params);
 
 			$ret = $this->getPrefixSpecial().'[0]['.$field.']'; // 0 always, as has no idfield
 			if( getArrayValue($params, 'as_preg') ) $ret = preg_quote($ret, '/');
 			return $ret;
 		}
 
 		/**
 		 * Returns list of all backup file dates formatted
 		 * in passed block
 		 *
 		 * @param Array $params
 		 * @return string
 		 * @access public
 		 */
 		function PrintBackupDates($params)
 		{
 	 		$datearray = $this->getDirList($this->Application->ConfigValue('Backup_Path'));
 	 		$ret = '';
 	        foreach($datearray as $key => $value)
 	        {
 	        	$params['backuptimestamp'] = $value['filedate'];
 	        	$params['backuptime'] = date('F j, Y, g:i a', $value['filedate']);
 	        	$params['backupsize'] = round($value['filesize']/1024/1024, 2); // MBytes
 	        	$ret .= $this->Application->ParseBlock($params);
 	        }
 	        return $ret;
 		}
 
 		function getDirList ($dirName)
 		{
 		    $fileinfo = array();
 		    $d = dir($dirName);
 
 		    while($entry = $d->read())
 		    {
 		        if ($entry != "." && $entry != "..")
 		        {
 		            if (!is_dir($dirName."/".$entry) && strpos($entry, 'dump') !== false)
 		            {
 		                $fileinfo[]= Array('filedate' => $this->chopchop($entry),
 		                					'filesize' => filesize($dirName. '/'. $entry)
 		                					);
 		            }
 		        }
 		    }
 		    $d->close();
 		    rsort($fileinfo);
 
 		    return $fileinfo;
 
 		}
 
 		function chopchop ($filename)
 		{
 			 $p = pathinfo($filename);
 			 $ext = '.'.$p['extension'];
 		     $filename;
 		     $filename = str_replace('dump', '',$filename);
 		     $filename = str_replace($ext, '', $filename);
 
 		     return $filename;
 		}
 
 		/**
 		 * Returns phpinfo() output
 		 *
 		 * @param Array $params
 		 * @return string
 		 */
 		function PrintPHPinfo($params)
 		{
 			ob_start();
 			phpinfo();
 
 			return ob_get_clean();
 		}
 
 		function PrintSqlCols($params)
 		{
 			$a_data = unserialize($this->Application->GetVar('sql_rows'));
 			$ret = '';
 			$block = $params['render_as'];
 			foreach ($a_data AS $a_row)
 			{
 				foreach ($a_row AS $col => $value)
 				{
 					$ret .= $this->Application->ParseBlock(Array('name'=>$block, 'value'=>$col));
 				}
 				break;
 			}
 			return $ret;
 		}
 
 		function PrintSqlRows($params)
 		{
 			$a_data = unserialize($this->Application->GetVar('sql_rows'));
 			$ret = '';
 			$block = $params['render_as'];
 			foreach ($a_data AS $a_row)
 			{
 				$cells = '';
 				foreach ($a_row AS $col => $value)
 				{
 					$cells .= '<td>'.$value.'</td>';
 				}
 				$ret .= $this->Application->ParseBlock(Array('name'=>$block, 'cells'=>$cells));
 			}
 			return $ret;
 		}
 
 		/**
 		 * Prints available and enabled import sources using given block
 		 *
 		 * @param Array $params
 		 * @return string
 		 */
 		function PrintImportSources($params)
  		{
  			$sql = 'SELECT *
  					FROM ' . TABLE_PREFIX . 'ImportScripts
  					WHERE (Status = ' . STATUS_ACTIVE . ') AND (Type = "CSV")';
  			$import_sources = $this->Conn->Query($sql);
 
  			$block_params = $this->prepareTagParams($params);
  			$block_params['name'] = $params['render_as'];
 
  			$ret = '';
  			foreach ($import_sources as $import_source) {
  				$block_params['script_id'] = $import_source['ImportId'];
  				$block_params['script_module'] = $import_source['Module'];
  				$block_params['script_name'] = $import_source['Name'];
  				$block_params['script_prefix'] = $import_source['Prefix'];
  				$block_params['module_path'] = $this->Application->findModule('Name', $import_source['Module'], 'Path');
 
  				$ret .= $this->Application->ParseBlock($block_params);
  			}
 
  			return $ret;
  		}
 
  		/**
  		 * Checks, that new window should be opened in "incs/close_popup" template instead of refreshing parent window
  		 *
  		 * @param Array $params
  		 * @return bool
  		 */
  		function OpenNewWindow($params)
  		{
 			if (!$this->UsePopups($params)) {
 				return false;
 			}
 
  			$diff = array_key_exists('diff', $params) ? $params['diff'] : 0;
  			$wid = $this->Application->GetVar('m_wid');
 
 			$stack_name = rtrim('opener_stack_' . $wid, '_');
 			$opener_stack = $this->Application->RecallVar($stack_name);
 			$opener_stack = $opener_stack ? unserialize($opener_stack) : Array ();
 
 			return count($opener_stack) >= 2 - $diff;
  		}
 
 		/**
 		 * Allows to dynamically change current language in template
 		 *
 		 * @param Array $params
 		 */
 		function SetLanguage($params)
 		{
 			$this->Application->SetVar('m_lang', $params['language_id']);
 			$this->Application->Phrases->Init('');
 
 			$this->Application->Phrases->LanguageId = $params['language_id'];
 			$this->Application->Phrases->LoadPhrases( $this->Application->Caches['PhraseList'] );
 		}
 
 		/**
 		 * Performs HTTP Authentification for administrative console
 		 *
 		 * @param Array $params
 		 */
 		function HTTPAuth($params)
 		{
 			if (!$this->Application->ConfigValue('UseHTTPAuth')) {
 				// http authentification not required
 				return true;
 			}
 
 			$super_admin_ips = defined('SA_IP') ? SA_IP : false;
 			$auth_bypass_ips = $this->Application->ConfigValue('HTTPAuthBypassIPs');
 
 			if (($auth_bypass_ips && ipMatch($auth_bypass_ips)) || ($super_admin_ips && ipMatch($super_admin_ips))) {
 				// user ip is in ip bypass list
 				return true;
 			}
 
 			if (!array_key_exists('PHP_AUTH_USER', $_SERVER)) {
 				// ask user to authentificate, when not authentificated before
 				return $this->_httpAuthentificate();
 			}
 			else {
 				// validate user credentials (browsers remembers user/password
 				// and sends them each time page is visited, so no need to save
 				// authentification result in session)
 				if ($this->Application->ConfigValue('HTTPAuthUsername') != $_SERVER['PHP_AUTH_USER']) {
 					// incorrect username
 					return $this->_httpAuthentificate();
 				}
 
 				$password_formatter =& $this->Application->recallObject('kPasswordFormatter');
 				/* @var $password_formatter kPasswordFormatter */
 
 				$password = $password_formatter->EncryptPassword($_SERVER['PHP_AUTH_PW'], 'b38');
 
 				if ($this->Application->ConfigValue('HTTPAuthPassword') != $password) {
 					// incorrect password
 					return $this->_httpAuthentificate();
 				}
 			}
 
 			return true;
 		}
 
 		/**
 		 * Ask user to authentificate
 		 *
 		 * @return false
 		 */
 		function _httpAuthentificate()
 		{
 			$realm = strip_tags( $this->Application->ConfigValue('Site_Name') );
 			header('WWW-Authenticate: Basic realm="' . $realm . '"');
 			header('HTTP/1.0 401 Unauthorized');
 
 			return false;
 		}
 	}
\ No newline at end of file
Index: branches/5.0.x/core
===================================================================
--- branches/5.0.x/core	(revision 13571)
+++ branches/5.0.x/core	(revision 13572)

Property changes on: branches/5.0.x/core
___________________________________________________________________
Added: svn:ignore
## -0,0 +1 ##
+phpunit