text: /*
  	Copyright (c) 2004-2006, 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.SortedList");
  dojo.require("dojo.collections.Collections");
  
  dojo.collections.SortedList=function(/* object? */ dictionary){
  	//	summary
  	//	creates a collection that acts like a dictionary but is also internally sorted.
  	//	Note that the act of adding any elements forces an internal resort, making this object potentially slow.
  	var _this=this;
  	var items={};
  	var q=[];
  	var sorter=function(a,b){
  		if (a.key > b.key) return 1;
  		if (a.key < b.key) return -1;
  		return 0;
  	};
  	var build=function(){
  		q=[];
  		var e=_this.getIterator();
  		while (!e.atEnd()){
  			q.push(e.get());
  		}
  		q.sort(sorter);
  	};
  	var testObject={};
  
  	this.count=q.length;
  	this.add=function(/* string */ k,/* object */v){
  		//	summary
  		//	add the passed value to the dictionary at location k
  		if (!items[k]) {
  			items[k]=new dojo.collections.DictionaryEntry(k,v);
  			this.count=q.push(items[k]);
  			q.sort(sorter);
  		}
  	};
  	this.clear=function(){
  		//	summary
  		//	clear the internal collections
  		items={};
  		q=[];
  		this.count=q.length;
  	};
  	this.clone=function(){
  		//	summary
  		//	create a clone of this sorted list
  		return new dojo.collections.SortedList(this);	//	dojo.collections.SortedList
  	};
  	this.contains=this.containsKey=function(/* string */ k){
  		//	summary
  		//	Check to see if the list has a location k
  		if(testObject[k]){
  			return false;			//	bool
  		}
  		return (items[k]!=null);	//	bool
  	};
  	this.containsValue=function(/* object */ o){
  		//	summary
  		//	Check to see if this list contains the passed object
  		var e=this.getIterator();
  		while (!e.atEnd()){
  			var item=e.get();
  			if(item.value==o){
  				return true;	//	bool
  			}
  		}
  		return false;	//	bool
  	};
  	this.copyTo=function(/* array */ arr, /* int */ i){
  		//	summary
  		//	copy the contents of the list into array arr at index i
  		var e=this.getIterator();
  		var idx=i;
  		while(!e.atEnd()){
  			arr.splice(idx,0,e.get());
  			idx++;
  		}
  	};
  	this.entry=function(/* string */ k){
  		//	summary
  		//	return the object at location k
  		return items[k];	//	dojo.collections.DictionaryEntry
  	};
  	this.forEach=function(/* function */ fn, /* object? */ scope){
  		//	summary
  		//	functional iterator, following the mozilla spec.
  		var s=scope||dj_global;
  		if(Array.forEach){
  			Array.forEach(q, fn, s);
  		}else{
  			for(var i=0; i<q.length; i++){
  				fn.call(s, q[i], i, q);
  			}
  		}
  	};
  	this.getByIndex=function(/* int */ i){
  		//	summary
  		//	return the item at index i
  		return q[i].valueOf();	//	object
  	};
  	this.getIterator=function(){
  		//	summary
  		//	get an iterator for this object
  		return new dojo.collections.DictionaryIterator(items);	//	dojo.collections.DictionaryIterator
  	};
  	this.getKey=function(/* int */ i){
  		//	summary
  		//	return the key of the item at index i
  		return q[i].key;
  	};
  	this.getKeyList=function(){
  		//	summary
  		//	return an array of the keys set in this list
  		var arr=[];
  		var e=this.getIterator();
  		while (!e.atEnd()){
  			arr.push(e.get().key);
  		}
  		return arr;	//	array
  	};
  	this.getValueList=function(){
  		//	summary
  		//	return an array of values in this list
  		var arr=[];
  		var e=this.getIterator();
  		while (!e.atEnd()){
  			arr.push(e.get().value);
  		}
  		return arr;	//	array
  	};
  	this.indexOfKey=function(/* string */ k){
  		//	summary
  		//	return the index of the passed key.
  		for (var i=0; i<q.length; i++){
  			if (q[i].key==k){
  				return i;	//	int
  			}
  		}
  		return -1;	//	int
  	};
  	this.indexOfValue=function(/* object */ o){
  		//	summary
  		//	return the first index of object o
  		for (var i=0; i<q.length; i++){
  			if (q[i].value==o){
  				return i;	//	int
  			}
  		}
  		return -1;	//	int
  	};
  	this.item=function(/* string */ k){
  		// 	summary
  		//	return the value of the object at location k.
  		if(k in items && !testObject[k]){
  			return items[k].valueOf();	//	object
  		}
  		return undefined;	//	object
  	};
  	this.remove=function(/* string */k){
  		// 	summary
  		//	remove the item at location k and rebuild the internal collections.
  		delete items[k];
  		build();
  		this.count=q.length;
  	};
  	this.removeAt=function(/* int */ i){
  		//	summary
  		//	remove the item at index i, and rebuild the internal collections.
  		delete items[q[i].key];
  		build();
  		this.count=q.length;
  	};
  	this.replace=function(/* string */ k, /* object */ v){
  		//	summary
  		//	Replace an existing item if it's there, and add a new one if not.
  		if (!items[k]){
  			//	we're adding a new object, return false
  			this.add(k,v);
  			return false; // bool
  		}else{
  			//	we're replacing an object, return true
  			items[k]=new dojo.collections.DictionaryEntry(k,v);
  			q.sort(sorter);
  			return true; // bool
  		}
  	};
  	this.setByIndex=function(/* int */ i, /* object */ o){
  		//	summary
  		//	set an item by index
  		items[q[i].key].value=o;
  		build();
  		this.count=q.length;
  	};
  	if (dictionary){
  		var e=dictionary.getIterator();
  		while (!e.atEnd()){
  			var item=e.get();
  			q[q.length]=items[item.key]=new dojo.collections.DictionaryEntry(item.key,item.value);
  		}
  		q.sort(sorter);
  	}
  }
  