hallo 1.0.0

Sign up to get free protection for your applications and to get access to all the features.
@@ -0,0 +1,20 @@
1
+ Copyright 2012 YOURNAME
2
+
3
+ Permission is hereby granted, free of charge, to any person obtaining
4
+ a copy of this software and associated documentation files (the
5
+ "Software"), to deal in the Software without restriction, including
6
+ without limitation the rights to use, copy, modify, merge, publish,
7
+ distribute, sublicense, and/or sell copies of the Software, and to
8
+ permit persons to whom the Software is furnished to do so, subject to
9
+ the following conditions:
10
+
11
+ The above copyright notice and this permission notice shall be
12
+ included in all copies or substantial portions of the Software.
13
+
14
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
15
+ EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
16
+ MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
17
+ NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
18
+ LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
19
+ OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
20
+ WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
@@ -0,0 +1,18 @@
1
+ hallo.js web editor for Rails
2
+ ==========================
3
+
4
+ http://hallojs.org/
5
+
6
+ https://github.com/bergie/hallo
7
+
8
+ gem "hallo"
9
+
10
+ //= require hallo
11
+
12
+ This gem also includes [font-awesome-rails](https://github.com/bokmann/font-awesome-rails) and [jquery-ui-themes-rails](https://github.com/fatdude/jquery-ui-themes-rails)
13
+
14
+ *= require font-awesome
15
+
16
+ *= require jquery-ui/THEME-NAME
17
+
18
+ Rails 3.1 and higher, or anything that uses the asset pipeline.
@@ -0,0 +1,33 @@
1
+ #!/usr/bin/env rake
2
+ begin
3
+ require 'bundler/setup'
4
+ rescue LoadError
5
+ puts 'You must `gem install bundler` and `bundle install` to run rake tasks'
6
+ end
7
+ begin
8
+ require 'rdoc/task'
9
+ rescue LoadError
10
+ require 'rdoc/rdoc'
11
+ require 'rake/rdoctask'
12
+ RDoc::Task = Rake::RDocTask
13
+ end
14
+
15
+ RDoc::Task.new(:rdoc) do |rdoc|
16
+ rdoc.rdoc_dir = 'rdoc'
17
+ rdoc.title = 'Hallo'
18
+ rdoc.options << '--line-numbers'
19
+ rdoc.rdoc_files.include('lib/**/*.rb')
20
+ end
21
+
22
+ Bundler::GemHelper.install_tasks
23
+
24
+ require 'rake/testtask'
25
+
26
+ Rake::TestTask.new(:test) do |t|
27
+ t.libs << 'lib'
28
+ t.libs << 'test'
29
+ t.pattern = 'test/**/*_test.rb'
30
+ t.verbose = false
31
+ end
32
+
33
+ task :default => :test
@@ -0,0 +1,7 @@
1
+ require "font-awesome-rails"
2
+ require "jquery-ui-themes"
3
+
4
+ module Hallo
5
+ class Engine < Rails::Engine
6
+ end
7
+ end
@@ -0,0 +1,3 @@
1
+ module Hallo
2
+ VERSION = "1.0.0"
3
+ end
@@ -0,0 +1,4 @@
1
+ # desc "Explaining what the task does"
2
+ # task :hallo do
3
+ # # Task goes here
4
+ # end
@@ -0,0 +1,7 @@
1
+ require 'test_helper'
2
+
3
+ class HalloTest < ActiveSupport::TestCase
4
+ test "truth" do
5
+ assert_kind_of Module, Hallo
6
+ end
7
+ end
@@ -0,0 +1,15 @@
1
+ # Configure Rails Environment
2
+ ENV["RAILS_ENV"] = "test"
3
+
4
+ require File.expand_path("../dummy/config/environment.rb", __FILE__)
5
+ require "rails/test_help"
6
+
7
+ Rails.backtrace_cleaner.remove_silencers!
8
+
9
+ # Load support files
10
+ Dir["#{File.dirname(__FILE__)}/support/**/*.rb"].each { |f| require f }
11
+
12
+ # Load fixtures from the engine
13
+ if ActiveSupport::TestCase.method_defined?(:fixture_path=)
14
+ ActiveSupport::TestCase.fixture_path = File.expand_path("../fixtures", __FILE__)
15
+ end
@@ -0,0 +1,1853 @@
1
+ // Generated by CoffeeScript 1.3.1
2
+
3
+ /*
4
+ Hallo 1.0.0 - a rich text editing jQuery UI widget
5
+ (c) 2011 Henri Bergius, IKS Consortium
6
+ Hallo may be freely distributed under the MIT license
7
+ */
8
+
9
+
10
+ (function() {
11
+
12
+ (function(jQuery) {
13
+ return jQuery.widget("IKS.hallo", {
14
+ toolbar: null,
15
+ toolbarMoved: false,
16
+ bound: false,
17
+ originalContent: "",
18
+ uuid: "",
19
+ selection: null,
20
+ options: {
21
+ editable: true,
22
+ plugins: {},
23
+ floating: true,
24
+ offset: {
25
+ x: 0,
26
+ y: 0
27
+ },
28
+ fixed: false,
29
+ showAlways: false,
30
+ activated: function() {},
31
+ deactivated: function() {},
32
+ selected: function() {},
33
+ unselected: function() {},
34
+ enabled: function() {},
35
+ disabled: function() {},
36
+ placeholder: '',
37
+ parentElement: 'body',
38
+ forceStructured: true,
39
+ buttonCssClass: null
40
+ },
41
+ _create: function() {
42
+ var options, plugin, _ref, _results;
43
+ this.originalContent = this.getContents();
44
+ this.id = this._generateUUID();
45
+ this._prepareToolbar();
46
+ _ref = this.options.plugins;
47
+ _results = [];
48
+ for (plugin in _ref) {
49
+ options = _ref[plugin];
50
+ if (!jQuery.isPlainObject(options)) {
51
+ options = {};
52
+ }
53
+ options['editable'] = this;
54
+ options['toolbar'] = this.toolbar;
55
+ options['uuid'] = this.id;
56
+ options['buttonCssClass'] = this.options.buttonCssClass;
57
+ _results.push(jQuery(this.element)[plugin](options));
58
+ }
59
+ return _results;
60
+ },
61
+ _init: function() {
62
+ this._setToolbarPosition();
63
+ if (this.options.editable) {
64
+ return this.enable();
65
+ } else {
66
+ return this.disable();
67
+ }
68
+ },
69
+ disable: function() {
70
+ this.element.attr("contentEditable", false);
71
+ this.element.unbind("focus", this._activated);
72
+ this.element.unbind("blur", this._deactivated);
73
+ this.element.unbind("keyup paste change", this._checkModified);
74
+ this.element.unbind("keyup", this._keys);
75
+ this.element.unbind("keyup mouseup", this._checkSelection);
76
+ this.bound = false;
77
+ return this._trigger("disabled", null);
78
+ },
79
+ enable: function() {
80
+ var widget;
81
+ this.element.attr("contentEditable", true);
82
+ if (!this.element.html()) {
83
+ this.element.html(this.options.placeholder);
84
+ }
85
+ if (!this.bound) {
86
+ this.element.bind("focus", this, this._activated);
87
+ this.element.bind("blur", this, this._deactivated);
88
+ this.element.bind("keyup paste change", this, this._checkModified);
89
+ this.element.bind("keyup", this, this._keys);
90
+ this.element.bind("keyup mouseup", this, this._checkSelection);
91
+ widget = this;
92
+ this.bound = true;
93
+ }
94
+ if (this.options.forceStructured) {
95
+ this._forceStructured();
96
+ }
97
+ return this._trigger("enabled", null);
98
+ },
99
+ activate: function() {
100
+ return this.element.focus();
101
+ },
102
+ getSelection: function() {
103
+ var range, userSelection;
104
+ if (jQuery.browser.msie) {
105
+ range = document.selection.createRange();
106
+ } else {
107
+ if (window.getSelection) {
108
+ userSelection = window.getSelection();
109
+ } else if (document.selection) {
110
+ userSelection = document.selection.createRange();
111
+ } else {
112
+ throw "Your browser does not support selection handling";
113
+ }
114
+ if (userSelection.rangeCount > 0) {
115
+ range = userSelection.getRangeAt(0);
116
+ } else {
117
+ range = userSelection;
118
+ }
119
+ }
120
+ return range;
121
+ },
122
+ restoreSelection: function(range) {
123
+ if (jQuery.browser.msie) {
124
+ return range.select();
125
+ } else {
126
+ window.getSelection().removeAllRanges();
127
+ return window.getSelection().addRange(range);
128
+ }
129
+ },
130
+ replaceSelection: function(cb) {
131
+ var newTextNode, r, range, sel, t;
132
+ if (jQuery.browser.msie) {
133
+ t = document.selection.createRange().text;
134
+ r = document.selection.createRange();
135
+ return r.pasteHTML(cb(t));
136
+ } else {
137
+ sel = window.getSelection();
138
+ range = sel.getRangeAt(0);
139
+ newTextNode = document.createTextNode(cb(range.extractContents()));
140
+ range.insertNode(newTextNode);
141
+ range.setStartAfter(newTextNode);
142
+ sel.removeAllRanges();
143
+ return sel.addRange(range);
144
+ }
145
+ },
146
+ removeAllSelections: function() {
147
+ if (jQuery.browser.msie) {
148
+ return range.empty();
149
+ } else {
150
+ return window.getSelection().removeAllRanges();
151
+ }
152
+ },
153
+ getContents: function() {
154
+ var contentClone, plugin;
155
+ contentClone = this.element.clone();
156
+ for (plugin in this.options.plugins) {
157
+ jQuery(this.element)[plugin]('cleanupContentClone', contentClone);
158
+ }
159
+ return contentClone.html();
160
+ },
161
+ setContents: function(contents) {
162
+ return this.element.html(contents);
163
+ },
164
+ isModified: function() {
165
+ return this.originalContent !== this.getContents();
166
+ },
167
+ setUnmodified: function() {
168
+ return this.originalContent = this.getContents();
169
+ },
170
+ setModified: function() {
171
+ return this._trigger('modified', null, {
172
+ editable: this,
173
+ content: this.getContents()
174
+ });
175
+ },
176
+ restoreOriginalContent: function() {
177
+ return this.element.html(this.originalContent);
178
+ },
179
+ execute: function(command, value) {
180
+ if (document.execCommand(command, false, value)) {
181
+ return this.element.trigger("change");
182
+ }
183
+ },
184
+ protectFocusFrom: function(el) {
185
+ var widget;
186
+ widget = this;
187
+ return el.bind("mousedown", function(event) {
188
+ event.preventDefault();
189
+ widget._protectToolbarFocus = true;
190
+ return setTimeout(function() {
191
+ return widget._protectToolbarFocus = false;
192
+ }, 300);
193
+ });
194
+ },
195
+ _generateUUID: function() {
196
+ var S4;
197
+ S4 = function() {
198
+ return ((1 + Math.random()) * 0x10000 | 0).toString(16).substring(1);
199
+ };
200
+ return "" + (S4()) + (S4()) + "-" + (S4()) + "-" + (S4()) + "-" + (S4()) + "-" + (S4()) + (S4()) + (S4());
201
+ },
202
+ _getToolbarPosition: function(event, selection) {
203
+ var offset;
204
+ if (!event) {
205
+ return;
206
+ }
207
+ if (this.options.floating) {
208
+ if (event.originalEvent instanceof KeyboardEvent) {
209
+ return this._getCaretPosition(selection);
210
+ } else if (event.originalEvent instanceof MouseEvent) {
211
+ return {
212
+ top: event.pageY,
213
+ left: event.pageX
214
+ };
215
+ }
216
+ } else {
217
+ offset = parseFloat(this.element.css('outline-width')) + parseFloat(this.element.css('outline-offset'));
218
+ return {
219
+ top: this.element.offset().top - this.toolbar.outerHeight() - offset,
220
+ left: this.element.offset().left - offset
221
+ };
222
+ }
223
+ },
224
+ _getCaretPosition: function(range) {
225
+ var newRange, position, tmpSpan;
226
+ tmpSpan = jQuery("<span/>");
227
+ newRange = document.createRange();
228
+ newRange.setStart(range.endContainer, range.endOffset);
229
+ newRange.insertNode(tmpSpan.get(0));
230
+ position = {
231
+ top: tmpSpan.offset().top,
232
+ left: tmpSpan.offset().left
233
+ };
234
+ tmpSpan.remove();
235
+ return position;
236
+ },
237
+ _bindToolbarEventsFixed: function() {
238
+ var _this = this;
239
+ this.options.floating = false;
240
+ this.element.bind("halloactivated", function(event, data) {
241
+ _this._updateToolbarPosition(_this._getToolbarPosition(event));
242
+ return _this.toolbar.show();
243
+ });
244
+ return this.element.bind("hallodeactivated", function(event, data) {
245
+ return _this.toolbar.hide();
246
+ });
247
+ },
248
+ _bindToolbarEventsRegular: function() {
249
+ var _this = this;
250
+ this.element.bind("halloselected", function(event, data) {
251
+ var position;
252
+ position = _this._getToolbarPosition(data.originalEvent, data.selection);
253
+ if (!position) {
254
+ return;
255
+ }
256
+ _this._updateToolbarPosition(position);
257
+ return _this.toolbar.show();
258
+ });
259
+ this.element.bind("hallounselected", function(event, data) {
260
+ return _this.toolbar.hide();
261
+ });
262
+ return this.element.bind("hallodeactivated", function(event, data) {
263
+ return _this.toolbar.hide();
264
+ });
265
+ },
266
+ _setToolbarPosition: function() {
267
+ if (this.options.fixed) {
268
+ this.toolbar.css('position', 'static');
269
+ if (this.toolbarMoved) {
270
+ jQuery(this.options.parentElement).append(this.toolbar);
271
+ }
272
+ this.toolbarMoved = false;
273
+ return;
274
+ }
275
+ if (this.options.parentElement !== 'body') {
276
+ jQuery('body').append(this.toolbar);
277
+ this.toolbarMoved = true;
278
+ }
279
+ this.toolbar.css('position', 'absolute');
280
+ this.toolbar.css('top', this.element.offset().top - 20);
281
+ return this.toolbar.css('left', this.element.offset().left);
282
+ },
283
+ _prepareToolbar: function() {
284
+ var widget,
285
+ _this = this;
286
+ this.toolbar = jQuery('<div class="hallotoolbar"></div>').hide();
287
+ this._setToolbarPosition();
288
+ jQuery(this.options.parentElement).append(this.toolbar);
289
+ widget = this;
290
+ if (this.options.showAlways) {
291
+ this._bindToolbarEventsFixed();
292
+ }
293
+ if (!this.options.showAlways) {
294
+ this._bindToolbarEventsRegular();
295
+ }
296
+ jQuery(window).resize(function(event) {
297
+ return _this._updateToolbarPosition(_this._getToolbarPosition(event));
298
+ });
299
+ return this.protectFocusFrom(this.toolbar);
300
+ },
301
+ _updateToolbarPosition: function(position) {
302
+ if (this.options.fixed) {
303
+ return;
304
+ }
305
+ if (!position) {
306
+ return;
307
+ }
308
+ if (!(position.top && position.left)) {
309
+ return;
310
+ }
311
+ this.toolbar.css("top", position.top);
312
+ return this.toolbar.css("left", position.left);
313
+ },
314
+ _checkModified: function(event) {
315
+ var widget;
316
+ widget = event.data;
317
+ if (widget.isModified()) {
318
+ return widget.setModified();
319
+ }
320
+ },
321
+ _keys: function(event) {
322
+ var old, widget;
323
+ widget = event.data;
324
+ if (event.keyCode === 27) {
325
+ old = widget.getContents();
326
+ widget.restoreOriginalContent(event);
327
+ widget._trigger("restored", null, {
328
+ editable: widget,
329
+ content: widget.getContents(),
330
+ thrown: old
331
+ });
332
+ return widget.turnOff();
333
+ }
334
+ },
335
+ _rangesEqual: function(r1, r2) {
336
+ return r1.startContainer === r2.startContainer && r1.startOffset === r2.startOffset && r1.endContainer === r2.endContainer && r1.endOffset === r2.endOffset;
337
+ },
338
+ _checkSelection: function(event) {
339
+ var widget;
340
+ if (event.keyCode === 27) {
341
+ return;
342
+ }
343
+ widget = event.data;
344
+ return setTimeout(function() {
345
+ var sel;
346
+ sel = widget.getSelection();
347
+ if (widget._isEmptySelection(sel) || widget._isEmptyRange(sel)) {
348
+ if (widget.selection) {
349
+ widget.selection = null;
350
+ widget._trigger("unselected", null, {
351
+ editable: widget,
352
+ originalEvent: event
353
+ });
354
+ }
355
+ return;
356
+ }
357
+ if (!widget.selection || !widget._rangesEqual(sel, widget.selection)) {
358
+ widget.selection = sel.cloneRange();
359
+ return widget._trigger("selected", null, {
360
+ editable: widget,
361
+ selection: widget.selection,
362
+ ranges: [widget.selection],
363
+ originalEvent: event
364
+ });
365
+ }
366
+ }, 0);
367
+ },
368
+ _isEmptySelection: function(selection) {
369
+ if (selection.type === "Caret") {
370
+ return true;
371
+ }
372
+ return false;
373
+ },
374
+ _isEmptyRange: function(range) {
375
+ if (range.collapsed) {
376
+ return true;
377
+ }
378
+ if (range.isCollapsed) {
379
+ if (typeof range.isCollapsed === 'function') {
380
+ return range.isCollapsed();
381
+ }
382
+ return range.isCollapsed;
383
+ }
384
+ return false;
385
+ },
386
+ turnOn: function() {
387
+ var el, widthToAdd;
388
+ if (this.getContents() === this.options.placeholder) {
389
+ this.setContents('');
390
+ }
391
+ jQuery(this.element).addClass('inEditMode');
392
+ if (!this.options.floating) {
393
+ el = jQuery(this.element);
394
+ widthToAdd = parseFloat(el.css('padding-left'));
395
+ widthToAdd += parseFloat(el.css('padding-right'));
396
+ widthToAdd += parseFloat(el.css('border-left-width'));
397
+ widthToAdd += parseFloat(el.css('border-right-width'));
398
+ widthToAdd += (parseFloat(el.css('outline-width'))) * 2;
399
+ widthToAdd += (parseFloat(el.css('outline-offset'))) * 2;
400
+ jQuery(this.toolbar).css("width", el.width() + widthToAdd);
401
+ } else {
402
+ this.toolbar.css("width", "auto");
403
+ }
404
+ return this._trigger("activated", this);
405
+ },
406
+ turnOff: function() {
407
+ jQuery(this.element).removeClass('inEditMode');
408
+ this._trigger("deactivated", this);
409
+ if (!this.getContents()) {
410
+ return this.setContents(this.options.placeholder);
411
+ }
412
+ },
413
+ _activated: function(event) {
414
+ return event.data.turnOn();
415
+ },
416
+ _deactivated: function(event) {
417
+ if (event.data._protectToolbarFocus !== true) {
418
+ return event.data.turnOff();
419
+ } else {
420
+ return setTimeout(function() {
421
+ return jQuery(event.data.element).focus();
422
+ }, 300);
423
+ }
424
+ },
425
+ _forceStructured: function(event) {
426
+ try {
427
+ return document.execCommand('styleWithCSS', 0, false);
428
+ } catch (e) {
429
+ try {
430
+ return document.execCommand('useCSS', 0, true);
431
+ } catch (e) {
432
+ try {
433
+ return document.execCommand('styleWithCSS', false, false);
434
+ } catch (e) {
435
+
436
+ }
437
+ }
438
+ }
439
+ }
440
+ });
441
+ })(jQuery);
442
+
443
+ (function(jQuery) {
444
+ return jQuery.widget("IKS.hallolists", {
445
+ options: {
446
+ editable: null,
447
+ toolbar: null,
448
+ uuid: '',
449
+ lists: {
450
+ ordered: false,
451
+ unordered: true
452
+ },
453
+ buttonCssClass: null
454
+ },
455
+ _create: function() {
456
+ var buttonize, buttonset,
457
+ _this = this;
458
+ buttonset = jQuery("<span class=\"" + this.widgetName + "\"></span>");
459
+ buttonize = function(type, label) {
460
+ var buttonElement;
461
+ buttonElement = jQuery('<span></span>');
462
+ buttonElement.hallobutton({
463
+ uuid: _this.options.uuid,
464
+ editable: _this.options.editable,
465
+ label: label,
466
+ command: "insert" + type + "List",
467
+ icon: 'icon-list',
468
+ cssClass: _this.options.buttonCssClass
469
+ });
470
+ return buttonset.append(buttonElement);
471
+ };
472
+ if (this.options.lists.ordered) {
473
+ buttonize("Ordered", "OL");
474
+ }
475
+ if (this.options.lists.unordered) {
476
+ buttonize("Unordered", "UL");
477
+ }
478
+ buttonset.buttonset();
479
+ return this.options.toolbar.append(buttonset);
480
+ },
481
+ _init: function() {}
482
+ });
483
+ })(jQuery);
484
+
485
+ (function(jQuery) {
486
+ return jQuery.widget("IKS.halloheadings", {
487
+ options: {
488
+ editable: null,
489
+ toolbar: null,
490
+ uuid: "",
491
+ headers: [1, 2, 3]
492
+ },
493
+ _create: function() {
494
+ var button, buttonize, buttonset, header, id, label, widget, _i, _len, _ref,
495
+ _this = this;
496
+ widget = this;
497
+ buttonset = jQuery("<span class=\"" + widget.widgetName + "\"></span>");
498
+ id = "" + this.options.uuid + "-paragraph";
499
+ label = "P";
500
+ buttonset.append(jQuery("<input id=\"" + id + "\" type=\"radio\" name=\"" + widget.options.uuid + "-headings\"/><label for=\"" + id + "\" class=\"p_button\">" + label + "</label>").button());
501
+ button = jQuery("#" + id, buttonset);
502
+ button.attr("hallo-command", "formatBlock");
503
+ button.bind("change", function(event) {
504
+ var cmd;
505
+ cmd = jQuery(this).attr("hallo-command");
506
+ return widget.options.editable.execute(cmd, "P");
507
+ });
508
+ buttonize = function(headerSize) {
509
+ label = "H" + headerSize;
510
+ id = "" + _this.options.uuid + "-" + headerSize;
511
+ buttonset.append(jQuery("<input id=\"" + id + "\" type=\"radio\" name=\"" + widget.options.uuid + "-headings\"/><label for=\"" + id + "\" class=\"h" + headerSize + "_button\">" + label + "</label>").button());
512
+ button = jQuery("#" + id, buttonset);
513
+ button.attr("hallo-size", "H" + headerSize);
514
+ return button.bind("change", function(event) {
515
+ var size;
516
+ size = jQuery(this).attr("hallo-size");
517
+ return widget.options.editable.execute("formatBlock", size);
518
+ });
519
+ };
520
+ _ref = this.options.headers;
521
+ for (_i = 0, _len = _ref.length; _i < _len; _i++) {
522
+ header = _ref[_i];
523
+ buttonize(header);
524
+ }
525
+ buttonset.buttonset();
526
+ this.element.bind("keyup paste change mouseup", function(event) {
527
+ var format, formatNumber, labelParent, matches, selectedButton;
528
+ try {
529
+ format = document.queryCommandValue("formatBlock").toUpperCase();
530
+ } catch (e) {
531
+ format = '';
532
+ }
533
+ if (format === "P") {
534
+ selectedButton = jQuery("#" + widget.options.uuid + "-paragraph");
535
+ } else if (matches = format.match(/\d/)) {
536
+ formatNumber = matches[0];
537
+ selectedButton = jQuery("#" + widget.options.uuid + "-" + formatNumber);
538
+ }
539
+ labelParent = jQuery(buttonset);
540
+ labelParent.children("input").attr("checked", false);
541
+ labelParent.children("label").removeClass("ui-state-clicked");
542
+ labelParent.children("input").button("widget").button("refresh");
543
+ if (selectedButton) {
544
+ selectedButton.attr("checked", true);
545
+ selectedButton.next("label").addClass("ui-state-clicked");
546
+ return selectedButton.button("refresh");
547
+ }
548
+ });
549
+ return this.options.toolbar.append(buttonset);
550
+ },
551
+ _init: function() {}
552
+ });
553
+ })(jQuery);
554
+
555
+ (function(jQuery) {
556
+ return jQuery.widget("Liip.hallooverlay", {
557
+ options: {
558
+ editable: null,
559
+ toolbar: null,
560
+ uuid: "",
561
+ overlay: null,
562
+ padding: 10,
563
+ background: null
564
+ },
565
+ _create: function() {
566
+ var widget;
567
+ widget = this;
568
+ if (!this.options.bound) {
569
+ this.options.bound = true;
570
+ widget.options.editable.element.bind("halloactivated", function(event, data) {
571
+ widget.options.currentEditable = jQuery(event.target);
572
+ if (!widget.options.visible) {
573
+ return widget.showOverlay();
574
+ }
575
+ });
576
+ widget.options.editable.element.bind("hallomodified", function(event, data) {
577
+ widget.options.currentEditable = jQuery(event.target);
578
+ if (widget.options.visible) {
579
+ return widget.resizeOverlay();
580
+ }
581
+ });
582
+ return widget.options.editable.element.bind("hallodeactivated", function(event, data) {
583
+ widget.options.currentEditable = jQuery(event.target);
584
+ if (widget.options.visible) {
585
+ return widget.hideOverlay();
586
+ }
587
+ });
588
+ }
589
+ },
590
+ _init: function() {},
591
+ showOverlay: function() {
592
+ this.options.visible = true;
593
+ if (this.options.overlay === null) {
594
+ if (jQuery("#halloOverlay").length > 0) {
595
+ this.options.overlay = jQuery("#halloOverlay");
596
+ } else {
597
+ this.options.overlay = jQuery('<div id="halloOverlay" class="halloOverlay">');
598
+ jQuery(document.body).append(this.options.overlay);
599
+ }
600
+ this.options.overlay.bind('click', jQuery.proxy(this.options.editable.turnOff, this.options.editable));
601
+ }
602
+ this.options.overlay.show();
603
+ if (this.options.background === null) {
604
+ if (jQuery("#halloBackground").length > 0) {
605
+ this.options.background = jQuery("#halloBackground");
606
+ } else {
607
+ this.options.background = jQuery('<div id="halloBackground" class="halloBackground">');
608
+ jQuery(document.body).append(this.options.background);
609
+ }
610
+ }
611
+ this.resizeOverlay();
612
+ this.options.background.show();
613
+ if (!this.options.originalZIndex) {
614
+ this.options.originalZIndex = this.options.currentEditable.css("z-index");
615
+ }
616
+ return this.options.currentEditable.css('z-index', '350');
617
+ },
618
+ resizeOverlay: function() {
619
+ var offset;
620
+ offset = this.options.currentEditable.offset();
621
+ this.options.background.css({
622
+ top: offset.top - this.options.padding,
623
+ left: offset.left - this.options.padding
624
+ });
625
+ this.options.background.width(this.options.currentEditable.width() + 2 * this.options.padding);
626
+ return this.options.background.height(this.options.currentEditable.height() + 2 * this.options.padding);
627
+ },
628
+ hideOverlay: function() {
629
+ this.options.visible = false;
630
+ this.options.overlay.hide();
631
+ this.options.background.hide();
632
+ return this.options.currentEditable.css('z-index', this.options.originalZIndex);
633
+ },
634
+ _findBackgroundColor: function(jQueryfield) {
635
+ var color;
636
+ color = jQueryfield.css("background-color");
637
+ if (color !== 'rgba(0, 0, 0, 0)' && color !== 'transparent') {
638
+ return color;
639
+ }
640
+ if (jQueryfield.is("body")) {
641
+ return "white";
642
+ } else {
643
+ return this._findBackgroundColor(jQueryfield.parent());
644
+ }
645
+ }
646
+ });
647
+ })(jQuery);
648
+
649
+ (function(jQuery) {
650
+ return jQuery.widget("Liip.hallotoolbarlinebreak", {
651
+ options: {
652
+ editable: null,
653
+ toolbar: null,
654
+ uuid: "",
655
+ breakAfter: []
656
+ },
657
+ _create: function() {
658
+ var buttonset, buttonsets, queuedButtonsets, row, rowcounter, _i, _j, _len, _len1, _ref;
659
+ buttonsets = jQuery('.ui-buttonset', this.options.toolbar);
660
+ queuedButtonsets = jQuery();
661
+ rowcounter = 0;
662
+ _ref = this.options.breakAfter;
663
+ for (_i = 0, _len = _ref.length; _i < _len; _i++) {
664
+ row = _ref[_i];
665
+ rowcounter++;
666
+ for (_j = 0, _len1 = buttonsets.length; _j < _len1; _j++) {
667
+ buttonset = buttonsets[_j];
668
+ queuedButtonsets = jQuery(queuedButtonsets).add(jQuery(buttonset));
669
+ if (jQuery(buttonset).hasClass(row)) {
670
+ queuedButtonsets.wrapAll('<div class="halloButtonrow halloButtonrow-' + rowcounter + '" />');
671
+ buttonsets = buttonsets.not(queuedButtonsets);
672
+ queuedButtonsets = jQuery();
673
+ break;
674
+ }
675
+ }
676
+ }
677
+ if (buttonsets.length > 0) {
678
+ rowcounter++;
679
+ return buttonsets.wrapAll('<div class="halloButtonrow halloButtonrow-' + rowcounter + '" />');
680
+ }
681
+ },
682
+ _init: function() {}
683
+ });
684
+ })(jQuery);
685
+
686
+ (function(jQuery) {
687
+ var z;
688
+ z = null;
689
+ if (this.VIE !== void 0) {
690
+ z = new VIE;
691
+ z.use(new z.StanbolService({
692
+ proxyDisabled: true,
693
+ url: 'http://dev.iks-project.eu:8081'
694
+ }));
695
+ }
696
+ return jQuery.widget('IKS.halloannotate', {
697
+ options: {
698
+ vie: z,
699
+ editable: null,
700
+ toolbar: null,
701
+ uuid: '',
702
+ select: function() {},
703
+ decline: function() {},
704
+ remove: function() {},
705
+ buttonCssClass: null
706
+ },
707
+ _create: function() {
708
+ var buttonHolder, editableElement, turnOffAnnotate, widget,
709
+ _this = this;
710
+ widget = this;
711
+ if (this.options.vie === void 0) {
712
+ throw 'The halloannotate plugin requires VIE to be loaded';
713
+ return;
714
+ }
715
+ if (typeof this.element.annotate !== 'function') {
716
+ throw 'The halloannotate plugin requires annotate.js to be loaded';
717
+ return;
718
+ }
719
+ this.state = 'off';
720
+ buttonHolder = jQuery("<span class=\"" + widget.widgetName + "\"></span>");
721
+ this.button = buttonHolder.hallobutton({
722
+ label: 'Annotate',
723
+ icon: 'icon-tags',
724
+ editable: this.options.editable,
725
+ command: null,
726
+ uuid: this.options.uuid,
727
+ cssClass: this.options.buttonCssClass,
728
+ queryState: false
729
+ });
730
+ buttonHolder.bind('change', function(event) {
731
+ if (_this.state === "pending") {
732
+ return;
733
+ }
734
+ if (_this.state === "off") {
735
+ return _this.turnOn();
736
+ }
737
+ return _this.turnOff();
738
+ });
739
+ buttonHolder.buttonset();
740
+ this.options.toolbar.append(this.button);
741
+ this.instantiate();
742
+ turnOffAnnotate = function() {
743
+ var editable;
744
+ editable = this;
745
+ return jQuery(editable).halloannotate('turnOff');
746
+ };
747
+ editableElement = this.options.editable.element;
748
+ return editableElement.bind('hallodisabled', turnOffAnnotate);
749
+ },
750
+ cleanupContentClone: function(el) {
751
+ if (this.state === 'on') {
752
+ return el.find(".entity:not([about])").each(function() {
753
+ return jQuery(this).replaceWith(jQuery(this).html());
754
+ });
755
+ }
756
+ },
757
+ instantiate: function() {
758
+ var widget;
759
+ widget = this;
760
+ return this.options.editable.element.annotate({
761
+ vie: this.options.vie,
762
+ debug: false,
763
+ showTooltip: true,
764
+ select: this.options.select,
765
+ remove: this.options.remove,
766
+ success: this.options.success,
767
+ error: this.options.error
768
+ }).bind('annotateselect', function() {
769
+ return widget.options.editable.setModified();
770
+ }).bind('annotateremove', function() {
771
+ return jQuery.noop();
772
+ });
773
+ },
774
+ turnPending: function() {
775
+ this.state = 'pending';
776
+ this.button.hallobutton('checked', false);
777
+ return this.button.hallobutton('disable');
778
+ },
779
+ turnOn: function() {
780
+ var widget,
781
+ _this = this;
782
+ this.turnPending();
783
+ widget = this;
784
+ try {
785
+ return this.options.editable.element.annotate('enable', function(success) {
786
+ if (success) {
787
+ _this.state = 'on';
788
+ _this.button.hallobutton('checked', true);
789
+ return _this.button.hallobutton('enable');
790
+ }
791
+ });
792
+ } catch (e) {
793
+ return alert(e);
794
+ }
795
+ },
796
+ turnOff: function() {
797
+ this.options.editable.element.annotate('disable');
798
+ this.button.attr('checked', false);
799
+ this.button.find("label").removeClass("ui-state-clicked");
800
+ this.button.button('refresh');
801
+ return this.state = 'off';
802
+ }
803
+ });
804
+ })(jQuery);
805
+
806
+ (function(jQuery) {
807
+ return jQuery.widget("Liip.halloimage", {
808
+ options: {
809
+ editable: null,
810
+ toolbar: null,
811
+ uuid: "",
812
+ limit: 8,
813
+ search: null,
814
+ suggestions: null,
815
+ loaded: null,
816
+ upload: null,
817
+ uploadUrl: null,
818
+ dialogOpts: {
819
+ autoOpen: false,
820
+ width: 270,
821
+ height: "auto",
822
+ title: "Insert Images",
823
+ modal: false,
824
+ resizable: false,
825
+ draggable: true,
826
+ dialogClass: 'halloimage-dialog',
827
+ close: function(ev, ui) {
828
+ return jQuery('.image_button').removeClass('ui-state-clicked');
829
+ }
830
+ },
831
+ dialog: null,
832
+ buttonCssClass: null
833
+ },
834
+ _create: function() {
835
+ var button, buttonHolder, buttonset, dialogId, id, widget;
836
+ widget = this;
837
+ dialogId = "" + this.options.uuid + "-image-dialog";
838
+ this.options.dialog = jQuery("<div id=\"" + dialogId + "\"> <div class=\"nav\"> <ul class=\"tabs\"> </ul> <div id=\"" + this.options.uuid + "-tab-activeIndicator\" class=\"tab-activeIndicator\" /> </div> <div class=\"dialogcontent\"> </div>");
839
+ if (widget.options.uploadUrl && !widget.options.upload) {
840
+ widget.options.upload = widget._iframeUpload;
841
+ }
842
+ if (widget.options.suggestions) {
843
+ this._addGuiTabSuggestions(jQuery(".tabs", this.options.dialog), jQuery(".dialogcontent", this.options.dialog));
844
+ }
845
+ if (widget.options.search) {
846
+ this._addGuiTabSearch(jQuery(".tabs", this.options.dialog), jQuery(".dialogcontent", this.options.dialog));
847
+ }
848
+ if (widget.options.upload) {
849
+ this._addGuiTabUpload(jQuery(".tabs", this.options.dialog), jQuery(".dialogcontent", this.options.dialog));
850
+ }
851
+ buttonset = jQuery("<span class=\"" + widget.widgetName + "\"></span>");
852
+ id = "" + this.options.uuid + "-image";
853
+ buttonHolder = jQuery('<span></span>');
854
+ buttonHolder.hallobutton({
855
+ label: 'Images',
856
+ icon: 'icon-picture',
857
+ editable: this.options.editable,
858
+ command: null,
859
+ queryState: false,
860
+ uuid: this.options.uuid,
861
+ cssClass: this.options.buttonCssClass
862
+ });
863
+ buttonset.append(buttonHolder);
864
+ button = buttonHolder;
865
+ button.bind("change", function(event) {
866
+ if (widget.options.dialog.dialog("isOpen")) {
867
+ return widget._closeDialog();
868
+ } else {
869
+ return widget._openDialog();
870
+ }
871
+ });
872
+ this.options.editable.element.bind("hallodeactivated", function(event) {
873
+ return widget._closeDialog();
874
+ });
875
+ jQuery(this.options.editable.element).delegate("img", "click", function(event) {
876
+ return widget._openDialog();
877
+ });
878
+ jQuery(this.options.dialog).find(".nav li").click(function() {
879
+ jQuery("." + widget.widgetName + "-tab").each(function() {
880
+ return jQuery(this).hide();
881
+ });
882
+ id = jQuery(this).attr("id");
883
+ jQuery("#" + id + "-content").show();
884
+ return jQuery("#" + widget.options.uuid + "-tab-activeIndicator").css("margin-left", jQuery(this).position().left + (jQuery(this).width() / 2));
885
+ });
886
+ jQuery("." + widget.widgetName + "-tab .imageThumbnail").live("click", function(event) {
887
+ var scope;
888
+ scope = jQuery(this).closest("." + widget.widgetName + "-tab");
889
+ jQuery(".imageThumbnail", scope).removeClass("imageThumbnailActive");
890
+ jQuery(this).addClass("imageThumbnailActive");
891
+ jQuery(".activeImage", scope).attr("src", jQuery(this).attr("src"));
892
+ return jQuery(".activeImageBg", scope).attr("src", jQuery(this).attr("src"));
893
+ });
894
+ buttonset.buttonset();
895
+ this.options.toolbar.append(buttonset);
896
+ this.options.dialog.dialog(this.options.dialogOpts);
897
+ return this._addDragnDrop();
898
+ },
899
+ _init: function() {},
900
+ _openDialog: function() {
901
+ var articleTags, cleanUp, i, repoImagesFound, showResults, tagType, thumbId, tmpArticleTags, vie, widget, xposition, yposition;
902
+ widget = this;
903
+ cleanUp = function() {
904
+ return window.setTimeout((function() {
905
+ var thumbnails;
906
+ thumbnails = jQuery(".imageThumbnail");
907
+ return jQuery(thumbnails).each(function() {
908
+ var size;
909
+ size = jQuery("#" + this.id).width();
910
+ if (size <= 20) {
911
+ return jQuery("#" + this.id).parent("li").remove();
912
+ }
913
+ });
914
+ }), 15000);
915
+ };
916
+ repoImagesFound = false;
917
+ showResults = function(response) {
918
+ jQuery.each(response.assets, function(key, val) {
919
+ jQuery(".imageThumbnailContainer ul").append("<li><img src=\"" + val.url + "\" class=\"imageThumbnail\"></li>");
920
+ return repoImagesFound = true;
921
+ });
922
+ if (response.assets.length > 0) {
923
+ return jQuery("#activitySpinner").hide();
924
+ }
925
+ };
926
+ jQuery('.image_button').addClass('ui-state-clicked');
927
+ jQuery("#" + this.options.uuid + "-sugg-activeImage").attr("src", jQuery("#" + this.options.uuid + "-tab-suggestions-content .imageThumbnailActive").first().attr("src"));
928
+ jQuery("#" + this.options.uuid + "-sugg-activeImageBg").attr("src", jQuery("#" + this.options.uuid + "-tab-suggestions-content .imageThumbnailActive").first().attr("src"));
929
+ this.lastSelection = this.options.editable.getSelection();
930
+ xposition = jQuery(this.options.editable.element).offset().left + jQuery(this.options.editable.element).outerWidth() - 3;
931
+ yposition = jQuery(this.options.toolbar).offset().top - jQuery(document).scrollTop() - 29;
932
+ this.options.dialog.dialog("option", "position", [xposition, yposition]);
933
+ if (widget.options.loaded === null && widget.options.suggestions) {
934
+ articleTags = [];
935
+ jQuery("#activitySpinner").show();
936
+ tmpArticleTags = jQuery(".inEditMode").parent().find(".articleTags input").val();
937
+ tmpArticleTags = tmpArticleTags.split(",");
938
+ for (i in tmpArticleTags) {
939
+ tagType = typeof tmpArticleTags[i];
940
+ if ("string" === tagType && tmpArticleTags[i].indexOf("http") !== -1) {
941
+ articleTags.push(tmpArticleTags[i]);
942
+ }
943
+ }
944
+ jQuery(".imageThumbnailContainer ul").empty();
945
+ widget.options.suggestions(jQuery(".inEditMode").parent().find(".articleTags input").val(), widget.options.limit, 0, showResults);
946
+ vie = new VIE();
947
+ vie.use(new vie.DBPediaService({
948
+ url: "http://dev.iks-project.eu/stanbolfull",
949
+ proxyDisabled: true
950
+ }));
951
+ thumbId = 1;
952
+ if (articleTags.length === 0) {
953
+ jQuery("#activitySpinner").html("No images found.");
954
+ }
955
+ jQuery(articleTags).each(function() {
956
+ return vie.load({
957
+ entity: this + ""
958
+ }).using("dbpedia").execute().done(function(entity) {
959
+ jQuery(entity).each(function() {
960
+ var img, responseType;
961
+ if (this.attributes["<http://dbpedia.org/ontology/thumbnail>"]) {
962
+ responseType = typeof this.attributes["<http://dbpedia.org/ontology/thumbnail>"];
963
+ if (responseType === "string") {
964
+ img = this.attributes["<http://dbpedia.org/ontology/thumbnail>"];
965
+ img = img.substring(1, img.length - 1);
966
+ }
967
+ if (responseType === "object") {
968
+ img = "";
969
+ img = this.attributes["<http://dbpedia.org/ontology/thumbnail>"][0].value;
970
+ }
971
+ jQuery(".imageThumbnailContainer ul").append("<li><img id=\"si-" + thumbId + "\" src=\"" + img + "\" class=\"imageThumbnail\"></li>");
972
+ return thumbId++;
973
+ }
974
+ });
975
+ return jQuery("#activitySpinner").hide();
976
+ });
977
+ });
978
+ }
979
+ cleanUp();
980
+ widget.options.loaded = 1;
981
+ this.options.dialog.dialog("open");
982
+ return this.options.editable.protectFocusFrom(this.options.dialog);
983
+ },
984
+ _closeDialog: function() {
985
+ return this.options.dialog.dialog("close");
986
+ },
987
+ _addGuiTabSuggestions: function(tabs, element) {
988
+ var widget;
989
+ widget = this;
990
+ tabs.append(jQuery("<li id=\"" + this.options.uuid + "-tab-suggestions\" class=\"" + widget.widgetName + "-tabselector " + widget.widgetName + "-tab-suggestions\"><span>Suggestions</span></li>"));
991
+ return element.append(jQuery("<div id=\"" + this.options.uuid + "-tab-suggestions-content\" class=\"" + widget.widgetName + "-tab tab-suggestions\"> <div class=\"imageThumbnailContainer fixed\"><div id=\"activitySpinner\">Loading Images...</div><ul><li> <img src=\"http://imagesus.homeaway.com/mda01/badf2e69babf2f6a0e4b680fc373c041c705b891\" class=\"imageThumbnail imageThumbnailActive\" /> </li></ul><br style=\"clear:both\"/> </div> <div class=\"activeImageContainer\"> <div class=\"rotationWrapper\"> <div class=\"hintArrow\"></div> <img src=\"\" id=\"" + this.options.uuid + "-sugg-activeImage\" class=\"activeImage\" /> </div> <img src=\"\" id=\"" + this.options.uuid + "-sugg-activeImageBg\" class=\"activeImage activeImageBg\" /> </div> <div class=\"metadata\"> <label for=\"caption-sugg\">Caption</label><input type=\"text\" id=\"caption-sugg\" /> </div> </div>"));
992
+ },
993
+ _addGuiTabSearch: function(tabs, element) {
994
+ var dialogId, widget;
995
+ widget = this;
996
+ dialogId = "" + this.options.uuid + "-image-dialog";
997
+ tabs.append(jQuery("<li id=\"" + this.options.uuid + "-tab-search\" class=\"" + widget.widgetName + "-tabselector " + widget.widgetName + "-tab-search\"><span>Search</span></li>"));
998
+ element.append(jQuery("<div id=\"" + this.options.uuid + "-tab-search-content\" class=\"" + widget.widgetName + "-tab tab-search\"> <form type=\"get\" id=\"" + this.options.uuid + "-" + widget.widgetName + "-searchForm\"> <input type=\"text\" class=\"searchInput\" /><input type=\"submit\" id=\"" + this.options.uuid + "-" + widget.widgetName + "-searchButton\" class=\"button searchButton\" value=\"OK\"/> </form> <div class=\"searchResults imageThumbnailContainer\"></div> <div id=\"" + this.options.uuid + "-search-activeImageContainer\" class=\"search-activeImageContainer activeImageContainer\"> <div class=\"rotationWrapper\"> <div class=\"hintArrow\"></div> <img src=\"\" id=\"" + this.options.uuid + "-search-activeImageBg\" class=\"activeImage\" /> </div> <img src=\"\" id=\"" + this.options.uuid + "-search-activeImage\" class=\"activeImage activeImageBg\" /> </div> <div class=\"metadata\" id=\"metadata-search\" style=\"display: none;\"> <label for=\"caption-search\">Caption</label><input type=\"text\" id=\"caption-search\" /> <!--<button id=\"" + this.options.uuid + "-" + widget.widgetName + "-addimage\">Add Image</button>--> </div> </div>"));
999
+ return jQuery(".tab-search form", element).submit(function(event) {
1000
+ var showResults, that;
1001
+ event.preventDefault();
1002
+ that = this;
1003
+ showResults = function(response) {
1004
+ var container, firstimage, items;
1005
+ items = [];
1006
+ items.push("<div class=\"pager-prev\" style=\"display:none\"></div>");
1007
+ jQuery.each(response.assets, function(key, val) {
1008
+ return items.push("<img src=\"" + val.url + "\" class=\"imageThumbnail " + widget.widgetName + "-search-imageThumbnail\" /> ");
1009
+ });
1010
+ items.push("<div class=\"pager-next\" style=\"display:none\"></div>");
1011
+ container = jQuery("#" + dialogId + " .tab-search .searchResults");
1012
+ container.html(items.join(""));
1013
+ if (response.offset > 0) {
1014
+ jQuery('.pager-prev', container).show();
1015
+ }
1016
+ if (response.offset < response.total) {
1017
+ jQuery('.pager-next', container).show();
1018
+ }
1019
+ jQuery('.pager-prev', container).click(function(event) {
1020
+ return widget.options.search(null, widget.options.limit, response.offset - widget.options.limit, showResults);
1021
+ });
1022
+ jQuery('.pager-next', container).click(function(event) {
1023
+ return widget.options.search(null, widget.options.limit, response.offset + widget.options.limit, showResults);
1024
+ });
1025
+ jQuery("#" + widget.options.uuid + "-search-activeImageContainer").show();
1026
+ firstimage = jQuery("." + widget.widgetName + "-search-imageThumbnail").first().addClass("imageThumbnailActive");
1027
+ jQuery("#" + widget.options.uuid + "-search-activeImage, #" + widget.options.uuid + "-search-activeImageBg").attr("src", firstimage.attr("src"));
1028
+ return jQuery("#metadata-search").show();
1029
+ };
1030
+ return widget.options.search(null, widget.options.limit, 0, showResults);
1031
+ });
1032
+ },
1033
+ _prepareIframe: function(widget) {
1034
+ var iframe;
1035
+ widget.options.iframeName = "" + widget.options.uuid + "-" + widget.widgetName + "-postframe";
1036
+ iframe = jQuery("<iframe name=\"" + widget.options.iframeName + "\" id=\"" + widget.options.iframeName + "\" class=\"hidden\" src=\"javascript:false;\" style=\"display:none\" />");
1037
+ jQuery("#" + widget.options.uuid + "-" + widget.widgetName + "-iframe").append(iframe);
1038
+ return iframe.get(0).name = widget.options.iframeName;
1039
+ },
1040
+ _iframeUpload: function(data) {
1041
+ var uploadForm, widget;
1042
+ widget = data.widget;
1043
+ widget._prepareIframe(widget);
1044
+ jQuery("#" + widget.options.uuid + "-" + widget.widgetName + "-tags").val(jQuery(".inEditMode").parent().find(".articleTags input").val());
1045
+ uploadForm = jQuery("#" + widget.options.uuid + "-" + widget.widgetName + "-uploadform");
1046
+ uploadForm.attr("action", widget.options.uploadUrl);
1047
+ uploadForm.attr("method", "post");
1048
+ uploadForm.attr("userfile", data.file);
1049
+ uploadForm.attr("enctype", "multipart/form-data");
1050
+ uploadForm.attr("encoding", "multipart/form-data");
1051
+ uploadForm.attr("target", widget.options.iframeName);
1052
+ uploadForm.submit();
1053
+ return jQuery("#" + widget.options.iframeName).load(function() {
1054
+ return data.success(jQuery("#" + widget.options.iframeName)[0].contentWindow.location.href);
1055
+ });
1056
+ },
1057
+ _addGuiTabUpload: function(tabs, element) {
1058
+ var iframe, insertImage, widget;
1059
+ widget = this;
1060
+ tabs.append(jQuery("<li id=\"" + this.options.uuid + "-tab-upload\" class=\"" + widget.widgetName + "-tabselector " + widget.widgetName + "-tab-upload\"><span>Upload</span></li>"));
1061
+ element.append(jQuery("<div id=\"" + this.options.uuid + "-tab-upload-content\" class=\"" + widget.widgetName + "-tab tab-upload\"> <form id=\"" + this.options.uuid + "-" + widget.widgetName + "-uploadform\"> <input id=\"" + this.options.uuid + "-" + widget.widgetName + "-file\" name=\"" + this.options.uuid + "-" + widget.widgetName + "-file\" type=\"file\" class=\"file\" accept=\"image/*\"> <input id=\"" + this.options.uuid + "-" + widget.widgetName + "-tags\" name=\"tags\" type=\"hidden\" /> <br /> <input type=\"submit\" value=\"Upload\" id=\"" + this.options.uuid + "-" + widget.widgetName + "-upload\"> </form> <div id=\"" + this.options.uuid + "-" + widget.widgetName + "-iframe\"></div> </div>"));
1062
+ iframe = jQuery("<iframe name=\"postframe\" id=\"postframe\" class=\"hidden\" src=\"about:none\" style=\"display:none\" />");
1063
+ jQuery("#" + widget.options.uuid + "-" + widget.widgetName + "-upload").live("click", function(e) {
1064
+ var userFile;
1065
+ e.preventDefault();
1066
+ userFile = jQuery("#" + widget.options.uuid + "-" + widget.widgetName + "-file").val();
1067
+ widget.options.upload({
1068
+ widget: widget,
1069
+ file: userFile,
1070
+ success: function(imageUrl) {
1071
+ var imageID, list;
1072
+ imageID = "si" + Math.floor(Math.random() * (400 - 300 + 1) + 400) + "ab";
1073
+ if (jQuery(".imageThumbnailContainer ul", widget.options.dialog).length === 0) {
1074
+ list = jQuery('<ul></ul>');
1075
+ jQuery('.imageThumbnailContainer').append(list);
1076
+ }
1077
+ jQuery(".imageThumbnailContainer ul", widget.options.dialog).append("<li><img src=\"" + imageUrl + "\" id=\"" + imageID + "\" class=\"imageThumbnail\"></li>");
1078
+ jQuery("#" + imageID).trigger("click");
1079
+ return jQuery(widget.options.dialog).find(".nav li").first().trigger("click");
1080
+ }
1081
+ });
1082
+ return false;
1083
+ });
1084
+ insertImage = function() {
1085
+ var img, triggerModified;
1086
+ try {
1087
+ if (!widget.options.editable.getSelection()) {
1088
+ throw new Error("SelectionNotSet");
1089
+ }
1090
+ } catch (error) {
1091
+ widget.options.editable.restoreSelection(widget.lastSelection);
1092
+ }
1093
+ document.execCommand("insertImage", null, jQuery(this).attr('src'));
1094
+ img = document.getSelection().anchorNode.firstChild;
1095
+ jQuery(img).attr("alt", jQuery(".caption").value);
1096
+ triggerModified = function() {
1097
+ return widget.element.trigger("hallomodified");
1098
+ };
1099
+ window.setTimeout(triggerModified, 100);
1100
+ return widget._closeDialog();
1101
+ };
1102
+ return this.options.dialog.find(".halloimage-activeImage, #" + widget.options.uuid + "-" + widget.widgetName + "-addimage").click(insertImage);
1103
+ },
1104
+ _addDragnDrop: function() {
1105
+ var dnd, draggables, editable, helper, offset, overlay, overlayMiddleConfig, third, widgetOptions;
1106
+ helper = {
1107
+ delayAction: function(functionToCall, delay) {
1108
+ var timer;
1109
+ timer = clearTimeout(timer);
1110
+ if (!timer) {
1111
+ return timer = setTimeout(functionToCall, delay);
1112
+ }
1113
+ },
1114
+ calcPosition: function(offset, event) {
1115
+ var position;
1116
+ position = offset.left + third;
1117
+ if (event.pageX >= position && event.pageX <= (offset.left + third * 2)) {
1118
+ return "middle";
1119
+ } else if (event.pageX < position) {
1120
+ return "left";
1121
+ } else if (event.pageX > (offset.left + third * 2)) {
1122
+ return "right";
1123
+ }
1124
+ },
1125
+ createInsertElement: function(image, tmp) {
1126
+ var altText, height, imageInsert, maxHeight, maxWidth, ratio, tmpImg, width;
1127
+ maxWidth = 250;
1128
+ maxHeight = 250;
1129
+ tmpImg = new Image();
1130
+ tmpImg.src = image.src;
1131
+ if (!tmp) {
1132
+ if (this.startPlace.parents(".tab-suggestions").length > 0) {
1133
+ altText = jQuery("#caption-sugg").val();
1134
+ } else if (this.startPlace.parents(".tab-search").length > 0) {
1135
+ altText = jQuery("#caption-search").val();
1136
+ } else {
1137
+ altText = jQuery(image).attr("alt");
1138
+ }
1139
+ }
1140
+ width = tmpImg.width;
1141
+ height = tmpImg.height;
1142
+ if (width > maxWidth || height > maxHeight) {
1143
+ if (width > height) {
1144
+ ratio = (tmpImg.width / maxWidth).toFixed();
1145
+ } else {
1146
+ ratio = (tmpImg.height / maxHeight).toFixed();
1147
+ }
1148
+ width = (tmpImg.width / ratio).toFixed();
1149
+ height = (tmpImg.height / ratio).toFixed();
1150
+ }
1151
+ imageInsert = jQuery("<img>").attr({
1152
+ src: tmpImg.src,
1153
+ width: width,
1154
+ height: height,
1155
+ alt: altText,
1156
+ "class": (tmp ? "tmp" : "")
1157
+ }).show();
1158
+ return imageInsert;
1159
+ },
1160
+ createLineFeedbackElement: function() {
1161
+ return jQuery("<div/>").addClass("tmpLine");
1162
+ },
1163
+ removeFeedbackElements: function() {
1164
+ return jQuery('.tmp, .tmpLine', editable).remove();
1165
+ },
1166
+ removeCustomHelper: function() {
1167
+ return jQuery(".customHelper").remove();
1168
+ },
1169
+ showOverlay: function(position) {
1170
+ var eHeight;
1171
+ eHeight = editable.height() + parseFloat(editable.css('paddingTop')) + parseFloat(editable.css('paddingBottom'));
1172
+ overlay.big.css({
1173
+ height: eHeight
1174
+ });
1175
+ overlay.left.css({
1176
+ height: eHeight
1177
+ });
1178
+ overlay.right.css({
1179
+ height: eHeight
1180
+ });
1181
+ switch (position) {
1182
+ case "left":
1183
+ overlay.big.addClass("bigOverlayLeft").removeClass("bigOverlayRight").css({
1184
+ left: third
1185
+ }).show();
1186
+ overlay.left.hide();
1187
+ return overlay.right.hide();
1188
+ case "middle":
1189
+ overlay.big.removeClass("bigOverlayLeft bigOverlayRight");
1190
+ overlay.big.hide();
1191
+ overlay.left.show();
1192
+ return overlay.right.show();
1193
+ case "right":
1194
+ overlay.big.addClass("bigOverlayRight").removeClass("bigOverlayLeft").css({
1195
+ left: 0
1196
+ }).show();
1197
+ overlay.left.hide();
1198
+ return overlay.right.hide();
1199
+ }
1200
+ },
1201
+ checkOrigin: function(event) {
1202
+ if (jQuery(event.target).parents("[contenteditable]").length !== 0) {
1203
+ return true;
1204
+ } else {
1205
+ return false;
1206
+ }
1207
+ },
1208
+ startPlace: ""
1209
+ };
1210
+ dnd = {
1211
+ createTmpFeedback: function(image, position) {
1212
+ var el;
1213
+ if (position === 'middle') {
1214
+ return helper.createLineFeedbackElement();
1215
+ } else {
1216
+ el = helper.createInsertElement(image, true);
1217
+ return el.addClass("inlineImage-" + position);
1218
+ }
1219
+ },
1220
+ handleOverEvent: function(event, ui) {
1221
+ var postPone;
1222
+ postPone = function() {
1223
+ var position;
1224
+ window.waitWithTrash = clearTimeout(window.waitWithTrash);
1225
+ position = helper.calcPosition(offset, event);
1226
+ jQuery('.trashcan', ui.helper).remove();
1227
+ editable.append(overlay.big);
1228
+ editable.append(overlay.left);
1229
+ editable.append(overlay.right);
1230
+ helper.removeFeedbackElements();
1231
+ jQuery(event.target).prepend(dnd.createTmpFeedback(ui.draggable[0], position));
1232
+ if (position === "middle") {
1233
+ jQuery(event.target).prepend(dnd.createTmpFeedback(ui.draggable[0], 'right'));
1234
+ jQuery('.tmp', jQuery(event.target)).hide();
1235
+ } else {
1236
+ jQuery(event.target).prepend(dnd.createTmpFeedback(ui.draggable[0], 'middle'));
1237
+ jQuery('.tmpLine', jQuery(event.target)).hide();
1238
+ }
1239
+ return helper.showOverlay(position);
1240
+ };
1241
+ return setTimeout(postPone, 5);
1242
+ },
1243
+ handleDragEvent: function(event, ui) {
1244
+ var position, tmpFeedbackLR, tmpFeedbackMiddle;
1245
+ position = helper.calcPosition(offset, event);
1246
+ if (position === dnd.lastPositionDrag) {
1247
+ return;
1248
+ }
1249
+ dnd.lastPositionDrag = position;
1250
+ tmpFeedbackLR = jQuery('.tmp', editable);
1251
+ tmpFeedbackMiddle = jQuery('.tmpLine', editable);
1252
+ if (position === "middle") {
1253
+ tmpFeedbackMiddle.show();
1254
+ tmpFeedbackLR.hide();
1255
+ } else {
1256
+ tmpFeedbackMiddle.hide();
1257
+ tmpFeedbackLR.removeClass("inlineImage-left inlineImage-right").addClass("inlineImage-" + position).show();
1258
+ }
1259
+ return helper.showOverlay(position);
1260
+ },
1261
+ handleLeaveEvent: function(event, ui) {
1262
+ var func;
1263
+ func = function() {
1264
+ if (!jQuery('div.trashcan', ui.helper).length) {
1265
+ jQuery(ui.helper).append(jQuery('<div class="trashcan"></div>'));
1266
+ }
1267
+ return jQuery('.bigOverlay, .smallOverlay').remove();
1268
+ };
1269
+ window.waitWithTrash = setTimeout(func, 200);
1270
+ return helper.removeFeedbackElements();
1271
+ },
1272
+ handleStartEvent: function(event, ui) {
1273
+ var internalDrop;
1274
+ internalDrop = helper.checkOrigin(event);
1275
+ if (internalDrop) {
1276
+ jQuery(event.target).remove();
1277
+ }
1278
+ jQuery(document).trigger('startPreventSave');
1279
+ return helper.startPlace = jQuery(event.target);
1280
+ },
1281
+ handleStopEvent: function(event, ui) {
1282
+ var internalDrop;
1283
+ internalDrop = helper.checkOrigin(event);
1284
+ if (internalDrop) {
1285
+ jQuery(event.target).remove();
1286
+ } else {
1287
+ editable.trigger('change');
1288
+ }
1289
+ overlay.big.hide();
1290
+ overlay.left.hide();
1291
+ overlay.right.hide();
1292
+ return jQuery(document).trigger('stopPreventSave');
1293
+ },
1294
+ handleDropEvent: function(event, ui) {
1295
+ var imageInsert, internalDrop, position;
1296
+ internalDrop = helper.checkOrigin(event);
1297
+ position = helper.calcPosition(offset, event);
1298
+ helper.removeFeedbackElements();
1299
+ helper.removeCustomHelper();
1300
+ imageInsert = helper.createInsertElement(ui.draggable[0], false);
1301
+ if (position === "middle") {
1302
+ imageInsert.show();
1303
+ imageInsert.removeClass("inlineImage-middle inlineImage-left inlineImage-right").addClass("inlineImage-" + position).css({
1304
+ position: "relative",
1305
+ left: ((editable.width() + parseFloat(editable.css('paddingLeft')) + parseFloat(editable.css('paddingRight'))) - imageInsert.attr('width')) / 2
1306
+ });
1307
+ imageInsert.insertBefore(jQuery(event.target));
1308
+ } else {
1309
+ imageInsert.removeClass("inlineImage-middle inlineImage-left inlineImage-right").addClass("inlineImage-" + position).css("display", "block");
1310
+ jQuery(event.target).prepend(imageInsert);
1311
+ }
1312
+ overlay.big.hide();
1313
+ overlay.left.hide();
1314
+ overlay.right.hide();
1315
+ editable.trigger('change');
1316
+ return dnd.init(editable);
1317
+ },
1318
+ createHelper: function(event) {
1319
+ return jQuery('<div>').css({
1320
+ backgroundImage: "url(" + jQuery(event.currentTarget).attr('src') + ")"
1321
+ }).addClass('customHelper').appendTo('body');
1322
+ },
1323
+ init: function() {
1324
+ var draggable, initDraggable;
1325
+ draggable = [];
1326
+ initDraggable = function(elem) {
1327
+ if (!elem.jquery_draggable_initialized) {
1328
+ elem.jquery_draggable_initialized = true;
1329
+ jQuery(elem).draggable({
1330
+ cursor: "move",
1331
+ helper: dnd.createHelper,
1332
+ drag: dnd.handleDragEvent,
1333
+ start: dnd.handleStartEvent,
1334
+ stop: dnd.handleStopEvent,
1335
+ disabled: !editable.hasClass('inEditMode'),
1336
+ cursorAt: {
1337
+ top: 50,
1338
+ left: 50
1339
+ }
1340
+ });
1341
+ }
1342
+ return draggables.push(elem);
1343
+ };
1344
+ jQuery(".rotationWrapper img", widgetOptions.dialog).each(function(index, elem) {
1345
+ if (!elem.jquery_draggable_initialized) {
1346
+ return initDraggable(elem);
1347
+ }
1348
+ });
1349
+ jQuery('img', editable).each(function(index, elem) {
1350
+ elem.contentEditable = false;
1351
+ if (!elem.jquery_draggable_initialized) {
1352
+ return initDraggable(elem);
1353
+ }
1354
+ });
1355
+ return jQuery('p', editable).each(function(index, elem) {
1356
+ if (jQuery(elem).data('jquery_droppable_initialized')) {
1357
+ return;
1358
+ }
1359
+ jQuery(elem).droppable({
1360
+ tolerance: "pointer",
1361
+ drop: dnd.handleDropEvent,
1362
+ over: dnd.handleOverEvent,
1363
+ out: dnd.handleLeaveEvent
1364
+ });
1365
+ return jQuery(elem).data('jquery_droppable_initialized', true);
1366
+ });
1367
+ },
1368
+ enableDragging: function() {
1369
+ return jQuery.each(draggables, function(index, d) {
1370
+ return jQuery(d).draggable('option', 'disabled', false);
1371
+ });
1372
+ },
1373
+ disableDragging: function() {
1374
+ return jQuery.each(draggables, function(index, d) {
1375
+ return jQuery(d).draggable('option', 'disabled', true);
1376
+ });
1377
+ }
1378
+ };
1379
+ draggables = [];
1380
+ editable = jQuery(this.options.editable.element);
1381
+ widgetOptions = this.options;
1382
+ offset = editable.offset();
1383
+ third = parseFloat(editable.width() / 3);
1384
+ overlayMiddleConfig = {
1385
+ width: third,
1386
+ height: editable.height()
1387
+ };
1388
+ overlay = {
1389
+ big: jQuery("<div/>").addClass("bigOverlay").css({
1390
+ width: third * 2,
1391
+ height: editable.height()
1392
+ }),
1393
+ left: jQuery("<div/>").addClass("smallOverlay smallOverlayLeft").css(overlayMiddleConfig),
1394
+ right: jQuery("<div/>").addClass("smallOverlay smallOverlayRight").css(overlayMiddleConfig).css("left", third * 2)
1395
+ };
1396
+ dnd.init();
1397
+ editable.bind('halloactivated', dnd.enableDragging);
1398
+ return editable.bind('hallodeactivated', dnd.disableDragging);
1399
+ }
1400
+ });
1401
+ })(jQuery);
1402
+
1403
+ (function(jQuery) {
1404
+ return jQuery.widget("IKS.halloformat", {
1405
+ options: {
1406
+ editable: null,
1407
+ toolbar: null,
1408
+ uuid: "",
1409
+ formattings: {
1410
+ bold: true,
1411
+ italic: true,
1412
+ strikeThrough: false,
1413
+ underline: false
1414
+ },
1415
+ buttonCssClass: null
1416
+ },
1417
+ _create: function() {
1418
+ var buttonize, buttonset, enabled, format, widget, _ref,
1419
+ _this = this;
1420
+ widget = this;
1421
+ buttonset = jQuery("<span class=\"" + widget.widgetName + "\"></span>");
1422
+ buttonize = function(format) {
1423
+ var buttonHolder;
1424
+ buttonHolder = jQuery('<span></span>');
1425
+ buttonHolder.hallobutton({
1426
+ label: format,
1427
+ editable: _this.options.editable,
1428
+ command: format,
1429
+ uuid: _this.options.uuid,
1430
+ cssClass: _this.options.buttonCssClass
1431
+ });
1432
+ return buttonset.append(buttonHolder);
1433
+ };
1434
+ _ref = this.options.formattings;
1435
+ for (format in _ref) {
1436
+ enabled = _ref[format];
1437
+ if (enabled) {
1438
+ buttonize(format);
1439
+ }
1440
+ }
1441
+ buttonset.buttonset();
1442
+ return this.options.toolbar.append(buttonset);
1443
+ },
1444
+ _init: function() {}
1445
+ });
1446
+ })(jQuery);
1447
+
1448
+ (function(jQuery) {
1449
+ return jQuery.widget("IKS.halloreundo", {
1450
+ options: {
1451
+ editable: null,
1452
+ toolbar: null,
1453
+ uuid: '',
1454
+ buttonCssClass: null
1455
+ },
1456
+ _create: function() {
1457
+ var buttonize, buttonset,
1458
+ _this = this;
1459
+ buttonset = jQuery("<span class=\"" + this.widgetName + "\"></span>");
1460
+ buttonize = function(cmd, label) {
1461
+ var buttonElement;
1462
+ buttonElement = jQuery('<span></span>');
1463
+ buttonElement.hallobutton({
1464
+ uuid: _this.options.uuid,
1465
+ editable: _this.options.editable,
1466
+ label: label,
1467
+ icon: cmd === 'undo' ? 'icon-arrow-left' : 'icon-arrow-right',
1468
+ command: cmd,
1469
+ queryState: false,
1470
+ cssClass: _this.options.buttonCssClass
1471
+ });
1472
+ return buttonset.append(buttonElement);
1473
+ };
1474
+ buttonize("undo", "Undo");
1475
+ buttonize("redo", "Redo");
1476
+ buttonset.buttonset();
1477
+ return this.options.toolbar.append(buttonset);
1478
+ },
1479
+ _init: function() {}
1480
+ });
1481
+ })(jQuery);
1482
+
1483
+ (function(jQuery) {
1484
+ return jQuery.widget('IKS.halloblock', {
1485
+ options: {
1486
+ editable: null,
1487
+ toolbar: null,
1488
+ uuid: '',
1489
+ elements: ['h1', 'h2', 'h3', 'p', 'pre', 'blockquote'],
1490
+ buttonCssClass: null
1491
+ },
1492
+ _create: function() {
1493
+ var buttonset, contentId, target;
1494
+ buttonset = jQuery("<span class=\"" + this.widgetName + "\"></span>");
1495
+ contentId = "" + this.options.uuid + "-" + this.widgetName + "-data";
1496
+ target = this._prepareDropdown(contentId);
1497
+ buttonset.append(target);
1498
+ buttonset.append(this._prepareButton(target));
1499
+ return this.options.toolbar.append(buttonset);
1500
+ },
1501
+ _prepareDropdown: function(contentId) {
1502
+ var addElement, containingElement, contentArea, element, _i, _len, _ref,
1503
+ _this = this;
1504
+ contentArea = jQuery("<div id=\"" + contentId + "\"></div>");
1505
+ containingElement = this.options.editable.element.get(0).tagName.toLowerCase();
1506
+ addElement = function(element) {
1507
+ var el, queryState;
1508
+ el = jQuery("<" + element + " class=\"menu-item\">" + element + "</" + element + ">");
1509
+ if (containingElement === element) {
1510
+ el.addClass('selected');
1511
+ }
1512
+ if (containingElement !== 'div') {
1513
+ el.addClass('disabled');
1514
+ }
1515
+ el.bind('click', function() {
1516
+ if (el.hasClass('disabled')) {
1517
+ return;
1518
+ }
1519
+ return _this.options.editable.execute('formatBlock', element.toUpperCase());
1520
+ });
1521
+ queryState = function(event) {
1522
+ var block;
1523
+ block = document.queryCommandValue('formatBlock');
1524
+ if (block.toLowerCase() === element) {
1525
+ el.addClass('selected');
1526
+ return;
1527
+ }
1528
+ return el.removeClass('selected');
1529
+ };
1530
+ _this.options.editable.element.bind('halloenabled', function() {
1531
+ return _this.options.editable.element.bind('keyup paste change mouseup', queryState);
1532
+ });
1533
+ _this.options.editable.element.bind('hallodisabled', function() {
1534
+ return _this.options.editable.element.unbind('keyup paste change mouseup', queryState);
1535
+ });
1536
+ return el;
1537
+ };
1538
+ _ref = this.options.elements;
1539
+ for (_i = 0, _len = _ref.length; _i < _len; _i++) {
1540
+ element = _ref[_i];
1541
+ contentArea.append(addElement(element));
1542
+ }
1543
+ return contentArea;
1544
+ },
1545
+ _prepareButton: function(target) {
1546
+ var buttonElement;
1547
+ buttonElement = jQuery('<span></span>');
1548
+ buttonElement.hallodropdownbutton({
1549
+ uuid: this.options.uuid,
1550
+ editable: this.options.editable,
1551
+ label: 'block',
1552
+ icon: 'icon-text-height',
1553
+ target: target,
1554
+ cssClass: this.options.buttonCssClass
1555
+ });
1556
+ return buttonElement;
1557
+ }
1558
+ });
1559
+ })(jQuery);
1560
+
1561
+ (function(jQuery) {
1562
+ return jQuery.widget("IKS.hallolink", {
1563
+ options: {
1564
+ editable: null,
1565
+ toolbar: null,
1566
+ uuid: "",
1567
+ link: true,
1568
+ image: true,
1569
+ defaultUrl: 'http://',
1570
+ dialogOpts: {
1571
+ autoOpen: false,
1572
+ width: 540,
1573
+ height: 95,
1574
+ title: "Enter Link",
1575
+ modal: true,
1576
+ resizable: false,
1577
+ draggable: false,
1578
+ dialogClass: 'hallolink-dialog'
1579
+ }
1580
+ },
1581
+ _create: function() {
1582
+ var buttonize, buttonset, dialog, dialogId, dialogSubmitCb, urlInput, widget,
1583
+ _this = this;
1584
+ widget = this;
1585
+ dialogId = "" + this.options.uuid + "-dialog";
1586
+ dialog = jQuery("<div id=\"" + dialogId + "\"><form action=\"#\" method=\"post\" class=\"linkForm\"><input class=\"url\" type=\"text\" name=\"url\" value=\"" + this.options.defaultUrl + "\" /><input type=\"submit\" id=\"addlinkButton\" value=\"Insert\" /></form></div>");
1587
+ urlInput = jQuery('input[name=url]', dialog).focus(function(e) {
1588
+ return this.select();
1589
+ });
1590
+ dialogSubmitCb = function() {
1591
+ var link;
1592
+ link = urlInput.val();
1593
+ widget.options.editable.restoreSelection(widget.lastSelection);
1594
+ if (((new RegExp(/^\s*$/)).test(link)) || link === widget.options.defaultUrl) {
1595
+ if (widget.lastSelection.collapsed) {
1596
+ widget.lastSelection.setStartBefore(widget.lastSelection.startContainer);
1597
+ widget.lastSelection.setEndAfter(widget.lastSelection.startContainer);
1598
+ window.getSelection().addRange(widget.lastSelection);
1599
+ }
1600
+ document.execCommand("unlink", null, "");
1601
+ } else {
1602
+ if (widget.lastSelection.startContainer.parentNode.href === void 0) {
1603
+ document.execCommand("createLink", null, link);
1604
+ } else {
1605
+ widget.lastSelection.startContainer.parentNode.href = link;
1606
+ }
1607
+ }
1608
+ widget.options.editable.element.trigger('change');
1609
+ widget.options.editable.removeAllSelections();
1610
+ dialog.dialog('close');
1611
+ return false;
1612
+ };
1613
+ dialog.find("form").submit(dialogSubmitCb);
1614
+ buttonset = jQuery("<span class=\"" + widget.widgetName + "\"></span>");
1615
+ buttonize = function(type) {
1616
+ var button, id;
1617
+ id = "" + _this.options.uuid + "-" + type;
1618
+ buttonset.append(jQuery("<input id=\"" + id + "\" type=\"checkbox\" /><label for=\"" + id + "\" class=\"btn anchor_button\" ><i class=\"icon-bookmark\"></i></label>").button());
1619
+ button = jQuery("#" + id, buttonset);
1620
+ button.bind("change", function(event) {
1621
+ widget.lastSelection = widget.options.editable.getSelection();
1622
+ urlInput = jQuery('input[name=url]', dialog);
1623
+ if (widget.lastSelection.startContainer.parentNode.href === void 0) {
1624
+ urlInput.val(widget.options.defaultUrl);
1625
+ } else {
1626
+ urlInput.val(jQuery(widget.lastSelection.startContainer.parentNode).attr('href'));
1627
+ jQuery(urlInput[0].form).find('input[type=submit]').val('update');
1628
+ }
1629
+ dialog.dialog('open');
1630
+ return widget.options.editable.protectFocusFrom(dialog);
1631
+ });
1632
+ return _this.element.bind("keyup paste change mouseup", function(event) {
1633
+ var nodeName, start;
1634
+ start = jQuery(widget.options.editable.getSelection().startContainer);
1635
+ nodeName = start.prop('nodeName') ? start.prop('nodeName') : start.parent().prop('nodeName');
1636
+ if (nodeName && nodeName.toUpperCase() === "A") {
1637
+ button.attr("checked", true);
1638
+ button.next().addClass("ui-state-clicked");
1639
+ return button.button("refresh");
1640
+ } else {
1641
+ button.attr("checked", false);
1642
+ button.next().removeClass("ui-state-clicked");
1643
+ return button.button("refresh");
1644
+ }
1645
+ });
1646
+ };
1647
+ if (this.options.link) {
1648
+ buttonize("A");
1649
+ }
1650
+ if (this.options.link) {
1651
+ buttonset.buttonset();
1652
+ this.options.toolbar.append(buttonset);
1653
+ return dialog.dialog(this.options.dialogOpts);
1654
+ }
1655
+ },
1656
+ _init: function() {}
1657
+ });
1658
+ })(jQuery);
1659
+
1660
+ (function(jQuery) {
1661
+ return jQuery.widget("IKS.hallojustify", {
1662
+ options: {
1663
+ editable: null,
1664
+ toolbar: null,
1665
+ uuid: '',
1666
+ buttonCssClass: null
1667
+ },
1668
+ _create: function() {
1669
+ var buttonize, buttonset,
1670
+ _this = this;
1671
+ buttonset = jQuery("<span class=\"" + this.widgetName + "\"></span>");
1672
+ buttonize = function(alignment) {
1673
+ var buttonElement;
1674
+ buttonElement = jQuery('<span></span>');
1675
+ buttonElement.hallobutton({
1676
+ uuid: _this.options.uuid,
1677
+ editable: _this.options.editable,
1678
+ label: alignment,
1679
+ command: "justify" + alignment,
1680
+ icon: "icon-align-" + (alignment.toLowerCase()),
1681
+ cssClass: _this.options.buttonCssClass
1682
+ });
1683
+ return buttonset.append(buttonElement);
1684
+ };
1685
+ buttonize("Left");
1686
+ buttonize("Center");
1687
+ buttonize("Right");
1688
+ buttonset.buttonset();
1689
+ return this.options.toolbar.append(buttonset);
1690
+ },
1691
+ _init: function() {}
1692
+ });
1693
+ })(jQuery);
1694
+
1695
+ (function(jQuery) {
1696
+ return jQuery.widget('IKS.hallobutton', {
1697
+ button: null,
1698
+ options: {
1699
+ uuid: '',
1700
+ label: null,
1701
+ icon: null,
1702
+ editable: null,
1703
+ command: null,
1704
+ queryState: true,
1705
+ cssClass: null
1706
+ },
1707
+ _create: function() {
1708
+ var id, _base;
1709
+ if ((_base = this.options).icon == null) {
1710
+ _base.icon = "icon-" + (this.options.label.toLowerCase());
1711
+ }
1712
+ id = "" + this.options.uuid + "-" + this.options.label;
1713
+ this.element.append(this._createButton(id, this.options.command));
1714
+ this.element.append(this._createLabel(id, this.options.command, this.options.label, this.options.icon));
1715
+ if (this.options.cssClass) {
1716
+ this.element.find('label').addClass(this.options.cssClass);
1717
+ }
1718
+ this.button = this.element.find('input');
1719
+ this.button.button();
1720
+ if (this.options.cssClass) {
1721
+ this.button.addClass(this.options.cssClass);
1722
+ }
1723
+ return this.button.data('hallo-command', this.options.command);
1724
+ },
1725
+ _init: function() {
1726
+ var editableElement, queryState,
1727
+ _this = this;
1728
+ if (!this.button) {
1729
+ this.button = this._prepareButton();
1730
+ }
1731
+ this.element.append(this.button);
1732
+ if (this.options.command) {
1733
+ this.button.bind('change', function(event) {
1734
+ return _this.options.editable.execute(_this.options.command);
1735
+ });
1736
+ }
1737
+ if (!this.options.queryState) {
1738
+ return;
1739
+ }
1740
+ editableElement = this.options.editable.element;
1741
+ queryState = function(event) {
1742
+ if (!_this.options.command) {
1743
+ return;
1744
+ }
1745
+ try {
1746
+ return _this.checked(document.queryCommandState(_this.options.command));
1747
+ } catch (e) {
1748
+
1749
+ }
1750
+ };
1751
+ editableElement.bind('halloenabled', function() {
1752
+ return editableElement.bind('keyup paste change mouseup hallomodified', queryState);
1753
+ });
1754
+ return editableElement.bind('hallodisabled', function() {
1755
+ return editableElement.unbind('keyup paste change mouseup hallomodified', queryState);
1756
+ });
1757
+ },
1758
+ enable: function() {
1759
+ return this.button.button('enable');
1760
+ },
1761
+ disable: function() {
1762
+ return this.button.button('disable');
1763
+ },
1764
+ refresh: function() {
1765
+ return this.button.button('refresh');
1766
+ },
1767
+ checked: function(checked) {
1768
+ this.button.attr('checked', checked);
1769
+ return this.refresh();
1770
+ },
1771
+ _createButton: function(id) {
1772
+ return jQuery("<input id=\"" + id + "\" type=\"checkbox\" />");
1773
+ },
1774
+ _createLabel: function(id, command, label, icon) {
1775
+ return jQuery("<label for=\"" + id + "\" class=\"" + command + "_button\" title=\"" + label + "\"><i class=\"" + icon + "\"></i></label>");
1776
+ }
1777
+ });
1778
+ })(jQuery);
1779
+
1780
+ (function(jQuery) {
1781
+ return jQuery.widget('IKS.hallodropdownbutton', {
1782
+ button: null,
1783
+ options: {
1784
+ uuid: '',
1785
+ label: null,
1786
+ icon: null,
1787
+ editable: null,
1788
+ target: '',
1789
+ cssClass: null
1790
+ },
1791
+ _create: function() {
1792
+ var _base, _ref;
1793
+ return (_ref = (_base = this.options).icon) != null ? _ref : _base.icon = "icon-" + (this.options.label.toLowerCase());
1794
+ },
1795
+ _init: function() {
1796
+ var target,
1797
+ _this = this;
1798
+ target = jQuery(this.options.target);
1799
+ target.css('position', 'absolute');
1800
+ target.addClass('dropdown-menu');
1801
+ target.hide();
1802
+ if (!this.button) {
1803
+ this.button = this._prepareButton();
1804
+ }
1805
+ this.button.bind('click', function() {
1806
+ if (target.hasClass('open')) {
1807
+ _this._hideTarget();
1808
+ return;
1809
+ }
1810
+ return _this._showTarget();
1811
+ });
1812
+ target.bind('click', function() {
1813
+ return _this._hideTarget();
1814
+ });
1815
+ this.options.editable.element.bind('hallodeactivated', function() {
1816
+ return _this._hideTarget();
1817
+ });
1818
+ return this.element.append(this.button);
1819
+ },
1820
+ _showTarget: function() {
1821
+ var target;
1822
+ target = jQuery(this.options.target);
1823
+ this._updateTargetPosition();
1824
+ target.addClass('open');
1825
+ return target.show();
1826
+ },
1827
+ _hideTarget: function() {
1828
+ var target;
1829
+ target = jQuery(this.options.target);
1830
+ target.removeClass('open');
1831
+ return target.hide();
1832
+ },
1833
+ _updateTargetPosition: function() {
1834
+ var bottom, left, target, _ref;
1835
+ target = jQuery(this.options.target);
1836
+ _ref = this.element.position(), bottom = _ref.bottom, left = _ref.left;
1837
+ target.css('top', bottom);
1838
+ return target.css('left', left - 20);
1839
+ },
1840
+ _prepareButton: function() {
1841
+ var button, buttonEl, id;
1842
+ id = "" + this.options.uuid + "-" + this.options.label;
1843
+ buttonEl = jQuery("<button id=\"" + id + "\" data-toggle=\"dropdown\" data-target=\"#" + (this.options.target.attr('id')) + "\" title=\"" + this.options.label + "\">\n <span class=\"ui-button-text\"><i class=\"" + this.options.icon + "\"></i></span>\n</button>");
1844
+ if (this.options.cssClass) {
1845
+ buttonEl.addClass(this.options.cssClass);
1846
+ }
1847
+ button = buttonEl.button();
1848
+ return button;
1849
+ }
1850
+ });
1851
+ })(jQuery);
1852
+
1853
+ }).call(this);