1 define(function(require) {
 
   5 var $ = require('libs/jquery'),
 
   6     documentElement = require('./documentElement'),
 
   7     utils = require('./utils'),
 
   8     wlxmlUtils = require('utils/wlxml');
 
  10 var labelWidget = function(tag, klass) {
 
  12         .addClass('canvas-widget canvas-widget-label')
 
  13         .text(wlxmlUtils.getTagLabel(tag) + (klass ? ' / ' + wlxmlUtils.getClassLabel(klass) : ''));
 
  15 void(labelWidget); // for linters; labelWidget is unused on purpose for now
 
  17 var DocumentNodeElement = documentElement.DocumentNodeElement;
 
  19 var generic = Object.create(DocumentNodeElement.prototype);
 
  23         DocumentNodeElement.prototype.init.call(this);
 
  25             .attr('wlxml-tag', this.wlxmlNode.getTagName());
 
  26         this.setWlxmlClass(this.wlxmlNode.getClass());
 
  27         this.wlxmlNode.contents().forEach(function(node) {
 
  28             this._container().append(this.canvas.createElement(node).dom);
 
  34         if(this.wlxmlNode.getTagName() === 'span') {
 
  35             if(this.containsBlock()) {
 
  36                 this.displayAsBlock();
 
  41             this.displayAsBlock();
 
  45     getFirst: function(e1, e2) {
 
  46         var idx1 = this.childIndex(e1),
 
  47             idx2 = this.childIndex(e2);
 
  48         if(e1 === null || e2 === null) {
 
  51         return idx1 <= idx2 ? e1: e2;
 
  54     children: function() {
 
  57         this._container().contents().each(function() {
 
  58             var childElement = element.canvas.getDocumentElement(this);
 
  59             if(childElement === undefined) {
 
  63             toret.push(childElement);
 
  68     getVerticallyFirstTextElement: function() {
 
  70         this.children().some(function(child) {
 
  71             if(child instanceof documentElement.DocumentTextElement) {
 
  75                 toret = child.getVerticallyFirstTextElement();
 
  84     onNodeAttrChange: function(event) {
 
  85         if(event.meta.attr === 'class') {
 
  86             this.setWlxmlClass(event.meta.newVal); //
 
  89     onNodeAdded: function(event) {
 
  90         if(event.meta.node.isRoot()) {
 
  91             this.canvas.reloadRoot();
 
  95         var nodeIndex = event.meta.node.getIndex(),
 
  96             referenceElement, referenceAction, actionArg;
 
  99             referenceElement = this;
 
 100             referenceAction = 'prepend';
 
 102             referenceElement = this.children()[nodeIndex-1];
 
 103             referenceAction = 'after';
 
 106         if(event.meta.move) {
 
 107             /* Let's check if this node had its own canvas element and it's accessible. */
 
 108             actionArg = utils.getElementForElementRootNode(event.meta.node);
 
 109             if(actionArg && actionArg.sameNode(referenceElement)) {
 
 110                 referenceElement = this.children()[nodeIndex];
 
 114             actionArg = event.meta.node;
 
 117         referenceElement[referenceAction](actionArg);
 
 119     onNodeDetached: function(event) {
 
 120         if(event.meta.node.sameNode(this)) {
 
 123             this.children().some(function(child) {
 
 124                 if(child.wlxmlNode.sameNode(event.meta.node)) {
 
 131     onNodeTextChange: function(event) {
 
 132         var toSet = event.meta.node.getText();
 
 133         this.children().some(function(child) {
 
 134             if(child.wlxmlNode.sameNode(event.meta.node)) {
 
 136                     toSet = utils.unicode.ZWS;
 
 138                 if(toSet !== child.getText()) {
 
 139                     child.setText(toSet);
 
 149     containsBlock: function() {
 
 150         return this.children()
 
 151             .filter(function(child) {
 
 152                 return child instanceof documentElement.DocumentNodeElement;
 
 154             .some(function(child) {
 
 155                 if(child.isBlock()) {
 
 158                     return child.containsBlock();
 
 163     prepend: function(param) {
 
 165         if(param instanceof documentElement.DocumentElement) {
 
 168             element = this.canvas.createElement(param);
 
 170         this._container().prepend(element.dom);
 
 175     childIndex: function(child) {
 
 176         var children = this.children(),
 
 178         children.forEach(function(c, idx) {
 
 179             if(c.sameNode(child)) {
 
 187     getWlxmlClass: function() {
 
 188         var klass = this._container().attr('wlxml-class');
 
 190             return klass.replace(/-/g, '.');
 
 194     setWlxmlClass: function(klass) {
 
 195         if(klass === this.getWlxmlClass()) {
 
 199             this._container().attr('wlxml-class', klass.replace(/\./g, '-'));
 
 202             this._container().removeAttr('wlxml-class');