﻿Array.prototype.contains = function(obj)
{
	var i = this.length;
	while (i--)
	{
		if (this[i] === obj)
		{
			return true;
		}
	}
	return false;
};

String.prototype.startsWith = function(start)
{
	return this.match('^' + start) == start;
};

String.prototype.endsWith = function(end)
{
	return this.match(end + "$") == end;
};

/* Event scheduler */

$.EventScheduler = {};
$.EventScheduler.repeatTime = 250;
$.EventScheduler.scheduledEvents = [];

$.EventScheduler.runEvents = function()
{
	$($.EventScheduler.scheduledEvents).each(function(index, event)
	{
		event();
	});
	
	setTimeout($.EventScheduler.runEvents, $.EventScheduler.repeatTime);
};

$.EventScheduler.addEvent = function(eventHandler)
{
	$.EventScheduler.scheduledEvents.push(eventHandler);
	if ($.EventScheduler.scheduledEvents.length == 1)
	{
		$.EventScheduler.runEvents();
	}
};

/* Page helper */

$.PageHelper = {};
$.PageHelper.fixTitle = function(title)
{
	if ($ && $.browser && $.browser.msie)
	{
		$.EventScheduler.addEvent(function()
		{
			if (document && document.title && document.title.indexOf('#') >= 0)
			{
				document.title = title;
			}
		});
	}
};

/* Input filtering */

$.FilterInput = {};
$.FilterInput.inputsToFilter = [];

$.FilterInput.filterInputs = function()
{
	if ($.FilterInput.inputsToFilter.length == 0)
	{
		return;
	}

	$($.FilterInput.inputsToFilter).each(function(index, value)
	{
		var element = $(value.element);
		var regex = value.regex;

		var elementValue = element.val();
		var elements = elementValue.match(regex);
		if (elements != null)
		{
			var newValue = elements.join('');
			if (newValue != elementValue)
			{
				element.val(newValue);
			}
		}
		else
		{
			element.val('');
		}
	});
};

$.fn.filterInput = function(charRegex) // always specify global
{
	if (!charRegex)
	{
		return;
	}

	$.FilterInput.inputsToFilter.push({ element: $(this), regex: charRegex });

	if ($.FilterInput.inputsToFilter.length == 1) // First input filtering
	{
		$.EventScheduler.addEvent($.FilterInput.filterInputs);
	}

	return this;
};

// Enable / disable

$.fn.setEnabled = function(enabled)
{
	if (enabled)
	{
		this.enable();
	}
	else
	{
		this.disable();
	}

	return this;
};

$.fn.disable = function()
{
	return $(this).attr('disabled', true);
};

$.fn.disabled = function()
{
	var disabled = $(this).attr('disabled');
	
	return disabled && (disabled === true || disabled === 'disabled');
};

$.fn.enable = function()
{
	return $(this).removeAttr('disabled');
};

// Properties

$.fn.url = function(url)
{
	if (url)
	{
		$(this).attr('href', url);
		return this;
	}
	
	return $(this).attr('href');
}

// Logging

$.log = function(obj)
{
	if (typeof console != 'undefined' && console && console.log)
	{
		console.log(obj);
	}
};

$.fn.log = function()
{
	$.log(this);
	
	return this;
};

// Clone

$.clone = function(objectToClone)
{
	return $.extend(true, {}, objectToClone);
}

// Delegation

$.parametrizedDelegate = function(that, thatMethod)
{
	var args = arguments;
	return function() { return thatMethod.apply(that, args); }
};

$.delegate = function(that, thatMethod)
{
	return function() { return thatMethod.apply(that, arguments); }
};
