/* $This file is distributed under the terms of the license in /doc/license.txt$ */ COMPARISON = { "one":{ "name": "one", "color": "#1e90ff"}, "two":{ "name": "two", "color": "#ff69b4"}, "three":{ "name": "three", "color": "#32cd32"} } COMPARISON_TYPE = { "ORGANIZATION": "ORGANIZATION", "PERSON": "PERSON" } var ManagerRegistry = Class.extend({ init: function(itemArray) { this.occupied = {}; this.availability = itemArray; }, register: function(key) { var me = this; if (me.occupied[key] == null && me.isAvailable()) { me.occupied[key] = me.availability.pop(); } return me.occupied[key]; }, unregister: function(key) { var me = this; var item = me.occupied[key]; if (item) { me.availability.push(me.occupied[key]); delete me.occupied[key]; } return item; }, isAvailable: function() { return (this.availability.length != 0); } }); var ComparisonScimapWidget = Class.extend({ init: function(map) { var me = this; me.activeCompositeManager = null; me.map = map; me.initView(); }, initView: function(){ var me = this; me.initControlPanels(); me.initMarkerManagers(); me.show(COMPARISON_TYPE.ORGANIZATION); this.activeCompositeManager.addManagersToMap(); this.updateDisplayedMarkers(); }, cleanView: function() { var me = this; me._cleanUpManagers(); me.sliderControl.removeFromMap(); me.disciplineLabelsControl.removeFromMap(); me.labelsMarkerManager.removeMarkersFromMap(); }, initControlPanels: function() { var me = this; /* Create slider control panel */ if (me.sliderControl == null) { me.sliderControl = new SliderControlPanel({ map:me.map, controlPositions: google.maps.ControlPosition.RIGHT_BOTTOM }); } /* Register event */ me.sliderControl.addToMap(); me.sliderControl.setChangeEventHandler(function(event, ui) { if (me.keyToCompositeManager) { me.updateDisplayedMarkers(); } }); /* create */ if (me.disciplineLabelsControl == null) { me.labelsMarkerManager = new DisciplineLabelsMarkerManager(map); me.disciplineLabelsControl = new CheckBoxPanel({ map: map, checked: true, text: "Show discipline labels", click: function() { if($(this).attr('checked')) { me.labelsMarkerManager.showMarkers(); } else { me.labelsMarkerManager.hideMarkers(); } } }); } /* Display labels if checked */ me.disciplineLabelsControl.addToMap(); me.labelsMarkerManager.addMarkersToMap(); if (me.disciplineLabelsControl.isChecked()) { me.labelsMarkerManager.showMarkers(); } }, initMarkerManagers: function() { if (this.keyToCompositeManager == null) { // Create all the marker managers var me = this; me.keyToCompositeManager = {}; $.each(COMPARISON_TYPE, function(type, value) { var managerArray = []; $.each(COMPARISON, function(key, attrs) { var manager = new SubdisciplineMarkerManager( me.map, new SingleColorStrategy(attrs.color), null ); manager.color = attrs.color; managerArray.push(manager); }); me.keyToCompositeManager[type] = new CompositeMarkerManager(); me.keyToCompositeManager[type].registry = new ManagerRegistry(managerArray); }); } }, loadJsonData: function(data) { this.isUnloaded = false; }, loadEntity: function(data) { var me = this; me.uri = data.uri; me.label = data.label; me.pubsWithNoJournals = data.pubsWithNoJournals; me.pubsWithInvalidJournals = data.pubsWithInvalidJournals; me.pubsMapped = data.pubsMapped; var scienceActivities = data.subdisciplineActivity; var childKey = data.label; var compositeManager = me.getCompositeManager(data.type); // Avoid reload if data was loaded if (compositeManager.hasKey(childKey)) { me.updateMap(); } else { var manager = compositeManager.registry.register(childKey); if (manager) { // clean previous markers manager.removeAll(); // Need to create the AreaSizeCoding function manager.setSizeCoder(new CircleSizeCoder({ scaler: new Scaler({ maxValue: me.pubsMapped }) })); $.each(scienceActivities, function(science, density) { // Create marker and add it to manager manager.createMarker(science, density); }); // end each scienceActivity manager.sort(); compositeManager.addManager(childKey, manager); me.updateMap(); } } }, unloadEntity: function(key, childKey) { this.removeManager(key, childKey); }, getCompositeManager: function(key) { return this.keyToCompositeManager[key]; }, mouseIn: function(key, childKey) { var compositeManager = this.getCompositeManager(key); // Focus if only it is a valid manager if (compositeManager == this.activeCompositeManager) { // Focus all compositeManager.mouseIn(childKey); } }, mouseOut: function(key, childKey) { var compositeManager = this.getCompositeManager(key); // Unfocus if only it is a valid manager if (compositeManager == this.activeCompositeManager) { // Unfocus all compositeManager.mouseOut(childKey); } }, removeManager: function(key, childKey) { var compositeManager = this.getCompositeManager(key); // Remove manager if (compositeManager == this.activeCompositeManager) { this.activeCompositeManager.removeManager(childKey); this.activeCompositeManager.registry.unregister(childKey); } }, show: function(key) { var compositeManager = this.getCompositeManager(key); if (compositeManager) { this._switchActiveCompositeManager(compositeManager); } }, hide: function(key) { var compositeManager = this.getCompositeManager(key); if (this.activeCompositeManager == compositeManager) { this._cleanupMarkers(); } }, _switchActiveCompositeManager: function(compositeManager) { if (this.activeCompositeManager != compositeManager) { this._cleanUpManagers(); compositeManager.addManagersToMap(); this.activeCompositeManager = compositeManager; this.updateMap(); } }, _cleanUpManagers: function() { if (this.activeCompositeManager) { this.activeCompositeManager.removeManagersFromMap(); INFO_WINDOW.close(); } }, updateDisplayedMarkers: function() { this.activeCompositeManager.display(this.sliderControl.getValue()); }, updateMap: function() { var compositeManager = this.activeCompositeManager; if (compositeManager) { var length = compositeManager.length(); var slider = this.sliderControl; slider.setMin(Math.min(1, length)); slider.setMax(length); slider.setValue(length); } }, changeFilter: function(filterType) { this.show(filterType); }, getColor: function(key, childKey) { return this.getCompositeManager(key).registry.register(childKey).color; } });