Index: trunk/kernel/units/custom_fields/custom_fields_event_handler.php
===================================================================
--- trunk/kernel/units/custom_fields/custom_fields_event_handler.php	(nonexistent)
+++ trunk/kernel/units/custom_fields/custom_fields_event_handler.php	(revision 1310)
@@ -0,0 +1,84 @@
+<?php
+	class CustomFieldsEventHandler extends InpDBEventHandler  {
+	
+		/**
+		 * Apply any custom changes to list's sql query
+		 *
+		 * @param kEvent $event
+		 * @access protected
+		 * @see OnListBuild
+		 */
+		function SetCustomQuery(&$event)
+		{
+			$object =& $event->getObject();
+			
+			$item_type=$this->Application->GetVar('cf_type');
+			$object->SetWhereClause('%1$s.Type='.$item_type);
+			$object->AddOrderField('DisplayOrder', 'ASC');
+		}
+		
+		/**
+		 * Prevents from duplicate item creation
+		 *
+		 * @param kEvent $event
+		 */
+		function OnBeforeItemCreate(&$event)
+		{
+			$object =& $event->getObject();
+			$items_info = $this->Application->GetVar( $event->getPrefixSpecial(true) );
+			
+			$new_field_name=$items_info[0]['FieldName'];
+
+			$table = $this->Application->getUnitOption($event->Prefix,'TableName');
+			$found = $this->Conn->GetOne("SELECT count(*) FROM ".$table." WHERE FieldName='".$new_field_name."'");
+		
+			if($found){
+				$event->status=erFAIL;
+				$object->FieldErrors['FieldName']['pseudo'] = $this->Application->Phrase('la_error_CustomExists');
+			}
+			else {
+				$item_type=$this->Application->GetVar('cf_type');
+
+				$object->SetDBField('Type', $this->Application->GetVar('cf_type'));
+			}
+		}
+		
+		function OnAfterItemCreate(&$event)
+		{
+			$this->Application->SetVar('cf_id', '');
+		}		
+
+		function OnAfterItemUpdate(&$event)
+		{
+			$this->Application->SetVar('cf_id', '');
+		}
+		
+		function OnCancelEdit(&$event){
+			$this->Application->SetVar('cf_id', '');
+		}
+		/**
+		 * Occurse after deleting item, id of deleted item
+		 * is stored as 'id' param of event
+		 *
+		 * @param kEvent $event
+		 * @access public
+		 */
+		function OnAfterItemDelete(&$event)
+		{
+			$object =& $event->getObject();
+			$custom_field_id=$event->getEventParam('id');
+			$this->Application->SetVar('cf_id', '');
+			
+			$sql='DELETE FROM '.TABLE_PREFIX.'CustomMetaData WHERE CustomFieldId='.$custom_field_id;
+			$this->Conn->Query($sql);
+			
+			
+		}
+		
+		function OnMassDelete(&$event)
+		{
+			parent::OnMassDelete($event);
+			$event->redirect_params = Array('opener' => 's');
+		}
+	}
+?>
\ No newline at end of file

Property changes on: trunk/kernel/units/custom_fields/custom_fields_event_handler.php
___________________________________________________________________
Added: cvs2svn:cvs-rev
## -0,0 +1 ##
+1.2
\ No newline at end of property
Added: svn:executable
## -0,0 +1 ##
+*
\ No newline at end of property
Index: trunk/kernel/units/custom_fields/custom_fields_config.php
===================================================================
--- trunk/kernel/units/custom_fields/custom_fields_config.php	(nonexistent)
+++ trunk/kernel/units/custom_fields/custom_fields_config.php	(revision 1310)
@@ -0,0 +1,74 @@
+<?php
+	
+$config	=	Array(
+					'Prefix'			=>	'cf',
+					'ItemClass'			=>	Array('class'=>'kDBItem','file'=>'','build_event'=>'OnItemBuild'),
+					'ListClass'			=>	Array('class'=>'kDBList','file'=>'','build_event'=>'OnListBuild'),
+					'EventHandlerClass'	=>	Array('class'=>'CustomFieldsEventHandler','file'=>'custom_fields_event_handler.php','build_event'=>'OnBuild'),
+					'TagProcessorClass' =>	Array('class'=>'kDBTagProcessor','file'=>'','build_event'=>'OnBuild'),
+					'AutoLoad'			=>	true,
+					'hooks'				=>	Array(),
+					'QueryString'		=>	Array(
+												1	=>	'id',
+												2	=>	'page',
+												3	=>	'event',
+												4	=>	'type',
+												5	=>	'mode',
+											),
+					'IDField'			=>	'CustomFieldId',
+					
+					'TitleField'		=>	'FieldName',		// field, used in bluebar when editing existing item
+					
+					'TitlePhrase'		=> 'la_title_CustomFields',
+					
+					'TitlePresets'		=>	Array(
+												'default'	=>	Array(	'new_status_labels'		=> Array('cf'=>'!la_title_addingCustom!'),
+																		'edit_status_labels'	=> Array('cf'=>'!la_title_Editing_CustomField!'),
+																		'new_titlefield'		=> Array('cf'=>'!la_title_NewCustomField!'),
+																),
+												
+												'custom_fields_list'=>Array(	'prefixes'				=> Array('cf_List'),
+																		'format'				=>	"!la_tab_ConfigCustom! (#cf_recordcount#)",
+																),
+																
+												'custom_fields_edit'=>Array(	'prefixes'				=> Array('cf'),
+																		'new_titlefield'		=> Array('cf'=>'!la_title_NewCustomField!'),
+																		'format'				=> "#cf_status# '#cf_titlefield#'",
+																),
+											),
+					
+					'TableName'			=>	TABLE_PREFIX.'CustomField',
+					
+					'ListSQLs'			=>	Array(	''=>"SELECT %1\$s.* FROM %s",
+																		), // key - special, value - list select sql
+					'ItemSQLs'			=>	Array(	''=>'SELECT * FROM %s',
+																		),
+											
+					'Fields'			=>	Array(
+										            'CustomFieldId' => Array('type' => 'int','not_null' => '1','default' => ''),
+										            'Type' => Array('type' => 'int','not_null' => '1','default' => '0'),
+										            'FieldName' => Array('type' => 'string','not_null' => 1,'default' => ''),
+										            'FieldLabel' => Array('type' => 'string','default' => ''),
+										            'Heading' => Array('type' => 'string','default' => ''),
+										            'Prompt' => Array('type' => 'string','default' => ''),
+										            'ElementType' => Array('type'=>'string', 'not_null'=>1, 'default'=>'NULL', 'formatter'=>'kOptionsFormatter', 'use_phrases' => 1, 'options'=>Array('text' => 'la_type_text', 'select' => 'la_type_select', 'radio' => 'la_type_radio', 'password' => 'la_type_password', 'textarea' => 'la_type_textarea', 'label' => 'la_type_label')),
+										            'ValueList' => Array('type' => 'string','default' => ''),
+										            'DisplayOrder' => Array('type' => 'int','not_null' => '1','default' => '0'),
+										            'OnGeneralTab' => Array('type' => 'int','not_null' => '1','default' => '0'),
+											),
+					'VirtualFields'	=> 	Array(),
+											
+					'Grids'	=> Array(
+								'Default'		=>	Array(
+																	'Icons' => Array('default'=>'icon16_custom.gif'),
+																	'Fields' => Array(
+																			'CustomFieldId' => Array( 'title'=>'la_prompt_FieldId', 'data_block' => 'grid_checkbox_td' ),
+																			'FieldName' => Array( 'title'=>'la_prompt_FieldName'),
+																			'FieldLabel' => Array( 'title'=>'la_prompt_FieldLabel' ),
+																		),
+																	
+														),
+									),
+	);
+
+?>
\ No newline at end of file

Property changes on: trunk/kernel/units/custom_fields/custom_fields_config.php
___________________________________________________________________
Added: cvs2svn:cvs-rev
## -0,0 +1 ##
+1.2
\ No newline at end of property
Added: svn:executable
## -0,0 +1 ##
+*
\ No newline at end of property
Index: trunk/kernel/units/categories/categories_config.php
===================================================================
--- trunk/kernel/units/categories/categories_config.php	(nonexistent)
+++ trunk/kernel/units/categories/categories_config.php	(revision 1310)
@@ -0,0 +1,59 @@
+<?php
+	
+$config	=	Array(
+					'Prefix'			=>	'c',
+					'ItemClass'			=>	Array('class'=>'kDBItem','file'=>'','build_event'=>'OnItemBuild'),
+					'ListClass'			=>	Array('class'=>'kDBList','file'=>'','build_event'=>'OnListBuild'),
+					'EventHandlerClass'	=>	Array('class'=>'CategoriesEventHandler','file'=>'categories_event_handler.php','build_event'=>'OnBuild'),
+					'TagProcessorClass' =>	Array('class'=>'CategoriesTagProcessor','file'=>'categories_tag_processor.php','build_event'=>'OnBuild'),
+					'AutoLoad'			=>	true,					
+					'QueryString'		=>	Array(
+												1	=>	'id',
+												2	=>	'page',
+												3	=>	'event',
+											),
+					'IDField' 			=> 	'CategoryId',
+					'TableName'			=>	TABLE_PREFIX.'Category',
+											
+					'ListSQLs'			=>	Array(	''=>	'SELECT * FROM %s'),
+																		 // key - special, value - list select sql
+					'ItemSQLs'			=>	Array(	''=>	'SELECT * FROM %s'),
+					
+					'Fields' 			=> 	Array
+									        (
+									            'CategoryId' => Array('type' => 'int','not_null' => '1','default' => ''),
+									            'Type' => Array('type' => 'int','not_null' => '1','default' => '0'),
+									            'ParentId' => Array('type' => 'int','not_null' => '1','default' => '0'),
+									            'Name' => Array('type' => 'string','not_null' => '1','default' => ''),
+									            'Description' => Array('type' => 'string','not_null' => '1','default' => ''),
+									            'CreatedOn' => Array('type' => 'int','not_null' => '1','default' => '0'),
+									            'EditorsPick' => Array('type' => 'int','default' => ''),
+									            'Status' => Array('type' => 'int','not_null' => '1','default' => '0'),
+									            'Pop' => Array('type' => 'int','default' => ''),
+									            'Priority' => Array('type' => 'int','default' => ''),
+									            'MetaKeywords' => Array('type' => 'string','default' => ''),
+									            'CachedDescendantCatsQty' => Array('type' => 'int','default' => ''),
+									            'CachedNavbar' => Array('type' => 'string','not_null' => '1','default' => ''),
+									            'CreatedById' => Array('type' => 'int','not_null' => '1','default' => '0'),
+									            'ResourceId' => Array('type' => 'int','default' => ''),
+									            'ParentPath' => Array('type' => 'string','not_null' => '1','default' => ''),
+									            'MetaDescription' => Array('type' => 'string','default' => ''),
+									            'HotItem' => Array('type' => 'int','not_null' => '1','default' => '2'),
+									            'NewItem' => Array('type' => 'int','not_null' => '1','default' => '2'),
+									            'PopItem' => Array('type' => 'int','not_null' => '1','default' => '2'),
+									            'Modified' => Array('type' => 'int','not_null' => '1','default' => '0'),
+									            'ModifiedById' => Array('type' => 'int','not_null' => '1','default' => '0'),
+									        ),							    
+											
+					'Grids'	=> Array(
+								'Default'		=>	Array(
+																	'Icons' => Array('default'=>'icon16_cat.gif'),
+																	'Fields' => Array(
+																	'Name' => Array( 'width'=>150, 'title'=>'la_col_Title', 'data_block'=>'category_td' ),
+																			),
+																	
+																),
+													),
+	);
+
+?>
\ No newline at end of file

Property changes on: trunk/kernel/units/categories/categories_config.php
___________________________________________________________________
Added: cvs2svn:cvs-rev
## -0,0 +1 ##
+1.2
\ No newline at end of property
Added: svn:executable
## -0,0 +1 ##
+*
\ No newline at end of property
Index: trunk/kernel/units/categories/categories_tag_processor.php
===================================================================
--- trunk/kernel/units/categories/categories_tag_processor.php	(nonexistent)
+++ trunk/kernel/units/categories/categories_tag_processor.php	(revision 1310)
@@ -0,0 +1,73 @@
+<?php
+
+class CategoriesTagProcessor extends kDBTagProcessor {
+
+	function PrintList($params)
+	{
+		$list =& $this->Application->recallObject( $this->getPrefixSpecial(), $this->Prefix.'_List',$params);
+		$id_field = $this->Application->getUnitOption($this->Prefix,'IDField');
+
+		$cat_id = $this->Application->GetVar('m_cat_id') ? $this->Application->GetVar('m_cat_id') : 0;
+		$list->SetWhereClause( 'ParentId='.$this->Application->GetVar('m_cat_id') );
+		$list->Query();
+		$o = '';
+		$list->GoFirst();
+		
+		$block_params=$this->prepareTagParams($params);
+		$block_params['name']=$params['block'];
+		$block_params['pass_params']='true';
+			
+		while (!$list->EOL()) 
+		{
+			$block_params['cat_id'] = $list->GetDBField('CategoryId');
+			
+			$this->Application->SetVar( $this->getPrefixSpecial().'_id', $list->GetDBField($id_field) ); // for edit/delete links using GET
+			$o.= $this->Application->ParseBlock($block_params, 1);
+			$list->GoNext();
+		}
+		
+		$this->Application->SetVar( $this->getPrefixSpecial().'_id', '');
+		return $o;	
+	}
+	
+	function RootCategoryName($params)
+	{
+		$root_phrase = $this->Application->ConfigValue('Root_Name');
+		$ret = $this->Application->Phrase($root_phrase);
+		return $ret;
+	}
+	
+	function CategoryPath($params)
+	{
+		if(!isset($params['cat_id']))
+		{
+			$params['cat_id'] = $this->Application->GetVar('m_cat_id');
+			$block_params['current'] = 1;
+		}
+		$block_params['separator'] = $params['separator'];
+		if($params['cat_id'] == 0)
+		{
+			$block_params['name'] = $params['rootcatblock'];
+			return $this->Application->ParseBlock($block_params);
+		}
+		else 
+		{
+			$cat_object = $this->Application->recallObject( $this->getPrefixSpecial(), $this->Prefix.'_List' );
+			$sql = 'SELECT CategoryId, ParentId, Name FROM '.$cat_object->TableName.' WHERE CategoryId='.$params['cat_id'];
+			$res = $this->Conn->GetRow($sql);
+			$block_params['name'] = $params['block'];			
+			$block_params['cat_name'] = $res['Name'];
+			$block_params['separator'] = $params['separator'];
+			$block_params['cat_id'] = $res['CategoryId'];
+			$next_params['separator'] = $params['separator'];
+			$next_params['rootcatblock'] = $params['rootcatblock'];
+			$next_params['block'] = $params['block'];
+			$next_params['cat_id'] = $res['ParentId'];
+			return $this->CategoryPath($next_params).$this->Application->ParseBlock($block_params);
+		}
+	}
+	
+}
+
+
+?>
\ No newline at end of file

Property changes on: trunk/kernel/units/categories/categories_tag_processor.php
___________________________________________________________________
Added: cvs2svn:cvs-rev
## -0,0 +1 ##
+1.2
\ No newline at end of property
Added: svn:executable
## -0,0 +1 ##
+*
\ No newline at end of property
Index: trunk/kernel/units/categories/categories_event_handler.php
===================================================================
--- trunk/kernel/units/categories/categories_event_handler.php	(nonexistent)
+++ trunk/kernel/units/categories/categories_event_handler.php	(revision 1310)
@@ -0,0 +1,36 @@
+<?php
+
+class CategoriesEventHandler extends InpDBEventHandler {
+
+	/**
+	 * Enter description here...
+	 *
+	 * @param kEvent $event
+	 */
+	function OnCategoryUp(&$event)
+	{		
+		$cat_object = $this->Application->recallObject( $event->Prefix );
+		$current_cat = $this->Application->GetVar('m_cat_id');
+		if($current_cat)
+		{
+			$sql = 'SELECT ParentId FROM '.$cat_object->TableName.' WHERE CategoryId='.$current_cat;
+			$cat_to_go = $this->Conn->GetOne($sql);
+		}
+		else 
+		{
+			$cat_to_go = 0;
+		}
+		$event->redirect = 'in-commerce/product_selector';
+		$event->redirect_params = Array('m_cat_id' => $cat_to_go);
+	}
+	
+	function OnGoHome(&$event)
+	{
+		$cat_to_go = 0;
+		$event->redirect = 'in-commerce/product_selector';
+		$event->redirect_params = Array('m_cat_id' => $cat_to_go);
+	}
+
+}
+
+?>
\ No newline at end of file

Property changes on: trunk/kernel/units/categories/categories_event_handler.php
___________________________________________________________________
Added: cvs2svn:cvs-rev
## -0,0 +1 ##
+1.2
\ No newline at end of property
Added: svn:executable
## -0,0 +1 ##
+*
\ No newline at end of property
Index: trunk/kernel/units/configuration/configuration_config.php
===================================================================
--- trunk/kernel/units/configuration/configuration_config.php	(nonexistent)
+++ trunk/kernel/units/configuration/configuration_config.php	(revision 1310)
@@ -0,0 +1,52 @@
+<?php
+	
+$config	=	Array(
+					'Prefix'			=>	'conf',
+					'ItemClass'			=>	Array('class'=>'kDBItem','file'=>'','build_event'=>'OnItemBuild'),
+					'ListClass'			=>	Array('class'=>'kDBList','file'=>'','build_event'=>'OnListBuild'),
+					'EventHandlerClass'	=>	Array('class'=>'ConfigurationEventHandler','file'=>'configuration_event_handler.php','build_event'=>'OnBuild'),
+					'TagProcessorClass' =>	Array('class'=>'ConfigurationTagProcessor','file'=>'configuration_tag_processor.php','build_event'=>'OnBuild'),
+					'AutoLoad'			=>	true,
+					'hooks'				=>	Array(),
+					'QueryString'		=>	Array(
+												1	=>	'id',
+												2	=>	'page',
+												3	=>	'event',
+												4	=>	'module',
+												5	=>	'section',
+											),
+					'IDField'			=>	'VariableName',
+
+					'TitlePresets'		=>	Array(
+												'config_list' => Array('prefixes' => Array('conf_List'), 'format' => "!la_updating_config!"),
+											),
+					
+					'TableName'			=>	TABLE_PREFIX.'ConfigurationValues',
+					'ListSQLs'			=>	Array(''=>'SELECT * FROM '.TABLE_PREFIX.'ConfigurationAdmin LEFT JOIN '.TABLE_PREFIX.'ConfigurationValues Using(VariableName) '),
+					
+					
+					'ItemSQLs'			=>	Array(''=>'SELECT * FROM '.TABLE_PREFIX.'ConfigurationAdmin LEFT JOIN '.TABLE_PREFIX.'ConfigurationValues Using(VariableName) '),
+																		
+					'SubTables'		=> Array(),
+					
+				  'Fields' 		=>	Array(
+									        'VariableName' => Array('type' => 'string','not_null' => '1','default' => ''),
+									        'VariableValue' => array('type'=>'string', 'default'=>''),
+									        'ModuleOwner'	=>	array('type'=>'string', 'default'=>'In-Portal'),
+									        'Section'	=>	array('type'=>'string','not_null' => '1','default'=>''),
+											),
+
+					'VirtualFields'	=> 	Array(
+											'heading' => Array('type' => 'string','default' => ''),
+									        'prompt' => Array('type' => 'string','default' => ''),
+									        'element_type' => Array('type' => 'string','not_null' => '1','default' => ''),
+									        'validation' => Array('type' => 'string','default' => ''),
+									        'ValueList' => Array('type' => 'string','default' => ''),
+									        'DisplayOrder' => Array('type' => 'int','not_null' => '1','default' => '0'),
+									        'Install' => Array('type' => 'int','not_null' => '1','default' => '1'),
+											),
+											
+					'Grids'	=> Array(),
+	);
+
+?>
\ No newline at end of file

Property changes on: trunk/kernel/units/configuration/configuration_config.php
___________________________________________________________________
Added: cvs2svn:cvs-rev
## -0,0 +1 ##
+1.2
\ No newline at end of property
Added: svn:executable
## -0,0 +1 ##
+*
\ No newline at end of property
Index: trunk/kernel/units/configuration/configuration_tag_processor.php
===================================================================
--- trunk/kernel/units/configuration/configuration_tag_processor.php	(nonexistent)
+++ trunk/kernel/units/configuration/configuration_tag_processor.php	(revision 1310)
@@ -0,0 +1,57 @@
+<?php
+
+class ConfigurationTagProcessor extends kDBTagProcessor {
+	
+	function PrintList($params)
+	{
+		$list =& $this->Application->recallObject( $this->getPrefixSpecial(), $this->Prefix.'_List',$params);
+		$id_field = $this->Application->getUnitOption($this->Prefix,'IDField');
+		
+		$list->PerPage=-1;
+		$list->Query();
+		$o = '';
+		$list->GoFirst();
+		
+		$block_params=$this->prepareTagParams($params);
+		$block_params['name']=$params['block'];
+		$block_params['pass_params']='true';
+		$block_params['IdField'] = $id_field;
+		
+		$next_block=$params['full_block'];
+		
+		$prev_title="";
+		
+		while (!$list->EOL()) 
+		{
+			$nextItemPrompt=$list->Records[$list->CurrentIndex+1]['prompt'];
+			$thisItemPrompt=$list->Records[$list->CurrentIndex]['prompt'];
+
+			$this_title=$list->Records[$list->CurrentIndex]['heading'];
+
+			if ($this_title!=$prev_title){
+				$prev_title=$this_title;
+				$section_header_params=array();
+				$section_header_params['name']='config_section_header';
+				$section_header_params['title']=$this->Application->Phrase($this_title);
+				$o.= $this->Application->ParseBlock($section_header_params, 1);
+			}
+
+			if ($nextItemPrompt==$thisItemPrompt){
+				$curr_block=$params['half_block1'];
+				$next_block=$params['half_block2'];
+			}else{
+				$curr_block=$next_block;
+				$next_block=$params['full_block'];
+			}
+			$block_params['name']=$curr_block;
+			
+			$this->Application->SetVar( $this->getPrefixSpecial().'_id', $list->GetDBField($id_field) );
+			$o.= $this->Application->ParseBlock($block_params, 1);
+			
+			$list->GoNext();
+		}
+		return $o;	
+	}
+}
+
+?>
\ No newline at end of file

