Browse Source

Ajax pages: exceptions are traced into error.log

git-svn-id: http://svn.code.sf.net/p/itop/code/trunk@970 a333f486-631f-4898-b8df-5754b55c2be0
romainq 14 years ago
parent
commit
6ce039ec40
2 changed files with 510 additions and 492 deletions
  1. 171 163
      pages/ajax.csvimport.php
  2. 339 329
      pages/ajax.render.php

+ 171 - 163
pages/ajax.csvimport.php

@@ -208,202 +208,210 @@ function GetMappingForField($sClassName, $sFieldName, $iFieldIndex, $bAdvancedMo
 	return $sHtml;
 }
 
-require_once(APPROOT.'/application/startup.inc.php');
+try
+{
+	require_once(APPROOT.'/application/startup.inc.php');
 
-require_once(APPROOT.'/application/loginwebpage.class.inc.php');
-LoginWebPage::DoLogin(); // Check user rights and prompt if needed
+	require_once(APPROOT.'/application/loginwebpage.class.inc.php');
+	LoginWebPage::DoLogin(); // Check user rights and prompt if needed
 
 
-$sOperation = utils::ReadParam('operation', '');
+	$sOperation = utils::ReadParam('operation', '');
 
-switch($sOperation)
-{
-	case 'parser_preview':
-	$oPage = new ajax_page("");
-	$oPage->no_cache();
-	$sSeparator = utils::ReadParam('separator', ',');
-	if ($sSeparator == 'tab') $sSeparator = "\t";
-	$sTextQualifier = utils::ReadParam('qualifier', '"');
-	$iLinesToSkip = utils::ReadParam('nb_lines_skipped', 0);
-	$bFirstLineAsHeader = utils::ReadParam('header_line', true);
-	$sEncoding = utils::ReadParam('encoding', 'UTF-8');
-	$sData = stripslashes(utils::ReadParam('csvdata', true));
-	$oCSVParser = new CSVParser($sData, $sSeparator, $sTextQualifier);
-	$aData = $oCSVParser->ToArray($iLinesToSkip);
-	$iTarget = count($aData);
-	if ($iTarget == 0)
-	{
-		$oPage->p(Dict::S('UI:CSVImport:NoData'));
-	}
-	else
+	switch($sOperation)
 	{
-		$sMaxLen = (strlen(''.$iTarget) < 3) ? 3 : strlen(''.$iTarget); // Pad line numbers to the appropriate number of chars, but at least 3
-		$sFormat = '%0'.$sMaxLen.'d';
-		$oPage->p("<h3>".Dict::S('UI:Title:DataPreview')."</h3>\n");
-		$oPage->p("<div style=\"overflow-y:auto\" class=\"white\">\n");
-		$oPage->add("<table cellspacing=\"0\" style=\"overflow-y:auto\">");
-		$iMaxIndex= 10; // Display maximum 10 lines for the preview
-		$index = 1;
-		foreach($aData as $aRow)
+		case 'parser_preview':
+		$oPage = new ajax_page("");
+		$oPage->no_cache();
+		$sSeparator = utils::ReadParam('separator', ',');
+		if ($sSeparator == 'tab') $sSeparator = "\t";
+		$sTextQualifier = utils::ReadParam('qualifier', '"');
+		$iLinesToSkip = utils::ReadParam('nb_lines_skipped', 0);
+		$bFirstLineAsHeader = utils::ReadParam('header_line', true);
+		$sEncoding = utils::ReadParam('encoding', 'UTF-8');
+		$sData = stripslashes(utils::ReadParam('csvdata', true));
+		$oCSVParser = new CSVParser($sData, $sSeparator, $sTextQualifier);
+		$aData = $oCSVParser->ToArray($iLinesToSkip);
+		$iTarget = count($aData);
+		if ($iTarget == 0)
+		{
+			$oPage->p(Dict::S('UI:CSVImport:NoData'));
+		}
+		else
 		{
-			$sCSSClass = 'csv_row'.($index % 2);
-			if ( ($bFirstLineAsHeader) && ($index == 1))
+			$sMaxLen = (strlen(''.$iTarget) < 3) ? 3 : strlen(''.$iTarget); // Pad line numbers to the appropriate number of chars, but at least 3
+			$sFormat = '%0'.$sMaxLen.'d';
+			$oPage->p("<h3>".Dict::S('UI:Title:DataPreview')."</h3>\n");
+			$oPage->p("<div style=\"overflow-y:auto\" class=\"white\">\n");
+			$oPage->add("<table cellspacing=\"0\" style=\"overflow-y:auto\">");
+			$iMaxIndex= 10; // Display maximum 10 lines for the preview
+			$index = 1;
+			foreach($aData as $aRow)
+			{
+				$sCSSClass = 'csv_row'.($index % 2);
+				if ( ($bFirstLineAsHeader) && ($index == 1))
+				{
+					$oPage->add("<tr class=\"$sCSSClass\"><td style=\"border-left:#999 3px solid;padding-right:10px;padding-left:10px;\">".sprintf($sFormat, $index)."</td><th>");
+					$oPage->add(implode('</th><th>', $aRow));
+					$oPage->add("</th></tr>\n");
+					$iNbCols = count($aRow);
+									
+				}
+				else
+				{
+					if ($index == 1) $iNbCols = count($aRow);
+					$oPage->add("<tr class=\"$sCSSClass\"><td style=\"border-left:#999 3px solid;padding-right:10px;padding-left:10px;\">".sprintf($sFormat, $index)."</td><td>");
+					$oPage->add(implode('</td><td>', $aRow));
+					$oPage->add("</td></tr>\n");
+				}
+				$index++;
+				if ($index > $iMaxIndex) break;
+			}
+			$oPage->add("</table>\n");
+			$oPage->add("</div>\n");
+			if($iNbCols == 1)
 			{
-				$oPage->add("<tr class=\"$sCSSClass\"><td style=\"border-left:#999 3px solid;padding-right:10px;padding-left:10px;\">".sprintf($sFormat, $index)."</td><th>");
-				$oPage->add(implode('</th><th>', $aRow));
-				$oPage->add("</th></tr>\n");
-				$iNbCols = count($aRow);
-								
+				$oPage->p('<img src="../images/error.png">&nbsp;'.Dict::S('UI:CSVImport:ErrorOnlyOneColumn'));
 			}
 			else
 			{
-				if ($index == 1) $iNbCols = count($aRow);
-				$oPage->add("<tr class=\"$sCSSClass\"><td style=\"border-left:#999 3px solid;padding-right:10px;padding-left:10px;\">".sprintf($sFormat, $index)."</td><td>");
-				$oPage->add(implode('</td><td>', $aRow));
-				$oPage->add("</td></tr>\n");
+				$oPage->p('&nbsp;');
 			}
-			$index++;
-			if ($index > $iMaxIndex) break;
 		}
-		$oPage->add("</table>\n");
-		$oPage->add("</div>\n");
-		if($iNbCols == 1)
+		break;
+
+		case 'display_mapping_form':
+		$oPage = new ajax_page("");
+		$oPage->no_cache();
+		$sSeparator = utils::ReadParam('separator', ',');
+		$sTextQualifier = utils::ReadParam('qualifier', '"');
+		$iLinesToSkip = utils::ReadParam('nb_lines_skipped', 0);
+		$bFirstLineAsHeader = utils::ReadParam('header_line', false);
+		$sData = stripslashes(utils::ReadParam('csvdata', ''));
+		$sClassName = utils::ReadParam('class_name', '');
+		$bAdvanced = utils::ReadParam('advanced', false);
+		$sEncoding = utils::ReadParam('encoding', 'UTF-8');
+		$oCSVParser = new CSVParser($sData, $sSeparator, $sTextQualifier);
+		$aData = $oCSVParser->ToArray($iLinesToSkip);
+		$iTarget = count($aData);
+		if ($iTarget == 0)
 		{
-			$oPage->p('<img src="../images/error.png">&nbsp;'.Dict::S('UI:CSVImport:ErrorOnlyOneColumn'));
+			$oPage->p(Dict::S('UI:CSVImport:NoData'));
 		}
 		else
 		{
-			$oPage->p('&nbsp;');
-		}
-	}
-	break;
-
-	case 'display_mapping_form':
-	$oPage = new ajax_page("");
-	$oPage->no_cache();
-	$sSeparator = utils::ReadParam('separator', ',');
-	$sTextQualifier = utils::ReadParam('qualifier', '"');
-	$iLinesToSkip = utils::ReadParam('nb_lines_skipped', 0);
-	$bFirstLineAsHeader = utils::ReadParam('header_line', false);
-	$sData = stripslashes(utils::ReadParam('csvdata', ''));
-	$sClassName = utils::ReadParam('class_name', '');
-	$bAdvanced = utils::ReadParam('advanced', false);
-	$sEncoding = utils::ReadParam('encoding', 'UTF-8');
-	$oCSVParser = new CSVParser($sData, $sSeparator, $sTextQualifier);
-	$aData = $oCSVParser->ToArray($iLinesToSkip);
-	$iTarget = count($aData);
-	if ($iTarget == 0)
-	{
-		$oPage->p(Dict::S('UI:CSVImport:NoData'));
-	}
-	else
-	{
-		$oPage->add("<table>");
-		$aFirstLine = $aData[0]; // Use the first row to determine the number of columns
-		$iStartLine = 0;
-		$iNbColumns = count($aFirstLine);
-		if ($bFirstLineAsHeader)
-		{
-			$iStartLine = 1;
-			foreach($aFirstLine as $sField)
+			$oPage->add("<table>");
+			$aFirstLine = $aData[0]; // Use the first row to determine the number of columns
+			$iStartLine = 0;
+			$iNbColumns = count($aFirstLine);
+			if ($bFirstLineAsHeader)
 			{
-				$aHeader[] = $sField;
+				$iStartLine = 1;
+				foreach($aFirstLine as $sField)
+				{
+					$aHeader[] = $sField;
+				}
 			}
-		}
-		else
-		{
-			// Build some conventional name for the fields: field1...fieldn
-			$index= 1;
-			foreach($aFirstLine as $sField)
+			else
 			{
-				$aHeader[] = Dict::Format('UI:CSVImport:FieldName', $index);
-				$index++;
+				// Build some conventional name for the fields: field1...fieldn
+				$index= 1;
+				foreach($aFirstLine as $sField)
+				{
+					$aHeader[] = Dict::Format('UI:CSVImport:FieldName', $index);
+					$index++;
+				}
 			}
-		}
-		$oPage->add("<table>\n");
-		$oPage->add('<tr>');
-		$oPage->add('<th>'.Dict::S('UI:CSVImport:HeaderFields').'</th><th>'.Dict::S('UI:CSVImport:HeaderMappings').'</th><th>&nbsp;</th><th>'.Dict::S('UI:CSVImport:HeaderSearch').'</th><th>'.Dict::S('UI:CSVImport:DataLine1').'</th><th>'.Dict::S('UI:CSVImport:DataLine2').'</th>');
-		$oPage->add('</tr>');
-		$index = 1;
-		foreach($aHeader as $sField)
-		{
+			$oPage->add("<table>\n");
 			$oPage->add('<tr>');
-			$oPage->add("<th>$sField</th>");
-			$oPage->add('<td>'.GetMappingForField($sClassName, $sField, $index, $bAdvanced).'</td>');
-			$oPage->add('<td>&nbsp;</td>');
-			$oPage->add('<td><input id="search_'.$index.'" type="checkbox" name="search_field['.$index.']" value="1" /></td>');
-			$oPage->add('<td>'.(isset($aData[$iStartLine][$index-1]) ? htmlentities($aData[$iStartLine][$index-1], ENT_QUOTES, 'UTF-8') : '&nbsp;').'</td>');
-			$oPage->add('<td>'.(isset($aData[$iStartLine+1][$index-1]) ? htmlentities($aData[$iStartLine+1][$index-1], ENT_QUOTES, 'UTF-8') : '&nbsp;').'</td>');
+			$oPage->add('<th>'.Dict::S('UI:CSVImport:HeaderFields').'</th><th>'.Dict::S('UI:CSVImport:HeaderMappings').'</th><th>&nbsp;</th><th>'.Dict::S('UI:CSVImport:HeaderSearch').'</th><th>'.Dict::S('UI:CSVImport:DataLine1').'</th><th>'.Dict::S('UI:CSVImport:DataLine2').'</th>');
 			$oPage->add('</tr>');
-			$index++;
-		}
-		$oPage->add("</table>\n");
-		$aReconciliationKeys = MetaModel::GetReconcKeys($sClassName);
-		$aMoreReconciliationKeys = array(); // Store: key => void to automatically remove duplicates
-		foreach($aReconciliationKeys as $sAttCode)
-		{
-			$oAttDef = MetaModel::GetAttributeDef($sClassName, $sAttCode);
-			if ($oAttDef->IsExternalKey())
+			$index = 1;
+			foreach($aHeader as $sField)
 			{
-				// An external key is specified as a reconciliation key: this means that all the reconciliation
-				// keys of this class are proposed to identify the target object
-				$aMoreReconciliationKeys = array_merge($aMoreReconciliationKeys, GetMappingsForExtKey($sAttCode, $oAttDef, $bAdvanced));
+				$oPage->add('<tr>');
+				$oPage->add("<th>$sField</th>");
+				$oPage->add('<td>'.GetMappingForField($sClassName, $sField, $index, $bAdvanced).'</td>');
+				$oPage->add('<td>&nbsp;</td>');
+				$oPage->add('<td><input id="search_'.$index.'" type="checkbox" name="search_field['.$index.']" value="1" /></td>');
+				$oPage->add('<td>'.(isset($aData[$iStartLine][$index-1]) ? htmlentities($aData[$iStartLine][$index-1], ENT_QUOTES, 'UTF-8') : '&nbsp;').'</td>');
+				$oPage->add('<td>'.(isset($aData[$iStartLine+1][$index-1]) ? htmlentities($aData[$iStartLine+1][$index-1], ENT_QUOTES, 'UTF-8') : '&nbsp;').'</td>');
+				$oPage->add('</tr>');
+				$index++;
 			}
-			elseif($oAttDef->IsExternalField())
+			$oPage->add("</table>\n");
+			$aReconciliationKeys = MetaModel::GetReconcKeys($sClassName);
+			$aMoreReconciliationKeys = array(); // Store: key => void to automatically remove duplicates
+			foreach($aReconciliationKeys as $sAttCode)
 			{
-				// An external field is specified as a reconciliation key, translate the field into a field on the target class
-				// since external fields are not writable, and thus never appears in the mapping form
-				$sKeyAttCode = $oAttDef->GetKeyAttCode();
-				$sTargetAttCode = $oAttDef->GetExtAttCode();
-				$aMoreReconciliationKeys[$sKeyAttCode.'->'.$sTargetAttCode] = '';			
+				$oAttDef = MetaModel::GetAttributeDef($sClassName, $sAttCode);
+				if ($oAttDef->IsExternalKey())
+				{
+					// An external key is specified as a reconciliation key: this means that all the reconciliation
+					// keys of this class are proposed to identify the target object
+					$aMoreReconciliationKeys = array_merge($aMoreReconciliationKeys, GetMappingsForExtKey($sAttCode, $oAttDef, $bAdvanced));
+				}
+				elseif($oAttDef->IsExternalField())
+				{
+					// An external field is specified as a reconciliation key, translate the field into a field on the target class
+					// since external fields are not writable, and thus never appears in the mapping form
+					$sKeyAttCode = $oAttDef->GetKeyAttCode();
+					$sTargetAttCode = $oAttDef->GetExtAttCode();
+					$aMoreReconciliationKeys[$sKeyAttCode.'->'.$sTargetAttCode] = '';			
+				}
 			}
-		}
-		$sDefaultKeys = '"'.implode('", "',array_merge($aReconciliationKeys, array_keys($aMoreReconciliationKeys))).'"';
-		$oPage->add_ready_script(
+			$sDefaultKeys = '"'.implode('", "',array_merge($aReconciliationKeys, array_keys($aMoreReconciliationKeys))).'"';
+			$oPage->add_ready_script(
 <<<EOF
 		$('select[name^=field]').change( DoCheckMapping );
 		aDefaultKeys = new Array($sDefaultKeys);
 		DoCheckMapping();
 EOF
 );	
-	}
-	break;
-	
-	case 'get_csv_template':
-	$sClassName = utils::ReadParam('class_name');
-	$oSearch = new DBObjectSearch($sClassName);
-	$oSearch->AddCondition('id', 0, '='); // Make sure we create an empty set
-	$oSet = new CMDBObjectSet($oSearch);
-	$sResult = cmdbAbstractObject::GetSetAsCSV($oSet, array('showMandatoryFields' => true));
-	//$aCSV = explode("\n", $sCSV);
-	// If there are more than one line, let's assume that the first line is a comment and skip it.
-	//if (count($aCSV) > 1)
-	//{
-	//	$sResult = $aCSV[0];
-	//}
-	//else
-	//{
-	//	$sResult = $sCSV;
-	//}
+		}
+		break;
 
-	$sClassDisplayName = MetaModel::GetName($sClassName);
-	$sDisposition = utils::ReadParam('disposition', 'inline');
-	if ($sDisposition == 'attachment')
-	{
-		$oPage = new CSVPage("");
-		$oPage->add_header("Content-type: text/csv; charset=utf-8");
-		$oPage->add_header("Content-disposition: attachment; filename=\"{$sClassDisplayName}.csv\"");
-		$oPage->no_cache();		
-		$oPage->add($sResult);	
-	}
-	else
-	{
-		$oPage = new ajax_page("");
-		$oPage->no_cache();
-		$oPage->add('<p style="text-align:center"><a style="text-decoration:none" href="../pages/ajax.csvimport.php?operation=get_csv_template&disposition=attachment&class_name='.$sClassName.'"><img border="0" src="../images/csv.png"><br/>'.$sClassDisplayName.'.csv</a></p>');		
-		$oPage->add('<p><textarea rows="5" cols="100">'.$sResult.'</textarea></p>');
+		case 'get_csv_template':
+		$sClassName = utils::ReadParam('class_name');
+		$oSearch = new DBObjectSearch($sClassName);
+		$oSearch->AddCondition('id', 0, '='); // Make sure we create an empty set
+		$oSet = new CMDBObjectSet($oSearch);
+		$sResult = cmdbAbstractObject::GetSetAsCSV($oSet, array('showMandatoryFields' => true));
+		//$aCSV = explode("\n", $sCSV);
+		// If there are more than one line, let's assume that the first line is a comment and skip it.
+		//if (count($aCSV) > 1)
+		//{
+		//	$sResult = $aCSV[0];
+		//}
+		//else
+		//{
+		//	$sResult = $sCSV;
+		//}
+
+		$sClassDisplayName = MetaModel::GetName($sClassName);
+		$sDisposition = utils::ReadParam('disposition', 'inline');
+		if ($sDisposition == 'attachment')
+		{
+			$oPage = new CSVPage("");
+			$oPage->add_header("Content-type: text/csv; charset=utf-8");
+			$oPage->add_header("Content-disposition: attachment; filename=\"{$sClassDisplayName}.csv\"");
+			$oPage->no_cache();		
+			$oPage->add($sResult);	
+		}
+		else
+		{
+			$oPage = new ajax_page("");
+			$oPage->no_cache();
+			$oPage->add('<p style="text-align:center"><a style="text-decoration:none" href="../pages/ajax.csvimport.php?operation=get_csv_template&disposition=attachment&class_name='.$sClassName.'"><img border="0" src="../images/csv.png"><br/>'.$sClassDisplayName.'.csv</a></p>');		
+			$oPage->add('<p><textarea rows="5" cols="100">'.$sResult.'</textarea></p>');
+		}
+		break;
 	}
-	break;
+	$oPage->output();
 }
-$oPage->output();
+catch (Exception $e)
+{
+	IssueLog::Error($e->getMessage());
+}
+
 ?>

+ 339 - 329
pages/ajax.render.php

@@ -31,367 +31,377 @@ require_once(APPROOT.'/application/wizardhelper.class.inc.php');
 require_once(APPROOT.'/application/ui.linkswidget.class.inc.php');
 require_once(APPROOT.'/application/ui.autocompletewidget.class.inc.php');
 
-require_once(APPROOT.'/application/startup.inc.php');
-require_once(APPROOT.'/application/user.preferences.class.inc.php');
-
-require_once(APPROOT.'/application/loginwebpage.class.inc.php');
-LoginWebPage::DoLogin(false /* bMustBeAdmin */, true /* IsAllowedToPortalUsers */); // Check user rights and prompt if needed
-
-$oPage = new ajax_page("");
-$oPage->no_cache();
-
-$operation = utils::ReadParam('operation', '');
-$sFilter = stripslashes(utils::ReadParam('filter', ''));
-$sEncoding = utils::ReadParam('encoding', 'serialize');
-$sClass = utils::ReadParam('class', 'MissingAjaxParam');
-$sStyle = utils::ReadParam('style', 'list');
-
-switch($operation)
+try
 {
-	case 'addObjects':
-	require_once(APPROOT.'/application/uilinkswizard.class.inc.php');
-	$sClass = utils::ReadParam('class', '', 'get');
-	$sLinkedClass = utils::ReadParam('linkedClass', '');
-	$sLinkageAttr = utils::ReadParam('linkageAttr', '');
-	$iObjectId = utils::ReadParam('objectId', '');
-	$oLinksWizard = new UILinksWizard($sClass,  $sLinkageAttr, $iObjectId, $sLinkedClass);
-	$oLinksWizard->DisplayAddForm($oPage);
-	break;
-	
-	// ui.linkswidget
-	case 'searchObjectsToAdd':
-	$sRemoteClass = utils::ReadParam('sRemoteClass', '');
-	$sAttCode = utils::ReadParam('sAttCode', '');
-	$iInputId = utils::ReadParam('iInputId', '');
-	$sSuffix = utils::ReadParam('sSuffix', '');
-	$bDuplicates = (utils::ReadParam('bDuplicates', 'false') == 'false') ? false : true;
-	$aAlreadyLinked = utils::ReadParam('aAlreadyLinked', array());
-	$oWidget = new UILinksWidget($sClass, $sAttCode, $iInputId, $sSuffix, $bDuplicates);
-	$oWidget->SearchObjectsToAdd($oPage, $sRemoteClass, $aAlreadyLinked);	
-	break;
-	
-	// ui.autocompletewidget
-	case 'searchObjectsToSelect':
-	$sTargetClass = utils::ReadParam('sRemoteClass', '');
-	$sAttCode = utils::ReadParam('sAttCode', '');
-	$iInputId = utils::ReadParam('iInputId', '');
-	$sSuffix = utils::ReadParam('sSuffix', '');
-	$sJson = utils::ReadParam('json', '');
-	$oWizardHelper = WizardHelper::FromJSON($sJson);
-	$oObj = $oWizardHelper->GetTargetObject();
-	$aAllowedValues = MetaModel::GetAllowedValues_att($sClass, $sAttCode, array('this' => $oObj));
-	$oWidget = new UIAutocompleteWidget($sAttCode, $sClass, '', $aAllowedValues, $oObj->Get($sAttCode), $iInputId, $sSuffix, '');
-	$oWidget->SearchObjectsToSelect($oPage, $sTargetClass);	
-	break;
-
-	// ui.autocompletewidget
-	case 'objectCreationForm':
-	$sTargetClass = utils::ReadParam('sRemoteClass', '');
-	$sAttCode = utils::ReadParam('sAttCode', '');
-	$iInputId = utils::ReadParam('iInputId', '');
-	$sSuffix = utils::ReadParam('sSuffix', '');
-	$sJson = utils::ReadParam('json', '');
-	$oWizardHelper = WizardHelper::FromJSON($sJson);
-	$oObj = $oWizardHelper->GetTargetObject();
-	$aAllowedValues = MetaModel::GetAllowedValues_att($sClass, $sAttCode, array('this' => $oObj));
-	$oWidget = new UIAutocompleteWidget($sAttCode, $sClass, '', $aAllowedValues, $oObj->Get($sAttCode), $iInputId, $sSuffix, '');
-	$oWidget->GetObjectCreationForm($oPage);
-	break;
+	require_once(APPROOT.'/application/startup.inc.php');
+	require_once(APPROOT.'/application/user.preferences.class.inc.php');
 	
-	// ui.autocompletewidget
-	case 'doCreateObject':
-	$sTargetClass = utils::ReadParam('sRemoteClass', '');
-	$sAttCode = utils::ReadParam('sAttCode', '');
-	$iInputId = utils::ReadParam('iInputId', '');
-	$sSuffix = utils::ReadParam('sSuffix', '');
-	$sJson = utils::ReadParam('json', '');
-	$oWizardHelper = WizardHelper::FromJSON($sJson);
-	$oObj = $oWizardHelper->GetTargetObject();
-	$aAllowedValues = MetaModel::GetAllowedValues_att($sClass, $sAttCode, array('this' => $oObj));
-	// The iInputId of the autocomplete is the prefix for the form used to create the target object
-	$oWidget = new UIAutocompleteWidget($sAttCode, $sClass, '', $aAllowedValues, null, $iInputId, $sSuffix, $oWizardHelper->GetFormPrefix());
-	$aResult = $oWidget->DoCreateObject($oPage);
-	echo json_encode($aResult);	
-	break;
+	require_once(APPROOT.'/application/loginwebpage.class.inc.php');
+	LoginWebPage::DoLogin(false /* bMustBeAdmin */, true /* IsAllowedToPortalUsers */); // Check user rights and prompt if needed
 	
-	// ui.autocompletewidget
-	case 'getObjectName':
-	$sTargetClass = utils::ReadParam('sTargetClass', '');
-	$sAttCode = utils::ReadParam('sAttCode', '');
-	$iInputId = utils::ReadParam('iInputId', '');
-	$iObjectId = utils::ReadParam('iObjectId', '');
-	$sSuffix = utils::ReadParam('sSuffix', '');
-	$oWidget = new UIAutocompleteWidget($sAttCode, $sClass, '', array(), '', $iInputId, $sSuffix, '');
-	$sName = $oWidget->GetObjectName($iObjectId);
-	echo json_encode(array('name' => $sName));	
-	break;
+	$oPage = new ajax_page("");
+	$oPage->no_cache();
 	
-	// ui.linkswidget
-	case 'doAddObjects':
-	$sAttCode = utils::ReadParam('sAttCode', '');
-	$iInputId = utils::ReadParam('iInputId', '');
-	$sSuffix = utils::ReadParam('sSuffix', '');
-	$bDuplicates = (utils::ReadParam('bDuplicates', 'false') == 'false') ? false : true;
-	$aLinkedObjectIds = utils::ReadParam('selectObject', array());
-	$oWidget = new UILinksWidget($sClass, $sAttCode, $iInputId, $sSuffix, $bDuplicates);
-	$oWidget->DoAddObjects($oPage, $aLinkedObjectIds);	
-	break;
+	$operation = utils::ReadParam('operation', '');
+	$sFilter = stripslashes(utils::ReadParam('filter', ''));
+	$sEncoding = utils::ReadParam('encoding', 'serialize');
+	$sClass = utils::ReadParam('class', 'MissingAjaxParam');
+	$sStyle = utils::ReadParam('style', 'list');
+
+	switch($operation)
+	{
+		case 'addObjects':
+		require_once(APPROOT.'/application/uilinkswizard.class.inc.php');
+		$sClass = utils::ReadParam('class', '', 'get');
+		$sLinkedClass = utils::ReadParam('linkedClass', '');
+		$sLinkageAttr = utils::ReadParam('linkageAttr', '');
+		$iObjectId = utils::ReadParam('objectId', '');
+		$oLinksWizard = new UILinksWizard($sClass,  $sLinkageAttr, $iObjectId, $sLinkedClass);
+		$oLinksWizard->DisplayAddForm($oPage);
+		break;
+		
+		// ui.linkswidget
+		case 'searchObjectsToAdd':
+		$sRemoteClass = utils::ReadParam('sRemoteClass', '');
+		$sAttCode = utils::ReadParam('sAttCode', '');
+		$iInputId = utils::ReadParam('iInputId', '');
+		$sSuffix = utils::ReadParam('sSuffix', '');
+		$bDuplicates = (utils::ReadParam('bDuplicates', 'false') == 'false') ? false : true;
+		$aAlreadyLinked = utils::ReadParam('aAlreadyLinked', array());
+		$oWidget = new UILinksWidget($sClass, $sAttCode, $iInputId, $sSuffix, $bDuplicates);
+		$oWidget->SearchObjectsToAdd($oPage, $sRemoteClass, $aAlreadyLinked);	
+		break;
 		
-	case 'wizard_helper_preview':
-	$sJson = utils::ReadParam('json_obj', '');
-	$oWizardHelper = WizardHelper::FromJSON($sJson);
-	$oObj = $oWizardHelper->GetTargetObject();
-	$oObj->DisplayBareProperties($oPage); 
-	break;
+		// ui.autocompletewidget
+		case 'searchObjectsToSelect':
+		$sTargetClass = utils::ReadParam('sRemoteClass', '');
+		$sAttCode = utils::ReadParam('sAttCode', '');
+		$iInputId = utils::ReadParam('iInputId', '');
+		$sSuffix = utils::ReadParam('sSuffix', '');
+		$sJson = utils::ReadParam('json', '');
+		$oWizardHelper = WizardHelper::FromJSON($sJson);
+		$oObj = $oWizardHelper->GetTargetObject();
+		$aAllowedValues = MetaModel::GetAllowedValues_att($sClass, $sAttCode, array('this' => $oObj));
+		$oWidget = new UIAutocompleteWidget($sAttCode, $sClass, '', $aAllowedValues, $oObj->Get($sAttCode), $iInputId, $sSuffix, '');
+		$oWidget->SearchObjectsToSelect($oPage, $sTargetClass);	
+		break;
 	
-	case 'wizard_helper':
-	$sJson = utils::ReadParam('json_obj', '');
-	$oWizardHelper = WizardHelper::FromJSON($sJson);
-	$oObj = $oWizardHelper->GetTargetObject(); 
-	$sClass = $oWizardHelper->GetTargetClass();
-	foreach($oWizardHelper->GetFieldsForDefaultValue() as $sAttCode)
-	{
-		$oAttDef = MetaModel::GetAttributeDef($sClass, $sAttCode);
-		$defaultValue = $oAttDef->GetDefaultValue();
-		$oWizardHelper->SetDefaultValue($sAttCode, $defaultValue);
-		$oObj->Set($sAttCode, $defaultValue);
-	}
-	$sFormPrefix = $oWizardHelper->GetFormPrefix();
-	foreach($oWizardHelper->GetFieldsForAllowedValues() as $sAttCode)
-	{
-		$sId = $oWizardHelper->GetIdForField($sAttCode);
-		if ($sId != '')
+		// ui.autocompletewidget
+		case 'objectCreationForm':
+		$sTargetClass = utils::ReadParam('sRemoteClass', '');
+		$sAttCode = utils::ReadParam('sAttCode', '');
+		$iInputId = utils::ReadParam('iInputId', '');
+		$sSuffix = utils::ReadParam('sSuffix', '');
+		$sJson = utils::ReadParam('json', '');
+		$oWizardHelper = WizardHelper::FromJSON($sJson);
+		$oObj = $oWizardHelper->GetTargetObject();
+		$aAllowedValues = MetaModel::GetAllowedValues_att($sClass, $sAttCode, array('this' => $oObj));
+		$oWidget = new UIAutocompleteWidget($sAttCode, $sClass, '', $aAllowedValues, $oObj->Get($sAttCode), $iInputId, $sSuffix, '');
+		$oWidget->GetObjectCreationForm($oPage);
+		break;
+		
+		// ui.autocompletewidget
+		case 'doCreateObject':
+		$sTargetClass = utils::ReadParam('sRemoteClass', '');
+		$sAttCode = utils::ReadParam('sAttCode', '');
+		$iInputId = utils::ReadParam('iInputId', '');
+		$sSuffix = utils::ReadParam('sSuffix', '');
+		$sJson = utils::ReadParam('json', '');
+		$oWizardHelper = WizardHelper::FromJSON($sJson);
+		$oObj = $oWizardHelper->GetTargetObject();
+		$aAllowedValues = MetaModel::GetAllowedValues_att($sClass, $sAttCode, array('this' => $oObj));
+		// The iInputId of the autocomplete is the prefix for the form used to create the target object
+		$oWidget = new UIAutocompleteWidget($sAttCode, $sClass, '', $aAllowedValues, null, $iInputId, $sSuffix, $oWizardHelper->GetFormPrefix());
+		$aResult = $oWidget->DoCreateObject($oPage);
+		echo json_encode($aResult);	
+		break;
+		
+		// ui.autocompletewidget
+		case 'getObjectName':
+		$sTargetClass = utils::ReadParam('sTargetClass', '');
+		$sAttCode = utils::ReadParam('sAttCode', '');
+		$iInputId = utils::ReadParam('iInputId', '');
+		$iObjectId = utils::ReadParam('iObjectId', '');
+		$sSuffix = utils::ReadParam('sSuffix', '');
+		$oWidget = new UIAutocompleteWidget($sAttCode, $sClass, '', array(), '', $iInputId, $sSuffix, '');
+		$sName = $oWidget->GetObjectName($iObjectId);
+		echo json_encode(array('name' => $sName));	
+		break;
+		
+		// ui.linkswidget
+		case 'doAddObjects':
+		$sAttCode = utils::ReadParam('sAttCode', '');
+		$iInputId = utils::ReadParam('iInputId', '');
+		$sSuffix = utils::ReadParam('sSuffix', '');
+		$bDuplicates = (utils::ReadParam('bDuplicates', 'false') == 'false') ? false : true;
+		$aLinkedObjectIds = utils::ReadParam('selectObject', array());
+		$oWidget = new UILinksWidget($sClass, $sAttCode, $iInputId, $sSuffix, $bDuplicates);
+		$oWidget->DoAddObjects($oPage, $aLinkedObjectIds);	
+		break;
+			
+		case 'wizard_helper_preview':
+		$sJson = utils::ReadParam('json_obj', '');
+		$oWizardHelper = WizardHelper::FromJSON($sJson);
+		$oObj = $oWizardHelper->GetTargetObject();
+		$oObj->DisplayBareProperties($oPage); 
+		break;
+		
+		case 'wizard_helper':
+		$sJson = utils::ReadParam('json_obj', '');
+		$oWizardHelper = WizardHelper::FromJSON($sJson);
+		$oObj = $oWizardHelper->GetTargetObject(); 
+		$sClass = $oWizardHelper->GetTargetClass();
+		foreach($oWizardHelper->GetFieldsForDefaultValue() as $sAttCode)
 		{
-			// It may happen that the field we'd like to update does not
-			// exist in the form. For example, if the field should be hidden/read-only
-			// in the current state of the object
-			$value = $oObj->Get($sAttCode);
-			$displayValue = $oObj->GetEditValue($sAttCode);
 			$oAttDef = MetaModel::GetAttributeDef($sClass, $sAttCode);
-			$iFlags = MetaModel::GetAttributeFlags($sClass, $oObj->GetState(), $sAttCode);
-			$sHTMLValue = cmdbAbstractObject::GetFormElementForField($oPage, $sClass, $sAttCode, $oAttDef, $value, $displayValue, $sId, '', $iFlags, array('this' => $oObj, 'formPrefix' => $sFormPrefix));
-			// Make sure that we immediatly validate the field when we reload it
-			$oPage->add_ready_script("$('#$sId').trigger('validate');");
-			$oWizardHelper->SetAllowedValuesHtml($sAttCode, $sHTMLValue);
+			$defaultValue = $oAttDef->GetDefaultValue();
+			$oWizardHelper->SetDefaultValue($sAttCode, $defaultValue);
+			$oObj->Set($sAttCode, $defaultValue);
 		}
-	}
-	$oPage->add_script("oWizardHelper{$sFormPrefix}.m_oData=".$oWizardHelper->ToJSON().";\noWizardHelper{$sFormPrefix}.UpdateFields();\n");
-	break;
-		
-	case 'ajax':
-	if ($sFilter != "")
-	{
-		$sExtraParams = stripslashes(utils::ReadParam('extra_params', ''));
-		$aExtraParams = array();
-		if (!empty($sExtraParams))
+		$sFormPrefix = $oWizardHelper->GetFormPrefix();
+		foreach($oWizardHelper->GetFieldsForAllowedValues() as $sAttCode)
 		{
-			$aExtraParams = json_decode(str_replace("'", '"', $sExtraParams), true /* associative array */);
+			$sId = $oWizardHelper->GetIdForField($sAttCode);
+			if ($sId != '')
+			{
+				// It may happen that the field we'd like to update does not
+				// exist in the form. For example, if the field should be hidden/read-only
+				// in the current state of the object
+				$value = $oObj->Get($sAttCode);
+				$displayValue = $oObj->GetEditValue($sAttCode);
+				$oAttDef = MetaModel::GetAttributeDef($sClass, $sAttCode);
+				$iFlags = MetaModel::GetAttributeFlags($sClass, $oObj->GetState(), $sAttCode);
+				$sHTMLValue = cmdbAbstractObject::GetFormElementForField($oPage, $sClass, $sAttCode, $oAttDef, $value, $displayValue, $sId, '', $iFlags, array('this' => $oObj, 'formPrefix' => $sFormPrefix));
+				// Make sure that we immediatly validate the field when we reload it
+				$oPage->add_ready_script("$('#$sId').trigger('validate');");
+				$oWizardHelper->SetAllowedValuesHtml($sAttCode, $sHTMLValue);
+			}
 		}
-		if ($sEncoding == 'oql')
+		$oPage->add_script("oWizardHelper{$sFormPrefix}.m_oData=".$oWizardHelper->ToJSON().";\noWizardHelper{$sFormPrefix}.UpdateFields();\n");
+		break;
+			
+		case 'ajax':
+		if ($sFilter != "")
 		{
-			$oFilter = CMDBSearchFilter::FromOQL($sFilter);
+			$sExtraParams = stripslashes(utils::ReadParam('extra_params', ''));
+			$aExtraParams = array();
+			if (!empty($sExtraParams))
+			{
+				$aExtraParams = json_decode(str_replace("'", '"', $sExtraParams), true /* associative array */);
+			}
+			if ($sEncoding == 'oql')
+			{
+				$oFilter = CMDBSearchFilter::FromOQL($sFilter);
+			}
+			else
+			{
+				$oFilter = CMDBSearchFilter::unserialize($sFilter);
+			}
+			$oDisplayBlock = new DisplayBlock($oFilter, $sStyle, false);
+			$oDisplayBlock->RenderContent($oPage, $aExtraParams);
 		}
 		else
 		{
-			$oFilter = CMDBSearchFilter::unserialize($sFilter);
+			$oPage->p("Invalid query (empty filter).");
 		}
-		$oDisplayBlock = new DisplayBlock($oFilter, $sStyle, false);
-		$oDisplayBlock->RenderContent($oPage, $aExtraParams);
-	}
-	else
-	{
-		$oPage->p("Invalid query (empty filter).");
-	}
-	break;
-	
-	case 'details':
-	$key = utils::ReadParam('id', 0);
-	$oFilter = new DBObjectSearch($sClass);
-	$oFilter->AddCondition('id', $key, '=');
-	$oDisplayBlock = new DisplayBlock($oFilter, 'details', false);
-	$oDisplayBlock->RenderContent($oPage);
-	break;
-	
-	case 'preview':
-	$key = utils::ReadParam('id', 0);
-	$oFilter = new DBObjectSearch($sClass);
-	$oFilter->AddCondition('id', $key, '=');
-	$oDisplayBlock = new DisplayBlock($oFilter, 'preview', false);
-	$oDisplayBlock->RenderContent($oPage);
-	break;
-	
-	case 'pie_chart':
-	$sGroupBy = utils::ReadParam('group_by', '');
-	if ($sFilter != '')
-	{
-		if ($sEncoding == 'oql')
+		break;
+		
+		case 'details':
+		$key = utils::ReadParam('id', 0);
+		$oFilter = new DBObjectSearch($sClass);
+		$oFilter->AddCondition('id', $key, '=');
+		$oDisplayBlock = new DisplayBlock($oFilter, 'details', false);
+		$oDisplayBlock->RenderContent($oPage);
+		break;
+		
+		case 'preview':
+		$key = utils::ReadParam('id', 0);
+		$oFilter = new DBObjectSearch($sClass);
+		$oFilter->AddCondition('id', $key, '=');
+		$oDisplayBlock = new DisplayBlock($oFilter, 'preview', false);
+		$oDisplayBlock->RenderContent($oPage);
+		break;
+		
+		case 'pie_chart':
+		$sGroupBy = utils::ReadParam('group_by', '');
+		if ($sFilter != '')
 		{
-			$oFilter = CMDBSearchFilter::FromOQL($sFilter);
+			if ($sEncoding == 'oql')
+			{
+				$oFilter = CMDBSearchFilter::FromOQL($sFilter);
+			}
+			else
+			{
+				$oFilter = CMDBSearchFilter::unserialize($sFilter);
+			}
+			$oDisplayBlock = new DisplayBlock($oFilter, 'pie_chart_ajax', false);
+			$oDisplayBlock->RenderContent($oPage, array('group_by' => $sGroupBy));
 		}
 		else
 		{
+		
+			$oPage->add("<chart>\n<chart_type>3d pie</chart_type><!-- empty filter '$sFilter' --></chart>\n.");
+		}
+		break;
+		
+		case 'open_flash_chart':
+		$aParams = utils::ReadParam('params', array());
+		if ($sFilter != '')
+		{
 			$oFilter = CMDBSearchFilter::unserialize($sFilter);
+			$oDisplayBlock = new DisplayBlock($oFilter, 'open_flash_chart_ajax', false);
+			$oDisplayBlock->RenderContent($oPage, $aParams);
 		}
-		$oDisplayBlock = new DisplayBlock($oFilter, 'pie_chart_ajax', false);
-		$oDisplayBlock->RenderContent($oPage, array('group_by' => $sGroupBy));
-	}
-	else
-	{
-	
-		$oPage->add("<chart>\n<chart_type>3d pie</chart_type><!-- empty filter '$sFilter' --></chart>\n.");
-	}
-	break;
-	
-	case 'open_flash_chart':
-	$aParams = utils::ReadParam('params', array());
-	if ($sFilter != '')
-	{
-		$oFilter = CMDBSearchFilter::unserialize($sFilter);
-		$oDisplayBlock = new DisplayBlock($oFilter, 'open_flash_chart_ajax', false);
-		$oDisplayBlock->RenderContent($oPage, $aParams);
-	}
-	else
-	{
-	
-		$oPage->add("<chart>\n<chart_type>3d pie</chart_type><!-- empty filter '$sFilter' --></chart>\n.");
-	}
-	break;
-
-	case 'modal_details':
-	$key = utils::ReadParam('id', 0);
-	$oFilter = new DBObjectSearch($sClass);
-	$oFilter->AddCondition('id', $key, '=');
-	$oPage->Add("<p style=\"width:100%; margin-top:-5px;padding:3px; background-color:#33f; color:#fff;\">Object Details</p>\n");
-	$oDisplayBlock = new DisplayBlock($oFilter, 'details', false);
-	$oDisplayBlock->RenderContent($oPage);
-	$oPage->Add("<input type=\"button\" class=\"jqmClose\" value=\" Close \" />\n");
-	break;
+		else
+		{
 		
-	case 'ui.linkswidget':
-	/*
-	$sClass = utils::ReadParam('sclass', 'bizContact');
-	$sAttCode = utils::ReadParam('attCode', 'name');
-	$sOrg = utils::ReadParam('org_id', '');
-	$sName = utils::ReadParam('q', '');
-	$iMaxCount = utils::ReadParam('max', 30);
-	UILinksWidget::Autocomplete($oPage, $sClass, $sAttCode, $sName, $iMaxCount);
-	*/
-	break;
-	
-	case 'ui.linkswidget.linkedset':
-	/*
-	$sClass = utils::ReadParam('sclass', 'bizContact');
-	$sJSONSet = stripslashes(utils::ReadParam('sset', ''));
-	$sExtKeyToMe = utils::ReadParam('sextkeytome', '');
-	$sExtKeyToRemote = utils::ReadParam('sextkeytoremote', '');
-	$iObjectId = utils::ReadParam('id', -1);
-	UILinksWidget::RenderSet($oPage, $sClass, $sJSONSet, $sExtKeyToMe, $sExtKeyToRemote, $iObjectId);
-	$iFieldId = utils::ReadParam('myid', '-1');
-	$oPage->add_ready_script("$('#{$iFieldId}').trigger('validate');");
-	*/
-	break;
+			$oPage->add("<chart>\n<chart_type>3d pie</chart_type><!-- empty filter '$sFilter' --></chart>\n.");
+		}
+		break;
 	
-	case 'autocomplete':
-	$key = utils::ReadParam('id', 0);
-	$sClass = utils::ReadParam('sclass', 'bizContact');
-	$sAttCode = utils::ReadParam('attCode', 'name');
-	$sOrg = utils::ReadParam('org_id', '');
-	$sName = utils::ReadParam('q', '');
-	$iMaxCount = utils::ReadParam('max', 30);
-	$aArgs = array();
-	if (!empty($key))
-	{
-		if ($oThis = MetaModel::GetObject($sClass, $key))
+		case 'modal_details':
+		$key = utils::ReadParam('id', 0);
+		$oFilter = new DBObjectSearch($sClass);
+		$oFilter->AddCondition('id', $key, '=');
+		$oPage->Add("<p style=\"width:100%; margin-top:-5px;padding:3px; background-color:#33f; color:#fff;\">Object Details</p>\n");
+		$oDisplayBlock = new DisplayBlock($oFilter, 'details', false);
+		$oDisplayBlock->RenderContent($oPage);
+		$oPage->Add("<input type=\"button\" class=\"jqmClose\" value=\" Close \" />\n");
+		break;
+			
+		case 'ui.linkswidget':
+		/*
+		$sClass = utils::ReadParam('sclass', 'bizContact');
+		$sAttCode = utils::ReadParam('attCode', 'name');
+		$sOrg = utils::ReadParam('org_id', '');
+		$sName = utils::ReadParam('q', '');
+		$iMaxCount = utils::ReadParam('max', 30);
+		UILinksWidget::Autocomplete($oPage, $sClass, $sAttCode, $sName, $iMaxCount);
+		*/
+		break;
+		
+		case 'ui.linkswidget.linkedset':
+		/*
+		$sClass = utils::ReadParam('sclass', 'bizContact');
+		$sJSONSet = stripslashes(utils::ReadParam('sset', ''));
+		$sExtKeyToMe = utils::ReadParam('sextkeytome', '');
+		$sExtKeyToRemote = utils::ReadParam('sextkeytoremote', '');
+		$iObjectId = utils::ReadParam('id', -1);
+		UILinksWidget::RenderSet($oPage, $sClass, $sJSONSet, $sExtKeyToMe, $sExtKeyToRemote, $iObjectId);
+		$iFieldId = utils::ReadParam('myid', '-1');
+		$oPage->add_ready_script("$('#{$iFieldId}').trigger('validate');");
+		*/
+		break;
+		
+		case 'autocomplete':
+		$key = utils::ReadParam('id', 0);
+		$sClass = utils::ReadParam('sclass', 'bizContact');
+		$sAttCode = utils::ReadParam('attCode', 'name');
+		$sOrg = utils::ReadParam('org_id', '');
+		$sName = utils::ReadParam('q', '');
+		$iMaxCount = utils::ReadParam('max', 30);
+		$aArgs = array();
+		if (!empty($key))
+		{
+			if ($oThis = MetaModel::GetObject($sClass, $key))
+			{
+				$aArgs['*this*'] = $oThis;
+				$aArgs['this'] = $oThis;
+			}
+		} 
+		$aAllowedValues = MetaModel::GetAllowedValues_att($sClass, $sAttCode, $aArgs, $sName);
+		$iCount = 0;
+		foreach($aAllowedValues as $key => $value)
 		{
-			$aArgs['*this*'] = $oThis;
-			$aArgs['this'] = $oThis;
+			$oPage->add($value."|".$key."\n");
 		}
-	} 
-	$aAllowedValues = MetaModel::GetAllowedValues_att($sClass, $sAttCode, $aArgs, $sName);
-	$iCount = 0;
-	foreach($aAllowedValues as $key => $value)
-	{
-		$oPage->add($value."|".$key."\n");
-	}
-	break;
-	
-	case 'link':
-	$sClass = utils::ReadParam('sclass', 'logInfra');
-	$sAttCode = utils::ReadParam('attCode', 'name');
-	//$sOrg = utils::ReadParam('org_id', '');
-	$sName = utils::ReadParam('q', '');
-	$iMaxCount = utils::ReadParam('max', 30);
-	$iCount = 0;
-	$oFilter = new DBObjectSearch($sClass);
-	$oFilter->AddCondition($sAttCode, $sName, 'Begins with');
-	//$oFilter->AddCondition('org_id', $sOrg, '=');
-	$oSet = new CMDBObjectSet($oFilter, array($sAttCode => true));
-	while( ($iCount < $iMaxCount) && ($oObj = $oSet->fetch()) )
-	{
-		$oPage->add($oObj->GetAsHTML($sAttCode)."|".$oObj->GetKey()."\n");
-		$iCount++;
-	}
-	break;
+		break;
+		
+		case 'link':
+		$sClass = utils::ReadParam('sclass', 'logInfra');
+		$sAttCode = utils::ReadParam('attCode', 'name');
+		//$sOrg = utils::ReadParam('org_id', '');
+		$sName = utils::ReadParam('q', '');
+		$iMaxCount = utils::ReadParam('max', 30);
+		$iCount = 0;
+		$oFilter = new DBObjectSearch($sClass);
+		$oFilter->AddCondition($sAttCode, $sName, 'Begins with');
+		//$oFilter->AddCondition('org_id', $sOrg, '=');
+		$oSet = new CMDBObjectSet($oFilter, array($sAttCode => true));
+		while( ($iCount < $iMaxCount) && ($oObj = $oSet->fetch()) )
+		{
+			$oPage->add($oObj->GetAsHTML($sAttCode)."|".$oObj->GetKey()."\n");
+			$iCount++;
+		}
+		break;
+		
+		case 'create':
+			case 'create_menu':
+			$sClass = utils::ReadParam('class', '');
+			$sFilter = utils::ReadParam('filter', '');
+			menuNode::DisplayCreationForm($oPage, $sClass, $sFilter);
+		break;
 	
-	case 'create':
-		case 'create_menu':
-		$sClass = utils::ReadParam('class', '');
-		$sFilter = utils::ReadParam('filter', '');
-		menuNode::DisplayCreationForm($oPage, $sClass, $sFilter);
-	break;
-
-	case 'combo_options':
-	$oFilter = CMDBSearchFilter::FromOQL($sFilter);
-	$oSet = new CMDBObjectSet($oFilter);
-	while( $oObj = $oSet->fetch())
-	{
-		$oPage->add('<option title="Here is more information..." value="'.$oObj->GetKey().'">'.$oObj->GetName().'</option>');
-	}
-	break;
+		case 'combo_options':
+		$oFilter = CMDBSearchFilter::FromOQL($sFilter);
+		$oSet = new CMDBObjectSet($oFilter);
+		while( $oObj = $oSet->fetch())
+		{
+			$oPage->add('<option title="Here is more information..." value="'.$oObj->GetKey().'">'.$oObj->GetName().'</option>');
+		}
+		break;
+		
+		case 'display_document':
+		$id = utils::ReadParam('id', '');
+		$sField = utils::ReadParam('field', '');
+		if (!empty($sClass) && !empty($id) && !empty($sField))
+		{
+			DownloadDocument($oPage, $sClass, $id, $sField, 'inline');
+		}
+		break;
+		
+		case 'download_document':
+		$id = utils::ReadParam('id', '');
+		$sField = utils::ReadParam('field', '');
+		if (!empty($sClass) && !empty($id) && !empty($sField))
+		{
+			DownloadDocument($oPage, $sClass, $id, $sField, 'attachement');
+		}
+		break;
+		
+		case 'search_form':
+		$sClass = utils::ReadParam('className', '');
+		$sRootClass = utils::ReadParam('baseClass', '');
+		$currentId = utils::ReadParam('currentId', '');
+		$oFilter = new DBObjectSearch($sClass);
+		$oSet = new CMDBObjectSet($oFilter); 
+		$sHtml = cmdbAbstractObject::GetSearchForm($oPage, $oSet, array('currentId' => $currentId, 'baseClass' => $sRootClass));
+		$oPage->add($sHtml);
+		break;
+		
+		case 'set_pref':
+		$sCode = utils::ReadPostedParam('code', '');
+		$sValue = utils::ReadPostedParam('value', '');
+		appUserPreferences::SetPref($sCode, $sValue);
+		break;
 	
-	case 'display_document':
-	$id = utils::ReadParam('id', '');
-	$sField = utils::ReadParam('field', '');
-	if (!empty($sClass) && !empty($id) && !empty($sField))
-	{
-		DownloadDocument($oPage, $sClass, $id, $sField, 'inline');
-	}
-	break;
+		case 'erase_all_pref':
+		// Can be useful in case a user got some corrupted prefs...
+		appUserPreferences::ClearPreferences();
+		break;
 	
-	case 'download_document':
-	$id = utils::ReadParam('id', '');
-	$sField = utils::ReadParam('field', '');
-	if (!empty($sClass) && !empty($id) && !empty($sField))
-	{
-		DownloadDocument($oPage, $sClass, $id, $sField, 'attachement');
+		default:
+		$oPage->p("Invalid query.");
 	}
-	break;
-	
-	case 'search_form':
-	$sClass = utils::ReadParam('className', '');
-	$sRootClass = utils::ReadParam('baseClass', '');
-	$currentId = utils::ReadParam('currentId', '');
-	$oFilter = new DBObjectSearch($sClass);
-	$oSet = new CMDBObjectSet($oFilter); 
-	$sHtml = cmdbAbstractObject::GetSearchForm($oPage, $oSet, array('currentId' => $currentId, 'baseClass' => $sRootClass));
-	$oPage->add($sHtml);
-	break;
-	
-	case 'set_pref':
-	$sCode = utils::ReadPostedParam('code', '');
-	$sValue = utils::ReadPostedParam('value', '');
-	appUserPreferences::SetPref($sCode, $sValue);
-	break;
-
-	case 'erase_all_pref':
-	// Can be useful in case a user got some corrupted prefs...
-	appUserPreferences::ClearPreferences();
-	break;
 
-	default:
-	$oPage->p("Invalid query.");
+	$oPage->output();
+}
+catch (Exception $e)
+{
+	IssueLog::Error($e->getMessage());
 }
-$oPage->output();
+
+
 
 /**
  * Downloads a document to the browser, either as 'inline' or 'attachment'