var $j = jQuery.noConflict();

// A fix for the console not being available everywhere.
var firebugEnabled = console !== undefined;

// Only define console if it is an other browser than Firefox.
if (!firebugEnabled)
{
	var console = {};
	console.log = function() {};
	console.error = function() {};
}

var dumper;

if (firebugEnabled)
{
	dumper = console.log;
}
else
{
	dumper = alert;
}

function dump()
{
	var size = arguments.length;
	
	for (var i = 0; i < size; i++)
	{
		dumper(arguments[i]);
	}
}

/*document.observe('dom:loaded', function()
{
	if ($$('.custom-image').size() > 0)
	{
		if (!jQuery)
		{
			var headers = ['Lib/Script/JQuery/Jquery.js', 'Lib/Script/CustomImage.js'];
			
			fetchJavaScriptHeaders(headers, function()
			{
				
			});
		}
	}
});*/

function fetchJavaScriptHeaders(headers, callback)
{
	if (headers !== undefined)
	{
		var settings =
		{
			method: 'get',
			
			evalJS: false,
			
			onComplete: function(response)
			{
				try
				{
					eval(response.responseText + ';afterExecuting();');
				}
				catch (e)
				{
					console.error('Something went wrong while evaling \'' + response.request.url + '\'', e);
				}
			},
			
			onFailure: afterExecuting
		};
		
		var headersLength = headers.length;
		
		var currentHeader = 0;
		
		var afterExecuting = function()
		{
			currentHeader++;
			
			if (currentHeader === headersLength)
			{
				if (Object.isFunction(callback))
				{
					callback();
				}
			}
			else
			{
				new Ajax.Request(headers[currentHeader], settings);
			}
		}
		
		new Ajax.Request(headers[0], settings);
	}
}

(function($)
{
	var overlayTemplate = $('<div class="waiter"></div>').css(
	{
		position: 'absolute',
		background: '#fff url(/Lib/Images/loading_white.gif) no-repeat center',
		opacity: 0.7
	});
	
	window.Waiter =
	{
		options: {},
		
		startWaiting: function(groupOptions)
		{
			var groupOptions = $.extend({}, Waiter.options, groupOptions);
			
			return this.each(function()
			{
				var me = $(this), overlay = overlayTemplate.clone();
				
				var options = $.meta ? $.extend({}, groupOptions, me.data()) : groupOptions;
				
				var offset = me.offset();
				
				overlay.css(
				{
					top: offset.top,
					left: offset.left,
					width: me.width(),
					height: me.height()
				});
				
				overlay.appendTo('body');
				
				me.data('waiter', overlay);
			});
		},
		
		stopWaiting: function()
		{
			return this.each(function()
			{
				$(this).data('waiter').remove();
			});
		}
	};
	
	$.fn.extend(
	{
		startWaiting: Waiter.startWaiting,
		
		stopWaiting: Waiter.stopWaiting
	});
})
(jQuery);

var JQueryLoadedCallbacks = new Array();

function requireJQueryWithUI(callback)
{
	requireJQuery(callback, withUI);
}

function requireJQuery(callback, withUI)
{
	if (typeof jQuery === 'undefined')
	{
		JQueryLoadedCallbacks.push(callback);
		
		if (JQueryLoadedCallbacks.size() == 1)
		{
			fetchJavaScriptHeaders(['Lib/Script/JQuery/JQuery.js'], function()
			{
				var size = JQueryLoadedCallbacks.size();
				
				for (var i = 0; i < size; i++)
				{
					var callback = JQueryLoadedCallbacks[i];
					
					if (Object.isFunction(callback))
					{
						callback();
					}
				}
				
				delete JQueryLoadedCallbacks;
			});
		}
	}
	else
	{
		if (Object.isFunction(callback))
		{
			callback();
		}
	}
}

function toInteger(mInput)
{
	var sType = typeof(mInput);
	
	if (sType === 'boolean')
	{
		return (mInput === true
			? 1
			: 0
		);
	}
	else if (sType === 'string')
	{
		var sReturn = '0', sNumbers = '0123456789', sNumber = '', i = 0, iLength = 0;
		
		for (iLength = mInput.length; i < iLength; i++)
		{
			sNumber = mInput.charAt(i);
			
			if (sNumbers.indexOf(sNumber) === -1)
			{
				break;
			}
			
			sReturn += sNumber;
		}
		
		if (sReturn === '0')
		{
			sReturn = '';
			
			for (i = iLength - 1; i >= 0; i--)
			{
				sNumber = mInput.charAt(i);
				
				if (sNumbers.indexOf(sNumber) === -1)
				{
					break;
				}
				
				sReturn = sNumber + sReturn;
			}
			
			sReturn = '0' + sReturn;
		}
		
		return parseInt(sReturn, 10);
	}
	else if (sType === 'number' && isFinite(mInput))
	{
		return Math.floor(mInput);
	}
	else
	{
		return 0;
	}
}

if (Exception === undefined)
{
	var Exception = Error;
}

//Extend jQuery ajax methods so that we can make use of the HTTP request object easily.
//And the former library we used called Prototype.js had a easy method that allowed to send
//JSON through HTTP headers. We made heavily use of it, but jQuery does not support it.
//So we will add it.
(function()
{
	var xhr = null, nativeJsonSupport = typeof JSON !== 'undefined' && JSON.parse;
	
	$j.extend(
	{
		getHeader: function(key)
		{
			if (!xhr)
			{
				return null;
			}
			
			// Firefox throws an exception if the header does not exists.
			try
			{
				return xhr.getResponseHeader(key) || null;
			}
			catch (e)
			{
				return null;
			}
		},
		
		getHeaderJson: function()
		{
			var json = $j.getHeader('X-JSON');
			
			if (!json)
			{
				json = '';
				
				var i = 0, header;
				
				while (true)
				{
					header = $j.getHeader('X-JSON-' + i);
					
					if (!header)
					{
						break;
					}
					
					i++;
					
					json += header;
				}
				
				if (i === 0)
				{
					return {};
				}
				
				json = unescape(json);
			}
			
			json = decodeURIComponent(escape(json));
			
			return nativeJsonSupport ? JSON.parse(json) : window['eval']('(' + json + ')');
		}
	});
	
	$j.ajax = (function(method)
	{
		return function()
		{
			xhr = method.apply(this, arguments);
			
			return xhr;
		};
	})
	($j.ajax);
	
	// If the browser has native JSON support use it, otherwise use eval.
	$j.ajaxSetup(
	{
		dataFilter: function(data, type)
		{
			if (type === 'json' && nativeJsonSupport)
			{
				return JSON.parse(data);
			}
			
			return data;
		}
	});
})();