Property changes on: trunk/kernel/units/configuration/configuration_tag_processor.php
___________________________________________________________________
Added: cvs2svn:cvs-rev
## -0,0 +1 ##
+1.2
\ No newline at end of property
Added: svn:executable
## -0,0 +1 ##
+*
\ No newline at end of property
Index: trunk/kernel/units/configuration/configuration_event_handler.php
===================================================================
--- trunk/kernel/units/configuration/configuration_event_handler.php	(nonexistent)
+++ trunk/kernel/units/configuration/configuration_event_handler.php	(revision 1310)
@@ -0,0 +1,102 @@
+<?php
+
+	class ConfigurationEventHandler extends InpDBEventHandler  {
+	
+		/**
+		 * Apply any custom changes to list's sql query
+		 *
+		 * @param kEvent $event
+		 * @access protected
+		 * @see OnListBuild
+		 */
+		function SetCustomQuery(&$event)
+		{
+			$object =& $event->getObject();
+			
+			$module_owner=$this->Application->GetVar('module');
+			if ($module_owner===false) {
+					$module_owner=$this->myUrlDecode($this->Application->GetVar('conf_module'));
+					$this->Application->SetVar("module", $module_owner);
+			}
+
+			$section=$this->Application->GetVar('section');
+			if ($section===false){
+					$section=$this->myUrlDecode($this->Application->GetVar('conf_section'));
+					$this->Application->SetVar("section", $section);
+			}
+			
+			$object->SetWhereClause('%1$s.ModuleOwner="'.$module_owner.'" AND %1$s.Section="'.$section.'"');
+			$object->AddOrderField('DisplayOrder', 'ASC');
+		}
+
+		/**
+		 * Enter description here...
+		 *
+		 * @param kEvent $event
+		 */
+		function OnBeforeItemUpdate(&$event)
+		{
+			$object =& $event->getObject();
+			if($object->GetDBField('element_type') == 'password')
+			{
+				if (trim($object->GetDBField('VariableValue'))=='') {
+					$field_options=$object->GetFieldOptions('VariableValue');
+					$field_options['skip_empty']=1;
+					$object->SetFieldOptions('VariableValue', $field_options);
+				}else{
+					$object->SetDBField('VariableValue', md5($object->GetDBField('VariableValue')));
+				}
+			}
+		}	
+			
+		/**
+		 * Enter description here...
+		 *
+		 * @param kEvent $event
+		 */
+		function OnAfterItemUpdate(&$event)
+		{
+			$object =& $event->getObject();
+			if($object->GetDBField('element_type') == 'password')
+			{
+				if (trim($object->GetDBField('VariableValue'))=='') {
+					$field_options=$object->GetFieldOptions('VariableValue');
+					unset($field_options['skip_empty']);
+					$object->SetFieldOptions('VariableValue', $field_options);
+				}
+			}
+		}		
+		
+		
+		function OnUpdate(&$event)
+		{
+			parent::OnUpdate($event);
+			$module_owner=$this->Application->GetVar('module');
+			$section=$this->Application->GetVar('section');
+			
+			$event->redirect_params = Array('opener' => 's','conf_section'=>$this->myUrlEncode($section), 'conf_module'=>$this->myUrlEncode($module_owner),'pass'=>'all,conf'); //stay!
+		}
+
+		function OnCancel(&$event)
+		{
+			parent::OnCancel($event);
+			$module_owner=$this->Application->GetVar('module');
+			$section=$this->Application->GetVar('section');
+			
+			$event->redirect_params = Array('opener' => 's','conf_section'=>$this->myUrlEncode($section), 'conf_module'=>$this->myUrlEncode($module_owner),'pass'=>'all,conf'); //stay!
+		}
+				
+		function myUrlDecode($str){
+			$str=str_replace(';',':', $str);
+			$str=str_replace('!','-', $str);
+			return $str;
+		}
+		function myUrlEncode($str){
+			$str=str_replace('-', '!', $str);
+			$str=str_replace(':', ';', $str);
+			return $str;
+		}
+
+	}
+
+?>
\ No newline at end of file

Property changes on: trunk/kernel/units/configuration/configuration_event_handler.php
___________________________________________________________________
Added: cvs2svn:cvs-rev
## -0,0 +1 ##
+1.2
\ No newline at end of property
Added: svn:executable
## -0,0 +1 ##
+*
\ No newline at end of property
Index: trunk/kernel/units/custom_values/custom_values_config.php
===================================================================
--- trunk/kernel/units/custom_values/custom_values_config.php	(nonexistent)
+++ trunk/kernel/units/custom_values/custom_values_config.php	(revision 1310)
@@ -0,0 +1,90 @@
+<?php
+	
+$config	=	Array(
+					'Prefix'			=>	'cv',
+					'ItemClass'			=>	Array('class'=>'kDBItem','file'=>'','build_event'=>'OnItemBuild'),
+					'ListClass'			=>	Array('class'=>'kDBList','file'=>'','build_event'=>'OnListBuild'),
+					'EventHandlerClass'	=>	Array('class'=>'CustomValuesEventHandler','file'=>'custom_value_event_handler.php','build_event'=>'OnBuild'),
+					'TagProcessorClass' =>	Array('class'=>'kDBTagProcessor','file'=>'','build_event'=>'OnBuild'),
+
+					'AutoLoad'			=>	true,
+					'Hooks'	=>	Array( 
+												Array(
+													'Mode' => hAFTER,
+													'Conditional' => true,
+													'HookToPrefix' => 'p',
+													'HookToSpecial' => '',
+													'HookToEvent' => Array( 'onPreSave' ),
+													'DoPrefix' => '',
+													'DoSpecial' => '',
+													'DoEvent' => 'onPreSave',
+												),
+												Array(
+													'Mode' => hAFTER,
+													'Conditional' => true,
+													'HookToPrefix' => 'p',
+													'HookToSpecial' => '',
+													'HookToEvent' => Array( 'onPreSave' ),
+													'DoPrefix' => '',
+													'DoSpecial' => 'general',
+													'DoEvent' => 'onPreSave',
+												),
+											),
+					'QueryString'		=>	Array(
+												1	=>	'id',
+												2	=>	'page',
+												3	=>	'event',
+											),
+					
+					'TableName'		=>	TABLE_PREFIX.'CustomMetaData',
+					'IDField'			=>	'CustomDataId',	// in this case idfield doesn't exit in destination table
+					
+					'ParentTableKey'=>	'ResourceId',
+					'ForeignKey'	=>	'ResourceId',
+					'ParentPrefix'	=> 'p',
+					'AutoDelete'	=>	true,
+					'AutoClone'	=> true,
+					
+					'ListSQLs'			=>	Array(	
+																'' => "
+																		SELECT 
+																			cf.FieldName, cf.Prompt, cf.CustomFieldId, cf.ElementType, cf.ValueList, cf.DisplayOrder,
+																			%1\$s as ResourceId, 
+																			cmd.CustomDataId, cmd.Value
+																		FROM inp_CustomField AS cf
+																		LEFT JOIN %%1\$s AS cmd
+																		ON cmd.CustomFieldId = cf.CustomFieldId AND ResourceId = %1\$s",
+																), // key - special, value - list select sql
+															
+															
+															
+					'ItemSQLs'			=>	Array(	''=>'SELECT * FROM %s',
+																		),
+					
+					'Fields'			=>	Array(
+											    'CustomDataId' => Array(),
+													'CustomFieldId' => Array('not_null' => '1', 'default'=>''),
+											    'ResourceId' => Array('not_null' => 1, 'default' => 0),
+											    'Value' => Array('not_null' => true, 'default' => ''),
+											),
+					'VirtualFields'	=> 	Array(
+													'FieldName' => Array(),
+													'Prompt' => Array(),
+													'ElementType' => Array(),
+													'ValueList' => Array(),
+													
+							),
+											
+					'Grids'	=> Array(
+								'Default'		=>	Array(
+																	'Icons' => Array('default'=>'icon16_custom.gif'),	// icons for each StatusField values, if no matches or no statusfield selected, then "default" icon is used
+																	'Fields' => Array(
+																			'FieldName' => Array( 'title'=>'la_col_FieldName', 'data_block' => 'grid_icon_td'),
+																			'Prompt' => Array( 'title'=>'la_col_Prompt', 'data_block' => 'grid_data_label_td' ),
+																			'Value' => Array( 'title'=>'la_col_Value', 'data_block' => 'edit_custom_td'),
+																		),
+																),
+													),
+	);
+
+?>
\ No newline at end of file

Property changes on: trunk/kernel/units/custom_values/custom_values_config.php
___________________________________________________________________
Added: cvs2svn:cvs-rev
## -0,0 +1 ##
+1.2
\ No newline at end of property
Added: svn:executable
## -0,0 +1 ##
+*
\ No newline at end of property
Index: trunk/kernel/units/custom_values/custom_value_event_handler.php
===================================================================
--- trunk/kernel/units/custom_values/custom_value_event_handler.php	(nonexistent)
+++ trunk/kernel/units/custom_values/custom_value_event_handler.php	(revision 1310)
@@ -0,0 +1,93 @@
+<?php
+
+class CustomValuesEventHandler extends InpDBEventHandler {
+	
+	
+	function SetCustomQuery(&$event)
+	{
+		$object =& $event->getObject();
+		
+		$top_prefix = $this->GetTopmostPrefix($event);
+		$item_type = $this->Application->getUnitOption($top_prefix, 'ItemType');
+		
+		$item_resource_id = $this->GetParentResourceId($event);
+		
+		// there is no ResourceId when creating new item, but we need some id for SQL to work
+		if (!$item_resource_id) $item_resource_id = 0; 
+				
+		$sql = $object->SelectClause;
+		$sql = sprintf($sql, $item_resource_id);
+		$object->setSelectSQL($sql);
+		
+		$where_clause='Type = '.$item_type;
+		if ($event->Special=="general"){
+			$where_clause.=' AND OnGeneralTab=1';
+		}
+		$object->SetWhereClause($where_clause);
+		
+		$object->AddOrderField('DisplayOrder', 'ASC');
+		$object->SetPerPage(-1);
+	}
+	
+	function GetParentResourceId(&$event)
+	{
+		$top_object = $this->Application->RecallObject( $this->GetTopmostPrefix($event) );
+		return $top_object->GetDBField('ResourceId');
+	}
+	
+	function OnPreSave(&$event)
+	{
+		$object =& $event->getObject();
+		
+		$items_info = $this->Application->GetVar( $event->getPrefixSpecial(true) );
+		if($items_info)
+		{
+			foreach($items_info as $custom_field_id => $values)
+			{
+				$set_values = Array(
+					'CustomFieldId' => $custom_field_id,
+					'Value' => $values['Value'],
+					'ResourceId' => $values['ResourceId'] != 0 ? $values['ResourceId'] : $this->GetParentResourceId($event),
+				);
+				
+				// ResourceId will be -1 if we are creating new product, then we get ID directly, 
+				// because it should be already set by parent' event, as we are in hAFTER hook
+				
+				$id = $values['CustomDataId'];
+				if ($id) { //if it's already existing custom field record - update id
+					$object->SetDefaultValues();
+					$object->Load($id);
+	 				$object->SetFieldsFromHash($set_values);
+					if( $object->Update($id) )
+					{
+						$event->status=erSUCCESS;
+					}
+					else 
+					{
+						$event->status=erFAIL;
+						$event->redirect=false;
+						break;
+					}
+				}
+				else { //new custom field record - create it and set temp id!
+					$object->SetDefaultValues();
+	 				$object->SetFieldsFromHash($set_values);
+					if( $object->Create() )
+					{
+						$object->setTempID();
+						$event->status=erSUCCESS;
+					}
+				}
+			}	
+		}
+		
+		// this is critical, as the object here is Item, but if something fails, the template could use the same name as grid
+		// the problem appeared on products general tab, when validation does not go through for product,
+		// and the templates is getting parsed
+		$this->Application->removeObject($event->Prefix_Special);
+	
+	}
+	
+}
+
+?>
\ No newline at end of file

Property changes on: trunk/kernel/units/custom_values/custom_value_event_handler.php
___________________________________________________________________
Added: cvs2svn:cvs-rev
## -0,0 +1 ##
+1.2
\ No newline at end of property
Added: svn:executable
## -0,0 +1 ##
+*
\ No newline at end of property
Index: trunk/kernel/units/general/inp_db_event_handler.php
===================================================================
--- trunk/kernel/units/general/inp_db_event_handler.php	(nonexistent)
+++ trunk/kernel/units/general/inp_db_event_handler.php	(revision 1310)
@@ -0,0 +1,145 @@
+<?php
+
+	class InpDBEventHandler extends kDBEventHandler 
+	{
+		
+		function mapEvents()
+		{
+			$common_events = Array(	'onMassApprove'=>'iterateItems',
+									'onMassDecline'=>'iterateItems',
+									'onMassMoveUp'=>'iterateItems',
+									'onMassMoveDown'=>'iterateItems',
+								);
+			
+			$this->eventMethods = array_merge($this->eventMethods, $common_events);
+		}
+		
+		/**
+		 * Apply same processing to each item beeing selected in grid
+		 *
+		 * @param kEvent $event
+		 * @access private
+		 */
+		function iterateItems(&$event)
+		{
+			$this->Application->setUnitOption($event->Prefix,'AutoLoad',false);
+			$object =& $event->getObject();
+			$this->StoreSelectedIDs($event);
+			$ids=$this->getSelectedIDs($event);
+	
+			if($ids)
+			{
+				$status_field = array_shift( $this->Application->getUnitOption($event->Prefix,'StatusField') );
+				
+				foreach($ids as $id)
+				{
+					$object->Load($id);
+					
+					switch ($event->Name)
+					{
+						case 'onMassApprove':
+							$object->SetDBField($status_field, 1);
+							break;
+					
+						case 'onMassDecline':
+							$object->SetDBField($status_field, 0);
+							break;
+							
+						case 'onMassMoveUp':
+							$object->SetDBField('Priority', $object->GetDBField('Priority') + 1);
+							break;
+							
+						case 'onMassMoveDown':
+							$object->SetDBField('Priority', $object->GetDBField('Priority') - 1);
+							break;
+					}
+					
+					if( $object->Update() )
+					{
+						$event->status=erSUCCESS;
+						$event->redirect_params = Array('opener' => 's', 'pass_events' => true); //stay!
+					}
+					else
+					{
+						$event->status=erFAIL;
+						$event->redirect=false;
+						break;
+					}
+				}
+			}
+		}
+		
+		/**
+		 * Enter description here...
+		 *
+		 * @param kEvent $event
+		 */
+		function OnMassClone(&$event)
+		{
+			$event->status=erSUCCESS;
+			
+			$temp =& $this->Application->recallObject($event->getPrefixSpecial().'_TempHandler', 'kTempTablesHandler');
+			
+			$this->StoreSelectedIDs($event);
+			$ids=$this->getSelectedIDs($event);
+			
+			if($ids)
+			{
+				$temp->CloneItems($event->Prefix, $event->Special, $ids);
+			}
+		}
+		
+		function check_array($records, $field, $value)
+		{
+			foreach ($records as $record)
+			{
+				if ($record[$field] == $value)
+				{
+					return true;
+				}
+			}
+			return false;
+		}
+		
+		/**
+		 * Split one timestamp field into 2 virtual fields
+		 *
+		 * @param kEvent $event
+		 * @access public
+		 */
+		function loadTSField(&$event, $ts_field, $date_field, $time_field)
+		{
+			$object =& $event->getObject();
+			$timestamp = $object->GetDBField($ts_field);
+			if( isset($timestamp) && $timestamp )
+			{
+				$options = $object->GetFieldOptions($date_field);
+				$formatter =& $this->Application->recallObject($options['formatter']);
+				$object->SetField( $date_field, $formatter->Format($timestamp, $options, $errors) );
+
+				$options = $object->GetFieldOptions($time_field);
+				$formatter =& $this->Application->recallObject($options['formatter']);
+				$object->SetField( $time_field, $formatter->Format($timestamp, $options, $errors) );
+			}
+		}
+		
+		/**
+		 * Save date & time virtual fields back to timestamp field
+		 *
+		 * @param kEvent $event
+		 * @access public
+		 */
+		function saveTSField(&$event, $ts_field, $date_field, $time_field)
+		{
+			$object =& $event->getObject();
+			$date_value = $object->GetDBField($date_field);
+			$time_value = $object->GetDBField($time_field);
+			$time_zone_offset = date('Z', time() ); // !!! this is important
+			
+			$object->SetDBField($ts_field, $date_value+$time_value+$time_zone_offset);
+		}
+		
+	}
+
+
+?>
\ No newline at end of file

Property changes on: trunk/kernel/units/general/inp_db_event_handler.php
___________________________________________________________________
Added: cvs2svn:cvs-rev
## -0,0 +1 ##
+1.2
\ No newline at end of property
Added: svn:executable
## -0,0 +1 ##
+*
\ No newline at end of property
Index: trunk/kernel/units/general/cat_dbitem.php
===================================================================
--- trunk/kernel/units/general/cat_dbitem.php	(nonexistent)
+++ trunk/kernel/units/general/cat_dbitem.php	(revision 1310)
@@ -0,0 +1,113 @@
+<?php
+
+class kCatDBItem extends kDBItem {
+	
+	function Create()
+	{
+		if (!$this->Validate()) return false;
+		
+		$this->SetDBField('ResourceId', $this->Application->NextResourceId());
+		$this->SetDBField('Modified', mktime());
+		
+		$ret = parent::Create();
+		if($ret)
+		{
+			if ( kTempTablesHandler::IsTempTable($this->TableName) ) {
+				$table = kTempTablesHandler::GetTempName(TABLE_PREFIX.'CategoryItems');
+			}
+			else {
+				$table = TABLE_PREFIX.'CategoryItems';
+			}
+			$cat_id = $this->Application->GetVar('m_cat_id');
+			$query = 'INSERT INTO '.$table.' (CategoryId,ItemResourceId,PrimaryCat)
+								VALUES ('.$cat_id.','.$this->GetField('ResourceId').',1)';
+			$this->Conn->Query($query);
+		}
+		return $ret;
+	}
+	
+	function Update($id=null)
+	{
+		$this->VirtualFields['ResourceId'] = true;
+		$this->SetDBField('Modified', mktime());
+		return parent::Update($id);
+	}
+	
+	function Copy($cat_id=null)
+	{
+		if (!isset($cat_id)) $cat_id = $this->Application->GetVar('m_cat_id');
+		$this->NameCopy($cat_id);
+		return $this->Create($cat_id);
+	}
+	
+	function NameCopy($master=null, $foreign_key=null)
+	{
+		$title_field = $this->Application->getUnitOption($this->Prefix, 'TitleField');
+		if (!$title_field) return;
+		
+		$new_name = $this->GetDBField('Name');
+		$cat_id = $this->Application->GetVar('m_cat_id');
+		$original_checked = false;
+		do {
+			if ( preg_match("/Copy ([0-9]*)[ ]*of(.*)/", $new_name, $regs) ) {
+				$new_name = 'Copy '.($regs[1]+1).' of '.$regs[2];
+			}
+			elseif ($original_checked) {
+				$new_name = 'Copy of '.$new_name;
+			}
+			$query = 'SELECT '.$title_field.' FROM '.$this->TableName.'
+								LEFT JOIN '.TABLE_PREFIX.'CategoryItems ON 
+								('.TABLE_PREFIX.'CategoryItems.ItemResourceId = '.$this->TableName.'.ResourceId)
+								WHERE ('.TABLE_PREFIX.'CategoryItems.CategoryId = '.$cat_id.') AND '.
+								$title_field.' = '.$this->Conn->qstr($new_name);
+			$res = $this->Conn->GetOne($query);
+			$original_checked = true;
+		} while ($res !== false);
+		$this->SetDBField($title_field, $new_name);
+	}
+	
+	function MoveToCat($cat_id=null)
+	{
+//		$this->NameCopy();
+		$cat_id = $this->Application->GetVar('m_cat_id');
+		// check if the product already exists in destination cat
+		$query = 'SELECT PrimaryCat FROM '.TABLE_PREFIX.'CategoryItems 
+							WHERE CategoryId = '.$cat_id.' AND ItemResourceId = '.$this->GetDBField('ResourceId');
+		// if it's not found is_primary will be FALSE, if it's found but not primary it will be int 0
+		$is_primary = $this->Conn->GetOne($query); 
+		$exists = $is_primary !== false;
+		
+		if ($exists) { // if the Product already exists in destination category
+			if ($is_primary) return; // do nothing when we paste to primary
+			// if it's not primary - delete it from destination category, 
+			// as we will move it from current primary below
+			$query = 'DELETE FROM '.TABLE_PREFIX.'CategoryItems 
+								WHERE ItemResourceId = '.$this->GetDBField('ResourceId').' AND CategoryId = '.$cat_id;
+			$this->Conn->Query($query);
+			
+		}
+		$query = 'UPDATE '.TABLE_PREFIX.'CategoryItems SET CategoryId = '.$cat_id.
+						 ' WHERE ItemResourceId = '.$this->GetDBField('ResourceId').' AND PrimaryCat = 1';	
+		$this->Conn->Query($query);
+		$this->Update();
+	}
+	
+	// We need to delete CategoryItems record when deleting product
+	function Delete($id=null)
+	{
+		if( isset($id) ) {
+			$this->setID($id);
+		}
+		$this->Load($this->GetID());
+		
+		$ret = parent::Delete();
+		if ($ret) {
+			$query = 'DELETE FROM '.TABLE_PREFIX.'CategoryItems WHERE ItemResourceId = '.$this->GetDBField('ResourceId');
+			$this->Conn->Query($query);
+		}
+		
+		return $ret;
+	}
+}
+
+?>
\ No newline at end of file

Property changes on: trunk/kernel/units/general/cat_dbitem.php
___________________________________________________________________
Added: cvs2svn:cvs-rev
## -0,0 +1 ##
+1.2
\ No newline at end of property
Added: svn:executable
## -0,0 +1 ##
+*
\ No newline at end of property
Index: trunk/kernel/units/general/inp_login_event_handler.php
===================================================================
--- trunk/kernel/units/general/inp_login_event_handler.php	(nonexistent)
+++ trunk/kernel/units/general/inp_login_event_handler.php	(revision 1310)
@@ -0,0 +1,18 @@
+<?php
+
+	class InpLoginEventHandler extends kEventHandler 
+	{
+		function OnSessionExpire()
+		{
+			$admin_dir = $this->Application->ConfigValue('AdminDirectory');
+			if(!$admin_dir) $admin_dir = 'admin';
+			$location = $this->Application->BaseURL().$admin_dir.'/index.php?expired=1';
+			header('Location: '.$location);
+			exit;
+		}
+		
+		
+	}
+
+
+?>
\ No newline at end of file

