code: function()  {
        var ranges = [],
            r = this.getRange(),
            tmpRanges;
  
        if (r) { ranges.push(r); }
  
        if (this.unselectableClass && this.contain && r) {
            var uneditables = this.getOwnUneditables(),
                tmpRange;
            if (uneditables.length > 0) {
              for (var i = 0, imax = uneditables.length; i < imax; i++) {
                tmpRanges = [];
                for (var j = 0, jmax = ranges.length; j < jmax; j++) {
                  if (ranges[j]) {
                    switch (ranges[j].compareNode(uneditables[i])) {
                      case 2:
                        // all selection inside uneditable. remove
                      break;
                      case 3:
                        //section begins before and ends after uneditable. spilt
                        tmpRange = ranges[j].cloneRange();
                        tmpRange.setEndBefore(uneditables[i]);
                        tmpRanges.push(tmpRange);
  
                        tmpRange = ranges[j].cloneRange();
                        tmpRange.setStartAfter(uneditables[i]);
                        tmpRanges.push(tmpRange);
                      break;
                      default:
                        // in all other cases uneditable does not touch selection. dont modify
                        tmpRanges.push(ranges[j]);
                    }
                  }
                  ranges = tmpRanges;
                }
              }
            }
        }
        return ranges;
      }
docs: Returns an array of ranges that belong only to this editable Needed as uneditable block in contenteditabel can split range into pieces If manipulating content reverse loop is usually needed as manipulation can shift subsequent ranges