Professional Documents
Culture Documents
var tinymce = {
majorVersion : '3',
minorVersion : '5.8',
releaseDate : '2012-11-20',
_init : function() {
var t = this, d = document, na = navigator, ua = na.userAgent, i,
nl, n, base, p, v;
t.isWebKit = /WebKit/.test(ua);
t.isIDevice = /(iPad|iPhone)/.test(ua);
function getBase(n) {
if (n.src && /tiny_mce(|_gzip|_jquery|_prototype|_full)
(_dev|_src)?.js/.test(n.src)) {
if (/_(src|dev)\.js/g.test(n.src))
t.suffix = '_src';
t.baseURL = n.src.substring(0,
n.src.lastIndexOf('/'));
return t.baseURL;
}
return null;
};
// Check document
nl = d.getElementsByTagName('script');
for (i=0; i<nl.length; i++) {
if (getBase(nl[i]))
return;
}
// Check head
n = d.getElementsByTagName('head')[0];
if (n) {
nl = n.getElementsByTagName('script');
for (i=0; i<nl.length; i++) {
if (getBase(nl[i]))
return;
}
}
return;
},
is : function(o, t) {
if (!t)
return o !== undef;
return typeof(o) == t;
},
if (typeof(items) == "string")
items = items.split(delim);
i = items.length;
while (i--)
map[items[i]] = {};
return map;
},
if (!o)
return 0;
s = s || o;
return 1;
},
map : function(a, f) {
var o = [];
tinymce.each(a, function(v) {
o.push(f(v));
});
return o;
},
grep : function(a, f) {
var o = [];
tinymce.each(a, function(v) {
if (!f || f(v))
o.push(v);
});
return o;
},
inArray : function(a, v) {
var i, l;
if (a) {
for (i = 0, l = a.length; i < l; i++) {
if (a[i] === v)
return i;
}
}
return -1;
},
return obj;
},
trim : function(s) {
return (s ? '' + s : '').replace(whiteSpaceRe, '');
},
if (this.onCreate)
this.onCreate(s[2], s[3], ns[cn]);
return;
}
// Extend
if (s[5]) {
sp = t.resolve(s[5]).prototype;
scn = s[5].match(/\.(\w+)$/i)[1]; // Class name
// Extend constructor
c = ns[cn];
if (de) {
// Add passthrough constructor
ns[cn] = function() {
return sp[scn].apply(this, arguments);
};
} else {
// Add inherit constructor
ns[cn] = function() {
this.parent = sp[scn];
return c.apply(this, arguments);
};
}
ns[cn].prototype[cn] = ns[cn];
if (this.onCreate)
this.onCreate(s[2], s[3], ns[cn].prototype);
},
walk : function(o, f, n, s) {
s = s || this;
if (o) {
if (n)
o = o[n];
tinymce.each(o, function(o, i) {
if (f.call(s, o, i, n) === false)
return false;
tinymce.walk(o, f, n, s);
});
}
},
createNS : function(n, o) {
var i, v;
o = o || win;
n = n.split('.');
for (i=0; i<n.length; i++) {
v = n[i];
if (!o[v])
o[v] = {};
o = o[v];
}
return o;
},
resolve : function(n, o) {
var i, l;
o = o || win;
n = n.split('.');
for (i = 0, l = n.length; i < l; i++) {
o = o[n[i]];
if (!o)
break;
}
return o;
},
addUnload : function(f, s) {
var t = this, unload;
unload = function() {
var li = t.unloads, o, n;
if (li) {
// Call unload handlers
for (n in li) {
o = li[n];
if (o && o.func)
o.func.call(o.scope, 1); // Send in one
arg to distinct unload and user destroy
}
// Destroy references
t.unloads = o = li = w = unload = 0;
function fakeUnload() {
var d = document;
function stop() {
// Prevent memory leak
d.detachEvent('onstop', stop);
d = 0;
};
if (!t.unloads) {
// Attach unload handler
if (win.attachEvent) {
win.attachEvent('onunload', unload);
win.attachEvent('onbeforeunload', fakeUnload);
} else if (win.addEventListener)
win.addEventListener('unload', unload, false);
return f;
},
removeUnload : function(f) {
var u = this.unloads, r = null;
tinymce.each(u, function(o, i) {
if (o && o.func == f) {
u.splice(i, 1);
r = f;
return false;
}
});
return r;
},
explode : function(s, d) {
if (!s || tinymce.is(s, 'array')) {
return s;
}
_addVer : function(u) {
var v;
if (!this.query)
return u;
if (u.indexOf('#') == -1)
return u + v;
};
})(window);
tinymce.create('tinymce.util.Dispatcher', {
scope : null,
listeners : null,
inDispatch: false,
Dispatcher : function(scope) {
this.scope = scope || this;
this.listeners = [];
},
return callback;
},
return callback;
},
remove : function(callback) {
var listeners = this.listeners, output = null;
tinymce.each(listeners, function(listener, i) {
if (callback == listener.cb) {
output = listener;
listeners.splice(i, 1);
return false;
}
});
return output;
},
dispatch : function() {
var self = this, returnValue, args = arguments, i, listeners =
self.listeners, listener;
self.inDispatch = true;
// Needs to be a real loop since the listener count might change while
looping
// And this is also more efficient
for (i = 0; i < listeners.length; i++) {
listener = listeners[i];
returnValue = listener.cb.apply(listener.scope, args.length > 0 ?
args : [listener.scope]);
self.inDispatch = false;
return returnValue;
}
});
(function() {
var each = tinymce.each;
tinymce.create('tinymce.util.URI', {
URI : function(u, s) {
var t = this, o, a, b, base_url;
// Trim whitespace
u = tinymce.trim(u);
// Default settings
s = t.settings = s || {};
each(["source","protocol","authority","userInfo","user","password","host","port","r
elative","path","directory","file","query","anchor"], function(v, i) {
var s = u[i];
t[v] = s;
});
b = s.base_uri;
if (b) {
if (!t.protocol)
t.protocol = b.protocol;
if (!t.userInfo)
t.userInfo = b.userInfo;
t.source = '';
}
setPath : function(p) {
var t = this;
p = /^(.*?)\/?(\w+)?$/.exec(p);
// Rebuild source
t.source = '';
t.getURI();
},
toRelative : function(u) {
var t = this, o;
if (u === "./")
return u;
o = t.toRelPath(t.path, u.path);
// Add query
if (u.query)
o += '?' + u.query;
// Add anchor
if (u.anchor)
o += '#' + u.anchor;
return o;
},
if (bp === 1)
return path;
return out;
},
// Split paths
tr = /\/$/.test(path) ? '/' : '';
base = base.split('/');
path = path.split('/');
base = o;
// Is parent
if (path[i] === '..') {
nb++;
continue;
}
// Move up
if (nb > 0) {
nb--;
continue;
}
o.push(path[i]);
}
i = base.length - nb;
// If /a/b/c or /
if (i <= 0)
outPath = o.reverse().join('/');
else
outPath = base.slice(0, i).join('/') + '/' +
o.reverse().join('/');
return outPath;
},
getURI : function(nh) {
var s, t = this;
// Rebuild source
if (!t.source || nh) {
s = '';
if (!nh) {
if (t.protocol)
s += t.protocol + '://';
if (t.userInfo)
s += t.userInfo + '@';
if (t.host)
s += t.host;
if (t.port)
s += ':' + t.port;
}
if (t.path)
s += t.path;
if (t.query)
s += '?' + t.query;
if (t.anchor)
s += '#' + t.anchor;
t.source = s;
}
return t.source;
}
});
})();
(function() {
var each = tinymce.each;
tinymce.create('static tinymce.util.Cookie', {
getHash : function(n) {
var v = this.get(n), h;
if (v) {
each(v.split('&'), function(v) {
v = v.split('=');
h = h || {};
h[unescape(v[0])] = unescape(v[1]);
});
}
return h;
},
setHash : function(n, v, e, p, d, s) {
var o = '';
each(v, function(v, k) {
o += (!o ? '' : '&') + escape(k) + '=' + escape(v);
});
this.set(n, o, e, p, d, s);
},
get : function(n) {
var c = document.cookie, e, p = n + "=", b;
// Strict mode
if (!c)
return;
if (b == -1) {
b = c.indexOf(p);
if (b !== 0)
return null;
} else
b += 2;
e = c.indexOf(";", b);
if (e == -1)
e = c.length;
set : function(n, v, e, p, d, s) {
document.cookie = n + "=" + escape(v) +
((e) ? "; expires=" + e.toGMTString() : "") +
((p) ? "; path=" + escape(p) : "") +
((d) ? "; domain=" + d : "") +
((s) ? "; secure" : "");
},
date.setTime(date.getTime() - 1000);
(function() {
function serialize(o, quote) {
var i, v, t, name;
if (o == null)
return 'null';
t = typeof o;
if (t == 'string') {
v = '\bb\tt\nn\ff\rr\""\'\'\\\\';
i = v.indexOf(b);
if (i + 1)
return '\\' + v.charAt(i + 1);
a = b.charCodeAt().toString(16);
if (t == 'object') {
if (o.hasOwnProperty && Object.prototype.toString.call(o) ===
'[object Array]') {
for (i=0, v = '['; i<o.length; i++)
v += (i > 0 ? ',' : '') + serialize(o[i],
quote);
return v + ']';
}
v = '{';
for (name in o) {
if (o.hasOwnProperty(name)) {
v += typeof o[name] != 'function' ? (v.length >
1 ? ',' + quote : quote) + name + quote +':' + serialize(o[name], quote) : '';
}
}
return v + '}';
}
return '' + o;
};
tinymce.util.JSON = {
serialize: serialize,
parse: function(s) {
try {
return eval('(' + s + ')');
} catch (ex) {
// Ignore
}
}
};
})();
tinymce.create('static tinymce.util.XHR', {
send : function(o) {
var x, t, w = window, c = 0;
function ready() {
if (!o.async || x.readyState == 4 || c++ > 10000) {
if (o.success && c < 10000 && x.status == 200)
o.success.call(o.success_scope, '' + x.responseText,
x, o);
else if (o.error)
o.error.call(o.error_scope, c > 10000 ? 'TIMED_OUT' :
'GENERAL', x, o);
x = null;
} else
w.setTimeout(ready, 10);
};
// Default settings
o.scope = o.scope || this;
o.success_scope = o.success_scope || o.scope;
o.error_scope = o.error_scope || o.scope;
o.async = o.async === false ? false : true;
o.data = o.data || '';
function get(s) {
x = 0;
try {
x = new ActiveXObject(s);
} catch (ex) {
}
return x;
};
if (x) {
if (x.overrideMimeType)
x.overrideMimeType(o.content_type);
if (o.content_type)
x.setRequestHeader('Content-Type', o.content_type);
x.setRequestHeader('X-Requested-With', 'XMLHttpRequest');
x.send(o.data);
// Syncronous request
if (!o.async)
return ready();
(function() {
var extend = tinymce.extend, JSON = tinymce.util.JSON, XHR =
tinymce.util.XHR;
tinymce.create('tinymce.util.JSONRequest', {
JSONRequest : function(s) {
this.settings = extend({
}, s);
this.count = 0;
},
send : function(o) {
var ecb = o.error, scb = o.success;
o = extend(this.settings, o);
o.success = function(c, x) {
c = JSON.parse(c);
if (typeof(c) == 'undefined') {
c = {
error : 'JSON Parse error.'
};
}
if (c.error)
ecb.call(o.error_scope || o.scope, c.error, x);
else
scb.call(o.success_scope || o.scope, c.result);
};
o.error = function(ty, x) {
if (ecb)
ecb.call(o.error_scope || o.scope, ty, x);
};
o.data = JSON.serialize({
id : o.id || 'c' + (this.count++),
method : o.method,
params : o.params
});
XHR.send(o);
},
'static' : {
sendRPC : function(o) {
return new tinymce.util.JSONRequest().send(o);
}
}
});
}());
(function(tinymce){
tinymce.VK = {
BACKSPACE: 8,
DELETE: 46,
DOWN: 40,
ENTER: 13,
LEFT: 37,
RIGHT: 39,
SPACEBAR: 32,
TAB: 9,
UP: 38,
metaKeyPressed: function(e) {
// Check if ctrl or meta key is pressed also check if alt is
false for Polish users
return tinymce.isMac ? e.metaKey : e.ctrlKey && !e.altKey;
}
};
})(tinymce);
tinymce.util.Quirks = function(editor) {
var VK = tinymce.VK, BACKSPACE = VK.BACKSPACE, DELETE = VK.DELETE, dom =
editor.dom, selection = editor.selection,
settings = editor.settings, parser = editor.parser, serializer =
editor.serializer, each = tinymce.each;
function getDocumentMode() {
var documentMode = editor.getDoc().documentMode;
function isDefaultPrevented(e) {
return e.isDefaultPrevented();
};
// SGY-5281 patched
// @see
https://github.com/tinymce/tinymce/commit/113bd1ceaef1e1de5f2fdf54633d58424817182c
function cleanupStylesWhenDeleting() {
function removeMergedFormatSpans(isDelete) {
var rng, blockElm, wrapperElm, bookmark, container, offset;
function isAtStartOrEndOfElm() {
if (container.nodeType == 3) {
if (isDelete && offset == container.length) {
return true;
}
rng = selection.getRng();
container = rng[(isDelete ? 'start' : 'end') + 'Container'];
offset = rng[(isDelete ? 'start' : 'end') + 'Offset'];
if (container.nodeType == 3) {
blockElm = dom.getParent(rng.startContainer, dom.isBlock);
each(tinymce.grep(blockElm.childNodes), function(node) {
wrapperElm.appendChild(node);
});
blockElm.appendChild(wrapperElm);
}
}
// Do the backspace/delete action
editor.getDoc().execCommand(isDelete ? 'ForwardDelete' : 'Delete', false,
null);
editor.onKeyDown.add(function(editor, e) {
var isDelete;
function emptyEditorWhenDeleting() {
function serializeRng(rng) {
var body = dom.create("body");
var contents = rng.cloneContents();
body.appendChild(contents);
return selection.serializer.serialize(body, {format: 'html'});
}
function allContentsSelected(rng) {
var selection = serializeRng(rng);
editor.onKeyDown.add(function(editor, e) {
var keyCode = e.keyCode, isCollapsed;
function selectAll() {
editor.onKeyDown.add(function(editor, e) {
if (!isDefaultPrevented(e) && e.keyCode == 65 &&
VK.metaKeyPressed(e)) {
e.preventDefault();
editor.execCommand('SelectAll');
}
});
};
function inputMethodFocus() {
if (!editor.settings.content_editable) {
// Case 1 IME doesn't initialize if you focus the document
dom.bind(editor.getDoc(), 'focusin', function(e) {
selection.setRng(selection.getRng());
});
function removeHrOnBackspace() {
editor.onKeyDown.add(function(editor, e) {
if (!isDefaultPrevented(e) && e.keyCode === BACKSPACE) {
if (selection.isCollapsed() &&
selection.getRng(true).startOffset === 0) {
var node = selection.getNode();
var previousSibling = node.previousSibling;
function focusBody() {
// Fix for a focus bug in FF 3.x where the body element
// wouldn't get proper focus if the user clicked on the HTML element
if (!Range.prototype.getClientRects) { // Detect getClientRects got
introduced in FF 4
editor.onMouseDown.add(function(editor, e) {
if (!isDefaultPrevented(e) && e.target.nodeName === "HTML")
{
var body = editor.getBody();
function selectControlElements() {
editor.onClick.add(function(editor, e) {
e = e.target;
editor.nodeChanged();
});
};
function removeStylesWhenDeletingAccrossBlockElements() {
function getAttributeApplyFunction() {
var template =
dom.getAttribs(selection.getStart().cloneNode(false));
return function() {
var target = selection.getStart();
each(template, function(attr) {
target.setAttributeNode(attr.cloneNode(true));
});
}
};
}
function isSelectionAcrossElements() {
return !selection.isCollapsed() &&
dom.getParent(selection.getStart(), dom.isBlock) !=
dom.getParent(selection.getEnd(), dom.isBlock);
}
function blockEvent(editor, e) {
e.preventDefault();
return false;
}
editor.onKeyPress.add(function(editor, e) {
var applyAttributes;
setTimeout(function() {
applyAttributes();
editor.onKeyUp.remove(blockEvent);
}, 0);
}
});
}
function selectionChangeNodeChanged() {
var lastRng, selectionTimer;
selectionTimer = window.setTimeout(function() {
var rng = selection.getRng();
function ensureBodyHasRoleApplication() {
document.body.setAttribute("role", "application");
}
function disableBackspaceIntoATable() {
editor.onKeyDown.add(function(editor, e) {
if (!isDefaultPrevented(e) && e.keyCode === BACKSPACE) {
if (selection.isCollapsed() &&
selection.getRng(true).startOffset === 0) {
var previousSibling =
selection.getNode().previousSibling;
if (previousSibling && previousSibling.nodeName &&
previousSibling.nodeName.toLowerCase() === "table") {
return tinymce.dom.Event.cancel(e);
}
}
}
})
}
function addNewLinesBeforeBrInPre() {
// IE8+ rendering mode does the right thing with BR in PRE
if (getDocumentMode() > 7) {
return;
}
// Enable display: none in area and add a specific class that hides
all BR elements in PRE to
// avoid the caret from getting stuck at the BR elements while
pressing the right arrow key
setEditorCommandState('RespectVisibilityInDesign', true);
editor.contentStyles.push('.mceHideBrInPre pre br {display: none}');
dom.addClass(editor.getBody(), 'mceHideBrInPre');
while (i--) {
brNodes = nodes[i].getAll('br');
j = brNodes.length;
while (j--) {
brElm = brNodes[j];
while (i--) {
brNodes = nodes[i].getAll('br');
j = brNodes.length;
while (j--) {
brElm = brNodes[j];
sibling = brElm.prev;
if (sibling && sibling.type == 3) {
sibling.value = sibling.value.replace(/\r?\n$/,
'');
}
}
}
});
}
function removePreSerializedStylesWhenSelectingControls() {
dom.bind(editor.getBody(), 'mouseup', function(e) {
var value, node = selection.getNode();
function keepInlineElementOnDeleteBackspace() {
editor.onKeyDown.add(function(editor, e) {
var isDelete, rng, container, offset, brElm, sibling, collapsed;
function removeBlockQuoteOnBackSpace() {
// Add block quote deletion handler
editor.onKeyDown.add(function(editor, e) {
var rng, container, offset, root, parent;
rng = selection.getRng();
container = rng.startContainer;
offset = rng.startOffset;
root = dom.getRoot();
parent = container;
function setGeckoEditingOptions() {
function setOpts() {
editor._refreshContentEditable();
setEditorCommandState("StyleWithCSS", false);
setEditorCommandState("enableInlineTableEditing", false);
if (!settings.object_resizing) {
setEditorCommandState("enableObjectResizing", false);
}
};
if (!settings.readonly) {
editor.onBeforeExecCommand.add(setOpts);
editor.onMouseDown.add(setOpts);
}
};
function addBrAfterLastLinks() {
function fixLinks(editor, o) {
each(dom.select('a'), function(node) {
var parentNode = node.parentNode, root = dom.getRoot();
parentNode = parentNode.parentNode;
}
editor.onExecCommand.add(function(editor, cmd) {
if (cmd === 'CreateLink') {
fixLinks(editor);
}
});
editor.onSetContent.add(selection.onSetContent.add(fixLinks));
};
function setDefaultBlockType() {
if (settings.forced_root_block) {
editor.onInit.add(function() {
setEditorCommandState('DefaultParagraphSeparator',
settings.forced_root_block);
});
}
}
function removeGhostSelection() {
function repaint(sender, args) {
if (!sender || !args.initial) {
editor.execCommand('mceRepaint');
}
};
editor.onUndo.add(repaint);
editor.onRedo.add(repaint);
editor.onSetContent.add(repaint);
};
function deleteControlItemOnBackSpace() {
editor.onKeyDown.add(function(editor, e) {
var rng;
function renderEmptyBlocksFix() {
var emptyBlocksCSS;
// IE10+
if (getDocumentMode() >= 10) {
emptyBlocksCSS = '';
each('p div h1 h2 h3 h4 h5 h6'.split(' '), function(name, i) {
emptyBlocksCSS += (i > 0 ? ',' : '') + name + ':empty';
});
function fakeImageResize() {
var selectedElmX, selectedElmY, selectedElm, selectedElmGhost,
selectedHandle, startX, startY, startW, startH, ratio,
resizeHandles, width, height, rootDocument = document,
editableDoc = editor.getDoc();
function resizeElement(e) {
var deltaX, deltaY;
function endResize() {
function setSizeProp(name, value) {
if (value) {
// Resize by using style or attribute
if (selectedElm.style[name] || !
editor.schema.isValid(selectedElm.nodeName.toLowerCase(), name)) {
dom.setStyle(selectedElm, name, value);
} else {
dom.setAttrib(selectedElm, name, value);
}
}
}
if (rootDocument != editableDoc) {
dom.unbind(rootDocument, 'mousemove', resizeElement);
dom.unbind(rootDocument, 'mouseup', endResize);
}
function showResizeRect(targetElm) {
var position, targetWidth, targetHeight;
hideResizeRect();
endResize();
startX = e.screenX;
startY = e.screenY;
startW = selectedElm.clientWidth;
startH = selectedElm.clientHeight;
ratio = startH / startW;
selectedHandle = handle;
selectedElmGhost = selectedElm.cloneNode(true);
dom.addClass(selectedElmGhost,
'mceClonedResizable');
dom.setStyles(selectedElmGhost, {
left: selectedElmX,
top: selectedElmY,
margin: 0
});
editableDoc.documentElement.appendChild(selectedElmGhost);
dom.bind(editableDoc, 'mousemove',
resizeElement);
dom.bind(editableDoc, 'mouseup', endResize);
if (rootDocument != editableDoc) {
dom.bind(rootDocument, 'mousemove',
resizeElement);
dom.bind(rootDocument, 'mouseup',
endResize);
}
});
} else {
dom.show(handleElm);
}
// Position element
dom.setStyles(handleElm, {
left: (targetWidth * handle[0] + selectedElmX) -
(handleElm.offsetWidth / 2),
top: (targetHeight * handle[1] + selectedElmY) -
(handleElm.offsetHeight / 2)
});
});
function hideResizeRect() {
if (selectedElm) {
selectedElm.removeAttribute('data-mce-selected');
}
function updateResizeRect() {
var controlElm = dom.getParent(selection.getNode(), 'table,img');
if (controlElm) {
showResizeRect(controlElm);
} else {
hideResizeRect();
}
}
// Show/hide resize rect when image is selected
editor.onNodeChange.add(updateResizeRect);
while (i--) {
nodes[i].attr(name, null);
}
});
}
function keepNoScriptContents() {
if (getDocumentMode() < 9) {
parser.addNodeFilter('noscript', function(nodes) {
var i = nodes.length, node, textNode;
while (i--) {
node = nodes[i];
textNode = node.firstChild;
if (textNode) {
node.attr('data-mce-innertext',
textNode.value);
}
}
});
serializer.addNodeFilter('noscript', function(nodes) {
var i = nodes.length, node, textNode, value;
while (i--) {
node = nodes[i];
textNode = nodes[i].firstChild;
if (textNode) {
textNode.value =
tinymce.html.Entities.decode(textNode.value);
} else {
// Old IE can't retain noscript value so an
attribute is used to store it
value = node.attributes.map['data-mce-
innertext'];
if (value) {
node.attr('data-mce-innertext', null);
textNode = new tinymce.html.Node('#text',
3);
textNode.value = value;
textNode.raw = true;
node.append(textNode);
}
}
}
});
}
}
// All browsers
disableBackspaceIntoATable();
removeBlockQuoteOnBackSpace();
emptyEditorWhenDeleting();
// WebKit
if (tinymce.isWebKit) {
keepInlineElementOnDeleteBackspace();
cleanupStylesWhenDeleting();
inputMethodFocus();
selectControlElements();
setDefaultBlockType();
// iOS
if (tinymce.isIDevice) {
selectionChangeNodeChanged();
} else {
fakeImageResize();
selectAll();
}
}
// IE
if (tinymce.isIE) {
removeHrOnBackspace();
ensureBodyHasRoleApplication();
addNewLinesBeforeBrInPre();
removePreSerializedStylesWhenSelectingControls();
deleteControlItemOnBackSpace();
renderEmptyBlocksFix();
keepNoScriptContents();
}
// Gecko
if (tinymce.isGecko) {
removeHrOnBackspace();
focusBody();
removeStylesWhenDeletingAccrossBlockElements();
setGeckoEditingOptions();
addBrAfterLastLinks();
removeGhostSelection();
}
// Opera
if (tinymce.isOpera) {
fakeImageResize();
}
};
(function(tinymce) {
var namedEntities, baseEntities, reverseEntities,
attrsCharsRegExp = /[&<>\"\u007E-\uD7FF\uE000-\uFFEF]|[\uD800-\uDBFF]
[\uDC00-\uDFFF]/g,
textCharsRegExp = /[<>&\u007E-\uD7FF\uE000-\uFFEF]|[\uD800-\uDBFF]
[\uDC00-\uDFFF]/g,
rawCharsRegExp = /[<>&\"\']/g,
entityRegExp = /&(#x|#)?([\w]+);/g,
asciiMap = {
128 : "\u20AC", 130 : "\u201A", 131 : "\u0192", 132 :
"\u201E", 133 : "\u2026", 134 : "\u2020",
135 : "\u2021", 136 : "\u02C6", 137 : "\u2030", 138 :
"\u0160", 139 : "\u2039", 140 : "\u0152",
142 : "\u017D", 145 : "\u2018", 146 : "\u2019", 147 :
"\u201C", 148 : "\u201D", 149 : "\u2022",
150 : "\u2013", 151 : "\u2014", 152 : "\u02DC", 153 :
"\u2122", 154 : "\u0161", 155 : "\u203A",
156 : "\u0153", 158 : "\u017E", 159 : "\u0178"
};
// Raw entities
baseEntities = {
'\"' : '"', // Needs to be escaped since the YUI compressor would
otherwise break the code
"'" : ''',
'<' : '<',
'>' : '>',
'&' : '&'
};
elm = document.createElement("div");
elm.innerHTML = text;
if (items) {
items = items.split(',');
radix = radix || 10;
return lookup;
}
};
// Unpack entities lookup where the numbers are in radix 32 to reduce the
size
namedEntities = buildEntitiesLookup(
'50,nbsp,51,iexcl,52,cent,53,pound,54,curren,55,yen,56,brvbar,57,sect,5
8,uml,59,copy,' +
'5a,ordf,5b,laquo,5c,not,5d,shy,5e,reg,5f,macr,5g,deg,5h,plusmn,5i,sup2
,5j,sup3,5k,acute,' +
'5l,micro,5m,para,5n,middot,5o,cedil,5p,sup1,5q,ordm,5r,raquo,5s,frac14
,5t,frac12,5u,frac34,' +
'5v,iquest,60,Agrave,61,Aacute,62,Acirc,63,Atilde,64,Auml,65,Aring,66,A
Elig,67,Ccedil,' +
'68,Egrave,69,Eacute,6a,Ecirc,6b,Euml,6c,Igrave,6d,Iacute,6e,Icirc,6f,I
uml,6g,ETH,6h,Ntilde,' +
'6i,Ograve,6j,Oacute,6k,Ocirc,6l,Otilde,6m,Ouml,6n,times,6o,Oslash,6p,U
grave,6q,Uacute,' +
'6r,Ucirc,6s,Uuml,6t,Yacute,6u,THORN,6v,szlig,70,agrave,71,aacute,72,ac
irc,73,atilde,74,auml,' +
'75,aring,76,aelig,77,ccedil,78,egrave,79,eacute,7a,ecirc,7b,euml,7c,ig
rave,7d,iacute,7e,icirc,' +
'7f,iuml,7g,eth,7h,ntilde,7i,ograve,7j,oacute,7k,ocirc,7l,otilde,7m,oum
l,7n,divide,7o,oslash,' +
'7p,ugrave,7q,uacute,7r,ucirc,7s,uuml,7t,yacute,7u,thorn,7v,yuml,ci,fno
f,sh,Alpha,si,Beta,' +
'sj,Gamma,sk,Delta,sl,Epsilon,sm,Zeta,sn,Eta,so,Theta,sp,Iota,sq,Kappa,
sr,Lambda,ss,Mu,' +
'st,Nu,su,Xi,sv,Omicron,t0,Pi,t1,Rho,t3,Sigma,t4,Tau,t5,Upsilon,t6,Phi,
t7,Chi,t8,Psi,' +
't9,Omega,th,alpha,ti,beta,tj,gamma,tk,delta,tl,epsilon,tm,zeta,tn,eta,
to,theta,tp,iota,' +
'tq,kappa,tr,lambda,ts,mu,tt,nu,tu,xi,tv,omicron,u0,pi,u1,rho,u2,sigmaf
,u3,sigma,u4,tau,' +
'u5,upsilon,u6,phi,u7,chi,u8,psi,u9,omega,uh,thetasym,ui,upsih,um,piv,8
12,bull,816,hellip,' +
'81i,prime,81j,Prime,81u,oline,824,frasl,88o,weierp,88h,image,88s,real,
892,trade,89l,alefsym,' +
'8cg,larr,8ch,uarr,8ci,rarr,8cj,darr,8ck,harr,8dl,crarr,8eg,lArr,8eh,uA
rr,8ei,rArr,8ej,dArr,' +
'8ek,hArr,8g0,forall,8g2,part,8g3,exist,8g5,empty,8g7,nabla,8g8,isin,8g
9,notin,8gb,ni,8gf,prod,' +
'8gh,sum,8gi,minus,8gn,lowast,8gq,radic,8gt,prop,8gu,infin,8h0,ang,8h7,
and,8h8,or,8h9,cap,8ha,cup,' +
'8hb,int,8hk,there4,8hs,sim,8i5,cong,8i8,asymp,8j0,ne,8j1,equiv,8j4,le,
8j5,ge,8k2,sub,8k3,sup,8k4,' +
'nsub,8k6,sube,8k7,supe,8kl,oplus,8kn,otimes,8l5,perp,8m5,sdot,8o8,lcei
l,8o9,rceil,8oa,lfloor,8ob,' +
'rfloor,8p9,lang,8pa,rang,9ea,loz,9j0,spades,9j3,clubs,9j5,hearts,9j6,d
iams,ai,OElig,aj,oelig,b0,' +
'Scaron,b1,scaron,bo,Yuml,m6,circ,ms,tilde,802,ensp,803,emsp,809,thinsp
,80c,zwnj,80d,zwj,80e,lrm,' +
'80f,rlm,80j,ndash,80k,mdash,80o,lsquo,80p,rsquo,80q,sbquo,80s,ldquo,80
t,rdquo,80u,bdquo,810,dagger,' +
'811,Dagger,81g,permil,81p,lsaquo,81q,rsaquo,85c,euro', 32);
tinymce.html = tinymce.html || {};
tinymce.html.Entities = {
encodeRaw : function(text, attr) {
return text.replace(attr ? attrsCharsRegExp : textCharsRegExp,
function(chr) {
return baseEntities[chr] || chr;
});
},
encodeAllRaw : function(text) {
return ('' + text).replace(rawCharsRegExp, function(chr) {
return baseEntities[chr] || chr;
});
},
// Named encoder
if (name.named) {
// Custom names
if (entities)
return encodeCustomNamed;
return Entities.encodeNamed;
}
// Numeric
if (name.numeric)
return Entities.encodeNumeric;
// Raw encoder
return Entities.encodeRaw;
},
decode : function(text) {
return text.replace(entityRegExp, function(all, numeric, value) {
if (numeric) {
value = parseInt(value, numeric.length === 2 ? 16 :
10);
function toHex(match, r, g, b) {
function hex(val) {
val = parseInt(val).toString(16);
return {
toHex : function(color) {
return color.replace(rgbRegExp, toHex);
},
parse : function(css) {
var styles = {}, matches, name, value, isEncoded, urlConverter =
settings.url_converter, urlConverterScope = settings.url_converter_scope || this;
// Compress
styles[prefix + suffix] = left;
delete styles[prefix + '-top' + suffix];
delete styles[prefix + '-right' + suffix];
delete styles[prefix + '-bottom' + suffix];
delete styles[prefix + '-left' + suffix];
};
function canCompress(key) {
var value = styles[key], i;
styles[key] = value[0];
return true;
};
function compress2(target, a, b, c) {
if (!canCompress(a))
return;
if (!canCompress(b))
return;
if (!canCompress(c))
return;
// Compress
styles[target] = styles[a] + ' ' + styles[b] + ' ' +
styles[c];
delete styles[a];
delete styles[b];
delete styles[c];
};
return encodingLookup[str];
};
if (!keep_slashes)
str = str.replace(/\\([\'\";:])/g, "$1");
return str;
};
if (str) {
str = decode(str);
if (css) {
// Encode \" \' % and ; and : inside strings so they don't
interfere with the style parsing
css = css.replace(/\\[\"\';:\uFEFF]/g,
encode).replace(/\"[^\"]+\"|\'[^\']+\'/g, function(str) {
return str.replace(/[;:]/g, encode);
});
// Parse styles
while (matches = styleRegExp.exec(css)) {
name = matches[1].replace(trimRightRegExp,
'').toLowerCase();
value = matches[2].replace(trimRightRegExp, '');
styleRegExp.lastIndex = matches.index +
matches[0].length;
}
return styles;
},
function serializeStyles(name) {
var styleList, i, l, value;
styleList = schema.styles[name];
if (styleList) {
for (i = 0, l = styleList.length; i < l; i++) {
name = styleList[i];
value = styles[name];
return css;
}
};
};
(function(tinymce) {
var mapCache = {}, makeMap = tinymce.makeMap, each = tinymce.each;
function replace(value) {
return value.replace(/[A-Z]+/g, function(key) {
return replace(lookup[key]);
});
};
// Unpack lookup
for (key in lookup) {
if (lookup.hasOwnProperty(key))
lookup[key] = replace(lookup[key]);
}
elements[name] = {
attributes : makeMap(attributes),
attributesOrder : attributes,
children : makeMap(children, '|', {'#comment' : {}})
}
});
return elements;
};
function getHTML5() {
var html5 = mapCache.html5;
if (!html5) {
html5 = mapCache.html5 = unpack({
A : 'id|accesskey|class|dir|draggable|item|hidden|
itemprop|role|spellcheck|style|subject|title|onclick|ondblclick|onmousedown|
onmouseup|onmouseover|onmousemove|onmouseout|onkeypress|onkeydown|onkeyup',
B : '#|a|abbr|area|audio|b|bdo|br|button|canvas|cite|
code|command|datalist|del|dfn|em|embed|i|iframe|img|input|ins|kbd|keygen|label|
link|map|mark|meta|' +
'meter|noscript|object|output|progress|q|ruby|
samp|script|select|small|span|strong|sub|sup|svg|textarea|time|var|video|wbr',
C : '#|a|abbr|area|address|article|aside|audio|b|bdo|
blockquote|br|button|canvas|cite|code|command|datalist|del|details|dfn|dialog|div|
dl|em|embed|fieldset|' +
'figure|footer|form|h1|h2|h3|h4|h5|h6|header|
hgroup|hr|i|iframe|img|input|ins|kbd|keygen|label|link|map|mark|menu|meta|meter|
nav|noscript|ol|object|output|' +
'p|pre|progress|q|ruby|samp|script|section|
select|small|span|strong|style|sub|sup|svg|table|textarea|time|ul|var|video'
}, 'html[A|manifest][body|head]' +
'head[A][base|command|link|meta|noscript|script|
style|title]' +
'title[A][#]' +
'base[A|href|target][]' +
'link[A|href|rel|media|type|sizes][]' +
'meta[A|http-equiv|name|content|charset][]' +
'style[A|type|media|scoped][#]' +
'script[A|charset|type|src|defer|async][#]' +
'noscript[A][C]' +
'body[A][C]' +
'section[A][C]' +
'nav[A][C]' +
'article[A][C]' +
'aside[A][C]' +
'h1[A][B]' +
'h2[A][B]' +
'h3[A][B]' +
'h4[A][B]' +
'h5[A][B]' +
'h6[A][B]' +
'hgroup[A][h1|h2|h3|h4|h5|h6]' +
'header[A][C]' +
'footer[A][C]' +
'address[A][C]' +
'p[A][B]' +
'br[A][]' +
'pre[A][B]' +
'dialog[A][dd|dt]' +
'blockquote[A|cite][C]' +
'ol[A|start|reversed][li]' +
'ul[A][li]' +
'li[A|value][C]' +
'dl[A][dd|dt]' +
'dt[A][B]' +
'dd[A][C]' +
'a[A|href|target|ping|rel|media|type][B]' +
'em[A][B]' +
'strong[A][B]' +
'small[A][B]' +
'cite[A][B]' +
'q[A|cite][B]' +
'dfn[A][B]' +
'abbr[A][B]' +
'code[A][B]' +
'var[A][B]' +
'samp[A][B]' +
'kbd[A][B]' +
'sub[A][B]' +
'sup[A][B]' +
'i[A][B]' +
'b[A][B]' +
'mark[A][B]' +
'progress[A|value|max][B]' +
'meter[A|value|min|max|low|high|optimum][B]' +
'time[A|datetime][B]' +
'ruby[A][B|rt|rp]' +
'rt[A][B]' +
'rp[A][B]' +
'bdo[A][B]' +
'span[A][B]' +
'ins[A|cite|datetime][B]' +
'del[A|cite|datetime][B]' +
'figure[A][C|legend|figcaption]' +
'figcaption[A][C]' +
'img[A|alt|src|height|width|usemap|ismap][]' +
'iframe[A|name|src|height|width|sandbox|seamless][]'
+
'embed[A|src|height|width|type][]' +
'object[A|data|type|height|width|usemap|name|form|
classid][param]' +
'param[A|name|value][]' +
'details[A|open][C|legend]' +
'command[A|type|label|icon|disabled|checked|
radiogroup][]' +
'menu[A|type|label][C|li]' +
'legend[A][C|B]' +
'div[A][C]' +
'source[A|src|type|media][]' +
'audio[A|src|autobuffer|autoplay|loop|controls]
[source]' +
'video[A|src|autobuffer|autoplay|loop|controls|width|
height|poster][source]' +
'hr[A][]' +
'form[A|accept-charset|action|autocomplete|enctype|
method|name|novalidate|target][C]' +
'fieldset[A|disabled|form|name][C|legend]' +
'label[A|form|for][B]' +
'input[A|type|accept|alt|autocomplete|autofocus|
checked|disabled|form|formaction|formenctype|formmethod|formnovalidate|formtarget|
height|list|max|maxlength|min|' +
'multiple|pattern|placeholder|readonly|
required|size|src|step|width|files|value|name][]' +
'button[A|autofocus|disabled|form|formaction|
formenctype|formmethod|formnovalidate|formtarget|name|value|type][B]' +
'select[A|autofocus|disabled|form|multiple|name|size]
[option|optgroup]' +
'datalist[A][B|option]' +
'optgroup[A|disabled|label][option]' +
'option[A|disabled|selected|label|value][]' +
'textarea[A|autofocus|disabled|form|maxlength|name|
placeholder|readonly|required|rows|cols|wrap][]' +
'keygen[A|autofocus|challenge|disabled|form|keytype|
name][]' +
'output[A|for|form|name][B]' +
'canvas[A|width|height][]' +
'map[A|name][B|C]' +
'area[A|shape|coords|href|alt|target|media|rel|ping|
type][]' +
'mathml[A][]' +
'svg[A][]' +
'table[A|border][caption|colgroup|thead|tfoot|tbody|
tr]' +
'caption[A][C]' +
'colgroup[A|span][col]' +
'col[A|span][]' +
'thead[A][tr]' +
'tfoot[A][tr]' +
'tbody[A][tr]' +
'tr[A][th|td]' +
'th[A|headers|rowspan|colspan|scope][B]' +
'td[A|headers|rowspan|colspan][C]' +
'wbr[A][]'
);
}
return html5;
};
function getHTML4() {
var html4 = mapCache.html4;
if (!html4) {
// This is the XHTML 1.0 transitional elements with it's
attributes and children packed to reduce it's size
html4 = mapCache.html4 = unpack({
Z : 'H|K|N|O|P',
Y : 'X|form|R|Q',
ZG : 'E|span|width|align|char|charoff|valign',
X : 'p|T|div|U|W|isindex|fieldset|table',
ZF : 'E|align|char|charoff|valign',
W : 'pre|hr|blockquote|address|center|noframes',
ZE : 'abbr|axis|headers|scope|rowspan|colspan|align|char|
charoff|valign|nowrap|bgcolor|width|height',
ZD : '[E][S]',
U : 'ul|ol|dl|menu|dir',
ZC : 'p|Y|div|U|W|table|br|span|bdo|object|applet|img|map|
K|N|Q',
T : 'h1|h2|h3|h4|h5|h6',
ZB : 'X|S|Q',
S : 'R|P',
ZA : 'a|G|J|M|O|P',
R : 'a|H|K|N|O',
Q : 'noscript|P',
P : 'ins|del|script',
O : 'input|select|textarea|label|button',
N : 'M|L',
M : 'em|strong|dfn|code|q|samp|kbd|var|cite|abbr|acronym',
L : 'sub|sup',
K : 'J|I',
J : 'tt|i|b|u|s|strike',
I : 'big|small|font|basefont',
H : 'G|F',
G : 'br|span|bdo',
F : 'object|applet|img|map|iframe',
E : 'A|B|C',
D : 'accesskey|tabindex|onfocus|onblur',
C : 'onclick|ondblclick|onmousedown|onmouseup|onmouseover|
onmousemove|onmouseout|onkeypress|onkeydown|onkeyup',
B : 'lang|xml:lang|dir',
A : 'id|class|style|title'
}, 'script[id|charset|type|language|src|defer|xml:space][]' +
'style[B|id|type|media|title|xml:space][]' +
'object[E|declare|classid|codebase|data|type|codetype|
archive|standby|width|height|usemap|name|tabindex|align|border|hspace|vspace][#|
param|Y]' +
'param[id|name|value|valuetype|type][]' +
'p[E|align][#|S]' +
'a[E|D|charset|type|name|href|hreflang|rel|rev|shape|
coords|target][#|Z]' +
'br[A|clear][]' +
'span[E][#|S]' +
'bdo[A|C|B][#|S]' +
'applet[A|codebase|archive|code|object|alt|name|width|
height|align|hspace|vspace][#|param|Y]' +
'h1[E|align][#|S]' +
'img[E|src|alt|name|longdesc|width|height|usemap|ismap|
align|border|hspace|vspace][]' +
'map[B|C|A|name][X|form|Q|area]' +
'h2[E|align][#|S]' +
'iframe[A|longdesc|name|src|frameborder|marginwidth|
marginheight|scrolling|align|width|height|allowfullscreen][#|Y]' +
'h3[E|align][#|S]' +
'tt[E][#|S]' +
'i[E][#|S]' +
'b[E][#|S]' +
'u[E][#|S]' +
's[E][#|S]' +
'strike[E][#|S]' +
'big[E][#|S]' +
'small[E][#|S]' +
'font[A|B|size|color|face][#|S]' +
'basefont[id|size|color|face][]' +
'em[E][#|S]' +
'strong[E][#|S]' +
'dfn[E][#|S]' +
'code[E][#|S]' +
'q[E|cite][#|S]' +
'samp[E][#|S]' +
'kbd[E][#|S]' +
'var[E][#|S]' +
'cite[E][#|S]' +
'abbr[E][#|S]' +
'acronym[E][#|S]' +
'sub[E][#|S]' +
'sup[E][#|S]' +
'input[E|D|type|name|value|checked|disabled|readonly|size|
maxlength|src|alt|usemap|onselect|onchange|accept|align][]' +
'select[E|name|size|multiple|disabled|tabindex|onfocus|
onblur|onchange][optgroup|option]' +
'optgroup[E|disabled|label][option]' +
'option[E|selected|disabled|label|value][]' +
'textarea[E|D|name|rows|cols|disabled|readonly|onselect|
onchange][]' +
'label[E|for|accesskey|onfocus|onblur][#|S]' +
'button[E|D|name|value|type|disabled][#|p|T|div|U|W|table|
G|object|applet|img|map|K|N|Q]' +
'h4[E|align][#|S]' +
'ins[E|cite|datetime][#|Y]' +
'h5[E|align][#|S]' +
'del[E|cite|datetime][#|Y]' +
'h6[E|align][#|S]' +
'div[E|align][#|Y]' +
'ul[E|type|compact][li]' +
'li[E|type|value][#|Y]' +
'ol[E|type|compact|start][li]' +
'dl[E|compact][dt|dd]' +
'dt[E][#|S]' +
'dd[E][#|Y]' +
'menu[E|compact][li]' +
'dir[E|compact][li]' +
'pre[E|width|xml:space][#|ZA]' +
'hr[E|align|noshade|size|width][]' +
'blockquote[E|cite][#|Y]' +
'address[E][#|S|p]' +
'center[E][#|Y]' +
'noframes[E][#|Y]' +
'isindex[A|B|prompt][]' +
'fieldset[E][#|legend|Y]' +
'legend[E|accesskey|align][#|S]' +
'table[E|summary|width|border|frame|rules|cellspacing|
cellpadding|align|bgcolor][caption|col|colgroup|thead|tfoot|tbody|tr]' +
'caption[E|align][#|S]' +
'col[ZG][]' +
'colgroup[ZG][col]' +
'thead[ZF][tr]' +
'tr[ZF|bgcolor][th|td]' +
'th[E|ZE][#|Y]' +
'form[E|action|method|name|enctype|onsubmit|onreset|accept|
accept-charset|target][#|X|R|Q]' +
'noscript[E][#|Y]' +
'td[E|ZE][#|Y]' +
'tfoot[ZF][tr]' +
'tbody[ZF][tr]' +
'area[E|D|shape|coords|href|nohref|alt|target][]' +
'base[id|href|target][]' +
'body[E|onload|onunload|background|bgcolor|text|link|vlink|
alink][#|Y]'
);
}
return html4;
};
tinymce.html.Schema = function(settings) {
var self = this, elements = {}, children = {}, patternElements = [],
validStyles, schemaItems;
var whiteSpaceElementsMap, selfClosingElementsMap,
shortEndedElementsMap, boolAttrMap, blockElementsMap, nonEmptyElementsMap,
customElementsMap = {};
// Creates an lookup table map object for the specified option or the
default value
function createLookupTable(option, default_value, extend) {
var value = settings[option];
if (!value) {
// Get cached default map or make it if needed
value = mapCache[option];
if (!value) {
value = makeMap(default_value, ' ',
makeMap(default_value.toUpperCase(), ' '));
value = tinymce.extend(value, extend);
mapCache[option] = value;
}
} else {
// Create custom map
value = makeMap(value, ',', makeMap(value.toUpperCase(), '
'));
}
return value;
};
if (valid_elements) {
// Split valid elements into an array with rules
valid_elements = split(valid_elements);
if (elements['@']) {
globalAttributes = elements['@'].attributes;
globalAttributesOrder =
elements['@'].attributesOrder;
}
attributesOrder.push.apply(attributesOrder, globalAttributesOrder);
}
// Attributes defined
if (attrData) {
attrData = split(attrData, '|');
for (ai = 0, al = attrData.length; ai <
al; ai++) {
matches =
attrRuleRegExp.exec(attrData[ai]);
if (matches) {
attr = {};
attrType = matches[1];
attrName =
matches[2].replace(/::/g, ':');
prefix = matches[3];
value = matches[4];
// Required
if (attrType === '!') {
element.attributesRequired.push(attrName);
attr.required = true;
}
// Default value
if (prefix) {
// Default value
if (prefix === '=') {
// Forced value
if (prefix === ':') {
// Required values
if (prefix === '<')
attr.validValues =
makeMap(value, '?');
}
element.attributePatterns.push(attr);
} else {
// Add attribute to
order list if it doesn't already exist
if (!
attributes[attrName])
attributesOrder.push(attrName);
attributes[attrName] =
attr;
}
}
}
}
function setValidElements(valid_elements) {
elements = {};
patternElements = [];
addValidElements(valid_elements);
if (custom_elements) {
each(split(custom_elements), function(rule) {
var matches = customElementRegExp.exec(rule),
inline = matches[1] === '~',
cloneName = inline ? 'span' : 'div',
name = matches[2];
children[name] = children[cloneName];
customElementsMap[name] = cloneName;
if (valid_children) {
each(split(valid_children), function(rule) {
var matches = childRuleRegExp.exec(rule), parent,
prefix;
if (matches) {
prefix = matches[1];
parent = children[matches[2]];
function getElementRule(name) {
var element = elements[name], i;
if (element.pattern.test(name))
return element;
}
};
if (!settings.valid_elements) {
// No valid elements defined then clone the elements from the
schema spec
each(schemaItems, function(element, name) {
elements[name] = {
attributes : element.attributes,
attributesOrder : element.attributesOrder
};
children[name] = element.children;
});
each(split('ol,ul,sub,sup,blockquote,span,font,a,table,tbody,tr,strong,em,b,i'),
function(name) {
if (elements[name]) {
elements[name].removeEmpty = true;
}
});
addCustomElements(settings.custom_elements);
addValidChildren(settings.valid_children);
addValidElements(settings.extended_valid_elements);
self.children = children;
self.styles = validStyles;
self.getBoolAttrs = function() {
return boolAttrMap;
};
self.getBlockElements = function() {
return blockElementsMap;
};
self.getTextBlockElements = function() {
return textBlockElementsMap;
};
self.getShortEndedElements = function() {
return shortEndedElementsMap;
};
self.getSelfClosingElements = function() {
return selfClosingElementsMap;
};
self.getNonEmptyElements = function() {
return nonEmptyElementsMap;
};
self.getWhiteSpaceElements = function() {
return whiteSpaceElementsMap;
};
// No match
return false;
};
self.getElementRule = getElementRule;
self.getCustomElements = function() {
return customElementsMap;
};
self.addValidElements = addValidElements;
self.setValidElements = setValidElements;
self.addCustomElements = addCustomElements;
self.addValidChildren = addValidChildren;
self.elements = elements;
};
})(tinymce);
(function(tinymce) {
tinymce.html.SaxParser = function(settings, schema) {
var self = this, noop = function() {};
self.parse = function(html) {
var self = this, matches, index = 0, value, endRegExp, stack =
[], attrList, i, text, name, isInternalElement, removeInternalElements,
shortEndedElements, fillAttrsMap, isShortEnded, validate,
elementRule, isValidElement, attr, attribsValue, invalidPrefixRegExp,
validAttributesMap, validAttributePatterns,
attributesRequired, attributesDefault, attributesForced, selfClosing,
tokenRegExp, attrRegExp, specialElements, attrValue,
idCount = 0, decode = tinymce.html.Entities.decode, fixSelfClosing, isIE;
function processEndTag(name) {
var pos, i;
// Found parent
if (pos >= 0) {
// Close all the open elements
for (i = stack.length - 1; i >= pos; i--) {
name = stack[i];
if (name.valid)
self.end(name.name);
}
name = name.toLowerCase();
value = name in fillAttrsMap ? name : decode(value || val2
|| val3 || ''); // Handle boolean attribute than value attribute
// No rule matched
if (i === -1)
attrRule = null;
}
// Validate value
if (attrRule.validValues && !(value in
attrRule.validValues))
return;
}
attrRegExp = /([\w:\-]+)(?:\s*=\s*(?:(?:\"((?:[^\"])*)\")|
(?:\'((?:[^\'])*)\')|([^>\s]+)))?/g;
specialElements = {
'script' : /<\/script[^>]*>/gi,
'style' : /<\/style[^>]*>/gi,
'noscript' : /<\/noscript[^>]*>/gi
};
processEndTag(value);
} else if (value = matches[7]) { // Start element
value = value.toLowerCase();
// Validate element
if (!validate || (elementRule =
schema.getElementRule(value))) {
isValidElement = true;
// Parse attributes
if (attribsValue = matches[8]) {
isInternalElement =
attribsValue.indexOf('data-mce-type') !== -1; // Check if the element is an
internal element
attribsValue.replace(attrRegExp,
parseAttribute);
} else {
attrList = [];
attrList.map = {};
}
attrList.map[name] =
attrValue;
attrList.push({name: name,
value: attrValue});
}
}
if (!(name in attrList.map))
{
attrValue = attr.value;
if (attrValue ===
'{$uid}')
attrValue = 'mce_'
+ idCount++;
attrList.map[name] =
attrValue;
attrList.push({name:
name, value: attrValue});
}
}
}
if (isValidElement)
self.start(value, attrList,
isShortEnded);
} else
isValidElement = false;
if (matches = endRegExp.exec(html)) {
if (isValidElement)
text = html.substr(index,
matches.index - index);
index = matches.index +
matches[0].length;
} else {
text = html.substr(index);
index = html.length;
}
if (isValidElement)
self.end(value);
tokenRegExp.lastIndex = index;
continue;
}
// Text
if (index < html.length)
self.text(decode(html.substr(index)));
if (value.valid)
self.end(value.name);
}
};
}
})(tinymce);
(function(tinymce) {
var whiteSpaceRegExp = /^[ \t\r\n]*$/, typeLookup = {
'#text' : 3,
'#comment' : 8,
'#cdata' : 4,
'#pi' : 7,
'#doctype' : 10,
'#document-fragment' : 11
};
if (sibling)
return sibling;
}
}
};
if (type === 1) {
this.attributes = [];
this.attributes.map = {};
}
}
tinymce.extend(Node.prototype, {
replace : function(node) {
var self = this;
if (node.parent)
node.remove();
self.insert(node, self);
self.remove();
return self;
},
return self;
}
if (attrs = self.attributes) {
if (value !== undef) {
// Remove attribute
if (value === null) {
if (name in attrs.map) {
delete attrs.map[name];
i = attrs.length;
while (i--) {
if (attrs[i].name === name) {
attrs = attrs.splice(i, 1);
return self;
}
}
}
return self;
}
// Set attribute
if (name in attrs.map) {
// Set attribute
i = attrs.length;
while (i--) {
if (attrs[i].name === name) {
attrs[i].value = value;
break;
}
}
} else
attrs.push({name: name, value: value});
attrs.map[name] = value;
return self;
} else {
return attrs.map[name];
}
}
},
clone : function() {
var self = this, clone = new Node(self.name, self.type), i, l,
selfAttrs, selfAttr, cloneAttrs;
clone.attributes = cloneAttrs;
}
clone.value = self.value;
clone.shortEnded = self.shortEnded;
return clone;
},
wrap : function(wrapper) {
var self = this;
self.parent.insert(wrapper, self);
wrapper.append(self);
return self;
},
unwrap : function() {
var self = this, node, next;
self.remove();
},
remove : function() {
var self = this, parent = self.parent, next = self.next, prev =
self.prev;
if (parent) {
if (parent.firstChild === self) {
parent.firstChild = next;
if (next)
next.prev = null;
} else {
prev.next = next;
}
if (prev)
prev.next = null;
} else {
next.prev = prev;
}
return self;
},
append : function(node) {
var self = this, last;
if (node.parent)
node.remove();
last = self.lastChild;
if (last) {
last.next = node;
node.prev = last;
self.lastChild = node;
} else
self.lastChild = self.firstChild = node;
node.parent = self;
return node;
},
if (node.parent)
node.remove();
if (before) {
if (ref_node === parent.firstChild)
parent.firstChild = node;
else
ref_node.prev.next = node;
node.prev = ref_node.prev;
node.next = ref_node;
ref_node.prev = node;
} else {
if (ref_node === parent.lastChild)
parent.lastChild = node;
else
ref_node.next.prev = node;
node.next = ref_node.next;
node.prev = ref_node;
ref_node.next = node;
}
node.parent = parent;
return node;
},
getAll : function(name) {
var self = this, node, collection = [];
return collection;
},
empty : function() {
var self = this, nodes, i, node;
return self;
},
isEmpty : function(elements) {
var self = this, node = self.firstChild, i, name;
if (node) {
do {
if (node.type === 1) {
// Ignore bogus elements
if (node.attributes.map['data-mce-bogus'])
continue;
// Keep comments
if (node.type === 8)
return false;
return true;
},
walk : function(prev) {
return walk(this, null, prev);
}
});
tinymce.extend(Node, {
create : function(name, attrs) {
var node, attrName;
// Create node
node = new Node(name, typeLookup[name] || 1);
return node;
}
});
tinymce.html.Node = Node;
})(tinymce);
(function(tinymce) {
var Node = tinymce.html.Node;
function fixInvalidChildren(nodes) {
var ni, node, parent, parents, newParent, currentNode, tempNode,
childNode, i,
childClone, nonEmptyElements, nonSplitableElements,
textBlockElements, sibling, nextNode;
nonSplitableElements =
tinymce.makeMap('tr,td,th,tbody,thead,tfoot,table');
nonEmptyElements = schema.getNonEmptyElements();
textBlockElements = schema.getTextBlockElements();
sibling = sibling.next;
}
currentNode = tempNode;
}
if (!newParent.isEmpty(nonEmptyElements)) {
parent.insert(newParent, parents[0], true);
parent.insert(node, newParent);
} else {
parent.insert(node, parents[0], true);
}
sibling = node.next;
if (sibling && (sibling.name === 'ul' ||
sibling.name === 'ul')) {
sibling.insert(node, sibling.firstChild,
true);
continue;
}
self.filterNode = function(node) {
var i, name, list;
if (list)
list.push(node);
else
matchedNodes[name] = [node];
}
if (name in node.attributes.map) {
list = matchedAttributes[name];
if (list)
list.push(node);
else
matchedAttributes[name] = [node];
}
}
return node;
};
if (!list)
nodeFilters[name] = list = [];
list.push(callback);
});
};
whiteSpaceElements = schema.getWhiteSpaceElements();
startWhiteSpaceRegExp = /^[ \t\r\n]+/;
endWhiteSpaceRegExp = /[ \t\r\n]+$/;
allWhiteSpaceRegExp = /[ \t\r\n]+/g;
isAllWhiteSpaceRegExp = /^[ \t\r\n]+$/;
function addRootBlocks() {
var node = rootNode.firstChild, next, rootBlockNode;
while (node) {
next = node.next;
node = next;
};
};
if (name in nodeFilters) {
list = matchedNodes[name];
if (list)
list.push(node);
else
matchedNodes[name] = [node];
}
return node;
};
function removeWhitespaceBefore(node) {
var textNode, textVal, sibling;
if (textVal.length > 0) {
textNode.value = textVal;
textNode = textNode.prev;
} else {
sibling = textNode.prev;
textNode.remove();
textNode = sibling;
}
}
};
function cloneAndExcludeBlocks(input) {
var name, output = {};
return output;
};
cdata: function(text) {
node.append(createNode('#cdata', 4)).value = text;
},
if (node.lastChild &&
blockElements[node.lastChild.name])
text =
text.replace(startWhiteSpaceRegExp, '');
}
comment: function(text) {
node.append(createNode('#comment', 8)).value = text;
},
doctype: function(text) {
var newNode;
elementRule = validate ?
schema.getElementRule(name) : {};
if (elementRule) {
newNode = createNode(elementRule.outputName ||
name, 1);
newNode.attributes = attrs;
newNode.shortEnded = empty;
node.append(newNode);
attrFiltersLen = attributeFilters.length;
while (attrFiltersLen--) {
attrName =
attributeFilters[attrFiltersLen].name;
if (attrName in attrs.map) {
list = matchedAttributes[attrName];
if (list)
list.push(newNode);
else
matchedAttributes[attrName] =
[newNode];
}
}
end: function(name) {
var textNode, elementRule, text, sibling, tempNode;
elementRule = validate ?
schema.getElementRule(name) : {};
if (elementRule) {
if (blockElements[name]) {
if (!isInWhiteSpacePreservedElement) {
// Trim whitespace of the first
node in a block
textNode = node.firstChild;
if (textNode && textNode.type ===
3) {
text =
textNode.value.replace(startWhiteSpaceRegExp, '');
if (text.length === 0 ||
isAllWhiteSpaceRegExp.test(text)) {
textNode.remove();
textNode =
sibling;
}
textNode = sibling;
}
}
if (text.length === 0 ||
isAllWhiteSpaceRegExp.test(text)) {
textNode.remove();
textNode =
sibling;
}
textNode = sibling;
}
}
}
if (text.length > 0)
textNode.value = text;
else
textNode.remove();
}*/
}
node = node.parent;
}
}
}, schema);
parser.parse(html);
// Wrap nodes in the root into block elements if the root is body
if (rootBlockName && rootNode.name == 'body')
addRootBlocks();
if (list.name in matchedAttributes) {
nodes = matchedAttributes[list.name];
return rootNode;
};
// Ignore bookmarks
if (prevName !== "span" ||
prev.attr('data-mce-type') !== 'bookmark') {
// Found a non BR element
if (prevName !== "br")
break;
prev = prev.prev;
}
if (node) {
node.remove();
if (blockElements[parent.name]) {
break;
}
parent = parent.parent;
}
while (i--) {
node = nodes[i];
if (node.name === 'a' && node.firstChild && !
node.attr('href')) {
parent = node.parent;
tinymce.html.Writer = function(settings) {
var html = [], indent, indentBefore, indentAfter, encode, htmlOutput;
return {
start: function(name, attrs, empty) {
var i, l, attr, value;
html.push('<', name);
if (attrs) {
for (i = 0, l = attrs.length; i < l; i++) {
attr = attrs[i];
html.push(' ', attr.name, '="', encode(attr.value,
true), '"');
}
}
if (!empty || htmlOutput)
html[html.length] = '>';
else
html[html.length] = ' />';
end: function(name) {
var value;
cdata: function(text) {
html.push('<![CDATA[', text, ']]>');
},
comment: function(text) {
html.push('<!--', text, '-->');
},
pi: function(name, text) {
if (text)
html.push('<?', name, ' ', text, '?>');
else
html.push('<?', name, '?>');
if (indent)
html.push('\n');
},
doctype: function(text) {
html.push('<!DOCTYPE', text, '>', indent ? '\n' : '');
},
reset: function() {
html.length = 0;
},
getContent: function() {
return html.join('').replace(/\n$/, '');
}
};
};
(function(tinymce) {
tinymce.html.Serializer = function(settings, schema) {
var self = this, writer = new tinymce.html.Writer(settings);
self.serialize = function(node) {
var handlers, validate;
validate = settings.validate;
handlers = {
// #text
3: function(node, raw) {
writer.text(node.value, node.raw);
},
// #comment
8: function(node) {
writer.comment(node.value);
},
// Processing instruction
7: function(node) {
writer.pi(node.name, node.value);
},
// Doctype
10: function(node) {
writer.doctype(node.value);
},
// CDATA
4: function(node) {
writer.cdata(node.value);
},
// Document fragment
11: function(node) {
if ((node = node.firstChild)) {
do {
walk(node);
} while (node = node.next);
}
}
};
writer.reset();
function walk(node) {
var handler = handlers[node.type], name, isEmpty, attrs,
attrName, attrValue, sortedAttrs, i, l, elementRule;
if (!handler) {
name = node.name;
isEmpty = node.shortEnded;
attrs = node.attributes;
// Sort attributes
if (validate && attrs && attrs.length > 1) {
sortedAttrs = [];
sortedAttrs.map = {};
elementRule = schema.getElementRule(node.name);
for (i = 0, l =
elementRule.attributesOrder.length; i < l; i++) {
attrName =
elementRule.attributesOrder[i];
if (attrName in attrs.map) {
attrValue = attrs.map[attrName];
sortedAttrs.map[attrName] =
attrValue;
sortedAttrs.push({name: attrName,
value: attrValue});
}
}
if (!(attrName in sortedAttrs.map)) {
attrValue = attrs.map[attrName];
sortedAttrs.map[attrName] =
attrValue;
sortedAttrs.push({name: attrName,
value: attrValue});
}
}
attrs = sortedAttrs;
}
if (!isEmpty) {
if ((node = node.firstChild)) {
do {
walk(node);
} while (node = node.next);
}
writer.end(name);
}
} else
handler(node);
}
return writer.getContent();
};
}
})(tinymce);
tinymce.dom = {};
(function(namespace, expando) {
var w3cEventModel = !!document.addEventListener;
// Add stopPropagation
event.stopPropagation = function() {
event.isPropagationStopped = returnTrue;
// Add stopImmediatePropagation
event.stopImmediatePropagation = function() {
event.isImmediatePropagationStopped = returnTrue;
event.stopPropagation();
};
return event;
}
readyHandler();
})();
}
}
// Fallback if any of the above methods should fail for some odd reason
addEvent(win, 'load', readyHandler);
}
function EventUtils(proxy) {
var self = this, events = {}, count, isFocusBlurBound, hasFocusIn,
hasMouseEnterLeave, mouseEnterLeave;
callbackList = events[id][evt.type];
if (callbackList) {
for (i = 0, l = callbackList.length; i < l; i++) {
callback = callbackList[i];
if (!events[id]) {
events[id] = {};
}
}
// Split names and bind each event, enables you to bind multiple
events with one call
names = names.split(' ');
i = names.length;
while (i--) {
name = names[i];
nativeHandler = defaultNativeHandler;
fakeName = capture = false;
// Handle mouseenter/mouseleaver
if (!hasMouseEnterLeave) {
fakeName = mouseEnterLeave[name];
if (fakeName) {
nativeHandler = function(evt) {
var current, related;
current = evt.currentTarget;
related = evt.relatedTarget;
return callback;
};
// Specific callback
if (names) {
names = names.split(' ');
i = names.length;
while (i--) {
name = names[i];
callbackList = eventMap[name];
eventMap = {};
}
return self;
};
do {
// Found an expando that means there is listeners to
execute
id = target[expando];
if (id) {
executeHandlers(event, id);
}
return self;
};
self.clean = function(target) {
var i, children, unbind = self.unbind;
children = target.getElementsByTagName('*');
i = children.length;
while (i--) {
target = children[i];
if (target[expando]) {
unbind(target);
}
}
}
return self;
};
self.destory = function() {
events = {};
};
while (i--) {
self.add(target[i], events, func, scope);
}
return;
}
while (i--) {
self.remove(target[i], events, func, scope);
}
return self;
}
self.clear = function(target) {
// Old API supported direct ID assignment
if (typeof(target) === "string") {
target = document.getElementById(target);
}
return self.clean(target);
};
self.cancel = function(e) {
if (e) {
self.prevent(e);
self.stop(e);
}
return false;
};
self.prevent = function(e) {
if (!e.preventDefault) {
e = fix(e);
}
e.preventDefault();
return false;
};
self.stop = function(e) {
if (!e.stopPropagation) {
e = fix(e);
}
e.stopPropagation();
return false;
};
}
namespace.EventUtils = EventUtils;
namespace = 0;
})(tinymce.dom, 'data-mce-expando'); // Namespace and expando
if (node) {
// Walk into nodes if it has a start
if (!shallow && node[start_name])
return node[start_name];
this.current = function() {
return node;
};
this.next = function(shallow) {
return (node = findSibling(node, 'firstChild', 'nextSibling',
shallow));
};
this.prev = function(shallow) {
return (node = findSibling(node, 'lastChild', 'previousSibling',
shallow));
};
};
(function(tinymce) {
// Shorten names
var each = tinymce.each,
is = tinymce.is,
isWebKit = tinymce.isWebKit,
isIE = tinymce.isIE,
Entities = tinymce.html.Entities,
simpleSelectorRe = /^([a-z0-9],?)+$/i,
whiteSpaceRegExp = /^[ \t\r\n]*$/;
tinymce.create('tinymce.dom.DOMUtils', {
doc : null,
root : null,
files : null,
pixelStyles : /^(top|left|bottom|right|width|height|borderWidth)$/,
props : {
"for" : "htmlFor",
"class" : "className",
className : "className",
checked : "checked",
disabled : "disabled",
maxlength : "maxLength",
readonly : "readOnly",
selected : "selected",
value : "value",
id : "id",
name : "name",
type : "type"
},
DOMUtils : function(d, s) {
var t = this, globalStyle, name, blockElementsMap;
t.doc = d;
t.win = window;
t.files = {};
t.cssFlicker = false;
t.counter = 0;
t.stdMode = !tinymce.isIE || d.documentMode >= 8;
t.boxModel = !tinymce.isIE || d.compatMode == "CSS1Compat" ||
t.stdMode;
t.hasOuterHTML = "outerHTML" in d.createElement("a");
t.settings = s = tinymce.extend({
keep_values : false,
hex_colors : 1
}, s);
t.schema = s.schema;
t.styles = new tinymce.html.Styles({
url_converter : s.url_converter,
url_converter_scope : s.url_converter_scope
}, s.schema);
// Fix IE6SP2 flicker and check it failed for pre SP2
if (tinymce.isIE6) {
try {
d.execCommand('BackgroundImageCache', false, true);
} catch (e) {
t.cssFlicker = true;
}
}
t.fixDoc(d);
t.events = s.ownEvents ? new tinymce.dom.EventUtils(s.proxy) :
tinymce.dom.Event;
tinymce.addUnload(t.destroy, t);
blockElementsMap = s.schema ? s.schema.getBlockElements() : {};
t.isBlock = function(node) {
// Fix for #5446
if (!node) {
return false;
}
// If it's a node then check the type and use the nodeName
if (type)
return !!(type === 1 &&
blockElementsMap[node.nodeName]);
return !!blockElementsMap[node];
};
},
fixDoc: function(doc) {
var settings = this.settings, name;
doc = self.doc;
// Copy attribs
each(self.getAttribs(node), function(attr) {
self.setAttrib(clone, attr.nodeName,
self.getAttrib(node, attr.nodeName));
});
return clone;
}
/*
// Setup HTML5 patched document fragment
if (!self.frag) {
self.frag = doc.createDocumentFragment();
self.fixDoc(self.frag);
}
getRoot : function() {
var t = this, s = t.settings;
getViewPort : function(w) {
var d, b;
w = !w ? this.win : w;
d = w.document;
b = this.boxModel ? d.documentElement : d.body;
getRect : function(e) {
var p, t = this, sr;
e = t.get(e);
p = t.getPos(e);
sr = t.getSize(e);
return {
x : p.x,
y : p.y,
w : sr.w,
h : sr.h
};
},
getSize : function(e) {
var t = this, w, h;
e = t.get(e);
w = t.getStyle(e, 'width');
h = t.getStyle(e, 'height');
return {
w : parseInt(w, 10) || e.offsetWidth || e.clientWidth,
h : parseInt(h, 10) || e.offsetHeight || e.clientHeight
};
},
getParent : function(n, f, r) {
return this.getParents(n, f, r, false);
},
getParents : function(n, f, r, c) {
var t = this, na, se = t.settings, o = [];
n = t.get(n);
c = c === undefined;
if (se.strict_root)
r = r || t.getRoot();
if (f === '*') {
f = function(n) {return n.nodeType == 1;};
} else {
f = function(n) {
return t.is(n, na);
};
}
}
while (n) {
if (n == r || !n.nodeType || n.nodeType === 9)
break;
if (!f || f(n)) {
if (c)
o.push(n);
else
return n;
}
n = n.parentNode;
}
return c ? o : null;
},
get : function(e) {
var n;
return e;
},
select : function(pa, s) {
var t = this;
is : function(n, selector) {
var i;
return false;
}
}
add : function(p, n, a, h, c) {
var t = this;
if (h) {
if (h.nodeType)
e.appendChild(h);
else
t.setHTML(e, h);
}
return !c ? p.appendChild(e) : e;
});
},
create : function(n, a, h) {
return this.add(this.doc.createElement(n), n, a, h, 1);
},
createHTML : function(n, a, h) {
var o = '', t = this, k;
o += '<' + n;
for (k in a) {
if (a.hasOwnProperty(k))
o += ' ' + k + '="' + t.encode(a[k]) + '"';
}
if (!parent)
return null;
if (keep_children) {
while (child = node.firstChild) {
// IE 8 will crash if you don't remove
completely empty text nodes
if (!tinymce.isIE || child.nodeType !== 3 ||
child.nodeValue)
parent.insertBefore(child, node);
else
node.removeChild(child);
}
}
return parent.removeChild(node);
});
},
s = e.style;
switch (na) {
case 'opacity':
// IE specific opacity
if (isIE) {
s.filter = v === '' ? '' :
"alpha(opacity=" + (v * 100) + ")";
if (!n.currentStyle || !
n.currentStyle.hasLayout)
s.display = 'inline-block';
}
default:
s[na] = v || '';
}
if (!n)
return;
// Gecko
if (this.doc.defaultView && c) {
// Remove camelcase
na = na.replace(/[A-Z]/g, function(a){
return '-' + a;
});
try {
return this.doc.defaultView.getComputedStyle(n,
null).getPropertyValue(na);
} catch (ex) {
// Old safari might fail
return null;
}
}
if (na == 'float')
na = isIE ? 'styleFloat' : 'cssFloat';
// IE & Opera
if (n.currentStyle && c)
return n.currentStyle[na];
setStyles : function(e, o) {
var t = this, s = t.settings, ol;
ol = s.update_styles;
s.update_styles = 0;
each(o, function(v, n) {
t.setStyle(e, n, v);
});
removeAllAttribs: function(e) {
return this.run(e, function(e) {
var i, attrs = e.attributes;
for (i = attrs.length - 1; i >= 0; i--) {
e.removeAttributeNode(attrs.item(i));
}
});
},
setAttrib : function(e, n, v) {
var t = this;
return;
}
e.style.cssText = v;
break;
case "class":
e.className = v || ''; // Fix IE null bug
break;
case "src":
case "href":
if (s.keep_values) {
if (s.url_converter)
v =
s.url_converter.call(s.url_converter_scope || t, v, n, e);
t.setAttrib(e, 'data-mce-' + n, v,
2);
}
break;
case "shape":
e.setAttribute('data-mce-style', v);
break;
}
}
if (is(v) && v !== null && v.length !== 0)
e.setAttribute(n, '' + v, 2);
else
e.removeAttribute(n, 2);
setAttribs : function(e, o) {
var t = this;
e = t.get(e);
if (!is(dv))
dv = '';
if (!v)
v = e.getAttribute(n, 2);
return v ? n : '';
}
if (n === 'style') {
v = v || e.style.cssText;
if (v) {
v = t.serializeStyle(t.parseStyle(v), e.nodeName);
// Handle IE issues
if (isIE) {
switch (n) {
case 'rowspan':
case 'colspan':
// IE returns 1 as default value
if (v === 1)
v = '';
break;
case 'size':
// IE returns +0 as default value for size
if (v === '+0' || v === 20 || v === 0)
v = '';
break;
case 'width':
case 'height':
case 'vspace':
case 'checked':
case 'disabled':
case 'readonly':
if (v === 0)
v = '';
break;
case 'hspace':
// IE returns -1 as default value
if (v === -1)
v = '';
break;
case 'maxlength':
case 'tabindex':
// IE returns default value
if (v === 32768 || v === 2147483647 || v ===
'32768')
v = '';
break;
case 'multiple':
case 'compact':
case 'noshade':
case 'nowrap':
if (v === 65535)
return n;
return dv;
case 'shape':
v = v.toLowerCase();
break;
default:
// IE has odd anonymous function for event
attributes
if (n.indexOf('on') === 0 && v)
v = tinymce._replace(/^function\s+\w+\
(\)\s+\{\s+(.*)\s+\}$/, '$1', '' + v);
}
}
return (v !== undef && v !== null && v !== '') ? '' + v : dv;
},
n = t.get(n);
ro = ro || d.body;
if (n) {
// Use getBoundingClientRect if it exists since it's faster
than looping offset nodes
if (n.getBoundingClientRect) {
n = n.getBoundingClientRect();
e = t.boxModel ? d.documentElement : d.body;
return {x : x, y : y};
}
r = n;
while (r && r != ro && r.nodeType) {
x += r.offsetLeft || 0;
y += r.offsetTop || 0;
r = r.offsetParent;
}
r = n.parentNode;
while (r && r != ro && r.nodeType) {
x -= r.scrollLeft || 0;
y -= r.scrollTop || 0;
r = r.parentNode;
}
}
return {x : x, y : y};
},
parseStyle : function(st) {
return this.styles.parse(st);
},
addStyle: function(cssText) {
var doc = this.doc, head;
head = doc.getElementsByTagName('head')[0];
if (head.firstChild) {
head.insertBefore(styleElm, head.firstChild);
} else {
head.appendChild(styleElm);
}
}
loadCSS : function(u) {
var t = this, d = t.doc, head;
if (!u)
u = '';
head = d.getElementsByTagName('head')[0];
each(u.split(','), function(u) {
var link;
if (t.files[u])
return;
t.files[u] = true;
link = t.create('link', {rel : 'stylesheet', href :
tinymce._addVer(u)});
link.onload = null;
};
}
head.appendChild(link);
});
},
addClass : function(e, c) {
return this.run(e, function(e) {
var o;
if (!c)
return 0;
if (this.hasClass(e, c))
return e.className;
o = this.removeClass(e, c);
removeClass : function(e, c) {
var t = this, re;
if (t.hasClass(e, c)) {
if (!re)
re = new RegExp("(^|\\s+)" + c + "(\\s+|$)",
"g");
e.className = v;
return v;
}
return e.className;
});
},
hasClass : function(n, c) {
n = this.get(n);
if (!n || !c)
return false;
return (' ' + n.className + ' ').indexOf(' ' + c + ' ') !== -1;
},
show : function(e) {
return this.setStyle(e, 'display', 'block');
},
hide : function(e) {
return this.setStyle(e, 'display', 'none');
},
isHidden : function(e) {
e = this.get(e);
uniqueId : function(p) {
return (!p ? 'mce_' : p) + (this.counter++);
},
setHTML : function(element, html) {
var self = this;
try {
// IE will remove comments from the beginning
// unless you padd the contents with something
element.innerHTML = '<br />' + html;
element.removeChild(element.firstChild);
} catch (ex) {
// IE sometimes produces an unknown runtime
error on innerHTML if it's an block element within a block element for example a
div inside a p
// This seems to fix this problem
return html;
});
},
getOuterHTML : function(elm) {
var doc, self = this;
elm = self.get(elm);
if (!elm)
return null;
return doc.innerHTML;
},
setOuterHTML : function(e, h, d) {
var t = this;
function setHTML(e, h, d) {
var n, tp;
tp = d.createElement("body");
tp.innerHTML = h;
n = tp.lastChild;
while (n) {
t.insertAfter(n.cloneNode(true), e);
n = n.previousSibling;
}
t.remove(e);
};
if (isIE) {
try {
// Try outerHTML for IE it sometimes
produces an unknown runtime error
if (isIE && e.nodeType == 1)
e.outerHTML = h;
else
setHTML(e, h, d);
} catch (ex) {
// Fix for unknown runtime error
setHTML(e, h, d);
}
} else
setHTML(e, h, d);
}
});
},
decode : Entities.decode,
encode : Entities.encodeAllRaw,
parent = reference_node.parentNode;
nextSibling = reference_node.nextSibling;
if (nextSibling)
parent.insertBefore(node, nextSibling);
else
parent.appendChild(node);
return node;
});
},
replace : function(n, o, k) {
var t = this;
if (is(o, 'array'))
n = n.cloneNode(true);
if (elm.nodeName != name.toUpperCase()) {
// Rename block element
newElm = t.create(name);
// Replace block
t.replace(newElm, elm, 1);
}
findCommonAncestor : function(a, b) {
var ps = a, pe;
while (ps) {
pe = b;
if (ps == pe)
break;
ps = ps.parentNode;
}
return ps;
},
toHex : function(s) {
var c = /^\s*rgb\s*?\(\s*?([0-9]+)\s*?,\s*?([0-9]+)\s*?,\s*?([0-
9]+)\s*?\)\s*$/i.exec(s);
function hex(s) {
s = parseInt(s, 10).toString(16);
if (c) {
s = '#' + hex(c[1]) + hex(c[2]) + hex(c[3]);
return s;
}
return s;
},
getClasses : function() {
var t = this, cl = [], i, lo = {}, f = t.settings.class_filter,
ov;
if (t.classes)
return t.classes;
function addClasses(s) {
// IE style imports
each(s.imports, function(r) {
addClasses(r);
});
// Is internal or it doesn't
contain a class
// added s_ for custom internal use
if (/\.(mce|s_)/.test(v)
|| !/\.[\w\-]+$/.test(v))
return;
// Filter classes
if (f && !(v = f(v, ov)))
return;
if (!lo[v]) {
cl.push({'class' : v});
lo[v] = 1;
}
});
}
break;
// Import
case 3:
addClasses(r.styleSheet);
break;
}
});
};
try {
each(t.doc.styleSheets, addClasses);
} catch (ex) {
// Ignore
}
if (cl.length > 0)
t.classes = cl;
return cl;
},
run : function(e, f, s) {
var t = this, o;
if (!e)
return false;
s = s || this;
if (!e.nodeType && (e.length || e.length === 0)) {
o = [];
each(e, function(e, i) {
if (e) {
if (typeof(e) == 'string')
e = t.doc.getElementById(e);
o.push(f.call(s, e, i));
}
});
return o;
}
return f.call(s, e);
},
getAttribs : function(n) {
var o;
n = this.get(n);
if (!n)
return [];
if (isIE) {
o = [];
return o;
}
return n.attributes;
},
node = node.firstChild;
if (node) {
walker = new tinymce.dom.TreeWalker(node, node.parentNode);
elements = elements || self.schema ?
self.schema.getNonEmptyElements() : null;
do {
type = node.nodeType;
if (type === 1) {
// Ignore bogus elements
if (node.getAttribute('data-mce-bogus'))
continue;
return false;
}
destroy : function(s) {
var t = this;
createRng : function() {
var d = this.doc;
if (node) {
for (lastNodeType = node.nodeType, node =
node.previousSibling, lastNode = node; node; node = node.previousSibling) {
nodeType = node.nodeType;
// Normalize text nodes
if (normalized && nodeType == 3) {
if (nodeType == lastNodeType || !
node.nodeValue.length)
continue;
}
idx++;
lastNodeType = nodeType;
}
}
return idx;
},
function surroundedBySpans(node) {
var previousIsSpan = node.previousSibling &&
node.previousSibling.nodeName == 'SPAN';
var nextIsSpan = node.nextSibling &&
node.nextSibling.nodeName == 'SPAN';
return previousIsSpan && nextIsSpan;
}
if (type != 9) {
// Keep non whitespace text nodes
if (type == 3 && node.nodeValue.length > 0) {
// If parent element isn't a block or there
isn't any useful contents for example "<p> </p>"
// Also keep text nodes with only spaces if
surrounded by spans.
// eg. "<p><span>a</span> <span>b</span></p>"
should keep space between a and b
var trimmedLength =
tinymce.trim(node.nodeValue).length;
if (!t.isBlock(node.parentNode) ||
trimmedLength > 0 || trimmedLength === 0 && surroundedBySpans(node))
return;
} else if (type == 1) {
// If the only child is a bookmark then move it
up
children = node.childNodes;
if (children.length == 1 && children[0] &&
children[0].nodeType == 1 && children[0].getAttribute('data-mce-type') ==
'bookmark')
node.parentNode.insertBefore(children[0],
node);
t.remove(node);
}
return node;
};
if (pe && e) {
// Get before chunk
r.setStart(pe.parentNode, t.nodeIndex(pe));
r.setEnd(e.parentNode, t.nodeIndex(e));
bef = r.extractContents();
return re || e;
}
},
// Check type
if (node.nodeType != 1) {
return null;
}
if (node) {
// If expression make a function of it using is
if (is(f, 'string')) {
f = function(node) {
return t.is(node, selector);
};
}
return null;
},
_isRes : function(c) {
// Is live resizble element
return /^(top|left|bottom|right|width|height)/i.test(c) ||
/;\s*(top|left|bottom|right|width|height)/i.test(c);
}
/*
walk : function(n, f, s) {
var d = this.doc, w;
if (d.createTreeWalker) {
w = d.createTreeWalker(n, NodeFilter.SHOW_TEXT, null,
false);
/*
toRGB : function(s) {
var c = /^\s*?#([0-9A-F]{2})([0-9A-F]{1,2})([0-9A-F]{2})?\s*?
$/.exec(s);
if (c) {
// #FFF -> #FFFFFF
if (!is(c[3]))
c[3] = c[2] = c[1];
return s;
}
*/
});
(function(ns) {
// Range constructor
function Range(dom) {
var t = this,
doc = dom.doc,
EXTRACT = 0,
CLONE = 1,
DELETE = 2,
TRUE = true,
FALSE = false,
START_OFFSET = 'startOffset',
START_CONTAINER = 'startContainer',
END_CONTAINER = 'endContainer',
END_OFFSET = 'endOffset',
extend = tinymce.extend,
nodeIndex = dom.nodeIndex;
extend(t, {
// Inital states
startContainer : doc,
startOffset : 0,
endContainer : doc,
endOffset : 0,
collapsed : TRUE,
commonAncestorContainer : doc,
// Range constants
START_TO_START : 0,
START_TO_END : 1,
END_TO_END : 2,
END_TO_START : 3,
// Public methods
setStart : setStart,
setEnd : setEnd,
setStartBefore : setStartBefore,
setStartAfter : setStartAfter,
setEndBefore : setEndBefore,
setEndAfter : setEndAfter,
collapse : collapse,
selectNode : selectNode,
selectNodeContents : selectNodeContents,
compareBoundaryPoints : compareBoundaryPoints,
deleteContents : deleteContents,
extractContents : extractContents,
cloneContents : cloneContents,
insertNode : insertNode,
surroundContents : surroundContents,
cloneRange : cloneRange,
toStringIE : toStringIE
});
function createDocumentFragment() {
return doc.createDocumentFragment();
};
function setStart(n, o) {
_setEndPoint(TRUE, n, o);
};
function setEnd(n, o) {
_setEndPoint(FALSE, n, o);
};
function setStartBefore(n) {
setStart(n.parentNode, nodeIndex(n));
};
function setStartAfter(n) {
setStart(n.parentNode, nodeIndex(n) + 1);
};
function setEndBefore(n) {
setEnd(n.parentNode, nodeIndex(n));
};
function setEndAfter(n) {
setEnd(n.parentNode, nodeIndex(n) + 1);
};
function collapse(ts) {
if (ts) {
t[END_CONTAINER] = t[START_CONTAINER];
t[END_OFFSET] = t[START_OFFSET];
} else {
t[START_CONTAINER] = t[END_CONTAINER];
t[START_OFFSET] = t[END_OFFSET];
}
t.collapsed = TRUE;
};
function selectNode(n) {
setStartBefore(n);
setEndAfter(n);
};
function selectNodeContents(n) {
setStart(n, 0);
setEnd(n, n.nodeType === 1 ? n.childNodes.length :
n.nodeValue.length);
};
function compareBoundaryPoints(h, r) {
var sc = t[START_CONTAINER], so = t[START_OFFSET], ec =
t[END_CONTAINER], eo = t[END_OFFSET],
rsc = r.startContainer, rso = r.startOffset, rec =
r.endContainer, reo = r.endOffset;
// Check START_TO_START
if (h === 0)
return _compareBoundaryPoints(sc, so, rsc, rso);
// Check START_TO_END
if (h === 1)
return _compareBoundaryPoints(ec, eo, rsc, rso);
// Check END_TO_END
if (h === 2)
return _compareBoundaryPoints(ec, eo, rec, reo);
// Check END_TO_START
if (h === 3)
return _compareBoundaryPoints(sc, so, rec, reo);
};
function deleteContents() {
_traverse(DELETE);
};
function extractContents() {
return _traverse(EXTRACT);
};
function cloneContents() {
return _traverse(CLONE);
};
function insertNode(n) {
var startContainer = this[START_CONTAINER],
startOffset = this[START_OFFSET], nn, o;
if (o)
startContainer.insertBefore(n, o);
else
startContainer.appendChild(n);
}
};
function surroundContents(n) {
var f = t.extractContents();
t.insertNode(n);
n.appendChild(f);
t.selectNode(n);
};
function cloneRange() {
return extend(new Range(dom), {
startContainer : t[START_CONTAINER],
startOffset : t[START_OFFSET],
endContainer : t[END_CONTAINER],
endOffset : t[END_OFFSET],
collapsed : t.collapsed,
commonAncestorContainer : t.commonAncestorContainer
});
};
// Private methods
if (offset < 0)
return container;
child = container.firstChild;
while (child && offset > 0) {
--offset;
child = child.nextSibling;
}
if (child)
return child;
return container;
};
function _isCollapsed() {
return (t[START_CONTAINER] == t[END_CONTAINER] && t[START_OFFSET]
== t[END_OFFSET]);
};
return 1; // after
}
if (c) {
offsetC = 0;
n = containerA.firstChild;
return 1; // after
}
// In the third case a child node C of the container of B is an
ancestor container
// of A. In this case, A is before B if the index of the child
node C is less than
// the offset of B and A is after B otherwise.
c = containerA;
while (c && c.parentNode != containerB) {
c = c.parentNode;
}
if (c) {
offsetC = 0;
n = containerB.firstChild;
return 1; // after
}
if (!childA)
childA = cmnRoot;
childB = containerB;
while (childB && childB.parentNode != cmnRoot)
childB = childB.parentNode;
if (!childB)
childB = cmnRoot;
if (childA == childB)
return 0; // equal
n = cmnRoot.firstChild;
while (n) {
if (n == childA)
return -1; // before
if (n == childB)
return 1; // after
n = n.nextSibling;
}
};
function _setEndPoint(st, n, o) {
var ec, sc;
if (st) {
t[START_CONTAINER] = n;
t[START_OFFSET] = o;
} else {
t[END_CONTAINER] = n;
t[END_OFFSET] = o;
}
sc = t[START_CONTAINER];
while (sc.parentNode)
sc = sc.parentNode;
if (sc == ec) {
// The start position of a Range is guaranteed to never be
after the
// end position. To enforce this restriction, if the start
is set to
// be at a position after the end, the Range is collapsed
to that
// position.
if (_compareBoundaryPoints(t[START_CONTAINER],
t[START_OFFSET], t[END_CONTAINER], t[END_OFFSET]) > 0)
t.collapse(st);
} else
t.collapse(st);
t.collapsed = _isCollapsed();
t.commonAncestorContainer =
dom.findCommonAncestor(t[START_CONTAINER], t[END_CONTAINER]);
};
function _traverse(how) {
var c, endContainerDepth = 0, startContainerDepth = 0, p,
depthDiff, startNode, endNode, sp, ep;
if (t[START_CONTAINER] == t[END_CONTAINER])
return _traverseSameContainer(how);
++endContainerDepth;
}
++startContainerDepth;
}
startNode = t[START_CONTAINER];
while (depthDiff > 0) {
startNode = startNode.parentNode;
depthDiff--;
}
endNode = t[END_CONTAINER];
while (depthDiff < 0) {
endNode = endNode.parentNode;
depthDiff++;
}
function _traverseSameContainer(how) {
var frag, s, sub, n, cnt, sibling, xferNode, start, len;
if (how != DELETE)
frag = createDocumentFragment();
if (how == DELETE)
return;
if (sub.length > 0) {
frag.appendChild(doc.createTextNode(sub));
}
return frag;
}
if (frag)
frag.appendChild( xferNode );
--cnt;
n = sibling;
}
return frag;
};
if (how != DELETE)
frag = createDocumentFragment();
n = _traverseRightBoundary(endAncestor, how);
if (frag)
frag.appendChild(n);
endIdx = nodeIndex(endAncestor);
cnt = endIdx - t[START_OFFSET];
if (cnt <= 0) {
// Collapse to just before the endAncestor, which
// is partially selected.
if (how != CLONE) {
t.setEndBefore(endAncestor);
t.collapse(FALSE);
}
return frag;
}
n = endAncestor.previousSibling;
while (cnt > 0) {
sibling = n.previousSibling;
xferNode = _traverseFullySelected(n, how);
if (frag)
frag.insertBefore(xferNode, frag.firstChild);
--cnt;
n = sibling;
}
return frag;
};
if (how != DELETE)
frag = createDocumentFragment();
n = _traverseLeftBoundary(startAncestor, how);
if (frag)
frag.appendChild(n);
startIdx = nodeIndex(startAncestor);
++startIdx; // Because we already traversed it
if (frag)
frag.appendChild(xferNode);
--cnt;
n = sibling;
}
if (how != CLONE) {
t.setStartAfter(startAncestor);
t.collapse(TRUE);
}
return frag;
};
if (how != DELETE)
frag = createDocumentFragment();
n = _traverseLeftBoundary(startAncestor, how);
if (frag)
frag.appendChild(n);
commonParent = startAncestor.parentNode;
startOffset = nodeIndex(startAncestor);
endOffset = nodeIndex(endAncestor);
++startOffset;
if (frag)
frag.appendChild(n);
sibling = nextSibling;
--cnt;
}
n = _traverseRightBoundary(endAncestor, how);
if (frag)
frag.appendChild(n);
if (how != CLONE) {
t.setStartAfter(startAncestor);
t.collapse(TRUE);
}
return frag;
};
if (next == root)
return _traverseNode(next, isFullySelected, FALSE, how);
parent = next.parentNode;
clonedParent = _traverseNode(parent, FALSE, FALSE, how);
while (parent) {
while (next) {
prevSibling = next.previousSibling;
clonedChild = _traverseNode(next, isFullySelected,
FALSE, how);
if (how != DELETE)
clonedParent.insertBefore(clonedChild,
clonedParent.firstChild);
isFullySelected = TRUE;
next = prevSibling;
}
if (parent == root)
return clonedParent;
next = parent.previousSibling;
parent = parent.parentNode;
if (how != DELETE)
clonedGrandParent.appendChild(clonedParent);
clonedParent = clonedGrandParent;
}
};
if (next == root)
return _traverseNode(next, isFullySelected, TRUE, how);
parent = next.parentNode;
clonedParent = _traverseNode(parent, FALSE, TRUE, how);
while (parent) {
while (next) {
nextSibling = next.nextSibling;
clonedChild = _traverseNode(next, isFullySelected,
TRUE, how);
if (how != DELETE)
clonedParent.appendChild(clonedChild);
isFullySelected = TRUE;
next = nextSibling;
}
if (parent == root)
return clonedParent;
next = parent.nextSibling;
parent = parent.parentNode;
if (how != DELETE)
clonedGrandParent.appendChild(clonedParent);
clonedParent = clonedGrandParent;
}
};
if (isFullySelected)
return _traverseFullySelected(n, how);
if (isLeft) {
offset = t[START_OFFSET];
newNodeValue = txtValue.substring(offset);
oldNodeValue = txtValue.substring(0, offset);
} else {
offset = t[END_OFFSET];
newNodeValue = txtValue.substring(0, offset);
oldNodeValue = txtValue.substring(offset);
}
if (how != CLONE)
n.nodeValue = oldNodeValue;
if (how == DELETE)
return;
return newNode;
}
if (how == DELETE)
return;
n.parentNode.removeChild(n);
};
function toStringIE() {
return dom.create('body', null, cloneContents()).outerText;
}
return t;
};
ns.Range = Range;
(function() {
function Selection(selection) {
var self = this, dom = selection.dom, TRUE = true, FALSE = false;
offset++;
}
} else {
// Child position is after the selection endpoint
checkRng.collapse(true);
offset++;
}
}
// Returns a W3C DOM compatible range object by using the IE Range API
function getRange() {
var ieRange = selection.getRng(), domRange = dom.createRng(),
element, collapsed, tmpRange, element2, bookmark, fail;
// If selection is outside the current document just return an
empty range
element = ieRange.item ? ieRange.item(0) :
ieRange.parentElement();
if (element.ownerDocument != dom.doc)
return domRange;
collapsed = selection.isCollapsed();
return domRange;
}
function findEndPoint(start) {
var endPoint = getPosition(ieRange, start), container,
offset, textNodeOffset = 0, sibling, undef, nodeValue;
container = endPoint.node;
offset = endPoint.offset;
if (endPoint.position < 0) {
sibling = endPoint.inside ? container.firstChild :
container.nextSibling;
if (!sibling) {
domRange[start ? 'setStartAfter' :
'setEndAfter'](container);
return;
}
if (!offset) {
if (sibling.nodeType == 3)
domRange[start ? 'setStart' : 'setEnd']
(sibling, 0);
else
domRange[start ? 'setStartBefore' :
'setEndBefore'](sibling);
return;
}
// Find the text node and offset
while (sibling) {
nodeValue = sibling.nodeValue;
textNodeOffset += nodeValue.length;
sibling = sibling.nextSibling;
}
} else {
// Find the text node and offset
sibling = container.previousSibling;
if (!sibling)
return domRange[start ? 'setStartBefore' :
'setEndBefore'](container);
return;
}
while (sibling) {
textNodeOffset += sibling.nodeValue.length;
sibling = sibling.previousSibling;
}
}
try {
// Find start point
findEndPoint(true);
return domRange;
};
this.getBookmark = function(type) {
var rng = selection.getRng(), start, end, bookmark = {};
function getIndexes(node) {
var parent, root, children, i, indexes = [];
parent = node.parentNode;
root = dom.getRoot().parentNode;
i = children.length;
while (i--) {
if (node === children[i]) {
indexes.push(i);
break;
}
}
node = parent;
parent = parent.parentNode;
}
return indexes;
};
function getBookmarkEndPoint(start) {
var position;
if (!selection.isCollapsed())
bookmark.end = getBookmarkEndPoint();
} else
bookmark.start = {ctrl : true, indexes :
getIndexes(rng.item(0))};
}
return bookmark;
};
this.moveToBookmark = function(bookmark) {
var rng, body = dom.doc.body;
function resolveIndexes(indexes) {
var node, i, idx, children;
node = dom.getRoot();
for (i = indexes.length - 1; i >= 0; i--) {
children = node.children;
idx = indexes[i];
return node;
};
function setBookmarkEndPoint(start) {
var endPoint = bookmark[start ? 'start' : 'end'], moveLeft,
moveRng, undef;
if (endPoint) {
moveLeft = endPoint.position > 0;
moveRng = body.createTextRange();
moveRng.moveToElementText(resolveIndexes(endPoint.indexes));
offset = endPoint.offset;
if (offset !== undef) {
moveRng.collapse(endPoint.inside || moveLeft);
moveRng.moveStart('character', moveLeft ?
-offset : offset);
} else
moveRng.collapse(start);
rng.setEndPoint(start ? 'StartToStart' :
'EndToStart', moveRng);
if (start)
rng.collapse(true);
}
};
if (bookmark.start) {
if (bookmark.start.ctrl) {
rng = body.createControlRange();
rng.addElement(resolveIndexes(bookmark.start.indexes));
rng.select();
} else {
rng = body.createTextRange();
setBookmarkEndPoint(true);
setBookmarkEndPoint();
rng.select();
}
}
};
this.addRange = function(rng) {
var ieRng, ctrlRng, startContainer, startOffset, endContainer,
endOffset, sibling,
doc = selection.dom.doc, body = doc.body, nativeRng,
ctrlElm;
function setEndPoint(start) {
var container, offset, marker, tmpRng, nodes;
marker = dom.create('a');
container = start ? startContainer : endContainer;
offset = start ? startOffset : endOffset;
tmpRng = ieRng.duplicate();
if (container.nodeType == 3) {
container.parentNode.insertBefore(marker, container);
tmpRng.moveToElementText(marker);
tmpRng.moveStart('character', offset);
dom.remove(marker);
ieRng.setEndPoint(start ? 'StartToStart' :
'EndToEnd', tmpRng);
} else {
nodes = container.childNodes;
if (nodes.length) {
if (offset >= nodes.length) {
dom.insertAfter(marker,
nodes[nodes.length - 1]);
} else {
container.insertBefore(marker,
nodes[offset]);
}
tmpRng.moveToElementText(marker);
} else if (container.canHaveHTML) {
// Empty node selection for example <div>|
</div>
// Setting innerHTML with a span marker then
remove that marker seems to keep empty block elements open
container.innerHTML = '<span>\uFEFF</span>';
marker = container.firstChild;
tmpRng.moveToElementText(marker);
tmpRng.collapse(FALSE); // Collapse false works
better than true for some odd reason
}
ieRng.setEndPoint(start ? 'StartToStart' :
'EndToEnd', tmpRng);
dom.remove(marker);
}
}
startContainer.innerHTML =
'<span>\uFEFF</span><span>\uFEFF</span>';
ieRng.moveToElementText(startContainer.lastChild);
ieRng.select();
dom.doc.selection.clear();
startContainer.innerHTML = '';
if (sibling) {
sibling.innerHTML = '';
}
return;
} else {
startOffset = dom.nodeIndex(startContainer);
startContainer = startContainer.parentNode;
}
}
if (startOffset == endOffset - 1) {
try {
ctrlElm =
startContainer.childNodes[startOffset];
ctrlRng = body.createControlRange();
ctrlRng.addElement(ctrlElm);
ctrlRng.select();
/*
* Sizzle CSS Selector Engine
* Copyright, The Dojo Foundation
* Released under the MIT, BSD, and GPL Licenses.
* More information: http://sizzlejs.com/
*/
(function(){
if ( m ) {
soFar = m[3];
parts.push( m[1] );
if ( m[2] ) {
extra = m[3];
break;
}
}
} while ( m );
} else {
set = Expr.relative[ parts[0] ] ?
[ context ] :
Sizzle( parts.shift(), context );
while ( parts.length ) {
selector = parts.shift();
if ( Expr.relative[ selector ] ) {
selector += parts.shift();
}
} else {
// Take a shortcut and set the context if the root selector is an ID
// (but not if it'll be faster if the inner selector is an ID)
if ( !seed && parts.length > 1 && context.nodeType === 9 && !contextXML
&&
Expr.match.ID.test(parts[0]) && !
Expr.match.ID.test(parts[parts.length - 1]) ) {
if ( context ) {
ret = seed ?
{ expr: parts.pop(), set: makeArray(seed) } :
Sizzle.find( parts.pop(), parts.length === 1 && (parts[0]
=== "~" || parts[0] === "+") && context.parentNode ? context.parentNode : context,
contextXML );
set = ret.expr ?
Sizzle.filter( ret.expr, ret.set ) :
ret.set;
if ( parts.length > 0 ) {
checkSet = makeArray( set );
} else {
prune = false;
}
while ( parts.length ) {
cur = parts.pop();
pop = cur;
if ( !Expr.relative[ cur ] ) {
cur = "";
} else {
pop = parts.pop();
}
if ( pop == null ) {
pop = context;
}
} else {
checkSet = parts = [];
}
}
if ( !checkSet ) {
checkSet = set;
}
if ( !checkSet ) {
Sizzle.error( cur || selector );
}
} else {
for ( i = 0; checkSet[i] != null; i++ ) {
if ( checkSet[i] && checkSet[i].nodeType === 1 ) {
results.push( set[i] );
}
}
}
} else {
makeArray( checkSet, results );
}
if ( extra ) {
Sizzle( extra, origContext, results, seed );
Sizzle.uniqueSort( results );
}
return results;
};
if ( hasDuplicate ) {
for ( var i = 1; i < results.length; i++ ) {
if ( results[i] === results[ i - 1 ] ) {
results.splice( i--, 1 );
}
}
}
}
return results;
};
if ( !expr ) {
return [];
}
if ( set != null ) {
expr = expr.replace( Expr.match[ type ], "" );
break;
}
}
}
}
if ( !set ) {
set = typeof context.getElementsByTagName !== "undefined" ?
context.getElementsByTagName( "*" ) :
[];
}
anyFound = false;
match.splice(1,1);
if ( Expr.preFilter[ type ] ) {
match = Expr.preFilter[ type ]( match, curLoop,
inplace, result, not, isXMLFilter );
if ( !match ) {
anyFound = found = true;
} else if ( match === true ) {
continue;
}
}
if ( match ) {
for ( i = 0; (item = curLoop[i]) != null; i++ ) {
if ( item ) {
found = filter( item, match, i,
curLoop );
pass = not ^ found;
} else {
curLoop[i] = false;
}
} else if ( pass ) {
result.push( item );
anyFound = true;
}
}
}
}
if ( !anyFound ) {
return [];
}
break;
}
}
}
// Improper expression
if ( expr === old ) {
if ( anyFound == null ) {
Sizzle.error( expr );
} else {
break;
}
}
old = expr;
}
return curLoop;
};
Sizzle.error = function( msg ) {
throw new Error( "Syntax error, unrecognized expression: " + msg );
};
if ( nodeType ) {
if ( nodeType === 1 || nodeType === 9 || nodeType === 11 ) {
// Use textContent || innerText for elements
if ( typeof elem.textContent === 'string' ) {
return elem.textContent;
} else if ( typeof elem.innerText === 'string' ) {
// Replace IE's carriage returns
return elem.innerText.replace( rReturn, '' );
} else {
// Traverse it's children
for ( elem = elem.firstChild; elem; elem =
elem.nextSibling) {
ret += getText( elem );
}
}
} else if ( nodeType === 3 || nodeType === 4 ) {
return elem.nodeValue;
}
} else {
match: {
ID: /#((?:[\w\u00c0-\uFFFF\-]|\\.)+)/,
CLASS: /\.((?:[\w\u00c0-\uFFFF\-]|\\.)+)/,
NAME: /\[name=['"]*((?:[\w\u00c0-\uFFFF\-]|\\.)+)['"]*\]/,
ATTR: /\[\s*((?:[\w\u00c0-\uFFFF\-]|\\.)+)\s*(?:(\S?=)\s*(?:(['"])
(.*?)\3|(#?(?:[\w\u00c0-\uFFFF\-]|\\.)*)|)|)\s*\]/,
TAG: /^((?:[\w\u00c0-\uFFFF\*\-]|\\.)+)/,
CHILD: /:(only|nth|last|first)-child(?:\(\s*(even|odd|(?:[+\-]?\d+|(?:
[+\-]?\d*)?n\s*(?:[+\-]\s*\d+)?))\s*\))?/,
POS: /:(nth|eq|gt|lt|first|last|even|odd)(?:\((\d*)\))?(?=[^\-]|$)/,
PSEUDO: /:((?:[\w\u00c0-\uFFFF\-]|\\.)+)(?:\((['"]?)((?:\([^\)]+\)|[^\
(\)]*)+)\2\))?/
},
leftMatch: {},
attrMap: {
"class": "className",
"for": "htmlFor"
},
attrHandle: {
href: function( elem ) {
return elem.getAttribute( "href" );
},
type: function( elem ) {
return elem.getAttribute( "type" );
}
},
relative: {
"+": function(checkSet, part){
var isPartStr = typeof part === "string",
isTag = isPartStr && !rNonWord.test( part ),
isPartStrNotTag = isPartStr && !isTag;
if ( isTag ) {
part = part.toLowerCase();
}
if ( isPartStrNotTag ) {
Sizzle.filter( part, checkSet, true );
}
},
if ( elem ) {
var parent = elem.parentNode;
checkSet[i] = parent.nodeName.toLowerCase() ===
part ? parent : false;
}
}
} else {
for ( ; i < l; i++ ) {
elem = checkSet[i];
if ( elem ) {
checkSet[i] = isPartStr ?
elem.parentNode :
elem.parentNode === part;
}
}
if ( isPartStr ) {
Sizzle.filter( part, checkSet, true );
}
}
},
find: {
ID: function( match, context, isXML ) {
if ( typeof context.getElementById !== "undefined" && !isXML ) {
var m = context.getElementById(match[1]);
// Check parentNode to catch when Blackberry 4.6 returns
// nodes that are no longer in the document #6963
return m && m.parentNode ? [m] : [];
}
},
NAME: function( match, context ) {
if ( typeof context.getElementsByName !== "undefined" ) {
var ret = [],
results = context.getElementsByName( match[1] );
if ( isXML ) {
return match;
}
} else if ( inplace ) {
curLoop[i] = false;
}
}
}
return false;
},
return match;
},
return match;
},
} else {
var ret = Sizzle.filter(match[3], curLoop, inplace,
true ^ not);
if ( !inplace ) {
result.push.apply( result, ret );
}
return false;
}
return match;
},
return match;
}
},
filters: {
enabled: function( elem ) {
return elem.disabled === false && elem.type !== "hidden";
},
if ( filter ) {
return filter( elem, i, match, array );
return true;
} else {
Sizzle.error( name );
}
},
switch ( type ) {
case "only":
case "first":
while ( (node = node.previousSibling) ) {
if ( node.nodeType === 1 ) {
return false;
}
}
node = elem;
/* falls through */
case "last":
while ( (node = node.nextSibling) ) {
if ( node.nodeType === 1 ) {
return false;
}
}
return true;
case "nth":
first = match[2];
last = match[3];
doneName = match[0];
parent = elem.parentNode;
if ( first === 0 ) {
return diff === 0;
} else {
return ( diff % first === 0 && diff / first >=
0 );
}
}
},
if ( filter ) {
return filter( elem, i, match, array );
}
}
}
};
if ( results ) {
results.push.apply( results, array );
return results;
}
return array;
};
} else {
for ( ; array[i]; i++ ) {
ret.push( array[i] );
}
}
}
return ret;
};
}
if ( document.documentElement.compareDocumentPosition ) {
sortOrder = function( a, b ) {
if ( a === b ) {
hasDuplicate = true;
return 0;
}
if ( !a.compareDocumentPosition || !b.compareDocumentPosition ) {
return a.compareDocumentPosition ? -1 : 1;
}
} else {
sortOrder = function( a, b ) {
// The nodes are identical, we can exit early
if ( a === b ) {
hasDuplicate = true;
return 0;
} else if ( !bup ) {
return 1;
}
cur = bup;
while ( cur ) {
bp.unshift( cur );
cur = cur.parentNode;
}
al = ap.length;
bl = bp.length;
while ( cur ) {
if ( cur === b ) {
return -1;
}
cur = cur.nextSibling;
}
return 1;
};
}
// Inject it into the root element, check its status, and remove it quickly
root.insertBefore( form, root.firstChild );
return m ?
m.id === match[1] || typeof m.getAttributeNode !==
"undefined" && m.getAttributeNode("id").nodeValue === match[1] ?
[m] :
undefined :
[];
}
};
root.removeChild( form );
// release memory in IE
root = form = null;
})();
(function(){
// Check to see if the browser returns only elements
// when doing getElementsByTagName("*")
results = tmp;
}
return results;
};
}
// release memory in IE
div = null;
})();
if ( document.querySelectorAll ) {
(function(){
var oldSizzle = Sizzle,
div = document.createElement("div"),
id = "__sizzle__";
// Speed-up: Sizzle(".CLASS")
} else if ( match[2] && Expr.find.CLASS &&
context.getElementsByClassName ) {
return
makeArray( context.getElementsByClassName( match[2] ), extra );
}
}
if ( context.nodeType === 9 ) {
// Speed-up: Sizzle("body")
// The body element only exists once, optimize
finding it
if ( query === "body" && context.body ) {
return makeArray( [ context.body ], extra );
// Speed-up: Sizzle("#ID")
} else if ( match && match[3] ) {
var elem = context.getElementById( match[3] );
} else {
return makeArray( [], extra );
}
}
try {
return
makeArray( context.querySelectorAll(query), extra );
} catch(qsaError) {}
if ( !old ) {
context.setAttribute( "id", nid );
} else {
nid = nid.replace( /'/g, "\\$&" );
}
if ( relativeHierarchySelector && hasParent ) {
context = context.parentNode;
}
try {
if ( !relativeHierarchySelector || hasParent )
{
return
makeArray( context.querySelectorAll( "[id='" + nid + "'] " + query ), extra );
}
} catch(pseudoError) {
} finally {
if ( !old ) {
oldContext.removeAttribute( "id" );
}
}
}
}
// release memory in IE
div = null;
})();
}
(function(){
var html = document.documentElement,
matches = html.matchesSelector || html.mozMatchesSelector ||
html.webkitMatchesSelector || html.msMatchesSelector;
if ( matches ) {
// Check to see if it's possible to do matchesSelector
// on a disconnected node (IE 9 fails this)
var disconnectedMatch = !matches.call( document.createElement( "div" ),
"div" ),
pseudoWorks = false;
try {
// This should fail with an exception
// Gecko does not error, returns false instead
matches.call( document.documentElement, "[test!='']:sizzle" );
} catch( pseudoError ) {
pseudoWorks = true;
}
(function(){
var div = document.createElement("div");
if ( div.getElementsByClassName("e").length === 1 ) {
return;
}
Expr.order.splice(1, 0, "CLASS");
Expr.find.CLASS = function( match, context, isXML ) {
if ( typeof context.getElementsByClassName !== "undefined" && !isXML )
{
return context.getElementsByClassName(match[1]);
}
};
// release memory in IE
div = null;
})();
if ( elem ) {
var match = false;
elem = elem[dir];
while ( elem ) {
if ( elem[ expando ] === doneName ) {
match = checkSet[elem.sizset];
break;
}
elem = elem[dir];
}
checkSet[i] = match;
}
}
}
if ( elem ) {
var match = false;
elem = elem[dir];
while ( elem ) {
if ( elem[ expando ] === doneName ) {
match = checkSet[elem.sizset];
break;
}
if ( elem.nodeType === 1 ) {
if ( !isXML ) {
elem[ expando ] = doneName;
elem.sizset = i;
}
elem = elem[dir];
}
checkSet[i] = match;
}
}
}
if ( document.documentElement.contains ) {
Sizzle.contains = function( a, b ) {
return a !== b && (a.contains ? a.contains(b) : true);
};
} else if ( document.documentElement.compareDocumentPosition ) {
Sizzle.contains = function( a, b ) {
return !!(a.compareDocumentPosition(b) & 16);
};
} else {
Sizzle.contains = function() {
return false;
};
}
// EXPOSE
window.tinymce.dom.Sizzle = Sizzle;
})();
(function(tinymce) {
tinymce.dom.Element = function(id, settings) {
var t = this, dom, el;
tinymce.each(
('getPos,getRect,getParent,add,setStyle,getStyle,setStyles,' +
'setAttrib,setAttribs,getAttrib,addClass,removeClass,' +
'hasClass,getOuterHTML,setOuterHTML,remove,show,hide,' +
'isHidden,setHTML,get').split(/,/), function(k) {
t[k] = function() {
var a = [id], i;
a = dom[k].apply(dom, a);
t.update(k);
return a;
};
}
);
tinymce.extend(t, {
on : function(n, f, s) {
return tinymce.dom.Event.add(t.id, n, f, s);
},
getXY : function() {
return {
x : parseInt(t.getStyle('left')),
y : parseInt(t.getStyle('top'))
};
},
getSize : function() {
var n = dom.get(t.id);
return {
w : parseInt(t.getStyle('width') || n.clientWidth),
h : parseInt(t.getStyle('height') || n.clientHeight)
};
},
moveTo : function(x, y) {
t.setStyles({left : x, top : y});
},
moveBy : function(x, y) {
var p = t.getXY();
resizeTo : function(w, h) {
t.setStyles({width : w, height : h});
},
resizeBy : function(w, h) {
var s = t.getSize();
update : function(k) {
var b;
// Ignore getters
if (k.indexOf('get') === 0 || k.indexOf('has') === 0
|| k.indexOf('is') === 0)
return;
if (!t.blocker) {
t.blocker = dom.uniqueId();
b = dom.add(settings.container ||
dom.getRoot(), 'iframe', {id : t.blocker, style : 'position:absolute;', frameBorder
: 0, src : 'javascript:""'});
dom.setStyle(b, 'opacity', 0);
} else
b = dom.get(t.blocker);
dom.setStyles(b, {
left : t.getStyle('left', 1),
top : t.getStyle('top', 1),
width : t.getStyle('width', 1),
height : t.getStyle('height', 1),
display : t.getStyle('display', 1),
zIndex : parseInt(t.getStyle('zIndex', 1) || 0)
- 1
});
}
}
});
};
})(tinymce);
(function(tinymce) {
function trimNl(s) {
return s.replace(/[\n\r]+/g, '');
};
// Shorten names
var is = tinymce.is, isIE = tinymce.isIE, each = tinymce.each, TreeWalker =
tinymce.dom.TreeWalker;
tinymce.create('tinymce.dom.Selection', {
Selection : function(dom, win, serializer, editor) {
var t = this;
t.dom = dom;
t.win = win;
t.serializer = serializer;
t.editor = editor;
// Add events
each([
'onBeforeSetContent',
'onBeforeGetContent',
'onSetContent',
'onGetContent'
], function(e) {
t[e] = new tinymce.util.Dispatcher(t);
});
// Prevent leaks
tinymce.addUnload(t.destroy, t);
},
s = s || {};
wb = wa = '';
s.get = true;
s.format = s.format || 'html';
s.forced_root_block = '';
t.onBeforeGetContent.dispatch(t, s);
if (s.format == 'text')
return t.isCollapsed() ? '' : (r.text || (se.toString ?
se.toString() : ''));
if (r.cloneContents) {
n = r.cloneContents();
if (n)
e.appendChild(n);
} else if (is(r.item) || is(r.htmlText)) {
// IE will produce invalid markup if elements are present
that
// it doesn't understand like custom elements or HTML5
elements.
// Adding a BR in front of the contents and then remoiving
it seems to fix it though.
e.innerHTML = '<br>' + (r.item ? r.item(0).outerHTML :
r.htmlText);
e.removeChild(e.firstChild);
} else
e.innerHTML = r.toString();
if (/\s+$/.test(e.innerHTML))
wa = ' ';
s.getInner = true;
return s.content;
},
content = args.content;
if (rng.insertNode) {
// Make caret marker since insertNode places the caret in
the beginning of text after insert
content += '<span id="__caret">_</span>';
if (doc.body.childNodes.length === 0) {
doc.body.innerHTML = content;
} else {
// createContextualFragment doesn't exists in
IE 9 DOMRanges
if (rng.createContextualFragment) {
rng.insertNode(rng.createContextualFragment(content));
} else {
// Fake createContextualFragment call in
IE 9
frag = doc.createDocumentFragment();
temp = doc.createElement('div');
frag.appendChild(temp);
temp.outerHTML = content;
rng.insertNode(frag);
}
}
}
try {
self.setRng(rng);
} catch (ex) {
// Might fail on Opera for some odd reason
}
} else {
if (rng.item) {
// Delete content and get caret text selection
doc.execCommand('Delete', false, null);
rng = self.getRng();
}
// Explorer removes spaces from the beginning of pasted
contents
if (/^\s+/.test(content)) {
rng.pasteHTML('<span id="__mce_tmp">_</span>' +
content);
self.dom.remove('__mce_tmp');
} else
rng.pasteHTML(content);
}
getStart : function() {
var self = this, rng = self.getRng(), startElement,
parentElement, checkRng, node;
if (rng.duplicate || rng.item) {
// Control selection, return first item
if (rng.item)
return rng.item(0);
return startElement;
} else {
startElement = rng.startContainer;
if (startElement.nodeType == 1 &&
startElement.hasChildNodes())
startElement =
startElement.childNodes[Math.min(startElement.childNodes.length - 1,
rng.startOffset)];
return startElement;
}
},
getEnd : function() {
var self = this, rng = self.getRng(), endElement, endOffset;
if (rng.duplicate || rng.item) {
if (rng.item)
return rng.item(0);
rng = rng.duplicate();
rng.collapse(0);
endElement = rng.parentElement();
if (endElement.ownerDocument !== self.dom.doc) {
endElement = self.dom.getRoot();
}
return endElement;
} else {
endElement = rng.endContainer;
endOffset = rng.endOffset;
return endElement;
}
},
each(dom.select(name), function(node, i) {
if (node == element)
index = i;
});
return index;
};
function normalizeTableCellSelection(rng) {
function moveEndPoint(start) {
var container, offset, childNodes, prefix = start ?
'start' : 'end';
moveEndPoint(true);
moveEndPoint();
return rng;
};
function getLocation() {
var rng = t.getRng(true), root = dom.getRoot(), bookmark =
{};
if (container.nodeType == 3) {
if (normalized) {
for (node = container.previousSibling;
node && node.nodeType == 3; node = node.previousSibling)
offset += node.nodeValue.length;
}
point.push(offset);
} else {
childNodes = container.childNodes;
point.push(t.dom.nodeIndex(childNodes[offset],
normalized) + after);
}
return point;
};
bookmark.start = getPoint(rng, true);
if (!t.isCollapsed())
bookmark.end = getPoint(rng);
return bookmark;
};
if (type == 2) {
if (t.tridentSel)
return t.tridentSel.getBookmark(type);
return getLocation();
}
rng = t.getRng();
id = dom.uniqueId();
collapsed = tinyMCE.activeEditor.selection.isCollapsed();
styles = 'overflow:hidden;line-height:0px';
// Explorer method
if (rng.duplicate || rng.item) {
// Text selection
if (!rng.item) {
rng2 = rng.duplicate();
try {
// Insert start marker
rng.collapse();
rng.pasteHTML('<span data-mce-type="bookmark"
id="' + id + '_start" style="' + styles + '">' + chr + '</span>');
rng.moveToElementText(rng2.parentElement());
if (rng.compareEndPoints('StartToEnd',
rng2) === 0)
rng2.move('character', -1);
rng2.pasteHTML('<span data-mce-
type="bookmark" id="' + id + '_end" style="' + styles + '">' + chr + '</span>');
}
} catch (ex) {
// IE might throw unspecified error so lets
ignore it
return null;
}
} else {
// Control selection
element = rng.item(0);
name = element.nodeName;
// W3C method
rng2 = normalizeTableCellSelection(rng.cloneRange());
rng = normalizeTableCellSelection(rng);
rng.collapse(true);
rng.insertNode(dom.create('span', {'data-mce-type' :
"bookmark", id : id + '_start', style : styles}, chr));
}
moveToBookmark : function(bookmark) {
var t = this, dom = t.dom, marker1, marker2, rng, root,
startContainer, endContainer, startOffset, endOffset;
function setEndPoint(start) {
var point = bookmark[start ? 'start' : 'end'], i, node,
offset, children;
if (point) {
offset = point[0];
node = children[point[i]];
}
return true;
};
function restoreEndPoint(suffix) {
var marker = dom.get(bookmark.id + '_' + suffix), node,
idx, next, prev, keep = bookmark.keep;
if (marker) {
node = marker.parentNode;
if (suffix == 'start') {
if (!keep) {
idx = dom.nodeIndex(marker);
} else {
node = marker.firstChild;
idx = 1;
}
endContainer = node;
endOffset = idx;
}
if (!keep) {
prev = marker.previousSibling;
next = marker.nextSibling;
if (suffix == 'start') {
startContainer = endContainer =
prev;
startOffset = endOffset = idx;
} else {
endContainer = prev;
endOffset = idx;
}
}
}
}
};
function addBogus(node) {
// Adds a bogus BR element for empty block elements
if (dom.isBlock(node) && !node.innerHTML && !isIE)
node.innerHTML = '<br data-mce-bogus="1" />';
return node;
};
if (bookmark) {
if (bookmark.start) {
rng = dom.createRng();
root = dom.getRoot();
if (t.tridentSel)
return t.tridentSel.moveToBookmark(bookmark);
if (startContainer) {
rng = dom.createRng();
rng.setStart(addBogus(startContainer),
startOffset);
rng.setEnd(addBogus(endContainer), endOffset);
t.setRng(rng);
}
} else if (bookmark.name) {
t.select(dom.select(bookmark.name)[bookmark.index]);
} else if (bookmark.rng)
t.setRng(bookmark.rng);
}
},
do {
// Text node
if (node.nodeType == 3 &&
tinymce.trim(node.nodeValue).length !== 0) {
if (start)
rng.setStart(node, 0);
else
rng.setEnd(node, node.nodeValue.length);
return;
}
// BR element
if (node.nodeName == 'BR') {
if (start)
rng.setStartBefore(node);
else
rng.setEndBefore(node);
return;
}
} while (node = (start ? walker.next() : walker.prev()));
};
if (node) {
idx = dom.nodeIndex(node);
rng.setStart(node.parentNode, idx);
rng.setEnd(node.parentNode, idx + 1);
t.setRng(rng);
}
return node;
},
isCollapsed : function() {
var t = this, r = t.getRng(), s = t.getSel();
if (!r || r.item)
return false;
if (r.compareEndPoints)
return r.compareEndPoints('StartToEnd', r) === 0;
return !s || r.collapsed;
},
collapse : function(to_start) {
var self = this, rng = self.getRng(), node;
// Control range on IE
if (rng.item) {
node = rng.item(0);
rng = self.win.document.body.createTextRange();
rng.moveToElementText(node);
}
rng.collapse(!!to_start);
self.setRng(rng);
},
getSel : function() {
var t = this, w = this.win;
getRng : function(w3c) {
var self = this, selection, rng, elm, doc = self.win.document;
try {
if (selection = self.getSel()) {
rng = selection.rangeCount > 0 ?
selection.getRangeAt(0) : (selection.createRange ? selection.createRange() :
doc.createRange());
}
} catch (ex) {
// IE throws unspecified error here if TinyMCE is placed in
a frame/iframe
}
return rng;
},
if (!t.tridentSel) {
s = t.getSel();
if (s) {
t.explicitRange = r;
try {
s.removeAllRanges();
} catch (ex) {
// IE9 might throw errors here don't know why
}
s.addRange(r);
// Is IE specific range
try {
r.select();
} catch (ex) {
// Needed for some odd IE bug #1843306
}
}
},
setNode : function(n) {
var t = this;
t.setContent(t.dom.getOuterHTML(n));
return n;
},
getNode : function() {
var t = this, rng = t.getRng(), sel = t.getSel(), elm, start =
rng.startContainer, end = rng.endContainer;
if (rng.setStart) {
elm = rng.commonAncestorContainer;
return elm;
}
if (sb)
bl.push(sb);
return bl;
},
isForward: function(){
var dom = this.dom, sel = this.getSel(), anchorRange, focusRange;
anchorRange = dom.createRng();
anchorRange.setStart(sel.anchorNode, sel.anchorOffset);
anchorRange.collapse(true);
focusRange = dom.createRng();
focusRange.setStart(sel.focusNode, sel.focusOffset);
focusRange.collapse(true);
return
anchorRange.compareBoundaryPoints(anchorRange.START_TO_START, focusRange) <= 0;
},
normalize : function() {
var self = this, rng, normalized, collapsed, node, sibling;
function normalizeEndPoint(start) {
var container, offset, walker, dom = self.dom, body =
dom.getRoot(), node, nonEmptyElementsMap, nodeName;
lastInlineElement = node;
}
do {
// Found a text node use that
position
if (node.nodeType === 3 &&
node.nodeValue.length > 0) {
offset = start ? 0 :
node.nodeValue.length;
container = node;
normalized = true;
break;
}
normalized = true;
break;
}
} while (node = (start ? walker.next() :
walker.prev()));
}
}
}
rng = self.getRng();
collapsed = rng.collapsed;
if (!collapsed)
normalizeEndPoint();
//console.log(self.dom.dumpRng(rng));
self.setRng(rng, self.isForward());
}
},
if (!self.selectorChangedData) {
self.selectorChangedData = {};
currentSelectors = {};
self.editor.onNodeChange.addToTop(function(ed, cm, node) {
var dom = self.dom, parents = dom.getParents(node,
null, dom.getRoot()), matchedSelectors = {};
currentSelectors[selector] =
callbacks;
}
matchedSelectors[selector] =
callbacks;
return false;
}
});
});
each(callbacks, function(callback) {
callback(false, {node: node,
selector: selector, parents: parents});
});
}
});
});
}
self.selectorChangedData[selector].push(callback);
return self;
},
scrollIntoView: function(elm) {
var y, viewPort, self = this, dom = self.dom;
viewPort = dom.getViewPort(self.editor.getWin());
y = dom.getPos(elm).y;
if (y < viewPort.y || y + 25 > viewPort.y + viewPort.h) {
self.editor.getWin().scrollTo(0, y < viewPort.y ? y : y -
viewPort.h + 25);
}
},
destroy : function(manual) {
var self = this;
self.win = null;
try {
rng.moveToPoint(x, y);
} catch (ex) {
// IE sometimes throws and exception, so lets just
ignore it
rng = null;
}
return rng;
};
if (pointRng) {
// Check if pointRange is before/after
selection then change the endPoint
if (pointRng.compareEndPoints('StartToStart',
startRng) > 0)
pointRng.setEndPoint('StartToStart',
startRng);
else
pointRng.setEndPoint('EndToEnd',
startRng);
pointRng.select();
}
} else
endSelection();
}
// Removes listeners
function endSelection() {
var rng = doc.selection.createRange();
started = 1;
// Setup start position
startRng = rngFromPoint(e.x, e.y);
if (startRng) {
// Listen for selection change events
dom.bind(doc, 'mouseup', endSelection);
dom.bind(doc, 'mousemove', selectionChange);
dom.win.focus();
startRng.select();
}
}
});
}
});
})(tinymce);
(function(tinymce) {
tinymce.dom.Serializer = function(settings, dom, schema) {
var onPreProcess, onPostProcess, isIE = tinymce.isIE, each =
tinymce.each, htmlParser;
while (i--) {
node = nodes[i];
value = node.attributes.map[internalName];
if (value !== undef) {
// Set external name to internal value and remove
internal
node.attr(name, value.length > 0 ? value : null);
node.attr(internalName, null);
} else {
// No internal attribute found then convert the value
we have in the DOM
value = node.attributes.map[name];
while (i--) {
node = nodes[i];
value = node.attr('class').replace(/(?:^|\s)mce(Item\w+|
Selected)(?!\S)/g, '');
node.attr('class', value.length > 0 ? value : null);
}
});
// Remove bookmark elements
htmlParser.addAttributeFilter('data-mce-type', function(nodes, name,
args) {
var i = nodes.length, node;
while (i--) {
node = nodes[i];
while (i--) {
nodes[i].attr(name, null);
}
});
htmlParser.addNodeFilter('noscript', function(nodes) {
var i = nodes.length, node;
while (i--) {
node = nodes[i].firstChild;
if (node) {
node.value =
tinymce.html.Entities.decode(node.value);
}
}
});
// Force script into CDATA sections and remove the mce- prefix also add
comments around styles
htmlParser.addNodeFilter('script,style', function(nodes, name) {
var i = nodes.length, node, value;
function trim(value) {
return value.replace(/(<!--\[CDATA\[|\]\]-->)/g, '\n')
.replace(/^[\r\n]*|[\r\n]*$/g, '')
.replace(/^\s*((<!--)?(\s*\/\/)?\s*<!\[CDATA\[|
(<!--\s*)?\/\*\s*<!\[CDATA\[\s*\*\/|
(\/\/)?\s*<!--|\/\*\s*<!--\s*\*\/)\s*[\r\n]*/gi, '')
.replace(/\s*(\/\*\s*\]\]>\s*\*\/(--
>)?|\s*\/\/\s*\]\]>(-->)?|\/\/\s*(-->)?|\]\]>|\/\*\s*-->\s*\*\/|\s*-->\s*)\s*$/g,
'');
};
while (i--) {
node = nodes[i];
value = node.firstChild ? node.firstChild.value : '';
if (value.length > 0)
node.firstChild.value = '// <![CDATA[\n' +
trim(value) + '\n// ]]>';
} else {
if (value.length > 0)
node.firstChild.value = '<!--\n' + trim(value)
+ '\n-->';
}
}
});
while (i--) {
node = nodes[i];
if (node.value.indexOf('[CDATA[') === 0) {
node.name = '#cdata';
node.type = 4;
node.value = node.value.replace(/^\[CDATA\[|\]\]$/g,
'');
} else if (node.value.indexOf('mce:protected ') === 0) {
node.name = "#text";
node.type = 3;
node.raw = true;
node.value = unescape(node.value).substr(14);
}
}
});
while (i--) {
node = nodes[i];
if (node.type === 7)
node.remove();
else if (node.type === 1) {
if (name === "input" && !("type" in
node.attributes.map))
node.attr('type', 'text');
}
}
});
while (i--) {
node = nodes[i];
parentNode = node.parent;
if (parentNode.name === 'ul' || parentNode.name ===
'ol') {
if (node.prev && node.prev.name === 'li') {
node.prev.append(node);
}
}
}
});
}
while (i--) {
nodes[i].attr(name, null);
}
});
addNodeFilter : htmlParser.addNodeFilter,
addAttributeFilter : htmlParser.addAttributeFilter,
onPreProcess : onPreProcess,
onPostProcess : onPostProcess,
// Pre process
if (!args.no_events) {
args.node = node;
onPreProcess.dispatch(self, args);
}
// Setup serializer
htmlSerializer = new tinymce.html.Serializer(settings,
schema);
// Post process
if (!args.no_events)
onPostProcess.dispatch(self, args);
args.node = null;
return args.content;
},
addRules : function(rules) {
schema.addValidElements(rules);
},
setRules : function(rules) {
schema.setValidElements(rules);
}
};
};
})(tinymce);
(function(tinymce) {
tinymce.dom.ScriptLoader = function(settings) {
var QUEUED = 0,
LOADING = 1,
LOADED = 2,
states = {},
queue = [],
scriptLoadedCallbacks = {},
queueLoadedCallbacks = [],
loading = 0,
undef;
if (elm)
elm.onreadystatechange = elm.onload = elm = null;
callback();
};
function error() {
// Report the error so it's easier for people to spot
loading errors
if (typeof(console) !== "undefined" && console.log)
console.log("Failed to load: " + url);
id = dom.uniqueId();
if (tinymce.isIE6) {
uri = new tinymce.util.URI(url);
loc = location;
done();
},
error : error
});
return;
}
}
// Add onerror event will get fired on some browsers but not all
of them
elm.onerror = error;
this.isDone = function(url) {
return states[url] == LOADED;
};
this.markDone = function(url) {
states[url] = LOADED;
};
if (callback) {
// Store away callback for later execution
if (!scriptLoadedCallbacks[url])
scriptLoadedCallbacks[url] = [];
scriptLoadedCallbacks[url].push({
func : callback,
scope : scope || this
});
}
};
function execScriptLoadedCallbacks(url) {
// Execute URL callback functions
tinymce.each(scriptLoadedCallbacks[url], function(callback)
{
callback.func.call(callback.scope);
});
scriptLoadedCallbacks[url] = undef;
};
queueLoadedCallbacks.push({
func : callback,
scope : scope || this
});
loadScripts = function() {
var loadingScripts = tinymce.grep(scripts);
loadScript(url, function() {
states[url] = LOADED;
loading--;
execScriptLoadedCallbacks(url);
queueLoadedCallbacks.length = 0;
}
};
loadScripts();
};
};
(function(tinymce) {
tinymce.dom.RangeUtils = function(dom) {
var INVISIBLE_CHAR = '\uFEFF';
return;
}
function exclude(nodes) {
var node;
return nodes;
};
return siblings;
};
node = node.parentNode;
} while(node);
};
callback(exclude(siblings));
}
}
};
// Same container
if (startContainer == endContainer)
return callback(exclude([startContainer]));
if (siblings.length)
callback(exclude(siblings));
this.split = function(rng) {
var startContainer = rng.startContainer,
startOffset = rng.startOffset,
endContainer = rng.endContainer,
endOffset = rng.endOffset;
return {
startContainer : startContainer,
startOffset : startOffset,
endContainer : endContainer,
endOffset : endOffset
};
};
};
return false;
};
})(tinymce);
(function(tinymce) {
var Event = tinymce.dom.Event, each = tinymce.each;
tinymce.create('tinymce.ui.KeyboardNavigation', {
KeyboardNavigation: function(settings, dom) {
var t = this, root = settings.root, items = settings.items,
enableUpDown = settings.enableUpDown, enableLeftRight
= settings.enableLeftRight || !settings.enableUpDown,
excludeFromTabOrder = settings.excludeFromTabOrder,
itemFocussed, itemBlurred, rootKeydown, rootFocussed,
focussedId;
itemFocussed = function(evt) {
focussedId = evt.target.id;
};
itemBlurred = function(evt) {
dom.setAttrib(evt.target.id, 'tabindex', '-1');
};
rootFocussed = function(evt) {
var item = dom.get(focussedId);
dom.setAttrib(item, 'tabindex', '0');
item.focus();
};
t.focus = function() {
dom.get(focussedId).focus();
};
t.destroy = function() {
each(items, function(item) {
var elm = dom.get(item.id);
if (!focussedId)
return;
idx += dir;
if (idx < 0) {
idx = items.length - 1;
} else if (idx >= items.length) {
idx = 0;
}
newFocus = items[idx];
dom.setAttrib(focussedId, 'tabindex', '-1');
dom.setAttrib(newFocus.id, 'tabindex', '0');
dom.get(newFocus.id).focus();
if (settings.actOnFocus) {
settings.onAction(newFocus.id);
}
if (evt)
Event.cancel(evt);
};
rootKeydown = function(evt) {
var DOM_VK_LEFT = 37, DOM_VK_RIGHT = 39, DOM_VK_UP = 38,
DOM_VK_DOWN = 40, DOM_VK_ESCAPE = 27, DOM_VK_ENTER = 14, DOM_VK_RETURN = 13,
DOM_VK_SPACE = 32;
switch (evt.keyCode) {
case DOM_VK_LEFT:
if (enableLeftRight) t.moveFocus(-1);
break;
case DOM_VK_RIGHT:
if (enableLeftRight) t.moveFocus(1);
break;
case DOM_VK_UP:
if (enableUpDown) t.moveFocus(-1);
break;
case DOM_VK_DOWN:
if (enableUpDown) t.moveFocus(1);
break;
case DOM_VK_ESCAPE:
if (settings.onCancel) {
settings.onCancel();
Event.cancel(evt);
}
break;
case DOM_VK_ENTER:
case DOM_VK_RETURN:
case DOM_VK_SPACE:
if (settings.onAction) {
settings.onAction(focussedId);
Event.cancel(evt);
}
break;
}
};
if (!item.id) {
item.id = dom.uniqueId('_mce_item_');
}
elm = dom.get(item.id);
if (excludeFromTabOrder) {
dom.bind(elm, 'blur', itemBlurred);
tabindex = '-1';
} else {
tabindex = (idx === 0 ? '0' : '-1');
}
elm.setAttribute('tabindex', tabindex);
dom.bind(elm, 'focus', itemFocussed);
});
(function(tinymce) {
// Shorten class names
var DOM = tinymce.DOM, is = tinymce.is;
tinymce.create('tinymce.ui.Control', {
Control : function(id, s, editor) {
this.id = id;
this.settings = s = s || {};
this.rendered = false;
this.onRender = new tinymce.util.Dispatcher(this);
this.classPrefix = '';
this.scope = s.scope || this;
this.disabled = 0;
this.active = 0;
this.editor = editor;
},
focus : function() {
DOM.get(this.id).focus();
},
setDisabled : function(s) {
if (s != this.disabled) {
this.setAriaProperty('disabled', s);
this.setState('Disabled', s);
this.setState('Enabled', !s);
this.disabled = s;
}
},
isDisabled : function() {
return this.disabled;
},
setActive : function(s) {
if (s != this.active) {
this.setState('Active', s);
this.active = s;
this.setAriaProperty('pressed', s);
}
},
isActive : function() {
return this.active;
},
setState : function(c, s) {
var n = DOM.get(this.id);
c = this.classPrefix + c;
if (s)
DOM.addClass(n, c);
else
DOM.removeClass(n, c);
},
isRendered : function() {
return this.rendered;
},
renderHTML : function() {
},
renderTo : function(n) {
DOM.setHTML(n, this.renderHTML());
},
postRender : function() {
var t = this, b;
if (is(t.active)) {
b = t.active;
t.active = -1;
t.setActive(b);
}
},
remove : function() {
DOM.remove(this.id);
this.destroy();
},
destroy : function() {
tinymce.dom.Event.clear(this.id);
}
});
})(tinymce);
tinymce.create('tinymce.ui.Container:tinymce.ui.Control', {
Container : function(id, s, editor) {
this.parent(id, s, editor);
this.controls = [];
this.lookup = {};
},
add : function(c) {
this.lookup[c.id] = c;
this.controls.push(c);
return c;
},
get : function(n) {
return this.lookup[n];
}
});
tinymce.create('tinymce.ui.Separator:tinymce.ui.Control', {
Separator : function(id, s) {
this.parent(id, s);
this.classPrefix = 'mceSeparator';
this.setDisabled(true);
},
renderHTML : function() {
return tinymce.DOM.createHTML('span', {'class' : this.classPrefix, role
: 'separator', 'aria-orientation' : 'vertical', tabindex : '-1'});
}
});
(function(tinymce) {
var is = tinymce.is, DOM = tinymce.DOM, each = tinymce.each, walk =
tinymce.walk;
tinymce.create('tinymce.ui.MenuItem:tinymce.ui.Control', {
MenuItem : function(id, s) {
this.parent(id, s);
this.classPrefix = 'mceMenuItem';
},
setSelected : function(s) {
this.setState('Selected', s);
this.setAriaProperty('checked', !!s);
this.selected = s;
},
isSelected : function() {
return this.selected;
},
postRender : function() {
var t = this;
t.parent();
(function(tinymce) {
var is = tinymce.is, DOM = tinymce.DOM, each = tinymce.each, walk =
tinymce.walk;
tinymce.create('tinymce.ui.Menu:tinymce.ui.MenuItem', {
Menu : function(id, s) {
var t = this;
t.parent(id, s);
t.items = {};
t.collapsed = false;
t.menuCount = 0;
t.onAddItem = new tinymce.util.Dispatcher(this);
},
expand : function(d) {
var t = this;
if (d) {
walk(t, function(o) {
if (o.expand)
o.expand();
}, 'items', t);
}
t.collapsed = false;
},
collapse : function(d) {
var t = this;
if (d) {
walk(t, function(o) {
if (o.collapse)
o.collapse();
}, 'items', t);
}
t.collapsed = true;
},
isCollapsed : function() {
return this.collapsed;
},
add : function(o) {
if (!o.settings)
o = new tinymce.ui.MenuItem(o.id || DOM.uniqueId(), o);
this.onAddItem.dispatch(this, o);
return this.items[o.id] = o;
},
addSeparator : function() {
return this.add({separator : true});
},
addMenu : function(o) {
if (!o.collapse)
o = this.createMenu(o);
this.menuCount++;
return this.add(o);
},
hasMenus : function() {
return this.menuCount !== 0;
},
remove : function(o) {
delete this.items[o.id];
},
removeAll : function() {
var t = this;
walk(t, function(o) {
if (o.removeAll)
o.removeAll();
else
o.remove();
o.destroy();
}, 'items', t);
t.items = {};
},
createMenu : function(o) {
var m = new tinymce.ui.Menu(o.id || DOM.uniqueId(), o);
m.onAddItem.add(this.onAddItem.dispatch, this.onAddItem);
return m;
}
});
})(tinymce);
(function(tinymce) {
var is = tinymce.is, DOM = tinymce.DOM, each = tinymce.each, Event =
tinymce.dom.Event, Element = tinymce.dom.Element;
tinymce.create('tinymce.ui.DropMenu:tinymce.ui.Menu', {
DropMenu : function(id, s) {
s = s || {};
s.container = s.container || DOM.doc.body;
s.offset_x = s.offset_x || 0;
s.offset_y = s.offset_y || 0;
s.vp_offset_x = s.vp_offset_x || 0;
s.vp_offset_y = s.vp_offset_y || 0;
createMenu : function(s) {
var t = this, cs = t.settings, m;
m.onAddItem.add(t.onAddItem.dispatch, t.onAddItem);
return m;
},
focus : function() {
var t = this;
if (t.keyboardNav) {
t.keyboardNav.focus();
}
},
update : function() {
var t = this, s = t.settings, tb = DOM.get('menu_' + t.id +
'_tbl'), co = DOM.get('menu_' + t.id + '_co'), tw, th;
if (!DOM.boxModel)
t.element.setStyles({width : tw + 2, height : th + 2});
else
t.element.setStyles({width : tw, height : th});
if (s.max_width)
DOM.setStyle(co, 'width', tw);
if (s.max_height) {
DOM.setStyle(co, 'height', th);
if (t.isMenuVisible)
return;
if (!t.rendered) {
co = DOM.add(t.settings.container, t.renderNode());
each(t.items, function(o) {
o.postRender();
});
DOM.show(co);
t.update();
x += s.offset_x || 0;
y += s.offset_y || 0;
vp.w -= 4;
vp.h -= 4;
t.isMenuVisible = 1;
t.mouseClickFunc = Event.add(co, 'click', function(e) {
var m;
e = e.target;
dm = t;
while (dm) {
if (dm.hideMenu)
dm.hideMenu();
dm = dm.settings.parent;
}
if (m.settings.onclick)
m.settings.onclick(e);
if (t.hasMenus()) {
t.mouseOverFunc = Event.add(co, 'mouseover', function(e) {
var m, r, mi;
e = e.target;
if (e && (e = DOM.getParent(e, 'tr'))) {
m = t.items[e.id];
if (t.lastMenu)
t.lastMenu.collapse(1);
if (m.isDisabled())
return;
t.onShowMenu.dispatch(t);
if (s.keyboard_focus) {
t._setupKeyboardNav();
}
},
hideMenu : function(c) {
var t = this, co = DOM.get('menu_' + t.id), e;
if (!t.isMenuVisible)
return;
if (t.keyboardNav) t.keyboardNav.destroy();
Event.remove(co, 'mouseover', t.mouseOverFunc);
Event.remove(co, 'click', t.mouseClickFunc);
Event.remove(co, 'keydown', t._keyHandler);
DOM.hide(co);
t.isMenuVisible = 0;
if (!c)
t.collapse(1);
if (t.element)
t.element.hide();
if (e = DOM.get(t.id))
DOM.removeClass(e.firstChild, t.classPrefix +
'ItemActive');
t.onHideMenu.dispatch(t);
},
add : function(o) {
var t = this, co;
o = t.parent(o);
return o;
},
collapse : function(d) {
this.parent(d);
this.hideMenu(1);
},
remove : function(o) {
DOM.remove(o.id);
this.destroy();
return this.parent(o);
},
destroy : function() {
var t = this, co = DOM.get('menu_' + t.id);
if (t.keyboardNav) t.keyboardNav.destroy();
Event.remove(co, 'mouseover', t.mouseOverFunc);
Event.remove(DOM.select('a', co), 'focus', t.mouseOverFunc);
Event.remove(co, 'click', t.mouseClickFunc);
Event.remove(co, 'keydown', t._keyHandler);
if (t.element)
t.element.remove();
DOM.remove(co);
},
renderNode : function() {
var t = this, s = t.settings, n, tb, co, w;
if (s.menu_line)
DOM.add(co, 'span', {'class' : t.classPrefix + 'Line'});
each(t.items, function(o) {
t._add(tb, o);
});
t.rendered = true;
return w;
},
// Internal functions
_setupKeyboardNav : function(){
var contextMenu, menuItems, t=this;
contextMenu = DOM.get('menu_' + t.id);
menuItems = DOM.select('a[role=option]', 'menu_' + t.id);
menuItems.splice(0,0,contextMenu);
t.keyboardNav = new tinymce.ui.KeyboardNavigation({
root: 'menu_' + t.id,
items: menuItems,
onCancel: function() {
t.hideMenu();
},
enableUpDown: true
});
contextMenu.focus();
},
_keyHandler : function(evt) {
var t = this, e;
switch (evt.keyCode) {
case 37: // Left
if (t.settings.parent) {
t.hideMenu();
t.settings.parent.focus();
Event.cancel(evt);
}
break;
case 39: // Right
if (t.mouseOverFunc)
t.mouseOverFunc(evt);
break;
}
},
_add : function(tb, o) {
var n, s = o.settings, a, ro, it, cp = this.classPrefix, ic;
if (s.separator) {
ro = DOM.add(tb, 'tr', {id : o.id, 'class' : cp +
'ItemSeparator'});
DOM.add(ro, 'td', {'class' : cp + 'ItemSeparator'});
if (n = ro.previousSibling)
DOM.addClass(n, 'mceLast');
return;
}
if (s.parent) {
DOM.setAttrib(a, 'aria-haspopup', 'true');
DOM.setAttrib(a, 'aria-owns', 'menu_' + o.id);
}
DOM.addClass(it, s['class']);
// n = DOM.add(n, 'span', {'class' : 'item'});
if (s.icon_src)
DOM.add(ic, 'img', {src : s.icon_src});
if (o.settings.style) {
if (typeof o.settings.style == "function")
o.settings.style = o.settings.style();
if (tb.childNodes.length == 1)
DOM.addClass(ro, 'mceFirst');
if (o.collapse)
DOM.addClass(ro, cp + 'ItemSub');
if (n = ro.previousSibling)
DOM.removeClass(n, 'mceLast');
DOM.addClass(ro, 'mceLast');
}
});
})(tinymce);
(function(tinymce) {
var DOM = tinymce.DOM;
tinymce.create('tinymce.ui.Button:tinymce.ui.Control', {
Button : function(id, s, ed) {
this.parent(id, s, ed);
this.classPrefix = 'mceButton';
},
renderHTML : function() {
var cp = this.classPrefix, s = this.settings, h, l;
l = DOM.encode(s.label || '');
h = '<a role="button" id="' + this.id + '" href="javascript:;"
class="' + cp + ' ' + cp + 'Enabled ' + s['class'] + (l ? ' ' + cp + 'Labeled' :
'') +'" onmousedown="return false;" onclick="return false;" aria-labelledby="' +
this.id + '_voice" title="' + DOM.encode(s.title) + '">';
if (s.image && !(this.editor
&&this.editor.forcedHighContrastMode) )
h += '<span class="mceIcon ' + s['class'] + '"><img
class="mceIcon" src="' + s.image + '" alt="' + DOM.encode(s.title) + '" /></span>'
+ (l ? '<span class="' + cp + 'Label">' + l + '</span>' : '');
else
h += '<span class="mceIcon ' + s['class'] + '"></span>' +
(l ? '<span class="' + cp + 'Label">' + l + '</span>' : '');
postRender : function() {
var t = this, s = t.settings, imgBookmark;
(function(tinymce) {
var DOM = tinymce.DOM, Event = tinymce.dom.Event, each = tinymce.each,
Dispatcher = tinymce.util.Dispatcher, undef;
tinymce.create('tinymce.ui.ListBox:tinymce.ui.Control', {
ListBox : function(id, s, ed) {
var t = this;
t.parent(id, s, ed);
t.items = [];
t.classPrefix = 'mceListBox';
t.marked = {};
},
select : function(va) {
var t = this, fv, f;
t.marked = {};
if (va == undef)
return t.selectByIndex(-1);
// Do we need to do something?
if (va != t.selectedValue) {
// Find item
each(t.items, function(o, i) {
if (f(o.value)) {
fv = 1;
t.selectByIndex(i);
return false;
}
});
if (!fv)
t.selectByIndex(-1);
}
},
selectByIndex : function(idx) {
var t = this, e, o, label;
t.marked = {};
if (idx != t.selectedIndex) {
e = DOM.get(t.id + '_text');
label = DOM.get(t.id + '_voiceDesc');
o = t.items[idx];
if (o) {
t.selectedValue = o.value;
t.selectedIndex = idx;
DOM.setHTML(e, DOM.encode(o.title));
DOM.setHTML(label, t.settings.title + " - " +
o.title);
DOM.removeClass(e, 'mceTitle');
DOM.setAttrib(t.id, 'aria-valuenow', o.title);
} else {
DOM.setHTML(e, DOM.encode(t.settings.title));
DOM.setHTML(label, DOM.encode(t.settings.title));
DOM.addClass(e, 'mceTitle');
t.selectedValue = t.selectedIndex = null;
DOM.setAttrib(t.id, 'aria-valuenow',
t.settings.title);
}
e = 0;
}
},
mark : function(value) {
this.marked[value] = true;
},
add : function(n, v, o) {
var t = this;
o = o || {};
o = tinymce.extend(o, {
title : n,
value : v
});
t.items.push(o);
t.onAdd.dispatch(t, o);
},
getLength : function() {
return this.items.length;
},
renderHTML : function() {
var h = '', t = this, s = t.settings, cp = t.classPrefix;
return h;
},
showMenu : function() {
var t = this, p2, e = DOM.get(this.id), m;
if (!t.isMenuRendered) {
t.renderMenu();
t.isMenuRendered = true;
}
p2 = DOM.getPos(e);
m = t.menu;
m.settings.offset_x = p2.x;
m.settings.offset_y = p2.y;
m.settings.keyboard_focus = !tinymce.isOpera; // Opera is buggy
when it comes to auto focus
// Select in menu
each(t.items, function(o) {
if (m.items[o.id]) {
m.items[o.id].setSelected(0);
}
});
each(t.items, function(o) {
if (m.items[o.id] && t.marked[o.value]) {
m.items[o.id].setSelected(1);
}
m.showMenu(0, e.clientHeight);
//DOM.get(t.id + '_text').focus();
},
hideMenu : function(e) {
var t = this;
renderMenu : function() {
var t = this, m;
m = t.settings.control_manager.createDropMenu(t.id + '_menu', {
menu_line : 1,
'class' : t.classPrefix + 'Menu mceNoIcons',
max_width : 250,
max_height : 150
});
m.onHideMenu.add(function() {
t.hideMenu();
t.focus();
});
m.add({
title : t.settings.title,
'class' : 'mceMenuItemTitle',
onclick : function() {
if (t.settings.onselect('') !== false)
t.select(''); // Must be runned after
}
});
each(t.items, function(o) {
// No value then treat it as a title
if (o.value === undef) {
m.add({
title : o.title,
role : "option",
'class' : 'mceMenuItemTitle',
onclick : function() {
if (t.settings.onselect('') !== false)
t.select(''); // Must be runned
after
}
});
} else {
o.id = DOM.uniqueId();
o.role= "option";
o.onclick = function() {
if (t.settings.onselect(o.value) !== false)
t.select(o.value); // Must be runned
after
};
m.add(o);
}
});
t.onRenderMenu.dispatch(t, m);
t.menu = m;
},
postRender : function() {
var t = this, cp = t.classPrefix;
t._focused = 1;
});
Event.add(t.id, 'blur', function() {
Event.remove(t.id, 'keydown', t.keyDownHandler);
Event.remove(t.id, 'keypress', t.keyPressHandler);
t._focused = 0;
});
t.onPostRender.dispatch(t, DOM.get(t.id));
},
destroy : function() {
this.parent();
Event.clear(this.id + '_text');
Event.clear(this.id + '_open');
}
});
})(tinymce);
(function(tinymce) {
var DOM = tinymce.DOM, Event = tinymce.dom.Event, each = tinymce.each,
Dispatcher = tinymce.util.Dispatcher, undef;
tinymce.create('tinymce.ui.NativeListBox:tinymce.ui.ListBox', {
NativeListBox : function(id, s) {
this.parent(id, s);
this.classPrefix = 'mceNativeListBox';
},
setDisabled : function(s) {
DOM.get(this.id).disabled = s;
this.setAriaProperty('disabled', s);
},
isDisabled : function() {
return DOM.get(this.id).disabled;
},
select : function(va) {
var t = this, fv, f;
if (va == undef)
return t.selectByIndex(-1);
// Do we need to do something?
if (va != t.selectedValue) {
// Find item
each(t.items, function(o, i) {
if (f(o.value)) {
fv = 1;
t.selectByIndex(i);
return false;
}
});
if (!fv)
t.selectByIndex(-1);
}
},
selectByIndex : function(idx) {
DOM.get(this.id).selectedIndex = idx + 1;
this.selectedValue = this.items[idx] ? this.items[idx].value :
null;
},
add : function(n, v, a) {
var o, t = this;
a = a || {};
a.value = v;
if (t.isRendered())
DOM.add(DOM.get(this.id), 'option', a, n);
o = {
title : n,
value : v,
attribs : a
};
t.items.push(o);
t.onAdd.dispatch(t, o);
},
getLength : function() {
return this.items.length;
},
renderHTML : function() {
var h, t = this;
each(t.items, function(it) {
h += DOM.createHTML('option', {value : it.value},
it.title);
});
postRender : function() {
var t = this, ch, changeListenerAdded = true;
t.rendered = true;
function onChange(e) {
var v = t.items[e.target.selectedIndex - 1];
if (v && (v = v.value)) {
t.onChange.dispatch(t, v);
if (t.settings.onselect)
t.settings.onselect(v);
}
};
// Accessibility keyhandler
Event.add(t.id, 'keydown', function(e) {
var bf;
t.onPostRender.dispatch(t, DOM.get(t.id));
}
});
})(tinymce);
(function(tinymce) {
var DOM = tinymce.DOM, Event = tinymce.dom.Event, each = tinymce.each;
tinymce.create('tinymce.ui.MenuButton:tinymce.ui.Button', {
MenuButton : function(id, s, ed) {
this.parent(id, s, ed);
showMenu : function() {
var t = this, p1, p2, e = DOM.get(t.id), m;
if (t.isDisabled())
return;
if (!t.isMenuRendered) {
t.renderMenu();
t.isMenuRendered = true;
}
if (t.isMenuVisible)
return t.hideMenu();
p1 = DOM.getPos(t.settings.menu_container);
p2 = DOM.getPos(e);
m = t.menu;
m.settings.offset_x = p2.x;
m.settings.offset_y = p2.y;
m.settings.vp_offset_x = p2.x;
m.settings.vp_offset_y = p2.y;
m.settings.keyboard_focus = t._focused;
m.showMenu(0, e.firstChild.clientHeight);
t.isMenuVisible = 1;
},
renderMenu : function() {
var t = this, m;
m = t.settings.control_manager.createDropMenu(t.id + '_menu', {
menu_line : 1,
'class' : this.classPrefix + 'Menu',
icons : t.settings.icons
});
m.onHideMenu.add(function() {
t.hideMenu();
t.focus();
});
t.onRenderMenu.dispatch(t, m);
t.menu = m;
},
hideMenu : function(e) {
var t = this;
t.isMenuVisible = 0;
},
postRender : function() {
var t = this, s = t.settings;
t.showMenu();
}
});
}
});
})(tinymce);
(function(tinymce) {
var DOM = tinymce.DOM, Event = tinymce.dom.Event, each = tinymce.each;
tinymce.create('tinymce.ui.SplitButton:tinymce.ui.MenuButton', {
SplitButton : function(id, s, ed) {
this.parent(id, s, ed);
this.classPrefix = 'mceSplitButton';
},
renderHTML : function() {
var h, t = this, s = t.settings, h1;
h = '<tbody><tr>';
if (s.image)
h1 = DOM.createHTML('img ', {src : s.image, role:
'presentation', 'class' : 'mceAction ' + s['class']});
else
h1 = DOM.createHTML('span', {'class' : 'mceAction ' +
s['class']}, '');
h += '</tr></tbody>';
h = DOM.createHTML('table', { role: 'presentation', 'class' :
'mceSplitButton mceSplitButtonEnabled ' + s['class'], cellpadding : '0',
cellspacing : '0', title : s.title}, h);
return DOM.createHTML('div', {id : t.id, role: 'button',
tabindex: '0', 'aria-labelledby': t.id + '_voice', 'aria-haspopup': 'true'}, h);
},
postRender : function() {
var t = this, s = t.settings, activate;
if (s.onclick) {
activate = function(evt) {
if (!t.isDisabled()) {
s.onclick(t.value);
Event.cancel(evt);
}
};
Event.add(t.id + '_action', 'click', activate);
Event.add(t.id, ['click', 'keydown'], function(evt) {
var DOM_VK_SPACE = 32, DOM_VK_ENTER = 14,
DOM_VK_RETURN = 13, DOM_VK_UP = 38, DOM_VK_DOWN = 40;
if ((evt.keyCode === 32 || evt.keyCode === 13 ||
evt.keyCode === 14) && !evt.altKey && !evt.ctrlKey && !evt.metaKey) {
activate();
Event.cancel(evt);
} else if (evt.type === 'click' || evt.keyCode ===
DOM_VK_DOWN) {
t.showMenu();
Event.cancel(evt);
}
});
}
destroy : function() {
this.parent();
Event.clear(this.id + '_action');
Event.clear(this.id + '_open');
Event.clear(this.id);
}
});
})(tinymce);
(function(tinymce) {
var DOM = tinymce.DOM, Event = tinymce.dom.Event, is = tinymce.is, each =
tinymce.each;
tinymce.create('tinymce.ui.ColorSplitButton:tinymce.ui.SplitButton', {
ColorSplitButton : function(id, s, ed) {
var t = this;
t.parent(id, s, ed);
t.settings = s = tinymce.extend({
colors :
'000000,993300,333300,003300,003366,000080,333399,333333,800000,FF6600,808000,00800
0,008080,0000FF,666699,808080,FF0000,FF9900,99CC00,339966,33CCCC,3366FF,800080,9999
99,FF00FF,FFCC00,FFFF00,00FF00,00FFFF,00CCFF,993366,C0C0C0,FF99CC,FFCC99,FFFF99,CCF
FCC,CCFFFF,99CCFF,CC99FF,FFFFFF',
grid_width : 8,
default_color : '#888888'
}, t.settings);
t.value = s.default_color;
},
showMenu : function() {
var t = this, r, p, e, p2;
if (t.isDisabled())
return;
if (!t.isMenuRendered) {
t.renderMenu();
t.isMenuRendered = true;
}
if (t.isMenuVisible)
return t.hideMenu();
e = DOM.get(t.id);
DOM.show(t.id + '_menu');
DOM.addClass(e, 'mceSplitButtonSelected');
p2 = DOM.getPos(e);
DOM.setStyles(t.id + '_menu', {
left : p2.x,
top : p2.y + e.firstChild.clientHeight,
zIndex : 200000
});
e = 0;
if (t._focused) {
t._keyHandler = Event.add(t.id + '_menu', 'keydown',
function(e) {
if (e.keyCode == 27)
t.hideMenu();
});
t.keyboardNav.focus();
t.isMenuVisible = 1;
},
hideMenu : function(e) {
var t = this;
if (t.isMenuVisible) {
// Prevent double toogles by canceling the mouse click
event to the button
if (e && e.type == "mousedown" && DOM.getParent(e.target,
function(e) {return e.id === t.id + '_open';}))
return;
if (!e || !DOM.getParent(e.target, '.mceSplitButtonMenu'))
{
DOM.removeClass(t.id, 'mceSplitButtonSelected');
Event.remove(DOM.doc, 'mousedown', t.hideMenu, t);
Event.remove(t.id + '_menu', 'keydown',
t._keyHandler);
DOM.hide(t.id + '_menu');
}
t.isMenuVisible = 0;
t.onHideMenu.dispatch();
t.keyboardNav.destroy();
}
},
renderMenu : function() {
var t = this, m, i = 0, s = t.settings, n, tb, tr, w, context;
if (!i--) {
tr = DOM.add(tb, 'tr');
i = s.grid_width - 1;
}
n = DOM.add(tr, 'td');
var settings = {
href : 'javascript:;',
style : {
backgroundColor : '#' + c
},
'title': t.editor.getLang('colors.' + c, c),
'data-mce-color' : '#' + c
};
if (t.editor.forcedHighContrastMode) {
n = DOM.add(n, 'canvas', { width: 16, height: 16,
'aria-hidden': 'true' });
if (n.getContext && (context = n.getContext("2d"))) {
context.fillStyle = '#' + c;
context.fillRect(0, 0, 16, 16);
} else {
// No point leaving a canvas element around if
it's not supported for drawing on anyway.
DOM.remove(n);
}
}
});
if (s.more_colors_func) {
n = DOM.add(tb, 'tr');
n = DOM.add(n, 'td', {colspan : s.grid_width, 'class' :
'mceMoreColors'});
n = DOM.add(n, 'a', {role: 'option', id : t.id + '_more',
href : 'javascript:;', onclick : 'return false;', 'class' : 'mceMoreColors'},
s.more_colors_title);
DOM.addClass(m, 'mceColorSplitMenu');
return w;
},
setColor : function(c) {
this.displayColor(c);
this.hideMenu();
this.settings.onselect(c);
},
displayColor : function(c) {
var t = this;
postRender : function() {
var t = this, id = t.id;
t.parent();
DOM.add(id + '_action', 'div', {id : id + '_preview', 'class' :
'mceColorPreview'});
DOM.setStyle(t.id + '_preview', 'backgroundColor', t.value);
},
destroy : function() {
var self = this;
self.parent();
Event.clear(self.id + '_menu');
Event.clear(self.id + '_more');
DOM.remove(self.id + '_menu');
if (self.keyboardNav) {
self.keyboardNav.destroy();
}
}
});
})(tinymce);
(function(tinymce) {
// Shorten class names
var dom = tinymce.DOM, each = tinymce.each, Event = tinymce.dom.Event;
tinymce.create('tinymce.ui.ToolbarGroup:tinymce.ui.Container', {
renderHTML : function() {
var t = this, h = [], controls = t.controls, each = tinymce.each,
settings = t.settings;
return h.join('');
},
focus : function() {
var t = this;
dom.get(t.id).focus();
},
postRender : function() {
var t = this, items = [];
each(t.controls, function(toolbar) {
each (toolbar.controls, function(control) {
if (control.id) {
items.push(control);
}
});
});
destroy : function() {
var self = this;
self.parent();
self.keyNav.destroy();
Event.clear(self.id);
}
});
})(tinymce);
(function(tinymce) {
// Shorten class names
var dom = tinymce.DOM, each = tinymce.each;
tinymce.create('tinymce.ui.Toolbar:tinymce.ui.Container', {
renderHTML : function() {
var t = this, h = '', c, co, s = t.settings, i, pr, nx, cl;
cl = t.controls;
for (i=0; i<cl.length; i++) {
// Get current control, prev control, next control and if the
control is a list box or not
co = cl[i];
pr = cl[i - 1];
nx = cl[i + 1];
if (co.Button)
c += ' mceToolbarStartButton';
else if (co.SplitButton)
c += ' mceToolbarStartSplitButton';
else if (co.ListBox)
c += ' mceToolbarStartListBox';
// Add toolbar end before list box and after the previous button
// This is to fix the o2k7 editor skins
if (pr && co.ListBox) {
if (pr.Button || pr.SplitButton)
h += dom.createHTML('td', {'class' :
'mceToolbarEnd'}, dom.createHTML('span', null, '<!-- IE -->'));
}
// Add toolbar start after list box and before the next button
// This is to fix the o2k7 editor skins
if (nx && co.ListBox) {
if (nx.Button || nx.SplitButton)
h += dom.createHTML('td', {'class' :
'mceToolbarStart'}, dom.createHTML('span', null, '<!-- IE -->'));
}
}
c = 'mceToolbarEnd';
if (co.Button)
c += ' mceToolbarEndButton';
else if (co.SplitButton)
c += ' mceToolbarEndSplitButton';
else if (co.ListBox)
c += ' mceToolbarEndListBox';
(function(tinymce) {
var Dispatcher = tinymce.util.Dispatcher, each = tinymce.each;
tinymce.create('tinymce.AddOnManager', {
AddOnManager : function() {
var self = this;
self.items = [];
self.urls = {};
self.lookup = {};
self.onAdd = new Dispatcher(self);
},
get : function(n) {
if (this.lookup[n]) {
return this.lookup[n].instance;
} else {
return undefined;
}
},
dependencies : function(n) {
var result;
if (this.lookup[n]) {
result = this.lookup[n].dependencies;
}
return result || [];
},
requireLangPack : function(n) {
var s = tinymce.settings;
return o;
},
createUrl: function(baseUrl, dep) {
if (typeof dep === "object") {
return dep
} else {
return {prefix: baseUrl.prefix, resource: dep, suffix:
baseUrl.suffix};
}
},
function loadDependencies() {
var dependencies = t.dependencies(n);
tinymce.each(dependencies, function(dep) {
var newUrl = t.createUrl(u, dep);
t.load(newUrl.resource, newUrl, undefined,
undefined);
});
if (cb) {
if (s) {
cb.call(s);
} else {
cb.call(tinymce.ScriptLoader);
}
}
}
if (t.urls[n])
return;
if (typeof u === "object")
url = u.prefix + u.resource + u.suffix;
if (t.lookup[n]) {
loadDependencies();
} else {
tinymce.ScriptLoader.add(url, loadDependencies, s);
}
}
});
(function(tinymce) {
// Shorten names
var each = tinymce.each, extend = tinymce.extend,
DOM = tinymce.DOM, Event = tinymce.dom.Event,
ThemeManager = tinymce.ThemeManager, PluginManager =
tinymce.PluginManager,
explode = tinymce.explode,
Dispatcher = tinymce.util.Dispatcher, undef, instanceCounter = 0;
// Setup some URLs where the editor API is located and where the document is
tinymce.documentBaseURL = window.location.href.replace(/[\?#].*$/,
'').replace(/[\/\\][^\/]+$/, '');
if (!/[\/\\]$/.test(tinymce.documentBaseURL))
tinymce.documentBaseURL += '/';
tinymce.baseURL = new
tinymce.util.URI(tinymce.documentBaseURL).toAbsolute(tinymce.baseURL);
tinymce.EditorManager = extend(tinymce, {
editors : [],
i18n : {},
activeEditor : null,
init : function(s) {
var t = this, pl, sl = tinymce.ScriptLoader, e, el = [], ed;
function createId(elm) {
var id = elm.id;
elm.setAttribute('id', id);
}
return id;
};
function execCallback(se, n, s) {
var f = se[n];
if (!f)
return;
if (tinymce.is(f, 'string')) {
s = f.replace(/\.\w+$/, '');
s = s ? tinymce.resolve(s) : 0;
f = tinymce.resolve(f);
}
function hasClass(n, c) {
return c.constructor === RegExp ? c.test(n.className) :
DOM.hasClass(n, c);
};
t.settings = s;
// Legacy call
Event.bind(window, 'ready', function() {
var l, co;
execCallback(s, 'onpageload');
switch (s.mode) {
case "exact":
l = s.elements || '';
if(l.length > 0) {
each(explode(l), function(v) {
if (DOM.get(v)) {
ed = new tinymce.Editor(v,
s);
el.push(ed);
ed.render(1);
} else {
each(document.forms,
function(f) {
each(f.elements,
function(e) {
if (e.name === v)
{
v =
'mce_editor_' + instanceCounter++;
ed = new
tinymce.Editor(v, s);
el.push(ed);
ed.render(1);
}
});
});
}
});
}
break;
case "textareas":
case "specific_textareas":
each(DOM.select('textarea'), function(elm) {
if (s.editor_deselector && hasClass(elm,
s.editor_deselector))
return;
if (!s.editor_selector || hasClass(elm,
s.editor_selector)) {
ed = new
tinymce.Editor(createId(elm), s);
el.push(ed);
ed.render(1);
}
});
break;
default:
if (s.types) {
// Process type specific selector
each(s.types, function(type) {
each(DOM.select(type.selector),
function(elm) {
var editor = new
tinymce.Editor(createId(elm), tinymce.extend({}, s, type));
el.push(editor);
editor.render(1);
});
});
} else if (s.selector) {
// Process global selector
each(DOM.select(s.selector),
function(elm) {
var editor = new
tinymce.Editor(createId(elm), s);
el.push(editor);
editor.render(1);
});
}
}
each(el, function(ed) {
co++;
if (!ed.initialized) {
// Wait for it
ed.onInit.add(function() {
l++;
// All done
if (l == co)
execCallback(s, 'oninit');
});
} else
l++;
// All done
if (l == co)
execCallback(s, 'oninit');
});
}
});
},
get : function(id) {
if (id === undef)
return this.editors;
if (!this.editors.hasOwnProperty(id))
return undef;
return this.editors[id];
},
getInstanceById : function(id) {
return this.get(id);
},
add : function(editor) {
var self = this, editors = self.editors;
self._setActive(editor);
self.onAddEditor.dispatch(self, editor);
return editor;
},
remove : function(editor) {
var t = this, i, editors = t.editors;
delete editors[editor.id];
editor.destroy();
t.onRemoveEditor.dispatch(t, editor);
return editor;
},
execCommand : function(c, u, v) {
var t = this, ed = t.get(v), w;
function clr() {
ed.destroy();
w.detachEvent('onunload', clr);
w = w.tinyMCE = w.tinymce = null; // IE leak
};
// Manager commands
switch (c) {
case "mceFocus":
ed.focus();
return true;
case "mceAddEditor":
case "mceAddControl":
if (!t.get(v))
new tinymce.Editor(v, t.settings).render();
return true;
case "mceAddFrameControl":
w = v.window;
tinymce.DOM.doc = w.document;
tinymce.DOM.win = w;
v.page_window = null;
return true;
case "mceRemoveEditor":
case "mceRemoveControl":
if (ed)
ed.remove();
return true;
case 'mceToggleEditor':
if (!ed) {
t.execCommand('mceAddControl', 0, v);
return true;
}
if (ed.isHidden())
ed.show();
else
ed.hide();
return true;
}
return false;
},
execInstanceCommand : function(id, c, u, v) {
var ed = this.get(id);
if (ed)
return ed.execCommand(c, u, v);
return false;
},
triggerSave : function() {
each(this.editors, function(e) {
e.save();
});
},
addI18n : function(p, o) {
var lo, i18n = this.i18n;
if (!tinymce.is(p, 'string')) {
each(p, function(o, lc) {
each(o, function(o, g) {
each(o, function(o, k) {
if (g === 'common')
i18n[lc + '.' + k] = o;
else
i18n[lc + '.' + g + '.' + k] = o;
});
});
});
} else {
each(o, function(o, k) {
i18n[p + '.' + k] = o;
});
}
},
// Private methods
_setActive : function(editor) {
this.selectedInstance = this.activeEditor = editor;
}
});
})(tinymce);
(function(tinymce) {
// Shorten these names
var DOM = tinymce.DOM, Event = tinymce.dom.Event, extend = tinymce.extend,
each = tinymce.each, isGecko = tinymce.isGecko,
isIE = tinymce.isIE, isWebKit = tinymce.isWebKit, is = tinymce.is,
ThemeManager = tinymce.ThemeManager, PluginManager =
tinymce.PluginManager,
explode = tinymce.explode;
tinymce.create('tinymce.Editor', {
Editor : function(id, settings) {
var self = this, TRUE = true;
self.isNotDirty = false;
self.plugins = {};
self.documentBaseURI = new
tinymce.util.URI(settings.document_base_url || tinymce.documentBaseURL, {
base_uri : tinyMCE.baseURI
});
self.baseURI = tinymce.baseURI;
self.contentCSS = [];
self.contentStyles = [];
// Call setup
self.execCallback('setup', self);
},
render : function(nst) {
var t = this, s = t.settings, id = t.id, sl =
tinymce.ScriptLoader;
tinyMCE.settings = s;
// Add hidden input for non input elements inside form elements
if (!/TEXTAREA|INPUT/i.test(t.getElement().nodeName) &&
s.hidden_input && DOM.getParent(id, 'form'))
DOM.insertAfter(DOM.create('input', {type : 'hidden',
name : id}), id);
if (tinymce.WindowManager)
t.windowManager = new tinymce.WindowManager(t);
if (s.encoding == 'xml') {
t.onGetContent.add(function(ed, o) {
if (o.save)
o.content = DOM.encode(o.content);
});
}
if (s.add_form_submit_trigger) {
t.onSubmit.addToTop(function() {
if (t.initialized) {
t.save();
t.isNotDirty = 1;
}
});
}
if (s.add_unload_trigger) {
t._beforeUnload = tinyMCE.onBeforeUnload.add(function() {
if (t.initialized && !t.destroyed && !t.isHidden())
t.save({format : 'raw', no_events : true});
});
}
tinymce.addUnload(t.destroy, t);
if (s.submit_patch) {
t.onBeforeRenderUI.add(function() {
var n = t.getElement().form;
if (!n)
return;
// Already patched
if (n._mceOldSubmit)
return;
n = null;
});
}
// Load scripts
function loadScripts() {
if (s.language && s.language_load !== false)
sl.add(tinymce.baseURL + '/langs/' + s.language +
'.js');
each(explode(s.plugins), function(p) {
if (p &&!PluginManager.urls[p]) {
if (p.charAt(0) == '-') {
p = p.substr(1, p.length);
var dependencies =
PluginManager.dependencies(p);
each(dependencies, function(dep) {
var defaultSettings =
{prefix:'plugins/', resource: dep, suffix:'/editor_plugin' + tinymce.suffix +
'.js'};
dep =
PluginManager.createUrl(defaultSettings, dep);
PluginManager.load(dep.resource,
dep);
});
} else {
// Skip safari plugin, since it is
removed as of 3.3b1
if (p == 'safari') {
return;
}
PluginManager.load(p, {prefix:'plugins/',
resource: p, suffix:'/editor_plugin' + tinymce.suffix + '.js'});
}
}
});
loadScripts();
},
init : function() {
var n, t = this, s = t.settings, w, h, mh, e = t.getElement(), o,
ti, u, bi, bc, re, i, initializedPlugins = [];
tinymce.add(t);
if (s.theme) {
if (typeof s.theme != "function") {
s.theme = s.theme.replace(/-/, '');
o = ThemeManager.get(s.theme);
t.theme = new o();
if (t.theme.init)
t.theme.init(t, ThemeManager.urls[s.theme] ||
tinymce.documentBaseURL.replace(/\/$/, ''));
} else {
t.theme = s.theme;
}
}
function initPlugin(p) {
var c = PluginManager.get(p), u = PluginManager.urls[p] ||
tinymce.documentBaseURL.replace(/\/$/, ''), po;
if (c && tinymce.inArray(initializedPlugins,p) === -1) {
each(PluginManager.dependencies(p), function(dep){
initPlugin(dep);
});
po = new c(t, u);
t.plugins[p] = po;
if (po.init) {
po.init(t, u);
initializedPlugins.push(p);
}
}
}
if (s.popup_css_add)
s.popup_css += ',' +
t.documentBaseURI.toAbsolute(s.popup_css_add);
// Measure box
if (s.render_ui && t.theme) {
t.orgDisplay = e.style.display;
if (re.test('' + w))
w = Math.max(parseInt(w, 10) + (o.deltaWidth ||
0), 100);
if (re.test('' + h))
h = Math.max(parseInt(h, 10) + (o.deltaHeight
|| 0), mh);
// Render UI
o = t.theme.renderUI({
targetNode : e,
width : w,
height : h,
deltaWidth : s.delta_width,
deltaHeight : s.delta_height
});
// Resize editor
DOM.setStyles(o.sizeContainer || o.editorContainer, {
width : w,
height : h
});
t.editorContainer = o.editorContainer;
}
// Load the CSS by injecting them into the HTML this will reduce
"flicker"
for (i = 0; i < t.contentCSS.length; i++) {
t.iframeHTML += '<link type="text/css" rel="stylesheet"
href="' + t.contentCSS[i] + '" />';
}
t.contentCSS = [];
bi = s.body_id || 'tinymce';
if (bi.indexOf('=') != -1) {
bi = t.getParam('body_id', '', 'hash');
bi = bi[t.id] || bi;
}
bc = s.body_class || '';
if (bc.indexOf('=') != -1) {
bc = t.getParam('body_class', '', 'hash');
bc = bc[t.id] || '';
}
// Create iframe
// TODO: ACC add the appropriate description on this.
n = DOM.add(o.iframeContainer, 'iframe', {
id : t.id + "_ifr",
src : u || 'javascript:""', // Workaround for HTTPS warning
in IE6/7
frameBorder : '0',
allowTransparency : "true",
title : s.aria_label,
style : {
width : '100%',
height : h,
display : 'block' // Important for Gecko to render
the iframe correctly
}
});
t.contentAreaContainer = o.iframeContainer;
if (o.editorContainer) {
DOM.get(o.editorContainer).style.display = t.orgDisplay;
}
DOM.get(t.id).style.display = 'none';
DOM.setAttrib(t.id, 'aria-hidden', true);
if (!tinymce.relaxedDomain || !u)
t.initContentBody();
e = n = o = null; // Cleanup
},
initContentBody : function() {
var self = this, settings = self.settings, targetElm =
DOM.get(self.id), doc = self.getDoc(), html, body, contentCssText;
if (tinymce.relaxedDomain)
doc.domain = tinymce.relaxedDomain;
}
if (settings.content_editable) {
DOM.addClass(targetElm, 'mceContentBody');
self.contentDocument = doc = settings.content_document ||
document;
self.contentWindow = settings.content_window || window;
self.bodyElement = targetElm;
// Prevent leak in IE
settings.content_document = settings.content_window = null;
}
if (!settings.readonly)
body.contentEditable =
self.getParam('content_editable_state', true);
body.disabled = false;
while (i--) {
node = nodes[i];
value = node.attr(name);
internalName = 'data-mce-' + name;
while (i--) {
node = nodes[i];
node.attr('type', 'mce-' + (node.attr('type') ||
'text/javascript'));
}
});
while (i--) {
node = nodes[i];
node.type = 8;
node.name = '#comment';
node.value = '[CDATA[' + node.value + ']]';
}
});
self.parser.addNodeFilter('p,h1,h2,h3,h4,h5,h6,div',
function(nodes, name) {
var i = nodes.length, node, nonEmptyElements =
self.schema.getNonEmptyElements();
while (i--) {
node = nodes[i];
if (node.isEmpty(nonEmptyElements))
node.empty().append(new tinymce.html.Node('br',
1)).shortEnded = true;
}
});
self.onExecCommand.add(function(editor, command) {
// Don't refresh the select lists until caret move
if (!/^(FontName|FontSize)$/.test(command))
self.nodeChanged();
});
// Pass through
self.serializer.onPreProcess.add(function(se, o) {
return self.onPreProcess.dispatch(self, o, se);
});
self.serializer.onPostProcess.add(function(se, o) {
return self.onPostProcess.dispatch(self, o, se);
});
self.onPreInit.dispatch(self);
if (!settings.readonly) {
self.bindNativeEvents();
}
self.controlManager.onPostRender.dispatch(self,
self.controlManager);
self.onPostRender.dispatch(self);
self.quirks = tinymce.util.Quirks(self);
if (settings.directionality)
body.dir = settings.directionality;
if (settings.nowrap)
body.style.whiteSpace = "nowrap";
if (settings.protect) {
self.onBeforeSetContent.add(function(ed, o) {
each(settings.protect, function(pattern) {
o.content = o.content.replace(pattern,
function(str) {
return '<!--mce:protected ' + escape(str)
+ '-->';
});
});
});
}
self.initialized = true;
self.onInit.dispatch(self);
self.execCallback('setupcontent_callback', self.id, body, doc);
self.execCallback('init_instance_callback', self);
self.focus(true);
self.nodeChanged({initial : true});
each(self.contentStyles, function(style) {
contentCssText += style + "\r\n";
});
self.dom.addStyle(contentCssText);
}
ed.selection.select(ed.getBody(), 1);
ed.selection.collapse(1);
ed.getBody().focus();
ed.getWin().focus();
}, 100);
}
focus : function(skip_focus) {
var oed, self = this, selection = self.selection, contentEditable
= self.settings.content_editable, ieRng, controlElm, doc = self.getDoc(), body;
if (!skip_focus) {
if (self.lastIERng) {
selection.setRng(self.lastIERng);
}
self._refreshContentEditable();
if (contentEditable) {
selection.normalize();
}
}
if (tinymce.activeEditor != self) {
if ((oed = tinymce.activeEditor) != null)
oed.onDeactivate.dispatch(oed, self);
self.onActivate.dispatch(self, oed);
}
tinymce._setActive(self);
},
execCallback : function(n) {
var t = this, f = t.settings[n], s;
if (!f)
return;
if (is(f, 'string')) {
s = f.replace(/\.\w+$/, '');
s = s ? tinymce.resolve(s) : 0;
f = tinymce.resolve(f);
t.callbackLookup = t.callbackLookup || {};
t.callbackLookup[n] = {func : f, scope : s};
}
translate : function(s) {
var c = this.settings.language || 'en', i18n = tinymce.i18n;
if (!s)
return '';
if (is(v, 'string')) {
each(v.indexOf('=') > 0 ? v.split(/[;,](?![^=;,]*(?:
[;,]|$))/) : v.split(','), function(v) {
v = v.split('=');
if (v.length > 1)
o[tr(v[0])] = tr(v[1]);
else
o[tr(v[0])] = tr(v);
});
} else
o = v;
return o;
}
return v;
},
nodeChanged : function(o) {
var self = this, selection = self.selection, node;
// Fix for bug #1896577 it seems that this can not be fired while
the editor is loading
if (self.initialized) {
o = o || {};
o.parents.push(node);
});
self.onNodeChange.dispatch(
self,
o ? o.controlManager || self.controlManager :
self.controlManager,
node,
selection.isCollapsed(),
o
);
}
},
addButton : function(name, settings) {
var self = this;
if (is(cmd_func, 'string')) {
c = cmd_func;
cmd_func = function() {
t.execCommand(c, false, null);
};
}
if (is(cmd_func, 'object')) {
c = cmd_func;
cmd_func = function() {
t.execCommand(c[0], c[1], c[2]);
};
}
each(explode(pa), function(pa) {
var o = {
func : cmd_func,
scope : sc || this,
desc : t.translate(desc),
alt : false,
ctrl : false,
shift : false
};
default:
o.charCode = v.charCodeAt(0);
o.keyCode =
v.toUpperCase().charCodeAt(0);
}
});
return true;
},
if (!/^(mceAddUndoLevel|mceEndUndoLevel|mceBeginUndoLevel|
mceRepaint|SelectAll)$/.test(cmd) && (!a || !a.skip_focus))
t.focus();
a = extend({}, a);
t.onBeforeExecCommand.dispatch(t, cmd, ui, val, a);
if (a.terminate)
return false;
// Command callback
if (t.execCallback('execcommand_callback', t.id,
t.selection.getNode(), cmd, ui, val)) {
t.onExecCommand.dispatch(t, cmd, ui, val, a);
return true;
}
// Registred commands
if (o = t.execCommands[cmd]) {
st = o.func.call(o.scope, ui, val);
// Plugin commands
each(t.plugins, function(p) {
if (p.execCommand && p.execCommand(cmd, ui, val)) {
t.onExecCommand.dispatch(t, cmd, ui, val, a);
s = 1;
return false;
}
});
if (s)
return true;
// Theme commands
if (t.theme && t.theme.execCommand && t.theme.execCommand(cmd,
ui, val)) {
t.onExecCommand.dispatch(t, cmd, ui, val, a);
return true;
}
// Editor commands
if (t.editorCommands.execCommand(cmd, ui, val)) {
t.onExecCommand.dispatch(t, cmd, ui, val, a);
return true;
}
// Browser commands
t.getDoc().execCommand(cmd, ui, val);
t.onExecCommand.dispatch(t, cmd, ui, val, a);
},
queryCommandState : function(cmd) {
var t = this, o, s;
// Registred commands
if (o = t.queryStateCommands[cmd]) {
s = o.func.call(o.scope);
// Registred commands
o = t.editorCommands.queryCommandState(cmd);
if (o !== -1)
return o;
// Browser commands
try {
return this.getDoc().queryCommandState(cmd);
} catch (ex) {
// Fails sometimes see bug: 1896577
}
},
queryCommandValue : function(c) {
var t = this, o, s;
// Registred commands
if (o = t.queryValueCommands[c]) {
s = o.func.call(o.scope);
// Fall though on true
if (s !== true)
return s;
}
// Registred commands
o = t.editorCommands.queryCommandValue(c);
if (is(o))
return o;
// Browser commands
try {
return this.getDoc().queryCommandValue(c);
} catch (ex) {
// Fails sometimes see bug: 1896577
}
},
show : function() {
var self = this;
DOM.show(self.getContainer());
DOM.hide(self.id);
self.load();
},
hide : function() {
var self = this, doc = self.getDoc();
// Fixed bug where IE has a blinking cursor left from the editor
if (isIE && doc)
doc.execCommand('SelectAll');
isHidden : function() {
return !DOM.isHidden(this.id);
},
return b;
},
load : function(o) {
var t = this, e = t.getElement(), h;
if (e) {
o = o || {};
o.load = true;
// Double encode existing entities in the value
h = t.setContent(is(e.value) ? e.value : e.innerHTML, o);
o.element = e;
if (!o.no_events)
t.onLoadContent.dispatch(t, o);
o.element = e = null;
return h;
}
},
save : function(o) {
var t = this, e = t.getElement(), h, f;
if (!e || !t.initialized)
return;
o = o || {};
o.save = true;
o.element = e;
h = o.content = t.getContent(o);
if (!o.no_events)
t.onSaveContent.dispatch(t, o);
h = o.content;
if (!/TEXTAREA|INPUT/i.test(e.nodeName)) {
e.innerHTML = h;
o.element = e = null;
return h;
},
content = args.content;
body.innerHTML = content;
self.selection.select(body, true);
self.selection.collapse(true);
return;
}
// Do post processing
if (!args.no_events)
self.onSetContent.dispatch(self, args);
return args.content;
},
getContent : function(args) {
var self = this, content, body = self.getBody();
// Do preprocessing
if (!args.no_events)
self.onBeforeGetContent.dispatch(self, args);
// Do post processing
if (!args.no_events)
self.onGetContent.dispatch(self, args);
return args.content;
},
isDirty : function() {
var self = this;
return tinymce.trim(self.startContent) !=
tinymce.trim(self.getContent({format : 'raw', no_events : 1})) && !self.isNotDirty;
},
getContainer : function() {
var self = this;
if (!self.container)
self.container = DOM.get(self.editorContainer || self.id +
'_parent');
return self.container;
},
getContentAreaContainer : function() {
return this.contentAreaContainer;
},
getElement : function() {
return DOM.get(this.settings.content_element || this.id);
},
getWin : function() {
var self = this, elm;
if (!self.contentWindow) {
elm = DOM.get(self.id + "_ifr");
if (elm)
self.contentWindow = elm.contentWindow;
}
return self.contentWindow;
},
getDoc : function() {
var self = this, win;
if (!self.contentDocument) {
win = self.getWin();
if (win)
self.contentDocument = win.document;
}
return self.contentDocument;
},
getBody : function() {
return this.bodyElement || this.getDoc().body;
},
// Don't convert link href since thats the CSS files that gets
loaded into the editor also skip local file URLs
if (!settings.convert_urls || (elm && elm.nodeName == 'LINK') ||
url.indexOf('file:') === 0)
return url;
// Convert to relative
if (settings.relative_urls)
return self.documentBaseURI.toRelative(url);
// Convert to absolute
url = self.documentBaseURI.toAbsolute(url,
settings.remove_script_host);
return url;
},
addVisual : function(elm) {
var self = this, settings = self.settings, dom = self.dom, cls;
if (!is(self.hasVisual))
self.hasVisual = settings.visual;
return;
case 'A':
if (!dom.getAttrib(elm, 'href', false)) {
value = dom.getAttrib(elm, 'name') ||
elm.id;
cls = 'mceItemAnchor';
if (value) {
if (self.hasVisual)
dom.addClass(elm, cls);
else
dom.removeClass(elm, cls);
}
}
return;
}
});
remove : function() {
var self = this, elm = self.getContainer(), doc = self.getDoc();
if (!self.removed) {
self.removed = 1; // Cancels post remove event execution
self.execCallback('remove_instance_callback', self);
self.onRemove.dispatch(self);
tinymce.remove(self);
DOM.remove(elm);
}
},
destroy : function(s) {
var t = this;
if (!s) {
tinymce.removeUnload(t.destroy);
tinyMCE.onBeforeUnload.remove(t._beforeUnload);
// Manual destroy
if (t.theme && t.theme.destroy)
t.theme.destroy();
if (t.formElement) {
t.formElement.submit = t.formElement._mceOldSubmit;
t.formElement._mceOldSubmit = null;
}
if (t.selection)
t.selection = t.selection.win = t.selection.dom =
t.selection.dom.doc = null;
t.destroyed = 1;
},
// Internal functions
_refreshContentEditable : function() {
var self = this, body, parent;
parent.removeChild(body);
parent.appendChild(body);
body.focus();
}
},
_isHidden : function() {
var s;
if (!isGecko)
return 0;
tinymce.Editor.prototype.setupEvents = function() {
var self = this, settings = self.settings;
'onBeforeRenderUI',
'onPostRender',
'onLoad',
'onInit',
'onRemove',
'onActivate',
'onDeactivate',
'onClick',
'onEvent',
'onMouseUp',
'onMouseDown',
'onDblClick',
'onKeyDown',
'onKeyUp',
'onKeyPress',
'onContextMenu',
'onSubmit',
'onReset',
'onPaste',
'onPreProcess',
'onPostProcess',
'onBeforeSetContent',
'onBeforeGetContent',
'onSetContent',
'onGetContent',
'onLoadContent',
'onSaveContent',
'onNodeChange',
'onChange',
'onBeforeExecCommand',
'onExecCommand',
'onUndo',
'onRedo',
'onVisualAid',
'onSetProgressState',
'onSetAttrib'
], function(name) {
self[name] = new tinymce.util.Dispatcher(self);
});
self.onPreProcess.add(function(ed, o) {
if (o.set)
ed.execCallback('cleanup_callback',
'insert_to_editor_dom', o.node, o);
if (o.get)
ed.execCallback('cleanup_callback',
'get_from_editor_dom', o.node, o);
});
self.onPostProcess.add(function(ed, o) {
if (o.set)
o.content = ed.execCallback('cleanup_callback',
'insert_to_editor', o.content, o);
if (o.get)
o.content = ed.execCallback('cleanup_callback',
'get_from_editor', o.content, o);
});
}
if (h)
o.content = h;
});
}
tinymce.Editor.prototype.bindNativeEvents = function() {
// 'focus', 'blur', 'dblclick', 'beforedeactivate', submit, reset
var self = this, i, settings = self.settings, dom = self.dom,
nativeToDispatcherMap;
nativeToDispatcherMap = {
mouseup : 'onMouseUp',
mousedown : 'onMouseDown',
click : 'onClick',
keyup : 'onKeyUp',
keydown : 'onKeyDown',
keypress : 'onKeyPress',
submit : 'onSubmit',
reset : 'onReset',
contextmenu : 'onContextMenu',
dblclick : 'onDblClick',
paste : 'onPaste' // Doesn't work in all browsers yet
};
function nodeChanged(ed, e) {
// Normalize selection for example <b>a</b><i>|a</i> becomes
<b>a|</b><i>a</i> except for Ctrl+A since it selects everything
if (e.keyCode != 65 || !tinymce.VK.metaKeyPressed(e)) {
self.selection.normalize();
}
self.nodeChanged();
}
switch (nativeName) {
case 'contextmenu':
dom.bind(root, nativeName, eventHandler);
break;
case 'paste':
dom.bind(self.getBody(), nativeName, eventHandler);
break;
case 'submit':
case 'reset':
dom.bind(self.getElement().form ||
tinymce.DOM.getParent(self.id, 'form'), nativeName, eventHandler);
break;
default:
dom.bind(root, nativeName, eventHandler);
}
});
self.onKeyUp.add(function(ed, e) {
var keyCode = e.keyCode;
if ((keyCode >= 33 && keyCode <= 36) || (keyCode >= 37 && keyCode
<= 40) || keyCode == 13 || keyCode == 45 || keyCode == 46 || keyCode == 8 ||
(tinymce.isMac && (keyCode == 91 || keyCode == 93)) || e.ctrlKey)
nodeChanged(ed, e);
});
// Add shortcuts
function handleShortcut(e, execute) {
if (e.altKey || e.ctrlKey || e.metaKey) {
each(self.shortcuts, function(shortcut) {
var ctrlState = tinymce.isMac ? e.metaKey :
e.ctrlKey;
if (execute) {
shortcut.func.call(shortcut.scope);
}
return true;
}
});
}
};
self.onKeyUp.add(function(ed, e) {
handleShortcut(e);
});
self.onKeyPress.add(function(ed, e) {
handleShortcut(e);
});
self.onKeyDown.add(function(ed, e) {
handleShortcut(e, true);
});
if (tinymce.isOpera) {
self.onClick.add(function(ed, e) {
e.preventDefault();
});
}
};
})(tinymce);
(function(tinymce) {
// Added for compression purposes
var each = tinymce.each, undef, TRUE = true, FALSE = false;
tinymce.EditorCommands = function(editor) {
var dom = editor.dom,
selection = editor.selection,
commands = {state: {}, exec : {}, value : {}},
settings = editor.settings,
formatter = editor.formatter,
bookmark;
command = command.toLowerCase();
if (func = commands.exec[command]) {
func(command, ui, value);
return TRUE;
}
return FALSE;
};
function queryCommandState(command) {
var func;
command = command.toLowerCase();
if (func = commands.state[command])
return func(command);
return -1;
};
function queryCommandValue(command) {
var func;
command = command.toLowerCase();
if (func = commands.value[command])
return func(command);
return FALSE;
};
// Private methods
function isFormatMatch(name) {
return formatter.match(name);
};
function storeSelection(type) {
bookmark = selection.getBookmark(type);
};
function restoreSelection() {
selection.moveToBookmark(bookmark);
};
'Cut,Copy,Paste' : function(command) {
var doc = editor.getDoc(), failed;
editor.windowManager.confirm(editor.getLang('clipboard_msg'), function(state)
{
if (state)
open('http://www.mozilla.org/editor/midasdemo/securityprefs.html', '_blank');
});
} else
editor.windowManager.alert(editor.getLang('clipboard_no_support'));
}
},
execNativeCommand(command);
selection.collapse(FALSE);
},
toggleFormat('align' + align);
execCommand('mceRepaint');
},
execNativeCommand(command);
if (fontClasses)
value = fontClasses[value - 1] || value;
else
value = fontSizes[value - 1] || value;
}
toggleFormat(command, value);
},
RemoveFormat : function(command) {
formatter.remove(command);
},
mceBlockQuote : function(command) {
toggleFormat('blockquote');
},
mceCleanup : function() {
var bookmark = selection.getBookmark();
editor.setContent(editor.getContent({cleanup : TRUE}),
{cleanup : TRUE});
selection.moveToBookmark(bookmark);
},
dom.getParent(selection.getNode(), function(node) {
if (node.nodeType == 1 && counter++ == value) {
selection.select(node);
return FALSE;
}
}, editor.getBody());
},
//selection.normalize();
// Insert node maker where we will insert the new HTML and
get it's parent
if (!selection.isCollapsed())
editor.getDoc().execCommand('Delete', false, null);
parentNode = selection.getNode();
marker = dom.get('mce_marker');
editor.setContent(editor.getContent().replace(/tiny_mce_marker/g, function()
{ return value }));
},
'Indent,Outdent' : function(command) {
var intentValue, indentUnit, value;
if (!queryCommandState('InsertUnorderedList') && !
queryCommandState('InsertOrderedList')) {
// If forced_root_blocks is set to false we don't
have a block to indent so lets create a div
if (!settings.forced_root_block && !
dom.getParent(selection.getNode(), dom.isBlock)) {
formatter.apply('div');
}
each(selection.getSelectedBlocks(), function(element)
{
if (command == 'outdent') {
value = Math.max(0,
parseInt(element.style.paddingLeft || 0) - intentValue);
dom.setStyle(element, 'paddingLeft',
value ? value + indentUnit : '');
} else
dom.setStyle(element, 'paddingLeft',
(parseInt(element.style.paddingLeft || 0) + intentValue) + indentUnit);
});
} else
execNativeCommand(command);
},
mceRepaint : function() {
var bookmark;
if (tinymce.isGecko) {
try {
storeSelection(TRUE);
if (selection.getSel())
selection.getSel().selectAllChildren(editor.getBody());
selection.collapse(TRUE);
restoreSelection();
} catch (ex) {
// Ignore
}
}
},
mceToggleVisualAid : function() {
editor.hasVisual = !editor.hasVisual;
editor.addVisual();
},
if (typeof(value) == 'string')
value = {href : value};
selectAll : function() {
var root = dom.getRoot(), rng = dom.createRng();
selection.setRng(rng);
} else {
execNativeCommand('SelectAll');
}
}
});
'Bold,Italic,Underline,Strikethrough,Superscript,Subscript' :
function(command) {
return isFormatMatch(command);
},
mceBlockQuote : function() {
return isFormatMatch('blockquote');
},
Outdent : function() {
var node;
if (settings.inline_styles) {
if ((node = dom.getParent(selection.getStart(),
dom.isBlock)) && parseInt(node.style.paddingLeft) > 0)
return TRUE;
if ((node = dom.getParent(selection.getEnd(),
dom.isBlock)) && parseInt(node.style.paddingLeft) > 0)
return TRUE;
}
return queryCommandState('InsertUnorderedList') ||
queryCommandState('InsertOrderedList') || (!settings.inline_styles && !!
dom.getParent(selection.getNode(), 'BLOCKQUOTE'));
},
'InsertUnorderedList,InsertOrderedList' : function(command) {
var list = dom.getParent(selection.getNode(), 'ul,ol');
return list &&
(command === 'insertunorderedlist' && list.tagName ===
'UL'
|| command === 'insertorderedlist' && list.tagName ===
'OL');
}
}, 'state');
Redo : function() {
editor.undoManager.redo();
}
});
};
})(tinymce);
(function(tinymce) {
var Dispatcher = tinymce.util.Dispatcher;
tinymce.UndoManager = function(editor) {
var self, index = 0, data = [], beforeBookmark, onAdd, onUndo, onRedo;
function getContent() {
// Remove whitespace before/after and remove pure bogus nodes
return tinymce.trim(editor.getContent({format : 'raw',
no_events : 1}).replace(/<span[^>]+data-mce-bogus[^>]+>[\u200B\uFEFF]+<\/span>/g,
''));
};
function addNonTypingUndoLevel() {
self.typing = false;
self.add();
};
editor.onKeyUp.add(function(editor, e) {
var keyCode = e.keyCode;
if ((keyCode >= 33 && keyCode <= 36) || (keyCode >= 37 && keyCode
<= 40) || keyCode == 45 || keyCode == 13 || e.ctrlKey) {
addNonTypingUndoLevel();
}
});
editor.onKeyDown.add(function(editor, e) {
var keyCode = e.keyCode;
return;
}
editor.onMouseDown.add(function(editor, e) {
if (self.typing) {
addNonTypingUndoLevel();
}
});
self = {
// Explose for debugging reasons
data : data,
typing : false,
onBeforeAdd: onBeforeAdd,
onAdd : onAdd,
onUndo : onUndo,
onRedo : onRedo,
beforeChange : function() {
beforeBookmark = editor.selection.getBookmark(2, true);
},
add : function(level) {
var i, settings = editor.settings, lastLevel;
self.onBeforeAdd.dispatch(self, level);
// Time to compress
if (settings.custom_undo_redo_levels) {
if (data.length > settings.custom_undo_redo_levels) {
for (i = 0; i < data.length - 1; i++)
data[i] = data[i + 1];
data.length--;
index = data.length;
}
}
data.push(level);
index = data.length - 1;
self.onAdd.dispatch(self, level);
editor.isNotDirty = 0;
return level;
},
undo : function() {
var level, i;
if (self.typing) {
self.add();
self.typing = false;
}
if (index > 0) {
level = data[--index];
editor.selection.moveToBookmark(level.beforeBookmark);
self.onUndo.dispatch(self, level);
}
return level;
},
redo : function() {
var level;
self.onRedo.dispatch(self, level);
}
return level;
},
clear : function() {
data = [];
index = 0;
self.typing = false;
},
hasUndo : function() {
return index > 0 || this.typing;
},
hasRedo : function() {
return index < data.length - 1 && !this.typing;
}
};
return self;
};
})(tinymce);
tinymce.ForceBlocks = function(editor) {
var settings = editor.settings, dom = editor.dom, selection =
editor.selection, blockElements = editor.schema.getBlockElements();
function addRootBlocks() {
var node = selection.getStart(), rootNode = editor.getBody(), rng,
startContainer, startOffset, endContainer, endOffset, rootBlockNode, tempNode,
offset = -0xFFFFFF, wrapped, isInEditorDocument;
node = node.parentNode;
}
if (!tmpRng.collapsed) {
tmpRng = rng.duplicate();
tmpRng.collapse(false);
endOffset = (tmpRng.move('character', offset) * -1) -
startOffset;
}
}
// Wrap non block elements and text nodes
node = rootNode.firstChild;
while (node) {
if (node.nodeType === 3 || (node.nodeType == 1 && !
blockElements[node.nodeName])) {
// Remove empty text nodes
if (node.nodeType === 3 && node.nodeValue.length == 0) {
tempNode = node;
node = node.nextSibling;
dom.remove(tempNode);
continue;
}
if (!rootBlockNode) {
rootBlockNode =
dom.create(settings.forced_root_block);
node.parentNode.insertBefore(rootBlockNode, node);
wrapped = true;
}
tempNode = node;
node = node.nextSibling;
rootBlockNode.appendChild(tempNode);
} else {
rootBlockNode = null;
node = node.nextSibling;
}
}
if (wrapped) {
if (rng.setStart) {
rng.setStart(startContainer, startOffset);
rng.setEnd(endContainer, endOffset);
selection.setRng(rng);
} else {
// Only select if the previous selection was inside the
document to prevent auto focus in quirks mode
if (isInEditorDocument) {
try {
rng = editor.getDoc().body.createTextRange();
rng.moveToElementText(rootNode);
rng.collapse(true);
rng.moveStart('character', startOffset);
if (endOffset > 0)
rng.moveEnd('character', endOffset);
rng.select();
} catch (ex) {
// Ignore
}
}
}
editor.nodeChanged();
}
};
// Force root blocks
if (settings.forced_root_block) {
editor.onKeyUp.add(addRootBlocks);
editor.onNodeChange.add(addRootBlocks);
}
};
(function(tinymce) {
// Shorten names
var DOM = tinymce.DOM, Event = tinymce.dom.Event, each = tinymce.each, extend
= tinymce.extend;
tinymce.create('tinymce.ControlManager', {
ControlManager : function(ed, s) {
var t = this, i;
s = s || {};
t.editor = ed;
t.controls = {};
t.onAdd = new tinymce.util.Dispatcher(t);
t.onPostRender = new tinymce.util.Dispatcher(t);
t.prefix = s.prefix || ed.id + '_';
t._cls = {};
t.onPostRender.add(function() {
each(t.controls, function(c) {
c.postRender();
});
});
},
get : function(id) {
return this.controls[this.prefix + id] || this.controls[id];
},
setActive : function(id, s) {
var c = null;
if (c = this.get(id))
c.setActive(s);
return c;
},
setDisabled : function(id, s) {
var c = null;
if (c = this.get(id))
c.setDisabled(s);
return c;
},
add : function(c) {
var t = this;
if (c) {
t.controls[c.id] = c;
t.onAdd.dispatch(c, t);
}
return c;
},
createControl : function(name) {
var ctrl, i, l, self = this, editor = self.editor, factories,
ctrlName;
if (ctrl) {
return self.add(ctrl);
}
}
// Create sepearator
if (name === "|" || name === "separator") {
return self.createSeparator();
}
return self.add(ctrl);
},
s = extend({
'class' : 'mceDropDown',
constrain : ed.settings.constrain_menus
}, s);
id = t.prefix + id;
cls = cc || t._cls.dropmenu || tinymce.ui.DropMenu;
c = t.controls[id] = new cls(id, s);
c.onAddItem.add(function(c, o) {
var s = o.settings;
if (!s.onclick) {
s.onclick = function(v) {
if (s.cmd)
ed.execCommand(s.cmd, s.ui || false,
s.value);
};
}
});
ed.onRemove.add(function() {
c.destroy();
});
bm = ed.selection.getBookmark(1);
});
c.onHideMenu.add(function() {
if (bm) {
ed.selection.moveToBookmark(bm);
bm = 0;
}
});
}
return t.add(c);
},
if (t.get(id))
return null;
s.title = ed.translate(s.title);
s.scope = s.scope || ed;
if (!s.onselect) {
s.onselect = function(v) {
ed.execCommand(s.cmd, s.ui || false, v || s.value);
};
}
s = extend({
title : s.title,
'class' : 'mce_' + id,
scope : s.scope,
control_manager : t
}, s);
id = t.prefix + id;
function useNativeListForAccessibility(ed) {
return ed.settings.use_accessible_selects && !
tinymce.isGecko
}
if (ed.settings.use_native_selects ||
useNativeListForAccessibility(ed))
c = new tinymce.ui.NativeListBox(id, s);
else {
cls = cc || t._cls.listbox || tinymce.ui.ListBox;
c = new cls(id, s, ed);
}
t.controls[id] = c;
if (c.hideMenu)
ed.onMouseDown.add(c.hideMenu, c);
return t.add(c);
},
if (t.get(id))
return null;
s.title = ed.translate(s.title);
s.label = ed.translate(s.label);
s.scope = s.scope || ed;
id = t.prefix + id;
if (s.menu_button) {
cls = cc || t._cls.menubutton || tinymce.ui.MenuButton;
c = new cls(id, s, ed);
ed.onMouseDown.add(c.hideMenu, c);
} else {
cls = t._cls.button || tinymce.ui.Button;
c = new cls(id, s, ed);
}
return t.add(c);
},
if (t.get(id))
return null;
s.title = ed.translate(s.title);
s.scope = s.scope || ed;
if (!s.onclick) {
s.onclick = function(v) {
ed.execCommand(s.cmd, s.ui || false, v || s.value);
};
}
if (!s.onselect) {
s.onselect = function(v) {
ed.execCommand(s.cmd, s.ui || false, v || s.value);
};
}
s = extend({
title : s.title,
'class' : 'mce_' + id,
scope : s.scope,
control_manager : t
}, s);
id = t.prefix + id;
cls = cc || t._cls.splitbutton || tinymce.ui.SplitButton;
c = t.add(new cls(id, s, ed));
ed.onMouseDown.add(c.hideMenu, c);
return c;
},
if (t.get(id))
return null;
s.title = ed.translate(s.title);
s.scope = s.scope || ed;
if (!s.onclick) {
s.onclick = function(v) {
if (tinymce.isIE)
bm = ed.selection.getBookmark(1);
if (!s.onselect) {
s.onselect = function(v) {
ed.execCommand(s.cmd, s.ui || false, v || s.value);
};
}
s = extend({
title : s.title,
'class' : 'mce_' + id,
'menu_class' : ed.getParam('skin') + 'Skin',
scope : s.scope,
more_colors_title : ed.getLang('more_colors')
}, s);
id = t.prefix + id;
cls = cc || t._cls.colorsplitbutton ||
tinymce.ui.ColorSplitButton;
c = new cls(id, s, ed);
ed.onMouseDown.add(c.hideMenu, c);
return t.add(c);
},
id = t.prefix + id;
cls = cc || t._cls.toolbar || tinymce.ui.Toolbar;
c = new cls(id, s, t.editor);
if (t.get(id))
return null;
return t.add(c);
},
if (t.get(id))
return null;
return t.add(c);
},
createSeparator : function(cc) {
var cls = cc || this._cls.separator || tinymce.ui.Separator;
setControlType : function(n, c) {
return this._cls[n.toLowerCase()] = c;
},
destroy : function() {
each(this.controls, function(c) {
c.destroy();
});
this.controls = null;
}
});
})(tinymce);
(function(tinymce) {
var Dispatcher = tinymce.util.Dispatcher, each = tinymce.each, isIE =
tinymce.isIE, isOpera = tinymce.isOpera;
tinymce.create('tinymce.WindowManager', {
WindowManager : function(ed) {
var t = this;
t.editor = ed;
t.onOpen = new Dispatcher(t);
t.onClose = new Dispatcher(t);
t.params = {};
t.features = {};
},
open : function(s, p) {
var t = this, f = '', x, y, mo = t.editor.settings.dialog_type ==
'modal', w, sw, sh, vp = tinymce.DOM.getViewPort(), u;
if (mo) {
if (isIE) {
s.center = true;
s.help = false;
s.dialogWidth = s.width + 'px';
s.dialogHeight = s.height + 'px';
s.scroll = s.scrollbars || false;
}
}
if (!/^(name|url)$/.test(k)) {
if (isIE && mo)
f += (f ? ';' : '') + k + ':' + v;
else
f += (f ? ',' : '') + k + '=' + v;
}
});
t.features = s;
t.params = p;
t.onOpen.dispatch(t, s, p);
u = s.url || s.file;
u = tinymce._addVer(u);
try {
if (isIE && mo) {
w = 1;
window.showModalDialog(u, window, f);
} else
w = window.open(u, s.name, f);
} catch (ex) {
// Ignore
}
if (!w)
alert(t.editor.getLang('popup_blocked'));
},
close : function(w) {
w.close();
this.onClose.dispatch(this);
},
createInstance : function(cl, a, b, c, d, e) {
var f = tinymce.resolve(cl);
w = w || window;
w.alert(t._decode(t.editor.getLang(tx, tx)));
if (cb)
cb.call(s || t);
},
// Internal functions
_decode : function(s) {
return tinymce.DOM.decode(s).replace(/\\n/g, '\n');
}
});
}(tinymce));
(function(tinymce) {
tinymce.Formatter = function(ed) {
var formats = {},
each = tinymce.each,
dom = ed.dom,
selection = ed.selection,
TreeWalker = tinymce.dom.TreeWalker,
rangeUtils = new tinymce.dom.RangeUtils(dom),
isValid = ed.schema.isValidChild,
isArray = tinymce.isArray,
isBlock = dom.isBlock,
forcedRootBlock = ed.settings.forced_root_block,
nodeIndex = dom.nodeIndex,
INVISIBLE_CHAR = '\uFEFF',
MCE_ATTR_RE = /^(src|href|style)$/,
FALSE = false,
TRUE = true,
formatChangeData,
undef,
getContentEditable = dom.getContentEditable;
function isTextBlock(name) {
return !!ed.schema.getTextBlocks()[name.toLowerCase()];
}
function isCaretNode(node) {
return node.nodeType === 1 && node.id === '_mce_caret';
};
function defaultFormats() {
register({
alignleft : [
{selector :
'figure,p,h1,h2,h3,h4,h5,h6,td,th,div,ul,ol,li', styles : {textAlign : 'left'},
defaultBlock: 'div'},
{selector : 'img,table', collapsed : false, styles :
{'float' : 'left'}}
],
aligncenter : [
{selector :
'figure,p,h1,h2,h3,h4,h5,h6,td,th,div,ul,ol,li', styles : {textAlign : 'center'},
defaultBlock: 'div'},
{selector : 'img', collapsed : false, styles :
{display : 'block', marginLeft : 'auto', marginRight : 'auto'}},
{selector : 'table', collapsed : false, styles :
{marginLeft : 'auto', marginRight : 'auto'}}
],
alignright : [
{selector :
'figure,p,h1,h2,h3,h4,h5,h6,td,th,div,ul,ol,li', styles : {textAlign : 'right'},
defaultBlock: 'div'},
{selector : 'img,table', collapsed : false, styles :
{'float' : 'right'}}
],
alignfull : [
{selector :
'figure,p,h1,h2,h3,h4,h5,h6,td,th,div,ul,ol,li', styles : {textAlign : 'justify'},
defaultBlock: 'div'}
],
bold : [
{inline : 'strong', remove : 'all'},
{inline : 'span', styles : {fontWeight : 'bold'}},
{inline : 'b', remove : 'all'}
],
italic : [
{inline : 'em', remove : 'all'},
{inline : 'span', styles : {fontStyle : 'italic'}},
{inline : 'i', remove : 'all'}
],
underline : [
{inline : 'span', styles : {textDecoration :
'underline'}, exact : true},
{inline : 'u', remove : 'all'}
],
strikethrough : [
{inline : 'span', styles : {textDecoration : 'line-
through'}, exact : true},
{inline : 'strike', remove : 'all'}
],
removeformat : [
{selector : 'b,strong,em,i,font,u,strike', remove :
'all', split : true, expand : false, block_expand : true, deep : true},
{selector : 'span', attributes : ['style', 'class'],
remove : 'empty', split : true, expand : false, deep : true},
{selector : '*', attributes : ['style', 'class'],
split : false, expand : false, deep : true}
]
});
function addKeyboardShortcuts() {
// Add some inline shortcuts
ed.addShortcut('ctrl+b', 'bold_desc', 'Bold');
ed.addShortcut('ctrl+i', 'italic_desc', 'Italic');
ed.addShortcut('ctrl+u', 'underline_desc', 'Underline');
// Public functions
function get(name) {
return name ? formats[name] : formats;
};
each(format, function(format) {
// Set deep to false by default on selector
formats this to avoid removing
// alignment on images inside paragraphs when
alignment is changed on paragraphs
if (format.deep === undef)
format.deep = !format.selector;
// Default to true
if (format.split === undef)
format.split = !format.selector ||
format.inline;
// Default to true
if (format.remove === undef && format.selector
&& !format.inline)
format.remove = 'none';
formats[name] = format;
}
}
};
ed.dom.getParent(node, function(n) {
decoration = ed.dom.getStyle(n, 'text-decoration');
return decoration && decoration !== 'none';
});
return decoration;
};
if (elm) {
if (fmt.onformat) {
fmt.onformat(elm, fmt, vars, node);
}
each(fmt.classes, function(value) {
value = replaceVars(value, vars);
if (!dom.hasClass(elm, value))
dom.addClass(elm, value);
});
}
};
function adjustSelectionToVisibleSelection() {
function findSelectionEnd(start, end) {
var walker = new TreeWalker(end);
for (node = walker.current(); node; node =
walker.prev()) {
if (node.childNodes.length > 1 || node == start
|| node.tagName == 'BR') {
return node;
}
}
};
rng.setEnd(newEnd, endOffset);
}
return rng;
}
each(nodes, function(node) {
currentWrapElm.appendChild(node);
});
return currentWrapElm;
}
};
rangeUtils.walk(rng, function(nodes) {
var currentWrapElm;
function process(node) {
var nodeName, parentName, found,
hasContentEditableState, lastContentEditable;
lastContentEditable = contentEditable;
nodeName = node.nodeName.toLowerCase();
parentName =
node.parentNode.nodeName.toLowerCase();
return;
}
if (dom.is(node, format.selector)
&& !isCaretNode(node)) {
setElementFormat(node,
format);
found = true;
}
});
node.parentNode.insertBefore(currentWrapElm, node);
newWrappers.push(currentWrapElm);
}
currentWrapElm.appendChild(node);
} else if (nodeName == 'li' && bookmark) {
// Start wrapping - if we are in a list
node and have a bookmark, then we will always begin by wrapping in a new element.
currentWrapElm = applyStyleToList(node,
bookmark, wrapElm, newWrappers, process);
} else {
// Start a new wrapper for possible
children
currentWrapElm = 0;
each(tinymce.grep(node.childNodes),
process);
if (hasContentEditableState) {
contentEditable =
lastContentEditable; // Restore last contentEditable state from stack
}
children =
tinymce.grep(node.childNodes);
for (i = 0; i < children.length; i+
+)
currentWrapElm.appendChild(children[i]);
node.appendChild(currentWrapElm);
}
each(tinymce.grep(node.childNodes),
process);
};
process(node);
});
}
// Cleanup
each(newWrappers, function(node) {
var childCount;
function getChildCount(node) {
var count = 0;
each(node.childNodes, function(node) {
if (!isWhiteSpaceNode(node) && !
isBookmarkNode(node))
count++;
});
return count;
};
function mergeStyles(node) {
var child, clone;
each(node.childNodes, function(node) {
if (node.nodeType == 1 && !
isBookmarkNode(node) && !isCaretNode(node)) {
child = node;
return FALSE; // break loop
}
});
childCount = getChildCount(node);
if (format.inline || format.wrapper) {
// Merges the current node with it's children
of similar type to reduce the number of elements
if (!format.exact && childCount === 1)
node = mergeStyles(node);
// Remove/merge children
each(formatList, function(format) {
// Merge all children of similar type
will move styles from child to parent
// this: <span style="color:red"><b><span
style="color:red; font-size:10px">text</span></b></span>
// will become: <span
style="color:red"><b><span style="font-size:10px">text</span></b></span>
each(dom.select(format.inline, node),
function(child) {
var parent;
// When wrap_links is set to false
we don't want
// to remove the format on children
within links
if (format.wrap_links === false) {
parent = child.parentNode;
do {
if (parent.nodeName ===
'A')
return;
} while (parent =
parent.parentNode);
}
if (format) {
if (node) {
if (node.nodeType) {
rng = dom.createRng();
rng.setStartBefore(node);
rng.setEndAfter(node);
applyRngStyle(expandRng(rng, formatList), null,
true);
} else {
applyRngStyle(node, null, true);
}
} else {
if (!isCollapsed || !format.inline ||
dom.select('td.mceSelected,th.mceSelected').length) {
// Obtain selection node before selection is
unselected by applyRngStyle()
var curSelNode = ed.selection.getNode();
ed.selection.setRng(adjustSelectionToVisibleSelection());
bookmark = selection.getBookmark();
applyRngStyle(expandRng(selection.getRng(TRUE),
formatList), bookmark);
selection.moveToBookmark(bookmark);
moveStart(selection.getRng(TRUE));
ed.nodeChanged();
} else
performCaretAction('apply', name, vars);
}
}
};
if (hasContentEditableState) {
contentEditable = lastContentEditable; //
Restore last contentEditable state from stack
}
}
}
};
function findFormatRoot(container) {
var formatRoot;
return formatRoot;
};
if (!firstClone)
firstClone = clone;
lastClone = clone;
}
}
return container;
};
function splitToFormatRoot(container) {
return wrapAndSplit(findFormatRoot(container), container,
container, true);
};
function unwrap(start) {
var node = dom.get(start ? '_start' : '_end'),
out = node[start ? 'firstChild' : 'lastChild'];
dom.remove(node, true);
return out;
};
function removeRngStyle(rng) {
var startContainer, endContainer, node;
if (format.split) {
startContainer = getContainer(rng, TRUE);
endContainer = getContainer(rng);
if (startContainer != endContainer) {
// WebKit will render the table incorrectly if
we wrap a TD in a SPAN so lets see if the can use the first child instead
// This will happen if you tripple click a
table cell and use remove formatting
if (/^(TR|TD)$/.test(startContainer.nodeName)
&& startContainer.firstChild) {
startContainer = (startContainer.nodeName
== "TD" ? startContainer.firstChild : startContainer.firstChild.firstChild) ||
startContainer;
}
// Split start/end
splitToFormatRoot(startContainer);
splitToFormatRoot(endContainer);
// Handle node
if (node) {
if (node.nodeType) {
rng = dom.createRng();
rng.setStartBefore(node);
rng.setEndAfter(node);
removeRngStyle(rng);
} else {
removeRngStyle(node);
}
return;
}
if (!selection.isCollapsed() || !format.inline ||
dom.select('td.mceSelected,th.mceSelected').length) {
bookmark = selection.getBookmark();
removeRngStyle(selection.getRng(TRUE));
selection.moveToBookmark(bookmark);
ed.nodeChanged();
} else
performCaretAction('remove', name, vars);
};
// Custom match
if (format.onmatch) {
return format.onmatch(node, format, item_name);
}
return format;
};
return format;
}
}
}
};
function matchParents(node) {
// Find first node with similar format settings
node = dom.getParent(node, function(node) {
return !!matchNode(node, name, vars, true);
});
return FALSE;
};
return matchedFormatNames;
};
function canApply(name) {
var formatList = get(name), startNode, parents, i, x, selector;
if (formatList) {
startNode = selection.getStart();
parents = getParents(startNode);
return FALSE;
};
matchedFormats[format] = callbacks;
return false;
}
});
});
each(callbacks, function(callback) {
callback(false, {node: node,
format: format, parents: parents});
});
}
});
});
}
formatChangeData[format].push(callback);
});
return this;
};
// Expose to public
tinymce.extend(this, {
get : get,
register : register,
apply : apply,
remove : remove,
toggle : toggle,
match : match,
matchAll : matchAll,
matchNode : matchNode,
canApply : canApply,
formatChanged: formatChanged
});
// Initialize
defaultFormats();
addKeyboardShortcuts();
// Private functions
return value;
};
function isWhiteSpaceNode(node) {
return node && node.nodeType === 3 && /^([\t \r\n]+|)
$/.test(node.nodeValue);
};
node.parentNode.insertBefore(wrapper, node);
wrapper.appendChild(node);
return wrapper;
};
function isBogusBr(node) {
return node.nodeName == "BR" &&
node.getAttribute('data-mce-bogus') && !node.nextSibling;
};
for (;;) {
// Stop expanding on block elements
if (!format[0].block_expand && isBlock(parent))
return parent;
// Walk left/right
for (sibling = parent[siblingName]; sibling; sibling
= sibling[siblingName]) {
if (!isBookmarkNode(sibling) && !
isWhiteSpaceNode(sibling) && !isBogusBr(sibling)) {
return parent;
}
}
parent = parent.parentNode;
}
return container;
};
// This function walks down the tree to find the leaf at the
selection.
// The offset is also returned as if node initially a leaf, the
offset may be in the middle of the text node.
function findLeaf(node, offset) {
if (offset === undef)
offset = node.nodeType === 3 ? node.length :
node.childNodes.length;
while (node && node.hasChildNodes()) {
node = node.childNodes[offset];
if (node)
offset = node.nodeType === 3 ? node.length :
node.childNodes.length;
}
return { node: node, offset: offset };
}
if (startContainer.nodeType == 3)
startOffset = 0;
}
if (endContainer.nodeType == 3)
endOffset = endContainer.nodeValue.length;
}
while (parent) {
if (parent.nodeType === 1 &&
getContentEditable(parent)) {
return getContentEditable(parent) === "false" ?
parent : node;
}
parent = parent.parentNode;
}
return node;
};
if (typeof(offset) == "undefined") {
offset = start ? str.length : 0;
}
if (start) {
pos = str.lastIndexOf(' ', offset);
pos2 = str.lastIndexOf('\u00a0', offset);
pos = pos > pos2 ? pos : pos2;
return pos;
};
if (container.nodeType === 3) {
pos = findSpace(container, offset);
lastTextNode = container;
}
if (lastTextNode) {
if (start) {
offset = 0;
} else {
offset = lastTextNode.length;
}
parents = getParents(container);
for (i = 0; i < parents.length; i++) {
for (y = 0; y < format.length; y++) {
curFormat = format[y];
if (dom.is(parents[i], curFormat.selector))
return parents[i];
}
}
return container;
};
if (startContainer.nodeType == 3)
startOffset = 0;
}
if (isBookmarkNode(endContainer.parentNode) ||
isBookmarkNode(endContainer)) {
endContainer = isBookmarkNode(endContainer) ?
endContainer : endContainer.parentNode;
endContainer = endContainer.previousSibling ||
endContainer;
if (endContainer.nodeType == 3)
endOffset = endContainer.length;
}
if (format[0].inline) {
if (rng.collapsed) {
// Expand left to closest word boundery
endPoint = findWordEndPoint(startContainer,
startOffset, true);
if (endPoint) {
startContainer = endPoint.container;
startOffset = endPoint.offset;
}
if (leaf.offset > 1) {
endContainer = leaf.node;
endContainer.splitText(leaf.offset - 1);
}
}
}
}
// Move start/end point up the tree if the leaves are sharp and
if we are in different containers
// Example * becomes !: !<p><b><i>*text</i><i>text*</i></b></p>!
// This will reduce the number of wrapper elements that needs to
be created
// Move start point up the tree
if (format[0].inline || format[0].block_expand) {
if (!format[0].inline || (startContainer.nodeType != 3 ||
startOffset === 0)) {
startContainer = findParentContainer(true);
}
if (!format[0].inline || (endContainer.nodeType != 3 ||
endOffset === endContainer.nodeValue.length)) {
endContainer = findParentContainer();
}
}
if (!isBlock(endContainer))
endContainer = findParentContainer();
}
}
// Indexed array
if (typeof(name) === 'number') {
name = value;
compare_node = 0;
}
if (!compare_node || isEq(getStyle(compare_node,
name), value))
dom.setStyle(node, name, '');
stylesModified = 1;
});
// Remove attributes
each(format.attributes, function(value, name) {
var valueOut;
// Indexed array
if (typeof(name) === 'number') {
name = value;
compare_node = 0;
}
if (!compare_node || isEq(dom.getAttrib(compare_node,
name), value)) {
// Keep internal classes
if (name == 'class') {
value = dom.getAttrib(node, name);
if (value) {
// Build new class value where
everything is removed except the internal prefixed classes
valueOut = '';
each(value.split(/\s+/),
function(cls) {
if (/mce\w+/.test(cls))
valueOut += (valueOut ?
' ' : '') + cls;
});
node.removeAttribute(name);
}
});
// Remove classes
each(format.classes, function(value) {
value = replaceVars(value, vars);
if (!compare_node || dom.hasClass(compare_node,
value))
dom.removeClass(node, value);
});
if (format.block) {
if (!forcedRootBlock) {
// Append BR elements if needed before we remove the
block
if (isBlock(node) && !isBlock(parentNode)) {
if (!find(node, FALSE) && !
find(node.firstChild, TRUE, 1))
node.insertBefore(dom.create('br'),
node.firstChild);
dom.remove(node, 1);
};
function isBookmarkNode(node) {
return node && node.nodeType == 1 && node.getAttribute('data-mce-
type') == 'bookmark';
};
function getAttribs(node) {
var attribs = {};
each(dom.getAttribs(node), function(attr) {
var name = attr.nodeName.toLowerCase();
return attribs;
};
function compareObjects(obj1, obj2) {
var value, name;
return TRUE;
};
return TRUE;
};
if (sibling.nodeType == 1 && !
isBookmarkNode(sibling))
return sibling;
}
return node;
};
return prev;
}
}
return next;
};
function isTextBlock(name) {
return /^(h[1-6]|p|div|pre|address|dl|dt|dd)$/.test(name);
};
if (container.nodeType == 1) {
lastIdx = container.childNodes.length - 1;
return container;
};
if (fill) {
caretContainer.appendChild(ed.getDoc().createTextNode(INVISIBLE_CHAR));
}
return caretContainer;
};
// Collect nodes
if (nodes && node.nodeType === 1) {
nodes.push(node);
}
node = node.firstChild;
}
return true;
};
node = node.parentNode;
}
};
if (node) {
walker = new TreeWalker(node, node);
for (node = walker.current(); node; node =
walker.next()) {
if (node.nodeType === 3) {
return node;
}
}
}
};
if (!node) {
node = getParentCaretContainer(selection.getStart());
if (!node) {
while (node = dom.get(caretContainerId)) {
removeCaretContainer(node, false);
}
}
} else {
rng = selection.getRng(true);
if (isCaretContainerEmpty(node)) {
if (move_caret !== false) {
rng.setStartBefore(node);
rng.setEndBefore(node);
}
dom.remove(node);
} else {
child = findFirstTextNode(node);
if (child.nodeValue.charAt(0) ===
INVISIBLE_CHAR) {
child = child.deleteData(0, 1);
}
dom.remove(node, 1);
}
selection.setRng(rng);
}
};
rng = selection.getRng(true);
offset = rng.startOffset;
container = rng.startContainer;
text = container.nodeValue;
caretContainer =
getParentCaretContainer(selection.getStart());
if (caretContainer) {
textNode = findFirstTextNode(caretContainer);
}
rng.insertNode(caretContainer);
offset = 1;
function removeCaretFormat() {
var rng = selection.getRng(true), container, offset,
bookmark,
hasContentAfter, node, formatNode, parents = [], i,
caretContainer;
container = rng.startContainer;
offset = rng.startOffset;
node = container;
if (container.nodeType == 3) {
if (offset != container.nodeValue.length ||
container.nodeValue === INVISIBLE_CHAR) {
hasContentAfter = true;
}
node = node.parentNode;
}
while (node) {
if (matchNode(node, name, vars)) {
formatNode = node;
break;
}
if (node.nextSibling) {
hasContentAfter = true;
}
parents.push(node);
node = node.parentNode;
}
node = caretContainer;
for (i = parents.length - 1; i >= 0; i--) {
node.appendChild(dom.clone(parents[i], false));
node = node.firstChild;
}
node.appendChild(dom.doc.createTextNode(INVISIBLE_CHAR));
node = node.firstChild;
caretContainer =
getParentCaretContainer(selection.getStart());
if (caretContainer && !dom.isEmpty(caretContainer)) {
tinymce.walk(caretContainer, function(node) {
if (node.nodeType == 1 && node.id !==
caretContainerId && !dom.isEmpty(node)) {
dom.setAttrib(node, 'data-mce-bogus',
null);
}
}, 'childNodes');
}
};
if
(isCaretContainerEmpty(getParentCaretContainer(selection.getStart()), nodes)) {
// Mark children
i = nodes.length;
while (i--) {
dom.setAttrib(nodes[i], 'data-mce-bogus',
'1');
}
}
});
unmarkBogusCaretParents();
});
self._hasCaretEvents = true;
}
function moveStart(rng) {
var container = rng.startContainer,
offset = rng.startOffset, isAtEndOfText,
walker, node, nodes, tmpNode;
return;
}
}
}
};
};
})(tinymce);
tinymce.onAddEditor.add(function(tinymce, ed) {
var filters, fontSizes, dom, settings = ed.settings;
dom.rename(node, 'span');
};
if (settings.convert_fonts_to_spans) {
tinymce.each(dom.select('font,u,strike', params.node),
function(node) {
filters[node.nodeName.toLowerCase()](ed.dom, node);
});
}
};
if (settings.inline_styles) {
fontSizes = tinymce.explode(settings.font_size_legacy_values);
filters = {
font : function(dom, node) {
replaceWithSpan(node, {
backgroundColor : node.style.backgroundColor,
color : node.color,
fontFamily : node.face,
fontSize : fontSizes[parseInt(node.size, 10) - 1]
});
},
u : function(dom, node) {
replaceWithSpan(node, {
textDecoration : 'underline'
});
},
ed.onInit.add(function() {
ed.selection.onSetContent.add(convert);
});
}
});
(function(tinymce) {
var TreeWalker = tinymce.dom.TreeWalker;
tinymce.EnterKey = function(editor) {
var dom = editor.dom, selection = editor.selection, settings =
editor.settings, undoManager = editor.undoManager, nonEmptyElementsMap =
editor.schema.getNonEmptyElements();
function handleEnterKey(evt) {
var rng = selection.getRng(true), tmpRng, editableRoot,
container, offset, parentBlock, documentMode, shiftKey,
newBlock, fragment, containerBlock, parentBlockName,
containerBlockName, newBlockName, isAfterLastNodeInContainer;
// Returns true if the block can be split into two blocks or not
function canSplitBlock(node) {
return node &&
dom.isBlock(node) &&
!/^(TD|TH|CAPTION|FORM)$/.test(node.nodeName) &&
!/^(fixed|absolute)/i.test(node.style.position) &&
dom.getContentEditable(node) !== "true";
};
if (node.nodeType == 1 && !
nonEmptyElementsMap[node.nodeName.toLowerCase()]) {
firstChilds.push(node);
}
}
i = firstChilds.length;
while (i--) {
node = firstChilds[i];
if (!node.hasChildNodes() || (node.firstChild ==
node.lastChild && node.firstChild.nodeValue === '')) {
dom.remove(node);
} else {
// Remove <a> </a> see #5381
if (node.nodeName == "A" && (node.innerText ||
node.textContent) === ' ') {
dom.remove(node);
}
}
}
};
rng = dom.createRng();
if (root.hasChildNodes()) {
walker = new TreeWalker(root, root);
if
(nonEmptyElementsMap[node.nodeName.toLowerCase()]) {
rng.setStartBefore(node);
rng.setEndBefore(node);
break;
}
lastNode = node;
node = walker.next();
}
if (!node) {
rng.setStart(lastNode, 0);
rng.setEnd(lastNode, 0);
}
} else {
if (root.nodeName == 'BR') {
if (root.nextSibling &&
dom.isBlock(root.nextSibling)) {
// Trick on older IE versions to render
the caret before the BR between two lists
if (!documentMode || documentMode < 9) {
tempElm = dom.create('br');
root.parentNode.insertBefore(tempElm, root);
}
rng.setStartBefore(root);
rng.setEndBefore(root);
} else {
rng.setStartAfter(root);
rng.setEndAfter(root);
}
} else {
rng.setStart(root, 0);
rng.setEnd(root, 0);
}
}
selection.setRng(rng);
viewPort = dom.getViewPort(editor.getWin());
clonedNode = node.cloneNode(false);
dom.setAttrib(clonedNode, 'id', ''); //
Remove ID since it needs to be document unique
if (block.hasChildNodes()) {
clonedNode.appendChild(block.firstChild);
block.appendChild(clonedNode);
} else {
caretNode = clonedNode;
block.appendChild(clonedNode);
}
}
} while (node = node.parentNode);
}
return block;
};
// Walk the DOM and look for text nodes or non empty
elements
walker = new TreeWalker(container, parentBlock);
if (start) {
walker.prev();
} else {
walker.next();
}
}
return true;
};
if (!parentBlock.hasChildNodes()) {
newBlock = dom.create(blockName);
parentBlock.appendChild(newBlock);
rng.setStart(newBlock, 0);
rng.setEnd(newBlock, 0);
return newBlock;
}
if (startNode) {
newBlock = dom.create(blockName);
startNode.parentNode.insertBefore(newBlock,
startNode);
return container;
};
dom.remove(parentBlock);
moveToCaretPosition(newBlock);
undoManager.add();
};
// Walks the parent block to the right and look for BR elements
function hasRightSideBr() {
var walker = new TreeWalker(container, parentBlock), node;
node = walker.next();
}
}
brElm = dom.create('br');
rng.insertNode(brElm);
// Rendering modes below IE8 doesn't display BR elements in
PRE unless we have a \n before it
if (tinymce.isIE && parentBlockName == 'PRE' && (!
documentMode || documentMode < 8)) {
brElm.parentNode.insertBefore(dom.doc.createTextNode('\r'), brElm);
}
if (!extraBr) {
rng.setStartAfter(brElm);
rng.setEndAfter(brElm);
} else {
rng.setStartBefore(brElm);
rng.setEndBefore(brElm);
}
selection.setRng(rng);
undoManager.add();
};
node = node.firstChild;
} while (node);
};
function getEditableRoot(node) {
var root = dom.getRoot(), parent, editableRoot;
parent = parent.parentNode;
}
// Get editable root node normaly the body element but sometimes
a div or span
editableRoot = getEditableRoot(container);
// If there is no editable root then enter is done inside a
contentEditable false element
if (!editableRoot) {
return;
}
undoManager.beforeChange();
return;
}
// Handle enter in LI
if (parentBlockName == 'LI') {
if (!newBlockName && shiftKey) {
insertBr();
return;
}
handleEmptyListItem();
return;
}
}
moveToCaretPosition(newBlock);
} else if (isCaretAtStartOrEndOfBlock(true)) {
// Insert new block before
newBlock =
parentBlock.parentNode.insertBefore(createNewBlock(), parentBlock);
renderBlockOnIE(newBlock);
} else {
// Extract after fragment and insert it after the current
block
tmpRng = rng.cloneRange();
tmpRng.setEndAfter(parentBlock);
fragment = tmpRng.extractContents();
trimLeadingLineBreaks(fragment);
newBlock = fragment.firstChild;
dom.insertAfter(fragment, parentBlock);
trimInlineElementsOnLeftSideOfBlock(newBlock);
addBrToBlockIfNeeded(parentBlock);
moveToCaretPosition(newBlock);
}
editor.onKeyDown.add(function(ed, evt) {
if (evt.keyCode == 13) {
if (handleEnterKey(evt) !== false) {
evt.preventDefault();
}
}
});
};
})(tinymce);
;tinyMCE.addI18n({es:{common:{more_colors:"M\u00e1s colores",invalid_data:"Error:
Introdujo un valor no v\u00e1lido, est\u00e1n marcados en rojo.",popup_blocked:"Lo
sentimos, su bloqueo de ventanas emergentes ha deshabilitado una ventana que provee
funcionalidades a la aplicaci\u00f3n. Necesita deshabilitar este bloqueo en este
sitio para poder utilizar todas las funciones.",clipboard_no_support:"Su navegador
no soporta las funciones de cortapapeles, use los accesos por
teclado.",clipboard_msg:"Copiar/Cortar/Pegar no se encuentra disponible en Mozilla
y Firefox.\\n \u00bfDesea obtener m\u00e1s informaci\u00f3n acerca de este
tema?",not_set:"-- Ninguno
--",class_name:"Clase",browse:"Examinar",close:"Cerrar",cancel:"Cancelar",update:"A
ctualizar",insert:"Insertar",apply:"Aplicar",edit_confirm:" \u00bfDesea utilizar el
modo WYSIWYG para esta caja de texto?"},contextmenu:
{full:"Justificado",right:"Derecha",center:"Centrado",left:"Izquierda",align:"Aline
aci\u00f3n"},insertdatetime:
{day_short:"Dom,Lun,Mar,Mie,Jue,Vie,Sab,Dom",day_long:"Domingo,Lunes,Martes,Mi\u00e
9rcoles,Jueves,Viernes,S\u00e1bado,Domingo",months_short:"Ene,Feb,Mar,Abr,May,Jun,J
ul,Ago,Sep,Oct,Nov,Dic",months_long:"Enero,Febrero,Marzo,Abril,Mayo,Junio,Julio,Ago
sto,Septiembre,Octubre,Noviembre,Diciembre",inserttime_desc:"Insertar
hora",insertdate_desc:"Insertar fecha",time_fmt:"%H:%M:%S",date_fmt:"%d-%m-
%Y"},print:{print_desc:"Imprimir"},preview:{preview_desc:"Vista
previa"},directionality:{rtl_desc:"Direcci\u00f3n derecha a
izquierda",ltr_desc:"Direcci\u00f3n izquierda a derecha"},layer:{content:"Nueva
capa...",absolute_desc:"Cambiar a posici\u00f3n
absoluta",backward_desc:"Retroceder",forward_desc:"Avanzar",insertlayer_desc:"Inser
tar nueva capa"},save:{save_desc:"Guardar",cancel_desc:"Cancelar todos los
cambios"},nonbreaking:{nonbreaking_desc:"Insertar caracter de espacio \'non-
breaking\'"},iespell:{download:"No se detect\u00f3 \'ieSpell\'. \u00bfDesea
instalarlo ahora?",iespell_desc:"Corrector ortogr\u00e1fico"},advhr:
{advhr_desc:"Regla horizontal",delta_height:"",delta_width:""},emotions:
{emotions_desc:"Emoticones",delta_height:"",delta_width:""},searchreplace:
{replace_desc:"Buscar/Reemplazar",search_desc:"Buscar",delta_width:"",delta_height:
""},advimage:{image_desc:"Insertar/editar
imagen",delta_width:"",delta_height:""},advlink:{link_desc:"Insertar/editar
hiperv\u00ednculo",delta_height:"",delta_width:""},xhtmlxtras:
{attribs_desc:"Insertar/Editar
atributos",ins_desc:"Inserci\u00f3n",del_desc:"Borrado",acronym_desc:"Acr\u00f3nimo
",abbr_desc:"Abreviatura",cite_desc:"Cita",attribs_delta_height:"",attribs_delta_wi
dth:"",ins_delta_height:"",ins_delta_width:"",del_delta_height:"",del_delta_width:"
",acronym_delta_height:"",acronym_delta_width:"",abbr_delta_height:"",abbr_delta_wi
dth:"",cite_delta_height:"",cite_delta_width:""},style:{desc:"Editar Estilo
CSS",delta_height:"",delta_width:""},paste:{plaintext_mode:"Paste is now in plain
text mode. Click again to toggle back to regular paste
mode.",plaintext_mode_sticky:"Paste is now in plain text mode. Click again to
toggle back to regular paste mode. After you paste something you will be returned
to regular paste mode.",selectall_desc:"Elegir todo",paste_word_desc:"Pegar desde
Word",paste_text_desc:"Pegar como texto plano"},paste_dlg:{word_title:"Use CTRL+V
en su teclado para pegar el texto en la ventana.",text_linebreaks:"Keep
linebreaks",text_title:"Use CTRL+V en su teclado para pegar el texto en la
ventana."},table:{cell:"Celda",col:"Columna",row:"Fila",del:"Eliminar
tabla",copy_row_desc:"Copiar fila",cut_row_desc:"Cortar
fila",paste_row_after_desc:"Pegar filas
(despu\u00e9s)",paste_row_before_desc:"Pegar filas (antes)",props_desc:"Propiedades
de la tabla",cell_desc:"Propiedades de la celda",row_desc:"Propiedades de la
fila",merge_cells_desc:"Vincular celdas",split_cells_desc:"Dividir
celdas",delete_col_desc:"Suprimir columna",col_after_desc:"Insertar columna
(despu\u00e9s)",col_before_desc:"Insertar columna
(antes)",delete_row_desc:"Suprimir fila",row_after_desc:"Insertar fila
(despu\u00e9s)",row_before_desc:"Insertar fila (antes)",desc:"Inserta una nueva
tabla",merge_cells_delta_height:"",merge_cells_delta_width:"",table_delta_height:""
,table_delta_width:"",cellprops_delta_height:"",cellprops_delta_width:"",rowprops_d
elta_height:"",rowprops_delta_width:""},autosave:{warning_message:"Se reestablece
en contenido guardado, perder\u00e1 todo el contenido que est\u00e1 actualmente en
el editor.\\n\\nEst\u00e1 seguro de que quiere reestablecer el contenido
guardado.",restore_content:"Reestablecer contenido guardado
autom\u00e1ticamente",unload_msg:"Los cambios realizados se perder\u00e1n si sale
de esta p\u00e1gina."},fullscreen:{desc:"Cambiar a modo Pantalla Completa"},media:
{edit:"Editar medio embebido",desc:"Insertar/editar medio
embebido",delta_height:"",delta_width:""},fullpage:{desc:"Propiedades del
documento",delta_width:"Ancho",delta_height:"Alto"},template:{desc:"Insertar
contenido de plantilla predefinida"},visualchars:{desc:"Caracteres de control
ON/OFF."},spellchecker:{desc:"Cambiar a corrector
ortogr\u00e1fico",menu:"Configuraci\u00f3n de corrector
ortogr\u00e1fico",ignore_word:"Ignorar",ignore_words:"Ignorar
todo",langs:"Idiomas",wait:"Espere...",sug:"Sugerencias",no_sug:"Sin
sugerencias",no_mpell:"No se encontraron errores."},pagebreak:{desc:"Insertar fin
de p\u00e1gina"},advlist:{types:"Tipo",def:"Preestablecido",lower_alpha:"Menos
opaco",lower_greek:"Menos greek",lower_roman:"Menos roman",upper_alpha:"M\u00e1s
opaco",upper_roman:"M\u00e1s
roman",circle:"Circulo",disc:"Disc",square:"Cuadro"}}});;/**
* editor_template_src.js
*
* Copyright 2009, Moxiecode Systems AB
* Released under LGPL License.
*
* License: http://tinymce.moxiecode.com/license
* Contributing: http://tinymce.moxiecode.com/contributing
*/
(function(tinymce) {
var DOM = tinymce.DOM, Event = tinymce.dom.Event, extend = tinymce.extend,
each = tinymce.each, Cookie = tinymce.util.Cookie, lastExtID, explode =
tinymce.explode;
previewStyles = ed.settings.preview_styles;
// No preview forced
if (previewStyles === false)
return '';
// Default preview
if (!previewStyles)
previewStyles = 'font-family font-size font-weight text-
decoration text-transform color background-color';
if (value)
dom.setStyle(previewElm, name, value);
});
if (value)
dom.setAttrib(previewElm, name, value);
});
if (!dom.hasClass(previewElm, value))
dom.addClass(previewElm, value);
});
dom.remove(previewElm);
return previewCss;
};
tinymce.create('tinymce.themes.AdvancedTheme', {
sizes : [8, 10, 12, 14, 18, 24, 36],
t.editor = ed;
t.url = url;
t.onResolveName = new tinymce.util.Dispatcher(this);
s = ed.settings;
if (tinymce.is(s.theme_advanced_font_sizes, 'string')) {
s.font_size_style_values =
tinymce.explode(s.font_size_style_values);
s.font_size_classes = tinymce.explode(s.font_size_classes
|| '');
if (/^\s*\./.test(v))
cl = v.replace(/\./g, '');
if (s.theme_advanced_statusbar_location == 'none')
s.theme_advanced_statusbar_location = 0;
// Init editor
ed.onInit.add(function() {
if (!ed.settings.readonly) {
ed.onNodeChange.add(t._nodeChanged, t);
ed.onKeyUp.add(t._updateUndoStatus, t);
ed.onMouseUp.add(t._updateUndoStatus, t);
ed.dom.bind(ed.dom.getRoot(), 'dragend', function() {
t._updateUndoStatus(ed);
});
}
});
ed.onSetProgressState.add(function(ed, b, ti) {
var co, id = ed.id, tb;
if (b) {
t.progressTimer = setTimeout(function() {
co = ed.getContainer();
co = co.insertBefore(DOM.create('DIV', {style :
'position:relative'}), co.firstChild);
tb = DOM.get(ed.id + '_tbl');
DOM.loadCSS(s.editor_css ?
ed.documentBaseURI.toAbsolute(s.editor_css) : url + "/skins/" + ed.settings.skin +
"/ui.css");
if (s.skin_variant)
DOM.loadCSS(url + "/skins/" + ed.settings.skin + "/ui_" +
s.skin_variant + ".css");
},
_isHighContrast : function() {
var actualColor, div = DOM.add(DOM.getRoot(), 'div', {'style':
'background-color: rgb(171,239,86);'});
if (c = cf.createControl(n))
return c;
switch (n) {
case "styleselect":
return this._createStyleSelect();
case "formatselect":
return this._createBlockFormats();
case "fontselect":
return this._createFontSelect();
case "fontsizeselect":
return this._createFontSizeSelect();
case "forecolor":
return this._createForeColorMenu();
case "backcolor":
return this._createBackColorMenu();
}
if ((cd = this.controls[n]))
return cf.createButton(n, {title : "advanced." + cd[0], cmd
: cd[1], ui : cd[2], value : cd[3]});
},
if (f) {
f.call(this, ui, val);
return true;
}
return false;
},
_importClasses : function(e) {
var ed = this.editor, ctrl =
ed.controlManager.get('styleselect');
if (ctrl.getLength() == 0) {
each(ed.dom.getClasses(), function(o, idx) {
var name = 'style_' + idx, fmt;
fmt = {
inline : 'span',
attributes : {'class' : o['class']},
selector : '*'
};
ed.formatter.register(name, fmt);
ctrl.add(o['class'], name, {
style: function() {
return getPreviewCss(ed, fmt);
}
});
});
}
},
_createStyleSelect : function(n) {
var t = this, ed = t.editor, ctrlMan = ed.controlManager, ctrl;
each(ctrl.items, function(item) {
formatNames.push(item.value);
});
ed.focus();
ed.undoManager.add();
removedFormat = true;
}
});
if (!removedFormat)
ed.formatter.apply(name);
ed.undoManager.add();
ed.nodeChanged();
if (formats) {
each(formats, function(fmt) {
var name, keys = 0;
if (keys > 1) {
name = fmt.name = fmt.name || 'style_' +
(counter++);
ed.formatter.register(name, fmt);
ctrl.add(fmt.title, name, {
style: function() {
return getPreviewCss(ed,
fmt);
}
});
} else
ctrl.add(fmt.title);
});
} else {
each(ed.getParam('theme_advanced_styles', '',
'hash'), function(val, key) {
var name, fmt;
if (val) {
name = 'style_' + (counter++);
fmt = {
inline : 'span',
classes : val,
selector : '*'
};
ed.formatter.register(name, fmt);
ctrl.add(t.editor.translate(key), name, {
style: function() {
return getPreviewCss(ed,
fmt);
}
});
}
});
}
});
return ctrl;
},
_createFontSelect : function() {
var c, t = this, ed = t.editor;
c = ed.controlManager.createListBox('fontselect', {
title : 'advanced.fontdefault',
onselect : function(v) {
var cur = c.items[c.selectedIndex];
if (c) {
each(ed.getParam('theme_advanced_fonts',
t.settings.theme_advanced_fonts, 'hash'), function(v, k) {
c.add(ed.translate(k), v, {style : v.indexOf('dings')
== -1 ? 'font-family:' + v : ''});
});
}
return c;
},
_createFontSizeSelect : function() {
var t = this, ed = t.editor, c, i = 0, cl = [];
c = ed.controlManager.createListBox('fontsizeselect', {title :
'advanced.font_size', onselect : function(v) {
var cur = c.items[c.selectedIndex];
if (cur['class']) {
ed.formatter.toggle('fontsize_class', {value :
cur['class']});
ed.undoManager.add();
ed.nodeChanged();
} else {
ed.execCommand('FontSize', false,
cur.fontSize);
}
return;
}
if (v['class']) {
ed.focus();
ed.undoManager.add();
ed.formatter.toggle('fontsize_class', {value :
v['class']});
ed.undoManager.add();
ed.nodeChanged();
} else
ed.execCommand('FontSize', false, v.fontSize);
if (c) {
each(t.settings.theme_advanced_font_sizes, function(v, k) {
var fz = v.fontSize;
return c;
},
_createBlockFormats : function() {
var c, fmts = {
p : 'advanced.paragraph',
address : 'advanced.address',
pre : 'advanced.pre',
h1 : 'advanced.h1',
h2 : 'advanced.h2',
h3 : 'advanced.h3',
h4 : 'advanced.h4',
h5 : 'advanced.h5',
h6 : 'advanced.h6',
div : 'advanced.div',
blockquote : 'advanced.blockquote',
code : 'advanced.code',
dt : 'advanced.dt',
dd : 'advanced.dd',
samp : 'advanced.samp'
}, t = this;
c = t.editor.controlManager.createListBox('formatselect',
{title : 'advanced.block', onselect : function(v) {
t.editor.execCommand('FormatBlock', false, v);
return false;
}});
if (c) {
each(t.editor.getParam('theme_advanced_blockformats',
t.settings.theme_advanced_blockformats, 'hash'), function(v, k) {
c.add(t.editor.translate(k != v ? k : fmts[v]), v,
{'class' : 'mce_formatPreview mce_' + v, style: function() {
return getPreviewCss(t.editor, {block: v});
}});
});
}
return c;
},
_createForeColorMenu : function() {
var c, t = this, s = t.settings, o = {}, v;
if (s.theme_advanced_more_colors) {
o.more_colors_func = function() {
t._mceColorPicker(0, {
color : c.value,
func : function(co) {
c.setColor(co);
}
});
};
}
if (v = s.theme_advanced_text_colors)
o.colors = v;
if (s.theme_advanced_default_foreground_color)
o.default_color =
s.theme_advanced_default_foreground_color;
o.title = 'advanced.forecolor_desc';
o.cmd = 'ForeColor';
o.scope = this;
c = t.editor.controlManager.createColorSplitButton('forecolor',
o);
return c;
},
_createBackColorMenu : function() {
var c, t = this, s = t.settings, o = {}, v;
if (s.theme_advanced_more_colors) {
o.more_colors_func = function() {
t._mceColorPicker(0, {
color : c.value,
func : function(co) {
c.setColor(co);
}
});
};
}
if (v = s.theme_advanced_background_colors)
o.colors = v;
if (s.theme_advanced_default_background_color)
o.default_color =
s.theme_advanced_default_background_color;
o.title = 'advanced.backcolor_desc';
o.cmd = 'HiliteColor';
o.scope = this;
c = t.editor.controlManager.createColorSplitButton('backcolor',
o);
return c;
},
renderUI : function(o) {
var n, ic, tb, t = this, ed = t.editor, s = t.settings, sc, p,
nl;
if (ed.settings) {
ed.settings.aria_label = s.aria_label +
ed.getLang('advanced.help_shortcut');
}
if (!DOM.boxModel)
n = DOM.add(n, 'div', {'class' : 'mceOldBoxModel'});
case "customlayout":
ic = ed.execCallback("theme_advanced_custom_layout",
s, tb, o, p);
break;
default:
ic = t._simpleLayout(s, tb, o, p);
}
n = o.targetNode;
if (DOM.get(s.theme_advanced_toolbar_container))
DOM.get(s.theme_advanced_toolbar_container).appendChild(p);
else
DOM.insertAfter(p, n);
if (e.nodeName == 'A') {
t._sel(e.className.replace(/^.*mcePath_([0-9]+).*$/,
'$1'));
return false;
}
});
/*
if (DOM.get(ed.id + '_path_row')) {
Event.add(ed.id + '_tbl', 'mouseover', function(e) {
var re;
e = e.target;
if (!ed.getParam('accessibility_focus'))
Event.add(DOM.add(p, 'a', {href : '#'}, '<!-- IE -->'),
'focus', function() {tinyMCE.get(ed.id).focus();});
if (s.theme_advanced_toolbar_location == 'external')
o.deltaHeight = 0;
t.deltaHeight = o.deltaHeight;
o.targetNode = null;
ed.onKeyDown.add(function(ed, evt) {
var DOM_VK_F10 = 121, DOM_VK_F11 = 122;
if (evt.altKey) {
if (evt.keyCode === DOM_VK_F10) {
// Make sure focus is given to toolbar in
Safari.
// We can't do this in IE as it prevents giving
focus to toolbar when editor is in a frame
if (tinymce.isWebKit) {
window.focus();
}
t.toolbarGroup.focus();
return Event.cancel(evt);
} else if (evt.keyCode === DOM_VK_F11) {
DOM.get(ed.id + '_path_row').focus();
return Event.cancel(evt);
}
}
});
return {
iframeContainer : ic,
editorContainer : ed.id + '_parent',
sizeContainer : sc,
deltaHeight : o.deltaHeight
};
},
getInfo : function() {
return {
longname : 'Advanced theme',
author : 'Moxiecode Systems AB',
authorurl : 'http://tinymce.moxiecode.com',
version : tinymce.majorVersion + "." + tinymce.minorVersion
}
},
resizeBy : function(dw, dh) {
var e = DOM.get(this.editor.id + '_ifr');
if (s.theme_advanced_resize_horizontal) {
DOM.setStyle(e, 'width', '');
DOM.setStyle(ifr, 'width', w);
// Make sure that the size is never smaller than the over
all ui
if (w < e.clientWidth) {
w = e.clientWidth;
DOM.setStyle(ifr, 'width', e.clientWidth);
}
}
destroy : function() {
var id = this.editor.id;
Event.clear(id + '_resize');
Event.clear(id + '_path_row');
Event.clear(id + '_external_close');
},
// Internal functions
if (s.readonly) {
n = DOM.add(tb, 'tr');
n = ic = DOM.add(n, 'td', {'class' :
'mceIframeContainer'});
return ic;
}
if (p.firstChild.className == 'mceOldBoxModel')
p.firstChild.appendChild(c);
else
p.insertBefore(c, p.firstChild);
t._addToolbars(etb, o);
ed.onMouseUp.add(function() {
var e = DOM.get(ed.id + '_external');
DOM.show(e);
DOM.hide(lastExtID);
DOM.show(e);
DOM.setStyle(e, 'top', 0 - DOM.getRect(ed.id +
'_tblext').h - 1);
e = null;
});
}
if (sl == 'top')
t._addStatusBar(tb, o);
// Create iframe container
if (!s.theme_advanced_toolbar_container) {
n = DOM.add(tb, 'tr');
n = ic = DOM.add(n, 'td', {'class' :
'mceIframeContainer'});
}
if (sl == 'bottom')
t._addStatusBar(tb, o);
return ic;
},
dc = s.theme_advanced_containers_default_class || '';
da = s.theme_advanced_containers_default_align || 'center';
switch (c.toLowerCase()) {
case 'mceeditor':
n = DOM.add(tb, 'tr');
n = ic = DOM.add(n, 'td', {'class' :
'mceIframeContainer'});
break;
case 'mceelementpath':
t._addStatusBar(tb, o);
break;
default:
a = (s['theme_advanced_container_' + c +
'_align'] || da).toLowerCase();
a = 'mce' + t._ufirst(a);
to = cf.createToolbar("toolbar" + i);
t._addControls(v, to);
DOM.setHTML(n, to.renderHTML());
o.deltaHeight -= s.theme_advanced_row_height;
}
});
return ic;
},
each(explode(s.theme_advanced_disable), function(v) {
di[v] = 1;
});
t._disabled = di;
} else
di = t._disabled;
each(explode(v), function(n) {
var c;
each(["table","|","row_before","row_after","delete_row","|","col_before","col_after
","delete_col","|","split_cells","merge_cells"], function(n) {
n = t.createControl(n, cf);
if (n)
tb.add(n);
});
return;
}
c = t.createControl(n, cf);
if (c)
tb.add(c);
});
},
_addToolbars : function(c, o) {
var t = this, i, tb, ed = t.editor, s = t.settings, v, cf =
ed.controlManager, di, n, h = [], a, toolbarGroup, toolbarsExist = false;
toolbarGroup = cf.createToolbarGroup('toolbargroup', {
'name': ed.getLang('advanced.toolbar'),
'tab_focus_toolbar':ed.getParam('theme_advanced_tab_focus_t
oolbar')
});
t.toolbarGroup = toolbarGroup;
a = s.theme_advanced_toolbar_align.toLowerCase();
a = 'mce' + t._ufirst(a);
if (s['theme_advanced_buttons' + i + '_add'])
v += ',' + s['theme_advanced_buttons' + i + '_add'];
if (s['theme_advanced_buttons' + i + '_add_before'])
v = s['theme_advanced_buttons' + i + '_add_before'] +
',' + v;
t._addControls(v, tb);
toolbarGroup.add(tb);
o.deltaHeight -= s.theme_advanced_row_height;
}
// Handle case when there are no toolbar buttons and ensure
editor height is adjusted accordingly
if (!toolbarsExist)
o.deltaHeight -= s.theme_advanced_row_height;
h.push(toolbarGroup.renderHTML());
h.push(DOM.createHTML('a', {href : '#', accesskey : 'z', title :
ed.getLang("advanced.toolbar_focus"), onfocus : 'tinyMCE.getInstanceById(\'' +
ed.id + '\').focus();'}, '<!-- IE -->'));
DOM.setHTML(n, h.join(''));
},
_addStatusBar : function(tb, o) {
var n, t = this, ed = t.editor, s = t.settings, r, mf, me, td;
n = DOM.add(tb, 'tr');
n = td = DOM.add(n, 'td', {'class' : 'mceStatusbar'});
n = DOM.add(n, 'div', {id : ed.id + '_path_row', 'role': 'group',
'aria-labelledby': ed.id + '_path_voice'});
if (s.theme_advanced_path) {
DOM.add(n, 'span', {id: ed.id + '_path_voice'},
ed.translate('advanced.path'));
DOM.add(n, 'span', {}, ': ');
} else {
DOM.add(n, 'span', {}, ' ');
}
if (s.theme_advanced_resizing) {
DOM.add(td, 'a', {id : ed.id + '_resize', href :
'javascript:;', onclick : "return false;", 'class' : 'mceResize', tabIndex:"-1"});
if (s.theme_advanced_resizing_use_cookie) {
ed.onPostRender.add(function() {
var o = Cookie.getHash("TinyMCE_" + ed.id +
"_size"), c = DOM.get(ed.id + '_tbl');
if (!o)
return;
t.resizeTo(o.cw, o.ch);
});
}
ed.onPostRender.add(function() {
Event.add(ed.id + '_resize', 'click', function(e) {
e.preventDefault();
});
function resizeOnMove(e) {
e.preventDefault();
t.resizeTo(width, height);
};
function endResize(e) {
// Stop listening
Event.remove(DOM.doc, 'mousemove',
mouseMoveHandler1);
Event.remove(ed.getDoc(), 'mousemove',
mouseMoveHandler2);
Event.remove(DOM.doc, 'mouseup',
mouseUpHandler1);
Event.remove(ed.getDoc(), 'mouseup',
mouseUpHandler2);
ed.nodeChanged();
};
e.preventDefault();
o.deltaHeight -= 21;
n = tb = null;
},
_updateUndoStatus : function(ed) {
var cm = ed.controlManager, um = ed.undoManager;
tinymce.each(t.stateControls, function(c) {
cm.setActive(c, ed.queryCommandState(t.controls[c][1]));
});
function getParent(name) {
var i, parents = ob.parents, func = name;
if (typeof(name) == 'string') {
func = function(node) {
return node.nodeName == name;
};
}
cm.setActive('visualaid', ed.hasVisual);
t._updateUndoStatus(ed);
cm.setDisabled('outdent', !ed.queryCommandState('Outdent'));
p = getParent('A');
if (c = cm.get('link')) {
c.setDisabled((!p && co) || (p && !p.href));
c.setActive(!!p && (!p.name && !p.id));
}
if (c = cm.get('unlink')) {
c.setDisabled(!p && co);
c.setActive(!!p && !p.name && !p.id);
}
if (c = cm.get('anchor')) {
c.setActive(!co && !!p && (p.name || (p.id && !p.href)));
}
p = getParent('IMG');
if (c = cm.get('image'))
c.setActive(!co && !!p && n.className.indexOf('mceItem') ==
-1);
if (c = cm.get('styleselect')) {
t._importClasses();
formatNames = [];
each(c.items, function(item) {
formatNames.push(item.value);
});
matches = ed.formatter.matchAll(formatNames);
c.select(matches[0]);
tinymce.each(matches, function(match, index) {
if (index > 0) {
c.mark(match);
}
});
}
if (c = cm.get('formatselect')) {
p = getParent(ed.dom.isBlock);
if (p)
c.select(p.nodeName.toLowerCase());
}
if (ed.dom.is(n, s.theme_advanced_font_selector)) {
if (!fz && n.style.fontSize)
fz = n.style.fontSize;
return false;
});
if (c = cm.get('fontselect')) {
c.select(function(v) {
return v.replace(/^([^,]+).*/, '$1').toLowerCase() ==
fn;
});
}
c.select(function(v) {
if (v.fontSize && v.fontSize === fz)
return true;
if (s.theme_advanced_show_current_color) {
function updateColor(controlId, color) {
if (c = cm.get(controlId)) {
if (!color)
color = c.settings.default_color;
if (color !== c.value) {
c.displayColor(color);
}
}
}
updateColor('forecolor', fc);
updateColor('backcolor', bc);
}
if (s.theme_advanced_show_current_color) {
function updateColor(controlId, color) {
if (c = cm.get(controlId)) {
if (!color)
color = c.settings.default_color;
if (color !== c.value) {
c.displayColor(color);
}
}
};
updateColor('forecolor', fc);
updateColor('backcolor', bc);
}
if (t.statusKeyboardNavigation) {
t.statusKeyboardNavigation.destroy();
t.statusKeyboardNavigation = null;
}
DOM.setHTML(p, '');
getParent(function(n) {
var na = n.nodeName.toLowerCase(), u, pi, ti = '';
// Handle prefix
if (tinymce.isIE && n.scopeName !== 'HTML' &&
n.scopeName)
na = n.scopeName + ':' + na;
case 'i':
na = 'em';
break;
case 'img':
if (v = DOM.getAttrib(n, 'src'))
ti += 'src: ' + v + ' ';
break;
case 'a':
if (v = DOM.getAttrib(n, 'name')) {
ti += 'name: ' + v + ' ';
na += '#' + v;
}
if (v = DOM.getAttrib(n, 'href'))
ti += 'href: ' + v + ' ';
break;
case 'font':
if (v = DOM.getAttrib(n, 'face'))
ti += 'font: ' + v + ' ';
if (v = DOM.getAttrib(n, 'size'))
ti += 'size: ' + v + ' ';
if (v = DOM.getAttrib(n, 'color'))
ti += 'color: ' + v + ' ';
break;
case 'span':
if (v = DOM.getAttrib(n, 'style'))
ti += 'style: ' + v + ' ';
break;
}
if (v = DOM.getAttrib(n, 'id'))
ti += 'id: ' + v + ' ';
if (v = n.className) {
v = v.replace(/\b\s*(webkit|mce|
Apple-)\w+\s*\b/g, '');
if (v) {
ti += 'class: ' + v + ' ';
if (ed.dom.isBlock(n) || na == 'img' ||
na == 'span')
na += '.' + v;
}
}
na = na.replace(/(html:)/g, '');
na = {name : na, node : n, title : ti};
t.onResolveName.dispatch(t, na);
ti = na.title;
na = na.name;
//u = "javascript:tinymce.EditorManager.get('" +
ed.id + "').theme._sel('" + (de++) + "');";
pi = DOM.create('a', {'href' : "javascript:;", role:
'button', onmousedown : "return false;", title : ti, 'class' : 'mcePath_' + (de+
+)}, na);
if (p.hasChildNodes()) {
p.insertBefore(DOM.create('span', {'aria-
hidden': 'true'}, '\u00a0\u00bb '), p.firstChild);
p.insertBefore(pi, p.firstChild);
} else
p.appendChild(pi);
}, ed.getBody());
_sel : function(v) {
this.editor.execCommand('mceSelectNodeDepth', false, v);
},
_makeUrl: function(filename){
var url = this.url + '/' + filename;
if(this.settings.cache_string){
url += (url.indexOf('?') >= 0 ? '&' : '?') + 'cache=' +
this.settings.cache_string;
}
return url;
},
_mceInsertAnchor : function(ui, v) {
var ed = this.editor;
ed.windowManager.open({
url : this._makeUrl('anchor.htm'),
width : 320 +
parseInt(ed.getLang('advanced.anchor_delta_width', 0)),
height : 90 +
parseInt(ed.getLang('advanced.anchor_delta_height', 0)),
inline : true
}, {
theme_url : this.url
});
},
_mceCharMap : function() {
var ed = this.editor;
ed.windowManager.open({
url : this._makeUrl('charmap.htm'),
width : 613 +
parseInt(ed.getLang('advanced.charmap_delta_width', 0)),
height : 320 +
parseInt(ed.getLang('advanced.charmap_delta_height', 0)),
inline : true
}, {
theme_url : this.url
});
},
_mceHelp : function() {
var ed = this.editor;
ed.windowManager.open({
url : this._makeUrl('about.htm'),
width : 480,
height : 380,
inline : true
}, {
theme_url : this.url
});
},
_mceShortcuts : function() {
var ed = this.editor;
ed.windowManager.open({
url : this._makeUrl('shortcuts.htm'),
width: 480,
height: 380,
inline: true
}, {
theme_url: this.url
});
},
_mceColorPicker : function(u, v) {
var ed = this.editor;
v = v || {};
ed.windowManager.open({
url : this._makeUrl('color_picker.htm'),
width : 360 +
parseInt(ed.getLang('advanced.colorpicker_delta_width', 0)),
height : 260 +
parseInt(ed.getLang('advanced.colorpicker_delta_height', 0)),
close_previous : false,
inline : true
}, {
input_color : v.color,
func : v.func,
theme_url : this.url
});
},
ed.windowManager.open({
url : this._makeUrl('source_editor.htm'),
width :
parseInt(ed.getParam("theme_advanced_source_editor_width", 720)),
height :
parseInt(ed.getParam("theme_advanced_source_editor_height", 580)),
inline : true,
resizable : true,
maximizable : true
}, {
theme_url : this.url
});
},
ed.windowManager.open({
url : this._makeUrl('image.htm'),
width : 400 +
parseInt(ed.getLang('advanced.image_delta_width', 0)),
height : 250 +
parseInt(ed.getLang('advanced.image_delta_height', 0)),
inline : true
}, {
theme_url : this.url
});
},
ed.windowManager.open({
url : this._makeUrl('link.htm'),
width : 400 +
parseInt(ed.getLang('advanced.link_delta_width', 0)),
height : 160 +
parseInt(ed.getLang('advanced.link_delta_height', 0)),
inline : true
}, {
theme_url : this.url
});
},
_mceNewDocument : function() {
var ed = this.editor;
ed.windowManager.confirm('advanced.newdocument', function(s) {
if (s)
ed.execCommand('mceSetContent', false, '');
});
},
_mceForeColor : function() {
var t = this;
this._mceColorPicker(0, {
color: t.fgColor,
func : function(co) {
t.fgColor = co;
t.editor.execCommand('ForeColor', false, co);
}
});
},
_mceBackColor : function() {
var t = this;
this._mceColorPicker(0, {
color: t.bgColor,
func : function(co) {
t.bgColor = co;
t.editor.execCommand('HiliteColor', false, co);
}
});
},
_ufirst : function(s) {
return s.substring(0, 1).toUpperCase() + s.substring(1);
}
});
tinymce.ThemeManager.add('advanced', tinymce.themes.AdvancedTheme);
}(tinymce));
;tinyMCE.addI18n('es.advanced',{underline_desc:"Subrayado
(Ctrl+U)",italic_desc:"Cursiva (Ctrl+I)",bold_desc:"Negrita
(Ctrl+B)",dd:"Descripci\u00f3n de definici\u00f3n",dt:"T\u00e9rmino de
definici\u00f3n",samp:"Ejemplo de
c\u00f3digo",code:"C\u00f3digo",blockquote:"Cita",h6:"Encabezado 6",h5:"Encabezado
5",h4:"Encabezado 4",h3:"Encabezado 3",h2:"Encabezado 2",h1:"Encabezado
1",pre:"Preformateado",address:"Direcci\u00f3n",div:"Div",paragraph:"P\u00e1rrafo",
block:"P\u00e1rrafo",fontdefault:"Fuente",font_size:"12",style_select:"Estilos",mor
e_colors:"M\u00e1s colores",toolbar_focus:"Ir a los botones de herramientas -
Alt+Q, Ir al editor - Alt-Z, Ir a la ruta del elemento - Alt-X",newdocument:"
\u00bfSeguro que desea limpiar todo el
contenido?",path:"Ruta",clipboard_msg:"Copiar/Cortar/Pegar no se encuentra
disponible en Mozilla y Firefox.\\n \u00bfQuiere m\u00e1s informaci\u00f3n sobre
este tema?",blockquote_desc:"Cita",help_desc:"Ayuda",newdocument_desc:"Nuevo
documento",image_props_desc:"Propiedades de
imagen",paste_desc:"Pegar",copy_desc:"Copiar",cut_desc:"Cortar",anchor_desc:"Insert
ar/editar ancla",visualaid_desc:"Mostrar/ocultar l\u00ednea de gu\u00eda/elementos
invisibles",charmap_desc:"Insertar caracteres
personalizados",backcolor_desc:"Elegir color de fondo",forecolor_desc:"Elegir color
del texto",custom1_desc:"Su descripci\u00f3n personal
aqu\u00ed",removeformat_desc:"Limpiar formato",hr_desc:"Insertar regla
horizontal",sup_desc:"Super\u00edndice",sub_desc:"Sub\u00edndice",code_desc:"Editar
c\u00f3digo HTML",cleanup_desc:"Limpiar c\u00f3digo
basura",image_desc:"Insertar/editar imagen",unlink_desc:"Quitar
hiperv\u00ednculo",link_desc:"Insertar/editar hiperv\u00ednculo",redo_desc:"Rehacer
(Ctrl+Y)",undo_desc:"Deshacer (Ctrl+Z)",indent_desc:"Aumentar
sangr\u00eda",outdent_desc:"Reducir sangr\u00eda",numlist_desc:"Lista
ordenada",bullist_desc:"Lista
desordenada",justifyfull_desc:"Justificar",justifyright_desc:"Alinear a la
derecha",justifycenter_desc:"Alinear al centro",justifyleft_desc:"Alinear a la
izquierda",striketrough_desc:"Tachado",anchor_delta_height:"",anchor_delta_width:""
,charmap_delta_height:"",charmap_delta_width:"",colorpicker_delta_height:"",colorpi
cker_delta_width:"",link_delta_height:"",link_delta_width:"",image_delta_height:"",
image_delta_width:""});
;(function(){var
a=tinymce.util.JSONRequest,c=tinymce.each,b=tinymce.DOM;tinymce.create("tinymce.plu
gins.SpellcheckerPlugin",{getInfo:function()
{return{longname:"Spellchecker",author:"Moxiecode Systems
AB",authorurl:"http://tinymce.moxiecode.com",infourl:"http://wiki.moxiecode.com/ind
ex.php/TinyMCE:Plugins/spellchecker",version:tinymce.majorVersion+"."+tinymce.minor
Version}},init:function(e,f){var
g=this,d;g.url=f;g.editor=e;g.rpcUrl=e.getParam("spellchecker_rpc_url","{backend}")
;if(g.rpcUrl=="{backend}"){if(tinymce.isIE)
{return}g.hasSupport=true;e.onContextMenu.addToTop(function(h,i){if(g.active)
{return false}})}e.addCommand("mceSpellCheck",function(){if(g.rpcUrl=="{backend}")
{g.editor.getBody().spellcheck=g.active=!g.active;return}if(!g.active)
{e.setProgressState(1);g._sendRPC("checkWords",
[g.selectedLang,g._getWords()],function(h){if(h.length>0)
{g.active=1;g._markWords(h);e.setProgressState(0);e.nodeChanged()}else{e.setProgres
sState(0);if(e.getParam("spellchecker_report_no_misspellings",true))
{e.windowManager.alert("spellchecker.no_mpell")}}})}else{g._done()}});if(e.settings
.content_css!==false)
{e.contentCSS.push(f+"/css/content.css")}e.onClick.add(g._showMenu,g);e.onContextMe
nu.add(g._showMenu,g);e.onBeforeGetContent.add(function(){if(g.active)
{g._removeWords()}});e.onNodeChange.add(function(i,h)
{h.setActive("spellchecker",g.active)});e.onSetContent.add(function()
{g._done()});e.onBeforeGetContent.add(function()
{g._done()});e.onBeforeExecCommand.add(function(h,i){if(i=="mceFullScreen")
{g._done()}});g.languages={};c(e.getParam("spellchecker_languages","+English=en,Dan
ish=da,Dutch=nl,Finnish=fi,French=fr,German=de,Italian=it,Polish=pl,Portuguese=pt,S
panish=es,Swedish=sv","hash"),function(i,h){if(h.indexOf("+")===0)
{h=h.substring(1);g.selectedLang=i}g.languages[h]=i})},createControl:function(h,d)
{var f=this,g,e=f.editor;if(h=="spellchecker"){if(f.rpcUrl=="{backend}")
{if(f.hasSupport){g=d.createButton(h,
{title:"spellchecker.desc",cmd:"mceSpellCheck",scope:f})}return
g}g=d.createSplitButton(h,
{title:"spellchecker.desc",cmd:"mceSpellCheck",scope:f});g.onRenderMenu.add(functio
n(j,i)
{i.add({title:"spellchecker.langs","class":"mceMenuItemTitle"}).setDisabled(1);c(f.
languages,function(n,m){var p={icon:1},l;p.onclick=function(){if(n==f.selectedLang)
{return}l.setSelected(1);f.selectedItem.setSelected(0);f.selectedItem=l;f.selectedL
ang=n};p.title=m;l=i.add(p);l.setSelected(n==f.selectedLang);if(n==f.selectedLang)
{f.selectedItem=l}})});return g}},_walk:function(i,g){var
h=this.editor.getDoc(),e;if(h.createTreeWalker)
{e=h.createTreeWalker(i,NodeFilter.SHOW_TEXT,null,false);while((i=e.nextNode())!
=null)
{g.call(this,i)}}else{tinymce.walk(i,g,"childNodes")}},_getSeparators:function()
{var e="",d,f=this.editor.getParam("spellchecker_word_separator_chars",'\\s!"#$
%&()*+,-./:;<=>?@[]^_{|}���������������\u201d\u201c');for(d=0;d<f.length;d++)
{e+="\\"+f.charAt(d)}return e},_getWords:function(){var
e=this.editor,g=[],d="",f={},h=[];this._walk(e.getBody(),function(i)
{if(i.nodeType==3){d+=i.nodeValue+"
"}});if(e.getParam("spellchecker_word_pattern"))
{h=d.match("("+e.getParam("spellchecker_word_pattern")
+")","gi")}else{d=d.replace(new RegExp("([0-9]|["+this._getSeparators()+"])","g"),"
");d=tinymce.trim(d.replace(/(\s+)/g," "));h=d.split(" ")}c(h,function(i){if(!f[i])
{g.push(i);f[i]=1}});return g},_removeWords:function(e){var
f=this.editor,h=f.dom,g=f.selection,d=g.getBookmark();c(h.select("span").reverse(),
function(i){if(i&&(h.hasClass(i,"mceItemHiddenSpellWord")||
h.hasClass(i,"mceItemHidden"))){if(!e||h.decode(i.innerHTML)==e)
{h.remove(i,1)}}});g.moveToBookmark(d)},_markWords:function(l){var
g=this.editor,f=g.dom,j=g.getDoc(),h=g.selection,i=h.getBookmark(),d=[],k=l.join("|
"),m=this._getSeparators(),e=new RegExp("(^|["+m+"])("+k+")(?=["+m+"]|
$)","g");this._walk(g.getBody(),function(o){if(o.nodeType==3)
{d.push(o)}});c(d,function(t){var r,q,o,s,p=t.nodeValue;if(e.test(p))
{p=f.encode(p);q=f.create("span",{"class":"mceItemHidden"});if(tinymce.isIE)
{p=p.replace(e,"$1<mcespell>$2</mcespell>");while((s=p.indexOf("<mcespell>"))!=-1)
{o=p.substring(0,s);if(o.length)
{r=j.createTextNode(f.decode(o));q.appendChild(r)}p=p.substring(s+10);s=p.indexOf("
</mcespell>");o=p.substring(0,s);p=p.substring(s+11);q.appendChild(f.create("span",
{"class":"mceItemHiddenSpellWord"},o))}if(p.length)
{r=j.createTextNode(f.decode(p));q.appendChild(r)}}else{q.innerHTML=p.replace(e,'$1
<span
class="mceItemHiddenSpellWord">$2</span>')}f.replace(q,t)}});h.moveToBookmark(i)},_
showMenu:function(h,j){var
i=this,h=i.editor,d=i._menu,l,k=h.dom,g=k.getViewPort(h.getWin()),f=j.target;j=0;if
(!d){d=h.controlManager.createDropMenu("spellcheckermenu",
{"class":"mceNoIcons"});i._menu=d}if(k.hasClass(f,"mceItemHiddenSpellWord"))
{d.removeAll();d.add({title:"spellchecker.wait","class":"mceMenuItemTitle"}).setDis
abled(1);i._sendRPC("getSuggestions",
[i.selectedLang,k.decode(f.innerHTML)],function(m){var
e;d.removeAll();if(m.length>0)
{d.add({title:"spellchecker.sug","class":"mceMenuItemTitle"}).setDisabled(1);c(m,fu
nction(n){d.add({title:n,onclick:function()
{k.replace(h.getDoc().createTextNode(n),f);i._checkDone()}})});d.addSeparator()}els
e{d.add({title:"spellchecker.no_sug","class":"mceMenuItemTitle"}).setDisabled(1)}e=
i.editor.getParam("spellchecker_enable_ignore_rpc","");d.add({title:"spellchecker.i
gnore_word",onclick:function(){var n=f.innerHTML;k.remove(f,1);i._checkDone();if(e)
{h.setProgressState(1);i._sendRPC("ignoreWord",[i.selectedLang,n],function(o)
{h.setProgressState(0)})}}});d.add({title:"spellchecker.ignore_words",onclick:funct
ion(){var n=f.innerHTML;i._removeWords(k.decode(n));i._checkDone();if(e)
{h.setProgressState(1);i._sendRPC("ignoreWords",[i.selectedLang,n],function(o)
{h.setProgressState(0)})}}});if(i.editor.getParam("spellchecker_enable_learn_rpc"))
{d.add({title:"spellchecker.learn_word",onclick:function(){var
n=f.innerHTML;k.remove(f,1);i._checkDone();h.setProgressState(1);i._sendRPC("learnW
ord",[i.selectedLang,n],function(o)
{h.setProgressState(0)})}})}d.update()});l=k.getPos(h.getContentAreaContainer());d.
settings.offset_x=l.x;d.settings.offset_y=l.y;h.selection.select(f);l=k.getPos(f);d
.showMenu(l.x,l.y+f.offsetHeight-g.y);return
tinymce.dom.Event.cancel(j)}else{d.hideMenu()}},_checkDone:function(){var
e=this,d=e.editor,g=d.dom,f;c(g.select("span"),function(h)
{if(h&&g.hasClass(h,"mceItemHiddenSpellWord")){f=true;return false}});if(!f)
{e._done()}},_done:function(){var d=this,e=d.active;if(d.active)
{d.active=0;d._removeWords();if(d._menu){d._menu.hideMenu()}if(e)
{d.editor.nodeChanged()}}},_sendRPC:function(e,g,d){var
f=this;a.sendRPC({url:f.rpcUrl,method:e,params:g,success:d,error:function(i,h)
{f.editor.setProgressState(0);f.editor.windowManager.alert(i.errstr||("Error
response:
"+h.responseText))}})}});tinymce.PluginManager.add("spellchecker",tinymce.plugins.S
pellcheckerPlugin)})();;(function(c){var d=c.each;function b(f,g){var
h=g.ownerDocument,e=h.createRange(),j;e.setStartBefore(g);e.setEnd(f.endContainer,f
.endOffset);j=h.createElement("body");j.appendChild(e.cloneContents());return
j.innerHTML.replace(/<(br|img|object|embed|input|textarea)
[^>]*>/gi,"-").replace(/<[^>]+>/g,"").length==0}function a(H,G,K){var
f,L,D,o;t();o=G.getParent(K.getStart(),"th,td");if(o)
{L=F(o);D=I();o=z(L.x,L.y)}function A(N,M)
{N=N.cloneNode(M);N.removeAttribute("id");return N}function t(){var
M=0;f=[];d(["thead","tbody","tfoot"],function(N){var O=G.select("> "+N+"
tr",H);d(O,function(P,Q){Q+=M;d(G.select("> td, > th",P),function(W,R){var
S,T,U,V;if(f[Q]){while(f[Q][R]){R+
+}}U=h(W,"rowspan");V=h(W,"colspan");for(T=Q;T<Q+U;T++){if(!f[T])
{f[T]=[]}for(S=R;S<R+V;S++){f[T]
[S]={part:N,real:T==Q&&S==R,elm:W,rowspan:U,colspan:V}}}})});M+=O.length})}function
z(M,O){var N;N=f[O];if(N){return N[M]}}function h(N,M){return
parseInt(N.getAttribute(M)||1)}function s(O,M,N){if(O){N=parseInt(N);if(N===1)
{O.removeAttribute(M,1)}else{O.setAttribute(M,N,1)}}}function j(M){return
M&&(G.hasClass(M.elm,"mceSelected")||M==o)}function k(){var
M=[];d(H.rows,function(N){d(N.cells,function(O){if(G.hasClass(O,"mceSelected")||
O==o.elm){M.push(N);return false}})});return M}function r(){var
M=G.createRng();M.setStartAfter(H);M.setEndAfter(H);K.setRng(M);G.remove(H)}functio
n e(M){var N;c.walk(M,function(P){var O;if(P.nodeType==3)
{d(G.getParents(P.parentNode,null,M).reverse(),function(Q){Q=A(Q,false);if(!N)
{N=O=Q}else{if(O){O.appendChild(Q)}}O=Q});if(O){O.innerHTML=c.isIE?" ":'<br
data-mce-bogus="1" />'}return
false}},"childNodes");M=A(M,false);s(M,"rowSpan",1);s(M,"colSpan",1);if(N)
{M.appendChild(N)}else{if(!c.isIE){M.innerHTML='<br data-mce-bogus="1" />'}}return
M}function q(){var M=G.createRng();d(G.select("tr",H),function(N)
{if(N.cells.length==0){G.remove(N)}});if(G.select("tr",H).length==0)
{M.setStartAfter(H);M.setEndAfter(H);K.setRng(M);G.remove(H);return}d(G.select("the
ad,tbody,tfoot",H),function(N){if(N.rows.length==0)
{G.remove(N)}});t();row=f[Math.min(f.length-1,L.y)];if(row)
{K.select(row[Math.min(row.length-1,L.x)].elm,true);K.collapse(true)}}function
u(S,Q,U,R){var P,N,M,O,T;P=f[Q][S].elm.parentNode;for(M=1;M<=U;M++)
{P=G.getNext(P,"tr");if(P){for(N=S;N>=0;N--){T=f[Q+M][N].elm;if(T.parentNode==P)
{for(O=1;O<=R;O++){G.insertAfter(e(T),T)}break}}if(N==-1){for(O=1;O<=R;O++)
{P.insertBefore(e(P.cells[0]),P.cells[0])}}}}}function C(){d(f,function(M,N)
{d(M,function(P,O){var S,R,T,Q;if(j(P))
{P=P.elm;S=h(P,"colspan");R=h(P,"rowspan");if(S>1||R>1)
{s(P,"rowSpan",1);s(P,"colSpan",1);for(Q=0;Q<S-1;Q++)
{G.insertAfter(e(P),P)}u(O,N,R-1,S)}}})})}function p(V,S,Y){var
P,O,X,W,U,R,T,M,V,N,Q;if(V){pos=F(V);P=pos.x;O=pos.y;X=P+(S-1);W=O+(Y-
1)}else{P=L.x;O=L.y;X=D.x;W=D.y}T=z(P,O);M=z(X,W);if(T&&M&&T.part==M.part)
{C();t();T=z(P,O).elm;s(T,"colSpan",(X-P)+1);s(T,"rowSpan",(W-O)+1);for(R=O;R<=W;R+
+){for(U=P;U<=X;U++){if(!f[R]||!f[R][U]){continue}V=f[R][U].elm;if(V!=T)
{N=c.grep(V.childNodes);d(N,function(Z){T.appendChild(Z)});if(N.length)
{N=c.grep(T.childNodes);Q=0;d(N,function(Z)
{if(Z.nodeName=="BR"&&G.getAttrib(Z,"data-mce-bogus")
&&Q++<N.length-1){T.removeChild(Z)}})}G.remove(V)}}}q()}}function l(Q){var
M,S,P,R,T,U,N,V,O;d(f,function(W,X){d(W,function(Z,Y){if(j(Z))
{Z=Z.elm;T=Z.parentNode;U=A(T,false);M=X;if(Q){return false}}});if(Q){return !
M}});for(R=0;R<f[0].length;R++){if(!f[M][R]){continue}S=f[M][R].elm;if(S!=P){if(!Q)
{O=h(S,"rowspan");if(O>1){s(S,"rowSpan",O+1);continue}}else{if(M>0&&f[M-1][R])
{V=f[M-1][R].elm;O=h(V,"rowSpan");if(O>1)
{s(V,"rowSpan",O+1);continue}}}N=e(S);s(N,"colSpan",S.colSpan);U.appendChild(N);P=S
}}if(U.hasChildNodes()){if(!Q)
{G.insertAfter(U,T)}else{T.parentNode.insertBefore(U,T)}}}function g(N){var
O,M;d(f,function(P,Q){d(P,function(S,R){if(j(S)){O=R;if(N){return false}}});if(N)
{return !O}});d(f,function(S,T){var P,Q,R;if(!S[O]){return}P=S[O].elm;if(P!=M)
{R=h(P,"colspan");Q=h(P,"rowspan");if(R==1){if(!N){G.insertAfter(e(P),P);u(O,T,Q-
1,R)}else{P.parentNode.insertBefore(e(P),P);u(O,T,Q-
1,R)}}else{s(P,"colSpan",P.colSpan+1)}M=P}})}function n(){var
M=[];d(f,function(N,O){d(N,function(Q,P){if(j(Q)&&c.inArray(M,P)===-1)
{d(f,function(T){var R=T[P].elm,S;S=h(R,"colSpan");if(S>1){s(R,"colSpan",S-
1)}else{G.remove(R)}});M.push(P)}})});q()}function m(){var N;function M(Q){var
P,R,O;P=G.getNext(Q,"tr");d(Q.cells,function(S){var T=h(S,"rowSpan");if(T>1)
{s(S,"rowSpan",T-1);R=F(S);u(R.x,R.y,1,1)}});R=F(Q.cells[0]);d(f[R.y],function(S)
{var T;S=S.elm;if(S!=O){T=h(S,"rowSpan");if(T<=1){G.remove(S)}else{s(S,"rowSpan",T-
1)}O=S}})}N=k();d(N.reverse(),function(O){M(O)});q()}function E(){var
M=k();G.remove(M);q();return M}function J(){var M=k();d(M,function(O,N)
{M[N]=A(O,true)});return M}function B(O,N){var P=k(),M=P[N?0:P.length-
1],Q=M.cells.length;d(f,function(S){var R;Q=0;d(S,function(U,T){if(U.real)
{Q+=U.colspan}if(U.elm.parentNode==M){R=1}});if(R){return false}});if(!N)
{O.reverse()}d(O,function(T){var S=T.cells.length,R;for(i=0;i<S;i++)
{R=T.cells[i];s(R,"colSpan",1);s(R,"rowSpan",1)}for(i=S;i<Q;i++)
{T.appendChild(e(T.cells[S-1]))}for(i=Q;i<S;i++){G.remove(T.cells[i])}if(N)
{M.parentNode.insertBefore(T,M)}else{G.insertAfter(T,M)}})}function F(M){var
N;d(f,function(O,P){d(O,function(R,Q){if(R.elm==M){N={x:Q,y:P};return
false}});return !N});return N}function w(M){L=F(M)}function I(){var
O,N,M;N=M=0;d(f,function(P,Q){d(P,function(S,R){var U,T;if(j(S)){S=f[Q][R];if(R>N)
{N=R}if(Q>M){M=Q}if(S.real){U=S.colspan-1;T=S.rowspan-1;if(U){if(R+U>N)
{N=R+U}}if(T){if(Q+T>M){M=Q+T}}}}})});return{x:N,y:M}}function v(S){var
P,O,U,T,N,M,Q,R;D=F(S);if(L&&D)
{P=Math.min(L.x,D.x);O=Math.min(L.y,D.y);U=Math.max(L.x,D.x);T=Math.max(L.y,D.y);N=
U;M=T;for(y=O;y<=M;y++){S=f[y][P];if(!S.real){if(P-(S.colspan-1)<P){P-=S.colspan-
1}}}for(x=P;x<=N;x++){S=f[O][x];if(!S.real){if(O-(S.rowspan-1)<O){O-=S.rowspan-
1}}}for(y=O;y<=T;y++){for(x=P;x<=U;x++){S=f[y][x];if(S.real){Q=S.colspan-
1;R=S.rowspan-1;if(Q){if(x+Q>N){N=x+Q}}if(R){if(y+R>M)
{M=y+R}}}}}G.removeClass(G.select("td.mceSelected,th.mceSelected"),"mceSelected");f
or(y=O;y<=M;y++){for(x=P;x<=N;x++){if(f[y][x]){G.addClass(f[y]
[x].elm,"mceSelected")}}}}}c.extend(this,
{deleteTable:r,split:C,merge:p,insertRow:l,insertCol:g,deleteCols:n,deleteRows:m,cu
tRows:E,copyRows:J,pasteRows:B,getPos:F,setStartCell:w,setEndCell:v})}c.create("tin
ymce.plugins.TablePlugin",{init:function(f,g){var e,k;function j(n){var
m=f.selection,l=f.dom.getParent(n||m.getNode(),"table");if(l){return new
a(l,f.dom,m)}}function h()
{f.getBody().style.webkitUserSelect="";f.dom.removeClass(f.dom.select("td.mceSelect
ed,th.mceSelected"),"mceSelected")}d([["table","table.desc","mceInsertTable",true],
["delete_table","table.del","mceTableDelete"],
["delete_col","table.delete_col_desc","mceTableDeleteCol"],
["delete_row","table.delete_row_desc","mceTableDeleteRow"],
["col_after","table.col_after_desc","mceTableInsertColAfter"],
["col_before","table.col_before_desc","mceTableInsertColBefore"],
["row_after","table.row_after_desc","mceTableInsertRowAfter"],
["row_before","table.row_before_desc","mceTableInsertRowBefore"],
["row_props","table.row_desc","mceTableRowProps",true],
["cell_props","table.cell_desc","mceTableCellProps",true],
["split_cells","table.split_cells_desc","mceTableSplitCells",true],
["merge_cells","table.merge_cells_desc","mceTableMergeCells",true]],function(l)
{f.addButton(l[0],{title:l[1],cmd:l[2],ui:l[3]})});if(!c.isIE)
{f.onClick.add(function(l,m){m=m.target;if(m.nodeName==="TABLE")
{l.selection.select(m);l.nodeChanged()}})}f.onPreProcess.add(function(m,n){var
l,o,p,r=m.dom,q;l=r.select("table",n.node);o=l.length;while(o--)
{p=l[o];r.setAttrib(p,"data-mce-style","");if((q=r.getAttrib(p,"width")))
{r.setStyle(p,"width",q);r.setAttrib(p,"width","")}if((q=r.getAttrib(p,"height")))
{r.setStyle(p,"height",q);r.setAttrib(p,"height","")}}});f.onNodeChange.add(functio
n(m,l,q){var
o;q=m.selection.getStart();o=m.dom.getParent(q,"td,th,caption");l.setActive("table"
,q.nodeName==="TABLE"||!!o);if(o&&o.nodeName==="CAPTION")
{o=0}l.setDisabled("delete_table",!o);l.setDisabled("delete_col",!
o);l.setDisabled("delete_table",!o);l.setDisabled("delete_row",!
o);l.setDisabled("col_after",!o);l.setDisabled("col_before",!
o);l.setDisabled("row_after",!o);l.setDisabled("row_before",!
o);l.setDisabled("row_props",!o);l.setDisabled("cell_props",!
o);l.setDisabled("split_cells",!o);l.setDisabled("merge_cells",!
o)});f.onInit.add(function(m){var
l,p,q=m.dom,n;e=m.windowManager;m.onMouseDown.add(function(r,s){if(s.button!=2)
{h();p=q.getParent(s.target,"td,th");l=q.getParent(p,"table")}});q.bind(m.getDoc(),
"mouseover",function(v){var t,s,u=v.target;if(p&&(n||u!=p)&&(u.nodeName=="TD"||
u.nodeName=="TH")){s=q.getParent(u,"table");if(s==l){if(!n)
{n=j(s);n.setStartCell(p);m.getBody().style.webkitUserSelect="none"}n.setEndCell(u)
}t=m.selection.getSel();try{if(t.removeAllRanges)
{t.removeAllRanges()}else{t.empty()}}catch(r)
{}v.preventDefault()}});m.onMouseUp.add(function(A,B){var
s,u=A.selection,C,D=u.getSel(),r,v,t,z;if(p){if(n)
{A.getBody().style.webkitUserSelect=""}function w(E,G){var F=new
c.dom.TreeWalker(E,E);do{if(E.nodeType==3&&c.trim(E.nodeValue).length!=0){if(G)
{s.setStart(E,0)}else{s.setEnd(E,E.nodeValue.length)}return}if(E.nodeName=="BR")
{if(G){s.setStartBefore(E)}else{s.setEndBefore(E)}return}}while(E=(G?
F.next():F.prev()))}C=q.select("td.mceSelected,th.mceSelected");if(C.length>0)
{s=q.createRng();v=C[0];z=C[C.length-1];w(v,1);r=new
c.dom.TreeWalker(v,q.getParent(C[0],"table"));do{if(v.nodeName=="TD"||
v.nodeName=="TH"){if(!q.hasClass(v,"mceSelected"))
{break}t=v}}while(v=r.next());w(t);u.setRng(s)}A.nodeChanged();p=n=l=null}});m.onKe
yUp.add(function(r,s){h()});if(m&&m.plugins.contextmenu)
{m.plugins.contextmenu.onContextMenu.add(function(t,r,v){var
w,u=m.selection,s=u.getNode()||m.getBody();if(m.dom.getParent(v,"td")||
m.dom.getParent(v,"th")||m.dom.select("td.mceSelected,th.mceSelected").length)
{r.removeAll();if(s.nodeName=="A"&&!m.dom.getAttrib(s,"name"))
{r.add({title:"advanced.link_desc",icon:"link",cmd:m.plugins.advlink?"mceAdvLink":"
mceLink",ui:true});r.add({title:"advanced.unlink_desc",icon:"unlink",cmd:"UnLink"})
;r.addSeparator()}if(s.nodeName=="IMG"&&s.className.indexOf("mceItem")==-1)
{r.add({title:"advanced.image_desc",icon:"image",cmd:m.plugins.advimage?"mceAdvImag
e":"mceImage",ui:true});r.addSeparator()}r.add({title:"table.desc",icon:"table",cmd
:"mceInsertTable",value:
{action:"insert"}});r.add({title:"table.props_desc",icon:"table_props",cmd:"mceInse
rtTable"});r.add({title:"table.del",icon:"delete_table",cmd:"mceTableDelete"});r.ad
dSeparator();w=r.addMenu({title:"table.cell"});w.add({title:"table.cell_desc",icon:
"cell_props",cmd:"mceTableCellProps"});w.add({title:"table.split_cells_desc",icon:"
split_cells",cmd:"mceTableSplitCells"});w.add({title:"table.merge_cells_desc",icon:
"merge_cells",cmd:"mceTableMergeCells"});w=r.addMenu({title:"table.row"});w.add({ti
tle:"table.row_desc",icon:"row_props",cmd:"mceTableRowProps"});w.add({title:"table.
row_before_desc",icon:"row_before",cmd:"mceTableInsertRowBefore"});w.add({title:"ta
ble.row_after_desc",icon:"row_after",cmd:"mceTableInsertRowAfter"});w.add({title:"t
able.delete_row_desc",icon:"delete_row",cmd:"mceTableDeleteRow"});w.addSeparator();
w.add({title:"table.cut_row_desc",icon:"cut",cmd:"mceTableCutRow"});w.add({title:"t
able.copy_row_desc",icon:"copy",cmd:"mceTableCopyRow"});w.add({title:"table.paste_r
ow_before_desc",icon:"paste",cmd:"mceTablePasteRowBefore"}).setDisabled(!
k);w.add({title:"table.paste_row_after_desc",icon:"paste",cmd:"mceTablePasteRowAfte
r"}).setDisabled(!
k);w=r.addMenu({title:"table.col"});w.add({title:"table.col_before_desc",icon:"col_
before",cmd:"mceTableInsertColBefore"});w.add({title:"table.col_after_desc",icon:"c
ol_after",cmd:"mceTableInsertColAfter"});w.add({title:"table.delete_col_desc",icon:
"delete_col",cmd:"mceTableDeleteCol"})}else{r.add({title:"table.desc",icon:"table",
cmd:"mceInsertTable"})}})}if(!c.isIE){function o(){var
r;for(r=m.getBody().lastChild;r&&r.nodeType==3&&!
r.nodeValue.length;r=r.previousSibling){}if(r&&r.nodeName=="TABLE")
{m.dom.add(m.getBody(),"p",null,'<br mce_bogus="1" />')}}if(c.isGecko)
{m.onKeyDown.add(function(s,u){var r,t,v=s.dom;if(u.keyCode==37||u.keyCode==38)
{r=s.selection.getRng();t=v.getParent(r.startContainer,"table");if(t&&s.getBody().f
irstChild==t){if(b(r,t))
{r=v.createRng();r.setStartBefore(t);r.setEndBefore(t);s.selection.setRng(r);u.prev
entDefault()}}}})}m.onKeyUp.add(o);m.onSetContent.add(o);m.onVisualAid.add(o);m.onP
reProcess.add(function(r,t){var
s=t.node.lastChild;if(s&&s.childNodes.length==1&&s.firstChild.nodeName=="BR")
{r.dom.remove(s)}});o()}});d({mceTableSplitCells:function(l)
{l.split()},mceTableMergeCells:function(m){var
n,o,l;l=f.dom.getParent(f.selection.getNode(),"th,td");if(l)
{n=l.rowSpan;o=l.colSpan}if(!f.dom.select("td.mceSelected,th.mceSelected").length)
{/*e.open({url:g+"/merge_cells.htm",width:240+parseInt(f.getLang("table.merge_cells
_delta_width",0)),height:110+parseInt(f.getLang("table.merge_cells_delta_height",0)
),inline:1},{rows:n,cols:o,onaction:function(p)
{m.merge(l,p.cols,p.rows)},plugin_url:g})*/}else{m.merge()}},mceTableInsertRowBefor
e:function(l
){l.insertRow(true)},mceTableInsertRowAfter:function(l)
{l.insertRow()},mceTableInsertColBefore:function(l)
{l.insertCol(true)},mceTableInsertColAfter:function(l)
{l.insertCol()},mceTableDeleteCol:function(l)
{l.deleteCols()},mceTableDeleteRow:function(l)
{l.deleteRows()},mceTableCutRow:function(l)
{k=l.cutRows()},mceTableCopyRow:function(l)
{k=l.copyRows()},mceTablePasteRowBefore:function(l)
{l.pasteRows(k,true)},mceTablePasteRowAfter:function(l)
{l.pasteRows(k)},mceTableDelete:function(l){l.deleteTable()}},function(m,l)
{f.addCommand(l,function(){var n=j();if(n)
{m(n);f.execCommand("mceRepaint");h()}})});d({mceInsertTable:function(l)
{e.open({url:g+"/table.htm",width:400+parseInt(f.getLang("table.table_delta_width",
0)),height:320+parseInt(f.getLang("table.table_delta_height",0)),inline:1},
{plugin_url:g,action:l?l.action:0})},mceTableRowProps:function()
{e.open({url:g+"/row.htm",width:400+parseInt(f.getLang("table.rowprops_delta_width"
,0)),height:295+parseInt(f.getLang("table.rowprops_delta_height",0)),inline:1},
{plugin_url:g})},mceTableCellProps:function()
{e.open({url:g+"/cell.htm",width:400+parseInt(f.getLang("table.cellprops_delta_widt
h",0)),height:295+parseInt(f.getLang("table.cellprops_delta_height",0)),inline:1},
{plugin_url:g})}},function(m,l){f.addCommand(l,function(n,o)
{m(o)})})}});c.PluginManager.add("table",c.plugins.TablePlugin)})(tinymce);
;/**
* editor_plugin_src.js
*
* Copyright 2009, Moxiecode Systems AB
* Released under LGPL License.
*
* License: http://tinymce.moxiecode.com/license
* Contributing: http://tinymce.moxiecode.com/contributing
*/
(function() {
var rootAttributes =
tinymce.explode('id,name,width,height,style,align,class,hspace,vspace,bgcolor,type'
), excludedAttrs = tinymce.makeMap(rootAttributes.join(',')), Node =
tinymce.html.Node,
mediaTypes, scriptRegExp, JSON = tinymce.util.JSON, mimeTypes;
function toArray(obj) {
var undef, out, i;
return out;
}
return obj;
};
tinymce.create('tinymce.plugins.MediaPlugin', {
init : function(ed, url) {
var self = this, lookup = {}, i, y, item, name;
function isMediaImg(node) {
return node && node.nodeName === 'IMG' &&
ed.dom.hasClass(node, 'mceItemMedia');
};
self.editor = ed;
self.url = url;
item = {
name : name,
clsids : tinymce.explode(mediaTypes[i][1] || ''),
mimes : tinymce.explode(mediaTypes[i][2] || ''),
codebase : mediaTypes[i][3]
};
if (type)
lookup[extensions[i]] = type;
}
});
ed.onPreInit.add(function() {
// Allow video elements
ed.schema.addValidElements('object[id|style|width|height|
classid|codebase|*],param[name|value],embed[id|style|width|height|type|src|
*],video[*],audio[*],source[*]');
ed.parser.addNodeFilter('object,embed,video,audio,script,iframe',
function(nodes) {
var i = nodes.length;
while (i--)
self.objectToImg(nodes[i]);
});
while (i--) {
node = nodes[i];
if ((node.attr('class') ||
'').indexOf('mceItemMedia') !== -1)
self.imgToObject(node, args);
}
});
});
ed.onInit.add(function() {
// Display "media" instead of "img" in element path
if (ed.theme && ed.theme.onResolveName) {
ed.theme.onResolveName.add(function(theme,
path_object) {
if (path_object.name === 'img' &&
ed.dom.hasClass(path_object.node, 'mceItemMedia'))
path_object.name = 'media';
});
}
// Register commands
ed.addCommand('mceMedia', function() {
var data, img;
img = ed.selection.getNode();
if (isMediaImg(img)) {
data = JSON.parse(ed.dom.getAttrib(img, 'data-mce-
json'));
if (value)
data[name] = value;
});
data.type =
self.getType(img.className).name.toLowerCase();
}
if (!data) {
data = {
type : 'flash',
video: {sources:[]},
params: {}
};
}
ed.windowManager.open({
file : url + '/media.htm',
width : 476 +
parseInt(ed.getLang('media.delta_width', 0)),
height : 541 +
parseInt(ed.getLang('media.delta_height', 0)),
inline : 1
}, {
plugin_url : url,
data : data
});
});
// Register buttons
ed.addButton('media', {title : 'media.desc', cmd : 'mceMedia'});
if (!url)
return url;
if (force_absolute)
return editor.documentBaseURI.toAbsolute(url);
getInfo : function() {
return {
longname : 'Media',
author : 'Moxiecode Systems AB',
authorurl : 'http://tinymce.moxiecode.com',
infourl :
'http://wiki.moxiecode.com/index.php/TinyMCE:Plugins/media',
version : tinymce.majorVersion + "." + tinymce.minorVersion
};
},
/**
* Converts the JSON data object to an img node.
*/
dataToImg : function(data, force_absolute) {
var self = this, editor = self.editor, baseUri =
editor.documentBaseURI, sources, attrs, img, i;
data.params.src = self.convertUrl(data.params.src,
force_absolute);
attrs = data.video.attrs;
if (attrs)
attrs.src = self.convertUrl(attrs.src, force_absolute);
if (attrs)
attrs.poster = self.convertUrl(attrs.poster,
force_absolute);
sources = toArray(data.video.sources);
if (sources) {
for (i = 0; i < sources.length; i++)
sources[i].src = self.convertUrl(sources[i].src,
force_absolute);
}
img = self.editor.dom.create('img', {
id : data.id,
style : data.style,
align : data.align,
src : self.editor.theme.url + '/img/trans.gif',
'class' : 'mceItemMedia mceItem' +
self.getType(data.type).name,
'data-mce-json' : JSON.serialize(data, "'")
});
return img;
},
/**
* Converts the JSON data object to a HTML string.
*/
dataToHtml : function(data, force_absolute) {
return this.editor.serializer.serialize(this.dataToImg(data,
force_absolute), {force_absolute : force_absolute});
},
/**
* Converts the JSON data object to a HTML string.
*/
htmlToData : function(html) {
var fragment, img, data;
data = {
type : 'flash',
video: {sources:[]},
params: {}
};
fragment = this.editor.parser.parse(html);
img = fragment.getAll('img')[0];
if (img) {
data = JSON.parse(img.attr('data-mce-json'));
data.type =
this.getType(img.attr('class')).name.toLowerCase();
if (value)
data[name] = value;
});
}
return data;
},
/**
* Get type item by extension, class, clsid or mime type.
*
* @method getType
* @param {String} value Value to get type item by.
* @return {Object} Type item object or undefined.
*/
getType : function(value) {
var i, values, typeItem;
// Find type by checking the classes
values = tinymce.explode(value, ' ');
for (i = 0; i < values.length; i++) {
typeItem = this.lookup[values[i]];
if (typeItem)
return typeItem;
}
},
/**
* Converts a tinymce.html.Node image element to video/object/embed.
*/
imgToObject : function(node, args) {
var self = this, editor = self.editor, video, object, embed,
iframe, name, value, data,
source, sources, params, param, typeItem, i, item,
mp4Source, replacement,
posterSrc, style;
flashPlayer = editor.getParam('flash_video_player_url',
self.convertUrl(self.url + '/moxieplayer.swf'));
if (flashPlayer) {
baseUri = editor.documentBaseURI;
data.params.src = flashPlayer;
if (value.length > 0)
flashVarsOutput += (flashVarsOutput ? '&'
: '') + name + '=' + escape(value);
});
if (flashVarsOutput.length)
data.params.flashvars = flashVarsOutput;
params = editor.getParam('flash_video_player_params',
{
allowfullscreen: true,
allowscriptaccess: true
});
data = JSON.parse(node.attr('data-mce-json'));
typeItem = this.getType(node.attr('class'));
style = node.attr('data-mce-style')
if (!style) {
style = node.attr('style');
if (style)
style =
editor.dom.serializeStyle(editor.dom.parseStyle(style, 'img'));
}
// Handle iframe
if (typeItem.name === 'Iframe') {
replacement = new Node('iframe', 1);
tinymce.each(rootAttributes, function(name) {
var value = node.attr(name);
replacement.attr({
style: style,
src: data.params.src
});
node.replace(replacement);
return;
}
// Handle scripts
if (this.editor.settings.media_use_script) {
replacement = new Node('script', 1).attr('type',
'text/javascript');
value = new Node('#text', 3);
value.value = 'write' + typeItem.name + '(' +
JSON.serialize(tinymce.extend(data.params, {
width: node.attr('width'),
height: node.attr('height')
})) + ');';
replacement.append(value);
node.replace(replacement);
return;
}
if (!sources[0].type) {
video.attr('src', sources[0].src);
sources.splice(0, 1);
}
tinymce.each(rootAttributes, function(name) {
if (data[name] && name != 'type')
object.attr(name, data[name]);
});
// Add params
for (name in data.params) {
param = new Node('param', 1);
param.shortEnded = true;
value = data.params[name];
tinymce.each(rootAttributes, function(name) {
if (data[name] && name != 'type')
embed.attr(name, data[name]);
});
object.append(embed);
}
if (video) {
// Insert raw HTML
if (data.video_html) {
value = new Node('#text', 3);
value.raw = true;
value.value = data.video_html;
video.append(value);
}
}
if (video || object)
node.replace(video || object);
else
node.remove();
},
/**
* Converts a tinymce.html.Node video/object/embed to an img element.
*
* The video/object/embed will be converted into an image placeholder
with a JSON data attribute like this:
* <img class="mceItemMedia mceItemFlash" width="100" height="100"
data-mce-json="{..}" />
*
* The JSON structure will be like this:
* {'params':
{'flashvars':'something','quality':'high','src':'someurl'}, 'video':{'sources':
[{src: 'someurl', type: 'video/mp4'}]}}
*/
objectToImg : function(node) {
var object, embed, video, iframe, img, name, id, width, height,
style, i, html,
param, params, source, sources, data, type, lookup =
this.lookup,
matches, attrs, urlConverter =
this.editor.settings.url_converter,
urlConverterScope =
this.editor.settings.url_converter_scope;
function getInnerHTML(node) {
return new tinymce.html.Serializer({
inner: true,
validate: false
}).serialize(node);
};
if (!matches)
return;
type = matches[1];
data = {video : {}, params : JSON.parse(matches[2])};
width = data.params.width;
height = data.params.height;
}
// Video element
name = node.name;
if (name === 'video') {
video = node;
object = node.getAll('object')[0];
embed = node.getAll('embed')[0];
width = video.attr('width');
height = video.attr('height');
id = video.attr('id');
data.video = {attrs : {}, sources : []};
source = node.attr('src');
if (source)
data.video.sources.push({src :
urlConverter.call(urlConverterScope, source, 'src', 'video')});
data.video.sources.push({
src: urlConverter.call(urlConverterScope,
source.attr('src'), 'src', 'source'),
type: source.attr('type'),
media: source.attr('media')
});
}
// Object element
if (node.name === 'object') {
object = node;
embed = node.getAll('embed')[0];
}
// Embed element
if (node.name === 'embed')
embed = node;
// Iframe element
if (node.name === 'iframe') {
iframe = node;
type = 'Iframe';
}
if (object) {
// Get width/height
width = width || object.attr('width');
height = height || object.attr('height');
style = style || object.attr('style');
id = id || object.attr('id');
if (!excludedAttrs[name])
data.params[name] = param.attr('value');
}
if (embed) {
// Get width/height
width = width || embed.attr('width');
height = height || embed.attr('height');
style = style || embed.attr('style');
id = id || embed.attr('id');
// Get all embed attributes
for (name in embed.attributes.map) {
if (!excludedAttrs[name] && !data.params[name])
data.params[name] = embed.attributes.map[name];
}
}
if (iframe) {
// Get width/height
width = iframe.attr('width');
height = iframe.attr('height');
style = style || iframe.attr('style');
id = iframe.attr('id');
tinymce.each(rootAttributes, function(name) {
img.attr(name, iframe.attr(name));
});
if (video)
type = lookup.video.name;
// Remove embed
if (embed)
embed.remove();
// Serialize the inner HTML of the object element
if (object) {
html = getInnerHTML(object.remove());
if (html)
data.object_html = html;
}
if (html)
data.video_html = html;
}
// Register plugin
tinymce.PluginManager.add('media', tinymce.plugins.MediaPlugin);
})();;/**
* editor_plugin_src.js
*
* Copyright 2009, Moxiecode Systems AB
* Released under LGPL License.
*
* License: http://tinymce.moxiecode.com/license
* Contributing: http://tinymce.moxiecode.com/contributing
*/
(function() {
var each = tinymce.each,
defs = {
paste_auto_cleanup_on_paste : true,
paste_enable_default_filters : true,
paste_block_drop : false,
paste_retain_style_properties : "none",
paste_strip_class_attributes : "mso",
paste_remove_spans : false,
paste_remove_styles : false,
paste_remove_styles_if_webkit : true,
paste_convert_middot_lists : true,
paste_convert_headers_to_strong : false,
paste_dialog_width : "450",
paste_dialog_height : "400",
paste_text_use_dialog : false,
paste_text_sticky : false,
paste_text_sticky_default : false,
paste_text_notifyalways : false,
paste_text_linebreaktype : "p",
paste_text_replacements : [
[/\u2026/g, "..."],
[/[\x93\x94\u201c\u201d]/g, '"'],
[/[\x60\x91\x92\u2018\u2019]/g, "'"]
]
};
tinymce.create('tinymce.plugins.PastePlugin', {
init : function(ed, url) {
var t = this;
t.editor = ed;
t.url = url;
ed.onKeyDown.addToTop(function(ed, e) {
// Block ctrl+v from adding an undo level since the default
logic in tinymce.Editor will add that
if (((tinymce.isMac ? e.metaKey : e.ctrlKey) && e.keyCode
== 86) || (e.shiftKey && e.keyCode == 45))
return false; // Stop other listeners
});
// Serialize content
o.content = ed.serializer.serialize(o.node, {
getInner : 1,
forced_root_block: '' // default behavior is to wrap content with a <p>
tag - not desirable when pasting text
});
if (!getParam(ed, "paste_text_sticky")) {
ed.pasteAsPlainText = false;
ed.controlManager.setActive("pastetext",
false);
}
} else {
t._insert(o.content);
}
}
if (!getParam(ed, "paste_text_use_dialog")) {
ed.addCommand('mcePasteText', function(u, v) {
var cookie = tinymce.util.Cookie;
ed.pasteAsPlainText = !ed.pasteAsPlainText;
ed.controlManager.setActive('pastetext',
ed.pasteAsPlainText);
if ((ed.pasteAsPlainText) && (!
cookie.get("tinymcePasteText"))) {
if (getParam(ed, "paste_text_sticky")) {
ed.windowManager.alert(ed.translate('paste.plaintext_mode_sticky'));
} else {
ed.windowManager.alert(ed.translate('paste.plaintext_mode_sticky'));
}
if (!getParam(ed, "paste_text_notifyalways")) {
cookie.set("tinymcePasteText", "1", new
Date(new Date().getFullYear() + 1, 12, 31))
}
}
});
}
if (ed.pasteAsPlainText) {
e.preventDefault();
process({content :
textContent.replace(/\r?\n/g, '<br />')});
return;
}
}
if (dom.get('_mcePaste'))
return;
if (tinymce.isIE) {
// Store away the old range
oldRng = sel.getRng();
// Remove container
dom.remove(n);
process({content : h});
ed.onInit.add(function() {
ed.controlManager.setActive("pastetext",
ed.pasteAsPlainText);
return false;
});
}
});
getInfo : function() {
return {
longname : 'Paste text/word',
author : 'Moxiecode Systems AB',
authorurl : 'http://tinymce.moxiecode.com',
infourl :
'http://wiki.moxiecode.com/index.php/TinyMCE:Plugins/paste',
version : tinymce.majorVersion + "." + tinymce.minorVersion
};
},
_preProcess : function(pl, o) {
var ed = this.editor,
h = o.content,
grep = tinymce.grep,
explode = tinymce.explode,
trim = tinymce.trim,
len, stripClass;
function process(items) {
each(items, function(v) {
// Remove or replace
if (v.constructor == RegExp)
h = h.replace(v, '');
else
h = h.replace(v[0], v[1]);
});
}
if (ed.settings.paste_enable_default_filters == false) {
return;
}
if (getParam(ed, "paste_convert_headers_to_strong")) {
h = h.replace(/<p [^>]*class="?MsoHeading"?
[^>]*>(.*?)<\/p>/gi, "<p><strong>$1</strong></p>");
}
if (getParam(ed, "paste_convert_middot_lists")) {
process([
[/<!--\[if !supportLists\]-->/gi,
'$&__MCE_ITEM__'], // Convert supportLists to a list
item marker
[/(<span[^>]+(?:mso-list:|:\s*symbol)[^>]
+>)/gi, '$1__MCE_ITEM__'], // Convert mso-list and symbol spans to item
markers
[/(<p[^>]+(?:MsoListParagraph)[^>]+>)/gi,
'$1__MCE_ITEM__'] // Convert mso-list and symbol paragraphs to
item markers (FF)
]);
}
process([
// Word comments like conditional comments etc
/<!--[\s\S]+?-->/gi,
process([
// Convert <span style="mso-
spacerun:yes">___</span> to string of alternating breaking/non-breaking spaces of
same length
[/<span\s+style\s*=\s*"\s*mso-
spacerun\s*:\s*yes\s*;?\s*"\s*>([\s\u00a0]*)<\/span>/gi,
function(str, spaces) {
return (spaces.length > 0)?
spaces.replace(/./, "
").slice(Math.floor(spaces.length/2)).split("").join("\u00a0") : "";
}
],
function ensureUnits(v) {
return v + ((v !== "0")
&& (/\d$/.test(v)))? "px" : "";
}
if (parts.length == 2) {
name =
parts[0].toLowerCase();
value =
parts[1].toLowerCase();
// Translate certain MS
Office styles into their CSS equivalents
switch (name) {
case "mso-padding-
alt":
case "mso-padding-
top-alt":
case "mso-padding-
right-alt":
case "mso-padding-
bottom-alt":
case "mso-padding-
left-alt":
case "mso-margin-
alt":
case "mso-margin-
top-alt":
case "mso-margin-
right-alt":
case "mso-margin-
bottom-alt":
case "mso-margin-
left-alt":
case "mso-table-
layout-alt":
case "mso-height":
case "mso-width":
case "mso-
vertical-align-alt":
n[i++] =
name.replace(/^mso-|-alt$/g, "") + ":" + ensureUnits(value);
return;
case "horiz-
align":
n[i++] =
"text-align:" + value;
return;
case "vert-align":
n[i++] =
"vertical-align:" + value;
return;
case "font-color":
case "mso-
foreground":
n[i++] =
"color:" + value;
return;
case "mso-
background":
case "mso-
highlight":
n[i++] =
"background:" + value;
return;
case "mso-default-
height":
n[i++] =
"min-height:" + ensureUnits(value);
return;
case "mso-default-
width":
n[i++] =
"min-width:" + ensureUnits(value);
return;
case "mso-padding-
between-alt":
n[i++] =
"border-collapse:separate;border-spacing:" + ensureUnits(value);
return;
case "text-line-
through":
if ((value
== "single") || (value == "double")) {
n[i++]
= "text-decoration:line-through";
}
return;
case "mso-zero-
height":
if (value ==
"yes") {
n[i++]
= "display:none";
}
return;
}
// Eliminate all MS
Office style definitions that have no CSS equivalent by examining the first
characters in the name
if (/^(mso|column|font-
emph|lang|layout|line-break|list-image|nav|panose|punct|row|ruby|sep|size|src|tab-|
table-border|text-(?!align|decor|indent|trans)|top-bar|version|vnd|word-
break)/.test(name)) {
return;
}
// If it reached this
point, it must be a valid CSS style
n[i++] = name + ":" +
parts[1]; // Lower-case name, but keep value case
}
});
process([
// Copy paste from Java like Open Office will produce this
junk on FF
[/Version:[\d.]
+\nStartHTML:\d+\nEndHTML:\d+\nStartFragment:\d+\nEndFragment:\d+/gi, '']
]);
o.content = h;
},
/**
* Various post process items.
*/
_postProcess : function(pl, o) {
var t = this, ed = t.editor, dom = ed.dom, styleProps;
if (ed.settings.paste_enable_default_filters == false) {
return;
}
if (o.wordContent) {
// Remove named anchors or TOC links
each(dom.select('a', o.node), function(a) {
if (!a.href || a.href.indexOf('#_Toc') != -1)
dom.remove(a, 1);
});
if (getParam(ed, "paste_convert_middot_lists")) {
t._convertLists(pl, o);
}
// Process styles
styleProps = getParam(ed, "paste_retain_style_properties");
// retained properties
if (sv) {
newStyle[sp] = sv;
npc++;
}
}
}
/**
* Converts the most common bullet and number formats in Office into a
real semantic UL/LI list.
*/
_convertLists : function(pl, o) {
var dom = pl.editor.dom, listElm, li, lastMargin = -1, margin,
levels = [], lastType, html;
val = p.innerHTML.replace(/<\/?\w+[^>]*>/gi,
'').replace(/ /g, '\u00a0');
html = p.innerHTML;
lastMargin = margin;
lastType = type;
} else
listElm = lastMargin = 0; // End list element
});
/**
* Inserts the specified contents at the caret position.
*/
_insert : function(h, skip_undo) {
var ed = this.editor, r = ed.selection.getRng();
/**
* Instead of the old plain text method which tried to re-create a
paste operation, the
* new approach adds a plain text mode toggle switch that changes the
behavior of paste.
* This function is passed the same input that the regular paste plugin
produces.
* It performs additional scrubbing and produces (and inserts) the
plain text.
* This approach leverages all of the great existing functionality in
the paste
* plugin, and requires minimal changes to add the new functionality.
* Speednet - June 2009
*/
_insertPlainText : function(ed, dom, h) {
var i, len, pos, rpos, node, breakElms, before, after,
w = ed.getWin(),
d = ed.getDoc(),
sel = ed.selection,
is = tinymce.is,
inArray = tinymce.inArray,
linebr = getParam(ed, "paste_text_linebreaktype"),
rl = getParam(ed, "paste_text_replacements");
function process(items) {
each(items, function(v) {
if (v.constructor == RegExp)
h = h.replace(v, "");
else
h = h.replace(v[0], v[1]);
});
};
process([
[/<\/(?:p|h[1-6]|ul|ol|dl|table|div|blockquote|
fieldset|pre|address|center)>/gi, "\n\n"], // Block tags get a blank
line after them
[/<br[^>]*>|<\/tr>/gi, "\n"], //
Single linebreak for <br /> tags and table rows
[/<\/t[dh]>\s*<t[dh][^>]*>/gi, "\t"], //
Table cells get tabs betweem them
/<[a-z!\/?][^>]*>/gi,
// Delete all remaining tags
[/ /gi, " "],
// Convert non-break spaces to regular spaces (remember, *plain text*)
[/(?:(?!\n)\s)*(\n+)(?:(?!\n)\s)*/gi, "$1"], //
Cool little RegExp deletes whitespace around linebreak chars.
[/\n{3,}/g, "\n\n"],
// Max. 2 consecutive linebreaks
/^\s+|\s+$/g
// Trim the front & back
]);
h = dom.decode(tinymce.html.Entities.encodeRaw(h));
breakElms[breakElms.length] = node;
}
} while (node = node.parentNode);
if (pos == rpos) {
h = before + after + h.substring(pos+7);
}
else {
h = before + h.substring(pos+4, rpos+4) +
after + h.substring(rpos+7);
}
}
}
sel.select(marker, false);
d.execCommand("Delete", false, null);
marker = null;
/**
* This method will open the old style paste dialogs. Some users might
want the old behavior but still use the new cleanup engine.
*/
_legacySupport : function() {
var t = this, ed = t.editor;
if (getParam(ed, "paste_text_use_dialog")) {
ed.addCommand("mcePasteText", function() {
ed.windowManager.open({
file : t.url + "/pastetext.htm",
width: parseInt(getParam(ed,
"paste_dialog_width")),
height: parseInt(getParam(ed,
"paste_dialog_height")),
inline : 1
});
});
}
// Register plugin
tinymce.PluginManager.add("paste", tinymce.plugins.PastePlugin);
})();
;// Define variables needed by core/core.js.
var _wrs_int_conf_file = "integration/configurationjs.php";
var _wrs_int_conf_async = true;
var _wrs_baseURL;
/* Vars */
var _wrs_int_editorIcon;
var _wrs_int_CASIcon;
var _wrs_int_temporalIframe;
var _wrs_int_temporalElementIsIframe;
var _wrs_int_window;
var _wrs_int_window_opened = false;
var _wrs_int_temporalImageResizing;
var _wrs_int_wirisProperties;
var _wrs_int_directionality;
// Custom Editors.
var _wrs_int_customEditors = {chemistry : {name: 'Chemistry', toolbar :
'chemistry', icon : 'chem.png', enabled : false, confVariable :
'_wrs_conf_chemEnabled'}}
/* Plugin integration */
(function () {
tinymce.create('tinymce.plugins.tiny_mce_wiris', {
init: function (editor, url) {
// Including core.js
// First of all: recalculating _wrs_conf_path if WIRIS plugin has been
loaded as an external plugin.
// Cant access editor params since now.
if (typeof editor.getParam('external_plugins') != 'undefined' && typeof
editor.getParam('external_plugins')['tiny_mce_wiris'] != 'undefined') {
var external_url = editor.getParam('external_plugins')
['tiny_mce_wiris'];
_wrs_conf_path =
external_url.substring(0,external_url.lastIndexOf("/") + 1)
// New int path.
// Absolute URL path needed: integration files are in the same
external_url domain.
_wrs_int_conf_file = _wrs_conf_path.split('/')[0] + '//' +
_wrs_conf_path.split('/')[2] + _wrs_int_conf_file;
_wrs_int_path = wrs_intPath(_wrs_int_conf_file, _wrs_conf_path);
}
if (typeof _wrs_conf_hostPlatform != 'undefined' &&
_wrs_conf_hostPlatform == 'Moodle' && _wrs_conf_versionPlatform < 2013111800) {
_wrs_int_editorIcon = _wrs_conf_path +
'icons/tinymce3/formula.png';
_wrs_int_CASIcon = _wrs_conf_path + 'icons/tinymce3/cas.png';
} else {
_wrs_int_editorIcon = _wrs_conf_path + 'icons/formula.png';
_wrs_int_CASIcon = _wrs_conf_path + 'icons/cas.png';
}
var element;
function whenDocReady() {
if (window.wrs_initParse && typeof _wrs_conf_plugin_loaded !=
'undefined') {
var language = editor.getParam('language');
_wrs_int_directionality =
editor.getParam('directionality');
if ('wiriseditorparameters' in editor.settings) {
_wrs_int_wirisProperties =
editor.settings['wiriseditorparameters'];
} else {
_wrs_int_wirisProperties = {
'bgColor': editor.settings['wirisimagebgcolor'],
'symbolColor':
editor.settings['wirisimagesymbolcolor'],
'transparency':
editor.settings['wiristransparency'],
'fontSize': editor.settings['wirisimagefontsize'],
'numberColor':
editor.settings['wirisimagenumbercolor'],
'identColor':
editor.settings['wirisimageidentcolor'],
'color' : editor.settings['wirisimagecolor'],
'dpi' : editor.settings['wirisdpi'],
'backgroundColor' :
editor.settings['wirisimagebackgroundcolor'],
'fontFamily' : editor.settings['wirisfontfamily']
};
}
if (editor.settings['wirisformulaeditorlang']) {
language = editor.settings['wirisformulaeditorlang'];
}
if (!editor.inline) {
element = editor.getContentAreaContainer().firstChild;
wrs_initParseImgToIframes(element.contentWindow);
wrs_addIframeEvents(element, function (iframe, element)
{
wrs_int_doubleClickHandler(editor, iframe, true,
element);
}, wrs_int_mousedownHandler, wrs_int_mouseupHandler);
// Attaching obsevers to wiris images.
if (typeof wrs_observer != 'undefined') {
Array.prototype.forEach.call(element.contentDocument.getElementsByClassName(_wrs_co
nf_imageClassName), function(wirisImages){
wrs_observer.observe(wirisImages,
wrs_observer_config);
});
}
} else { // Inline.
element = editorElement;
wrs_addElementEvents(element, function (div, element) {
wrs_int_doubleClickHandler(editor, div, false,
element);
}, wrs_int_mousedownHandler, wrs_int_mouseupHandler);
// Attaching obsevers to wiris images.
Array.prototype.forEach.call(document.getElementsByClassName(_wrs_conf_imageClassNa
me), function(wirisImages) {
wrs_observer.observe(wirisImages,
wrs_observer_config);
});
}
}
else {
setTimeout(whenDocReady, 50);
}
}
whenDocReady();
}
if ('onInit' in editor) {
editor.onInit.add(onInit);
}
else {
editor.on('init', function () {
onInit(editor);
});
}
if (editor.settings['wirisformulaeditorlang']) {
language = editor.settings['wirisformulaeditorlang'];
}
params.content = wrs_endParse(params.content,
_wrs_int_wirisProperties, language);
}
}
if ('onSaveContent' in editor) {
editor.onSaveContent.add(onSave);
}
else {
editor.on('saveContent', function (params) {
onSave(editor, params);
});
}
if ('onGetContent' in editor) {
editor.onGetContent.add(onSave);
} else {
editor.on('getContent', function(params) {
onSave(editor, params);
});
}
if ('onBeforeSetContent' in editor) {
editor.onBeforeSetContent.add(function(e,params) {
if (_wrs_int_initParsed) {
params.content = wrs_initParse(params.content,
editor.getParam('language'));
}
});
} else {
editor.on('beforeSetContent', function(params){
if (_wrs_int_initParsed) {
params.content = wrs_initParse(params.content,
editor.getParam('language'));
}
});
}
if (_wrs_int_conf_async || _wrs_conf_editorEnabled) {
editor.addCommand('tiny_mce_wiris_openFormulaEditor', function () {
if ('wiriseditorparameters' in editor.settings) {
_wrs_int_wirisProperties =
editor.settings['wiriseditorparameters'];
} else {
_wrs_int_wirisProperties = {
'bgColor': editor.settings['wirisimagebgcolor'],
'symbolColor':
editor.settings['wirisimagesymbolcolor'],
'transparency': editor.settings['wiristransparency'],
'fontSize': editor.settings['wirisimagefontsize'],
'numberColor':
editor.settings['wirisimagenumbercolor'],
'identColor': editor.settings['wirisimageidentcolor'],
'color' : editor.settings['wirisimagecolor'],
'dpi' : editor.settings['wirisdpi'],
'backgroundColor' :
editor.settings['wirisimagebackgroundcolor'],
'fontFamily' : editor.settings['wirisfontfamily']
};
}
if (editor.settings['wirisformulaeditorlang']) {
language = editor.settings['wirisformulaeditorlang'];
}
editor.addButton('tiny_mce_wiris_formulaEditor', {
title: 'Math editor',
cmd: 'tiny_mce_wiris_openFormulaEditor',
image: _wrs_int_editorIcon
});
}
if (_wrs_int_conf_async || _wrs_conf_CASEnabled) {
editor.addCommand('tiny_mce_wiris_openCAS', function () {
var language = editor.settings.language;
if (editor.settings['wirisformulaeditorlang']) {
language = editor.settings['wirisformulaeditorlang'];
}
editor.addButton('tiny_mce_wiris_CAS', {
title: 'Calculator',
cmd: 'tiny_mce_wiris_openCAS',
image: _wrs_int_CASIcon
});
}
if (editor.settings['wirisformulaeditorlang']) {
language =
editor.settings['wirisformulaeditorlang'];
}
wrs_int_enableCustomEditor(key);
wrs_int_openNewFormulaEditor(element, language,
editor.inline ? false : true);
});
var imagePath;
if (typeof _wrs_conf_hostPlatform != 'undefined' &&
_wrs_conf_hostPlatform == 'Moodle' && _wrs_conf_versionPlatform < 2013111800) {
imagePath = _wrs_conf_path + 'icons/tinymce3/' +
_wrs_int_customEditors[key].icon;
} else {
imagePath = _wrs_conf_path + 'icons/' +
_wrs_int_customEditors[key].icon;
}
editor.addButton('tiny_mce_wiris_formulaEditor' +
_wrs_int_customEditors[key].name, {
title: _wrs_int_customEditors[key].name + ' editor',
cmd: cmd,
image: imagePath
});
}
}
}
},
// All versions.
getInfo: function () {
return {
longname : 'tiny_mce_wiris',
author : 'Maths for More',
authorurl : 'http://www.wiris.com',
infourl : 'http://www.wiris.com',
version : '1.0'
};
}
});
tinymce.PluginManager.add('tiny_mce_wiris', tinymce.plugins.tiny_mce_wiris);
})();
/**
* Opens formula editor.
* @param object element Target
* @param string language
* @param bool isIframe
*/
function wrs_int_openNewFormulaEditor(element, language, isIframe) {
if (_wrs_int_window_opened) {
_wrs_int_window.focus();
}
else {
_wrs_int_window_opened = true;
_wrs_isNewElement = true;
_wrs_int_temporalIframe = element;
_wrs_int_temporalElementIsIframe = isIframe;
_wrs_int_window = wrs_openEditorWindow(language, element, isIframe);
}
}
/**
* Opens CAS.
* @param object element Target
* @param string language
* @param bool isIframe
*/
function wrs_int_openNewCAS(element, language, isIframe) {
if (_wrs_int_window_opened) {
_wrs_int_window.focus();
}
else {
_wrs_int_window_opened = true;
_wrs_isNewElement = true;
_wrs_int_temporalIframe = element;
_wrs_int_temporalElementIsIframe = isIframe;
_wrs_int_window = wrs_openCASWindow(element, isIframe, language);
}
}
/**
* Handles a double click on the target.
* @param object editor tinymce active editor
* @param object target Target
* @param object element Element double clicked
* @param bool isIframe target is an iframe or not
*/
function wrs_int_doubleClickHandler(editor, target, isIframe, element) {
// This loop allows the double clicking on the formulas represented with
span's.
if (!_wrs_int_window_opened) {
var language = editor.settings.language;
if (editor.settings['wirisformulaeditorlang']) {
language = editor.settings['wirisformulaeditorlang'];
}
_wrs_temporalImage = element;
wrs_int_openExistingFormulaEditor(target, isIframe, language);
}
else {
_wrs_int_window.focus();
}
}
else if (wrs_containsClass(element, 'Wiriscas')) {
if (!_wrs_int_window_opened) {
var language = editor.settings.language;
if (editor.settings['wirisformulaeditorlang']) {
language = editor.settings['wirisformulaeditorlang'];
}
_wrs_temporalImage = element;
wrs_int_openExistingCAS(target, isIframe, language);
}
else {
_wrs_int_window.focus();
}
}
}
}
/**
* Opens formula editor to edit an existing formula.
* @param object element Target
* @param bool isIframe
*/
function wrs_int_openExistingFormulaEditor(element, isIframe, language) {
_wrs_int_window_opened = true;
_wrs_isNewElement = false;
_wrs_int_temporalIframe = element;
_wrs_int_temporalElementIsIframe = isIframe;
_wrs_int_window = wrs_openEditorWindow(language, element, isIframe);
}
/**
* Opens CAS to edit an existing formula.
* @param object element Target
* @param bool isIframe
* @param string language
*/
function wrs_int_openExistingCAS(element, isIframe, language) {
_wrs_int_window_opened = true;
_wrs_isNewElement = false;
_wrs_int_temporalIframe = element;
_wrs_int_temporalElementIsIframe = isIframe;
_wrs_int_window = wrs_openCASWindow(element, isIframe, language);
}
/**
* Handles a mouse down event on the iframe.
* @param object iframe Target
* @param object element Element mouse downed
*/
function wrs_int_mousedownHandler(iframe, element) {
if (element.nodeName.toLowerCase() == 'img') {
if (wrs_containsClass(element, 'Wirisformula') ||
wrs_containsClass(element, 'Wiriscas')) {
_wrs_int_temporalImageResizing = element;
}
}
}
/**
* Handles a mouse up event on the iframe.
*/
function wrs_int_mouseupHandler() {
if (_wrs_int_temporalImageResizing) {
setTimeout(function () {
wrs_fixAfterResize(_wrs_int_temporalImageResizing);
}, 10);
}
}
/**
* Calls wrs_updateFormula with well params.
* @param string mathml
*/
function wrs_int_updateFormula(mathml, editMode, language) {
// Var _wrs_int_wirisProperties contains some js render params. Since mathml
can support render params, js params should be send only to editor, not to render.
if (_wrs_int_temporalElementIsIframe) {
wrs_updateFormula(_wrs_int_temporalIframe.contentWindow,
_wrs_int_temporalIframe.contentWindow, mathml, {}, editMode, language);
}
else {
wrs_updateFormula(_wrs_int_temporalIframe, window, mathml, {}, editMode,
language);
}
/**
* Calls wrs_updateCAS with well params.
* @param string appletCode
* @param string image
* @param int width
* @param int height
*/
function wrs_int_updateCAS(appletCode, image, width, height) {
if (_wrs_int_temporalElementIsIframe) {
wrs_updateCAS(_wrs_int_temporalIframe.contentWindow,
_wrs_int_temporalIframe.contentWindow, appletCode, image, width, height);
} else {
wrs_updateCAS(_wrs_int_temporalIframe, window, appletCode, image, width,
height);
}
}
/**
* Handles window closing.
*/
function wrs_int_notifyWindowClosed() {
_wrs_int_window_opened = false;
}
;var sTinymceOpts = {};
function sTinyMceIsIE10(){
// TRUE if user is using IE10
var t = tinymce, d = document, na = navigator, ua = na.userAgent;
return !t.isWebKit && !t.isOpera && (/MSIE/gi).test(ua) && /MSIE [10]/.test(ua)
&& (/Explorer/gi).test(na.appName);
}
Drupal.behaviors.s_tinymce = function(context) {
// no settings
if(!Drupal.settings.s_tinymce)
return;
if(!needs_config)
return;
}
}
//if the html button is active, don't reload this, we don't need it
if($('#tinymce-toggle-html', context).hasClass('tinymce-toggle-active'))
return;
// if all of the potential rich text fields have been processed, then we don't
need/want to process them again
if(!textFieldIds.length){
return;
}
//tinyMCE.get(editor_id).save();
tinyMCE.execCommand('mceRemoveControl', false, editor_id);
$('#'+editor_id).focus();
$("#tinymce-toolbar-placeholder",form).css('display','block');
editorTextarea.css('visibility', 'visible').focus();
$(".tinymce-ext-buttons",form).hide();
$("#topic-content-select-wrapper",form).hide();
if(editorTextarea.closest('.s-tme-with-attachments')){
// if the rich text has an associated attachment row, add a filler div for
the HTML editor
var attachmentRow = editorTextarea.siblings('.s-tme-attachment-row');
if(!attachmentRow.length){
var attachmentRow = $('<div/>').addClass('s-tme-attachment-row');
attachmentRow.insertAfter(editorTextarea);
}
attachmentRow.show();
}
$(this).addClass('tinymce-toggle-active');
$(this).siblings(".tinymce-visual-btn").removeClass('tinymce-toggle-active');
sPopupsResizeCenter();
});
});
visualToggleBtn.each(function(){
$(this).unbind('click').bind('click',function() {
$("#tinymce-toolbar-placeholder",form).hide();
editorTextarea.css('visibility', 'hidden');
$(".tinymce-ext-buttons",form).show();
$("#topic-content-select-wrapper",form).show();
if(editorTextarea.closest('.s-tme-with-attachments')){
// if the rich text has an associated attachment row, add a filler div for
the HTML editor
editorTextarea.siblings('.s-tme-attachment-row').hide();
}
sTinymcePopup.updateEditorHeight();
$(this).addClass('tinymce-toggle-active');
$(this).siblings(".tinymce-html-btn").removeClass('tinymce-toggle-active');
sPopupsResizeCenter();
});
});
htmlToggleBtn.add(visualToggleBtn).tipsy({
gravity: 's',
title: function(){
return $(this).attr('original-title');
}
});
$(".scontent-media-insert",context).each(function(){
$(this)
.unbind('click')
.bind('click',function(){
tinyMCE.activeEditor.execCommand('sContentMediaInsert');
});
});
$(".scontent-formula-insert",context).each(function(){
$(this)
.unbind('click')
.bind('click',function(){
tinyMCE.activeEditor.execCommand('sContentFormulaInsert');
});
});
$(".scontent-latex-insert",context).each(function(){
$(this)
.unbind('click')
.bind('click',function(){
tinyMCE.activeEditor.execCommand('sContentLatexInsert');
});
});
$(document).data('sTinymcePopupActiveEditors',textFieldIds.join(","));
sTinymceInit({mode: 'none'});
$
(document).unbind('popups_open_path_done.s_tinymce').bind('popups_open_path_done.s_
tinymce',function() {
var active_editor_id = $(document).data('sTinymcePopupActiveEditors');
if(!active_editor_id)
return;
sTinymcePopup.initializeEditors(textFieldIds, context);
});
// get the active editor ids, match then with the name attributes
// and then inject editor content into the formData array
tinyMCE.triggerSave();
if(editor_ids.length==0)
return;
$('textarea',$form).each(function(){
var txt_id = $(this).attr('id');
if( $.inArray( txt_id , editor_ids ) != -1 ){
var txt_name = $(this).attr('name');
editor_names.push(txt_name);
}
});
if(editor_names.length==0)
return;
});
$(document).bind('popups_before_remove',function(event,popup,nextActivePopup) {
// only destory if active editor is in currently closing popup
if( typeof popup =='object' && popup.id && typeof tinyMCE == 'object' &&
tinyMCE.activeEditor
&& tinyMCE.activeEditor.s_tinymce_popup == popup.id) {
var editor_id = tinyMCE.activeEditor.editorId;
tinyMCE.activeEditor.execCommand('sContentRemovePopups');
tinyMCE.execCommand('mceFocus', false, editor_id );
tinyMCE.execCommand('mceRemoveControl', false, editor_id );
$(document).data('sTinymcePopupActiveEditors',false);
Drupal.settings.s_tinymce = {};
}
});
} else {
// in-page loading
function editorStripInlineImages(editor) {
editor.onPaste.add(function(ed) {
ed._itemPasted = true;
});
editor.onChange.add(function(ed) {
if (!ed._itemPasted) {
return;
}
ed._itemPasted = null;
var $div = $(document.createElement('div'));
$div.html(ed.getContent());
var inlineMatchStr = "data:image/";
//for some reason [src^="data:image/"] does not work in IE10
var $inlineImgs = $div.find('[src]').filter(function() {
return this.src.substring(0, inlineMatchStr.length).toLowerCase() ===
inlineMatchStr;
});
if (!$inlineImgs.length) {
return;
}
$inlineImgs.remove();
ed.setContent($div.html());
});
}
sTinymceOpts = {
mode: 'exact',
theme: 'advanced',
language: tme_lang,
cache_string: Drupal.settings.s_tinymce && Drupal.settings.s_tinymce.cache ?
Drupal.settings.s_tinymce.cache : '',
elements: '',
relative_urls : false,
remove_script_host : true,
paste_retain_style_properties : "all",
paste_remove_styles_if_webkit: false,
setup: function(ed){
editorStripInlineImages(ed);
ed.onInit.add(function(editor){
$('.mceButton', '#' + editor.id + '_tbl').tipsy({
gravity: 's',
title: function(){
return $(this).attr('original-title');
}
});
var tinymce_popup_parent = $('#'+ed.editorId).parents('.popups-box');
ed.s_tinymce_popup = tinymce_popup_parent.attr('id');
});
},
// toolbars
theme_advanced_layout_manager: "SimpleLayout",
theme_advanced_buttons1: "",
theme_advanced_buttons2: "",
theme_advanced_buttons3: "",
theme_advanced_toolbar_location : "top",
theme_advanced_toolbar_align : "left",
theme_advanced_statusbar_location: "bottom",
theme_advanced_resizing: true,
theme_advanced_resize_horizontal: false,
// plugins
plugins: "",
apply_source_formatting: true,
extended_valid_elements: 'label[id|class|style],span[id|class|style|cluetip],'
+
'object[classid|codebase|width|height|align],' +
'param[name|value],' +
'embed[quality|type|pluginspage|width|height|src|align],' +
'iframe[src|width|height|name|align|scrolling|frameborder|style|
allowfullscreen],' +
'img[src|alt|width|height|style|id|name|formula|class|align|title|border|
cluetip],' +
// custom td entry so cells don't inherit the paddEmpty option, which puts
inside empty cells when saving
'td[id|class|style|title|lang|dir|onclick|ondblclick|onmousedown|onmouseup|
onmouseover|onmousemove|onmouseout|onkeypress|onkeydown|onkeyup|abbr|axis|headers|
scope|rowspan|colspan|align|char|charoff|valign|nowrap|bgcolor|width|height]',
if ($('body').hasClass('s-enable-mathml')) {
sTinymceOpts.theme_advanced_buttons1 += ',tiny_mce_wiris_formulaEditor';
sTinymceOpts.plugins += ',tiny_mce_wiris';
}
break;
case 'basic_update':
sTinymceOpts.theme_advanced_buttons1 =
"bold,italic,underline,bullist,numlist,indent,outdent,spellchecker,fontsizeselect,i
nsert_content,removeformat";
sTinymceOpts.plugins = "-s_dropmenu,-s_content,spellchecker,-
paste,inlinepopups";
fontSizes = [11, 12, 13, 14];
sTinymceOpts.s_dropmenu_menus = {
insert_content: {
title: Drupal.t('Insert Content'),
items:
sTinymce.getDropMenu('s_insert_link,s_insert_symbol,s_insert_equation')
}
};
break;
case 'basic_comment':
sTinymceOpts.theme_advanced_resizing_min_height = sTinymceOpts.min_height =
60;
sTinymceOpts.theme_advanced_buttons1 =
"bold,italic,underline,bullist,numlist,indent,outdent,spellchecker";
sTinymceOpts.plugins = "spellchecker,paste";
sTinymceOpts.theme_advanced_buttons1 =
"bold,italic,underline,bullist,numlist,indent,outdent,spellchecker";
break;
// prevent tinymce advanced theme from leaving off space in the bottom for a
status bar
sTinymceOpts.theme_advanced_resizing = false;
sTinymceOpts.theme_advanced_statusbar_location = '';
break;
default:
case 'full':
sTinymceOpts.plugins = "-s_dropmenu,-s_content,-s_image_hover,-s_cluetip,-
s_table,spellchecker,media,-paste,table,inlinepopups";
sTinymceOpts.theme_advanced_buttons1 =
"bold,italic,underline,bullist,numlist,forecolor,backcolor,formatting,indent,outden
t,justifyleft,justifycenter,justifyright,s_link,insert_content,s_table_button,spell
checker,formatselect,fontsizeselect";
sTinymceOpts.theme_advanced_buttons2 =
"s_table_border,row_before,row_after,delete_row,col_before,col_after,delete_col,mer
ge_cells,split_cells,delete_table";
sTinymceOpts.s_dropmenu_menus = {
insert_content: {
title: Drupal.t('Insert Content'),
items:
sTinymce.getDropMenu('s_insert_imagemedia,s_insert_link,s_insert_symbol,s_insert_eq
uation,s_insert_latex,s_cluetip_toggle_note')
},
formatting: {
title: Drupal.t('Formatting'),
items:
sTinymce.getDropMenu('strikethrough,sup,sub,separator,s_format_remove')
}
};
if ($('body').hasClass('s-enable-mathml')) {
sTinymceOpts.theme_advanced_buttons1 += ',tiny_mce_wiris_formulaEditor';
sTinymceOpts.plugins += ',tiny_mce_wiris';
}
break;
}
/*
Include resource content menu items if allowed
*/
var sContentInsertMenuItems = sCommonGetSetting('s_tinymce',
's_content_menu_items');
if(sContentInsertMenuItems && (toolbarStyle == 'basic_folder_description' ||
toolbarStyle == 'full')) {
sContentInsertMenuItems =
sTinymceOpts.s_dropmenu_menus.insert_content.items.concat(sContentInsertMenuItems);
sTinymceOpts.s_dropmenu_menus.insert_content.items = sContentInsertMenuItems;
sTinymceOpts.s_dropmenu_menus.insert_content.isMegaDropdown = true;
}
tinyMCE.init(sTinymceOpts);
}
var dropMenuItems = {
s_insert_imagemedia: {
id: 's_insert_imagemedia',
title: Drupal.t('Image/Media'),
cmd: 'sContentMediaInsert'
},
s_insert_image: {
id: 's_insert_image',
title: Drupal.t('Image'),
cmd: 'sContentImageInsert'
},
s_insert_link: {
id: 's_insert_link',
title: Drupal.t('Link'),
cmd: 'mceLink'
},
s_insert_symbol: {
id: 's_insert_symbol',
title: Drupal.t('Symbol'),
cmd: 'mceCharMap'
},
s_insert_equation: {
id: 's_insert_equation',
title: Drupal.t('Equation'),
cmd: 'sContentFormulaInsert'
},
s_insert_latex: {
id: 's_insert_latex',
title: Drupal.t('LaTeX'),
cmd: 'sContentLatexInsert'
},
s_cluetip_toggle_note: {
id: 's_cluetip_toggle_note',
title: Drupal.t('Tooltip'),
cmd: 'sCluetipToggleNote',
disabled: true // disabled by default and enabled when highlighting texts
and such
},
strikethrough: {
id: 'strikethrough',
title: Drupal.t('Strikethrough'),
cmd: 'strikethrough'
},
sup: {
id: 'sup',
title: Drupal.t('Superscript'),
cmd: 'superscript'
},
sub: {
id: 'sub',
title: Drupal.t('Subscript'),
cmd: 'subscript'
},
separator: {
type: 'separator'
},
s_format_remove: {
id: 's_format_remove',
title: Drupal.t('Clear Formatting'),
cmd: 'removeformat'
}
};
/**
* Allow textareas to properly retrieve the rich text contents before a submit
event
*
* @param object context
*/
obj.updateRichtextContent = function(context){
var editorId = tinyMCE && tinyMCE.activeEditor ?
tinyMCE.activeEditor.editorId : null;
if(editorId){
var editorObj = $('#' + editorId, context);
if(editorObj.length){
// there is a rich text editor in the form, we need to pull its contents
out before submitting
var richTextContent =
tinyMCE.get( tinyMCE.activeEditor.editorId ).getContent();
editorObj.val(richTextContent);
}
}
};
/**
* Parse the menu list config and return a list of menu item objects
*
* @param string menuListConfig comma separated list of menu item ids
*/
obj.getDropMenu = function(menuListConfig){
var list = [];
return list;
};
/**
* Get dom element in editor content body
*
* @param {string} jquerySelector
* @returns {HTMLElement}
*/
obj.findContentBody = function(jquerySelector) {
var tinyMceBody = tinyMCE && tinyMCE.activeEditor &&
tinyMCE.activeEditor.getBody();
if (!tinyMceBody) {
return;
}
return $(jquerySelector, tinyMceBody);
};
/**
* Attach presubmit function to check for any inline base64-encoded images
*
* @param {HTMLElement} formContext
*/
obj.checkInlineImgBeforeSubmit = function(formContext) {
$('input[type=submit]:not(.sTinymce-imgCheck-processed)',
formContext).addClass('sTinymce-imgCheck-processed').each(function() {
var $el = $(this);
$el.data('beforeSubmitHandler', function (e) {
if (!e) {
return;
}
//Check if any element contains inline img
var inlineMatchStr = "data:image/";
var $inlineImgs = sTinymce.findContentBody('[src]').filter(function() {
return this.src.substring(0, inlineMatchStr.length).toLowerCase() ===
inlineMatchStr;
});
if (!($inlineImgs && $inlineImgs.length)) {
return;
}
$el.closest('form').prepend(
'<div class="messages error"><ul><li>' +
Drupal.t('You must delete images in your post and upload them as
attachments.') +
'</ul></li></div>'
);
return obj;
}());
}
/**
* Initializes behaviors on editors contained within the popup
* @param {Array} textFieldIds An array of strings that are the ids of each RTE
* @param {Element} context
*/
obj.initializeEditors = function(textFieldIds, context) {
//# Initialize the view mode toggle 'lite' | 'standard'
var richTextView = sUserGetUISettings('rte', 'view_mode') == 'standard' ?
'standard' : 'lite';
var supportViewModes = false;
$.each(textFieldIds, function(k, textFieldId){
var textField = $('#' + textFieldId, context);
if(textField.hasClass('s-tinymce-view-modes')){
supportViewModes = true;
var toggleBtn = $('<span class="s-tinymce-toggle-view" />'),
expandText = Drupal.t('Expand'),
minimizeText = Drupal.t('Minimize');
toggleBtn.appendTo(textField.parent());
toggleBtn.click(function(){
sTinymcePopup.setView(sTinymcePopup.getView() == 'standard' ? 'lite' :
'standard');
}).tipsy({
gravity: 's',
title: function(){
return sTinymcePopup.getView() == 'standard' ? minimizeText :
expandText;
}
});
}
});
/**
* Set the popup view to the specified mode.
*
* @param string mode possible values: standard (default), lite
* @param bool update_settings whether to update the user's preference
*/
obj.setView = function(mode, update_settings){
var possibleValues = {standard: true, lite: true},
popupContainer = this.getPopupContainer();
if(popupContainer){
$.each(possibleValues, function(m, setting){
var className = 's-tinymce-view-' + m;
if(mode == m){
popupContainer.addClass(className);
}
else{
popupContainer.removeClass(className);
}
});
obj.updateEditorHeight(mode);
sPopupsResizeCenter();
}
};
/**
* Get the current popup view mode
*
* @param string mode
*/
obj.getView = function(){
var mode = null,
popupContainer = this.getPopupContainer();
if(popupContainer){
var match = /s-tinymce-view-([^\s]+)/.exec(popupContainer.attr('class'));
if(match.length > 1){
mode = match[1];
}
}
return mode;
};
/**
* Update the editor height with a preset value when the view mode changes.
*
* @param string mode possible values: standard (default), lite
*/
obj.updateEditorHeight = function(mode){
var ed = tinyMCE.activeEditor;
if(ed){
if(typeof mode == 'undefined'){
mode = obj.getCurrentViewMode();
}
var formItemId = $(ed.contentAreaContainer).closest('.form-
item').attr('id'),
newHeight = null;
if(typeof obj.viewModeHeights[formItemId] == 'object' && typeof
obj.viewModeHeights[formItemId][mode] != 'undefined'){
ed.theme.resizeTo(null, obj.viewModeHeights[formItemId][mode]);
}
}
};
/**
* Get the popup of the current container.
*
* @return object the jquery object of the popup element.
*/
obj.getPopupContainer = function(){
var active_editor_id = $(document).data('sTinymcePopupActiveEditors'),
ret = null;
if(active_editor_id) {
var popup = Popups.activePopup();
ret = $('#'+active_editor_id).parents('.popups-box');
}
return ret;
};
/**
* Get the view mode of the current popup container
*
* @return string
*/
obj.getCurrentViewMode = function(){
// if the mode is not provided, get the current mode
var popupContainer = this.getPopupContainer(),
matches = null,
mode = null;
if(popupContainer){
matches = /s-tinymce-view-(\w+)/.exec(popupContainer.attr('class'));
if(matches){
mode = matches[1];
}
}
return mode;
};
return obj;
}());
}
;/**
* $Id: editor_plugin_src.js 001 2010-07-01 $
*
* @author Schoology, Inc.
* @copyright Copyright 2010, Schoology, Inc., All rights reserved.
*/
(function() {
tinymce.create('tinymce.plugins.SImageHoverPlugin', {
var t = this;
ed.onInit.add(function(ed){
t._createBtns();
tinyMCE.activeEditor.execCommand('sImageHover_removeModBtns',false,false,
{skip_focus: true});
});
});
$('body').bind('mousedown',function(e){
if(typeof tinyMCE == 'undefined' || typeof tinyMCE.activeEditor ==
'undefined'){
$(this).unbind(e);
return true;
}
ed.onRemove.add(function(ed){
// the following would be nice, but causes mac safari to crash
//ed.execCommand('sImageHover_removeModBtns');
$('#tme_imgModEnabled').attr('id','');
$('#tme_modBtnContainer').hide();
});
ed.onClick.add( function(ed,e){
var enabledImage =
tinyMCE.activeEditor.execCommand('sImageHover_getEnabledImage');
if(typeof enabledImage == 'undefined' || (enabledImage!=false && $
(e.target)[0] == enabledImage[0]))
return;
tinyMCE.activeEditor.execCommand('sImageHover_removeModBtns');
});
ed.onMouseUp.add(function(ed,e) {
if( e.target.nodeName == 'IMG'){
var img = $(e.target);
var img_class = String(img.attr('class'));
var imgSpan = $("span",$("#tme_imgModBtn"));
if(!hover_type)
hover_type = img_class.match(/^.*mathquill-formula.*$/gi) ?
'mathquill-formula': false;
switch( hover_type ){
case 'media':
imgSpan.css('background-
image',"url(/sites/all/libraries/tinymce/jscripts/tiny_mce/themes/advanced/img/icon
s.gif)");
imgSpan.css({'background-position':'-323px -24px','background-
repeat':'no-repeat'});
imgSpan.data('mceMethod','mceMedia');
break;
case 'tt-formula':
imgSpan.css('background-
image',"url(/sites/all/themes/schoology_theme/images/math-icon.png)");
imgSpan.css({'background-position':'1px 1px','background-
repeat':'no-repeat'});
imgSpan.data('mceMethod','sContentFormulaInsert');
imgSpan.data('mceParams', img );
break;
case 'latex-formula':
imgSpan.css('background-
image',"url(/sites/all/themes/schoology_theme/images/math-icon.png)");
imgSpan.css({'background-position':'-1px -16px','background-
repeat':'no-repeat'});
imgSpan.data('mceMethod','sContentLatexInsert');
imgSpan.data('mceParams', img );
break;
case 'mathquill-formula':
imgSpan.css('background-
image',"url(/sites/all/themes/schoology_theme/images/math-icon.png)");
imgSpan.css({'background-position':'1px 1px','background-
repeat':'no-repeat'});
imgSpan.data('mceMethod','sContentFormulaInsert');
imgSpan.data('mceParams', img );
break;
default:
imgSpan.css('background-
image',"url(/sites/all/libraries/tinymce/jscripts/tiny_mce/themes/advanced/img/icon
s.gif)");
imgSpan.css({'background-position':'-384px -4px','background-
repeat':'no-repeat'});
imgSpan.data('mceMethod','mceImage');
break;
}
ed.execCommand('sImageHover_setEnabledImage',e.target);
ed.execCommand('sImageHover_positionModBtns');
}
});
},
_getEnabledImage: function(){
return this._enabledImage;
},
_setEnabledImage: function(img){
this._enabledImage = $(img);
this._enabledImage.attr('id','tme_imgModEnabled');
},
_createBtns: function(){
if ($('#tme_modBtnContainer').length) return;
modBtn.bind('click',function(){
var ed = tinyMCE.activeEditor;
// otherwise the click deselects the image in ie
if(jQuery.browser.msie)
ed.selection.select(ed.dom.select('img#tme_imgModEnabled')[0]);
var img = $("span",$(this));
ed.execCommand('sImageHover_removeModBtns');
ed.execCommand( img.data('mceMethod') , img.data("mceParams") );
});
delBtn.bind('click',function(){
tinyMCE.activeEditor.execCommand('sImageHover_removeModBtns',true);
});
modBtnContainer.append(modBtn);
modBtnContainer.append(delBtn);
modBtnContainer.css('display','none');
$('body').append(modBtnContainer);
// for safari
modBtnContainer.hide();
},
_removeBtns: function(delImage){
if(typeof delImage != 'boolean') delImage = false;
$(this._enabledImage).attr('id','');
if(delImage) {
tinyMCE.activeEditor.dom.remove(this._enabledImage);
// would be nice but webkit no bueno
//tinyMCE.activeEditor.execCommand('mceCleanup');
tinyMCE.activeEditor.execCommand('sContentSaveLastNode');
}
if(tinyMCE.activeEditor==null) return;
$('#tme_modBtnContainer').hide();
this._enabledImage = false;
},
_positionBtns: function(showBtns){
if( this._enabledImage == false ) return;
if(typeof showBtns != 'boolean') showBtns = true;
var iPos = $(this._enabledImage).position();
var ifr = $('iframe',$(tinyMCE.activeEditor.contentAreaContainer));
var ifPos = ifr.offset();
getInfo : function() {
return {
longname : 'S_Image_Hover',
author : 'Schoology, Inc.',
authorurl : 'http://' + sCommonGetDefaultDomain() + '.schoology.com',
infourl : 'http://' + sCommonGetDefaultDomain() + '.schoology.com',
version : tinymce.majorVersion + "." + tinymce.minorVersion
};
}
});
// Register plugin
tinymce.PluginManager.add('s_image_hover', tinymce.plugins.SImageHoverPlugin );
})();;/**
* $Id: editor_plugin_src.js 001 2010-10-12 $
*
* @author Schoology, Inc.
* @copyright Copyright 2010, Schoology, Inc., All rights reserved.
*/
(function() {
var Event = tinymce.dom.Event;
tinymce.create('tinymce.plugins.SContentPlugin', {
ed.addCommand('sContentMediaInsert', function(){
t._mediaInsert();
});
ed.addCommand('sContentImageInsert', function(){
t._mediaInsert({type: 'image'});
});
ed.addCommand('sContentFormulaInsert', this._formulaInsert);
ed.addCommand('sContentLatexInsert', this._latexInsert);
ed.addCommand('sContentInsert', this._insertContent);
ed.addCommand('sContentSaveLastNode', this._saveLastNode);
ed.addCommand('sContentToggleSubmitBtns', this._toggleSubmitButtons);
ed.addCommand('sContentGetRealmFromUrl', this._getRealmFromUrl);
ed.addCommand('sContentSetWmodeOpaque', this._setWmodeOpaque);
ed.addCommand('sContentResourcesInsert', this._insertResourceContent);
ed.addCommand('sContentResourcesInsertPopup',
this._insertResourcesContentPopup);
ed.addCommand('sContentRemovePopups', this._removePopups);
// constant bookmarking
ed.onEvent.add(function(ed,e){
if( e.type == 'submit' )
return;
tinyMCE.activeEditor.execCommand('sContentSaveLastNode');
});
// Register buttons
ed.addButton('sContentFormula', {
title : Drupal.t('Equation'),
cmd : 'sContentFormulaInsert'
});
ed.addButton('sContentImage', {
title : Drupal.t('Image/Media'),
cmd : 'sContentMediaInsert'
});
},
_saveLastNode : function( ) {
$(document).data('tinymceLastNode', tmeNode );
},
_mediaInsert : function(opts) {
if(typeof opts == 'undefined'){
opts = {};
}
if(typeof opts.type == 'undefined'){
opts.type = 'both';
}
sAfu.onUpload = function(file){
if(!file.url || file.url == '' || !file.type)
return;
if(file.type == 'image'){
var img = '<img src="' + file.url + '" alt="" title="" />';
tinyMCE.activeEditor.execCommand( 'sContentInsert' , img );
if(sCommonIsEmbed(url)){
Popups.close();
// ensure that wmode=opage is set for all embeds
url = tinyMCE.activeEditor.execCommand('sContentSetWmodeOpaque',url);
tinyMCE.activeEditor.execCommand('sContentInsert' , url);
return;
}
$.ajax({
url: '/media/richtext/embedcode',
data: { 'fid': fid , 'url': url },
type: 'POST',
dataType: 'json',
success: function (data, status){
var popup = Popups.activePopup();
Popups.close( popup );
tinyMCE.activeEditor.execCommand( 'sContentInsert' ,
data.embedCode );
},
error: function (data, status, e){
alert(Drupal.t("There was an internal error. Please try again in a
few moments."));
}
});
}
};
var popupOptions = {
ajaxForm: false,
extraClass: 'tinymce-insert-popup',
updateMethod: 'none',
href: url,
hijackDestination: false,
disableCursorMod: true,
disableAttachBehaviors: false,
formOnSubmit: function(){
// using upload file form and there are no uploads
if($('#mediaInsertTabURL').hasClass('active') && $('#edit-submit-
upload').hasClass('disabled'))
return false;
if(embedUrl == ''){
// using URL form and no URL specified
if($('#mediaInsertTabUpload').hasClass('active')){
alert(Drupal.t('Please enter either a URL or embed code.'));
urlObj.focus();
tinyMCE.activeEditor.execCommand('sContentToggleSubmitBtns');
return false;
}
// file upload
var sAfu_opts = {
success: function (data, status){
if( data.status != 0 ) {
tinyMCE.activeEditor.execCommand('sContentToggleSubmitBtns');
alert(Drupal.t("There was an internal error. Please try again in
a few moments."));
return;
}
sAfu.onUpload(data.file);
},
error: function (data, status, e){
tinyMCE.activeEditor.execCommand('sContentToggleSubmitBtns');
alert(Drupal.t("There was an internal error. Please try again in a
few moments."));
},
url: '/tinymceinsertmedia'
};
sAfu.uploadFormAjax({},sAfu_opts);
}
else {
sAfu.onUpload({
type: typeObj.hasClass('edit-media-type-image') ? 'image' : 'media',
url: embedUrl
});
tinyMCE.activeEditor.focus();
}
return false;
}
};
// make sure the active editor is the one where the picutre will be inserted
tinyMCE.activeEditor.execCommand('sContentSaveLastNode');
_formulaInsert : function(img) {
var realm = tinyMCE.activeEditor.execCommand('sContentGetRealmFromUrl');
var formula = img ? $(img).attr('formula') : '';
var use_mathquill = true;
// formulas are base64 encoded to prevent TinyMCE from mangling them during
html encoding/decoding
// because base64 encoding for formula attributes of tutortrove image tags
was implemented later, some old image tags may not have base64 encoded formulas
if( formula && Base64.is_encoded( formula ))
formula = Base64.decode( formula );
// save the image object so we can remove it later when updating an existing
formula
if(img){
$(document).data('s_content_saved_formula_image',img);
// only not use mathquill when it is an existing formula created with the
old editor
use_mathquill = img.hasClass('mathquill-formula');
}
if(use_mathquill){
var href = '/tinymceinsertmathquill';
var extraClass = ' tinymce-mathquill-formula-popup';
}
else{
var href = '/tinymceinsertformula';
var extraClass = ' tinymce-formula-popup';
}
var po = {
ajaxForm: false,
extraClass: 'tinymce-insert-popup popups-large' + extraClass,
width: 550,
updateMethod: 'none',
href: href + '?r='+String(realm[0])+'&id='+String(realm[1])+'&formula=' +
encodeURIComponent(formula),
hijackDestination: false,
disableCursorMod: true,
disableAttachBehaviors: false,
formOnSubmit: function(){
}
};
// make sure the active editor is the one where the picutre will be inserted
tinyMCE.activeEditor.execCommand('sContentSaveLastNode');
_latexInsert : function(img) {
var realm = tinyMCE.activeEditor.execCommand('sContentGetRealmFromUrl');
var formula = img ? $(img).attr('formula') : '';
// save the image object so we can remove it later when updating an existing
formula
if(img) $(document).data('s_content_saved_latex_image',img);
var po = {
ajaxForm: false,
extraClass: 'tinymce-insert-popup tinymce-latex-popup popups-large',
width: 550,
updateMethod: 'none',
href: '/tinymceinsertlatex?r='+String(realm[0])+'&id='+String(realm[1])
+'&formula=' + encodeURIComponent(formula),
hijackDestination: false,
disableCursorMod: true,
disableAttachBehaviors: false,
formOnSubmit: function(){
}
};
// make sure the active editor is the one where the picutre will be inserted
tinyMCE.activeEditor.execCommand('sContentSaveLastNode');
/**
* A wrapper for TinyMCE's method of injecting new content into the editor DOM
at the point of the cursor.
* Optionally uses its own bookmark system (tinymceLastNode) if available and
makes sense.
*
* @param string/object content html string or a jquery object
*/
_insertContent : function(content, opts) {
var defaults = {
use_native_insert: false // whether to use the tinyMCE native
mceInsertContent to insert the content
};
if(typeof opts == 'undefined'){
opts = {};
}
opts = $.extend({}, defaults, opts);
try{
if(!opts.use_native_insert && lastNodeObj.length > 0){
// use JQuery to inject the new element into the DOM after our own
bookmark
var nodeName = lastNode.nodeName.toLowerCase();
if (!ed.settings.relative_urls) {
// If ed.settings.relative_urls is FALSE, convert the value of data-
mce-src to be absolute by removing any "../"
cHtml = cHtml.replace(/data-mce-src="(\.+\/)+/, 'data-mce-src="/');
}
// the body tag and table cells cannot have other tags placed directly
after them in the DOM hierarchy, use JQuery append instead of after
if(nodeName == 'td' || nodeName == 'body' ){
lastNodeObj.append(cHtml);
}
else {
lastNodeObj.after(cHtml);
}
}
else{
// our own bookmark is not available or valid, use the standard TinyMCE
method
ed.execCommand('mceInsertContent' , false , '' ); // sgy-1761
ed.execCommand('mceInsertContent' , false , cHtml );
}
}
catch(e){}
},
_toggleSubmitButtons : function(){
var submitBtn = $('#edit-submit-url');
if(submitBtn.attr('disabled')==true){
submitBtn.attr('disabled',false);
submitBtn.parent().removeClass('disabled');
}
else{
submitBtn.attr('disabled',true);
submitBtn.parent().addClass('disabled');
}
},
// template assessments
var resourcesMatch =
String(window.location.pathname).match(/^\/template\/([0-9]+)\/assessment\/
(questions|settings|preview)/);
if( resourcesMatch )
path_parts = ['resources',resourcesMatch[1]];
for(var i=0;i<path_parts.length;i++) {
path_part = path_parts[i];
if( $.inArray( path_part , valid_realms ) != -1) {
upload_realm = path_part;
upload_realmId = path_parts[i+1];
break;
}
}
// this in an object tag, set the param tag and the attribute
if(html.match(/^<(object|embed).+/i)){
$('param[name=wmode]' , domObj).remove();
domObj.append('<param name="wmode" value="opaque"/>');
domObj.attr('wmode','opaque');
}
_insertResourceContent: function(data) {
var html, width, height;
Popups.saveSettings();
// make sure the active editor is the one where the picutre will be inserted
tinyMCE.activeEditor.execCommand('sContentSaveLastNode');
getInfo : function() {
return {
longname : 'S_Content',
author : 'Schoology, Inc.',
authorurl : 'http://' + sCommonGetDefaultDomain() + '.schoology.com',
infourl : 'http://' + sCommonGetDefaultDomain() + '.schoology.com',
version : tinymce.majorVersion + "." + tinymce.minorVersion
};
}
});
// Register plugin
tinymce.PluginManager.add('s_content', tinymce.plugins.SContentPlugin );
})();;/**
* @note
* Workarounds:
* - An issue with the click handler not firing in IE. Used mousedown instead.
* There was most likely another click event registered in tinyMCE that was
taking precedence and causing the popup to close
* before our custom event fired.
* - Using Firefox (tried in 16.0.x) in multiple choice rich text popup for
choices:
* A removeClass call or a css call to alter 'display' on the popupObj in
showPopup() was causing the selection from being deselected.
* A nodeChange event will fire soon after from mceToggleFormat, which will then
hide the popup since the selection is no longer
* on the annotated text. Workaround by using an incredibly negative top offset
(S_CLUETIP_HIDDEN).
*/
(function() {
var highlightClass = 's_cluetip_highlight';
var highlightSelector = '.' + highlightClass;
var highlightTmpClass = highlightClass + '_tmp';
var highlightTmpSelector = '.' + highlightTmpClass;
var lastNode = null;
function popupIsShowing(){
var ed = tinymce.activeEditor,
editorContainerObj = $('#' + ed.editorContainer),
popupObj = $('.add-note-popup', editorContainerObj);
return (popupObj.css('top') != S_CLUETIP_HIDDEN);
}
/**
* Adjust the popup position to the elements
*
* The popup box will stay within the boundary on the left and right side.
*/
function repositionPopup(elementObjs){
var newY = 0,
newX,
newXLeft = null,
newXRight = null,
xAnchor = null,
ed = tinymce.activeEditor,
editorContainerObj = $('#' + ed.editorContainer),
contentContainerObj = $(ed.contentAreaContainer),
menuHeight = contentContainerObj.offset().top -
editorContainerObj.offset().top,
popupObj = $('.add-note-popup', editorContainerObj),
arrowObj = $('.arrow-n', popupObj),
popupWidth = popupObj.outerWidth(),
popupHeight = popupObj.outerHeight(),
boundaryPadding = 5;
elementObjs.each(function(i, el){
var elementObj = $(el);
var offset = elementObj.offset();
if(!newXLeft || offset.left < newXLeft){
newXLeft = offset.left;
}
if(!newXRight || (offset.left + elementObj.outerWidth()) > newXRight){
newXRight = offset.left + elementObj.outerWidth();
}
if(offset.top + elementObj.outerHeight() > newY){
newY = offset.top + elementObj.outerHeight();
}
});
popupObj.css({
left: newX + 'px',
top: newY + 'px'
});
}
/**
* Shows the "add note" popup below the specified element
*/
function showPopup(elementObjs){
var ed = tinymce.activeEditor,
editorContainerObj = $('#' + ed.editorContainer),
popupObj = $('.add-note-popup', editorContainerObj);
repositionPopup(elementObjs);
}
function unHighlightElements(elements){
var formatter = tinymce.activeEditor.formatter;
elements.each(function(i, el){
// the tinymce formatter can get screwy and apply the format to a descendent
because of element boundaries
// we need to check if there is a descendent that's also highlighted to avoid
having it removed from the DOM via the replaceWith
var elObj = $(el),
childrenObj = elObj.children(),
childHighlights = elObj.find(highlightTmpSelector);
if(childrenObj.length && !childHighlights.length){
elObj.replaceWith(elObj.html());
}
else{
formatter.toggle('highlight', null, elObj.get(0));
}
});
}
/**
* Hides the "add note" popup and reset the text.
*/
function hidePopup(){
var ed = tinymce.activeEditor,
popupObj = $('.add-note-popup', $('#' + ed.editorContainer));
popupObj.css('top', S_CLUETIP_HIDDEN);
popupObj.find('.cluetip_text').val('');
// unhighlight any untagged notes (the user highlighted something but didn't
fill it out)
unHighlightElements($(highlightTmpSelector, $(ed.contentDocument)));
}
/**
* Save the contents of the annotation.
*/
function saveOpenedPopup(){
var ed = tinymce.activeEditor,
popupObj = $('.add-note-popup', $('#' + ed.editorContainer)),
cluetipText = popupObj.find('.cluetip_text').val();
if(cluetipText && cluetipText.length > 0){
$('.check-mark-icon', popupObj).trigger('mousedown');
}
}
tinymce.create('tinymce.plugins.SCluetipPlugin', {
init : function(ed, url) {
ed.addCommand('sCluetipToggleNote', this._toggleNote);
ed.onNodeChange.add(this._nodeChanged, this);
ed.onBeforeGetContent.add(this._beforeGetContent, this);
ed.onInit.add(function(ed){
ed.formatter.register({
highlight: {
inline: 'span',
classes: [highlightClass, highlightTmpClass],
attributes: {'cluetip': ''},
onmatch: function(node, format, item_name){
// the default matchItems() check will fail because the value of
cluetip being an empty string
// fails the !value part of the if(similar && !value && !
format.exact) conditional
var nodeObj = $(node);
return (nodeObj.hasClass(highlightClass) &&
nodeObj.hasClass(highlightTmpClass));
}
}
});
hidePopup();
});
},
/**
* Remove the annotation when the caret is in a highlighted node. Otherwise,
add the annotation using the tinymce formatter
*/
_toggleNote: function() {
var ed = tinymce.activeEditor,
nodeObj = $(ed.selection.getNode()),
parentHighlighted = nodeObj.parents(highlightSelector),
highlightedElements = null;
if(nodeObj.hasClass(highlightClass)){
// unhighlight selected element
unHighlightElements(nodeObj);
}
else if(parentHighlighted.length > 0){
// unhighlight the highlighted parent element
parentHighlighted.eq(-1);
unHighlightElements(parentHighlighted);
}
else{
// apply the highlighting
ed.execCommand('mceToggleFormat', false, 'highlight');
if(!nodeObj.is(':visible')){
// mceToggleFormat removed our previously selected node from the DOM, so
we need to reselect the new selection
nodeObj = $(ed.selection.getNode());
}
highlightedElements = nodeObj.find(highlightTmpSelector);
if(!highlightedElements.length){
highlightedElements =
nodeObj.addClass(highlightTmpClass).addClass(highlightClass);
}
showPopup(highlightedElements);
}
},
if(c = cm.get('s_cluetip_toggle_note')){
// disable the button if it's not a highlighted and the selection is
collapsed
c.setDisabled(!isHighlighted && co);
c.setActive(isHighlighted);
}
if(isHighlighted){
// show the popup for the highlighted elemented
var highlightedElements = nodeHighlighted ? nodeObj : parentHighlighted;
if(lastNode != n){
saveOpenedPopup();
showPopup(highlightedElements);
}
}
else{
if(popupIsShowing()){
saveOpenedPopup();
hidePopup();
}
}
lastNode = n;
},
/**
* Clean up any empty annotations before getting the content to be saved.
*/
_beforeGetContent: function(ed){
var popupObj = $('.add-note-popup', $('#' + ed.editorContainer));
if(popupObj.length > 0 && popupIsShowing()){
saveOpenedPopup();
hidePopup();
}
},
getInfo : function() {
return {
longname : 'S_Cluetip',
author : 'Schoology, Inc.',
authorurl : 'http://' + sCommonGetDefaultDomain() + '.schoology.com',
infourl : 'http://' + sCommonGetDefaultDomain() + '.schoology.com',
version : tinymce.majorVersion + "." + tinymce.minorVersion
};
}
});
// Register plugin
tinymce.PluginManager.add('s_cluetip', tinymce.plugins.SCluetipPlugin);
})();;/**
* Create a way of creating buttons that show/hide DropMenus
*/
(function() {
var menuConfig = {};
tinymce.create('tinymce.plugins.SDropMenu', {
init : function(ed, url) {
var t = this;
menuConfig = typeof ed.settings.s_dropmenu_menus == 'object' ?
ed.settings.s_dropmenu_menus : {};
},
/**
* Create Control hook for when TinyMCE need to determine what to create
*
* @param string n
* @param object cm
*/
createControl: function(n, cm){
var t = this;
if(typeof menuConfig[n] != 'undefined'){
var config = menuConfig[n], button = null, ccMenuButton = null, ccDropMenu
= null;
button = cm.createMenuButton(n, {
title : config.title,
label: config.label,
icons : false,
ccDropMenu : ccDropMenu
}, ccMenuButton);
button.onRenderMenu.add(function(c, m){
t._createSubMenu(c.editor, m, config.items);
});
button.renderMenu();
return button;
}
},
/**
* Helper method in recursively populating a menu list.
*
* @param object ed
* @param object menu
* @param object items
*/
_createSubMenu: function(ed, menu, items){
var t = this;
$.each(items, function(k, item){
if(typeof item.items != 'undefined'){
var submenu = menu.addMenu({
title: item.title
});
t._createSubMenu(ed, submenu, item.items);
}
else if(typeof item.type != 'undefined'){
if(item.type == 'separator'){
menu.addSeparator();
}
}
else{
var newItem = {title: item.title},
menuItem = null;
if(typeof item.onclick == 'function'){
// execute a custom onclick handler
newItem.onclick = function(e){
item.onclick(e, ed);
};
}
else if(typeof item.cmd == 'string'){
// execute a tinymce command
newItem.cmd = item.cmd;
}
menuItem = menu.add(newItem);
getInfo : function() {
return {
longname : 'S_DropMenu',
author : 'Schoology, Inc.',
authorurl : 'http://' + sCommonGetDefaultDomain() + '.schoology.com',
infourl : 'http://' + sCommonGetDefaultDomain() + '.schoology.com',
version : tinymce.majorVersion + "." + tinymce.minorVersion
};
}
});
// Register plugin
tinymce.PluginManager.add('s_dropmenu', tinymce.plugins.SDropMenu);
})();
/**
* Optional control class for tinymce.ui.MenuButton
*/
(function() {
var DOM = tinymce.DOM, Event = tinymce.dom.Event, each = tinymce.each;
tinymce.create('tinymce.ui.SMenuButton:tinymce.ui.MenuButton', {
SMenuButton : function(id, s, ed) {
this.parent(id, s, ed);
/**
* Use settings object to pass in option control class for DropMenu ui
*/
renderMenu : function() {
var t = this, m;
m = t.settings.control_manager.createDropMenu(t.id + '_menu', {
menu_line : 1,
'class' : this.classPrefix + 'Menu',
icons : t.settings.icons
}, t.settings.ccDropMenu);
m.onHideMenu.add(function() {
t.hideMenu();
t.focus();
});
t.onRenderMenu.dispatch(t, m);
t.menu = m;
}
});
})();
/**
* Optional control class for tinymce.ui.DropMenu
*/
(function() {
var is = tinymce.is, DOM = tinymce.DOM, each = tinymce.each, Event =
tinymce.dom.Event, Element = tinymce.dom.Element;
tinymce.create('tinymce.ui.SMegaDropMenu:tinymce.ui.DropMenu', {
SMegaDropMenu : function(id, s) {
s = s || {};
s.container = s.container || DOM.doc.body;
s.offset_x = s.offset_x || 0;
s.offset_y = s.offset_y || 0;
s.vp_offset_x = s.vp_offset_x || 0;
s.vp_offset_y = s.vp_offset_y || 0;
this.parent(id, s);
this.onShowMenu = new tinymce.util.Dispatcher(this);
this.onHideMenu = new tinymce.util.Dispatcher(this);
this.classPrefix = 'mceMenu';
},
createMenu : function(s) {
var t = this, cs = t.settings, m;
m.onAddItem.add(t.onAddItem.dispatch, t.onAddItem);
return m;
},
/**
* Dropmen showmenu callback
*/
showMenu : function(x, y, px) {
var t = this, s = t.settings, co, vp = DOM.getViewPort(), w, h, mx, my, ot =
2, dm, tb, cp = t.classPrefix;
t.collapse(1);
if (t.isMenuVisible)
return;
if (!t.rendered) {
co = DOM.add(t.settings.container, t.renderNode());
each(t.items, function(o) {
o.postRender();
});
// Move layer out of sight unless it's Opera since it scrolls to top of page
due to an bug
if (!tinymce.isOpera)
DOM.setStyles(co, {left : -0xFFFF , top : -0xFFFF});
DOM.show(co);
t.update();
x += s.offset_x || 0;
y += s.offset_y || 0;
vp.w -= 4;
vp.h -= 4;
t.isMenuVisible = 1;
t.mouseClickFunc = Event.add(co, 'click', function(e) {
var m;
e = e.target;
if (m.isDisabled())
return;
dm = t;
while (dm) {
if (dm.hideMenu)
dm.hideMenu();
dm = dm.settings.parent;
}
if (m.settings.onclick)
m.settings.onclick(e);
if (t.hasMenus()) {
t.mouseOverFunc = Event.add(co, 'mouseover', function(e) {
var m, r, mi;
e = e.target;
if (e && (e = DOM.getParent(e, 'td'))) {
m = t.items[e.id];
if (t.lastMenu)
t.lastMenu.collapse(1);
if (m.isDisabled())
return;
t.onShowMenu.dispatch(t);
if (s.keyboard_focus) {
t._setupKeyboardNav();
}
},
/**
* Render dropmenu
*
* @returns {div}
*/
renderNode : function() {
var t = this, s = t.settings, n, tb, co, w;
t.rendered = true;
return w;
},
/**
* Render menu rows
*
* @param tb table body node
* @param ri an array of menu items
*/
_add : function(tb, ri) {
var n, s, a, ro, it, cp = this.classPrefix, ic, is;
ro = DOM.add(tb, 'tr');
each(ri, function(o){
if(o != null) {
s = o.settings;
it = DOM.add(ro, 'td', {id: o.id, 'class': s['class'] + ' ' + cp + 'Item
' + cp + 'ItemEnabled'});
a = DOM.add(it, 'a', {id: o.id + '_aria', role: s.titleItem ?
'presentation' : 'option', href : 'javascript:;', onclick : "return false;",
onmousedown : 'return false;'});
if(s.icon_src) {
is = DOM.add(a, 'span', {'class' : 'mceIcon'});
DOM.add(is, 'img', {'src' : s.icon_src});
}
DOM.add(a, 'span', {'class' : 'mceText', title : o.settings.title},
o.settings.title);
}
else {
it = DOM.add(ro, 'td', {'class' : 's-js-resource-items-empty'});
}
});
if (tb.childNodes.length == 1) {
DOM.addClass(ro, 'mceFirst');
}
if (n = ro.previousSibling) {
DOM.removeClass(n, 'mceLast');
}
DOM.addClass(ro, 'mceLast');
}
});
})();
;/*
*
* Table Dropdown Plugin for TinyMCE
*
* Copyright 2011 Cory LaViska for A Beautiful Site, LLC. — www.abeautifulsite.net
*
* Licensed under the MIT License: http://www.opensource.org/licenses/mit-
license.php
*
* Modified to include table creation widget.
*
*/
(function() {
var menuObjCache = {};
function openTablePicker(createTableMenu){
var menuObj = null,
minRows = 4,
minCols = 4,
maxRows = 15,
maxCols = 10,
cellWidth = 25,
cellHeight = 17;
if(typeof menuObjCache[createTableMenu.id] == 'object' &&
menuObjCache[createTableMenu.id].closest('body').length){
// the menu object has already been created and is still in the DOM
menuObj = menuObjCache[createTableMenu.id];
}
else{
menuObj = menuObjCache[createTableMenu.id] = $('#menu_' + createTableMenu.id
+ '_co');
}
if(!menuObj.children('.table-picker-wrapper').length){
var tablePicker = '<div class="table-picker-wrapper">'
+ '<div class="table-picker-cells">'
+ '<div class="picker table-picker-selected-cell"></div>'
+ '</div>'
+ '<p class="table-picker-desc"></p>'
+ '</div>';
menuObj.append(tablePicker);
var selectedCell = menuObj.find('.table-picker-selected-cell'),
cellGrid = menuObj.find('.table-picker-cells');
menuObj.resetSelection = function(){
menuObj.updateSelection(1, 1);
};
cellGrid.css({
width: gridCols * cellWidth + 1,
height: gridRows * cellHeight + 1
});
cellGrid.bind('mousemove.tablepicker', function(e){
e.stopPropagation();
var colsRows = menuObj.getColsRows(e.pageX, e.pageY);
menuObj.updateSelection(colsRows[0], colsRows[1]);
}).bind('mouseleave.tablepicker', function(e){
$('body').bind('mousemove.tablepicker', function(e2){
if(menuObj.is(':visible')){
var colsRows = menuObj.getColsRows(e2.pageX, e2.pageY);
menuObj.updateSelection(colsRows[0], colsRows[1]);
}
});
}).bind('mouseenter.tablepicker', function(e){
$('body').unbind('mousemove.tablepicker');
}).bind('click.tablepicker', function(e){
var colsRows = menuObj.getColsRows(e.pageX, e.pageY),
i = 0,
html = '<table class="s_table s_table_border">';
for(i = 0; i < colsRows[1]; i++){
html += '<tr>';
for(j = 0; j < colsRows[0]; j++){
html += '<td><br/></td>';
}
html += '</tr>';
}
html += '</table>';
tinyMCE.activeEditor.execCommand('mceInsertContent', false, html);
createTableMenu.hideMenu();
});
}
tinymce.create('tinymce.plugins.STablePlugin', {
init: function(ed, url){
var t = this,
createTableMenu = null,
createTableButton = null,
editTableToolbarMenu = null;
ed.addCommand('mceTablePicker', function(){
if(createTableButton){
var cm = tinyMCE.activeEditor.controlManager;
button = $('#' + createTableButton.id),
offset = button.offset(),
x = offset.left,
y = offset.top + button.height();
if(createTableMenu.isMenuVisible){
createTableMenu.hideMenu();
}
else{
createTableMenu.showMenu(x, y);
openTablePicker(createTableMenu);
}
}
});
ed.onInit.add(function(){
var cm = ed.controlManager;
createTableButton = cm.get(cm.prefix + 's_table_button');
createTableMenu = cm.createDropMenu('createtable');
createTableMenu.onHideMenu.add(function(){
$('body').unbind('mousemove.tablepicker');
tinyMCE.dom.Event.unbind(tinyMCE.DOM.doc, 'mousedown');
});
createTableMenu.onShowMenu.add(function(){
tinyMCE.dom.Event.bind(tinyMCE.DOM.doc, 'mousedown', function(e){
// close when clicking anywhere but the button and the menu
if(!$(e.target).closest('#' + createTableButton.id + ', #menu_' +
createTableMenu.id).length){
createTableMenu.hideMenu();
}
});
});
if(createTableButton){
createTableButton.setActive(tableNode);
}
if(editTableToolbarMenu){
// decide whether or not to show the edit table context menu
if(tableNode){
if(!t.isVisible){
t.isVisible = true;
editTableToolbarMenu.show();
t._resizeIframe(ed, -31);
}
}
else{
if(t.isVisible){
t.isVisible = false;
editTableToolbarMenu.hide();
t._resizeIframe(ed, 31);
}
}
}
ed.onClick.add(function(){
if(createTableMenu){
createTableMenu.hideMenu();
}
});
t.isVisible = false;
},
toggleTableBorder: function(){
var ed = tinymce.activeEditor,
tableObj = $(ed.dom.getParent(ed.selection.getStart(), 'table'));
tableObj.toggleClass('s_table_border');
},
createControl: function(n, cm) {
switch( n ) {
case 's_table_button':
var createTableButton = cm.createButton(n, {
title : 'table.desc',
'class': 'mce_table',
onclick: function() {
tinymce.activeEditor.execCommand('mceTablePicker');
}
});
return createTableButton;
case 's_table_border':
var tableBorderButton = cm.createButton(n, {
title : Drupal.t('Border'),
'class': 'mce_table_border',
cmd: 'mceToggleTableBorder'
});
return tableBorderButton;
}
return null;
},
/**
* Taken from PDW plugin's PDW toggle mechanism
*
* @param object ed
* @param int diff
*/
_resizeIframe: function(ed, diff){
var frameObj = $(ed.getContentAreaContainer().firstChild);
frameObj.height(frameObj.height() + diff);
ed.theme.deltaHeight += diff;
}
});
// Register plugin
tinymce.PluginManager.add('s_table', tinymce.plugins.STablePlugin);
})();;