hg.ajax = (function($) {
	var $title;
	var $body;
	var $page;
	var $background;
	var $menu;
	var $headline;
	var $sub_menu;
	var $doc_body;
	var $content;
	var level0;
	var level1;
	
	var fade_out_delay = 200;
	var fade_in_delay = 500;

	function _load_page(href)
	{
		var ajax_url;
		if (href.match(/\?/))
			ajax_url = href + '&format=ajax';
		else
			ajax_url = href + '?format=ajax';
		$.get(ajax_url, {}, function (data) {
			var $data = $('ajax', data);
			
			$.history.add('page:' + href);
			
			try {
				$title.text($data.find('title').text());
			} catch (e) { /* ... */ }
			
			$headline.html($data.find('headline').xml());
			
			var has_content = $body.hasClass('has_content');
			var $new_body = $data.find('body');
			var new_has_content = $new_body.attr('has_content');
			$body.attr('class', $new_body.attr('class'));
			if (new_has_content && !has_content)
			{
				$body.addClass('has_content');
			}
			else if (has_content && !new_has_content)
			{
				$doc_body.fadeOut(fade_out_delay, function () {
					$body.removeClass('has_content');
				});
			}
			
			var background_src = $background.attr('src');
			var $new_background = $data.find('background');
			var new_background_src = $new_background.attr('src');
			if (background_src != new_background_src)
			{
				$background.fadeOut(fade_out_delay, function () {
					var faded_in = false;
					function _handle_background_load() {
						if (faded_in) return;
						$background.fadeIn(fade_in_delay);
						$background.unbind('load', _handle_background_load);
					}
					$background.bind('load', _handle_background_load);
					$background.attr('src', new_background_src);
					window.setTimeout(_handle_background_load, fade_in_delay);
				});
			}
			
			var $levels = $data.find('levels');
			var new_level0 = $levels.attr('level0');
			var new_level1 = $levels.attr('level1');
			
			if (new_level0 != level0)
			{
				level0 = new_level0;
				$menu.fadeOut(fade_out_delay, function () {
					$menu.hide();
					$menu.html($data.find('#menu').xml());
					$menu.fadeIn(fade_in_delay);
				});
			}
			else
			{
				$menu.html($data.find('#menu').xml());
			}
			
			if (new_level1 != level1)
			{
				level1 = new_level1;
				$sub_menu.fadeOut(fade_out_delay, function () {
					$sub_menu.hide();
					$sub_menu.html($data.find('#sub-menu').xml());
					$sub_menu.fadeIn(fade_in_delay);
				});
			}
			else
			{
				$sub_menu.html($data.find('#sub-menu').xml());
			}
			
			$teaser = $body.find('#teaser');
			$teaser.remove();
			var $new_teaser = $data.find('teaser');
			if ($new_teaser.length)
			{
				var $new_teaser_img = $($new_teaser.xml());
				$new_teaser_img.hide();
				$page.append($new_teaser_img);
				$new_teaser_img.fadeIn(fade_in_delay);
			}
			
			$content.fadeOut(fade_out_delay, function () {
				$content.hide();
				$content.html($data.find('content').xml());
				if (new_has_content && !has_content)
				{
					$doc_body.show();
					//$doc_body.fadeIn(fade_in_delay);
				}
				var scroll = null;
				window.setTimeout(function () {
					if (!scroll)
						scroll = hg.scroll.init();
				}, 50);
				$content.fadeIn(fade_in_delay, function () {
					if (scroll)
						scroll.handle_resize();
					else
						scroll = hg.scroll.init();
					hg.layout.handle_resize();
				});
			});
		});
	}
	
	function handle_click(ev) {
		var $a = $(ev.target);
		if (!($a.is('[href$=.html]') || $a.is('[href$=.php]'))) return;
		if ($a.is('[href^=http://]') || $a.is('[href^=mailto:]')) return;
		if ($a.is('[href^=#]')) return;
		ev.preventDefault();
		var href = $a.attr('href');
		_load_page(href);
	};
	
	function _history_handler()
	{
		var hash = $.history.getCurrent();
		if (hash.match(/^page:/))
			_load_page(hash.substr(5));
	}
	
	function init(_level0, _level1)
	{
		$title = $('title');
		$body = $('body');
		$page = $('#page');
		$background = $('#background');
		$menu = $('#menu');
		$headline = $('#headline');
		$sub_menu = $('#sub-menu');
		$doc_body = $('#body');
		$content = $('#content');
		level0 = _level0;
		level1 = _level1;
		if (!($.browser.msie && parseInt($.browser.version) <= 8))
		{
			$(document).ready(function () {
				$('a').live('click', handle_click);
			});
		}
		$(document).history(_history_handler);
		_history_handler();
	}
	
	return {
		init: init,
		load_page: _load_page
	};
})(jQuery);

