/**
 * rsLightbox
 * 
 * Obiekt lightboxa. Dostarcza metody tworzące tło.
 * 
 * @param options Opcje lightboxa
 * 
 * @author Dawid Stępień
 * @version 1.0
 */

var rsLightbox = function(options)
{
   /**
    * Obiekt bazowy
    */
	var self = {};


   /**
    * Atrybuty
    */

	var zIndex = 1000;

   /*
    * Opcje domyślne
    */
    var defaults = {
    	loaderImg         : 'img/loader.gif', //relatywna ścieżka do loadera
    	loaderAlt         : 'Loading...',
    	displayDuration   : 0,                //Czas trwania display
    	fadeDuration      : 0,                //Czas trwania fade
    	animationDuration : 0,
    	opacity           : 0.8,
    	color             : 'black'
    };

   /*
    * Dodanie przekazanych opcji
    */
    var options = $.extend(defaults, options);

   /*
    * Style lightboxa oraz loadera
    */
    var styles = {
		lightbox : {
			'position'			: 'fixed',
			'display'			: 'none',
			'top'				: 0,
			'left'				: 0,
			'z-index'			: zIndex,
			'opacity'			: options.opacity,
			'background-color'	: options.color,
			'height'			: '100%',
			'width'				: '100%'
		},
		loader  : {
			'position'          : 'fixed',
			'display'           : 'none',
			'top'               : 0,
			'left'              : 0,
 			'z-index'           : zIndex+1,
 			'opacity'           : 1
		}
    };

   /*
    * Obiekt lightboxa
    */
    var lightbox = $('.rsLightbox');

   /*
    * Obiekt loadera
    */
    var loader   = $('.rsLoader');


   /**
    * Metody tworzące elementy
    */

   /*
    * Tworzy lightbox
    */
    self.createLightbox = function()
    {
       /*
        * Jeśli lightbox nie istnieje to go utwórz
        */
    	if(!lightbox.length)
    	{
    		lightbox = $('<div />', {
    			'class' : 'rsLightbox',
    			css     : styles.lightbox
    		}).prependTo('body');
    	}

       /*
        * Ustaw element lightboxa widoczny 
        * dla obiektów dziedziczących
        */
    	self.lightbox = lightbox;

    }; //Koniec createLightbox()

    /*
     * Tworzy loader
     */
     self.createLoader = function()
     {
        /*
         * Jeśli lightbox nie istnieje to go utwórz
         */
     	if(!loader.length)
     	{
     		loader = $('<img />', {
     			'class' : 'rsLoader',
     			'src'   : options.loaderImg,
     			'alt'   : options.loaderAlt,
     			css     : styles.loader
     		});
     		
     		lightbox.after(loader);
     	}

       /*
        * Wyśrodkuj loader
        */
     	self.windowCenter(loader, 180);

       /*
        * Przypisz zdarzenie wyśrodkowania w przypadku zmiany
        * rozmiaru okna
        */
     	self.windowOnResize(function()
     	{
     		self.windowCenter(loader, 180);
        });

       /*
        * Ustaw element loadera widoczny dla obiektów dziedziczących
        */
     	self.loader = loader;

     }; //Koniec createLoader()


   /**
    * Metody odpowiedzialne za wyświetlanie
    */

   /*
    * Pokazuje lightbox oraz przekazany element
    */
    self.show = function(element, showLightbox)
    {
    	if(showLightbox == undefined)
    		showLightbox = true;

       /*
        * Jeśli ustawiony jest czas trwania fade to
        * użyj fadeIn do pokazania lightboxa
        */
    	if(options.fadeDuration)
    	{
    		if(showLightbox)
    			lightbox.fadeIn(options.fadeDuration);
    		if(element != undefined)
    			element.fadeIn(options.fadeDuration);
    	}
    	else
    	{
    		if(showLightbox)
    			lightbox.show(options.duration);
    		if(element != undefined)
    			element.show(options.duration);
    	}
    }; //Koniec show()


   /*
    * Schowaj lightbox
    */
    self.hide = function(element, hideLightbox)
    {
    	if(hideLightbox == undefined)
    		hideLightbox = true;

    	/*
         * Jeśli ustawiony jest czas trwania fade to
         * użyj fadeOut do ukrycia lightboxa
         */
    	if(options.fadeDuration)
    	{
    		if(hideLightbox)
    			lightbox.fadeOut(options.fadeDuration);
    		if(element != undefined)
    			element.fadeOut(options.fadeDuration);

    	   /*
    	    * Schowaj loader
    	    */
    		loader.fadeOut(options.fadeDuration);
    	}
    	else
    	{
    		if(hideLightbox)
    			lightbox.hide(options.duration);
    		if(element != undefined)
    			element.hide(options.duration);

    	   /*
    	    * Schowaj loader
    	    */
    		loader.hide(options.duration);
    	}
    }; //Koniec hide()

   /*
    * Wycentruj element w poziomie oraz nadaj
    * wysokość w pionie względem rozmiarów okna.
    */
    self.windowCenterHorizontal = function(element, top)
    {
    	var windowWidth   = $(window).width();
    	var elementWidth  = element.width();

    	var left = (windowWidth/2) - (elementWidth/2);
    	
    	if(top == undefined)
    		top = 0;
    	
    	var elementPosition = {
    		'top' : top,
    		'left': left
    	};
    	
    	element.css(elementPosition);
    	
    }; //Koniec windowCenterHorizontal(top)

   /*
    * Wycentruj element względem rozmiarów okna z marginesem
    * ujemnym wg parametru top.
    */
    self.windowCenter = function(element, marginTop)
    {
       /*
        * Pobierz wymiary okna
        */
    	var windowWidth   = $(window).width();
    	var windowHeight  = $(window).height();

       /*
        * Pobierz wymiary elementu
        */
    	var elementWidth   = element.width();
    	var elementHeight  = element.height();

       /*
        * Określ położenie
        */
    	var left = (windowWidth/2) - (elementWidth/2);
    	var top  = ((windowHeight/2) - (elementHeight/2)) - marginTop;

       /*
        * Jeśli top jest mniejszy od zadanej to
        */
    	if(top < marginTop) top = marginTop;
    	
    	var elementPosition = {
    		'top' : top,
    		'left': left
    	};

       /*
        * Nadaj położenie
        */
    	element.css(elementPosition);
    	
    };

   /*
    * Nadanie przekazanej funkcji dla zdarzenia
    * zmiany rozmiaru okna.
    */
    self.windowOnResize = function(event)
    {
        $(window).resize(event);
    }; //Koniec windowOnResize(event)

   /*
    * Zwraca z-index powiększony o 1
    */
    self.getIndex = function()
    {
    	zIndex += 1;

    	return zIndex;
    }; //getIndex()


   /**
    * Metody odpowiedzialne za zdarzenia
    */ 

   /*
    * Zdarzenie kliknięcia w lightbox
    * 
    * @TODO: zamineic na set
    */
    self.setClickEvent = function(event)
    {
       /*
        * Usuń przypisane kliknięcia
        */
    	lightbox.unbind();

       /*
        * Nadaj zdarzenie kliknięcia
        */	
    	lightbox.click(event);

    }; //Koniec setClickEvent

   /**
    * Konstruktor
    */
    self.__construct = function()
    {
       /*
        * Utwórz lightbox
        */
    	self.createLightbox();

       /*
        * Nadaj domyślne zdarzenie zniknięcia po kliknięciu
        * w lightbox
        */
    	self.setClickEvent(function()
    	{
    		self.hide();
    	});

    }; //Koniec __construct()
    
    
    /*
     * Wywołaj konstruktor
     */
     self.__construct();

    /*
     * Zwróć obiekt
     */
     return self;

}; //Koniec lightbox(style)


































