<?php
// $Header: /cvsroot/phpldapadmin/phpldapadmin/htdocs/add_value_form.php,v 1.39.2.6 2008/12/12 12:20:22 wurley Exp $

/**
 * Displays a form to allow the user to enter a new value to add
 * to the existing list of values for a multi-valued attribute.
 *
 * @package phpLDAPadmin
 */
/**
 */

require './common.php';

if ($ldapserver->isReadOnly())
	error(_('You cannot perform updates while server is in read-only mode'),'error','index.php');

# The DN and ATTR we are working with.
$entry = array();
$entry['dn']['encode'] = get_request('dn','GET',true);
$entry['dn']['string'] = urldecode($entry['dn']['encode']);
$entry['dn']['html'] = htmlspecialchars($entry['dn']['string']);
$entry['attr']['string'] = get_request('attr','GET',true);
$entry['attr']['encode'] = rawurlencode($entry['attr']['string']);
$entry['attr']['html'] = htmlspecialchars($entry['attr']['string']);

if (! is_null($entry['dn']['string']))
	$entry['rdn']['string'] = get_rdn($entry['dn']['string']);
else
	$entry['rdn']['string'] = null;
$entry['rdn']['html'] = htmlspecialchars($entry['rdn']['string']);

/***************/
/* get entry   */ 
/***************/
	
if (! $entry['dn']['string'] || ! $ldapserver->dnExists($entry['dn']['string']))
	error(sprintf(_('The entry (%s) does not exist.'),$entry['dn']['html']),'error','index.php');

$tree = get_cached_item($ldapserver->server_id,'tree');
$entry['ldap'] = null;
if ($tree) {
	$entry['ldap'] = $tree->getEntry($entry['dn']['string']);

	if (! $entry['ldap'])
		$tree->addEntry($entry['dn']['string']);

	$entry['ldap'] = $tree->getEntry($entry['dn']['string']);
}

# Define the template of the entry if possible
eval('$reader = new '.$_SESSION[APPCONFIG]->GetValue('appearance','entry_reader').'($ldapserver);');
$reader->visit('Start', $entry['ldap']);

if (! $entry['ldap'] || $entry['ldap']->isReadOnly())
	error(sprintf(_('The entry (%s) is in readonly mode.'),$entry['dn']['html']),'error','index.php');

/*********************/
/* attribute values  */ 
/*********************/

eval('$writer = new '.$_SESSION[APPCONFIG]->GetValue('appearance','entry_writer').'($ldapserver);');

$ldap['attr'] = $entry['ldap']->getAttribute($entry['attr']['string']);
if (!$ldap['attr']) {
	# Define a new attribute for the entry
	$attributefactoryclass = $_SESSION[APPCONFIG]->GetValue('appearance','attribute_factory');
	eval('$attribute_factory = new '.$attributefactoryclass.'();');
	$ldap['attr'] = $attribute_factory->newAttribute($entry['attr']['string'], array());
	$ldap['attr']->setEntry($entry['ldap']);
}
$ldap['count'] = $ldap['attr']->getValueCount();

if ($ldap['attr']->isReadOnly())
	error(sprintf(_('The attribute (%s) is in readonly mode.'),$entry['attr']['html']),'error','index.php');

if (! $_SESSION[APPCONFIG]->isCommandAvailable('attribute_add_value'))
	error(sprintf('%s%s %s',_('This operation is not permitted by the configuration'),_(':'),_('add attribute value')),'error','index.php');

if (($ldap['attr']->getValueCount() == 0) && ! $_SESSION[APPCONFIG]->isCommandAvailable('attribute_add'))
	error(sprintf('%s%s %s',_('This operation is not permitted by the configuration'),_(':'),_('add attribute')),'error','index.php');

$entry['attr']['oclass'] = (strcasecmp($entry['attr']['string'],'objectClass') == 0) ? true : false;

if ($entry['attr']['oclass']) {
	# Fetch all available objectClasses and remove those from the list that are already defined in the entry
	$ldap['oclasses'] = $ldapserver->SchemaObjectClasses();

	foreach($ldap['attr']->getValues() as $oclass)
		unset($ldap['oclasses'][strtolower($oclass)]);
} else {
	$ldap['schema'] = $ldapserver->getSchemaAttribute($entry['attr']['string']);
}

printf('<h3 class="title">%s <b>%s</b> %s <b>%s</b></h3>',
	_('Add new'),$entry['attr']['html'],_('value to'),$entry['rdn']['html']);
