blob: eee4b2ffe47b84cbd2713c227f2b515b71b11ed3 [file] [log] [blame]
/**
= Mootools File Manager =
== File Manager ==
The functions in this file extend the MootoolsFileManager plugin with support
for managing files (inserting a link to a file). This file is loaded automatically.
* @author $Author$
* @version $Id$
* @package MootoolsFileManager
*/
// Open a "files" mode of the plugin to allow to select a file to
// create a link to.
MootoolsFileManager.prototype.OpenFileManager = function(link)
{
var editor = this.editor;
var outparam = null;
var self = this;
if (typeof link == "undefined")
{
link = this.editor.getParentElement();
if (link)
{
if (/^img$/i.test(link.tagName))
link = link.parentNode;
if (!/^a$/i.test(link.tagName))
link = null;
}
}
// If the link wasn't provided, and no link is currently in focus,
// make one from the selection.
if (!link)
{
var sel = editor.getSelection();
var range = editor.createRange(sel);
var compare = 0;
if (Xinha.is_ie)
{
if ( sel.type == "Control" )
{
compare = range.length;
}
else
{
compare = range.compareEndPoints("StartToEnd", range);
}
}
else
{
compare = range.compareBoundaryPoints(range.START_TO_END, range);
}
if (compare == 0)
{
alert(Xinha._lc("You must select some text before making a new link.", 'MootoolsFileManager'));
return;
}
outparam = {
f_href : '',
f_title : '',
f_target : '',
f_type: '',
baseHref: editor.config.baseHref
};
}
else
{
outparam = {
f_href : Xinha.is_ie ? link.href : link.getAttribute("href"),
f_title : link.title,
f_target : link.target,
f_type : link.type ? link.type : '',
baseHref: editor.config.baseHref
};
}
this.current_link = link;
this.current_attributes = outparam;
if(!this.FileManagerWidget)
{
this.FileManagerWidget = new FileManager({
url: this.editor.config.MootoolsFileManager.backend,
assetBasePath: Xinha.getPluginDir('MootoolsFileManager')+'/mootools-filemanager/Assets',
language: _editor_lang,
selectable: true,
upload: this.phpcfg.files_allow_upload,
destroy: this.phpcfg.files_allow_delete,
createFolders: this.phpcfg.files_allow_create_dir,
rename: this.phpcfg.files_allow_move,
move_or_copy: this.phpcfg.files_allow_move,
download: this.phpcfg.files_allow_download,
propagateData: Object.merge({'__function': 'file-manager'}, this.editor.config.MootoolsFileManager.backend_data),
propagateType: 'POST',
uploadAuthData: Object.merge({'__function': 'file-manager'}, this.editor.config.MootoolsFileManager.backend_data),
onComplete: function(path, file, mgr) { self.FileManagerReturn(path,file); },
onHide: function() { if(this.swf && this.swf.box) this.swf.box.style.display = 'none'; },
onShow: function() { if(this.swf && this.swf.box) this.swf.box.style.display = ''; },
onDetails: function(details)
{
this.info.adopt(self.FileManagerAttributes(details));
return true;
},
onHidePreview: function()
{
document.id(self.FileManagerAttributes().table).dispose();
return true;
},
showDirGallery: false,
keyboardNavigation: false,
listType: this.phpcfg.files_list_type,
listPaginationSize: this.phpcfg.files_pagination_size,
listMaxSuggestedDirSizeForThumbnails: this.phpcfg.files_list_mode_over,
directory: this.phpcfg.files_list_start_in
});
}
// IE11 which pretends it is "gecko" is particularly finicky
// about losing selection other browsers not so much, but they
// don't seem to mind saving and restoring it anyway, so we
// will do that for everybody
if(1||Xinha.is_ie) this.current_selection = this.editor.saveSelection();
if(link)
{
var src = Xinha.is_ie ? link.href : link.getAttribute("href");
if(!src.match(/^(([a-z]+:)|\/)/i))
{
src = self.editor.config.baseHref.replace(/\/[^\/]*$/, '') + '/' + src;
if(src.match(/^[a-z]+:/i) && !self.phpcfg.files_url.match(/^[a-z]:/i))
{
src = src.replace(/^[a-z]+:(\/\/?)[^/]*/i, '');
}
}
// Get exploded path without the base url
var path = src.replace(self.phpcfg.files_url+'/', '').split('/');
// Pull off the file
var base = path.pop();
// Join the path back togethor (no base url, trailing slash if the path has any length)
path = path.length ? (path.join('/') + '/') : '';
// feed to widget
this.FileManagerWidget.show(null, path, base);
}
else
{
this.FileManagerWidget.show();
}
};
// Take the values from the file selection and make it (or update) a link
MootoolsFileManager.prototype.FileManagerReturn = function(path, file)
{
var editor = this.editor;
var a = this.current_link;
var param = this.FileManagerAttributes();
param.f_href = path;
// IE11 which pretends it is "gecko" is particularly finicky
// about losing selection other browsers not so much, but they
// don't seem to mind saving and restoring it anyway, so we
// will do that for everybody
if(1||Xinha.is_ie) this.editor.restoreSelection(this.current_selection);
if (!a)
{
try
{
editor._doc.execCommand("createlink", false, param.f_href);
a = editor.getParentElement();
var sel = editor.getSelection();
var range = editor.createRange(sel);
if (!Xinha.is_ie)
{
a = range.startContainer;
if (!/^a$/i.test(a.tagName))
{
a = a.nextSibling;
if (a == null)
{
a = range.startContainer.parentNode;
}
}
}
} catch(e) {}
}
else
{
var href = param.f_href.trim();
editor.selectNodeContents(a);
if (href == "")
{
editor._doc.execCommand("unlink", false, null);
editor.updateToolbar();
return false;
}
else
{
a.href = href;
}
}
if (!(a && /^a$/i.test(a.tagName)))
{
return false;
}
a.type = param.f_type.trim();
a.target = param.f_target.trim();
a.title = param.f_title.trim();
editor.selectNodeContents(a);
editor.updateToolbar();
};
/** Return a DOM fragment which has all the fields needed to set the
* attributes for a link given a structure of initial values.
*
* OR return a structure of values taken from the currently table.
*/
MootoolsFileManager.prototype.FileManagerAttributes = function (details)
{
var self = this;
self._LastFileDetails = details;
function f(name)
{
var e = self._FileManagerAttributesTable.getElementsByTagName('input');
for(var i = 0; i < e.length; i++)
{
if(e[i].name == name) return e[i];
}
var e = self._FileManagerAttributesTable.getElementsByTagName('select');
for(var i = 0; i < e.length; i++)
{
if(e[i].name == name) return e[i];
}
return null;
}
function s(name, value)
{
for(var i = 0; i < f(name).options.length; i++)
{
if(f(name).options[i].value == value)
{
// f(name).options[i].selected = true;
f(name).selectedIndex = i;
return true;
}
}
return false;
}
if(!this._FileManagerAttributesTable)
{
this._FileManagerAttributesTable = (function() {
var div = document.createElement('div');
var h2 = document.createElement('h2');
h2.appendChild(document.createTextNode('Link Attributes'));
div.appendChild(h2);
var table = document.createElement('table');
div.appendChild(table);
table.className = 'filemanager-extended-options';
var tbody = table.appendChild(document.createElement('tbody'));
{ // Title
var tr = tbody.appendChild(document.createElement('tr'));
var th = tr.appendChild(document.createElement('th'));
var label = th.appendChild(document.createTextNode('Title:'));
var td = tr.appendChild(document.createElement('td'));
var input = td.appendChild(document.createElement('input'));
td.colSpan = 6;
input.name = 'f_title';
input.type = 'text';
th.className = td.className = 'filemanager-f_title';
}
{ // Content Type
var tr = tbody.appendChild(document.createElement('tr'));
var th = tr.appendChild(document.createElement('th'));
var label = th.appendChild(document.createTextNode('Type:'));
var td = tr.appendChild(document.createElement('td'));
var input = td.appendChild(document.createElement('input'));
td.colSpan = 6;
input.name = 'f_type';
input.type = 'text';
th.className = td.className = 'filemanager-f_type';
}
{ // Target
var tr = tbody.appendChild(document.createElement('tr'));
{ // Target
var th = tr.appendChild(document.createElement('th'));
var label = th.appendChild(document.createTextNode('Open In:'));
var td = tr.appendChild(document.createElement('td'));
td.colSpan = 2;
var input = td.appendChild(document.createElement('select'));
input.name = 'f_target';
input.options[0] = new Option('');
input.options[1] = new Option('New Window', '_blank');
input.options[2] = new Option('Top Frame', '_top');
input.options[3] = new Option('Other Frame:', '');
Xinha._addEvent(input, 'change', function()
{
if(f('f_target').selectedIndex == 3)
{
f('f_otherTarget').style.visibility = 'visible';
}
else
{
f('f_otherTarget').style.visibility = 'hidden';
}
});
var input = td.appendChild(document.createElement('input'));
input.name = 'f_otherTarget';
input.size = 7;
input.type = 'text';
input.style.visibility = 'hidden';
th.className = td.className = 'filemanager-f_target';
}
}
return div;
})();
}
if(this.current_attributes)
{
f('f_title').value = this.current_attributes.f_title;
f('f_type').value = this.current_attributes.f_type;
if(this.current_attributes.f_target)
{
if(!s('f_target', this.current_attributes.f_target))
{
f('f_target').selectedIndex = 3;
f('f_otherTarget').value = this.current_attributes.f_target;
}
else
{
f('f_otherTarget').value = '';
}
}
this.current_attributes = null;
}
// If no details were supplied, we return the current ones
if(!details)
{
var details = {
f_title: f('f_title').value,
f_type: f('f_type').value,
f_target: f('f_target').selectedIndex < 3 ? f('f_target').options[f('f_target').selectedIndex].value : f('f_otherTarget').value,
table: this._FileManagerAttributesTable
}
return details;
}
// If details were supplied, we set the appropriate ones.
if(details.mime) f('f_type').value = details.mime;
f('f_target').style.visibility = ''; // Ensure that the select hasn't been hidden by an overlay and not put back
if(f('f_target').selectedIndex == 3)
{
f('f_otherTarget').style.visibility = 'visible';
}
else
{
f('f_otherTarget').style.visibility = 'hidden';
}
return this._FileManagerAttributesTable;
};