Index: trunk/kernel/units/languages/languages_config.php
===================================================================
--- trunk/kernel/units/languages/languages_config.php	(revision 1765)
+++ trunk/kernel/units/languages/languages_config.php	(revision 1766)
@@ -1,141 +1,146 @@
 <?php
 	
 $config	=	Array(
 					'Prefix'			=>	'lang',
 					'ItemClass'			=>	Array('class'=>'LanguagesItem','file'=>'languages_item.php','build_event'=>'OnItemBuild'),
 					'ListClass'			=>	Array('class'=>'kDBList','file'=>'','build_event'=>'OnListBuild'),
 					'EventHandlerClass'	=>	Array('class'=>'LanguagesEventHandler','file'=>'languages_event_handler.php','build_event'=>'OnBuild'),
 					'TagProcessorClass' =>	Array('class'=>'LanguagesTagProcessor','file'=>'languages_tag_processor.php','build_event'=>'OnBuild'),
-					
 					'RegisterClasses'	=>	Array(
 												Array('pseudo'=>'LangXML','class'=>'LangXML_Parser','file'=>'import_xml.php'),
 											),
-					
+					/*'AggregateTags' => Array(
+															Array(
+																'AggregateTo' => 'm',
+																'AggregatedTagName' => 'IsMetricUnits',
+																'LocalTagName' => 'Main_IsMetricUnits',
+															),
+													),		*/			
 					'AutoLoad'			=>	true,
 					'Hooks'	=>	Array( 
 												Array(
 													'Mode' => hAFTER,
 													'Conditional' => false,
 													'HookToPrefix' => 'lang',
 													'HookToSpecial' => '',
 													'HookToEvent' => Array('OnSave'),
 													'DoPrefix' => '',
 													'DoSpecial' => '',
 													'DoEvent' => 'OnReflectMultiLingualFields',
 												),
 												
 												Array(
 													'Mode' => hAFTER,
 													'Conditional' => false,
 													'HookToPrefix' => 'lang',
 													'HookToSpecial' => '',
 													'HookToEvent' => Array('OnPreSave'),
 													'DoPrefix' => '',
 													'DoSpecial' => '',
 													'DoEvent' => 'OnCopyLabels',
 												),
 											),
 					'QueryString'		=>	Array(
 												1	=>	'id',
 												2	=>	'page',
 												3	=>	'event',
 												4	=>	'mode',
 											),
 					'IDField'			=>	'LanguageId',
 					
 					'StatusField'		=>	Array('Enabled','PrimaryLang'),	// field, that is affected by Approve/Decline events
 					
 					'TitleField'		=>	'PackName',		// field, used in bluebar when editing existing item
 					
 					'TitlePresets'		=>	Array(
 												'default'	=>	Array(	'new_status_labels'		=> Array('lang'=>'!la_title_Adding_Language!'),
 																		'edit_status_labels'	=> Array('lang'=>'!la_title_Editing_Language!'),
 																		'new_titlefield'		=> Array('lang'=>'!la_title_New_Language!'),
 																),
 												
 												'languages_list'			=>	Array(	'prefixes'	=>	Array('lang_List'), 'format' => "!la_title_Configuration! - !la_title_LanguagePacks! (#lang_recordcount#)"),
 																				
 												'languages_edit_general'	=>	Array(	'prefixes'	=> Array('lang'), 'format' => "#lang_status# '#lang_titlefield#' - !la_title_General!"),
 												
 												'phrases_list'				=>	Array(	'prefixes'	=> Array('lang','phrases_List'), 'format' => "#lang_status# '#lang_titlefield#' - !la_title_Labels! (#phrases_recordcount#)"),
 												
 												'import_language'			=>	Array(	'prefixes'	=> Array('phrases.import'), 'format' => "!la_title_InstallLanguagePackStep1!"),
 												
 												'import_language_step2'		=>	Array(	'prefixes'	=> Array('phrases.import'), 'format' => "!la_title_InstallLanguagePackStep2!"),
 												
 												'export_language'			=>	Array(	'prefixes'	=> Array('phrases.export'), 'format' => "!la_title_ExportLanguagePackStep1!"),
 												
 												'export_language_results'	=>	Array(	'prefixes'	=> Array('phrases.export'), 'format' => "!la_title_ExportLanguagePackResults!"),
 												
 												'events_list'				=>	Array(	'prefixes'	=>	Array('lang','emailevents_List'), 'format'	=>	"#lang_status# '#lang_titlefield#' - !la_title_EmailEvents! (#emailevents_recordcount#)"),
 												
 												'event_edit' 				=>	Array(	'prefixes' 				=>	Array('emailevents'),
 																						'edit_status_labels'	=>	Array('emailevents'	=>	'!la_title_Editing_EmailEvent!'),
 																						'format' 				=> 	'#emailevents_status# - #emailevents_titlefield#'),
 												
 												'email_messages_edit'		=>	Array(	'prefixes'	=>	Array('lang','emailmessages'),
 																						'new_titlefield'	=>	Array('emailmessages' => '!la_NoSubject!'),
 																						'format'	=>	"#lang_status# '#lang_titlefield#' - !la_title_EditingEmailEvent! '#emailmessages_titlefield#'"),
 											),
 					
 					'TableName'			=>	TABLE_PREFIX.'Language',
 					'SubItems' => Array('phrases','emailmessages'),
 					
 					'FilterMenu'		=>	Array(
 												'Groups' => Array(
 													Array('mode' => 'AND', 'filters' => Array(0,1), 'type' => WHERE_FILTER),
 												),
 												
 												'Filters' => Array(
 													0	=>	Array('label' =>'la_Enabled', 'on_sql' => '', 'off_sql' => '%1$s.Enabled != 1' ),
 													1	=>	Array('label' => 'la_Disabled', 'on_sql' => '', 'off_sql' => '%1$s.Enabled != 0'  ),
 												)
 											),
 					
 					'AutoDelete'		=>	true,
 					
 					'AutoClone'			=>	true,
 										
 					'ListSQLs'			=>	Array(	''=>'SELECT * FROM %s',
 																		), // key - special, value - list select sql
 					'ItemSQLs'			=>	Array(	''=>'SELECT * FROM %s',
 																		),
 					'ListSortings'	=> 	Array( 
 																'' => Array(
 																	'Sorting' => Array('PackName' => 'asc'),
 																)
 															),																		
 					'Fields' => Array(
 										'LanguageId' => Array(),
 										'PackName' => Array('type' => 'string','not_null' => '1','default' => '','required'=>1),
 										'LocalName' => Array('type' => 'string','not_null' => '1','default' => '','required'=>1),
 										'Enabled' => Array('type' => 'int', 'formatter' => 'kOptionsFormatter', 'options' => Array(0 => 'la_Disabled', 1 => 'la_Enabled'), 'use_phrases' => 1, 'not_null' => '1',  'default' => '0'),
 										'PrimaryLang' => Array('type' => 'int','not_null' => '1','default' => '0'),
 										'IconURL' => Array('type' => 'string','default' => ''),
 										'DateFormat' => Array('type' => 'string','not_null' => '1','default' => '','required'=>1),
 										'TimeFormat' => Array('type' => 'string','not_null' => '1','default' => '','required'=>1),
 										'DecimalPoint' => Array('type' => 'string','not_null' => '1','default' => '.'),
 										'ThousandSep' => Array('type' => 'string','not_null' => '1','default' => ','),
 										'Charset' => Array('type' => 'string','not_null' => '1','default' => '','required'=>1),
 										'UnitSystem' => Array('type' => 'int','not_null' => '1','default' => '1','formatter' => 'kOptionsFormatter','options' => Array(1 => 'la_Metric', 2 => 'la_US_UK'),'use_phrases' => 1),
 								),
 
 					'VirtualFields'	=> 	Array(
 												'CopyLabels'		=>	Array('type' => 'int', 'default' => 0),
 												'CopyFromLanguage'	=>	Array('type' => 'int', 'formatter' => 'kOptionsFormatter', 'options_sql' => 'SELECT %s FROM '.TABLE_PREFIX.'Language ORDER BY PackName', 'option_title_field' => 'PackName', 'option_key_field' => 'LanguageId'),
 										),
 											
 					'Grids'	=> Array(
 								'Default'		=>	Array(
 																	'Icons' => Array('default'=>'icon16_custom.gif','0_0'=>'icon16_language_disabled.gif','1_0'=>'icon16_language.gif','0_1'=>'icon16_language_disabled.gif','1_1'=>'icon16_language_primary.gif'),
 																	'Fields' => Array(
 																			'PackName' 	=> Array( 'title'=>'la_col_PackName', 'data_block' => 'grid_checkbox_td'),
 																			'LocalName' => Array( 'title'=>'la_col_LocalName' ),
 																			'Enabled' 	=> Array( 'title'=>'la_col_Status' ),
 																		),
 																	
 																),
 													),
 	);
 
 ?>
\ No newline at end of file

Property changes on: trunk/kernel/units/languages/languages_config.php
___________________________________________________________________
Modified: cvs2svn:cvs-rev
## -1 +1 ##
-1.3
\ No newline at end of property
+1.4
\ No newline at end of property
Index: trunk/kernel/units/languages/languages_tag_processor.php
===================================================================
--- trunk/kernel/units/languages/languages_tag_processor.php	(revision 1765)
+++ trunk/kernel/units/languages/languages_tag_processor.php	(revision 1766)
@@ -1,61 +1,68 @@
 <?php
 
 	class LanguagesTagProcessor extends kDBTagProcessor 
 	{
 	
 		/**
 		 * Guesses what charset should be used:
 		 * 1. use lang.current_Field field="Charset" by default
 		 * 2. if using temp tables then use lang_Field field="Charset"
 		 *
 		 * @param Array $params
 		 * @return string
 		 */
 		function GetCharset($params)
 		{
 			$edit_direct = $this->Application->GetVar('phrases_label');
 			
 			$top_prefix = $this->Application->GetTopmostPrefix($this->Prefix);
 			if( $this->Application->GetVar($top_prefix.'_mode') == 't' && !$edit_direct )
 			{
 				$object =& $this->Application->recallObject($this->getPrefixSpecial(), $this->Prefix, $params);
 				return $object->GetDBField('Charset');	
 			}
 			$lang_current =& $this->Application->recallObject('lang.current');
 			return $lang_current->GetDBField('Charset');
 		}
 		
 		function ListLanguages($params)
 		{
 			$this->Special = 'list';
 			return $this->PrintList2($params);
 		}
 
 		function SelectedLanguage($params)
 		{
 			$object =& $this->Application->recallObject($this->getPrefixSpecial());
 		
 			return $object->GetDBField('LanguageId') == $this->Application->RecallVar('m_lang');
 		}
 		
 		/**
 		 * Returns path where exported languages should be saved
 		 *
 		 * @param unknown_type $params
 		 */
 		function ExportPath($params)
 		{
 			$admin_folder = $this->Application->ConfigValue('AdminDirectory');
 			if(!$admin_folder) $admin_folder = 'admin';
 			$ret = DOC_ROOT.BASE_PATH.'/'.$admin_folder.'/export/';
 			
 			if( getArrayValue($params,'as_url') )
 			{
 				$ret = str_replace( DOC_ROOT.BASE_PATH.'/', $this->Application->BaseURL(), $ret);	
 			}
 			return $ret;
 		}
 		
+/*		function Main_IsMetricUnits($params)
+		{
+			$object =& $this->Application->recallObject($this->Prefix.'.current');
+			$measure_system = $object->GetDBField('UnitSystem');
+			return $measure_system == 1 ? 1 : 0;
+		}*/
+		
 	}
 
 ?>
