Merge with 4732f078d0fecc226b4b790097c58a6cd30c3832
authorrougeronj
Fri, 22 May 2015 17:50:10 +0200
changeset 454 03e8815a012d
parent 453 04b7d46e9d67 (current diff)
parent 441 4732f078d0fe (diff)
child 455 18b9be54174d
Merge with 4732f078d0fecc226b4b790097c58a6cd30c3832
client/img/show.png
--- a/.hgtags	Fri May 22 17:48:18 2015 +0200
+++ b/.hgtags	Fri May 22 17:50:10 2015 +0200
@@ -59,3 +59,4 @@
 1ebaa106b5807415a0f9a70e9ea81452df429030 V00.08.07
 276042cb477ce5ae118aa30108781b65715c745a V00.08.07
 e529b633c3399d6b3471b76c2638a0a9d1463539 V00.09
+ad484b4b50507b658c8adde9bd2ac615ce831141 V00.09.01
--- a/client/README.md	Fri May 22 17:48:18 2015 +0200
+++ b/client/README.md	Fri May 22 17:50:10 2015 +0200
@@ -9,21 +9,27 @@
 
 Whatever configuration you have, you need to import those javascript files **in that order**...
 
-    <script src="[...]/jquery.min.js"></script>
-    <script src="[...]/jquery.mousewheel.min.js"></script>
-    <script src="[...]/underscore-min.js"></script>
-    <script src="[...]/backbone.js"></script>
-    <script src="[...]/backbone-relational.js"></script>
-    <script src="[...]/paper.js"></script>
-    <script src="[...]/renkan.js"></script>
+```html
+<script src="[...]/jquery.min.js"></script>
+<script src="[...]/jquery.mousewheel.min.js"></script>
+<script src="[...]/underscore-min.js"></script>
+<script src="[...]/backbone.js"></script>
+<script src="[...]/backbone-relational.js"></script>
+<script src="[...]/paper.js"></script>
+<script src="[...]/renkan.js"></script>
+```
 
 ... and the renkan css file :
 
-    <link rel="stylesheet" href="[...]/renkan.css" />
+```html
+<link rel="stylesheet" href="[...]/renkan.css" />
+```
 
 Finally, add the div in you DOM :
 
-    <div id="renkan"></div>
+```html
+<div id="renkan"></div>
+```
 
 Your Renkan should be displayed. Now let's see more specifically the 2 displays possibilities : in body 100% or in a div with set width and height.
 
@@ -34,64 +40,67 @@
 
 Nothing to add, the html is very simple :
 
-    <body>
-        <div id="renkan"></div>
-    </body>
-
+```html
+<body>
+    <div id="renkan"></div>
+</body>
+```
 
 ### In a div
 
 The renkan div has the css attributes position:absolute/top:0/left:0/bottom:0/right:0,
 so the parent div has to be in position:relative and define width and height. Here is a simple example including css and partial html :
 
-    <head>
-      <style type="text/css">
-        body{
-            margin: 0 auto;
-            width: 960px;
-        }
-        .header, .footer {
-            font-size: 14px;
-            height: 40px;
-            padding-top: 10px;
-        }
-        .rnk-container{
-            height: 500px;
-            position: relative;
-            width: 700px;
-        }
-      </style>
-    </head>
-    <body>
-      <div class="header">
-        This is a header
-      </div>
-      <div class="rnk-container">
-         <div id="renkan"></div>
-      </div>
-      <div class="footer">
-        This is a footer
-      </div>
-    </body>
-
+```html
+<head>
+  <style type="text/css">
+    body{
+        margin: 0 auto;
+        width: 960px;
+    }
+    .header, .footer {
+        font-size: 14px;
+        height: 40px;
+        padding-top: 10px;
+    }
+    .rnk-container{
+        height: 500px;
+        position: relative;
+        width: 700px;
+    }
+  </style>
+</head>
+<body>
+  <div class="header">
+    This is a header
+  </div>
+  <div class="rnk-container">
+     <div id="renkan"></div>
+  </div>
+  <div class="footer">
+    This is a footer
+  </div>
+</body>
+```
 
 ## Embedding a read only Renkan
 
 To embed a read only Renkan, just add this script tag :
 
