Merge 2 heads
authornowmad@23.1.168.192.in-addr.arpa
Mon, 18 Jan 2016 10:01:39 +0100
changeset 85 e95ca73cec54
parent 31 3e93c61f6be0 (current diff)
parent 84 36f84e8f1ad5 (diff)
child 86 15ded106ef1a
Merge 2 heads
cms/app-client/app/controllers/visus/visu-carto.js
cms/app-client/app/templates/visus/visu-carto.hbs
cms/app-client/app/templates/visus/visu-chrono.hbs
cms/app-client/app/templates/visus/visu-discours.hbs
cms/app-client/app/templates/visus/visu-langues.hbs
cms/app-client/app/templates/visus/visu-thematiques.hbs
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/cms/app-client/app/adapters/application.js	Mon Jan 18 10:01:39 2016 +0100
@@ -0,0 +1,16 @@
+import DS from 'ember-data';
+
+export default DS.FixtureAdapter.extend({
+  host: 'http://127.0.0.1',
+  namespace: 'api',
+  queryFixtures: function(records, query, type) {
+    return records.filter(function(record) {
+        for(var key in query) {
+            if (!query.hasOwnProperty(key)) { continue; }
+            var value = query[key];
+            if (record[key] !== value) { return false; }
+        }
+        return true;
+    });
+  }
+});
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/cms/app-client/app/components/visu-carto.js	Mon Jan 18 10:01:39 2016 +0100
@@ -0,0 +1,134 @@
+import Ember from 'ember';
+
+export default Ember.Component.extend({
+  // storage: Ember.inject.service(),
+  didInsertElement: function(){
+    var _this = this;
+
+    var continentsDataProvider;
+
+    var franceDataProvider = {
+        mapVar: AmCharts.maps.france2016Low,
+        getAreasFromMap:true,
+
+        areas: this.initArea(AmCharts.maps.france2016Low)
+    };
+
+    var worldDataProvider = {
+        map: "worldLow",
+        getAreasFromMap: true,
+        images: [{
+            id: "backButton",
+            label: "Back to continents map",
+            rollOverColor: "#CC0000",
+            labelRollOverColor: "#CC0000",
+            useTargetsZoomValues: true,
+            left: 30,
+            bottom: 30,
+            labelFontSize: 15,
+            selectable: true
+        }],
+        areas: this.initArea(AmCharts.maps.worldLow, franceDataProvider)
+    };
+
+
+    var continentsDataProvider = {
+        map: "continentsLow",
+
+        areas: [{
+            id: "africa",
+            linkToObject: worldDataProvider,
+            color: "#7CACAE",
+            passZoomValuesToTarget: true
+        }, {
+            id: "asia",
+            linkToObject: worldDataProvider,
+            color: "#E0EEEF",
+            passZoomValuesToTarget: true
+        }, {
+            id: "australia",
+            linkToObject: worldDataProvider,
+            color: "#E0EEEF",
+            passZoomValuesToTarget: true
+        }, {
+            id: "europe",
+            linkToObject: worldDataProvider,
+            color: "#2D7073",
+            passZoomValuesToTarget: true
+        }, {
+            id: "north_america",
+            linkToObject: worldDataProvider,
+            color: "#B0D1D3",
+            passZoomValuesToTarget: true
+        }, {
+            id: "south_america",
+            linkToObject: worldDataProvider,
+            color: "#E0EEEF",
+            passZoomValuesToTarget: true
+        }]
+
+    };
+
+
+    var map = AmCharts.makeChart("mapdiv", {
+        type: "map",
+
+
+        areasSettings: {
+            autoZoom: true,
+            rollOverOutlineColor: "#000000",
+            selectedOutlineColor: "#CC0000",
+            selectedColor: "green",
+            color: "#E0EEEF"
+        },
+
+        dataProvider: continentsDataProvider,
+
+        listeners: [{event:"clickMapObject", method:handleMapObjectClick}]
+
+    });
+
+    function handleGoHome() {
+        map.dataProvider = continentsDataProvider;
+        map.validateNow();
+    }
+    function handleMapObjectClick (event) {
+      console.log("bbox: ", event.mapObject.displayObject.node.getBBox());
+      // console.log("event", event);
+      // console.log("originalTarget", event.event.originalTarget);
+      // console.log("getTotalLength", event.event.originalTarget.getTotalLength());
+      // console.log("getBBox", event.event.originalTarget.getBBox());
+      // console.log("event", event.event.originalTarget.attributes[1].d);
+        if (event.mapObject.id == "backButton") {
+            handleGoHome();
+        }
+        _this.sendAction('action', event.mapObject.title);
+    }
+
+    // monitor when home icon was clicked and also go to continents map
+    map.addListener("homeButtonClicked", handleGoHome);
+  },
+  initArea: function(area, dataProvider){
+    var _this = this;
+
+    var areaList = [];
+    var count = {};
+    area.svg.g.path.map(function(elt, index){
+      var length = _this.get("sounds").filterBy("spatial", elt.title).toArray().length;
+      if (length > 0)
+        count[elt.id]= length;
+    });
+    area.svg.g.path.map(function(elt, index){
+
+      areaList.push({
+        id: elt.id,
+        linkToObject: (elt.id === "FR" ? dataProvider : ""),
+        color: ((typeof(count[elt.id]) === "undefined") ? "#E0EEEF" : "#2D7073"),
+        autoZoom: (elt.id === "FR" ? true : false),
+        selectable: true,
+        passZoomValuesToTarget: false
+      });
+    });
+    return areaList;
+  }
+});
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/cms/app-client/app/components/visu-chrono.js	Mon Jan 18 10:01:39 2016 +0100
@@ -0,0 +1,45 @@
+import Ember from 'ember';
+
+export default Ember.Component.extend({
+  didInsertElement: function(){
+    var _this = this;
+
+    if (this.get('container').lookup('controller:application').date !== null){
+      this.highlightQuery(this.get('container').lookup('controller:application').date);
+    }
+
+    var isMouseDown = false,
+      isHighlighted;
+    $("#our_table li").mousedown(function () {
+      isMouseDown = true;
+      $(this).toggleClass("highlighted");
+      isHighlighted = $(this).hasClass("highlighted");
+      _this.sendUpdate();
+      return false; // prevent text selection
+    }).mouseover(function () {
+      if (isMouseDown) {
+        $(this).toggleClass("highlighted", isHighlighted);
+        _this.sendUpdate();
+      }
+    }).bind("selectstart", function () {
+      return false;
+    })
+
+    $(document).mouseup(function () {
+      isMouseDown = false;
+    });
+  },
+  sendUpdate: function(){
+    var dateQuery = [];
+    $('.highlighted').map(function(index, elt) {
+      dateQuery.push(parseInt($(elt).parent().attr('id')) + parseInt($(elt).html()));
+    });
+    this.sendAction('action', dateQuery);
+  },
+  highlightQuery: function(list){
+    list.map(function(elt, index){
+      var year = Math.floor(parseInt(elt)/10)*10;
+      $("#"+year+" ."+(parseInt(elt)-year)).toggleClass("highlighted", true);
+    });
+  }
+});
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/cms/app-client/app/components/visu-langues.js	Mon Jan 18 10:01:39 2016 +0100
@@ -0,0 +1,197 @@
+import Ember from 'ember';
+
+export default Ember.Component.extend({
+  didInsertElement: function(){
+    var _this = this;
+
+    var margin = {top: 20, right: 0, bottom: 0, left: 0},
+        width = 560,
+        height = 600 - margin.top - margin.bottom,
+        formatNumber = d3.format(",d"),
+        transitioning;
+
+    var x = d3.scale.linear()
+        .domain([0, width])
+        .range([0, width]);
+
+    var y = d3.scale.linear()
+        .domain([0, height])
+        .range([0, height]);
+
+    var treemap = d3.layout.treemap()
+        .children(function(d, depth) { return depth ? null : d._children; })
+        .sort(function(a, b) { return a.value - b.value; })
+        .ratio(height / width * 0.5 * (1 + Math.sqrt(5)))
+        .round(false);
+
+    var svg = d3.select("#chart_div").append("svg")
+        .attr("width", width + margin.left + margin.right)
+        .attr("height", height + margin.bottom + margin.top)
+        .style("margin-left", -margin.left + "px")
+        .style("margin.right", -margin.right + "px")
+      .append("g")
+        .attr("transform", "translate(" + margin.left + "," + margin.top + ")")
+        .style("shape-rendering", "crispEdges");
+
+    var grandparent = svg.append("g")
+        .attr("class", "grandparent");
+
+    grandparent.append("rect")
+        .attr("y", -margin.top)
+        .attr("width", width)
+        .attr("height", margin.top);
+
+    grandparent.append("text")
+        .attr("x", 6)
+        .attr("y", 6 - margin.top)
+        .attr("dy", ".75em");
+
+    d3.json("langues.json", function(root) {
+      initialize(root);
+      accumulate(root);
+      layout(root);
+      display(root);
+
+      function initialize(root) {
+        root.x = root.y = 0;
+        root.dx = width;
+        root.dy = height;
+        root.depth = 0;
+      }
+
+      // Aggregate the values for internal nodes. This is normally done by the
+      // treemap layout, but not here because of our custom implementation.
+      // We also take a snapshot of the original children (_children) to avoid
+      // the children being overwritten when when layout is computed.
+      function accumulate(d) {
+        return (d._children = d.children)
+            ? d.value = d.children.reduce(function(p, v) { return p + accumulate(v); }, 0)
+            : d.value;
+      }
+
+      // Compute the treemap layout recursively such that each group of siblings
+      // uses the same size (1×1) rather than the dimensions of the parent cell.
+      // This optimizes the layout for the current zoom state. Note that a wrapper
+      // object is created for the parent node for each group of siblings so that
+      // the parent’s dimensions are not discarded as we recurse. Since each group
+      // of sibling was laid out in 1×1, we must rescale to fit using absolute
+      // coordinates. This lets us use a viewport to zoom.
+      function layout(d) {
+        if (d._children) {
+          treemap.nodes({_children: d._children});
+          d._children.forEach(function(c) {
+            c.x = d.x + c.x * d.dx;
+            c.y = d.y + c.y * d.dy;
+            c.dx *= d.dx;
+            c.dy *= d.dy;
+            c.parent = d;
+            layout(c);
+          });
+        }
+      }
+
+      function display(d) {
+        grandparent
+            .datum(d.parent)
+            .on("click", transition)
+          .select("text")
+            .text(name(d));
+
+        var g1 = svg.insert("g", ".grandparent")
+            .datum(d)
+            .attr("class", "depth");
+
+        var g = g1.selectAll("g")
+            .data(d._children)
+          .enter().append("g");
+
+        g.classed("bla", true).on("click", selectHandler)
+
+        g.filter(function(d) { return d._children; })
+            .classed("children", true)
+            .on("click", transition);
+
+        // g.selectAll(".child")
+        //     .data(function(d) { return d._children || [d]; })
+        //   .enter().append("rect")
+        //     .attr("class", "child")
+        //     .call(rect);
+
+        g.append("rect")
+            .attr("class", "parent")
+            // .attr("fill", (d.color || "#bbb"))
+            .call(rect)
+          .append("title")
+            .text(function(d) { return formatNumber(d.value); });
+
+        g.append("text")
+            .attr("dy", ".75em")
+            .text(function(d) { return d.name; })
+            .call(text);
+
+        function transition(d) {
+          if (transitioning || !d) return;
+          selectHandler(d);
+          transitioning = true;
+
+          var g2 = display(d),
+              t1 = g1.transition().duration(750),
+              t2 = g2.transition().duration(750);
+
+          // Update the domain only after entering new elements.
+          x.domain([d.x, d.x + d.dx]);
+          y.domain([d.y, d.y + d.dy]);
+
+          // Enable anti-aliasing during the transition.
+          svg.style("shape-rendering", null);
+
+          // Draw child nodes on top of parent nodes.
+          svg.selectAll(".depth").sort(function(a, b) { return a.depth - b.depth; });
+
+          // Fade-in entering text.
+          g2.selectAll("text").style("fill-opacity", 0);
+
+          // Transition to the new view.
+          t1.selectAll("text").call(text).style("fill-opacity", 0);
+          t2.selectAll("text").call(text).style("fill-opacity", 1);
+          t1.selectAll("rect").call(rect);
+          t2.selectAll("rect").call(rect);
+
+          // Remove the old node when the transition is finished.
+          t1.remove().each("end", function() {
+            svg.style("shape-rendering", "crispEdges");
+            transitioning = false;
+          });
+        }
+
+        function selectHandler (d){
+          if (d.name === "Global"){
+            return _this.sendAction('action', null);
+          }
+          _this.sendAction('action', d.name);
+        }
+
+        return g;
+      }
+
+      function text(text) {
+        text.attr("x", function(d) { return x(d.x) + 6; })
+            .attr("y", function(d) { return y(d.y) + 6; });
+      }
+
+      function rect(rect) {
+        rect.attr("x", function(d) { return x(d.x); })
+            .attr("y", function(d) { return y(d.y); })
+            .attr("width", function(d) { return x(d.x + d.dx) - x(d.x); })
+            .attr("height", function(d) { return y(d.y + d.dy) - y(d.y); })
+            .attr("fill", function(d) { return (d.color || "#bbb")});
+      }
+
+      function name(d) {
+        return d.parent
+            ? name(d.parent) + "." + d.name
+            : d.name;
+      }
+    });
+  }
+});
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/cms/app-client/app/controllers/application.js	Mon Jan 18 10:01:39 2016 +0100
@@ -0,0 +1,76 @@
+import Ember from 'ember';
+
+export default Ember.Controller.extend({
+  queryParams: ['location', 'langue', 'discours', 'date', 'thematique'],
+  location: null,
+  langue: null,
+  discours: null,
+  date: [],
+  thematique: null,
+  isShowingModal: false,
+  currentDetails: null,
+  currentItem: {title: "example", master: 'http://www.noiseaddicts.com/samples_1w72b820/3921.mp3'},
+  filteredSounds: Ember.computed('location', 'langue', 'discours', 'date', 'thematique', 'model', function() {
+    var location = this.get('location');
+    var langue = this.get('langue');
+    var discours = this.get('discours');
+    var date = this.get('date');
+    var thematique = this.get('thematique');
+
+    var sounds = this.get('model');
+
+    if (location) {
+      sounds = sounds.filterBy('spatial', location);
+    }
+    if (langue) {
+      sounds = sounds.filterBy('language', langue);
+    }
+    if (discours) {
+      sounds = sounds.filterBy('type', discours);
+    }
+    if (date.length > 0) {
+      var temp = sounds;
+      sounds.map(function(elt, index){
+        if (date.indexOf(elt.get('created')) === -1){
+          temp = temp.without(elt);
+        }
+      });
+      sounds = temp;
+    }
+    if (thematique) {
+      sounds = sounds.filterBy('thematique', thematique);
+    }
+    return sounds;
+  }),
+  actions: {
+    deleteTag: function(query, item){
+      var queryParams = {};
+      if (query === 'date'){
+        var array = this.get('date');
+        if(array.indexOf(item) !== -1) {
+        	array.splice(array.indexOf(item), 1);
+        }
+      }
+      queryParams[query] = array || null;
+      this.transitionToRoute({queryParams: queryParams});
+    },
+    play: function(item){
+      this.set("currentItem", item);
+      $("#audio-player").load();
+      $(".result-item").toggleClass("playing", false);
+      $("#"+item.id).toggleClass("playing", true);
+    },
+    details: function(item){
+      if ($("#"+item.id).hasClass("details")){
+          $("#"+item.id).toggleClass("details", false);
+      } else{
+        $(".result-item").toggleClass("details", false);
+        $("#"+item.id).toggleClass("details", true);
+      }
+    },
+    toggleModal: function(item){
+      this.set("isShowingModal", !this.isShowingModal);
+      this.set("currentDetails", item);
+    }
+  }
+});
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/cms/app-client/app/controllers/tabs/carto.js	Mon Jan 18 10:01:39 2016 +0100
@@ -0,0 +1,9 @@
+import Ember from 'ember';
+
+export default Ember.Controller.extend({
+  actions: {
+    updateUrl: function(selection){
+      this.transitionToRoute({queryParams: {location: selection}});
+    }
+  }
+});
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/cms/app-client/app/controllers/tabs/chrono.js	Mon Jan 18 10:01:39 2016 +0100
@@ -0,0 +1,9 @@
+import Ember from 'ember';
+
+export default Ember.Controller.extend({
+  actions: {
+    updateUrl: function(selection){
+      this.transitionToRoute({queryParams: {date: selection}});
+    }
+  }
+});
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/cms/app-client/app/controllers/tabs/langues.js	Mon Jan 18 10:01:39 2016 +0100
@@ -0,0 +1,9 @@
+import Ember from 'ember';
+
+export default Ember.Controller.extend({
+  actions: {
+    updateUrl: function(selection){
+      this.transitionToRoute({queryParams: {langue: selection}});
+    }
+  }
+});
--- a/cms/app-client/app/controllers/visus/visu-carto.js	Fri Jan 15 17:16:49 2016 +0100
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,6 +0,0 @@
-import Ember from 'ember';
-import config from '../../config/environment';
-
-export default Ember.Controller.extend({
-  logoUrl: config.APP.baseStatic + "assets/images/logo.png"
-});
--- a/cms/app-client/app/index.html	Fri Jan 15 17:16:49 2016 +0100
+++ b/cms/app-client/app/index.html	Mon Jan 18 10:01:39 2016 +0100
@@ -21,19 +21,28 @@
       <h1>Corpus de la parole</h1>
       <div class="menu">
         <ul class="menu_main">
