Object.prototype.clone = function() {
	var newObj = (this instanceof Array) ? [] : {};
	for (i in this) {
		if (i == 'clone') {
			continue;
		}
		if (this[i] && typeof this[i] == "object") {
			newObj[i] = this[i].clone();
		} else {
			newObj[i] = this[i];
		}
	} 
	return newObj;
};

Array.prototype.compare = function(testArr) {
	if (this.length != testArr.length) {
		return false;
	}
	for (var i = 0; i < testArr.length; i++) {
		if (this[i].compare) { 
			if (!this[i].compare(testArr[i])) {
				return false;
			}
		}
		if (this[i] !== testArr[i]) {
			return false;
		}
	}
	return true;
};

Array.prototype.find = function (element)
{
	for (var keys in this)
	{
		if (this[keys] == element)
		{
			return keys;
			break;
		}
	}
	return -1;
};

Array.prototype.partiallyfind = function (element)
{
	for (var keys in this)
	{
		if (typeof this[keys] == 'string') {
			if (this[keys].indexOf(element) != -1) {
				return keys;
				break;
			}
		}
	}
	return -1;
};

Array.prototype.removeElementAt = function (i) {
	var found = false;
	for(; i<this.length; i ++) {
		this[i] = this[i+1];
		found = true;
	};
	if(found) {
		this.length --;
	};
};

Array.prototype.removeElement = function (e) {
	var i = this.indexOf(e);
	if(i != -1) this.removeElementAt(i);
	return;
}

Array.prototype.contains = function (e) {
	for(var i=0; i<this.length; i ++) {
		if(this[i] == e) return true;
	};
	return false;
}

Array.prototype.indexOf = function (e, offset) {
	if(offset) var i=offset;
	else var i = 0;
	for(; i<this.length; i ++) {
		if(this[i] == e) return i;
	};
	return -1;
}

