(function($) {
	$.fn.superAjaxloader = function(options) {
		var opt = $.extend({}, $.fn.superAjaxloader.defaults, options);
		var target = this, localCounter, doLoad, firstChange = false;

		if (opt.part > 0) {
			localCounter = opt.part;
		} else {
			localCounter = 0;
		}

		doLoad = function(url) {
			target.addClass('loading').parent().css('position', 'relative').append($('<div class="loading-bar"></div>'));
			if (opt.method == 'append') {
				$.get(url, function (html) {
					target.removeClass('loading').parent().children('.loading-bar').remove();
					target.append(html);
					opt.complete.call(this);
					Shadowbox.setup("a[rel*='shadowbox']", {
						gallery: "photoAlbum"
					});
				});
			} else {
				target.load(url, function(html) {
					opt.complete.call(this)
					Shadowbox.setup("a[rel*='shadowbox']", {
						gallery: "photoAlbum"
					});
					target.removeClass('loading').parent().children('.loading-bar').remove();
				});
			}
		};

		opt.grab.find('a:not(.noSuperAjaxloader)').live('click', function (e) {
			e.preventDefault();

			if ($(this).not('a[rel*="shadowbox"]').length > 0) {
				var linkUrl = $(this).attr('href');
				var url = linkUrl + (linkUrl.search(/\?/) > 0 ? '&' : '?') + 'type=' + opt.typeNum;
				if (opt.part > 0) {
					url += '&ajaxPart=' + opt.part;
				}

				if (opt.history) {
					$.address.parameter('l-' + localCounter, escape(url));
				} else {
					doLoad(url);
				}
			}

			return false;
		});

		if (opt.history) {
			$.address.init(function(event) {
				firstChange = true;
			});

			$.address.change(function(event) {
				if (firstChange) {
					firstChange = false;
					return;
				}
				var url = $.address.parameter('l-' + localCounter);
				if (!url) {
					url = window.location.href + (window.location.href.search(/\?/) > 0 ? '&' : '?') + 'type=' + opt.typeNum;
					if (opt.part > 0) {
						url += '&ajaxPart=' + opt.part;
					}
				} else {
					url = unescape(url);
				}
				doLoad(url);
				return false;
			});
		}

		return this;
	};

	$.fn.superAjaxloader.defaults = {
		method: 'replace',
		grab: $('.pagebrowser'),
		part: 0,
		typeNum: 1283356723,
		history: false,
		complete: $.noop
	};
})(jQuery);

