var kodiak = function() {}
kodiak.core = function() {}

var ie = (navigator.userAgent.search(/MSIE/gi) != -1);

kodiak.core.stringExtensions = {
	trim 		: function() {
		return this.trimStart().trimEnd();
	},

	trimEnd		: function() {
		return this.replace(/\s+$/g, "");
	},

	trimStart	: function() {
		return this.replace(/^\s+/g, "");
	},

	encode		: function() {
		return encodeURIComponent(this.trim());
	},

	clone		: function() {
		var x = this;
		return (x);
	},

	contains 	: function(expression) {
		return (this.search(expression) != -1);
	},

	endsWith	: function(subject) {
		var subjectLength = subject.length;
		var startPosition = (this.length - subjectLength);
		return (this.substr(startPosition, subjectLength) == subject);
	},

	padLeft		: function(paddingChar, padCount) {
		var x = (kodiak.core.stringExtensions.isEmpty(paddingChar) ? " " : paddingChar);
		var y = [];
		for (var z = 0; z < padCount; z++) y.push(x);
		y.push(this);

		return y.join("");
	},

	padRight	: function(paddingChar, padCount) {
		var x = (kodiak.core.stringExtensions.isEmpty(paddingChar) ? " " : paddingChar);
		var y = [];
		y.push(this);
		for (var z = 0; z < padCount; z++) y.push(x);

		return y.join("");
	},

	startsWith	: function(subject) {
		var subjectLength = subject.length;
		return (this.substring(0, subjectLength) === subject);
	},

	toArray		: function() {
		var x = [];
		for (var a = 0; a < this.length; a++) x.push(this.substring(a, 1));
		return x;
	},

	isEmpty		: function(subject) {
		return (subject == null || subject.length == 0);
	},

	format		: function(template, args) {
		kodiak.core.stringExtensions.__format(template, args);
	},

	__format	: function(args) {

	}
};

String.isEmpty = kodiak.core.stringExtensions.isEmpty;
String.format = kodiak.core.stringExtensions.format;
String.__format = kodiak.core.stringExtensions.__format;
String.prototype.trim = kodiak.core.stringExtensions.trim;
String.prototype.trimEnd = kodiak.core.stringExtensions.trimEnd;
String.prototype.trimStart = kodiak.core.stringExtensions.trimStart;
String.prototype.encode = kodiak.core.stringExtensions.encode;
String.prototype.clone = kodiak.core.stringExtensions.clone;
String.prototype.contains = kodiak.core.stringExtensions.contains;
String.prototype.endsWith = kodiak.core.stringExtensions.endsWith;
String.prototype.padLeft = kodiak.core.stringExtensions.padLeft;
String.prototype.padRight = kodiak.core.stringExtensions.padRight;
String.prototype.startsWith = kodiak.core.stringExtensions.startsWith;
String.prototype.toArray = kodiak.core.stringExtensions.toArray;

kodiak.core.arrayExtensions = {
	forEach		: function(delegate) {
		for (var a = 0; a < this.length; a++) delegate.apply(this[a]);
	},

	indexOf		: function(subject) {
		for (var a = 0; a < this.length; a++)
			if (this[a] === subject)
				return a;
			else
				continue;
		return -1;
	},

	find		: function(predicate) {
		for (var a = 0; a < this.length; a++) {
			if (predicate.apply(this[a])) return this[a];
		}

		return null;
	},

	findAll		: function(predicate) {
		var result = [];
		for (var a = 0; a < this.length; a++) {
			if (predicate.apply(this[a])) result.push(this[a]);
		}

		return result;
	},

	findLast	: function(predicate) {
		for (var a = this.length; a >= -1; a--) {
			if (predicate.apply(this[a])) return this[a];
		}

		return null;
	},

	lastIndexOf : function(subject) {
		for (var a = this.length; a > -1; a--) {
			if (this[a] === subject) return [a];
		}

		return -1;
	},

	trueForAll : function(predicate) {
		for (var a = 0; a < this.length; a++)
			if (!predicate.apply(this[a])) return false;

		return true;
	},

	clear		: function(subject) {
		subject = new Array();
	},

	createFrom	: function(collection) {
		if (!collection.length) return null;
		var result = [];
		for (var a = 0; a < collection.length; a++) result.push(collection[a]);
		return result;
	},

	isViable	: function(subject) {
		return (subject != null && subject.length != 0 && subject instanceof Array);
	}
};

Array.prototype.forEach = kodiak.core.arrayExtensions.forEach;
Array.prototype.indexOf = kodiak.core.arrayExtensions.indexOf;
Array.prototype.find = kodiak.core.arrayExtensions.find;
Array.prototype.findAll = kodiak.core.arrayExtensions.findAll;
Array.prototype.findLast = kodiak.core.arrayExtensions.findLast;
Array.prototype.lastIndexOf = kodiak.core.arrayExtensions.lastIndexOf;
Array.prototype.trueForAll = kodiak.core.arrayExtensions.trueForAll;
Array.clear = kodiak.core.arrayExtensions.clear;
Array.createFrom = kodiak.core.arrayExtensions.createFrom;
Array.isViable = kodiak.core.arrayExtensions.isViable;