var Selection = function() {
  return Selection.extend(window.getSelection ? window.getSelection() : document.selection)
};
Selection.Methods = {
  createRange: function(selection) {
    if (selection.removeAllRanges)
      return Range.extend(document.createRange());
    else
      return Range.extend(document.body.createTextRange());
  },
  getRange: function(selection) {
    if (selection.removeAllRanges) {
      if (selection.rangeCount > 0)
        return Range.extend(selection.getRangeAt(0).cloneRange());
      else
        return Selection.createRange(selection);
    } else {
      return Range.extend(selection.createRange());
    }
  },
  setRange: function(selection, range) {
    if (selection.removeAllRanges) {
      selection.removeAllRanges();
      selection.addRange(range);
    } else {
      range.select();
    }
  },
  extend: function(selection) {
    var methods = Object.clone(Selection.Methods), property, value;
    for(property in methods) {
      value = methods[property];
      if (Object.isFunction(value) && !(property in selection))
        selection[property] = value.methodize();
    }
    return selection;
  }
}
Object.extend(Selection, Selection.Methods);

var Range;
if(!Range)
  Range = new Object;
Range.Methods = {
  getNode: function(range) {
    var element;
    if (!range) return
    if (!Prototype.Browser.IE) {
      element = range.commonAncestorContainer;
      while (element && !Object.isElement(element)) {
        element = element.parentNode;
      }
      return $(element);
    } else
      return range.item ? $(range.item(0)) : $(range.parentElement());
  },
  extend: function(range) {
    var methods = Object.clone(Range.Methods), property, value;
    for(property in methods) {
      value = methods[property];
      if (Object.isFunction(value) && !(property in range))
        range[property] = value.methodize();
    }
    return range;
  }
}
Object.extend(Range, Range.Methods);

