
var DynamicLoader = Class.extend({
	
	url: '',
	
	CHECK_INTERVAL: 500,
	
	interval: null,
	
	ajaxPending: false,
	
	selector: "a[href^='/']:not(a[rel^='lightbox'])",
	
	init: function(baseUrl) {
		var self = this;
	 	this.bindClick();
	 	var current = window.location.hash.replace(/^#/, '');
	 	if (current.length > 0) {
	 		this.load(current);
	 	}
	 	this.interval = setInterval(function() {
	 		var url = window.location.hash.replace(/^#/, '');
	 		if (url != self.url) {
	 			self.load(url);
	 		}
	 	}, this.CHECK_INTERVAL);
	},
	
	bindClick: function() {
		var self = this;
		$(this.selector).unbind('click.dynaicloader');
		$(this.selector).bind('click.dynamicloader', function(event) {
			if (event.button != 2 && event.button != 1 && !event.metaKey){
				self.load($(this).attr('href'));
				event.preventDefault();
			}
		});
	},

	load: function(url) {
		var self = this;
		url = url.replace(/^#/, '');
		if(this.ajaxPending) {
			return false;
		}
		this.url = url;
		window.location.hash = this.url == '' ? '/' : this.url;
		this.ajaxPending = true;
		$.get(url + '?format=content', function(response) {
			response = $(response);
			var scrollable = $('#scrollable');
			scrollable.css('overflow', 'hidden');
			$('#scrollable > *, #topMenuLayer, #pager').fadeOut(1000, function() {
				var topMenuLayer = $('#topMenuLayer');
				
				scrollable.css('overflow', 'auto');
				topMenuLayer.remove();
				topMenuLayer = response.find('#topMenuLayer');
				if (topMenuLayer.length) {
					topMenuLayer = $('<div></div>')
						.attr('id', 'topMenuLayer')
						.css('display', 'none');
					$('#topMenu').append(
							topMenuLayer
						);
				}
				topMenuLayer.html(response.find('#topMenuLayer').html());
				topMenuLayer.fadeIn(1000);
				var newContent = $(response.find('#scrollable').html());
				newContent.css({'position': 'relative', 'left': scrollable.outerWidth()});
				scrollable.empty();
				
				scrollable
					.css({'overflow': 'hidden', 'top': '0px'})
					.html(newContent);
				
				document.title = $.trim($(response[0]).text());
				$('#sidebar').html(response.find('#sidebar').html());
				newContent.animate({'left': 0}, 1000, 'easeOutExpo', function() {
					scrollable.css({'overflow': 'auto'});
					scrollable.unbind();
					scrollable.jScrollPane({
			            showArrows: true, 
			            scrollbarWidth: 25, 
			            dragMaxHeight:10, 
			            dragMinHeight:10, 
			            reinitialiseOnImageLoad: true
			        });
					newContent.css({'position': 'static'});
					self.ajaxPending = false;
				});
				var pager = $('#pager');
				pager.html($(response).find('#pager').html())
					.css({'display': 'none'})
					.slideDown(1000);
				self.bindClick();
				$(document).trigger('ready');
			});
		});
	}
});

DynamicLoader.instance = null;

DynamicLoader.getInstance = function(baseUrl) {
	if (DynamicLoader.instance === null) {
		DynamicLoader.instance = new DynamicLoader(baseUrl);
		DynamicLoader.instance.bindClick();
	}
	
	return DynamicLoader.instance;
};

$(document).bind('ready', function() {
	DynamicLoader.getInstance(baseUrl);
});
