function ContentManager(am_options) {

 // Atrybuty:
 var o_self = this;
 var $o_body, $o_image, $o_contentMask;

 var o_overlay, o_preloader, o_imagePreloader;
 var o_dataLoader;

 var b_cssLoaded = false, b_jsLoaded = false, b_dataLoaded = false;
 var b_busy = false, b_cancelAvailable = false, b_firstDataLoaded = false;

 var am_defaultOptions = {
  overlayOpacity: 0.5,
  overlayColor: '#000000',
  showSpeed: 1000,
  hideSpeed: 1000,
  truncateFirstElementTopMargin: true
 };
 
 am_options = $.extend({}, am_defaultOptions, am_options);

 var am_ajaxOptions = {};
 
 // Metody prywatne:

 // Inicjacja:
 function init() {
  $o_body = $('#body > div.body').css({visibility: 'hidden'});
  $o_image = $('#image');
  $o_content = $('#contentMask');

  $.GLOBALS.CSS = '';
  $.GLOBALS.JS = '';

  // Inicjacja maski przykrywającej:
  o_overlay = new Overlay({
   opacity: am_options.overlayOpacity,
   color: am_options.overlayColor,
   callbackOnShow: function() {
    b_cssLoaded = false;
    b_jsLoaded = false;
    b_dataLoaded = false;
    o_imagePreloader = null;
    b_cancelAvailable = true;
    o_preloader.start();
    getContent();
   },
   callbackOnHide: function() {
    b_busy = false;
   }
  });

  // Inicjacja preloadera:
  o_preloader = new Preloader({
   callbackOnHide: function() { if (b_dataLoaded && b_cssLoaded && b_jsLoaded && o_imagePreloader && o_imagePreloader.ready()) showFinish(); },
   stopCondition: function() { return b_dataLoaded && b_cssLoaded && b_jsLoaded && o_imagePreloader && o_imagePreloader.ready(); },
   callbackOnStop: function() { o_overlay.hide(); }
  });

  // Anuluowanie działania ładowania nowej strony:
  o_preloader.getPreloader().click(function() { 
   o_self.cancel();
   return false;
  });
 }

 // Wyświetla warstwę danych:
 function show() {
  $o_body
   .css({
    opacity: 0,
	visibility: 'visible'
   })
   .animate({opacity: 1}, am_options.showSpeed);
 }

 // Ukrywa warstwę danych:
 function hide(f_callback) {
  $o_body
   .animate({opacity: 0}, am_options.hideSpeed, function() {
    $o_body.css({visibility: 'hidden'});
    if (f_callback && $.isFunction(f_callback)) f_callback();
   });
 }

 // Pobiera dane za pomocą dane za pomocą AJAX:
 function getContent() {
  o_dataLoader = $.ajax($.extend({}, {
   cache: false,
   type: 'post',
   success: function(m_data) {
    b_cancelAvailable = false;

	// Wyłączenie starych ustawień CSS i skryptów JS:
	cssDisable($.GLOBALS.CSS || {});
    jsUnload($.GLOBALS.JS || {});

    $o_body.html(m_data);

	$.GLOBALS.CSS = ($('#css').html() || '').split(';');
    $.GLOBALS.JS = ($('#js').html() || '').split(';');

    cssEnable($.GLOBALS.CSS);
	jsLoad($.GLOBALS.JS);

    b_dataLoaded = true;
	preloadImages();
   }
  }, am_ajaxOptions));
 }

 // Włącza style:
 function cssEnable(as_css) {
  if (!as_css) as_css = [];

  $.each(as_css, function(index, value) {
   if (value && value != '') $('link[@rel*=style][title=' + value + ']').attr('disabled', false);
  });

  b_cssLoaded = true;
 }

 // Wyłącza style:
 function cssDisable(as_css) {
  if (!as_css) as_css = [];

  $.each(as_css, function(index, value) {
   if (value && value != '') $('link[@rel*=style][title=' + value + ']').attr('disabled', true);
  });
 }

 // Ładuje skrypty JavaScript:
 function jsLoad(as_js) {
  if (!as_js) as_js = [];

  if (as_js.length > 0) {

   var i_countOfLoaded = 0;

   var f_loadItem = function(s_value) {
    if (s_value && s_value != '') {

     $.ajax({
      url: $.GLOBALS.DIR_JS + s_value + '.js',
      dataType: 'script',
      success: function(m_data) {
       if (++i_countOfLoaded >= as_js.length) b_jsLoaded = true;
      }
     });
    } else {
     if (++i_countOfLoaded >= as_js.length) b_jsLoaded = true;
    }
   };

   for (var i = 0; i < as_js.length; i++) f_loadItem(as_js[i]);

  } else b_jsLoaded = true;
 }

 // Wyłącza skrypty JavaScript:
 function jsUnload(as_js) {
  if (!as_js) as_js = [];
/*
  $.each(as_js, function(index, value) {
   if (value && value != '') $('script[title=' + value + ']', $('head')).remove();
  });
*/
 }

 // Aktywuje preloader grafik:
 function preloadImages() {
  o_imagePreloader = new ImagePreloader($('*', $o_body));
 }

 // Zakończenie ładowania danych i wyświetlenie:
 function showFinish() {
  if (!b_firstDataLoaded) b_firstDataLoaded = true;

  $('#image').children('h1,h2,h3,h4,h5,h6,ul,p').first()
   .add($('#contentMask > div.scrollContent').children('h1,h2,h3,h4,h5,h6,ul,p').first())
   .css({marginTop: 0});

  $('input.checkbox', $o_body).checkbox({empty: $.GLOBALS.DIR_HTML+'images/input-checkboxTransparent.gif'});

  if ($('#contentMask > div.scrollContent').height() > $('#contentMask').height()) {
   $('#scrollbar')
    .css({height: $('#contentMask').height() + 6 + 'px'})
	.show()
    .scrollbar($('#contentMask'), $('#contentMask > div.scrollContent'));
  }

  show();
 }

 // Metody publiczne:

 // Ładuje dane:
 this.load = function(a_am_ajaxOptions) {
  if (b_busy) return;
  b_busy = true;

  am_ajaxOptions = a_am_ajaxOptions;

  if ($o_body.is(':visible')) hide();
  o_overlay.show();
 };

 // Wysyła formularz:
 this.submitForm = function(o_form, a_am_ajaxOptions) {
  if (!o_form || $(o_form).length == 0) return false;

  this.load($.extend({}, {
   type: $(o_form).attr('method') || 'post',
   url: $(o_form).attr('action'),
   data: $(o_form).serialize()
  }, a_am_ajaxOptions));
 };

 // Anuluje ładowanie danych:
 this.cancel = function() {
  if (!b_firstDataLoaded) return false;
  if (!b_cancelAvailable) return false;
  o_dataLoader.abort();
  b_cancelAvailable = false;
  b_cssLoaded = false;
  b_jsLoaded = false;
  b_dataLoaded = false;
  o_imagePreloader = null;
  if (o_preloader.getPreloader().is(':visible')) o_preloader.stop();
  show();
 };

 // Inicjacja obiektu:
 init();

 return this;
}