Property changes on: trunk/kernel/units/general/inp_login_event_handler.php
___________________________________________________________________
Added: cvs2svn:cvs-rev
## -0,0 +1 ##
+1.2
\ No newline at end of property
Added: svn:executable
## -0,0 +1 ##
+*
\ No newline at end of property
Index: trunk/kernel/units/general/inp_unit_config_reader.php
===================================================================
--- trunk/kernel/units/general/inp_unit_config_reader.php	(nonexistent)
+++ trunk/kernel/units/general/inp_unit_config_reader.php	(revision 1310)
@@ -0,0 +1,19 @@
+<?php
+
+	class InpUnitConfigReader extends kUnitConfigReader 
+	{
+		/**
+		 * Scan kernel and user classes
+		 * for available configs
+		 *
+		 * @access protected
+		 */
+		function Init($prefix,$special)
+		{
+			parent::Init($prefix,$special);
+			$this->processFolder(DOC_ROOT.BASE_PATH);
+		}
+	}
+
+
+?>
\ No newline at end of file

Property changes on: trunk/kernel/units/general/inp_unit_config_reader.php
___________________________________________________________________
Added: cvs2svn:cvs-rev
## -0,0 +1 ##
+1.2
\ No newline at end of property
Added: svn:executable
## -0,0 +1 ##
+*
\ No newline at end of property
Index: trunk/kernel/units/general/custom_fields.php
===================================================================
--- trunk/kernel/units/general/custom_fields.php	(nonexistent)
+++ trunk/kernel/units/general/custom_fields.php	(revision 1310)
@@ -0,0 +1,69 @@
+<?php
+
+class InpCustomFieldsHelper extends kDBBase {
+	
+	
+	function GetValuesHash($values_list)
+	{
+		$optionValuesStr = $this->ParseConfigSQL($values_list);
+		$optionValuesTmp=explode(',', $optionValuesStr);	
+		$optionValues=array();
+		foreach ($optionValuesTmp as $optionValue){
+			list($key, $val) = explode("=", $optionValue);
+			
+			if (substr($val,0,1)=="+")
+				$val = substr($val, 1);
+			else
+				$val = $this->Application->Phrase($val);
+			
+			$optionValues[$key]=$val;
+		}
+		return $optionValues;
+	}
+
+	function ParseConfigSQL($valueString){
+		$string = trim(str_replace("<PREFIX>",TABLE_PREFIX,$valueString));
+		
+		$start = strpos($string,"<SQL>");
+		
+		while($start){
+			$end = strpos($string,"</SQL>");
+			if(!$end){
+				$end = strlen($string);
+			}
+			$len = $end - $start;
+			$sql = substr($string,$start+5,$len-5);
+			
+			$sql_val = $this->QueryConfigSQL($sql);
+			
+			/*if ($start>0 && $sql_val!='') 
+		  		$sql_val=",".$sql_val;*/
+		  	if ($end < strlen($string)-6 && $sql_val!='')
+		  		$sql_val.=",";			
+			
+		  	$chunk1=substr($string,0,$start);
+		  	$chunk2=substr($string,$end+6);
+			$s = $chunk1.$sql_val.$chunk2;
+			
+			
+			$string = $s;
+			$start = strpos($string,"<SQL>"); 
+		}
+		return $string;
+	}
+
+	function QueryConfigSQL($sql){
+		$db =& $this->Application->GetADODBConnection();
+
+		$valArray=$db->Query($sql);
+		for ($i=0; $i<sizeof($valArray); $i++){
+			$valArray[$i] = $valArray[$i]['OptionName']."="."+".$valArray[$i]['OptionValue'];
+			$valArray[$i] = str_replace(',', ';', $valArray[$i]);
+		}
+		return implode(',', $valArray);
+	}
+	
+	
+}
+
+?>
\ No newline at end of file

Property changes on: trunk/kernel/units/general/custom_fields.php
___________________________________________________________________
Added: cvs2svn:cvs-rev
## -0,0 +1 ##
+1.2
\ No newline at end of property
Added: svn:executable
## -0,0 +1 ##
+*
\ No newline at end of property
Index: trunk/kernel/units/general/general_config.php
===================================================================
--- trunk/kernel/units/general/general_config.php	(nonexistent)
+++ trunk/kernel/units/general/general_config.php	(revision 1310)
@@ -0,0 +1,21 @@
+<?php
+
+$config	=	Array(
+					'Prefix'			=>	'm',
+					'hooks'				=>	Array(),
+					'QueryString'		=>	Array(
+												1	=>	'cat_id',
+												2	=>	'cat_page',
+												3	=>	'lang',
+												4	=>	'theme',
+												5	=>	'opener',
+											),
+					'TitleField'		=>	'CachedNavbar',
+					'TitlePhrase'		=>	'la_Text_Category',
+					'ItemType'			=>	1,
+					'TableName'			=>	TABLE_PREFIX.'Category',					
+				
+					'PortalStyleEnv' => true,
+					);
+					
+?>
\ No newline at end of file

Property changes on: trunk/kernel/units/general/general_config.php
___________________________________________________________________
Added: cvs2svn:cvs-rev
## -0,0 +1 ##
+1.2
\ No newline at end of property
Added: svn:executable
## -0,0 +1 ##
+*
\ No newline at end of property
Index: trunk/kernel/units/general/inp1_parser.php
===================================================================
--- trunk/kernel/units/general/inp1_parser.php	(nonexistent)
+++ trunk/kernel/units/general/inp1_parser.php	(revision 1310)
@@ -0,0 +1,155 @@
+<?php
+
+class Inp1Parser extends kBase {
+	
+	var $InportalInited = false;
+	
+	function Parse($tname, $template_body)
+	{
+		if ( !$this->InportalInited) {
+			$this->InitInPortal();
+		}
+		global $objTemplate;
+		$template_body = $objTemplate->ParseTemplateFromBuffer($tname, $template_body);
+		return $template_body;
+	}
+	
+	
+	function InitInPortal()
+	{
+		$this->InportalInited = true;
+		/*global 	$pathtoroot, $FrontEnd, $indexURL, $rootURL, $secureURL, $var_list, $CurrentTheme, 
+						$objThemes, $objConfig, $m_var_list, $timeout, $objLanguages, $objLanguageCache, 
+						$TemplateRoot, $objTemplate, $html, $objSession, $Errors, $objCatList, $objUsers, 
+						$env, $mod_prefix, $ExtraVars, $timestart, $timeend, $timeout, $sqlcount, $totalsql,
+						$template_path, $modules_loaded, $mod_root_cats, $objModules, $objItemTypes;*/
+						
+						
+		global $sec, $usec, $timestart, $pathtoroot, $FrontEnd, $indexURL, $kernel_version, $FormError, 
+		$FormValues, $ItemTables, $KeywordIgnore, $debuglevel, 
+		$LogLevel, $LogFile, $rq_value, $rq_name, $dbg_constMap, $dbg_constValue, $dbg_constName, 
+		$debugger, $g_LogFile, $LogData, $Errors, 
+		$g_DebugMode, $totalsql, $sqlcount, $objConfig, $ItemTypePrefixes, $ItemTagFiles, $objModules, 
+		$objSystemCache, $objBanList, $objItemTypes, $objThemes, $objLanguages, $objImageList, $objFavorites,
+		$objUsers, $objGroups, $DownloadId, $objPermissions, $objPermCache, $m_var_list, $objCatList, 
+		$objCustomFieldList, $objCustomDataList, $objCountCache, $CRLF, $objMessageList, $objEmailQueue, 
+		$ExtraVars, $adodbConnection, $sql, $rs, $mod_prefix, $modules_loaded, $name, 
+		$template_path, $mod_root_cats, $value, $mod, $ItemTypes, 
+		$ParserFiles, $SessionQueryString, $var_list, $objSession, 
+		$orderByClause, $TemplateRoot, $ip, $UseSession, $Action, $CookieTest, $sessionId, 
+		$var_list_update, $CurrentTheme, $UserID, $objCurrentUser, $objLanguageCache, 
+		$folder_name, $objLinkList, $tag_override, $timeZones, $siteZone, $serverZone, 
+		$lastExpire, $diffZone, $date, $nowDate, $lastExpireDate, $SearchPerformed, 
+		$TotalMessagesSent, $ado, $adminDir, $rootURL, $secureURL, $html, $timeout, 
+		$pathchar, $objTemplate;
+		
+		$pathtoroot = "./";
+		$pathtoroot = realpath($pathtoroot)."/";
+		
+		if (!file_exists($pathtoroot."config.php")) {
+			echo "In-Portal is probably not installed, or configuration file is missing.<br>";
+			echo "Please use the installation script to fix the problem.<br><br>";
+			echo "<a href='admin/install.php'>Go to installation script</a><br><br>";
+			flush();
+			die();
+		}
+		
+		//ob_start();
+		$FrontEnd=1;
+		
+		$indexURL="../../index.php"; //Set to relative URL from the theme directory
+		
+		/* initalize the in-portal system */
+		include_once(FULL_PATH."/kernel/startup.php");
+		
+		$rootURL="http://".ThisDomain().$objConfig->Get("Site_Path");
+		
+		//$secureURL = "https://".ThisDomain().$objConfig->Get("Site_Path");
+		$secureURL = $rootURL;
+		
+		$html= '';
+		
+		if( !$var_list['t'] ) $var_list['t'] = 'index';
+		
+		if( !isset($CurrentTheme) ) $CurrentTheme = null;
+		if( !is_object($CurrentTheme) ) $CurrentTheme = $objThemes->GetItem($m_var_list["theme"]);
+		
+		if(is_object($CurrentTheme))
+		{
+			if(!$CurrentTheme->Get("Enabled"))
+			{
+				$CurrentTheme = $objThemes->GetItem($objThemes->GetPrimaryTheme());
+			}
+			if((int)$CurrentTheme->Get("ThemeId")>0)
+			{
+		      $timeout = $CurrentTheme->Get("CacheTimeout");
+		      $objLanguageCache->LoadTemplateCache($var_list["t"],$timeout,$CurrentTheme->Get("ThemeId"));
+		      $objLanguageCache->LoadCachedVars($objSession->Get("Language"));
+		
+		  	  $TemplateRoot = $CurrentTheme->ThemeDirectory()."/";
+		
+			  $objTemplate = new clsTemplateList($TemplateRoot);
+			  //$html = $objTemplate->ParseTemplate($var_list["t"]);	 
+		    }
+		    else 
+		    {
+		      echo "No Primary Theme Selected";
+		      die();
+		    }
+		}
+		else
+		{
+		  echo "No Primary Theme Selected\n";
+		  die();
+		} 
+		
+		if(is_object($objSession))
+		{
+			
+			$objSession->SetVariable("Template_Referer", $_local_t);
+		}
+		if($objTemplate->ErrorNo == -1)
+		{
+			$html = $objTemplate->ParseTemplate('error_template');
+		}
+		//$html = replacePngTags($html);
+		LogEntry("Output Start\n");
+		$html .= "<!-- Page Execution Time: ".( isset($ptime) ? $ptime : 0 )." -->";
+		if( IsDebugMode() ) 
+		{
+			if($Action) $debugger->setHTMLByIndex(1,'Front Action: <b>'.$Action.'</b>','append');
+			$html = '<a href="javascript:toggleDebugLayer();">Show Debugger</a><br>'.$html;
+		}
+		else 
+		{
+			header("Content-length: ".strlen($html));
+		}
+		header("Connection-Type: Keep-Alive");
+		echo $html;
+		
+		LogEntry("Output End\n");
+		
+		if( isset($template) && $template->ErrorNo != 0 )
+		{
+		  print "\n(".$objTemplate->ErrorNo.") ".$objTemplate->ErrorStr."\n";
+		}
+		
+		LogEntry("Output Complete\n");
+		$objLanguageCache->SaveTemplateCache();
+		LogEntry("Templates Cached\n");
+		
+		//if($objSession->SessionEnabled())
+		//  $objSession->SaveSessionData();   
+		//echo "Cookie: <PRE>"; print_r($_COOKIE); echo "</PRE><br>\n";
+		//ob_end_flush();
+		$timeend = getmicrotime();
+		$diff = $timeend - $timestart;
+		
+		LogEntry("\nTotal Queries Executed: $sqlcount in $totalsql seconds\n");
+		LogEntry("\nPage Execution Time: $diff seconds\n", true);
+		if($LogFile)
+		  fclose($LogFile);
+	}
+}
+
+?>
\ No newline at end of file

Property changes on: trunk/kernel/units/general/inp1_parser.php
___________________________________________________________________
Added: cvs2svn:cvs-rev
## -0,0 +1 ##
+1.2
\ No newline at end of property
Added: svn:executable
## -0,0 +1 ##
+*
\ No newline at end of property
Index: trunk/kernel/units/general/inp_ses_storage.php
===================================================================
--- trunk/kernel/units/general/inp_ses_storage.php	(nonexistent)
+++ trunk/kernel/units/general/inp_ses_storage.php	(revision 1310)
@@ -0,0 +1,61 @@
+<?php
+
+include_once(KERNEL_PATH.'/session/session.php');
+
+class InpSessionStorage extends SessionStorage {
+
+	function Init($prefix,$special)
+	{
+		parent::Init($prefix,$special);
+		$this->setTableName(TABLE_PREFIX.'UserSession');
+		$this->SessionDataTable = TABLE_PREFIX.'SessionData';
+		$this->setIDField('SessionKey');
+		$this->TimestampField = 'LastAccessed';
+		$this->DataValueField = 'VariableValue';
+		$this->DataVarField = 'VariableName';
+	}
+	
+	function LocateSession($sid)
+	{
+		$query = ' SELECT '.$this->TimestampField.' FROM '.$this->TableName.' WHERE '.$this->IDField.' = '.$this->Conn->qstr($sid);
+		$result = $this->Conn->GetOne($query);
+		
+		if($result===false) return false;
+		
+		$this->Expiration = $result + $this->SessionTimeout;
+		return true;
+	}
+	
+	function UpdateSession(&$session)
+	{
+		$query = ' UPDATE '.$this->TableName.' SET '.$this->TimestampField.' = unix_timestamp() WHERE '.$this->IDField.' = '.$this->Conn->qstr($session->SID);
+		$this->Conn->Query($query);
+	}
+	
+	function GetExpiredSIDs()
+	{
+		$query = ' SELECT '.$this->IDField.' FROM '.$this->TableName.' WHERE '.time().' - '.$this->TimestampField.' > '.$this->SessionTimeout;
+		$ret = $this->Conn->GetCol($query);
+		if($ret) $this->DeleteEditTables();
+		return $ret;
+		
+	}
+	
+	function DeleteEditTables()
+	{
+		$tables = $this->Conn->GetCol('SHOW TABLES'); 
+		$mask = '/'.TABLE_PREFIX.'ses_(.*)_edit_(.*)/';
+		$sql='SELECT COUNT(*) FROM '.$this->TableName.' WHERE '.$this->IDField.' = \'%s\'';
+		foreach($tables as $table)
+		{
+			if( preg_match($mask,$table,$rets) )
+			{
+				$sid=$rets[1];
+				$is_alive = $this->Conn->GetOne( sprintf($sql,$sid) );
+				if(!$is_alive) $this->Conn->Query('DROP TABLE IF EXISTS '.$table);
+			}
+		}
+	}
+}
+
+?>
\ No newline at end of file

Property changes on: trunk/kernel/units/general/inp_ses_storage.php
___________________________________________________________________
Added: cvs2svn:cvs-rev
## -0,0 +1 ##
+1.2
\ No newline at end of property
Added: svn:executable
## -0,0 +1 ##
+*
\ No newline at end of property
Index: trunk/kernel/units/general/cat_event_handler.php
===================================================================
--- trunk/kernel/units/general/cat_event_handler.php	(nonexistent)
+++ trunk/kernel/units/general/cat_event_handler.php	(revision 1310)
@@ -0,0 +1,65 @@
+<?php
+
+$application =& kApplication::Instance();
+$application->Factory->includeClassFile('kDBEventHandler');
+
+class kCatDBEventHandler extends InpDBEventHandler {
+	
+	function OnCopy(&$event)
+	{
+		$object = $event->getObject();
+		$this->StoreSelectedIDs($event);
+		$ids = $this->getSelectedIDs($event);
+		$this->Application->StoreVar($this->getPrefixSpecial().'_clipboard', implode(',', $ids));
+		$this->Application->StoreVar($this->getPrefixSpecial().'_clipboard_mode', 'copy');
+		
+		$this->Application->StoreVar('clipboard', 'COPY-0.'.TABLE_PREFIX.'Products.ResourceId=0');
+		$event->redirect_params = Array('opener' => 's', 'pass_events'=>true); //do not go up - STAY
+	}
+	
+	function OnCut(&$event)
+	{
+		$object = $event->getObject();
+		$this->StoreSelectedIDs($event);
+		$ids = $this->getSelectedIDs($event);
+		$this->Application->StoreVar($this->getPrefixSpecial().'_clipboard', implode(',', $ids));
+		$this->Application->StoreVar($this->getPrefixSpecial().'_clipboard_mode', 'cut');
+		
+		$this->Application->StoreVar('clipboard', 'CUT-0.'.TABLE_PREFIX.'Products.ResourceId=0');
+		$event->redirect_params = Array('opener' => 's', 'pass_events'=>true); //do not go up - STAY
+	}
+	
+	function OnPaste(&$event)
+	{
+		$ids = $this->Application->RecallVar($this->getPrefixSpecial().'_clipboard');
+		if ($ids == '') {
+			$event->redirect = false;
+			return;
+		}
+		
+		//recalling by different name, because we may get kDBList, if we recall just by prefix
+		$object =& $this->Application->recallObject($event->getPrefixSpecial().'.item', $event->Prefix);
+		$this->prepareObject(&$object,&$event);
+		
+		if ($this->Application->RecallVar($this->getPrefixSpecial().'_clipboard_mode') == 'copy') {
+			$ids_arr = explode(',', $ids);
+			
+			$temp =& $this->Application->recallObject($event->getPrefixSpecial().'_TempHandler', 'kTempTablesHandler');
+			
+			if($ids_arr)
+			{
+				$temp->CloneItems($event->Prefix, $event->Special, $ids_arr);
+			}
+		}
+		else { // mode == cut
+			$ids_arr = explode(',', $ids);
+			foreach ($ids_arr as $id) {
+				$object->Load($id);
+				$object->MoveToCat();				
+			}
+		}
+		$event->redirect = true;
+	}
+}
+
+?>
\ No newline at end of file

Property changes on: trunk/kernel/units/general/cat_event_handler.php
___________________________________________________________________
Added: cvs2svn:cvs-rev
## -0,0 +1 ##
+1.2
\ No newline at end of property
Added: svn:executable
## -0,0 +1 ##
+*
\ No newline at end of property
Index: trunk/kernel/units/general/cat_dblist.php
===================================================================
--- trunk/kernel/units/general/cat_dblist.php	(nonexistent)
+++ trunk/kernel/units/general/cat_dblist.php	(revision 1310)
@@ -0,0 +1,12 @@
+<?php
+
+class kCatDBList extends kDBList {
+	
+	function GetWhereClause()
+	{
+		return $this->Special != 'showall' ? '('.TABLE_PREFIX.'CategoryItems.CategoryId = '.$this->Application->GetVar('m_cat_id').') ' : '';
+	}
+	
+}
+
+?>
\ No newline at end of file

