//////////////// dependencies  ///////////////////////////////
//	must have "ExtendArray.js" included
//
///////////////////////////////////////////////////////////////////////////////
// 2006/1/3, Jalen: Class "ArrayList" seperated from the "common.js" to be used in Flash 6 actionscript. This version of actionscript does not support "try...catch" statement.


function ArrayList(vArray) {
	this.Count = Count;
	this.Items = Items;
	this.Add = Add;
	this.Insert = Insert;
	this.RemoveAt = RemoveAt;
	this.Clear = Clear;
	this.Reverse = Reverse;
	this.IndexOf = IndexOf;
	this.SortBy = SortBy;
	this.ToArray = ToArray;

	var aItems;
	
	init(vArray);

	function init(vArray) {
		aItems = new Array();
		if (vArray != null) {
			for (var i = 0; i < vArray.length; i++) {
				aItems.push(vArray[i]);
			}
		}
	}

	function Count() {
		return aItems.length;
	}

	function Items(i) {
		return (i >= 0 && i < aItems.length) ? aItems[i] : null;
	}

	function Add(vItem) {
		aItems.push(vItem);
	}

	function Insert(i, vItem) {
		if (i >= 0 && i <= aItems.length) {
			aItems.push("");
			for(var j = aItems.length-1; j >= i; j--) {
				aItems[j+1] = aItems[j];
			}
			aItems[i] = vItem;
		}
	}

	function RemoveAt(i) {
		if (i >= 0 && i < aItems.length) {
			for (var j = i; j < aItems.length; j++) {
				aItems[j] = aItems[j+1];
			}
			aItems.pop();
		}
	}

	function Clear() {
		aItems = new Array();
	}

	function Reverse() {
		if (aItems.length > 1) {
			var aResult = new Array();
			for(var i = aItems.length-1; i >= 0; i--) {
				aResult.push(aItems[i]);
			}
			aItems = aResult;
		}
	}

	//  This function works with string items and object items only.
	//		vItem					- The item to search for.
	//		vBooCaseSensitive		- Is the comparison case sensitive, if they're string items.
	//		vItemProperty			- Name of the property to compare, if they're object items.
	function IndexOf(vItem, vBooCaseSensitive, vItemProperty) {
		if (typeof(vItem) == "string" || vItemProperty == null || vItemProperty.length == 0) {
			//return aItems.indexOf(vItem, vBooCaseSensitive);
			return indexOfArray(vItem, aItems, vBooCaseSensitive);
		} else {
			for(var i = 0; i < aItems.length; i++) {
				if (vItemProperty == "ID") {		// This piece of code is to acommodate ActionScript only.
					if (vItem.ID == aItems[i].ID) {
						return i;
					}
				} else {
					if (eval("vItem." + vItemProperty) == eval("aItems[i]." + vItemProperty)) {
						return i;
					}
				}
			}
			return -1;
		}
	}

	//  This function works with object items only.
	function SortBy(sSortBy, sSOrder) {
		if (aItems.length > 1) {
			if (!(sSortBy == null || sSortBy.length == 0)) {
				if (sSOrder == null || sSOrder.length == 0) {
					sSOrder = "ASC";
				}

				var j, v1, v2;
				for(var i = 1; i < aItems.length; i++) {
					j = aItems.length - 1 - i;
					for(var k = 0; k <= j; k++) {
						//try {
							v1 = eval("aItems[k]." + sSortBy);
							v2 = eval("aItems[k+1]." + sSortBy);
						/*} catch(oError) {
							Response.Write("Error: " + oError.description + " (" + oError.number + ")<br>");
							Response.Write("Location: ArrayList.SortBy() in common.js.<br>");
							Response.Write("Data: k=" + k + "; v1=" + v1 + "; type=" + typeof(v1) + "; v2=" + v2 + "; type=" + typeof(v2) + ".<br>");
							Response.End();
						}*/
						if ((v1 != null) && (v2 == null)) {
							SwapItem(k);
						} else if ((v1 != null) && (v2 != null)) {
							switch (typeof(v1)) {
								case "number":
									if (v1 > v2) {
										SwapItem(k);
									}
									break;
								default:
									if (v1 > v2) {
									//if StrComp(v1, v2) = 1 then
										SwapItem(k);
									}
							}
						}
					}
				}
				if (sSOrder == "DESC")	this.Reverse();
				
			}
		}
	}

	function SwapItem(k) {
		var obj = aItems[k+1];
		aItems[k+1] = aItems[k];
		aItems[k] = obj;
	}

	function ToArray() {
		return aItems;
	}

}

