﻿Type.registerNamespace('Vehix.Collections');
Vehix.Collections.IEnumerator = function() {}
Vehix.Collections.IEnumerator.prototype = 
{
	get_current : Function.AbstractMethod,
	moveNext : Function.AbstractMethod,
	reset : Function.AbstractMethod
}
Vehix.Collections.IEnumerator.registerInterface('Vehix.Collections.IEnumerator');

Vehix.Collections.IEnumerable = function() {}
Vehix.Collections.IEnumerable.prototype = 
{
	getEnumerator : Function.AbstractMethod
}
Vehix.Collections.IEnumerable.registerInterface('Vehix.Collections.IEnumerable');

Vehix.Collections.Enumerator = function(enumerable)
{
	this._enumerable = enumerable;
	this._keys = new Array();
	this._currentIndex = -1;
	for(key in this._enumerable)
	{
		if(typeof(this._enumerable[key]) != 'function')
		{
			this._keys.push(key);
		}
	}
}
Vehix.Collections.Enumerator.prototype =
{
	get_current : function()
	{
		var result = null;
		if(this._currentIndex > -1 && this._currentIndex < this._keys.length)
		{
			result = this._enumerable[this._keys[this._currentIndex]];
		}
		return result;
	},
	get_key : function()
	{
		return this._keys[this._currentIndex];	
	},
	moveNext : function()
	{
		var result = false;
		if(result = (this._currentIndex < this._keys.length-1))
		{
			this._currentIndex++;
		}
		return result;
	},
	reset : function()
	{
		this._currentIndex = -1;
	}
}
Vehix.Collections.Enumerator.registerClass('Vehix.Collections.Enumerator');
Vehix.Collections.Enumerator.implementsInterface(Vehix.Collections.IEnumerator);

Vehix.Collections.ListEventArgs = function(index,value)
{
	this._index = index;
	this._value = value;
}
Vehix.Collections.ListEventArgs.prototype =
{
	get_index : function()
	{
		return this._index;
	},
	get_value : function()
	{
		return this._value;
	}
}
Vehix.Collections.ListEventArgs.registerClass('Vehix.Collections.ListEventArgs',Sys.EventArgs);

Vehix.Collections.List = function()
{
	this._items = new Array();
	this._events = null;
}

Vehix.Collections.List.prototype =
{
	get_item : function(index)
	{
		
		return this._items[index];
	},
	set_item : function(index,value)
	{
		if(get_count() > index)
		{
			this._items[index] = value;
			var handler = this.get_events().getHandler('onUpdated');
			if(handler) handler(this,new Vehix.Collections.ListEventArgs(index,value));
		}
	},
	get_events : function()
	{
		if(this._events == null)
		{
			this._events = new Sys.EventHandlerList();
		}
		return this._events;
	},
	get_count : function()
	{
		return this._items.length;
	},
	add :  function(value)
	{
		this.insert(value,this.get_count());
		return this.get_count()-1;
	},
	insert : function(value,index)
	{
		if(index < 0 || index > this.get_count())
		{
			throw Error.argumentOutOfRange('index','Index must be greater than 0 and less than the total collection size');
		}
		this._items[this.get_count()] = value;		
		var handler = this.get_events().getHandler('onInserted');
		if(handler) handler(this,new Vehix.Collections.ListEventArgs(this.get_count()-1,value));
	},
	removeAt : function(index)
	{
		if(get_count() > index)
		{
			var value = this._items[index];
			var handler = this.get_events().getHandler('onRemoved');
			if(handler) handler(this,new Vehix.Collections.ListEventArgs(index,value));
			delete this._items[index];
		}
	},
	remove : function(value)
	{
		for(index = 0;index < this._items.length;index++)
		{
			if(this._items[index] == value)
			{
				removeAt(index);
				break;
			}
		}
	},
	getEnumerator : function()
	{
		return new Vehix.Collections.Enumerator(this._items);
	}
}
Vehix.Collections.List.registerClass('Vehix.Collections.List');
Vehix.Collections.List.implementsInterface(Vehix.Collections.IEnumerable);

Vehix.Collections.DictionaryEventArgs = function(key,value)
{
	this._key = key;
	this._value = value;
}
Vehix.Collections.DictionaryEventArgs.prototype =
{
	get_key : function()
	{
		return this._key;
	},
	get_value : function()
	{
		return this._value;
	}
}
Vehix.Collections.DictionaryEventArgs.registerClass('Vehix.Collections.DictionaryEventArgs',Sys.EventArgs);

//Vehix.Collections.Dictionary
Vehix.Collections.Dictionary = function()
{
	this._items = new Array();
	this._events = null;
}
Vehix.Collections.Dictionary.prototype = 
{
	get_item : function(key)
	{
		return this._items[key];
	},
	set_item : function(key,value)
	{
		this._items[key] = value;
		var handler = this.get_events().getHandler('onUpdated');
		if(handler) handler(this,new Vehix.Collections.DictionaryEventArgs(key,value));
	},
	get_events : function()
	{
		if(this._events == null)
		{
			this._events = new Sys.EventHandlerList();
		}
		return this._events;
	},
	add : function(key,value)
	{
		if(this.containsKey(key))
		{
			throw Error.argumentOutOfRange('key','The key provided already exists in the current collection');
		}
		this._items[key] = value;
		var handler = this.get_events().getHandler('onAdded');
		if(handler) handler(this,new Vehix.Collections.DictionaryEventArgs(key,value));
	},
	containsKey : function(key)
	{
		return (typeof(this._items[key]) != 'undefined');
	},
	remove	: function(key)
	{
		var item = this._items[key];
		delete this._items[key];	
		var handler = this.get_events().getHandler('onRemoved');
		if(handler) handler(this,new Vehix.Collections.DictionaryEventArgs(key,value));
	},
	getEnumerator : function()
	{
		return new Vehix.Collections.Enumerator(this._items);
	}
}
Vehix.Collections.Dictionary.registerClass('Vehix.Collections.Dictionary');
Vehix.Collections.Dictionary.implementsInterface(Vehix.Collections.IEnumerable);