

function $Array () {
	this.values = [];
	for (var i = 0, ix = arguments.length; i < ix; i++) {
		this.values[this.values.length] = arguments[i];
	}
	
	
	
	/**
	 * @return  {Array}
	 */
	this.clear = function () {
		this.values.length = 0;
		
		return this.values;
	};
	/**
	 * @param   {Array}  ...
	 * @return  {Array}
	 */
	this.concat = function () {
		var result = [];
		
		for (var i = 0, ix = this.values.length; i < ix; i++) {
			result[result.length] = this.values[i];
		}
		
		for (var i = 0, ix = arguments.length; i < ix; i++) {
			for (var j = 0, jx = arguments[i].length; j < jx; j++) {
				result[result.length] = arguments[i][j];
			}
		}
		
		return result;
	};	
	/**
	 * @return  {*}
	 */
	this.first = function () {
		return this.values[0];
	};
	
	
	
	/**
	 * @param   {*}  val
	 * @return  {int}
	 */
	this.indexOf = function (val) {
		var result = -1;
		for (var i = 0, ix = this.values.length; i < ix; i++) {
			if (this.values[i] == val) {
				result = i;
				break;
			}
		}
		
		return result;
	};
	
	
	
	/**
	 * @param   {*}  val
	 * @return  {boolean}
	 */
	this.isin = function (val) {
		return (this.indexOf(val) != -1);
	};
	
	
	
	/**
	 * @param   {string}  [_str]
	 * @return  {string}
	 */
	this.join = function (_str) {
		var str = (typeof(_str) != 'undefined') ? _str : ',';
		return this.values.join(str);
	};
	
	
	
	/**
	 * @return  {*}
	 */
	this.last = function () {
		return this.values[this.values.length - 1];
	};
	
	
	
	/**
	 * @param   {*}  val
	 * @return  {int}
	 */
	this.lastIndexOf = function (val) {
		var result = -1;
		for (var i = this.values.length, ix = 0; i > ix; i--) {
			if (this.values[i] == val) {
				result = i;
				break;
			}
		}
		
		return result;
	};
	
	
	
	/**
	 * @return  {*}
	 */
	this.pop = function () {
		var result          = this.last();
		this.values.length -= 1;
		
		return result;
	};
	
	/**
	 * @param   {*}  ...
	 * @return  {int}
	 */
	this.push = function () {
		for (var i = 0, ix = arguments.length; i < ix; i++) {
			this.values[this.values.length] = arguments[i];
		}
		
		return this.values.length;
	};
	
	
	
	/**
	 * @return  {Array}
	 */
	this.reverse = function () {
		return this.values.reverse();
	};
	
	
	
	/**
	 * @return  {*}
	 */
	this.shift = function () {
		var result = this.first();
		for (var i = 1, ix = this.values.length; i < ix; i++) {
			this.values[i - 1] = this.values[i];
		}
		this.values.length -= 1;
		
		return result;
	};
	
	
	
	/**
	 * @param   {int}  start
	 * @param   {int}  [_end]
	 * @return  {Array}
	 */
	this.slice = function (start, _end) {
		if (typeof(start) != 'undefined') {
			if (typeof(_end) != 'undefined') { return this.values.slice(start, _end); }
			else                             { return this.values.slice(start);       }
		}
		else {
			return this.values.slice();
		}
	};
	
	/**
	 * @param   {int}  start
	 * @param   {int}  count
	 * @param   {*}    ...
	 * @return  {Array}
	 */
	this.splice = function (start, count) {
		if ((typeof(start) != 'undefined') && (typeof(count) != 'undefined')) {
			var result = [];
			
			for (var i = start, ix = start + count, iy = this.values.length; i < ix && i < iy; i++) {
				result[result.length] = this.values[i];
			}
			
			for (var i = 0, ix = this.values.length; i < ix; i++) {
				if (i >= start) {
					this.values[i] = this.values[i + count];
				}
			}
			
			this.values.length -= count;
			
			for (var i = this.values.length - 1; i >= 0; i--) {
				if (i >= start) {
					this.values[i + arguments.length - 2] = this.values[i];
				}
				if (i == start) {
					for (var j = 2, jx = arguments.length; j < jx; j++) {
						this.values[start + (j - 2)] = arguments[j];
					}
				}
			}
			
			return result;
		}
		else {
			return [];
		}
	};

	/**
	 * @param   {Function}  [_func]
	 * @return  {Array}
	 */
	this.sort = function (_func) {
		if (typeof(_func) != 'undefined') {
			return this.values.sort(_func);
		}
		else {
			return this.values.sort();
		}
	};
	
	/**
	 * @param   {*}  ...
	 * @return  {int}
	 */
	this.unshift = function () {
		this.values.length = this.values.length + arguments.length - 1;
		
		for (var i = this.values.length, ix = arguments.length; i >= ix; i--) {
			this.values[i] = this.values[i - arguments.length];
		}
		for (var i = 0, ix = arguments.length; i < ix; i++) {
			this.values[i] = arguments[i];
		}
		
		return this.values.length;
	};
}

/**
 * @param   {int}     [_num]
 * @param   {string}  [_str]
 * @return  {string}
 */
Number.prototype.pad = function (_num, _str) {
	var num = (typeof(_num) != 'undefined') ? _num           : 1;
	    num = !isNaN(num)                   ? Math.abs(num)  : 1;
	var str = (typeof(_str) != 'undefined') ? _str.charAt(0) : '0';
	
	var result     = this.toString();
	var result_num = result.length;
	if (result_num < num) {
		for (var i = 0, ix = num - result_num; i < ix; i++) {
			result = str + result;
		}
	}
	
	return result;
};

/**
 * @param   {string}  str
 * @return  {Array}
 */
String.prototype.$split = function (str) {
	var temp = this;
	    temp = temp.split(str);
	
	var result = new $Array();
	for (var i = 0, ix = temp.length; i < ix; i++) {
		result.push(temp[i]);
	}
	
	return result;
};

/**
 * @param   {string}  str
 * @return  {boolean}
 */
String.prototype.isin = function (str) {
	var result = (this.indexOf(str) >= 0);
	
	return result;
};

/**
 * @return  {string}
 */
String.prototype.chop = function () {
	var result = this;
	    result = result.substring(0, result.length - 1);
	
	return result;
};

/**
 * @return  {string}
 */
String.prototype.escapeTag = function () {
	var result = this;
	    result = result.replace(/&/g, '&amp;');
	    result = result.replace(/</g, '&lt;');
	    result = result.replace(/>/g, '&gt;');
	
	return result;
};

/**
 * @return  {string}
 */
String.prototype.unescapeTag = function () {
	var result = this;
	    result = result.replace(/&amp;/g, '&');
	    result = result.replace(/&lt;/g , '<');
	    result = result.replace(/&gt;/g , '>');
	
	return result;
};

/**
 * @return  {string}
 */
String.prototype.urlDir = function () {
	var result         = this;
	    result         = result.split('/');
	    result.length -= 1;
	
	for (var i = 3, ix = result.length; i < ix; i++) {
		if (result[i].isin('.')) {
			result.length = i;
			break;
		}
	}
	
	result = result.join('/') + '/';
	
	return result;
};