Property changes on: trunk/kernel/units/general/cat_dblist.php
___________________________________________________________________
Added: cvs2svn:cvs-rev
## -0,0 +1 ##
+1.2
\ No newline at end of property
Added: svn:executable
## -0,0 +1 ##
+*
\ No newline at end of property
Index: trunk/kernel/units/general/inp_temp_handler.php
===================================================================
--- trunk/kernel/units/general/inp_temp_handler.php	(nonexistent)
+++ trunk/kernel/units/general/inp_temp_handler.php	(revision 1310)
@@ -0,0 +1,158 @@
+<?php
+
+class InpTempTablesHandler extends kTempTablesHandler {
+
+	function CopyLiveToTemp($table, $IdField, $ids, $autoincrement=null)
+	{
+		if (is_array($ids)) 
+			$ids = join(',', $ids);
+		if ($ids == '') return;	
+		
+		$query = sprintf("INSERT INTO %s 
+											SELECT * FROM %s
+											WHERE %s IN (%s)",
+											$this->GetTempName($table),
+											$table,
+											$IdField,
+											$ids);
+		$this->Conn->Query($query);
+		if (isset($autoincrement) && !empty($autoincrement)) {
+			$query = sprintf("ALTER TABLE %s
+												CHANGE %s %s INT(11) NOT NULL AUTO_INCREMENT,
+												ADD PRIMARY KEY (%s)",
+												$this->GetTempName($table),
+												$autoincrement,
+												$autoincrement,
+												$autoincrement,
+												$this->GetTempName($table));
+			echo $query.'<br>';
+			$this->Conn->Query($query);
+		}
+		
+		if($table == TABLE_PREFIX.'Images')
+		{			
+			$query = sprintf('SELECT LocalPath,ThumbPath FROM %s WHERE %s IN (%s)',$table,$IdField,$ids);
+			$res = $this->Conn->Query($query);
+						
+			foreach ($res as $record)
+			{
+				foreach ($record as $field => $field_value)
+				{
+					$source_file = DOC_ROOT.BASE_PATH.$field_value;
+					$dest_file = DOC_ROOT.BASE_PATH.str_replace(IMAGES_PATH, IMAGES_PENDING_PATH, $field_value);					
+					copy($source_file, $dest_file);
+				}
+			}
+			
+			$update_sql = 'UPDATE '.$this->GetTempName($table).' SET LocalPath = REPLACE(LocalPath,
+														"'.IMAGES_PATH.'", "'.IMAGES_PENDING_PATH.'"), 
+														ThumbPath = REPLACE(ThumbPath,
+														"'.IMAGES_PATH.'","'.IMAGES_PENDING_PATH.'")
+														WHERE '.$IdField.' IN ('.$ids.')';
+			$this->Conn->Query($update_sql);
+			
+		}
+		
+	}
+	
+	function CopyTempToOriginal($table, $IdField, $autoincrement=null)
+	{
+		if (isset($autoincrement) && !empty($autoincrement))
+		{
+			$this->RemoveAutoincrement($table, $autoincrement);
+		}
+		
+		if( $table != $this->MasterTable )
+		{
+			// get main ids
+			$sql = 	'SELECT '.$this->Tables[$table]['ForeignKey'].
+					' FROM '.$this->MasterTable.
+					' WHERE '.$this->Tables[$this->MasterTable]['IdField'].' IN ('.implode(',',$this->MasterIDs).')';
+			$main_ids = $this->Conn->GetCol($sql);
+			
+			if($main_ids)
+			{
+				if ($table == TABLE_PREFIX.'Images')
+				{
+					$sql = 'SELECT LocalPath, ThumbPath FROM '.$table.
+						' WHERE '.$IdField.' IN ('.implode(',', $main_ids).')';
+					$res = $this->Conn->Query($sql);
+					
+					foreach ($res as $record)
+					{
+						foreach ($record as $field => $field_value)
+						{
+							$source_file = DOC_ROOT.BASE_PATH.$field_value;
+							unlink($source_file);
+						}
+					}
+				}	
+			
+				// delete all related to main table records from subtable
+				$sql = 'DELETE FROM '.$table.' WHERE '.$IdField.' IN ('.implode(',',$main_ids).')';
+				$this->Conn->Query($sql);
+			}
+			
+			$subtable_idfield = $this->Tables[$table]['SubIDField'];
+			$this->Conn->Query('UPDATE '.$this->GetTempName($table).' SET '.$subtable_idfield.' = 0 WHERE '.$subtable_idfield.' < 0');
+		}
+		else
+		{
+			// get IDs, that exist in temp table
+			$query = sprintf('SELECT %s FROM %s',
+											$IdField,
+											$this->GetTempName($table));
+			$this->MasterIDs = $this->Conn->GetCol($query);	// were $temp_ids before
+			if($this->MasterIDs)
+			{
+				// delete original records from master table
+				$query = sprintf('DELETE FROM %s WHERE %s IN (%s)',
+				$table,
+				$IdField,
+				implode(',',$this->MasterIDs) );
+				$this->Conn->Query($query);
+			}
+		}
+		
+		$query = sprintf("INSERT INTO %s 
+											SELECT * FROM %s",
+											$table,
+											$this->GetTempName($table));
+		$this->Conn->Query($query);
+		
+		
+		if($table == TABLE_PREFIX.'Images' && count($main_ids) > 0)
+		{			
+			$query = sprintf('				SELECT LocalPath, ThumbPath FROM %s
+											WHERE %s IN (%s)',
+											$table,
+											$IdField,
+											implode(',',$this->MasterIDs));
+			$res = $this->Conn->Query($query);
+						
+			foreach ($res as $record)
+			{
+				foreach ($record as $field => $field_value)
+				{
+					$source_file = DOC_ROOT.BASE_PATH.$field_value;
+					$dest_file = DOC_ROOT.BASE_PATH.str_replace(IMAGES_PENDING_PATH, IMAGES_PATH, $field_value);
+					rename($source_file, $dest_file);
+				}
+			}
+			
+			$update_sql = 'UPDATE '.$table.' SET LocalPath = REPLACE(LocalPath,
+														"'.IMAGES_PENDING_PATH.'", "'.IMAGES_PATH.'"), 
+														ThumbPath = REPLACE(ThumbPath,
+														"'.IMAGES_PENDING_PATH.'", "'.IMAGES_PATH.'")
+														WHERE '.$IdField.' IN ('.implode(',', $this->MasterIDs).')';
+			$this->Conn->Query($update_sql);
+			
+		}		
+		
+		return $this->Conn->getInsertID();
+	}	
+
+}
+
+
+?>
\ No newline at end of file

Property changes on: trunk/kernel/units/general/inp_temp_handler.php
___________________________________________________________________
Added: cvs2svn:cvs-rev
## -0,0 +1 ##
+1.2
\ No newline at end of property
Added: svn:executable
## -0,0 +1 ##
+*
\ No newline at end of property
Index: trunk/kernel/units/general/my_application.php
===================================================================
--- trunk/kernel/units/general/my_application.php	(nonexistent)
+++ trunk/kernel/units/general/my_application.php	(revision 1310)
@@ -0,0 +1,289 @@
+<?php
+
+	include_once KERNEL_PATH.'/parser/template_parser.php';
+	include_once MODULES_PATH.'/in-commerce/general/inp_db_event_handler.php';
+	
+	class InpTemplateParser extends TemplateParser {
+		
+		/**
+		 * Searches tag in format <inp:prefix.special_method param1="value1" ... />
+		 *
+		 * @return string
+		 */
+		function FindTag()
+		{
+			$tagOpen = strpos($this->Template, '<%', $this->Position); //Finding tag start
+			
+			$inp_tag = false;
+			$tagOpenLen = 2;
+			$inpOpen = strpos($this->Template, '<inp2:', $this->Position);
+			if ($inpOpen !== false && ($tagOpen === false || $inpOpen < $tagOpen)) {
+				$tagOpen = $inpOpen;
+				$inp_tag = true;
+				$tagOpenLen = 6;
+			}
+			
+			if ($tagOpen === false) { //If not tags left - adding all other data
+				$this->AppendOutput(substr($this->Template, $this->Position));
+				return false;
+			}
+			
+			//Adding all data before tag open
+			$this->AppendOutput(substr($this->Template, $this->Position, $tagOpen - $this->Position));
+			
+			//Finding tag end
+			$tagCloseLen = 2;
+			if ($inp_tag) {
+				$tagClose = strpos($this->Template, "/>", $tagOpen);
+				$inpClose = strpos($this->Template, "</inp2>", $tagOpen);
+				if ($inpClose !== false && $inpClose < $tagClose) {
+					$tagClose = $inpClose;
+					$tagCloseLen = 7;
+				}
+			}
+			else {
+				$tagClose = strpos($this->Template, "%>", $tagOpen); 
+			}
+			
+			if ($tagClose === false) die ("Can't find tag closing");
+			
+			//Cutting out the tag itself
+			$tag = substr($this->Template, $tagOpen + $tagOpenLen, $tagClose - $tagOpen - $tagOpenLen); 
+			
+			if ($inp_tag) {
+				if (strpos($tag, '_') !== false) {
+					list($prefix, $the_tag) = explode('_', $tag, 2);
+					$tag = $prefix.':'.$the_tag;
+				}
+				else $tag .= ':';
+			}
+			
+			//Seting current position right after the tag
+			$this->Position = $tagClose + $tagCloseLen; 
+			return $tag;
+		}
+		
+		function Parse($template, $name='unknown')
+		{
+			$this->Template = $template;
+			$this->TemplateName = $name;
+			$this->Position = 0;
+			$this->Output = '';
+
+			//While we have more tags
+			while ($tag_data = $this->FindTag())
+			{
+				//Create tag object from passed tag data
+				if (defined('DEBUG_TAGS')&&DEBUG_TAGS) {
+					global $debugger;
+					$debugger->appendHTML("mode: ".$this->SkipModeName()." tag ".$debugger->highlightString($tag_data)." in ".$debugger->getFileLink($debugger->getLocalFile(DOC_ROOT.BASE_PATH.THEMES_PATH.'/'.$this->TemplateName).'.tpl', $this->CurrentLineNumber(), '', true));
+				}
+				$tag =& new MyTag($tag_data, $this);
+				if (!$this->CheckRecursion($tag)) //we do NOT process closing tags
+				{
+					$tag->Process();
+				}
+			}
+			
+			if ( !$this->GetParam('from_inportal') ) {
+				if ( strpos($this->Output, '<inp:') !== false) {
+					$inp1_parser =& $this->Application->recallObject('Inp1Parser');
+					$this->Output = $inp1_parser->Parse($name, $this->Output);
+				}
+			}
+			return $this->Output;
+		}
+		
+		function ParseBlock($params, $force_pass_params=0, $as_template=false)
+		{
+			if (defined('EXPERIMENTAL_PRE_PARSE')) {
+				if (isset($this->Application->PreParsedBlocks[$params['name']]) ) {
+					$f = $this->Application->PreParsedBlocks[$params['name']];
+					//$this->SetParams($params);
+					return 	$f($params);
+				}
+			}
+			
+			$BlockParser =& $this->Application->Factory->makeClass('TemplateParser');
+			if (isset($params['pass_params']) || $force_pass_params) {
+				$BlockParser->SetParams(array_merge($this->Params, $params));
+			}
+			else
+				$BlockParser->SetParams($params);
+			$this->Application->Parser =& $BlockParser;
+			if (!isset($params['name'])) die("<b>***Error: Block name not passed to ParseBlock</b><br>");
+			$templates_cache =& $this->Application->recallObject('TemplatesCache');
+			
+			$template_name = $as_template ? $params['name'] : $templates_cache->GetTemplateFileName($params['name']) . '-block:'.$params['name'];
+			
+			$silent = getArrayValue($params, 'from_inportal') && !defined('DBG_TEMPLATE_FAILURE');
+			
+			$o = $BlockParser->Parse(
+					$templates_cache->GetTemplateBody($params['name'], $silent), 
+					$template_name
+				);
+			$this->Application->Parser =& $this;
+			return $o;
+		}
+	}
+	
+	class MyTag extends Tag {
+		
+		/**
+		 * Set's Prefix and Special for Tag object
+		 * based on ones from tagname
+		 *
+		 * @param string $tag_data
+		 * @access protected
+		 */
+		function ParseTagData($tag_data)
+		{
+			$tag_data = $this->ReplaceParams($tag_data) . ' ';
+			$tag_data = $this->Application->ReplaceLanguageTags($tag_data);
+
+
+			list ($key_data, $params) = explode(' ', $tag_data, 2);
+			
+			//cand.test_TagProcessor:PrintList
+			
+			$tmp=explode(':',$key_data);
+			$this->Tag=$tmp[1];
+			
+			$tmp=$this->Application->processPrefix($tmp[0]);
+			$this->Prefix=$tmp['prefix'];
+			$this->Special=$tmp['special'];
+			$this->Processor=$this->Prefix;
+			
+			if ($params != '') $this->ParseNamedParams($params);
+		}
+		
+		/**
+		 * Set's Prefix and Special for TagProcessor
+		 * based on tag beeing processed
+		 *
+		 * @return string
+		 * @access protected
+		 */
+		function DoProcessTag()
+		{
+			// $tag->Prefix - l_TagProcessor
+			$tmp = $this->Application->processPrefix($this->Processor);
+			
+			$processor =& $this->Application->recallObject($tmp['prefix'].'_TagProcessor'); // $this->Processor
+			
+			$tmp=explode('_',$tmp['prefix'],2);
+			$processor->Prefix=$tmp[0];
+			$processor->Special=$this->Special;
+			
+			return $processor->ProcessTag($this);
+		}
+		
+		/**
+		 * Process IF tags in specific way
+		 *
+		 */
+		function Process()
+		{
+			if ($this->Processor == 'm' || $this->Processor == 'm_TagProcessor') { //if we are procssing Main tags
+			if ($this->Tag == 'block') {
+				$tag =& new BlockTag('', $this->Parser);
+				$tag->CopyFrom($this);
+				$tag->Process();
+			}
+			elseif ($this->Parser->SkipMode == skip_tags) {
+				return;
+			}
+			elseif (
+			$this->Tag == 'if' ||
+			$this->Tag == 'ifnot' ||
+			$this->Tag == 'else' ||
+			$this->Tag == 'elseif'
+			) {
+				$tag =& new MyConstructTag('', $this->Parser);
+				$tag->CopyFrom($this);
+				$tag->Process();
+			}
+			elseif ($this->Tag == 'xml') {
+				$tag =& new XMLTag('', $this->Parser);
+				$tag->CopyFrom($this);
+				$tag->Process();
+			}
+			else {
+				if ($this->Parser->SkipMode == skip) return;
+				//if (!$this->ProcessMainTag()) //other main tags
+				$this->ProcessTag();
+			}
+			}
+			else { //normal tags - processors other than main
+			if ($this->Parser->SkipMode == skip_tags || $this->Parser->SkipMode == skip) return; //do not parse if we skipping tags
+			$this->ProcessTag();
+			//$this->Parser->AppendOutput('<b>'.$this->Tag.'</b>');
+			}
+		}
+		
+		
+		
+	}
+	
+	class MyConstructTag extends ConstructTag {
+		
+		function GetLogic()
+		{
+			$prefix = $this->GetParam('prefix');
+			$function = $this->GetParam('function');
+
+			if ($prefix !== false) {
+				$tag =& new MyTag('', $this->Parser);
+				$tag->Tag = $function;
+				
+				$tmp = $this->Application->processPrefix($prefix);
+				$tag->Processor = $tmp['prefix'];
+				
+				$tag->Prefix=$tmp['prefix'];
+				$tag->Special=$tmp['special'];
+				$tag->NamedParams = $this->NP;
+				$this->Logic = $tag->DoProcessTag();
+				// echo " this->Logic : ".$this->Logic."<br>";
+			}
+			else
+			{
+				$this->Logic = $function;
+			}
+		}
+		
+	}
+	
+	class MyApplication extends kApplication {
+	
+		function RegisterDefaultClasses()
+		{
+			parent::RegisterDefaultClasses();
+			$this->registerClass('InpTemplateParser',MODULES_PATH.'/in-commerce/general/my_application.php','TemplateParser');
+			
+			$this->registerClass('Inp1Parser',MODULES_PATH.'/in-commerce/general/inp1_parser.php','Inp1Parser');
+			
+			$this->registerClass('InpSessionStorage',MODULES_PATH.'/in-commerce/general/inp_ses_storage.php','SessionStorage');
+			$this->registerClass('kCatDBItem',MODULES_PATH.'/in-commerce/general/cat_dbitem.php');
+			$this->registerClass('kCatDBList',MODULES_PATH.'/in-commerce/general/cat_dblist.php');
+			$this->registerClass('kCatDBEventHandler',MODULES_PATH.'/in-commerce/general/cat_event_handler.php');
+			$this->registerClass('InpLoginEventHandler',MODULES_PATH.'/in-commerce/general/inp_login_event_handler.php','login_EventHandler');
+			$this->registerClass('InpDBEventHandler',MODULES_PATH.'/in-commerce/general/inp_db_event_handler.php','kDBEventHandler');
+			$this->registerClass('InpTempTablesHandler',MODULES_PATH.'/in-commerce/general/inp_temp_handler.php','kTempTablesHandler');
+			$this->registerClass('InpUnitConfigReader',MODULES_PATH.'/in-commerce/general/inp_unit_config_reader.php','kUnitConfigReader');
+			
+			$this->registerClass('InpCustomFieldsHelper',MODULES_PATH.'/in-commerce/general/custom_fields.php','InpCustomFieldsHelper');
+		}
+		
+		function KernelDie($message)
+		{
+			$this->trigerError($message,E_USER_ERROR);
+			exit;
+		}
+		
+		function ConfigValue($name)
+		{
+			return $this->DB->GetOne('SELECT VariableValue FROM '.TABLE_PREFIX.'ConfigurationValues WHERE VariableName = '.$this->DB->qstr($name) );
+		}
+	}
+
+?>
\ No newline at end of file

Property changes on: trunk/kernel/units/general/my_application.php
___________________________________________________________________
Added: cvs2svn:cvs-rev
## -0,0 +1 ##
+1.2
\ No newline at end of property
Added: svn:executable
## -0,0 +1 ##
+*
\ No newline at end of property
Index: trunk/kernel/units/category_items/category_items_event_handler.php
===================================================================
--- trunk/kernel/units/category_items/category_items_event_handler.php	(nonexistent)
+++ trunk/kernel/units/category_items/category_items_event_handler.php	(revision 1310)
@@ -0,0 +1,101 @@
+<?php
+
+	class CategoryItemsEventHander extends InpDBEventHandler 
+	{
+		/**
+		 * Add's New Category To Product
+		 *
+		 * @param kEvent $event
+		 */
+		function OnAddCategory(&$event)
+		{
+			$cat_list = (int)rtrim($this->Application->GetVar('cat_list'), ',');
+			//if(!$cat_list) return true;
+			
+			$cat_id = (int)$this->Conn->GetOne('SELECT CategoryId FROM '.TABLE_PREFIX.'Category WHERE ResourceId='.$cat_list);
+			
+			$this->Application->setUnitOption($event->Prefix,'AutoLoad',false);
+			$object =& $event->getObject();
+			
+			$table_info = $object->getLinkedInfo();
+			
+			// don't allow duplicate records
+			$already_added = $this->Conn->GetOne('SELECT * FROM '.$object->TableName.' WHERE CategoryId='.$cat_id.' AND '.$table_info['ForeignKey'].'='.$table_info['ParentId']);
+			if($already_added === false)
+			{
+				$items_info = $this->Application->GetVar( $event->getPrefixSpecial(true) );
+				$items_info[0]['CategoryId'] = $cat_id;
+				$items_info[0][ $table_info['ForeignKey'] ] = $table_info['ParentId'];
+				$this->Application->SetVar( $event->getPrefixSpecial(true), $items_info );
+				
+				$rp_backup = $event->redirect_params;	// save opener state
+				
+				$event->setEventParam('ForceCreateId', true);
+				$this->OnCreate($event);
+				
+				$event->redirect_params = $rp_backup;	// restore opener state
+			}
+		}
+		
+		/**
+		 * Set's new category as primary for product
+		 *
+		 * @param kEvent $event
+		 */
+		function OnSetPrimary(&$event)
+		{
+			$this->Application->setUnitOption($event->Prefix,'AutoLoad',false);
+			$object =& $event->getObject();
+			$this->StoreSelectedIDs($event);
+			$ids=$this->getSelectedIDs($event);
+			if($ids)
+			{
+				$id = array_shift($ids);	
+				$table_info = $object->getLinkedInfo();
+				
+				$this->Conn->Query('UPDATE '.$object->TableName.' SET PrimaryCat = 0 WHERE '.$table_info['ForeignKey'].' = '.$table_info['ParentId']);
+				$this->Conn->Query('UPDATE '.$object->TableName.' SET PrimaryCat = 1 WHERE ('.$table_info['ForeignKey'].' = '.$table_info['ParentId'].') AND (CategoryId = '.$id.')');			
+			}
+			$event->redirect_params = Array('opener' => 's', 'pass_events' => true); //stay!
+		}
+		
+		/**
+		 * Apply custom processing to item
+		 *
+		 * @param kEvent $event
+		 */
+		function customProcessing(&$event, $type)
+		{
+			if($event->Name == 'onMassDelete')
+			{
+				$object =& $event->getObject();
+				$table_info = $object->getLinkedInfo();
+				
+				switch ($type)
+				{
+					case 'before':
+						$ids = $event->getEventParam('ids');
+						if($ids)
+						{
+							$ids = $this->Conn->GetCol('SELECT CategoryId FROM '.$object->TableName.' WHERE (PrimaryCat=0) AND ('.$table_info['ForeignKey'].'='.$table_info['ParentId'].') AND CategoryId IN ('.implode(',',$ids).')');
+							$event->setEventParam('ids',$ids);
+						}
+						break;
+				
+						// not needed because 'before' does not allow to delete primary cat!
+					/*case 'after':
+						// set 1st not deleted category as primary
+						$has_primary = $this->Conn->GetOne('SELECT COUNT(*) FROM '.$object->TableName.' WHERE (PrimaryCat=1) AND ('.$table_info['ForeignKey'].' = '.$table_info['ParentId'].')');
+						if(!$has_primary)
+						{
+							$cat_id = $this->Conn->GetOne('SELECT CategoryId FROM '.$object->TableName.' WHERE '.$table_info['ForeignKey'].' = '.$table_info['ParentId']);
+							$this->Conn->Query('UPDATE '.$object->TableName.' SET PrimaryCat = 1 WHERE ('.$table_info['ForeignKey'].' = '.$table_info['ParentId'].') AND (CategoryId = '.$cat_id.')');
+						}
+						break;*/
+				}
+			}
+		}
+		
+	}
+
+?>
\ No newline at end of file

Property changes on: trunk/kernel/units/category_items/category_items_event_handler.php
___________________________________________________________________
Added: cvs2svn:cvs-rev
## -0,0 +1 ##
+1.2
\ No newline at end of property
Added: svn:executable
## -0,0 +1 ##
+*
\ No newline at end of property
Index: trunk/kernel/units/category_items/category_items_dbitem.php
===================================================================
--- trunk/kernel/units/category_items/category_items_dbitem.php	(nonexistent)
+++ trunk/kernel/units/category_items/category_items_dbitem.php	(revision 1310)
@@ -0,0 +1,36 @@
+<?php
+
+	class CategoryItems_DBItem extends kDBItem 
+	{
+	
+		
+		/**
+		* Returns part of SQL WHERE clause identifing the record, ex. id = 25
+		*
+		* @access public
+		* @param string $method Child class may want to know who called GetKeyClause, Load(), Update(), Delete() send its names as method
+		* @return void
+		* @see kDBItem::Load()
+		* @see kDBItem::Update()
+		* @see kDBItem::Delete()
+		*/
+		function GetKeyClause($method=null)
+		{
+			$table_info = $this->getLinkedInfo();
+			return '(CategoryId='.$this->ID.' AND '.$table_info['ForeignKey'].'='.$table_info['ParentId'].')';
+		}
+		
+		/**
+		 * Generate and set new temporary id
+		 *
+		 * @access private
+		 */
+		function setTempID()
+		{
+			// don't set temp id for this item
+		}
+		
+	}
+
+
+?>
\ No newline at end of file