\ No newline at end of file

Property changes on: trunk/kernel/units/languages/languages_tag_processor.php
___________________________________________________________________
Modified: cvs2svn:cvs-rev
## -1 +1 ##
-1.2
\ No newline at end of property
+1.3
\ No newline at end of property
Index: trunk/kernel/admin_templates/incs/form_blocks.tpl
===================================================================
--- trunk/kernel/admin_templates/incs/form_blocks.tpl	(revision 1765)
+++ trunk/kernel/admin_templates/incs/form_blocks.tpl	(revision 1766)
@@ -1,235 +1,254 @@
 <inp2:m_block name="section_header"/>
 
 		<table cellpadding="0" cellspacing="0" border="0" width="100%">
 			<tr class="section_header_bg">
 				<td valign="top" class="admintitle" align="left" style="padding-top: 2px; padding-bottom: 2px;">
 		    		<img width="46" height="46" src="img/icons/<inp2:m_param name="icon"/>.gif" align="absmiddle" title="<inp2:m_phrase label="$title"/>">&nbsp;<inp2:m_phrase label="$title"/>
 		    		
 		   		</td>
 			</tr>
 		</table>
 <inp2:m_blockend/>
 
 <inp2:m_block name="blue_bar"/>
 	<table border="0" cellpadding="2" cellspacing="0" class="tableborder_full" width="100%" height="30">
 		<tr>
 			<td class="header_left_bg" nowrap width="80%" valign="middle">
 				<span class="tablenav_link" id="blue_bar"><inp2:$prefix_SectionTitle title_preset="$title_preset" title="Invalid OR Missing title preset" cut_first="100"/></span>
 			</td>
 			<td align="right" class="tablenav" width="20%" valign="middle">
 				<script>
 					var $help_url='<inp2:m_t t="help" h_prefix="$prefix" h_icon="$icon" h_module="$module" h_title_preset="$title_preset" pass="all,m,h" escape="escape" front="1" />';
 					set_window_title( document.getElementById('blue_bar').innerHTML );
 				</script>
 				<a href="javascript: OpenHelp($help_url);">
 					<img src="img/blue_bar_help.gif" border="0">
 				</a>
 			</td>
 		</tr>
 	</table>
 <inp2:m_blockend/>
 
 <inp2:m_block name="subsection"/>  
  <tr class="subsectiontitle">
   <td colspan="5"><inp2:m_phrase label="$title"/></td>
  </tr>
 <inp2:m_blockend/>
 
 <inp2:m_block name="inp_edit_field_caption"/>
 	<inp2:m_inc param="tab_index" by="1"/>
 	<td class="text">
 		<label for="<inp2:m_param name="NamePrefix"/><inp2:$prefix_InputName field="$field" subfield="$subfield"/>">
 			<span class="<inp2:m_if prefix="$prefix" function="HasError" field="$field"/>error<inp2:m_endif/>">
 			<inp2:m_phrase label="$title"/></span><inp2:m_if prefix="$prefix" function="IsRequired" field="$field"/><span class="error"> *</span><inp2:m_endif/>:
 		</label>
 	</td>
 <inp2:m_blockend/>
 
 <inp2:m_block name="inp_label"/>
 	<tr class="<inp2:m_odd_even odd="table_color1" even="table_color2"/>">
 		<inp2:m_ParseBlock name="inp_edit_field_caption" prefix="$prefix" field_name="$field_name" title_phrase="$title_phrase" title="$title" is_last="$is_last"/>
 		<td valign="top"><span class="text"><inp2:$prefix_Field field="$field"/></span></td>
     	<td class="error"><inp2:$prefix_Error field="$field"/>&nbsp;</td>
 	</tr>
 <inp2:m_blockend/>
 
 <inp2:m_block name="inp_id_label"/>
 	<inp2:m_if prefix="$prefix" function="FieldEquals" field="$field" value="" inverse="inverse"/>
 		<inp2:m_ParseBlock name="inp_label" pass_params="true"/>
 	<inp2:m_endif/>
 <inp2:m_blockend/>
 
 <inp2:m_block name="inp_edit_box"/>
 	<tr class="<inp2:m_odd_even odd="table_color1" even="table_color2"/>">
 		<inp2:m_ParseBlock name="inp_edit_field_caption" prefix="$prefix" field="$field" subfield="$subfield" title_phrase="$title_phrase" title="$title" is_last="$is_last"/>
 		<td>
 			<input type="text" name="<inp2:$prefix_InputName field="$field" subfield="$subfield"/>" id="<inp2:$prefix_InputName field="$field" subfield="$subfield"/>" value="<inp2:$prefix_Field field="$field" subfield="$subfield"/>" tabindex="<inp2:m_get param="tab_index"/>" size="<inp2:m_param name="size"/>" maxlength="<inp2:m_param name="maxlength"/>" class="<inp2:m_param name="class"/>" onblur="<inp2:m_Param name="onblur"/>">
 		</td>
 		<td class="error"><inp2:$prefix_Error field="$field"/>&nbsp;</td>
 	</tr>
 <inp2:m_blockend/>
 
 <inp2:m_block name="inp_edit_upload"/>
 	<tr class="<inp2:m_odd_even odd="table_color1" even="table_color2"/>">
 		<inp2:m_ParseBlock name="inp_edit_field_caption" prefix="$prefix" field="$field" title_phrase="$title_phrase" title="$title" is_last="$is_last"/>
 		<td>
 			<input type="file" name="<inp2:$prefix_InputName field="$field"/>" id="<inp2:$prefix_InputName field="$field"/>" tabindex="<inp2:m_get param="tab_index"/>" size="<inp2:m_param name="size"/>" class="<inp2:m_param name="class"/>">
 		</td>
 		<td class="error"><inp2:$prefix_Error field="$field"/>&nbsp;</td>
 	</tr>
 <inp2:m_blockend/>
 
 <inp2:m_block name="inp_edit_box_ml"/>
 	<tr class="<inp2:m_odd_even odd="table_color1" even="table_color2"/>">
 		<td class="text" valign="top">
 			<span class="<inp2:m_if prefix="$prefix" function="HasError" field="$field"/>error<inp2:m_endif/>">
 			<inp2:m_phrase label="$title"/><inp2:m_if prefix="$prefix" function="IsRequired" field="$field"/><span class="error"> *</span><inp2:m_endif/>:</span><br>
 			<a href="javascript:PreSaveAndOpenTranslator('<inp2:m_param name="prefix"/>', '<inp2:m_param name="field"/>', 'popups/translator');" title="<inp2:m_Phrase label="la_Translate"/>"><img src="img/icons/icon24_translate.gif" style="cursor:hand" border="0"></a>
 		</td>
 		<td>
 			<input type="text" name="<inp2:$prefix_InputName field="$field"/>" id="<inp2:$prefix_InputName field="$field"/>" value="<inp2:$prefix_Field field="$field" format="no_default"/>" tabindex="<inp2:m_get param="tab_index"/>" size="<inp2:m_param name="size"/>" maxlength="<inp2:m_param name="maxlength"/>" class="<inp2:m_param name="class"/>" onblur="<inp2:m_Param name="onblur"/>">
 		</td>
 		<td class="error"><inp2:$prefix_Error field="$field"/>&nbsp;</td>
 	</tr>
 <inp2:m_blockend/>
 
 <inp2:m_block name="inp_edit_hidden"/>
 	<input type="hidden" name="<inp2:$prefix_InputName field="$field"/>" id="<inp2:$prefix_InputName field="$field"/>" value="<inp2:$prefix_Field field="$field" db="$db"/>">
 <inp2:m_blockend/>
 
 <inp2:m_block name="inp_edit_date"/>
 	<inp2:m_if check="m_GetEquals" name="calendar_included" value="1" inverse="inverse">
 		<script type="text/javascript" src="incs/calendar.js"></script>
 		<inp2:m_set calendar_included="1"/>
 	</inp2:m_if>
 	<tr class="<inp2:m_odd_even odd="table_color1" even="table_color2"/>">
 		<inp2:m_ParseBlock name="inp_edit_field_caption" prefix="$prefix" field="$field" title_phrase="$title_phrase" title="$title" is_last="$is_last"/>
 		<td>
 			<input type="text" name="<inp2:$prefix_InputName field="{$field}_date"/>" id="<inp2:$prefix_InputName field="{$field}_date"/>" value="<inp2:$prefix_Field field="{$field}_date"/>" tabindex="<inp2:m_get param="tab_index"/>" size="<inp2:$prefix_Format field="{$field}_date" edit_size="edit_size"/>" class="<inp2:m_param name="class"/>" datepickerIcon="<inp2:m_ProjectBase/>admin/images/ddarrow.gif">&nbsp;<span class="small">(<inp2:$prefix_Format field="{$field}_date" human="true"/>)</span>
 			<script type="text/javascript">
 				initCalendar("<inp2:$prefix_InputName field="{$field}_date"/>", "<inp2:$prefix_Format field="{$field}_date"/>");
 			</script>
 			<input type="hidden" name="<inp2:$prefix_InputName field="{$field}_time"/>" id="<inp2:$prefix_InputName field="{$field}_time"/>" value="">
 		</td>
 		<td class="error"><inp2:$prefix_Error field="{$field}_date"/>&nbsp;</td>
 	</tr>
 <inp2:m_blockend/>
 
 
 <inp2:m_block name="inp_edit_date_time"/>
 	<inp2:m_if check="m_GetEquals" name="calendar_included" value="1" inverse="inverse">
 		<script type="text/javascript" src="incs/calendar.js"></script>
 		<inp2:m_set calendar_included="1"/>
 	</inp2:m_if>
 	<tr class="<inp2:m_odd_even odd="table_color1" even="table_color2"/>">
 		<inp2:m_ParseBlock name="inp_edit_field_caption" prefix="$prefix" field="$field" title_phrase="$title_phrase" title="$title" is_last="$is_last"/>
 		<td>
 			<!--<input type="hidden" id="<inp2:$prefix_InputName field="$field"/>" name="<inp2:$prefix_InputName field="$field"/>" value="<inp2:$prefix_Field field="$field" db="db"/>">		-->
 			<input type="text" name="<inp2:$prefix_InputName field="{$field}_date"/>" id="<inp2:$prefix_InputName field="{$field}_date"/>" value="<inp2:$prefix_Field field="{$field}_date"/>" tabindex="<inp2:m_get param="tab_index"/>" size="<inp2:$prefix_Format field="{$field}_date" edit_size="edit_size"/>" class="<inp2:m_param name="class"/>" datepickerIcon="<inp2:m_ProjectBase/>admin/images/ddarrow.gif">
 				<span class="small">(<inp2:$prefix_Format field="{$field}_date" human="true"/>)</span>
 			<script type="text/javascript">
 				initCalendar("<inp2:$prefix_InputName field="{$field}_date"/>", "<inp2:$prefix_Format field="{$field}_date"/>");
 			</script>
 			&nbsp;<input type="text" name="<inp2:$prefix_InputName field="{$field}_time"/>" id="<inp2:$prefix_InputName field="{$field}_time"/>" value="<inp2:$prefix_Field field="{$field}_time"/>" tabindex="<inp2:m_get param="tab_index"/>" size="<inp2:$prefix_Format field="{$field}_time" edit_size="edit_size"/>" class="<inp2:m_param name="class"/>"><span class="small"> (<inp2:$prefix_Format field="{$field}_time" human="true"/>)</span>
 		</td>
 		<td class="error"><inp2:$prefix_Error field="$field"/>&nbsp;</td>
 	</tr>
 <inp2:m_blockend/>
 
 <inp2:m_block name="inp_edit_textarea"/>
 	<tr class="<inp2:m_odd_even odd="table_color1" even="table_color2"/>">
 		<td class="text" valign="top">
 			<span class="<inp2:m_if prefix="$prefix" function="HasError" field="$field"/>error<inp2:m_endif/>">
 			<inp2:m_phrase label="$title"/><inp2:m_if prefix="$prefix" function="IsRequired" field="$field"/><span class="error"> *</span><inp2:m_endif/>:</span><br>
 			<a href="javascript:OpenEditor('&section=in-link:editlink_general','kernel_form','<inp2:$prefix_InputName field="$field"/>');"><img src="img/icons/icon24_link_editor.gif" style="cursor:hand" border="0"></a>
 		</td>
 		<td>
 			<textarea tabindex="<inp2:m_get param="tab_index"/>" id="<inp2:$prefix_InputName field="$field"/>" name="<inp2:$prefix_InputName field="$field"/>" cols="<inp2:m_param name="cols"/>" rows="<inp2:m_param name="rows"/>" class="<inp2:m_param name="class"/>"><inp2:$prefix_Field field="$field"/></textarea>
 		</td>
 		<td class="error"><inp2:$prefix_Error field="$field"/>&nbsp;</td>
 	</tr>
 <inp2:m_blockend/>
 
 
 <inp2:m_block name="inp_edit_user"/>
 	<tr class="<inp2:m_odd_even odd="table_color1" even="table_color2"/>">
 		<inp2:m_ParseBlock name="inp_edit_field_caption" prefix="$prefix" field="$field" title_phrase="$title_phrase" title="$title" is_last="$is_last"/>
 		<td>
 			<input type="text" name="<inp2:$prefix_InputName field="$field"/>" id="<inp2:$prefix_InputName field="$field"/>" value="<inp2:$prefix_Field field="$field"/>" tabindex="<inp2:m_get param="tab_index"/>" size="<inp2:m_param name="size"/>" class="<inp2:m_param name="class"/>">
 			<a href="#" onclick="return OpenUserSelector('','kernel_form','<inp2:$prefix_InputName field="$field"/>');">
           		 <img src="img/icons/icon24_link_user.gif" style="cursor:hand;" border="0">
          	</a>  
 		</td>
 		<td class="error"><inp2:$prefix_Error field="$field"/>&nbsp;</td>
 	</tr>
 <inp2:m_blockend/>
 
 
 <inp2:m_block name="inp_option_item"/>
 	<option value="<inp2:m_param name="key"/>"<inp2:m_param name="selected"/>><inp2:m_param name="option"/></option>	
 <inp2:m_blockend/>
 
 <inp2:m_block name="inp_option_phrase"/>
 	<option value="<inp2:m_param name="key"/>"<inp2:m_param name="selected"/>><inp2:m_phrase label="$option"/></option>	
 <inp2:m_blockend/>
 
 <inp2:m_block name="inp_edit_options"/>
 	<tr class="<inp2:m_odd_even odd="table_color1" even="table_color2"/>">
 		<inp2:m_ParseBlock name="inp_edit_field_caption" prefix="$prefix" field="$field" title_phrase="$title_phrase" title="$title" is_last="$is_last"/>
 		<td>
 			<select tabindex="<inp2:m_get param="tab_index"/>" name="<inp2:$prefix_InputName field="$field"/>" id="<inp2:$prefix_InputName field="$field"/>" onchange="<inp2:m_Param name="onchange"/>">
 				<inp2:m_if prefix="m" function="ParamEquals" name="use_phrases" value="1"/>
 					<inp2:$prefix_PredefinedOptions field="$field" block="inp_option_phrase" selected="selected"/>
 				<inp2:m_else/>
 					<inp2:$prefix_PredefinedOptions field="$field" block="inp_option_item" selected="selected"/>
 				<inp2:m_endif/>
 			</select>
 		</td>
 		<td class="error"><inp2:$prefix_Error field="$field"/>&nbsp;</td>
 	</tr>
 <inp2:m_blockend/>
 
 <inp2:m_block name="inp_radio_item"/>
 	<input type="radio" <inp2:m_param name="checked"/> name="<inp2:$prefix_InputName field="$field"/>" id="<inp2:$prefix_InputName field="$field"/>_<inp2:m_param name="key"/>" value="<inp2:m_param name="key"/>"><label for="<inp2:$prefix_InputName field="$field"/>_<inp2:m_param name="key"/>"><inp2:m_phrase label="$option"/></label>&nbsp;	
 <inp2:m_blockend/>
 
 <inp2:m_block name="inp_checkbox_item"/>
 	<input type="checkbox" <inp2:m_param name="checked"/> name="<inp2:$prefix_InputName field="$field"/>[]" id="<inp2:$prefix_InputName field="$field"/>_<inp2:m_param name="key"/>" value="<inp2:m_param name="key"/>"><label for="<inp2:$prefix_InputName field="$field"/>_<inp2:m_param name="key"/>"><inp2:m_phrase label="$option"/></label>&nbsp;	
 	<inp2:m_if check="$prefix_HasParam" name="hint_label"><inp2:m_phrase label="$hint_label"/></inp2:m_if>
 <inp2:m_blockend/>
 
 <inp2:m_block name="inp_edit_radio"/>
 	<tr class="<inp2:m_odd_even odd="table_color1" even="table_color2"/>">
 		<inp2:m_ParseBlock name="inp_edit_field_caption" prefix="$prefix" field="$field" title_phrase="$title_phrase" title="$title" is_last="$is_last"/>
 		<td>
 			<inp2:$prefix_PredefinedOptions field="$field" tabindex="$pass_tabindex" block="inp_radio_item" selected="checked"/>
 		</td>
 		<td class="error"><inp2:$prefix_Error field="$field"/>&nbsp;</td>
 	</tr>
 <inp2:m_blockend/>
 
 <inp2:m_block name="inp_edit_checkbox"/>
 	<tr class="<inp2:m_odd_even odd="table_color1" even="table_color2"/>">
 		<inp2:m_ParseBlock name="inp_edit_field_caption" prefix="$prefix" field="$field" title_phrase="$title_phrase" title="$title" is_last="$is_last" NamePrefix="_cb_"/>
 		<td>
 			<input type="hidden" id="<inp2:$prefix_InputName field="$field"/>" name="<inp2:$prefix_InputName field="$field"/>" value="<inp2:$prefix_Field field="$field" db="db"/>">
 			<input tabindex="<inp2:m_get param="tab_index"/>" type="checkbox" id="_cb_<inp2:$prefix_InputName field="$field"/>" name="_cb_<inp2:$prefix_InputName field="$field"/>" <inp2:$prefix_Field field="$field" checked="checked" db="db"/> class="<inp2:m_param name="field_class"/>" onclick="update_checkbox(this, document.getElementById('<inp2:$prefix_InputName field="$field"/>'))" onchange="<inp2:m_param name="onchange" />">
 			<inp2:m_if check="$prefix_HasParam" name="hint_label"><inp2:m_phrase label="$hint_label"/></inp2:m_if>
 		</td>
 		<td class="error"><inp2:$prefix_Error field="$field"/>&nbsp;</td>
 	</tr>
 <inp2:m_blockend/>
 
 <inp2:m_block name="inp_edit_checkboxes"/>
 	<tr class="<inp2:m_odd_even odd="table_color1" even="table_color2"/>">
 		<inp2:m_ParseBlock name="inp_edit_field_caption" prefix="$prefix" field="$field" title_phrase="$title_phrase" title="$title" is_last="$is_last"/>
 		<td>
 			<inp2:m_if check="m_ParamEquals" name="use_phrases" value="1">
 				<inp2:$prefix_PredefinedOptions field="$field" no_empty="$no_empty" tabindex="$pass_tabindex" hint_label="$hint_label" block="inp_checkbox_phrase" selected="checked"/>	
 			<inp2:m_else/>
 				<inp2:$prefix_PredefinedOptions field="$field" no_empty="$no_empty" tabindex="$pass_tabindex" hint_label="$hint_label" block="inp_checkbox_item" selected="checked"/>
 			</inp2:m_if>
 		</td>
 		<td class="error"><inp2:$prefix_Error field="$field"/>&nbsp;</td>
 	</tr>
