", '');
		//else
		//	$edit_groups_link = sprintf(_ x('Note:  To assign roles to user groups, first %1$s define the group(s)%2$s.', 'Args are link open, close tags', 'scoper'), "", ' ');
		
		if ( in_array(ROLE_BASIS_GROUPS, $role_bases) && $agents[ROLE_BASIS_GROUPS] )
			$edit_groups_link = sprintf(__('%1$s define user groups%2$s', 'scoper'), "", ' ');
		else
			$edit_groups_link = sprintf(__('Note:  To assign roles to user groups, first %1$s define the group(s)%2$s.', 'scoper'), "", ' ');
		
			
		foreach ( $role_bases as $role_basis ) {
			echo "
";
			ScoperAgentsChecklist::agents_checklist($role_basis, $agents[$role_basis], $role_basis, array(), $args);
			
			if ( ROLE_BASIS_GROUPS == $role_basis )
				echo $edit_groups_link;
				
			echo "
";
		}
		
		if ( ! in_array(ROLE_BASIS_GROUPS, $role_bases) )
			echo "$edit_groups_link
";
	}
	
	function agents_checklist( $role_basis, $all_agents, $id_prefix = '', $stored_assignments = '', $args = array()) {
		if ( empty($all_agents) && ! scoper_get_option("{$role_basis}_role_assignment_csv" ) )
			return;
		$key = array();
		$action_links = array();
		
		// list current selections on top first
		if ( $stored_assignments ) {
			ScoperAgentsChecklist::_agents_checklist_display( CURRENT_ITEMS_RS, $role_basis, $all_agents, $id_prefix, $stored_assignments, $args, $key, $action_links); 
			if ( ! empty( $GLOBALS['is_IE'] ) )
				echo ' 
';
		}
			
		ScoperAgentsChecklist::_agents_checklist_display( ELIGIBLE_ITEMS_RS, $role_basis, $all_agents, $id_prefix, $stored_assignments, $args, $key, $action_links); 
		if ( ! empty( $GLOBALS['is_IE'] ) )
			echo ' 
';
		
		echo ' 
';
		
		if ( $action_links ) {
			echo "";
			echo( sprintf( __('Actions: %s', 'scoper'), implode('   ', $action_links) ) );
			echo '
';
		}
		
		if ( $key ) {
			if ( empty($args['suppress_extra_prefix']) )
				$id_prefix .= "_{$role_basis}";
			echo "";
			//echo( _ x('Key:', 'explanation of user/group role symbolic prefix/suffix', 'scoper') );
			echo( __('Key:', 'scoper') );	
			echo '
';
			echo ( implode('   ', $key) );
			echo '
' . $msg . ': 
';
		echo "' . $msg . ': 
';
			echo ""; // IE6 (at least) does not render label reliably without this
			echo "";
			printf ($caption, $agent_count[$agents_subset]);
			echo '  ';
			
			$class = ( $default_hide_filtered_list ) ? '' : 'class="agp_js_show"';
			
			echo "\r\n" . "  ";
			_e ( 'filter:', 'scoper');
			$js_call = "agp_filter_ul('list_{$agents_subset}_{$id_prefix}', this.value, 'chk_{$agents_subset}_{$id_prefix}', 'chk-links_{$agents_subset}_{$id_prefix}');";
			echo "   ";
			
			echo "";
		
			$js_call = "agp_check_by_name('{$id_prefix}[]', true, true, false, 'list_{$agents_subset}_{$id_prefix}', 1);";
			echo "\r\n" . "  " . "";
			_e ('select', 'scoper');
			echo '   ';
			
			$js_call = "agp_check_by_name('{$id_prefix}[]', '', true, false, 'list_{$agents_subset}_{$id_prefix}', 1);";
			echo "\r\n" . "";
			_e( 'unselect', 'scoper');
			echo " ";
				
			if ( $propagation ) {
				$js_call = "agp_check_by_name('p_{$id_prefix}[]', true, true, false, 'list_{$agents_subset}_{$id_prefix}', 1);";
				echo "\r\n" . "  " . "";
				_e ('propagate', 'scoper');
				echo '   ';
				
				$js_call = "agp_check_by_name('p_{$id_prefix}[]', '', true, false, 'list_{$agents_subset}_{$id_prefix}', 1);";
				echo "\r\n" . "";
				_e( 'unpropagate', 'scoper');
				echo " ";
			}
			
			echo ' ";
				if ( ROLE_BASIS_GROUPS == $role_basis )
					$caption = ( CURRENT_ITEMS_RS == $agents_subset ) ? __('current groups (%d):', 'scoper') : __('eligible groups (%d):', 'scoper');
				else
					$caption = ( CURRENT_ITEMS_RS == $agents_subset ) ? __('current users (%d):', 'scoper') : __('eligible users (%d):', 'scoper');
	
				printf ("$caption 
", $agent_count[$agents_subset]);
				echo ' "
				. "
"
				. "
";	
		} else {
			$ul_class = "rs-agents_list_auto";
			echo "\r\n";		
		}
		//-------- end list item width determination --------------
	
		$last_agents = array();
		$last_agents_prop = array();
		
		foreach( $all_agents as $agent ) {
			$id = $agent->ID;
			$agent_display_name = ( ( ROLE_BASIS_GROUPS == $role_basis ) && $agent->meta_id ) ? ScoperAdminLib::get_metagroup_name( $agent->meta_id ) : $agent->display_name;
			
			if ( is_array($for_entity_ids) )
				$role_assigned = isset($for_entity_ids[$id]) || isset($for_children_ids[$id]) ;
			else
				$role_assigned = isset($stored_assignments[$id]);
			
			switch ( $agents_subset ) {
				case CURRENT_ITEMS_RS:
					if ( ! $role_assigned ) continue 2;
					break;
				default: //ELIGIBLE_ITEMS_RS
					if ( $role_assigned ) continue 2;
					if ( $eligible_ids && ! isset($eligible_ids[$id] ) ) continue 2;
			}
			
			// markup for role duration / content date limits
			$title = '';			// we can't set the title because it's used by JS for onkey filtering
			$limit_class = '';
			$link_class = '';
			$limit_style = '';
			
			if ( isset( $stored_assignments[$id] ) )
				ScoperAdminUI::set_agent_formatting( $stored_assignments[$id], $title, $limit_class, $link_class, $limit_style );
			if ( $title ) {
				$any_date_limits = true;
				$label_title = " title='$title'";
			} else
				$label_title = '';
				
			$disabled = ( $locked_ids && isset($locked_ids[$id]) ) ? " disabled='disabled'" : '';
			
			$li_title = "title=' " . agp_strtolower($agent_display_name) . " '";
			
			if ( $check_for_incomplete_submission && isset($_POST['scoper_error']) && isset($_POST[$id_prefix]) )
				$this_checked = ( in_array($id, $_POST[$id_prefix]) ) ? ' checked="checked"' : '';
			else {
				if ( $role_assigned && ( ! is_array($for_entity_ids) || isset($for_entity_ids[$id]) ) )
					$this_checked = ' checked="checked"';
				else
					$this_checked = '';
			}
			
			if ( $this_checked )
				$last_agents[] = $id;
			if ( isset($via_other_role_ids[$id]) )
				$label_class = " class='rs-via-r{$limit_class}'";
				
			elseif ( ! $role_assigned && isset($via_other_basis_ids[$id]) )
				$label_class =  " class='rs-via-b{$limit_class}'";
					
			elseif ( isset($via_other_scope_ids[$id]) )
				$label_class = " class='rs-via-s{$limit_class}'";
			elseif( $limit_class )
				$label_class = " class='" . trim($limit_class) . "'";
			else
				$label_class = '';
				
				
			echo "\r\n"
				. "";
			
			$caption = $agent_display_name;
			
			if ( strlen($caption) > $caption_length_limit ) {
				if ( ! empty($rtl) )
					$caption = '...' . substr( $caption, strlen($caption) - $caption_length_limit); 
				else
					$caption = substr($caption, 0, $caption_length_limit) . '...';
			}
			
			if ( $role_assigned && ! empty($stored_assignments[$id]['inherited_from']) ) {
				$caption = $inherited_prefix . $caption . $inherited_suffix;
				$any_inherited = true;
				
			} elseif ( isset($via_other_role_ids[$id]) ) {
				$caption = $via_other_role_prefix . $caption . $via_other_role_suffix;
				$any_other_role = true;
			} elseif ( ! $role_assigned && isset($via_other_basis_ids[$id]) ) {
				$caption = $via_other_basis_prefix . $caption . $via_other_basis_suffix;
				$any_other_basis = true;
			} elseif ( isset($via_other_scope_ids[$id]) ) {
				$caption = $via_other_scope_prefix . $caption . $via_other_scope_suffix;
				$any_other_scope = true;
			}
			
			$caption = ' ' . $caption;
				
			echo $caption; // str_replace(' ', ' ', $caption);
			echo '  ';
			
		} //foreach agent
		
		echo "\r\n "; // prevent invalid markup if no other li's
		
		if ( CURRENT_ITEMS_RS == $agents_subset ) {
			$last_agents = implode("~", $last_agents);
			$last_agents_prop = implode("~", $last_agents_prop);
			echo " ' . sprintf(__('inherited from parent %s', 'scoper'), agp_strtolower($otype_label_singular)) . ' ';
		
		if ( $any_other_role && $via_other_role_prefix )
			$key ['other_role']= "{$via_other_role_prefix} {$via_other_role_suffix}"
				 . '' . str_replace( ' ', ' ', __('has via other role', 'scoper') ) . '  ';
		
		if ( $any_other_basis && $via_other_basis_prefix )
			$key ['other_basis']= "{$via_other_basis_prefix} {$via_other_basis_suffix}"
				 . '' . str_replace( ' ', ' ', __('has via group', 'scoper') ) . '  ';
		
		if ( $any_other_scope && $via_other_scope_prefix )
			$key ['other_scope']= "{$via_other_scope_prefix} {$via_other_scope_suffix}"
				 . '' . str_replace( ' ', ' ', __('has via other scope', 'scoper') ) . '  ';
		 
		if ( $propagation )
			$key ['propagation']= "{' . sprintf(__('propagate to sub-%s', 'scoper'), agp_strtolower($otype_label)) . ' ';
	
		if ( $any_date_limits && ! empty($object_id) ) {
			if ( empty($GLOBALS['post']) || ( 'auto-draft' != $GLOBALS['post']->post_status ) ) //don't display link for auto-drafts
				$action_links ['limits']= sprintf( __('%1$sEdit date limits%2$s', 'scoper'), "", ' ' );
		}
	}
} // end class
?>