// JavaScript Document
function DP_ObCollectionOrdered(MemberKeyName, MemberType) {
	this.Members = new Array();
	this.MemberKeyName = MemberKeyName;
	if ( !MemberType ) {
		this.MemberType = MemberType;
	} else {
		this.MemberType = null;
	}
	this.CreationDate = new Date();
	return this;

}
DP_ObCollectionOrdered.prototype.add = function add(NewMember, AllowOverwrite) {
	if ( !this.isValidType(NewMember) ) {
		return false;
	}
	var NewMemberKey = NewMember[this.MemberKeyName];
	if ( typeof AllowOverwrite != "boolean" ) {
		AllowOverwrite = false;
	}
	var Rank = this.getRank(NewMemberKey);
	if ( Rank != null ) {
		if ( AllowOverwrite ) {
			this.Members[Rank] = NewMember;
			return true;
		} else {
			return false;
		}
	}
	this.Members[this.getCount()] = NewMember;
	return true;

}
DP_ObCollectionOrdered.prototype.getCount = function getCount() {
	return this.Members.length;

}
DP_ObCollectionOrdered.prototype.isEmpty = function isEmpty() {
	return (this.getCount() == 0);

}
DP_ObCollectionOrdered.prototype.get = function get(MemberKey) {
	if ( typeof MemberKey == "object" && this.isValidType(MemberKey) ) {
		MemberKey = MemberKey[this.MemberKeyName];
	}
	var Rank = this.getRank(MemberKey);
	if ( Rank != null ) {
		return this.Members[Rank];
	} else {
		return null;
	}

}
DP_ObCollectionOrdered.prototype.getAt = function getAt(Rank) {
	return this.Members[Rank];
}
DP_ObCollectionOrdered.prototype.getRank = function getRank(MemberKey) {
	if ( typeof MemberKey == "object" && this.isValidType(MemberKey) ) {
		MemberKey = MemberKey[this.MemberKeyName];
	}
	var Rank = null;
	for ( var Cnt = 0; Cnt < this.Members.length; Cnt++ ) {
		if ( this.Members[Cnt][this.MemberKeyName] == MemberKey ) {
			Rank = Cnt;
			break;
		}
	}
	return Rank;

}
DP_ObCollectionOrdered.prototype.sort = function sort(OrderFunction) {
	this.Members.sort(OrderFunction);
	return true;

}
DP_ObCollectionOrdered.prototype.sortByProp = function sortByProp(Property, SortType, Order) {
	if ( SortType == null ) { SortType = "Alpha"; }
	if ( Order == null ) { Order = "asc";}
	switch ( SortType.toLowerCase() ) {
		case "numeric" :
			var SortFunction = function(A,B) { return A[Property] - B[Property] };
			break;
		case "alphanocase" :
			var SortFunction = function(A,B) { if ( A[Property].toLowerCase() < B[Property].toLowerCase() ) return -1; if ( A[Property].toLowerCase() > B[Property].toLowerCase() ) return 1; return 0  };
			break;
		default :
			var SortFunction = function(A,B) { if ( A[Property] < B[Property] ) return -1; if ( A[Property] > B[Property] ) return 1; return 0  };
			break;
	}
	this.Members.sort(SortFunction);
	if ( Order.toLowerCase() == "desc" ) {
		this.Members.reverse();
	}

}
DP_ObCollectionOrdered.prototype.isValidType = function isValidType(ObjectToCheck) {
	if ( this.MemberType == null ) {
		return true;
	}
	if ( ( typeof ObjectToCheck == "object" ) && ( ObjectToCheck.constructor == this.MemberType ) ) {
		return true;
	} else {
		return false;
	}

}