printf('<h3 class="subtitle">%s <b>%s</b> &nbsp;&nbsp;&nbsp; %s: <b>%s</b></h3>',
	_('Server'),$ldapserver->name,_('Distinguished Name'),$entry['dn']['html']);

if ($entry['attr']['oclass']) {
	echo '<form action="cmd.php" method="post" class="new_value" name="entry_form">';
	echo '<input type="hidden" name="cmd" value="add_oclass_form" />';
} else {
	echo '<form action="cmd.php" method="post" class="new_value" name="entry_form" enctype="multipart/form-data" onSubmit="return submitForm(this)">';
	echo '<input type="hidden" name="cmd" value="update_confirm" />';
}
printf('<input type="hidden" name="server_id" value="%s" />',$ldapserver->server_id);
printf('<input type="hidden" name="dn" value="%s" />',$entry['dn']['encode']);

echo '<center>';
echo '<table class="forminput" border=0>';
echo '<tr>';
if ($ldap['count']) {
	printf('<td class="top">%s <b>%s</b> %s <b>%s</b>%s</td>',
		_('Current list of'),$ldap['count'],_('values for attribute'),$ldap['attr']->getFriendlyName(),_(':'));
} else {
	printf('<td>%s <b>%s</b>.</td>',
		_('No current value for attribute'),$ldap['attr']->getFriendlyName());
}

echo '<td>';
if ($ldap['count']) {
	# Display current attribute values
	echo '<table border=0><tr><td>';
	for ($i = 0; $i < $ldap['count']; $i++) {
		$writer->draw('OldValue', $ldap['attr'], $i);
		$writer->draw('ReadOnlyValue', $ldap['attr'], $i);
	}
	echo '</td></tr></table>';

} else {
	echo '<br /><br />';
}
echo '</td>';
echo '</tr>';

echo '<tr>';
printf('<td class="top">%s</td>',_('Enter the value you would like to add:'));
echo '<td>';