-<inp2:m_blockend/>
\ No newline at end of file
+<inp2:m_blockend/>
+
+<inp2:m_block name="inp_edit_weight" />
+	<tr class="<inp2:m_odd_even odd="table_color1" even="table_color2"/>">
+		<inp2:m_ParseBlock name="inp_edit_field_caption" prefix="$prefix" field="$field" subfield="$subfield" title_phrase="$title_phrase" title="$title" is_last="$is_last"/>
+		<td>
+			<inp2:m_if check="lang.current_FieldEquals" field="UnitSystem" value="1">
+				<input type="text" name="<inp2:$prefix_InputName field="$field" subfield="$subfield"/>" id="<inp2:$prefix_InputName field="$field" subfield="$subfield"/>" value="<inp2:$prefix_Field field="$field" subfield="$subfield"/>" tabindex="<inp2:m_get param="tab_index"/>" size="<inp2:m_param name="size"/>" maxlength="<inp2:m_param name="maxlength"/>" class="<inp2:m_param name="class"/>" onblur="<inp2:m_Param name="onblur"/>">
+				<inp2:m_phrase label="la_kg" />
+			</inp2:m_if>
+			<inp2:m_if check="lang.current_FieldEquals" field="UnitSystem" value="2">
+				<input type="text" name="<inp2:$prefix_InputName field="{$field}_a" subfield="$subfield"/>" id="<inp2:$prefix_InputName field="{$field}_a" subfield="$subfield"/>" value="<inp2:$prefix_Field field="{$field}_a" subfield="$subfield"/>" tabindex="<inp2:m_get param="tab_index"/>" size="<inp2:m_param name="size"/>" maxlength="<inp2:m_param name="maxlength"/>" class="<inp2:m_param name="class"/>" onblur="<inp2:m_Param name="onblur"/>">
+				<inp2:m_phrase label="la_lbs" />
+				<input type="text" name="<inp2:$prefix_InputName field="{$field}_b" subfield="$subfield"/>" id="<inp2:$prefix_InputName field="{$field}_b" subfield="$subfield"/>" value="<inp2:$prefix_Field field="{$field}_b" subfield="$subfield"/>" tabindex="<inp2:m_get param="tab_index"/>" size="<inp2:m_param name="size"/>" maxlength="<inp2:m_param name="maxlength"/>" class="<inp2:m_param name="class"/>" onblur="<inp2:m_Param name="onblur"/>">
+				<inp2:m_phrase label="la_oz" />
+			</inp2:m_if>			
+		</td>
+		<td class="error"><inp2:$prefix_Error field="$field"/>&nbsp;</td>
+	</tr>
+<inp2:m_blockend />
\ No newline at end of file

