352 lines
14 KiB
JavaScript
352 lines
14 KiB
JavaScript
/*****************************************************************************
|
|
*
|
|
* Copyright (c) 2003-2005 Kupu Contributors. All rights reserved.
|
|
*
|
|
* This software is distributed under the terms of the Kupu
|
|
* License. See LICENSE.txt for license text. For a list of Kupu
|
|
* Contributors see CREDITS.txt.
|
|
*
|
|
*****************************************************************************/
|
|
|
|
// $Id: kupusilvainit.js 12187 2005-05-11 14:29:58Z guido $
|
|
|
|
// XXX Port this to the default dist?
|
|
KupuEditor.prototype.afterInit = function() {
|
|
// select the line after the first heading, if the document is correctly
|
|
// formatted
|
|
this.getDocument().getWindow().focus();
|
|
var doc = this.getInnerDocument();
|
|
var body = doc.getElementsByTagName('body')[0];
|
|
var h = null;
|
|
var iterator = new NodeIterator(body);
|
|
while (h = iterator.next()) {
|
|
if (h.nodeType == 1 && h.nodeName.toLowerCase() == 'h2') {
|
|
var selection = this.getSelection();
|
|
// okay, the first element node is a h2, select
|
|
// next node, if it doesn't exist create and select
|
|
var next = h.nextSibling;
|
|
if (!next) {
|
|
next = doc.createElement('p');
|
|
next.appendChild(doc.createTextNode('\xa0'));
|
|
body.appendChild(next);
|
|
} else {
|
|
var nodeName = next.nodeName.toLowerCase();
|
|
if (nodeName == 'table') {
|
|
next = next.getElementsByTagName('td')[0];
|
|
} else if (nodeName == 'ul' || nodeName == 'ol') {
|
|
next = next.getElementsByTagName('li')[0];
|
|
};
|
|
};
|
|
selection.selectNodeContents(next);
|
|
selection.collapse();
|
|
break;
|
|
} else if (h.nodeType == 1) {
|
|
break;
|
|
};
|
|
};
|
|
// if we don't first focus the outer window, Mozilla won't show a cursor
|
|
window.focus();
|
|
this.getDocument().getWindow().focus();
|
|
};
|
|
|
|
function WidgeteerDrawerTool() {
|
|
this.drawers = {};
|
|
this.current_drawer = null;
|
|
};
|
|
|
|
//WidgeteerDrawerTool.prototype = new DrawerTool;
|
|
|
|
WidgeteerDrawerTool.prototype.openDrawer = function(id) {
|
|
/* open a drawer
|
|
|
|
overridden so we can place the drawer in the parent document
|
|
*/
|
|
if (this.current_drawer) {
|
|
this.closeDrawer();
|
|
};
|
|
var drawer = this.drawers[id];
|
|
if (this.isIE) {
|
|
drawer.editor._saveSelection();
|
|
};
|
|
|
|
// make sure the right drawertool is available in parent
|
|
parent.drawertool = window.drawertool;
|
|
var parentdoc = parent.document;
|
|
var placeholder = parentdoc.getElementById('drawerplaceholder')
|
|
|
|
drawer.createContent();
|
|
this.current_drawer = drawer;
|
|
if (!parentdoc.importNode) {
|
|
// f$@%ng IE
|
|
var importNode = function(doc, oNode, bImportChildren){
|
|
var oNew;
|
|
|
|
if(oNode.nodeType == 1){
|
|
oNew = doc.createElement(oNode.nodeName);
|
|
for(var i = 0; i < oNode.attributes.length; i++){
|
|
oNew.setAttribute(oNode.attributes[i].name,
|
|
oNode.attributes[i].value);
|
|
}
|
|
oNew.style.cssText = oNode.style.cssText;
|
|
} else if(oNode.nodeType == 3){
|
|
oNew = doc.createTextNode(oNode.nodeValue);
|
|
}
|
|
|
|
if(bImportChildren && oNode.hasChildNodes()){
|
|
for(var oChild = oNode.firstChild; oChild;
|
|
oChild = oChild.nextSibling){
|
|
oNew.appendChild(importNode(doc, oChild, true));
|
|
}
|
|
}
|
|
|
|
return oNew;
|
|
}
|
|
var imported = importNode(parentdoc, drawer.element, 1);
|
|
placeholder.appendChild(imported);
|
|
drawer.element.display = 'none';
|
|
} else {
|
|
parentdoc.importNode(drawer.element, 1);
|
|
placeholder.appendChild(drawer.element);
|
|
};
|
|
drawer.editor.suspendEditing();
|
|
placeholder.style.display = 'block';
|
|
};
|
|
|
|
WidgeteerDrawerTool.prototype.closeDrawer = function(button) {
|
|
if (!this.current_drawer) {
|
|
return;
|
|
};
|
|
this.current_drawer.hide();
|
|
this.current_drawer.editor.resumeEditing();
|
|
this.current_drawer = null;
|
|
var parentdoc = parent.document;
|
|
var placeholder = parentdoc.getElementById('drawerplaceholder')
|
|
placeholder.style.display = 'none';
|
|
};
|
|
|
|
var win = window;
|
|
parent.HandleDrawerEnter = function(event, clickid) {
|
|
var key;
|
|
event = event || win.event;
|
|
key = event.which || event.keyCode;
|
|
|
|
if (key==13) {
|
|
if (clickid) {
|
|
var button = win.document.getElementById(clickid);
|
|
if (button) {
|
|
button.click();
|
|
}
|
|
}
|
|
event.cancelBubble = true;
|
|
if (event.stopPropogation) event.stopPropogation();
|
|
|
|
return false;
|
|
}
|
|
return true;
|
|
};
|
|
|
|
function initKupu(iframe) {
|
|
// we have to perform some tricks to find out what 'our' iframe is in
|
|
// the parent document
|
|
var parentiframes = parent.document.getElementsByTagName('iframe');
|
|
var parentiframe = null;
|
|
for (var i=0; i < parentiframes.length; i++) {
|
|
var pif = parentiframe = parentiframes[i]
|
|
if (pif.contentWindow == window) {
|
|
// load the contents of the textarea into the body element
|
|
iframe.contentWindow.document.getElementsByTagName('body')[0]
|
|
.innerHTML = pif.textarea.value;
|
|
break
|
|
};
|
|
};
|
|
|
|
// first we create a logger
|
|
var l = new DummyLogger();
|
|
|
|
// now some config values
|
|
var conf = loadDictFromXML(document, 'kupuconfig');
|
|
|
|
// the we create the document, hand it over the id of the iframe
|
|
var doc = new KupuDocument(iframe);
|
|
|
|
// now we can create the controller
|
|
var kupu = new KupuEditor(doc, conf, l);
|
|
|
|
var cm = new ContextMenu();
|
|
kupu.setContextMenu(cm);
|
|
|
|
// now we can create a UI object which we can use from the UI
|
|
var ui = new KupuUI('kupu-tb-styles');
|
|
kupu.registerTool('ui', ui);
|
|
|
|
// function that returns a function to execute a button command
|
|
var execCommand = function(cmd) {
|
|
return function(button, editor) {
|
|
editor.execCommand(cmd);
|
|
};
|
|
};
|
|
|
|
var boldchecker = ParentWithStyleChecker(new Array('b', 'strong'),
|
|
'font-weight', 'bold');
|
|
var boldbutton = new KupuStateButton('kupu-bold-button',
|
|
execCommand('bold'),
|
|
boldchecker,
|
|
'kupu-bold',
|
|
'kupu-bold-pressed');
|
|
kupu.registerTool('boldbutton', boldbutton);
|
|
|
|
var italicschecker = ParentWithStyleChecker(new Array('i', 'em'),
|
|
'font-style', 'italic');
|
|
var italicsbutton = new KupuStateButton('kupu-italic-button',
|
|
execCommand('italic'),
|
|
italicschecker,
|
|
'kupu-italic',
|
|
'kupu-italic-pressed');
|
|
kupu.registerTool('italicsbutton', italicsbutton);
|
|
|
|
var underlinechecker = ParentWithStyleChecker(new Array('u'));
|
|
var underlinebutton = new KupuStateButton('kupu-underline-button',
|
|
execCommand('underline'),
|
|
underlinechecker,
|
|
'kupu-underline',
|
|
'kupu-underline-pressed');
|
|
kupu.registerTool('underlinebutton', underlinebutton);
|
|
|
|
var subscriptchecker = ParentWithStyleChecker(new Array('sub'));
|
|
var subscriptbutton = new KupuStateButton('kupu-subscript-button',
|
|
execCommand('subscript'),
|
|
subscriptchecker,
|
|
'kupu-subscript',
|
|
'kupu-subscript-pressed');
|
|
kupu.registerTool('subscriptbutton', subscriptbutton);
|
|
|
|
var superscriptchecker = ParentWithStyleChecker(new Array('super', 'sup'));
|
|
var superscriptbutton = new KupuStateButton('kupu-superscript-button',
|
|
execCommand('superscript'),
|
|
superscriptchecker,
|
|
'kupu-superscript',
|
|
'kupu-superscript-pressed');
|
|
kupu.registerTool('superscriptbutton', superscriptbutton);
|
|
|
|
var undobutton = new KupuButton('kupu-undo-button', execCommand('undo'))
|
|
kupu.registerTool('undobutton', undobutton);
|
|
|
|
var redobutton = new KupuButton('kupu-redo-button', execCommand('redo'))
|
|
kupu.registerTool('redobutton', redobutton);
|
|
|
|
var colorchoosertool = new ColorchooserTool('kupu-forecolor-button',
|
|
'kupu-hilitecolor-button',
|
|
'kupu-colorchooser');
|
|
kupu.registerTool('colorchooser', colorchoosertool);
|
|
var listtool = new ListTool('kupu-list-ul-addbutton', 'kupu-list-ol-addbutton',
|
|
'kupu-ulstyles', 'kupu-olstyles');
|
|
kupu.registerTool('listtool', listtool);
|
|
|
|
var dltool = new DefinitionListTool('kupu-list-dl-addbutton');
|
|
kupu.registerTool('dltool', dltool);
|
|
|
|
var imagetool = new ImageTool();
|
|
kupu.registerTool('imagetool', imagetool);
|
|
var handler = function() {
|
|
var create_handler = new ContextFixer(imagetool.createImage,
|
|
imagetool).execute;
|
|
parent.browser_manager.startBrowser(create_handler,
|
|
parentiframe.textarea.getAttribute('widget:imagepath'),
|
|
['image/jpeg', 'image/png',
|
|
'image/gif']);
|
|
};
|
|
addEventHandler(document.getElementById('kupu-image-button'), 'click',
|
|
handler);
|
|
|
|
var linktool = new LinkTool();
|
|
kupu.registerTool('linktool', linktool);
|
|
var handler = function() {
|
|
var create_handler = new ContextFixer(linktool.createLink,
|
|
linktool).execute;
|
|
parent.browser_manager.startBrowser(create_handler,
|
|
parentiframe.textarea.getAttribute('widget:linkpath'));
|
|
};
|
|
addEventHandler(document.getElementById('kupu-intlink-button'), 'click',
|
|
handler);
|
|
|
|
var tabletool = new TableTool();
|
|
kupu.registerTool('tabletool', tabletool);
|
|
|
|
var showpathtool = new ShowPathTool();
|
|
kupu.registerTool('showpathtool', showpathtool);
|
|
|
|
var sourceedittool = new SourceEditTool('kupu-source-button',
|
|
'kupu-editor-textarea');
|
|
kupu.registerTool('sourceedittool', sourceedittool);
|
|
|
|
var spellchecker = new KupuSpellChecker('kupu-spellchecker-button',
|
|
'kupu_spellcheck');
|
|
kupu.registerTool('spellchecker', spellchecker);
|
|
|
|
var viewsourcetool = new ViewSourceTool();
|
|
kupu.registerTool('viewsourcetool', viewsourcetool);
|
|
|
|
/*
|
|
// Function that returns function to open a drawer
|
|
var opendrawer = function(drawerid) {
|
|
return function(button, editor) {
|
|
drawertool.openDrawer(drawerid);
|
|
};
|
|
};
|
|
|
|
var imagelibdrawerbutton = new KupuButton('kupu-imagelibdrawer-button',
|
|
opendrawer('imagelibdrawer'));
|
|
kupu.registerTool('imagelibdrawerbutton', imagelibdrawerbutton);
|
|
|
|
var linklibdrawerbutton = new KupuButton('kupu-linklibdrawer-button',
|
|
opendrawer('linklibdrawer'));
|
|
kupu.registerTool('linklibdrawerbutton', linklibdrawerbutton);
|
|
|
|
var linkdrawerbutton = new KupuButton('kupu-linkdrawer-button',
|
|
opendrawer('linkdrawer'));
|
|
kupu.registerTool('linkdrawerbutton', linkdrawerbutton);
|
|
|
|
var tabledrawerbutton = new KupuButton('kupu-tabledrawer-button',
|
|
opendrawer('tabledrawer'));
|
|
kupu.registerTool('tabledrawerbutton', tabledrawerbutton);
|
|
|
|
// create some drawers, drawers are some sort of popups that appear when a
|
|
// toolbar button is clicked
|
|
var drawertool = new WidgeteerDrawerTool();
|
|
kupu.registerTool('drawertool', drawertool);
|
|
|
|
var linklibdrawer = new LinkLibraryDrawer(linktool, conf['link_xsl_uri'],
|
|
conf['link_libraries_uri'],
|
|
conf['link_images_uri']);
|
|
drawertool.registerDrawer('linklibdrawer', linklibdrawer);
|
|
|
|
var imagelibdrawer = new ImageLibraryDrawer(imagetool, conf['image_xsl_uri'],
|
|
conf['image_libraries_uri'],
|
|
conf['search_images_uri']);
|
|
drawertool.registerDrawer('imagelibdrawer', imagelibdrawer);
|
|
|
|
var linkdrawer = new LinkDrawer('kupu-linkdrawer', linktool);
|
|
drawertool.registerDrawer('linkdrawer', linkdrawer);
|
|
|
|
var tabledrawer = new TableDrawer('kupu-tabledrawer', tabletool);
|
|
drawertool.registerDrawer('tabledrawer', tabledrawer);
|
|
*/
|
|
|
|
// var nonxhtmltagfilter = new NonXHTMLTagFilter();
|
|
// kupu.registerFilter(nonxhtmltagfilter);
|
|
|
|
kupu.xhtmlvalid.setAttrFilter(['is_toc', 'toc_depth', 'is_citation',
|
|
'source', 'author', 'source_id',
|
|
'silva_type', 'alignment',
|
|
'link_to_hires', 'link']);
|
|
// allow all attributes on div, since ExternalSources require that
|
|
kupu.xhtmlvalid.includeTagAttributes(['div'], ['*']);
|
|
kupu.xhtmlvalid.includeTagAttributes(['p'], ['silva_type']);
|
|
kupu.xhtmlvalid.includeTagAttributes(['h6'], ['silva_type']);
|
|
kupu.xhtmlvalid.includeTagAttributes(['img'], ['alignment',
|
|
'link_to_hires',
|
|
'target', 'link']);
|
|
|
|
return kupu;
|
|
};
|