(function($) {

    var methods = {
        init: function(options_user) 
        {
            return this.each(function() {

                var $this = $(this),
                    options = $this.data('waiter');

                var parent_element_height = $this.height();

                $this.css({
                    height: parent_element_height+'px',
                    overflow: 'hidden'
                });

                if (!options) {

                    options_default = {
                        'min-wait'         : 1000,  //<< minimalni doba zobrazeni waiteru
                        'max-wait'         : 10000, //<< maximalni doba zobrazeni waiteru
                        'showtime'         : null,  //<< cas zobrazeni waiteru
                        'class-container'  : 'waiter-inspire',
                        'class-shader'     : 'waiter-inspire-shader',
                        'class-image'      : 'waiter-inspire-image',
                        'class-text'       : 'waiter-inspire-text',
                        'loading_img'      : '/media/pagebase/loading-animation.gif',
                        'background_img'   : '' //<< TODO: v pripade pouziti v IE6, potreba dodelat
                    };

                    options = $.extend(options_default, options_user);

                } else {

                    options = $.extend(options, options_user);

                }
               
                if ('undefined' == typeof options.uid || 0 == options.uid.length) {

                    var element_position = $(this).css('position')
                    var uid = ''
                    var dt = new Date()
                    var chars = "0123456789ABCDEFGHIJKLMNOPQRSTUVWXTZabcdefghiklmnopqrstuvwxyz";

                    options.showtime = dt.getTime()

                    if ( 'absolute' != element_position 
                         && 'relative' != element_position) {
                        // prvek neni pozicovany absolutne, ani relativne, musim jej nastavit na relativni pozicovani
                        $(this).css('position', 'relative')
                    }

                    // vytvorim si unikatni ID waiteru
                    for (var i = 0; i < 10; i++ ) {
                        var rnum = Math.floor(Math.random() * chars.length);
                        uid += chars.substring(rnum, rnum + 1)
                    }

                    options.uid = uid

                    $(this).append('<div class="'+ options['class-container'] +'" id="'+ uid +'"><div class="'+ options['class-shader'] +'">&nbsp;</div></div>')

                    var waiter = $('#'+uid)
                    // ziskam rozmery cekaciho okna
                    var width = waiter.width()
                    var height = waiter.height()
                    // umistim do nej progress
                    waiter.append('<div class="'+ options['class-image'] +'" style="margin-top: '+ (height/4) +'px;"><img src="'+ options.loading_img +'" /></div>')
                    waiter.append('<div class="'+ options['class-text'] +'"></div>');

                }
                
                $(this).data('waiter', options);
            });
        },
        textadd: function(options_user) {
            var options = $(this).data('waiter');

            if (!options) {
                return;
            }
            var uid = '#'+options.uid+' .'+options['class-text'];
            $(uid).append("<div>"+options_user['text']+"</div>");
        },
        hide: function()
        {
            return this.each(function() {
        
                var options = $(this).data('waiter');

                if (!options) {
                    // pokud neexistuje konfigurace, neni waiter zobrazen
                    return;
                }

                $(this).css('height', 'auto');

                var dt = new Date()
                var current_time = dt.getTime()
                var hidden_time = options.showtime + options['min-wait']

                if (current_time < hidden_time) {
                    var wait = hidden_time - current_time
                    setTimeout("$('#"+options.uid+"').remove()", wait)
                } else {
                    $(this).find('#'+options.uid).remove()
                }

                if ('function' === typeof options.callback)    {
                    eval( options.callback + '()' )
                }

                options.uid = '';

                $(this).data('waiter', options);
            });
        }

    }

    $.fn.waiter = function(method) {

        if (methods[method]) {
            return methods[method].apply(this, Array.prototype.slice.call(arguments, 1));
        } else if (typeof method === 'object' || !method) {
            return methods.init.apply(this, arguments);
        } else {
            $.error( 'Metoda ' + method + ' pro plugin Waiter neexistuje!' );
        }

    }

})(jQuery);

///-----------------------------------------------------------------------------------------------------------------------
///-------------------------------------------------------------------------------------------------- starsi verze waiteru

var waiter_timeout;
var waiter_text;
var waiter_callback = null
var waiter_textelement_id = 'waiter-text'
var waiter_displayed = false
var waiter_display_time = 0

function waiter_set_text(text)
{
    waiter_text = text;
}
//nastavuje timeout pro stmivac
function waiter_set_timeout(time)
{
    waiter_timeout = time*1000;
}

function waiter_show(text, timeout, callback)
{
    var objDate = new Date()

    waiter_displayed = true
    waiter_display_time = objDate.getTime() // ziskam cas zobrazeni waiteru

    // overim a potazmo nastavim vsechny parametry, jez jsou volitelne
    if ('undefined' != typeof callback)   { waiter_callback = callback }
    if ('undefined' != typeof text    )   { waiter_set_text(text) }
    if ('undefined' != typeof timeout )   { waiter_set_timeout(timeout) }

    $('body').append('<div id="inspire_waiter_shader" style="display: block; width: 100%; height: 100%; opacity: 0.85; filter:alpha(opacity=85); background-color: #000; left: 0; top: 0; position: fixed; z-index: 1000;"></div>');
    $('body').append('<div id="inspire_waiter_img" style="position: absolute; left: 50%; top: 40%; margin-left: -104px; z-index: 1001; text-align: center;"><img src="/media/pagebase/loading-animation.gif" /></div>');

    if ($.browser.msie && ('6.0' == jQuery.browser.version)) {
        $('html').css('height', '100%');
        $('body').css('height', '100%');
        $('#inspire_waiter_shader').css('position', 'absolute');
    }

    // volitelny text
    if (waiter_text) {
        wt = '<p id="'+ waiter_textelement_id +'" style="color:#fff; margin-top: 10px;">' + waiter_text +' </p>' 


        $('#inspire_waiter_img').append(wt)
    }

    

}

function waiter_perform_hide()
{
    $('#inspire_waiter_shader').remove();
    $('#inspire_waiter_img').remove();

    if (null != waiter_callback) {
        waiter_callback()
    }

    waiter_displayed = false
}

function waiter_hide()
{
    var objDate = new Date()
    // ziskam cas, za jak dlouho bych mel waiter skryt
    var waiter_hide_after = (waiter_display_time + waiter_timeout) - objDate.getTime()

    if (waiter_hide_after > 0) {
        setTimeout('waiter_perform_hide()', waiter_hide_after);
    } else {
        waiter_perform_hide();
    }
}

