<?php
/*
Plugin Name:lesscaps 
Plugin URI: http://www.creighton.edu
Description: I'll fill you in on this later.  Don't worry about it, it'll be fine. 
Author: Joel vanBrandwijk 
Version: .00a
Author URI: http://www.creighton.edu
*/ 

function userEdit_cap_map($cap, $user_id, $args){
	$args=$args[0];
	if($cap == 'edit_users'){
		//if we don't have any arguments, then we're asking a situation-free question.  Assume the best
		if(count($args) === 0){
			return Array();
		}

		//get current and target user objects for later use
		global $current_user;
		$target_user = new WP_User($args['target_id']);

		switch($args['action']){
			case 'adduser':
				if(compare_caps($current_user->roles, $args['target_state']) === 1){
					return Array();
				}
				break;
			case 'promote':
				if(compare_caps($current_user->roles, $args['target_state']) === 1){
					if($target_user->id === 0){
						return Array();
					} elseif (compare_caps($current_user->roles, $target_user->roles) === 1){
						return Array();
					}
				}
				break;
			case 'edit':
				if(compare_caps($current_user->roles, $target_user->roles) === 1){
					return Array();
				}
				break;
			case 'delete':
			case 'dodelete':
			default:
				if(compare_caps($current_user->roles, $target_user->roles) === 1) {
					return Array();
				}
				break;
		}
	} else {
		return false;
	}
}

function compare_caps($role1, $role2){
	//make life easy on ourselves...
	$caps1 = array();
	$caps2 = array();
	global $wp_roles;

	if(is_array($role1)){
		foreach($role1 as $r1){
			$caps1 = array_merge($wp_roles->roles[$r1]['capabilities'], $caps1);
		}
	} else {
		$caps1 = $wp_roles->roles[$role1]['capabilities'];
	}
	if(is_array($role2)){
		foreach($role2 as $r2){
			$caps2 = array_merge($wp_roles->roles[$r2]['capabilities'], $caps2);
		}
	} else {
		$caps2 = $wp_roles->roles[$role2]['capabilities'];
	}

	//if role1 and role2 are equal, return 0
	if(array_diff_assoc($caps1, $caps2) == array() && array_diff_assoc($caps2, $caps1) == array()){
		return 0;
	}

	//if role2 is a proper subset of role1, return 1
	if(array_diff_assoc($caps2, array_intersect_assoc($caps1, $caps2)) == array()){
		return 1;
	}

	//if role1 is a proper subset of role2, return -1
	if(array_diff_assoc($caps1, array_intersect_assoc($caps2, $caps1)) == array()){
		return -1;
	}

	//if role1 and role2 have exclusive elements, return 0
	return 0;
}

add_filter('maps_cap', 'userEdit_cap_map', 1, 3);
?>
