/**
 * js模拟列表集合
 * @param win
 */
(function(win) {
	var ArrayList = function() {
		this.datas = [];
	};

	var proto = ArrayList.prototype;

	proto.size = function() {
		return this.datas.length;
	};

	proto.isEmpty = function() {
		return this.size() === 0;
	};

	proto.contains = function(value) {
		return this.datas.indexOf(value) !== -1;
	};

	proto.indexOf = function(value) {
		for ( var index in this.datas) {
			if (this.datas[index] === value) {
				return index;
			}
		}

		return -1;
	};

	proto.lastIndexOf = function(value) {
		for (var index = this.size(); index >= 0; index--) {
			if (this.datas[index] === value) {
				return index;
			}
		}
	};

	proto.toArray = function() {
		return this.datas;
	};

	proto.outOfBound = function(index) {
		return index < 0 || index > (this.size() - 1);
	};

	proto.get = function(index) {
		if (this.outOfBound(index)) {
			return null;
		}

		return this.datas[index];
	};

	proto.set = function(index, value) {
		this.datas[index] = value;
	};

	proto.add = function(value) {
		this.datas.push(value);
	};

	proto.insert = function(index, value) {
		if (this.outOfBound(index)) {
			return;
		}

		this.datas.splice(index, 0, value);
	};

	proto.remove = function(index) {
		if (this.outOfBound(index)) {
			return false;
		}

		this.datas.splice(index, 1);
		return true;
	};

	proto.removeValue = function(value) {
		if (this.contains(value)) {
			this.remove(this.indexOf(value));
			return true;
		}
		return false;
	};

	proto.clear = function() {
		this.datas.splice(0, this.size());
	};

	proto.addAll = function(list) {
		if (!list instanceof ArrayList) {
			return false;
		}

		for ( var index in list.datas) {
			this.add(list.get(index));
		}

		return true;
	};

	proto.insertAll = function(index, list) {
		if (this.outOfBound(index)) {
			return false;
		}

		if (!list instanceof ArrayList) {
			return false;
		}

		var pos = index;
		for ( var index in list.datas) {
			this.insert(pos++, list.get(index));
		}
		return true;
	};

	function numberorder(a, b) {
		return a - b;
	}

	proto.sort = function(isNumber) {
		if (isNumber) {
			this.datas.sort(numberorder);
			return;
		}

		this.datas.sort();
	};

	proto.toStringJoin = function() {
		return this.datas.join();
	};

	proto.toString = function() {
		return "[" + this.datas.join() + "]";
	};

	proto.valueOf = function() {
		return this.toString();
	};

	win.ArrayList = ArrayList;
})(window);