wiki-archive/twiki/pub/TWiki/KupuContrib/_kupu/widgeteer/kupuinit.js

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;
};