Property changes on: trunk/kernel/admin_templates/incs/form_blocks.tpl
___________________________________________________________________
Modified: cvs2svn:cvs-rev
## -1 +1 ##
-1.6
\ No newline at end of property
+1.7
\ No newline at end of property
Index: trunk/core/kernel/utility/formatters.php
===================================================================
--- trunk/core/kernel/utility/formatters.php	(revision 1765)
+++ trunk/core/kernel/utility/formatters.php	(revision 1766)
@@ -1,1000 +1,1005 @@
 <?php
 
 class kFormatter extends kBase {
 	
 	
 	/**
 	 * Convert's value to match type from config
 	 *
 	 * @param mixed $value
 	 * @param Array $options
 	 * @return mixed
 	 * @access protected
 	 */
 	function TypeCast($value, $options)
 	{
 		$ret = true;
 		if( isset($options['type']) )
 		{
 			$field_type = $options['type'];
 			$type_ok = preg_match('#int|integer|double|float|real|numeric|string#', $field_type);
 			if($field_type == 'string') return $value;
 			
 			if ($value != '' && $type_ok)
 			{
 				$ret = is_numeric($value);
 				if($ret)
 				{
 					$f = 'is_'.$field_type;
 					settype($value, $field_type);
 					$ret = $f($value);
 				}
 			}
 		}
 		
 		return $ret ? $value : false;
 	}	
 
 //function Format($value, $options, &$errors)
 	function Format($value, $field_name, &$object, $format=null)
 	{
 		if ( is_null($value) ) return '';
 
 		$options = $object->GetFieldOptions($field_name);
 		if ( isset($format) ) $options['format'] = $format;
 		$tc_value = $this->TypeCast($value,$options);
 		if( ($tc_value === false) || ($tc_value != $value) ) return $value; // for leaving badly formatted date on the form
 
 		if (isset($options['format'])) return sprintf($options['format'], $tc_value);
 		
 		return $tc_value;
 	}
 	
 //function Parse($value, $options, &$errors)
 	function Parse($value, $field_name, &$object)
 	{
 		if ($value == '') return NULL;
 		
 		$options = $object->GetFieldOptions($field_name);
 		$tc_value = $this->TypeCast($value,$options);
 		if($tc_value === false) return $value; // for leaving badly formatted date on the form
 		
 		if( isset($options['type']) )
 		{
 			if( preg_match('#double|float|real|numeric#', $options['type']) ) $tc_value = str_replace(',', '.', $tc_value);
 		}
 		
 		if( isset($options['regexp']) )
 		{
 			if( !preg_match($options['regexp'], $value) )
 			{
 				$object->FieldErrors[$field_name]['pseudo'] = 'invalid_format';	
 			}
 		}
 		
 		return $tc_value;
 	}
 	
 	function HumanFormat($format)
 	{
 		return $format;
 	}
 	
 	
 	/**
 	 * The method is supposed to alter config options or cofigure object in some way based on its usage of formatters
 	 * The methods is called for every field with formatter defined when configuring item.
 	 * Could be used for adding additional VirtualFields to an object required by some special Formatter
 	 *
 	 * @param string $field_name
 	 * @param array $field_options
 	 * @param kDBBase $object
 	 */
 	function PrepareOptions($field_name, &$field_options, &$object)
 	{
 		
 	}
 	
 	/**
 	 * Used for split fields like timestamp -> date, time 
 	 * Called from DBItem to update sub fields values after loading item
 	 *
 	 * @param unknown_type $field
 	 * @param unknown_type $value
 	 * @param unknown_type $options
 	 * @param unknown_type $object
 	 */
 	function UpdateSubFields($field, $value, &$options, &$object)
 	{
 		
 	}
 	
 	/**
 	 * Used for split fields like timestamp -> date, time
 	 * Called from DBItem Validate (before validation) to get back master field value from its sub_fields
 	 *
 	 * @param unknown_type $field
 	 * @param unknown_type $value
 	 * @param unknown_type $options
 	 * @param unknown_type $object
 	 */
 	function UpdateMasterFields($field, $value, &$options, &$object)
 	{
 		
 	}
 	
 /*	function GetErrorMsg($pseudo_error, $options)
 	{
 		if ( isset($options['error_msgs'][$pseudo_error]) ) {
 			return $options['error_msgs'][$pseudo_error];
 		}
 		else {
 			return $this->ErrorMsgs[$pseudo_error];
 		}
 	}*/
 
 	function GetSample($field, &$options, &$object)
 	{
 		
 	}
 	
 }
 
 class kOptionsFormatter extends kFormatter {
 
 //function Format($value, $options, &$errors)
 	function Format($value, $field_name, &$object, $format=null)
 	{
 		if ( is_null($value) ) return '';
 		
 		$options = $object->GetFieldOptions($field_name);
 		if ( isset($format) ) $options['format'] = $format;
 		
 		$label = getArrayValue($options['options'], $value);
 		if( getArrayValue($options,'use_phrases') )
 		{
 			return $this->Application->Phrase($label);
 		}
 		else
 		{
 			return $label;
 		}
 	}
 }
 
 /**
  * Replacement for kOptionsFormatter in case if options
  * should be selected from database. Use this formatter
  * only in case if formatter attached field is in edit form.
  *
  * For usage in grid just use LEFT JOIN clause to table
  * where requested options are located.
  */
 class kLEFTFormatter extends kFormatter {
 	
 //function Format($value, $options, &$errors)
 	function Format($value, $field_name, &$object, $format=null)
 	{
 		if ( is_null($value) ) return '';
 		
 		$options = $object->GetFieldOptions($field_name);
 		if ( isset($format) ) $options['format'] = $format;
 		
 		if( !isset($options['options'][$value]) ) 
 		{
 			// required option is not defined in config => query for it			
 			$db =& $this->Application->GetADODBConnection();
 			$sql = sprintf($options['left_sql'],$options['left_title_field'],$options['left_key_field'],$value);
 			$options['options'][$value] = $db->GetOne($sql);
 		}
 		return $options['options'][$value];
 	}
 	
 //function Parse($value, $options, &$errors)
 	function Parse($value, $field_name, &$object)
 	{
 		if ($value == '') return NULL;
 		
 		$options = $object->GetFieldOptions($field_name);
 		if( !array_search($value,$options['options']) ) 
 		{
 			// required option is not defined in config => query for it			
 			$db =& $this->Application->GetADODBConnection();
 			$sql = sprintf($options['left_sql'],$options['left_key_field'],$options['left_title_field'],$value);
 			$found = $db->GetOne($sql);
 			if($found !== false) $options['options'][$found] = $value;
 		}
 		else
 		{
 			$found = array_search($value,$options['options']);	
 		}
 		if($found === false) $found = $options['default'];
 		return $found;
 	}
 }
 
 
 class kDateFormatter extends kFormatter {
 	
 /*	function kDateFormatter()
 	{
 		parent::kFormatter();
 		$this->ErrorMsgs['bad_dformat'] = 'Please use correct date format (%s) ex. (%s)';
 	}
 	*/
 
 	function PrepareOptions($field_name, &$field_options, &$object)
 	{
 		$date_format = getArrayValue($field_options, 'date_format');
 		$time_format = getArrayValue($field_options, 'time_format');
 		
 		$language =& $this->Application->recallObject('lang.current');
 		
 		if ($date_format === false) $date_format = $language->GetDBField('DateFormat');
 		if ($time_format === false) $time_format = $language->GetDBField('TimeFormat');
 		
 		if (!isset($field_options['date_time_separator'])) $field_options['date_time_separator'] = ' ';
 		$field_options['format'] = $date_format.$field_options['date_time_separator'].$time_format;
 		$field_options['sub_fields'] = Array('date' => $field_name.'_date', 'time' => $field_name.'_time');
 		
 		$add_fields = Array();
 		
 		$opts = Array('master_field' => $field_name, 'formatter'=>'kDateFormatter', 'format'=>$date_format);
 		if ( isset($field_options['default']) ) $opts['default'] = $field_options['default'];
 		if ( isset($field_options['required']) ) $opts['required'] = $field_options['required'];
 		
 		$add_fields[$field_name.'_date'] = $opts;
 		$opts['format'] = $time_format;
 		$add_fields[$field_name.'_time'] = $opts;
 		
 		if ( !isset($object->VirtualFields[$field_name]) ) {
 			// adding caluclated field to format date directly in the query
 			if ( !isset($object->CalculatedFields)  || !is_array($object->CalculatedFields) ) {
 				$object->CalculatedFields = Array();
 			}
 			$object->CalculatedFields[$field_name.'_formatted'] = 'FROM_UNIXTIME('.'`%1$s`.'.$field_name.', \''.$this->SQLFormat($field_options['format']).'\')';
 			$opts['format'] = $field_options['format'];
 			$opts['required'] = 0;
 			unset($opts['master_field']);
 			$add_fields[$field_name.'_formatted'] = $opts;
 		}
 		
 		$add_fields = array_merge_recursive2($add_fields, $object->VirtualFields);
 		$object->setVirtualFields($add_fields);
 	}
 	
 	function UpdateSubFields($field, $value, &$options, &$object)
 	{
 		if ( $sub_fields = getArrayValue($options, 'sub_fields') ) {
 			if( isset($value) && $value )
 			{
 				$object->SetDBField( $sub_fields['date'], $value );
 				$object->SetDBField( $sub_fields['time'], $value );
 			}
 		}
 	}
 	
 	function UpdateMasterFields($field, $value, &$options, &$object)
 	{
 		// when in master field - set own value from sub_fields
 		if ( $sub_fields = getArrayValue($options, 'sub_fields') ) {
 			// if date is not empty, but time is empty - set time to 0, otherwise master field fomratter will complain
 			// when we have only date field on form, we need time hidden field always empty, don't ask me why!
 			if ( $object->GetDBField($sub_fields['date']) != '' && $object->GetDBField($sub_fields['time']) == '' ) {
 				$empty_time = getArrayValue($options,'empty_time');
 				if($empty_time === false) $empty_time = mktime(0,0,0);
 				$object->SetDBField($sub_fields['time'], $empty_time);
 			}
 			$object->SetField($field, $object->GetField($sub_fields['date']).$options['date_time_separator'].$object->GetField($sub_fields['time']));
 		}
 		// when in one of sub_fields - call update for master_field to update its value from sub_fields [are you following ? :) ]
 		elseif ($master_field = getArrayValue($options, 'master_field') ) {
 			$this->UpdateMasterFields($master_field, null, $object->GetFieldOptions($master_field), $object);			
 		}
 	}
 	
 //function Format($value, $options, &$errors)
 	function Format($value, $field_name, &$object, $format=null)
 	{
 		if ( is_null($value) ) return '';
 		if ( !is_numeric($value) ) return $value; // for leaving badly formatted date on the form
 		settype($value, 'int');
 		if ( !is_int($value) ) return $value;
 		
 		$options = $object->GetFieldOptions($field_name);
 		if ( isset($format) ) $options['format'] = $format;
 		
 		return date($options['format'], $value);
 	}
 	
 	function HumanFormat($format)
 	{
 		$patterns = Array('/m/',
 											'/n/',
 											'/d/',
 											'/j/',
 											'/y/',
 											'/Y/',
 											'/h|H/',
 											'/g|G/',
 											'/i/',
 											'/s/',
 											'/a|A/');
 		$replace = Array(	'mm',
 											'm',
 											'dd',
 											'd',
 											'yy',
 											'yyyy',
 											'hh',
 											'h',
 											'mm',
 											'ss',
 											'AM');
 		$res = preg_replace($patterns, $replace, $format);
 		return $res;
 	}
 	
 	function SQLFormat($format)
 	{
 		$mapping = Array(
 			'/%/' => '%%',
 			'/(?<!%)a/' => '%p', // Lowercase Ante meridiem and Post meridiem => MySQL provides only uppercase
 			'/(?<!%)A/' => '%p', // Uppercase Ante meridiem and Post meridiem 
 			'/(?<!%)d/' => '%d', // Day of the month, 2 digits with leading zeros
 			'/(?<!%)D/' => '%a', // A textual representation of a day, three letters
 			'/(?<!%)F/' => '%M', // A full textual representation of a month, such as January or March
 			'/(?<!%)g/' => '%l', // 12-hour format of an hour without leading zeros
 			'/(?<!%)G/' => '%k', // 24-hour format of an hour without leading zeros
 			'/(?<!%)h/' => '%h', // 12-hour format of an hour with leading zeros
 			'/(?<!%)H/' => '%H', // 24-hour format of an hour with leading zeros
 			'/(?<!%)i/' => '%i', // Minutes with leading zeros
 				'/(?<!%)I/' => 'N/A', // Whether or not the date is in daylights savings time
 				
 				'/(?<!%)S/' => 'N/A', // English ordinal suffix for the day of the month, 2 characters, see below
 				'/jS/' => '%D', //  MySQL can't return separate suffix, but could return date with suffix
 			'/(?<!%)j/' => '%e', // Day of the month without leading zeros
 			'/(?<!%)l/' => '%W', // A full textual representation of the day of the week
 				'/(?<!%)L/' => 'N/A', // Whether it's a leap year
 			'/(?<!%)m/' => '%m', // Numeric representation of a month, with leading zeros
 			'/(?<!%)M/' => '%b', // A short textual representation of a month, three letters
 			'/(?<!%)n/' => '%c', // Numeric representation of a month, without leading zeros
 				'/(?<!%)O/' => 'N/A', // Difference to Greenwich time (GMT) in hours
 				'/(?<!%)r/' => 'N/A', // RFC 2822 formatted date
 			'/(?<!%)s/' => '%s', // Seconds, with leading zeros
 				// S and jS moved before j - see above
 				'/(?<!%)t/' => 'N/A', // Number of days in the given month
 				'/(?<!%)T/' => 'N/A', // Timezone setting of this machine
 				'/(?<!%)U/' => 'N/A', // Seconds since the Unix Epoch (January 1 1970 00:00:00 GMT)
 			'/(?<!%)w/' => '%w', // Numeric representation of the day of the week
 			'/(?<!%)W/' => '%v', // ISO-8601 week number of year, weeks starting on Monday (added in PHP 4.1.0)
 			'/(?<!%)Y/' => '%Y', // A full numeric representation of a year, 4 digits 
 			'/(?<!%)y/' => '%y', // A two digit representation of a year 
 				'/(?<!%)z/' => 'N/A', // The day of the year (starting from 0) => MySQL starts from 1
 				'/(?<!%)Z/' => 'N/A', // Timezone offset in seconds. The offset for timezones west of UTC is always negative, and for those east of UTC is always positive.
 		);
 		
 		$patterns = array_keys($mapping);
 		$replacements = array_values($mapping);
 		
 		$res = preg_replace($patterns, $replacements, $format);
 		return $res;
 	}
 	
 //function Parse($value, $options, &$errors)
 	function Parse($value, $field_name, &$object)
 	{
 		$options = $object->GetFieldOptions($field_name);
 		
 		$dt_separator = getArrayValue($options,'date_time_separator');
 		if($dt_separator) $value = trim($value, $dt_separator);
 		if($value == '') return NULL;
 		//return strtotime($value);
 				
 		$format = $options['format'];
 		if($dt_separator) $format = trim($format, $dt_separator);
 		
 		$object->FieldErrors[$field_name]['params'] = Array( $this->HumanFormat($format), date($format) );
 		$object->FieldErrors[$field_name]['value'] = $value;
 		
 		$hour = 0;
 		$minute = 0;
 		$second = 0;
 		$month = 1;
 		$day = 1;
 		$year = 1970;
 
 		$patterns['n'] = '([0-9]{1,2})';		
 		$patterns['m'] = '([0-9]{1,2})';
 		$patterns['d'] = '([0-9]{1,2})';
 		$patterns['j'] = '([0-9]{1,2})';
 		$patterns['Y'] = '([0-9]{4})';
 		$patterns['y'] = '([0-9]{2})';
 		$patterns['G'] = '([0-9]{1,2})';
 		$patterns['g'] = '([0-9]{1,2})';
 		$patterns['H'] = '([0-9]{2})';
 		$patterns['h'] = '([0-9]{2})';
 		$patterns['i'] = '([0-9]{2})';
 		$patterns['s'] = '([0-9]{2})';
 		$patterns['a'] = '(am|pm)';
 		$patterns['A'] = '(AM|PM)';
 		
 		$holders_mask = eregi_replace('[a-zA-Z]{1}', '([a-zA-Z]{1})', $format);
 		if (!ereg($holders_mask, $format, $holders)) {
 			$object->FieldErrors[$field_name]['pseudo'] = 'bad_date_format';
 			return $value;
 		}
 		
 		$values_mask = '/^'.str_replace('/','\/',$format).'$/';
 		foreach ($patterns as $key => $val) {
 			$values_mask = ereg_replace($key, $val, $values_mask);
 		}
 		// echo " values_mask : $values_mask <br>";		
 		
 		if (!preg_match($values_mask, $value, $values)) {
 			$object->FieldErrors[$field_name]['pseudo'] = 'bad_date_format';
 			return $value;
 		}
 		
 		for ($i = 1; $i < count($holders); $i++) {
 			switch ($holders[$i]) {
 				case 'n':
 				case 'm':
 					$month = $values[$i];
 					$month = ereg_replace("^0{1}", '', $month);
 					break;
 				case 'd':
 					$day = $values[$i];
 					$day = ereg_replace("^0{1}", '', $day);
 					break;
 				case 'Y':
 					$year = $values[$i];
 					break;
 				case 'y':
 					$year = $values[$i] >= 70 ? 1900 + $values[$i] : 2000 + $values[$i];
 					break;
 				case 'H':
 				case 'h':
 				case 'G':
 				case 'g':
 					$hour = $values[$i];
 					$hour = ereg_replace("^0{1}", '', $hour);
 					break;
 				case 'i':
 					$minute = $values[$i];
 					$minute = ereg_replace("^0{1}", '', $minute);
 					break;
 				case 's':
 					$second = $values[$i];
 					$second = ereg_replace("^0{1}", '', $second);
 					break;
 				case 'a':
 				case 'A':
 					if ($hour <= 12) { // if AM/PM used with 24-hour - could happen :)
 						if ($values[$i] == 'pm' || $values[$i] == 'PM') {
 							$hour += 12;
 							if ($hour == 24) $hour = 12;
 						}
 						elseif ($values[$i] == 'am' || $values[$i] == 'AM') {
 							if ($hour == 12) $hour = 0;
 						}
 					}
 					break;
 			}
 		}
 		
 		//echo "day: $day, month: $month, year: $year, hour: $hour, minute: $minute<br>";
 		
 		/*if (!($year >= 1970 && $year <= 2037)) {
 			$object->FieldErrors[$field_name]['pseudo'] = 'bad_date_format';
 			return $value;
 		}*/
 				
 		if (!($month >= 1 && $month <= 12)) {
 			$object->FieldErrors[$field_name]['pseudo'] = 'bad_date_format';
 			return $value;
 		}
 		
 		$months_days = Array ( 1 => 31,2 => 28, 3 => 31, 4 => 30,5 => 31,6 => 30, 7 => 31, 8 => 31,9 => 30,10 => 31,11 => 30,12 => 31);
 		if ($year % 4 == 0) $months_days[2] = 29;
 		
 		if (!($day >=1 && $day <= $months_days[$month])) {
 			$object->FieldErrors[$field_name]['pseudo'] = 'bad_date_format';
 			return $value;
 		}
 		
 		if (!($hour >=0 && $hour <= 23)) {
 			$object->FieldErrors[$field_name]['pseudo'] = 'bad_date_format';
 			return $value;
 		}
 		
 		if (!($minute >=0 && $minute <= 59)) {
 			$object->FieldErrors[$field_name]['pseudo'] = 'bad_date_format';
 			return $value;
 		}
 		
 		if (!($second >=0 && $second <= 59)) {
 			$object->FieldErrors[$field_name]['pseudo'] = 'bad_date_format';
 			return $value;
 		}
 		// echo "day: $day, month: $month, year: $year, hour: $hour, minute: $minute<br>";
 		return (mktime($hour, $minute, $second, $month, $day, $year));
 	}
 	
 	function GetSample($field, &$options, &$object)
 	{
 		return $this->Format( time(), $field, $object);	
 	}
 }
 
 class kUploadFormatter extends kFormatter
 {
 	var $DestinationPath;
 	var $FullPath;
 	
 	function kUploadFormatter()
 	{
 		if ($this->DestinationPath)
 		{
 			$this->FullPath = DOC_ROOT.BASE_PATH.$this->DestinationPath;
 		}
 		parent::kBase();
 	}
 	
 	
 //function Parse($value, $options, &$errors)
 	function Parse($value, $field_name, &$object)
 	{
 		$ret = '';
 		$options = $object->GetFieldOptions($field_name);
 		
 		if (getArrayValue($value, 'upload') && getArrayValue($value, 'error') == UPLOAD_ERR_NO_FILE)
 		{
 			return getArrayValue($value, 'upload');
 		}
 		
 		if ( is_array($value) && $value['size'] )
 		{
 			if ( is_array($value) && $value['error'] === UPLOAD_ERR_OK ) 
 			{		 		
 				if ( !in_array($value['type'], $options['allowed_types']) ) 
 				{
 					$object->FieldErrors[$field_name]['pseudo'] = 'bad_file_format';
 				}
 				elseif ( $value['size'] > ($options['max_size'] ? $options['max_size'] : MAX_UPLOAD_SIZE) ) 
 				{
 					$object->FieldErrors[$field_name]['pseudo'] = 'bad_file_size';
 				}
 				elseif ( !is_writable($this->FullPath) )
 				{
 					$object->FieldErrors[$field_name]['pseudo'] = 'cant_save_file';
 				}
 				else 
 				{
 					$real_name = $this->ValidateFileName($this->FullPath, $value['name']);
 					$file_name = $this->FullPath.$real_name;
 					if ( !move_uploaded_file($value['tmp_name'], $file_name) )
 					{
 						$object->FieldErrors[$field_name]['pseudo'] = 'cant_save_file';
 					}
 					else
 					{
 						$ret = $this->DestinationPath.$real_name;
 					}					
 				}
 			}
 			else
 			{
 				$object->FieldErrors[$field_name]['pseudo'] = 'cant_save_file';
 			}		
 		}
 		
 		if ($value['error'] && !( $value['error'] == UPLOAD_ERR_NO_FILE ) && !$object->FieldErrors[$field_name]['pseudo'])
 		{
 			$object->FieldErrors[$field_name]['pseudo'] = 'cant_save_file';
 		}
 		
 		return $ret;
 	}
 	
 	function ValidateFileName($path, $name)
 	{
 		$parts = pathinfo($name);
 	  $ext = '.'.$parts['extension'];
 	  $filename = substr($parts['basename'], 0, -strlen($ext));
 		$new_name = $filename.$ext;
 		while ( file_exists($path.'/'.$new_name) ) 
 		{
 	   		if ( preg_match("/({$filename}_)([0-9]*)($ext)/", $new_name, $regs) ) {
 					$new_name = $regs[1].($regs[2]+1).$regs[3];
 				}
 				else {
 					$new_name = $filename.'_1'.$ext;
 				}
 		}		 
 		return $new_name;		
 	}
 	
 }
 
 class kPictureFormatter extends kUploadFormatter
 {
 
 	function kPictureFormatter()
 	{
 		$this->NakeLookupPath = IMAGES_PATH;
 		$this->DestinationPath = IMAGES_PENDING_PATH;
 		parent::kUploadFormatter();
 	}
 	
 }
 
 class kMultiLanguage extends kFormatter 
 {
 	
 	function LangFieldName($field_name) 
 	{
 		$lang = $this->Application->GetVar('m_lang');
 		return 'l'.$lang.'_'.$field_name;
 	}
 	
 	function PrepareOptions($field_name, &$field_options, &$object)
 	{
 		if (getArrayValue($object->Fields, $field_name, 'master_field')) return;
 		
 		$lang_field_name = $this->LangFieldName($field_name);
 		
 		//substitude title field
 		$title_field = $this->Application->getUnitOption($object->Prefix, 'TitleField');
 		if ($title_field == $field_name) {
 			$this->Application->setUnitOption($object->Prefix, 'TitleField', $lang_field_name);
 		}
 		
 		//substitude fields
 		$fields = $this->Application->getUnitOption($object->Prefix, 'Fields');
 		if ( isset($fields[$field_name]) ) {
 			
 			$fields[$lang_field_name] = $fields[$field_name];
 			$fields[$lang_field_name]['master_field'] = $field_name;
 			$object->Fields[$lang_field_name] = $fields[$lang_field_name];
 			$fields[$field_name]['required'] = false;
 			$object->Fields[$field_name]['required'] = false;
 			$object->VirtualFields[$field_name] = $object->Fields[$field_name];
 		}
 		$this->Application->setUnitOption($object->Prefix, 'Fields', $fields);
 		
 		//substitude virtual fields
 		$virtual_fields = $this->Application->getUnitOption($object->Prefix, 'VirtualFields');
 		if ( isset($virtual_fields[$field_name]) ) {
 			$virtual_fields[$lang_field_name] = $virtual_fields[$field_name];
 			$virtual_fields[$lang_field_name]['master_field'] = $field_name;
 			$object->VirtualFields[$lang_field_name] = $virtual_fields[$lang_field_name];
 			$virtual_fields[$field_name]['required'] = false;
 			$object->VirtualFields[$field_name]['required'] = false;
 		}
 		$this->Application->setUnitOption($object->Prefix, 'VirtualFields', $virtual_fields);
 		
 		//substitude grid fields
 		$grids = $this->Application->getUnitOption($object->Prefix, 'Grids');
 		foreach ($grids as $name => $grid) {
 			if ( getArrayValue($grid, 'Fields', $field_name) ) {
 				array_rename_key($grids[$name]['Fields'], $field_name, $lang_field_name);
 			}
 		}
 		$this->Application->setUnitOption($object->Prefix, 'Grids', $grids);
 		
 		//substitude default sortings
 		$sortings = $this->Application->getUnitOption($object->Prefix, 'ListSortings');
 		foreach ($sortings as $special => $the_sortings) {
 			if (isset($the_sortings['ForcedSorting'])) {
 				array_rename_key($sortings[$special]['ForcedSorting'], $field_name, $lang_field_name);
 			}
 			if (isset($the_sortings['Sorting'])) {
 				array_rename_key($sortings[$special]['Sorting'], $field_name, $lang_field_name);
 			}
 		}
 		$this->Application->setUnitOption($object->Prefix, 'ListSortings', $sortings);
 		
 		//TODO: substitude possible language-fields sortings after changing language
 	}
 	
 	/*function UpdateSubFields($field, $value, &$options, &$object)
 	{
 		
 	}
 	
 	function UpdateMasterFields($field, $value, &$options, &$object)
 	{
 		
 	}*/
 	
 	function Format($value, $field_name, &$object, $format=null)
 	{
 		$master_field = getArrayValue($object->Fields, $field_name, 'master_field');
 		if (!$master_field) { // if THIS field is master it does NOT have reference to it's master_field
 			$lang = $this->Application->GetVar('m_lang');
 			$value = $object->GetDBField('l'.$lang.'_'.$field_name); //getting value of current language
 			$master_field = $field_name; // THIS is master_field
 		}
 		if ( $value == '' && $format != 'no_default') { // try to get default language value
 			$def_lang_value = $object->GetDBField('l'.$this->Application->GetDefaultLanguageId().'_'.$master_field);
 			if ($def_lang_value == '') return NULL; 
 			return $def_lang_value; //return value from default language
 		}
 		return $value;
 	}
 	
 	function Parse($value, $field_name, &$object)
 	{
 		$lang = $this->Application->GetVar('m_lang');
 		$def_lang = $this->Application->GetDefaultLanguageId();
 		$master_field = getArrayValue($object->Fields, $field_name, 'master_field');
 		
 		if ( getArrayValue($object->Fields, $field_name, 'required') && ( (string) $value == '' ) ) {
 			$object->FieldErrors[$master_field]['pseudo'] = 'required';
 		};
 		
 		if (!$this->Application->GetVar('allow_translation') && $lang != $def_lang && getArrayValue($object->Fields, $field_name, 'required')) {
 			$def_lang_field = 'l'.$def_lang.'_'.$master_field;
 			if ( !$object->ValidateRequired($def_lang_field, $object->Fields[$field_name]) ) {
 				$object->FieldErrors[$master_field]['pseudo'] = 'primary_lang_required';
 			}
 		} 
 		
 		if ($value == '') return NULL;
 		return $value;
 	}
 	
 }
 
 
 class kPasswordFormatter extends kFormatter 
 {
 	
 	function PrepareOptions($field_name, &$field_options, &$object)
 	{
 		if( isset( $field_options['verify_field'] ) )
 		{
 			$add_fields = Array();
 			$options = Array('master_field' => $field_name, 'formatter'=>'kPasswordFormatter');
 			$add_fields[ $field_options['verify_field'] ] = $options;
 			
 			$add_fields[$field_name.'_plain'] = Array('type'=>'string', 'error_field'=>$field_name);
 			$add_fields[ $field_options['verify_field'].'_plain' ] = Array('type'=>'string', 'error_field'=>$field_options['verify_field'] );
 			
 			$add_fields = array_merge_recursive2($add_fields, $object->VirtualFields);
 			$object->setVirtualFields($add_fields);
 		}
 	}
 	
 	function Format($value, $field_name, &$object, $format=null)
 	{
 		return $value;
 	}
 	
 	function Parse($value, $field_name, &$object)
 	{
 		$options = $object->GetFieldOptions($field_name);
 		
 		$fields = Array('master_field','verify_field');
 		$fields_set = true;
 		$flip_count = 0;
 		while($flip_count < 2)
 		{
 			if( getArrayValue($options,$fields[0]) )
 			{
 				$object->SetDBField($field_name.'_plain', $value);
 				if( !getArrayValue($object->Fields[ $options[ $fields[0] ] ], $fields[1].'_set') )
 				{
 					$object->Fields[ $options[ $fields[0] ] ][$fields[1].'_set'] = true;
 				}
 				
 				$password_field = $options[ $fields[0] ];
 				$verify_field = $field_name;
 			}
 			$fields = array_reverse($fields);
 			$flip_count++;
 		}
 		
 		if( getArrayValue($object->Fields[$password_field], 'verify_field_set') && getArrayValue($object->Fields[$verify_field], 'master_field_set') )
 		{
 			$new_password = $object->GetDBField($password_field.'_plain');
 			$verify_password = $object->GetDBField($verify_field.'_plain');
 
 			if($new_password == '' && $verify_password == '')
 			{
 				if( $object->GetDBField($password_field) != $this->EncryptPassword('') )
 				{
 					return $this->EncryptPassword($value);
 				}
 				else
 				{
 					$object->Fields[$password_field.'_plain']['required'] = true;
 					$object->Fields[$verify_field.'_plain']['required'] = true;
 					return null;
 				}
 			}
 			
 			$min_length = $this->Application->ConfigValue('Min_Password');
 			if( strlen($new_password) >= $min_length )
 			{
 				if($new_password != $verify_password)
 				{
 					$object->ErrorMsgs['passwords_do_not_match'] = $this->Application->Phrase('lu_passwords_do_not_match');
 					$object->FieldErrors[$password_field]['pseudo'] = 'passwords_do_not_match';
 					$object->FieldErrors[$verify_field]['pseudo'] = 'passwords_do_not_match';
 				}
 			}
 			else
 			{
 				$object->FieldErrors[$password_field]['pseudo'] = 'length_out_of_range';
 				$object->FieldErrors[$verify_field]['pseudo'] = 'length_out_of_range';
 			}
 		}
 		if($value == '') return $object->GetDBField($field_name);
 		return $this->EncryptPassword($value);
 	}
 	
 	function EncryptPassword($value)
 	{
 		return md5($value);
 	}
 }
 
 
 /**
  * Credit card expiration date formatter
  *
  */
 class kCCDateFormatter extends kFormatter 
 {
 	function PrepareOptions($field_name, &$field_options, &$object)
 	{
 		$add_fields = Array();
 		
 		$i = 1;
 		$options = Array('00' => '');
 		while($i <= 12)
 		{
 			$options[ sprintf('%02d',$i) ] = sprintf('%02d',$i);
 			$i++;
 		}
 		$add_fields[ $field_options['month_field'] ] = Array('formatter'=>'kOptionsFormatter', 'options' => $options, 'not_null' => true, 'default' => '00');
 		$add_fields[ $field_options['year_field'] ] = Array('type' => 'string', 'default' => '');
 		
 		$add_fields = array_merge_recursive2($add_fields, $object->VirtualFields);
 		$object->setVirtualFields($add_fields);
 	}
 	
 	function UpdateSubFields($field, $value, &$options, &$object)
 	{
 		if(!$value) return false;
 		$date = explode('/', $value);
 		$object->SetDBField( $options['month_field'], $date[0] );
 		$object->SetDBField( $options['year_field'], $date[1] );
 	}
 	
 	/**
 	 * Will work in future if we could attach 2 formatters to one field
 	 *
 	 * @param string $value
 	 * @param string $field_name
 	 * @param kBase $object
 	 * @return string
 	 */
 	function Parse($value, $field_name, &$object)
 	{
 //		if ( is_null($value) ) return '';
 		
 		$options = $object->GetFieldOptions($field_name);
 		
 		$month = $object->GetDirtyField($options['month_field']);
 		$year = $object->GetDirtyField($options['year_field']);
 		
 		if( !(int)$month && !(int)$year ) return NULL;
 		$is_valid = ($month >= 1 && $month <= 12) && ($year >= 0 && $year <= 99);
 		
 		if(!$is_valid) $object->FieldErrors[$field_name]['pseudo'] = 'bad_type';
 		return $month.'/'.$year;
 	}
 	
 }
 
 class kUnitFormatter extends kFormatter {
 
 	function PrepareOptions($field_name, &$field_options, &$object)
 	{
 		if( !isset($field_options['master_field']) )
 		{
 			$regional =& $this->Application->recallObject('lang.current');
 			$add_fields = Array();
-			$options =  Array('type' => 'int','error_field' => $field_name,'master_field' => $field_name,'formatter' => 'kUnitFormatter');
-			$options = array_merge_recursive2($field_options, $options);
+			$options_a =  Array('type' => 'int','error_field' => $field_name,'master_field' => $field_name,'format' => '%d');
+			$options_b =  Array('type' => 'double','error_field' => $field_name,'master_field' => $field_name,'format' => '%0.1f');
 			switch( $regional->GetDBField('UnitSystem') )
 			{
 				case 2: // US/UK
-					$add_fields[$field_name.'_a'] = $options;
-					$add_fields[$field_name.'_b'] = $options;
+					$add_fields[$field_name.'_a'] = array_merge_recursive2($field_options, $options_a);
+					$add_fields[$field_name.'_b'] = array_merge_recursive2($field_options, $options_b);
 				break;
 				default:
 			}
 			$add_fields = array_merge_recursive2($add_fields, $object->VirtualFields);
 			$object->setVirtualFields($add_fields);
 		}
 	}
 		
 	function UpdateMasterFields($field, $value, &$options, &$object)
 	{
 		if( !isset($options['master_field']) )
 		{
 			$regional =& $this->Application->recallObject('lang.current');
 			switch( $regional->GetDBField('UnitSystem') )
 			{
 				case 2: // US/UK
 					$major = $object->GetDirtyField($field.'_a');
 					$minor = $object->GetDirtyField($field.'_b');
 					$value = $major / 2 + $minor / 32;
 				break;
 				default:
 			}
 			$object->SetDBField($field, $value);
 		}
 	}
 	
 	function UpdateSubFields($field, $value, &$options, &$object)
 	{
 		if( !isset($options['master_field']) )
 		{
 			$regional =& $this->Application->recallObject('lang.current');
 			switch( $regional->GetDBField('UnitSystem') )
 			{
 				case 2: // US/UK
 					$major = floor( $value / 0.5 );
 					$minor = ($value - $major * 0.5) * 32;
 					$major = $object->SetDBField($field.'_a', $major);
 					$minor = $object->SetDBField($field.'_b', $minor);
 				break;
 				default:
 			}
 		}
 	}
 	
+	function Format($value, $field_name, &$object, $format=null)
+	{
+		return parent::Format($value, $field_name, $object, $format);
+	}
+	
 /*	function Format($value, $field_name, &$object, $format=null)
 	{
 		if( isset($field_options['master_field']) )
 		{
 			$regional =& $this->Application->recallObject('lang.current');
 			switch( $regional->GetDBField('UnitSystem') )
 			{
 				case 2: // US/UK
 					$major = floor( $value / 0.5 );
 					$minor = $value - $major;
 					$major = $object->SetDBField($field_name.'_a', $major);
 					$minor = $object->SetDBField($field_name.'_b', $minor);
 				break;
 				default:
 			}
 		}
 		return parent::Format($value, $field_name, $object);
 	}*/
 	
 	/*function Parse($value, $field_name, &$object)
 	{
 		$regional =& $this->Application->recallObject('lang.current');
 		switch($regional->GetDBField('UnitSystem'))
 		{
 			case 1: // metric
 				return	$object->GetDBField('UnitSystem_a');
 			break;
 			case 2: // US/UK
 				return	$object->GetDBField('UnitSystem_a') * 0.5 + 
 						$object->GetDBField('UnitSystem_b') * 0.5 / 16;
 			break;
 			default:
 		}
 	}*/
 	
 }
 
 
 ?>

