////////////////////////////////////////////////////////////////
// Copyright © 2008-2010 ReFreezed.com
////////////////////////////////////////////////////////////////







/* ARRAY
********************************************************************************************************************************/



Array.prototype.asCode = function()
{
	var new_arr = [];
	var len = this.length;
	for (var i = 0; i < len; i++)
		new_arr.push(this[i].asCode());
	return new_arr;
};



Array.prototype.asText = function()
{
	var new_arr = [];
	var len = this.length;
	for (var i = 0; i < len; i++)
		new_arr.push(this[i].asText());
	return new_arr;
};



Array.prototype.search = function(needle, strict)
{
	strict = !!strict;
	var needle_is_found = false;
	var key = false;
	var len = this.length;
	for (var i = 0; i < len; i++)
	{
		if (strict)
		{
			if (this[i] === needle)
				needle_is_found = true;
		}
		else
		{
			if (this[i] == needle)
				needle_is_found = true;
		}
		if (needle_is_found)
		{
			key = i;
			break;
		}
	}
	return key;
};



Array.prototype.unique = function(strict)
{
	strict = !!strict;
	var new_arr = [];
	var len = this.length;
	for (var i = 0; i < len; i++)
	{
		if (new_arr.search(this[i], strict) === false)
			new_arr.push(this[i]);
	}
	return new_arr;
};







/* MATH
********************************************************************************************************************************/



Math.randomRange = function(min, max)
{
	return min+Math.random()*(max-min);
};







/* STRING
********************************************************************************************************************************/



String.prototype.asCode = function()
{
	return this.replace(/&lt;/g, '<').replace(/&gt;/g, '>').replace(/&quot;/g, '"').replace(/&#039;/g, '\'')
		.replace(/&amp;/g, '&'); // Only replace critical entities (NOTE: Must replace "&" last)
};



String.prototype.asText = function()
{
	return this.replace(/&/g, '&amp;').replace(/</g, '&lt;').replace(/>/g, '&gt;').replace(/"/g, '&quot;')
		.replace(/'/g, '&#039;'); // Only replace critical characters (NOTE: Must replace "&" first)
};



String.PAD_LEFT  = 0;
String.PAD_RIGHT = 1;
String.PAD_BOTH  = 2;
String.prototype.pad = function(padLength, padString, padType)
{
	var padding_length = padLength-this.length;
	if (padding_length <= 0)
		return String(this);
	if (padString === undefined)
		padString = ' ';
	switch (padType)
	{

		case String.PAD_BOTH:
			var padding_left_length  = Math.floor(padding_length/2);
			var padding_right_length = Math.ceil(padding_length/2);
			return padString.repeat(Math.ceil(padding_left_length/padString.length)).substr(0, padding_left_length)
				+this+padString.repeat(Math.ceil(padding_right_length/padString.length)).substr(0, padding_right_length);

		case String.PAD_LEFT:
			return padString.repeat(Math.ceil(padding_length/padString.length)).substr(0, padding_length)+this;

		default: // case String.PAD_RIGHT:
			return this+padString.repeat(Math.ceil(padding_length/padString.length)).substr(0, padding_length);

	}
};



String.prototype.repeat = function(times)
{
	var str = this;
	var str_arr = [];
	for (var i = 0; i < times; i++)
		str_arr.push(str);
	return str_arr.join('');
};



String.prototype.reverse = function()
{
	return this.split('').reverse().join('');
};



String.prototype.substrCount = function(needle, offset)
//String.prototype.substrCount = function(needle, offset, length) // http://se.php.net/manual/en/function.substr-count.php
{
	if (offset === undefined)
		offset = 0;
	var count    = 0;
	var position = offset-1;
	while (1)
	{
		position = this.indexOf(needle, position+1);
		if (position == -1)
			break;
		count++;
	}
	return count;
};



String.prototype.trim = function(chars)
{
	if (chars == undefined)
		chars = '\n\r ';
	var str = this;
	if (typeof chars != 'string')
		return str;

	// Find where to start extracting
	var start = false;
	for (var str_i = 0; str_i < str.length; str_i++)
	{
		var trim_this_char = false;
		for (var char_i = 0; char_i < chars.length; char_i++)
		{
			if (str[str_i] == chars[char_i])
			{
				trim_this_char = true;
				break;
			}
		}
		if (!trim_this_char)
		{
			start = str_i;
			break;
		}
	}
	if (start === false)
		start = 0;

	// Find where to stop extracting
	var stop = false;
	for (var str_i = str.length-1; str_i >= 0; str_i--)
	{
		var trim_this_char = false;
		for (var char_i = 0; char_i < chars.length; char_i++)
		{
			if (str[str_i] == chars[char_i])
			{
				trim_this_char = true;
				break;
			}
		}
		if (!trim_this_char)
		{
			stop = str_i+1;
			break;
		}
	}
	if (stop === false)
		stop = str.length;

	// Return extracted string
	str = str.substring(start, stop);
	return str;
};






