in jspwiki-war/src/main/scripts/wiki-wysiwyg/Source/MooEditable/MooEditable.js [166:300]
attach: function(){
var self = this;
// Assign view mode
this.mode = 'iframe';
// Editor iframe state
this.editorDisabled = false;
// Put textarea inside container
this.container.wraps(this.textarea);
this.textarea.setStyle('display', 'none');
this.iframe.setStyle('display', '').inject(this.textarea, 'before');
Object.each(this.dialogs, function(action, name){
Object.each(action, function(dialog){
document.id(dialog).inject(self.iframe, 'before');
var range;
dialog.addEvents({
open: function(){
range = self.selection.getRange();
self.editorDisabled = true;
self.toolbar.disable(name);
self.fireEvent('dialogOpen', this);
},
close: function(){
self.toolbar.enable();
self.editorDisabled = false;
self.focus();
if (range) self.selection.setRange(range);
self.fireEvent('dialogClose', this);
}
});
});
});
// contentWindow and document references
this.win = this.iframe.contentWindow;
this.doc = this.win.document;
// Deal with weird quirks on Gecko
if (Browser.firefox) this.doc.designMode = 'On';
// Build the content of iframe
var docHTML = this.options.html.substitute({
BASECSS: this.options.baseCSS,
EXTRACSS: this.options.extraCSS,
EXTERNALCSS: (this.options.externalCSS) ? '<link rel="stylesheet" type="text/css" media="screen" href="' + this.options.externalCSS + '" />': '',
BASEHREF: (this.options.baseURL) ? '<base href="' + this.options.baseURL + '" />': ''
});
this.doc.open();
this.doc.write(docHTML);
this.doc.close();
// Turn on Design Mode
// IE fired load event twice if designMode is set
(Browser.ie) ? this.doc.body.contentEditable = true : this.doc.designMode = 'On';
// Mootoolize window, document and body
Object.append(this.win, new Window);
Object.append(this.doc, new Document);
if (Browser.Element){
var winElement = this.win.Element.prototype;
for (var method in Element){ // methods from Element generics
if (!method.test(/^[A-Z]|\$|prototype|mooEditable/)){
winElement[method] = Element.prototype[method];
}
}
} else {
document.id(this.doc.body);
}
this.setContent(this.textarea.get('value'));
// Bind all events
this.doc.addEvents({
mouseup: this.editorMouseUp.bind(this),
mousedown: this.editorMouseDown.bind(this),
mouseover: this.editorMouseOver.bind(this),
mouseout: this.editorMouseOut.bind(this),
mouseenter: this.editorMouseEnter.bind(this),
mouseleave: this.editorMouseLeave.bind(this),
contextmenu: this.editorContextMenu.bind(this),
click: this.editorClick.bind(this),
dblclick: this.editorDoubleClick.bind(this),
keypress: this.editorKeyPress.bind(this),
keyup: this.editorKeyUp.bind(this),
keydown: this.editorKeyDown.bind(this),
focus: this.editorFocus.bind(this),
blur: this.editorBlur.bind(this)
});
this.win.addEvents({
focus: this.editorFocus.bind(this),
blur: this.editorBlur.bind(this)
});
['cut', 'copy', 'paste'].each(function(event){
self.doc.body.addListener(event, self['editor' + event.capitalize()].bind(self));
});
this.textarea.addEvent('keypress', this.textarea.retrieve('mooeditable:textareaKeyListener', this.keyListener.bind(this)));
// Fix window focus event not firing on Firefox 2
if (Browser.firefox2) this.doc.addEvent('focus', function(){
self.win.fireEvent('focus').focus();
});
// IE9 is also not firing focus event
if (this.doc.addEventListener) this.doc.addEventListener('focus', function(){
self.win.fireEvent('focus');
}, true);
// styleWithCSS, not supported in IE and Opera
if (!Browser.ie && !Browser.opera){
var styleCSS = function(){
self.execute('styleWithCSS', false, false);
self.doc.removeEvent('focus', styleCSS);
};
this.win.addEvent('focus', styleCSS);
}
if (this.options.toolbar){
document.id(this.toolbar).inject(this.container, 'top');
this.toolbar.render(this.actions);
}
if (this.options.disabled) this.disable();
this.selection = new MooEditable.Selection(this.win);
this.oldContent = this.getContent();
this.fireEvent('attach', this);
return this;
},