-          <li> <a href="#"> CORPUS </a> </li>
-          <li> <a href="#"> LANGUES </a> </li>
-          <li> <a href="#"> PROJET </a> </li>
-          <li> <a href="#"> RECHERCHE </a> </li>
+          <li class="sub-menu"> <a href="#/langues"> Langues </a> </li>
+          <li class="sub-menu"> <a href="#/cartographie"> Cartographie </a> </li>
+          <li class="sub-menu"> <a href="#/thematiques"> Thématiques </a> </li>
+          <li class="sub-menu"> <a href="#/discours"> Discours </a> </li>
+          <li class="sub-menu"> <a href="#/chronologie"> Chronologie </a> </li>
         </ul>
       </div>
     </div>
 
     {{content-for 'body'}}
-    <div id="corpus-app"></div>
+    <div id="corpus-app" class="corpus-app"></div>
 
+    <script type="text/javascript" src="https://www.google.com/jsapi?autoload={'modules':[{'name':'visualization','version':'1.1','packages':['treemap']}]}"></script>
     <script src="assets/vendor.js"></script>
     <script src="assets/app-client.js"></script>
+    <script src="//code.jquery.com/jquery-1.11.3.min.js"></script>
+    <script>
+      $(".menu_main .sub-menu").click(function(item, bla){
+        $(".menu_main .sub-menu").toggleClass("active", false);
+        $(item.currentTarget).toggleClass("active", true);
+      })
+    </script>
 
     {{content-for 'body-footer'}}
   </body>
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/cms/app-client/app/models/sound.js	Mon Jan 18 10:01:39 2016 +0100
@@ -0,0 +1,349 @@
+import DS from 'ember-data';
+
+var Sound = DS.Model.extend({
+  title: DS.attr('string'),
+  description: DS.attr('string'),
+  interviewer: DS.attr('string'),
+  type: DS.attr('string'),
+  spatial: DS.attr('string'),
+  language: DS.attr('string'),
+  created: DS.attr('integer'),
+  master: DS.attr('url')
+});
+
+Sound.reopenClass({
+  FIXTURES: [
+    {
+      "id": 0,
+      "title": "culpa exercitation",
+      "description": "Deserunt exercitation laborum veniam ex anim officia non cillum ut. Mollit quis minim officia quis incididunt exercitation eu ad.",
+      "interviewer": "Ferguson King",
+      "type": "Reunion",
+      "spatial": "Germany",
+      "language": "Français",
+      "created": 1977,
+      "master": "http://www.noiseaddicts.com/samples_1w72b820/3921.mp3"
+    },
+    {
+      "id": 1,
+      "title": "excepteur ex",
+      "description": "Veniam irure deserunt esse veniam enim voluptate esse et consequat fugiat. Fugiat ullamco officia enim nulla.",
+      "interviewer": "Holly Sims",
+      "type": "Discours",
+      "spatial": "France",
+      "language": "Alsacien",
+      "created": 2001,
+      "master": "http://www.noiseaddicts.com/samples_1w72b820/3924.mp3"
+    },
+    {
+      "id": 2,
+      "title": "fugiat fugiat",
+      "description": "Enim aute incididunt voluptate sit labore anim in irure id duis ut. Occaecat magna sit mollit commodo enim reprehenderit nulla magna.",
+      "interviewer": "Claudia Cunningham",
+      "type": "Entretien",
+      "spatial": "France",
+      "language": "Corse",
+      "created": 2004,
+      "master": "http://www.noiseaddicts.com/samples_1w72b820/3924.mp3"
+    },
+    {
+      "id": 3,
+      "title": "officia fugiat",
+      "description": "Irure elit aute eu consequat est sunt cillum. Quis nisi consectetur cillum cupidatat id consectetur.",
+      "interviewer": "Hazel Foster",
+      "type": "Dialogue",
+      "spatial": "France",
+      "language": "Alsacien",
+      "created": 2001,
+      "master": "http://www.noiseaddicts.com/samples_1w72b820/138.mp3"
+    },
+    {
+      "id": 4,
+      "title": "nulla elit",
+      "description": "Anim ex consequat aliqua magna in aliquip ipsum voluptate est deserunt voluptate. Incididunt sit voluptate esse cillum qui ex irure cillum nulla cillum excepteur.",
+      "interviewer": "Colon Dotson",
+      "type": "Conversation",
+      "spatial": "Germany",
+      "language": "Breton",
+      "created": 1990,
+      "master": "http://www.noiseaddicts.com/samples_1w72b820/3921.mp3"
+    },
+    {
+      "id": 5,
+      "title": "sunt laboris",
+      "description": "Ex quis aliqua aliquip incididunt dolore excepteur est incididunt occaecat aute anim. Veniam laborum tempor cupidatat aliquip nostrud anim ut dolor sint et aliquip.",
+      "interviewer": "Alisha Flores",
+      "type": "Discussion",
+      "spatial": "France",
+      "language": "Corse",
+      "created": 1972,
+      "master": "http://www.noiseaddicts.com/samples_1w72b820/3924.mp3"
+    },
+    {
+      "id": 6,
+      "title": "fugiat laboris",
+      "description": "Do tempor amet duis occaecat. Est laboris ea voluptate ut adipisicing laboris exercitation eiusmod est irure ad laborum.",
+      "interviewer": "Hart Mccoy",
+      "type": "Conversation",
+      "spatial": "Germany",
+      "language": "Alsacien",
+      "created": 1987,
+      "master": "http://www.noiseaddicts.com/samples_1w72b820/138.mp3"
+    },
+    {
+      "id": 7,
+      "title": "elit sit",
+      "description": "Lorem magna adipisicing sit non excepteur aliqua tempor enim elit cupidatat voluptate laborum. Aliqua mollit consequat pariatur tempor.",
+      "interviewer": "Cecelia Gregory",
+      "type": "Bavardage",
+      "spatial": "Germany",
+      "language": "Breton",
+      "created": 1961,
+      "master": "http://www.noiseaddicts.com/samples_1w72b820/138.mp3"
+    },
+    {
+      "id": 8,
+      "title": "sit aliquip",
+      "description": "Ad sint anim elit eiusmod duis incididunt ipsum cupidatat culpa id proident amet. Ad in do aliquip irure est proident Lorem qui est veniam.",
+      "interviewer": "Cain Sweeney",
+      "type": "Dialogue",
+      "spatial": "Germany",
+      "language": "Corse",
+      "created": 1973,
+      "master": "http://www.noiseaddicts.com/samples_1w72b820/142.mp3"
+    },
+    {
+      "id": 9,
+      "title": "culpa ut",
+      "description": "Irure nostrud consequat aliqua sit est id aute dolor elit quis. Exercitation consequat commodo amet nostrud laboris minim aute ipsum eiusmod sunt nisi.",
+      "interviewer": "Clay Whitney",
+      "type": "Discussion",
+      "spatial": "Spain",
+      "language": "Alsacien",
+      "created": 2008,
+      "master": "http://www.noiseaddicts.com/samples_1w72b820/3924.mp3"
+    },
+    {
+      "id": 10,
+      "title": "culpa non",
+      "description": "Qui et dolor cupidatat eiusmod. Cillum irure mollit est nostrud dolor non exercitation ipsum sint.",
+      "interviewer": "Isabelle Valencia",
+      "type": "Conversation",
+      "spatial": "Spain",
+      "language": "Français",
+      "created": 1975,
+      "master": "http://www.noiseaddicts.com/samples_1w72b820/3924.mp3"
+    },
+    {
+      "id": 11,
+      "title": "sit occaecat",
+      "description": "Exercitation elit magna cillum pariatur fugiat minim fugiat. Occaecat minim sunt ex aute velit aliquip laboris aliquip dolore.",
+      "interviewer": "Sherri Morin",
+      "type": "Discussion",
+      "spatial": "France",
+      "language": "Français",
+      "created": 2008,
+      "master": "http://www.noiseaddicts.com/samples_1w72b820/3924.mp3"
+    },
+    {
+      "id": 12,
+      "title": "ea dolor",
+      "description": "Ea ullamco cupidatat esse et eu est sint irure ex non. Pariatur consectetur et quis et cupidatat ea mollit cillum enim.",
+      "interviewer": "Golden Bird",
+      "type": "Conversation",
+      "spatial": "France",
+      "language": "Breton",
+      "created": 1960,
+      "master": "http://www.noiseaddicts.com/samples_1w72b820/138.mp3"
+    },
+    {
+      "id": 13,
+      "title": "laboris adipisicing",
+      "description": "Non ex culpa ullamco occaecat quis ut reprehenderit non in cupidatat reprehenderit laboris reprehenderit. Laboris irure Lorem aliquip consequat consequat consequat cillum elit incididunt ad anim Lorem sint excepteur.",
+      "interviewer": "Bianca Faulkner",
+      "type": "Conversation",
+      "spatial": "Spain",
+      "language": "Breton",
+      "created": 1997,
+      "master": "http://www.noiseaddicts.com/samples_1w72b820/3924.mp3"
+    },
+    {
+      "id": 14,
+      "title": "sit veniam",
+      "description": "Cillum velit laborum irure velit consequat ipsum minim. Non in elit est Lorem excepteur mollit consectetur id.",
+      "interviewer": "Kidd Monroe",
+      "type": "Negociation",
+      "spatial": "Spain",
+      "language": "Alsacien",
+      "created": 2007,
+      "master": "http://www.noiseaddicts.com/samples_1w72b820/3924.mp3"
+    },
+    {
+      "id": 15,
+      "title": "excepteur exercitation",
+      "description": "Et officia laboris pariatur culpa. Ullamco nisi eu non in.",
+      "interviewer": "Debora Palmer",
+      "type": "Conversation",
+      "spatial": "France",
+      "language": "Alsacien",
+      "created": 1969,
+      "master": "http://www.noiseaddicts.com/samples_1w72b820/3921.mp3"
+    },
+    {
+      "id": 16,
+      "title": "consectetur officia",
+      "description": "Est tempor aliquip sit occaecat. Ullamco do anim labore consequat sunt enim ea.",
+      "interviewer": "Shaffer Workman",
+      "type": "Dialogue",
+      "spatial": "France",
+      "language": "Breton",
+      "created": 1998,
+      "master": "http://www.noiseaddicts.com/samples_1w72b820/3921.mp3"
+    },
+    {
+      "id": 17,
+      "title": "fugiat eiusmod",
+      "description": "Quis sit mollit velit quis veniam ipsum commodo voluptate laborum pariatur dolor eiusmod nisi. Reprehenderit aliquip quis aliqua mollit culpa.",
+      "interviewer": "Shepherd Floyd",
+      "type": "Discussion",
+      "spatial": "Spain",
+      "language": "Corse",
+      "created": 1991,
+      "master": "http://www.noiseaddicts.com/samples_1w72b820/3921.mp3"
+    },
+    {
+      "id": 18,
+      "title": "magna minim",
+      "description": "Amet enim in labore aliquip ipsum fugiat est ex quis. Voluptate adipisicing laboris nisi eu excepteur quis voluptate sit laborum ullamco proident aliquip duis aliquip.",
+      "interviewer": "Tamra Nixon",
+      "type": "Discussion",
+      "spatial": "France",
+      "language": "Français",
+      "created": 2009,
+      "master": "http://www.noiseaddicts.com/samples_1w72b820/3924.mp3"
+    },
+    {
+      "id": 19,
+      "title": "occaecat aliquip",
+      "description": "Reprehenderit cillum id duis et quis nulla tempor tempor eu ipsum magna mollit laborum. Ullamco reprehenderit incididunt nostrud irure tempor adipisicing.",
+      "interviewer": "Bette Becker",
+      "type": "Discours",
+      "spatial": "France",
+      "language": "Français",
+      "created": 1975,
+      "master": "http://www.noiseaddicts.com/samples_1w72b820/3921.mp3"
+    },
+    {
+      "id": 20,
+      "title": "minim minim",
+      "description": "Incididunt sit consequat laborum mollit nisi et ullamco aute ad nisi nostrud. Lorem quis id culpa culpa eu minim fugiat quis incididunt ex in sit adipisicing.",
+      "interviewer": "Marsh Gillespie",
+      "type": "Discussion",
+      "spatial": "Spain",
+      "language": "Français",
+      "created": 1964,
+      "master": "http://www.noiseaddicts.com/samples_1w72b820/142.mp3"
+    },
+    {
+      "id": 21,
+      "title": "commodo pariatur",
+      "description": "Duis elit consequat sint ipsum aliqua adipisicing ex consequat eiusmod qui ad laboris fugiat ipsum. Eiusmod eiusmod elit culpa veniam.",
+      "interviewer": "Guthrie Norman",
+      "type": "Argumentation",
+      "spatial": "France",
+      "language": "Corse",
+      "created": 1987,
+      "master": "http://www.noiseaddicts.com/samples_1w72b820/138.mp3"
+    },
+    {
+      "id": 22,
+      "title": "dolore voluptate",
+      "description": "Ullamco cupidatat tempor incididunt dolor enim proident aliqua dolor dolor nulla occaecat quis excepteur. Consectetur ea ut commodo sunt excepteur ad ut ex consectetur.",
+      "interviewer": "Rosalie Rogers",
+      "type": "Discussion",
+      "spatial": "Germany",
+      "language": "Français",
+      "created": 1997,
+      "master": "http://www.noiseaddicts.com/samples_1w72b820/3921.mp3"
+    },
+    {
+      "id": 23,
+      "title": "ipsum veniam",
+      "description": "Duis enim cupidatat laboris duis ut sint. Nisi eiusmod ea dolore cillum et labore dolor pariatur labore cupidatat reprehenderit irure.",
+      "interviewer": "Bridget Espinoza",
+      "type": "Conversation",
+      "spatial": "Spain",
+      "language": "Alsacien",
+      "created": 1973,
+      "master": "http://www.noiseaddicts.com/samples_1w72b820/3921.mp3"
+    },
+    {
+      "id": 24,
+      "title": "fugiat et",
+      "description": "Velit elit non consequat incididunt consectetur occaecat sint magna aliquip. In dolore sunt sit nulla veniam culpa laboris sunt incididunt voluptate ipsum.",
+      "interviewer": "Cox Bernard",
+      "type": "Entretien",
+      "spatial": "Germany",
+      "language": "Alsacien",
+      "created": 1988,
+      "master": "http://www.noiseaddicts.com/samples_1w72b820/3924.mp3"
+    },
+    {
+      "id": 25,
+      "title": "cillum adipisicing",
+      "description": "Aliqua ullamco quis aliqua minim irure sunt excepteur in nostrud. Consectetur aute commodo proident ea aliquip officia et dolore veniam sint.",
+      "interviewer": "Wendi Leon",
+      "type": "Negociation",
+      "spatial": "France",
+      "language": "Français",
+      "created": 1992,
+      "master": "http://www.noiseaddicts.com/samples_1w72b820/3924.mp3"
+    },
+    {
+      "id": 26,
+      "title": "magna consequat",
+      "description": "Velit duis id consectetur ad anim fugiat in pariatur aliqua esse aliquip sit dolore aliqua. Laborum incididunt enim ea occaecat officia pariatur veniam deserunt.",
+      "interviewer": "Celeste Price",
+      "type": "Discussion",
+      "spatial": "France",
+      "language": "Alsacien",
+      "created": 1973,
+      "master": "http://www.noiseaddicts.com/samples_1w72b820/138.mp3"
+    },
+    {
+      "id": 27,
+      "title": "proident non",
+      "description": "Ullamco amet sit qui reprehenderit eu aliquip magna culpa. Aliqua fugiat commodo est non minim irure aliquip proident ipsum laborum nulla qui quis irure.",
+      "interviewer": "Patty Heath",
+      "type": "Reunion",
+      "spatial": "France",
+      "language": "Breton",
+      "created": 1973,
+      "master": "http://www.noiseaddicts.com/samples_1w72b820/142.mp3"
+    },
+    {
+      "id": 28,
+      "title": "ad tempor",
+      "description": "Adipisicing quis consectetur veniam adipisicing exercitation in pariatur amet exercitation cillum irure. Magna ipsum do eu labore consectetur minim quis ipsum ipsum mollit quis consequat.",
+      "interviewer": "Angelica Black",
+      "type": "Bavardage",
+      "spatial": "Spain",
+      "language": "Français",
+      "created": 1992,
+      "master": "http://www.noiseaddicts.com/samples_1w72b820/3921.mp3"
+    },
+    {
+      "id": 29,
+      "title": "fugiat eiusmod",
+      "description": "Anim sint in do anim irure non cupidatat veniam cillum pariatur adipisicing laboris labore ea. Mollit irure aute laboris incididunt aliqua.",
+      "interviewer": "Rosalinda Kramer",
+      "type": "Dialogue",
+      "spatial": "Germany",
+      "language": "Alsacien",
+      "created": 1972,
+      "master": "http://www.noiseaddicts.com/samples_1w72b820/3921.mp3"
+    }
+  ]
+});
+
+export default Sound;
--- a/cms/app-client/app/router.js	Fri Jan 15 17:16:49 2016 +0100
+++ b/cms/app-client/app/router.js	Mon Jan 18 10:01:39 2016 +0100
@@ -6,11 +6,16 @@
 });
 
 Router.map(function() {
-  this.route('visus/visu-langues', { path: '/langues' });
-  this.route('visus/visu-carto', { path: '/cartographie' });
-  this.route('visus/visu-thematiques', { path: '/thematiques' });
-  this.route('visus/visu-discours', { path: '/discours' });
-  this.route('visus/visu-chrono', { path: '/chronologie' });
+  this.route('tabs/langues', { path: '/langues' });
+  this.route('tabs/carto', { path: '/cartographie' });
+  this.route('tabs/thematiques', { path: '/thematiques' });
+  this.route('tabs/discours', { path: '/discours' });
+  this.route('tabs/chrono', { path: '/chronologie' });
+});
+
+Router.reopen({
+  onUrlChange: function() {
+  }.observes('currentPath')
 });
 
 export default Router;
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/cms/app-client/app/routes/application.js	Mon Jan 18 10:01:39 2016 +0100
@@ -0,0 +1,34 @@
+import Ember from 'ember';
+
+export default Ember.Route.extend({
+  serializeQueryParam: function(value, urlKey, defaultValueType) {
+    if (urlKey === 'date') {
+      return value;
+    }
+    return '' + value;
+  },
+  deserializeQueryParam: function(value, urlKey, defaultValueType) {
+    if (urlKey === 'date') {
+      var arr = [];
+      for (var i = 0; i < value.length; i++) {
+        arr.push(parseInt(value[i]));
+      }
+      return arr;
+    }
+
+    return value;
+  },
+  model() {
+    return this.store.findAll('sound');
+  },
+  actions: {
+    willTransition: function(transition) {
+      var _this = this;
+      var queryParams = {};
+      this.controller.get('queryParams').map(function(elt, index){
+        queryParams[elt] = _this.controller.get(elt);
+      });
+      this.transitionTo({ queryParams: queryParams });
+    }
+  }
+});
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/cms/app-client/app/routes/tabs/carto.js	Mon Jan 18 10:01:39 2016 +0100
@@ -0,0 +1,12 @@
+import Ember from 'ember';
+
+export default Ember.Route.extend({
+  renderTemplate() {
+    this.render({ outlet: 'carto' });
+  },
+  actions: {
+    queryParamsDidChange: function() {
+      console.log("carto params");
+    },
+  }
+});
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/cms/app-client/app/routes/tabs/chrono.js	Mon Jan 18 10:01:39 2016 +0100
@@ -0,0 +1,10 @@
+import Ember from 'ember';
+
+export default Ember.Route.extend({
+  actions: {
+    queryParamsDidChange: function() {
+      console.log("chrono params");
+      // console.log("visu-chrono ?", this.controller.get('visu-chrono'));
+    },
+  }
+});
--- a/cms/app-client/app/styles/app.scss	Fri Jan 15 17:16:49 2016 +0100
+++ b/cms/app-client/app/styles/app.scss	Mon Jan 18 10:01:39 2016 +0100
@@ -1,11 +1,23 @@
 #corpus-app {
   border: 1px solid;