Property changes on: trunk/kernel/units/category_items/category_items_dbitem.php
___________________________________________________________________
Added: cvs2svn:cvs-rev
## -0,0 +1 ##
+1.2
\ No newline at end of property
Added: svn:executable
## -0,0 +1 ##
+*
\ No newline at end of property
Index: trunk/kernel/units/category_items/category_items_config.php
===================================================================
--- trunk/kernel/units/category_items/category_items_config.php	(nonexistent)
+++ trunk/kernel/units/category_items/category_items_config.php	(revision 1310)
@@ -0,0 +1,51 @@
+<?php
+	
+$config	=	Array(
+					'Prefix'			=>	'ci',
+					'ItemClass'			=>	Array('class'=>'CategoryItems_DBItem','file'=>'category_items_dbitem.php','build_event'=>'OnItemBuild'),
+					'ListClass'			=>	Array('class'=>'kDBList','file'=>'','build_event'=>'OnListBuild'),
+					'EventHandlerClass'	=>	Array('class'=>'CategoryItemsEventHander','file'=>'category_items_event_handler.php','build_event'=>'OnBuild'),
+					'TagProcessorClass' =>	Array('class'=>'CategoryItemsTagProcessor','file'=>'category_items_tag_processor.php','build_event'=>'OnBuild'),
+					'AutoLoad'			=>	true,
+					'hooks'				=>	Array(),
+					'QueryString'		=>	Array(
+												1	=>	'id',
+												2	=>	'page',
+												3	=>	'event',
+											),
+					'IDField'			=>	'CategoryId',	// in this case idfield doesn't exit in destination table
+					'TableName'		=>	TABLE_PREFIX.'CategoryItems',
+					'ParentTableKey'=>	'ResourceId',
+					'ForeignKey'	=>	'ItemResourceId',
+					'ParentPrefix'	=> 'p',
+					'AutoDelete'	=>	true,
+					'AutoClone'	=> false, // Critical !!!
+					
+					'ListSQLs'			=>	Array(	''=>"	SELECT ci.*, c.CachedNavbar AS CategoryName, IF(ISNULL(c.CategoryId),0,c.CategoryId) AS DummyId
+															FROM %1\$s ci
+															LEFT JOIN ".TABLE_PREFIX."Category AS c ON c.CategoryId = ci.CategoryId",
+																		), // key - special, value - list select sql
+					'ItemSQLs'			=>	Array(	''=>'SELECT * FROM %s',
+																		),
+					
+					'Fields'			=>	Array(
+											    'DummyId' => Array(),
+												'CategoryId' => Array('type'=>'int','not_null'=>1,'default'=>0),
+											    'ItemResourceId' => Array('not_null' => 1, 'default' => 0),
+											    'PrimaryCat' => Array('type' => 'int', 'not_null' => 1, 'default' => 0),
+											),
+					'VirtualFields'	=> 	Array('DummyId'=>1
+													),
+											
+					'Grids'	=> Array(
+								'Default'		=>	Array(
+																	'Icons' => Array('default'=>'icon16_custom.gif'),	// icons for each StatusField values, if no matches or no statusfield selected, then "default" icon is used
+																	'Fields' => Array(
+																			'CategoryName' => Array( 'title'=>'la_col_Category', 'data_block' => 'grid_checkbox_category_td'),
+																			),
+																	
+																),
+													),
+	);
+
+?>
\ No newline at end of file

Property changes on: trunk/kernel/units/category_items/category_items_config.php
___________________________________________________________________
Added: cvs2svn:cvs-rev
## -0,0 +1 ##
+1.2
\ No newline at end of property
Added: svn:executable
## -0,0 +1 ##
+*
\ No newline at end of property
Index: trunk/kernel/units/category_items/category_items_tag_processor.php
===================================================================
--- trunk/kernel/units/category_items/category_items_tag_processor.php	(nonexistent)
+++ trunk/kernel/units/category_items/category_items_tag_processor.php	(revision 1310)
@@ -0,0 +1,26 @@
+<?php
+
+	class CategoryItemsTagProcessor extends kDBTagProcessor 
+	{
+		function CategoryName($params)
+		{
+			$root_phrase = $this->Application->ConfigValue('Root_Name');
+			$value = $this->Field($params);
+			$ret = $this->Application->Phrase($root_phrase).( $value ? ' > ' : '').$value;
+			if( $this->Field( Array('field'=> 'PrimaryCat') ) == 1 )
+			{
+				$ret .= ' ('.$params['primary_title'].')';
+			}
+			return $ret;
+		}
+		
+		function GetMainID()
+		{
+			$object =& $this->Application->recallObject( $this->getPrefixSpecial() );
+			$table_info = $object->getLinkedInfo();
+			return $table_info['ParentId'];
+		}
+	}
+
+
+?>
\ No newline at end of file

Property changes on: trunk/kernel/units/category_items/category_items_tag_processor.php
___________________________________________________________________
Added: cvs2svn:cvs-rev
## -0,0 +1 ##
+1.2
\ No newline at end of property
Added: svn:executable
## -0,0 +1 ##
+*
\ No newline at end of property
Index: trunk/core/units/custom_fields/custom_fields_event_handler.php
===================================================================
--- trunk/core/units/custom_fields/custom_fields_event_handler.php	(nonexistent)
+++ trunk/core/units/custom_fields/custom_fields_event_handler.php	(revision 1310)
@@ -0,0 +1,84 @@
+<?php
+	class CustomFieldsEventHandler extends InpDBEventHandler  {
+	
+		/**
+		 * Apply any custom changes to list's sql query
+		 *
+		 * @param kEvent $event
+		 * @access protected
+		 * @see OnListBuild
+		 */
+		function SetCustomQuery(&$event)
+		{
+			$object =& $event->getObject();
+			
+			$item_type=$this->Application->GetVar('cf_type');
+			$object->SetWhereClause('%1$s.Type='.$item_type);
+			$object->AddOrderField('DisplayOrder', 'ASC');
+		}
+		
+		/**
+		 * Prevents from duplicate item creation
+		 *
+		 * @param kEvent $event
+		 */
+		function OnBeforeItemCreate(&$event)
+		{
+			$object =& $event->getObject();
+			$items_info = $this->Application->GetVar( $event->getPrefixSpecial(true) );
+			
+			$new_field_name=$items_info[0]['FieldName'];
+
+			$table = $this->Application->getUnitOption($event->Prefix,'TableName');
+			$found = $this->Conn->GetOne("SELECT count(*) FROM ".$table." WHERE FieldName='".$new_field_name."'");
+		
+			if($found){
+				$event->status=erFAIL;
+				$object->FieldErrors['FieldName']['pseudo'] = $this->Application->Phrase('la_error_CustomExists');
+			}
+			else {
+				$item_type=$this->Application->GetVar('cf_type');
+
+				$object->SetDBField('Type', $this->Application->GetVar('cf_type'));
+			}
+		}
+		
+		function OnAfterItemCreate(&$event)
+		{
+			$this->Application->SetVar('cf_id', '');
+		}		
+
+		function OnAfterItemUpdate(&$event)
+		{
+			$this->Application->SetVar('cf_id', '');
+		}
+		
+		function OnCancelEdit(&$event){
+			$this->Application->SetVar('cf_id', '');
+		}
+		/**
+		 * Occurse after deleting item, id of deleted item
+		 * is stored as 'id' param of event
+		 *
+		 * @param kEvent $event
+		 * @access public
+		 */
+		function OnAfterItemDelete(&$event)
+		{
+			$object =& $event->getObject();
+			$custom_field_id=$event->getEventParam('id');
+			$this->Application->SetVar('cf_id', '');
+			
+			$sql='DELETE FROM '.TABLE_PREFIX.'CustomMetaData WHERE CustomFieldId='.$custom_field_id;
+			$this->Conn->Query($sql);
+			
+			
+		}
+		
+		function OnMassDelete(&$event)
+		{
+			parent::OnMassDelete($event);
+			$event->redirect_params = Array('opener' => 's');
+		}
+	}
+?>
\ No newline at end of file

Property changes on: trunk/core/units/custom_fields/custom_fields_event_handler.php
___________________________________________________________________
Added: cvs2svn:cvs-rev
## -0,0 +1 ##
+1.2
\ No newline at end of property
Added: svn:executable
## -0,0 +1 ##
+*
\ No newline at end of property
Index: trunk/core/units/custom_fields/custom_fields_config.php
===================================================================
--- trunk/core/units/custom_fields/custom_fields_config.php	(nonexistent)
+++ trunk/core/units/custom_fields/custom_fields_config.php	(revision 1310)
@@ -0,0 +1,74 @@
+<?php
+	
+$config	=	Array(
+					'Prefix'			=>	'cf',
+					'ItemClass'			=>	Array('class'=>'kDBItem','file'=>'','build_event'=>'OnItemBuild'),
+					'ListClass'			=>	Array('class'=>'kDBList','file'=>'','build_event'=>'OnListBuild'),
+					'EventHandlerClass'	=>	Array('class'=>'CustomFieldsEventHandler','file'=>'custom_fields_event_handler.php','build_event'=>'OnBuild'),
+					'TagProcessorClass' =>	Array('class'=>'kDBTagProcessor','file'=>'','build_event'=>'OnBuild'),
+					'AutoLoad'			=>	true,
+					'hooks'				=>	Array(),
+					'QueryString'		=>	Array(
+												1	=>	'id',
+												2	=>	'page',
+												3	=>	'event',
+												4	=>	'type',
+												5	=>	'mode',
+											),
+					'IDField'			=>	'CustomFieldId',
+					
+					'TitleField'		=>	'FieldName',		// field, used in bluebar when editing existing item
+					
+					'TitlePhrase'		=> 'la_title_CustomFields',
+					
+					'TitlePresets'		=>	Array(
+												'default'	=>	Array(	'new_status_labels'		=> Array('cf'=>'!la_title_addingCustom!'),
+																		'edit_status_labels'	=> Array('cf'=>'!la_title_Editing_CustomField!'),
+																		'new_titlefield'		=> Array('cf'=>'!la_title_NewCustomField!'),
+																),
+												
+												'custom_fields_list'=>Array(	'prefixes'				=> Array('cf_List'),
+																		'format'				=>	"!la_tab_ConfigCustom! (#cf_recordcount#)",
+																),
+																
+												'custom_fields_edit'=>Array(	'prefixes'				=> Array('cf'),
+																		'new_titlefield'		=> Array('cf'=>'!la_title_NewCustomField!'),
+																		'format'				=> "#cf_status# '#cf_titlefield#'",
+																),
+											),
+					
+					'TableName'			=>	TABLE_PREFIX.'CustomField',
+					
+					'ListSQLs'			=>	Array(	''=>"SELECT %1\$s.* FROM %s",
+																		), // key - special, value - list select sql
+					'ItemSQLs'			=>	Array(	''=>'SELECT * FROM %s',
+																		),
+											
+					'Fields'			=>	Array(
+										            'CustomFieldId' => Array('type' => 'int','not_null' => '1','default' => ''),
+										            'Type' => Array('type' => 'int','not_null' => '1','default' => '0'),
+										            'FieldName' => Array('type' => 'string','not_null' => 1,'default' => ''),
+										            'FieldLabel' => Array('type' => 'string','default' => ''),
+										            'Heading' => Array('type' => 'string','default' => ''),
+										            'Prompt' => Array('type' => 'string','default' => ''),
+										            'ElementType' => Array('type'=>'string', 'not_null'=>1, 'default'=>'NULL', 'formatter'=>'kOptionsFormatter', 'use_phrases' => 1, 'options'=>Array('text' => 'la_type_text', 'select' => 'la_type_select', 'radio' => 'la_type_radio', 'password' => 'la_type_password', 'textarea' => 'la_type_textarea', 'label' => 'la_type_label')),
+										            'ValueList' => Array('type' => 'string','default' => ''),
+										            'DisplayOrder' => Array('type' => 'int','not_null' => '1','default' => '0'),
+										            'OnGeneralTab' => Array('type' => 'int','not_null' => '1','default' => '0'),
+											),
+					'VirtualFields'	=> 	Array(),
+											
+					'Grids'	=> Array(
+								'Default'		=>	Array(
+																	'Icons' => Array('default'=>'icon16_custom.gif'),
+																	'Fields' => Array(
+																			'CustomFieldId' => Array( 'title'=>'la_prompt_FieldId', 'data_block' => 'grid_checkbox_td' ),
+																			'FieldName' => Array( 'title'=>'la_prompt_FieldName'),
+																			'FieldLabel' => Array( 'title'=>'la_prompt_FieldLabel' ),
+																		),
+																	
+														),
+									),
+	);
+
+?>
\ No newline at end of file

Property changes on: trunk/core/units/custom_fields/custom_fields_config.php
___________________________________________________________________
Added: cvs2svn:cvs-rev
## -0,0 +1 ##
+1.2
\ No newline at end of property
Added: svn:executable
## -0,0 +1 ##
+*
\ No newline at end of property
Index: trunk/core/units/categories/categories_config.php
===================================================================
--- trunk/core/units/categories/categories_config.php	(nonexistent)
+++ trunk/core/units/categories/categories_config.php	(revision 1310)
@@ -0,0 +1,59 @@
+<?php
+	
+$config	=	Array(
+					'Prefix'			=>	'c',
+					'ItemClass'			=>	Array('class'=>'kDBItem','file'=>'','build_event'=>'OnItemBuild'),
+					'ListClass'			=>	Array('class'=>'kDBList','file'=>'','build_event'=>'OnListBuild'),
+					'EventHandlerClass'	=>	Array('class'=>'CategoriesEventHandler','file'=>'categories_event_handler.php','build_event'=>'OnBuild'),
+					'TagProcessorClass' =>	Array('class'=>'CategoriesTagProcessor','file'=>'categories_tag_processor.php','build_event'=>'OnBuild'),
+					'AutoLoad'			=>	true,					
+					'QueryString'		=>	Array(
+												1	=>	'id',
+												2	=>	'page',
+												3	=>	'event',
+											),
+					'IDField' 			=> 	'CategoryId',
+					'TableName'			=>	TABLE_PREFIX.'Category',
+											
+					'ListSQLs'			=>	Array(	''=>	'SELECT * FROM %s'),
+																		 // key - special, value - list select sql
+					'ItemSQLs'			=>	Array(	''=>	'SELECT * FROM %s'),
+					
+					'Fields' 			=> 	Array
+									        (
+									            'CategoryId' => Array('type' => 'int','not_null' => '1','default' => ''),
+									            'Type' => Array('type' => 'int','not_null' => '1','default' => '0'),
+									            'ParentId' => Array('type' => 'int','not_null' => '1','default' => '0'),
+									            'Name' => Array('type' => 'string','not_null' => '1','default' => ''),
+									            'Description' => Array('type' => 'string','not_null' => '1','default' => ''),
+									            'CreatedOn' => Array('type' => 'int','not_null' => '1','default' => '0'),
+									            'EditorsPick' => Array('type' => 'int','default' => ''),
+									            'Status' => Array('type' => 'int','not_null' => '1','default' => '0'),
+									            'Pop' => Array('type' => 'int','default' => ''),
+									            'Priority' => Array('type' => 'int','default' => ''),
+									            'MetaKeywords' => Array('type' => 'string','default' => ''),
+									            'CachedDescendantCatsQty' => Array('type' => 'int','default' => ''),
+									            'CachedNavbar' => Array('type' => 'string','not_null' => '1','default' => ''),
+									            'CreatedById' => Array('type' => 'int','not_null' => '1','default' => '0'),
+									            'ResourceId' => Array('type' => 'int','default' => ''),
+									            'ParentPath' => Array('type' => 'string','not_null' => '1','default' => ''),
+									            'MetaDescription' => Array('type' => 'string','default' => ''),
+									            'HotItem' => Array('type' => 'int','not_null' => '1','default' => '2'),
+									            'NewItem' => Array('type' => 'int','not_null' => '1','default' => '2'),
+									            'PopItem' => Array('type' => 'int','not_null' => '1','default' => '2'),
+									            'Modified' => Array('type' => 'int','not_null' => '1','default' => '0'),
+									            'ModifiedById' => Array('type' => 'int','not_null' => '1','default' => '0'),
+									        ),							    
+											
+					'Grids'	=> Array(
+								'Default'		=>	Array(
+																	'Icons' => Array('default'=>'icon16_cat.gif'),
+																	'Fields' => Array(
+																	'Name' => Array( 'width'=>150, 'title'=>'la_col_Title', 'data_block'=>'category_td' ),
+																			),
+																	
+																),
+													),
+	);
+
+?>
\ No newline at end of file

Property changes on: trunk/core/units/categories/categories_config.php
___________________________________________________________________
Added: cvs2svn:cvs-rev
## -0,0 +1 ##
+1.2
\ No newline at end of property
Added: svn:executable
## -0,0 +1 ##
+*
\ No newline at end of property
Index: trunk/core/units/categories/categories_tag_processor.php
===================================================================
--- trunk/core/units/categories/categories_tag_processor.php	(nonexistent)
+++ trunk/core/units/categories/categories_tag_processor.php	(revision 1310)
@@ -0,0 +1,73 @@
+<?php
+
+class CategoriesTagProcessor extends kDBTagProcessor {
+
+	function PrintList($params)
+	{
+		$list =& $this->Application->recallObject( $this->getPrefixSpecial(), $this->Prefix.'_List',$params);
+		$id_field = $this->Application->getUnitOption($this->Prefix,'IDField');
+
+		$cat_id = $this->Application->GetVar('m_cat_id') ? $this->Application->GetVar('m_cat_id') : 0;
+		$list->SetWhereClause( 'ParentId='.$this->Application->GetVar('m_cat_id') );
+		$list->Query();
+		$o = '';
+		$list->GoFirst();
+		
+		$block_params=$this->prepareTagParams($params);
+		$block_params['name']=$params['block'];
+		$block_params['pass_params']='true';
+			
+		while (!$list->EOL()) 
+		{
+			$block_params['cat_id'] = $list->GetDBField('CategoryId');
+			
+			$this->Application->SetVar( $this->getPrefixSpecial().'_id', $list->GetDBField($id_field) ); // for edit/delete links using GET
+			$o.= $this->Application->ParseBlock($block_params, 1);
+			$list->GoNext();
+		}
+		
+		$this->Application->SetVar( $this->getPrefixSpecial().'_id', '');
+		return $o;	
+	}
+	
+	function RootCategoryName($params)
+	{
+		$root_phrase = $this->Application->ConfigValue('Root_Name');
+		$ret = $this->Application->Phrase($root_phrase);
+		return $ret;
+	}
+	
+	function CategoryPath($params)
+	{
+		if(!isset($params['cat_id']))
+		{
+			$params['cat_id'] = $this->Application->GetVar('m_cat_id');
+			$block_params['current'] = 1;
+		}
+		$block_params['separator'] = $params['separator'];
+		if($params['cat_id'] == 0)
+		{
+			$block_params['name'] = $params['rootcatblock'];
+			return $this->Application->ParseBlock($block_params);
+		}
+		else 
+		{
+			$cat_object = $this->Application->recallObject( $this->getPrefixSpecial(), $this->Prefix.'_List' );
+			$sql = 'SELECT CategoryId, ParentId, Name FROM '.$cat_object->TableName.' WHERE CategoryId='.$params['cat_id'];
+			$res = $this->Conn->GetRow($sql);
+			$block_params['name'] = $params['block'];			
+			$block_params['cat_name'] = $res['Name'];
+			$block_params['separator'] = $params['separator'];
+			$block_params['cat_id'] = $res['CategoryId'];
+			$next_params['separator'] = $params['separator'];
+			$next_params['rootcatblock'] = $params['rootcatblock'];
+			$next_params['block'] = $params['block'];
+			$next_params['cat_id'] = $res['ParentId'];
+			return $this->CategoryPath($next_params).$this->Application->ParseBlock($block_params);
+		}
+	}
+	
+}
+
+
+?>
\ No newline at end of file

Property changes on: trunk/core/units/categories/categories_tag_processor.php
___________________________________________________________________
Added: cvs2svn:cvs-rev
## -0,0 +1 ##
+1.2
\ No newline at end of property
Added: svn:executable
## -0,0 +1 ##
+*
\ No newline at end of property
Index: trunk/core/units/categories/categories_event_handler.php
===================================================================
--- trunk/core/units/categories/categories_event_handler.php	(nonexistent)
+++ trunk/core/units/categories/categories_event_handler.php	(revision 1310)
@@ -0,0 +1,36 @@
+<?php
+
+class CategoriesEventHandler extends InpDBEventHandler {
+
+	/**
+	 * Enter description here...
+	 *
+	 * @param kEvent $event
+	 */
+	function OnCategoryUp(&$event)
+	{		
+		$cat_object = $this->Application->recallObject( $event->Prefix );
+		$current_cat = $this->Application->GetVar('m_cat_id');
+		if($current_cat)
+		{
+			$sql = 'SELECT ParentId FROM '.$cat_object->TableName.' WHERE CategoryId='.$current_cat;
+			$cat_to_go = $this->Conn->GetOne($sql);
+		}
+		else 
+		{
+			$cat_to_go = 0;
+		}
+		$event->redirect = 'in-commerce/product_selector';
+		$event->redirect_params = Array('m_cat_id' => $cat_to_go);
+	}
+	
+	function OnGoHome(&$event)
+	{
+		$cat_to_go = 0;
+		$event->redirect = 'in-commerce/product_selector';
+		$event->redirect_params = Array('m_cat_id' => $cat_to_go);
+	}
+
+}
+
+?>
\ No newline at end of file

