Graph_wev8.js 3.26 KB
/*
	Copyright (c) 2004-2005, The Dojo Foundation
	All Rights Reserved.

	Licensed under the Academic Free License version 2.1 or above OR the
	modified BSD license. For more information on Dojo licensing, see:

		http://dojotoolkit.org/community/licensing.shtml
*/

dojo.provide("dojo.collections.Graph");
dojo.require("dojo.collections.Collections");

dojo.collections.Graph = function(nodes){
	function node(key, data, neighbors) {
		this.key = key;
		this.data = data;
		this.neighbors = neighbors || new adjacencyList();
		this.addDirected = function(){
			if (arguments[0].constructor == edgeToNeighbor){
				this.neighbors.add(arguments[0]);
			} else {
				var n = arguments[0];
				var cost = arguments[1] || 0;
				this.neighbors.add(new edgeToNeighbor(n, cost));
			}
		}
	}
	function nodeList(){
		var d = new dojo.collections.Dictionary();
		function nodelistiterator(){
			var o = [] ;	//	Create an indexing array
			var e = d.getIterator();
			while (e.moveNext()) o[o.length] = e.current;

			var position = 0 ;
			this.current = null ;
			this.entry = null ;
			this.key = null ;
			this.value = null ;
			this.atEnd = false ;
			this.moveNext = function() { 
				if (this.atEnd) return !this.atEnd ;
				this.entry = this.current = o[position] ;
				if (this.entry) {
					this.key = this.entry.key ;
					this.value = this.entry.data ;
				}
				if (position == o.length) this.atEnd = true ;
				position++ ;
				return !this.atEnd ;
			} ;
			this.reset = function() { 
				position = 0 ; 
				this.atEnd = false ;
			} ;
		}
		
		this.add = function(node){
			d.add(node.key, node);
		};
		this.clear = function(){
			d.clear();
		};
		this.containsKey = function(key){
			return d.containsKey(key);
		};
		this.getIterator = function(){
			return new nodelistiterator(this);
		};
		this.item = function(key){
			return d.item(key);
		};
		this.remove = function(node){
			d.remove(node.key);
		};
	}
	function edgeToNeighbor(node, cost){
		this.neighbor = node;
		this.cost = cost;
	}
	function adjacencyList(){
		var d = [];
		this.add = function(o){
			d.push(o);
		};
		this.item = function(i){
			return d[i];
		};
		this.getIterator = function(){
			return new dojo.collections.Iterator([].concat(d));
		};
	}

	this.nodes = nodes || new nodeList();
	this.count = this.nodes.count;
	this.clear = function(){
		this.nodes.clear();
		this.count = 0;
	};
	this.addNode = function(){
		var n = arguments[0];
		if (arguments.length > 1) {
			n = new node(arguments[0], arguments[1]);
		}
		if (!this.nodes.containsKey(n.key)) {
			this.nodes.add(n);
			this.count++;
		}
	};
	this.addDirectedEdge = function(uKey, vKey, cost){
		var uNode, vNode;
		if (uKey.constructor != node) {
			uNode = this.nodes.item(uKey);
			vNode = this.nodes.item(vKey);
		} else {
			uNode = uKey;
			vNode = vKey;
		}
		var c = cost || 0;
		uNode.addDirected(vNode, c);
	};
	this.addUndirectedEdge = function(uKey, vKey, cost){
		var uNode, vNode;
		if (uKey.constructor != node) {
			uNode = this.nodes.item(uKey);
			vNode = this.nodes.item(vKey);
		} else {
			uNode = uKey;
			vNode = vKey;
		}
		var c = cost || 0;
		uNode.addDirected(vNode, c);
		vNode.addDirected(uNode, c);
	};
	this.contains = function(n){
		return this.nodes.containsKey(n.key);
	};
	this.containsKey = function(k){
		return this.nodes.containsKey(k);
	};
}