var AutoXY = AutoXY || { 'settings': {}, 'behaviors': {}, 'locale': {} };

//jQuery.noConflict();

(function ($)
{
	AutoXY.attachBehaviors = function (context, settings)
	{
		context = context || document;
		settings = settings || AutoXY.settings;
		$.each
		(
			AutoXY.behaviors,
			function ()
			{
				if ($.isFunction(this.attach))
				{
					this.attach(context, settings);
				}
			}
		);
	};

	AutoXY.detachBehaviors = function (context, settings, trigger)
	{
		context = context || document;
		settings = settings || AutoXY.settings;
		trigger = trigger || 'unload';
		$.each
		(
			AutoXY.behaviors,
			function ()
			{
				if ($.isFunction(this.detach))
				{
					this.detach(context, settings, trigger);
				}
			}
		);
	};

	AutoXY.checkPlain = function (str)
	{
		str = String(str);
		var replace = { '&': '&amp;', '"': '&quot;', '<': '&lt;', '>': '&gt;' };
		for (var character in replace)
		{
			var regex = new RegExp(character, 'g');
			str = str.replace(regex, replace[character]);
		}
		return str;
	};

	AutoXY.t = function (str, args)
	{
		if (AutoXY.locale.strings && AutoXY.locale.strings[str])
		{
			str = AutoXY.locale.strings[str];
		}
		if (args)
		{
			for (var key in args)
			{
				switch (key.charAt(0))
				{
					case '@':
						args[key] = AutoXY.checkPlain(args[key]);
						break;
					case '!':
						break;
					case '%':
					default:
						args[key] = AutoXY.theme('placeholder', args[key]);
						break;
				}
				str = str.replace(key, args[key]);
			}
		}
		return str;
	};

	AutoXY.formatPlural = function (count, singular, plural, args)
	{
		var args = args || {};
		args['@count'] = count;
		var index = AutoXY.locale.pluralFormula ? AutoXY.locale.pluralFormula(args['@count']) : ((args['@count'] == 1) ? 0 : 1);
		if (index == 0)
		{
			return AutoXY.t(singular, args);
		}
		else if (index == 1)
		{
			return AutoXY.t(plural, args);
		}
		else
		{
			args['@count[' + index + ']'] = args['@count'];
			delete args['@count'];
			return AutoXY.t(plural.replace('@count', '@count[' + index + ']'));
		}
	};

	AutoXY.theme = function (func)
	{
		for (var i = 1, args = []; i < arguments.length; i++)
		{
			args.push(arguments[i]);
		}
		return (AutoXY.theme[func] || AutoXY.theme.prototype[func]).apply(this, args);
	};

	AutoXY.freezeHeight = function ()
	{
		var options =
		{
			position: 'absolute',
			top: '0px',
			left: '0px',
			width: '1px',
			height: $('body').css('height')
		}
		AutoXY.unfreezeHeight();
		$('<div id="freeze-height"></div>').css(options).appendTo('body');
	};

	AutoXY.unfreezeHeight = function ()
	{
		$('#freeze-height').remove();
	};

	AutoXY.encodePath = function (item, uri)
	{
		uri = uri || location.href;
		return encodeURIComponent(item).replace(/%2F/g, '/');
	};

	AutoXY.getSelection = function (element)
	{
		if (typeof element.selectionStart != 'number' && document.selection)
		{
			var range1 = document.selection.createRange();
			var range2 = range1.duplicate();
			range2.moveToElementText(element);
			range2.setEndPoint('EndToEnd', range1);
			var start = range2.text.length - range1.text.length;
			var end = start + range1.text.length;
			return { 'start': start, 'end': end };
		}
		return { 'start': element.selectionStart, 'end': element.selectionEnd };
	};

	AutoXY.ajaxError = function (xmlhttp, uri)
	{
		var statusCode, statusText, pathText, responseText, readyStateText, message;
		if (xmlhttp.status)
		{
			statusCode = "\n" + AutoXY.t("An AJAX HTTP error occurred.") +  "\n" + AutoXY.t("HTTP Result Code: !status", {'!status': xmlhttp.status});
		}
		else
		{
			statusCode = "\n" + AutoXY.t("An AJAX HTTP request terminated abnormally.");
		}
		statusCode += "\n" + AutoXY.t("Debugging information follows.");
		pathText = "\n" + AutoXY.t("Path: !uri", {'!uri': uri} );
		statusText = xmlhttp.statusText ? ("\n" + AutoXY.t("StatusText: !statusText", {'!statusText': $.trim(xmlhttp.statusText)})) : "";
		responseText = xmlhttp.responseText ? ("\n" + AutoXY.t("ResponseText: !responseText", {'!responseText': $.trim(xmlhttp.responseText)})) : "";
		responseText = responseText.replace(/<("[^"]*"|'[^']*'|[^'">])*>/gi,"");
		responseText = responseText.replace(/[\n]+\s+/g,"\n");
		readyStateText = xmlhttp.status == 0 ? ("\n" + AutoXY.t("ReadyState: !readyState", {'!readyState': xmlhttp.readyState})) : "";
		message = statusCode + pathText + statusText + responseText + readyStateText;
		return message;
	};

	$('html').addClass('js');
	document.cookie = 'has_js=1; path=/';

	$(function ()
	{
		AutoXY.attachBehaviors(document, AutoXY.settings);
	});

	AutoXY.theme.prototype =
	{
		placeholder: function (str)
		{
			return '<em>' + AutoXY.checkPlain(str) + '</em>';
		}
	};
})(jQuery);