Property changes on: trunk/core/units/categories/categories_event_handler.php
___________________________________________________________________
Added: cvs2svn:cvs-rev
## -0,0 +1 ##
+1.2
\ No newline at end of property
Added: svn:executable
## -0,0 +1 ##
+*
\ No newline at end of property
Index: trunk/core/units/configuration/configuration_config.php
===================================================================
--- trunk/core/units/configuration/configuration_config.php	(nonexistent)
+++ trunk/core/units/configuration/configuration_config.php	(revision 1310)
@@ -0,0 +1,52 @@
+<?php
+	
+$config	=	Array(
+					'Prefix'			=>	'conf',
+					'ItemClass'			=>	Array('class'=>'kDBItem','file'=>'','build_event'=>'OnItemBuild'),
+					'ListClass'			=>	Array('class'=>'kDBList','file'=>'','build_event'=>'OnListBuild'),
+					'EventHandlerClass'	=>	Array('class'=>'ConfigurationEventHandler','file'=>'configuration_event_handler.php','build_event'=>'OnBuild'),
+					'TagProcessorClass' =>	Array('class'=>'ConfigurationTagProcessor','file'=>'configuration_tag_processor.php','build_event'=>'OnBuild'),
+					'AutoLoad'			=>	true,
+					'hooks'				=>	Array(),
+					'QueryString'		=>	Array(
+												1	=>	'id',
+												2	=>	'page',
+												3	=>	'event',
+												4	=>	'module',
+												5	=>	'section',
+											),
+					'IDField'			=>	'VariableName',
+
+					'TitlePresets'		=>	Array(
+												'config_list' => Array('prefixes' => Array('conf_List'), 'format' => "!la_updating_config!"),
+											),
+					
+					'TableName'			=>	TABLE_PREFIX.'ConfigurationValues',
+					'ListSQLs'			=>	Array(''=>'SELECT * FROM '.TABLE_PREFIX.'ConfigurationAdmin LEFT JOIN '.TABLE_PREFIX.'ConfigurationValues Using(VariableName) '),
+					
+					
+					'ItemSQLs'			=>	Array(''=>'SELECT * FROM '.TABLE_PREFIX.'ConfigurationAdmin LEFT JOIN '.TABLE_PREFIX.'ConfigurationValues Using(VariableName) '),
+																		
+					'SubTables'		=> Array(),
+					
+				  'Fields' 		=>	Array(
+									        'VariableName' => Array('type' => 'string','not_null' => '1','default' => ''),
+									        'VariableValue' => array('type'=>'string', 'default'=>''),
+									        'ModuleOwner'	=>	array('type'=>'string', 'default'=>'In-Portal'),
+									        'Section'	=>	array('type'=>'string','not_null' => '1','default'=>''),
+											),
+
+					'VirtualFields'	=> 	Array(
+											'heading' => Array('type' => 'string','default' => ''),
+									        'prompt' => Array('type' => 'string','default' => ''),
+									        'element_type' => Array('type' => 'string','not_null' => '1','default' => ''),
+									        'validation' => Array('type' => 'string','default' => ''),
+									        'ValueList' => Array('type' => 'string','default' => ''),
+									        'DisplayOrder' => Array('type' => 'int','not_null' => '1','default' => '0'),
+									        'Install' => Array('type' => 'int','not_null' => '1','default' => '1'),
+											),
+											
+					'Grids'	=> Array(),
+	);
+
+?>
\ No newline at end of file

Property changes on: trunk/core/units/configuration/configuration_config.php
___________________________________________________________________
Added: cvs2svn:cvs-rev
## -0,0 +1 ##
+1.2
\ No newline at end of property
Added: svn:executable
## -0,0 +1 ##
+*
\ No newline at end of property
Index: trunk/core/units/configuration/configuration_tag_processor.php
===================================================================
--- trunk/core/units/configuration/configuration_tag_processor.php	(nonexistent)
+++ trunk/core/units/configuration/configuration_tag_processor.php	(revision 1310)
@@ -0,0 +1,57 @@
+<?php
+
+class ConfigurationTagProcessor extends kDBTagProcessor {
+	
+	function PrintList($params)
+	{
+		$list =& $this->Application->recallObject( $this->getPrefixSpecial(), $this->Prefix.'_List',$params);
+		$id_field = $this->Application->getUnitOption($this->Prefix,'IDField');
+		
+		$list->PerPage=-1;
+		$list->Query();
+		$o = '';
+		$list->GoFirst();
+		
+		$block_params=$this->prepareTagParams($params);
+		$block_params['name']=$params['block'];
+		$block_params['pass_params']='true';
+		$block_params['IdField'] = $id_field;
+		
+		$next_block=$params['full_block'];
+		
+		$prev_title="";
+		
+		while (!$list->EOL()) 
+		{
+			$nextItemPrompt=$list->Records[$list->CurrentIndex+1]['prompt'];
+			$thisItemPrompt=$list->Records[$list->CurrentIndex]['prompt'];
+
+			$this_title=$list->Records[$list->CurrentIndex]['heading'];
+
+			if ($this_title!=$prev_title){
+				$prev_title=$this_title;
+				$section_header_params=array();
+				$section_header_params['name']='config_section_header';
+				$section_header_params['title']=$this->Application->Phrase($this_title);
+				$o.= $this->Application->ParseBlock($section_header_params, 1);
+			}
+
+			if ($nextItemPrompt==$thisItemPrompt){
+				$curr_block=$params['half_block1'];
+				$next_block=$params['half_block2'];
+			}else{
+				$curr_block=$next_block;
+				$next_block=$params['full_block'];
+			}
+			$block_params['name']=$curr_block;
+			
+			$this->Application->SetVar( $this->getPrefixSpecial().'_id', $list->GetDBField($id_field) );
+			$o.= $this->Application->ParseBlock($block_params, 1);
+			
+			$list->GoNext();
+		}
+		return $o;	
+	}
+}
+
+?>
\ No newline at end of file

Property changes on: trunk/core/units/configuration/configuration_tag_processor.php
___________________________________________________________________
Added: cvs2svn:cvs-rev
## -0,0 +1 ##
+1.2
\ No newline at end of property
Added: svn:executable
## -0,0 +1 ##
+*
\ No newline at end of property
Index: trunk/core/units/configuration/configuration_event_handler.php
===================================================================
--- trunk/core/units/configuration/configuration_event_handler.php	(nonexistent)
+++ trunk/core/units/configuration/configuration_event_handler.php	(revision 1310)
@@ -0,0 +1,102 @@
+<?php
+
+	class ConfigurationEventHandler extends InpDBEventHandler  {
+	
+		/**
+		 * Apply any custom changes to list's sql query
+		 *
+		 * @param kEvent $event
+		 * @access protected
+		 * @see OnListBuild
+		 */
+		function SetCustomQuery(&$event)
+		{
+			$object =& $event->getObject();
+			
+			$module_owner=$this->Application->GetVar('module');
+			if ($module_owner===false) {
+					$module_owner=$this->myUrlDecode($this->Application->GetVar('conf_module'));
+					$this->Application->SetVar("module", $module_owner);
+			}
+
+			$section=$this->Application->GetVar('section');
+			if ($section===false){
+					$section=$this->myUrlDecode($this->Application->GetVar('conf_section'));
+					$this->Application->SetVar("section", $section);
+			}
+			
+			$object->SetWhereClause('%1$s.ModuleOwner="'.$module_owner.'" AND %1$s.Section="'.$section.'"');
+			$object->AddOrderField('DisplayOrder', 'ASC');
+		}
+
+		/**
+		 * Enter description here...
+		 *
+		 * @param kEvent $event
+		 */
+		function OnBeforeItemUpdate(&$event)
+		{
+			$object =& $event->getObject();
+			if($object->GetDBField('element_type') == 'password')
+			{
+				if (trim($object->GetDBField('VariableValue'))=='') {
+					$field_options=$object->GetFieldOptions('VariableValue');
+					$field_options['skip_empty']=1;
+					$object->SetFieldOptions('VariableValue', $field_options);
+				}else{
+					$object->SetDBField('VariableValue', md5($object->GetDBField('VariableValue')));
+				}
+			}
+		}	
+			
+		/**
+		 * Enter description here...
+		 *
+		 * @param kEvent $event
+		 */
+		function OnAfterItemUpdate(&$event)
+		{
+			$object =& $event->getObject();
+			if($object->GetDBField('element_type') == 'password')
+			{
+				if (trim($object->GetDBField('VariableValue'))=='') {
+					$field_options=$object->GetFieldOptions('VariableValue');
+					unset($field_options['skip_empty']);
+					$object->SetFieldOptions('VariableValue', $field_options);
+				}
+			}
+		}		
+		
+		
+		function OnUpdate(&$event)
+		{
+			parent::OnUpdate($event);
+			$module_owner=$this->Application->GetVar('module');
+			$section=$this->Application->GetVar('section');
+			
+			$event->redirect_params = Array('opener' => 's','conf_section'=>$this->myUrlEncode($section), 'conf_module'=>$this->myUrlEncode($module_owner),'pass'=>'all,conf'); //stay!
+		}
+
+		function OnCancel(&$event)
+		{
+			parent::OnCancel($event);
+			$module_owner=$this->Application->GetVar('module');
+			$section=$this->Application->GetVar('section');
+			
+			$event->redirect_params = Array('opener' => 's','conf_section'=>$this->myUrlEncode($section), 'conf_module'=>$this->myUrlEncode($module_owner),'pass'=>'all,conf'); //stay!
+		}
+				
+		function myUrlDecode($str){
+			$str=str_replace(';',':', $str);
+			$str=str_replace('!','-', $str);
+			return $str;
+		}
+		function myUrlEncode($str){
+			$str=str_replace('-', '!', $str);
+			$str=str_replace(':', ';', $str);
+			return $str;
+		}
+
+	}
+
+?>
\ No newline at end of file

Property changes on: trunk/core/units/configuration/configuration_event_handler.php
___________________________________________________________________
Added: cvs2svn:cvs-rev
## -0,0 +1 ##
+1.2
\ No newline at end of property
Added: svn:executable
## -0,0 +1 ##
+*
\ No newline at end of property
Index: trunk/core/units/general/inp_db_event_handler.php
===================================================================
--- trunk/core/units/general/inp_db_event_handler.php	(nonexistent)
+++ trunk/core/units/general/inp_db_event_handler.php	(revision 1310)
@@ -0,0 +1,145 @@
+<?php
+
+	class InpDBEventHandler extends kDBEventHandler 
+	{
+		
+		function mapEvents()
+		{
+			$common_events = Array(	'onMassApprove'=>'iterateItems',
+									'onMassDecline'=>'iterateItems',
+									'onMassMoveUp'=>'iterateItems',
+									'onMassMoveDown'=>'iterateItems',
+								);
+			
+			$this->eventMethods = array_merge($this->eventMethods, $common_events);
+		}
+		
+		/**
+		 * Apply same processing to each item beeing selected in grid
+		 *
+		 * @param kEvent $event
+		 * @access private
+		 */
+		function iterateItems(&$event)
+		{
+			$this->Application->setUnitOption($event->Prefix,'AutoLoad',false);
+			$object =& $event->getObject();
+			$this->StoreSelectedIDs($event);
+			$ids=$this->getSelectedIDs($event);
+	
+			if($ids)
+			{
+				$status_field = array_shift( $this->Application->getUnitOption($event->Prefix,'StatusField') );
+				
+				foreach($ids as $id)
+				{
+					$object->Load($id);
+					
+					switch ($event->Name)
+					{
+						case 'onMassApprove':
+							$object->SetDBField($status_field, 1);
+							break;
+					
+						case 'onMassDecline':
+							$object->SetDBField($status_field, 0);
+							break;
+							
+						case 'onMassMoveUp':
+							$object->SetDBField('Priority', $object->GetDBField('Priority') + 1);
+							break;
+							
+						case 'onMassMoveDown':
+							$object->SetDBField('Priority', $object->GetDBField('Priority') - 1);
+							break;
+					}
+					
+					if( $object->Update() )
+					{
+						$event->status=erSUCCESS;
+						$event->redirect_params = Array('opener' => 's', 'pass_events' => true); //stay!
+					}
+					else
+					{
+						$event->status=erFAIL;
+						$event->redirect=false;
+						break;
+					}
+				}
+			}
+		}
+		
+		/**
+		 * Enter description here...
+		 *
+		 * @param kEvent $event
+		 */
+		function OnMassClone(&$event)
+		{
+			$event->status=erSUCCESS;
+			
+			$temp =& $this->Application->recallObject($event->getPrefixSpecial().'_TempHandler', 'kTempTablesHandler');
+			
+			$this->StoreSelectedIDs($event);
+			$ids=$this->getSelectedIDs($event);
+			
+			if($ids)
+			{
+				$temp->CloneItems($event->Prefix, $event->Special, $ids);
+			}
+		}
+		
+		function check_array($records, $field, $value)
+		{
+			foreach ($records as $record)
+			{
+				if ($record[$field] == $value)
+				{
+					return true;
+				}
+			}
+			return false;
+		}
+		
+		/**
+		 * Split one timestamp field into 2 virtual fields
+		 *
+		 * @param kEvent $event
+		 * @access public
+		 */
+		function loadTSField(&$event, $ts_field, $date_field, $time_field)
+		{
+			$object =& $event->getObject();
+			$timestamp = $object->GetDBField($ts_field);
+			if( isset($timestamp) && $timestamp )
+			{
+				$options = $object->GetFieldOptions($date_field);
+				$formatter =& $this->Application->recallObject($options['formatter']);
+				$object->SetField( $date_field, $formatter->Format($timestamp, $options, $errors) );
+
+				$options = $object->GetFieldOptions($time_field);
+				$formatter =& $this->Application->recallObject($options['formatter']);
+				$object->SetField( $time_field, $formatter->Format($timestamp, $options, $errors) );
+			}
+		}
+		
+		/**
+		 * Save date & time virtual fields back to timestamp field
+		 *
+		 * @param kEvent $event
+		 * @access public
+		 */
+		function saveTSField(&$event, $ts_field, $date_field, $time_field)
+		{
+			$object =& $event->getObject();
+			$date_value = $object->GetDBField($date_field);
+			$time_value = $object->GetDBField($time_field);
+			$time_zone_offset = date('Z', time() ); // !!! this is important
+			
+			$object->SetDBField($ts_field, $date_value+$time_value+$time_zone_offset);
+		}
+		
+	}
+
+
+?>
\ No newline at end of file

Property changes on: trunk/core/units/general/inp_db_event_handler.php
___________________________________________________________________
Added: cvs2svn:cvs-rev
## -0,0 +1 ##
+1.2
\ No newline at end of property
Added: svn:executable
## -0,0 +1 ##
+*
\ No newline at end of property
Index: trunk/core/units/general/cat_dbitem.php
===================================================================
--- trunk/core/units/general/cat_dbitem.php	(nonexistent)
+++ trunk/core/units/general/cat_dbitem.php	(revision 1310)
@@ -0,0 +1,113 @@
+<?php
+
+class kCatDBItem extends kDBItem {
+	
+	function Create()
+	{
+		if (!$this->Validate()) return false;
+		
+		$this->SetDBField('ResourceId', $this->Application->NextResourceId());
+		$this->SetDBField('Modified', mktime());
+		
+		$ret = parent::Create();
+		if($ret)
+		{
+			if ( kTempTablesHandler::IsTempTable($this->TableName) ) {
+				$table = kTempTablesHandler::GetTempName(TABLE_PREFIX.'CategoryItems');
+			}
+			else {
+				$table = TABLE_PREFIX.'CategoryItems';
+			}
+			$cat_id = $this->Application->GetVar('m_cat_id');
+			$query = 'INSERT INTO '.$table.' (CategoryId,ItemResourceId,PrimaryCat)
+								VALUES ('.$cat_id.','.$this->GetField('ResourceId').',1)';
+			$this->Conn->Query($query);
+		}
+		return $ret;
+	}
+	
+	function Update($id=null)
+	{
+		$this->VirtualFields['ResourceId'] = true;
+		$this->SetDBField('Modified', mktime());
+		return parent::Update($id);
+	}
+	
+	function Copy($cat_id=null)
+	{
+		if (!isset($cat_id)) $cat_id = $this->Application->GetVar('m_cat_id');
+		$this->NameCopy($cat_id);
+		return $this->Create($cat_id);
+	}
+	
+	function NameCopy($master=null, $foreign_key=null)
+	{
+		$title_field = $this->Application->getUnitOption($this->Prefix, 'TitleField');
+		if (!$title_field) return;
+		
+		$new_name = $this->GetDBField('Name');
+		$cat_id = $this->Application->GetVar('m_cat_id');
+		$original_checked = false;
+		do {
+			if ( preg_match("/Copy ([0-9]*)[ ]*of(.*)/", $new_name, $regs) ) {
+				$new_name = 'Copy '.($regs[1]+1).' of '.$regs[2];
+			}
+			elseif ($original_checked) {
+				$new_name = 'Copy of '.$new_name;
+			}
+			$query = 'SELECT '.$title_field.' FROM '.$this->TableName.'
+								LEFT JOIN '.TABLE_PREFIX.'CategoryItems ON 
+								('.TABLE_PREFIX.'CategoryItems.ItemResourceId = '.$this->TableName.'.ResourceId)
+								WHERE ('.TABLE_PREFIX.'CategoryItems.CategoryId = '.$cat_id.') AND '.
+								$title_field.' = '.$this->Conn->qstr($new_name);
+			$res = $this->Conn->GetOne($query);
+			$original_checked = true;
+		} while ($res !== false);
+		$this->SetDBField($title_field, $new_name);
+	}
+	
+	function MoveToCat($cat_id=null)
+	{
+//		$this->NameCopy();
+		$cat_id = $this->Application->GetVar('m_cat_id');
+		// check if the product already exists in destination cat
+		$query = 'SELECT PrimaryCat FROM '.TABLE_PREFIX.'CategoryItems 
+							WHERE CategoryId = '.$cat_id.' AND ItemResourceId = '.$this->GetDBField('ResourceId');
+		// if it's not found is_primary will be FALSE, if it's found but not primary it will be int 0
+		$is_primary = $this->Conn->GetOne($query); 
+		$exists = $is_primary !== false;
+		
+		if ($exists) { // if the Product already exists in destination category
+			if ($is_primary) return; // do nothing when we paste to primary
+			// if it's not primary - delete it from destination category, 
+			// as we will move it from current primary below
+			$query = 'DELETE FROM '.TABLE_PREFIX.'CategoryItems 
+								WHERE ItemResourceId = '.$this->GetDBField('ResourceId').' AND CategoryId = '.$cat_id;
+			$this->Conn->Query($query);
+			
+		}
+		$query = 'UPDATE '.TABLE_PREFIX.'CategoryItems SET CategoryId = '.$cat_id.
+						 ' WHERE ItemResourceId = '.$this->GetDBField('ResourceId').' AND PrimaryCat = 1';	
+		$this->Conn->Query($query);
+		$this->Update();
+	}
+	
+	// We need to delete CategoryItems record when deleting product
+	function Delete($id=null)
+	{
+		if( isset($id) ) {
+			$this->setID($id);
+		}
+		$this->Load($this->GetID());
+		
+		$ret = parent::Delete();
+		if ($ret) {
+			$query = 'DELETE FROM '.TABLE_PREFIX.'CategoryItems WHERE ItemResourceId = '.$this->GetDBField('ResourceId');
+			$this->Conn->Query($query);
+		}
+		
+		return $ret;
+	}
+}
+
+?>
\ No newline at end of file

Property changes on: trunk/core/units/general/cat_dbitem.php
___________________________________________________________________
Added: cvs2svn:cvs-rev
## -0,0 +1 ##
+1.2
\ No newline at end of property
Added: svn:executable
## -0,0 +1 ##
+*
\ No newline at end of property
Index: trunk/core/units/general/inp_login_event_handler.php
===================================================================
--- trunk/core/units/general/inp_login_event_handler.php	(nonexistent)
+++ trunk/core/units/general/inp_login_event_handler.php	(revision 1310)
@@ -0,0 +1,18 @@
+<?php
+
+	class InpLoginEventHandler extends kEventHandler 
+	{
+		function OnSessionExpire()
+		{
+			$admin_dir = $this->Application->ConfigValue('AdminDirectory');
+			if(!$admin_dir) $admin_dir = 'admin';
+			$location = $this->Application->BaseURL().$admin_dir.'/index.php?expired=1';
+			header('Location: '.$location);
+			exit;
+		}
+		
+		
+	}
+
+
+?>
\ No newline at end of file

Property changes on: trunk/core/units/general/inp_login_event_handler.php
___________________________________________________________________
Added: cvs2svn:cvs-rev
## -0,0 +1 ##
+1.2
\ No newline at end of property
Added: svn:executable
## -0,0 +1 ##
+*
\ No newline at end of property
Index: trunk/core/units/general/inp_unit_config_reader.php
===================================================================
--- trunk/core/units/general/inp_unit_config_reader.php	(nonexistent)
+++ trunk/core/units/general/inp_unit_config_reader.php	(revision 1310)
@@ -0,0 +1,19 @@
+<?php
+
+	class InpUnitConfigReader extends kUnitConfigReader 
+	{
+		/**
+		 * Scan kernel and user classes
+		 * for available configs
+		 *
+		 * @access protected
+		 */
+		function Init($prefix,$special)
+		{
+			parent::Init($prefix,$special);
+			$this->processFolder(DOC_ROOT.BASE_PATH);
+		}
+	}
+
+
+?>
\ No newline at end of file

Property changes on: trunk/core/units/general/inp_unit_config_reader.php
___________________________________________________________________
Added: cvs2svn:cvs-rev
## -0,0 +1 ##
+1.2
\ No newline at end of property
Added: svn:executable
## -0,0 +1 ##
+*
\ No newline at end of property
Index: trunk/core/units/general/custom_fields.php
===================================================================
--- trunk/core/units/general/custom_fields.php	(nonexistent)
+++ trunk/core/units/general/custom_fields.php	(revision 1310)
@@ -0,0 +1,69 @@
+<?php
+
+class InpCustomFieldsHelper extends kDBBase {
+	
+	
+	function GetValuesHash($values_list)
+	{
+		$optionValuesStr = $this->ParseConfigSQL($values_list);
+		$optionValuesTmp=explode(',', $optionValuesStr);	
+		$optionValues=array();
+		foreach ($optionValuesTmp as $optionValue){
+			list($key, $val) = explode("=", $optionValue);
+			
+			if (substr($val,0,1)=="+")
+				$val = substr($val, 1);
+			else
+				$val = $this->Application->Phrase($val);
+			
+			$optionValues[$key]=$val;
+		}
+		return $optionValues;
+	}
+
+	function ParseConfigSQL($valueString){
+		$string = trim(str_replace("<PREFIX>",TABLE_PREFIX,$valueString));
+		
+		$start = strpos($string,"<SQL>");
+		
+		while($start){
+			$end = strpos($string,"</SQL>");
+			if(!$end){
+				$end = strlen($string);
+			}
+			$len = $end - $start;
+			$sql = substr($string,$start+5,$len-5);
+			
+			$sql_val = $this->QueryConfigSQL($sql);
+			
+			/*if ($start>0 && $sql_val!='') 
+		  		$sql_val=",".$sql_val;*/
+		  	if ($end < strlen($string)-6 && $sql_val!='')
+		  		$sql_val.=",";			
+			
+		  	$chunk1=substr($string,0,$start);
+		  	$chunk2=substr($string,$end+6);
+			$s = $chunk1.$sql_val.$chunk2;
+			
+			
+			$string = $s;
+			$start = strpos($string,"<SQL>"); 
+		}
+		return $string;
+	}
+
+	function QueryConfigSQL($sql){
+		$db =& $this->Application->GetADODBConnection();
+
+		$valArray=$db->Query($sql);
+		for ($i=0; $i<sizeof($valArray); $i++){
+			$valArray[$i] = $valArray[$i]['OptionName']."="."+".$valArray[$i]['OptionValue'];
+			$valArray[$i] = str_replace(',', ';', $valArray[$i]);
+		}
+		return implode(',', $valArray);
+	}
+	
+	
+}
+
+?>
\ No newline at end of file

