add calculateOffset()