389 lines
10 KiB
JavaScript

/* This compressed file is part of Xinha. For uncompressed sources, forum, and bug reports, go to xinha.org */
/* This file is part of version 0.95 released Mon, 12 May 2008 17:33:15 +0200 */
/* The URL of the most recent version of this file is http://svn.xinha.webfactional.com/trunk/plugins/Linker/linker.js */
Linker._pluginInfo={name:"Linker",version:"1.0",developer:"James Sleeman",developer_url:"http://www.gogo.co.nz/",c_owner:"Gogo Internet Services",license:"htmlArea",sponsor:"Gogo Internet Services",sponsor_url:"http://www.gogo.co.nz/"};
Xinha.loadStyle("dTree/dtree.css","Linker");
Xinha.Config.prototype.Linker={"treeCaption":document.location.host,"backend":Xinha.getPluginDir("Linker")+"/scan.php","backend_data":null,"files":null};
function Linker(_1,_2){
this.editor=_1;
this.lConfig=_1.config.Linker;
var _3=this;
if(_1.config.btnList.createlink){
_1.config.btnList.createlink[3]=function(e,_5,_6){
_3._createLink(_3._getSelectedAnchor());
};
}else{
_1.config.registerButton("createlink","Insert/Modify Hyperlink",[_editor_url+"images/ed_buttons_main.gif",6,1],false,function(e,_8,_9){
_3._createLink(_3._getSelectedAnchor());
});
}
_1.config.addToolbarElement("createlink","createlink",0);
}
Linker.prototype._lc=function(_a){
return Xinha._lc(_a,"Linker");
};
Linker.prototype._createLink=function(a){
if(!a&&this.editor.selectionEmpty(this.editor.getSelection())){
alert(this._lc("You must select some text before making a new link."));
return false;
}
var _c={type:"url",href:"http://www.example.com/",target:"",p_width:"",p_height:"",p_options:["menubar=no","toolbar=yes","location=no","status=no","scrollbars=yes","resizeable=yes"],to:"alice@example.com",subject:"",body:"",anchor:""};
if(a&&a.tagName.toLowerCase()=="a"){
var _d=this.editor.fixRelativeLinks(a.getAttribute("href"));
var m=_d.match(/^mailto:(.*@[^?&]*)(\?(.*))?$/);
var _f=_d.match(/^#(.*)$/);
if(m){
_c.type="mailto";
_c.to=m[1];
if(m[3]){
var _10=m[3].split("&");
for(var x=0;x<_10.length;x++){
var j=_10[x].match(/(subject|body)=(.*)/);
if(j){
_c[j[1]]=decodeURIComponent(j[2]);
}
}
}
}else{
if(_f){
_c.type="anchor";
_c.anchor=_f[1];
}else{
if(a.getAttribute("onclick")){
var m=a.getAttribute("onclick").match(/window\.open\(\s*this\.href\s*,\s*'([a-z0-9_]*)'\s*,\s*'([a-z0-9_=,]*)'\s*\)/i);
_c.href=_d?_d:"";
_c.target="popup";
_c.p_name=m[1];
_c.p_options=[];
var _10=m[2].split(",");
for(var x=0;x<_10.length;x++){
var i=_10[x].match(/(width|height)=([0-9]+)/);
if(i){
_c["p_"+i[1]]=parseInt(i[2]);
}else{
_c.p_options.push(_10[x]);
}
}
}else{
_c.href=_d;
_c.target=a.target;
}
}
}
}
var _14=this;
this.a=a;
var _15=function(){
var a=_14.a;
var _17=_14._dialog.hide();
var atr={href:"",target:"",title:"",onclick:""};
if(_17.type=="url"){
if(_17.href){
atr.href=_17.href;
atr.target=_17.target;
if(_17.target=="popup"){
if(_17.p_width){
_17.p_options.push("width="+_17.p_width);
}
if(_17.p_height){
_17.p_options.push("height="+_17.p_height);
}
atr.onclick="if(window.top && window.top.Xinha){return false}window.open(this.href, '"+(_17.p_name.replace(/[^a-z0-9_]/i,"_"))+"', '"+_17.p_options.join(",")+"');return false;";
}
}
}else{
if(_17.type=="anchor"){
if(_17.anchor){
atr.href=_17.anchor.value;
}
}else{
if(_17.to){
atr.href="mailto:"+_17.to;
if(_17.subject){
atr.href+="?subject="+encodeURIComponent(_17.subject);
}
if(_17.body){
atr.href+=(_17.subject?"&":"?")+"body="+encodeURIComponent(_17.body);
}
}
}
}
if(a&&a.tagName.toLowerCase()=="a"){
if(!atr.href){
if(confirm(_14._dialog._lc("Are you sure you wish to remove this link?"))){
var p=a.parentNode;
while(a.hasChildNodes()){
p.insertBefore(a.removeChild(a.childNodes[0]),a);
}
p.removeChild(a);
_14.editor.updateToolbar();
return;
}
}else{
for(var i in atr){
a.setAttribute(i,atr[i]);
}
if(Xinha.is_ie){
if(/mailto:([^?<>]*)(\?[^<]*)?$/i.test(a.innerHTML)){
a.innerHTML=RegExp.$1;
}
}
}
}else{
if(!atr.href){
return true;
}
var tmp=Xinha.uniq("http://www.example.com/Link");
_14.editor._doc.execCommand("createlink",false,tmp);
var _1c=_14.editor._doc.getElementsByTagName("a");
for(var i=0;i<_1c.length;i++){
var _1d=_1c[i];
if(_1d.href==tmp){
if(!a){
a=_1d;
}
for(var j in atr){
_1d.setAttribute(j,atr[j]);
}
}
}
}
_14.editor.selectNodeContents(a);
_14.editor.updateToolbar();
};
this._dialog.show(_c,_15);
};
Linker.prototype._getSelectedAnchor=function(){
var sel=this.editor.getSelection();
var rng=this.editor.createRange(sel);
var a=this.editor.activeElement(sel);
if(a!=null&&a.tagName.toLowerCase()=="a"){
return a;
}else{
a=this.editor._getFirstAncestor(sel,"a");
if(a!=null){
return a;
}
}
return null;
};
Linker.prototype.onGenerateOnce=function(){
this._dialog=new Linker.Dialog(this);
};
Linker.Dialog_dTrees=[];
Linker.Dialog=function(_22){
var _23=this;
this.Dialog_nxtid=0;
this.linker=_22;
this.id={};
this.ready=false;
this.files=false;
this.html=false;
this.dialog=false;
this._prepareDialog();
};
Linker.Dialog.prototype._prepareDialog=function(){
var _24=this;
var _25=this.linker;
if(typeof dTree=="undefined"){
Xinha._loadback(Xinha.getPluginDir("Linker")+"/dTree/dtree.js",function(){
_24._prepareDialog();
});
return;
}
if(this.files===false){
if(_25.lConfig.backend){
Xinha._postback(_25.lConfig.backend,_25.lConfig.backend_data,function(txt){
try{
_24.files=eval(txt);
}
catch(Error){
_24.files=[{url:"",title:Error.toString()}];
}
_24._prepareDialog();
});
}else{
if(_25.lConfig.files!=null){
_24.files=_25.lConfig.files;
_24._prepareDialog();
}
}
return;
}
var _27=this.files;
if(this.html==false){
Xinha._getback(Xinha.getPluginDir("Linker")+"/dialog.html",function(txt){
_24.html=txt;
_24._prepareDialog();
});
return;
}
var _29=this.html;
var _2a=this.dialog=new Xinha.Dialog(_25.editor,this.html,"Linker");
var _2b=Xinha.uniq("dTree_");
this.dTree=new dTree(_2b,Xinha.getPluginDir("Linker")+"/dTree/");
eval(_2b+" = this.dTree");
this.dTree.add(this.Dialog_nxtid++,-1,_25.lConfig.treeCaption,null,_25.lConfig.treeCaption);
this.makeNodes(_27,0);
var _2c=this.dialog.getElementById("dTree");
_2c.innerHTML="";
_2c.style.position="absolute";
_2c.style.left=1+"px";
_2c.style.top=0+"px";
_2c.style.overflow="auto";
_2c.style.backgroundColor="white";
this.ddTree=_2c;
this.dTree._linker_premade=this.dTree.toString();
var _2d=this.dialog.getElementById("options");
_2d.style.position="absolute";
_2d.style.top=0+"px";
_2d.style.right=0+"px";
_2d.style.width=320+"px";
_2d.style.overflow="auto";
this.dialog.onresize=function(){
var h=parseInt(_2a.height)-_2a.getElementById("h1").offsetHeight;
var w=parseInt(_2a.width)-322;
if(w<0){
w=0;
}
if(h<0){
h=0;
}
_2d.style.height=_2c.style.height=h+"px";
_2c.style.width=w+"px";
};
this.ready=true;
};
Linker.Dialog.prototype.makeNodes=function(_30,_31){
for(var i=0;i<_30.length;i++){
if(typeof _30[i]=="string"){
this.dTree.add(Linker.nxtid++,_31,_30[i].replace(/^.*\//,""),"javascript:document.getElementsByName('"+this.dialog.id.href+"')[0].value=decodeURIComponent('"+encodeURIComponent(_30[i])+"');document.getElementsByName('"+this.dialog.id.type+"')[0].click();document.getElementsByName('"+this.dialog.id.href+"')[0].focus();void(0);",_30[i]);
}else{
if(typeof _30[i]=="object"&&_30[i]&&typeof _30[i].length==="number"){
var id=this.Dialog_nxtid++;
this.dTree.add(id,_31,_30[i][0].replace(/^.*\//,""),null,_30[i][0]);
this.makeNodes(_30[i][1],id);
}else{
if(typeof _30[i]=="object"){
if(_30[i].children){
var id=this.Dialog_nxtid++;
}else{
var id=Linker.nxtid++;
}
if(_30[i].title){
var _34=_30[i].title;
}else{
if(_30[i].url){
var _34=_30[i].url.replace(/^.*\//,"");
}else{
var _34="no title defined";
}
}
if(_30[i].url){
var _35="javascript:document.getElementsByName('"+this.dialog.id.href+"')[0].value=decodeURIComponent('"+encodeURIComponent(_30[i].url)+"');document.getElementsByName('"+this.dialog.id.type+"')[0].click();document.getElementsByName('"+this.dialog.id.href+"')[0].focus();void(0);";
}else{
var _35="";
}
this.dTree.add(id,_31,_34,_35,_34);
if(_30[i].children){
this.makeNodes(_30[i].children,id);
}
}
}
}
}
};
Linker.Dialog.prototype._lc=Linker.prototype._lc;
Linker.Dialog.prototype.show=function(_36,ok,_38){
if(!this.ready){
var _39=this;
window.setTimeout(function(){
_39.show(_36,ok,_38);
},100);
return;
}
if(this.ddTree.innerHTML==""){
this.ddTree.innerHTML=this.dTree._linker_premade;
}
if(_36.type=="url"){
this.dialog.getElementById("urltable").style.display="";
this.dialog.getElementById("mailtable").style.display="none";
this.dialog.getElementById("anchortable").style.display="none";
}else{
if(_36.type=="anchor"){
this.dialog.getElementById("urltable").style.display="none";
this.dialog.getElementById("mailtable").style.display="none";
this.dialog.getElementById("anchortable").style.display="";
}else{
this.dialog.getElementById("urltable").style.display="none";
this.dialog.getElementById("mailtable").style.display="";
this.dialog.getElementById("anchortable").style.display="none";
}
}
if(_36.target=="popup"){
this.dialog.getElementById("popuptable").style.display="";
}else{
this.dialog.getElementById("popuptable").style.display="none";
}
var _3a=this.dialog.getElementById("anchor");
for(var i=_3a.length;i>=0;i--){
_3a[i]=null;
}
var _3c=this.linker.editor.getHTML();
var _3d=new Array();
var m=_3c.match(/<a[^>]+name="([^"]+)"/gi);
if(m){
for(i=0;i<m.length;i++){
var n=m[i].match(/name="([^"]+)"/i);
if(!_3d.contains(n[1])){
_3d.push(n[1]);
}
}
}
m=_3c.match(/id="([^"]+)"/gi);
if(m){
for(i=0;i<m.length;i++){
n=m[i].match(/id="([^"]+)"/i);
if(!_3d.contains(n[1])){
_3d.push(n[1]);
}
}
}
for(i=0;i<_3d.length;i++){
var opt=new Option(_3d[i],"#"+_3d[i],false,(_36.anchor==_3d[i]));
_3a[_3a.length]=opt;
}
if(_3a.length==0){
this.dialog.getElementById("anchorfieldset").style.display="none";
}
if(_36.href=="http://www.example.com/"&&_36.to=="alice@example.com"){
this.dialog.getElementById("clear").style.display="none";
}else{
this.dialog.getElementById("clear").style.display="";
}
var _41=this.dialog;
var _39=this;
if(ok){
this.dialog.getElementById("ok").onclick=ok;
}else{
this.dialog.getElementById("ok").onclick=function(){
_39.hide();
};
}
if(_38){
this.dialog.getElementById("cancel").onclick=_38;
}else{
this.dialog.getElementById("cancel").onclick=function(){
_39.hide();
};
}
this.linker.editor.disableToolbar(["fullscreen","linker"]);
this.dialog.show(_36);
this.dialog.onresize();
};
Linker.Dialog.prototype.hide=function(){
this.linker.editor.enableToolbar();
return this.dialog.hide();
};