code: @Override
  	public String getInternalId() {
  		String iid = null;
  
  		// As determining the internal id involves a fair bit of tree traversal, it is cached in the scratch map.
  		// Try to retrieve the cached id first.
  		Map scratchMap = getScratchMap();
  
  		if (scratchMap != null) {
  			iid = (String) scratchMap.get("iid");
  		}
  
  		if (iid == null) {
  			// An id is a function of a component's position in the component tree.
  			// The id will remain constant so long as the component tree does not
  			// change.
  			Container parent = getParent();
  
  			if (parent == null) {
  				return DEFAULT_INTERNAL_ID;
  			}
  
  			iid = parent.getInternalId();
  			final int nameLen = iid.length();
  			StringBuffer nameBuf = new StringBuffer(nameLen + 3);
  			nameBuf.append(iid);
  			nameBuf.append(getIndexOfChild(parent, this));
  
  			if (iid.charAt(nameLen - 1) <= '9') {
  				// last char was a number, change current to letters
  				for (int i = nameLen; i < nameBuf.length(); i++) {
  					nameBuf.setCharAt(i, (char) (nameBuf.charAt(i) + ('a' - '0')));
  				}
  			}
  
  			iid = nameBuf.toString();
  
  			if (scratchMap != null) {
  				scratchMap.put("iid", iid);
  			}
  		}
  
  		return iid;
  	}
docs: {@inheritDoc}