2 'libs/jquery-1.9.1.min',
\r 
   4 ], function($, canvasNode) {
\r 
   8 var getCursorPosition = function() {
\r 
   9     var selection = window.getSelection();
\r 
  10     var anchorNode = $(selection.anchorNode);
\r 
  11     var parent = anchorNode.parent();
\r 
  13         textNode: anchorNode,
\r 
  14         textNodeOffset: selection.anchorOffset,
\r 
  15         textNodeIndex: parent.contents().index(anchorNode),
\r 
  17         focusNode: $(selection.focusNode).parent(),
\r 
  18         isAtEnd: selection.anchorOffset === anchorNode.text().length
\r 
  22 var Manager = function(canvas, sandbox) {
\r 
  23     this.canvas = canvas;
\r 
  24     this.sandbox = sandbox;
\r 
  25     this.shownAlready = false;
\r 
  26     this.gridToggled = false;
\r 
  27     this.scrollbarPosition = 0;
\r 
  28     this.currentNode = null;
\r 
  31     canvas.dom.find('#rng-module-documentCanvas-content').on('keyup', function() {
\r 
  32         manager.sandbox.publish('contentChanged');
\r 
  35     canvas.dom.on('mouseover', '[wlxml-tag]', function(e) {
\r 
  36         e.stopPropagation();
\r 
  37         manager.sandbox.publish('nodeHovered', canvasNode.create($(e.target)));
\r 
  39     canvas.dom.on('mouseout', '[wlxml-tag]', function(e) {
\r 
  40         e.stopPropagation();
\r 
  41         manager.sandbox.publish('nodeBlured', canvasNode.create($(e.target)));
\r 
  43     canvas.dom.on('click', '[wlxml-tag]', function(e) {
\r 
  44         e.stopPropagation();
\r 
  45         console.log('clicked node type: '+e.target.nodeType);
\r 
  46         manager.selectNode(canvasNode.create($(e.target)));
\r 
  49     canvas.dom.on('keyup', '#rng-module-documentCanvas-contentWrapper', function(e) {
\r 
  50         var anchor = $(window.getSelection().anchorNode);
\r 
  52         if(anchor[0].nodeType === Node.TEXT_NODE)
\r 
  53             anchor = anchor.parent();
\r 
  54         if(!anchor.is('[wlxml-tag]'))
\r 
  56         manager.selectNode(canvasNode.create(anchor));
\r 
  59     canvas.dom.on('keydown', '#rng-module-documentCanvas-contentWrapper', function(e) {
\r 
  60         if(e.which === 13) { 
\r 
  61             manager.onEnterKey(e);
\r 
  64             manager.onBackspaceKey(e);
\r 
  68     canvas.dom.onShow = function() {
\r 
  69         if(!manager.shownAlready) {
\r 
  70             manager.shownAlready = true;
\r 
  71             manager.selectFirstNode();
\r 
  72         } else if(manager.currentNode) {
\r 
  73             manager.movecaretToNode(manager.getNodeElement(manager.currentNode));
\r 
  74             canvas.dom.find('#rng-module-documentCanvas-contentWrapper').scrollTop(manager.scrollbarPosition);
\r 
  77     canvas.dom.onHide = function() {
\r 
  78        manager.scrollbarPosition = canvas.dom.find('#rng-module-documentCanvas-contentWrapper').scrollTop();
\r 
  82 Manager.prototype.selectNode = function(cnode, options) {
\r 
  83     options = options || {};
\r 
  84     var nodeElement = this.getNodeElement(cnode)
\r 
  86     this.dimNode(cnode);
\r 
  88     this.canvas.dom.find('.rng-module-documentCanvas-currentNode').removeClass('rng-module-documentCanvas-currentNode');
\r 
  89     nodeElement.addClass('rng-module-documentCanvas-currentNode');
\r 
  91     if(options.movecaret) {
\r 
  92         this.movecaretToNode(nodeElement, options.movecaret);
\r 
  95     this.currentNode = cnode;
\r 
  96     this.sandbox.publish('nodeSelected', cnode);
\r 
  99 Manager.prototype.insertNewNode = function(wlxmlTag, wlxmlClass) {
\r 
 100     var selection = window.getSelection();
\r 
 102     if(selection.getRangeAt(0).collapsed) {
\r 
 105         var offsetStart = selection.anchorOffset;
\r 
 106         var offsetEnd = selection.focusOffset;
\r 
 107         if(offsetStart > offsetEnd) {
\r 
 108             var tmp = offsetStart;
\r 
 109             offsetStart = offsetEnd;
\r 
 112         var wrapper = canvasNode.create({tag: wlxmlTag, klass: wlxmlClass});
\r 
 113         this.canvas.nodeWrap({inside: canvasNode.create($(selection.anchorNode).parent()),
\r 
 115                               offsetStart: offsetStart,
\r 
 116                               offsetEnd: offsetEnd
\r 
 118         this.selectNode(wrapper, {movecaret: 'end'});
\r 
 124 Manager.prototype.getNodeElement = function(cnode) {
\r 
 125     return this.canvas.dom.find('#'+cnode.getId());
\r 
 128 Manager.prototype.highlightNode = function(cnode) {
\r 
 129     var nodeElement = this.getNodeElement(cnode);
\r 
 130     if(!this.gridToggled) {
\r 
 131         nodeElement.addClass('rng-common-hoveredNode');
\r 
 132         var label = nodeElement.attr('wlxml-tag');
\r 
 133         if(nodeElement.attr('wlxml-class'))
\r 
 134             label += ' / ' + nodeElement.attr('wlxml-class');
\r 
 135         var tag = $('<div>').addClass('rng-module-documentCanvas-hoveredNodeTag').text(label);
\r 
 136         nodeElement.append(tag);
\r 
 140 Manager.prototype.dimNode = function(cnode) {
\r 
 141     var nodeElement = this.getNodeElement(cnode);
\r 
 142     if(!this.gridToggled) {
\r 
 143         nodeElement.removeClass('rng-common-hoveredNode');
\r 
 144         nodeElement.find('.rng-module-documentCanvas-hoveredNodeTag').remove();
\r 
 148 Manager.prototype.selectFirstNode = function() {
\r 
 149     var firstNodeWithText = this.canvas.dom.find('[wlxml-tag]').filter(function() {
\r 
 150         return $(this).clone().children().remove().end().text().trim() !== '';
\r 
 153     if(firstNodeWithText.length)
\r 
 154         node = $(firstNodeWithText[0])
\r 
 156         node = this.canvas.dom.find('[wlxml-class|="p"]')
\r 
 158     this.selectNode(canvasNode.create(node), {movecaret: true});
\r 
 161 Manager.prototype.movecaretToNode = function(nodeElement, where) {
\r 
 162     var range = document.createRange();
\r 
 163     range.selectNodeContents(nodeElement[0]);
\r 
 165     var collapseArg = true;
\r 
 166     if(where === 'end')
\r 
 167         collapseArg = false;
\r 
 168     range.collapse(collapseArg);
\r 
 169     var selection = document.getSelection();
\r 
 170     selection.removeAllRanges()
\r 
 171     selection.addRange(range);
\r 
 174 Manager.prototype.toggleGrid =  function(toggle) {
\r 
 175     this.canvas.dom.find('[wlxml-tag]').toggleClass('rng-common-hoveredNode', toggle);
\r 
 176     this.gridToggled = toggle;
\r 
 179 Manager.prototype.onEnterKey = function(e) {
\r 
 180     e.preventDefault();
\r 
 181     var pos = getCursorPosition();
\r 
 182     var contextNode = this.canvas.getNodeById(pos.parentNode.attr('id'));
\r 
 186         newNode = canvasNode.create({tag: pos.parentNode.attr('wlxml-tag'), klass: pos.parentNode.attr('wlxml-class')});
\r 
 187         this.canvas.nodeInsertAfter({node: newNode, after: canvas.getNodeById(pos.parentNode.attr('id'))});
\r 
 189         newNode = this.canvas.nodeSplit({node: contextNode, textNodeIdx: pos.textNodeIndex, offset: pos.textNodeOffset});
\r 
 192         this.selectNode(newNode, {movecaret: true});
\r 
 193     this.sandbox.publish('contentChanged');
\r 
 196 Manager.prototype.onBackspaceKey = function(e) {
\r 
 197     var pos = getCursorPosition();
\r 
 198     var len = pos.textNode.text().length;
\r 
 200         // Prevent deleting node by browser after last character removed;
\r 
 201         e.preventDefault();
\r 
 202         pos.parentNode.text('');
\r 
 205         e.preventDefault();
\r 
 206         var toRemove = canvasNode.create(pos.textNode);
\r 
 207         var prevNode = this.canvas.getPrecedingNode({node:toRemove});
\r 
 208         this.canvas.nodeRemove({node: toRemove}); // jesli nie ma tekstu, to anchor nie jest tex nodem
\r 
 209         this.selectNode(prevNode, {movecaret: 'end'});
\r 
 213 Manager.prototype.command = function(command, meta) {
\r 
 214     var pos = getCursorPosition();
\r 
 216     if(command === 'createList') {
\r 
 217         var node = canvasNode.create(pos.parentNode);
\r 
 218         if(window.getSelection().getRangeAt().collapsed && this.canvas.nodeInsideList({node: node})) {
\r 
 219             this.canvas.listRemove({pointer: node});
\r 
 220             this.selectNode(node, {movecaret: 'end'});
\r 
 221             this.sandbox.publish('contentChanged');
\r 
 224             if(!this.canvas.nodeInsideList({node: node})) {
\r 
 225                 this.canvas.listCreate({start: node, end: canvasNode.create(pos.focusNode)});
\r 
 226                 this.selectNode(node, {movecaret: 'end'});
\r 
 227                 this.sandbox.publish('contentChanged');
\r