//弹出层
;RoadUI.Window = function ()
{
this.opts = {};
var instance = this;
this.open = function (options)
{
var defaults = {
id: "",
title: "",
url: "",
ico: "",
showico: true,
showclose: true,
left: 0,
top: 0,
height: 300,
width: 600,
ismodal: true, //是否模态窗口
zindex: 9999,
resize: true,
opener: null,
openerid: ""
};
this.opts = $.extend(defaults, options);
this.opts.opener = this.getOpener();
this.opts.id = this.getID();
var $opener = $(this.opts.opener);
if ($opener == null || $opener.size() == 0)
{
throw "父窗口为空!"; return false;
}
var $openerBody = $(this.opts.opener.document.body);
var $openerDocument = $(this.opts.opener.document);
if ($openerBody == null || $openerBody.size() == 0)
{
throw "父窗口body为空!"; return false;
}
if (this.opts.left == 0)
{
this.opts.left = ($opener.width() - this.opts.width) / 2;
}
if (this.opts.top == 0)
{
this.opts.top = ($opener.height() - this.opts.height) / 2 + $(this.opts.opener.document).scrollTop();
}
if (this.opts.ismodal)//如果是模态窗口,则添加遮罩层
{
var $maskdiv = $('
', $openerDocument);
$maskdiv.width($opener.width()).height(Math.max($openerBody.get(0).clientHeight, $opener.height()));
$openerBody.append($maskdiv);
}
var $maindiv = $('', $openerDocument);
var $titlediv = $('', $openerDocument);
var $bodydiv = $('', $openerDocument);
var $resizediv = null;
var $titlediv_title = $('' + this.opts.title + '
', $openerDocument);
if (this.opts.showico && this.opts.ico && $.trim(this.opts.ico).length > 0)
{
$titlediv_title.css({ 'background-image': 'url(' + this.opts.ico + ')' });
}
//双击关闭窗口
$titlediv_title.bind("dblclick", function () { instance.close($(this).parent().parent().attr("id")); });
var $titlediv_button = $();
if (this.opts.showclose)
{
$titlediv_button = $('
', $openerDocument);
$titlediv_button.bind("mouseover", function ()
{
$(this).removeClass().addClass("window_title_button1");
}).bind("mouseout", function ()
{
$(this).removeClass().addClass("window_title_button");
}).bind("click", function ()
{
instance.close($(this).parent().parent().attr("id"));
});
}
$titlediv.append($titlediv_title, $titlediv_button, '');
var bodydivHeight = this.opts.height - (this.opts.resize ? 39 : 26);
$bodydiv.css({ "height": bodydivHeight + "px" });
if (this.opts.url && $.trim(this.opts.url).length > 0)
{
var url = this.opts.url;
if (url.indexOf('?') >= 0)
{
url += "&iframeid=" + this.opts.id + "&openerid=" + this.opts.openerid;
}
else
{
url += "?iframeid=" + this.opts.id + "&openerid=" + this.opts.openerid;
}
var $iframe = $('', $openerDocument);
if (this.opts.title.isNullOrEmpty())
{
$iframe.bind("load", function ()
{
if (!instance.opts.title || $.trim(instance.opts.title).length == 0)
{
var title = "";
try
{
title = $("head title", $(this).contents()).html();
} catch (e) { }
instance.setTitle(title);
}
});
}
$bodydiv.append($iframe);
}
$maindiv.append($titlediv, $bodydiv);
if (this.opts.resize)
{
$resizediv = $('', $openerDocument);
$maindiv.append($resizediv);
}
$openerBody.append($maindiv);
var maindiv = $maindiv.get(0);
var titlediv = $titlediv.get(0);
var resizediv = $resizediv ? $resizediv.get(0) : null;
new draging
(
titlediv,
function ()
{
return { x: maindiv.offsetLeft, y: maindiv.offsetTop };
},
function (x, y)
{
win = instance.opts.opener || top;
var iSTop = win.document.body.scrollTop || win.document.documentElement.scrollTop;
if (x < 0)
{
x = 0;
}
else if (x + maindiv.offsetWidth > win.document.documentElement.clientWidth)
{
x = win.document.body.clientWidth - maindiv.offsetWidth;
}
if (y < iSTop)
{
y = iSTop;
}
else if (y + maindiv.offsetHeight > win.document.documentElement.clientHeight + iSTop)
{
y = win.document.documentElement.clientHeight - maindiv.offsetHeight + iSTop;
}
maindiv.style.left = x + 'px';
maindiv.style.top = y + 'px';
},
instance.opts.opener
);
if (this.opts.resize)
{
var resizediv = $resizediv.get(0);
new draging
(
resizediv,
function ()
{
g_orgTop = maindiv.offsetTop;
g_orgHeight = maindiv.offsetHeight;
g_orgLeft = maindiv.offsetLeft;
g_orgWidth = maindiv.offsetWidth;
return { x: maindiv.offsetWidth, y: maindiv.offsetHeight };
},
function (x, y)
{
doBothDrag(x, y, maindiv);
},
instance.opts.opener
);
};
return this.opts.id;
};
this.getOpener = function ()
{
if (this.opts.opener)
{
return this.opts.opener;
}
if (this.opts.openerid)
{
var iframes = top.frames;
for (var i = 0; i < iframes.length; i++)
{
if ($(iframes[i]).attr("name") == this.opts.openerid)
{
return iframes[i];
}
}
}
return window.top;
};
this.getID = function ()
{
var id = this.opts.id != null && this.opts.id != undefined && $.trim(this.opts.id).length > 0 ? this.opts.id : "roadui_window_" + Math.random().toString();
return id.replaceAll('.', '');
};
this.setTitle = function (title)
{
this.opts.title = title;
var mainid = this.opts.id;
var $titlediv = $(">div:first", $("#" + mainid + "_titlediv", $(this.opts.opener.document)));
if ($titlediv == null || $titlediv.size() == 0)
{
return false;
}
$titlediv.text(title);
return true;
};
this.close = function (id)
{
if (!id || id.trim().length == 0)
{
id = RoadUI.Core.query("iframeid");
}
return closeWindow(id);
};
this.closeAll = function ()
{
return closeWindow();
};
function closeWindow(id)
{
var amount = 0;
var $maindiv = !id || id.trim().length == 0 ? $("div[id^='roadui_window_']", top.document) : $("#" + id, top.document);
for (var x = 0; x < $maindiv.size(); x++)
{
try
{
$maindiv.eq(x).find("iframe").attr("src", "about:blank");
CollectGarbage();
} catch (e) { }
try
{
$("#" + $maindiv.eq(x).attr("id") + "_maskdiv", top.document).remove();
$maindiv.eq(x).find("iframe").remove();
$maindiv.eq(x).remove();
amount++;
} catch (e) { }
}
for (var i = 0; i < top.frames.length; i++)
{
var $maindiv1 = !id || id.trim().length == 0 ? $("div[id^='roadui_window_']", top.frames[i].document) : $("#" + id, top.frames[i].document);
for (var j = 0; j < $maindiv1.size(); j++)
{
try
{
$maindiv1.eq(j).find("iframe").attr("src", "about:blank");
CollectGarbage();
} catch (e) { }
try
{
$("#" + $maindiv1.eq(j).attr("id") + "_maskdiv", top.frames[i].document).remove();
$maindiv1.eq(j).find("iframe").remove();
$maindiv1.eq(j).remove();
amount++;
} catch (e) { }
}
}
return amount;
};
var iframesArray = new Array();
this.getOpenerElement = function (id)
{
iframesArray = new Array();
var openerid = RoadUI.Core.query("openerid") || "";
if (openerid && openerid.length > 0)
{
openerid += "_iframe";
}
var ele = $();
var iframes = $(top.document).find("iframe");
if (openerid && openerid.length > 0)
{
for (var i = iframes.size() - 1; i >= 0; i--)
{
if (openerid && openerid.length > 0 && openerid == iframes.eq(i).attr("id"))
{
var obj = iframes.eq(i).get(0).contentWindow.document.getElementById(id);
if (obj)
{
return $(obj);
}
}
}
}
if (ele.size() == 0)
{
addIframe(top.document);
for (var i = iframesArray.length - 1; i >= 0; i--)
{
var obj = iframesArray[i].contentWindow.document.getElementById(id);
if (obj)
{
iframesArray = [];
return $(obj);
}
}
}
return ele;
};
var addIframe = function (doc)
{
var iframes = $(doc).find("iframe");
for (var i = 0; i < iframes.size(); i++)
{
iframesArray.push(iframes.eq(i).get(0));
addIframe(iframes.eq(i).get(0).contentWindow.document);
}
};
this.reloadOpener = function (url, id)
{
if (!id || id.trim().length == 0)
{
id = RoadUI.Core.query("openerid");
}
id += "_iframe";
$("iframe", top.document).each(function ()
{
if (id == $(this).attr("id"))
{
var win = $(this).get(0).contentWindow;
win.location = !url || $.trim(url).length == 0 ? win.location : url;
}
});
for (var i = 0; i < top.frames.length; i++)
{
$("iframe", top.frames[i].document).each(function ()
{
if (id == $(this).attr("id"))
{
var win = $(this).get(0).contentWindow;
win.location = !url || $.trim(url).length == 0 ? win.location : url;
}
});
}
};
this.resize = function (width, height)
{
if (!width || !height)
{
return;
}
var $maindiv = $("#" + this.opts.id, $(this.opts.opener.document));
if ($maindiv == null || $maindiv.size() == 0)
{
return;
}
$maindiv.css({ "height": height + "px", "width": width + "px" });
var $bodydiv = $(".window_body", $maindiv);
if ($bodydiv == null || $bodydiv.size() == 0)
{
return;
}
var bodydivHeight = height - (this.opts.resize ? 39 : 26);
$bodydiv.css({ "height": bodydivHeight + "px" });
var $iframe = $bodydiv.children().first();
if ($iframe && $iframe.size() > 0 && $iframe.get(0).nodeName.toLowerCase() == "iframe")
{
$iframe.css({ "height": bodydivHeight + "px" });
}
}
var doBothDrag = function (x, y, maindiv)
{
if (x < 110)
{
x = 110;
}
maindiv.style.width = (x - 8) + 'px';
if (y < 35)
{
y = 35;
}
maindiv.style.height = (y - 8) + 'px';
instance.resize(x - 8, y - 8);
};
var draging = function (oElement, fnGetPos, fnOnDrag, win)
{
win = win || window;
var obj = this;
this.oElement = oElement;
this.fnGetPos = fnGetPos;
this.fnOnDrag = fnOnDrag;
this.__oStartOffset__ = { x: 0, y: 0 };
this.fnOnMouseUp = function (ev)
{
obj.stopDrag(win.event || ev);
};
this.fnOnMouseMove = function (ev)
{
obj.doDrag(win.event || ev);
};
this.oElement.onmousedown = function (ev)
{
obj.startDrag(win.event || ev);
};
}
draging.prototype.startDrag = function (oEvent)
{
var oPos = this.fnGetPos();
var x = oEvent.clientX;
var y = oEvent.clientY;
this.__oStartOffset__.x = x - oPos.x;
this.__oStartOffset__.y = y - oPos.y;
if (this.oElement.setCapture)
{
this.oElement.setCapture();
this.oElement.onmouseup = this.fnOnMouseUp;
this.oElement.onmousemove = this.fnOnMouseMove;
}
else
{
document.addEventListener("mouseup", this.fnOnMouseUp, true);
document.addEventListener("mousemove", this.fnOnMouseMove, true);
window.captureEvents(Event.MOUSEMOVE | Event.MOUSEUP);
}
};
draging.prototype.stopDrag = function (oEvent)
{
if (this.oElement.releaseCapture)
{
this.oElement.releaseCapture();
this.oElement.onmouseup = null;
this.oElement.onmousemove = null;
}
else
{
document.removeEventListener("mouseup", this.fnOnMouseUp, true);
document.removeEventListener("mousemove", this.fnOnMouseMove, true);
window.releaseEvents(Event.MOUSE_MOVE | Event.MOUSE_UP);
}
};
draging.prototype.doDrag = function (oEvent)
{
var x = oEvent.clientX;
var y = oEvent.clientY;
this.fnOnDrag(x - this.__oStartOffset__.x, y - this.__oStartOffset__.y);
};
}