Index: branches/5.1.x/core/admin_templates/js/catalog.js
===================================================================
--- branches/5.1.x/core/admin_templates/js/catalog.js	(revision 13816)
+++ branches/5.1.x/core/admin_templates/js/catalog.js	(revision 13817)
@@ -1,450 +1,460 @@
 function Catalog($url_mask, $cookie_prefix, $type) {
 	this.type = $type;
 	this.CookiePrefix = $cookie_prefix ? $cookie_prefix : '';
 	this.BusyRequest = new Array();
 	this.URLMask = $url_mask;
 	this.Separator = '#separator#';
 	this.ParentCategoryID = 0;
 	this.OnResponceMethod = null;
 	this.TabRegistry = new Array();
 
 	if (window.location.hash && window.location.hash.match(/^#tab-(.*)/)) {
 		// get active tab from anchor
 		this.ActivePrefix = RegExp.$1;
 	}
 	else {
 		// get active tab from cookie
 		this.ActivePrefix = getCookie(this.CookiePrefix + 'active_prefix');
 	}
 
 	this.PreviousPrefix = this.ActivePrefix;
 	this.TabByCategory = false; // preselect tab by category (used in catalog only)
 	$ViewMenus = new Array('c');
 
 	this.searchInfo = {}; // information about search (for each tab)
 }
 
 Catalog.prototype.Init = function ($auto_hide_tabs) {
 	var $prefix = this.queryTabRegistry('prefix', this.ActivePrefix, 'prefix');
 	if ($prefix !== this.ActivePrefix && this.TabRegistry.length > 0) {
 		// ActivePrefix not set or has non-existing prefix value
 		this.ActivePrefix = this.TabRegistry[0]['prefix'];
 	}
 
 	if ($auto_hide_tabs === undefined) {
 		$auto_hide_tabs = true;
 	}
 
 	if ((this.TabRegistry.length == 1) && $auto_hide_tabs) {
 		// only one tab -> hide all tab bar
 		$('div.tab-viewport').parents('table:first').hide();
 	}
 
 	this.SetAlternativeTabs();
 	this.AfterInit();
 }
 
 Catalog.prototype.AfterInit = function () {
 	this.go_to_cat();
 }
 
 Catalog.prototype.SetAlternativeTabs = function () {
 	// set alternative grids between all items (catalog is set when tab is loaded via AJAX first time)
 	var $i = 0;
 	while ($i < this.TabRegistry.length) {
 		// run through all prefixes
 		var $j = 0;
 		while ($j < this.TabRegistry.length) {
 			if (this.TabRegistry[$i]['prefix'] == this.TabRegistry[$j]['prefix']) {
 				$j++;
 				continue;
 			}
 			// and set alternative to all other prefixes
 			$GridManager.AddAlternativeGrid(this.TabRegistry[$i]['prefix'], this.TabRegistry[$j]['prefix']);
 			$j++;
 		}
 		$i++;
 	}
 }
 
 Catalog.prototype.submit_kernel_form = function($tab_id) {
 	var $prefix = 'dummy';
 	var $result_div = '';
 
 	if (isset($tab_id)) {
 		// responce result + progress are required
 		$prefix = this.queryTabRegistry('tab_id', $tab_id, 'prefix');
 		$result_div = $tab_id + '_div';
 	}
 
 	var $kf = document.getElementById($form_name);
 
 	Request.params = Request.serializeForm($kf);
 	Request.method = $kf.method.toUpperCase();
 
 	this.BusyRequest[$prefix] = false;
 	Request.makeRequest($kf.action, this.BusyRequest[$prefix], $result_div, this.successCallback, this.errorCallback, $result_div, this);
 
 	$form_name = 'kernel_form'; // restore back to main form with current category id of catalog
 }
 
 Catalog.prototype.successCallback = function($request, $params, $object) {
 	if (Request.processRedirect($request)) {
 		return ;
 	}
 
 	var $text = $request.responseText;
 
 	$params = $params.split(',');
 
 	var $js_end = $text.indexOf($object.Separator);
 	if ($js_end != -1) {
 		// allow to detect if output is permitted by ajax request parameters
 		var $request_visible = '$request_visible = ' + ($params[0].length ? 'true' : 'false') + "\n";
 
 		if ($params[0].length) {
 //			document.getElementById($params[0]).innerHTML = $text.substring($js_end + $object.Separator.length);
 			$( document.getElementById($params[0]) ).html( $text.substring($js_end + $object.Separator.length) );
 			eval($request_visible + $text.substring(0, $js_end));
 		}
 		else {
 			// eval JS only & set mark that js should not use HTML as usual in grids
 			eval($request_visible + $text.substring(0, $js_end));
 		}
 	}
 	else if ($params[0].length) {
 		document.getElementById($params[0]).innerHTML = $text;
 	}
 
 	// pass catalog object and loaded tab name to event handler
 	$('body').trigger('CatalogTabLoad', [$object, $params[0].replace(/_div$/, '')]);
 
 	if (typeof($object.OnResponceMethod) == 'function') {
 		 $object.OnResponceMethod($object);
 		 $object.OnResponceMethod = null;
 	}
 
 	if (typeof($Debugger) != 'undefined') {
 		$Debugger.Clear();
 	}
 
 //	var $tab_id = $params[0].replace(/_div$/, '');
 //	var $prefix = $object.queryTabRegistry('tab_id', $tab_id, 'prefix');
 }
 
 Catalog.prototype.resizeGrid = function ($prefix) {
 	if ($prefix != this.ActivePrefix) {
 		// no need to resize, because grid is already visible
 		return true;
 	}
 
 	var $grid = GridScrollers[$prefix];
 	if ($grid) {
 		$grid.RefreshPos();
 		$grid.Resize( $grid.GetAutoSize('auto') );
 
 		return true;
 	}
 
 	return false;
 }
 
 Catalog.prototype.trim = function ($string) {
 	return $string.replace(/\s*((\S+\s*)*)/, "$1").replace(/((\s*\S+)*)\s*/, "$1");
 }
 
 Catalog.prototype.errorCallback = function($request, $params, $object) {
 //	$Debugger.ShowProps($request, 'req');
 	alert('AJAX Error; class: Catalog; ' + Request.getErrorHtml($request));
 }
 
 Catalog.prototype.submit_event = function($prefix_special, $event, $t, $OnResponceMethod) {
 	if (typeof($OnResponceMethod) == 'function') {
 		this.OnResponceMethod = $OnResponceMethod;
 	}
 
 	var $prev_template = get_hidden_field('t');
 	if (!isset($prefix_special)) $prefix_special = this.getCurrentPrefix();
 	var $tab_id = this.queryTabRegistry('prefix', $prefix_special, 'tab_id');
 
 	$form_name = $tab_id + '_form'; // set firstly, because set_hidden_field uses it
 	if (isset($event)) set_hidden_field('events[' + $prefix_special + ']', $event);
 	if (isset($t)) set_hidden_field('t', $t);
 
 	this.submit_kernel_form($tab_id);
 	set_hidden_field('t', $prev_template);
 }
 
 
 Catalog.prototype.go_to_cat = function($cat_id, $module_prefix) {
 	if (!isset($cat_id)) {
 		// gets current category
 		$cat_id = get_hidden_field('m_cat_id');
 	}
 	else {
 		// sets new category to kernel_form in case if item tab
 		// loads faster and will check if it's category is same
 		// as parent category of categories list
 
 		if (get_hidden_field('m_cat_id') == $cat_id) {
 			// it's the same category, then don't reload category list
 			return ;
 		}
 		set_hidden_field('m_cat_id', $cat_id);
 	}
 
 	// 1. make all tabs unselected
 	this.resetTabs(false);
 
 	// 2. update grid for current tab
 	this.switchTab(this.TabByCategory ? $module_prefix : null); // refresh current item tab
 
 	// 3. update counters for all tabs
 	var $prefix = this.TabRegistry[0]['prefix'];
 
 	var $url = this.URLMask.replace('#TEMPLATE_NAME#', 'catalog/catalog_counters').replace('#CATEGORY_ID#', $cat_id);
+
+	var $last_templates = {
+		'ItemSelectorCatalog': 'catalog/item_selector/item_selector_catalog',
+		'ItemSelectorAdvancedView': 'catalog/item_selector/item_selector_advanced_view'
+	};
+
+	if ($last_templates[this.type] !== undefined) {
+		$url += '&last_template=' + $last_templates[this.type];
+	}
+
 	this.BusyRequest[$prefix] = false;
 	Request.makeRequest($url, this.BusyRequest[$prefix], '', this.updateCounters, this.errorCallback, '', this);
 }
 
 Catalog.prototype.updateCounters = function($request, $params, $object) {
 	if (Request.processRedirect($request)) {
 		return ;
 	}
 
 	eval($request.responseText);
 }
 
 // set all item tabs counters to "?" before quering catagories
 Catalog.prototype.resetTabs = function($reset_content) {
 	var $i = 0;
 	while ($i < this.TabRegistry.length) {
 		this.setItemCount(this.TabRegistry[$i]['prefix'], '?');
 		$i++;
 	}
 
 	if ($reset_content) {
 		// set category for all tabs to -1 (forces reload next time)
 		$i = 0;
 		while ($i < this.TabRegistry.length) {
 			document.getElementById(this.TabRegistry[$i]['tab_id'] + '_div').setAttribute('category_id', -1);
 			$i++;
 		}
 	}
 }
 
 Catalog.prototype.switchTab = function($prefix, $force) {
 	if (this.queryTabRegistry('prefix', this.ActivePrefix, 'prefix') != this.ActivePrefix) {
 		// active prefix is not registred -> cookie left, but not modules installed/enabled at the moment
 		return false;
 	}
 
 	if (!isset($prefix) || $prefix == '' || this.queryTabRegistry('prefix', $prefix, 'prefix') === false) {
 		// prefix not given OR empty prefix OR non-existing tab
 		$prefix = this.ActivePrefix;
 	}
 
 	if (this.BusyRequest[$prefix]) {
 		alert('prefix: ['+$prefix+']; request busy: ['+this.BusyRequest[$prefix]+']');
 	}
 
 	if (this.ActivePrefix != $prefix) {
 		// hide source tab
 		this.PreviousPrefix = this.ActivePrefix;
 		$( jq('#' + this.PreviousPrefix + '_tab') ).removeClass('tab-active');
 
 		var $prev_div_id = this.queryTabRegistry('prefix', this.PreviousPrefix, 'tab_id') + '_div';
 		document.getElementById($prev_div_id).style.display = 'none';
 
 		var $prev_div_container = $( jq('#' + $prev_div_id + '_container') );
 		if ($prev_div_container.length) {
 			$prev_div_container.hide();
 		}
 
 		this.HideDependentButtons(this.PreviousPrefix);
 	}
 
 	// show destination tab
 	this.ActivePrefix = $prefix;
 	$( jq('#' + this.ActivePrefix + '_tab') ).addClass('tab-active');
 
 	var $div_id = this.queryTabRegistry('prefix', this.ActivePrefix, 'tab_id') + '_div'; // destination tab
 	document.getElementById($div_id).style.display = 'block';
 
 	var $div_container = $( jq('#' + $div_id + '_container') );
 	if ($div_container.length) {
 		$div_container.show();
 	}
 
 	this.ShowDependentButtons(this.ActivePrefix);
 
 	this.displaySearch($prefix);
 	this.setViewMenu(this.ActivePrefix);
 
 	setCookie(this.CookiePrefix + 'active_prefix', this.ActivePrefix);
 	window.location.hash = '#tab-' + this.ActivePrefix;
 
 	this.refreshTab($prefix, $div_id, $force);
 }
 
 Catalog.prototype.refreshTab = function($prefix, $div_id, $force) {
 	var $cat_id = get_hidden_field('m_cat_id');
 	var $tab_cat_id = document.getElementById($div_id).getAttribute('category_id');
 	if ($cat_id != $tab_cat_id || $force) {
 		// query tab content only in case if not queried or category don't match
 		var $url = this.URLMask.replace('#TEMPLATE_NAME#', this.queryTabRegistry('prefix', $prefix, 'view_template'));
 		$url = $url.replace('#CATEGORY_ID#', $cat_id);
 		$url = $url.replace('#PREFIX#', $prefix);
 
 		this.BusyRequest[$prefix] = false;
 		Request.makeRequest($url, this.BusyRequest[$prefix], $div_id, this.successCallback, this.errorCallback, $div_id, this);
 	}
 	else {
 //		alert('refresh disabled = {tab: '+this.ActivePrefix+'; cat_id: '+$cat_id+'; form_name: '+$form_name+'}');
 		this.resizeGrid($prefix);
 	}
 }
 
 // adds information about tab to tab_registry
 Catalog.prototype.registerTab = function($tab_id) {
 	var $tab = document.getElementById($tab_id + '_div');
 	var $index = this.TabRegistry.length;
 	this.TabRegistry[$index] = new Array();
 	this.TabRegistry[$index]['tab_id'] = $tab_id;
 	this.TabRegistry[$index]['prefix'] = $tab.getAttribute('prefix');
 	if ($tab_id == 'categories') {
 		this.TabRegistry[$index]['module_path'] = 'in-portal/';
 	}
 	else {
 		this.TabRegistry[$index]['module_path'] = $tab.getAttribute('edit_template').substring(0, $tab.getAttribute('edit_template').indexOf('/'));
 	}
 	this.TabRegistry[$index]['view_template'] = $tab.getAttribute('view_template');
 	this.TabRegistry[$index]['edit_template'] = $tab.getAttribute('edit_template');
 	this.TabRegistry[$index]['dep_buttons'] = $tab.getAttribute('dep_buttons').length > 0 ? $tab.getAttribute('dep_buttons').split(',') : new Array();
 	this.TabRegistry[$index]['index'] = $index;
 }
 
 // allows to get any information about tab
 Catalog.prototype.queryTabRegistry = function($search_key, $search_value, $return_key) {
 	var $i = 0;
 //	alert('looking in '+$search_key+' for '+$search_value+' will return '+$return_key)
 	while ($i < this.TabRegistry.length) {
 		if (this.TabRegistry[$i][$search_key] == $search_value) {
 //			alert('got '+this.TabRegistry[$i][$return_key])
 			return this.TabRegistry[$i][$return_key];
 			break;
 		}
 		$i++;
 	}
 	return false;
 }
 
 Catalog.prototype.ShowDependentButtons = function($prefix) {
 	/*var $tab_id = this.queryTabRegistry('prefix', $prefix, 'tab_id')
 	if (!document.getElementById($tab_id + '_form')) {
 		// tab form not found => no permission to view -> no permission to do any actions
 		alert('no form: ['+$tab_id + '_form'+']');
 		return ;
 	}
 	else {
 		alert('has form: ['+$tab_id + '_form'+']');
 	}*/
 
 	var $dep_buttons = this.queryTabRegistry('prefix', $prefix, 'dep_buttons');
 	var $i = 0;
 	while ($i < $dep_buttons.length) {
 		a_toolbar.ShowButton($dep_buttons[$i]);
 		$i++;
 	}
 }
 
 Catalog.prototype.HideDependentButtons = function($prefix) {
 	var $dep_buttons = this.queryTabRegistry('prefix', $prefix, 'dep_buttons');
 	var $i = 0;
 	while ($i < $dep_buttons.length) {
 		a_toolbar.HideButton($dep_buttons[$i]);
 		$i++;
 	}
 }
 
 Catalog.prototype.setItemCount = function($prefix, $count) {
 	setInnerHTML($prefix + '_item_count', $count);
 }
 
 Catalog.prototype.saveSearch = function ($prefix, $keyword, $grid_name) {
 	this.searchInfo[$prefix] = {
 		'keyword': $keyword,
 		'grid': $grid_name
 	}
 
 	this.displaySearch($prefix);
 }
 
 Catalog.prototype.displaySearch = function ($prefix) {
 	var $search_input = $('#search_keyword');
 
 	$search_input.attr('PrefixSpecial', $prefix);
 
 	if (this.searchInfo[$prefix]) {
 		$search_input
 		.val(this.searchInfo[$prefix].keyword)
 		.attr('Grid', this.searchInfo[$prefix].grid);
 
 		if (this.searchInfo[$prefix].keyword) {
 			// catalog tab found and keyword present
 			$search_input.addClass('filter-active');
 		}
 		else {
 			// catalog tab found and keyword missing
 			$search_input.removeClass('filter-active');
 		}
 	}
 	else {
 		// catalog tab not found
 		$search_input.removeClass('filter-active');
 	}
 }
 
 Catalog.prototype.setCurrentCategory = function($prefix, $category_id) {
 	var $tab_id = this.queryTabRegistry('prefix', $prefix, 'tab_id');
 //	alert('setting current category for prefix: ['+$prefix+']; tab_id ['+$tab_id+'] = ['+$category_id+']');
 	document.getElementById($tab_id + '_div').setAttribute('category_id', $category_id);
 }
 
 
 Catalog.prototype.getCurrentPrefix = function() {
 	return this.ActivePrefix;
 }
 
 Catalog.prototype.setViewMenu = function($item_prefix) {
 	$ViewMenus = isset($item_prefix) ? new Array($item_prefix) : new Array();
 }
 
 Catalog.prototype.reflectPasteButton = function($status) {
 	a_toolbar.SetEnabled('paste', $status);
 	a_toolbar.SetEnabled('clear_clipboard', $status);
 }
 
 Catalog.prototype.storeIDs = function ($category_variable) {
 	if ($category_variable) {
 		var $category_ids = '';
 
 		if (Grids['c'] != undefined) {
 			$category_ids = Grids['c'].GetSelected().join(',');
 		}
 
 		if (!$category_ids) {
 			$category_ids = get_hidden_field('m_cat_id'); // current category
 		}
 
 		set_hidden_field($category_variable, $category_ids);
 	}
 
 	// get selectes category items
 	for (var $i in Grids[this.ActivePrefix].Items) {
 		if (Grids[this.ActivePrefix].Items[$i].selected) {
 			set_hidden_field(Grids[this.ActivePrefix].Items[$i].CheckBox.id, 'on', false);
 		}
 	}
 
 }
\ No newline at end of file
Index: branches/5.1.x/core/admin_templates/catalog/catalog_counters.tpl
===================================================================
--- branches/5.1.x/core/admin_templates/catalog/catalog_counters.tpl	(revision 13816)
+++ branches/5.1.x/core/admin_templates/catalog/catalog_counters.tpl	(revision 13817)
@@ -1,24 +1,29 @@
 // counters
 <inp2:m_ModuleInclude template="catalog_tab" tab_init="3"/>
 
 // category related statistics
 $Catalog.ParentCategoryID = <inp2:c_GetParentCategory/>;
 
 <inp2:m_DefineElement name="category_caption">
 	<inp2:m_ifnot check="m_Param" name="is_first">
 		<inp2:m_param name="separator"/>
 	</inp2:m_ifnot>
 	<inp2:m_if check="m_ParamEquals" name="current" value="1" inverse="1">
 		<a class="control_link" href="javascript:$Catalog.go_to_cat(<inp2:m_param name="cat_id"/>);"><inp2:m_param name="cat_name"/></a>
 	<inp2:m_else/>
 		<inp2:m_param name="cat_name"/>
 	</inp2:m_if>
 </inp2:m_DefineElement>
 
 setInnerHTML('category_path', '<inp2:c_CategoryPath separator=" / " render_as="category_caption" js_escape="1" strip_nl="2"/>');
 set_window_title( RemoveTranslationLink(document.getElementById('blue_bar').innerHTML, false).replace(/(<[^<]+>)/g, '').replace(/\s+/g, ' ').trim() );
 
-<inp2:c_UpdateLastTemplate template="catalog/catalog"/>
+<inp2:m_if check="m_Get" name="last_template">
+	<inp2:m_Get name="last_template" result_to_var="last_template"/>
+	<inp2:c_UpdateLastTemplate template="$last_template"/>
+<inp2:m_else/>
+	<inp2:c_UpdateLastTemplate template="catalog/catalog"/>
+</inp2:m_if>
 
 <inp2:m_include t="categories/ci_blocks"/>
 <inp2:m_RenderElement name="structure_reload_element"/>
\ No newline at end of file