123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312 |
- /**
- * TraCINg-Server - Gathering and visualizing cyber incidents on the world
- *
- * Copyright 2013 Matthias Gazzari, Annemarie Mattmann, André Wolski
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
- function jVectorMap2GeoIP(cc){
- if(cc[0] != "_")
- return cc;
- else if(cc == "_0")
- return "TR"; // Northern Cyprus -> Turkey
- else if(cc == "_1")
- return "RS"; // Kosovo -> Serbia
- else if(cc == "_2")
- return "EH"; // Western Sahara <-> Western Sahara
- else if(cc == "_3")
- return "SO"; // Somaliland -> Somalia
- else console.log("Can not map cc '"+cc+"' to GeoIP!");
- }
- function GeoIP2jVectorMap(cc){
- if(cc == "TR")
- return ["_0", "TR"]; // Turkey -> Northern Cyprus and Turkey
- else if(cc == "RS")
- return ["_1", "RS"]; // Serbia -> Kosovo and Serbia
- else if(cc == "EH")
- return ["_2"]; // Western Sahara <-> Western Sahara
- else if(cc == "SO")
- return ["_3", "SO"]; // Somalia -> Somaliland and Somalia
- else if($.inArray(cc,filter.allCountriesJVectorMap) != -1)
- return [cc];
- else
- return []; // not implemented in jVectorMap
- }
- /*
- * containing all filter options
- */
- var filter = new function() {
- this.initialized = false;
- this.disableOnRegionSelected = false;
- this.allCountriesJVectorMap = []; // list of all countries from jvectormap, filled later
- this.allCountriesGeoIP = Object.keys(countryName); // list of all countries
-
- this.countries = null; // this are the currently selected countries
- this.countriesMap = null; // this are the currently selected countries from the map
-
- this.types = null; // stores selected attack types
- this.sensors = null; // stores selected sensor types
-
- this.updateCallback = null; // called on each update of a filter selection
- this.countrySelectionMap = null; // contains the jvectormap
- this.countrySelection; // contains the dropdown for countries
-
- this.authorizedCheckbox; // contains the checkbox
- this.attackTypeSelection; // contains the dropdown for attack types
- this.sensorTypeSelection; // contains the dropdown for sensor types
- this.initialize = function(){
- filter.authorizedCheckbox = $('#filterAuthorized');
-
- filter.initCountrySelection();
-
-
- /* initialize gui */
-
- $("#selectStatsCountries1").click(filter.show);
- $("#selectStatsCountries2").click(filter.show);
-
- $("#resetFilter").click(filter.reset);
- $("#selectCountriesFinish").click(filter.finish);
-
- filter.initialized = true;
- };
-
- this.initCountrySelection = function(){
- filter.countrySelectionMap = new jvm.WorldMap({
- container: $('#selectCountriesMap'),
- map: 'world_mill_en',
- backgroundColor: 'navy',
- regionsSelectable: true,
- // show region label function
- onRegionLabelShow: function(e, el, code) {
- el.html(el.html());
- },
- onRegionSelected: filter.clickJVectorMap
- });
-
- // resize to prevent the map from showing up tiny
- $("#selectCountriesView").on('shown', function(){
- $("#selectCountriesView").resize();
- });
-
- html = "";
- for(var key in countryName){
- html += "<option value='"+key+"'>"+countryName[key]+"</option>";
- }
- $("#selectCountriesSelection").html(html);
-
- filter.countrySelection = $("#selectCountriesSelection").multiselect({
- selectedText: "# of # countries selected",
- noneSelectedText: "Pick countries manually by clicking on the map or choose them here",
- position: {
- my: 'left bottom',
- at: 'left top'
- },
- minWidth: 550,
- header: false,
- click: filter.clickGeoIP
- });
-
- // retrieve all countries jvectormap knows
- for(var key in filter.countrySelectionMap.regions){
- filter.allCountriesJVectorMap.push(key);
- }
- // select all countries at the beginning
- //filter.countries = filter.allCountries;
-
-
- /* initialize gui */
-
-
-
- $("#selectCountriesAll").click(filter.selectAllCountries);
-
- $("#selectCountriesClear").click(filter.clearCountries);
- }
-
- // called from main.js on socket event 'setFields'
- this.initAttackTypes = function(){
- this.attackTypeSelection = $("#filterAttackType").multiselect({
- selectedText: "# of # attack types selected",
- noneSelectedText: "Filter attack types",
- position: {
- my: 'left bottom',
- at: 'left top'
- }
- });
- };
-
- // called from main.js on socket event 'setSensorTypes'
- this.initSensorTypes = function(){
- this.sensorTypeSelection = $("#filterSensorType").multiselect({
- selectedText: "# of # sensor types selected",
- noneSelectedText: "Filter sensor types",
- position: {
- my: 'left bottom',
- at: 'left top'
- }
- });
- };
- this.show = function(){
- filter.countrySelection.val(filter.countries);
- filter.countrySelection.multiselect("refresh");
- filter.disableOnRegionSelected = true;
- filter.countrySelectionMap.setSelectedRegions(filter.countriesMap);
- filter.disableOnRegionSelected = false;
- filter.attackTypeSelection.val(filter.types);
- filter.attackTypeSelection.multiselect("refresh");
- filter.sensorTypeSelection.val(filter.sensors);
- filter.sensorTypeSelection.multiselect("refresh");
- $("#selectCountriesView").modal("show");
- };
- this.finish = function(){
- filter.countries = filter.countrySelection.val();
- filter.countriesMap = filter.countrySelectionMap.getSelectedRegions();
-
- filter.types = filter.attackTypeSelection.val();
- filter.sensors = filter.sensorTypeSelection.val();
- $("#selectCountriesView").modal("hide");
-
- if(filter.updateCallback)
- filter.updateCallback();
- else
- console.log("filter.updateCallback is null");
- };
- this.selectAllCountries = function(){
- filter.disableOnRegionSelected = true;
- filter.countrySelectionMap.setSelectedRegions(filter.allCountriesJVectorMap);
- filter.countrySelection.multiselect("checkAll");
- filter.disableOnRegionSelected = false;
- };
- this.clearCountries = function(){
- filter.disableOnRegionSelected = true;
- filter.countrySelectionMap.clearSelectedRegions();
- filter.countrySelection.multiselect("uncheckAll");
- filter.disableOnRegionSelected = false;
- };
-
- this.reset = function(){
- filter.clearCountries();
- filter.attackTypeSelection.multiselect("uncheckAll");
- filter.sensorTypeSelection.multiselect("uncheckAll");
- filter.countrySelection.multiselect("uncheckAll");
- filter.authorizedCheckbox.prop("checked", false);
- };
- this.clickJVectorMap = function(e, cc, isSelected, selectedRegions){
- if(filter.disableOnRegionSelected)
- return;
-
- var geoipcc = jVectorMap2GeoIP(cc);
- filter.updateJVectorMap(geoipcc, isSelected);
- filter.updateGeoIP(geoipcc, isSelected);
- };
- this.clickGeoIP = function(e, ui){
- filter.updateJVectorMap(ui.value, ui.checked);
- };
- this.updateJVectorMap = function(cc, isSelected){
- var jVectorMapCCs = GeoIP2jVectorMap(cc);
-
- if(jVectorMapCCs && jVectorMapCCs.length > 0){
- var jVectorMapObj = {};
- for(var i = 0; i < jVectorMapCCs.length; i++){
- var _cc = jVectorMapCCs[i];
- jVectorMapObj[_cc] = isSelected;
- }
-
- filter.countrySelectionMap.setSelectedRegions(jVectorMapObj);
- }
- };
- this.updateGeoIP = function(cc, isSelected){
- var val = filter.countrySelection.val();
- if(!val) val = [];
- if(isSelected){
- val.push(cc);
- }
- else{
- var index = $.inArray(cc, val);
- if(index != -1)
- val.splice(index, 1);
- }
- filter.countrySelection.val(val);
- filter.countrySelection.multiselect("refresh");
- }
- this.load = function(cb){
- if(!filter.initialized){
- setTimeout(function(){filter.load(cb);}, 50); // retry in 50ms
- return;
- }
- if(cb){
- filter.updateCallback = cb;
- }
- else{
- filter.updateCallback = null;
- }
- };
- this.unload = function(){
- if(!filter.initialized){
- setTimeout(filter.unload, 50); // retry in 50ms
- return;
- }
- filter.updateCallback = null;
- };
-
- this.getFilter = function(){
- var obj = {};
-
- // filter for only authorized when box is checked
- if(filter.authorizedCheckbox && filter.authorizedCheckbox.prop('checked'))
- obj["authorized"] = true;
-
- if(filter.types && filter.types.length > 0)
- obj["types"] = filter.types;
- if(filter.sensors && filter.sensors.length > 0)
- obj["sensors"] = filter.sensors;
- // do not filter countries if none or all are selected
- if(filter.countries && filter.countries.length != 0 && filter.countries.length != filter.allCountriesGeoIP.length)
- obj["countries"] = filter.countries;
-
- return obj;
- };
- };
- $(function(){
- filter.initialize();
- });
|