 			jsonCache.getJsonObject(getUrl(method, params), handler);
 		}
 		
-		private var functionCache:Dictionary2D = new Dictionary2D();
-		
 		public function createCategoryNode(data:Object = null):ColumnTreeNode
 		{
 			if (!data)

							function(event:ResultEvent, csv:CSVDataSource):void
							{
								var result:Object = JsonCache.parseJSON(event.result.toString());
								var columnOrder:Array = ['date', 'realtime_start', 'realtime_end', 'value'];
								var rows:Array = WeaveAPI.CSVParser.convertRecordsToRows(result.observations, columnOrder);
								csv.csvData.setSessionState(rows);
								var valueTitle:String = lang("{0} ({1})", data.title, data.units);
								var metadataArray:Array = [
									{title: 'date', dataType: DataType.DATE, dateFormat: 'YYYY-MM-DD'},
									{title: 'realtime_start', dataType: DataType.DATE, dateFormat: 'YYYY-MM-DD'},
									{title: 'realtime_end', dataType: DataType.DATE, dateFormat: 'YYYY-MM-DD'},
									{title: valueTitle, dataType: DataType.NUMBER},
								];
								csv.metadata.setSessionState(metadataArray);
							},

				var name:String = WeaveAPI.globalHashMap.getName(this);
				data = {id: 0, name: name};
			}
			return new ColumnTreeNode({
				data: data,
				label: data.name,
				isBranch: true,
				hasChildBranches: true,
				children: function(node:ColumnTreeNode):Array {
					var children:Array = node.data.childNodes;
					if (!children)
					{
						node.data.childNodes = children = [];
						getJson('category/children', {category_id: node.data.id}, function(result:Object):void {
							var nodes:Array = [];
							for each (var item:Object in result.categories)
								nodes.push(createCategoryNode(item));
							// put categories first in the list
							children.splice.apply(null, [0, 0].concat(nodes));
						});
						getJson('category/series', {category_id: node.data.id}, function(result:Object):void {
							for each (var item:Object in result.seriess)
								children.push(createSeriesNode(item));
						});
					}
					return children;
				}
			});
		}
		
		private var csvCache:Object = {};
		public function getObservationsCSV(series_id:String):CSVDataSource
		{
			var csv:CSVDataSource = csvCache[series_id];
			if (!csv)
			{
				csv = newLinkableChild(this, CSVDataSource);
				csvCache[series_id] = csv;
				
				var request1:URLRequest = new URLRequest(getUrl('series', {series_id: series_id}));
				addAsyncResponder(
