// 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 '';
}
}

//fonction affichage lien externe avec attribut rel="external" sur lien '<a href>'
function externalLinks() {
 if (!document.getElementsByTagName) return;
 var anchors = document.getElementsByTagName("a");
 for (var i=0; i<anchors.length; i++) {
   var anchor = anchors[i];
   if (anchor.getAttribute("href") &&
       anchor.getAttribute("rel") == "external")
     anchor.target = "_blank";
 }
}
window.onload = externalLinks;
