////////////////////// Extend system's Array class ////////////////////////////////
//
///////////////////////////////////////////////////////////////////////////////
//  Last revised on 2005/8/4, Jalen: function "ArrayContainsString" added.
//  Last revised on 2005/3/18, Jalen: function "Clone" added.
//  Last revised on 2005/2/25, Jalen: function "indexOfArray" added back to here and accommodates numeric array.
//  Last revised on 2004/10/29, Jalen


// Used only for arrays that are splitted from strings, or scripts in Safari.
function indexOfArray(sString, aArray, bCaseSensitive) {//tested OK;
	// returns index of the item in the array, otherwise returns -1.
    if (bCaseSensitive == null) bCaseSensitive = true;
	for (var i=0; i<aArray.length; i++) {
		if (typeof(sString) == "string" && !bCaseSensitive) {
			var s = sString.toUpperCase();
			if (s == aArray[i].toUpperCase()) return i;
		} else {
			if (sString == aArray[i]) return i;
		}
	}
	return -1;
}

function ArrayContainsString(sString, aArray, bCaseSensitive) {
	// return true if sString is found in aArray, case-sensitive
	return (indexOfArray(sString, aArray, bCaseSensitive) != -1);
}

Array.prototype.indexOf = function(sString, bCaseSensitive) {//tested OK;
	// returns index of the item in the array, otherwise returns -1.
    if (bCaseSensitive == null) bCaseSensitive = true;
	for (var i=0; i<this.length; i++) {
		if (typeof(sString) == "string" && !bCaseSensitive) {
			var s = sString.toUpperCase();
			if (s == this[i].toUpperCase()) return i;
		} else {
			if (sString == this[i]) return i;
		}
	}
	return -1;
}

Array.prototype.containsString = function(sString, bCaseSensitive) {//tested OK;
	// return true if sString is found in aArray, case-sensitive
	return (this.indexOf(sString, bCaseSensitive) != -1);
}

Array.prototype.containsObject = function(rObject) {//tested OK in an application;
	//can be used for an array of window handles, objects, strings (case-sensitive) situations;
	for (var i=0; i<this.length; i++){
		if (this[i] == rObject) return true;
	}
	return false;
}

Array.prototype.isSubsetOf = function(aSuperArray) {//tested OK;
	// works with only array of strings
	// if all members of array A also exist in array B, A is considered a subset of B
	for (var i=0; i<this.length; i++){
		if (!aSuperArray.containsString(this[i], false)) {
			//alert(this[i]);
			return false;
		}
	}
	return true;
}

Array.prototype.Clone = function() {
	var aResult = new Array();
	for (var i = 0; i < this.length; i++) {
		aResult.push(this[i]);
	}
	return aResult;
}

Array.prototype._UnitTestError = function() {
   // indexOf
   var arr = new Array("a","b");
   if (arr.indexOf("C", false) != -1) return('indexOf case 1: not working');
   if (arr.length != 2) return('length case 1: not working');
   arr.push("c");
   if (arr.indexOf("C", false) == -1) return('indexOf case 2: not working');
   if (arr.length != 3) return('length case 2: not working');
   if (new Array("a","b").indexOf("A", true) != -1) return('indexOf case 3: case sensitivity not working');
   if (new Array("a","b").indexOf("A", false) == -1) return('indexOf case 4: case sensitivity not working');

   // containsString
   if (new Array("a","b").containsString("A", true) != false) return('containsString case 1: case sensitivity not working');
   if (new Array("a","b").containsString("A", false) != true) return('containsString case 2: case sensitivity not working');
   if (new Array("a","b").containsString("c", false) != false) return('containsString case 3: not working');

   // containsObject
   var objA = new Object();
   var objB = new Object();
   var objC = new Object();
   if (new Array(objA,objB).containsObject(objA) != true) return('containsObject case 1: not working');
   if (new Array(objA,objB).containsObject("string") != false) return('containsObject case 2: not working');
   if (new Array(objA,objB).containsObject(objC) != false) return('containsObject case 3: not working');

   //isSubsetOf
   if (new Array("1","2").isSubsetOf(new Array("2","3")) != false) return("isSubsetOf case 1: not working");
   if (new Array("1","2").isSubsetOf(new Array("1","2","3")) != true) return("isSubsetOf case 2: not working");
   if (new Array("A","B").isSubsetOf(new Array("a","b","c")) != true) return("isSubsetOf case 3: not working");
   if (new Array("A","B").isSubsetOf(new Array("A","B","C")) != true) return("isSubsetOf case 4: not working");

   return false;
}

function NonIntersection(vArr, vCompareArr) {
	var arrResult = new Array();
	if (typeof(vArr) == "object") {
		if (vArr.length <= 0) {
			arrResult = vArr;
		} else {
			for (var i = 0; i < vArr.length; i++) {
				if (indexOfArray(vArr[i], vCompareArr, false) == -1) {
					arrResult.push(vArr[i]);
				}
			}
		}
	} else {
		arrResult = vArr;
	}
	return arrResult;
}

function isArraysIntersect() {
}

function getIntersection() {
}

function getUniqueElements() {
}
