/* $This file is distributed under the terms of the license in /doc/license.txt$ */ /** * The MarkerManager is more like a composite class of Marker. It manages * markers by grouping the markers by keys. */ var MarkerManager = Class.extend({ init: function() { this.keyToMarker = {}; }, addMarker: function(key, marker) { this.keyToMarker[key] = marker; }, length: function() { var size = 0; for (var key in this.keyToMarker) { if (this.keyToMarker.hasOwnProperty(key)) size++; } return size; }, getMarker: function(key) { return this.keyToMarker[key]; }, getMarkerArray: function() { var array = []; $.each(this.keyToMarker, function(i, e){ array.push(e); }); return array; }, hasKey: function(key) { return (this.keyToMarker.hasOwnProperty(key)); }, showMarkers: function() { $.each(this.keyToMarker, function(i, marker) { marker.show(); }); }, hideMarkers: function() { $.each(this.keyToMarker, function(i, marker) { marker.hide(); }); }, addMarkersToMap: function() { $.each(this.keyToMarker, function(i, marker) { marker.addToMap(); }); }, removeMarkersFromMap: function() { $.each(this.keyToMarker, function(i, marker) { marker.removeFromMap(); }); } }); /** * Customized Discipline labels MarkerManager for Science map purpose. It is an abstract class */ var DisciplineLabelsMarkerManager = MarkerManager.extend({ init: function(map) { this._super(); this.map = map; this.initMarkers(map); }, initMarkers: function(map) { me = this; $.each(DISCIPLINES, function(id, discipline) { var opts = { map: map, position: createNoWrapLatLng(discipline.labelLatitude, discipline.labelLongitude), icon: getDisciplineLabelImageURL(id), clickable: false }; me.addMarker(id, new Marker(opts)); }); }, showMarkers: function() { this._super(); } }); /** * Customized MarkerManager for Science map purpose. It is an abstract class */ var ScimapMarkerManager = MarkerManager.extend({ init: function(map, colorStrategy, sizeCoder) { this._super(); this.colorStrategy = colorStrategy; this.sizeCoder = sizeCoder; this.map = map; this.maxValue = 1; this.layer = {}; }, setSizeCoder: function(sizeCoder) { this.sizeCoder = sizeCoder; this.maxValue = sizeCoder.getMaxValue(); }, createMarker: function(key, density) { var me = this; var marker; if (!me.hasKey(key)) { var size = me.sizeCoder.getSize(density); var color = me.colorStrategy.getColor(key); var layer = me.layer; var label = layer[key].label; var latlng = createNoWrapLatLng(layer[key].latitude, layer[key].longitude); marker = createScinodeMarker(me.map, label, density, size, color, latlng); me.addMarker(key, marker); } else { marker = me.keyToMarker[key]; marker.setValue(marker.getValue() + density); marker.setSize(me.sizeCoder.getSize(marker.getValue())); } return marker; }, updateMarkerViews: function() { var me = this; for (var key in me.keyToMarker) { var marker = me.keyToMarker[key]; marker.setSize(me.sizeCodingFunc(marker.getValue())); marker.setColor(me.colorStrategy.getColor(key)); } }, display: function(numberOfMarkers) { var markerArray = this.sortedMarkers; if (!markerArray || !markerArray.length) { markerArray = this.getMarkerArray(); } $.each(markerArray, function() { if (numberOfMarkers > 0) { this.show(); numberOfMarkers--; } else { this.hide(); } }); }, mouseIn: function(key) { var marker = this.getMarker(key); if (marker) { marker.focus(); } }, mouseInAll: function() { $.each(this.keyToMarker, function(i, marker) { marker.focus(); }); }, mouseOut: function(key) { var marker = this.getMarker(key); if (marker) { marker.unfocus(); } }, mouseOutAll: function() { $.each(this.keyToMarker, function(i, marker) { marker.unfocus(); }); }, sort: function() { this.sortedMarkers = this.getMarkerArray(); this.sortedMarkers.sort(function(a, b) { return b.getValue() -a.getValue(); }); } }); var DisciplineMarkerManager = ScimapMarkerManager.extend({ init: function(map, colorStrategy, sizeCoder) { this._super(map, colorStrategy, sizeCoder); this.layer = DISCIPLINES; }, createMarker: function(subdisciplineKey, density) { var me = this; var key = SUBDISCIPLINES[subdisciplineKey].discipline; var marker = this._super(key, density); var poly = marker.polygon; marker.setContent( '