Property changes on: trunk/core/units/general/custom_fields.php
___________________________________________________________________
Added: cvs2svn:cvs-rev
## -0,0 +1 ##
+1.2
\ No newline at end of property
Added: svn:executable
## -0,0 +1 ##
+*
\ No newline at end of property
Index: trunk/core/units/general/general_config.php
===================================================================
--- trunk/core/units/general/general_config.php	(nonexistent)
+++ trunk/core/units/general/general_config.php	(revision 1310)
@@ -0,0 +1,21 @@
+<?php
+
+$config	=	Array(
+					'Prefix'			=>	'm',
+					'hooks'				=>	Array(),
+					'QueryString'		=>	Array(
+												1	=>	'cat_id',
+												2	=>	'cat_page',
+												3	=>	'lang',
+												4	=>	'theme',
+												5	=>	'opener',
+											),
+					'TitleField'		=>	'CachedNavbar',
+					'TitlePhrase'		=>	'la_Text_Category',
+					'ItemType'			=>	1,
+					'TableName'			=>	TABLE_PREFIX.'Category',					
+				
+					'PortalStyleEnv' => true,
+					);
+					
+?>
\ No newline at end of file

Property changes on: trunk/core/units/general/general_config.php
___________________________________________________________________
Added: cvs2svn:cvs-rev
## -0,0 +1 ##
+1.2
\ No newline at end of property
Added: svn:executable
## -0,0 +1 ##
+*
\ No newline at end of property
Index: trunk/core/units/general/inp1_parser.php
===================================================================
--- trunk/core/units/general/inp1_parser.php	(nonexistent)
+++ trunk/core/units/general/inp1_parser.php	(revision 1310)
@@ -0,0 +1,155 @@
+<?php
+
+class Inp1Parser extends kBase {
+	
+	var $InportalInited = false;
+	
+	function Parse($tname, $template_body)
+	{
+		if ( !$this->InportalInited) {
+			$this->InitInPortal();
+		}
+		global $objTemplate;
+		$template_body = $objTemplate->ParseTemplateFromBuffer($tname, $template_body);
+		return $template_body;
+	}
+	
+	
+	function InitInPortal()
+	{
+		$this->InportalInited = true;
+		/*global 	$pathtoroot, $FrontEnd, $indexURL, $rootURL, $secureURL, $var_list, $CurrentTheme, 
+						$objThemes, $objConfig, $m_var_list, $timeout, $objLanguages, $objLanguageCache, 
+						$TemplateRoot, $objTemplate, $html, $objSession, $Errors, $objCatList, $objUsers, 
+						$env, $mod_prefix, $ExtraVars, $timestart, $timeend, $timeout, $sqlcount, $totalsql,
+						$template_path, $modules_loaded, $mod_root_cats, $objModules, $objItemTypes;*/
+						
+						
+		global $sec, $usec, $timestart, $pathtoroot, $FrontEnd, $indexURL, $kernel_version, $FormError, 
+		$FormValues, $ItemTables, $KeywordIgnore, $debuglevel, 
+		$LogLevel, $LogFile, $rq_value, $rq_name, $dbg_constMap, $dbg_constValue, $dbg_constName, 
+		$debugger, $g_LogFile, $LogData, $Errors, 
+		$g_DebugMode, $totalsql, $sqlcount, $objConfig, $ItemTypePrefixes, $ItemTagFiles, $objModules, 
+		$objSystemCache, $objBanList, $objItemTypes, $objThemes, $objLanguages, $objImageList, $objFavorites,
+		$objUsers, $objGroups, $DownloadId, $objPermissions, $objPermCache, $m_var_list, $objCatList, 
+		$objCustomFieldList, $objCustomDataList, $objCountCache, $CRLF, $objMessageList, $objEmailQueue, 
+		$ExtraVars, $adodbConnection, $sql, $rs, $mod_prefix, $modules_loaded, $name, 
+		$template_path, $mod_root_cats, $value, $mod, $ItemTypes, 
+		$ParserFiles, $SessionQueryString, $var_list, $objSession, 
+		$orderByClause, $TemplateRoot, $ip, $UseSession, $Action, $CookieTest, $sessionId, 
+		$var_list_update, $CurrentTheme, $UserID, $objCurrentUser, $objLanguageCache, 
+		$folder_name, $objLinkList, $tag_override, $timeZones, $siteZone, $serverZone, 
+		$lastExpire, $diffZone, $date, $nowDate, $lastExpireDate, $SearchPerformed, 
+		$TotalMessagesSent, $ado, $adminDir, $rootURL, $secureURL, $html, $timeout, 
+		$pathchar, $objTemplate;
+		
+		$pathtoroot = "./";
+		$pathtoroot = realpath($pathtoroot)."/";
+		
+		if (!file_exists($pathtoroot."config.php")) {
+			echo "In-Portal is probably not installed, or configuration file is missing.<br>";
+			echo "Please use the installation script to fix the problem.<br><br>";
+			echo "<a href='admin/install.php'>Go to installation script</a><br><br>";
+			flush();
+			die();
+		}
+		
+		//ob_start();
+		$FrontEnd=1;
+		
+		$indexURL="../../index.php"; //Set to relative URL from the theme directory
+		
+		/* initalize the in-portal system */
+		include_once(FULL_PATH."/kernel/startup.php");
+		
+		$rootURL="http://".ThisDomain().$objConfig->Get("Site_Path");
+		
+		//$secureURL = "https://".ThisDomain().$objConfig->Get("Site_Path");
+		$secureURL = $rootURL;
+		
+		$html= '';
+		
+		if( !$var_list['t'] ) $var_list['t'] = 'index';
+		
+		if( !isset($CurrentTheme) ) $CurrentTheme = null;
+		if( !is_object($CurrentTheme) ) $CurrentTheme = $objThemes->GetItem($m_var_list["theme"]);
+		
+		if(is_object($CurrentTheme))
+		{
+			if(!$CurrentTheme->Get("Enabled"))
+			{
+				$CurrentTheme = $objThemes->GetItem($objThemes->GetPrimaryTheme());
+			}
+			if((int)$CurrentTheme->Get("ThemeId")>0)
+			{
+		      $timeout = $CurrentTheme->Get("CacheTimeout");
+		      $objLanguageCache->LoadTemplateCache($var_list["t"],$timeout,$CurrentTheme->Get("ThemeId"));
+		      $objLanguageCache->LoadCachedVars($objSession->Get("Language"));
+		
+		  	  $TemplateRoot = $CurrentTheme->ThemeDirectory()."/";
+		
+			  $objTemplate = new clsTemplateList($TemplateRoot);
+			  //$html = $objTemplate->ParseTemplate($var_list["t"]);	 
+		    }
+		    else 
+		    {
+		      echo "No Primary Theme Selected";
+		      die();
+		    }
+		}
+		else
+		{
+		  echo "No Primary Theme Selected\n";
+		  die();
+		} 
+		
+		if(is_object($objSession))
+		{
+			
+			$objSession->SetVariable("Template_Referer", $_local_t);
+		}
+		if($objTemplate->ErrorNo == -1)
+		{
+			$html = $objTemplate->ParseTemplate('error_template');
+		}
+		//$html = replacePngTags($html);
+		LogEntry("Output Start\n");
+		$html .= "<!-- Page Execution Time: ".( isset($ptime) ? $ptime : 0 )." -->";
+		if( IsDebugMode() ) 
+		{
+			if($Action) $debugger->setHTMLByIndex(1,'Front Action: <b>'.$Action.'</b>','append');
+			$html = '<a href="javascript:toggleDebugLayer();">Show Debugger</a><br>'.$html;
+		}
+		else 
+		{
+			header("Content-length: ".strlen($html));
+		}
+		header("Connection-Type: Keep-Alive");
+		echo $html;
+		
+		LogEntry("Output End\n");
+		
+		if( isset($template) && $template->ErrorNo != 0 )
+		{
+		  print "\n(".$objTemplate->ErrorNo.") ".$objTemplate->ErrorStr."\n";
+		}
+		
+		LogEntry("Output Complete\n");
+		$objLanguageCache->SaveTemplateCache();
+		LogEntry("Templates Cached\n");
+		
+		//if($objSession->SessionEnabled())
+		//  $objSession->SaveSessionData();   
+		//echo "Cookie: <PRE>"; print_r($_COOKIE); echo "</PRE><br>\n";
+		//ob_end_flush();
+		$timeend = getmicrotime();
+		$diff = $timeend - $timestart;
+		
+		LogEntry("\nTotal Queries Executed: $sqlcount in $totalsql seconds\n");
+		LogEntry("\nPage Execution Time: $diff seconds\n", true);
+		if($LogFile)
+		  fclose($LogFile);
+	}
+}
+
+?>
\ No newline at end of file

Property changes on: trunk/core/units/general/inp1_parser.php
___________________________________________________________________
Added: cvs2svn:cvs-rev
## -0,0 +1 ##
+1.2
\ No newline at end of property
Added: svn:executable
## -0,0 +1 ##
+*
\ No newline at end of property
Index: trunk/core/units/general/inp_ses_storage.php
===================================================================
--- trunk/core/units/general/inp_ses_storage.php	(nonexistent)
+++ trunk/core/units/general/inp_ses_storage.php	(revision 1310)
@@ -0,0 +1,61 @@
+<?php
+
+include_once(KERNEL_PATH.'/session/session.php');
+
+class InpSessionStorage extends SessionStorage {
+
+	function Init($prefix,$special)
+	{
+		parent::Init($prefix,$special);
+		$this->setTableName(TABLE_PREFIX.'UserSession');
+		$this->SessionDataTable = TABLE_PREFIX.'SessionData';
+		$this->setIDField('SessionKey');
+		$this->TimestampField = 'LastAccessed';
+		$this->DataValueField = 'VariableValue';
+		$this->DataVarField = 'VariableName';
+	}
+	
+	function LocateSession($sid)
+	{
+		$query = ' SELECT '.$this->TimestampField.' FROM '.$this->TableName.' WHERE '.$this->IDField.' = '.$this->Conn->qstr($sid);
+		$result = $this->Conn->GetOne($query);
+		
+		if($result===false) return false;
+		
+		$this->Expiration = $result + $this->SessionTimeout;
+		return true;
+	}
+	
+	function UpdateSession(&$session)
+	{
+		$query = ' UPDATE '.$this->TableName.' SET '.$this->TimestampField.' = unix_timestamp() WHERE '.$this->IDField.' = '.$this->Conn->qstr($session->SID);
+		$this->Conn->Query($query);
+	}
+	
+	function GetExpiredSIDs()
+	{
+		$query = ' SELECT '.$this->IDField.' FROM '.$this->TableName.' WHERE '.time().' - '.$this->TimestampField.' > '.$this->SessionTimeout;
+		$ret = $this->Conn->GetCol($query);
+		if($ret) $this->DeleteEditTables();
+		return $ret;
+		
+	}
+	
+	function DeleteEditTables()
+	{
+		$tables = $this->Conn->GetCol('SHOW TABLES'); 
+		$mask = '/'.TABLE_PREFIX.'ses_(.*)_edit_(.*)/';
+		$sql='SELECT COUNT(*) FROM '.$this->TableName.' WHERE '.$this->IDField.' = \'%s\'';
+		foreach($tables as $table)
+		{
+			if( preg_match($mask,$table,$rets) )
+			{
+				$sid=$rets[1];
+				$is_alive = $this->Conn->GetOne( sprintf($sql,$sid) );
+				if(!$is_alive) $this->Conn->Query('DROP TABLE IF EXISTS '.$table);
+			}
+		}
+	}
+}
+
+?>
\ No newline at end of file

Property changes on: trunk/core/units/general/inp_ses_storage.php
___________________________________________________________________
Added: cvs2svn:cvs-rev
## -0,0 +1 ##
+1.2
\ No newline at end of property
Added: svn:executable
## -0,0 +1 ##
+*
\ No newline at end of property
Index: trunk/core/units/general/cat_event_handler.php
===================================================================
--- trunk/core/units/general/cat_event_handler.php	(nonexistent)
+++ trunk/core/units/general/cat_event_handler.php	(revision 1310)
@@ -0,0 +1,65 @@
+<?php
+
+$application =& kApplication::Instance();
+$application->Factory->includeClassFile('kDBEventHandler');
+
+class kCatDBEventHandler extends InpDBEventHandler {
+	
+	function OnCopy(&$event)
+	{
+		$object = $event->getObject();
+		$this->StoreSelectedIDs($event);
+		$ids = $this->getSelectedIDs($event);
+		$this->Application->StoreVar($this->getPrefixSpecial().'_clipboard', implode(',', $ids));
+		$this->Application->StoreVar($this->getPrefixSpecial().'_clipboard_mode', 'copy');
+		
+		$this->Application->StoreVar('clipboard', 'COPY-0.'.TABLE_PREFIX.'Products.ResourceId=0');
+		$event->redirect_params = Array('opener' => 's', 'pass_events'=>true); //do not go up - STAY
+	}
+	
+	function OnCut(&$event)
+	{
+		$object = $event->getObject();
+		$this->StoreSelectedIDs($event);
+		$ids = $this->getSelectedIDs($event);
+		$this->Application->StoreVar($this->getPrefixSpecial().'_clipboard', implode(',', $ids));
+		$this->Application->StoreVar($this->getPrefixSpecial().'_clipboard_mode', 'cut');
+		
+		$this->Application->StoreVar('clipboard', 'CUT-0.'.TABLE_PREFIX.'Products.ResourceId=0');
+		$event->redirect_params = Array('opener' => 's', 'pass_events'=>true); //do not go up - STAY
+	}
+	
+	function OnPaste(&$event)
+	{
+		$ids = $this->Application->RecallVar($this->getPrefixSpecial().'_clipboard');
+		if ($ids == '') {
+			$event->redirect = false;
+			return;
+		}
+		
+		//recalling by different name, because we may get kDBList, if we recall just by prefix
+		$object =& $this->Application->recallObject($event->getPrefixSpecial().'.item', $event->Prefix);
+		$this->prepareObject(&$object,&$event);
+		
+		if ($this->Application->RecallVar($this->getPrefixSpecial().'_clipboard_mode') == 'copy') {
+			$ids_arr = explode(',', $ids);
+			
+			$temp =& $this->Application->recallObject($event->getPrefixSpecial().'_TempHandler', 'kTempTablesHandler');
+			
+			if($ids_arr)
+			{
+				$temp->CloneItems($event->Prefix, $event->Special, $ids_arr);
+			}
+		}
+		else { // mode == cut
+			$ids_arr = explode(',', $ids);
+			foreach ($ids_arr as $id) {
+				$object->Load($id);
+				$object->MoveToCat();				
+			}
+		}
+		$event->redirect = true;
+	}
+}
+
+?>
\ No newline at end of file

Property changes on: trunk/core/units/general/cat_event_handler.php
___________________________________________________________________
Added: cvs2svn:cvs-rev
## -0,0 +1 ##
+1.2
\ No newline at end of property
Added: svn:executable
## -0,0 +1 ##
+*
\ No newline at end of property
Index: trunk/core/units/general/cat_dblist.php
===================================================================
--- trunk/core/units/general/cat_dblist.php	(nonexistent)
+++ trunk/core/units/general/cat_dblist.php	(revision 1310)
@@ -0,0 +1,12 @@
+<?php
+
+class kCatDBList extends kDBList {
+	
+	function GetWhereClause()
+	{
+		return $this->Special != 'showall' ? '('.TABLE_PREFIX.'CategoryItems.CategoryId = '.$this->Application->GetVar('m_cat_id').') ' : '';
+	}
+	
+}
+
+?>
\ No newline at end of file

Property changes on: trunk/core/units/general/cat_dblist.php
___________________________________________________________________
Added: cvs2svn:cvs-rev
## -0,0 +1 ##
+1.2
\ No newline at end of property
Added: svn:executable
## -0,0 +1 ##
+*
\ No newline at end of property
Index: trunk/core/units/general/inp_temp_handler.php
===================================================================
--- trunk/core/units/general/inp_temp_handler.php	(nonexistent)
+++ trunk/core/units/general/inp_temp_handler.php	(revision 1310)
@@ -0,0 +1,158 @@
+<?php
+
+class InpTempTablesHandler extends kTempTablesHandler {
+
+	function CopyLiveToTemp($table, $IdField, $ids, $autoincrement=null)
+	{
+		if (is_array($ids)) 
+			$ids = join(',', $ids);
+		if ($ids == '') return;	
+		
+		$query = sprintf("INSERT INTO %s 
+											SELECT * FROM %s
+											WHERE %s IN (%s)",
+											$this->GetTempName($table),
+											$table,
+											$IdField,
+											$ids);
+		$this->Conn->Query($query);
+		if (isset($autoincrement) && !empty($autoincrement)) {
+			$query = sprintf("ALTER TABLE %s
+												CHANGE %s %s INT(11) NOT NULL AUTO_INCREMENT,
+												ADD PRIMARY KEY (%s)",
+												$this->GetTempName($table),
+												$autoincrement,
+												$autoincrement,
+												$autoincrement,
+												$this->GetTempName($table));
+			echo $query.'<br>';
+			$this->Conn->Query($query);
+		}
+		
+		if($table == TABLE_PREFIX.'Images')
+		{			
+			$query = sprintf('SELECT LocalPath,ThumbPath FROM %s WHERE %s IN (%s)',$table,$IdField,$ids);
+			$res = $this->Conn->Query($query);
+						
+			foreach ($res as $record)
+			{
+				foreach ($record as $field => $field_value)
+				{
+					$source_file = DOC_ROOT.BASE_PATH.$field_value;
+					$dest_file = DOC_ROOT.BASE_PATH.str_replace(IMAGES_PATH, IMAGES_PENDING_PATH, $field_value);					
+					copy($source_file, $dest_file);
+				}
+			}
+			
+			$update_sql = 'UPDATE '.$this->GetTempName($table).' SET LocalPath = REPLACE(LocalPath,
+														"'.IMAGES_PATH.'", "'.IMAGES_PENDING_PATH.'"), 
+														ThumbPath = REPLACE(ThumbPath,
+														"'.IMAGES_PATH.'","'.IMAGES_PENDING_PATH.'")
+														WHERE '.$IdField.' IN ('.$ids.')';
+			$this->Conn->Query($update_sql);
+			
+		}
+		
+	}
+	
+	function CopyTempToOriginal($table, $IdField, $autoincrement=null)
+	{
+		if (isset($autoincrement) && !empty($autoincrement))
+		{
+			$this->RemoveAutoincrement($table, $autoincrement);
+		}
+		
+		if( $table != $this->MasterTable )
+		{
+			// get main ids
+			$sql = 	'SELECT '.$this->Tables[$table]['ForeignKey'].
+					' FROM '.$this->MasterTable.
+					' WHERE '.$this->Tables[$this->MasterTable]['IdField'].' IN ('.implode(',',$this->MasterIDs).')';
+			$main_ids = $this->Conn->GetCol($sql);
+			
+			if($main_ids)
+			{
+				if ($table == TABLE_PREFIX.'Images')
+				{
+					$sql = 'SELECT LocalPath, ThumbPath FROM '.$table.
+						' WHERE '.$IdField.' IN ('.implode(',', $main_ids).')';
+					$res = $this->Conn->Query($sql);
+					
+					foreach ($res as $record)
+					{
+						foreach ($record as $field => $field_value)
+						{
+							$source_file = DOC_ROOT.BASE_PATH.$field_value;
+							unlink($source_file);
+						}
+					}
+				}	
+			
+				// delete all related to main table records from subtable
+				$sql = 'DELETE FROM '.$table.' WHERE '.$IdField.' IN ('.implode(',',$main_ids).')';
+				$this->Conn->Query($sql);
+			}
+			
+			$subtable_idfield = $this->Tables[$table]['SubIDField'];
+			$this->Conn->Query('UPDATE '.$this->GetTempName($table).' SET '.$subtable_idfield.' = 0 WHERE '.$subtable_idfield.' < 0');
+		}
+		else
+		{
+			// get IDs, that exist in temp table
+			$query = sprintf('SELECT %s FROM %s',
+											$IdField,
+											$this->GetTempName($table));
+			$this->MasterIDs = $this->Conn->GetCol($query);	// were $temp_ids before
+			if($this->MasterIDs)
+			{
+				// delete original records from master table
+				$query = sprintf('DELETE FROM %s WHERE %s IN (%s)',
+				$table,
+				$IdField,
+				implode(',',$this->MasterIDs) );
+				$this->Conn->Query($query);
+			}
+		}
+		
+		$query = sprintf("INSERT INTO %s 
+											SELECT * FROM %s",
+											$table,
+											$this->GetTempName($table));
+		$this->Conn->Query($query);
+		
+		
+		if($table == TABLE_PREFIX.'Images' && count($main_ids) > 0)
+		{			
+			$query = sprintf('				SELECT LocalPath, ThumbPath FROM %s
+											WHERE %s IN (%s)',
+											$table,
+											$IdField,
+											implode(',',$this->MasterIDs));
+			$res = $this->Conn->Query($query);
+						
+			foreach ($res as $record)
+			{
+				foreach ($record as $field => $field_value)
+				{
+					$source_file = DOC_ROOT.BASE_PATH.$field_value;
+					$dest_file = DOC_ROOT.BASE_PATH.str_replace(IMAGES_PENDING_PATH, IMAGES_PATH, $field_value);
+					rename($source_file, $dest_file);
+				}
+			}
+			
+			$update_sql = 'UPDATE '.$table.' SET LocalPath = REPLACE(LocalPath,
+														"'.IMAGES_PENDING_PATH.'", "'.IMAGES_PATH.'"), 
+														ThumbPath = REPLACE(ThumbPath,
+														"'.IMAGES_PENDING_PATH.'", "'.IMAGES_PATH.'")
+														WHERE '.$IdField.' IN ('.implode(',', $this->MasterIDs).')';
+			$this->Conn->Query($update_sql);
+			
+		}		
+		
+		return $this->Conn->getInsertID();
+	}	
+
+}
+
+
+?>
\ No newline at end of file