-  width: 940px;
-  height: 900px;
+  width: 1108px;
+  height: 600px;
   display: block;
   margin-left: auto;
   margin-right: auto;
   margin-bottom: 10px;
+
+  @import 'tabs/chrono';
+  @import 'tabs/carto';
+  @import 'tabs/langues';
+  @import 'tabs/discours';
+  @import 'tabs/thematiques';
+}
+
+.mapdiv{
+  width: 470px;
+  background-color: #FFFFFF;
+  height: 500px;
 }
 
 .corpus-app {
@@ -13,39 +25,30 @@
     @import 'container';
     @import 'player';
     @import 'results';
+    @import 'modal';
 
     &-container{
       display: block;
       width: 50%;
-      height: 900px;
+      height: 600px;
       float: left;
       border-top: none;
       border-right: 1px solid grey;
     }
     &-wrapper{
-      height: 900px;
+      height: 600px;
       display : flex;
       flex-flow: column;
       border: none;
-    }
-    &-player,
-    &-results {
       padding: 0 10px;
-      margin-bottom: 10px;
-      background-color: #eeeeee;
     }
     &-player{
       flex: 0 1 auto;
       float: left;
       border-left: none;
       border-top: none;
-    }
-    &-results {
-      flex: 1 1 auto;
-      float: left;
-      overflow: auto;
-      border-left: none;
-      border-top: none;
+      margin-bottom: 10px;
+      background-color: #eeeeee;
     }
   }
 }
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/cms/app-client/app/styles/modal.scss	Mon Jan 18 10:01:39 2016 +0100
@@ -0,0 +1,30 @@
+.overlay {
+    background-color: gray;
+    height: 100vh;
+    left: 0;
+    opacity: 0.77;
+    position: fixed;
+    right: 0;
+    top: 0;
+    z-index: 50;
+}
+
+.dialog {
+    background: #fff none repeat scroll 0 0;
+    border: 4px solid #ccc;
+    border-radius: 10px;
+    box-shadow: 0 0 10px #222;
+    height: 300px;
+    left: 50%;
+    margin-left: -250px;
+    margin-top: -150px;
+    padding: 10px;
+    position: fixed;
+    top: 50%;
+    width: 500px;
+    z-index: 50;
+}
+
+.dialog h1{
+  margin-top: 0;
+}
--- a/cms/app-client/app/styles/player.scss	Fri Jan 15 17:16:49 2016 +0100
+++ b/cms/app-client/app/styles/player.scss	Mon Jan 18 10:01:39 2016 +0100
@@ -0,0 +1,4 @@
+#audio-player{
+  display: block;
+  margin: 10px auto;
+}
--- a/cms/app-client/app/styles/results.scss	Fri Jan 15 17:16:49 2016 +0100
+++ b/cms/app-client/app/styles/results.scss	Mon Jan 18 10:01:39 2016 +0100
@@ -1,1 +1,83 @@
+.result-header,
+.result-list{
+  background-color: #eeeeee;
+}
 
