client/js/paper-renderer.js
changeset 66 9b459e41e2df
parent 64 3a5a9421687b
child 67 d341117f9370
equal deleted inserted replaced
65:3389e6c46936 66:9b459e41e2df
    19     _EDITOR_PADDING : 10,
    19     _EDITOR_PADDING : 10,
    20     _EDITOR_GRADIENT : new paper.Gradient(['#f0f0f0', '#d0d0d0']),
    20     _EDITOR_GRADIENT : new paper.Gradient(['#f0f0f0', '#d0d0d0']),
    21     _CLICKMODE_ADDNODE : 1,
    21     _CLICKMODE_ADDNODE : 1,
    22     _CLICKMODE_STARTEDGE : 2,
    22     _CLICKMODE_STARTEDGE : 2,
    23     _CLICKMODE_ENDEDGE : 3,
    23     _CLICKMODE_ENDEDGE : 3,
       
    24     _IMAGE_MAX_KB : 500,
    24     _USER_PLACEHOLDER : {
    25     _USER_PLACEHOLDER : {
    25         color: "#000000",
    26         color: "#000000",
    26         title: "(unknown user)",
    27         title: "(unknown user)",
    27         get: function(attr) {
    28         get: function(attr) {
    28             return this[attr] || false;
    29             return this[attr] || false;
   643         })
   644         })
   644         .hide();
   645         .hide();
   645 }
   646 }
   646 
   647 
   647 Rkns.Renderer.NodeEditor.prototype.template = Rkns._.template(
   648 Rkns.Renderer.NodeEditor.prototype.template = Rkns._.template(
   648     '<h2><span class="Rk-CloseX">&times;</span><%=l10n.edit_node%></span></h2>'
   649     '<h2><span class="Rk-CloseX">&times;</span><%-translate("Edit Node")%></span></h2>'
   649     + '<p><label><%=l10n.edit_title%></label><input class="Rk-Edit-Title" type="text" value="<%=node.title%>"/></p>'
   650     + '<p><label><%-translate("Title:")%></label><input class="Rk-Edit-Title" type="text" value="<%=node.title%>"/></p>'
   650     + '<p><label><%=l10n.edit_uri%></label><input class="Rk-Edit-URI" type="text" value="<%=node.uri%>"/><a class="Rk-Edit-Goto" href="<%=node.uri%>" target="_blank"></a></p>'
   651     + '<p><label><%-translate("URI:")%></label><input class="Rk-Edit-URI" type="text" value="<%=node.uri%>"/><a class="Rk-Edit-Goto" href="<%=node.uri%>" target="_blank"></a></p>'
   651     + '<p><label><%=l10n.edit_description%></label><textarea class="Rk-Edit-Description"><%=node.description%></textarea></p>'
   652     + '<p><label><%-translate("Description:")%></label><textarea class="Rk-Edit-Description"><%=node.description%></textarea></p>'
   652     + '<div class="Rk-Editor-p"><label>Node color</label><div class="Rk-Edit-ColorPicker-Wrapper"><span class="Rk-Edit-Color" style="background:<%=node.color%>;"><span class="Rk-Edit-ColorTip"></span></span><ul class="Rk-Edit-ColorPicker">'
   653     + '<div class="Rk-Editor-p"><span class="Rk-Editor-Label"><%-translate("Node color:")%></span><div class="Rk-Edit-ColorPicker-Wrapper"><span class="Rk-Edit-Color" style="background:<%=node.color%>;"><span class="Rk-Edit-ColorTip"></span></span><ul class="Rk-Edit-ColorPicker">'
   653     + '<% print(Rkns.pickerColors.reduce(function(m,c) { return m + "<li data-color=\'" + c + "\' style=\'background: " + c + "\'></li>"},"")); %></ul><span class="Rk-Edit-ColorPicker-Text">Choose color</span></div></div>'
   654     + '<% print(Rkns.pickerColors.reduce(function(m,c) { return m + "<li data-color=\'" + c + "\' style=\'background: " + c + "\'></li>"},"")); %></ul><span class="Rk-Edit-ColorPicker-Text">Choose color</span></div></div>'
   654     + '<p><label><%=l10n.edit_image%></label><input class="Rk-Edit-Image" type="text" value="<%=node.image%>"/><img class="Rk-Edit-ImgPreview" src="<%=node.image%>" /></p>'
   655     + '<img class="Rk-Edit-ImgPreview" src="<%=node.image || node.image_placeholder%>" />'
   655     + '<p><label><%=l10n.created_by%></label> <span class="Rk-UserColor" style="background:<%=node.created_by_color%>;"></span><%=node.created_by_title%></p>'
   656     + '<p><label><%-translate("Image URL:")%></label><input class="Rk-Edit-Image" type="text" value="<%=node.image%>"/></p>'
       
   657     + '<p><label><%-translate("Choose Image File:")%></label><input class="Rk-Edit-Image-File" type="file"/></p>'    
       
   658     + '<p><span class="Rk-Editor-Label"><%-translate("Created by:")%></span> <span class="Rk-UserColor" style="background:<%=node.created_by_color%>;"></span><%=node.created_by_title%></p>'
   656 );
   659 );
   657 
   660 
   658 Rkns.Renderer.NodeEditor.prototype.readOnlyTemplate = Rkns._.template(
   661 Rkns.Renderer.NodeEditor.prototype.readOnlyTemplate = Rkns._.template(
   659     '<h2><span class="Rk-CloseX">&times;</span><span class="Rk-UserColor" style="background:<%=node.color%>;"></span><%-node.title%></span></h2>'
   662     '<h2><span class="Rk-CloseX">&times;</span><span class="Rk-UserColor" style="background:<%=node.color%>;"></span><%-node.title%></span></h2>'
   660     + '<p><a href="<%-node.uri%>" target="_blank"><%-node.uri%></a></p>'
   663     + '<p><a href="<%-node.uri%>" target="_blank"><%-node.uri%></a></p>'
   661     + '<p><%-node.description%></p>'
   664     + '<p><%-node.description%></p>'
   662     + '<p><label><%=l10n.created_by%> </label><span class="Rk-UserColor" style="background:<%=node.created_by_color%>;"></span><%=node.created_by_title%></p>'
   665     + '<p><span class="Rk-Editor-Label"><%-translate("Created by:")%> </span><span class="Rk-UserColor" style="background:<%=node.created_by_color%>;"></span><%=node.created_by_title%></p>'
   663 );
   666 );
   664 
   667 
   665 Rkns.Renderer.NodeEditor.prototype.draw = function() {
   668 Rkns.Renderer.NodeEditor.prototype.draw = function() {
   666     var _model = this.node_representation.model,
   669     var _model = this.node_representation.model,
   667         _created_by = _model.get("created_by") || Rkns.Renderer._USER_PLACEHOLDER,
   670         _created_by = _model.get("created_by") || Rkns.Renderer._USER_PLACEHOLDER,
   671             node: {
   674             node: {
   672                 title: _model.get("title"),
   675                 title: _model.get("title"),
   673                 uri: _model.get("uri"),
   676                 uri: _model.get("uri"),
   674                 description: _model.get("description"),
   677                 description: _model.get("description"),
   675                 image: _model.get("image") || "",
   678                 image: _model.get("image") || "",
       
   679                 image_placeholder: this.renderer.renkan.static_url + "img/image-placeholder.png",
   676                 color: _model.get("color") || _created_by.get("color"),
   680                 color: _model.get("color") || _created_by.get("color"),
   677                 created_by_color: _created_by.get("color"),
   681                 created_by_color: _created_by.get("color"),
   678                 created_by_title: _created_by.get("title")
   682                 created_by_title: _created_by.get("title")
   679             },
   683             },
   680             l10n: this.renderer.renkan.l10n
   684             translate: this.renderer.renkan.translate
   681         }));
   685         }));
   682     this.redraw();
   686     this.redraw();
   683     var _this = this;
   687     var _this = this;
   684     this.editor_$.find(".Rk-CloseX").click(function() {
   688     this.editor_$.find(".Rk-CloseX").click(function() {
   685         _this.renderer.removeRepresentation(_this);
   689         _this.renderer.removeRepresentation(_this);
   686         paper.view.draw();
   690         paper.view.draw();
   687     });
   691     });
   688     if (!this.renderer.renkan.read_only) {
   692     if (!this.renderer.renkan.read_only) {
   689         this.editor_$.find("input, textarea").bind("keyup change", function() {
   693     	
   690             var _uri = _this.editor_$.find(".Rk-Edit-URI").val(),
   694     	var onFieldChange = Rkns._(function() {
   691                 _image = _this.editor_$.find(".Rk-Edit-Image").val();
   695     		Rkns._(function() {
   692             _this.editor_$.find(".Rk-Edit-ImgPreview").attr("src", _image);
   696 	            var _uri = _this.editor_$.find(".Rk-Edit-URI").val(),
   693             _this.editor_$.find(".Rk-Edit-Goto").attr("href",_uri);
   697 	                _image = _this.editor_$.find(".Rk-Edit-Image").val();
   694             var _data = {
   698 	            _this.editor_$.find(".Rk-Edit-ImgPreview").attr("src", _image);
   695                 title: _this.editor_$.find(".Rk-Edit-Title").val(),
   699 	            _this.editor_$.find(".Rk-Edit-Goto").attr("href",_uri);
   696                 description: _this.editor_$.find(".Rk-Edit-Description").val(),
   700 	            var _data = {
   697                 uri: _uri,
   701 	                title: _this.editor_$.find(".Rk-Edit-Title").val(),
   698                 image: _image
   702 	                description: _this.editor_$.find(".Rk-Edit-Description").val(),
   699             }
   703 	                uri: _uri,
   700             _model.set(_data);
   704 	                image: _image
   701             _this.redraw();
   705 	            }
       
   706 	            _model.set(_data);
       
   707 	            _this.redraw();
       
   708     		}).defer();
       
   709     	}).throttle(500);
       
   710     	
       
   711     	this.editor_$.find("input, textarea").bind("change keyup paste", onFieldChange);
       
   712     	
       
   713         this.editor_$.find(".Rk-Edit-Image-File").bind("change", function() {
       
   714         	if (this.files.length) {
       
   715         		var f = this.files[0],
       
   716         			fr = new FileReader();
       
   717     			if (f.type.substr(0,5) !== "image") {
       
   718     				alert(_this.renderer.renkan.translate("This file is not an image"));
       
   719     				return;
       
   720     			}
       
   721     			if (f.size > (Rkns.Renderer._IMAGE_MAX_KB * 1024)) {
       
   722     				alert(_this.renderer.renkan.translate("Image size must be under ")+Rkns.Renderer._IMAGE_MAX_KB+_this.renderer.renkan.translate("KB"));
       
   723     				return;
       
   724     			}
       
   725         		fr.onload = function(e) {
       
   726         			_this.editor_$.find(".Rk-Edit-Image").val(e.target.result);
       
   727         			onFieldChange();
       
   728         		}
       
   729         		fr.readAsDataURL(f);
       
   730         	}
   702         });
   731         });
   703         this.editor_$.find(".Rk-Edit-Title")[0].focus();
   732         this.editor_$.find(".Rk-Edit-Title")[0].focus();
   704         this.editor_$.find(".Rk-Edit-ColorPicker-Wrapper").hover(
   733         this.editor_$.find(".Rk-Edit-ColorPicker-Wrapper").hover(
   705             function() { _this.editor_$.find(".Rk-Edit-ColorPicker").show(); },
   734             function() { _this.editor_$.find(".Rk-Edit-ColorPicker").show(); },
   706             function() { _this.editor_$.find(".Rk-Edit-ColorPicker").hide(); }
   735             function() { _this.editor_$.find(".Rk-Edit-ColorPicker").hide(); }
   752         })
   781         })
   753         .hide();
   782         .hide();
   754 }
   783 }
   755 
   784 
   756 Rkns.Renderer.EdgeEditor.prototype.template = Rkns._.template(
   785 Rkns.Renderer.EdgeEditor.prototype.template = Rkns._.template(
   757     '<h2><span class="Rk-CloseX">&times;</span><%=l10n.edit_edge%></span></h2>'
   786     '<h2><span class="Rk-CloseX">&times;</span><%-translate("Edit Edge")%></span></h2>'
   758     + '<p><label><%=l10n.edit_title%></label><input class="Rk-Edit-Title" type="text" value="<%=edge.title%>"/></p>'
   787     + '<p><label><%-translate("Title:")%></label><input class="Rk-Edit-Title" type="text" value="<%=edge.title%>"/></p>'
   759     + '<p><label><%=l10n.edit_uri%></label><input class="Rk-Edit-URI" type="text" value="<%=edge.uri%>"/><a class="Rk-Edit-Goto" href="<%=edge.uri%>" target="_blank"></a></p>'
   788     + '<p><label><%-translate("URI:")%></label><input class="Rk-Edit-URI" type="text" value="<%=edge.uri%>"/><a class="Rk-Edit-Goto" href="<%=edge.uri%>" target="_blank"></a></p>'
   760     + '<div class="Rk-Editor-p"><label>Edge color:</label><div class="Rk-Edit-ColorPicker-Wrapper"><span class="Rk-Edit-Color" style="background:<%=edge.color%>;"><span class="Rk-Edit-ColorTip"></span></span><ul class="Rk-Edit-ColorPicker">'
   789     + '<div class="Rk-Editor-p"><span class="Rk-Editor-Label"><%-translate("Edge color:")%></span><div class="Rk-Edit-ColorPicker-Wrapper"><span class="Rk-Edit-Color" style="background:<%=edge.color%>;"><span class="Rk-Edit-ColorTip"></span></span><ul class="Rk-Edit-ColorPicker">'
   761     + '<% print(Rkns.pickerColors.reduce(function(m,c) { return m + "<li data-color=\'" + c + "\' style=\'background: " + c + "\'></li>"},"")); %></ul><span class="Rk-Edit-ColorPicker-Text">Choose color</span></div></div>'
   790     + '<% print(Rkns.pickerColors.reduce(function(m,c) { return m + "<li data-color=\'" + c + "\' style=\'background: " + c + "\'></li>"},"")); %></ul><span class="Rk-Edit-ColorPicker-Text">Choose color</span></div></div>'
   762     + '<p><label><%=l10n.edit_from%></label><span class="Rk-UserColor" style="background:<%=edge.from_color%>;"></span><%=edge.from_title%></p>'
   791     + '<p><span class="Rk-Editor-Label"><%-translate("From:")%></span><span class="Rk-UserColor" style="background:<%=edge.from_color%>;"></span><%=edge.from_title%></p>'
   763     + '<p><label><%=l10n.edit_to%></label><span class="Rk-UserColor" style="background:<%=edge.to_color%>;"></span><%=edge.to_title%></p>'
   792     + '<p><span class="Rk-Editor-Label"><%-translate("To:")%></span><span class="Rk-UserColor" style="background:<%=edge.to_color%>;"></span><%=edge.to_title%></p>'
   764     + '<p><label><%=l10n.created_by%> </label><span class="Rk-UserColor" style="background:<%=edge.created_by_color%>;"></span><%=edge.created_by_title%></p>'
   793     + '<p><span class="Rk-Editor-Label"><%-translate("Created by:")%></span><span class="Rk-UserColor" style="background:<%=edge.created_by_color%>;"></span><%=edge.created_by_title%></p>'
   765 );
   794 );
   766 
   795 
   767 Rkns.Renderer.EdgeEditor.prototype.readOnlyTemplate = Rkns._.template(
   796 Rkns.Renderer.EdgeEditor.prototype.readOnlyTemplate = Rkns._.template(
   768     '<h2><span class="Rk-CloseX">&times;</span><span class="Rk-UserColor" style="background:<%=edge.color%>;"></span><%- edge.title %></span></h2>'
   797     '<h2><span class="Rk-CloseX">&times;</span><span class="Rk-UserColor" style="background:<%=edge.color%>;"></span><%- edge.title %></span></h2>'
   769     + '<p><a href="<%-edge.uri%>" target="_blank"><%-edge.uri%></a></p>'
   798     + '<p><a href="<%-edge.uri%>" target="_blank"><%-edge.uri%></a></p>'
   770     + '<p><%-edge.description%></p>'
   799     + '<p><%-edge.description%></p>'
   771     + '<p><label><%=l10n.edit_from%></label><span class="Rk-UserColor" style="background:<%=edge.from_color%>;"></span><%=edge.from_title%></p>'
   800     + '<p><span class="Rk-Editor-Label"><%-translate("From:")%></span><span class="Rk-UserColor" style="background:<%=edge.from_color%>;"></span><%=edge.from_title%></p>'
   772     + '<p><label><%=l10n.edit_to%></label><span class="Rk-UserColor" style="background:<%=edge.to_color%>;"></span><%=edge.to_title%></p>'
   801     + '<p><span class="Rk-Editor-Label"><%-translate("To:")%></span><span class="Rk-UserColor" style="background:<%=edge.to_color%>;"></span><%=edge.to_title%></p>'
   773     + '<p><label><%=l10n.created_by%> </label><span class="Rk-UserColor" style="background:<%=edge.created_by_color%>;"></span><%=edge.created_by_title%></p>'
   802     + '<p><span class="Rk-Editor-Label"><%-translate("Created by:")%></span><span class="Rk-UserColor" style="background:<%=edge.created_by_color%>;"></span><%=edge.created_by_title%></p>'
   774 );
   803 );
   775 
   804 
   776 Rkns.Renderer.EdgeEditor.prototype.draw = function() {
   805 Rkns.Renderer.EdgeEditor.prototype.draw = function() {
   777     var _model = this.edge_representation.model,
   806     var _model = this.edge_representation.model,
   778         _from_model = _model.get("from"),
   807         _from_model = _model.get("from"),
   791                 from_color: _from_model.get("color") || (_from_model.get("created_by") || Rkns.Renderer._USER_PLACEHOLDER).get("color"),
   820                 from_color: _from_model.get("color") || (_from_model.get("created_by") || Rkns.Renderer._USER_PLACEHOLDER).get("color"),
   792                 to_color: _to_model.get("color") || (_to_model.get("created_by") || Rkns.Renderer._USER_PLACEHOLDER).get("color"),
   821                 to_color: _to_model.get("color") || (_to_model.get("created_by") || Rkns.Renderer._USER_PLACEHOLDER).get("color"),
   793                 created_by_color: _created_by.get("color"),
   822                 created_by_color: _created_by.get("color"),
   794                 created_by_title: _created_by.get("title")
   823                 created_by_title: _created_by.get("title")
   795             },
   824             },
   796             l10n: this.renderer.renkan.l10n
   825             translate: this.renderer.renkan.translate
   797         }));
   826         }));
   798     this.redraw();
   827     this.redraw();
   799     var _this = this;
   828     var _this = this;
   800     this.editor_$.find(".Rk-CloseX").click(function() {
   829     this.editor_$.find(".Rk-CloseX").click(function() {
   801         _this.renderer.removeRepresentation(_this);
   830         _this.renderer.removeRepresentation(_this);
   802         paper.view.draw();
   831         paper.view.draw();
   803     });
   832     });
   804     if (!this.renderer.renkan.read_only) {
   833     if (!this.renderer.renkan.read_only) {
   805         this.editor_$.find("input, textarea").bind("keyup change", function() {
   834     	
   806             _this.editor_$.find(".Rk-Edit-Goto").attr("href",_this.editor_$.find(".Rk-Edit-URI").val());
   835     	var onFieldChange = Rkns._(function() {
   807             var _data = {
   836     		Rkns._(function() {
   808                 title: _this.editor_$.find(".Rk-Edit-Title").val(),
   837     			_this.editor_$.find(".Rk-Edit-Goto").attr("href",_this.editor_$.find(".Rk-Edit-URI").val());
   809                 uri: _this.editor_$.find(".Rk-Edit-URI").val()
   838 	            var _data = {
   810             }
   839 	                title: _this.editor_$.find(".Rk-Edit-Title").val(),
   811             _model.set(_data);
   840 	                uri: _this.editor_$.find(".Rk-Edit-URI").val()
   812             _this.redraw();
   841 	            }
   813         });
   842 	            _model.set(_data);
       
   843 	            _this.redraw();
       
   844     		}).defer();
       
   845     	}).throttle(500);
       
   846     	
       
   847         this.editor_$.find("input, textarea").bind("keyup change paste", onFieldChange);
   814         this.editor_$.find(".Rk-Edit-ColorPicker-Wrapper").hover(
   848         this.editor_$.find(".Rk-Edit-ColorPicker-Wrapper").hover(
   815             function() { _this.editor_$.find(".Rk-Edit-ColorPicker").show(); },
   849             function() { _this.editor_$.find(".Rk-Edit-ColorPicker").show(); },
   816             function() { _this.editor_$.find(".Rk-Edit-ColorPicker").hide(); }
   850             function() { _this.editor_$.find(".Rk-Edit-ColorPicker").hide(); }
   817         );
   851         );
   818         this.editor_$.find(".Rk-Edit-ColorPicker li").hover(
   852         this.editor_$.find(".Rk-Edit-ColorPicker li").hover(
   842 Rkns.Renderer.NodeEditButton = Rkns.Utils.inherit(Rkns.Renderer._BaseRepresentation);
   876 Rkns.Renderer.NodeEditButton = Rkns.Utils.inherit(Rkns.Renderer._BaseRepresentation);
   843 
   877 
   844 Rkns.Renderer.NodeEditButton.prototype._init = function() {
   878 Rkns.Renderer.NodeEditButton.prototype._init = function() {
   845     this.renderer.overlay_layer.activate();
   879     this.renderer.overlay_layer.activate();
   846     this.type = "Node-edit-button";
   880     this.type = "Node-edit-button";
   847     this.sector = Rkns.Renderer.Utils.sector(this, Rkns.Renderer._NODE_BUTTON_INNER, Rkns.Renderer._NODE_BUTTON_OUTER, - 90, 30, 1, this.renderer.renkan.static_url+'img/edit.png', this.renderer.renkan.l10n.caption_edit);
   881     this.sector = Rkns.Renderer.Utils.sector(this, Rkns.Renderer._NODE_BUTTON_INNER, Rkns.Renderer._NODE_BUTTON_OUTER, - 90, 30, 1, this.renderer.renkan.static_url+'img/edit.png', this.renderer.renkan.translate("Edit"));
   848 }
   882 }
   849 
   883 
   850 Rkns.Renderer.NodeEditButton.prototype.moveTo = function(_pos) {
   884 Rkns.Renderer.NodeEditButton.prototype.moveTo = function(_pos) {
   851     this.sector.moveTo(_pos);
   885     this.sector.moveTo(_pos);
   852 }
   886 }
   885 Rkns.Renderer.NodeRemoveButton = Rkns.Utils.inherit(Rkns.Renderer._BaseRepresentation);
   919 Rkns.Renderer.NodeRemoveButton = Rkns.Utils.inherit(Rkns.Renderer._BaseRepresentation);
   886 
   920 
   887 Rkns.Renderer.NodeRemoveButton.prototype._init = function() {
   921 Rkns.Renderer.NodeRemoveButton.prototype._init = function() {
   888     this.renderer.overlay_layer.activate();
   922     this.renderer.overlay_layer.activate();
   889     this.type = "Node-remove-button";
   923     this.type = "Node-remove-button";
   890     this.sector = Rkns.Renderer.Utils.sector(this, Rkns.Renderer._NODE_BUTTON_INNER, Rkns.Renderer._NODE_BUTTON_OUTER, -210, -90, 1, this.renderer.renkan.static_url+'img/remove.png', this.renderer.renkan.l10n.caption_remove);
   924     this.sector = Rkns.Renderer.Utils.sector(this, Rkns.Renderer._NODE_BUTTON_INNER, Rkns.Renderer._NODE_BUTTON_OUTER, -210, -90, 1, this.renderer.renkan.static_url+'img/remove.png', this.renderer.renkan.translate("Remove"));
   891 }
   925 }
   892 
   926 
   893 Rkns.Renderer.NodeRemoveButton.prototype.moveTo = function(_pos) {
   927 Rkns.Renderer.NodeRemoveButton.prototype.moveTo = function(_pos) {
   894     this.sector.moveTo(_pos);
   928     this.sector.moveTo(_pos);
   895 }
   929 }
   913     }
   947     }
   914 }
   948 }
   915 
   949 
   916 Rkns.Renderer.NodeRemoveButton.prototype.mouseup = function() {
   950 Rkns.Renderer.NodeRemoveButton.prototype.mouseup = function() {
   917     this.renderer.removeRepresentationsOfType("editor");
   951     this.renderer.removeRepresentationsOfType("editor");
   918     if (confirm('Do you really wish to remove node "' + this.node_representation.model.get("title") + '"?')) {
   952     if (confirm(this.renderer.renkan.translate('Do you really wish to remove node ') + '"' + this.node_representation.model.get("title") + '"?')) {
   919         this.project.removeNode(this.node_representation.model);
   953         this.project.removeNode(this.node_representation.model);
   920     }
   954     }
   921 }
   955 }
   922 
   956 
   923 Rkns.Renderer.NodeRemoveButton.prototype.destroy = function() {
   957 Rkns.Renderer.NodeRemoveButton.prototype.destroy = function() {
   929 Rkns.Renderer.NodeLinkButton = Rkns.Utils.inherit(Rkns.Renderer._BaseRepresentation);
   963 Rkns.Renderer.NodeLinkButton = Rkns.Utils.inherit(Rkns.Renderer._BaseRepresentation);
   930 
   964 
   931 Rkns.Renderer.NodeLinkButton.prototype._init = function() {
   965 Rkns.Renderer.NodeLinkButton.prototype._init = function() {
   932     this.renderer.overlay_layer.activate();
   966     this.renderer.overlay_layer.activate();
   933     this.type = "Node-link-button";
   967     this.type = "Node-link-button";
   934     this.sector = Rkns.Renderer.Utils.sector(this, Rkns.Renderer._NODE_BUTTON_INNER, Rkns.Renderer._NODE_BUTTON_OUTER, 30, 150, 1, this.renderer.renkan.static_url+'img/link.png', this.renderer.renkan.l10n.caption_link);
   968     this.sector = Rkns.Renderer.Utils.sector(this, Rkns.Renderer._NODE_BUTTON_INNER, Rkns.Renderer._NODE_BUTTON_OUTER, 30, 150, 1, this.renderer.renkan.static_url+'img/link.png', this.renderer.renkan.translate("Link to another node"));
   935 }
   969 }
   936 
   970 
   937 Rkns.Renderer.NodeLinkButton.prototype.moveTo = function(_pos) {
   971 Rkns.Renderer.NodeLinkButton.prototype.moveTo = function(_pos) {
   938     this.sector.moveTo(_pos);
   972     this.sector.moveTo(_pos);
   939 }
   973 }
   966 Rkns.Renderer.EdgeEditButton = Rkns.Utils.inherit(Rkns.Renderer._BaseRepresentation);
  1000 Rkns.Renderer.EdgeEditButton = Rkns.Utils.inherit(Rkns.Renderer._BaseRepresentation);
   967 
  1001 
   968 Rkns.Renderer.EdgeEditButton.prototype._init = function() {
  1002 Rkns.Renderer.EdgeEditButton.prototype._init = function() {
   969     this.renderer.overlay_layer.activate();
  1003     this.renderer.overlay_layer.activate();
   970     this.type = "Edge-edit-button";
  1004     this.type = "Edge-edit-button";
   971     this.sector = Rkns.Renderer.Utils.sector(this, Rkns.Renderer._EDGE_BUTTON_INNER, Rkns.Renderer._EDGE_BUTTON_OUTER, - 90, 90, 1, this.renderer.renkan.static_url+'img/edit.png', this.renderer.renkan.l10n.caption_edit);
  1005     this.sector = Rkns.Renderer.Utils.sector(this, Rkns.Renderer._EDGE_BUTTON_INNER, Rkns.Renderer._EDGE_BUTTON_OUTER, - 90, 90, 1, this.renderer.renkan.static_url+'img/edit.png', this.renderer.renkan.translate("Edit"));
   972 }
  1006 }
   973 
  1007 
   974 Rkns.Renderer.EdgeEditButton.prototype.moveTo = function(_pos) {
  1008 Rkns.Renderer.EdgeEditButton.prototype.moveTo = function(_pos) {
   975     this.sector.moveTo(_pos);
  1009     this.sector.moveTo(_pos);
   976 }
  1010 }
  1009 Rkns.Renderer.EdgeRemoveButton = Rkns.Utils.inherit(Rkns.Renderer._BaseRepresentation);
  1043 Rkns.Renderer.EdgeRemoveButton = Rkns.Utils.inherit(Rkns.Renderer._BaseRepresentation);
  1010 
  1044 
  1011 Rkns.Renderer.EdgeRemoveButton.prototype._init = function() {
  1045 Rkns.Renderer.EdgeRemoveButton.prototype._init = function() {
  1012     this.renderer.overlay_layer.activate();
  1046     this.renderer.overlay_layer.activate();
  1013     this.type = "Edge-remove-button";
  1047     this.type = "Edge-remove-button";
  1014     this.sector = Rkns.Renderer.Utils.sector(this, Rkns.Renderer._EDGE_BUTTON_INNER, Rkns.Renderer._EDGE_BUTTON_OUTER, - 270, -90, 1, this.renderer.renkan.static_url+'img/remove.png', this.renderer.renkan.l10n.caption_remove);
  1048     this.sector = Rkns.Renderer.Utils.sector(this, Rkns.Renderer._EDGE_BUTTON_INNER, Rkns.Renderer._EDGE_BUTTON_OUTER, - 270, -90, 1, this.renderer.renkan.static_url+'img/remove.png', this.renderer.renkan.translate("Remove"));
  1015 }
  1049 }
  1016 Rkns.Renderer.EdgeRemoveButton.prototype.moveTo = function(_pos) {
  1050 Rkns.Renderer.EdgeRemoveButton.prototype.moveTo = function(_pos) {
  1017     this.sector.moveTo(_pos);
  1051     this.sector.moveTo(_pos);
  1018 }
  1052 }
  1019 
  1053 
  1036     }
  1070     }
  1037 }
  1071 }
  1038 
  1072 
  1039 Rkns.Renderer.EdgeRemoveButton.prototype.mouseup = function() {
  1073 Rkns.Renderer.EdgeRemoveButton.prototype.mouseup = function() {
  1040     this.renderer.removeRepresentationsOfType("editor");
  1074     this.renderer.removeRepresentationsOfType("editor");
  1041     if (confirm('Do you really wish to remove edge "' + this.edge_representation.model.get("title") + '"?')) {
  1075     if (confirm(this.renderer.renkan.translate('Do you really wish to remove edge ') + '"' + this.edge_representation.model.get("title") + '"?')) {
  1042         this.project.removeEdge(this.edge_representation.model);
  1076         this.project.removeEdge(this.edge_representation.model);
  1043     }
  1077     }
  1044 }
  1078 }
  1045 
  1079 
  1046 Rkns.Renderer.EdgeRemoveButton.prototype.destroy = function() {
  1080 Rkns.Renderer.EdgeRemoveButton.prototype.destroy = function() {
  1090         _this.onDoubleClick(_event);
  1124         _this.onDoubleClick(_event);
  1091     });
  1125     });
  1092     this.canvas_$.mouseenter(function(_event) {
  1126     this.canvas_$.mouseenter(function(_event) {
  1093         _this.onMouseEnter(_event);
  1127         _this.onMouseEnter(_event);
  1094     });
  1128     });
       
  1129     this.canvas_$.on("dragover", function(_event) {
       
  1130     	_event.stopPropagation();
       
  1131     	_event.preventDefault();
       
  1132     })
       
  1133     this.canvas_$.on("drop", function(_event) {
       
  1134     	_event.stopPropagation();
       
  1135     	_event.preventDefault();
       
  1136     	var res = {}
       
  1137     	Rkns._(_event.originalEvent.dataTransfer.types).each(function(t) {
       
  1138     		return res[t] = _event.originalEvent.dataTransfer.getData(t);
       
  1139     	});
       
  1140     	var newNode = {};
       
  1141     	if (res["text/plain"]) {
       
  1142     		newNode.description = res["text/plain"].replace(/[\s\n]+/gm,' ').trim();
       
  1143     	}
       
  1144     	if (res["text/html"]) {
       
  1145     		var snippet = Rkns.$('<div>').html(res["text/html"]);
       
  1146     		newNode.image = snippet.find("img").attr("src") || '';
       
  1147     		newNode.uri = snippet.find("a").attr("href");
       
  1148     	}
       
  1149     	if (res["text/uri-list"]) {
       
  1150     		newNode.uri = res["text/uri-list"];
       
  1151     	}
       
  1152     	if (res["text/x-moz-url"]) {
       
  1153     		newNode.title = (res["text/x-moz-url"].split("\n")[1] || "").trim();
       
  1154     		if (newNode.title === newNode.uri) {
       
  1155     			newNode.title = "";
       
  1156     		}
       
  1157     	}
       
  1158     	if (newNode.title || newNode.description || newNode.uri) {
       
  1159     		console.log(newNode);
       
  1160     		var _off = _this.canvas_$.offset(),
       
  1161             _point = new paper.Point([
       
  1162                 _event.originalEvent.pageX - _off.left,
       
  1163                 _event.originalEvent.pageY - _off.top
       
  1164             ]),
       
  1165             _coords = _this.toModelCoords(_point),
       
  1166             _data = {
       
  1167                 id: Rkns.Utils.getUID('node'),
       
  1168                 created_by: _this.renkan.current_user,
       
  1169                 uri: newNode.uri || "",
       
  1170                 title: newNode.title || _this.renkan.translate("Dragged resource"),
       
  1171                 description: newNode.description || "",
       
  1172                 image: newNode.image || "",
       
  1173                 position: {
       
  1174                     x: _coords.x,
       
  1175                     y: _coords.y
       
  1176                 }
       
  1177             };
       
  1178         	var _node = _this.renkan.project.addNode(_data);
       
  1179             _this.getRepresentationByModel(_node).openEditor();
       
  1180     	}
       
  1181     })
  1095     this.editor_$.find(".Rk-ZoomOut").click(function() {
  1182     this.editor_$.find(".Rk-ZoomOut").click(function() {
  1096         _this.offset = new paper.Point([
  1183         _this.offset = new paper.Point([
  1097             _this.canvas_$.width(),
  1184             _this.canvas_$.width(),
  1098             _this.canvas_$.height()
  1185             _this.canvas_$.height()
  1099         ]).multiply( .5 * ( 1 - Math.SQRT1_2 ) ).add(_this.offset.multiply( Math.SQRT1_2 ));
  1186         ]).multiply( .5 * ( 1 - Math.SQRT1_2 ) ).add(_this.offset.multiply( Math.SQRT1_2 ));
  1139         if (_this.click_mode === Rkns.Renderer._CLICKMODE_ADDNODE) {
  1226         if (_this.click_mode === Rkns.Renderer._CLICKMODE_ADDNODE) {
  1140             _this.click_mode = false;
  1227             _this.click_mode = false;
  1141             _this.notif_$.hide();
  1228             _this.notif_$.hide();
  1142         } else {
  1229         } else {
  1143             _this.click_mode = Rkns.Renderer._CLICKMODE_ADDNODE;
  1230             _this.click_mode = Rkns.Renderer._CLICKMODE_ADDNODE;
  1144             _this.notif_$.html(_renkan.l10n.notif_add_node).fadeIn();
  1231             _this.notif_$.html(_renkan.translate("Click on the background canvas to add a node")).fadeIn();
  1145         }
  1232         }
  1146     });
  1233     });
  1147     this.$.find(".Rk-AddEdge-Button").click(function() {
  1234     this.$.find(".Rk-AddEdge-Button").click(function() {
  1148         if (_this.click_mode === Rkns.Renderer._CLICKMODE_STARTEDGE || _this.click_mode === Rkns.Renderer._CLICKMODE_ENDEDGE) {
  1235         if (_this.click_mode === Rkns.Renderer._CLICKMODE_STARTEDGE || _this.click_mode === Rkns.Renderer._CLICKMODE_ENDEDGE) {
  1149             _this.click_mode = false;
  1236             _this.click_mode = false;
  1150             _this.notif_$.hide();
  1237             _this.notif_$.hide();
  1151         } else {
  1238         } else {
  1152             _this.click_mode = Rkns.Renderer._CLICKMODE_STARTEDGE;
  1239             _this.click_mode = Rkns.Renderer._CLICKMODE_STARTEDGE;
  1153             _this.notif_$.html(_renkan.l10n.notif_start_edge).fadeIn();
  1240             _this.notif_$.html(_renkan.translate("Click on a first node to start the edge")).fadeIn();
  1154         }
  1241         }
  1155     });
  1242     });
  1156     this.$.find(".Rk-TopBar-Button").mouseover(function() {
  1243     this.$.find(".Rk-TopBar-Button").mouseover(function() {
  1157         Rkns.$(this).find(".Rk-TopBar-Tooltip").show();
  1244         Rkns.$(this).find(".Rk-TopBar-Tooltip").show();
  1158     }).mouseout(function() {
  1245     }).mouseout(function() {
  1207     
  1294     
  1208     this.redraw();
  1295     this.redraw();
  1209 }
  1296 }
  1210 
  1297 
  1211 Rkns.Renderer.Scene.prototype.template = Rkns._.template(
  1298 Rkns.Renderer.Scene.prototype.template = Rkns._.template(
  1212     '<div class="Rk-TopBar"><% if (read_only) { %><h2 class="Rk-PadTitle"><%- project.get("title") || l10n.untitled_project%></h2>'
  1299     '<div class="Rk-TopBar"><% if (read_only) { %><h2 class="Rk-PadTitle"><%- project.get("title") || translate("Untitled project")%></h2>'
  1213     + '<% } else { %><input type="text" class="Rk-PadTitle" value="<%- project.get("title") || "" %>" placeholder="<%=l10n.untitled_project%>" /><% } %>'
  1300     + '<% } else { %><input type="text" class="Rk-PadTitle" value="<%- project.get("title") || "" %>" placeholder="<%-translate("Untitled project")%>" /><% } %>'
  1214     + '<div class="Rk-Users"><div class="Rk-CurrentUser"><span class="Rk-CurrentUser-Color"></span><span class="Rk-CurrentUser-Name">&lt;unknown user&gt;</span></div><ul class="Rk-UserList"></ul></div>'
  1301     + '<div class="Rk-Users"><div class="Rk-CurrentUser"><span class="Rk-CurrentUser-Color"></span><span class="Rk-CurrentUser-Name">&lt;unknown user&gt;</span></div><ul class="Rk-UserList"></ul></div>'
  1215     + '<div class="Rk-TopBar-Separator"></div><div class="Rk-TopBar-Button Rk-FullScreen-Button"><div class="Rk-TopBar-Tooltip"><div class="Rk-TopBar-Tooltip-Tip"></div><div class="Rk-TopBar-Tooltip-Contents"><%=l10n.full_screen%></div></div></div>'
  1302     + '<div class="Rk-TopBar-Separator"></div><div class="Rk-TopBar-Button Rk-FullScreen-Button"><div class="Rk-TopBar-Tooltip"><div class="Rk-TopBar-Tooltip-Tip"></div><div class="Rk-TopBar-Tooltip-Contents"><%-translate("Full Screen")%></div></div></div>'
  1216     + '<% if (!read_only) { %>'
  1303     + '<% if (!read_only) { %>'
  1217     + '<div class="Rk-TopBar-Separator"></div><div class="Rk-TopBar-Button Rk-AddNode-Button"><div class="Rk-TopBar-Tooltip"><div class="Rk-TopBar-Tooltip-Tip"></div><div class="Rk-TopBar-Tooltip-Contents"><%=l10n.add_node%></div></div></div>'
  1304     + '<div class="Rk-TopBar-Separator"></div><div class="Rk-TopBar-Button Rk-AddNode-Button"><div class="Rk-TopBar-Tooltip"><div class="Rk-TopBar-Tooltip-Tip"></div><div class="Rk-TopBar-Tooltip-Contents"><%-translate("Add Node")%></div></div></div>'
  1218     + '<div class="Rk-TopBar-Separator"></div><div class="Rk-TopBar-Button Rk-AddEdge-Button"><div class="Rk-TopBar-Tooltip"><div class="Rk-TopBar-Tooltip-Tip"></div><div class="Rk-TopBar-Tooltip-Contents"><%=l10n.add_edge%></div></div></div>'
  1305     + '<div class="Rk-TopBar-Separator"></div><div class="Rk-TopBar-Button Rk-AddEdge-Button"><div class="Rk-TopBar-Tooltip"><div class="Rk-TopBar-Tooltip-Tip"></div><div class="Rk-TopBar-Tooltip-Contents"><%-translate("Add Edge")%></div></div></div>'
  1219     + '<div class="Rk-TopBar-Separator"></div><div class="Rk-TopBar-Button Rk-Save-Button"><div class="Rk-TopBar-Tooltip"><div class="Rk-TopBar-Tooltip-Tip"></div><div class="Rk-TopBar-Tooltip-Contents"><%=l10n.save_project%></div></div></div>'
  1306     + '<div class="Rk-TopBar-Separator"></div><div class="Rk-TopBar-Button Rk-Save-Button"><div class="Rk-TopBar-Tooltip"><div class="Rk-TopBar-Tooltip-Tip"></div><div class="Rk-TopBar-Tooltip-Contents"><%-translate("Archive Project")%></div></div></div>'
  1220     + '<div class="Rk-TopBar-Separator"></div></div>'
  1307     + '<div class="Rk-TopBar-Separator"></div></div>'
  1221     + '<% } %>'
  1308     + '<% } %>'
  1222     + '<canvas class="Rk-Canvas" resize></canvas><div class="Rk-Editor"><div class="Rk-Notifications"></div>'
  1309     + '<canvas class="Rk-Canvas" resize></canvas><div class="Rk-Editor"><div class="Rk-Notifications"></div>'
  1223     + '<div class="Rk-ZoomButtons"><div class="Rk-ZoomIn" title="<%=l10n.zoom_in%>"></div><div class="Rk-ZoomOut" title="<%=l10n.zoom_out%>"></div></div>'
  1310     + '<div class="Rk-ZoomButtons"><div class="Rk-ZoomIn" title="<%-translate("Zoom In")%>"></div><div class="Rk-ZoomOut" title="<%-translate("Zoom Out")%>"></div></div>'
  1224     + '</div>'
  1311     + '</div>'
  1225 );
  1312 );
  1226 
  1313 
  1227 Rkns.Renderer.Scene.prototype.addToBundles = function(_edgeRepr) {
  1314 Rkns.Renderer.Scene.prototype.addToBundles = function(_edgeRepr) {
  1228     var _bundle = Rkns._(this.bundles).find(function(_bundle) {
  1315     var _bundle = Rkns._(this.bundles).find(function(_bundle) {
  1439         if (this.click_mode === Rkns.Renderer._CLICKMODE_STARTEDGE && this.click_target && this.click_target.type === "Node") {
  1526         if (this.click_mode === Rkns.Renderer._CLICKMODE_STARTEDGE && this.click_target && this.click_target.type === "Node") {
  1440             this.removeRepresentationsOfType("editor");
  1527             this.removeRepresentationsOfType("editor");
  1441             this.addTempEdge(this.click_target, _event.point);
  1528             this.addTempEdge(this.click_target, _event.point);
  1442             this.click_mode = Rkns.Renderer._CLICKMODE_ENDEDGE;
  1529             this.click_mode = Rkns.Renderer._CLICKMODE_ENDEDGE;
  1443             this.notif_$.fadeOut(function() {
  1530             this.notif_$.fadeOut(function() {
  1444                 Rkns.$(this).html(_renkan.l10n.notif_end_edge).fadeIn();
  1531                 Rkns.$(this).html(_renkan.translate("Click on a second node to complete the edge")).fadeIn();
  1445             });
  1532             });
  1446         } else {
  1533         } else {
  1447             this.notif_$.hide();
  1534             this.notif_$.hide();
  1448             this.click_mode = false;
  1535             this.click_mode = false;
  1449         }
  1536         }