if(!Array.indexOf){Array.prototype.indexOf=function(obj){for(var i=0;i<this.length;i++){if(this[i]==obj){return i;}}
return-1;}}
var SELECT={};SELECT.Selection=function(start,end){this.start=start;this.end=end;}
SELECT.Selection.prototype.is_collapsed=function(){return this.start==this.end;}
SELECT.Selection.prototype.collapse=function(){this.end=this.start;}
SELECT.Selection.prototype.as_array=function(){return[this.start,this.end];}
SELECT._find_node_offset=function(parent_node,find_node){var offset=0;var child_node_list=parent_node.childNodes;for(var i=0;i<child_node_list.length;i++){var child_node=child_node_list[i];if(child_node==find_node){return[offset,true];}
switch(child_node.nodeType){case Node.TEXT_NODE:var text=child_node.nodeValue;offset+=text.length;break;default:if(['br','img'].indexOf(child_node.nodeName.toLowerCase())!=-1){offset+=1;}
var child_result=SELECT._find_node_offset(child_node,find_node);offset+=child_result[0];if(child_result[1]){return[offset,true];}}}
return[offset,false];}
SELECT._node_select=function(range,node,start,end){var child_node_list=node.childNodes;for(var i=0;i<child_node_list.length;i++){var child_node=child_node_list[i];if(child_node.nodeType==Node.TEXT_NODE||(child_node.nodeName&&['br','img'].indexOf(child_node.nodeName.toLowerCase())!=-1)){var length=1;if(!child_node.nodeName||['br','img'].indexOf(child_node.nodeName.toLowerCase())==-1){length=child_node.nodeValue.length;}
if(start>-1&&length>=start){range.setStart(child_node,start);start=-1;}else{start-=length;}
if(end>-1&&length>=end){range.setEnd(child_node,end);end=-1;}else{end-=length;}}else{var child_result=SELECT._node_select(range,child_node,start,end);start=child_result[0];end=child_result[1];}
if(end<0){break;}}
return[start,end];}
SELECT._in_node=function(child_node,parent_node){if(child_node==parent_node){return true;}else{if(child_node.parentNode){return SELECT._in_node(child_node.parentNode,parent_node);}}
return false;}
SELECT.get=function(node){var selection_list=new Array();if(window.getSelection){selection=window.getSelection();if(selection.rangeCount>0){for(var i=0;i<selection.rangeCount;i++){var range=selection.getRangeAt(i);if(SELECT._in_node(range.startContainer,node)&&SELECT._in_node(range.endContainer,node)){var start=range.startOffset;var end=0;if(node!=range.endContainer){end=SELECT._find_node_offset(node,range.endContainer)[0];}
var end_type=range.endContainer.nodeType;if(end_type==Node.TEXT_NODE||end_type==Node.COMMENT_NODE||end_type==Node.CDATA_SECTION_NODE){start+=SELECT._find_node_offset(node,range.startContainer)[0];end+=range.endOffset;}
selection_list.push(new SELECT.Selection(start,end));}}}}else{if(document.selection){var range=document.selection.createRange();if(SELECT._in_node(range.parentElement(),node)){var outer_range=range.duplicate();outer_range.moveToElementText(node);var find_range=range.duplicate();find_range.collapse();var offset=0;var select_length=Math.min(500,node.innerText.length/2);var in_range=false;while(select_length>1||in_range){find_range=range.duplicate();find_range.collapse(true);find_range.moveStart('character',-(select_length+offset));in_range=outer_range.inRange(find_range);if(in_range){offset+=select_length;}else{find_range.moveStart('character',(select_length));if(select_length%2>0){select_length++;}
select_length=select_length/2;}}
var start=find_range.text.replace(/\r\n/g,'').length;var end=start+range.text.length;var start_imgs=find_range.htmlText.match(/<img.+?>/ig);var start_img_count=0;if(start_imgs){start_img_count=start_imgs.length;}
start+=start_img_count;var end_imgs=range.htmlText.match(/<img.+?>/ig);var end_img_count=0;if(end_imgs){end_img_count=end_imgs.length;}
end+=end_img_count;if(start>outer_range.text.length+start_img_count){start=outer_range.text.length+start_img_count;end=start;}
selection_list.push(new SELECT.Selection(start,end));}}}
return selection_list;}
SELECT.set=function(node,selection_list,clear){if(selection_list.constructor!=Array.constructor){selection_list=[selection_list,];}
if(window.getSelection){if(clear){window.getSelection().removeAllRanges();}
for(var i=0;i<selection_list.length;i++){var selection=selection_list[i];var range=document.createRange();SELECT._node_select(range,node,selection.start,selection.end);window.getSelection().addRange(range);}}else{selection=selection_list[0];var range=document.selection.createRange();range.moveToElementText(node);range.collapse(true);range.moveStart('character',selection.start);range.moveEnd('character',selection.end-selection.start);range.select();}}