if ($entry['attr']['oclass']) {
	# Draw objectClass selection
	echo '<table border=0><tr><td>';
	echo '<select name="new_oclass[]" multiple="true" size="15">';
	foreach ($ldap['oclasses'] as $name => $oclass) {
		# exclude any structural ones, as they'll only generate an LDAP_OBJECT_CLASS_VIOLATION
		if ($oclass->getType() == 'structural')
			continue; 

		printf('<option value="%s">%s</option>',$oclass->getName(),$oclass->getName());
	}
	echo '</select>';
	echo '</td></tr><tr><td>';

	echo '<br />';
	printf('<input id="save_button" type="submit" value="%s" />',_('Add new ObjectClass'));
	echo '</td></tr></table>';
	echo '</td>';
	echo '</tr>';

	if ($_SESSION[APPCONFIG]->GetValue('appearance','show_hints'))
		printf('<tr><td colspan=2><small><br /><img src="%s/light.png" alt="Hint" /><span class="hint">%s</span></small></td></tr>',
			IMGDIR,_('Note: You may be required to enter new attributes that these objectClass(es) require'));
	echo '</table>';
	echo '</center>';
	echo '</form>';

} else {
	# Draw a blank field
	echo '<table border=0><tr><td>';
	$writer->draw('BlankValue',$ldap['attr'],$ldap['count'],$reader);
	echo '</td></tr><tr><td>';

	if ($ldap['schema']->getDescription())
		printf('<small><b>%s:</b> %s</small><br />',_('Description'),$ldap['schema']->getDescription());

	if ($ldap['schema']->getType())
		printf('<small><b>%s:</b> %s</small><br />',_('Syntax'),$ldap['schema']->getType());

	if ($ldap['schema']->getMaxLength())
		printf('<small><b>%s:</b> %s %s</small><br />',
			_('Maximum Length'),number_format($ldap['schema']->getMaxLength()),_('characters'));

	echo '<br />';
	printf('<input type="submit" id="save_button" name="submit" value="%s" />',_('Add New Value'));
	echo '</td></tr></table>';

	echo '</td></tr>';
	echo '</table>';
	echo '</center>';
	echo '</form>';

	# Javascript
	echo '<script type="text/javascript" language="javascript">
	      function pla_getComponentById(id) {
		  return document.getElementById(id);
	      }

	      function pla_getComponentsByName(name) {
		 return document.getElementsByName(name);
	      }

	      function pla_getComponentValue(component) {
		  if (component.type == "checkbox") {
		      if (component.checked) return component.value;
		  } else if (component.type == "select-one") {
		      if (component.selectedIndex >= 0) return component.options[component.selectedIndex].value;
		  } else if (component.type == "select-multiple") {
		      if (component.selectedIndex >= 0) return component.options[component.selectedIndex].value;
		  } else if (component.type == undefined) { // option
		      if (component.selected) return component.value;
		  } else {
		      return component.value;
		  }
		  return "";
	      }

	      function pla_setComponentValue(component, value) {
		  if (component.type == "checkbox") {
		      if (component.value == value) component.checked = true;
		      else component.checked = false;
		  } else if (component.type == "select-one") {
		      for (var i = 0; i < component.options.length; i++) {
			  if (component.options[i].value == value) component.options[i].selected = true;
		      }
		  } else if (component.type == "select-multiple") {
		      for (var i = 0; i < component.options.length; i++) {
			  if (component.options[i].value == value) component.options[i].selected = true;
		      }
		  } else if (component.type == undefined) { // option
		      if (component.value == value) component.selected = true;
		      else component.selected = false;
		  } else { // text, textarea
		      component.value = value;
		  }
	      }</script>';

	echo '<script type="text/javascript" language="javascript">
	      function getAttributeComponents(prefix, name) {
	          var components = new Array();
		  var i = 0;
	          var j = 0;
	          var c = pla_getComponentsByName(prefix + "_values[" + name + "][" + j + "]");
	          while (c && (c.length > 0)) {
	              for (var k = 0; k < c.length; k++) {
			  components[i++] = c[k];
	              }
	              ++j;
	              c = pla_getComponentsByName(prefix + "_values[" + name + "][" + j + "]");
	          }
		  c = pla_getComponentsByName(prefix + "_values[" + name + "][]");
	          if (c && (c.length > 0)) {
	              for (var k = 0; k < c.length; k++) {
			  components[i++] = c[k];
	              }
	          }
		  return components;
              }
	      function getAttributeValues(prefix, name) {
		  var components = getAttributeComponents(prefix, name);
	          var values = new Array();
	          for (var k = 0; k < components.length; k++) {
	              var val = pla_getComponentValue(components[k]);
	              if (val) values[values.length] = val;
	          }
		  return values;
              }</script>';

	echo '<script type="text/javascript" language="javascript">
	      function validateForm(silence) {
		  var i = 0;
		  var valid = true;
		  var components = null;
	          components = getAttributeComponents("new", "'.$ldap['attr']->getName().'");
	          for (i = 0; i < components.length; i++) {
	              if (window.validate_'.$ldap['attr']->getName().') {
	                  valid = (!validate_'.$ldap['attr']->getName().'(components[i], silence) || !valid) ? false : true;
	              }
	          }
	          return valid;
	      }
	      </script>';

	echo '<script type="text/javascript" language="javascript">
	      function submitForm(form) {
	          for (var i = 0; i < form.elements.length; i++) {
	              form.elements[i].blur();
	          }
		  return validateForm(true);
	      }
	      function alertError(err, silence) {
	          if (!silence) alert(err);
	      }
	      </script>';

	echo '<script type="text/javascript" language="javascript">
		var attrTrace;
		function fill(id, value) {
			attrTrace = new Array();
			fillRec(id, value);
		}
		function fillRec(id, value) {
			if (attrTrace[id] == 1) {
				return;
			} else {
				var pre = "";
				var suf = "";
				var i;
				attrTrace[id] = 1;
				pla_setComponentValue(pla_getComponentById(id), value);
				// here comes template-specific implementation, generated by php
				if (false) {}';
	$attr = $ldap['attr']->getName();
	echo "\t\t\telse if ((i = id.indexOf('_".$attr."_')) >= 0) {\n";
	echo "\t\t\t\tpre = id.substring(0, i+1);\n";
	echo "\t\t\t\tsuf = id.substring(i + 1 + '$attr'.length, id.length);\n";
	$writer->draw('FillJavascript', $ldap['attr'], 'id', 'value');
	echo "\t\t\t}\n";
	echo '}}</script>';

	$writer->draw('Javascript', $ldap['attr']);

	echo '<script type="text/javascript" language="javascript">
	      validateForm(true);
	      </script>';
}
?>