-    <script type="text/javascript">
-        var _renkan;
-        $(function() {
-            _renkan = new Rkns.Renkan({
-                editor_mode: false,
-                show_bins: false,
-            });
-            Rkns.jsonIO(_renkan, {
-                url: "any_local_or_jsonp_url"
-            });
+```html
+<script type="text/javascript">
+    var _renkan;
+    $(function() {
+        _renkan = new Rkns.Renkan({
+            editor_mode: false,
+            show_bins: false,
         });
-    </script>
-
+        Rkns.jsonIO(_renkan, {
+            url: "any_local_or_jsonp_url"
+        });
+    });
+</script>
+```
 
 
 ## Embedding a writable Renkan
@@ -101,17 +110,19 @@
 To embed a simple writable Renkan, just add this script tag. In the client folder, "data/simple-persist.php" makes a very simple persistent url.
 The persistent url is supposed to give the json data on GET request at page load, and save datas at PUT request sent by the browser :
 
-    <script type="text/javascript">
-        var _renkan;
-        $(function() {
-            _renkan = new Rkns.Renkan({
-                show_bins: false
-            });
-            Rkns.jsonIO(_renkan, {
-                url: "url_of_a_persistent_connection"
-            });
+```html
+<script type="text/javascript">
+    var _renkan;
+    $(function() {
+        _renkan = new Rkns.Renkan({
+            show_bins: false
         });
-    </script>
+        Rkns.jsonIO(_renkan, {
+            url: "url_of_a_persistent_connection"
+        });
+    });
+</script>
+```
 
 
 ## Search and bins
@@ -121,8 +132,130 @@
 Search engine can be the current [IRI's Lignes de temps platform](http://ldt.iri.centrepompidou.fr/) and wikipedia in any available language.
 Here is an example of configuration :
 
-    _renkan = new Rkns.Renkan({
-        search: [
+```js
+_renkan = new Rkns.Renkan({
+    search: [
+            {
+                type: "Ldt"
+            },
+            {
+                type: "Wikipedia",
+                lang: "fr"
+            },
+            {
+                type: "Wikipedia",
+                lang: "ja"
+            }
+    ]
+});
+Rkns.jsonIO(_renkan, {
+    url: "data/simple-persist.php"
+});
+```
+
+You can also define data bins : annotations loaded from IRI's Lignes de temps projects, and any resources which can be drag and dropped into the renkan.
+Resources can be simple texts, links or objects with title, description, url and image. Here is an example of configuration :
+
+```js
+_renkan = new Rkns.Renkan({
+    search: [
+        ...
+    ],
+    bins: [
+        {
+            title: "To be or not to be on Lignes de Temps",
+            type: "Ldt",
+            ldt_type: "Project",
+            project_id: "6af4019c-8283-11e2-9678-00145ea4a2be",
+            ldt_platform: "http://ldt.iri.centrepompidou.fr/"
+        },
+        {
+            type: "ResourceList",
+            title: "Ressources",
+            list: [
+                {
+                    url: "http://www.google.com/",
+                    title: "Google",
+                    description: "Search engine",
+                    image: "http://www.google.fr/images/srpr/logo4w.png"
+                },
+                "Polemic Tweet http://www.polemictweet.com",
+                "Twitter http://www.twitter.com/"
+            ]
+        }
+    ]
+});
+Rkns.jsonIO(_renkan, {
+    url: "data/simple-persist.php"
+});
+```
+
+
+If you embed the renkan in a div, the renkan container css should have overflow:hidden in order to hide bins when the user wants to.
+
+## More configuration
+
+You can configure several things :
+* the language of your interface, english (default) or french
+* you can fill your nodes with black color instead of transparent.
+* thanks to an external file, you can define properties for links between node.
+
+```js
+_renkan = new Rkns.Renkan({
+    ...
+    property_files: [ "data/properties.json" ],
+    node_fill_color: true,
+    language: "fr"
+});
+```
+
+Here is an example of properties file :
+
+```json
+[
+    {
+        "label": "Dublin Core Metadata",
+        "base-uri": "http://purl.org/dc/elements/1.1/",
+        "properties": [
+            {
+                "uri": "creator",
+                "label": "created by"
+            }, {
+                "uri": "date",
+                "label": "has date"
+            }, {
+                "uri": "subject",
+                "label": "has subject"
+            }
+        ]
+    }, {
+        "label": "SKOS Semantic relations",
+        "base-uri": "http://www.w3.org/2004/02/skos/core#",
+        "properties": [
+            {
+                "uri": "broader",
+                "label": "has broader"
+            }, {
+                "uri": "narrower",
+                "label": "has narrower"
+            }, {
+                "uri": "related",
+                "label": "has related"
+            }
+        ]
+    }
+]
+```
+
+
+Finally, here is an example of full configuration :
+
+```html
+<script type="text/javascript">
+    var _renkan;
+    $(function() {
+        _renkan = new Rkns.Renkan({
+            search: [
                 {
                     type: "Ldt"
                 },
@@ -134,154 +267,40 @@
                     type: "Wikipedia",
                     lang: "ja"
                 }
-        ]
-    });
-    Rkns.jsonIO(_renkan, {
-        url: "data/simple-persist.php"
-    });
-
-You can also define data bins : annotations loaded from IRI's Lignes de temps projects, and any resources which can be drag and dropped into the renkan.
-Resources can be simple texts, links or objects with title, description, url and image. Here is an example of configuration :
-
-    _renkan = new Rkns.Renkan({
-        search: [
-            ...
-        ],
-        bins: [
-            {
-                title: "To be or not to be on Lignes de Temps",
-                type: "Ldt",
-                ldt_type: "Project",
-                project_id: "6af4019c-8283-11e2-9678-00145ea4a2be",
-                ldt_platform: "http://ldt.iri.centrepompidou.fr/"
-            },
-            {
-                type: "ResourceList",
-                title: "Ressources",
-                list: [
-                    {
-                        url: "http://www.google.com/",
-                        title: "Google",
-                        description: "Search engine",
-                        image: "http://www.google.fr/images/srpr/logo4w.png"
-                    },
-                    "Polemic Tweet http://www.polemictweet.com",
-                    "Twitter http://www.twitter.com/"
-                ]
-            }
-        ]
-    });
-    Rkns.jsonIO(_renkan, {
-        url: "data/simple-persist.php"
-    });
-
-If you embed the renkan in a div, the renkan container css should have overflow:hidden in order to hide bins when the user wants to.
-
-## More configuration
-
-You can configure several things :
-* the language of your interface, english (default) or french
-* you can fill your nodes with black color instead of transparent.
-* thanks to an external file, you can define properties for links between node.
-
-
-    _renkan = new Rkns.Renkan({
-        ...
-        property_files: [ "data/properties.json" ],
-        node_fill_color: true,
-        language: "fr"
-    });
-
-Here is an example of properties file :
-
-    [
-        {
-            "label": "Dublin Core Metadata",
-            "base-uri": "http://purl.org/dc/elements/1.1/",
-            "properties": [
+            ],
+            bins: [
+                {
+                    title: "Projet Lignes de Temps",
+                    type: "Ldt",
+                    ldt_type: "Project",
+                    project_id: "6af4019c-8283-11e2-9678-00145ea4a2be",
+                    ldt_platform: "http://ldt.iri.centrepompidou.fr/"
+               },
                 {
-                    "uri": "creator",
-                    "label": "created by"
-                }, {
-                    "uri": "date",
-                    "label": "has date"
-                }, {
-                    "uri": "subject",
-                    "label": "has subject"
-                }
-            ]
-        }, {
-            "label": "SKOS Semantic relations",
-            "base-uri": "http://www.w3.org/2004/02/skos/core#",
-            "properties": [
-                {
-                    "uri": "broader",
-                    "label": "has broader"
-                }, {
-                    "uri": "narrower",
-                    "label": "has narrower"
-                }, {
-                    "uri": "related",
-                    "label": "has related"
+                    type: "ResourceList",
+                    title: "Ressources",
+                    list: [
+                        {
+                            url: "http://www.google.com/",
+                            title: "Google",
+                            description: "Search engine",
+                            image: "http://www.google.fr/images/srpr/logo4w.png"
+                        },
+                        "Polemic Tweet http://www.polemictweet.com",
+                        "Twitter http://www.twitter.com/"
+                    ]
                 }
-            ]
-        }
-    ]
-
-
-
-Finally, here is an example of full configuration :
-
-    <script type="text/javascript">
-        var _renkan;
-        $(function() {
-            _renkan = new Rkns.Renkan({
-                search: [
-                    {
-                        type: "Ldt"
-                    },
-                    {
-                        type: "Wikipedia",
-                        lang: "fr"
-                    },
-                    {
-                        type: "Wikipedia",
-                        lang: "ja"
-                    }
-                ],
-                bins: [
-                    {
-                        title: "Projet Lignes de Temps",
-                        type: "Ldt",
-                        ldt_type: "Project",
-                        project_id: "6af4019c-8283-11e2-9678-00145ea4a2be",
-                        ldt_platform: "http://ldt.iri.centrepompidou.fr/"
-                   },
-                    {
-                        type: "ResourceList",
-                        title: "Ressources",
-                        list: [
-                            {
-                                url: "http://www.google.com/",
-                                title: "Google",
-                                description: "Search engine",
-                                image: "http://www.google.fr/images/srpr/logo4w.png"
-                            },
-                            "Polemic Tweet http://www.polemictweet.com",
-                            "Twitter http://www.twitter.com/"
-                        ]
-                    }
-                ],
-                property_files: [ "data/properties.json" ],
-                node_fill_color: false,
-                language: "fr"
-            });
-            Rkns.jsonIO(_renkan, {
-                url: "data/simple-persist.php"
-            });
+            ],
+            property_files: [ "data/properties.json" ],
+            node_fill_color: false,
+            language: "fr"
         });
-    </script>
-
+        Rkns.jsonIO(_renkan, {
+            url: "data/simple-persist.php"
+        });
+    });
+</script>
+```
 
 ## Drop management
 
@@ -291,45 +310,145 @@
 and returns a node object. A node object has title, description, image and uri properties. The \_data object is received from the
 browser's drop event. Here is an example of drop\_handler function :
 
-    _renkan = new Rkns.Renkan({
-        ...
-        drop_handler: function(_data){
-            var newNode = {};
-            newNode.title = "Overridden title";
-            newNode.description = "Overridden description " + _data["text/plain"];
-            return newNode;
-        }
-    });
-
+```js
+_renkan = new Rkns.Renkan({
+    ...
+    drop_handler: function(_data){
+        var newNode = {};
+        newNode.title = "Overridden title";
+        newNode.description = "Overridden description " + _data["text/plain"];
+        return newNode;
+    }
+});
+```
 
 You can also define a **drop\_enhancer** function that receives the already formed node object and \_data object. This function has to
 return the overriden node object. Here is an example of drop\_enhancer function :
 
-    _renkan = new Rkns.Renkan({
+```js
+_renkan = new Rkns.Renkan({
+    ...
+    drop_enhancer: function(newNode, _data){
+        newNode.title = "Prefixed title : " + newNode.title;
+        return newNode;
+    }
+});
+```
+
+## Data and api
+
+### Data
+
+The data exchanged by Renkan is a json object ths following structure:
+(Warning: some fields are optionals, and )
+
+```json
+{
+    "id": "f4d002b7-d4fd-486c-8898-6c6ceebc3354",
+    "title": "Example of Renkan with movies",
+    "description": "A long description",
+    "created": "2013-03-18T11:32:40.253+01:00",
+    "updated": "2014-02-04T15:12:56.619+01:00",
+    "nodes": [
+        {
+            "id": "node-2013-05-08-72c911bafdf9932c-0001",
+            "title": "Une femme mène l'enquête",
+            "description": "La caméra suit la femme qui marche\nJeu avec la caméra qui se substitue au spectateur",
+            "uri": "http://ldt.iri.centrepompidou.fr/ldtplatform/ldt/front/player/lyceehulst_3extraits/c8a61ee4-b33c-11e2-802c-00145ea4a2be#id=s_DCA8D184-EFC2-314B-0F6B-84043E8F9984",
+            "color": null,
+            "position": {
+                "x": -547.0499881440252,
+                "y": -221.5401229374163
+            },
+            "image": "http://ldt.iri.centrepompidou.fr/static/site/ldt/css/imgs/video_sequence.png",
+            "size": 0,
+            "project_id": "f4d002b7-d4fd-486c-8898-6c6ceebc3354",
+            "created_by": "de68xf75y6hs5rgjhgghxbm217xk",
+            "shape": "circle",
+            "type": "...",
+            "hidden": false
+        },
         ...
-        drop_enhancer: function(newNode, _data){
-            newNode.title = "Prefixed title : " + newNode.title;
-            return newNode;
+    ],
+    "edges": [
+        {
+            "id": "edge-2013-05-08-72c911bafdf9932c-0002",
+            "title": "",
+            "description": "",
+            "uri": "",
+            "color": "#ff7f00",
+            "from": "node-2013-04-30-a81adec6694db5f4-0032",
+            "to": "node-2013-05-08-72c911bafdf9932c-0001",
+            "project_id": "f4d002b7-d4fd-486c-8898-6c6ceebc3354",
+            "created_by": "de68xf75y6hs5rgjhgghxbm217xk"
+        },
+        ...
+    ],
+    "users": [ #optional
+        {
+            "userId": "user-2015-05-05-72c911bafdf9932c-0001",
+            "color": "#cc9866",
+            "username": "user1",
+            "anonymous": true
+        },
+    ...
+    ],
+    "space_id": "17f968e4-2640-4319-aa61-b5b8b527ebb4", #Optional
+    "views": [ #Optional
+        {
+            "zoom_level": 0.8275032552816195,
+            "offset_x": 832.0104075533723,
+            "offset_y": 402.8917139487223
         }
-    });
+    ]
+}
+```
+
+This data is a direct json serialisation of the data model (cf `client/js/`).
+
+
+### IO module and server communications
+
+Currently 2 modules are defined to load and save data:
+  - save-once: data is loaded by ajax at the page initialization and saved each time the save button is clicked (floppy disc icon)
+  - full-json: data is loaded by ajax at the page initialization and saved each time the data is modified.
+
+The code of these 2 modules is rather simple and easy to adapt. the various examples in the `test` folder show how to configure them.
+Both these 2 modules communicate with the server with a single endpoint. The communication is made with JSON documents and is bidirectional: 'GET' to load the project, 'POST' to send back the modified project.
+the dev environement (see [dev](#dev)) offer a simple implementation of such an endpoint for testing support. The code of this endpoint is in the file `client/data/simple-persist.js`.
 
-## Dev
+
+## <a name="dev"></a>Dev
+
+Renkan offers a dev environment that uses [Grunt](http://gruntjs.com/) for running tasks and [Bower](http://bower.io/) for managing dependencies.
+
+### Setup
+
+The only prerequisite is to install [nodejs](https://nodejs.org/) or [iojs](https://iojs.org/en/index.html). Once installed, the complete dev environment can be obtained with the following commands:
+
+```sh
+$ npm i
+$ ./node_modules/.bin/bower install
+```
+
+
+### Grunt tasks
 
 We offer a environment to develop without having to build all the project manually after each change. We define few grunt task to help us
-making it easier. You can launch them by running './node_modules/.bin/grunt task'.
-* 'dev': will build th project but let the temporary file like templates.js to let us test the application through the test files
-(see 'Tests' part below). Then it will launch a small testing server and watch the modifications of the js/css/html to build the project
-again in case of any change.
- 
+making it easier. You can launch them by running `./node_modules/.bin/grunt <task>`.
+
+* `dev`: will build the project but keep the temporary file like templates.js to let us test the application through the test files (see ['Tests'](#tests) part below). Then it will launch a small web server for testing and watch the modifications of the js/css/html to build the project again in case of any change. The test server runs on port 9001 on your local machine i.e. http://localhost:9001 . The folder served is the `client/` folder.
+
 Tasks for production :
-* 'default': will build the project and clean the temporary files (like templates.js) used during development and building.
-* 'copy-server': will copy the built project to the server side.
- 
-## Tests
+* `default`: will build the project and clean the temporary files (like templates.js) used during development and building.
+* `copy-server`: will copy the built project ut put to the server part of this project.
+
+
+## <a name="tests"></a>Tests
 
 Because of a simple php file enabling persistent connection, you can not test the writables examples by only opening them in your browser.
 A url like file:///path/to/folder/test-writable-\*.html will not work.
-You need to run a localhost server that executes php and go to a url like http://localhost/renkan/test/test-writable-\*.html.
+You need to run a localhost server that executes php and go to a url like http://localhost:9001/test/test-writable-\*.html. (cf. [Dev](#dev) above)
 
 For read only examples, it appears that for security reasons urls like file:///path/to/folder/test-readonly-\*.html only work on Firefox.
-To see those examples with other browsers, you also need to run a localhost server and go to a url like http://localhost/renkan/test/test-readonly-\*.html.
+To see those examples with other browsers, you also need to run a localhost server and go to a url like http://localhost:9001/test/test-readonly-\*.html. (cf. [Dev](#dev) above)
--- a/client/bower.json	Fri May 22 17:48:18 2015 +0200
+++ b/client/bower.json	Fri May 22 17:50:10 2015 +0200
@@ -1,6 +1,6 @@
 {
   "name": "renkan",
-  "version": "0.8.7",
+  "version": "0.9.1",
   "authors": [
     "IRI <dev@iri-research.org>"
   ],
Binary file client/img/show.png has changed
--- a/client/js/i18n.js	Fri May 22 17:48:18 2015 +0200
+++ b/client/js/i18n.js	Fri May 22 17:50:10 2015 +0200
@@ -80,6 +80,7 @@
         "Hexagone": "Hexagone",
         "Ellipse": "Ellipse",
         "Star": "Étoile",
+        "Cloud": "Nuage",
         "Zoom Fit": "Ajuster le Zoom",
         "Download Project": "Télécharger le projet",
         "Zoom Save": "Sauver le Zoom",
--- a/client/js/renderer/shapebuilder.js	Fri May 22 17:48:18 2015 +0200
+++ b/client/js/renderer/shapebuilder.js	Fri May 22 17:50:10 2015 +0200
@@ -2,6 +2,7 @@
 define([], function () {
     'use strict';
 
+    var cloud_path = "M0,0c-0.1218516546,-0.0336420601 -0.2451649928,0.0048580836 -0.3302944641,0.0884969975c-0.0444763883,-0.0550844815 -0.1047003238,-0.0975985034 -0.1769360893,-0.1175406746c-0.1859066673,-0.0513257002 -0.3774236254,0.0626045858 -0.4272374613,0.2541588105c-0.0036603877,0.0140753132 -0.0046241235,0.028229722 -0.0065872453,0.042307536c-0.1674179627,-0.0179317735 -0.3276106855,0.0900599386 -0.3725537463,0.2628868425c-0.0445325077,0.1712456429 0.0395025693,0.3463497959 0.1905420475,0.4183458793c-0.0082101538,0.0183442886 -0.0158652506,0.0372432828 -0.0211098452,0.0574080693c-0.0498130336,0.1915540431 0.0608692569,0.3884647499 0.2467762814,0.4397904033c0.0910577256,0.0251434257 0.1830791813,0.0103792696 0.2594677475,-0.0334472349c0.042100113,0.0928009202 0.1205930075,0.1674914182 0.2240666796,0.1960572479c0.1476344161,0.0407610407 0.297446165,-0.0238077445 0.3783262342,-0.1475652419c0.0327623278,0.0238981846 0.0691792333,0.0436665447 0.1102008706,0.0549940004c0.1859065794,0.0513256592 0.3770116432,-0.0627203154 0.4268255671,-0.2542745401c0.0250490557,-0.0963230532 0.0095494076,-0.1938010889 -0.0356681889,-0.2736906101c0.0447507424,-0.0439678867 0.0797796014,-0.0996624318 0.0969425462,-0.1656617192c0.0498137481,-0.1915564561 -0.0608688118,-0.3884669813 -0.2467755669,-0.4397928163c-0.0195699622,-0.0054005426 -0.0391731675,-0.0084429542 -0.0586916488,-0.0102888295c0.0115683912,-0.1682147574 -0.0933564223,-0.3269222408 -0.2572937178,-0.3721841203z";
     /* ShapeBuilder Begin */
 
     var builders = {
@@ -57,6 +58,19 @@
                 return new paper.Path.Star([0, 0], 8, radius*1, radius*0.7);
             }
         },
+        "cloud": {
+            getShape: function() {
+                var path = new paper.Path(cloud_path);
+                return path;
+
+            },
+            getImageShape: function(center, radius) {
+                var path = new paper.Path(cloud_path);
+                path.scale(radius);
+                path.translate(center);
+                return path;
+            }
+        },
         "svg": function(path){
             return {
                 getShape: function() {
--- a/client/package.json	Fri May 22 17:48:18 2015 +0200
+++ b/client/package.json	Fri May 22 17:50:10 2015 +0200
@@ -1,6 +1,6 @@
 {
   "name": "renkan",
-  "version": "0.9.0",
+  "version": "0.9.1",
   "description": "Renkan client application",
   "repository": {
     "type": "hg",
--- a/client/templates/nodeeditor.html	Fri May 22 17:48:18 2015 +0200
+++ b/client/templates/nodeeditor.html	Fri May 22 17:50:10 2015 +0200
@@ -86,6 +86,9 @@
             <option class="Rk-Edit-Vocabulary-Property" value="star"<% if (node.shape === "star") { %> selected<% } %>>
                 <%- renkan.translate("Star") %>
             </option>
+            <option class="Rk-Edit-Vocabulary-Property" value="cloud"<% if (node.shape === "cloud") { %> selected<% } %>>
+                <%- renkan.translate("Cloud") %>
+            </option>
         </select>
     </p>
 <% } %>
--- a/server/java/build.gradle	Fri May 22 17:48:18 2015 +0200
+++ b/server/java/build.gradle	Fri May 22 17:50:10 2015 +0200
@@ -2,7 +2,7 @@
   apply plugin: 'maven'
 
   group = 'org.iri_research.renkan'
-  version = '0.9.0'
+  version = '0.9.1'
 
 
   gradle.projectsEvaluated {
--- a/server/java/pom.xml	Fri May 22 17:48:18 2015 +0200
+++ b/server/java/pom.xml	Fri May 22 17:50:10 2015 +0200
@@ -5,7 +5,7 @@
     <groupId>org.iri_research.renkan</groupId>
     <artifactId>renkan</artifactId>
     <packaging>pom</packaging>
-    <version>0.9.0</version>
+    <version>0.9.1</version>
     <name>Renkan project</name>
 
     <modules>
--- a/server/python/django/renkanmanager/__init__.py	Fri May 22 17:48:18 2015 +0200
+++ b/server/python/django/renkanmanager/__init__.py	Fri May 22 17:50:10 2015 +0200
@@ -1,5 +1,5 @@
 # -*- coding: utf-8 -*-
-VERSION = (0, 9, 0, "final", 0)
+VERSION = (0, 9, 1, "final", 0)
 
 
 def get_version():
--- a/server/python/django/renkanmanager/static/renkanmanager/lib/renkan/css/renkan.css	Fri May 22 17:48:18 2015 +0200
+++ b/server/python/django/renkanmanager/static/renkanmanager/lib/renkan/css/renkan.css	Fri May 22 17:50:10 2015 +0200
@@ -24,7 +24,7 @@
  *  knowledge of the CeCILL-C license and that you accept its terms.
  */
 
-/*! renkan - v0.9.0 - Copyright © IRI 2015 */
+/*! renkan - v0.9.1 - Copyright © IRI 2015 */
 
 /*!
  *    _____            _
--- a/server/python/django/renkanmanager/static/renkanmanager/lib/renkan/css/renkan.min.css	Fri May 22 17:48:18 2015 +0200
+++ b/server/python/django/renkanmanager/static/renkanmanager/lib/renkan/css/renkan.min.css	Fri May 22 17:50:10 2015 +0200
@@ -24,7 +24,7 @@
  *  knowledge of the CeCILL-C license and that you accept its terms.
  */
 
-/*! renkan - v0.9.0 - Copyright © IRI 2015 */
+/*! renkan - v0.9.1 - Copyright © IRI 2015 */
 
 
 /*!
--- a/server/python/django/renkanmanager/static/renkanmanager/lib/renkan/css/space-editor.css	Fri May 22 17:48:18 2015 +0200
+++ b/server/python/django/renkanmanager/static/renkanmanager/lib/renkan/css/space-editor.css	Fri May 22 17:50:10 2015 +0200
@@ -24,7 +24,7 @@
  *  knowledge of the CeCILL-C license and that you accept its terms.
  */
 
-/*! renkan - v0.9.0 - Copyright © IRI 2015 */
+/*! renkan - v0.9.1 - Copyright © IRI 2015 */
 
 html {
     overflow: visible !important;
--- a/server/python/django/renkanmanager/static/renkanmanager/lib/renkan/css/space-editor.min.css	Fri May 22 17:48:18 2015 +0200
+++ b/server/python/django/renkanmanager/static/renkanmanager/lib/renkan/css/space-editor.min.css	Fri May 22 17:50:10 2015 +0200
@@ -24,7 +24,7 @@
  *  knowledge of the CeCILL-C license and that you accept its terms.
  */
 
-/*! renkan - v0.9.0 - Copyright © IRI 2015 */
+/*! renkan - v0.9.1 - Copyright © IRI 2015 */
 
 
 html{overflow:visible!important}body{font-family:Arial,Helvetica,sans-serif;background:#F6F6F6;color:#333}.clearer{display:block;clear:both;height:1px}h1{margin-bottom:5px;padding:0 15px;background:#333;color:#fff;font-weight:700;font-size:30px;line-height:60px}.right{width:301px;position:absolute;top:10px;right:10px}.main{margin:10px 330px 10px 20px}.blue-button{display:inline-block;padding:4px 6px;color:#fff;text-decoration:none;border-radius:4px;background:-moz-linear-gradient(top,#6080c0,#2040a0);background:-webkit-linear-gradient(top,#6080c0,#2040a0);box-shadow:1px 1px 2px gray}.blue-button:hover{background:-moz-linear-gradient(top,#2040a0,#6080c0);background:-webkit-linear-gradient(top,#2040a0,#6080c0)}.update-preview{text-align:center;display:block;margin-bottom:10px;font-size:24px;font-weight:700;line-height:34px}#preview{position:relative;border-left:1px solid #000;border-bottom:1px solid #000;width:300px;height:800px;border-radius:4px;overflow:hidden;margin-bottom:10px}.section-title{font-size:20px;font-weight:700;margin:20px 0 5px}.first-level-list{margin:5px 0}.add-item{margin:5px 0;font-size:22px;font-weight:700;line-height:18px}.add-item:hover:after{float:right;font-size:14px;font-weight:400;line-height:18px;margin-left:4px}.add-search-engine:hover:after{content:"Add Search Engine"}.add-resource:hover:after{content:"Add Resource"}.add-bin:hover:after{content:"Add Bin"}.item{padding:5px;margin:5px 0;border-radius:4px;font-size:12px;background:-moz-linear-gradient(top,#ffcc8f,#fff0d0);background:-webkit-linear-gradient(top,#ffcc8f,#fff0d0);box-shadow:1px 1px 2px gray}.remove-item{float:right;font-size:22px;line-height:18px;height:18px;margin:0 0 2px -10px;font-weight:700}.setting{float:left;width:260px;margin:2px 15px 2px 2px;line-height:24px;min-height:24px}.setting label{float:left;display:block;width:100px;font-weight:700}.display-value{float:left;display:block;width:160px}.edit-value{width:160px;display:none;border:1px solid #ccc;border-radius:3px}input.edit-value,textarea.edit-value{width:154px;padding:2px}textarea.edit-value{resize:vertical;height:72px}.item-editing .display-value{display:none}.item-editing .edit-value{display:inline-block}.resource-list-title{clear:both;width:100%;font-size:16px;font-weight:700;margin:5px 0 0}.resource{display:block;clear:both;padding:5px;margin:5px;border-radius:4px;background:-moz-linear-gradient(top,#ff8f00,#ffcc8f);background:-webkit-linear-gradient(top,#ff8f00,#ffcc8f);box-shadow:1px 1px 2px gray}.resource .display-value{display:inline-block}.resource .edit-value,.resource.resource-editing .display-value{display:none}.resource.resource-editing .edit-value{display:inline-block}
\ No newline at end of file
--- a/server/python/django/renkanmanager/static/renkanmanager/lib/renkan/js/renkan.js	Fri May 22 17:48:18 2015 +0200
+++ b/server/python/django/renkanmanager/static/renkanmanager/lib/renkan/js/renkan.js	Fri May 22 17:50:10 2015 +0200
@@ -24,7 +24,7 @@
  *  knowledge of the CeCILL-C license and that you accept its terms.
  */
 
-/*! renkan - v0.9.0 - Copyright © IRI 2015 */
+/*! renkan - v0.9.1 - Copyright © IRI 2015 */
 
 this["renkanJST"] = this["renkanJST"] || {};
 
--- a/server/python/django/renkanmanager/static/renkanmanager/lib/renkan/js/renkan.min.js	Fri May 22 17:48:18 2015 +0200
+++ b/server/python/django/renkanmanager/static/renkanmanager/lib/renkan/js/renkan.min.js	Fri May 22 17:50:10 2015 +0200
@@ -24,7 +24,7 @@
  *  knowledge of the CeCILL-C license and that you accept its terms.
  */
 
-/*! renkan - v0.9.0 - Copyright © IRI 2015 */
+/*! renkan - v0.9.1 - Copyright © IRI 2015 */
 
 
 this.renkanJST=this.renkanJST||{},this.renkanJST["templates/colorpicker.html"]=function(obj){obj||(obj={});{var __t,__p="";_.escape}with(obj)__p+='<li data-color="'+(null==(__t=c)?"":__t)+'" style="background: '+(null==(__t=c)?"":__t)+'"></li>';return __p},this.renkanJST["templates/edgeeditor.html"]=function(obj){obj||(obj={});{var __t,__p="",__e=_.escape;Array.prototype.join}with(obj)__p+='<h2>\n    <span class="Rk-CloseX">&times;</span>'+__e(renkan.translate("Edit Edge"))+"</span>\n</h2>\n<p>\n    <label>"+__e(renkan.translate("Title:"))+'</label>\n    <input class="Rk-Edit-Title" type="text" value="'+__e(edge.title)+'" />\n</p>\n',options.show_edge_editor_uri&&(__p+="\n    <p>\n        <label>"+__e(renkan.translate("URI:"))+'</label>\n        <input class="Rk-Edit-URI" type="text" value="'+__e(edge.uri)+'" />\n        <a class="Rk-Edit-Goto" href="'+__e(edge.uri)+'" target="_blank"></a>\n    </p>\n    ',options.properties.length&&(__p+="\n        <p>\n            <label>"+__e(renkan.translate("Choose from vocabulary:"))+'</label>\n            <select class="Rk-Edit-Vocabulary">\n                ',_.each(options.properties,function(a){__p+='\n                    <option class="Rk-Edit-Vocabulary-Class" value="">\n                        '+__e(renkan.translate(a.label))+"\n                    </option>\n                    ",_.each(a.properties,function(b){var c=a["base-uri"]+b.uri;__p+='\n                        <option class="Rk-Edit-Vocabulary-Property" value="'+__e(c)+'"\n                            ',c===edge.uri&&(__p+=" selected"),__p+=">\n                            "+__e(renkan.translate(b.label))+"\n                        </option>\n                    "}),__p+="\n                "}),__p+="\n            </select>\n        </p>\n")),__p+="\n",options.show_edge_editor_color&&(__p+='\n    <div class="Rk-Editor-p">\n        <span class="Rk-Editor-Label">'+__e(renkan.translate("Edge color:"))+'</span>\n        <div class="Rk-Edit-ColorPicker-Wrapper">\n            <span class="Rk-Edit-Color" style="background: &lt;%-edge.color%>;">\n                <span class="Rk-Edit-ColorTip"></span>\n            </span>\n            '+(null==(__t=renkan.colorPicker)?"":__t)+'\n            <span class="Rk-Edit-ColorPicker-Text">'+__e(renkan.translate("Choose color"))+"</span>\n        </div>\n    </div>\n"),__p+="\n",options.show_edge_editor_direction&&(__p+='\n    <p>\n        <span class="Rk-Edit-Direction">'+__e(renkan.translate("Change edge direction"))+"</span>\n    </p>\n"),__p+="\n",options.show_edge_editor_nodes&&(__p+='\n    <p>\n        <span class="Rk-Editor-Label">'+__e(renkan.translate("From:"))+'</span>\n        <span class="Rk-UserColor" style="background: '+__e(edge.from_color)+';"></span>\n        '+__e(shortenText(edge.from_title,25))+'\n    </p>\n    <p>\n        <span class="Rk-Editor-Label">'+__e(renkan.translate("To:"))+'</span>\n        <span class="Rk-UserColor" style="background: >%-edge.to_color%>;"></span>\n        '+__e(shortenText(edge.to_title,25))+"\n    </p>\n"),__p+="\n",options.show_edge_editor_creator&&edge.has_creator&&(__p+='\n    <p>\n        <span class="Rk-Editor-Label">'+__e(renkan.translate("Created by:"))+'</span>\n        <span class="Rk-UserColor" style="background: &lt;%-edge.created_by_color%>;"></span>\n        '+__e(shortenText(edge.created_by_title,25))+"\n    </p>\n"),__p+="\n";return __p},this.renkanJST["templates/edgeeditor_readonly.html"]=function(obj){obj||(obj={});{var __p="",__e=_.escape;Array.prototype.join}with(obj)__p+='<h2>\n    <span class="Rk-CloseX">&times;</span>\n    ',options.show_edge_tooltip_color&&(__p+='\n        <span class="Rk-UserColor" style="background: '+__e(edge.color)+';"></span>\n    '),__p+='\n    <span class="Rk-Display-Title">\n        ',edge.uri&&(__p+='\n            <a href="'+__e(edge.uri)+'" target="_blank">\n        '),__p+="\n        "+__e(edge.title)+"\n        ",edge.uri&&(__p+=" </a> "),__p+="\n    </span>\n</h2>\n",options.show_edge_tooltip_uri&&edge.uri&&(__p+='\n    <p class="Rk-Display-URI">\n        <a href="'+__e(edge.uri)+'" target="_blank">'+__e(edge.short_uri)+"</a>\n    </p>\n"),__p+="\n<p>"+__e(edge.description)+"</p>\n",options.show_edge_tooltip_nodes&&(__p+='\n    <p>\n        <span class="Rk-Editor-Label">'+__e(renkan.translate("From:"))+'</span>\n        <span class="Rk-UserColor" style="background: '+__e(edge.from_color)+';"></span>\n        '+__e(shortenText(edge.from_title,25))+'\n    </p>\n    <p>\n        <span class="Rk-Editor-Label">'+__e(renkan.translate("To:"))+'</span>\n        <span class="Rk-UserColor" style="background: '+__e(edge.to_color)+';"></span>\n        '+__e(shortenText(edge.to_title,25))+"\n    </p>\n"),__p+="\n",options.show_edge_tooltip_creator&&edge.has_creator&&(__p+='\n    <p>\n        <span class="Rk-Editor-Label">'+__e(renkan.translate("Created by:"))+'</span>\n        <span class="Rk-UserColor" style="background: '+__e(edge.created_by_color)+';"></span>\n        '+__e(shortenText(edge.created_by_title,25))+"\n    </p>\n"),__p+="\n";return __p},this.renkanJST["templates/ldtjson-bin/annotationtemplate.html"]=function(obj){obj||(obj={});var __t,__p="",__e=_.escape;with(obj)__p+='<li class="Rk-Bin-Item" draggable="true"\n    data-image="'+__e(Rkns.Utils.getFullURL(image))+'"\n    data-uri="'+(null==(__t=ldt_platform)?"":__t)+"ldtplatform/ldt/front/player/"+(null==(__t=mediaid)?"":__t)+"/#id="+(null==(__t=annotationid)?"":__t)+'"\n    data-title="'+__e(title)+'" data-description="'+__e(description)+'">\n\n    <img class="Rk-Ldt-Annotation-Icon" src="'+(null==(__t=image)?"":__t)+'" />\n    <h4>'+(null==(__t=htitle)?"":__t)+"</h4>\n    <p>"+(null==(__t=hdescription)?"":__t)+"</p>\n    <p>Start: "+(null==(__t=start)?"":__t)+", End: "+(null==(__t=end)?"":__t)+", Duration: "+(null==(__t=duration)?"":__t)+'</p>\n    <div class="Rk-Clear"></div>\n</li>\n';return __p},this.renkanJST["templates/ldtjson-bin/segmenttemplate.html"]=function(obj){obj||(obj={});var __t,__p="",__e=_.escape;with(obj)__p+='<li class="Rk-Bin-Item" draggable="true"\n    data-image="'+__e(Rkns.Utils.getFullURL(image))+'"\n    data-uri="'+(null==(__t=ldt_platform)?"":__t)+"ldtplatform/ldt/front/player/"+(null==(__t=mediaid)?"":__t)+"/#id="+(null==(__t=annotationid)?"":__t)+'"\n    data-title="'+__e(title)+'" data-description="'+__e(description)+'">\n\n    <img class="Rk-Ldt-Annotation-Icon" src="'+(null==(__t=image)?"":__t)+'" />\n    <h4>'+(null==(__t=htitle)?"":__t)+"</h4>\n    <p>"+(null==(__t=hdescription)?"":__t)+"</p>\n    <p>Start: "+(null==(__t=start)?"":__t)+", End: "+(null==(__t=end)?"":__t)+", Duration: "+(null==(__t=duration)?"":__t)+'</p>\n    <div class="Rk-Clear"></div>\n</li>\n';return __p},this.renkanJST["templates/ldtjson-bin/tagtemplate.html"]=function(obj){obj||(obj={});var __t,__p="",__e=_.escape;with(obj)__p+='<li class="Rk-Bin-Item" draggable="true"\n    data-image="'+__e(Rkns.Utils.getFullURL(static_url+"img/ldt-tag.png"))+'"\n    data-uri="'+(null==(__t=ldt_platform)?"":__t)+"ldtplatform/ldt/front/search/?search="+(null==(__t=encodedtitle)?"":__t)+'&field=all"\n    data-title="'+__e(title)+'" data-description="Tag \''+__e(title)+'\'">\n\n    <img class="Rk-Ldt-Tag-Icon" src="'+__e(static_url)+'img/ldt-tag.png" />\n    <h4>'+(null==(__t=htitle)?"":__t)+'</h4>\n    <div class="Rk-Clear"></div>\n</li>\n';return __p},this.renkanJST["templates/list-bin.html"]=function(obj){obj||(obj={});{var __t,__p="",__e=_.escape;Array.prototype.join}with(obj)__p+='<li class="Rk-Bin-Item Rk-ResourceList-Item" draggable="true"\n    data-uri="'+__e(url)+'" data-title="'+__e(title)+'"\n    data-description="'+__e(description)+'"\n    ',__p+=image?'\n        data-image="'+__e(Rkns.Utils.getFullURL(image))+'"\n    ':'\n        data-image=""\n    ',__p+="\n>",image&&(__p+='\n    <img class="Rk-ResourceList-Image" src="'+__e(image)+'" />\n'),__p+='\n<h4 class="Rk-ResourceList-Title">\n    ',url&&(__p+='\n        <a href="'+__e(url)+'" target="_blank">\n    '),__p+="\n    "+(null==(__t=htitle)?"":__t)+"\n    ",url&&(__p+="</a>"),__p+="\n    </h4>\n    ",description&&(__p+='\n        <p class="Rk-ResourceList-Description">'+(null==(__t=hdescription)?"":__t)+"</p>\n    "),__p+="\n    ",image&&(__p+='\n        <div style="clear: both;"></div>\n    '),__p+="\n</li>\n";return __p},this.renkanJST["templates/main.html"]=function(obj){obj||(obj={});{var __p="",__e=_.escape;Array.prototype.join}with(obj)options.show_bins&&(__p+='\n    <div class="Rk-Bins">\n        <div class="Rk-Bins-Head">\n            <h2 class="Rk-Bins-Title">'+__e(translate("Select contents:"))+'</h2>\n            <form class="Rk-Web-Search-Form Rk-Search-Form">\n                <input class="Rk-Web-Search-Input Rk-Search-Input" type="search"\n                    placeholder="'+__e(translate("Search the Web"))+'" />\n                <div class="Rk-Search-Select">\n                    <div class="Rk-Search-Current"></div>\n                    <ul class="Rk-Search-List"></ul>\n                </div>\n                <input type="submit" value=""\n                    class="Rk-Web-Search-Submit Rk-Search-Submit" title="'+__e(translate("Search the Web"))+'" />\n            </form>\n            <form class="Rk-Bins-Search-Form Rk-Search-Form">\n                <input class="Rk-Bins-Search-Input Rk-Search-Input" type="search"\n                    placeholder="'+__e(translate("Search in Bins"))+'" /> <input\n                    type="submit" value=""\n                    class="Rk-Bins-Search-Submit Rk-Search-Submit"\n                    title="'+__e(translate("Search in Bins"))+'" />\n            </form>\n        </div>\n        <ul class="Rk-Bin-List"></ul>\n    </div>\n'),__p+=" ",options.show_editor&&(__p+='\n    <div class="Rk-Render Rk-Render-',__p+=options.show_bins?"Panel":"Full",__p+='"></div>\n'),__p+="\n";return __p},this.renkanJST["templates/nodeeditor.html"]=function(obj){obj||(obj={});{var __t,__p="",__e=_.escape;Array.prototype.join}with(obj)__p+='<h2>\n    <span class="Rk-CloseX">&times;</span>'+__e(renkan.translate("Edit Node"))+"</span>\n</h2>\n<p>\n    <label>"+__e(renkan.translate("Title:"))+'</label>\n    <input class="Rk-Edit-Title" type="text" value="'+__e(node.title)+'" />\n</p>\n',options.show_node_editor_uri&&(__p+="\n    <p>\n        <label>"+__e(renkan.translate("URI:"))+'</label>\n        <input class="Rk-Edit-URI" type="text" value="'+__e(node.uri)+'" />\n        <a class="Rk-Edit-Goto" href="'+__e(node.uri)+'" target="_blank"></a>\n    </p>\n'),__p+=" ",options.show_node_editor_description&&(__p+="\n    <p>\n        <label>"+__e(renkan.translate("Description:"))+'</label>\n        <textarea class="Rk-Edit-Description">'+__e(node.description)+"</textarea>\n    </p>\n"),__p+=" ",options.show_node_editor_size&&(__p+='\n    <p>\n        <span class="Rk-Editor-Label">'+__e(renkan.translate("Size:"))+'</span>\n        <a href="#" class="Rk-Edit-Size-Down">-</a>\n        <span class="Rk-Edit-Size-Value">'+__e(node.size)+'</span>\n        <a href="#" class="Rk-Edit-Size-Up">+</a>\n    </p>\n'),__p+=" ",options.show_node_editor_color&&(__p+='\n    <div class="Rk-Editor-p">\n        <span class="Rk-Editor-Label">\n        '+__e(renkan.translate("Node color:"))+'</span>\n        <div class="Rk-Edit-ColorPicker-Wrapper">\n            <span class="Rk-Edit-Color" style="background: '+__e(node.color)+';">\n                <span class="Rk-Edit-ColorTip"></span>\n            </span>\n            '+(null==(__t=renkan.colorPicker)?"":__t)+'\n            <span class="Rk-Edit-ColorPicker-Text">'+__e(renkan.translate("Choose color"))+"</span>\n        </div>\n    </div>\n"),__p+=" ",options.show_node_editor_image&&(__p+='\n    <div class="Rk-Edit-ImgWrap">\n        <div class="Rk-Edit-ImgPreview">\n            <img src="'+__e(node.image||node.image_placeholder)+'" />\n            ',node.clip_path&&(__p+='\n                <svg xmlns="http://www.w3.org/2000/svg" version="1.1" viewbox="0 0 1 1" preserveAspectRatio="none">\n                    <path style="stroke-width: .02; stroke:red; fill-opacity:.3; fill:red;" d="'+__e(node.clip_path)+'" />\n                </svg>\n            '),__p+="\n        </div>\n    </div>\n    <p>\n        <label>"+__e(renkan.translate("Image URL:"))+'</label>\n        <div>\n            <a class="Rk-Edit-Image-Del" href="#"></a>\n            <input class="Rk-Edit-Image" type="text" value=\''+__e(node.image)+"' />\n        </div>\n    </p>\n",options.allow_image_upload&&(__p+="\n    <p>\n        <label>"+__e(renkan.translate("Choose Image File:"))+'</label>\n        <input class="Rk-Edit-Image-File" type="file" accept="image/*" />\n    </p>\n')),__p+=" ",options.show_node_editor_creator&&node.has_creator&&(__p+='\n    <p>\n        <span class="Rk-Editor-Label">'+__e(renkan.translate("Created by:"))+'</span>\n        <span class="Rk-UserColor" style="background: '+__e(node.created_by_color)+';"></span>\n        '+__e(shortenText(node.created_by_title,25))+"\n    </p>\n"),__p+=" ",options.change_shapes&&(__p+="\n    <p>\n        <label>"+__e(renkan.translate("Shapes available"))+':</label>\n        <select class="Rk-Edit-Shape">\n            <option class="Rk-Edit-Vocabulary-Property" value="circle"',"circle"===node.shape&&(__p+=" selected"),__p+=">\n                "+__e(renkan.translate("Circle"))+'\n            </option>\n            <option class="Rk-Edit-Vocabulary-Property" value="rectangle"',"rectangle"===node.shape&&(__p+=" selected"),__p+=">\n                "+__e(renkan.translate("Square"))+'\n            </option>\n            <option class="Rk-Edit-Vocabulary-Property" value="diamond"',"diamond"===node.shape&&(__p+=" selected"),__p+=">\n                "+__e(renkan.translate("Diamond"))+'\n            </option>\n            <option class="Rk-Edit-Vocabulary-Property" value="polygon"',"polygon"===node.shape&&(__p+=" selected"),__p+=">\n                "+__e(renkan.translate("Hexagone"))+'\n            </option>\n            <option class="Rk-Edit-Vocabulary-Property" value="ellipse"',"ellipse"===node.shape&&(__p+=" selected"),__p+=">\n                "+__e(renkan.translate("Ellipse"))+'\n            </option>\n            <option class="Rk-Edit-Vocabulary-Property" value="star"',"star"===node.shape&&(__p+=" selected"),__p+=">\n                "+__e(renkan.translate("Star"))+"\n            </option>\n        </select>\n    </p>\n"),__p+="\n";return __p},this.renkanJST["templates/nodeeditor_readonly.html"]=function(obj){obj||(obj={});{var __p="",__e=_.escape;Array.prototype.join}with(obj)__p+='<h2>\n    <span class="Rk-CloseX">&times;</span>\n    ',options.show_node_tooltip_color&&(__p+='\n        <span class="Rk-UserColor" style="background: '+__e(node.color)+';"></span>\n    '),__p+='\n    <span class="Rk-Display-Title">\n        ',node.uri&&(__p+='\n            <a href="'+__e(node.uri)+'" target="_blank">\n        '),__p+="\n        "+__e(node.title)+"\n        ",node.uri&&(__p+="</a>"),__p+="\n    </span>\n</h2>\n",node.uri&&options.show_node_tooltip_uri&&(__p+='\n    <p class="Rk-Display-URI">\n        <a href="'+__e(node.uri)+'" target="_blank">'+__e(node.short_uri)+"</a>\n    </p>\n"),__p+=" ",options.show_node_tooltip_description&&(__p+='\n    <p class="Rk-Display-Description">'+__e(node.description)+"</p>\n"),__p+=" ",node.image&&options.show_node_tooltip_image&&(__p+='\n    <img class="Rk-Display-ImgPreview" src="'+__e(node.image)+'" />\n'),__p+=" ",node.has_creator&&options.show_node_tooltip_creator&&(__p+='\n    <p>\n        <span class="Rk-Editor-Label">'+__e(renkan.translate("Created by:"))+'</span>\n        <span class="Rk-UserColor" style="background: '+__e(node.created_by_color)+';"></span>\n        '+__e(shortenText(node.created_by_title,25))+"\n    </p>\n"),__p+="\n";return __p},this.renkanJST["templates/scene.html"]=function(obj){function print(){__p+=__j.call(arguments,"")}obj||(obj={});var __p="",__e=_.escape,__j=Array.prototype.join;with(obj)options.show_top_bar&&(__p+='\n    <div class="Rk-TopBar">\n        <div class="loader"></div>\n        ',__p+=options.editor_mode?'\n            <input type="text" class="Rk-PadTitle" value="'+__e(project.get("title")||"")+'" placeholder="'+__e(translate("Untitled project"))+'" />\n        ':'\n            <h2 class="Rk-PadTitle">\n                '+__e(project.get("title")||translate("Untitled project"))+"\n            </h2>\n        ",__p+="\n        ",options.show_user_list&&(__p+='\n            <div class="Rk-Users">\n                <div class="Rk-CurrentUser">\n                    ',options.show_user_color&&(__p+='\n                        <div class="Rk-Edit-ColorPicker-Wrapper">\n                            <span class="Rk-CurrentUser-Color">\n                            ',options.user_color_editable&&(__p+='\n                                <span class="Rk-Edit-ColorTip"></span>\n                            '),__p+="\n                            </span>\n                            ",options.user_color_editable&&print(colorPicker),__p+="\n                        </div>\n                    "),__p+='\n                    <span class="Rk-CurrentUser-Name">&lt;unknown user&gt;</span>\n                </div>\n                <ul class="Rk-UserList"></ul>\n            </div>\n        '),__p+="\n        ",options.home_button_url&&(__p+='\n            <div class="Rk-TopBar-Separator"></div>\n            <a class="Rk-TopBar-Button Rk-Home-Button" href="'+__e(options.home_button_url)+'">\n                <div class="Rk-TopBar-Tooltip">\n                    <div class="Rk-TopBar-Tooltip-Contents">\n                        '+__e(translate(options.home_button_title))+"\n                    </div>\n                </div>\n            </a>\n        "),__p+="\n        ",options.show_fullscreen_button&&(__p+='\n            <div class="Rk-TopBar-Separator"></div>\n            <div class="Rk-TopBar-Button Rk-FullScreen-Button">\n                <div class="Rk-TopBar-Tooltip">\n                    <div class="Rk-TopBar-Tooltip-Contents">\n                        '+__e(translate("Full Screen"))+"\n                    </div>\n                </div>\n            </div>\n        "),__p+="\n        ",options.editor_mode?(__p+="\n            ",options.show_addnode_button&&(__p+='\n                <div class="Rk-TopBar-Separator"></div>\n                <div class="Rk-TopBar-Button Rk-AddNode-Button">\n                    <div class="Rk-TopBar-Tooltip">\n                        <div class="Rk-TopBar-Tooltip-Contents">\n                            '+__e(translate("Add Node"))+"\n                        </div>\n                    </div>\n                </div>\n            "),__p+="\n            ",options.show_addedge_button&&(__p+='\n                <div class="Rk-TopBar-Separator"></div>\n                <div class="Rk-TopBar-Button Rk-AddEdge-Button">\n                    <div class="Rk-TopBar-Tooltip">\n                        <div class="Rk-TopBar-Tooltip-Contents">\n                            '+__e(translate("Add Edge"))+"\n                        </div>\n                    </div>\n                </div>\n            "),__p+="\n            ",options.show_export_button&&(__p+='\n                <div class="Rk-TopBar-Separator"></div>\n                <div class="Rk-TopBar-Button Rk-Export-Button">\n                    <div class="Rk-TopBar-Tooltip">\n                        <div class="Rk-TopBar-Tooltip-Contents">\n                            '+__e(translate("Download Project"))+"\n                        </div>\n                    </div>\n                </div>\n            "),__p+="\n            ",options.show_save_button&&(__p+='\n                <div class="Rk-TopBar-Separator"></div>\n                <div class="Rk-TopBar-Button Rk-Save-Button">\n                    <div class="Rk-TopBar-Tooltip">\n                        <div class="Rk-TopBar-Tooltip-Contents"></div>\n                    </div>\n                </div>\n            '),__p+="\n            ",options.show_open_button&&(__p+='\n                <div class="Rk-TopBar-Separator"></div>\n                <div class="Rk-TopBar-Button Rk-Open-Button">\n                    <div class="Rk-TopBar-Tooltip">\n                        <div class="Rk-TopBar-Tooltip-Contents">\n                            '+__e(translate("Open Project"))+"\n                        </div>\n                    </div>\n                </div>\n            "),__p+="\n            ",options.show_bookmarklet&&(__p+='\n                <div class="Rk-TopBar-Separator"></div>\n                <a class="Rk-TopBar-Button Rk-Bookmarklet-Button" href="#">\n                    <div class="Rk-TopBar-Tooltip">\n                        <div class="Rk-TopBar-Tooltip-Contents">\n                            '+__e(translate("Renkan 'Drag-to-Add' bookmarklet"))+'\n                        </div>\n                    </div>\n                </a>\n                <div class="Rk-TopBar-Separator"></div>\n            '),__p+="\n        "):(__p+="\n            ",options.show_export_button&&(__p+='\n                <div class="Rk-TopBar-Separator"></div>\n                <div class="Rk-TopBar-Button Rk-Export-Button">\n                    <div class="Rk-TopBar-Tooltip">\n                        <div class="Rk-TopBar-Tooltip-Contents">\n                            '+__e(translate("Download Project"))+'\n                        </div>\n                    </div>\n                </div>\n                <div class="Rk-TopBar-Separator"></div>\n            '),__p+="\n        "),__p+="\n        ",options.show_search_field&&(__p+='\n            <form action="#" class="Rk-GraphSearch-Form">\n                <input type="search" class="Rk-GraphSearch-Field" placeholder="'+__e(translate("Search in graph"))+'" />\n            </form>\n            <div class="Rk-TopBar-Separator"></div>\n        '),__p+="\n    </div>\n"),__p+='\n<div class="Rk-Editing-Space',options.show_top_bar||(__p+=" Rk-Editing-Space-Full"),__p+='">\n    <div class="Rk-Labels"></div>\n    <canvas class="Rk-Canvas" ',options.resize&&(__p+=' resize="" '),__p+='></canvas>\n    <div class="Rk-Notifications"></div>\n    <div class="Rk-Editor">\n        ',options.show_bins&&(__p+='\n            <div class="Rk-Fold-Bins">&laquo;</div>\n        '),__p+="\n        ",options.show_zoom&&(__p+='\n            <div class="Rk-ZoomButtons">\n                <div class="Rk-ZoomIn" title="'+__e(translate("Zoom In"))+'"></div>\n                <div class="Rk-ZoomFit" title="'+__e(translate("Zoom Fit"))+'"></div>\n                <div class="Rk-ZoomOut" title="'+__e(translate("Zoom Out"))+'"></div>\n                ',options.editor_mode&&options.save_view&&(__p+='\n                    <div class="Rk-ZoomSave" title="'+__e(translate("Zoom Save"))+'"></div>\n                '),__p+="\n                ",options.save_view&&(__p+='\n                    <div class="Rk-ZoomSetSaved" title="'+__e(translate("View saved zoom"))+'"></div>\n                '),__p+="\n            </div>\n        "),__p+="\n    </div>\n</div>\n";return __p},this.renkanJST["templates/search.html"]=function(obj){obj||(obj={});{var __t,__p="";_.escape}with(obj)__p+='<li class="'+(null==(__t=className)?"":__t)+'" data-key="'+(null==(__t=key)?"":__t)+'">'+(null==(__t=title)?"":__t)+"</li>";return __p},this.renkanJST["templates/wikipedia-bin/resulttemplate.html"]=function(obj){obj||(obj={});var __t,__p="",__e=_.escape;with(obj)__p+='<li class="Rk-Wikipedia-Result Rk-Bin-Item" draggable="true"\n    data-uri="'+__e(url)+'" data-title="Wikipedia: '+__e(title)+'"\n    data-description="'+__e(description)+'"\n    data-image="'+__e(Rkns.Utils.getFullURL(static_url+"img/wikipedia.png"))+'">\n\n    <img class="Rk-Wikipedia-Icon" src="'+__e(static_url)+'img/wikipedia.png">\n    <h4 class="Rk-Wikipedia-Title">\n        <a href="'+__e(url)+'" target="_blank">'+(null==(__t=htitle)?"":__t)+'</a>\n    </h4>\n    <p class="Rk-Wikipedia-Snippet">'+(null==(__t=hdescription)?"":__t)+"</p>\n</li>\n";return __p},function(a){"use strict";"object"!=typeof a.Rkns&&(a.Rkns={});var b=a.Rkns,c=b.$=a.jQuery,d=b._=a._;b.pickerColors=["#8f1919","#a80000","#d82626","#ff0000","#e87c7c","#ff6565","#f7d3d3","#fecccc","#8f5419","#a85400","#d87f26","#ff7f00","#e8b27c","#ffb265","#f7e5d3","#fee5cc","#8f8f19","#a8a800","#d8d826","#feff00","#e8e87c","#feff65","#f7f7d3","#fefecc","#198f19","#00a800","#26d826","#00ff00","#7ce87c","#65ff65","#d3f7d3","#ccfecc","#198f8f","#00a8a8","#26d8d8","#00feff","#7ce8e8","#65feff","#d3f7f7","#ccfefe","#19198f","#0000a8","#2626d8","#0000ff","#7c7ce8","#6565ff","#d3d3f7","#ccccfe","#8f198f","#a800a8","#d826d8","#ff00fe","#e87ce8","#ff65fe","#f7d3f7","#feccfe","#000000","#242424","#484848","#6d6d6d","#919191","#b6b6b6","#dadada","#ffffff"],b.__renkans=[];var e=b._BaseBin=function(a,c){if("undefined"!=typeof a){this.renkan=a,this.renkan.$.find(".Rk-Bin-Main").hide(),this.$=b.$("<li>").addClass("Rk-Bin").appendTo(a.$.find(".Rk-Bin-List")),this.title_icon_$=b.$("<span>").addClass("Rk-Bin-Title-Icon").appendTo(this.$);var d=this;b.$("<a>").attr({href:"#",title:a.translate("Close bin")}).addClass("Rk-Bin-Close").html("&times;").appendTo(this.$).click(function(){return d.destroy(),a.$.find(".Rk-Bin-Main:visible").length||a.$.find(".Rk-Bin-Main:last").slideDown(),a.resizeBins(),!1}),b.$("<a>").attr({href:"#",title:a.translate("Refresh bin")}).addClass("Rk-Bin-Refresh").appendTo(this.$).click(function(){return d.refresh(),!1}),this.count_$=b.$("<div>").addClass("Rk-Bin-Count").appendTo(this.$),this.title_$=b.$("<h2>").addClass("Rk-Bin-Title").appendTo(this.$),this.main_$=b.$("<div>").addClass("Rk-Bin-Main").appendTo(this.$).html('<h4 class="Rk-Bin-Loading">'+a.translate("Loading, please wait")+"</h4>"),this.title_$.html(c.title||"(new bin)"),this.renkan.resizeBins(),c.auto_refresh&&window.setInterval(function(){d.refresh()},c.auto_refresh)}};e.prototype.destroy=function(){this.$.detach(),this.renkan.resizeBins()};var f=b.Renkan=function(a){var e=this;if(b.__renkans.push(this),this.options=d.defaults(a,b.defaults,{templates:renkanJST}),this.template=renkanJST["templates/main.html"],d.each(this.options.property_files,function(a){b.$.getJSON(a,function(a){e.options.properties=e.options.properties.concat(a)})}),this.read_only=this.options.read_only||!this.options.editor_mode,this.project=new b.Models.Project,this.setCurrentUser=function(a,b){this.project.addUser({_id:a,title:b}),this.current_user=a,this.renderer.redrawUsers()},"undefined"!=typeof this.options.user_id&&(this.current_user=this.options.user_id),this.$=b.$("#"+this.options.container),this.$.addClass("Rk-Main").html(this.template(this)),this.tabs=[],this.search_engines=[],this.current_user_list=new b.Models.UsersList,this.current_user_list.on("add remove",function(){this.renderer&&this.renderer.redrawUsers()}),this.colorPicker=function(){var a=renkanJST["templates/colorpicker.html"];return'<ul class="Rk-Edit-ColorPicker">'+b.pickerColors.map(function(b){return a({c:b})}).join("")+"</ul>"}(),this.options.show_editor&&(this.renderer=new b.Renderer.Scene(this)),this.options.search.length){var f=renkanJST["templates/search.html"],g=this.$.find(".Rk-Search-List"),h=this.$.find(".Rk-Web-Search-Input"),i=this.$.find(".Rk-Web-Search-Form");d.each(this.options.search,function(a){b[a.type]&&b[a.type].Search&&e.search_engines.push(new b[a.type].Search(e,a))}),g.html(d(this.search_engines).map(function(a,b){return f({key:b,title:a.getSearchTitle(),className:a.getBgClass()})}).join("")),g.find("li").click(function(){var a=b.$(this);e.setSearchEngine(a.attr("data-key")),i.submit()}),i.submit(function(){if(h.val()){var a=e.search_engine;a.search(h.val())}return!1}),this.$.find(".Rk-Search-Current").mouseenter(function(){g.slideDown()}),this.$.find(".Rk-Search-Select").mouseleave(function(){g.hide()}),this.setSearchEngine(0)}else this.$.find(".Rk-Web-Search-Form").detach();d.each(this.options.bins,function(a){b[a.type]&&b[a.type].Bin&&e.tabs.push(new b[a.type].Bin(e,a))});var j=!1;this.$.find(".Rk-Bins").on("click",".Rk-Bin-Title,.Rk-Bin-Title-Icon",function(){var a=b.$(this).siblings(".Rk-Bin-Main");a.is(":hidden")&&(e.$.find(".Rk-Bin-Main").slideUp(),a.slideDown())}),this.options.show_editor&&this.$.find(".Rk-Bins").on("mouseover",".Rk-Bin-Item",function(){var a=b.$(this);if(a&&c(a).attr("data-uri")){var f=e.project.get("nodes").where({uri:c(a).attr("data-uri")});d.each(f,function(a){e.renderer.highlightModel(a)})}}).mouseout(function(){e.renderer.unhighlightAll()}).on("mousemove",".Rk-Bin-Item",function(){try{this.dragDrop()}catch(a){}}).on("touchstart",".Rk-Bin-Item",function(){j=!1}).on("touchmove",".Rk-Bin-Item",function(a){a.preventDefault();var b=a.originalEvent.changedTouches[0],c=e.renderer.canvas_$.offset(),d=e.renderer.canvas_$.width(),f=e.renderer.canvas_$.height();if(b.pageX>=c.left&&b.pageX<c.left+d&&b.pageY>=c.top&&b.pageY<c.top+f)if(j)e.renderer.onMouseMove(b,!0);else{j=!0;var g=document.createElement("div");g.appendChild(this.cloneNode(!0)),e.renderer.dropData({"text/html":g.innerHTML},b),e.renderer.onMouseDown(b,!0)}}).on("touchend",".Rk-Bin-Item",function(a){j&&e.renderer.onMouseUp(a.originalEvent.changedTouches[0],!0),j=!1}).on("dragstart",".Rk-Bin-Item",function(a){var b=document.createElement("div");b.appendChild(this.cloneNode(!0));try{a.originalEvent.dataTransfer.setData("text/html",b.innerHTML)}catch(c){a.originalEvent.dataTransfer.setData("text",b.innerHTML)}}),b.$(window).resize(function(){e.resizeBins()});var k=!1,l="";this.$.find(".Rk-Bins-Search-Input").on("change keyup paste input",function(){var a=b.$(this).val();if(a!==l){var c=b.Utils.regexpFromTextOrArray(a.length>1?a:null);c.source!==k&&(k=c.source,d.each(e.tabs,function(a){a.render(c)}))}}),this.$.find(".Rk-Bins-Search-Form").submit(function(){return!1})};f.prototype.translate=function(a){return b.i18n[this.options.language]&&b.i18n[this.options.language][a]?b.i18n[this.options.language][a]:this.options.language.length>2&&b.i18n[this.options.language.substr(0,2)]&&b.i18n[this.options.language.substr(0,2)][a]?b.i18n[this.options.language.substr(0,2)][a]:a},f.prototype.onStatusChange=function(){this.renderer.onStatusChange()},f.prototype.setSearchEngine=function(a){this.search_engine=this.search_engines[a],this.$.find(".Rk-Search-Current").attr("class","Rk-Search-Current "+this.search_engine.getBgClass());for(var b=this.search_engine.getBgClass().split(" "),c="",d=0;d<b.length;d++)c+="."+b[d];this.$.find(".Rk-Web-Search-Input.Rk-Search-Input").attr("placeholder",this.translate("Search in ")+this.$.find(".Rk-Search-List "+c).html())},f.prototype.resizeBins=function(){var a=+this.$.find(".Rk-Bins-Head").outerHeight();this.$.find(".Rk-Bin-Title:visible").each(function(){a+=b.$(this).outerHeight()}),this.$.find(".Rk-Bin-Main").css({height:this.$.find(".Rk-Bins").height()-a})};var g=function(){return"xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx".replace(/[xy]/g,function(a){var b=16*Math.random()|0,c="x"===a?b:3&b|8;return c.toString(16)})};b.Utils={getUUID4:g,getUID:function(){function a(a){return 10>a?"0"+a:a}var b=new Date,c=0,d=b.getUTCFullYear()+"-"+a(b.getUTCMonth()+1)+"-"+a(b.getUTCDate())+"-"+g();return function(a){for(var b=(++c).toString(16),e="undefined"==typeof a?"":a+"-";b.length<4;)b="0"+b;return e+d+"-"+b}}(),getFullURL:function(a){if("undefined"==typeof a||null==a)return"";if(/https?:\/\//.test(a))return a;var b=new Image;b.src=a;var c=b.src;return b.src=null,c},inherit:function(a,b){var c=function(){"function"==typeof b&&b.apply(this,Array.prototype.slice.call(arguments,0)),a.apply(this,Array.prototype.slice.call(arguments,0)),"function"!=typeof this._init||this._initialized||(this._init.apply(this,Array.prototype.slice.call(arguments,0)),this._initialized=!0)};return d.extend(c.prototype,a.prototype),c},regexpFromTextOrArray:function(){function a(a){function b(a){return function(b,c){a=a.replace(h[b],c)}}for(var e=a.toLowerCase().replace(g,""),i="",j=0;j<e.length;j++){j&&(i+=f+"*");var k=e[j];d.each(c,b(k)),i+=k}return i