var Dialog = function() {
    var window = function() {
        var win = $('<div class="dialog-window"></div>')
                    .addClass('dialog-window')
                    .hide()
                    .appendTo('body')
                    .hide();
        
        $(document).bind('changeDom', function() {
            //$('.dialog-content', win).css('max-height', $('body').height()-300);
            
            var top = $('body').height()/2 - win.height()/2 + $(document).scrollTop();
            top = top < 0 ? 0 : top;
            
            win.css('top', top).fadeIn();
            });
        
        return {
            getWindow: function() {
                return $('.dialog-window', win.parent());
                },
                
            modal: function() {
                var overlay = $('<div></div>')
                                .addClass('dialog-modal')
                                .height($(document).height());
                win.wrap(overlay);
                },
           
            load: function(url, callback) {
                },
            
            loadTemplate: function(template, data, callback) {
                $.ajax({
                    url: template,
                    async: false,
                    success: function(tpl) {
                        $(tpl).tmpl(data).appendTo(win);
                        if (callback) callback();
                        }
                    });
                },
            
            close: function() {
                var parent = win.parent();
                
                if(parent.hasClass('dialog-modal')) win.parent().remove();
                else win.remove();
                }
        };
    };
    
    var deleteWindow = function(win) {
    };

    return {
        ajax: function(url, title) {
            var win = new window();
            win.modal();
            
            $.getJSON(url, function(response) {
                win.loadTemplate('/rc/script/dialog/base.tpl', {title: title, msg: response.html}, function() {
                    $('.dialog-close', win.getWindow()).click(win.close);
                    $(document).trigger('changeDom', {where: win.getWindow()});
                    });
                });
                
            delete win;
            return false;
            },
    
        confirm: function(msg, txt, cb) {
            var win = new window();
            win.modal();
            win.getWindow().addClass('window-confirm');
           
            win.loadTemplate('/rc/script/dialog/confirm.tpl', {title: msg, confirm_text: txt}, function() {
                $('.dialog-cancel', win.getWindow()).click(function() {
                    win.close();
                    return false;
                    });
                $('.dialog-ok', win.getWindow()).click(function() {
                    win.close();
                    cb();
                    return true;
                    });
                $(document).trigger('changeDom', {where: win.getWindow()});
                });

            delete win;
            return false;
            },
        
        alert: function(msg, txt) {
            var win = new window();
            win.modal();
           
            win.loadTemplate('/rc/script/dialog/alert.tpl', {title: msg, msg: txt}, function() {
                $('.dialog-close', win.getWindow()).click(win.close);
                $(document).trigger('changeDom', {where: win.getWindow()});
                });

            delete win;
            },
            
        info: function() {
            },
        
        /* Form betöltése az ablakba */
        form: function(url, title) {
            var win = new window();
            win.modal();
            
            var messages = function(msgs) {
                $('.dialog-msgs', win.getWindow()).empty();
                for (i in msgs) {
                    var box = $('<div></div>').addClass(i);
                    for (j in msgs[i]) box.append(msgs[i][j]+'<br />');
                    }
                    $('.dialog-msgs', win.getWindow()).append(box);
                };
                
            $.get(url, function(response) {
                response = $.parseJSON(response);
                response.title = title;
                win.loadTemplate('/rc/script/dialog/form.tpl', response, function() {
                    var mWindow = win.getWindow(),
                        form = $('form', mWindow),
                        formcontent = form.children();
                        
                    form.attr('action', '/ajax'+form.attr('action'));
                    form.ajaxForm({
                        beforeSubmit: function() {return form.valid(); },
                        success: function(r) {
                            var res = JSON.parse(r);
                            if (res.data) {
                                if (res.data.redirect) location.replace(res.data.redirect);
                                if (res.data.msgs) messages(res.data.msgs);
                                }
                            }
                        });

                    $('.dialog-content', mWindow).append(formcontent);
                    $('.dialog-inner', mWindow).wrap(form);
                    $('.dialog-inner form', mWindow).remove();
                
                    $('.dialog-close', mWindow).click(win.close);
                    $('input[type=submit]', mWindow)
                        .prependTo($('.dialog-footer', mWindow));
                    
                    $(document).trigger('changeDom', {where: win.getWindow()});
                    });
                });
            
            delete win;
            return false;
            }
    };
}();


function dialogInit(where) {
    $('a.dialog-ajax', where).each(function() {
        var url = '/ajax'+$(this).attr('href'),
            title = $(this).data('title');
        $(this).click(function() { Dialog.ajax(url, title); return false; });
        });
    $('a.dialog-form', where).each(function() {
        var url = '/ajax'+$(this).attr('href'),
            title = $(this).data('title');
        $(this).click(function() { Dialog.form(url, title); return false; });
        });
    $('a.dialog-confirm', where).each(function() {
        var a = $(this);
        a.click(function() {
            return Dialog.confirm(
                a.data("confirm"),
                a.data("text"),
                function() { location.replace(a.attr('href')); }
                );
            });
        });
    }
    
$(document).ready(function() {
    dialogInit(document);
    $(document).bind('changeDom', function(e, data) { dialogInit(data.where); });
    });

