@Override
	public void insertPrev(T i, T j) {
		if (j.getParent() != null)
			throw new PromiscuousItemException(j, j.getParent());
		if ((j.getNext() != null) || (j.getPrev() != null))
			throw new PromiscuousItemException(j);

		if (i == null) {
			// insert as tail
			j.setPrev(_lastItem);
			j.setNext(null);
			j.setParent(this);
			if (_lastItem != null) {
				_lastItem.setNext(j);
				_lastItem = j;
			} else {
				_firstItem = _lastItem = j;
			}

			++size;
		} else {
			// insert in middle
			if (i.getParent() == null)
				throw new PromiscuousItemException(i, i.getParent()); // different trace to make easier debugging
			if (i.getParent() != this)
				throw new PromiscuousItemException(i, i.getParent());
			T prev = i.getPrev();
			if (prev == null) {
				if (i != _firstItem)
					throw new VirginItemException(i);
				_firstItem = j;
			} else
				prev.setNext(j);
			j.setPrev(prev);
			i.setPrev(j);
			j.setNext(i);
			j.setParent(this);

			++size;
		}
	}