blob: 6e37e1ae53e25bec293ef3612cd1e7a8a2bfa5e0 [file] [log] [blame]
/* This compressed file is part of Xinha. For uncompressed sources, forum, and bug reports, go to xinha.org */
/* The URL of the most recent version of this file is http://svn.xinha.org/trunk/modules/WebKit/WebKit.js */
WebKit._pluginInfo={name:"WebKit",origin:"Xinha Core",version:"$LastChangedRevision: 1146 $".replace(/^[^:]*:\s*(.*)\s*\$$/,"$1"),developer:"The Xinha Core Developer Team",developer_url:"$HeadURL: http://svn.xinha.org/tags/0.96.1/modules/WebKit/WebKit.js $".replace(/^[^:]*:\s*(.*)\s*\$$/,"$1"),sponsor:"",sponsor_url:"",license:"htmlArea"};
function WebKit(_1){
this.editor=_1;
_1.WebKit=this;
};
WebKit.prototype.onKeyPress=function(ev){
var _3=this.editor;
var s=_3.getSelection();
if(_3.isShortCut(ev)){
switch(_3.getKey(ev).toLowerCase()){
case "z":
if(_3._unLink&&_3._unlinkOnUndo){
Xinha._stopEvent(ev);
_3._unLink();
_3.updateToolbar();
return true;
}
break;
case "a":
break;
case "v":
if(!_3.config.htmlareaPaste){
return true;
}
break;
}
}
switch(_3.getKey(ev)){
case " ":
var _5=function(_6,_7){
var _8=_6.nextSibling;
if(typeof _7=="string"){
_7=_3._doc.createElement(_7);
}
var a=_6.parentNode.insertBefore(_7,_8);
Xinha.removeFromParent(_6);
a.appendChild(_6);
_8.data=" "+_8.data;
s.collapse(_8,1);
_3._unLink=function(){
var t=a.firstChild;
a.removeChild(t);
a.parentNode.insertBefore(t,a);
Xinha.removeFromParent(a);
_3._unLink=null;
_3._unlinkOnUndo=false;
};
_3._unlinkOnUndo=true;
return a;
};
if(_3.config.convertUrlsToLinks&&s&&s.isCollapsed&&s.anchorNode.nodeType==3&&s.anchorNode.data.length>3&&s.anchorNode.data.indexOf(".")>=0){
var _b=s.anchorNode.data.substring(0,s.anchorOffset).search(/\S{4,}$/);
if(_b==-1){
break;
}
if(_3._getFirstAncestor(s,"a")){
break;
}
var _c=s.anchorNode.data.substring(0,s.anchorOffset).replace(/^.*?(\S*)$/,"$1");
var _d=_c.match(Xinha.RE_email);
if(_d){
var _e=s.anchorNode;
var _f=_e.splitText(s.anchorOffset);
var _10=_e.splitText(_b);
_5(_10,"a").href="mailto:"+_d[0];
break;
}
RE_date=/([0-9]+\.)+/;
RE_ip=/(?:(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.){3}(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)/;
var _11=_c.match(Xinha.RE_url);
if(_11){
if(RE_date.test(_c)){
break;
}
var _12=s.anchorNode;
var _13=_12.splitText(s.anchorOffset);
var _14=_12.splitText(_b);
_5(_14,"a").href=(_11[1]?_11[1]:"http://")+_11[2];
break;
}
}
break;
}
switch(ev.keyCode){
case 13:
if(ev.shiftKey){
}
break;
case 27:
if(_3._unLink){
_3._unLink();
Xinha._stopEvent(ev);
}
break;
case 8:
case 46:
if(!ev.shiftKey&&this.handleBackspace()){
Xinha._stopEvent(ev);
}
break;
default:
_3._unlinkOnUndo=false;
if(s.anchorNode&&s.anchorNode.nodeType==3){
var a=_3._getFirstAncestor(s,"a");
if(!a){
break;
}
if(!a._updateAnchTimeout){
if(s.anchorNode.data.match(Xinha.RE_email)&&a.href.match("mailto:"+s.anchorNode.data.trim())){
var _16=s.anchorNode;
var _17=function(){
a.href="mailto:"+_16.data.trim();
a._updateAnchTimeout=setTimeout(_17,250);
};
a._updateAnchTimeout=setTimeout(_17,1000);
break;
}
var m=s.anchorNode.data.match(Xinha.RE_url);
if(m&&a.href.match(new RegExp("http(s)?://"+Xinha.escapeStringForRegExp(s.anchorNode.data.trim())))){
var _19=s.anchorNode;
var _1a=function(){
m=_19.data.match(Xinha.RE_url);
if(m){
a.href=(m[1]?m[1]:"http://")+m[2];
}
a._updateAnchTimeout=setTimeout(_1a,250);
};
a._updateAnchTimeout=setTimeout(_1a,1000);
}
}
}
break;
}
return false;
};
WebKit.prototype.handleBackspace=function(){
var _1b=this.editor;
setTimeout(function(){
var sel=_1b.getSelection();
var _1d=_1b.createRange(sel);
var SC=_1d.startContainer;
var SO=_1d.startOffset;
var EC=_1d.endContainer;
var EO=_1d.endOffset;
var _22=SC.nextSibling;
if(SC.nodeType==3){
SC=SC.parentNode;
}
if(!(/\S/.test(SC.tagName))){
var p=document.createElement("p");
while(SC.firstChild){
p.appendChild(SC.firstChild);
}
SC.parentNode.insertBefore(p,SC);
Xinha.removeFromParent(SC);
var r=_1d.cloneRange();
r.setStartBefore(_22);
r.setEndAfter(_22);
r.extractContents();
sel.removeAllRanges();
sel.addRange(r);
}
},10);
};
WebKit.prototype.inwardHtml=function(_25){
return _25;
};
WebKit.prototype.outwardHtml=function(_26){
return _26;
};
WebKit.prototype.onExecCommand=function(_27,UI,_29){
this.editor._doc.execCommand("styleWithCSS",false,false);
switch(_27){
case "paste":
alert(Xinha._lc("The Paste button does not work in the Safari browser for security reasons. Press CTRL-V on your keyboard to paste directly."));
return true;
break;
case "removeformat":
var _2a=this.editor;
var sel=_2a.getSelection();
var _2c=_2a.saveSelection(sel);
var _2d=_2a.createRange(sel);
var els=_2a._doc.getElementsByTagName("*");
els=Xinha.collectionToArray(els);
var _2f=(_2d.startContainer.nodeType==1)?_2d.startContainer:_2d.startContainer.parentNode;
var i,el,_32,_33,_34,r2=_2a._doc.createRange();
function clean(el){
if(el.nodeType!=1){
return;
}
el.removeAttribute("style");
for(var j=0;j<el.childNodes.length;j++){
clean(el.childNodes[j]);
}
if((el.tagName.toLowerCase()=="span"&&!el.attributes.length)||el.tagName.toLowerCase()=="font"){
r2.selectNodeContents(el);
_33=r2.extractContents();
while(_33.firstChild){
_34=_33.removeChild(_33.firstChild);
el.parentNode.insertBefore(_34,el);
}
el.parentNode.removeChild(el);
}
};
if(sel.isCollapsed){
els=_2a._doc.body.childNodes;
for(i=0;i<els.length;i++){
el=els[i];
if(el.nodeType!=1){
continue;
}
if(el.tagName.toLowerCase()=="span"){
_32=_2a.convertNode(el,"div");
el.parentNode.replaceChild(_32,el);
el=_32;
}
clean(el);
}
}else{
for(i=0;i<els.length;i++){
el=els[i];
if(_2d.isPointInRange(el,0)||(els[i]==_2f&&_2d.startOffset==0)){
clean(el);
}
}
}
r2.detach();
_2a.restoreSelection(_2c);
return true;
break;
}
return false;
};
WebKit.prototype.onMouseDown=function(ev){
if(ev.target.tagName.toLowerCase()=="hr"||ev.target.tagName.toLowerCase()=="img"){
this.editor.selectNodeContents(ev.target);
}
};
Xinha.prototype.insertNodeAtSelection=function(_39){
var sel=this.getSelection();
var _3b=this.createRange(sel);
sel.removeAllRanges();
_3b.deleteContents();
var _3c=_3b.startContainer;
var pos=_3b.startOffset;
var _3e=_39;
switch(_3c.nodeType){
case 3:
if(_39.nodeType==3){
_3c.insertData(pos,_39.data);
_3b=this.createRange();
_3b.setEnd(_3c,pos+_39.length);
_3b.setStart(_3c,pos+_39.length);
sel.addRange(_3b);
}else{
_3c=_3c.splitText(pos);
if(_39.nodeType==11){
_3e=_3e.firstChild;
}
_3c.parentNode.insertBefore(_39,_3c);
this.selectNodeContents(_3e);
this.updateToolbar();
}
break;
case 1:
if(_39.nodeType==11){
_3e=_3e.firstChild;
}
_3c.insertBefore(_39,_3c.childNodes[pos]);
this.selectNodeContents(_3e);
this.updateToolbar();
break;
}
};
Xinha.prototype.getParentElement=function(sel){
if(typeof sel=="undefined"){
sel=this.getSelection();
}
var _40=this.createRange(sel);
try{
var p=_40.commonAncestorContainer;
if(!_40.collapsed&&_40.startContainer==_40.endContainer&&_40.startOffset-_40.endOffset<=1&&_40.startContainer.hasChildNodes()){
p=_40.startContainer.childNodes[_40.startOffset];
}
while(p.nodeType==3){
p=p.parentNode;
}
return p;
}
catch(ex){
return null;
}
};
Xinha.prototype.activeElement=function(sel){
if((sel===null)||this.selectionEmpty(sel)){
return null;
}
if(!sel.isCollapsed){
if(sel.anchorNode.childNodes.length>sel.anchorOffset&&sel.anchorNode.childNodes[sel.anchorOffset].nodeType==1){
return sel.anchorNode.childNodes[sel.anchorOffset];
}else{
if(sel.anchorNode.nodeType==1){
return sel.anchorNode;
}else{
return null;
}
}
}
return null;
};
Xinha.prototype.selectionEmpty=function(sel){
if(!sel){
return true;
}
if(typeof sel.isCollapsed!="undefined"){
return sel.isCollapsed;
}
return true;
};
Xinha.prototype.saveSelection=function(){
return this.createRange(this.getSelection()).cloneRange();
};
Xinha.prototype.restoreSelection=function(_44){
var sel=this.getSelection();
sel.removeAllRanges();
sel.addRange(_44);
};
Xinha.prototype.selectNodeContents=function(_46,_47){
this.focusEditor();
this.forceRedraw();
var _48;
var _49=typeof _47=="undefined"?true:false;
var sel=this.getSelection();
_48=this._doc.createRange();
if(_49&&_46.tagName&&_46.tagName.toLowerCase().match(/table|img|input|textarea|select/)){
_48.selectNode(_46);
}else{
_48.selectNodeContents(_46);
}
sel.removeAllRanges();
sel.addRange(_48);
if(typeof _47!="undefined"){
if(_47){
sel.collapse(_48.startContainer,_48.startOffset);
}else{
sel.collapse(_48.endContainer,_48.endOffset);
}
}
};
Xinha.prototype.insertHTML=function(_4b){
var sel=this.getSelection();
var _4d=this.createRange(sel);
this.focusEditor();
var _4e=this._doc.createDocumentFragment();
var div=this._doc.createElement("div");
div.innerHTML=_4b;
while(div.firstChild){
_4e.appendChild(div.firstChild);
}
var _50=this.insertNodeAtSelection(_4e);
};
Xinha.prototype.getSelectedHTML=function(){
var sel=this.getSelection();
if(sel.isCollapsed){
return "";
}
var _52=this.createRange(sel);
if(_52){
return Xinha.getHTML(_52.cloneContents(),false,this);
}else{
return "";
}
};
Xinha.prototype.getSelection=function(){
return this._iframe.contentWindow.getSelection();
};
Xinha.prototype.createRange=function(sel){
this.activateEditor();
if(typeof sel!="undefined"){
try{
return sel.getRangeAt(0);
}
catch(ex){
return this._doc.createRange();
}
}else{
return this._doc.createRange();
}
};
Xinha.prototype.isKeyEvent=function(_54){
return _54.type=="keydown";
};
Xinha.prototype.getKey=function(_55){
var key=String.fromCharCode(parseInt(_55.keyIdentifier.replace(/^U\+/,""),16));
if(_55.shiftKey){
return key;
}else{
return key.toLowerCase();
}
};
Xinha.getOuterHTML=function(_57){
return (new XMLSerializer()).serializeToString(_57);
};
Xinha.cc=String.fromCharCode(8286);
Xinha.prototype.setCC=function(_58){
var cc=Xinha.cc;
try{
if(_58=="textarea"){
var ta=this._textArea;
var _5b=ta.selectionStart;
var _5c=ta.value.substring(0,_5b);
var _5d=ta.value.substring(_5b,ta.value.length);
if(_5d.match(/^[^<]*>/)){
var _5e=_5d.indexOf(">")+1;
ta.value=_5c+_5d.substring(0,_5e)+cc+_5d.substring(_5e,_5d.length);
}else{
ta.value=_5c+cc+_5d;
}
ta.value=ta.value.replace(new RegExp("(&[^"+cc+";]*?)("+cc+")([^"+cc+"]*?;)"),"$1$3$2");
ta.value=ta.value.replace(new RegExp("(<script[^>]*>[^"+cc+"]*?)("+cc+")([^"+cc+"]*?</script>)"),"$1$3$2");
ta.value=ta.value.replace(new RegExp("^([^"+cc+"]*)("+cc+")([^"+cc+"]*<body[^>]*>)(.*?)"),"$1$3$2$4");
}else{
var sel=this.getSelection();
sel.getRangeAt(0).insertNode(this._doc.createTextNode(cc));
}
}
catch(e){
}
};
Xinha.prototype.findCC=function(_60){
var cc=Xinha.cc;
if(_60=="textarea"){
var ta=this._textArea;
var pos=ta.value.indexOf(cc);
if(pos==-1){
return;
}
var end=pos+cc.length;
var _65=ta.value.substring(0,pos);
var _66=ta.value.substring(end,ta.value.length);
ta.value=_65;
ta.scrollTop=ta.scrollHeight;
var _67=ta.scrollTop;
ta.value+=_66;
ta.setSelectionRange(pos,pos);
ta.focus();
ta.scrollTop=_67;
}else{
var _68=this;
try{
var doc=this._doc;
doc.body.innerHTML=doc.body.innerHTML.replace(new RegExp(cc),"<span id=\"XinhaEditingPostion\"></span>");
var _6a=doc.getElementById("XinhaEditingPostion");
this.selectNodeContents(_6a);
this.scrollToElement(_6a);
_6a.parentNode.removeChild(_6a);
this._iframe.contentWindow.focus();
}
catch(e){
}
}
};
Xinha.prototype._standardToggleBorders=Xinha.prototype._toggleBorders;
Xinha.prototype._toggleBorders=function(){
var _6b=this._standardToggleBorders();
var _6c=this._doc.getElementsByTagName("TABLE");
for(var i=0;i<_6c.length;i++){
_6c[i].style.display="none";
_6c[i].style.display="table";
}
return _6b;
};
Xinha.getDoctype=function(doc){
var d="";
if(doc.doctype){
d+="<!DOCTYPE "+doc.doctype.name+" PUBLIC ";
d+=doc.doctype.publicId?"\""+doc.doctype.publicId+"\"":"";
d+=doc.doctype.systemId?" \""+doc.doctype.systemId+"\"":"";
d+=">";
}
return d;
};