locomotive-aloha-rails 0.20.1.2 → 0.20.1.3
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- data/Rakefile +1 -1
- data/lib/aloha/rails/version.rb +2 -2
- data/vendor/assets/javascripts/aloha/css/aloha.css +3 -0
- data/vendor/assets/javascripts/aloha/css/ext-aloha.css +3 -0
- data/vendor/assets/javascripts/aloha/lib/aloha-bootstrap.js +4565 -3934
- data/vendor/assets/javascripts/aloha/lib/aloha.js +1357 -702
- data/vendor/assets/javascripts/aloha/lib/aloha/command.js +16 -13
- data/vendor/assets/javascripts/aloha/lib/aloha/core.js +23 -3
- data/vendor/assets/javascripts/aloha/lib/aloha/ecma5shims.js +23 -7
- data/vendor/assets/javascripts/aloha/lib/aloha/editable.js +57 -14
- data/vendor/assets/javascripts/aloha/lib/aloha/engine.js +9 -5
- data/vendor/assets/javascripts/aloha/lib/aloha/floatingmenu.js +288 -96
- data/vendor/assets/javascripts/aloha/lib/aloha/jquery.js +11 -1
- data/vendor/assets/javascripts/aloha/lib/aloha/markup.js +318 -40
- data/vendor/assets/javascripts/aloha/lib/aloha/repositorymanager.js +11 -10
- data/vendor/assets/javascripts/aloha/lib/aloha/selection.js +20 -1
- data/vendor/assets/javascripts/aloha/lib/aloha/sidebar.js +11 -1
- data/vendor/assets/javascripts/aloha/lib/jquery-plugin.js +10 -7
- data/vendor/assets/javascripts/aloha/lib/util/dom.js +18 -6
- data/vendor/assets/javascripts/aloha/lib/util/range.js +6 -6
- data/vendor/assets/javascripts/aloha/lib/vendor/ext-3.2.1/ext-all-debug.js +26 -2
- data/vendor/assets/javascripts/aloha/lib/vendor/jquery.store.js +39 -15
- data/vendor/assets/javascripts/aloha/plugins/common/abbr/lib/abbr-plugin.js +1 -0
- data/vendor/assets/javascripts/aloha/plugins/common/align/lib/align-plugin.js +344 -334
- data/vendor/assets/javascripts/aloha/plugins/common/block/css/block.css +65 -12
- data/vendor/assets/javascripts/aloha/plugins/common/block/lib/block-plugin.js +12 -15
- data/vendor/assets/javascripts/aloha/plugins/common/block/lib/block.js +796 -180
- data/vendor/assets/javascripts/aloha/plugins/common/block/lib/blockcontenthandler.js +54 -13
- data/vendor/assets/javascripts/aloha/plugins/common/block/lib/blockmanager.js +315 -78
- data/vendor/assets/javascripts/aloha/plugins/common/block/lib/editor.js +111 -8
- data/vendor/assets/javascripts/aloha/plugins/common/block/lib/editormanager.js +2 -0
- data/vendor/assets/javascripts/aloha/plugins/common/block/lib/jquery-ui-1.8.16.custom.min.js +198 -0
- data/vendor/assets/javascripts/aloha/plugins/common/block/lib/sidebarattributeeditor.js +7 -20
- data/vendor/assets/javascripts/aloha/plugins/common/characterpicker/lib/characterpicker-plugin.js +15 -3
- data/vendor/assets/javascripts/aloha/plugins/common/contenthandler/lib/sanitizecontenthandler.js +3 -2
- data/vendor/assets/javascripts/aloha/plugins/common/contenthandler/lib/wordcontenthandler.js +111 -5
- data/vendor/assets/javascripts/aloha/plugins/common/dom-to-xhtml/lib/dom-to-xhtml-plugin.js +29 -0
- data/vendor/assets/javascripts/aloha/plugins/common/dom-to-xhtml/lib/dom-to-xhtml.js +306 -0
- data/vendor/assets/javascripts/aloha/plugins/common/format/lib/format-plugin.js +59 -5
- data/vendor/assets/javascripts/aloha/plugins/common/format/nls/i18n.js +1 -1
- data/vendor/assets/javascripts/aloha/plugins/common/horizontalruler/lib/horizontalruler-plugin.js +18 -3
- data/vendor/assets/javascripts/aloha/plugins/common/image/img/crop-buttons.gif +0 -0
- data/vendor/assets/javascripts/aloha/plugins/common/image/lib/image-plugin.js +1629 -1601
- data/vendor/assets/javascripts/aloha/plugins/common/image/vendor/jcrop/jquery.jcrop.css +11 -0
- data/vendor/assets/javascripts/aloha/plugins/common/link/extra/linklist.js +8 -6
- data/vendor/assets/javascripts/aloha/plugins/common/link/lib/link-plugin.js +26 -10
- data/vendor/assets/javascripts/aloha/plugins/common/list/nls/de/i18n.js +5 -1
- data/vendor/assets/javascripts/aloha/plugins/common/paste/lib/paste-plugin.js +3 -4
- data/vendor/assets/javascripts/aloha/plugins/common/table/lib/table-cell.js +13 -12
- data/vendor/assets/javascripts/aloha/plugins/common/table/lib/table-plugin.js +108 -61
- data/vendor/assets/javascripts/aloha/plugins/common/table/lib/table-selection.js +61 -1
- data/vendor/assets/javascripts/aloha/plugins/common/table/lib/table.js +1 -0
- data/vendor/assets/javascripts/aloha/plugins/common/table/nls/de/i18n.js +28 -1
- data/vendor/assets/javascripts/aloha/plugins/common/table/nls/i18n.js +36 -10
- data/vendor/assets/javascripts/aloha/plugins/extra/browser/css/browser.jqgrid.css +292 -292
- data/vendor/assets/javascripts/aloha/plugins/extra/browser/lib/browser.js +28 -5
- data/vendor/assets/javascripts/aloha/plugins/extra/browser/lib/locale.js +2 -2
- data/vendor/assets/javascripts/aloha/plugins/extra/browser/vendor/grid.locale.de.js +6 -1
- data/vendor/assets/javascripts/aloha/plugins/extra/browser/vendor/grid.locale.en.js +5 -0
- data/vendor/assets/javascripts/aloha/plugins/extra/browser/vendor/jquery.jqGrid.js +5 -0
- data/vendor/assets/javascripts/aloha/plugins/extra/browser/vendor/jquery.jstree.js +6 -1
- data/vendor/assets/javascripts/aloha/plugins/extra/browser/vendor/jquery.ui.js +6 -1
- data/vendor/assets/javascripts/aloha/plugins/extra/browser/vendor/ui-layout.js +6 -1
- data/vendor/assets/javascripts/aloha/plugins/extra/cite/lib/cite-plugin.js +18 -4
- data/vendor/assets/javascripts/aloha/plugins/extra/formatlesspaste/lib/formatlesspaste-plugin.js +1 -1
- data/vendor/assets/javascripts/aloha/plugins/extra/linkbrowser/lib/linkbrowser-plugin.js +14 -2
- data/vendor/assets/javascripts/aloha/plugins/extra/numerated-headers/demo/js/aloha-config.js +2 -2
- data/vendor/assets/javascripts/aloha/plugins/extra/toc/lib/toc-plugin.js +382 -0
- data/vendor/assets/javascripts/aloha/plugins/extra/toc/nls/de/i18n.js +3 -0
- data/vendor/assets/javascripts/aloha/plugins/extra/toc/nls/i18n.js +4 -0
- metadata +15 -11
- data/vendor/assets/javascripts/aloha/plugins/extra/toc/i18n/de.json +0 -1
- data/vendor/assets/javascripts/aloha/plugins/extra/toc/i18n/en.json +0 -1
- data/vendor/assets/javascripts/aloha/plugins/extra/toc/src/toc.js +0 -350
@@ -13608,14 +13608,38 @@ Ext.DomHelper = function(){
|
|
13608
13608
|
setStart = 'setStart' + (endRe.test(where) ? 'After' : 'Before');
|
13609
13609
|
if (hash[where]) {
|
13610
13610
|
range[setStart](el);
|
13611
|
-
|
13611
|
+
|
13612
|
+
// Workaround for IE9, because it does not have this method anymore
|
13613
|
+
// When we have moved to jQuery we won't need this anymore
|
13614
|
+
if (typeof range.createContextualFragment === 'function') {
|
13615
|
+
frag = range.createContextualFragment(html);
|
13616
|
+
}
|
13617
|
+
else {
|
13618
|
+
frag = document.createDocumentFragment(),
|
13619
|
+
div = document.createElement("div");
|
13620
|
+
frag.appendChild(div);
|
13621
|
+
div.outerHTML = html;
|
13622
|
+
}
|
13623
|
+
|
13612
13624
|
el.parentNode.insertBefore(frag, where == beforebegin ? el : el.nextSibling);
|
13613
13625
|
return el[(where == beforebegin ? 'previous' : 'next') + 'Sibling'];
|
13614
13626
|
} else {
|
13615
13627
|
rangeEl = (where == afterbegin ? 'first' : 'last') + 'Child';
|
13616
13628
|
if (el.firstChild) {
|
13617
13629
|
range[setStart](el[rangeEl]);
|
13618
|
-
|
13630
|
+
|
13631
|
+
// Workaround for IE9, because it does not have this method anymore
|
13632
|
+
// When we have moved to jQuery we won't need this anymore
|
13633
|
+
if (typeof range.createContextualFragment === 'function') {
|
13634
|
+
frag = range.createContextualFragment(html);
|
13635
|
+
}
|
13636
|
+
else {
|
13637
|
+
frag = document.createDocumentFragment(),
|
13638
|
+
div = document.createElement("div");
|
13639
|
+
frag.appendChild(div);
|
13640
|
+
div.outerHTML = html;
|
13641
|
+
}
|
13642
|
+
|
13619
13643
|
if(where == afterbegin){
|
13620
13644
|
el.insertBefore(frag, el.firstChild);
|
13621
13645
|
}else{
|
@@ -61125,7 +61149,17 @@ Ext.grid.GroupingView.GROUP_ID = 1000;
|
|
61125
61149
|
*/
|
61126
61150
|
|
61127
61151
|
// define jquery and ext modules. They need to be available in global namespace
|
61128
|
-
define('aloha/jquery',[], function() {
|
61152
|
+
define('aloha/jquery',[], function() {
|
61153
|
+
// Work-around for http://bugs.jquery.com/ticket/9905
|
61154
|
+
// and https://github.com/alohaeditor/Aloha-Editor/issues/397
|
61155
|
+
if ( !Aloha.jQuery.support.getSetAttribute ) {
|
61156
|
+
( function( global ) {
|
61157
|
+
Aloha.jQuery.removeAttr = function( elem, name ) {
|
61158
|
+
elem.removeAttribute( name );
|
61159
|
+
};
|
61160
|
+
}( Aloha ));
|
61161
|
+
}
|
61162
|
+
|
61129
61163
|
return Aloha.jQuery;
|
61130
61164
|
});
|
61131
61165
|
|
@@ -61162,6 +61196,488 @@ define('aloha/ext',[], function() {
|
|
61162
61196
|
return Ext;
|
61163
61197
|
});
|
61164
61198
|
|
61199
|
+
/*
|
61200
|
+
http://www.JSON.org/json2.js
|
61201
|
+
2011-02-23
|
61202
|
+
|
61203
|
+
Public Domain.
|
61204
|
+
|
61205
|
+
NO WARRANTY EXPRESSED OR IMPLIED. USE AT YOUR OWN RISK.
|
61206
|
+
|
61207
|
+
See http://www.JSON.org/js.html
|
61208
|
+
|
61209
|
+
|
61210
|
+
This code should be minified before deployment.
|
61211
|
+
See http://javascript.crockford.com/jsmin.html
|
61212
|
+
|
61213
|
+
USE YOUR OWN COPY. IT IS EXTREMELY UNWISE TO LOAD CODE FROM SERVERS YOU DO
|
61214
|
+
NOT CONTROL.
|
61215
|
+
|
61216
|
+
|
61217
|
+
This file creates a global JSON object containing two methods: stringify
|
61218
|
+
and parse.
|
61219
|
+
|
61220
|
+
JSON.stringify(value, replacer, space)
|
61221
|
+
value any JavaScript value, usually an object or array.
|
61222
|
+
|
61223
|
+
replacer an optional parameter that determines how object
|
61224
|
+
values are stringified for objects. It can be a
|
61225
|
+
function or an array of strings.
|
61226
|
+
|
61227
|
+
space an optional parameter that specifies the indentation
|
61228
|
+
of nested structures. If it is omitted, the text will
|
61229
|
+
be packed without extra whitespace. If it is a number,
|
61230
|
+
it will specify the number of spaces to indent at each
|
61231
|
+
level. If it is a string (such as '\t' or ' '),
|
61232
|
+
it contains the characters used to indent at each level.
|
61233
|
+
|
61234
|
+
This method produces a JSON text from a JavaScript value.
|
61235
|
+
|
61236
|
+
When an object value is found, if the object contains a toJSON
|
61237
|
+
method, its toJSON method will be called and the result will be
|
61238
|
+
stringified. A toJSON method does not serialize: it returns the
|
61239
|
+
value represented by the name/value pair that should be serialized,
|
61240
|
+
or undefined if nothing should be serialized. The toJSON method
|
61241
|
+
will be passed the key associated with the value, and this will be
|
61242
|
+
bound to the value
|
61243
|
+
|
61244
|
+
For example, this would serialize Dates as ISO strings.
|
61245
|
+
|
61246
|
+
Date.prototype.toJSON = function (key) {
|
61247
|
+
function f(n) {
|
61248
|
+
// Format integers to have at least two digits.
|
61249
|
+
return n < 10 ? '0' + n : n;
|
61250
|
+
}
|
61251
|
+
|
61252
|
+
return this.getUTCFullYear() + '-' +
|
61253
|
+
f(this.getUTCMonth() + 1) + '-' +
|
61254
|
+
f(this.getUTCDate()) + 'T' +
|
61255
|
+
f(this.getUTCHours()) + ':' +
|
61256
|
+
f(this.getUTCMinutes()) + ':' +
|
61257
|
+
f(this.getUTCSeconds()) + 'Z';
|
61258
|
+
};
|
61259
|
+
|
61260
|
+
You can provide an optional replacer method. It will be passed the
|
61261
|
+
key and value of each member, with this bound to the containing
|
61262
|
+
object. The value that is returned from your method will be
|
61263
|
+
serialized. If your method returns undefined, then the member will
|
61264
|
+
be excluded from the serialization.
|
61265
|
+
|
61266
|
+
If the replacer parameter is an array of strings, then it will be
|
61267
|
+
used to select the members to be serialized. It filters the results
|
61268
|
+
such that only members with keys listed in the replacer array are
|
61269
|
+
stringified.
|
61270
|
+
|
61271
|
+
Values that do not have JSON representations, such as undefined or
|
61272
|
+
functions, will not be serialized. Such values in objects will be
|
61273
|
+
dropped; in arrays they will be replaced with null. You can use
|
61274
|
+
a replacer function to replace those with JSON values.
|
61275
|
+
JSON.stringify(undefined) returns undefined.
|
61276
|
+
|
61277
|
+
The optional space parameter produces a stringification of the
|
61278
|
+
value that is filled with line breaks and indentation to make it
|
61279
|
+
easier to read.
|
61280
|
+
|
61281
|
+
If the space parameter is a non-empty string, then that string will
|
61282
|
+
be used for indentation. If the space parameter is a number, then
|
61283
|
+
the indentation will be that many spaces.
|
61284
|
+
|
61285
|
+
Example:
|
61286
|
+
|
61287
|
+
text = JSON.stringify(['e', {pluribus: 'unum'}]);
|
61288
|
+
// text is '["e",{"pluribus":"unum"}]'
|
61289
|
+
|
61290
|
+
|
61291
|
+
text = JSON.stringify(['e', {pluribus: 'unum'}], null, '\t');
|
61292
|
+
// text is '[\n\t"e",\n\t{\n\t\t"pluribus": "unum"\n\t}\n]'
|
61293
|
+
|
61294
|
+
text = JSON.stringify([new Date()], function (key, value) {
|
61295
|
+
return this[key] instanceof Date ?
|
61296
|
+
'Date(' + this[key] + ')' : value;
|
61297
|
+
});
|
61298
|
+
// text is '["Date(---current time---)"]'
|
61299
|
+
|
61300
|
+
|
61301
|
+
JSON.parse(text, reviver)
|
61302
|
+
This method parses a JSON text to produce an object or array.
|
61303
|
+
It can throw a SyntaxError exception.
|
61304
|
+
|
61305
|
+
The optional reviver parameter is a function that can filter and
|
61306
|
+
transform the results. It receives each of the keys and values,
|
61307
|
+
and its return value is used instead of the original value.
|
61308
|
+
If it returns what it received, then the structure is not modified.
|
61309
|
+
If it returns undefined then the member is deleted.
|
61310
|
+
|
61311
|
+
Example:
|
61312
|
+
|
61313
|
+
// Parse the text. Values that look like ISO date strings will
|
61314
|
+
// be converted to Date objects.
|
61315
|
+
|
61316
|
+
myData = JSON.parse(text, function (key, value) {
|
61317
|
+
var a;
|
61318
|
+
if (typeof value === 'string') {
|
61319
|
+
a =
|
61320
|
+
/^(\d{4})-(\d{2})-(\d{2})T(\d{2}):(\d{2}):(\d{2}(?:\.\d*)?)Z$/.exec(value);
|
61321
|
+
if (a) {
|
61322
|
+
return new Date(Date.UTC(+a[1], +a[2] - 1, +a[3], +a[4],
|
61323
|
+
+a[5], +a[6]));
|
61324
|
+
}
|
61325
|
+
}
|
61326
|
+
return value;
|
61327
|
+
});
|
61328
|
+
|
61329
|
+
myData = JSON.parse('["Date(09/09/2001)"]', function (key, value) {
|
61330
|
+
var d;
|
61331
|
+
if (typeof value === 'string' &&
|
61332
|
+
value.slice(0, 5) === 'Date(' &&
|
61333
|
+
value.slice(-1) === ')') {
|
61334
|
+
d = new Date(value.slice(5, -1));
|
61335
|
+
if (d) {
|
61336
|
+
return d;
|
61337
|
+
}
|
61338
|
+
}
|
61339
|
+
return value;
|
61340
|
+
});
|
61341
|
+
|
61342
|
+
|
61343
|
+
This is a reference implementation. You are free to copy, modify, or
|
61344
|
+
redistribute.
|
61345
|
+
*/
|
61346
|
+
|
61347
|
+
/*jslint evil: true, strict: false, regexp: false */
|
61348
|
+
|
61349
|
+
/*members "", "\b", "\t", "\n", "\f", "\r", "\"", JSON, "\\", apply,
|
61350
|
+
call, charCodeAt, getUTCDate, getUTCFullYear, getUTCHours,
|
61351
|
+
getUTCMinutes, getUTCMonth, getUTCSeconds, hasOwnProperty, join,
|
61352
|
+
lastIndex, length, parse, prototype, push, replace, slice, stringify,
|
61353
|
+
test, toJSON, toString, valueOf
|
61354
|
+
*/
|
61355
|
+
|
61356
|
+
|
61357
|
+
// Create a JSON object only if one does not already exist. We create the
|
61358
|
+
// methods in a closure to avoid creating global variables.
|
61359
|
+
define( 'util/json2', [], function(){} );
|
61360
|
+
|
61361
|
+
var JSON;
|
61362
|
+
if (!JSON) {
|
61363
|
+
JSON = {};
|
61364
|
+
}
|
61365
|
+
|
61366
|
+
(function () {
|
61367
|
+
|
61368
|
+
|
61369
|
+
function f(n) {
|
61370
|
+
// Format integers to have at least two digits.
|
61371
|
+
return n < 10 ? '0' + n : n;
|
61372
|
+
}
|
61373
|
+
|
61374
|
+
if (typeof Date.prototype.toJSON !== 'function') {
|
61375
|
+
|
61376
|
+
Date.prototype.toJSON = function (key) {
|
61377
|
+
|
61378
|
+
return isFinite(this.valueOf()) ?
|
61379
|
+
this.getUTCFullYear() + '-' +
|
61380
|
+
f(this.getUTCMonth() + 1) + '-' +
|
61381
|
+
f(this.getUTCDate()) + 'T' +
|
61382
|
+
f(this.getUTCHours()) + ':' +
|
61383
|
+
f(this.getUTCMinutes()) + ':' +
|
61384
|
+
f(this.getUTCSeconds()) + 'Z' : null;
|
61385
|
+
};
|
61386
|
+
|
61387
|
+
String.prototype.toJSON =
|
61388
|
+
Number.prototype.toJSON =
|
61389
|
+
Boolean.prototype.toJSON = function (key) {
|
61390
|
+
return this.valueOf();
|
61391
|
+
};
|
61392
|
+
}
|
61393
|
+
|
61394
|
+
var cx = /[\u0000\u00ad\u0600-\u0604\u070f\u17b4\u17b5\u200c-\u200f\u2028-\u202f\u2060-\u206f\ufeff\ufff0-\uffff]/g,
|
61395
|
+
escapable = /[\\\"\x00-\x1f\x7f-\x9f\u00ad\u0600-\u0604\u070f\u17b4\u17b5\u200c-\u200f\u2028-\u202f\u2060-\u206f\ufeff\ufff0-\uffff]/g,
|
61396
|
+
gap,
|
61397
|
+
indent,
|
61398
|
+
meta = { // table of character substitutions
|
61399
|
+
'\b': '\\b',
|
61400
|
+
'\t': '\\t',
|
61401
|
+
'\n': '\\n',
|
61402
|
+
'\f': '\\f',
|
61403
|
+
'\r': '\\r',
|
61404
|
+
'"' : '\\"',
|
61405
|
+
'\\': '\\\\'
|
61406
|
+
},
|
61407
|
+
rep;
|
61408
|
+
|
61409
|
+
|
61410
|
+
function quote(string) {
|
61411
|
+
|
61412
|
+
// If the string contains no control characters, no quote characters, and no
|
61413
|
+
// backslash characters, then we can safely slap some quotes around it.
|
61414
|
+
// Otherwise we must also replace the offending characters with safe escape
|
61415
|
+
// sequences.
|
61416
|
+
|
61417
|
+
escapable.lastIndex = 0;
|
61418
|
+
return escapable.test(string) ? '"' + string.replace(escapable, function (a) {
|
61419
|
+
var c = meta[a];
|
61420
|
+
return typeof c === 'string' ? c :
|
61421
|
+
'\\u' + ('0000' + a.charCodeAt(0).toString(16)).slice(-4);
|
61422
|
+
}) + '"' : '"' + string + '"';
|
61423
|
+
}
|
61424
|
+
|
61425
|
+
|
61426
|
+
function str(key, holder) {
|
61427
|
+
|
61428
|
+
// Produce a string from holder[key].
|
61429
|
+
|
61430
|
+
var i, // The loop counter.
|
61431
|
+
k, // The member key.
|
61432
|
+
v, // The member value.
|
61433
|
+
length,
|
61434
|
+
mind = gap,
|
61435
|
+
partial,
|
61436
|
+
value = holder[key];
|
61437
|
+
|
61438
|
+
// If the value has a toJSON method, call it to obtain a replacement value.
|
61439
|
+
|
61440
|
+
if (value && typeof value === 'object' &&
|
61441
|
+
typeof value.toJSON === 'function') {
|
61442
|
+
value = value.toJSON(key);
|
61443
|
+
}
|
61444
|
+
|
61445
|
+
// If we were called with a replacer function, then call the replacer to
|
61446
|
+
// obtain a replacement value.
|
61447
|
+
|
61448
|
+
if (typeof rep === 'function') {
|
61449
|
+
value = rep.call(holder, key, value);
|
61450
|
+
}
|
61451
|
+
|
61452
|
+
// What happens next depends on the value's type.
|
61453
|
+
|
61454
|
+
switch (typeof value) {
|
61455
|
+
case 'string':
|
61456
|
+
return quote(value);
|
61457
|
+
|
61458
|
+
case 'number':
|
61459
|
+
|
61460
|
+
// JSON numbers must be finite. Encode non-finite numbers as null.
|
61461
|
+
|
61462
|
+
return isFinite(value) ? String(value) : 'null';
|
61463
|
+
|
61464
|
+
case 'boolean':
|
61465
|
+
case 'null':
|
61466
|
+
|
61467
|
+
// If the value is a boolean or null, convert it to a string. Note:
|
61468
|
+
// typeof null does not produce 'null'. The case is included here in
|
61469
|
+
// the remote chance that this gets fixed someday.
|
61470
|
+
|
61471
|
+
return String(value);
|
61472
|
+
|
61473
|
+
// If the type is 'object', we might be dealing with an object or an array or
|
61474
|
+
// null.
|
61475
|
+
|
61476
|
+
case 'object':
|
61477
|
+
|
61478
|
+
// Due to a specification blunder in ECMAScript, typeof null is 'object',
|
61479
|
+
// so watch out for that case.
|
61480
|
+
|
61481
|
+
if (!value) {
|
61482
|
+
return 'null';
|
61483
|
+
}
|
61484
|
+
|
61485
|
+
// Make an array to hold the partial results of stringifying this object value.
|
61486
|
+
|
61487
|
+
gap += indent;
|
61488
|
+
partial = [];
|
61489
|
+
|
61490
|
+
// Is the value an array?
|
61491
|
+
|
61492
|
+
if (Object.prototype.toString.apply(value) === '[object Array]') {
|
61493
|
+
|
61494
|
+
// The value is an array. Stringify every element. Use null as a placeholder
|
61495
|
+
// for non-JSON values.
|
61496
|
+
|
61497
|
+
length = value.length;
|
61498
|
+
for (i = 0; i < length; i += 1) {
|
61499
|
+
partial[i] = str(i, value) || 'null';
|
61500
|
+
}
|
61501
|
+
|
61502
|
+
// Join all of the elements together, separated with commas, and wrap them in
|
61503
|
+
// brackets.
|
61504
|
+
|
61505
|
+
v = partial.length === 0 ? '[]' : gap ?
|
61506
|
+
'[\n' + gap + partial.join(',\n' + gap) + '\n' + mind + ']' :
|
61507
|
+
'[' + partial.join(',') + ']';
|
61508
|
+
gap = mind;
|
61509
|
+
return v;
|
61510
|
+
}
|
61511
|
+
|
61512
|
+
// If the replacer is an array, use it to select the members to be stringified.
|
61513
|
+
|
61514
|
+
if (rep && typeof rep === 'object') {
|
61515
|
+
length = rep.length;
|
61516
|
+
for (i = 0; i < length; i += 1) {
|
61517
|
+
if (typeof rep[i] === 'string') {
|
61518
|
+
k = rep[i];
|
61519
|
+
v = str(k, value);
|
61520
|
+
if (v) {
|
61521
|
+
partial.push(quote(k) + (gap ? ': ' : ':') + v);
|
61522
|
+
}
|
61523
|
+
}
|
61524
|
+
}
|
61525
|
+
} else {
|
61526
|
+
|
61527
|
+
// Otherwise, iterate through all of the keys in the object.
|
61528
|
+
|
61529
|
+
for (k in value) {
|
61530
|
+
if (Object.prototype.hasOwnProperty.call(value, k)) {
|
61531
|
+
v = str(k, value);
|
61532
|
+
if (v) {
|
61533
|
+
partial.push(quote(k) + (gap ? ': ' : ':') + v);
|
61534
|
+
}
|
61535
|
+
}
|
61536
|
+
}
|
61537
|
+
}
|
61538
|
+
|
61539
|
+
// Join all of the member texts together, separated with commas,
|
61540
|
+
// and wrap them in braces.
|
61541
|
+
|
61542
|
+
v = partial.length === 0 ? '{}' : gap ?
|
61543
|
+
'{\n' + gap + partial.join(',\n' + gap) + '\n' + mind + '}' :
|
61544
|
+
'{' + partial.join(',') + '}';
|
61545
|
+
gap = mind;
|
61546
|
+
return v;
|
61547
|
+
}
|
61548
|
+
}
|
61549
|
+
|
61550
|
+
// If the JSON object does not yet have a stringify method, give it one.
|
61551
|
+
|
61552
|
+
if (typeof JSON.stringify !== 'function') {
|
61553
|
+
JSON.stringify = function (value, replacer, space) {
|
61554
|
+
|
61555
|
+
// The stringify method takes a value and an optional replacer, and an optional
|
61556
|
+
// space parameter, and returns a JSON text. The replacer can be a function
|
61557
|
+
// that can replace values, or an array of strings that will select the keys.
|
61558
|
+
// A default replacer method can be provided. Use of the space parameter can
|
61559
|
+
// produce text that is more easily readable.
|
61560
|
+
|
61561
|
+
var i;
|
61562
|
+
gap = '';
|
61563
|
+
indent = '';
|
61564
|
+
|
61565
|
+
// If the space parameter is a number, make an indent string containing that
|
61566
|
+
// many spaces.
|
61567
|
+
|
61568
|
+
if (typeof space === 'number') {
|
61569
|
+
for (i = 0; i < space; i += 1) {
|
61570
|
+
indent += ' ';
|
61571
|
+
}
|
61572
|
+
|
61573
|
+
// If the space parameter is a string, it will be used as the indent string.
|
61574
|
+
|
61575
|
+
} else if (typeof space === 'string') {
|
61576
|
+
indent = space;
|
61577
|
+
}
|
61578
|
+
|
61579
|
+
// If there is a replacer, it must be a function or an array.
|
61580
|
+
// Otherwise, throw an error.
|
61581
|
+
|
61582
|
+
rep = replacer;
|
61583
|
+
if (replacer && typeof replacer !== 'function' &&
|
61584
|
+
(typeof replacer !== 'object' ||
|
61585
|
+
typeof replacer.length !== 'number')) {
|
61586
|
+
throw new Error('JSON.stringify');
|
61587
|
+
}
|
61588
|
+
|
61589
|
+
// Make a fake root object containing our value under the key of ''.
|
61590
|
+
// Return the result of stringifying the value.
|
61591
|
+
|
61592
|
+
return str('', {'': value});
|
61593
|
+
};
|
61594
|
+
}
|
61595
|
+
|
61596
|
+
|
61597
|
+
// If the JSON object does not yet have a parse method, give it one.
|
61598
|
+
|
61599
|
+
if (typeof JSON.parse !== 'function') {
|
61600
|
+
JSON.parse = function (text, reviver) {
|
61601
|
+
|
61602
|
+
// The parse method takes a text and an optional reviver function, and returns
|
61603
|
+
// a JavaScript value if the text is a valid JSON text.
|
61604
|
+
|
61605
|
+
var j;
|
61606
|
+
|
61607
|
+
function walk(holder, key) {
|
61608
|
+
|
61609
|
+
// The walk method is used to recursively walk the resulting structure so
|
61610
|
+
// that modifications can be made.
|
61611
|
+
|
61612
|
+
var k, v, value = holder[key];
|
61613
|
+
if (value && typeof value === 'object') {
|
61614
|
+
for (k in value) {
|
61615
|
+
if (Object.prototype.hasOwnProperty.call(value, k)) {
|
61616
|
+
v = walk(value, k);
|
61617
|
+
if (v !== undefined) {
|
61618
|
+
value[k] = v;
|
61619
|
+
} else {
|
61620
|
+
delete value[k];
|
61621
|
+
}
|
61622
|
+
}
|
61623
|
+
}
|
61624
|
+
}
|
61625
|
+
return reviver.call(holder, key, value);
|
61626
|
+
}
|
61627
|
+
|
61628
|
+
|
61629
|
+
// Parsing happens in four stages. In the first stage, we replace certain
|
61630
|
+
// Unicode characters with escape sequences. JavaScript handles many characters
|
61631
|
+
// incorrectly, either silently deleting them, or treating them as line endings.
|
61632
|
+
|
61633
|
+
text = String(text);
|
61634
|
+
cx.lastIndex = 0;
|
61635
|
+
if (cx.test(text)) {
|
61636
|
+
text = text.replace(cx, function (a) {
|
61637
|
+
return '\\u' +
|
61638
|
+
('0000' + a.charCodeAt(0).toString(16)).slice(-4);
|
61639
|
+
});
|
61640
|
+
}
|
61641
|
+
|
61642
|
+
// In the second stage, we run the text against regular expressions that look
|
61643
|
+
// for non-JSON patterns. We are especially concerned with '()' and 'new'
|
61644
|
+
// because they can cause invocation, and '=' because it can cause mutation.
|
61645
|
+
// But just to be safe, we want to reject all unexpected forms.
|
61646
|
+
|
61647
|
+
// We split the second stage into 4 regexp operations in order to work around
|
61648
|
+
// crippling inefficiencies in IE's and Safari's regexp engines. First we
|
61649
|
+
// replace the JSON backslash pairs with '@' (a non-JSON character). Second, we
|
61650
|
+
// replace all simple value tokens with ']' characters. Third, we delete all
|
61651
|
+
// open brackets that follow a colon or comma or that begin the text. Finally,
|
61652
|
+
// we look to see that the remaining characters are only whitespace or ']' or
|
61653
|
+
// ',' or ':' or '{' or '}'. If that is so, then the text is safe for eval.
|
61654
|
+
|
61655
|
+
if (/^[\],:{}\s]*$/
|
61656
|
+
.test(text.replace(/\\(?:["\\\/bfnrt]|u[0-9a-fA-F]{4})/g, '@')
|
61657
|
+
.replace(/"[^"\\\n\r]*"|true|false|null|-?\d+(?:\.\d*)?(?:[eE][+\-]?\d+)?/g, ']')
|
61658
|
+
.replace(/(?:^|:|,)(?:\s*\[)+/g, ''))) {
|
61659
|
+
|
61660
|
+
// In the third stage we use the eval function to compile the text into a
|
61661
|
+
// JavaScript structure. The '{' operator is subject to a syntactic ambiguity
|
61662
|
+
// in JavaScript: it can begin a block or an object literal. We wrap the text
|
61663
|
+
// in parens to eliminate the ambiguity.
|
61664
|
+
|
61665
|
+
j = eval('(' + text + ')');
|
61666
|
+
|
61667
|
+
// In the optional fourth stage, we recursively walk the new structure, passing
|
61668
|
+
// each name/value pair to a reviver function for possible transformation.
|
61669
|
+
|
61670
|
+
return typeof reviver === 'function' ?
|
61671
|
+
walk({'': j}, '') : j;
|
61672
|
+
}
|
61673
|
+
|
61674
|
+
// If the text is not JSON parseable, then a SyntaxError is thrown.
|
61675
|
+
|
61676
|
+
throw new SyntaxError('JSON.parse');
|
61677
|
+
};
|
61678
|
+
}
|
61679
|
+
}());
|
61680
|
+
|
61165
61681
|
define('vendor/jquery.json-2.2.min',['aloha/jquery'],
|
61166
61682
|
function($) {$.toJSON=function(o)
|
61167
61683
|
{if(typeof(JSON)=='object'&&JSON.stringify)
|
@@ -61230,9 +61746,9 @@ return'"'+string+'"';};var _escapeable=/["\\\x00-\x1f\x7f-\x9f]/g;var _meta={'\b
|
|
61230
61746
|
|
61231
61747
|
define('vendor/jquery.store',[
|
61232
61748
|
'aloha/jquery',
|
61233
|
-
'
|
61749
|
+
'util/json2'
|
61234
61750
|
],
|
61235
|
-
function($,
|
61751
|
+
function($, __unused_json, undefined) {
|
61236
61752
|
|
61237
61753
|
/**********************************************************************************
|
61238
61754
|
* $.store base and convinience accessor
|
@@ -61242,19 +61758,6 @@ $.store = function( driver, serializers )
|
|
61242
61758
|
{
|
61243
61759
|
var JSON = window.JSON
|
61244
61760
|
that = this;
|
61245
|
-
|
61246
|
-
// IE fix
|
61247
|
-
if (typeof JSON === 'undefined' || !JSON) {
|
61248
|
-
/*
|
61249
|
-
* The GENTICS global namespace object. If GENTICS is already defined, the
|
61250
|
-
* existing GENTICS object will not be overwritten so that defined
|
61251
|
-
* namespaces are preserved.
|
61252
|
-
*/
|
61253
|
-
var JSON = function () {
|
61254
|
-
this.stringigy = function () {};
|
61255
|
-
this.parse = function () {};
|
61256
|
-
};
|
61257
|
-
}
|
61258
61761
|
|
61259
61762
|
if( typeof driver == 'string' )
|
61260
61763
|
{
|
@@ -61639,6 +62142,43 @@ $.store.serializers = {
|
|
61639
62142
|
}
|
61640
62143
|
};
|
61641
62144
|
|
62145
|
+
|
62146
|
+
// We don't want to use window storage for ie7 with aloha because this causes massive issues when dealing with frames.
|
62147
|
+
// Window.name will change the framename and this will cause links with target attribute to stop working properly.
|
62148
|
+
// We remove the windowName driver and add the void driver which won't store any information.
|
62149
|
+
if ( $.browser.msie && $.browser.version == "7.0" ) {
|
62150
|
+
delete($.store.drivers.windowName);
|
62151
|
+
var voidDriver = {
|
62152
|
+
ident: "$.store.drivers.voidDriver",
|
62153
|
+
scope: 'void',
|
62154
|
+
cache: {},
|
62155
|
+
encodes: true,
|
62156
|
+
available: function()
|
62157
|
+
{
|
62158
|
+
return true;
|
62159
|
+
},
|
62160
|
+
init: function()
|
62161
|
+
{
|
62162
|
+
},
|
62163
|
+
save: function()
|
62164
|
+
{
|
62165
|
+
},
|
62166
|
+
get: function( key )
|
62167
|
+
{
|
62168
|
+
},
|
62169
|
+
set: function( key, value )
|
62170
|
+
{
|
62171
|
+
},
|
62172
|
+
del: function( key )
|
62173
|
+
{
|
62174
|
+
},
|
62175
|
+
flush: function()
|
62176
|
+
{
|
62177
|
+
}
|
62178
|
+
};
|
62179
|
+
$.store.drivers.voidDriver=voidDriver;
|
62180
|
+
}
|
62181
|
+
|
61642
62182
|
});
|
61643
62183
|
|
61644
62184
|
/**
|
@@ -64884,488 +65424,6 @@ rangy.createModule("DomUtil", function(api, module) {
|
|
64884
65424
|
});
|
64885
65425
|
});
|
64886
65426
|
|
64887
|
-
/*
|
64888
|
-
http://www.JSON.org/json2.js
|
64889
|
-
2011-02-23
|
64890
|
-
|
64891
|
-
Public Domain.
|
64892
|
-
|
64893
|
-
NO WARRANTY EXPRESSED OR IMPLIED. USE AT YOUR OWN RISK.
|
64894
|
-
|
64895
|
-
See http://www.JSON.org/js.html
|
64896
|
-
|
64897
|
-
|
64898
|
-
This code should be minified before deployment.
|
64899
|
-
See http://javascript.crockford.com/jsmin.html
|
64900
|
-
|
64901
|
-
USE YOUR OWN COPY. IT IS EXTREMELY UNWISE TO LOAD CODE FROM SERVERS YOU DO
|
64902
|
-
NOT CONTROL.
|
64903
|
-
|
64904
|
-
|
64905
|
-
This file creates a global JSON object containing two methods: stringify
|
64906
|
-
and parse.
|
64907
|
-
|
64908
|
-
JSON.stringify(value, replacer, space)
|
64909
|
-
value any JavaScript value, usually an object or array.
|
64910
|
-
|
64911
|
-
replacer an optional parameter that determines how object
|
64912
|
-
values are stringified for objects. It can be a
|
64913
|
-
function or an array of strings.
|
64914
|
-
|
64915
|
-
space an optional parameter that specifies the indentation
|
64916
|
-
of nested structures. If it is omitted, the text will
|
64917
|
-
be packed without extra whitespace. If it is a number,
|
64918
|
-
it will specify the number of spaces to indent at each
|
64919
|
-
level. If it is a string (such as '\t' or ' '),
|
64920
|
-
it contains the characters used to indent at each level.
|
64921
|
-
|
64922
|
-
This method produces a JSON text from a JavaScript value.
|
64923
|
-
|
64924
|
-
When an object value is found, if the object contains a toJSON
|
64925
|
-
method, its toJSON method will be called and the result will be
|
64926
|
-
stringified. A toJSON method does not serialize: it returns the
|
64927
|
-
value represented by the name/value pair that should be serialized,
|
64928
|
-
or undefined if nothing should be serialized. The toJSON method
|
64929
|
-
will be passed the key associated with the value, and this will be
|
64930
|
-
bound to the value
|
64931
|
-
|
64932
|
-
For example, this would serialize Dates as ISO strings.
|
64933
|
-
|
64934
|
-
Date.prototype.toJSON = function (key) {
|
64935
|
-
function f(n) {
|
64936
|
-
// Format integers to have at least two digits.
|
64937
|
-
return n < 10 ? '0' + n : n;
|
64938
|
-
}
|
64939
|
-
|
64940
|
-
return this.getUTCFullYear() + '-' +
|
64941
|
-
f(this.getUTCMonth() + 1) + '-' +
|
64942
|
-
f(this.getUTCDate()) + 'T' +
|
64943
|
-
f(this.getUTCHours()) + ':' +
|
64944
|
-
f(this.getUTCMinutes()) + ':' +
|
64945
|
-
f(this.getUTCSeconds()) + 'Z';
|
64946
|
-
};
|
64947
|
-
|
64948
|
-
You can provide an optional replacer method. It will be passed the
|
64949
|
-
key and value of each member, with this bound to the containing
|
64950
|
-
object. The value that is returned from your method will be
|
64951
|
-
serialized. If your method returns undefined, then the member will
|
64952
|
-
be excluded from the serialization.
|
64953
|
-
|
64954
|
-
If the replacer parameter is an array of strings, then it will be
|
64955
|
-
used to select the members to be serialized. It filters the results
|
64956
|
-
such that only members with keys listed in the replacer array are
|
64957
|
-
stringified.
|
64958
|
-
|
64959
|
-
Values that do not have JSON representations, such as undefined or
|
64960
|
-
functions, will not be serialized. Such values in objects will be
|
64961
|
-
dropped; in arrays they will be replaced with null. You can use
|
64962
|
-
a replacer function to replace those with JSON values.
|
64963
|
-
JSON.stringify(undefined) returns undefined.
|
64964
|
-
|
64965
|
-
The optional space parameter produces a stringification of the
|
64966
|
-
value that is filled with line breaks and indentation to make it
|
64967
|
-
easier to read.
|
64968
|
-
|
64969
|
-
If the space parameter is a non-empty string, then that string will
|
64970
|
-
be used for indentation. If the space parameter is a number, then
|
64971
|
-
the indentation will be that many spaces.
|
64972
|
-
|
64973
|
-
Example:
|
64974
|
-
|
64975
|
-
text = JSON.stringify(['e', {pluribus: 'unum'}]);
|
64976
|
-
// text is '["e",{"pluribus":"unum"}]'
|
64977
|
-
|
64978
|
-
|
64979
|
-
text = JSON.stringify(['e', {pluribus: 'unum'}], null, '\t');
|
64980
|
-
// text is '[\n\t"e",\n\t{\n\t\t"pluribus": "unum"\n\t}\n]'
|
64981
|
-
|
64982
|
-
text = JSON.stringify([new Date()], function (key, value) {
|
64983
|
-
return this[key] instanceof Date ?
|
64984
|
-
'Date(' + this[key] + ')' : value;
|
64985
|
-
});
|
64986
|
-
// text is '["Date(---current time---)"]'
|
64987
|
-
|
64988
|
-
|
64989
|
-
JSON.parse(text, reviver)
|
64990
|
-
This method parses a JSON text to produce an object or array.
|
64991
|
-
It can throw a SyntaxError exception.
|
64992
|
-
|
64993
|
-
The optional reviver parameter is a function that can filter and
|
64994
|
-
transform the results. It receives each of the keys and values,
|
64995
|
-
and its return value is used instead of the original value.
|
64996
|
-
If it returns what it received, then the structure is not modified.
|
64997
|
-
If it returns undefined then the member is deleted.
|
64998
|
-
|
64999
|
-
Example:
|
65000
|
-
|
65001
|
-
// Parse the text. Values that look like ISO date strings will
|
65002
|
-
// be converted to Date objects.
|
65003
|
-
|
65004
|
-
myData = JSON.parse(text, function (key, value) {
|
65005
|
-
var a;
|
65006
|
-
if (typeof value === 'string') {
|
65007
|
-
a =
|
65008
|
-
/^(\d{4})-(\d{2})-(\d{2})T(\d{2}):(\d{2}):(\d{2}(?:\.\d*)?)Z$/.exec(value);
|
65009
|
-
if (a) {
|
65010
|
-
return new Date(Date.UTC(+a[1], +a[2] - 1, +a[3], +a[4],
|
65011
|
-
+a[5], +a[6]));
|
65012
|
-
}
|
65013
|
-
}
|
65014
|
-
return value;
|
65015
|
-
});
|
65016
|
-
|
65017
|
-
myData = JSON.parse('["Date(09/09/2001)"]', function (key, value) {
|
65018
|
-
var d;
|
65019
|
-
if (typeof value === 'string' &&
|
65020
|
-
value.slice(0, 5) === 'Date(' &&
|
65021
|
-
value.slice(-1) === ')') {
|
65022
|
-
d = new Date(value.slice(5, -1));
|
65023
|
-
if (d) {
|
65024
|
-
return d;
|
65025
|
-
}
|
65026
|
-
}
|
65027
|
-
return value;
|
65028
|
-
});
|
65029
|
-
|
65030
|
-
|
65031
|
-
This is a reference implementation. You are free to copy, modify, or
|
65032
|
-
redistribute.
|
65033
|
-
*/
|
65034
|
-
|
65035
|
-
/*jslint evil: true, strict: false, regexp: false */
|
65036
|
-
|
65037
|
-
/*members "", "\b", "\t", "\n", "\f", "\r", "\"", JSON, "\\", apply,
|
65038
|
-
call, charCodeAt, getUTCDate, getUTCFullYear, getUTCHours,
|
65039
|
-
getUTCMinutes, getUTCMonth, getUTCSeconds, hasOwnProperty, join,
|
65040
|
-
lastIndex, length, parse, prototype, push, replace, slice, stringify,
|
65041
|
-
test, toJSON, toString, valueOf
|
65042
|
-
*/
|
65043
|
-
|
65044
|
-
|
65045
|
-
// Create a JSON object only if one does not already exist. We create the
|
65046
|
-
// methods in a closure to avoid creating global variables.
|
65047
|
-
define( 'util/json2', [], function(){} );
|
65048
|
-
|
65049
|
-
var JSON;
|
65050
|
-
if (!JSON) {
|
65051
|
-
JSON = {};
|
65052
|
-
}
|
65053
|
-
|
65054
|
-
(function () {
|
65055
|
-
|
65056
|
-
|
65057
|
-
function f(n) {
|
65058
|
-
// Format integers to have at least two digits.
|
65059
|
-
return n < 10 ? '0' + n : n;
|
65060
|
-
}
|
65061
|
-
|
65062
|
-
if (typeof Date.prototype.toJSON !== 'function') {
|
65063
|
-
|
65064
|
-
Date.prototype.toJSON = function (key) {
|
65065
|
-
|
65066
|
-
return isFinite(this.valueOf()) ?
|
65067
|
-
this.getUTCFullYear() + '-' +
|
65068
|
-
f(this.getUTCMonth() + 1) + '-' +
|
65069
|
-
f(this.getUTCDate()) + 'T' +
|
65070
|
-
f(this.getUTCHours()) + ':' +
|
65071
|
-
f(this.getUTCMinutes()) + ':' +
|
65072
|
-
f(this.getUTCSeconds()) + 'Z' : null;
|
65073
|
-
};
|
65074
|
-
|
65075
|
-
String.prototype.toJSON =
|
65076
|
-
Number.prototype.toJSON =
|
65077
|
-
Boolean.prototype.toJSON = function (key) {
|
65078
|
-
return this.valueOf();
|
65079
|
-
};
|
65080
|
-
}
|
65081
|
-
|
65082
|
-
var cx = /[\u0000\u00ad\u0600-\u0604\u070f\u17b4\u17b5\u200c-\u200f\u2028-\u202f\u2060-\u206f\ufeff\ufff0-\uffff]/g,
|
65083
|
-
escapable = /[\\\"\x00-\x1f\x7f-\x9f\u00ad\u0600-\u0604\u070f\u17b4\u17b5\u200c-\u200f\u2028-\u202f\u2060-\u206f\ufeff\ufff0-\uffff]/g,
|
65084
|
-
gap,
|
65085
|
-
indent,
|
65086
|
-
meta = { // table of character substitutions
|
65087
|
-
'\b': '\\b',
|
65088
|
-
'\t': '\\t',
|
65089
|
-
'\n': '\\n',
|
65090
|
-
'\f': '\\f',
|
65091
|
-
'\r': '\\r',
|
65092
|
-
'"' : '\\"',
|
65093
|
-
'\\': '\\\\'
|
65094
|
-
},
|
65095
|
-
rep;
|
65096
|
-
|
65097
|
-
|
65098
|
-
function quote(string) {
|
65099
|
-
|
65100
|
-
// If the string contains no control characters, no quote characters, and no
|
65101
|
-
// backslash characters, then we can safely slap some quotes around it.
|
65102
|
-
// Otherwise we must also replace the offending characters with safe escape
|
65103
|
-
// sequences.
|
65104
|
-
|
65105
|
-
escapable.lastIndex = 0;
|
65106
|
-
return escapable.test(string) ? '"' + string.replace(escapable, function (a) {
|
65107
|
-
var c = meta[a];
|
65108
|
-
return typeof c === 'string' ? c :
|
65109
|
-
'\\u' + ('0000' + a.charCodeAt(0).toString(16)).slice(-4);
|
65110
|
-
}) + '"' : '"' + string + '"';
|
65111
|
-
}
|
65112
|
-
|
65113
|
-
|
65114
|
-
function str(key, holder) {
|
65115
|
-
|
65116
|
-
// Produce a string from holder[key].
|
65117
|
-
|
65118
|
-
var i, // The loop counter.
|
65119
|
-
k, // The member key.
|
65120
|
-
v, // The member value.
|
65121
|
-
length,
|
65122
|
-
mind = gap,
|
65123
|
-
partial,
|
65124
|
-
value = holder[key];
|
65125
|
-
|
65126
|
-
// If the value has a toJSON method, call it to obtain a replacement value.
|
65127
|
-
|
65128
|
-
if (value && typeof value === 'object' &&
|
65129
|
-
typeof value.toJSON === 'function') {
|
65130
|
-
value = value.toJSON(key);
|
65131
|
-
}
|
65132
|
-
|
65133
|
-
// If we were called with a replacer function, then call the replacer to
|
65134
|
-
// obtain a replacement value.
|
65135
|
-
|
65136
|
-
if (typeof rep === 'function') {
|
65137
|
-
value = rep.call(holder, key, value);
|
65138
|
-
}
|
65139
|
-
|
65140
|
-
// What happens next depends on the value's type.
|
65141
|
-
|
65142
|
-
switch (typeof value) {
|
65143
|
-
case 'string':
|
65144
|
-
return quote(value);
|
65145
|
-
|
65146
|
-
case 'number':
|
65147
|
-
|
65148
|
-
// JSON numbers must be finite. Encode non-finite numbers as null.
|
65149
|
-
|
65150
|
-
return isFinite(value) ? String(value) : 'null';
|
65151
|
-
|
65152
|
-
case 'boolean':
|
65153
|
-
case 'null':
|
65154
|
-
|
65155
|
-
// If the value is a boolean or null, convert it to a string. Note:
|
65156
|
-
// typeof null does not produce 'null'. The case is included here in
|
65157
|
-
// the remote chance that this gets fixed someday.
|
65158
|
-
|
65159
|
-
return String(value);
|
65160
|
-
|
65161
|
-
// If the type is 'object', we might be dealing with an object or an array or
|
65162
|
-
// null.
|
65163
|
-
|
65164
|
-
case 'object':
|
65165
|
-
|
65166
|
-
// Due to a specification blunder in ECMAScript, typeof null is 'object',
|
65167
|
-
// so watch out for that case.
|
65168
|
-
|
65169
|
-
if (!value) {
|
65170
|
-
return 'null';
|
65171
|
-
}
|
65172
|
-
|
65173
|
-
// Make an array to hold the partial results of stringifying this object value.
|
65174
|
-
|
65175
|
-
gap += indent;
|
65176
|
-
partial = [];
|
65177
|
-
|
65178
|
-
// Is the value an array?
|
65179
|
-
|
65180
|
-
if (Object.prototype.toString.apply(value) === '[object Array]') {
|
65181
|
-
|
65182
|
-
// The value is an array. Stringify every element. Use null as a placeholder
|
65183
|
-
// for non-JSON values.
|
65184
|
-
|
65185
|
-
length = value.length;
|
65186
|
-
for (i = 0; i < length; i += 1) {
|
65187
|
-
partial[i] = str(i, value) || 'null';
|
65188
|
-
}
|
65189
|
-
|
65190
|
-
// Join all of the elements together, separated with commas, and wrap them in
|
65191
|
-
// brackets.
|
65192
|
-
|
65193
|
-
v = partial.length === 0 ? '[]' : gap ?
|
65194
|
-
'[\n' + gap + partial.join(',\n' + gap) + '\n' + mind + ']' :
|
65195
|
-
'[' + partial.join(',') + ']';
|
65196
|
-
gap = mind;
|
65197
|
-
return v;
|
65198
|
-
}
|
65199
|
-
|
65200
|
-
// If the replacer is an array, use it to select the members to be stringified.
|
65201
|
-
|
65202
|
-
if (rep && typeof rep === 'object') {
|
65203
|
-
length = rep.length;
|
65204
|
-
for (i = 0; i < length; i += 1) {
|
65205
|
-
if (typeof rep[i] === 'string') {
|
65206
|
-
k = rep[i];
|
65207
|
-
v = str(k, value);
|
65208
|
-
if (v) {
|
65209
|
-
partial.push(quote(k) + (gap ? ': ' : ':') + v);
|
65210
|
-
}
|
65211
|
-
}
|
65212
|
-
}
|
65213
|
-
} else {
|
65214
|
-
|
65215
|
-
// Otherwise, iterate through all of the keys in the object.
|
65216
|
-
|
65217
|
-
for (k in value) {
|
65218
|
-
if (Object.prototype.hasOwnProperty.call(value, k)) {
|
65219
|
-
v = str(k, value);
|
65220
|
-
if (v) {
|
65221
|
-
partial.push(quote(k) + (gap ? ': ' : ':') + v);
|
65222
|
-
}
|
65223
|
-
}
|
65224
|
-
}
|
65225
|
-
}
|
65226
|
-
|
65227
|
-
// Join all of the member texts together, separated with commas,
|
65228
|
-
// and wrap them in braces.
|
65229
|
-
|
65230
|
-
v = partial.length === 0 ? '{}' : gap ?
|
65231
|
-
'{\n' + gap + partial.join(',\n' + gap) + '\n' + mind + '}' :
|
65232
|
-
'{' + partial.join(',') + '}';
|
65233
|
-
gap = mind;
|
65234
|
-
return v;
|
65235
|
-
}
|
65236
|
-
}
|
65237
|
-
|
65238
|
-
// If the JSON object does not yet have a stringify method, give it one.
|
65239
|
-
|
65240
|
-
if (typeof JSON.stringify !== 'function') {
|
65241
|
-
JSON.stringify = function (value, replacer, space) {
|
65242
|
-
|
65243
|
-
// The stringify method takes a value and an optional replacer, and an optional
|
65244
|
-
// space parameter, and returns a JSON text. The replacer can be a function
|
65245
|
-
// that can replace values, or an array of strings that will select the keys.
|
65246
|
-
// A default replacer method can be provided. Use of the space parameter can
|
65247
|
-
// produce text that is more easily readable.
|
65248
|
-
|
65249
|
-
var i;
|
65250
|
-
gap = '';
|
65251
|
-
indent = '';
|
65252
|
-
|
65253
|
-
// If the space parameter is a number, make an indent string containing that
|
65254
|
-
// many spaces.
|
65255
|
-
|
65256
|
-
if (typeof space === 'number') {
|
65257
|
-
for (i = 0; i < space; i += 1) {
|
65258
|
-
indent += ' ';
|
65259
|
-
}
|
65260
|
-
|
65261
|
-
// If the space parameter is a string, it will be used as the indent string.
|
65262
|
-
|
65263
|
-
} else if (typeof space === 'string') {
|
65264
|
-
indent = space;
|
65265
|
-
}
|
65266
|
-
|
65267
|
-
// If there is a replacer, it must be a function or an array.
|
65268
|
-
// Otherwise, throw an error.
|
65269
|
-
|
65270
|
-
rep = replacer;
|
65271
|
-
if (replacer && typeof replacer !== 'function' &&
|
65272
|
-
(typeof replacer !== 'object' ||
|
65273
|
-
typeof replacer.length !== 'number')) {
|
65274
|
-
throw new Error('JSON.stringify');
|
65275
|
-
}
|
65276
|
-
|
65277
|
-
// Make a fake root object containing our value under the key of ''.
|
65278
|
-
// Return the result of stringifying the value.
|
65279
|
-
|
65280
|
-
return str('', {'': value});
|
65281
|
-
};
|
65282
|
-
}
|
65283
|
-
|
65284
|
-
|
65285
|
-
// If the JSON object does not yet have a parse method, give it one.
|
65286
|
-
|
65287
|
-
if (typeof JSON.parse !== 'function') {
|
65288
|
-
JSON.parse = function (text, reviver) {
|
65289
|
-
|
65290
|
-
// The parse method takes a text and an optional reviver function, and returns
|
65291
|
-
// a JavaScript value if the text is a valid JSON text.
|
65292
|
-
|
65293
|
-
var j;
|
65294
|
-
|
65295
|
-
function walk(holder, key) {
|
65296
|
-
|
65297
|
-
// The walk method is used to recursively walk the resulting structure so
|
65298
|
-
// that modifications can be made.
|
65299
|
-
|
65300
|
-
var k, v, value = holder[key];
|
65301
|
-
if (value && typeof value === 'object') {
|
65302
|
-
for (k in value) {
|
65303
|
-
if (Object.prototype.hasOwnProperty.call(value, k)) {
|
65304
|
-
v = walk(value, k);
|
65305
|
-
if (v !== undefined) {
|
65306
|
-
value[k] = v;
|
65307
|
-
} else {
|
65308
|
-
delete value[k];
|
65309
|
-
}
|
65310
|
-
}
|
65311
|
-
}
|
65312
|
-
}
|
65313
|
-
return reviver.call(holder, key, value);
|
65314
|
-
}
|
65315
|
-
|
65316
|
-
|
65317
|
-
// Parsing happens in four stages. In the first stage, we replace certain
|
65318
|
-
// Unicode characters with escape sequences. JavaScript handles many characters
|
65319
|
-
// incorrectly, either silently deleting them, or treating them as line endings.
|
65320
|
-
|
65321
|
-
text = String(text);
|
65322
|
-
cx.lastIndex = 0;
|
65323
|
-
if (cx.test(text)) {
|
65324
|
-
text = text.replace(cx, function (a) {
|
65325
|
-
return '\\u' +
|
65326
|
-
('0000' + a.charCodeAt(0).toString(16)).slice(-4);
|
65327
|
-
});
|
65328
|
-
}
|
65329
|
-
|
65330
|
-
// In the second stage, we run the text against regular expressions that look
|
65331
|
-
// for non-JSON patterns. We are especially concerned with '()' and 'new'
|
65332
|
-
// because they can cause invocation, and '=' because it can cause mutation.
|
65333
|
-
// But just to be safe, we want to reject all unexpected forms.
|
65334
|
-
|
65335
|
-
// We split the second stage into 4 regexp operations in order to work around
|
65336
|
-
// crippling inefficiencies in IE's and Safari's regexp engines. First we
|
65337
|
-
// replace the JSON backslash pairs with '@' (a non-JSON character). Second, we
|
65338
|
-
// replace all simple value tokens with ']' characters. Third, we delete all
|
65339
|
-
// open brackets that follow a colon or comma or that begin the text. Finally,
|
65340
|
-
// we look to see that the remaining characters are only whitespace or ']' or
|
65341
|
-
// ',' or ':' or '{' or '}'. If that is so, then the text is safe for eval.
|
65342
|
-
|
65343
|
-
if (/^[\],:{}\s]*$/
|
65344
|
-
.test(text.replace(/\\(?:["\\\/bfnrt]|u[0-9a-fA-F]{4})/g, '@')
|
65345
|
-
.replace(/"[^"\\\n\r]*"|true|false|null|-?\d+(?:\.\d*)?(?:[eE][+\-]?\d+)?/g, ']')
|
65346
|
-
.replace(/(?:^|:|,)(?:\s*\[)+/g, ''))) {
|
65347
|
-
|
65348
|
-
// In the third stage we use the eval function to compile the text into a
|
65349
|
-
// JavaScript structure. The '{' operator is subject to a syntactic ambiguity
|
65350
|
-
// in JavaScript: it can begin a block or an object literal. We wrap the text
|
65351
|
-
// in parens to eliminate the ambiguity.
|
65352
|
-
|
65353
|
-
j = eval('(' + text + ')');
|
65354
|
-
|
65355
|
-
// In the optional fourth stage, we recursively walk the new structure, passing
|
65356
|
-
// each name/value pair to a reviver function for possible transformation.
|
65357
|
-
|
65358
|
-
return typeof reviver === 'function' ?
|
65359
|
-
walk({'': j}, '') : j;
|
65360
|
-
}
|
65361
|
-
|
65362
|
-
// If the text is not JSON parseable, then a SyntaxError is thrown.
|
65363
|
-
|
65364
|
-
throw new SyntaxError('JSON.parse');
|
65365
|
-
};
|
65366
|
-
}
|
65367
|
-
}());
|
65368
|
-
|
65369
65427
|
/* Simple JavaScript Inheritance
|
65370
65428
|
* By John Resig http://ejohn.org/
|
65371
65429
|
* MIT Licensed.
|
@@ -65512,9 +65570,21 @@ GENTICS.Utils.guid = function () {
|
|
65512
65570
|
|
65513
65571
|
})(window);
|
65514
65572
|
|
65573
|
+
/**
|
65574
|
+
* ecma5schims.js - Shim for ECMA5 compatibility
|
65575
|
+
* (http://en.wikipedia.org/wiki/Shim_%28computing%29)
|
65576
|
+
*
|
65577
|
+
* A shim library that implements common functions that are missing on some
|
65578
|
+
* environments in order to complete ECMA5 compatibility across all major
|
65579
|
+
* browsers.
|
65580
|
+
*
|
65581
|
+
* TODO: This code needs to be refactored so as to conform to Aloha coding
|
65582
|
+
* standards. It is also severly lacking in documentation. Please take
|
65583
|
+
* note of: https://github.com/alohaeditor/Aloha-Editor/wiki/Commit-Checklist .
|
65584
|
+
*/
|
65515
65585
|
|
65516
|
-
define('aloha/ecma5shims',[],
|
65517
|
-
|
65586
|
+
define('aloha/ecma5shims',[], function(){
|
65587
|
+
|
65518
65588
|
|
65519
65589
|
var shims = {
|
65520
65590
|
// Function bind
|
@@ -65750,12 +65820,16 @@ function(){
|
|
65750
65820
|
if (node2 != useNode2) useNode2.parentNode.removeChild(useNode2);
|
65751
65821
|
return result;
|
65752
65822
|
|
65753
|
-
|
65754
65823
|
//node.ownerDocument gives the document object, which isn't the right info for a disconnect
|
65755
|
-
function getRootParent(node) {
|
65756
|
-
|
65757
|
-
|
65758
|
-
|
65824
|
+
function getRootParent( node ) {
|
65825
|
+
var parent = null;
|
65826
|
+
|
65827
|
+
if ( node ) {
|
65828
|
+
do { parent = node; }
|
65829
|
+
while ( node = node.parentNode );
|
65830
|
+
}
|
65831
|
+
|
65832
|
+
return parent;
|
65759
65833
|
}
|
65760
65834
|
|
65761
65835
|
//Compare Position - MIT Licensed, John Resig; http://ejohn.org/blog/comparing-document-position/
|
@@ -65897,22 +65971,22 @@ var Dom = Class.extend({
|
|
65897
65971
|
*/
|
65898
65972
|
tags: {
|
65899
65973
|
'flow' : [ 'a', 'abbr', 'address', 'area', 'article', 'aside', 'audio',
|
65900
|
-
'b', 'bdo', 'blockquote', 'br', 'button', 'canvas', 'cite', 'code',
|
65974
|
+
'b', 'bdi','bdo', 'blockquote', 'br', 'button', 'canvas', 'cite', 'code',
|
65901
65975
|
'command', 'datalist', 'del', 'details', 'dfn', 'div', 'dl', 'em',
|
65902
65976
|
'embed', 'fieldset', 'figure', 'footer', 'form', 'h1', 'h2', 'h3',
|
65903
65977
|
'h4', 'h5', 'h6', 'header', 'hgroup', 'hr', 'i', 'iframe', 'img',
|
65904
65978
|
'input', 'ins', 'kbd', 'keygen', 'label', 'map', 'mark', 'math',
|
65905
65979
|
'menu', 'meter', 'nav', 'noscript', 'object', 'ol', 'output', 'p',
|
65906
|
-
'pre', 'progress', 'q', 'ruby', 'samp', 'script', 'section',
|
65980
|
+
'pre', 'progress', 'q', 'ruby', 's', 'samp', 'script', 'section',
|
65907
65981
|
'select', 'small', 'span', 'strong', 'style', 'sub', 'sup', 'svg',
|
65908
|
-
'table', 'textarea', 'time', 'ul', 'var', 'video', 'wbr', '#text' ],
|
65909
|
-
'phrasing' : [ 'a', 'abbr', 'area', 'audio', 'b', 'bdo', 'br', 'button',
|
65982
|
+
'table', 'textarea', 'time', 'u', 'ul', 'var', 'video', 'wbr', '#text' ],
|
65983
|
+
'phrasing' : [ 'a', 'abbr', 'area', 'audio', 'b', 'bdi', 'bdo', 'br', 'button',
|
65910
65984
|
'canvas', 'cite', 'code', 'command', 'datalist', 'del', 'dfn',
|
65911
65985
|
'em', 'embed', 'i', 'iframe', 'img', 'input', 'ins', 'kbd',
|
65912
65986
|
'keygen', 'label', 'map', 'mark', 'math', 'meter', 'noscript',
|
65913
65987
|
'object', 'output', 'progress', 'q', 'ruby', 'samp', 'script',
|
65914
65988
|
'select', 'small', 'span', 'strong', 'sub', 'sup', 'svg',
|
65915
|
-
'textarea', 'time', 'var', 'video', 'wbr', '#text' ]
|
65989
|
+
'textarea', 'time', 'u', 'var', 'video', 'wbr', '#text' ]
|
65916
65990
|
},
|
65917
65991
|
|
65918
65992
|
/**
|
@@ -66025,6 +66099,7 @@ var Dom = Class.extend({
|
|
66025
66099
|
'title' : '#text',
|
66026
66100
|
'tr' : ['th', 'td'],
|
66027
66101
|
'track' : 'empty',
|
66102
|
+
'u' : 'phrasing',
|
66028
66103
|
'ul' : 'li',
|
66029
66104
|
'var' : 'phrasing',
|
66030
66105
|
'video' : 'source', // transparent
|
@@ -66462,8 +66537,19 @@ var Dom = Class.extend({
|
|
66462
66537
|
|
66463
66538
|
// iterate through all sub nodes
|
66464
66539
|
startObject.contents().each(function(index) {
|
66540
|
+
|
66541
|
+
// Try to read the nodeType property and return if we do not have permission
|
66542
|
+
// ie.: frame document to an external URL
|
66543
|
+
var nodeType;
|
66544
|
+
try {
|
66545
|
+
nodeType = this.nodeType;
|
66546
|
+
}
|
66547
|
+
catch (e) {
|
66548
|
+
return;
|
66549
|
+
}
|
66550
|
+
|
66465
66551
|
// decide further actions by node type
|
66466
|
-
switch(
|
66552
|
+
switch(nodeType) {
|
66467
66553
|
// found a non-text node
|
66468
66554
|
case 1:
|
66469
66555
|
if (prevNode && prevNode.nodeName == this.nodeName) {
|
@@ -67639,6 +67725,12 @@ define('aloha/core',[
|
|
67639
67725
|
function ( jQuery, PluginManager ) {
|
67640
67726
|
|
67641
67727
|
|
67728
|
+
// Aloha Editor does not support Internet Explorer 6. ExtJS style fixes for
|
67729
|
+
// IE6 which are applied through the "ext-ie6" class cause visual bugs in
|
67730
|
+
// IE9, and so we remove it so that IE6 fixes are not applied.
|
67731
|
+
Aloha.ready(function() {
|
67732
|
+
jQuery('.ext-ie6').removeClass('ext-ie6');
|
67733
|
+
});
|
67642
67734
|
|
67643
67735
|
//----------------------------------------
|
67644
67736
|
// Private variables
|
@@ -67838,6 +67930,8 @@ function ( jQuery, PluginManager ) {
|
|
67838
67930
|
* Fetches plugins the user wants to have loaded. Returns all plugins the user
|
67839
67931
|
* has specified with the data-plugins property as array, with the bundle
|
67840
67932
|
* name in front.
|
67933
|
+
* It's also possible to use 'Aloha.settings.plugins.load' to define the plugins
|
67934
|
+
* to load.
|
67841
67935
|
*
|
67842
67936
|
* @return array
|
67843
67937
|
* @internal
|
@@ -67847,13 +67941,20 @@ function ( jQuery, PluginManager ) {
|
|
67847
67941
|
var
|
67848
67942
|
plugins = jQuery('[data-aloha-plugins]').data('aloha-plugins');
|
67849
67943
|
|
67944
|
+
// load aloha plugins from config
|
67945
|
+
if ( typeof Aloha.settings.plugins != 'undefined' && typeof Aloha.settings.plugins.load != 'undefined' ) {
|
67946
|
+
plugins = Aloha.settings.plugins.load;
|
67947
|
+
if (plugins instanceof Array) {
|
67948
|
+
return plugins;
|
67949
|
+
}
|
67950
|
+
}
|
67951
|
+
|
67850
67952
|
// Determine Plugins
|
67851
67953
|
if ( typeof plugins === 'string' && plugins !== "") {
|
67852
67954
|
return plugins.replace(/\s+/g, '').split(',');
|
67853
67955
|
}
|
67854
67956
|
// Return
|
67855
67957
|
return [];
|
67856
|
-
|
67857
67958
|
},
|
67858
67959
|
|
67859
67960
|
/**
|
@@ -68132,6 +68233,7 @@ function ( jQuery, PluginManager ) {
|
|
68132
68233
|
|
68133
68234
|
/**
|
68134
68235
|
* Determines the Aloha Url
|
68236
|
+
* Uses Aloha.settings.baseUrl if set.
|
68135
68237
|
* @method
|
68136
68238
|
* @return {String} alohaUrl
|
68137
68239
|
*/
|
@@ -68139,7 +68241,11 @@ function ( jQuery, PluginManager ) {
|
|
68139
68241
|
// aloha base path is defined by a script tag with 2 data attributes
|
68140
68242
|
var requireJs = jQuery('[data-aloha-plugins]'),
|
68141
68243
|
baseUrl = ( requireJs.length ) ? requireJs[0].src.replace( /\/?aloha.js$/ , '' ) : '';
|
68142
|
-
|
68244
|
+
|
68245
|
+
if ( typeof Aloha.settings.baseUrl === "string" ) {
|
68246
|
+
baseUrl = Aloha.settings.baseUrl;
|
68247
|
+
}
|
68248
|
+
|
68143
68249
|
return baseUrl;
|
68144
68250
|
},
|
68145
68251
|
|
@@ -68169,7 +68275,6 @@ function ( jQuery, PluginManager ) {
|
|
68169
68275
|
|
68170
68276
|
return Aloha;
|
68171
68277
|
});
|
68172
|
-
|
68173
68278
|
/*!
|
68174
68279
|
* This file is part of Aloha Editor Project http://aloha-editor.org
|
68175
68280
|
* Copyright © 2010-2011 Gentics Software GmbH, aloha@gentics.com
|
@@ -68640,7 +68745,6 @@ GENTICS.Utils.RangeObject = Class.extend({
|
|
68640
68745
|
// sometimes it's cached (or was set)
|
68641
68746
|
return this.commonAncestorContainer;
|
68642
68747
|
}
|
68643
|
-
|
68644
68748
|
// if it's not cached, calculate and then cache it
|
68645
68749
|
this.updateCommonAncestorContainer();
|
68646
68750
|
|
@@ -68726,13 +68830,13 @@ GENTICS.Utils.RangeObject = Class.extend({
|
|
68726
68830
|
* @hide
|
68727
68831
|
*/
|
68728
68832
|
updateCommonAncestorContainer: function(commonAncestorContainer) {
|
68729
|
-
// this will be needed either right now for finding the CAC or later for the crossing index
|
68730
|
-
var parentsStartContainer = this.getStartContainerParents(),
|
68731
|
-
parentsEndContainer = this.getEndContainerParents(),
|
68732
|
-
i;
|
68733
|
-
|
68734
68833
|
// if no parameter was passed, calculate it
|
68735
68834
|
if (!commonAncestorContainer) {
|
68835
|
+
// this will be needed either right now for finding the CAC or later for the crossing index
|
68836
|
+
var parentsStartContainer = this.getStartContainerParents(),
|
68837
|
+
parentsEndContainer = this.getEndContainerParents(),
|
68838
|
+
i;
|
68839
|
+
|
68736
68840
|
// find the crossing between startContainer and endContainer parents (=commonAncestorContainer)
|
68737
68841
|
if (!(parentsStartContainer.length > 0 && parentsEndContainer.length > 0)) {
|
68738
68842
|
console.warn('could not find commonAncestorContainer');
|
@@ -68913,6 +69017,7 @@ GENTICS.Utils.RangeObject = Class.extend({
|
|
68913
69017
|
*/
|
68914
69018
|
update: function(event) {
|
68915
69019
|
console.debug('now updating rangeObject');
|
69020
|
+
|
68916
69021
|
this.initializeFromUserSelection(event);
|
68917
69022
|
this.updateCommonAncestorContainer();
|
68918
69023
|
},
|
@@ -69488,8 +69593,7 @@ function(Aloha, jQuery, Ext, Class, console) {
|
|
69488
69593
|
getExtComponent: function () {
|
69489
69594
|
var that = this;
|
69490
69595
|
|
69491
|
-
if (
|
69492
|
-
// generate the panel here
|
69596
|
+
if (!this.extPanel) {
|
69493
69597
|
this.extPanel = new Ext.Panel({
|
69494
69598
|
'tbar' : [],
|
69495
69599
|
'title' : this.label,
|
@@ -69497,13 +69601,15 @@ function(Aloha, jQuery, Ext, Class, console) {
|
|
69497
69601
|
'bodyStyle': 'display:none',
|
69498
69602
|
'autoScroll': true
|
69499
69603
|
});
|
69604
|
+
}
|
69500
69605
|
|
69501
|
-
|
69502
|
-
|
69503
|
-
|
69606
|
+
jQuery.each(this.groups, function(index, group) {
|
69607
|
+
// let each group generate its ext component and add them to
|
69608
|
+
// the panel once.
|
69609
|
+
if (!group.extButtonGroup) {
|
69504
69610
|
that.extPanel.getTopToolbar().add(group.getExtComponent());
|
69505
|
-
}
|
69506
|
-
}
|
69611
|
+
}
|
69612
|
+
});
|
69507
69613
|
|
69508
69614
|
return this.extPanel;
|
69509
69615
|
},
|
@@ -69616,6 +69722,7 @@ function(Aloha, jQuery, Ext, Class, console) {
|
|
69616
69722
|
'columns' : columnCount,
|
69617
69723
|
'items': items
|
69618
69724
|
});
|
69725
|
+
|
69619
69726
|
// jQuery.each(this.fields, function(id, field){
|
69620
69727
|
// that.buttons.push(field);
|
69621
69728
|
// });
|
@@ -69689,6 +69796,73 @@ function(Aloha, jQuery, Ext, Class, console) {
|
|
69689
69796
|
}
|
69690
69797
|
});
|
69691
69798
|
|
69799
|
+
//=========================================================================
|
69800
|
+
//
|
69801
|
+
// Floating Menu
|
69802
|
+
//
|
69803
|
+
//=========================================================================
|
69804
|
+
|
69805
|
+
var lastFloatingMenuPos = {
|
69806
|
+
top: null,
|
69807
|
+
left: null
|
69808
|
+
};
|
69809
|
+
|
69810
|
+
/**
|
69811
|
+
* Handler for window scroll event. Positions the floating menu
|
69812
|
+
* appropriately.
|
69813
|
+
*
|
69814
|
+
* @param {Aloha.FloatingMenu} floatingmenu
|
69815
|
+
*/
|
69816
|
+
function onWindowScroll( floatingmenu ) {
|
69817
|
+
if ( !Aloha.activeEditable ) {
|
69818
|
+
return;
|
69819
|
+
}
|
69820
|
+
|
69821
|
+
var element = floatingmenu.obj;
|
69822
|
+
var editablePos = Aloha.activeEditable.obj.offset();
|
69823
|
+
var isTopAligned = floatingmenu.behaviour === 'topalign';
|
69824
|
+
var isAppended = floatingmenu.behaviour === 'append';
|
69825
|
+
var isManuallyPinned = floatingmenu.pinned
|
69826
|
+
&& ( parseInt( element.css( 'left' ), 10 )
|
69827
|
+
!= ( editablePos.left
|
69828
|
+
+ floatingmenu.horizontalOffset
|
69829
|
+
) );
|
69830
|
+
|
69831
|
+
// no calculation when pinned manually or has behaviour 'append'
|
69832
|
+
if ( isTopAligned && isManuallyPinned || isAppended ) {
|
69833
|
+
return;
|
69834
|
+
}
|
69835
|
+
|
69836
|
+
var floatingmenuHeight = element.height();
|
69837
|
+
var scrollTop = jQuery( document ).scrollTop();
|
69838
|
+
|
69839
|
+
// This value is what the top position of the floating menu *would* be
|
69840
|
+
// if we tried to position it above the active editable.
|
69841
|
+
var floatingmenuTop = editablePos.top - floatingmenuHeight
|
69842
|
+
+ floatingmenu.marginTop
|
69843
|
+
- floatingmenu.topalignOffset;
|
69844
|
+
|
69845
|
+
// The floating menu does not fit in the space between the top of the
|
69846
|
+
// viewport and the editable, so position it at the top of the viewport
|
69847
|
+
// and over the editable.
|
69848
|
+
if ( scrollTop > floatingmenuTop ) {
|
69849
|
+
editablePos.top = isTopAligned
|
69850
|
+
? scrollTop + floatingmenu.marginTop
|
69851
|
+
: floatingmenu.marginTop;
|
69852
|
+
|
69853
|
+
// There is enough space on top of the editable to fit the entire
|
69854
|
+
// floating menu, so we do so.
|
69855
|
+
} else if ( scrollTop <= floatingmenuTop ) {
|
69856
|
+
editablePos.top -= floatingmenuHeight
|
69857
|
+
+ ( isTopAligned
|
69858
|
+
? floatingmenu.marginTop +
|
69859
|
+
floatingmenu.topalignOffset
|
69860
|
+
: 0 );
|
69861
|
+
}
|
69862
|
+
|
69863
|
+
floatingmenu.floatTo( editablePos );
|
69864
|
+
}
|
69865
|
+
|
69692
69866
|
/**
|
69693
69867
|
* Aloha's Floating Menu
|
69694
69868
|
* @namespace Aloha
|
@@ -69768,16 +69942,30 @@ function(Aloha, jQuery, Ext, Class, console) {
|
|
69768
69942
|
window: jQuery(window),
|
69769
69943
|
|
69770
69944
|
/**
|
69771
|
-
*
|
69772
|
-
*
|
69773
|
-
*
|
69945
|
+
* Aloha.settings.floatingmenu.behaviour
|
69946
|
+
*
|
69947
|
+
* Is used to define the floating menu (fm) float behaviour.
|
69948
|
+
*
|
69949
|
+
* available:
|
69950
|
+
* 'float' (default) the fm will float next to the position where the caret is,
|
69951
|
+
* 'topalign' the fm is fixed above the contentEditable which is active,
|
69952
|
+
* 'append' the fm is appended to the defined 'element' element position (top/left)
|
69774
69953
|
*/
|
69775
69954
|
behaviour: 'float',
|
69776
69955
|
|
69956
|
+
/**
|
69957
|
+
* Aloha.settings.floatingmenu.element
|
69958
|
+
*
|
69959
|
+
* Is used to define the element where the floating menu is positioned when
|
69960
|
+
* Aloha.settings.floatingmenu.behaviour is set to 'append'
|
69961
|
+
*
|
69962
|
+
*/
|
69963
|
+
element: 'floatingmenu',
|
69964
|
+
|
69777
69965
|
/**
|
69778
69966
|
* topalign offset to be used for topalign behavior
|
69779
69967
|
*/
|
69780
|
-
topalignOffset:
|
69968
|
+
topalignOffset: 0,
|
69781
69969
|
|
69782
69970
|
/**
|
69783
69971
|
* topalign offset to be used for topalign behavior
|
@@ -69788,7 +69976,7 @@ function(Aloha, jQuery, Ext, Class, console) {
|
|
69788
69976
|
* will only be hounoured when behaviour is set to 'topalign'. Adds a margin,
|
69789
69977
|
* so the floating menu is not directly attached to the top of the page
|
69790
69978
|
*/
|
69791
|
-
marginTop:
|
69979
|
+
marginTop: 10,
|
69792
69980
|
|
69793
69981
|
/**
|
69794
69982
|
* Define whether the floating menu shall be draggable or not via Aloha.settings.floatingmanu.draggable
|
@@ -69796,6 +69984,12 @@ function(Aloha, jQuery, Ext, Class, console) {
|
|
69796
69984
|
*/
|
69797
69985
|
draggable: true,
|
69798
69986
|
|
69987
|
+
/**
|
69988
|
+
* Define whether the floating menu shall be pinned or not via Aloha.settings.floatingmanu.pin
|
69989
|
+
* Default is: false
|
69990
|
+
*/
|
69991
|
+
pin: false,
|
69992
|
+
|
69799
69993
|
/**
|
69800
69994
|
* A list of all buttons that have been added to the floatingmenu
|
69801
69995
|
* This needs to be tracked, as adding buttons twice will break the fm
|
@@ -69815,38 +70009,58 @@ function(Aloha, jQuery, Ext, Class, console) {
|
|
69815
70009
|
init: function() {
|
69816
70010
|
|
69817
70011
|
// check for behaviour setting of the floating menu
|
69818
|
-
if (Aloha.settings.floatingmenu) {
|
69819
|
-
|
69820
|
-
|
70012
|
+
if ( Aloha.settings.floatingmenu ) {
|
70013
|
+
if ( typeof Aloha.settings.floatingmenu.draggable ===
|
70014
|
+
'boolean' ) {
|
69821
70015
|
this.draggable = Aloha.settings.floatingmenu.draggable;
|
69822
70016
|
}
|
69823
|
-
|
70017
|
+
|
70018
|
+
if ( typeof Aloha.settings.floatingmenu.behaviour ===
|
70019
|
+
'string' ) {
|
69824
70020
|
this.behaviour = Aloha.settings.floatingmenu.behaviour;
|
69825
70021
|
}
|
69826
|
-
|
69827
|
-
|
70022
|
+
|
70023
|
+
if ( typeof Aloha.settings.floatingmenu.topalignOffset !==
|
70024
|
+
'undefined' ) {
|
70025
|
+
this.topalignOffset = parseInt(
|
70026
|
+
Aloha.settings.floatingmenu.topalignOffset, 10 );
|
70027
|
+
}
|
70028
|
+
|
70029
|
+
if ( typeof Aloha.settings.floatingmenu.horizontalOffset !==
|
70030
|
+
'undefined' ) {
|
70031
|
+
this.horizontalOffset = parseInt(
|
70032
|
+
Aloha.settings.floatingmenu.horizontalOffset , 10 );
|
69828
70033
|
}
|
69829
|
-
|
69830
|
-
|
70034
|
+
|
70035
|
+
if ( typeof Aloha.settings.floatingmenu.marginTop ===
|
70036
|
+
'number' ) {
|
70037
|
+
this.marginTop = parseInt(
|
70038
|
+
Aloha.settings.floatingmenu.marginTop , 10 );
|
69831
70039
|
}
|
69832
|
-
|
69833
|
-
|
70040
|
+
|
70041
|
+
if ( typeof Aloha.settings.floatingmenu.element ===
|
70042
|
+
'string' ) {
|
70043
|
+
this.element = Aloha.settings.floatingmenu.element;
|
69834
70044
|
}
|
69835
|
-
|
69836
|
-
|
69837
|
-
|
69838
|
-
|
69839
|
-
|
69840
|
-
|
69841
|
-
|
69842
|
-
|
69843
|
-
|
70045
|
+
if ( typeof Aloha.settings.floatingmenu.pin ===
|
70046
|
+
'boolean' ) {
|
70047
|
+
this.pin = Aloha.settings.floatingmenu.pin;
|
70048
|
+
}
|
70049
|
+
|
70050
|
+
|
70051
|
+
if ( typeof Aloha.settings.floatingmenu.width !==
|
70052
|
+
'undefined' ) {
|
70053
|
+
this.width = parseInt( Aloha.settings.floatingmenu.width,
|
70054
|
+
10 );
|
69844
70055
|
}
|
69845
70056
|
}
|
69846
70057
|
|
69847
70058
|
jQuery.storage = new jQuery.store();
|
70059
|
+
|
69848
70060
|
this.currentScope = 'Aloha.global';
|
70061
|
+
|
69849
70062
|
var that = this;
|
70063
|
+
|
69850
70064
|
this.window.unload(function () {
|
69851
70065
|
// store fm position if the panel is pinned to be able to restore it next time
|
69852
70066
|
if (that.pinned) {
|
@@ -69886,7 +70100,7 @@ function(Aloha, jQuery, Ext, Class, console) {
|
|
69886
70100
|
});
|
69887
70101
|
|
69888
70102
|
if (typeof Aloha.settings.toolbar === 'object') {
|
69889
|
-
this.fromConfig = true;
|
70103
|
+
this.fromConfig = true;
|
69890
70104
|
}
|
69891
70105
|
},
|
69892
70106
|
|
@@ -70004,6 +70218,10 @@ function(Aloha, jQuery, Ext, Class, console) {
|
|
70004
70218
|
that.left = this.x;
|
70005
70219
|
that.top = top;
|
70006
70220
|
|
70221
|
+
// store the last floating menu position when the floating menu was dragged around
|
70222
|
+
lastFloatingMenuPos.left = that.left;
|
70223
|
+
lastFloatingMenuPos.top = that.top;
|
70224
|
+
|
70007
70225
|
this.panel.setPosition(this.x, top);
|
70008
70226
|
that.refreshShadow();
|
70009
70227
|
this.panel.shadow.show();
|
@@ -70054,8 +70272,10 @@ function(Aloha, jQuery, Ext, Class, console) {
|
|
70054
70272
|
});
|
70055
70273
|
|
70056
70274
|
// adapt the shadow
|
70057
|
-
that.extTabPanel.
|
70058
|
-
|
70275
|
+
if (that.extTabPanel.isVisible()) {
|
70276
|
+
that.extTabPanel.shadow.show();
|
70277
|
+
that.refreshShadow();
|
70278
|
+
}
|
70059
70279
|
}
|
70060
70280
|
}
|
70061
70281
|
},
|
@@ -70064,6 +70284,7 @@ function(Aloha, jQuery, Ext, Class, console) {
|
|
70064
70284
|
|
70065
70285
|
|
70066
70286
|
}
|
70287
|
+
|
70067
70288
|
// add the tabs
|
70068
70289
|
jQuery.each(this.tabs, function(index, tab) {
|
70069
70290
|
// let each tab generate its ext component and add them to the panel
|
@@ -70075,8 +70296,10 @@ function(Aloha, jQuery, Ext, Class, console) {
|
|
70075
70296
|
});
|
70076
70297
|
|
70077
70298
|
// add the dropshadow
|
70078
|
-
this.extTabPanel.shadow
|
70079
|
-
|
70299
|
+
if (!this.extTabPanel.shadow) {
|
70300
|
+
this.extTabPanel.shadow = jQuery('<div id="aloha-floatingmenu-shadow" class="aloha-shadow"> </div>').hide();
|
70301
|
+
jQuery('body').append(this.extTabPanel.shadow);
|
70302
|
+
}
|
70080
70303
|
|
70081
70304
|
// add an empty pin tab item, store reference
|
70082
70305
|
pinTab = this.extTabPanel.add({
|
@@ -70110,7 +70333,7 @@ function(Aloha, jQuery, Ext, Class, console) {
|
|
70110
70333
|
this.obj = jQuery(this.extTabPanel.getEl().dom);
|
70111
70334
|
|
70112
70335
|
if (jQuery.storage.get('Aloha.FloatingMenu.pinned') == 'true') {
|
70113
|
-
this.togglePin();
|
70336
|
+
//this.togglePin();
|
70114
70337
|
|
70115
70338
|
this.top = parseInt(jQuery.storage.get('Aloha.FloatingMenu.top'),10);
|
70116
70339
|
this.left = parseInt(jQuery.storage.get('Aloha.FloatingMenu.left'),10);
|
@@ -70139,13 +70362,26 @@ function(Aloha, jQuery, Ext, Class, console) {
|
|
70139
70362
|
this.obj.mousedown(function (e) {
|
70140
70363
|
e.originalEvent.stopSelectionUpdate = true;
|
70141
70364
|
Aloha.eventHandled = true;
|
70142
|
-
|
70365
|
+
//e.stopSelectionUpdate = true;
|
70143
70366
|
});
|
70367
|
+
|
70144
70368
|
this.obj.mouseup(function (e) {
|
70145
70369
|
e.originalEvent.stopSelectionUpdate = true;
|
70146
70370
|
Aloha.eventHandled = false;
|
70147
70371
|
});
|
70148
70372
|
|
70373
|
+
jQuery( window ).scroll(function() {
|
70374
|
+
onWindowScroll( that );
|
70375
|
+
});
|
70376
|
+
|
70377
|
+
// don't display the drag handle bar / pin when floating menu is not draggable
|
70378
|
+
if ( !that.draggable ) {
|
70379
|
+
jQuery('.aloha-floatingmenu').hover( function() {
|
70380
|
+
jQuery(this).css({background: 'none'});
|
70381
|
+
jQuery('.aloha-floatingmenu-pin').hide();
|
70382
|
+
});
|
70383
|
+
}
|
70384
|
+
|
70149
70385
|
// adjust float behaviour
|
70150
70386
|
if (this.behaviour === 'float') {
|
70151
70387
|
// listen to selectionChanged event
|
@@ -70157,56 +70393,85 @@ function(Aloha, jQuery, Ext, Class, console) {
|
|
70157
70393
|
}
|
70158
70394
|
}
|
70159
70395
|
});
|
70160
|
-
|
70396
|
+
} else if (this.behaviour === 'append' ) {
|
70397
|
+
var p = jQuery( "#" + that.element );
|
70398
|
+
var position = p.offset();
|
70399
|
+
|
70400
|
+
if ( !position ) {
|
70401
|
+
Aloha.Log.warn(that, 'Invalid element HTML ID for floating menu: ' + that.element);
|
70402
|
+
return false;
|
70403
|
+
}
|
70404
|
+
|
70405
|
+
// set the position so that it does not float on the first editable activation
|
70406
|
+
this.floatTo( position );
|
70407
|
+
|
70408
|
+
if ( this.pin ) {
|
70409
|
+
this.togglePin( true );
|
70410
|
+
}
|
70411
|
+
|
70412
|
+
Aloha.bind( 'aloha-editable-activated', function( event, data ) {
|
70413
|
+
if ( that.pinned ) {
|
70414
|
+
return;
|
70415
|
+
}
|
70416
|
+
that.floatTo( position );
|
70417
|
+
});
|
70418
|
+
|
70419
|
+
} else if ( this.behaviour === 'topalign' ) {
|
70161
70420
|
// topalign will retain the user's pinned status
|
70162
70421
|
// TODO maybe the pin should be hidden in that case?
|
70163
|
-
this.togglePin(false);
|
70164
|
-
|
70165
|
-
// float the fm to each editable that is activated
|
70166
|
-
Aloha.bind('aloha-editable-activated', function(event, data) {
|
70167
|
-
var p = data.editable.obj.offset();
|
70168
|
-
p.top -= that.topalignOffset;
|
70169
|
-
p.left += that.horizontalOffset;
|
70170
|
-
if (p.top < jQuery(document).scrollTop()) {
|
70171
|
-
// scrollpos is below top of editable
|
70172
|
-
that.obj.css('top', jQuery(document).scrollTop() + that.marginTop);
|
70173
|
-
that.obj.css('left', p.left);
|
70174
|
-
that.togglePin(true);
|
70175
|
-
} else {
|
70176
|
-
// scroll pos is above top of editable
|
70177
|
-
that.floatTo(p);
|
70178
|
-
}
|
70179
|
-
});
|
70422
|
+
this.togglePin( false );
|
70180
70423
|
|
70181
|
-
//
|
70182
|
-
|
70183
|
-
|
70184
|
-
|
70185
|
-
|
70186
|
-
|
70187
|
-
|
70188
|
-
|
70189
|
-
|
70190
|
-
|
70191
|
-
|
70192
|
-
|
70193
|
-
|
70194
|
-
|
70195
|
-
|
70196
|
-
|
70197
|
-
|
70198
|
-
|
70424
|
+
// Float the menu to the editable that is activated.
|
70425
|
+
Aloha.bind( 'aloha-editable-activated', function( event, data ) {
|
70426
|
+
if ( that.pinned ) {
|
70427
|
+
return;
|
70428
|
+
}
|
70429
|
+
|
70430
|
+
// FIXME: that.obj.height() does not return the correct
|
70431
|
+
// height of the editable. We need to fix this, and
|
70432
|
+
// not hard-code the height as we currently do.
|
70433
|
+
var editable = data.editable.obj;
|
70434
|
+
var floatingmenuHeight = 90;
|
70435
|
+
var editablePos = editable.offset();
|
70436
|
+
var isFloatingmenuAboveViewport = ( (
|
70437
|
+
editablePos.top - floatingmenuHeight )
|
70438
|
+
< jQuery( document ).scrollTop() );
|
70439
|
+
|
70440
|
+
if ( isFloatingmenuAboveViewport ) {
|
70441
|
+
// Since we don't have space to place the floatingmenu
|
70442
|
+
// above the editable, we want to place it over the
|
70443
|
+
// editable instead. But if the editable is shorter
|
70444
|
+
// than the floatingmenu, it would be completely
|
70445
|
+
// covered by it, and so, in such cases, we position
|
70446
|
+
// the editable at the bottom of the short editable.
|
70447
|
+
editablePos.top = ( editable.height()
|
70448
|
+
< floatingmenuHeight )
|
70449
|
+
? editablePos.top + editable.height()
|
70450
|
+
: jQuery( document ).scrollTop();
|
70451
|
+
|
70452
|
+
editablePos.top += that.marginTop;
|
70199
70453
|
} else {
|
70200
|
-
|
70454
|
+
editablePos.top -= floatingmenuHeight
|
70455
|
+
+ that.topalignOffset;
|
70201
70456
|
}
|
70202
|
-
|
70203
|
-
that.
|
70204
|
-
|
70205
|
-
|
70206
|
-
|
70207
|
-
|
70208
|
-
|
70209
|
-
|
70457
|
+
|
70458
|
+
editablePos.left += that.horizontalOffset;
|
70459
|
+
|
70460
|
+
var HORIZONTAL_PADDING = 10;
|
70461
|
+
// Calculate by how much the floating menu is pocking
|
70462
|
+
// outside the width of the viewport. A positive number
|
70463
|
+
// means that it is outside the viewport, negative means
|
70464
|
+
// it is within the viewport.
|
70465
|
+
var overhang = ( ( editablePos.left + that.width
|
70466
|
+
+ HORIZONTAL_PADDING ) - jQuery(window).width() );
|
70467
|
+
|
70468
|
+
if ( overhang > 0 ) {
|
70469
|
+
editablePos.left -= overhang;
|
70470
|
+
}
|
70471
|
+
|
70472
|
+
that.floatTo( editablePos );
|
70473
|
+
});
|
70474
|
+
}
|
70210
70475
|
},
|
70211
70476
|
|
70212
70477
|
/**
|
@@ -70385,6 +70650,11 @@ function(Aloha, jQuery, Ext, Class, console) {
|
|
70385
70650
|
Aloha.Log.debug(this, 'doLayout called for FloatingMenu, scope is ' + this.currentScope);
|
70386
70651
|
}
|
70387
70652
|
|
70653
|
+
// if there's no floatingmenu don't do anything
|
70654
|
+
if ( typeof this.extTabPanel === 'undefined' ) {
|
70655
|
+
return false;
|
70656
|
+
}
|
70657
|
+
|
70388
70658
|
var that = this,
|
70389
70659
|
firstVisibleTab = false,
|
70390
70660
|
activeExtTab = this.extTabPanel.getActiveTab(),
|
@@ -70610,7 +70880,10 @@ function(Aloha, jQuery, Ext, Class, console) {
|
|
70610
70880
|
|
70611
70881
|
// if the floating menu would be placed higher than the top of the screen...
|
70612
70882
|
if ( top < scrollTop) {
|
70613
|
-
top +=
|
70883
|
+
top += 80 + GENTICS.Utils.Position.ScrollCorrection.top;
|
70884
|
+
// 80px if editable element is eg h1; 50px was fine for p;
|
70885
|
+
// todo: maybe just use GENTICS.Utils.Position.ScrollCorrection.top with a better value?
|
70886
|
+
// check where this is also used ...
|
70614
70887
|
}
|
70615
70888
|
|
70616
70889
|
// if the floating menu would float off the bottom of the screen
|
@@ -70644,24 +70917,47 @@ function(Aloha, jQuery, Ext, Class, console) {
|
|
70644
70917
|
return;
|
70645
70918
|
}
|
70646
70919
|
|
70647
|
-
var
|
70648
|
-
fmpos = this.obj.offset()
|
70920
|
+
var floatingmenu = this,
|
70921
|
+
fmpos = this.obj.offset(),
|
70922
|
+
lastLeft,
|
70923
|
+
lastTop;
|
70924
|
+
|
70925
|
+
if ( lastFloatingMenuPos.left === null ) {
|
70926
|
+
lastLeft = fmpos.left;
|
70927
|
+
lastTop = fmpos.top;
|
70928
|
+
} else {
|
70929
|
+
lastLeft = lastFloatingMenuPos.left;
|
70930
|
+
lastTop = lastFloatingMenuPos.top;
|
70931
|
+
}
|
70932
|
+
|
70933
|
+
// Place the floatingmenu to the last place the user had seen it,
|
70934
|
+
// then animate it into its new position.
|
70935
|
+
if ( lastLeft != position.left || lastTop != position.top ) {
|
70936
|
+
this.obj.offset({
|
70937
|
+
left: lastLeft,
|
70938
|
+
top: lastTop
|
70939
|
+
});
|
70649
70940
|
|
70650
|
-
|
70651
|
-
|
70652
|
-
this.obj.animate({
|
70653
|
-
top: position.top,
|
70941
|
+
this.obj.animate( {
|
70942
|
+
top: position.top,
|
70654
70943
|
left: position.left
|
70655
70944
|
}, {
|
70656
70945
|
queue : false,
|
70657
|
-
step : function
|
70946
|
+
step : function( step, props ) {
|
70658
70947
|
// update position reference
|
70659
|
-
if (props.prop
|
70660
|
-
|
70661
|
-
} else if (props.prop
|
70662
|
-
|
70948
|
+
if ( props.prop === 'top' ) {
|
70949
|
+
floatingmenu.top = props.now;
|
70950
|
+
} else if ( props.prop === 'left' ) {
|
70951
|
+
floatingmenu.left = props.now;
|
70663
70952
|
}
|
70664
|
-
|
70953
|
+
|
70954
|
+
floatingmenu.refreshShadow( false );
|
70955
|
+
},
|
70956
|
+
complete: function() {
|
70957
|
+
// When the animation is over, remember the floatingmenu's
|
70958
|
+
// final resting position.
|
70959
|
+
lastFloatingMenuPos.left = floatingmenu.left;
|
70960
|
+
lastFloatingMenuPos.top = floatingmenu.top;
|
70665
70961
|
}
|
70666
70962
|
});
|
70667
70963
|
}
|
@@ -70727,6 +71023,7 @@ function(Aloha, jQuery, Ext, Class, console) {
|
|
70727
71023
|
return menu;
|
70728
71024
|
});
|
70729
71025
|
|
71026
|
+
|
70730
71027
|
/*!
|
70731
71028
|
* This file is part of Aloha Editor Project http://aloha-editor.org
|
70732
71029
|
* Copyright (c) 2010-2011 Gentics Software GmbH, aloha@gentics.com
|
@@ -71080,8 +71377,18 @@ function(Aloha, jQuery, FloatingMenu, Class, Range) {
|
|
71080
71377
|
// the start of the selection was not yet found, so look for it now
|
71081
71378
|
// check whether the start of the selection is found here
|
71082
71379
|
|
71380
|
+
// Try to read the nodeType property and return if we do not have permission
|
71381
|
+
// ie.: frame document to an external URL
|
71382
|
+
var nodeType;
|
71383
|
+
try {
|
71384
|
+
nodeType = this.nodeType;
|
71385
|
+
}
|
71386
|
+
catch (e) {
|
71387
|
+
return;
|
71388
|
+
}
|
71389
|
+
|
71083
71390
|
// check is dependent on the node type
|
71084
|
-
switch(
|
71391
|
+
switch(nodeType) {
|
71085
71392
|
case 3: // text node
|
71086
71393
|
if (this === rangeObject.startContainer) {
|
71087
71394
|
// the selection starts here
|
@@ -71331,8 +71638,17 @@ function(Aloha, jQuery, FloatingMenu, Class, Range) {
|
|
71331
71638
|
standardAttributesComparator: function(domobj, markupObject) {
|
71332
71639
|
var i, attr, classString, classes, classes2, classLength, attrLength, domAttrLength;
|
71333
71640
|
|
71641
|
+
// Cloning the domobj works around an IE7 bug that crashes
|
71642
|
+
// the browser. The exact place where IE7 crashes is when
|
71643
|
+
// the domobj.attribute[i] is read below.
|
71644
|
+
// The bug can be reproduced with an editable that contains
|
71645
|
+
// some text and and image, by clicking inside and outside the
|
71646
|
+
// editable a few times.
|
71647
|
+
domobj = domobj.cloneNode(false);
|
71648
|
+
|
71334
71649
|
if (domobj.attributes && domobj.attributes.length && domobj.attributes.length > 0) {
|
71335
71650
|
for (i = 0, domAttrLength = domobj.attributes.length; i < domAttrLength; i++) {
|
71651
|
+
// Dereferencing attributes[i] here would crash IE7 if domobj were not cloned above
|
71336
71652
|
attr = domobj.attributes[i];
|
71337
71653
|
if (attr.nodeName.toLowerCase() == 'class' && attr.nodeValue.length > 0) {
|
71338
71654
|
classString = attr.nodeValue;
|
@@ -72830,12 +73146,224 @@ function correctRange ( range ) {
|
|
72830
73146
|
* along with this program. If not, see <http://www.gnu.org/licenses/>.
|
72831
73147
|
*/
|
72832
73148
|
|
72833
|
-
define('aloha/markup',[
|
72834
|
-
|
73149
|
+
define('aloha/markup',[
|
73150
|
+
'aloha/core',
|
73151
|
+
'util/class',
|
73152
|
+
'aloha/jquery',
|
73153
|
+
'aloha/ecma5shims'
|
73154
|
+
],
|
73155
|
+
function( Aloha, Class, jQuery, shims ) {
|
73156
|
+
|
72835
73157
|
|
72836
73158
|
|
72837
73159
|
var GENTICS = window.GENTICS;
|
72838
73160
|
|
73161
|
+
var isOldIE = !!( jQuery.browser.msie &&
|
73162
|
+
9 > parseInt( jQuery.browser.version, 10 ) );
|
73163
|
+
|
73164
|
+
function isBR( node ) {
|
73165
|
+
return 'BR' === node.nodeName;
|
73166
|
+
}
|
73167
|
+
|
73168
|
+
function isBlock( node ) {
|
73169
|
+
return 'false' === jQuery( node ).attr( 'contenteditable' );
|
73170
|
+
}
|
73171
|
+
|
73172
|
+
function isTextNode( node ) {
|
73173
|
+
return node && 3 === node.nodeType; // Node.TEXT_NODE
|
73174
|
+
}
|
73175
|
+
|
73176
|
+
function nodeLength( node ) {
|
73177
|
+
return !node ? 0
|
73178
|
+
: ( isTextNode( node ) ? node.length
|
73179
|
+
: node.childNodes.length );
|
73180
|
+
}
|
73181
|
+
|
73182
|
+
function nextVisibleNode( node ) {
|
73183
|
+
if ( !node ) {
|
73184
|
+
return null;
|
73185
|
+
}
|
73186
|
+
|
73187
|
+
if ( node.nextSibling ) {
|
73188
|
+
// Skip over nodes that the user cannot see ...
|
73189
|
+
if ( isTextNode( node.nextSibling ) &&
|
73190
|
+
!isVisibleTextNode( node.nextSibling ) ) {
|
73191
|
+
return nextVisibleNode( node.nextSibling );
|
73192
|
+
}
|
73193
|
+
|
73194
|
+
// Skip over propping <br>s ...
|
73195
|
+
if ( isBR( node.nextSibling ) &&
|
73196
|
+
node.nextSibling === node.parentNode.lastChild ) {
|
73197
|
+
return nextVisibleNode( node.nextSibling );
|
73198
|
+
}
|
73199
|
+
|
73200
|
+
// Skip over empty editable elements ...
|
73201
|
+
if ( '' === node.nextSibling.innerHTML &&
|
73202
|
+
!isBlock( node.nextSibling ) ) {
|
73203
|
+
return nextVisibleNode( node.nextSibling );
|
73204
|
+
}
|
73205
|
+
|
73206
|
+
return node.nextSibling;
|
73207
|
+
}
|
73208
|
+
|
73209
|
+
if ( node.parentNode ) {
|
73210
|
+
return nextVisibleNode( node.parentNode );
|
73211
|
+
}
|
73212
|
+
|
73213
|
+
return null;
|
73214
|
+
}
|
73215
|
+
|
73216
|
+
function prevVisibleNode( node ) {
|
73217
|
+
if ( !node ) {
|
73218
|
+
return null;
|
73219
|
+
}
|
73220
|
+
|
73221
|
+
if ( node.previousSibling ) {
|
73222
|
+
// Skip over nodes that the user cannot see...
|
73223
|
+
if ( isTextNode( node.previousSibling ) &&
|
73224
|
+
!isVisibleTextNode( node.previousSibling ) ) {
|
73225
|
+
return prevVisibleNode( node.previousSibling );
|
73226
|
+
}
|
73227
|
+
|
73228
|
+
// Skip over empty editable elements ...
|
73229
|
+
if ( '' === node.previousSibling.innerHTML &&
|
73230
|
+
!isBlock( node.previousSibling ) ) {
|
73231
|
+
return prevVisibleNode( node.previouSibling );
|
73232
|
+
}
|
73233
|
+
|
73234
|
+
return node.previousSibling;
|
73235
|
+
}
|
73236
|
+
|
73237
|
+
if ( node.parentNode ) {
|
73238
|
+
return prevVisibleNode( node.parentNode );
|
73239
|
+
}
|
73240
|
+
|
73241
|
+
return null;
|
73242
|
+
}
|
73243
|
+
|
73244
|
+
/**
|
73245
|
+
* Determines whether the given text node is visible to the the user,
|
73246
|
+
* based on our understanding that browsers will not display
|
73247
|
+
* superfluous white spaces.
|
73248
|
+
*
|
73249
|
+
* @param {HTMLEmenent} node The text node to be checked.
|
73250
|
+
*/
|
73251
|
+
function isVisibleTextNode( node ) {
|
73252
|
+
return 0 < node.data.replace( /\s+/g, '' ).length;
|
73253
|
+
}
|
73254
|
+
|
73255
|
+
function isFrontPosition( node, offset ) {
|
73256
|
+
return ( 0 === offset ) ||
|
73257
|
+
( offset <= node.data.length -
|
73258
|
+
node.data.replace( /^\s+/, '' ).length );
|
73259
|
+
}
|
73260
|
+
|
73261
|
+
function isBlockInsideEditable( $block ) {
|
73262
|
+
return $block.parent().hasClass( 'aloha-editable' );
|
73263
|
+
}
|
73264
|
+
|
73265
|
+
function isEndPosition( node, offset ) {
|
73266
|
+
var length = nodeLength( node );
|
73267
|
+
|
73268
|
+
if ( length === offset ) {
|
73269
|
+
return true;
|
73270
|
+
}
|
73271
|
+
|
73272
|
+
var isText = isTextNode( node );
|
73273
|
+
|
73274
|
+
// If within a text node, then ignore superfluous white-spaces,
|
73275
|
+
// since they are invisible to the user.
|
73276
|
+
if ( isText &&
|
73277
|
+
node.data.replace( /\s+$/, '' ).length === offset ) {
|
73278
|
+
return true;
|
73279
|
+
}
|
73280
|
+
|
73281
|
+
if ( 1 === length && !isText ) {
|
73282
|
+
return isBR( node.childNodes[0] );
|
73283
|
+
}
|
73284
|
+
|
73285
|
+
return false;
|
73286
|
+
}
|
73287
|
+
|
73288
|
+
function blink( node ) {
|
73289
|
+
jQuery( node )
|
73290
|
+
.stop( true )
|
73291
|
+
.css({ opacity: 0 })
|
73292
|
+
.fadeIn( 0 ).delay( 100 )
|
73293
|
+
.fadeIn(function () {
|
73294
|
+
jQuery( node ).css({ opacity: 1 });
|
73295
|
+
});
|
73296
|
+
|
73297
|
+
return node;
|
73298
|
+
}
|
73299
|
+
|
73300
|
+
/**
|
73301
|
+
* @TODO(petro): We need to be more intelligent about whether we insert a
|
73302
|
+
* block-level placeholder or a phrasing level element.
|
73303
|
+
* @TODO(petro): test with <pre>
|
73304
|
+
*/
|
73305
|
+
function jumpBlock( block, isGoingLeft ) {
|
73306
|
+
var range = new GENTICS.Utils.RangeObject();
|
73307
|
+
var sibling = isGoingLeft ? prevVisibleNode( block )
|
73308
|
+
: nextVisibleNode( block );
|
73309
|
+
|
73310
|
+
if ( !sibling || isBlock( sibling ) ) {
|
73311
|
+
var $landing = jQuery( '<div> </div>' );
|
73312
|
+
|
73313
|
+
if ( isGoingLeft ) {
|
73314
|
+
jQuery( block ).before( $landing );
|
73315
|
+
} else {
|
73316
|
+
jQuery( block ).after( $landing );
|
73317
|
+
}
|
73318
|
+
|
73319
|
+
range.startContainer = range.endContainer = $landing[0];
|
73320
|
+
range.startOffset = range.endOffset = 0;
|
73321
|
+
|
73322
|
+
// Clear out any old placeholder first ...
|
73323
|
+
cleanupPlaceholders( range );
|
73324
|
+
|
73325
|
+
window.$_alohaPlaceholder = $landing;
|
73326
|
+
} else {
|
73327
|
+
range.startContainer = range.endContainer = sibling;
|
73328
|
+
range.startOffset = range.endOffset = isGoingLeft ?
|
73329
|
+
nodeLength( sibling ) : ( isOldIE ? 1 : 0 );
|
73330
|
+
|
73331
|
+
cleanupPlaceholders( range );
|
73332
|
+
}
|
73333
|
+
|
73334
|
+
range.select();
|
73335
|
+
|
73336
|
+
Aloha.trigger( 'aloha-block-selected', block );
|
73337
|
+
Aloha.Selection.preventSelectionChanged();
|
73338
|
+
}
|
73339
|
+
|
73340
|
+
function nodeContains( node1, node2 ) {
|
73341
|
+
return isOldIE ? ( shims.compareDocumentPosition( node1, node2 ) & 16 )
|
73342
|
+
: 0 < jQuery( node1 ).find( node2 ).length;
|
73343
|
+
}
|
73344
|
+
|
73345
|
+
function isInsidePlaceholder( range ) {
|
73346
|
+
var start = range.startContainer;
|
73347
|
+
var end = range.endContainer;
|
73348
|
+
var $placeholder = window.$_alohaPlaceholder;
|
73349
|
+
|
73350
|
+
return $placeholder.is( start ) ||
|
73351
|
+
$placeholder.is( end ) ||
|
73352
|
+
nodeContains( $placeholder[0], start ) ||
|
73353
|
+
nodeContains( $placeholder[0], end );
|
73354
|
+
}
|
73355
|
+
|
73356
|
+
function cleanupPlaceholders( range ) {
|
73357
|
+
if ( window.$_alohaPlaceholder && !isInsidePlaceholder( range ) ) {
|
73358
|
+
if ( 0 === window.$_alohaPlaceholder.html()
|
73359
|
+
.replace( /^( )*$/, '' ).length ) {
|
73360
|
+
window.$_alohaPlaceholder.remove();
|
73361
|
+
}
|
73362
|
+
|
73363
|
+
window.$_alohaPlaceholder = null;
|
73364
|
+
}
|
73365
|
+
}
|
73366
|
+
|
72839
73367
|
/**
|
72840
73368
|
* Markup object
|
72841
73369
|
*/
|
@@ -72917,9 +73445,14 @@ Aloha.Markup = Class.extend( {
|
|
72917
73445
|
}
|
72918
73446
|
}
|
72919
73447
|
|
72920
|
-
//
|
73448
|
+
// LEFT (37), RIGHT (39) keys for block detection
|
72921
73449
|
if ( event.keyCode === 37 || event.keyCode === 39 ) {
|
72922
|
-
|
73450
|
+
if ( this.processCursor( rangeObject, event.keyCode ) ) {
|
73451
|
+
cleanupPlaceholders( Aloha.Selection.rangeObject );
|
73452
|
+
return true;
|
73453
|
+
}
|
73454
|
+
|
73455
|
+
return false;
|
72923
73456
|
}
|
72924
73457
|
|
72925
73458
|
// BACKSPACE
|
@@ -72950,55 +73483,117 @@ Aloha.Markup = Class.extend( {
|
|
72950
73483
|
},
|
72951
73484
|
|
72952
73485
|
/**
|
72953
|
-
* Processing of cursor keys
|
72954
|
-
*
|
72955
|
-
*
|
73486
|
+
* Processing of cursor keys.
|
73487
|
+
* Detect blocks (elements with contenteditable=false) and will select them
|
73488
|
+
* (normally the cursor would simply jump right past them).
|
72956
73489
|
*
|
72957
|
-
* For each block an 'aloha-block-selected' event will be
|
73490
|
+
* For each block that is selected, an 'aloha-block-selected' event will be
|
73491
|
+
* triggered.
|
72958
73492
|
*
|
72959
|
-
* @param range the current
|
72960
|
-
* @param
|
72961
|
-
* @return
|
73493
|
+
* @param {RangyRange} range A range object for the current selection.
|
73494
|
+
* @param {number} keyCode Code of the currently pressed key.
|
73495
|
+
* @return {boolean} False if a block was found, to prevent further events,
|
73496
|
+
* true otherwise.
|
72962
73497
|
*/
|
72963
73498
|
processCursor: function( range, keyCode ) {
|
72964
|
-
var rt = range.getRangeTree(), // RangeTree reference
|
72965
|
-
i = 0,
|
72966
|
-
cursorLeft = keyCode === 37,
|
72967
|
-
cursorRight = keyCode === 39,
|
72968
|
-
nextSiblingIsBlock = false, // check whether the next sibling is a block (contenteditable = false)
|
72969
|
-
cursorIsWithinBlock = false, // check whether the cursor is positioned within a block (contenteditable = false)
|
72970
|
-
cursorAtLastPos = false, // check if the cursor is within the last position of the currently active dom element
|
72971
|
-
obj; // will contain references to dom objects
|
72972
|
-
|
72973
73499
|
if ( !range.isCollapsed() ) {
|
72974
73500
|
return true;
|
72975
73501
|
}
|
72976
73502
|
|
72977
|
-
|
72978
|
-
if ( typeof rt[i].domobj === 'undefined'
|
72979
|
-
|| range.startOffset === rt[i].domobj.length ) {
|
72980
|
-
continue;
|
72981
|
-
}
|
73503
|
+
var node = range.startContainer;
|
72982
73504
|
|
72983
|
-
|
72984
|
-
|
73505
|
+
if ( !node ) {
|
73506
|
+
return true;
|
73507
|
+
}
|
72985
73508
|
|
72986
|
-
|
72987
|
-
|
72988
|
-
|
72989
|
-
|
72990
|
-
|
72991
|
-
|
73509
|
+
var sibling;
|
73510
|
+
|
73511
|
+
// Versions of Internet Explorer that are older that 9, will
|
73512
|
+
// erroneously allow you to enter and edit inside elements which have
|
73513
|
+
// their contenteditable attribute set to false...
|
73514
|
+
if ( isOldIE ) {
|
73515
|
+
var $parentBlock = jQuery( node ).parents(
|
73516
|
+
'[contenteditable=false]' );
|
73517
|
+
var isInsideBlock = $parentBlock.length > 0;
|
73518
|
+
|
73519
|
+
if ( isInsideBlock ) {
|
73520
|
+
if ( isBlockInsideEditable( $parentBlock ) ) {
|
73521
|
+
sibling = $parentBlock[0];
|
73522
|
+
} else {
|
73523
|
+
return true;
|
73524
|
+
}
|
72992
73525
|
}
|
73526
|
+
}
|
73527
|
+
|
73528
|
+
if ( !sibling ) {
|
73529
|
+
// True if keyCode denotes LEFT or UP arrow key, otherwise they
|
73530
|
+
// keyCode is for RIGHT or DOWN in which this value will be false.
|
73531
|
+
var isLeft = (37 === keyCode || 38 === keyCode);
|
73532
|
+
var offset = range.startOffset;
|
73533
|
+
|
73534
|
+
if ( isTextNode( node ) ) {
|
73535
|
+
if ( isLeft ) {
|
73536
|
+
// FIXME(Petro): Please consider if you have a better idea
|
73537
|
+
// of how we can work around this.
|
73538
|
+
//
|
73539
|
+
// Here is the problem... with Internet Explorer:
|
73540
|
+
// ----------------------------------------------
|
73541
|
+
//
|
73542
|
+
// Versions of Internet Explorer older than 9, are buggy in
|
73543
|
+
// how they `select()', or position a selection from cursor
|
73544
|
+
// movements, when the following conditions are true:
|
73545
|
+
//
|
73546
|
+
// * The range is collapsed.
|
73547
|
+
// * startContainer is a contenteditable text node.
|
73548
|
+
// * startOffset is 1.
|
73549
|
+
// * There is a non-conenteditable element left of the
|
73550
|
+
// startContainer.
|
73551
|
+
// * You attempt to move left to offset 0 (we consider a
|
73552
|
+
// range to be at "frontposition" if it is at offset 0
|
73553
|
+
// within its startContainer).
|
73554
|
+
//
|
73555
|
+
// What happens in IE 7, and IE 8, is that the selection
|
73556
|
+
// will jump to the adjacent non-contenteditable
|
73557
|
+
// element(s), instead moving to the front of the
|
73558
|
+
// container, and the offset will be stuck at 1--even as
|
73559
|
+
// the cursor is jumping around the screen!
|
73560
|
+
//
|
73561
|
+
// Our imperfect work-around is to reckon ourselves to be
|
73562
|
+
// at the front of the next node (ie: offset 0 in other
|
73563
|
+
// browsers), as soon as we detect that we are at offset 1
|
73564
|
+
// in IEv<9.
|
73565
|
+
//
|
73566
|
+
// Considering the bug, I think this is acceptable because
|
73567
|
+
// the user can still position themselve right between the
|
73568
|
+
// block (non-contenteditable element) and the first
|
73569
|
+
// characater of the text node by clicking there with the
|
73570
|
+
// mouse, since this seems to work fine in all IE versions.
|
73571
|
+
var isFrontPositionInIE = isOldIE && 1 === offset;
|
73572
|
+
|
73573
|
+
if ( !isFrontPositionInIE &&
|
73574
|
+
!isFrontPosition( node, offset ) ) {
|
73575
|
+
return true;
|
73576
|
+
}
|
72993
73577
|
|
72994
|
-
|
72995
|
-
|
72996
|
-
|
72997
|
-
|
72998
|
-
|
72999
|
-
|
73578
|
+
} else if ( !isEndPosition( node, offset ) ) {
|
73579
|
+
return true;
|
73580
|
+
}
|
73581
|
+
|
73582
|
+
} else {
|
73583
|
+
node = node.childNodes[
|
73584
|
+
offset === nodeLength( node ) ? offset - 1 : offset ];
|
73000
73585
|
}
|
73586
|
+
|
73587
|
+
sibling = isLeft ? prevVisibleNode( node )
|
73588
|
+
: nextVisibleNode( node );
|
73001
73589
|
}
|
73590
|
+
|
73591
|
+
if ( isBlock( sibling ) ) {
|
73592
|
+
jumpBlock( sibling, isLeft );
|
73593
|
+
return false;
|
73594
|
+
}
|
73595
|
+
|
73596
|
+
return true;
|
73002
73597
|
},
|
73003
73598
|
|
73004
73599
|
/**
|
@@ -74068,6 +74663,12 @@ define('aloha/editable',[
|
|
74068
74663
|
Aloha.settings.contentHandler = {};
|
74069
74664
|
}
|
74070
74665
|
|
74666
|
+
var defaultContentSerializer = function(editableElement){
|
74667
|
+
return jQuery(editableElement).html();
|
74668
|
+
};
|
74669
|
+
|
74670
|
+
var contentSerializer = defaultContentSerializer;
|
74671
|
+
|
74071
74672
|
/**
|
74072
74673
|
* Editable object
|
74073
74674
|
* @namespace Aloha
|
@@ -74092,8 +74693,9 @@ define('aloha/editable',[
|
|
74092
74693
|
|
74093
74694
|
// delimiters, timer and idle for smartContentChange
|
74094
74695
|
// smartContentChange triggers -- tab: '\u0009' - space: '\u0020' - enter: 'Enter'
|
74696
|
+
// backspace: U+0008 - delete: U+007F
|
74095
74697
|
this.sccDelimiters = [ ':', ';', '.', '!', '?', ',',
|
74096
|
-
unescape( '%u0009' ), unescape( '%u0020' ), 'Enter' ];
|
74698
|
+
unescape( '%u0009' ), unescape( '%u0020' ), unescape( '%u0008' ), unescape( '%u007F' ), 'Enter' ];
|
74097
74699
|
this.sccIdle = 5000;
|
74098
74700
|
this.sccDelay = 500;
|
74099
74701
|
this.sccTimerIdle = false;
|
@@ -74216,8 +74818,13 @@ define('aloha/editable',[
|
|
74216
74818
|
// if it does not handle the keyStroke it returns true and therefore all other
|
74217
74819
|
// events (incl. browser's) continue
|
74218
74820
|
me.obj.keydown( function( event ) {
|
74821
|
+
var letEventPass = Markup.preProcessKeyStrokes( event );
|
74219
74822
|
me.keyCode = event.which;
|
74220
|
-
|
74823
|
+
if (!letEventPass) {
|
74824
|
+
// the event will not proceed to key press, therefore trigger smartContentChange
|
74825
|
+
me.smartContentChange( event );
|
74826
|
+
}
|
74827
|
+
return letEventPass;
|
74221
74828
|
} );
|
74222
74829
|
|
74223
74830
|
// handle keypress
|
@@ -74704,19 +75311,32 @@ define('aloha/editable',[
|
|
74704
75311
|
this.removePlaceholder( clonedObj );
|
74705
75312
|
PluginManager.makeClean( clonedObj );
|
74706
75313
|
|
74707
|
-
|
74708
|
-
|
74709
|
-
|
74710
|
-
|
74711
|
-
|
75314
|
+
return asObject ? clonedObj.contents() : contentSerializer(clonedObj[0]);
|
75315
|
+
},
|
75316
|
+
|
75317
|
+
/**
|
75318
|
+
* Set the contents of this editable as a HTML string
|
75319
|
+
* @param content as html
|
75320
|
+
* @param return as object or html string
|
75321
|
+
* @return contents of the editable
|
75322
|
+
*/
|
75323
|
+
setContents: function( content, asObject ) {
|
75324
|
+
var reactivate = null;
|
75325
|
+
|
75326
|
+
if ( Aloha.getActiveEditable() === this ) {
|
75327
|
+
Aloha.deactivateEditable();
|
75328
|
+
reactivate = this;
|
74712
75329
|
}
|
74713
|
-
content = ContentHandlerManager.handleContent( content, {
|
74714
|
-
contenthandler: Aloha.settings.contentHandler.getContents
|
74715
|
-
} );
|
74716
|
-
clonedObj.html( content );
|
74717
|
-
*/
|
74718
75330
|
|
74719
|
-
|
75331
|
+
this.obj.html( content );
|
75332
|
+
|
75333
|
+
if ( null !== reactivate ) {
|
75334
|
+
reactivate.activate();
|
75335
|
+
}
|
75336
|
+
|
75337
|
+
this.smartContentChange({type : 'set-contents'});
|
75338
|
+
|
75339
|
+
return asObject ? this.obj.contents() : contentSerializer(this.obj[0]);
|
74720
75340
|
},
|
74721
75341
|
|
74722
75342
|
/**
|
@@ -74865,8 +75485,26 @@ define('aloha/editable',[
|
|
74865
75485
|
this.snapshotContent = this.getContents();
|
74866
75486
|
return ret;
|
74867
75487
|
}
|
74868
|
-
|
74869
75488
|
} );
|
75489
|
+
|
75490
|
+
/**
|
75491
|
+
* Sets the serializer function to be used for the contents of all editables.
|
75492
|
+
*
|
75493
|
+
* The default content serializer will just call the jQuery.html()
|
75494
|
+
* function on the editable element (which gets the innerHTML property).
|
75495
|
+
*
|
75496
|
+
* This method is a static class method and will affect the result
|
75497
|
+
* of editable.getContents() for all editables that have been or
|
75498
|
+
* will be constructed.
|
75499
|
+
*
|
75500
|
+
* @param serializerFunction
|
75501
|
+
* A function that accepts a DOM element and returns the serialized
|
75502
|
+
* XHTML of the element contents (excluding the start and end tag of
|
75503
|
+
* the passed element).
|
75504
|
+
*/
|
75505
|
+
Aloha.Editable.setContentSerializer = function( serializerFunction ) {
|
75506
|
+
contentSerializer = serializerFunction;
|
75507
|
+
};
|
74870
75508
|
} );
|
74871
75509
|
|
74872
75510
|
/*!
|
@@ -81512,6 +82150,7 @@ commands["delete"] = {
|
|
81512
82150
|
|
81513
82151
|
// collapse whitespace sequences
|
81514
82152
|
collapseWhitespace(node, range);
|
82153
|
+
offset = range.startOffset;
|
81515
82154
|
|
81516
82155
|
// "If node is a Text node and offset is not zero, call collapse(node,
|
81517
82156
|
// offset) on the Selection. Then delete the contents of the range with
|
@@ -82105,6 +82744,7 @@ commands.forwarddelete = {
|
|
82105
82744
|
|
82106
82745
|
// collapse whitespace in the node, if it is a text node
|
82107
82746
|
collapseWhitespace(node, range);
|
82747
|
+
offset = range.startOffset;
|
82108
82748
|
|
82109
82749
|
// "If node is a Text node and offset is not node's length:"
|
82110
82750
|
if (node.nodeType == $_.Node.TEXT_NODE
|
@@ -82901,11 +83541,13 @@ commands.insertparagraph = {
|
|
82901
83541
|
// container name) on the context object."
|
82902
83542
|
var newContainer = document.createElement(newContainerName);
|
82903
83543
|
|
82904
|
-
// "Copy all attributes of container to new container."
|
82905
|
-
for (var i = 0; i < container.attributes.length; i++) {
|
82906
|
-
if (typeof newContainer.setAttributeNS === 'function') {
|
83544
|
+
// "Copy all non empty attributes of the container to new container."
|
83545
|
+
for ( var i = 0; i < container.attributes.length; i++ ) {
|
83546
|
+
if ( typeof newContainer.setAttributeNS === 'function' ) {
|
82907
83547
|
newContainer.setAttributeNS(container.attributes[i].namespaceURI, container.attributes[i].name, container.attributes[i].value);
|
82908
|
-
} else
|
83548
|
+
} else if ( container.attributes[i].value.length > 0
|
83549
|
+
&& container.attributes[i].value != 'null'
|
83550
|
+
&& container.attributes[i].value > 0) {
|
82909
83551
|
newContainer.setAttribute(container.attributes[i].name, container.attributes[i].value);
|
82910
83552
|
}
|
82911
83553
|
}
|
@@ -83564,7 +84206,6 @@ return {
|
|
83564
84206
|
}
|
83565
84207
|
}); // end define
|
83566
84208
|
// vim: foldmarker=@{,@} foldmethod=marker
|
83567
|
-
|
83568
84209
|
/*!
|
83569
84210
|
* CommandManager file is part of Aloha Editor Project http://aloha-editor.org
|
83570
84211
|
* Copyright (c) 2010-2011 Gentics Software GmbH, aloha@gentics.com
|
@@ -83653,19 +84294,22 @@ function( Aloha, Registry, Engine, Dom, ContentHandlerManager ) {
|
|
83653
84294
|
}
|
83654
84295
|
|
83655
84296
|
Engine.execCommand( commandId, showUi, value, range );
|
83656
|
-
|
83657
|
-
|
83658
|
-
|
83659
|
-
|
83660
|
-
|
83661
|
-
|
83662
|
-
|
83663
|
-
|
83664
|
-
|
83665
|
-
|
83666
|
-
|
83667
|
-
|
83668
|
-
|
84297
|
+
|
84298
|
+
if ( Aloha.getSelection().getRangeCount() ) {
|
84299
|
+
// Read range after engine modification
|
84300
|
+
range = Aloha.getSelection().getRangeAt( 0 );
|
84301
|
+
|
84302
|
+
// FIX: doCleanup should work with W3C range
|
84303
|
+
var startnode = range.commonAncestorContainer.parentNode;
|
84304
|
+
var rangeObject = new window.GENTICS.Utils.RangeObject();
|
84305
|
+
rangeObject.startContainer = range.startContainer;
|
84306
|
+
rangeObject.startOffset = range.startOffset;
|
84307
|
+
rangeObject.endContainer = range.endContainer;
|
84308
|
+
rangeObject.endOffset = range.endOffset;
|
84309
|
+
Dom.doCleanup({merge:true, removeempty: false}, rangeObject, startnode);
|
84310
|
+
rangeObject.select();
|
84311
|
+
}
|
84312
|
+
|
83669
84313
|
Aloha.trigger('aloha-command-executed', commandId);
|
83670
84314
|
},
|
83671
84315
|
|
@@ -84438,6 +85082,7 @@ define('aloha/sidebar',[
|
|
84438
85082
|
sidebar.init( opts );
|
84439
85083
|
}
|
84440
85084
|
} );
|
85085
|
+
|
84441
85086
|
};
|
84442
85087
|
|
84443
85088
|
// ------------------------------------------------------------------------
|
@@ -84700,7 +85345,16 @@ define('aloha/sidebar',[
|
|
84700
85345
|
if (this.opened) {
|
84701
85346
|
this.rotateHandleArrow(isRight ? 0 : 180, 0);
|
84702
85347
|
}
|
84703
|
-
|
85348
|
+
|
85349
|
+
// configure the position of the sidebar handle
|
85350
|
+
jQuery( function () {
|
85351
|
+
if ( typeof Aloha.settings.sidebar != 'undefined' &&
|
85352
|
+
Aloha.settings.sidebar.handle &&
|
85353
|
+
Aloha.settings.sidebar.handle.top ) {
|
85354
|
+
jQuery(bar.find(nsSel('handle'))).get(0).style.top = Aloha.settings.sidebar.handle.top;
|
85355
|
+
}
|
85356
|
+
} );
|
85357
|
+
|
84704
85358
|
bar.find(nsSel('handle'))
|
84705
85359
|
.click(function () {
|
84706
85360
|
if (bounceTimer) {
|
@@ -85581,6 +86235,7 @@ define('aloha/repositorymanager',[
|
|
85581
86235
|
Aloha.RepositoryManager = Class.extend( {
|
85582
86236
|
|
85583
86237
|
repositories : [],
|
86238
|
+
settings: {},
|
85584
86239
|
|
85585
86240
|
/**
|
85586
86241
|
* Initialize all registered repositories
|
@@ -85597,15 +86252,15 @@ define('aloha/repositorymanager',[
|
|
85597
86252
|
var repositories = this.repositories,
|
85598
86253
|
i = 0,
|
85599
86254
|
j = repositories.length,
|
85600
|
-
repository
|
85601
|
-
settings;
|
86255
|
+
repository;
|
85602
86256
|
|
85603
86257
|
if ( Aloha.settings && Aloha.settings.repositories ) {
|
85604
|
-
settings = Aloha.settings.repositories;
|
85605
|
-
} else {
|
85606
|
-
settings = {};
|
86258
|
+
this.settings = Aloha.settings.repositories;
|
85607
86259
|
}
|
85608
|
-
|
86260
|
+
|
86261
|
+
// use the configured repository manger query timeout or 5 sec
|
86262
|
+
this.settings.timeout = this.settings.timeout || 5000;
|
86263
|
+
|
85609
86264
|
for ( ; i < j; ++i ) {
|
85610
86265
|
repository = repositories[ i ];
|
85611
86266
|
|
@@ -85613,10 +86268,10 @@ define('aloha/repositorymanager',[
|
|
85613
86268
|
repository.settings = {};
|
85614
86269
|
}
|
85615
86270
|
|
85616
|
-
if ( settings[ repository.repositoryId ] ) {
|
86271
|
+
if ( this.settings[ repository.repositoryId ] ) {
|
85617
86272
|
jQuery.extend(
|
85618
86273
|
repository.settings,
|
85619
|
-
settings[ repository.repositoryId ]
|
86274
|
+
this.settings[ repository.repositoryId ]
|
85620
86275
|
);
|
85621
86276
|
}
|
85622
86277
|
|
@@ -85787,7 +86442,7 @@ define('aloha/repositorymanager',[
|
|
85787
86442
|
// respond. 5 seconds is deemed to be the reasonable time to wait
|
85788
86443
|
// when querying the repository manager in the context of something
|
85789
86444
|
// like autocomplete
|
85790
|
-
var timeout = parseInt( params.timeout, 10 ) ||
|
86445
|
+
var timeout = parseInt( params.timeout, 10 ) || this.settings.timeout;
|
85791
86446
|
timer = setTimeout( function() {
|
85792
86447
|
numOpenCallbacks = 0;
|
85793
86448
|
that.queryCallback( callback, allitems, allmetainfo, timer );
|
@@ -85951,7 +86606,7 @@ define('aloha/repositorymanager',[
|
|
85951
86606
|
repositories = this.repositories;
|
85952
86607
|
}
|
85953
86608
|
|
85954
|
-
var timeout = parseInt( params.timeout, 10 ) ||
|
86609
|
+
var timeout = parseInt( params.timeout, 10 ) || this.settings.timeout;
|
85955
86610
|
timer = setTimeout( function() {
|
85956
86611
|
numOpenCallbacks = 0;
|
85957
86612
|
that.getChildrenCallback( callback, allitems, timer );
|
@@ -88703,6 +89358,7 @@ require(
|
|
88703
89358
|
[
|
88704
89359
|
'aloha/jquery',
|
88705
89360
|
'aloha/ext',
|
89361
|
+
'util/json2',
|
88706
89362
|
],
|
88707
89363
|
function () {
|
88708
89364
|
// load Aloha core files
|
@@ -88712,7 +89368,6 @@ require(
|
|
88712
89368
|
'vendor/jquery.json-2.2.min',
|
88713
89369
|
'vendor/jquery.store',
|
88714
89370
|
'aloha/rangy-core',
|
88715
|
-
'util/json2',
|
88716
89371
|
'util/class',
|
88717
89372
|
'util/lang',
|
88718
89373
|
'util/range',
|