(function($){

    // name unter dem jQuery.data() u.ä. gespeichert wird
    var objectName = 'rexxWindow';

    // selector für das window-element im window
    var windowSelector = '.rexxWindow';
    
    // selector für das close-element im window
    var closeSelector  = '.close';

    // selector für das drag-element im window
    var dragSelector   = '.title';

    // selector für das resize-element im window
    var resizeSelector = '.resize';

    // selector für das title-element im window
    var titleSelector  = '.title';
    
    // selector für den head-bereich
    var headSelector = '.head';

    // selector für den content des windows
    var contentSelector = '.content';

    var settings = {
        resize: false,  // soll die fenstergröße zu ändern sein?
        title: false,   // einen festen titel hier eingeben
        content: false,    // einen festen inhalt hier eingeben
        contentUrl: false,  // wenn der inhalt über ajax geladen werden soll hier die url angeben
        contentSelector: false, // wenn der inhalt aus einem dom-element kommt hier den selector angeben
        cacheContent: false,    // soll der inhalt jedes mal geladen werden oder nur beim ersten mal?
        onReadyLoad: false,
        width: 'auto'
    }

    var fn = {

        initWindow: function() {
            
            $(windowSelector).jqm({
                onHide: fn.closeWindow
            })
                .jqDrag($(windowSelector+' '+dragSelector))
                .jqResize(resizeSelector)
                .jqmAddClose(windowSelector+' '+closeSelector);
                
            $(windowSelector+' '+resizeSelector).hide();
        },
        initButton: function($this) {

            var data = {}

            if(typeof $this.attr(objectName+':resize') != 'undefined') {
                data.resize = ($this.attr(objectName+':resize') == 'true' ? true : false);
            }
            if(typeof $this.attr(objectName+':title') != 'undefined') {
                data.title = $this.attr(objectName+':title');
            }
            if(typeof $this.attr(objectName+':content') != 'undefined') {
                data.content = $this.attr(objectName+':content');
            }
            if(typeof $this.attr(objectName+':contentUrl') != 'undefined') {
                data.contentUrl = $this.attr(objectName+':contentUrl');
            }
            if(typeof $this.attr(objectName+':contentSelector') != 'undefined') {
                data.contentSelector = $this.attr(objectName+':contentSelector');
            }
            if(typeof $this.attr(objectName+':cacheContent') != 'undefined') {
                data.cacheContent = $this.attr(objectName+':cacheContent');
            }
            if(typeof $this.attr(objectName+':onReadyLoad') != 'undefined') {
                data.onReadyLoad = $this.attr(objectName+':onReadyLoad');
            }
            if(typeof $this.attr(objectName+':width') != 'undefined') {
                data.width = $this.attr(objectName+':width');
            }

            data = $.extend({}, settings, data);

            $this.data(objectName, data);
            $this.css({cursor: 'pointer'});

            $this.click(function(e) {
                if(typeof e.preventDefault == 'function') e.preventDefault();
                fn.showWindow($this);
            });

            return $this;
        },
        showWindow: function($this, data) {

            if(typeof data == 'undefined' || !data) {
                data = $this.data(objectName);
            }

            if(data.resize == true) {
                $(windowSelector+' '+resizeSelector).show();
            }

            if(data.title.length > 0)  {
                $(windowSelector+' '+titleSelector).html(data.title);
            } else {
                $(windowSelector+' '+titleSelector).html('&nbsp;');
            }

            var content;
            
            if(data.content != false && data.content != "" && data.content != 'false') {
                content = data.content;
            } else if(typeof data.tmpContent != 'undefined' && data.tmpContent != '') {
                content = data.tmpContent;
                data.tmpContent = '';
                $this.data(objectName, data);
            } else if(data.contentUrl != false) {
                fn.loadData(data.contentUrl, $this);
                return;
            } else if(data.contentSelector != false) {
                content = $(data.contentSelector).clone();
            }

            if(data.cacheContent != 'false') {
                data.content = content;
                $this.data(objectName, data);
            }

            var width = 'auto';
            var minWidth = '600px';
            if(data.width != 'auto') {
                minWidth = width = data.width+'px';
            }

            if(typeof content == 'object') {
                $(windowSelector+' '+contentSelector).css({width: width, 'min-width': minWidth}).html('').prepend(content);
            } else {
                $(windowSelector+' '+contentSelector).css({width: width, 'min-width': minWidth}).html(content);
            }
            $(windowSelector+' '+headSelector).css({width: width, 'min-width': minWidth});
            $(windowSelector).css({opacity: 1, width: width, 'min-width': minWidth}).jqmShow();

            if(data.onReadyLoad != false) {
                (function(content,link) {
                    var link = $this;
                    eval(data.onReadyLoad);
                })($(windowSelector+' '+contentSelector));
            }

            $('.jqmOverlay').unbind('click').click(function(e) {e.preventDefault();$(windowSelector).jqmHide();});
            if($.browser.msie) {
                $('.jqmOverlay').css({
                    position: 'absolute',
                    height: $('#container').height()
                });
            }
        },
        closeWindow: function(h) {

            $(windowSelector).hide();
            $(windowSelector+' '+titleSelector).html('loading');
            $(windowSelector+' '+contentSelector).html('');
            $(windowSelector+' '+resizeSelector).hide();

            h.o.remove();
        },
        loadData: function(url, $this) {

            var data = $this.data(objectName);

            $.ajax({
                url: url,
                data: {sid: rexxData.sid, lang: rexxData.language},
                success: function(returnData) {
                    data.tmpContent = returnData.html;
                    if(data.cacheContent != 'false') {
                        data.content = data.tmpContent;
                    }
                    if(typeof returnData.title != 'undefined' ) {
                        data.title = returnData.title;
                    }
                    $this.data(objectName, data);
                    fn.showWindow($this, data);
                }
            });
        }
    }

    $.rexxWindow = $.fn.rexxWindow = fn.initWindow;
    $.rexxWindowHide = function() {
        $(windowSelector).jqmHide();
    }
    $.fn.rexxWindowShow = function() {
        fn.showWindow($(this));
    }
    $.fn.rexxWindowButton = function(options) {

        return this.each(function() {

            return fn.initButton($(this));
        })
    }
})(jQuery);


$(document).ready(function() {
    $.rexxWindow();
    $('.rexxWindowButton').rexxWindowButton();
});
