/* COMMENTAIRE
  // Utilisation
  var textRange = document.selection.createRange()
  // format supporté par selection
  document.selection = {
    "type":String["none","text","control"],
    "createRange":textRange,
  }
  // format supporté par textRange
  textRange = {
    "text":String,
    "htmlText":String,
    "parentElement":function() as HTMLElement,
    "length":Integer,
    "item":function(index) as HTMLElement,
    "add":function(node),
    "addElement":function(node),
    "execCommand":function(...) as CommandResult
  }
*/
// SelectionObject
function SelectionObject(Window) { 
	this.window=(Window?Window:window);
	this.document=this.window.document;
}
if(!document.selection) { try {
    SelectionObject.prototype={
      "clear":function() {
    	  try {
    		  var sel = this.window.getSelection();
    		  sel.collapse(true);
    		  sel.dettach();
    	  } catch (ex) {}
      },
      "createRange":function() {
    	  if (this.type=="none") {
    		  var range = "no selection";
    		  range.text=""; range.htmlText="";
    		  return range;
    	  }
    	  if (!this.activeElement) {
    		  var txt = this.document.getSelection()
    		  var sel = {};
    		  try { sel=this.window.getSelection().getRangeAt(0); } catch (ex) {}
    		  var html = getHTMLOfSelection(this.window, this.document);
    		  var range = null;
    		  
    		  range = new ControlRangeObject();
    		  range.isControlRange=true;
    		  range._text=(""+txt+"");
    		  range._htmlText=html;
    		  range._range=sel;
    		  range.base=sel.commonAncestorContainer?sel.commonAncestorContainer:this.document.body
    		  range.items=new Array();
    		  range.addElement=range.add;
    		  
    		  try {
    			  while (range.base.nodeName.substr(0,1)=="#") {
    				  range.base=range.base.parentNode;
    			  }
    			  var index = 0; var started;
    			  var current = range.base.childNodes[0];
    			  while (current) {
    				  if (started || current==sel.startContainer || current==sel.commonAncestorContainer) {
    					  started = true;
    					  range.items.push(current);
    				  }
    				  if (current == sel.endContainer || current==sel.commonAncestorContainer) {
    					  break;
    				  }
    				  index++;
    				  current = range.base.childNodes[index];
    			  }
    			  range.length=range.items.length;
    		  } catch (ex) {}
    		  
    		  return range;
    	  } else {
    		var base = this.activeElement;
    		var range = new ControlRangeObject();
    		range.isControlRange=false;
    		range._text = base.value.substring(base.selectionStart, base.selectionEnd);
    		range._htmlText=range._text;
    		range._range=null;
    		range.base=base;
    		range.items=[range.base];
    		range.addElement=range.add;
    		
    		return range;
    	  }
    	}
    }
    SelectionObject.prototype.empty=SelectionObject.prototype.clear;
    SelectionObject.prototype.createRangeControl=SelectionObject.prototype.createRange;
    SelectionObject.prototype.findActiveElement=function() {
        function haveFocus(inp) {
            try { // IE
                var result = !!(inp.hasFocus||inp==document.activeElement);
                if (result) { return result; }
            } catch (ex) {}
            try { // FF; Safari
                var sel = false;
        		sel=this.window.getSelection().getRangeAt(0);
                if (!sel.collapsed) { return false; }
                var sel2 = document.createRange();
                sel2.setStartBefore(inp);
                sel2.setEndBefore(inp);
                var result = sel.compareBoundaryPoints(Range.START_TO_START, sel2)==0;
                result = result && sel.compareBoundaryPoints(Range.END_TO_END, sel2)==0;
                result = result && sel.startOffset == sel2.startOffset
                result = result && sel.endOffset == sel2.endOffset
                return result;
            } catch (ex) {}
            try { // Opéra
                return !!(inp.selectionStart||inp.selectionEnd);
            } catch (ex) {}
            return false;
        }
    	try {
    		var allInputs = this.document.getElementsByTagName("INPUT");
    		var allTAreas = this.document.getElementsByTagName("TEXTAREA");
    		var l1 = allInputs.length; var l2 = allTAreas.length;
    		for (var i=0; i<l1; i++) {
    			var inp = allInputs[i];
    			if (inp.type=="" || inp.type=="text") {
    				if (haveFocus(inp)) {
    					this.activeElement = inp;
    					return "text";
    				}
    			}
    		}
    		for (var i=0; i<l2; i++) {
    			var inp = allTAreas[i];
                if (haveFocus(inp)) {
                    this.activeElement = inp;
    				return "text";
    			}
    		}
            if (document.activeElement) { return document.activeElement; }
    	} catch (ex) {}
    };
    SelectionObject.prototype.__defineGetter__("type", function() {
      try {
    	  this.activeElement = false;
    	  var sel = false; 
    	  if ((""+this.document.getSelection()+"")=="") { 
    		this.findActiveElement(); 
    		if (this.activeElement) {
    			return "text";
    		}
    	  }
    	  try { 
    		sel = this.window.getSelection().getRangeAt(0);
    	  } catch (ex) {}
    	  if (sel.commonAncestorContainer.nodeName.substr(0,1)=="#") {
    		  return "text";
    	  } else {
    		  return "control";
    	  }
      } catch (ex) { }
      return "none";
    });
    SelectionObject.prototype.__defineSetter__("type", function() {
      // Do nothing
    });
    // ControlRangeObject
    function ControlRangeObject() {}
    ControlRangeObject.prototype={
    	"_text":"",
    	"_htmlText":"",
    	"_range":null,
    	"parentElement":function() {
    		return this.base;
    	},
    	"item":function(i) {
    		return this.items[i];
    	},
    	"add":function(node) {
    		try {
    			this._range.insertNode(node);
    		} catch (ex) {}
    	},
    	"execCommand":function(a1,a2,a3,a4) {
    		var mode = document.designMode;
    		document.designMode="on";
    		document.execCommand(a1,a2,a3,a4);
    		document.designMode=mode;
    	}
    }
    // Properties
    ControlRangeObject.prototype.__defineGetter__("text",function() {
    	return this._text;
    });
    ControlRangeObject.prototype.__defineSetter__("text",function(value) {
    	if (this.isControlRange) {
    		var range = this._range;
    		var p=document.createTextNode(value);
    		range.deleteContents();
    		range.insertNode(p)
            try { document.getSelection().collapseToEnd() } catch (ex) {}
    	} else {
    		var beforeText = this.base.value.substr(0, this.base.selectionStart);
    		var middleText = value;
    		var afterText  = this.base.value.substr(this.base.selectionEnd);
    		this.base.value = beforeText+middleText+afterText;
    		this.base.selectionStart = beforeText.length + value.length;
    		this.base.selectionEnd   = this.base.selectionStart;
            this.base.focus();
    	}
    });
    ControlRangeObject.prototype.__defineGetter__("htmlText",function() {
    	return this._htmlText
    });
    ControlRangeObject.prototype.__defineSetter__("htmlText",function(value) {
    	var range = this._range;
    	var p=document.createElement("htmlSection");
    	p.innerHTML=value;
    	range.deleteContents();
    	range.insertNode(p)
    });
    document.selection=new SelectionObject(); 
} catch (ex) {} }
function getHTMLOfSelection (window, document) {
  var range;
  if (window.ActiveXObject && document.selection && document.selection.createRange) {
	range = document.selection.createRange();
	return range.htmlText;
  }
  else if (window.getSelection) {
	var selection = window.getSelection();
	if (selection.rangeCount > 0) {
	  range = selection.getRangeAt(0);
	  var clonedSelection = range.cloneContents();
	  var div = document.createElement('div');
	  div.appendChild(clonedSelection);
	  return div.innerHTML;
	}
	else {
	  return '';
	}
  }
  else {
	return '';
  }
}
