/**
* @author Roger Wu
* reference:dwz.drag.js, dwz.dialogDrag.js, dwz.resize.js, dwz.taskBar.js
*/
(function ($) {
    $.pdialog = {
        _op: { height: 300, width: 580, minH: 40, minW: 50, total: 20, max: false, mask: false, resizable: true, drawable: true, maxable: true, minable: true, fresh: true },
        _current: null,
        _zIndex: 42,
        getCurrent: function () {
            return this._current;
        },
        reload: function (url, options) {
            var op = $.extend({ data: {}, dialogId: "", callback: null }, options);
            var dialog = (op.dialogId && $("body").data(op.dialogId)) || this._current;
            if (dialog) {
                var jDContent = dialog.find(".dialogContent");
                jDContent.ajaxUrl({
                    type: "POST", url: url, data: op.data, callback: function (response) {
                        jDContent.find("[layoutH]").layoutH(jDContent);
                        $(".pageContent", dialog).width($(dialog).width() - 14);
                        $(":button.close", dialog).click(function () {
                            $.pdialog.close(dialog);
                            return false;
                        });
                        if ($.isFunction(op.callback)) op.callback(response);
                    }
                });
            }
        },
        //打开一个层
        open: function (url, dlgid, title, options) {
            var op = $.extend({}, $.pdialog._op, options);
            var dialog = $("body").data(dlgid);
            //重复打开一个层
            if (dialog) {
                if (dialog.is(":hidden")) {
                    dialog.show();
                }
                if (op.fresh || url != $(dialog).data("url")) {
                    dialog.data("url", url);
                    dialog.find(".dialogHeader").find("h1").html(title);
                    this.switchDialog(dialog);
                    var jDContent = dialog.find(".dialogContent");
                    jDContent.loadUrl(url, {}, function () {
                        jDContent.find("[layoutH]").layoutH(jDContent);
                        $(".pageContent", dialog).width($(dialog).width() - 14);
                        $("button.close").click(function () {
                            $.pdialog.close(dialog);
                            return false;
                        });
                    });
                }

            } else { //打开一个全新的层

                $("body").append(DWZ.frag["dialogFrag"]);
                dialog = $(">.dialog:last-child", "body");
                dialog.data("id", dlgid);
                dialog.data("url", url);
                if (options.close) dialog.data("close", options.close);
                if (options.param) dialog.data("param", options.param);
                ($.fn.bgiframe && dialog.bgiframe());

                dialog.find(".dialogHeader").find("h1").html(title);
                $(dialog).css("zIndex", ($.pdialog._zIndex += 2));
                $("div.shadow").css("zIndex", $.pdialog._zIndex - 3).show();
                $.pdialog._init(dialog, options);
                $(dialog).click(function () {
                    $.pdialog.switchDialog(dialog);
                });

                if (op.resizable)
                    dialog.jresize();
                if (op.drawable)
                    dialog.dialogDrag();
                $("a.close", dialog).click(function (event) {
                    $.pdialog.close(dialog);
                    return false;
                });
                if (op.maxable) {
                    $("a.maximize", dialog).show().click(function (event) {
                        $.pdialog.switchDialog(dialog);
                        $.pdialog.maxsize(dialog);
                        dialog.jresize("destroy").dialogDrag("destroy");
                        return false;
                    });
                } else {
                    $("a.maximize", dialog).hide();
                }
                $("a.restore", dialog).click(function (event) {
                    $.pdialog.restore(dialog);
                    dialog.jresize().dialogDrag();
                    return false;
                });
                if (op.minable) {
                    $("a.minimize", dialog).show().click(function (event) {
                        $.pdialog.minimize(dialog);
                        return false;
                    });
                } else {
                    $("a.minimize", dialog).hide();
                }
                $("div.dialogHeader a", dialog).mousedown(function () {
                    return false;
                });
                $("div.dialogHeader", dialog).dblclick(function () {
                    if ($("a.restore", dialog).is(":hidden"))
                        $("a.maximize", dialog).trigger("click");
                    else
                        $("a.restore", dialog).trigger("click");
                });
                if (op.max) {
                    //					$.pdialog.switchDialog(dialog);
                    $.pdialog.maxsize(dialog);
                    dialog.jresize("destroy").dialogDrag("destroy");
                }
                $("body").data(dlgid, dialog);
                $.pdialog._current = dialog;
                $.pdialog.attachShadow(dialog);
                //load data
                var jDContent = $(".dialogContent", dialog);
                jDContent.loadUrl(url, {}, function () {
                    jDContent.find("[layoutH]").layoutH(jDContent);
                    $(".pageContent", dialog).width($(dialog).width() - 14);
                    $("button.close").click(function () {
                        $.pdialog.close(dialog);
                        return false;
                    });
                });
            }
            if (op.mask) {
                $(dialog).css("zIndex", 1000);
                $("a.minimize", dialog).hide();
                $(dialog).data("mask", true);
                $("#dialogBackground").show();
            } else {
                //add a task to task bar
                if (op.minable) $.taskBar.addDialog(dlgid, title);
            }
        },
        /**
        * 切换当前层
        * @param {Object} dialog
        */
        switchDialog: function (dialog) {
            var index = $(dialog).css("zIndex");
            $.pdialog.attachShadow(dialog);
            if ($.pdialog._current) {
                var cindex = $($.pdialog._current).css("zIndex");
                $($.pdialog._current).css("zIndex", index);
                $(dialog).css("zIndex", cindex);
                $("div.shadow").css("zIndex", cindex - 1);
                $.pdialog._current = dialog;
            }
            $.taskBar.switchTask(dialog.data("id"));
        },
        /**
        * 给当前层附上阴隐层
        * @param {Object} dialog
        */
        attachShadow: function (dialog) {
            var shadow = $("div.shadow");
            if (shadow.is(":hidden")) shadow.show();
            shadow.css({
                top: parseInt($(dialog)[0].style.top) - 2,
                left: parseInt($(dialog)[0].style.left) - 4,
                height: parseInt($(dialog).height()) + 8,
                width: parseInt($(dialog).width()) + 8,
                zIndex: parseInt($(dialog).css("zIndex")) - 1
            });
            $(".shadow_c", shadow).children().andSelf().each(function () {
                $(this).css("height", $(dialog).outerHeight() - 4);
            });
        },
        _init: function (dialog, options) {
            var op = $.extend({}, this._op, options);
            var height = op.height > op.minH ? op.height : op.minH;
            var width = op.width > op.minW ? op.width : op.minW;
            if (isNaN(dialog.height()) || dialog.height() < height) {
                $(dialog).height(height + "px");
                $(".dialogContent", dialog).height(height - $(".dialogHeader", dialog).outerHeight() - $(".dialogFooter", dialog).outerHeight() - 6);
            }
            if (isNaN(dialog.css("width")) || dialog.width() < width) {
                $(dialog).width(width + "px");
            }

            var iTop = ($(window).height() - dialog.height()) / 2;
            dialog.css({
                left: ($(window).width() - dialog.width()) / 2,
                top: iTop > 0 ? iTop : 0
            });
        },
        /**
        * 初始化半透明层
        * @param {Object} resizable
        * @param {Object} dialog
        * @param {Object} target
        */
        initResize: function (resizable, dialog, target) {
            $("body").css("cursor", target + "-resize");
            resizable.css({
                top: $(dialog).css("top"),
                left: $(dialog).css("left"),
                height: $(dialog).css("height"),
                width: $(dialog).css("width")
            });
            resizable.show();
        },
        /**
        * 改变阴隐层
        * @param {Object} target
        * @param {Object} options
        */
        repaint: function (target, options) {
            var shadow = $("div.shadow");
            if (target != "w" && target != "e") {
                shadow.css("height", shadow.outerHeight() + options.tmove);
                $(".shadow_c", shadow).children().andSelf().each(function () {
                    $(this).css("height", $(this).outerHeight() + options.tmove);
                });
            }
            if (target == "n" || target == "nw" || target == "ne") {
                shadow.css("top", options.otop - 2);
            }
            if (options.owidth && (target != "n" || target != "s")) {
                shadow.css("width", options.owidth + 8);
            }
            if (target.indexOf("w") >= 0) {
                shadow.css("left", options.oleft - 4);
            }
        },
        /**
        * 改变左右拖动层的高度
        * @param {Object} target
        * @param {Object} tmove
        * @param {Object} dialog
        */
        resizeTool: function (target, tmove, dialog) {
            $("div[class^='resizable']", dialog).filter(function () {
                return $(this).attr("tar") == 'w' || $(this).attr("tar") == 'e';
            }).each(function () {
                $(this).css("height", $(this).outerHeight() + tmove);
            });
        },
        /**
        * 改变原始层的大小
        * @param {Object} obj
        * @param {Object} dialog
        * @param {Object} target
        */
        resizeDialog: function (obj, dialog, target) {
            var oleft = parseInt(obj.style.left);
            var otop = parseInt(obj.style.top);
            var height = parseInt(obj.style.height);
            var width = parseInt(obj.style.width);
            if (target == "n" || target == "nw") {
                tmove = parseInt($(dialog).css("top")) - otop;
            } else {
                tmove = height - parseInt($(dialog).css("height"));
            }
            $(dialog).css({ left: oleft, width: width, top: otop, height: height });
            $(".dialogContent", dialog).css("width", (width - 12) + "px");
            $(".pageContent", dialog).css("width", (width - 14) + "px");
            if (target != "w" && target != "e") {
                var content = $(".dialogContent", dialog);
                content.css({ height: height - $(".dialogHeader", dialog).outerHeight() - $(".dialogFooter", dialog).outerHeight() - 6 });
                content.find("[layoutH]").layoutH(content);
                $.pdialog.resizeTool(target, tmove, dialog);
            }
            $.pdialog.repaint(target, { oleft: oleft, otop: otop, tmove: tmove, owidth: width });

            $(window).trigger("resizeGrid");
        },
        close: function (dialog) {
            if (typeof dialog == 'string') dialog = $("body").data(dialog);
            var close = dialog.data("close");
            var go = true;
            if (close && $.isFunction(close)) {
                var param = dialog.data("param");
                if (param && param != "") {
                    param = DWZ.jsonEval(param);
                    go = close(param);
                } else {
                    go = close();
                }
                if (!go) return;
            }
            if ($.fn.xheditor) {
                $("textarea.editor", dialog).xheditor(false);
            }
            $(dialog).unbind("click").hide();
            $("div.dialogContent", dialog).html("");
            $("div.shadow").hide();
            if ($(dialog).data("mask")) {
                $("#dialogBackground").hide();
            } else {
                if ($(dialog).data("id")) $.taskBar.closeDialog($(dialog).data("id"));
            }
            $("body").removeData($(dialog).data("id"));
            $(dialog).remove();
        },
        closeCurrent: function () {
            this.close($.pdialog._current);
        },
        checkTimeout: function () {
            var $conetnt = $(".dialogContent", $.pdialog._current);
            var json = DWZ.jsonEval($conetnt.html());
            if (json && json.statusCode == DWZ.statusCode.timeout) this.closeCurrent();
        },
        maxsize: function (dialog) {
            $(dialog).data("original", {
                top: $(dialog).css("top"),
                left: $(dialog).css("left"),
                width: $(dialog).css("width"),
                height: $(dialog).css("height")
            });
            $("a.maximize", dialog).hide();
            //$("a.restore", dialog).show();
            var iContentW = $(window).width();
            var iContentH = $(window).height() - 34;
            $(dialog).css({ top: "0px", left: "0px", width: iContentW + "px", height: iContentH + "px" });
            $.pdialog._resizeContent(dialog, iContentW, iContentH);
        },
        restore: function (dialog) {
            var original = $(dialog).data("original");
            var dwidth = parseInt(original.width);
            var dheight = parseInt(original.height);
            $(dialog).css({
                top: original.top,
                left: original.left,
                width: dwidth,
                height: dheight
            });
            $.pdialog._resizeContent(dialog, dwidth, dheight);
            $("a.maximize", dialog).show();
            $("a.restore", dialog).hide();
            $.pdialog.attachShadow(dialog);
        },
        minimize: function (dialog) {
            $(dialog).hide();
            $("div.shadow").hide();
            var task = $.taskBar.getTask($(dialog).data("id"));
            $(".resizable").css({
                top: $(dialog).css("top"),
                left: $(dialog).css("left"),
                height: $(dialog).css("height"),
                width: $(dialog).css("width")
            }).show().animate({ top: $(window).height() - 60, left: task.position().left, width: task.outerWidth(), height: task.outerHeight() }, 250, function () {
                $(this).hide();
                $.taskBar.inactive($(dialog).data("id"));
            });
        },
        _resizeContent: function (dialog, width, height) {
            var content = $(".dialogContent", dialog);
            content.css({ width: (width - 12) + "px", height: height - $(".dialogHeader", dialog).outerHeight() - $(".dialogFooter", dialog).outerHeight() - 6 });
            content.find("[layoutH]").layoutH(content);
            $(".pageContent", dialog).css("width", (width - 14) + "px");

            $(window).trigger("resizeGrid");
        }
    };
})(jQuery);