Property changes on: trunk/core/units/general/inp_temp_handler.php
___________________________________________________________________
Added: cvs2svn:cvs-rev
## -0,0 +1 ##
+1.2
\ No newline at end of property
Added: svn:executable
## -0,0 +1 ##
+*
\ No newline at end of property
Index: trunk/core/units/general/my_application.php
===================================================================
--- trunk/core/units/general/my_application.php	(nonexistent)
+++ trunk/core/units/general/my_application.php	(revision 1310)
@@ -0,0 +1,289 @@
+<?php
+
+	include_once KERNEL_PATH.'/parser/template_parser.php';
+	include_once MODULES_PATH.'/in-commerce/general/inp_db_event_handler.php';
+	
+	class InpTemplateParser extends TemplateParser {
+		
+		/**
+		 * Searches tag in format <inp:prefix.special_method param1="value1" ... />
+		 *
+		 * @return string
+		 */
+		function FindTag()
+		{
+			$tagOpen = strpos($this->Template, '<%', $this->Position); //Finding tag start
+			
+			$inp_tag = false;
+			$tagOpenLen = 2;
+			$inpOpen = strpos($this->Template, '<inp2:', $this->Position);
+			if ($inpOpen !== false && ($tagOpen === false || $inpOpen < $tagOpen)) {
+				$tagOpen = $inpOpen;
+				$inp_tag = true;
+				$tagOpenLen = 6;
+			}
+			
+			if ($tagOpen === false) { //If not tags left - adding all other data
+				$this->AppendOutput(substr($this->Template, $this->Position));
+				return false;
+			}
+			
+			//Adding all data before tag open
+			$this->AppendOutput(substr($this->Template, $this->Position, $tagOpen - $this->Position));
+			
+			//Finding tag end
+			$tagCloseLen = 2;
+			if ($inp_tag) {
+				$tagClose = strpos($this->Template, "/>", $tagOpen);
+				$inpClose = strpos($this->Template, "</inp2>", $tagOpen);
+				if ($inpClose !== false && $inpClose < $tagClose) {
+					$tagClose = $inpClose;
+					$tagCloseLen = 7;
+				}
+			}
+			else {
+				$tagClose = strpos($this->Template, "%>", $tagOpen); 
+			}
+			
+			if ($tagClose === false) die ("Can't find tag closing");
+			
+			//Cutting out the tag itself
+			$tag = substr($this->Template, $tagOpen + $tagOpenLen, $tagClose - $tagOpen - $tagOpenLen); 
+			
+			if ($inp_tag) {
+				if (strpos($tag, '_') !== false) {
+					list($prefix, $the_tag) = explode('_', $tag, 2);
+					$tag = $prefix.':'.$the_tag;
+				}
+				else $tag .= ':';
+			}
+			
+			//Seting current position right after the tag
+			$this->Position = $tagClose + $tagCloseLen; 
+			return $tag;
+		}
+		
+		function Parse($template, $name='unknown')
+		{
+			$this->Template = $template;
+			$this->TemplateName = $name;
+			$this->Position = 0;
+			$this->Output = '';
+
+			//While we have more tags
+			while ($tag_data = $this->FindTag())
+			{
+				//Create tag object from passed tag data
+				if (defined('DEBUG_TAGS')&&DEBUG_TAGS) {
+					global $debugger;
+					$debugger->appendHTML("mode: ".$this->SkipModeName()." tag ".$debugger->highlightString($tag_data)." in ".$debugger->getFileLink($debugger->getLocalFile(DOC_ROOT.BASE_PATH.THEMES_PATH.'/'.$this->TemplateName).'.tpl', $this->CurrentLineNumber(), '', true));
+				}
+				$tag =& new MyTag($tag_data, $this);
+				if (!$this->CheckRecursion($tag)) //we do NOT process closing tags
+				{
+					$tag->Process();
+				}
+			}
+			
+			if ( !$this->GetParam('from_inportal') ) {
+				if ( strpos($this->Output, '<inp:') !== false) {
+					$inp1_parser =& $this->Application->recallObject('Inp1Parser');
+					$this->Output = $inp1_parser->Parse($name, $this->Output);
+				}
+			}
+			return $this->Output;
+		}
+		
+		function ParseBlock($params, $force_pass_params=0, $as_template=false)
+		{
+			if (defined('EXPERIMENTAL_PRE_PARSE')) {
+				if (isset($this->Application->PreParsedBlocks[$params['name']]) ) {
+					$f = $this->Application->PreParsedBlocks[$params['name']];
+					//$this->SetParams($params);
+					return 	$f($params);
+				}
+			}
+			
+			$BlockParser =& $this->Application->Factory->makeClass('TemplateParser');
+			if (isset($params['pass_params']) || $force_pass_params) {
+				$BlockParser->SetParams(array_merge($this->Params, $params));
+			}
+			else
+				$BlockParser->SetParams($params);
+			$this->Application->Parser =& $BlockParser;
+			if (!isset($params['name'])) die("<b>***Error: Block name not passed to ParseBlock</b><br>");
+			$templates_cache =& $this->Application->recallObject('TemplatesCache');
+			
+			$template_name = $as_template ? $params['name'] : $templates_cache->GetTemplateFileName($params['name']) . '-block:'.$params['name'];
+			
+			$silent = getArrayValue($params, 'from_inportal') && !defined('DBG_TEMPLATE_FAILURE');
+			
+			$o = $BlockParser->Parse(
+					$templates_cache->GetTemplateBody($params['name'], $silent), 
+					$template_name
+				);
+			$this->Application->Parser =& $this;
+			return $o;
+		}
+	}
+	
+	class MyTag extends Tag {
+		
+		/**
+		 * Set's Prefix and Special for Tag object
+		 * based on ones from tagname
+		 *
+		 * @param string $tag_data
+		 * @access protected
+		 */
+		function ParseTagData($tag_data)
+		{
+			$tag_data = $this->ReplaceParams($tag_data) . ' ';
+			$tag_data = $this->Application->ReplaceLanguageTags($tag_data);
+
+
+			list ($key_data, $params) = explode(' ', $tag_data, 2);
+			
+			//cand.test_TagProcessor:PrintList
+			
+			$tmp=explode(':',$key_data);
+			$this->Tag=$tmp[1];
+			
+			$tmp=$this->Application->processPrefix($tmp[0]);
+			$this->Prefix=$tmp['prefix'];
+			$this->Special=$tmp['special'];
+			$this->Processor=$this->Prefix;
+			
+			if ($params != '') $this->ParseNamedParams($params);
+		}
+		
+		/**
+		 * Set's Prefix and Special for TagProcessor
+		 * based on tag beeing processed
+		 *
+		 * @return string
+		 * @access protected
+		 */
+		function DoProcessTag()
+		{
+			// $tag->Prefix - l_TagProcessor
+			$tmp = $this->Application->processPrefix($this->Processor);
+			
+			$processor =& $this->Application->recallObject($tmp['prefix'].'_TagProcessor'); // $this->Processor
+			
+			$tmp=explode('_',$tmp['prefix'],2);
+			$processor->Prefix=$tmp[0];
+			$processor->Special=$this->Special;
+			
+			return $processor->ProcessTag($this);
+		}
+		
+		/**
+		 * Process IF tags in specific way
+		 *
+		 */
+		function Process()
+		{
+			if ($this->Processor == 'm' || $this->Processor == 'm_TagProcessor') { //if we are procssing Main tags
+			if ($this->Tag == 'block') {
+				$tag =& new BlockTag('', $this->Parser);
+				$tag->CopyFrom($this);
+				$tag->Process();
+			}
+			elseif ($this->Parser->SkipMode == skip_tags) {
+				return;
+			}
+			elseif (
+			$this->Tag == 'if' ||
+			$this->Tag == 'ifnot' ||
+			$this->Tag == 'else' ||
+			$this->Tag == 'elseif'
+			) {
+				$tag =& new MyConstructTag('', $this->Parser);
+				$tag->CopyFrom($this);
+				$tag->Process();
+			}
+			elseif ($this->Tag == 'xml') {
+				$tag =& new XMLTag('', $this->Parser);
+				$tag->CopyFrom($this);
+				$tag->Process();
+			}
+			else {
+				if ($this->Parser->SkipMode == skip) return;
+				//if (!$this->ProcessMainTag()) //other main tags
+				$this->ProcessTag();
+			}
+			}
+			else { //normal tags - processors other than main
+			if ($this->Parser->SkipMode == skip_tags || $this->Parser->SkipMode == skip) return; //do not parse if we skipping tags
+			$this->ProcessTag();
+			//$this->Parser->AppendOutput('<b>'.$this->Tag.'</b>');
+			}
+		}
+		
+		
+		
+	}
+	
+	class MyConstructTag extends ConstructTag {
+		
+		function GetLogic()
+		{
+			$prefix = $this->GetParam('prefix');
+			$function = $this->GetParam('function');
+
+			if ($prefix !== false) {
+				$tag =& new MyTag('', $this->Parser);
+				$tag->Tag = $function;
+				
+				$tmp = $this->Application->processPrefix($prefix);
+				$tag->Processor = $tmp['prefix'];
+				
+				$tag->Prefix=$tmp['prefix'];
+				$tag->Special=$tmp['special'];
+				$tag->NamedParams = $this->NP;
+				$this->Logic = $tag->DoProcessTag();
+				// echo " this->Logic : ".$this->Logic."<br>";
+			}
+			else
+			{
+				$this->Logic = $function;
+			}
+		}
+		
+	}
+	
+	class MyApplication extends kApplication {
+	
+		function RegisterDefaultClasses()
+		{
+			parent::RegisterDefaultClasses();
+			$this->registerClass('InpTemplateParser',MODULES_PATH.'/in-commerce/general/my_application.php','TemplateParser');
+			
+			$this->registerClass('Inp1Parser',MODULES_PATH.'/in-commerce/general/inp1_parser.php','Inp1Parser');
+			
+			$this->registerClass('InpSessionStorage',MODULES_PATH.'/in-commerce/general/inp_ses_storage.php','SessionStorage');
+			$this->registerClass('kCatDBItem',MODULES_PATH.'/in-commerce/general/cat_dbitem.php');
+			$this->registerClass('kCatDBList',MODULES_PATH.'/in-commerce/general/cat_dblist.php');
+			$this->registerClass('kCatDBEventHandler',MODULES_PATH.'/in-commerce/general/cat_event_handler.php');
+			$this->registerClass('InpLoginEventHandler',MODULES_PATH.'/in-commerce/general/inp_login_event_handler.php','login_EventHandler');
+			$this->registerClass('InpDBEventHandler',MODULES_PATH.'/in-commerce/general/inp_db_event_handler.php','kDBEventHandler');
+			$this->registerClass('InpTempTablesHandler',MODULES_PATH.'/in-commerce/general/inp_temp_handler.php','kTempTablesHandler');
+			$this->registerClass('InpUnitConfigReader',MODULES_PATH.'/in-commerce/general/inp_unit_config_reader.php','kUnitConfigReader');
+			
+			$this->registerClass('InpCustomFieldsHelper',MODULES_PATH.'/in-commerce/general/custom_fields.php','InpCustomFieldsHelper');
+		}
+		
+		function KernelDie($message)
+		{
+			$this->trigerError($message,E_USER_ERROR);
+			exit;
+		}
+		
+		function ConfigValue($name)
+		{
+			return $this->DB->GetOne('SELECT VariableValue FROM '.TABLE_PREFIX.'ConfigurationValues WHERE VariableName = '.$this->DB->qstr($name) );
+		}
+	}
+
+?>
\ No newline at end of file

Property changes on: trunk/core/units/general/my_application.php
___________________________________________________________________
Added: cvs2svn:cvs-rev
## -0,0 +1 ##
+1.2
\ No newline at end of property
Added: svn:executable
## -0,0 +1 ##
+*
\ No newline at end of property
Index: trunk/core/units/category_items/category_items_event_handler.php
===================================================================
--- trunk/core/units/category_items/category_items_event_handler.php	(nonexistent)
+++ trunk/core/units/category_items/category_items_event_handler.php	(revision 1310)
@@ -0,0 +1,101 @@
+<?php
+
+	class CategoryItemsEventHander extends InpDBEventHandler 
+	{
+		/**
+		 * Add's New Category To Product
+		 *
+		 * @param kEvent $event
+		 */
+		function OnAddCategory(&$event)
+		{
+			$cat_list = (int)rtrim($this->Application->GetVar('cat_list'), ',');
+			//if(!$cat_list) return true;
+			
+			$cat_id = (int)$this->Conn->GetOne('SELECT CategoryId FROM '.TABLE_PREFIX.'Category WHERE ResourceId='.$cat_list);
+			
+			$this->Application->setUnitOption($event->Prefix,'AutoLoad',false);
+			$object =& $event->getObject();
+			
+			$table_info = $object->getLinkedInfo();
+			
+			// don't allow duplicate records
+			$already_added = $this->Conn->GetOne('SELECT * FROM '.$object->TableName.' WHERE CategoryId='.$cat_id.' AND '.$table_info['ForeignKey'].'='.$table_info['ParentId']);
+			if($already_added === false)
+			{
+				$items_info = $this->Application->GetVar( $event->getPrefixSpecial(true) );
+				$items_info[0]['CategoryId'] = $cat_id;
+				$items_info[0][ $table_info['ForeignKey'] ] = $table_info['ParentId'];
+				$this->Application->SetVar( $event->getPrefixSpecial(true), $items_info );
+				
+				$rp_backup = $event->redirect_params;	// save opener state
+				
+				$event->setEventParam('ForceCreateId', true);
+				$this->OnCreate($event);
+				
+				$event->redirect_params = $rp_backup;	// restore opener state
+			}
+		}
+		
+		/**
+		 * Set's new category as primary for product
+		 *
+		 * @param kEvent $event
+		 */
+		function OnSetPrimary(&$event)
+		{
+			$this->Application->setUnitOption($event->Prefix,'AutoLoad',false);
+			$object =& $event->getObject();
+			$this->StoreSelectedIDs($event);
+			$ids=$this->getSelectedIDs($event);
+			if($ids)
+			{
+				$id = array_shift($ids);	
+				$table_info = $object->getLinkedInfo();
+				
+				$this->Conn->Query('UPDATE '.$object->TableName.' SET PrimaryCat = 0 WHERE '.$table_info['ForeignKey'].' = '.$table_info['ParentId']);
+				$this->Conn->Query('UPDATE '.$object->TableName.' SET PrimaryCat = 1 WHERE ('.$table_info['ForeignKey'].' = '.$table_info['ParentId'].') AND (CategoryId = '.$id.')');			
+			}
+			$event->redirect_params = Array('opener' => 's', 'pass_events' => true); //stay!
+		}
+		
+		/**
+		 * Apply custom processing to item
+		 *
+		 * @param kEvent $event
+		 */
+		function customProcessing(&$event, $type)
+		{
+			if($event->Name == 'onMassDelete')
+			{
+				$object =& $event->getObject();
+				$table_info = $object->getLinkedInfo();
+				
+				switch ($type)
+				{
+					case 'before':
+						$ids = $event->getEventParam('ids');
+						if($ids)
+						{
+							$ids = $this->Conn->GetCol('SELECT CategoryId FROM '.$object->TableName.' WHERE (PrimaryCat=0) AND ('.$table_info['ForeignKey'].'='.$table_info['ParentId'].') AND CategoryId IN ('.implode(',',$ids).')');
+							$event->setEventParam('ids',$ids);
+						}
+						break;
+				
+						// not needed because 'before' does not allow to delete primary cat!
+					/*case 'after':
+						// set 1st not deleted category as primary
+						$has_primary = $this->Conn->GetOne('SELECT COUNT(*) FROM '.$object->TableName.' WHERE (PrimaryCat=1) AND ('.$table_info['ForeignKey'].' = '.$table_info['ParentId'].')');
+						if(!$has_primary)
+						{
+							$cat_id = $this->Conn->GetOne('SELECT CategoryId FROM '.$object->TableName.' WHERE '.$table_info['ForeignKey'].' = '.$table_info['ParentId']);
+							$this->Conn->Query('UPDATE '.$object->TableName.' SET PrimaryCat = 1 WHERE ('.$table_info['ForeignKey'].' = '.$table_info['ParentId'].') AND (CategoryId = '.$cat_id.')');
+						}
+						break;*/
+				}
+			}
+		}
+		
+	}
+
+?>
\ No newline at end of file

Property changes on: trunk/core/units/category_items/category_items_event_handler.php
___________________________________________________________________
Added: cvs2svn:cvs-rev
## -0,0 +1 ##
+1.2
\ No newline at end of property
Added: svn:executable
## -0,0 +1 ##
+*
\ No newline at end of property
Index: trunk/core/units/category_items/category_items_dbitem.php
===================================================================
--- trunk/core/units/category_items/category_items_dbitem.php	(nonexistent)
+++ trunk/core/units/category_items/category_items_dbitem.php	(revision 1310)
@@ -0,0 +1,36 @@
+<?php
+
+	class CategoryItems_DBItem extends kDBItem 
+	{
+	
+		
+		/**
+		* Returns part of SQL WHERE clause identifing the record, ex. id = 25
+		*
+		* @access public
+		* @param string $method Child class may want to know who called GetKeyClause, Load(), Update(), Delete() send its names as method
+		* @return void
+		* @see kDBItem::Load()
+		* @see kDBItem::Update()
+		* @see kDBItem::Delete()
+		*/
+		function GetKeyClause($method=null)
+		{
+			$table_info = $this->getLinkedInfo();
+			return '(CategoryId='.$this->ID.' AND '.$table_info['ForeignKey'].'='.$table_info['ParentId'].')';
+		}
+		
+		/**
+		 * Generate and set new temporary id
+		 *
+		 * @access private
+		 */
+		function setTempID()
+		{
+			// don't set temp id for this item
+		}
+		
+	}
+
+
+?>
\ No newline at end of file

Property changes on: trunk/core/units/category_items/category_items_dbitem.php
___________________________________________________________________
Added: cvs2svn:cvs-rev
## -0,0 +1 ##
+1.2
\ No newline at end of property
Added: svn:executable
## -0,0 +1 ##
+*
\ No newline at end of property
Index: trunk/core/units/category_items/category_items_config.php
===================================================================
--- trunk/core/units/category_items/category_items_config.php	(nonexistent)
+++ trunk/core/units/category_items/category_items_config.php	(revision 1310)
@@ -0,0 +1,51 @@
+<?php
+	
+$config	=	Array(
+					'Prefix'			=>	'ci',
+					'ItemClass'			=>	Array('class'=>'CategoryItems_DBItem','file'=>'category_items_dbitem.php','build_event'=>'OnItemBuild'),
+					'ListClass'			=>	Array('class'=>'kDBList','file'=>'','build_event'=>'OnListBuild'),
+					'EventHandlerClass'	=>	Array('class'=>'CategoryItemsEventHander','file'=>'category_items_event_handler.php','build_event'=>'OnBuild'),
+					'TagProcessorClass' =>	Array('class'=>'CategoryItemsTagProcessor','file'=>'category_items_tag_processor.php','build_event'=>'OnBuild'),
+					'AutoLoad'			=>	true,
+					'hooks'				=>	Array(),
+					'QueryString'		=>	Array(
+												1	=>	'id',
+												2	=>	'page',
+												3	=>	'event',
+											),
+					'IDField'			=>	'CategoryId',	// in this case idfield doesn't exit in destination table
+					'TableName'		=>	TABLE_PREFIX.'CategoryItems',
+					'ParentTableKey'=>	'ResourceId',
+					'ForeignKey'	=>	'ItemResourceId',
+					'ParentPrefix'	=> 'p',
+					'AutoDelete'	=>	true,
+					'AutoClone'	=> false, // Critical !!!
+					
+					'ListSQLs'			=>	Array(	''=>"	SELECT ci.*, c.CachedNavbar AS CategoryName, IF(ISNULL(c.CategoryId),0,c.CategoryId) AS DummyId
+															FROM %1\$s ci
+															LEFT JOIN ".TABLE_PREFIX."Category AS c ON c.CategoryId = ci.CategoryId",
+																		), // key - special, value - list select sql
+					'ItemSQLs'			=>	Array(	''=>'SELECT * FROM %s',
+																		),
+					
+					'Fields'			=>	Array(
+											    'DummyId' => Array(),
+												'CategoryId' => Array('type'=>'int','not_null'=>1,'default'=>0),
+											    'ItemResourceId' => Array('not_null' => 1, 'default' => 0),
+											    'PrimaryCat' => Array('type' => 'int', 'not_null' => 1, 'default' => 0),
+											),
+					'VirtualFields'	=> 	Array('DummyId'=>1
+													),
+											
+					'Grids'	=> Array(
+								'Default'		=>	Array(
+																	'Icons' => Array('default'=>'icon16_custom.gif'),	// icons for each StatusField values, if no matches or no statusfield selected, then "default" icon is used
+																	'Fields' => Array(
+																			'CategoryName' => Array( 'title'=>'la_col_Category', 'data_block' => 'grid_checkbox_category_td'),
+																			),
+																	
+																),
+													),
+	);
+
+?>
\ No newline at end of file

Property changes on: trunk/core/units/category_items/category_items_config.php
___________________________________________________________________
Added: cvs2svn:cvs-rev
## -0,0 +1 ##
+1.2
\ No newline at end of property
Added: svn:executable
## -0,0 +1 ##
+*
\ No newline at end of property
Index: trunk/core/units/category_items/category_items_tag_processor.php
===================================================================
--- trunk/core/units/category_items/category_items_tag_processor.php	(nonexistent)
+++ trunk/core/units/category_items/category_items_tag_processor.php	(revision 1310)
@@ -0,0 +1,26 @@
+<?php
+
+	class CategoryItemsTagProcessor extends kDBTagProcessor 
+	{
+		function CategoryName($params)
+		{
+			$root_phrase = $this->Application->ConfigValue('Root_Name');
+			$value = $this->Field($params);
+			$ret = $this->Application->Phrase($root_phrase).( $value ? ' > ' : '').$value;
+			if( $this->Field( Array('field'=> 'PrimaryCat') ) == 1 )
+			{
+				$ret .= ' ('.$params['primary_title'].')';
+			}
+			return $ret;
+		}
+		
+		function GetMainID()
+		{
+			$object =& $this->Application->recallObject( $this->getPrefixSpecial() );
+			$table_info = $object->getLinkedInfo();
+			return $table_info['ParentId'];
+		}
+	}
+
+
+?>
\ No newline at end of file

Property changes on: trunk/core/units/category_items/category_items_tag_processor.php
___________________________________________________________________
Added: cvs2svn:cvs-rev
## -0,0 +1 ##
+1.2
\ No newline at end of property
Added: svn:executable
## -0,0 +1 ##
+*
\ No newline at end of property