diff --git a/app/assets/javascripts/application.js b/app/assets/javascripts/application.js
index 14f565fa..03dac4fb 100644
--- a/app/assets/javascripts/application.js
+++ b/app/assets/javascripts/application.js
@@ -13,37 +13,11 @@
//= require jquery
//= require jquery-ui
//= require jquery_ujs
-//= require ./webpacked/metamaps.bundle
//= require_directory ./lib
-//= require ./src/Metamaps.GlobalUI
-//= require ./src/Metamaps.Router
-//= require ./src/Metamaps.Backbone
-//= require ./src/Metamaps.Views
+//= require ./src/JIT
+//= require ./src/Metamaps.Erb
+//= require ./webpacked/metamaps.bundle
//= require ./src/views/chatView
//= require ./src/views/videoView
//= require ./src/views/room
-//= require ./src/JIT
//= require ./src/check-canvas-support
-//= require ./src/Metamaps
-//= require ./src/Metamaps.Create
-//= require ./src/Metamaps.TopicCard
-//= require ./src/Metamaps.SynapseCard
-//= require ./src/Metamaps.Visualize
-//= require ./src/Metamaps.Util
-//= require ./src/Metamaps.Realtime
-//= require ./src/Metamaps.Control
-//= require ./src/Metamaps.Filter
-//= require ./src/Metamaps.Listeners
-//= require ./src/Metamaps.Organize
-//= require ./src/Metamaps.Topic
-//= require ./src/Metamaps.Synapse
-//= require ./src/Metamaps.Map
-//= require ./src/Metamaps.Account
-//= require ./src/Metamaps.Mapper
-//= require ./src/Metamaps.Mobile
-//= require ./src/Metamaps.Admin
-//= require ./src/Metamaps.Import
-//= require ./src/Metamaps.AutoLayout
-//= require ./src/Metamaps.PasteInput
-//= require ./src/Metamaps.JIT
-//= require ./src/Metamaps.Debug
diff --git a/app/assets/javascripts/src/Metamaps.Erb.js.erb b/app/assets/javascripts/src/Metamaps.Erb.js.erb
new file mode 100644
index 00000000..90eba5e5
--- /dev/null
+++ b/app/assets/javascripts/src/Metamaps.Erb.js.erb
@@ -0,0 +1,18 @@
+/* global Metamaps */
+
+/*
+ * Metamaps.Erb.js.erb
+ */
+
+/* erb variables from rails */
+window.Metamaps = window.Metamaps || {}
+Metamaps.Erb = {}
+Metamaps.Erb['REALTIME_SERVER'] = '<%= ENV['REALTIME_SERVER'] %>'
+Metamaps.Erb['junto_spinner_darkgrey.gif'] = '<%= asset_path('junto_spinner_darkgrey.gif') %>'
+Metamaps.Erb['user.png'] = '<%= asset_path('user.png') %>'
+Metamaps.Erb['icons/wildcard.png'] = '<%= asset_path('icons/wildcard.png') %>'
+Metamaps.Erb['topic_description_signifier.png'] = '<%= asset_path('topic_description_signifier.png') %>'
+Metamaps.Erb['topic_link_signifier.png'] = '<%= asset_path('topic_link_signifier.png') %>'
+Metamaps.Erb['synapse16.png'] = '<%= asset_path('synapse16.png') %>'
+Metamaps.Metacodes = <%= Metacode.all.to_json.gsub(%r[(icon.*?)(\"},)], '\1?purple=stupid\2').html_safe %>
+Metamaps.VERSION = '<%= METAMAPS_VERSION %>'
diff --git a/app/assets/javascripts/src/Metamaps.GlobalUI.js b/app/assets/javascripts/src/Metamaps.GlobalUI.js
deleted file mode 100644
index a6466fdc..00000000
--- a/app/assets/javascripts/src/Metamaps.GlobalUI.js
+++ /dev/null
@@ -1,717 +0,0 @@
-var Metamaps = window.Metamaps || {}; // this variable declaration defines a Javascript object that will contain all the variables and functions used by us, broken down into 'sub-modules' that look something like this
-/*
-
-* unless you are on a page with the Javascript InfoVis Toolkit (Topic or Map) the only section in the metamaps
-* object will be these
-GlobalUI
-Active
-Maps
-Mappers
-Backbone
-
-* all these get added when you are on a page with the Javascript Infovis Toolkit
-Settings
-Touch
-Mouse
-Selected
-Metacodes
-Topics
-Synapses
-Mappings
-Create
-TopicCard
-SynapseCard
-Visualize
-Util
-Realtime
-Control
-Filter
-Listeners
-Organize
-Map
-Mapper
-Topic
-Synapse
-JIT
-*/
-
-Metamaps.Active = {
- Map: null,
- Topic: null,
- Mapper: null
-};
-Metamaps.Maps = {};
-
-$(document).ready(function () {
- // initialize all the modules
- for (var prop in Metamaps) {
- // this runs the init function within each sub-object on the Metamaps one
- if (Metamaps.hasOwnProperty(prop) &&
- Metamaps[prop] != null &&
- Metamaps[prop].hasOwnProperty('init') &&
- typeof (Metamaps[prop].init) == 'function'
- ) {
- Metamaps[prop].init()
- }
- }
- // load whichever page you are on
- if (Metamaps.currentSection === "explore") {
- var capitalize = Metamaps.currentPage.charAt(0).toUpperCase() + Metamaps.currentPage.slice(1)
-
- Metamaps.Views.exploreMaps.setCollection( Metamaps.Maps[capitalize] )
- if (Metamaps.currentPage === "mapper") {
- Metamaps.Views.exploreMaps.fetchUserThenRender()
- }
- else {
- Metamaps.Views.exploreMaps.render()
- }
- Metamaps.GlobalUI.showDiv('#explore')
- }
- else if (Metamaps.currentSection === "" && Metamaps.Active.Mapper) {
- Metamaps.Views.exploreMaps.setCollection(Metamaps.Maps.Active)
- Metamaps.Views.exploreMaps.render()
- Metamaps.GlobalUI.showDiv('#explore')
- }
- else if (Metamaps.Active.Map || Metamaps.Active.Topic) {
- Metamaps.Loading.show()
- Metamaps.JIT.prepareVizData()
- Metamaps.GlobalUI.showDiv('#infovis')
- }
-});
-
-Metamaps.GlobalUI = {
- notifyTimeout: null,
- lightbox: null,
- init: function () {
- var self = Metamaps.GlobalUI;
-
- self.Search.init();
- self.CreateMap.init();
- self.Account.init();
-
- if ($('#toast').html().trim()) self.notifyUser($('#toast').html())
-
- //bind lightbox clicks
- $('.openLightbox').click(function (event) {
- self.openLightbox($(this).attr('data-open'));
- event.preventDefault();
- return false;
- });
-
- $('#lightbox_screen, #lightbox_close').click(self.closeLightbox);
-
- // initialize global backbone models and collections
- if (Metamaps.Active.Mapper) Metamaps.Active.Mapper = new Metamaps.Backbone.Mapper(Metamaps.Active.Mapper);
-
- var myCollection = Metamaps.Maps.Mine ? Metamaps.Maps.Mine : [];
- var sharedCollection = Metamaps.Maps.Shared ? Metamaps.Maps.Shared : [];
- var starredCollection = Metamaps.Maps.Starred ? Metamaps.Maps.Starred : [];
- var mapperCollection = [];
- var mapperOptionsObj = {id: 'mapper', sortBy: 'updated_at' };
- if (Metamaps.Maps.Mapper) {
- mapperCollection = Metamaps.Maps.Mapper.models;
- mapperOptionsObj.mapperId = Metamaps.Maps.Mapper.id;
- }
- var featuredCollection = Metamaps.Maps.Featured ? Metamaps.Maps.Featured : [];
- var activeCollection = Metamaps.Maps.Active ? Metamaps.Maps.Active : [];
- Metamaps.Maps.Mine = new Metamaps.Backbone.MapsCollection(myCollection, {id: 'mine', sortBy: 'updated_at' });
- Metamaps.Maps.Shared = new Metamaps.Backbone.MapsCollection(sharedCollection, {id: 'shared', sortBy: 'updated_at' });
- Metamaps.Maps.Starred = new Metamaps.Backbone.MapsCollection(starredCollection, {id: 'starred', sortBy: 'updated_at' });
- // 'Mapper' refers to another mapper
- Metamaps.Maps.Mapper = new Metamaps.Backbone.MapsCollection(mapperCollection, mapperOptionsObj);
- Metamaps.Maps.Featured = new Metamaps.Backbone.MapsCollection(featuredCollection, {id: 'featured', sortBy: 'updated_at' });
- Metamaps.Maps.Active = new Metamaps.Backbone.MapsCollection(activeCollection, {id: 'active', sortBy: 'updated_at' });
- },
- showDiv: function (selector) {
- $(selector).show()
- $(selector).animate({
- opacity: 1
- }, 200, 'easeOutCubic')
- },
- hideDiv: function (selector) {
- $(selector).animate({
- opacity: 0
- }, 200, 'easeInCubic', function () { $(this).hide() })
- },
- openLightbox: function (which) {
- var self = Metamaps.GlobalUI;
-
- $('.lightboxContent').hide();
- $('#' + which).show();
-
- self.lightbox = which;
-
- $('#lightbox_overlay').show();
-
- var heightOfContent = '-' + ($('#lightbox_main').height() / 2) + 'px';
- // animate the content in from the bottom
- $('#lightbox_main').animate({
- 'top': '50%',
- 'margin-top': heightOfContent
- }, 200, 'easeOutCubic');
-
- // fade the black overlay in
- $('#lightbox_screen').animate({
- 'opacity': '0.42'
- }, 200);
-
- if (which == "switchMetacodes") {
- Metamaps.Create.isSwitchingSet = true;
- }
- },
-
- closeLightbox: function (event) {
- var self = Metamaps.GlobalUI;
-
- if (event) event.preventDefault();
-
- // animate the lightbox content offscreen
- $('#lightbox_main').animate({
- 'top': '100%',
- 'margin-top': '0'
- }, 200, 'easeInCubic');
-
- // fade the black overlay out
- $('#lightbox_screen').animate({
- 'opacity': '0.0'
- }, 200, function () {
- $('#lightbox_overlay').hide();
- });
-
- if (self.lightbox === 'forkmap') Metamaps.GlobalUI.CreateMap.reset('fork_map');
- if (self.lightbox === 'newmap') Metamaps.GlobalUI.CreateMap.reset('new_map');
- if (Metamaps.Create && Metamaps.Create.isSwitchingSet) {
- Metamaps.Create.cancelMetacodeSetSwitch();
- }
- self.lightbox = null;
- },
- notifyUser: function (message, leaveOpen) {
- var self = Metamaps.GlobalUI;
-
- $('#toast').html(message)
- self.showDiv('#toast')
- clearTimeout(self.notifyTimeOut);
- if (!leaveOpen) {
- self.notifyTimeOut = setTimeout(function () {
- self.hideDiv('#toast')
- }, 8000);
- }
- },
- clearNotify: function() {
- var self = Metamaps.GlobalUI;
-
- clearTimeout(self.notifyTimeOut);
- self.hideDiv('#toast')
- },
- shareInvite: function(inviteLink) {
- window.prompt("To copy the invite link, press: Ctrl+C, Enter", inviteLink);
- }
-};
-
-Metamaps.GlobalUI.CreateMap = {
- newMap: null,
- emptyMapForm: "",
- emptyForkMapForm: "",
- topicsToMap: [],
- synapsesToMap: [],
- init: function () {
- var self = Metamaps.GlobalUI.CreateMap;
-
- self.newMap = new Metamaps.Backbone.Map({ permission: 'commons' });
-
- self.bindFormEvents();
-
- self.emptyMapForm = $('#new_map').html();
-
- },
- bindFormEvents: function () {
- var self = Metamaps.GlobalUI.CreateMap;
-
- $('.new_map input, .new_map div').unbind('keypress').bind('keypress', function(event) {
- if (event.keyCode === 13) self.submit()
- })
-
- $('.new_map button.cancel').unbind().bind('click', function (event) {
- event.preventDefault();
- Metamaps.GlobalUI.closeLightbox();
- });
- $('.new_map button.submitMap').unbind().bind('click', self.submit);
-
- // bind permission changer events on the createMap form
- $('.permIcon').unbind().bind('click', self.switchPermission);
- },
- closeSuccess: function () {
- $('#mapCreatedSuccess').fadeOut(300, function(){
- $(this).remove();
- });
- },
- generateSuccessMessage: function (id) {
- var stringStart = "
";
- return stringStart + page + stringEnd;
- },
- switchPermission: function () {
- var self = Metamaps.GlobalUI.CreateMap;
-
- self.newMap.set('permission', $(this).attr('data-permission'));
- $(this).siblings('.permIcon').find('.mapPermIcon').removeClass('selected');
- $(this).find('.mapPermIcon').addClass('selected');
-
- var permText = $(this).find('.tip').html();
- $(this).parents('.new_map').find('.permText').html(permText);
- },
- submit: function (event) {
- if (event) event.preventDefault();
-
- var self = Metamaps.GlobalUI.CreateMap;
-
- if (Metamaps.GlobalUI.lightbox === 'forkmap') {
- self.newMap.set('topicsToMap', self.topicsToMap);
- self.newMap.set('synapsesToMap', self.synapsesToMap);
- }
-
- var formId = Metamaps.GlobalUI.lightbox === 'forkmap' ? '#fork_map' : '#new_map';
- var $form = $(formId);
-
- self.newMap.set('name', $form.find('#map_name').val());
- self.newMap.set('desc', $form.find('#map_desc').val());
-
- if (self.newMap.get('name').length===0){
- self.throwMapNameError();
- return;
- }
-
- self.newMap.save(null, {
- success: self.success
- // TODO add error message
- });
-
- Metamaps.GlobalUI.closeLightbox();
- Metamaps.GlobalUI.notifyUser('Working...');
- },
- throwMapNameError: function () {
- var self = Metamaps.GlobalUI.CreateMap;
-
- var formId = Metamaps.GlobalUI.lightbox === 'forkmap' ? '#fork_map' : '#new_map';
- var $form = $(formId);
-
- var message = $("Please enter a map name...
");
-
- $form.find('#map_name').after(message);
- setTimeout(function(){
- message.fadeOut('fast', function(){
- message.remove();
- });
- }, 5000);
- },
- success: function (model) {
- var self = Metamaps.GlobalUI.CreateMap;
-
- //push the new map onto the collection of 'my maps'
- Metamaps.Maps.Mine.add(model);
-
- var formId = Metamaps.GlobalUI.lightbox === 'forkmap' ? '#fork_map' : '#new_map';
- var form = $(formId);
-
- Metamaps.GlobalUI.clearNotify();
- $('#wrapper').append(self.generateSuccessMessage(model.id));
-
- },
- reset: function (id) {
- var self = Metamaps.GlobalUI.CreateMap;
-
- var form = $('#' + id);
-
- if (id === "fork_map") {
- self.topicsToMap = [];
- self.synapsesToMap = [];
- form.html(self.emptyForkMapForm);
- }
- else {
- form.html(self.emptyMapForm);
- }
-
- self.bindFormEvents();
- self.newMap = new Metamaps.Backbone.Map({ permission: 'commons' });
-
- return false;
- },
-};
-
-
-Metamaps.GlobalUI.Account = {
- isOpen: false,
- changing: false,
- init: function () {
- var self = Metamaps.GlobalUI.Account;
-
- $('.sidebarAccountIcon').click(self.toggleBox);
- $('.sidebarAccountBox').click(function(event){
- event.stopPropagation();
- });
- $('body').click(self.close);
- },
- toggleBox: function (event) {
- var self = Metamaps.GlobalUI.Account;
-
- if (self.isOpen) self.close();
- else self.open();
-
- event.stopPropagation();
- },
- open: function () {
- var self = Metamaps.GlobalUI.Account;
-
- Metamaps.Filter.close();
- $('.sidebarAccountIcon .tooltipsUnder').addClass('hide');
-
-
- if (!self.isOpen && !self.changing) {
- self.changing = true;
- $('.sidebarAccountBox').fadeIn(200, function () {
- self.changing = false;
- self.isOpen = true;
- $('.sidebarAccountBox #user_email').focus();
- });
- }
- },
- close: function () {
- var self = Metamaps.GlobalUI.Account;
-
- $('.sidebarAccountIcon .tooltipsUnder').removeClass('hide');
- if (!self.changing) {
- self.changing = true;
- $('.sidebarAccountBox #user_email').blur();
- $('.sidebarAccountBox').fadeOut(200, function () {
- self.changing = false;
- self.isOpen = false;
- });
- }
- }
-};
-
-
-
-Metamaps.GlobalUI.Search = {
- locked: false,
- isOpen: false,
- limitTopicsToMe: false,
- limitMapsToMe: false,
- timeOut: null,
- changing: false,
- optionsInitialized: false,
- init: function () {
- var self = Metamaps.GlobalUI.Search;
-
- var loader = new CanvasLoader('searchLoading');
- loader.setColor('#4fb5c0'); // default is '#000000'
- loader.setDiameter(24); // default is 40
- loader.setDensity(41); // default is 40
- loader.setRange(0.9); // default is 1.3
- loader.show(); // Hidden by default
-
- // bind the hover events
- $(".sidebarSearch").hover(function () {
- self.open()
- }, function () {
- self.close(800, false)
- });
-
- $('.sidebarSearchIcon').click(function (e) {
- $('.sidebarSearchField').focus();
- });
- $('.sidebarSearch').click(function (e) {
- e.stopPropagation();
- });
- $('body').click(function (e) {
- self.close(0, false);
- });
-
- // open if the search is closed and user hits ctrl+/
- // close if they hit ESC
- $('body').bind('keyup', function (e) {
- switch (e.which) {
- case 191:
- if ((e.ctrlKey && !self.isOpen) || (e.ctrlKey && self.locked)) {
- self.open(true); // true for focus
- }
- break;
- case 27:
- if (self.isOpen) {
- self.close(0, true);
- }
- break;
-
- default:
- break; //console.log(e.which);
- }
- });
-
- self.startTypeahead();
- },
- lock: function() {
- var self = Metamaps.GlobalUI.Search;
- self.locked = true;
- },
- unlock: function() {
- var self = Metamaps.GlobalUI.Search;
- self.locked = false;
- },
- open: function (focus) {
- var self = Metamaps.GlobalUI.Search;
-
- clearTimeout(self.timeOut);
- if (!self.isOpen && !self.changing && !self.locked) {
- self.changing = true;
- $('.sidebarSearch .twitter-typeahead, .sidebarSearch .tt-hint, .sidebarSearchField').animate({
- width: '400px'
- }, 300, function () {
- if (focus) $('.sidebarSearchField').focus();
- $('.sidebarSearchField, .sidebarSearch .tt-hint').css({
- padding: '7px 10px 3px 10px',
- width: '380px'
- });
- self.changing = false;
- self.isOpen = true;
- });
- }
- },
- close: function (closeAfter, bypass) {
- // for now
- return
-
- var self = Metamaps.GlobalUI.Search;
-
- self.timeOut = setTimeout(function () {
- if (!self.locked && !self.changing && self.isOpen && (bypass || $('.sidebarSearchField.tt-input').val() == '')) {
- self.changing = true;
- $('.sidebarSearchField, .sidebarSearch .tt-hint').css({
- padding: '7px 0 3px 0',
- width: '400px'
- });
- $('.sidebarSearch .twitter-typeahead, .sidebarSearch .tt-hint, .sidebarSearchField').animate({
- width: '0'
- }, 300, function () {
- $('.sidebarSearchField').typeahead('val', '');
- $('.sidebarSearchField').blur();
- self.changing = false;
- self.isOpen = false;
- });
- }
- }, closeAfter);
- },
- startTypeahead: function () {
- var self = Metamaps.GlobalUI.Search;
-
- var mapheader = Metamaps.Active.Mapper ? '' : '';
- var topicheader = Metamaps.Active.Mapper ? '' : '';
- var mapperheader = '';
-
- var topics = {
- name: 'topics',
- limit: 9999,
-
- display: function(s) { return s.label; },
- templates: {
- notFound: function(s) {
- return Hogan.compile(topicheader + $('#topicSearchTemplate').html()).render({
- value: "No results",
- label: "No results",
- typeImageURL: Metamaps.Erb['icons/wildcard.png'],
- rtype: "noresult"
- });
- },
- header: topicheader,
- suggestion: function(s) {
- return Hogan.compile($('#topicSearchTemplate').html()).render(s);
- },
- },
- source: new Bloodhound({
- datumTokenizer: Bloodhound.tokenizers.obj.whitespace('value'),
- queryTokenizer: Bloodhound.tokenizers.whitespace,
- remote: {
- url: '/search/topics',
- prepare: function(query, settings) {
- settings.url += '?term=' + query;
- if (Metamaps.Active.Mapper && self.limitTopicsToMe) {
- settings.url += "&user=" + Metamaps.Active.Mapper.id.toString();
- }
- return settings;
- },
- },
- }),
- };
-
- var maps = {
- name: 'maps',
- limit: 9999,
- display: function(s) { return s.label; },
- templates: {
- notFound: function(s) {
- return Hogan.compile(mapheader + $('#mapSearchTemplate').html()).render({
- value: "No results",
- label: "No results",
- rtype: "noresult"
- });
- },
- header: mapheader,
- suggestion: function(s) {
- return Hogan.compile($('#mapSearchTemplate').html()).render(s);
- },
- },
- source: new Bloodhound({
- datumTokenizer: Bloodhound.tokenizers.obj.whitespace('value'),
- queryTokenizer: Bloodhound.tokenizers.whitespace,
- remote: {
- url: '/search/maps',
- prepare: function(query, settings) {
- settings.url += '?term=' + query;
- if (Metamaps.Active.Mapper && self.limitMapsToMe) {
- settings.url += "&user=" + Metamaps.Active.Mapper.id.toString();
- }
- return settings;
- },
- },
- }),
- };
-
- var mappers = {
- name: 'mappers',
- limit: 9999,
- display: function(s) { return s.label; },
- templates: {
- notFound: function(s) {
- return Hogan.compile(mapperheader + $('#mapperSearchTemplate').html()).render({
- value: "No results",
- label: "No results",
- rtype: "noresult",
- profile: Metamaps.Erb['user.png']
- });
- },
- header: mapperheader,
- suggestion: function(s) {
- return Hogan.compile($('#mapperSearchTemplate').html()).render(s);
- },
- },
- source: new Bloodhound({
- datumTokenizer: Bloodhound.tokenizers.obj.whitespace('value'),
- queryTokenizer: Bloodhound.tokenizers.whitespace,
- remote: {
- url: '/search/mappers?term=%QUERY',
- wildcard: '%QUERY',
- },
- }),
- };
-
- // Take all that crazy setup data and put it together into one beautiful typeahead call!
- $('.sidebarSearchField').typeahead(
- {
- highlight: true,
- },
- [topics, maps, mappers]
- );
-
- //Set max height of the search results box to prevent it from covering bottom left footer
- $('.sidebarSearchField').bind('typeahead:render', function (event) {
- self.initSearchOptions();
- self.hideLoader();
- var h = $(window).height();
- $(".tt-dropdown-menu").css('max-height', h - 100);
- if (self.limitTopicsToMe) {
- $('#limitTopicsToMe').prop('checked', true);
- }
- if (self.limitMapsToMe) {
- $('#limitMapsToMe').prop('checked', true);
- }
- });
- $(window).resize(function () {
- var h = $(window).height();
- $(".tt-dropdown-menu").css('max-height', h - 100);
- });
-
- // tell the autocomplete to launch a new tab with the topic, map, or mapper you clicked on
- $('.sidebarSearchField').bind('typeahead:select', self.handleResultClick);
-
- // don't do it, if they clicked on a 'addToMap' button
- $('.sidebarSearch button.addToMap').click(function (event) {
- event.stopPropagation();
- });
-
- // make sure that when you click on 'limit to me' or 'toggle section' it works
- $('.sidebarSearchField.tt-input').keyup(function(){
- if ($('.sidebarSearchField.tt-input').val() === '') {
- self.hideLoader();
- } else {
- self.showLoader();
- }
- });
-
- },
- handleResultClick: function (event, datum, dataset) {
- var self = Metamaps.GlobalUI.Search;
-
- self.hideLoader();
-
- if (["topic", "map", "mapper"].indexOf(datum.rtype) !== -1) {
- self.close(0, true);
- var win;
- if (datum.rtype == "topic") {
- Metamaps.Router.topics(datum.id);
- } else if (datum.rtype == "map") {
- Metamaps.Router.maps(datum.id);
- } else if (datum.rtype == "mapper") {
- Metamaps.Router.explore("mapper", datum.id);
- }
- }
- },
- initSearchOptions: function () {
- var self = Metamaps.GlobalUI.Search;
-
- function toggleResultSet(set) {
- var s = $('.tt-dataset-' + set + ' .tt-suggestion, .tt-dataset-' + set + ' .resultnoresult');
- if (s.is(':visible')) {
- s.hide();
- $(this).removeClass('minimizeResults').addClass('maximizeResults');
- } else {
- s.show();
- $(this).removeClass('maximizeResults').addClass('minimizeResults');
- }
- }
-
- $('.limitToMe').unbind().bind("change", function (e) {
- if ($(this).attr('id') == 'limitTopicsToMe') {
- self.limitTopicsToMe = !self.limitTopicsToMe;
- }
- if ($(this).attr('id') == 'limitMapsToMe') {
- self.limitMapsToMe = !self.limitMapsToMe;
- }
-
- // set the value of the search equal to itself to retrigger the
- // autocomplete event
- var searchQuery = $('.sidebarSearchField.tt-input').val();
- $(".sidebarSearchField").typeahead('val', '')
- .typeahead('val', searchQuery);
- });
-
- // when the user clicks minimize section, hide the results for that section
- $('.minimizeMapperResults').unbind().click(function (e) {
- toggleResultSet.call(this, 'mappers');
- });
- $('.minimizeTopicResults').unbind().click(function (e) {
- toggleResultSet.call(this, 'topics');
- });
- $('.minimizeMapResults').unbind().click(function (e) {
- toggleResultSet.call(this, 'maps');
- });
- },
- hideLoader: function () {
- $('#searchLoading').hide();
- },
- showLoader: function () {
- $('#searchLoading').show();
- }
-};
diff --git a/app/assets/javascripts/src/Metamaps.Account.js b/frontend/src/Metamaps/Metamaps.Account.js
similarity index 98%
rename from app/assets/javascripts/src/Metamaps.Account.js
rename to frontend/src/Metamaps/Metamaps.Account.js
index a2286ad8..66348481 100644
--- a/app/assets/javascripts/src/Metamaps.Account.js
+++ b/frontend/src/Metamaps/Metamaps.Account.js
@@ -1,3 +1,4 @@
+window.Metamaps = window.Metamaps || {}
/* global Metamaps, $ */
/*
diff --git a/app/assets/javascripts/src/Metamaps.Admin.js b/frontend/src/Metamaps/Metamaps.Admin.js
similarity index 97%
rename from app/assets/javascripts/src/Metamaps.Admin.js
rename to frontend/src/Metamaps/Metamaps.Admin.js
index a0192012..8dcaed5b 100644
--- a/app/assets/javascripts/src/Metamaps.Admin.js
+++ b/frontend/src/Metamaps/Metamaps.Admin.js
@@ -1,3 +1,4 @@
+window.Metamaps = window.Metamaps || {}
/* global Metamaps, $ */
/*
diff --git a/app/assets/javascripts/src/Metamaps.AutoLayout.js b/frontend/src/Metamaps/Metamaps.AutoLayout.js
similarity index 97%
rename from app/assets/javascripts/src/Metamaps.AutoLayout.js
rename to frontend/src/Metamaps/Metamaps.AutoLayout.js
index 51e105c2..2360204b 100644
--- a/app/assets/javascripts/src/Metamaps.AutoLayout.js
+++ b/frontend/src/Metamaps/Metamaps.AutoLayout.js
@@ -1,3 +1,4 @@
+window.Metamaps = window.Metamaps || {}
/* global Metamaps */
/*
diff --git a/app/assets/javascripts/src/Metamaps.Backbone.js b/frontend/src/Metamaps/Metamaps.Backbone.js
similarity index 99%
rename from app/assets/javascripts/src/Metamaps.Backbone.js
rename to frontend/src/Metamaps/Metamaps.Backbone.js
index 2c1f58af..3c991e0b 100644
--- a/app/assets/javascripts/src/Metamaps.Backbone.js
+++ b/frontend/src/Metamaps/Metamaps.Backbone.js
@@ -1,3 +1,4 @@
+window.Metamaps = window.Metamaps || {}
/* global Metamaps, Backbone, _, $ */
/*
diff --git a/app/assets/javascripts/src/Metamaps.Control.js b/frontend/src/Metamaps/Metamaps.Control.js
similarity index 99%
rename from app/assets/javascripts/src/Metamaps.Control.js
rename to frontend/src/Metamaps/Metamaps.Control.js
index da6854c2..33623927 100644
--- a/app/assets/javascripts/src/Metamaps.Control.js
+++ b/frontend/src/Metamaps/Metamaps.Control.js
@@ -1,3 +1,4 @@
+window.Metamaps = window.Metamaps || {}
/* global Metamaps, $ */
/*
diff --git a/app/assets/javascripts/src/Metamaps.Create.js b/frontend/src/Metamaps/Metamaps.Create.js
similarity index 99%
rename from app/assets/javascripts/src/Metamaps.Create.js
rename to frontend/src/Metamaps/Metamaps.Create.js
index 6f3bbb62..1bd4216f 100644
--- a/app/assets/javascripts/src/Metamaps.Create.js
+++ b/frontend/src/Metamaps/Metamaps.Create.js
@@ -1,3 +1,4 @@
+window.Metamaps = window.Metamaps || {}
/* global Metamaps, $ */
/*
diff --git a/app/assets/javascripts/src/Metamaps.Debug.js b/frontend/src/Metamaps/Metamaps.Debug.js
similarity index 73%
rename from app/assets/javascripts/src/Metamaps.Debug.js
rename to frontend/src/Metamaps/Metamaps.Debug.js
index accd93a9..7bc71979 100644
--- a/app/assets/javascripts/src/Metamaps.Debug.js
+++ b/frontend/src/Metamaps/Metamaps.Debug.js
@@ -1,3 +1,4 @@
+window.Metamaps = window.Metamaps || {}
/*
* Metamaps.Debug.js.erb
*
@@ -10,4 +11,5 @@ Metamaps.Debug = function () {
}
Metamaps.debug = function () {
Metamaps.Debug()
+window.Metamaps = window.Metamaps || {}
}
diff --git a/app/assets/javascripts/src/Metamaps.Filter.js b/frontend/src/Metamaps/Metamaps.Filter.js
similarity index 99%
rename from app/assets/javascripts/src/Metamaps.Filter.js
rename to frontend/src/Metamaps/Metamaps.Filter.js
index 1dba099c..367918e6 100644
--- a/app/assets/javascripts/src/Metamaps.Filter.js
+++ b/frontend/src/Metamaps/Metamaps.Filter.js
@@ -1,3 +1,4 @@
+window.Metamaps = window.Metamaps || {}
/* global Metamaps, $ */
/*
diff --git a/frontend/src/Metamaps/Metamaps.GlobalUI.js b/frontend/src/Metamaps/Metamaps.GlobalUI.js
new file mode 100644
index 00000000..d5fe6caa
--- /dev/null
+++ b/frontend/src/Metamaps/Metamaps.GlobalUI.js
@@ -0,0 +1,680 @@
+window.Metamaps = window.Metamaps || {};
+
+Metamaps.Active = Metamaps.Active || {
+ Map: null,
+ Topic: null,
+ Mapper: null
+};
+Metamaps.Maps = Metamaps.Maps || {}
+
+$(document).ready(function () {
+ // initialize all the modules
+ for (var prop in Metamaps) {
+ // this runs the init function within each sub-object on the Metamaps one
+ if (Metamaps.hasOwnProperty(prop) &&
+ Metamaps[prop] != null &&
+ Metamaps[prop].hasOwnProperty('init') &&
+ typeof (Metamaps[prop].init) == 'function'
+ ) {
+ Metamaps[prop].init()
+ }
+ }
+ // load whichever page you are on
+ if (Metamaps.currentSection === "explore") {
+ var capitalize = Metamaps.currentPage.charAt(0).toUpperCase() + Metamaps.currentPage.slice(1)
+
+ Metamaps.Views.exploreMaps.setCollection( Metamaps.Maps[capitalize] )
+ if (Metamaps.currentPage === "mapper") {
+ Metamaps.Views.exploreMaps.fetchUserThenRender()
+ }
+ else {
+ Metamaps.Views.exploreMaps.render()
+ }
+ Metamaps.GlobalUI.showDiv('#explore')
+ }
+ else if (Metamaps.currentSection === "" && Metamaps.Active.Mapper) {
+ Metamaps.Views.exploreMaps.setCollection(Metamaps.Maps.Active)
+ Metamaps.Views.exploreMaps.render()
+ Metamaps.GlobalUI.showDiv('#explore')
+ }
+ else if (Metamaps.Active.Map || Metamaps.Active.Topic) {
+ Metamaps.Loading.show()
+ Metamaps.JIT.prepareVizData()
+ Metamaps.GlobalUI.showDiv('#infovis')
+ }
+});
+
+Metamaps.GlobalUI = {
+ notifyTimeout: null,
+ lightbox: null,
+ init: function () {
+ var self = Metamaps.GlobalUI;
+
+ self.Search.init();
+ self.CreateMap.init();
+ self.Account.init();
+
+ if ($('#toast').html().trim()) self.notifyUser($('#toast').html())
+
+ //bind lightbox clicks
+ $('.openLightbox').click(function (event) {
+ self.openLightbox($(this).attr('data-open'));
+ event.preventDefault();
+ return false;
+ });
+
+ $('#lightbox_screen, #lightbox_close').click(self.closeLightbox);
+
+ // initialize global backbone models and collections
+ if (Metamaps.Active.Mapper) Metamaps.Active.Mapper = new Metamaps.Backbone.Mapper(Metamaps.Active.Mapper);
+
+ var myCollection = Metamaps.Maps.Mine ? Metamaps.Maps.Mine : [];
+ var sharedCollection = Metamaps.Maps.Shared ? Metamaps.Maps.Shared : [];
+ var starredCollection = Metamaps.Maps.Starred ? Metamaps.Maps.Starred : [];
+ var mapperCollection = [];
+ var mapperOptionsObj = {id: 'mapper', sortBy: 'updated_at' };
+ if (Metamaps.Maps.Mapper) {
+ mapperCollection = Metamaps.Maps.Mapper.models;
+ mapperOptionsObj.mapperId = Metamaps.Maps.Mapper.id;
+ }
+ var featuredCollection = Metamaps.Maps.Featured ? Metamaps.Maps.Featured : [];
+ var activeCollection = Metamaps.Maps.Active ? Metamaps.Maps.Active : [];
+ Metamaps.Maps.Mine = new Metamaps.Backbone.MapsCollection(myCollection, {id: 'mine', sortBy: 'updated_at' });
+ Metamaps.Maps.Shared = new Metamaps.Backbone.MapsCollection(sharedCollection, {id: 'shared', sortBy: 'updated_at' });
+ Metamaps.Maps.Starred = new Metamaps.Backbone.MapsCollection(starredCollection, {id: 'starred', sortBy: 'updated_at' });
+ // 'Mapper' refers to another mapper
+ Metamaps.Maps.Mapper = new Metamaps.Backbone.MapsCollection(mapperCollection, mapperOptionsObj);
+ Metamaps.Maps.Featured = new Metamaps.Backbone.MapsCollection(featuredCollection, {id: 'featured', sortBy: 'updated_at' });
+ Metamaps.Maps.Active = new Metamaps.Backbone.MapsCollection(activeCollection, {id: 'active', sortBy: 'updated_at' });
+ },
+ showDiv: function (selector) {
+ $(selector).show()
+ $(selector).animate({
+ opacity: 1
+ }, 200, 'easeOutCubic')
+ },
+ hideDiv: function (selector) {
+ $(selector).animate({
+ opacity: 0
+ }, 200, 'easeInCubic', function () { $(this).hide() })
+ },
+ openLightbox: function (which) {
+ var self = Metamaps.GlobalUI;
+
+ $('.lightboxContent').hide();
+ $('#' + which).show();
+
+ self.lightbox = which;
+
+ $('#lightbox_overlay').show();
+
+ var heightOfContent = '-' + ($('#lightbox_main').height() / 2) + 'px';
+ // animate the content in from the bottom
+ $('#lightbox_main').animate({
+ 'top': '50%',
+ 'margin-top': heightOfContent
+ }, 200, 'easeOutCubic');
+
+ // fade the black overlay in
+ $('#lightbox_screen').animate({
+ 'opacity': '0.42'
+ }, 200);
+
+ if (which == "switchMetacodes") {
+ Metamaps.Create.isSwitchingSet = true;
+ }
+ },
+
+ closeLightbox: function (event) {
+ var self = Metamaps.GlobalUI;
+
+ if (event) event.preventDefault();
+
+ // animate the lightbox content offscreen
+ $('#lightbox_main').animate({
+ 'top': '100%',
+ 'margin-top': '0'
+ }, 200, 'easeInCubic');
+
+ // fade the black overlay out
+ $('#lightbox_screen').animate({
+ 'opacity': '0.0'
+ }, 200, function () {
+ $('#lightbox_overlay').hide();
+ });
+
+ if (self.lightbox === 'forkmap') Metamaps.GlobalUI.CreateMap.reset('fork_map');
+ if (self.lightbox === 'newmap') Metamaps.GlobalUI.CreateMap.reset('new_map');
+ if (Metamaps.Create && Metamaps.Create.isSwitchingSet) {
+ Metamaps.Create.cancelMetacodeSetSwitch();
+ }
+ self.lightbox = null;
+ },
+ notifyUser: function (message, leaveOpen) {
+ var self = Metamaps.GlobalUI;
+
+ $('#toast').html(message)
+ self.showDiv('#toast')
+ clearTimeout(self.notifyTimeOut);
+ if (!leaveOpen) {
+ self.notifyTimeOut = setTimeout(function () {
+ self.hideDiv('#toast')
+ }, 8000);
+ }
+ },
+ clearNotify: function() {
+ var self = Metamaps.GlobalUI;
+
+ clearTimeout(self.notifyTimeOut);
+ self.hideDiv('#toast')
+ },
+ shareInvite: function(inviteLink) {
+ window.prompt("To copy the invite link, press: Ctrl+C, Enter", inviteLink);
+ }
+};
+
+Metamaps.GlobalUI.CreateMap = {
+ newMap: null,
+ emptyMapForm: "",
+ emptyForkMapForm: "",
+ topicsToMap: [],
+ synapsesToMap: [],
+ init: function () {
+ var self = Metamaps.GlobalUI.CreateMap;
+
+ self.newMap = new Metamaps.Backbone.Map({ permission: 'commons' });
+
+ self.bindFormEvents();
+
+ self.emptyMapForm = $('#new_map').html();
+
+ },
+ bindFormEvents: function () {
+ var self = Metamaps.GlobalUI.CreateMap;
+
+ $('.new_map input, .new_map div').unbind('keypress').bind('keypress', function(event) {
+ if (event.keyCode === 13) self.submit()
+ })
+
+ $('.new_map button.cancel').unbind().bind('click', function (event) {
+ event.preventDefault();
+ Metamaps.GlobalUI.closeLightbox();
+ });
+ $('.new_map button.submitMap').unbind().bind('click', self.submit);
+
+ // bind permission changer events on the createMap form
+ $('.permIcon').unbind().bind('click', self.switchPermission);
+ },
+ closeSuccess: function () {
+ $('#mapCreatedSuccess').fadeOut(300, function(){
+ $(this).remove();
+ });
+ },
+ generateSuccessMessage: function (id) {
+ var stringStart = "";
+ return stringStart + page + stringEnd;
+ },
+ switchPermission: function () {
+ var self = Metamaps.GlobalUI.CreateMap;
+
+ self.newMap.set('permission', $(this).attr('data-permission'));
+ $(this).siblings('.permIcon').find('.mapPermIcon').removeClass('selected');
+ $(this).find('.mapPermIcon').addClass('selected');
+
+ var permText = $(this).find('.tip').html();
+ $(this).parents('.new_map').find('.permText').html(permText);
+ },
+ submit: function (event) {
+ if (event) event.preventDefault();
+
+ var self = Metamaps.GlobalUI.CreateMap;
+
+ if (Metamaps.GlobalUI.lightbox === 'forkmap') {
+ self.newMap.set('topicsToMap', self.topicsToMap);
+ self.newMap.set('synapsesToMap', self.synapsesToMap);
+ }
+
+ var formId = Metamaps.GlobalUI.lightbox === 'forkmap' ? '#fork_map' : '#new_map';
+ var $form = $(formId);
+
+ self.newMap.set('name', $form.find('#map_name').val());
+ self.newMap.set('desc', $form.find('#map_desc').val());
+
+ if (self.newMap.get('name').length===0){
+ self.throwMapNameError();
+ return;
+ }
+
+ self.newMap.save(null, {
+ success: self.success
+ // TODO add error message
+ });
+
+ Metamaps.GlobalUI.closeLightbox();
+ Metamaps.GlobalUI.notifyUser('Working...');
+ },
+ throwMapNameError: function () {
+ var self = Metamaps.GlobalUI.CreateMap;
+
+ var formId = Metamaps.GlobalUI.lightbox === 'forkmap' ? '#fork_map' : '#new_map';
+ var $form = $(formId);
+
+ var message = $("Please enter a map name...
");
+
+ $form.find('#map_name').after(message);
+ setTimeout(function(){
+ message.fadeOut('fast', function(){
+ message.remove();
+ });
+ }, 5000);
+ },
+ success: function (model) {
+ var self = Metamaps.GlobalUI.CreateMap;
+
+ //push the new map onto the collection of 'my maps'
+ Metamaps.Maps.Mine.add(model);
+
+ var formId = Metamaps.GlobalUI.lightbox === 'forkmap' ? '#fork_map' : '#new_map';
+ var form = $(formId);
+
+ Metamaps.GlobalUI.clearNotify();
+ $('#wrapper').append(self.generateSuccessMessage(model.id));
+
+ },
+ reset: function (id) {
+ var self = Metamaps.GlobalUI.CreateMap;
+
+ var form = $('#' + id);
+
+ if (id === "fork_map") {
+ self.topicsToMap = [];
+ self.synapsesToMap = [];
+ form.html(self.emptyForkMapForm);
+ }
+ else {
+ form.html(self.emptyMapForm);
+ }
+
+ self.bindFormEvents();
+ self.newMap = new Metamaps.Backbone.Map({ permission: 'commons' });
+
+ return false;
+ },
+};
+
+
+Metamaps.GlobalUI.Account = {
+ isOpen: false,
+ changing: false,
+ init: function () {
+ var self = Metamaps.GlobalUI.Account;
+
+ $('.sidebarAccountIcon').click(self.toggleBox);
+ $('.sidebarAccountBox').click(function(event){
+ event.stopPropagation();
+ });
+ $('body').click(self.close);
+ },
+ toggleBox: function (event) {
+ var self = Metamaps.GlobalUI.Account;
+
+ if (self.isOpen) self.close();
+ else self.open();
+
+ event.stopPropagation();
+ },
+ open: function () {
+ var self = Metamaps.GlobalUI.Account;
+
+ Metamaps.Filter.close();
+ $('.sidebarAccountIcon .tooltipsUnder').addClass('hide');
+
+
+ if (!self.isOpen && !self.changing) {
+ self.changing = true;
+ $('.sidebarAccountBox').fadeIn(200, function () {
+ self.changing = false;
+ self.isOpen = true;
+ $('.sidebarAccountBox #user_email').focus();
+ });
+ }
+ },
+ close: function () {
+ var self = Metamaps.GlobalUI.Account;
+
+ $('.sidebarAccountIcon .tooltipsUnder').removeClass('hide');
+ if (!self.changing) {
+ self.changing = true;
+ $('.sidebarAccountBox #user_email').blur();
+ $('.sidebarAccountBox').fadeOut(200, function () {
+ self.changing = false;
+ self.isOpen = false;
+ });
+ }
+ }
+};
+
+Metamaps.GlobalUI.Search = {
+ locked: false,
+ isOpen: false,
+ limitTopicsToMe: false,
+ limitMapsToMe: false,
+ timeOut: null,
+ changing: false,
+ optionsInitialized: false,
+ init: function () {
+ var self = Metamaps.GlobalUI.Search;
+
+ var loader = new CanvasLoader('searchLoading');
+ loader.setColor('#4fb5c0'); // default is '#000000'
+ loader.setDiameter(24); // default is 40
+ loader.setDensity(41); // default is 40
+ loader.setRange(0.9); // default is 1.3
+ loader.show(); // Hidden by default
+
+ // bind the hover events
+ $(".sidebarSearch").hover(function () {
+ self.open()
+ }, function () {
+ self.close(800, false)
+ });
+
+ $('.sidebarSearchIcon').click(function (e) {
+ $('.sidebarSearchField').focus();
+ });
+ $('.sidebarSearch').click(function (e) {
+ e.stopPropagation();
+ });
+ $('body').click(function (e) {
+ self.close(0, false);
+ });
+
+ // open if the search is closed and user hits ctrl+/
+ // close if they hit ESC
+ $('body').bind('keyup', function (e) {
+ switch (e.which) {
+ case 191:
+ if ((e.ctrlKey && !self.isOpen) || (e.ctrlKey && self.locked)) {
+ self.open(true); // true for focus
+ }
+ break;
+ case 27:
+ if (self.isOpen) {
+ self.close(0, true);
+ }
+ break;
+
+ default:
+ break; //console.log(e.which);
+ }
+ });
+
+ self.startTypeahead();
+ },
+ lock: function() {
+ var self = Metamaps.GlobalUI.Search;
+ self.locked = true;
+ },
+ unlock: function() {
+ var self = Metamaps.GlobalUI.Search;
+ self.locked = false;
+ },
+ open: function (focus) {
+ var self = Metamaps.GlobalUI.Search;
+
+ clearTimeout(self.timeOut);
+ if (!self.isOpen && !self.changing && !self.locked) {
+ self.changing = true;
+ $('.sidebarSearch .twitter-typeahead, .sidebarSearch .tt-hint, .sidebarSearchField').animate({
+ width: '400px'
+ }, 300, function () {
+ if (focus) $('.sidebarSearchField').focus();
+ $('.sidebarSearchField, .sidebarSearch .tt-hint').css({
+ padding: '7px 10px 3px 10px',
+ width: '380px'
+ });
+ self.changing = false;
+ self.isOpen = true;
+ });
+ }
+ },
+ close: function (closeAfter, bypass) {
+ // for now
+ return
+
+ var self = Metamaps.GlobalUI.Search;
+
+ self.timeOut = setTimeout(function () {
+ if (!self.locked && !self.changing && self.isOpen && (bypass || $('.sidebarSearchField.tt-input').val() == '')) {
+ self.changing = true;
+ $('.sidebarSearchField, .sidebarSearch .tt-hint').css({
+ padding: '7px 0 3px 0',
+ width: '400px'
+ });
+ $('.sidebarSearch .twitter-typeahead, .sidebarSearch .tt-hint, .sidebarSearchField').animate({
+ width: '0'
+ }, 300, function () {
+ $('.sidebarSearchField').typeahead('val', '');
+ $('.sidebarSearchField').blur();
+ self.changing = false;
+ self.isOpen = false;
+ });
+ }
+ }, closeAfter);
+ },
+ startTypeahead: function () {
+ var self = Metamaps.GlobalUI.Search;
+
+ var mapheader = Metamaps.Active.Mapper ? '' : '';
+ var topicheader = Metamaps.Active.Mapper ? '' : '';
+ var mapperheader = '';
+
+ var topics = {
+ name: 'topics',
+ limit: 9999,
+
+ display: function(s) { return s.label; },
+ templates: {
+ notFound: function(s) {
+ return Hogan.compile(topicheader + $('#topicSearchTemplate').html()).render({
+ value: "No results",
+ label: "No results",
+ typeImageURL: Metamaps.Erb['icons/wildcard.png'],
+ rtype: "noresult"
+ });
+ },
+ header: topicheader,
+ suggestion: function(s) {
+ return Hogan.compile($('#topicSearchTemplate').html()).render(s);
+ },
+ },
+ source: new Bloodhound({
+ datumTokenizer: Bloodhound.tokenizers.obj.whitespace('value'),
+ queryTokenizer: Bloodhound.tokenizers.whitespace,
+ remote: {
+ url: '/search/topics',
+ prepare: function(query, settings) {
+ settings.url += '?term=' + query;
+ if (Metamaps.Active.Mapper && self.limitTopicsToMe) {
+ settings.url += "&user=" + Metamaps.Active.Mapper.id.toString();
+ }
+ return settings;
+ },
+ },
+ }),
+ };
+
+ var maps = {
+ name: 'maps',
+ limit: 9999,
+ display: function(s) { return s.label; },
+ templates: {
+ notFound: function(s) {
+ return Hogan.compile(mapheader + $('#mapSearchTemplate').html()).render({
+ value: "No results",
+ label: "No results",
+ rtype: "noresult"
+ });
+ },
+ header: mapheader,
+ suggestion: function(s) {
+ return Hogan.compile($('#mapSearchTemplate').html()).render(s);
+ },
+ },
+ source: new Bloodhound({
+ datumTokenizer: Bloodhound.tokenizers.obj.whitespace('value'),
+ queryTokenizer: Bloodhound.tokenizers.whitespace,
+ remote: {
+ url: '/search/maps',
+ prepare: function(query, settings) {
+ settings.url += '?term=' + query;
+ if (Metamaps.Active.Mapper && self.limitMapsToMe) {
+ settings.url += "&user=" + Metamaps.Active.Mapper.id.toString();
+ }
+ return settings;
+ },
+ },
+ }),
+ };
+
+ var mappers = {
+ name: 'mappers',
+ limit: 9999,
+ display: function(s) { return s.label; },
+ templates: {
+ notFound: function(s) {
+ return Hogan.compile(mapperheader + $('#mapperSearchTemplate').html()).render({
+ value: "No results",
+ label: "No results",
+ rtype: "noresult",
+ profile: Metamaps.Erb['user.png']
+ });
+ },
+ header: mapperheader,
+ suggestion: function(s) {
+ return Hogan.compile($('#mapperSearchTemplate').html()).render(s);
+ },
+ },
+ source: new Bloodhound({
+ datumTokenizer: Bloodhound.tokenizers.obj.whitespace('value'),
+ queryTokenizer: Bloodhound.tokenizers.whitespace,
+ remote: {
+ url: '/search/mappers?term=%QUERY',
+ wildcard: '%QUERY',
+ },
+ }),
+ };
+
+ // Take all that crazy setup data and put it together into one beautiful typeahead call!
+ $('.sidebarSearchField').typeahead(
+ {
+ highlight: true,
+ },
+ [topics, maps, mappers]
+ );
+
+ //Set max height of the search results box to prevent it from covering bottom left footer
+ $('.sidebarSearchField').bind('typeahead:render', function (event) {
+ self.initSearchOptions();
+ self.hideLoader();
+ var h = $(window).height();
+ $(".tt-dropdown-menu").css('max-height', h - 100);
+ if (self.limitTopicsToMe) {
+ $('#limitTopicsToMe').prop('checked', true);
+ }
+ if (self.limitMapsToMe) {
+ $('#limitMapsToMe').prop('checked', true);
+ }
+ });
+ $(window).resize(function () {
+ var h = $(window).height();
+ $(".tt-dropdown-menu").css('max-height', h - 100);
+ });
+
+ // tell the autocomplete to launch a new tab with the topic, map, or mapper you clicked on
+ $('.sidebarSearchField').bind('typeahead:select', self.handleResultClick);
+
+ // don't do it, if they clicked on a 'addToMap' button
+ $('.sidebarSearch button.addToMap').click(function (event) {
+ event.stopPropagation();
+ });
+
+ // make sure that when you click on 'limit to me' or 'toggle section' it works
+ $('.sidebarSearchField.tt-input').keyup(function(){
+ if ($('.sidebarSearchField.tt-input').val() === '') {
+ self.hideLoader();
+ } else {
+ self.showLoader();
+ }
+ });
+
+ },
+ handleResultClick: function (event, datum, dataset) {
+ var self = Metamaps.GlobalUI.Search;
+
+ self.hideLoader();
+
+ if (["topic", "map", "mapper"].indexOf(datum.rtype) !== -1) {
+ self.close(0, true);
+ var win;
+ if (datum.rtype == "topic") {
+ Metamaps.Router.topics(datum.id);
+ } else if (datum.rtype == "map") {
+ Metamaps.Router.maps(datum.id);
+ } else if (datum.rtype == "mapper") {
+ Metamaps.Router.explore("mapper", datum.id);
+ }
+ }
+ },
+ initSearchOptions: function () {
+ var self = Metamaps.GlobalUI.Search;
+
+ function toggleResultSet(set) {
+ var s = $('.tt-dataset-' + set + ' .tt-suggestion, .tt-dataset-' + set + ' .resultnoresult');
+ if (s.is(':visible')) {
+ s.hide();
+ $(this).removeClass('minimizeResults').addClass('maximizeResults');
+ } else {
+ s.show();
+ $(this).removeClass('maximizeResults').addClass('minimizeResults');
+ }
+ }
+
+ $('.limitToMe').unbind().bind("change", function (e) {
+ if ($(this).attr('id') == 'limitTopicsToMe') {
+ self.limitTopicsToMe = !self.limitTopicsToMe;
+ }
+ if ($(this).attr('id') == 'limitMapsToMe') {
+ self.limitMapsToMe = !self.limitMapsToMe;
+ }
+
+ // set the value of the search equal to itself to retrigger the
+ // autocomplete event
+ var searchQuery = $('.sidebarSearchField.tt-input').val();
+ $(".sidebarSearchField").typeahead('val', '')
+ .typeahead('val', searchQuery);
+ });
+
+ // when the user clicks minimize section, hide the results for that section
+ $('.minimizeMapperResults').unbind().click(function (e) {
+ toggleResultSet.call(this, 'mappers');
+ });
+ $('.minimizeTopicResults').unbind().click(function (e) {
+ toggleResultSet.call(this, 'topics');
+ });
+ $('.minimizeMapResults').unbind().click(function (e) {
+ toggleResultSet.call(this, 'maps');
+ });
+ },
+ hideLoader: function () {
+ $('#searchLoading').hide();
+ },
+ showLoader: function () {
+ $('#searchLoading').show();
+ }
+}
diff --git a/app/assets/javascripts/src/Metamaps.Import.js b/frontend/src/Metamaps/Metamaps.Import.js
similarity index 99%
rename from app/assets/javascripts/src/Metamaps.Import.js
rename to frontend/src/Metamaps/Metamaps.Import.js
index 2dee51d0..426071f0 100644
--- a/app/assets/javascripts/src/Metamaps.Import.js
+++ b/frontend/src/Metamaps/Metamaps.Import.js
@@ -1,3 +1,4 @@
+window.Metamaps = window.Metamaps || {}
/* global Metamaps, $ */
/*
diff --git a/app/assets/javascripts/src/Metamaps.JIT.js b/frontend/src/Metamaps/Metamaps.JIT.js
similarity index 99%
rename from app/assets/javascripts/src/Metamaps.JIT.js
rename to frontend/src/Metamaps/Metamaps.JIT.js
index d5e82081..cfdd921d 100644
--- a/app/assets/javascripts/src/Metamaps.JIT.js
+++ b/frontend/src/Metamaps/Metamaps.JIT.js
@@ -1,3 +1,4 @@
+window.Metamaps = window.Metamaps || {}
Metamaps.JIT = {
events: {
topicDrag: 'Metamaps:JIT:events:topicDrag',
@@ -819,7 +820,7 @@ Metamaps.JIT = {
}
}
//
- temp = eventInfo.getNode()
+ let temp = eventInfo.getNode()
if (temp != false && temp.id != node.id && Metamaps.Selected.Nodes.indexOf(temp) == -1) { // this means a Node has been returned
Metamaps.tempNode2 = temp
diff --git a/app/assets/javascripts/src/Metamaps.Listeners.js b/frontend/src/Metamaps/Metamaps.Listeners.js
similarity index 98%
rename from app/assets/javascripts/src/Metamaps.Listeners.js
rename to frontend/src/Metamaps/Metamaps.Listeners.js
index 948893cb..e6c4e1b9 100644
--- a/app/assets/javascripts/src/Metamaps.Listeners.js
+++ b/frontend/src/Metamaps/Metamaps.Listeners.js
@@ -1,3 +1,4 @@
+window.Metamaps = window.Metamaps || {}
/* global Metamaps, $ */
/*
diff --git a/app/assets/javascripts/src/Metamaps.Map.js b/frontend/src/Metamaps/Metamaps.Map.js
similarity index 99%
rename from app/assets/javascripts/src/Metamaps.Map.js
rename to frontend/src/Metamaps/Metamaps.Map.js
index 264e3c48..e925a92c 100644
--- a/app/assets/javascripts/src/Metamaps.Map.js
+++ b/frontend/src/Metamaps/Metamaps.Map.js
@@ -1,3 +1,4 @@
+window.Metamaps = window.Metamaps || {}
/* global Metamaps, $ */
/*
diff --git a/app/assets/javascripts/src/Metamaps.Mapper.js b/frontend/src/Metamaps/Metamaps.Mapper.js
similarity index 91%
rename from app/assets/javascripts/src/Metamaps.Mapper.js
rename to frontend/src/Metamaps/Metamaps.Mapper.js
index 7d565479..f8a530b8 100644
--- a/app/assets/javascripts/src/Metamaps.Mapper.js
+++ b/frontend/src/Metamaps/Metamaps.Mapper.js
@@ -1,3 +1,4 @@
+window.Metamaps = window.Metamaps || {}
/* global Metamaps, $ */
/*
diff --git a/app/assets/javascripts/src/Metamaps.Mobile.js b/frontend/src/Metamaps/Metamaps.Mobile.js
similarity index 95%
rename from app/assets/javascripts/src/Metamaps.Mobile.js
rename to frontend/src/Metamaps/Metamaps.Mobile.js
index 1a55f081..fcd76b2f 100644
--- a/app/assets/javascripts/src/Metamaps.Mobile.js
+++ b/frontend/src/Metamaps/Metamaps.Mobile.js
@@ -1,3 +1,4 @@
+window.Metamaps = window.Metamaps || {}
/* global Metamaps, $ */
/*
diff --git a/app/assets/javascripts/src/Metamaps.Organize.js b/frontend/src/Metamaps/Metamaps.Organize.js
similarity index 99%
rename from app/assets/javascripts/src/Metamaps.Organize.js
rename to frontend/src/Metamaps/Metamaps.Organize.js
index b2463280..220cb83a 100644
--- a/app/assets/javascripts/src/Metamaps.Organize.js
+++ b/frontend/src/Metamaps/Metamaps.Organize.js
@@ -1,3 +1,4 @@
+window.Metamaps = window.Metamaps || {}
/* global Metamaps, $ */
/*
diff --git a/app/assets/javascripts/src/Metamaps.PasteInput.js b/frontend/src/Metamaps/Metamaps.PasteInput.js
similarity index 98%
rename from app/assets/javascripts/src/Metamaps.PasteInput.js
rename to frontend/src/Metamaps/Metamaps.PasteInput.js
index aaf848d0..3e933e41 100644
--- a/app/assets/javascripts/src/Metamaps.PasteInput.js
+++ b/frontend/src/Metamaps/Metamaps.PasteInput.js
@@ -1,3 +1,4 @@
+window.Metamaps = window.Metamaps || {}
/* global Metamaps, $ */
/*
diff --git a/frontend/src/Metamaps/Metamaps.ReactComponents.js b/frontend/src/Metamaps/Metamaps.ReactComponents.js
new file mode 100644
index 00000000..a1de0f40
--- /dev/null
+++ b/frontend/src/Metamaps/Metamaps.ReactComponents.js
@@ -0,0 +1,7 @@
+window.Metamaps = window.Metamaps || {}
+
+import Maps from '../components/Maps'
+
+Metamaps.ReactComponents = {
+ Maps
+}
diff --git a/app/assets/javascripts/src/Metamaps.Realtime.js b/frontend/src/Metamaps/Metamaps.Realtime.js
similarity index 99%
rename from app/assets/javascripts/src/Metamaps.Realtime.js
rename to frontend/src/Metamaps/Metamaps.Realtime.js
index 620a561a..0b62648f 100644
--- a/app/assets/javascripts/src/Metamaps.Realtime.js
+++ b/frontend/src/Metamaps/Metamaps.Realtime.js
@@ -1,3 +1,5 @@
+window.Metamaps = window.Metamaps || {}
+
/* global Metamaps, $ */
/*
diff --git a/app/assets/javascripts/src/Metamaps.Router.js b/frontend/src/Metamaps/Metamaps.Router.js
similarity index 99%
rename from app/assets/javascripts/src/Metamaps.Router.js
rename to frontend/src/Metamaps/Metamaps.Router.js
index 3ef30986..417c9b9e 100644
--- a/app/assets/javascripts/src/Metamaps.Router.js
+++ b/frontend/src/Metamaps/Metamaps.Router.js
@@ -1,3 +1,4 @@
+window.Metamaps = window.Metamaps || {}
/* global Metamaps, Backbone, $ */
/*
diff --git a/app/assets/javascripts/src/Metamaps.Synapse.js b/frontend/src/Metamaps/Metamaps.Synapse.js
similarity index 99%
rename from app/assets/javascripts/src/Metamaps.Synapse.js
rename to frontend/src/Metamaps/Metamaps.Synapse.js
index ceed219d..20cf0f9c 100644
--- a/app/assets/javascripts/src/Metamaps.Synapse.js
+++ b/frontend/src/Metamaps/Metamaps.Synapse.js
@@ -1,3 +1,4 @@
+window.Metamaps = window.Metamaps || {}
/* global Metamaps, $ */
/*
diff --git a/app/assets/javascripts/src/Metamaps.SynapseCard.js b/frontend/src/Metamaps/Metamaps.SynapseCard.js
similarity index 99%
rename from app/assets/javascripts/src/Metamaps.SynapseCard.js
rename to frontend/src/Metamaps/Metamaps.SynapseCard.js
index f71601e5..aff207a9 100644
--- a/app/assets/javascripts/src/Metamaps.SynapseCard.js
+++ b/frontend/src/Metamaps/Metamaps.SynapseCard.js
@@ -1,3 +1,4 @@
+window.Metamaps = window.Metamaps || {}
/* global Metamaps, $ */
/*
diff --git a/app/assets/javascripts/src/Metamaps.Topic.js b/frontend/src/Metamaps/Metamaps.Topic.js
similarity index 99%
rename from app/assets/javascripts/src/Metamaps.Topic.js
rename to frontend/src/Metamaps/Metamaps.Topic.js
index a0ebfa82..faa8b336 100644
--- a/app/assets/javascripts/src/Metamaps.Topic.js
+++ b/frontend/src/Metamaps/Metamaps.Topic.js
@@ -1,3 +1,4 @@
+window.Metamaps = window.Metamaps || {}
/* global Metamaps, $ */
/*
diff --git a/app/assets/javascripts/src/Metamaps.TopicCard.js b/frontend/src/Metamaps/Metamaps.TopicCard.js
similarity index 98%
rename from app/assets/javascripts/src/Metamaps.TopicCard.js
rename to frontend/src/Metamaps/Metamaps.TopicCard.js
index 1453104d..fc007f3b 100644
--- a/app/assets/javascripts/src/Metamaps.TopicCard.js
+++ b/frontend/src/Metamaps/Metamaps.TopicCard.js
@@ -1,3 +1,4 @@
+window.Metamaps = window.Metamaps || {}
/* global Metamaps, $ */
/*
@@ -421,18 +422,18 @@ Metamaps.TopicCard = {
var inmapsLinks = topic.get('inmapsLinks') || []
nodeValues.inmaps = ''
if (inmapsAr.length < 6) {
- for (i = 0; i < inmapsAr.length; i++) {
+ for (let i = 0; i < inmapsAr.length; i++) {
var url = '/maps/' + inmapsLinks[i]
nodeValues.inmaps += '' + inmapsAr[i] + ''
}
} else {
- for (i = 0; i < 5; i++) {
+ for (let i = 0; i < 5; i++) {
var url = '/maps/' + inmapsLinks[i]
nodeValues.inmaps += '' + inmapsAr[i] + ''
}
extra = inmapsAr.length - 5
nodeValues.inmaps += 'See ' + extra + ' more...'
- for (i = 5; i < inmapsAr.length; i++) {
+ for (let i = 5; i < inmapsAr.length; i++) {
var url = '/maps/' + inmapsLinks[i]
nodeValues.inmaps += ''
}
diff --git a/app/assets/javascripts/src/Metamaps.Util.js b/frontend/src/Metamaps/Metamaps.Util.js
similarity index 99%
rename from app/assets/javascripts/src/Metamaps.Util.js
rename to frontend/src/Metamaps/Metamaps.Util.js
index e150d3bb..9ff9c470 100644
--- a/app/assets/javascripts/src/Metamaps.Util.js
+++ b/frontend/src/Metamaps/Metamaps.Util.js
@@ -1,3 +1,4 @@
+window.Metamaps = window.Metamaps || {}
/* global Metamaps */
/*
diff --git a/app/assets/javascripts/src/Metamaps.Views.js b/frontend/src/Metamaps/Metamaps.Views.js
similarity index 98%
rename from app/assets/javascripts/src/Metamaps.Views.js
rename to frontend/src/Metamaps/Metamaps.Views.js
index d027d22c..eb5fdb7c 100644
--- a/app/assets/javascripts/src/Metamaps.Views.js
+++ b/frontend/src/Metamaps/Metamaps.Views.js
@@ -1,3 +1,4 @@
+window.Metamaps = window.Metamaps || {}
/* global Metamaps, $ */
/*
diff --git a/app/assets/javascripts/src/Metamaps.Visualize.js b/frontend/src/Metamaps/Metamaps.Visualize.js
similarity index 99%
rename from app/assets/javascripts/src/Metamaps.Visualize.js
rename to frontend/src/Metamaps/Metamaps.Visualize.js
index 7168c03a..f5ce8c79 100644
--- a/app/assets/javascripts/src/Metamaps.Visualize.js
+++ b/frontend/src/Metamaps/Metamaps.Visualize.js
@@ -1,3 +1,4 @@
+window.Metamaps = window.Metamaps || {}
/* global Metamaps, $ */
/*
* Metamaps.Visualize
diff --git a/app/assets/javascripts/src/Metamaps.js.erb b/frontend/src/Metamaps/index.js
similarity index 60%
rename from app/assets/javascripts/src/Metamaps.js.erb
rename to frontend/src/Metamaps/index.js
index 839d701e..bf54483d 100644
--- a/app/assets/javascripts/src/Metamaps.js.erb
+++ b/frontend/src/Metamaps/index.js
@@ -1,26 +1,10 @@
-/* global Metamaps */
-
-/*
- * Metamaps.js.erb
- */
+window.Metamaps = window.Metamaps || {}
// TODO eliminate these 5 top-level variables
Metamaps.panningInt = null
Metamaps.tempNode = null
Metamaps.tempInit = false
Metamaps.tempNode2 = null
-Metamaps.VERSION = '<%= METAMAPS_VERSION %>'
-
-/* erb variables from rails */
-Metamaps.Erb = {}
-Metamaps.Erb['REALTIME_SERVER'] = '<%= ENV['REALTIME_SERVER'] %>'
-Metamaps.Erb['junto_spinner_darkgrey.gif'] = '<%= asset_path('junto_spinner_darkgrey.gif') %>'
-Metamaps.Erb['user.png'] = '<%= asset_path('user.png') %>'
-Metamaps.Erb['icons/wildcard.png'] = '<%= asset_path('icons/wildcard.png') %>'
-Metamaps.Erb['topic_description_signifier.png'] = '<%= asset_path('topic_description_signifier.png') %>'
-Metamaps.Erb['topic_link_signifier.png'] = '<%= asset_path('topic_link_signifier.png') %>'
-Metamaps.Erb['synapse16.png'] = '<%= asset_path('synapse16.png') %>'
-Metamaps.Metacodes = <%= Metacode.all.to_json.gsub(%r[(icon.*?)(\"},)], '\1?purple=stupid\2').html_safe %>
Metamaps.Settings = {
embed: false, // indicates that the app is on a page that is optimized for embedding in iFrames on other web pages
@@ -65,10 +49,39 @@ Metamaps.Mouse = {
Metamaps.Selected = {
reset: function () {
var self = Metamaps.Selected
-
self.Nodes = []
self.Edges = []
},
Nodes: [],
Edges: []
}
+
+require('./Metamaps.Account')
+require('./Metamaps.Admin')
+require('./Metamaps.AutoLayout')
+require('./Metamaps.Backbone')
+require('./Metamaps.Control')
+require('./Metamaps.Create')
+require('./Metamaps.Debug')
+require('./Metamaps.Filter')
+require('./Metamaps.GlobalUI')
+require('./Metamaps.Import')
+require('./Metamaps.JIT')
+require('./Metamaps.Listeners')
+require('./Metamaps.Map')
+require('./Metamaps.Mapper')
+require('./Metamaps.Mobile')
+require('./Metamaps.Organize')
+require('./Metamaps.PasteInput')
+require('./Metamaps.Realtime')
+require('./Metamaps.Router')
+require('./Metamaps.Synapse')
+require('./Metamaps.SynapseCard')
+require('./Metamaps.Topic')
+require('./Metamaps.TopicCard')
+require('./Metamaps.Util')
+require('./Metamaps.Views')
+require('./Metamaps.Visualize')
+require('./Metamaps.ReactComponents')
+
+export default window.Metamaps
diff --git a/frontend/src/index.js b/frontend/src/index.js
index 0556f4c1..e5705512 100644
--- a/frontend/src/index.js
+++ b/frontend/src/index.js
@@ -2,17 +2,14 @@ import React from 'react'
import ReactDOM from 'react-dom'
import Backbone from 'backbone'
import _ from 'underscore'
-import Maps from './components/Maps.js'
-// this is optional really, if we import components directly React will be
-// in the bundle, so we won't need a global reference
+import Metamaps from './Metamaps'
+
+// create global references to some libraries
window.React = React
window.ReactDOM = ReactDOM
-Backbone.$ = window.$
+Backbone.$ = window.$ // jquery from rails
window.Backbone = Backbone
window._ = _
-window.Metamaps = window.Metamaps || {}
-window.Metamaps.ReactComponents = {
- Maps
-}
+window.Metamaps = Metamaps