Property changes on: trunk/core/kernel/utility/formatters.php
___________________________________________________________________
Modified: cvs2svn:cvs-rev
## -1 +1 ##
-1.5
\ No newline at end of property
+1.6
\ No newline at end of property
Index: trunk/core/kernel/languages/phrases_cache.php
===================================================================
--- trunk/core/kernel/languages/phrases_cache.php	(revision 1765)
+++ trunk/core/kernel/languages/phrases_cache.php	(revision 1766)
@@ -1,175 +1,175 @@
 <?php
 
 class PhrasesCache extends kDBBase {
 	
 	var $Phrases = Array();
 	var $Ids = Array();
 	var $OriginalIds = Array(); //for comparing cache
 	
 	var $LanguageId = 1;
 
 	var $fromTag = false;
 	
 	function PhrasesCache($LanguageId=1)
 	{
 		parent::kDBBase();
 		$this->Phrases = Array();
 		$this->LanguageId = $LanguageId;
 		$this->LoadPhrases( $this->GetCachedIds() );
 	}
 
 	function GetCachedIds()
 	{
 		$query = sprintf("SELECT PhraseList FROM %s WHERE Template = %s",
 											TABLE_PREFIX.'PhraseCache',
 											$this->Conn->Qstr(md5($this->Application->GetVar('t'))));
 		$phrases_ids = $this->Conn->GetOne($query);
 		if ($phrases_ids === false) return Array();
 		return explode(',', $phrases_ids);
 	}
 	
 	function LoadPhrases($ids)
 	{
 		if ( !is_array($ids) || !implode('', $ids) ) return;
 		$query = sprintf("SELECT Translation,Phrase FROM %s WHERE LanguageId = %s AND PhraseId IN (%s)",
 											TABLE_PREFIX.'Phrase',
 											$this->LanguageId,
 											join(',', $ids));
 		$phrases = $this->Conn->GetCol($query,'Phrase');
 		foreach($phrases as $phrase => $tanslation)
 		{
 			$this->AddCachedPhrase(strtoupper($phrase), $tanslation);
 		}
 		$this->Ids = $ids;
 		$this->OriginalIds = $ids;
 	}
 	
 	function AddCachedPhrase($label, $value)
 	{
 		$label = strtoupper($label);
 		$this->Phrases[$label] = $value;
 	}
 	
 	function UpdateCache()
 	{
 		if (!is_array($this->Ids) || count($this->Ids) == 0) return;
 		if ($this->Ids == $this->OriginalIds) return; //nothing changed
 		$query = sprintf("REPLACE %s (PhraseList, CacheDate, Template) 
 											VALUES (%s, %s, %s)",
 											TABLE_PREFIX.'PhraseCache',
 											$this->Conn->Qstr(join(',', $this->Ids)),
 											mktime(),
 											$this->Conn->Qstr(md5($this->Application->GetVar('t'))));
 		$this->Conn->Query($query);
 	}
 	
 	function GetPhrase($label)
 	{
 		if (ereg("^!.+!$", $label) > 0)
 		{
 			$label = substr($label, 1, -1); //cut exclamation marks
 		}
 		
 		$original_label = $label;
 		$label = strtoupper($label);
 		if( isset($this->Phrases[$label]) ) {
 			$translated_label = $this->Phrases[$label];
 			if($this->Application->isDebugMode() && dbg_ConstOn('DBG_PHRASES_HILIGHT') && !$this->Application->IsAdmin())
 				$translated_label = '<span style="border: 1px solid #999999; background-color: #cccccc; color: #999999; ">'.$translated_label.'</span>';
 			return $translated_label;
 		}
 		
 		$this->LoadPhraseByLabel($label, $original_label);
 		return $this->GetPhrase($label);
 	}
 	
 	function LoadPhraseByLabel($label, $original_label)
 	{
 		$query = sprintf("SELECT PhraseId, Translation FROM %s WHERE LanguageId = %s AND UPPER(Phrase) = UPPER(%s)",
 											TABLE_PREFIX.'Phrase',
 											$this->LanguageId,
 											$this->Conn->qstr($label));
 		$res = $this->Conn->GetRow($query);
 		if ($res === false || count($res) == 0)
 		{
 			$translation = '!'.$label.'!';
 			if( $this->Application->isDebugMode() && dbg_ConstOn('DBG_PHRASES') )
 			{
-				list($edit_tpl, $index_file) = $this->Application->IsAdmin() ? Array('regional/phrases_edit', 'index4.php') : Array('organized/phrases_edit', 'index.php');
+				list($edit_tpl, $index_file) = $this->Application->IsAdmin() ? Array('regional/phrases_edit', 'index4.php') : Array('phrases_edit', 'index.php');
 				
 				$edit_url = $this->Application->HREF($edit_tpl,'',Array('m_opener'=>'d','phrases_label'=>$original_label,'phrases_event'=>'OnNew', 'pass'=>'all,phrases'), $index_file );
 				$translation = '<a href="'.$edit_url.'">!'.$label.'!</a>';
 				if($this->fromTag) $translation = $this->escapeTagReserved($translation);
 			}
 			$this->AddCachedPhrase($label, $translation); //add it as already cached, as long as we dont need to cache not found phrase
 			return false;
 		}
 		
 		$this->Phrases[$label] = $res['Translation'];
 		array_push($this->Ids, $res['PhraseId']);
 		$this->Ids = array_unique($this->Ids); //just to make sure
 		return true; 
 	}
 	
 	/**
 	 * Sort params by name and then by length
 	 *
 	 * @param string $a
 	 * @param string $b
 	 * @return int
 	 * @access private
 	 */
 	function CmpParams($a, $b)
 	{
 		$a_len = strlen($a);
 		$b_len = strlen($b);
 		if ($a_len == $b_len) return 0;
 		return $a_len > $b_len ? -1 : 1;
 	}
 	
 	/**
 	 * Replace language tags in exclamation marks found in text
 	 *
 	 * @param string $text
 	 * @param bool $force_escape force escaping, not escaping of resulting string
 	 * @return string
 	 * @access public
 	 */
 	function ReplaceLanguageTags($text,$forse_escaping=null)
 	{
 		$this->fromTag = true;
 		if( isset($forse_escaping) ) $this->fromTag = $forse_escaping;
 		preg_match_all("(!(la|lu)[^!]+!)", $text, $res, PREG_PATTERN_ORDER);
 		$language_tags = $res[0];
 		uasort($language_tags, Array(&$this, 'CmpParams') );
 		
 		$values = Array();
 		$i = 0;
 		foreach ($language_tags as $label) {
 			array_push($values, $this->GetPhrase($label) );
 			//array_push($values, $this->Application->Phrase($label) );
 			$language_tags[$i] = '/' . $language_tags[$i] . '/';
 			$i++;
 		}
 		$this->fromTag = false;
 		return preg_replace($language_tags, $values, $text);
 	}
 	
 	/**
 	 * Escape chars in phrase translation, that could harm parser to process tag
 	 *
 	 * @param string $text
 	 * @return string
 	 * @access private
 	 */
 	function escapeTagReserved($text)
 	{
 		$reserved = Array('"',"'"); // =
 		$replacement = Array('\"',"\'"); // \=
 		return str_replace($reserved,$replacement,$text);
 	}
 
 }
 
 
 ?>
