//----[  splitItem  ]----------------------------------------------------------
bool ClientItemsInterface::splitItem(unsigned int index) {
  if (!inventoryItemIsValid(index)) return false;
  AvatarInventoryItem* inventory_item = &inventory_[index];
  if (!inventory_item->stackable || // item must be stackable...
      inventory_item->equipped) return false; // ...and in the inventory
  ItemInstance* item = inventory_item->item.dereferenceAssumingValid(); // justified by validity check
  if (canHoldItems(1) == false) return false; // 
  const int original_quantity = item->getQuantity();
  if (original_quantity <= 1) return false; // can't split a stack of 1
  int new_quantity = original_quantity >> 1; // divide in half
  int quantity_remaining = original_quantity - new_quantity;

  // Create the new item
  ItemPointer new_item;
  if (!GlobalItemManager::singleton()->acquireNewItem(new_quantity,
                                                      item->getDescription()->type_index,
                                                     &new_item)) {
    return false;
  }

  // Put the new item in the inventory
  if (!addToInventory(new_item, NULL)) {
    GlobalItemManager::singleton()->releaseItem(&new_item);
  }

  // Adjust the quantity of the original item
  item->setQuantity(quantity_remaining);
  return true;
}
//----[  giveItem  ]-----------------------------------------------------------
bool ClientItemsInterface::giveItem(ItemPointer* item_pointer,
                                    unsigned int* assigned_index) {
  if (!item_pointer || item_pointer->invalid()) return false;
  ItemInstance* item = item_pointer->dereferenceAssumingValid(); // justified by prev. line

  int source_quantity = item->getQuantity();
  if (source_quantity < 0) return false;

  // stack with existing items
  if (item->isStackable()) {
    unsigned int start_search_index = 0;
    while (item &&
           start_search_index < items_in_inventory_) { // keep the index safe!
      ItemInstance* stackable_item = NULL;
      if (!findStackableItemInInventory(item,
                                       start_search_index,
                                      &start_search_index,
                                      &stackable_item)) break;
      inventory_dirty_bits_.set(start_search_index);
      update_inventory_ = true;
      ++start_search_index;
      item->setQuantity(stackable_item->addQuantity(item->getQuantity()));
      if (item->getQuantity() <= 0) {
        GlobalItemManager::singleton()->releaseItem(item_pointer);
        item = NULL;
      }
    }
  }

  // add to the inventory
  return item ? addToInventory(*item_pointer, assigned_index) : true;
}