// see this to understand
//  http://www.brockman.se/writing/method-references.html.utf8

(function () {
	function findEventTarget(evt) {
		evt = (evt) ? evt : ((window.event) ? window.event : "")
		if (!evt) return;
		if (evt.target) return (evt.target.nodeType == 3) ? evt.target.parentNode : evt.target;
		return evt.srcElement;
	}

     function toArray(pseudoArray) {
         var result = [];
         for (var i = 0; i < pseudoArray.length; i++)
             result.push(pseudoArray[i]);
         return result;
     }

     Function.prototype.bind = function (object) {
         var method = this;
         var oldArguments = toArray(arguments).slice(1);
         return function () {
             var newArguments = toArray(arguments);
             return method.apply(object, oldArguments.concat(newArguments));
         };
     }

     Function.prototype.bindEventListener = function (object) {
         var method = this;
         var oldArguments = toArray(arguments).slice(1);
         return function (event) {
			 evt = event || window.event || {};
			 evt.target = findEventTarget(evt);
             return method.apply(object, [evt].concat(oldArguments));
         };
     }
})();

//==========

String.prototype.startsWith = function(ch)
{
	return this.charAt(0) == ch;
}

String.prototype.endsWith = function(ch)
{
	return this.charAt(this.length - 1) == ch;
}

String.prototype.trimStart = function(ch)
{
	var s = this;
	if (arguments.length == 0)
		ch = ' ';
	while (s.startsWith(ch))
		s = s.substring(1);
	return s;
}

String.prototype.trimEnd = function(ch)
{
	var s = this;
	if (arguments.length == 0)
		ch = ' ';
	while (s.endsWith(ch))
		s = s.substring(0, s.length - 2);
	return s;
}

String.prototype.trim = function(ch)
{
	return this.trimStart(ch).trimEnd(ch);
}

if (![].indexOf)
{
	Array.prototype.indexOf = function(v, n)
	{
		n = (n == null) ? 0 : n;
		var m = this.length;
		for (var i=n; i<m; i++)
			if (this[i] == v)
				return i;
		return -1;
	};
}

//==========

Url = new Object();

Url.format = function(appRelativeUrl)
{
	return Request.ApplicationPath.trimEnd('/') + '/' + appRelativeUrl.trimStart('~').trimStart('/');
}

function redirectBackOrDefault()
{
	var redirectTo = '/';
	var search = window.location.search;
	if (search)
	{
		var pairs = search.substring(1).split('&');
		for (var i = 0; i < pairs.length; i++)
		{
			var keyValue = pairs[i].split('=');
			if (keyValue[0].toLowerCase() == 'returnurl')
			{
				redirectTo = unescape(keyValue[1]);
				break;
			}
		}
	}
	window.location.replace(redirectTo);
}