\ No newline at end of file

Property changes on: trunk/core/kernel/languages/phrases_cache.php
___________________________________________________________________
Modified: cvs2svn:cvs-rev
## -1 +1 ##
-1.5
\ No newline at end of property
+1.6
\ No newline at end of property
Index: trunk/core/units/languages/languages_config.php
===================================================================
--- trunk/core/units/languages/languages_config.php	(revision 1765)
+++ trunk/core/units/languages/languages_config.php	(revision 1766)
@@ -1,141 +1,146 @@
 <?php
 	
 $config	=	Array(
 					'Prefix'			=>	'lang',
 					'ItemClass'			=>	Array('class'=>'LanguagesItem','file'=>'languages_item.php','build_event'=>'OnItemBuild'),
 					'ListClass'			=>	Array('class'=>'kDBList','file'=>'','build_event'=>'OnListBuild'),
 					'EventHandlerClass'	=>	Array('class'=>'LanguagesEventHandler','file'=>'languages_event_handler.php','build_event'=>'OnBuild'),
 					'TagProcessorClass' =>	Array('class'=>'LanguagesTagProcessor','file'=>'languages_tag_processor.php','build_event'=>'OnBuild'),
-					
 					'RegisterClasses'	=>	Array(
 												Array('pseudo'=>'LangXML','class'=>'LangXML_Parser','file'=>'import_xml.php'),
 											),
-					
+					/*'AggregateTags' => Array(
+															Array(
+																'AggregateTo' => 'm',
+																'AggregatedTagName' => 'IsMetricUnits',
+																'LocalTagName' => 'Main_IsMetricUnits',
+															),
+													),		*/			
 					'AutoLoad'			=>	true,
 					'Hooks'	=>	Array( 
 												Array(
 													'Mode' => hAFTER,
 													'Conditional' => false,
 													'HookToPrefix' => 'lang',
 													'HookToSpecial' => '',
 													'HookToEvent' => Array('OnSave'),
 													'DoPrefix' => '',
 													'DoSpecial' => '',
 													'DoEvent' => 'OnReflectMultiLingualFields',
 												),
 												
 												Array(
 													'Mode' => hAFTER,
 													'Conditional' => false,
 													'HookToPrefix' => 'lang',
 													'HookToSpecial' => '',
 													'HookToEvent' => Array('OnPreSave'),
 													'DoPrefix' => '',
 													'DoSpecial' => '',
 													'DoEvent' => 'OnCopyLabels',
 												),
 											),
 					'QueryString'		=>	Array(
 												1	=>	'id',
 												2	=>	'page',
 												3	=>	'event',
 												4	=>	'mode',
 											),
 					'IDField'			=>	'LanguageId',
 					
 					'StatusField'		=>	Array('Enabled','PrimaryLang'),	// field, that is affected by Approve/Decline events
 					
 					'TitleField'		=>	'PackName',		// field, used in bluebar when editing existing item
 					
 					'TitlePresets'		=>	Array(
 												'default'	=>	Array(	'new_status_labels'		=> Array('lang'=>'!la_title_Adding_Language!'),
 																		'edit_status_labels'	=> Array('lang'=>'!la_title_Editing_Language!'),
 																		'new_titlefield'		=> Array('lang'=>'!la_title_New_Language!'),
 																),
 												
 												'languages_list'			=>	Array(	'prefixes'	=>	Array('lang_List'), 'format' => "!la_title_Configuration! - !la_title_LanguagePacks! (#lang_recordcount#)"),
 																				
 												'languages_edit_general'	=>	Array(	'prefixes'	=> Array('lang'), 'format' => "#lang_status# '#lang_titlefield#' - !la_title_General!"),
 												
 												'phrases_list'				=>	Array(	'prefixes'	=> Array('lang','phrases_List'), 'format' => "#lang_status# '#lang_titlefield#' - !la_title_Labels! (#phrases_recordcount#)"),
 												
 												'import_language'			=>	Array(	'prefixes'	=> Array('phrases.import'), 'format' => "!la_title_InstallLanguagePackStep1!"),
 												
 												'import_language_step2'		=>	Array(	'prefixes'	=> Array('phrases.import'), 'format' => "!la_title_InstallLanguagePackStep2!"),
 												
 												'export_language'			=>	Array(	'prefixes'	=> Array('phrases.export'), 'format' => "!la_title_ExportLanguagePackStep1!"),
 												
 												'export_language_results'	=>	Array(	'prefixes'	=> Array('phrases.export'), 'format' => "!la_title_ExportLanguagePackResults!"),
 												
 												'events_list'				=>	Array(	'prefixes'	=>	Array('lang','emailevents_List'), 'format'	=>	"#lang_status# '#lang_titlefield#' - !la_title_EmailEvents! (#emailevents_recordcount#)"),
 												
 												'event_edit' 				=>	Array(	'prefixes' 				=>	Array('emailevents'),
 																						'edit_status_labels'	=>	Array('emailevents'	=>	'!la_title_Editing_EmailEvent!'),
 																						'format' 				=> 	'#emailevents_status# - #emailevents_titlefield#'),
 												
 												'email_messages_edit'		=>	Array(	'prefixes'	=>	Array('lang','emailmessages'),
 																						'new_titlefield'	=>	Array('emailmessages' => '!la_NoSubject!'),
 																						'format'	=>	"#lang_status# '#lang_titlefield#' - !la_title_EditingEmailEvent! '#emailmessages_titlefield#'"),
 											),
 					
 					'TableName'			=>	TABLE_PREFIX.'Language',
 					'SubItems' => Array('phrases','emailmessages'),
 					
 					'FilterMenu'		=>	Array(
 												'Groups' => Array(
 													Array('mode' => 'AND', 'filters' => Array(0,1), 'type' => WHERE_FILTER),
 												),
 												
 												'Filters' => Array(
 													0	=>	Array('label' =>'la_Enabled', 'on_sql' => '', 'off_sql' => '%1$s.Enabled != 1' ),
 													1	=>	Array('label' => 'la_Disabled', 'on_sql' => '', 'off_sql' => '%1$s.Enabled != 0'  ),
 												)
 											),
 					
 					'AutoDelete'		=>	true,
 					
 					'AutoClone'			=>	true,
 										
 					'ListSQLs'			=>	Array(	''=>'SELECT * FROM %s',
 																		), // key - special, value - list select sql
 					'ItemSQLs'			=>	Array(	''=>'SELECT * FROM %s',
 																		),
 					'ListSortings'	=> 	Array( 
 																'' => Array(
 																	'Sorting' => Array('PackName' => 'asc'),
 																)
 															),																		
 					'Fields' => Array(
 										'LanguageId' => Array(),
 										'PackName' => Array('type' => 'string','not_null' => '1','default' => '','required'=>1),
 										'LocalName' => Array('type' => 'string','not_null' => '1','default' => '','required'=>1),
 										'Enabled' => Array('type' => 'int', 'formatter' => 'kOptionsFormatter', 'options' => Array(0 => 'la_Disabled', 1 => 'la_Enabled'), 'use_phrases' => 1, 'not_null' => '1',  'default' => '0'),
 										'PrimaryLang' => Array('type' => 'int','not_null' => '1','default' => '0'),
 										'IconURL' => Array('type' => 'string','default' => ''),
 										'DateFormat' => Array('type' => 'string','not_null' => '1','default' => '','required'=>1),
 										'TimeFormat' => Array('type' => 'string','not_null' => '1','default' => '','required'=>1),
 										'DecimalPoint' => Array('type' => 'string','not_null' => '1','default' => '.'),
 										'ThousandSep' => Array('type' => 'string','not_null' => '1','default' => ','),
 										'Charset' => Array('type' => 'string','not_null' => '1','default' => '','required'=>1),
 										'UnitSystem' => Array('type' => 'int','not_null' => '1','default' => '1','formatter' => 'kOptionsFormatter','options' => Array(1 => 'la_Metric', 2 => 'la_US_UK'),'use_phrases' => 1),
 								),
 
 					'VirtualFields'	=> 	Array(
 												'CopyLabels'		=>	Array('type' => 'int', 'default' => 0),
 												'CopyFromLanguage'	=>	Array('type' => 'int', 'formatter' => 'kOptionsFormatter', 'options_sql' => 'SELECT %s FROM '.TABLE_PREFIX.'Language ORDER BY PackName', 'option_title_field' => 'PackName', 'option_key_field' => 'LanguageId'),
 										),
 											
 					'Grids'	=> Array(
 								'Default'		=>	Array(
 																	'Icons' => Array('default'=>'icon16_custom.gif','0_0'=>'icon16_language_disabled.gif','1_0'=>'icon16_language.gif','0_1'=>'icon16_language_disabled.gif','1_1'=>'icon16_language_primary.gif'),
 																	'Fields' => Array(
 																			'PackName' 	=> Array( 'title'=>'la_col_PackName', 'data_block' => 'grid_checkbox_td'),
 																			'LocalName' => Array( 'title'=>'la_col_LocalName' ),
 																			'Enabled' 	=> Array( 'title'=>'la_col_Status' ),
 																		),
 																	
 																),
 													),
 	);
 
 ?>