+.result-header{
+  flex: 0 1 auto;
+  float: left;
+  border-left: none;
+  border-top: none;
+}
+
+.result-header .filters{
+  display: inline-block;
+  border-radius: 5px;
+  padding: 1px 5px;
+  color: #fff;
+}
+.result-header .filters.location{
+  background-color: #3985AB;
+}
+.result-header .filters.langue{
+  background-color: #B94A43;
+}
+.result-header .filters.discours{
+  background-color: #468842;
+}
+.result-header .filters.date{
+  background-color: #E50086;
+}
+.result-header .filters.thematique{
+  background-color: #F89406;
+}
+.result-header .fa{
+  display: inline-block;
+  margin-left: 5px;
+  position: relative;
+  top: 1px;
+  cursor: pointer;
+}
+
+.result-list{
+  flex: 1 1 auto;
+  float: left;
+  overflow: auto;
+  border: none;
+  padding: 10px;
+  margin-bottom: 10px;
+  background: #eeeeee;
+}
+
+.result-item {
+  margin-bottom: 1px;
+  height: 64px;
+  cursor: pointer;
+  padding: 5px;
+  overflow: hidden;
+  background-color: #fff;
+  border-bottom: 1px solid #eee;
+  color: #777;
+  transition: all 0.4s ease 0s;
+}
+.result-item:hover {
+  // box-shadow: -1px -1px 5px 0px rgba(0,0,0,0.75);
+}
+.result-item.details {
+  box-shadow: 0 8px 17px 0 rgba(0, 0, 0, 0.2), 0 6px 20px 0 rgba(0, 0, 0, 0.19);
+  margin: 1rem 0rem;
+  z-index: 200;
+  height: inherit;
+}
+
+.result-item .description{
+  margin-top: 10px;
+}
+
+.result-item.playing .fa {
+  // background: url('images/playing.gif') no-repeat;
+}
+
+.result-item button{
+  margin-top: 5px;
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/cms/app-client/app/styles/tabs/carto.scss	Mon Jan 18 10:01:39 2016 +0100
@@ -0,0 +1,4 @@
+#mapdiv{
+  width: 100%;
+  height: 500px;
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/cms/app-client/app/styles/tabs/chrono.scss	Mon Jan 18 10:01:39 2016 +0100
@@ -0,0 +1,19 @@
+#our_table ul {
+  margin: 0;
+}
+
+#our_table li {
+  width:40px;
+  height:40px;
+  text-align:center;
+  vertical-align:middle;
+  background-color:#B0D1D3;
+  display: inline-block;
+  margin: 1px -1px;
+  line-height: 30px;
+  cursor: pointer;
+}
+
+#our_table li.highlighted {
+  background-color:#2D7073;
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/cms/app-client/app/styles/tabs/discours.scss	Mon Jan 18 10:01:39 2016 +0100
@@ -0,0 +1,9 @@
+.left{
+  float: left;
+  margin-left: 50px;
+}
+
+.right{
+  float: right;
+  margin-right: 50px;
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/cms/app-client/app/styles/tabs/langues.scss	Mon Jan 18 10:01:39 2016 +0100
@@ -0,0 +1,45 @@
+#chart_div {
+  width: 560px;
+  height: 540px;
+  background: #ddd;
+}
+
+text {
+  pointer-events: none;
+}
+
+.grandparent text {
+  font-weight: bold;
+}
+
+rect {
+  /*fill: none;*/
+  stroke: #fff;
+}
+
+rect.parent,
+.grandparent rect {
+  stroke-width: 2px;
+}
+
+.grandparent rect {
+  fill: green;
+}
+
+.grandparent:hover rect {
+  fill: lightgreen;
+}
+
+.children rect.parent,
+.grandparent rect {
+  cursor: pointer;
+}
+
+.children rect.parent {
+  /*fill: #bbb;*/
+  fill-opacity: .5;
+}
+
+.children:hover rect.child {
+  /*fill: #bbb;*/
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/cms/app-client/app/styles/tabs/thematiques.scss	Mon Jan 18 10:01:39 2016 +0100
@@ -0,0 +1,47 @@
+input[type="text"] {
+  display: block;
+  margin: auto;
+  width: 250px;
+  font-family: sans-serif;
+  font-size: 18px;
+  appearance: none;
+  box-shadow: none;
+  border-radius: none;
+}
+input[type="text"]:focus {
+  outline: none;
+}
+
+.search-box{
+  display: block;
+    height: 100px;
+    width: 400px;
+    margin: 50px auto auto;
+}
+
+.search-box input[type="text"] {
+  padding: 10px;
+  border: none;
+  border-bottom: solid 2px #c9c9c9;
+  transition: border 0.3s;
+  outline: 30px solid #efefef;
+}
+.search-box input[type="text"]:focus,
+.search-box input[type="text"].focus {
+  border-bottom: solid 2px #969696;
+}
+
+.tag-cloud{
+  margin: 15px;
+  text-align: justify;
+}
+
+.not-popular{
+  font-size: 1em;
+}
+.popular{
+  font-size: 1.3em;
+}
+.very-popular{
+  font-size: 1.6em;
+}
--- a/cms/app-client/app/templates/application.hbs	Fri Jan 15 17:16:49 2016 +0100
+++ b/cms/app-client/app/templates/application.hbs	Mon Jan 18 10:01:39 2016 +0100
@@ -1,29 +1,12 @@
+<div id="info-modal"></div>
 <div class="corpus-app-container">
-  <ul class="corpus-app-em-tab-list">
-    {{#link-to 'visus/visu-langues' tagName="li" class='corpus-app-em-tab'}}
-      {{link-to 'Langues' 'visus/visu-langues'}}
-    {{/link-to}}
-    {{#link-to 'visus/visu-carto' tagName="li" class='corpus-app-em-tab'}}
-      {{link-to 'Cartographie' 'visus/visu-carto'}}
-    {{/link-to}}
-    {{#link-to 'visus/visu-thematiques' tagName="li" class='corpus-app-em-tab'}}
-      {{link-to 'Thématiques' 'visus/visu-thematiques'}}
-    {{/link-to}}
-    {{#link-to 'visus/visu-discours' tagName="li" class='corpus-app-em-tab'}}
-      {{link-to 'Discours' 'visus/visu-discours'}}
-    {{/link-to}}
-    {{#link-to 'visus/visu-chrono' tagName="li" class='corpus-app-em-tab'}}
-      {{link-to 'Chronologie' 'visus/visu-chrono'}}
-    {{/link-to}}
-  </ul>
   {{outlet}}
+  <div class="carto">{{outlet "carto"}}</div>
 </div>
 
 <div class="corpus-app-wrapper">
   <div class="corpus-app-player">
     {{partial "player"}}
   </div>
-  <div class="corpus-app-results">
-    {{partial "results"}}
-  </div>
+  {{partial "results"}}
 </div>
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/cms/app-client/app/templates/components/visu-carto.hbs	Mon Jan 18 10:01:39 2016 +0100
@@ -0,0 +1,1 @@
+<div id="mapdiv"></div>
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/cms/app-client/app/templates/components/visu-chrono.hbs	Mon Jan 18 10:01:39 2016 +0100
@@ -0,0 +1,74 @@
+<div cellpadding="0" cellspacing="0" id="our_table">
+  <ul id="1960"> 1960 -
+    <li class="0">0</li>
+    <li class="1">1</li>
+    <li class="2">2</li>
+    <li class="3">3</li>
+    <li class="4">4</li>
+    <li class="5">5</li>
+    <li class="6">6</li>
+    <li class="7">7</li>
+    <li class="8">8</li>
+    <li class="9">9</li>
+  </ul>
+  <ul id="1970"> 1970 -
+    <li class="0">0</li>
+    <li class="1">1</li>
+    <li class="2">2</li>
+    <li class="3">3</li>
+    <li class="4">4</li>
+    <li class="5">5</li>
+    <li class="6">6</li>
+    <li class="7">7</li>
+    <li class="8">8</li>
+    <li class="9">9</li>
+  </ul>
+  <ul id="1980"> 1980 -
+    <li class="0">0</li>
+    <li class="1">1</li>
+    <li class="2">2</li>
+    <li class="3">3</li>
+    <li class="4">4</li>
+    <li class="5">5</li>
+    <li class="6">6</li>
+    <li class="7">7</li>
+    <li class="8">8</li>
+    <li class="9">9</li>
+  </ul>
+  <ul id="1990"> 1990 -
+    <li class="0">0</li>
+    <li class="1">1</li>
+    <li class="2">2</li>
+    <li class="3">3</li>
+    <li class="4">4</li>
+    <li class="5">5</li>
+    <li class="6">6</li>
+    <li class="7">7</li>
+    <li class="8">8</li>
+    <li class="9">9</li>
+  </ul>
+  <ul id="2000"> 2000 -
+    <li class="0">0</li>
+    <li class="1">1</li>
+    <li class="2">2</li>
+    <li class="3">3</li>
+    <li class="4">4</li>
+    <li class="5">5</li>
+    <li class="6">6</li>
+    <li class="7">7</li>
+    <li class="8">8</li>
+    <li class="9">9</li>
+  </ul>
+  <ul id="2010"> 2010 -
+    <li class="0">0</li>
+    <li class="1">1</li>
+    <li class="2">2</li>
+    <li class="3">3</li>
+    <li class="4">4</li>
+    <li class="5">5</li>
+    <li class="6">6</li>
+    <li class="7">7</li>
+    <li class="8">8</li>
+    <li class="9">9</li>
+  </ul>
+</div>
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/cms/app-client/app/templates/components/visu-langues.hbs	Mon Jan 18 10:01:39 2016 +0100
@@ -0,0 +1,1 @@
+<div id="chart_div"></div>
--- a/cms/app-client/app/templates/player.hbs	Fri Jan 15 17:16:49 2016 +0100
+++ b/cms/app-client/app/templates/player.hbs	Mon Jan 18 10:01:39 2016 +0100
@@ -1,4 +1,26 @@
-<h2>This is the player</h2>
 <div class="corpus-app-content">
-  PLAYER
+  <audio id="audio-player" controls>
+    <source src="{{ currentItem.master }}" type="audio/ogg">
+    <source src="{{ currentItem.master }}" type="audio/mpeg">
+    <source src="{{ currentItem.master }}" type="audio/wav">
+    Your browser does not support the audio element.
+  </audio>
+  <p>
+    Title: {{ currentItem.title }}
+  </p>
+  <p>
+    Description: {{ currentItem.description }}
+  </p>
 </div>
+
+<div id="container">
+	<div id="audio_player">
+		<span class="btn btn_play" id="action_play" title="">Play</span>
+		<div class="background"></div>
+		<div class="progress">
+			<div class="slice">
+				<div class="pie"></div>
+			</div>
+		</div>
+	</div>
+</div>
--- a/cms/app-client/app/templates/results.hbs	Fri Jan 15 17:16:49 2016 +0100
+++ b/cms/app-client/app/templates/results.hbs	Mon Jan 18 10:01:39 2016 +0100
@@ -1,4 +1,50 @@
-<h2>This is the results</h2>
-<div class="corpus-app-content">
-  RESULTS
+<div class="result-header">
+  <h2>This is the results</h2>
+  <p>
+    Filtres:
+    {{#if location}}
+      <span class="filters location">{{location}}<span class="fa fa-times" {{action 'deleteTag' 'location'}}></span></span>
+    {{/if}}
+    {{#if langue}}
+      <span class="filters langue">{{langue}}<span class="fa fa-times" {{action 'deleteTag' 'langue'}}></span></span>
+    {{/if}}
+    {{#if discours}}
+      <span class="filters discours">{{discours}}<span class="fa fa-times" {{action 'deleteTag' 'discours'}}></span></span>
+    {{/if}}
+    {{#if date}}
+      {{#each date as |item| }}
+        <span class="filters date">{{item}}<span class="fa fa-times" {{action 'deleteTag' 'date' item }}></span></span>
+      {{/each}}
+    {{/if}}
+    {{#if thematique}}
+      <span class="filters thematique">{{thematique}}<span class="fa fa-times" {{action 'deleteTag' 'thematique'}}></span></span>
+    {{/if}}
+  </p>
 </div>
+<div class='result-list'>
+  {{#each filteredSounds as |item| }}
+    <div id="{{item.id}}" {{action "details" item}} class='result-item'>
+      <span class="fa fa-play-circle fa-lg fa-fw pull-right" {{action 'play' item}}></span>
+      <strong>{{ item.title }}</strong> - {{item.interviewer}}
+      <div class="description">
+        {{item.description}}
+      </div>
+      <button class="pull-right" {{action 'toggleModal' item}}>Details</button>
+    </div>
+  {{/each}}
+  {{#if isShowingModal}}
+    {{#ember-wormhole to='info-modal'}}
+      <div class="overlay" {{action 'toggleModal'}}></div>
+      <div class="dialog">
+        <h1>{{currentDetails.title}}</h1>
+        <p><b>Description: </b>{{currentDetails.description}}</p>
+        <p><b>Interviewer: </b>{{currentDetails.interviewer}}</p>
+        <p><b>Type de Discours: </b>{{currentDetails.type}}</p>
+        <p><b>Localisation: </b>{{currentDetails.spatial}}</p>
+        <p><b>Langue: </b>{{currentDetails.language}}</p>
+        <p><b>Date de Creation: </b>{{currentDetails.created}}</p>
+        <button class="pull-right" {{action 'toggleModal'}}>Close</button>
+      </div>
+    {{/ember-wormhole}}
+  {{/if}}
+</div>
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/cms/app-client/app/templates/tabs/carto.hbs	Mon Jan 18 10:01:39 2016 +0100
@@ -0,0 +1,1 @@
+{{visu-carto action="updateUrl" sounds=model}}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/cms/app-client/app/templates/tabs/chrono.hbs	Mon Jan 18 10:01:39 2016 +0100
@@ -0,0 +1,2 @@
+<h2>Selectionnez une date:</h2>
+{{visu-chrono action="updateUrl" query=model}}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/cms/app-client/app/templates/tabs/discours.hbs	Mon Jan 18 10:01:39 2016 +0100
@@ -0,0 +1,28 @@
+<div class='left'>
+  <p>Dialogue</p>
+  <p>Conversation</p>
+  <p>Entretien</p>
+  <p>Discussion</p>
+  <p>Bavardage</p>
+  <p>Argumentation</p>
+  <p>Négociation</p>
+  <p>Réunion</p>
+  <p>Discours</p>
+  <p>Lecture à haute voix</p>
+  <p>Récitation</p>
+  <p>Récit personnel</p>
+  <p>Séminaire</p>
+</div>
+<div class='right'>
+  <p>Colloque</p>
+  <p>Conte</p>
+  <p>Fable</p>
+  <p>Narration</p>
+  <p>Chanson</p>
+  <p>Enquête par téléphone</p>
+  <p>Questionnaire</p>
+  <p>Enquête</p>
+  <p>Enquêtes linguistiques</p>
+  <p>Enquêtes de terrain</p>
+  <p>Musique instrumentale</p>
+</div>
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/cms/app-client/app/templates/tabs/langues.hbs	Mon Jan 18 10:01:39 2016 +0100
@@ -0,0 +1,1 @@
+{{visu-langues action="updateUrl" query=model}}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/cms/app-client/app/templates/tabs/thematiques.hbs	Mon Jan 18 10:01:39 2016 +0100
@@ -0,0 +1,60 @@
+<div class="search-box">
+  <input type="text" placeholder="Entrez un mot clé">
+</div>
+
+<div class="tag-cloud">
+  <span class="popular">ipsum</span>
+  <span class="not-popular">dolor</span>
+  <span class="not-popular">sit</span>
+  <span class="popular">amet</span>
+  <span class="popular">consectetur</span>
+  <span class="not-popular">adipiscing</span>
+  <span class="very-popular">elit</span>
+  <span class="not-popular">Curabitur</span>
+  <span class="popular">non</span>
+  <span class="not-popular">ipsum</span>
+  <span class="very-popular">dolor</span>
+  <span class="not-popular">sit</span>
+  <span class="popular">amet</span>
+  <span class="popular">consectetur</span>
+  <span class="not-popular">adipiscing</span>
+  <span class="not-popular">elit</span>
+  <span class="popular">Curabitur</span>
+  <span class="not-popular">non</span>
+  <span class="popular">ipsum</span>
+  <span class="popular">dolor</span>
+  <span class="not-popular">sit</span>
+  <span class="not-popular">amet</span>
+  <span class="not-popular">consectetur</span>
+  <span class="not-popular">adipiscing</span>
+  <span class="very-popular">elit</span>
+  <span class="popular">Curabitur</span>
+  <span class="very-popular">non</span>
+  <span class="popular">ipsum</span>
+  <span class="not-popular">dolor</span>
+  <span class="not-popular">sit</span>
+  <span class="popular">amet</span>
+  <span class="popular">consectetur</span>
+  <span class="not-popular">adipiscing</span>
+  <span class="very-popular">elit</span>
+  <span class="not-popular">Curabitur</span>
+  <span class="popular">non</span>
+  <span class="not-popular">ipsum</span>
+  <span class="very-popular">dolor</span>
+  <span class="not-popular">sit</span>
+  <span class="popular">amet</span>
+  <span class="popular">consectetur</span>
+  <span class="not-popular">adipiscing</span>
+  <span class="not-popular">elit</span>
+  <span class="popular">Curabitur</span>
+  <span class="not-popular">non</span>
+  <span class="popular">ipsum</span>
+  <span class="popular">dolor</span>
+  <span class="not-popular">sit</span>
+  <span class="not-popular">amet</span>
+  <span class="not-popular">consectetur</span>
+  <span class="not-popular">adipiscing</span>
+  <span class="very-popular">elit</span>
+  <span class="popular">Curabitur</span>
+  <span class="very-popular">non</span>
+</div>
--- a/cms/app-client/app/templates/visus/visu-carto.hbs	Fri Jan 15 17:16:49 2016 +0100
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,3 +0,0 @@
-<h2>Recherche par cartographie</h2>
-<p>With a Logo !</p>
-<img src={{logoUrl}} alt="Logo">
--- a/cms/app-client/app/templates/visus/visu-chrono.hbs	Fri Jan 15 17:16:49 2016 +0100
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,1 +0,0 @@
-<h2>Recherche par chronologie</h2>
--- a/cms/app-client/app/templates/visus/visu-discours.hbs	Fri Jan 15 17:16:49 2016 +0100
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,1 +0,0 @@
-<h2>Recherche par discours</h2>
--- a/cms/app-client/app/templates/visus/visu-langues.hbs	Fri Jan 15 17:16:49 2016 +0100
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,1 +0,0 @@
-<h2>Recherche par langues</h2>
--- a/cms/app-client/app/templates/visus/visu-thematiques.hbs	Fri Jan 15 17:16:49 2016 +0100
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,1 +0,0 @@
-<h2>Recherche par thematiques</h2>
--- a/cms/app-client/bower.json	Fri Jan 15 17:16:49 2016 +0100
+++ b/cms/app-client/bower.json	Mon Jan 18 10:01:39 2016 +0100
@@ -12,6 +12,8 @@
     "jquery": "^1.11.3",
     "loader.js": "ember-cli/loader.js#3.2.1",
     "qunit": "~1.18.0",
-    "bootstrap-sass": "~3.3.5"
+    "bootstrap-sass": "~3.3.5",
+    "ammap3": "~3.18.6",
+    "font-awesome": "~4.4.0"
   }
 }
--- a/cms/app-client/config/environment.js	Fri Jan 15 17:16:49 2016 +0100
+++ b/cms/app-client/config/environment.js	Mon Jan 18 10:01:39 2016 +0100
@@ -5,8 +5,12 @@
     rootElement: '#corpus-app',
     modulePrefix: 'app-client',
     environment: environment,
-    baseURL: '/corpus',
-    locationType: 'auto',
+    baseURL: '/corpus/',
+    // locationType: '',
+    // contentSecurityPolicy: {
+    //   'default-src': "'none'",
+    //   'style-src': "'self' 'http://localhost:4200'"
+    // },
     APP: {
       baseStatic: '',
       // Here you can pass flags/options to your application instance
--- a/cms/app-client/ember-cli-build.js	Fri Jan 15 17:16:49 2016 +0100
+++ b/cms/app-client/ember-cli-build.js	Mon Jan 18 10:01:39 2016 +0100
@@ -26,6 +26,10 @@
   // modules that you would like to import into your application
   // please specify an object with the list of modules as keys
   // along with the exports of each module as its value.
+  app.import('bower_components/ammap3/ammap/ammap.js');
+  app.import('bower_components/ammap3/ammap/maps/js/worldLow.js');
+  app.import('bower_components/ammap3/ammap/maps/js/continentsLow.js');
+  app.import('bower_components/ammap3/ammap/maps/js/france2016Low.js');
 
   return app.toTree();
 };
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/cms/app-client/npm-debug.log	Mon Jan 18 10:01:39 2016 +0100
@@ -0,0 +1,45 @@
+0 info it worked if it ends with ok
+1 verbose cli [ '/usr/local/bin/node', '/usr/local/bin/npm', 'start' ]
+2 info using npm@3.5.2
+3 info using node@v5.2.0
+4 verbose run-script [ 'prestart', 'start', 'poststart' ]
+5 info lifecycle app-client@0.0.0~prestart: app-client@0.0.0
+6 silly lifecycle app-client@0.0.0~prestart: no script for prestart, continuing
+7 info lifecycle app-client@0.0.0~start: app-client@0.0.0
+8 verbose lifecycle app-client@0.0.0~start: unsafe-perm in lifecycle true
+9 verbose lifecycle app-client@0.0.0~start: PATH: /usr/local/lib/node_modules/npm/bin/node-gyp-bin:/Users/nowmad/workspace/IRI/corpus_parole/cms/app-client/node_modules/.bin:/Library/PostgreSQL/9.5/bin/:/usr/local/apache-ant/bin:/usr/local/bin:/usr/bin:/bin:/usr/sbin:/sbin:/Users/nowmad/Library/Android/sdk/tools:/Users/nowmad/Library/Android/sdk/platform-tools
+10 verbose lifecycle app-client@0.0.0~start: CWD: /Users/nowmad/workspace/IRI/corpus_parole/cms/app-client
+11 silly lifecycle app-client@0.0.0~start: Args: [ '-c', 'ember serve --environment=development' ]
+12 silly lifecycle app-client@0.0.0~start: Returned: code: 1  signal: null
+13 info lifecycle app-client@0.0.0~start: Failed to exec start script
+14 verbose stack Error: app-client@0.0.0 start: `ember serve --environment=development`
+14 verbose stack Exit status 1
+14 verbose stack     at EventEmitter.<anonymous> (/usr/local/lib/node_modules/npm/lib/utils/lifecycle.js:232:16)
+14 verbose stack     at emitTwo (events.js:88:13)
+14 verbose stack     at EventEmitter.emit (events.js:173:7)
+14 verbose stack     at ChildProcess.<anonymous> (/usr/local/lib/node_modules/npm/lib/utils/spawn.js:24:14)
+14 verbose stack     at emitTwo (events.js:88:13)
+14 verbose stack     at ChildProcess.emit (events.js:173:7)
+14 verbose stack     at maybeClose (internal/child_process.js:819:16)
+14 verbose stack     at Process.ChildProcess._handle.onexit (internal/child_process.js:212:5)
+15 verbose pkgid app-client@0.0.0
+16 verbose cwd /Users/nowmad/workspace/IRI/corpus_parole/cms/app-client
+17 error Darwin 15.2.0
+18 error argv "/usr/local/bin/node" "/usr/local/bin/npm" "start"
+19 error node v5.2.0
+20 error npm  v3.5.2
+21 error code ELIFECYCLE
+22 error app-client@0.0.0 start: `ember serve --environment=development`
+22 error Exit status 1
+23 error Failed at the app-client@0.0.0 start script 'ember serve --environment=development'.
+23 error Make sure you have the latest version of node.js and npm installed.
+23 error If you do, this is most likely a problem with the app-client package,
+23 error not with npm itself.
+23 error Tell the author that this fails on your system:
+23 error     ember serve --environment=development
+23 error You can get information on how to open an issue for this project with:
+23 error     npm bugs app-client
+23 error Or if that isn't available, you can get their info via:
+23 error     npm owner ls app-client
+23 error There is likely additional logging output above.
+24 verbose exit [ 1, true ]
--- a/cms/app-client/package.json	Fri Jan 15 17:16:49 2016 +0100
+++ b/cms/app-client/package.json	Mon Jan 18 10:01:39 2016 +0100
@@ -24,7 +24,9 @@
     "ember-cli-app-version": "0.5.0",
     "ember-cli-babel": "^5.1.3",
     "ember-cli-content-security-policy": "0.4.0",
+    "ember-cli-d3": "1.1.2",
     "ember-cli-dependency-checker": "^1.0.1",
+    "ember-cli-font-awesome": "1.3.0",
     "ember-cli-htmlbars": "0.7.9",
     "ember-cli-htmlbars-inline-precompile": "^0.2.0",
     "ember-cli-ic-ajax": "0.2.1",
@@ -36,6 +38,7 @@
     "ember-cli-uglify": "^1.2.0",
     "ember-data": "1.13.8",
     "ember-disable-proxy-controllers": "^1.0.0",
-    "ember-export-application-global": "^1.0.3"
+    "ember-export-application-global": "^1.0.3",
+    "ember-wormhole": "0.3.4"
   }
 }
Binary file cms/app-client/public/assets/images/play-button.png has changed
Binary file cms/app-client/public/assets/images/playing.gif has changed
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/cms/app-client/public/langues.json	Mon Jan 18 10:01:39 2016 +0100
@@ -0,0 +1,195 @@
+{
+ "name": "Global",
+ "children": [
+  {
+    "id": "id de langue (code Lexvo de la langues)",
+    "name": "Français",
+    "value": 859,
+    "color": "lightblue"
+  },
+  {
+    "name": "Alsacien",
+    "value": 851
+  },
+  {
+    "name": "Breton",
+    "value": 403
+  },
+  {
+    "name": "Occitan",
+    "value": 344
+  },
+  {
+    "name": "Judéo-espagnol",
+    "value": 77
+  },
+  {
+    "name": "Undetermined",
+    "value": 45
+  },
+  {
+    "name": "Langues régionales",
+    "value": 175,
+    "children": [
+      {
+        "name": "Langues d'oïl",
+        "value": 75
+      },
+      {
+        "name": "Francoprovençal",
+        "value": 60
+      },
+      {
+        "name": "Corse",
+        "value": 40
+      }
+    ]
+  },
+  {
+    "name": "Langues non territoriales",
+    "value": 48,
+    "children": [
+      {
+        "name": "Langue des signes française (LSF)",
+        "value": 40
+      },
+      {
+        "name": "Berbère",
+        "value": 8
+      }
+    ]
+  },
+  {
+    "name": "Les Creoles",
+    "value": 47,
+    "children": [
+      {
+        "name": "Creole de la Réunion",
+        "value": 32
+      },
+      {
+        "name": "Creole de la Guadeloupe",
+        "value": 15
+      }
+    ]
+  },
+  {
+    "name": "Guyane",
+    "value": 59,
+    "children": [
+      {
+        "name": "Ndyuka-Trio Pidgin (njt)",
+        "value": 31
+      },
+      {
+        "name": "Palikúr (plu)",
+        "value": 6
+      },
+      {
+        "name": "Guianese Creole French (gcr)",
+        "value": 4
+      },
+      {
+        "name": "Eastern Maroon Creole (djk)",
+        "value": 16
+      },
+      {
+        "name": "Sranan Tongo (srn)",
+        "value": 2
+      }
+    ]
+  },
+  {
+    "name": "Mayotte",
+    "value": 20,
+    "children": [
+      {
+        "name": "Maore Comorian (swb)",
+        "value": 2
+      },
+      {
+        "name": "Mauritian Sign Language (lsy)",
+        "value": 18
+      }
+    ]
+  },
+  {
+    "name": "Polynésie française",
+    "value": 13,
+    "children": [
+      {
+        "name": "West Uvean (uve)",
+        "value": 13
+      }
+    ]
+  },
+  {
+    "name": "Wallis et Futuna",
+    "value": 43,
+    "children": [
+      {
+        "name": "LanEast Futuna (fud)",
+        "value": 23
+      },
+      {
+        "name": "Wallisian (wls)",
+        "value": 20
+      }
+    ]
+  },
+  {
+    "name": "Nouvelle-Calédonie",
+    "value": 68,
+    "children": [
+      {
+        "name": "Wallisian (wls)",
+        "value": 15
+      },
+      {
+        "name": "Xârâcùù (ane)",
+        "value": 12
+      },
+      {
+        "name": "Cemuhî (cam)",
+        "value": 9
+      },
+      {
+        "name": "Xaragure (axx)",
+        "value": 9
+      },
+      {
+        "name": "Iaai (iai)",
+        "value": 8
+      },
+      {
+        "name": "Nêlêmwa-Nixumwak (nee)",
+        "value": 4
+      },
+      {
+        "name": "Dehu (dhv)",
+        "value": 2
+      },
+      {
+        "name": "Nengone (nen)",
+        "value": 2
+      },
+      {
+        "name": "Ajië (aji)",
+        "value": 1
+      },
+      {
+        "name": "Numee (kdk)",
+        "value": 1
+      },
+      {
+        "name": "Yuaga (nua)",
+        "value": 1
+      },
+      {
+        "name": "Bwatoo (bwa)",
+        "value": 4
+      }
+    ]
+  }
+ ]
+}
--- a/cms/app-client/public/styles.css	Fri Jan 15 17:16:49 2016 +0100
+++ b/cms/app-client/public/styles.css	Mon Jan 18 10:01:39 2016 +0100
@@ -3,9 +3,9 @@
 }
 .header {
   /*background-color: green;*/
-  width: 940px;
+  width: 1108px;
   height: 90px;
-  display: block;
+  display: table;
   margin-left: auto;
   margin-right: auto;
   margin-bottom: 1px;
@@ -37,8 +37,8 @@
   position:relative;
   left:50%;
   padding: 0;
-  display: inline-block;
-  width: 100%;
+  display: table;
+  width: auto;
   float: none;
   margin: 0 auto 0 auto;
 }
@@ -64,3 +64,8 @@
   font-weight: 900;
   background-color: bisque;
 }
+
+.sub-menu{
+  margin-right: 10px;
+  cursor: pointer;
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/cms/app-client/tests/integration/components/visu-carto-test.js	Mon Jan 18 10:01:39 2016 +0100
@@ -0,0 +1,26 @@
+import { moduleForComponent, test } from 'ember-qunit';
+import hbs from 'htmlbars-inline-precompile';
+
+moduleForComponent('visu-carto', 'Integration | Component | visu carto', {
+  integration: true
+});
+
+test('it renders', function(assert) {
+  assert.expect(2);
+
+  // Set any properties with this.set('myProperty', 'value');
+  // Handle any actions with this.on('myAction', function(val) { ... });
+
+  this.render(hbs`{{visu-carto}}`);
+
+  assert.equal(this.$().text().trim(), '');
+
+  // Template block usage:
+  this.render(hbs`
+    {{#visu-carto}}
+      template block text
+    {{/visu-carto}}
+  `);
+
+  assert.equal(this.$().text().trim(), 'template block text');
+});
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/cms/app-client/tests/integration/components/visu-chrono-test.js	Mon Jan 18 10:01:39 2016 +0100
@@ -0,0 +1,26 @@
+import { moduleForComponent, test } from 'ember-qunit';
+import hbs from 'htmlbars-inline-precompile';
+
+moduleForComponent('visu-chrono', 'Integration | Component | visu chrono', {
+  integration: true
+});
+
+test('it renders', function(assert) {
+  assert.expect(2);
+
+  // Set any properties with this.set('myProperty', 'value');
+  // Handle any actions with this.on('myAction', function(val) { ... });
+
+  this.render(hbs`{{visu-chrono}}`);
+
+  assert.equal(this.$().text().trim(), '');
+
+  // Template block usage:
+  this.render(hbs`
+    {{#visu-chrono}}
+      template block text
+    {{/visu-chrono}}
+  `);
+
+  assert.equal(this.$().text().trim(), 'template block text');
+});
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/cms/app-client/tests/integration/components/visu-langues-test.js	Mon Jan 18 10:01:39 2016 +0100
@@ -0,0 +1,26 @@
+import { moduleForComponent, test } from 'ember-qunit';
+import hbs from 'htmlbars-inline-precompile';
+
+moduleForComponent('visu-langues', 'Integration | Component | visu langues', {
+  integration: true
+});
+
+test('it renders', function(assert) {
+  assert.expect(2);
+
+  // Set any properties with this.set('myProperty', 'value');
+  // Handle any actions with this.on('myAction', function(val) { ... });
+
+  this.render(hbs`{{visu-langues}}`);
+
+  assert.equal(this.$().text().trim(), '');
+
+  // Template block usage:
+  this.render(hbs`
+    {{#visu-langues}}
+      template block text
+    {{/visu-langues}}
+  `);
+
+  assert.equal(this.$().text().trim(), 'template block text');
+});
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/cms/app-client/tests/unit/adapters/application-test.js	Mon Jan 18 10:01:39 2016 +0100
@@ -0,0 +1,12 @@
+import { moduleFor, test } from 'ember-qunit';
+
+moduleFor('adapter:application', 'Unit | Adapter | application', {
+  // Specify the other units that are required for this test.
+  // needs: ['serializer:foo']
+});
+
+// Replace this with your real tests.
+test('it exists', function(assert) {
+  var adapter = this.subject();
+  assert.ok(adapter);
+});
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/cms/app-client/tests/unit/controllers/results-test.js	Mon Jan 18 10:01:39 2016 +0100
@@ -0,0 +1,12 @@
+import { moduleFor, test } from 'ember-qunit';
+
+moduleFor('controller:results', {
+  // Specify the other units that are required for this test.
+  // needs: ['controller:foo']
+});
+
+// Replace this with your real tests.
+test('it exists', function(assert) {
+  var controller = this.subject();
+  assert.ok(controller);
+});
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/cms/app-client/tests/unit/models/sound-test.js	Mon Jan 18 10:01:39 2016 +0100
@@ -0,0 +1,12 @@
+import { moduleForModel, test } from 'ember-qunit';
+
+moduleForModel('sound', 'Unit | Model | sound', {
+  // Specify the other units that are required for this test.
+  needs: []
+});
+
+test('it exists', function(assert) {
+  var model = this.subject();
+  // var store = this.store();
+  assert.ok(!!model);
+});
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/cms/app-client/tests/unit/routes/application-test.js	Mon Jan 18 10:01:39 2016 +0100
@@ -0,0 +1,11 @@
+import { moduleFor, test } from 'ember-qunit';
+
+moduleFor('route:application', 'Unit | Route | application', {
+  // Specify the other units that are required for this test.
+  // needs: ['controller:foo']
+});
+
+test('it exists', function(assert) {
+  var route = this.subject();
+  assert.ok(route);
+});
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/cms/app-client/tests/unit/routes/results-test.js	Mon Jan 18 10:01:39 2016 +0100
@@ -0,0 +1,11 @@
+import { moduleFor, test } from 'ember-qunit';
+
+moduleFor('route:results', 'Unit | Route | results', {
+  // Specify the other units that are required for this test.
+  // needs: ['controller:foo']
+});
+
+test('it exists', function(assert) {
+  var route = this.subject();
+  assert.ok(route);
+});
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/cms/app-client/tests/unit/routes/sound-test.js	Mon Jan 18 10:01:39 2016 +0100
@@ -0,0 +1,11 @@
+import { moduleFor, test } from 'ember-qunit';
+
+moduleFor('route:sound', 'Unit | Route | sound', {
+  // Specify the other units that are required for this test.
+  // needs: ['controller:foo']
+});
+
+test('it exists', function(assert) {
+  var route = this.subject();
+  assert.ok(route);
+});
--- a/cms/corpus_module/corpus.module	Fri Jan 15 17:16:49 2016 +0100
+++ b/cms/corpus_module/corpus.module	Mon Jan 18 10:01:39 2016 +0100
@@ -38,12 +38,13 @@
    '#tag' => 'meta', // The #tag is the html tag - <link />
    '#attributes' => array( // Set up an array of attributes inside the tag
      'name' => 'app-client/config/environment',
-     'content' => '%7B%22rootElement%22%3A%22%23corpus-app%22%2C%22modulePrefix%22%3A%22app-client%22%2C%22environment%22%3A%22production%22%2C%22baseURL%22%3A%22/corpus%22%2C%22locationType%22%3A%22auto%22%2C%22APP%22%3A%7B%22baseStatic%22%3A%22/'.drupal_get_path('module', 'corpus').'/app-client/%22%2C%22name%22%3A%22app-client%22%2C%22version%22%3A%220.0.0+%22%7D%2C%22contentSecurityPolicyHeader%22%3A%22Content-Security-Policy-Report-Only%22%2C%22contentSecurityPolicy%22%3A%7B%22default-src%22%3A%22%27none%27%22%2C%22script-src%22%3A%22%27self%27%22%2C%22font-src%22%3A%22%27self%27%22%2C%22connect-src%22%3A%22%27self%27%22%2C%22img-src%22%3A%22%27self%27%22%2C%22style-src%22%3A%22%27self%27%22%2C%22media-src%22%3A%22%27self%27%22%7D%2C%22exportApplicationGlobal%22%3Afalse%7D'
+     'content' => '%7B%22rootElement%22%3A%22%23corpus-app%22%2C%22modulePrefix%22%3A%22app-client%22%2C%22environment%22%3A%22production%22%2C%22baseURL%22%3A%22/corpus%22%2C%22APP%22%3A%7B%22baseStatic%22%3A%22%22%2C%22name%22%3A%22app-client%22%2C%22version%22%3A%220.0.0+%22%7D%2C%22contentSecurityPolicyHeader%22%3A%22Content-Security-Policy-Report-Only%22%2C%22contentSecurityPolicy%22%3A%7B%22default-src%22%3A%22%27none%27%22%2C%22script-src%22%3A%22%27self%27%20%27unsafe-eval%27%22%2C%22font-src%22%3A%22%27self%27%22%2C%22connect-src%22%3A%22%27self%27%22%2C%22img-src%22%3A%22%27self%27%22%2C%22style-src%22%3A%22%27self%27%22%2C%22media-src%22%3A%22%27self%27%22%7D%2C%22exportApplicationGlobal%22%3Atrue%7D'
    ),
  );
 
  drupal_add_html_head($element, 'ember_init');
 
+ drupal_add_js("https://www.google.com/jsapi?autoload={'modules':[{'name':'visualization','version':'1.1','packages':['treemap']}]}");
  drupal_add_js("{$path}/assets/vendor.js");
  drupal_add_css("{$path}/assets/vendor.css");
  drupal_add_css("{$path}/assets/{$app}.css");
@@ -51,5 +52,5 @@
  drupal_add_js("{$path}/assets/{$app}.js", array('type' => 'file', 'scope' => 'footer'));
  // drupal_add_js("{$path}/dist/assets/{$app}.js");
 
- return "<div id='corpus-app'></div>";
+ return "<div id='corpus-app' class='corpus-app'></div>";
 }