/*
 * BP 0.3 "Wraper thickboxa"
 * By Tomasz Rzany (koszi)
 * Copyright (C) 2009 Agencja Interaktywna Blue Paprica
 * last update: 04.10.2009
*/
(function($){


    $(document).ready(function(){
            // nie wiem dlaczego ale opera ma jakie inne margines etc
            if(navigator.appName == 'Opera') {
                $.fn.bp_layer_defaults.layer_margin_h = 15;
                $.bp_internal_options.browser = 'opera';
            }

            // podpiecie uruchamiania okna
            bp_init('a.show_layer, div.show_layer, input.show_layer, button.show_layer','show');
            // podpiecie zamykania okna
            bp_init('a.close_layer, div.close_layer, input.close_layer, img.close_layer','close');
            // podpiecie zmiany warstwy
            bp_init('a.switch_layer, div.switch_layer, input.switch_layer, button.switch_layer','switch');
    });

    /**
     *  Inicjalizacja
     *  @desc: bindujemy eventy do poszczeglonych elementow
     *         zdefinowanych w $(document).ready
     */
    bp_init = function(domChunk,type) {
        if(type == 'show') {
            $(domChunk).live('click',$.fn.bp_showLayer);
        }
        if(type == 'switch') {
            $(domChunk).live('click',$.fn.bp_switchLayer);
        }
        if(type == 'close') {
            $(domChunk).live('click',bp_closeLayer);
        }
    }


    /**
     *  DEAFULTOWE WARTOSCI DLA WARSTW
     *  @param: layer_margin_h   - dodatkowe pixele na marginesy w pionie
     *  @param: layer_margin_w   - dodatkowe pixele na marginesy w poziomie
     *  @param: layer_simple     - wyswietlac prostą warstwe czy tez dodac wbudowany przez thickbox naglowek
     *  @param: layer_close_html - html tworzycy link do zamykania okna
     *  @param: animate          - animowany resize warstwy?
     *  @param: target           - id obiektu w ktorym ma byc zaladowana odpowiedz, MUSI byc ustawione
     */
    $.fn.bp_layer_defaults = {
        target          : null,
        layer_margin_h  : 0,
        layer_margin_w  : 40,
        layer_close_html: '<a href="#" class="close_layer" style="cursor: pointer;">Zamknij</a>',
        layer_simple    : true,
        animate         : false,
        scroll_width    : 10
    }

    /**
     *  WEWNETRZNE OPCJE NA POTRZEBY WARAPEPRA
     *  was_scroll      : czy pojawil sie juz scroll?
     */
    $.bp_internal_options = {
        was_scroll      : false,
        browser         : null,
        is_head         : false
    }

    $.fn.bp_showLayer = function(options) {

        if (typeof this != 'object') {
            log('bp_showLayer: pomijam proces wyswietlenie warstwy - element nie jest obiektem jQuery.');
            return this;
        }
        
        if ($(this).attr('rel').length == 0 ) {
            log('bp_showLayer: pomijam proces wyswietlenie warstwy - element nie posiada parametru "rel" zawierajacego id elementu warstwy');
            return this;
        }

        var _id    = $(this).attr('rel');
        var title  = $(this).attr('title');
        var id     = '#'+_id;

        // czy wyswietlany jest naglowek
        $.bp_internal_options.is_head = $(id).find('.layer_head:first').html() == null ? false : true;
        // zapisanie ID obiektu do zmiennej globalnej
        $.fn.bp_layer_defaults.target = id;
        //zapisanie oryginalnej zawartosci obiektu pokazywanego na warstwie
        $(id).data('oryginal_data',$(id).html());

        options = $.extend({}, $.fn.bp_layer_defaults, options);
        HEIGHT  = $(id).outerHeight() + options.layer_margin_h;
        WIDTH   = $(id).outerWidth()  + options.layer_margin_w;

        tb_url  = '#TB_inline?';
        tb_url += 'height='+HEIGHT;
        tb_url += '&width='+WIDTH;
        tb_url += '&inlineId='+_id;
        tb_url += '&modal='+options.layer_simple;

        tb_show(title, tb_url);
//        $('#TB_window').draggable({handle: '.layer_head'});
        bp_resizeLayer(true);
        return false;
    };

    /**
     * Zmiana wyswietlanej warstwy warstwy
     *
     * @param: options - opcje wyswietlenie warswy
     * @desc:  parametr rel MUSI wskazywac na id elementu wyswietlanego!
     */
    $.fn.bp_switchLayer = function(options) {
        if ($(this).attr('rel').length == 0 ) {
            log('bp_switchLayer: pomijam proces zmiany warstwy - element nie posiada parametru "rel" zawierajacego id elementu warstwy');
            return this;
        }
        
        bp_clearLayer();
        $(this).bp_showLayer(options);
        bp_resizeLayer();
        return this;
    }

    /**
     * Dopasowanie rozmiarów warstwy do aktualnej zawartosci
     *
     * @desc: wysokosc   = suma wysokosci wszytkich elemnetow
     *        szerokowsc = najszerszy element warstwy
     *        
     * @todo: dry!, dragable torche namieszalo :P, pasowaloby posprzatac
     */
    bp_resizeLayer = function(first_resize)
    {
        
        var new_layer_height  = 0;
        var new_layer_width   = 0;
        var layer_margin_h    = $.fn.bp_layer_defaults.layer_margin_h;
        var layer_margin_w    = $.fn.bp_layer_defaults.layer_margin_w;
        var scroll_width_d    = $.fn.bp_layer_defaults.scroll_width;
        var scroll_width      = 0;
        var layer_top         = null;
        
        
        // obliczamy wysokosc i szerokosc na podstawie elementow #TB_ajaxContent
        $('#TB_ajaxContent').children().each(function(){
            new_layer_height += $(this).outerHeight();
            if($(this).width() > new_layer_width )
                new_layer_width  = $(this).outerWidth();
        });

        new_layer_height += layer_margin_h;
        new_layer_width  += layer_margin_w;

        // ograniczenie wielkosc warstwy do rozamirow okna
        window_dimensions = getPageSize();
        new_layer_height = window_dimensions[1] < new_layer_height ? window_dimensions[1] : new_layer_height;
        new_layer_width  = window_dimensions[0] < new_layer_width ? window_dimensions[0] : new_layer_width;

        // ustalenie nowych marginesow dla warstwy
        marginLeft = '-'+parseInt((new_layer_width / 2),10)+ 'px';
        marginTop  = '-'+(parseInt((new_layer_height / 2),10)+40) + 'px';

        // ustalenie czy wyswietlany jest scroll
        if(isScrollShown() && $.bp_internal_options.was_scroll) {
            scroll_width = 8;
        }
        if(isScrollShown() && !$.bp_internal_options.was_scroll) {
            scroll_width = isScrollShown() ? scroll_width_d : 0;
            $.bp_internal_options.was_scroll = true;
        }
        if(!isScrollShown() && $.bp_internal_options.was_scroll) {
            $.bp_internal_options.was_scroll = false;
        }


        if($.fn.bp_layer_defaults.animate) {
            // animowana zmiana
            $('#TB_window').animate({
                width       : (new_layer_width+scroll_width),
                marginLeft  : marginLeft,
                marginTop   : marginTop
            });

            $('#TB_ajaxContent').animate({
                width       : (new_layer_width-layer_margin_w+2*scroll_width),
                height      : new_layer_height
            });
        }
        else {
            // statyczna zmiana
            $('#TB_window').css({
                'width'         :(new_layer_width+scroll_width),
                'margin-left'   :marginLeft,
                'margin-top'    :marginTop
            });

            hack = isScrollShown() ? 2 : 0;
            $('#TB_ajaxContent').css({
                'width'         :(new_layer_width-layer_margin_w+2*scroll_width+hack),
                'height'        :new_layer_height
            });
        }

//        // pozycja warstwy, ustawiana przez dragable
//        layer_top  = $('#TB_window').css('top');
//        layer_top  = parseInt(layer_top.substring(0,layer_top.length-2));
//        layer_left = $('#TB_window').css('left');
//        layer_left = parseInt(layer_left.substring(0,layer_left.length-2));
//
//        // marginesy
//        marginTop  = -(parseInt((new_layer_height / 2),10)+40);
//        marginLeft = -parseInt((new_layer_width / 2),10);
//
//        // marginesy + wysoksoc,wartosc musi byc mniejsza od wielkosci okna
//        // jezeli nie chcemy aby czesc okienka wystawala poza ekran
//        all = layer_top + new_layer_height + marginTop;
//
//        if( all-60 > window_dimensions[1] || marginTop + layer_top  < 0 ) {
//            // wysrodkowanie okna w pionie
//            shift = window_dimensions[1] - new_layer_height;
//            $('#TB_window').css('top',(-marginTop+shift/2+40)+'px');
//        }
//
//        if (marginLeft + layer_left < 0 ) {
//            // wysrodkowanie w poziomie
//            $('#TB_window').css('left',(-marginLeft+40)+'px');
//        }

        // ustawienie zaokraglenia, zamkniecia i efektu dragable
        $('#TB_ajaxContent').prepend('<img class="close_layer" width="20" height="20" alt="" src="gfx/layer/x.gif"/>');
//        bp_markupLayer();

    }

    /**
     * Zamkniecie warstwy
     */
    bp_closeLayer = function()
    {
        $('#TB_ajaxContent').html('');
        $('#TB_ajaxContent').css('display','none');
        $('#TB_window').css('display','none');
        tb_remove();

        // przywrocenie oryginalnej zawartosci kontenera
        id = $.fn.bp_layer_defaults.target;
        $(id).html($(id).data('oryginal_data'));
    }

    /**
     * Wyczyszczenie warstwy, przywrocenie oryginalnej zawartosci
     */
    bp_clearLayer = function()
    {
        // wyczyszczenie obecnej zawartosci warstwy
        $('#TB_ajaxContent').html('');
        $('#TB_window .layer_head_round').remove();
        $('#TB_ajaxContent .layer_head').remove();
        
        // usuniecie starych zaokraglen;
        $('.filler_top, .filler_bottom').remove();
        $('.roundtop, .roundbottom').remove();

        // przywrocenie oryginalnej zawartosci kontenera
        id = $.fn.bp_layer_defaults.target;
        $(id).html($(id).data('oryginal_data'));
    }


    /**
     * Tworzenie zaokrąglenia i buttona zamykajacego wrstwe
     *
     * @desc: gdy nie ma naglowka, tworzymy pusty,
     * tworzymy zaokraglenie, podpinamy event draggable
     */
    bp_markupLayer = function()
    {
        // usuniecie starych zaokraglen;
        $('.filler_top, .filler_bottom').remove();
        $('.roundtop, .roundbottom').remove();

        if($('#TB_ajaxContent .layer_head').html() != null ) {
            // ustaw head jesli znaleziono
            setHead();
            if($.bp_internal_options.is_head)
                Rounded('layer_head_round', 6, 6);

            // mozna poruszcac okienkiem
//            $('#TB_window').draggable({handle: '.layer_head', cancel: '#TB_ajaxContent,img.close_layer'});
        } else {
            if($('#TB_window .layer_head_round').html() == null) {
                // wstaw head jesli nieznaleziono
                insertHead();
                if($.bp_internal_options.is_head)
                    Rounded('layer_head_round', 6, 6);

                // mozna poruszcac okienkiem
//                $('#TB_window').draggable({handle: '.layer_head', cancel: '#TB_ajaxContent,img.close_layer'});
            } else {
                // dopasuj szerokosc istniejacego head
                w = $('#TB_window').width()-20;
//                w = $.bp_internal_options.browser == 'opera' ? w-10 : w;
                $('#TB_window .layer_head_round').css('width',w);
            }
        }

        // zaokraglenie u gory
        $('#TB_window').prepend(htmlTop());
        // zaokraglenie u doly
        $('#TB_window').append(htmlBottom());
    }

    /**
     * Wstawaimy pusty naglowek , w przypadku braku jego podania w htmlu
     */
    insertHead = function()
    {
        w = $('#TB_window').width()-20;
//        w = $.bp_internal_options.browser == 'opera' ? w-10 : w;

        html = '';
        html += '<div class="layer_head_round" style="width: '+w+'px;">';
        html += '<p></p>';
        html += '<img class="close_layer" alt="" src="gfx/layer/x.gif"/>';
        html += '</div>';
        
        $('#TB_window').prepend(html);
    }

    /**
     * Dynamiczne utworzenie naglowka dla warstwy
     * @desc: kopiujemy zawartosc naglowka z Tb_ajaxcontetn i umiesczamy w Tb_window
     *        po czym usuwamy oryginalny naglowek, w miedzy czasie ustawiona jest
     *        rowniez szerokosc naglowka
     */
    setHead = function()
    {
        head = $('#TB_ajaxContent .layer_head');
        head.append('<img class="close_layer" alt="" src="gfx/layer/x.gif"/>');

        w = $('#TB_window').width()-20;
//        w = $.bp_internal_options.browser == 'opera' ? w-10 : w;
        
        head_content = head.html();
        class_name   = (head_content == null) ? 'layer_head_round head_hidden' : 'layer_head_round';
        head_open    = '<div class="'+class_name+'" style="width: '+w+'px;">';
        head_end     = '</div>';

        $('#TB_window').prepend(head_open+head_content+head_end);
        head.remove();
    }
    
    /**
     * Html do zaokraglenie gorenj czesci warstwy
     * @desc: w boxie:roundbottom dajemy zdjecie, drugie ustwaimy w stylach
     *        natomiast box filler_botom sluzy do dodatkowego wypelnienia warstwy
     */
    htmlTop = function()
    {
        w = $('#TB_window').width()-25;
        w = $.fn.bp_layer_defaults.animate ? w+5 : w;

        html = '';
        html += '<div class="filler_top" style="width: '+w+'px;"></div>';
        html += '<div class="roundtop">';
        html += '<img class="corner" width="15" height="15" style="display: none;" alt="" src="gfx/layer/tl.gif"/>';
        html += '</div>';
        return html;
    }

    /**
     * Html do zaokraglenie dolnej czesci warstwy
     * @desc: w boxie:roundbottom dajemy zdjecie, drugie ustwaimy w stylach
     *        natomiast box filler_botom sluzy do dodatkowego wypelnienia 
     */
    htmlBottom = function()
    {
        w = $('#TB_window').width()-25;
        w = $.fn.bp_layer_defaults.animate ? w+5 : w;

        html = '';
        html += '<div class="filler_bottom" style="width: '+w+'px;"></div>';
        html += '<div class="roundbottom">';
        html += '<img class="corner" width="15" height="15" style="display: none;" alt="" src="gfx/layer/bl.gif"/>';
        html += '</div>';
        return html;
    }

    /**
     * Wiadomosc o błedzie wykonywanej akcji prezoentowana na warstwie
     */
    bp_messageError = function(data)
    {
        head = $('#TB_window .layer_head_round');
        head.html('<p>'+data+'</p>');
        head.append('<img class="close_layer" alt="" src="gfx/layer/x.gif"/>');
        head.css({'background-color':'#f6e2e8','color':'#c22e2e'});
        Rounded('layer_head_round', 6, 6);
    }

    /**
     * Wiadomosc o pomyslnym wykonaniu akcji prezoentowana na warstwie
     */
    bp_messageSuccess = function(data)
    {
        head = $('#TB_window .layer_head_round');
        head.html('<p>'+data+'</p>');
        head.append('<img class="close_layer" alt="" src="gfx/layer/x.gif"/>');
        head.css({'background-color':'#e8f9ef','color':'#096'});
        Rounded('layer_head_round', 6, 6);
    }

    /**
     * Aktualne wymiary okna uzytkownika
     */
    getPageSize = function(){
	var de = document.documentElement;
	var w = window.innerWidth || self.innerWidth || (de&&de.clientWidth) || document.body.clientWidth;
	var h = window.innerHeight || self.innerHeight || (de&&de.clientHeight) || document.body.clientHeight;
	arrayPageSize = [w-20,h-150];
	return arrayPageSize;
    }

    /**
     * Czy wyswietlany jest scroll
     */
    isScrollShown = function(){
        target = document.getElementById('TB_ajaxContent');
        return target.scrollHeight > target.clientHeight ? true : false;
    }

    /**
     * Logowanie błedów i zdarzen
     */
    log = function (msg)
    {
        if (!window.console || !console) return;
        if (window.console || console.firebug){
                msg = msg || '';
                if(msg !== '') msg += ': ';
                console.log("%s%o", msg, this);
        }
    }
})(jQuery);