\ No newline at end of file

Property changes on: trunk/core/units/languages/languages_config.php
___________________________________________________________________
Modified: cvs2svn:cvs-rev
## -1 +1 ##
-1.3
\ No newline at end of property
+1.4
\ No newline at end of property
Index: trunk/core/units/languages/languages_tag_processor.php
===================================================================
--- trunk/core/units/languages/languages_tag_processor.php	(revision 1765)
+++ trunk/core/units/languages/languages_tag_processor.php	(revision 1766)
@@ -1,61 +1,68 @@
 <?php
 
 	class LanguagesTagProcessor extends kDBTagProcessor 
 	{
 	
 		/**
 		 * Guesses what charset should be used:
 		 * 1. use lang.current_Field field="Charset" by default
 		 * 2. if using temp tables then use lang_Field field="Charset"
 		 *
 		 * @param Array $params
 		 * @return string
 		 */
 		function GetCharset($params)
 		{
 			$edit_direct = $this->Application->GetVar('phrases_label');
 			
 			$top_prefix = $this->Application->GetTopmostPrefix($this->Prefix);
 			if( $this->Application->GetVar($top_prefix.'_mode') == 't' && !$edit_direct )
 			{
 				$object =& $this->Application->recallObject($this->getPrefixSpecial(), $this->Prefix, $params);
 				return $object->GetDBField('Charset');	
 			}
 			$lang_current =& $this->Application->recallObject('lang.current');
 			return $lang_current->GetDBField('Charset');
 		}
 		
 		function ListLanguages($params)
 		{
 			$this->Special = 'list';
 			return $this->PrintList2($params);
 		}
 
 		function SelectedLanguage($params)
 		{
 			$object =& $this->Application->recallObject($this->getPrefixSpecial());
 		
 			return $object->GetDBField('LanguageId') == $this->Application->RecallVar('m_lang');
 		}
 		
 		/**
 		 * Returns path where exported languages should be saved
 		 *
 		 * @param unknown_type $params
 		 */
 		function ExportPath($params)
 		{
 			$admin_folder = $this->Application->ConfigValue('AdminDirectory');
 			if(!$admin_folder) $admin_folder = 'admin';
 			$ret = DOC_ROOT.BASE_PATH.'/'.$admin_folder.'/export/';
 			
 			if( getArrayValue($params,'as_url') )
 			{
 				$ret = str_replace( DOC_ROOT.BASE_PATH.'/', $this->Application->BaseURL(), $ret);	
 			}
 			return $ret;
 		}
 		
+/*		function Main_IsMetricUnits($params)
+		{
+			$object =& $this->Application->recallObject($this->Prefix.'.current');
+			$measure_system = $object->GetDBField('UnitSystem');
+			return $measure_system == 1 ? 1 : 0;
+		}*/
+		
 	}
 
 ?>
\ No newline at end of file

Property changes on: trunk/core/units/languages/languages_tag_processor.php
___________________________________________________________________
Modified: cvs2svn:cvs-rev
## -1 +1 ##
-1.2
\ No newline at end of property
+1.3
\ No newline at end of property