123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204 |
- /*
- * Copyright DHTMLX LTD. http://www.dhtmlx.com You allowed to use this component
- * or parts of it under GPL terms To use it on other terms or get Professional
- * edition of the component please contact us at sales@dhtmlx.com
- */
- function dhtmlXContextMenuObject(width, height, gfxPath, httpsdummy) {
- this.menu = new dhtmlXMenuBarObject(document.body, width, height, "", 1,
- gfxPath, httpsdummy);
- this.menu.setMenuMode("popup");
- this.menu.hideBar();
- this.menu.contextMenu = this;
- this.menu.enableWindowOpenMode(false);
- this.menu.setOnClickHandler(this._innerOnClick);
- this.aframes = new Array();
- this.registerFrame(window);
- return this
- };
- dhtmlXContextMenuObject.prototype.registerFrame = function(awin) {
- this.aframes[this.aframes.length] = awin
- };
- dhtmlXContextMenuObject.prototype.setContextMenuHandler = function(func) {
- if (typeof(func) == "function")
- this.onClickHandler = func;
- else
- this.onClickHandler = eval(func)
- };
- dhtmlXContextMenuObject.prototype.openAt = function(x, y, id, smartPosition) {
- this.espc = convertStringToBoolean(smartPosition);
- var f = new Object;
- f.button = 2;
- f.clientX = x;
- f.clientY = y;
- var start = new Object;
- start.contextMenuId = id;
- start.contextMenu = this;
- start.a = this._contextStart;
- start.a(document.body, f);
- this.espc = null
- };
- dhtmlXContextMenuObject.prototype.disableMenu = function(mode) {
- this._dsbd = convertStringToBoolean(mode)
- };
- dhtmlXContextMenuObject.prototype.setOnShowMenuHandler = function(func) {
- if (typeof(func) == "function")
- this.onShowHandler = func;
- else
- this.onShowHandler = eval(func)
- };
- dhtmlXContextMenuObject.prototype.setContextMenuPosition = function(left, top) {
- this._msTop = parseInt(top);
- this._msLeft = parseInt(left)
- };
- dhtmlXContextMenuObject.prototype._innerOnClick = function(id) {
- var that = document.body.contextMenu;
- if (that.contextZone.ownerDocument) {
- if (that.contextZone.ownerDocument.body.onclick)
- that.contextZone.ownerDocument.body.onclick()
- } else if (document.body.onclick)
- document.body.onclick();
- if (that.onClickHandler)
- return that.onClickHandler(id, that.zoneId, that.contextZone);
- return true
- };
- dhtmlXContextMenuObject.prototype.setContextZone = function(htmlObject, zoneId) {
- if (typeof(htmlObject) != "object")
- htmlObject = document.getElementById(htmlObject);
- if (!htmlObject.contextMenu)
- htmlObject.contextOnclick = htmlObject.onmouseup;
- htmlObject.selfobj = this;
- htmlObject[_isMacOS ? "oncontextmenu" : "onmouseup"] = function(e) {
- this.selfobj._contextStart(this, e)
- };
- htmlObject.contextMenu = this;
- htmlObject.contextMenuId = zoneId
- };
- dhtmlXContextMenuObject.prototype._contextStart = function(obj, e) {
- if ((_isIE) && (window.event))
- event.srcElement.oncontextmenu = function() {
- event.cancelBubble = true;
- return false
- };
- if (e && e.preventDefault)
- e.preventDefault();
- if (!this.contextMenu)
- this.contextMenu = this;
- var win = obj.ownerDocument ? obj.ownerDocument.parentWindow : window;
- if (!win) {
- win = obj.ownerDocument.defaultView
- };
- var a = this.contextMenu.menu.topNod;
- a.style.position = "absolute";
- if (!e) {
- e = win.event
- };
- if (document.body.onclick)
- document.body.onclick();
- if ((!_isMacOS) && ((!e) || (e.button != 2))) {
- if (obj.contextOnclick)
- obj.contextOnclick();
- return true
- } else {
- if (this.contextMenu._dsbd)
- return true;
- if (this.contextMenu.onShowHandler) {
- var z = this.contextMenu.onShowHandler(obj.contextMenuId);
- if ((typeof(z) == "boolean") && (!z))
- return
- };
- this.contextMenu.menu.showBar()
- };
- var winScreenTop = window.screenTop;
- if ((!winScreenTop) && (winScreenTop != 0)) {
- winScreenTop = window.screenY + window.outerHeight - window.innerHeight
- };
- var winScreenLeft = window.screenLeft;
- if ((!winScreenLeft) && (winScreenLeft != 0)) {
- winScreenLeft = window.screenX + window.outerWidth - window.innerWidth
- - 4
- };
- var dEl0 = window.document.documentElement;
- var dEl1 = window.document.body;
- if (e.screenY - winScreenTop + a.offsetHeight
- - (dEl0.scrollTop || dEl1.scrollTop) > (dEl0.clientHeight || dEl1.clientHeight)) {
- var verCor = a.offsetHeight
- } else
- var verCor = ((this.contextMenu._msTop * (-1)) || 0);
- var corrector = new Array((dEl0.scrollLeft || dEl1.scrollLeft)
- + (this.contextMenu._msLeft || 0), verCor
- - (dEl0.scrollTop || dEl1.scrollTop));
- if ((!e.screenY) && (e.clientX)) {
- a.style.top = e.clientY + "px";
- a.style.left = e.clientX + "px"
- } else {
- a.style.top = e.screenY - winScreenTop - corrector[1] + "px";
- a.style.left = e.screenX - winScreenLeft + corrector[0] + "px"
- };
- if (!_isIE) {
- a.style.top = e.clientY - corrector[1] + "px";
- a.style.left = e.clientX + corrector[0] + "px"
- };
- this.contextMenu.correctMenuPosition(a);
- if (a.ieFix) {
- a.ieFix.style.top = a.style.top;
- a.ieFix.style.left = a.style.left
- };
- win.document.body.oncontextmenu = new Function("document.body.oncontextmenu=new Function('if (document.body.onclick)document.body.onclick();return false;');return false;");
- for (var i = 0; i < this.contextMenu.aframes.length; i++) {
- if (this.contextMenu.aframes[i].document)
- this.contextMenu.aframes[i].document.body.selfobj = this;
- this.contextMenu.aframes[i].document.body.onclick = function(e) {
- this.selfobj.contextMenu._contextEnd(e)
- }
- };
- document.body.contextMenu = this.contextMenu;
- this.contextMenu.contextZone = obj;
- this.contextMenu.zoneId = obj.contextMenuId;
- return false
- };
- dhtmlXContextMenuObject.prototype.correctMenuPosition = function(panel, mode) {
- var xs = document.body.offsetWidth + document.body.scrollLeft;
- var ys = document.body.offsetHeight - 15 + document.body.scrollTop;
- if ((panel.offsetWidth + parseInt(panel.style.left)) > xs) {
- var z = parseInt(panel.style.left) - panel.offsetWidth;
- if ((z < 0) || (this.espc))
- z = xs - panel.offsetWidth;
- if (z < 0)
- z = 0;
- panel.style.left = z + "px";
- if (panel.ieFix)
- panel.ieFix.style.left = z + "px"
- };
- if ((panel.offsetHeight + parseInt(panel.style.top)) > ys) {
- var z = parseInt(panel.style.top) - panel.offsetHeight;
- if ((z < 0) || (this.espc))
- z = ys - panel.offsetHeight;
- if (z < 0)
- z = 0;
- panel.style.top = z + "px";
- if (panel.ieFix)
- panel.ieFix.style.top = z + "px"
- };
- if (!mode)
- this.correctMenuPosition(panel, 1)
- };
- dhtmlXMenuBarObject.prototype.correctMenuPosition = dhtmlXContextMenuObject.prototype.correctMenuPosition;
- dhtmlXContextMenuObject.prototype._contextEnd = function(e) {
- var menu = this.menu;
- menu._closePanel(menu);
- menu.lastOpenedPanel = "";
- menu.lastSelectedItem = 0;
- menu.hideBar();
- for (var i = 0; i < this.aframes.length; i++)
- if (this.aframes[i].document) {
- this.aframes[i].document.body.onclick = null;
- this.aframes[i].document.body.oncontextmenu = null
- };
- return false
- };
- /*
- * Copyright DHTMLX LTD. http://www.dhtmlx.com You allowed to use this component
- * or parts of it under GPL terms To use it on other terms or get Professional
- * edition of the component please contact us at sales@dhtmlx.com
- */
|