diff d3s_examples/python-neo4jrestclient/static/platin/js/Dataloader/DataloaderWidget.js @ 8:18ef6948d689

new d3s examples
author Dirk Wintergruen <dwinter@mpiwg-berlin.mpg.de>
date Thu, 01 Oct 2015 17:17:27 +0200
parents
children
line wrap: on
line diff
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/d3s_examples/python-neo4jrestclient/static/platin/js/Dataloader/DataloaderWidget.js	Thu Oct 01 17:17:27 2015 +0200
@@ -0,0 +1,410 @@
+/*
+* DataloaderWidget.js
+*
+* Copyright (c) 2013, Sebastian Kruse. All rights reserved.
+*
+* This library is free software; you can redistribute it and/or
+* modify it under the terms of the GNU Lesser General Public
+* License as published by the Free Software Foundation; either
+* version 3 of the License, or (at your option) any later version.
+*
+* This library is distributed in the hope that it will be useful,
+* but WITHOUT ANY WARRANTY; without even the implied warranty of
+* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+* Lesser General Public License for more details.
+*
+* You should have received a copy of the GNU Lesser General Public
+* License along with this library; if not, write to the Free Software
+* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston,
+* MA 02110-1301  USA
+*/
+
+/**
+ * @class DataloaderWidget
+ * DataloaderWidget Implementation
+ * @author Sebastian Kruse (skruse@mpiwg-berlin.mpg.de)
+ *
+ * @param {WidgetWrapper} core wrapper for interaction to other widgets
+ * @param {HTML object} div parent div to append the Dataloader widget div
+ * @param {JSON} options user specified configuration that overwrites options in DataloaderConfig.js
+ */
+DataloaderWidget = function(core, div, options) {
+
+	this.core = core;
+	this.core.setWidget(this);
+
+	this.options = (new DataloaderConfig(options)).options;
+	this.gui = new DataloaderGui(this, div, this.options);
+	
+	this.dataLoader = new Dataloader(this);
+	
+	this.datasets = [];
+}
+
+DataloaderWidget.prototype = {
+
+	initWidget : function() {
+
+		var dataloaderWidget = this;
+	},
+
+	highlightChanged : function(objects) {
+		if( !GeoTemConfig.highlightEvents ){
+			return;
+		}
+	},
+
+	selectionChanged : function(selection) {
+		if( !GeoTemConfig.selectionEvents ){
+			return;
+		}
+	},
+
+	triggerHighlight : function(item) {
+	},
+
+	tableSelection : function() {
+	},
+
+	deselection : function() {
+	},
+
+	filtering : function() {
+	},
+
+	inverseFiltering : function() {
+	},
+
+	triggerRefining : function() {
+	},
+
+	reset : function() {
+	},
+	
+	loadRenames : function(){
+		//load (optional!) attribute renames
+		//each rename param is {latitude:..,longitude:..,place:..,date:..,timeSpanBegin:..,timeSpanEnd:..}
+		//examples:
+		//	&rename1={"latitude":"lat1","longitude":"lon1"}
+		//	&rename2=[{"latitude":"lat1","longitude":"lon1"},{"latitude":"lat2","longitude":"lon2"}]
+		var dataLoaderWidget = this;
+		var datasets = dataLoaderWidget.datasets;
+		jQuery.each(jQuery.url().param(),function(paramName, paramValue){
+			if (paramName.toLowerCase().startsWith("rename")){
+				var datasetID = parseInt(paramName.replace(/\D/g,''));
+				var dataset;
+				if (isNaN(datasetID)){
+					var dataset;
+					for (datasetID in datasets){
+						break;
+					}
+				}
+				dataset = datasets[datasetID];
+
+				if (typeof dataset === "undefined")
+					return;
+				
+				var renameFunc = function(index,latAttr,lonAttr,placeAttr,dateAttr,timespanBeginAttr,
+						timespanEndAttr,indexAttr){
+					var renameArray = [];
+					
+					if (typeof index === "undefined"){
+						index = 0;
+					}
+					
+					if ((typeof latAttr !== "undefined") && (typeof lonAttr !== "undefined")){
+						renameArray.push({
+							oldColumn:latAttr,
+							newColumn:"locations["+index+"].latitude"
+						});
+						renameArray.push({
+							oldColumn:lonAttr,
+							newColumn:"locations["+index+"].longitude"
+						});
+					}
+					
+					if (typeof placeAttr !== "undefined"){
+						renameArray.push({
+							oldColumn:placeAttr,
+							newColumn:"locations["+index+"].place"
+						});
+					}
+
+					if (typeof dateAttr !== "undefined"){
+						renameArray.push({
+							oldColumn:dateAttr,
+							newColumn:"dates["+index+"]"
+						});
+					}
+
+					if ((typeof timespanBeginAttr !== "undefined") && 
+							(typeof timespanEndAttr !== "undefined")){
+						renameArray.push({
+							oldColumn:timespanBeginAttr,
+							newColumn:"tableContent[TimeSpan:begin]"
+						});
+						renameArray.push({
+							oldColumn:timespanEndAttr,
+							newColumn:"tableContent[TimeSpan:end]"
+						});
+					}
+
+					if (typeof indexAttr !== "undefined"){
+						renameArray.push({
+							oldColumn:indexAttr,
+							newColumn:"index"
+						});
+					}
+					
+					GeoTemConfig.renameColumns(dataset,renameArray);
+				};
+				
+				var renames = JSON.parse(paramValue);
+
+				if (renames instanceof Array){
+					for (var i=0; i < renames.length; i++){
+						renameFunc(i,renames[i].latitude,renames[i].longitude,renames[i].place,renames[i].date,
+							renames[i].timeSpanBegin,renames[i].timeSpanEnd,renames[i].index);
+					}
+				} else {
+					renameFunc(0,renames.latitude,renames.longitude,renames.place,renames.date,
+							renames.timeSpanBegin,renames.timeSpanEnd,renames.index);
+				}
+			}
+		});
+	},
+	
+	loadFilters : function(){
+		//load (optional!) filters
+		//those will create a new(!) dataset, that only contains the filtered IDs
+		var dataLoaderWidget = this;
+		var datasets = dataLoaderWidget.datasets;
+		$.each($.url().param(),function(paramName, paramValue){
+			//startsWith and endsWith defined in SIMILE Ajax (string.js)
+			if (paramName.toLowerCase().startsWith("filter")){
+				var datasetID = parseInt(paramName.replace(/\D/g,''));
+				var dataset;
+				if (isNaN(datasetID)){
+					var dataset;
+					for (datasetID in datasets){
+						break;
+					}
+				}
+				dataset = datasets[datasetID];
+				
+				if (typeof dataset === "undefined")
+					return;
+				
+				var filterValues = function(paramValue){
+					var filter = JSON.parse(paramValue);
+					var filteredObjects = [];
+					for(var i = 0; i < dataset.objects.length; i++){
+						var dataObject = dataset.objects[i];
+						if ($.inArray(dataObject.index,filter) != -1){
+							filteredObjects.push(dataObject);
+						}
+					}
+					var filteredDataset = new Dataset(filteredObjects, dataset.label + " (filtered)", dataset.url, dataset.type);
+					datasets.push(filteredDataset);
+				}
+				
+				if (paramValue instanceof Array){
+					for (var i=0; i < paramValue.length; i++){
+						filterValues(paramValue[i]);
+					}
+				} else {
+					filterValues(paramValue);
+				}
+
+			}
+		});		
+	},
+	
+	loadColors : function(){
+		//Load the (optional!) dataset colors
+		var dataLoaderWidget = this;
+		var datasets = dataLoaderWidget.datasets;
+		$.each($.url().param(),function(paramName, paramValue){
+			if (paramName.toLowerCase().startsWith("color")){
+				//color is 1-based, index is 0-based!
+				var datasetID = parseInt(paramName.replace(/\D/g,''));
+				if (datasets.length > datasetID){
+					if (typeof datasets[datasetID].color === "undefined"){
+						var color = new Object();
+						var colorsSelectedUnselected = paramValue.split(",");
+						if (colorsSelectedUnselected.length > 2)
+							return;
+						
+						var color1 = colorsSelectedUnselected[0];
+						if (color1.length != 6)
+							return;
+						
+						color.r1 = parseInt(color1.substr(0,2),16);
+						color.g1 = parseInt(color1.substr(2,2),16);
+						color.b1 = parseInt(color1.substr(4,2),16);
+						
+						//check if a unselected color is given
+						if (colorsSelectedUnselected.length == 2){
+							var color0 = colorsSelectedUnselected[1];
+							if (color0.length != 6)
+								return;
+							
+							color.r0 = parseInt(color0.substr(0,2),16);
+							color.g0 = parseInt(color0.substr(2,2),16);
+							color.b0 = parseInt(color0.substr(4,2),16);
+						} else {
+							//if not: use the selected color "halved"
+							color.r0 = Math.round(color.r1/2);
+							color.g0 = Math.round(color.g1/2);
+							color.b0 = Math.round(color.b1/2);
+						}
+						
+						datasets[datasetID].color = color;
+					}	
+				}
+			}	
+		});		
+	},
+	
+	loadFromURL : function() {
+		
+		var dataLoaderWidget = this;
+		dataLoaderWidget.datasets = [];
+		//using jQuery-URL-Parser (https://github.com/skruse/jQuery-URL-Parser)
+		var datasets = dataLoaderWidget.datasets;
+		//var parametersHash = jQuery.url().param();
+		var parametersHash = [];
+		var parametersArray = [];
+		jQuery.each(parametersHash,function(paramName, paramValue){
+			parametersArray.push({paramName:paramName, paramValue:paramValue});
+		});
+		
+		var parseParam = function(paramNr){
+			
+			if (paramNr==parametersArray.length){
+				dataLoaderWidget.loadRenames();
+				dataLoaderWidget.loadFilters();
+				dataLoaderWidget.loadColors();
+
+				//delete undefined entries in the array
+				//(can happen if the sequence given in the URL is not complete
+				// e.g. kml0=..,kml2=..)
+				//this also reorders the array,	 starting with 0
+				var tempDatasets = [];
+				for(var index in datasets){
+					if (datasets[index] instanceof Dataset){
+						tempDatasets.push(datasets[index]);
+					}
+				}
+				datasets = tempDatasets;
+				
+				if (datasets.length > 0){
+					dataLoaderWidget.dataLoader.distributeDatasets(datasets);
+				}
+				return;
+			}
+			
+			var paramName = parametersArray[paramNr].paramName;
+			var paramValue = parametersArray[paramNr].paramValue;
+
+			var datasetID = parseInt(paramName.replace(/\D/g,''));
+			
+			//startsWith and endsWith defined in SIMILE Ajax (string.js)
+			var fileName = dataLoaderWidget.dataLoader.getFileName(paramValue);
+			var origURL = paramValue;
+			if (typeof GeoTemConfig.proxy != 'undefined')
+				paramValue = GeoTemConfig.proxy + paramValue;
+			if (paramName.toLowerCase().startsWith("kml")){
+				GeoTemConfig.getKml(paramValue, function(kmlDoc){
+					var dataSet = new Dataset(GeoTemConfig.loadKml(kmlDoc), fileName, origURL);
+					if (dataSet != null){
+						if (!isNaN(datasetID)){
+							datasets[datasetID] = dataSet;
+						} else {
+							datasets.push(dataSet);							
+						}
+					}
+					setTimeout(function(){parseParam(paramNr+1)},1);
+				});
+			}
+			else if (paramName.toLowerCase().startsWith("csv")){
+				GeoTemConfig.getCsv(paramValue,function(json){
+					var dataSet = new Dataset(GeoTemConfig.loadJson(json), fileName, origURL);
+					if (dataSet != null){
+						if (!isNaN(datasetID)){
+							datasets[datasetID] = dataSet;
+						} else {
+							datasets.push(dataSet);							
+						}
+					}
+					setTimeout(function(){parseParam(paramNr+1)},1);
+				});
+			}
+			else if (paramName.toLowerCase().startsWith("json")){
+				GeoTemConfig.getJson(paramValue,function(json ){
+					var dataSet = new Dataset(GeoTemConfig.loadJson(json), fileName, origURL);
+					if (dataSet != null){
+						if (!isNaN(datasetID)){
+							datasets[datasetID] = dataSet;
+						} else {
+							datasets.push(dataSet);							
+						}
+					}
+					setTimeout(function(){parseParam(paramNr+1)},1);
+				});
+			}
+			else if (paramName.toLowerCase().startsWith("local")){
+				var csv = $.remember({name:encodeURIComponent(origURL)});
+				//TODO: this is a bad idea and will be changed upon having a better
+				//usage model for local stored data
+				var fileName = origURL.substring("GeoBrowser_dataset_".length);
+				var json = GeoTemConfig.convertCsv(csv);
+				var dataSet = new Dataset(GeoTemConfig.loadJson(json), fileName, origURL, "local");
+				if (dataSet != null){
+					if (!isNaN(datasetID)){
+						datasets[datasetID] = dataSet;
+					} else {
+						datasets.push(dataSet);							
+					}
+				}
+				setTimeout(function(){parseParam(paramNr+1)},1);
+			} else if (paramName.toLowerCase().startsWith("xls")){
+				GeoTemConfig.getBinary(paramValue,function(binaryData){
+					var data = new Uint8Array(binaryData);
+					var arr = new Array();
+					for(var i = 0; i != data.length; ++i){
+						arr[i] = String.fromCharCode(data[i]);
+					}
+					
+					var workbook;
+		        	var json;
+		        	if (paramName.toLowerCase().startsWith("xlsx")){
+		        		workbook = XLSX.read(arr.join(""), {type:"binary"});
+		        		var csv = XLSX.utils.sheet_to_csv(workbook.Sheets[workbook.SheetNames[0]]);
+		        		var json = GeoTemConfig.convertCsv(csv);
+		        	} else {
+		        		workbook = XLS.read(arr.join(""), {type:"binary"});
+		        		var csv = XLS.utils.sheet_to_csv(workbook.Sheets[workbook.SheetNames[0]]);
+		        		var json = GeoTemConfig.convertCsv(csv);
+		        	}
+		        	
+					var dataSet = new Dataset(GeoTemConfig.loadJson(json), fileName, origURL);
+					if (dataSet != null){
+						if (!isNaN(datasetID)){
+							datasets[datasetID] = dataSet;
+						} else {
+							datasets.push(dataSet);							
+						}
+					}
+					setTimeout(function(){parseParam(paramNr+1)},1);
+				});
+			} else {
+				setTimeout(function(){parseParam(paramNr+1)},1);
+			}
+		};
+		
+		if (parametersArray.length>0){
+			parseParam(0)
+		}
+	}
+};