Annotation of loncom/html/htmlarea/popupdiv.js, revision 1.1

1.1     ! www         1: /** This file is derived from PopupDiv, developed by Mihai Bazon for
        !             2:  * SamWare.net.  Modifications were needed to make it usable in HTMLArea.
        !             3:  * HTMLArea is a free WYSIWYG online HTML editor from InteractiveTools.com.
        !             4:  *
        !             5:  * This file does not function standalone.  It is dependent of global functions
        !             6:  * defined in HTMLArea-3.0 (htmlarea.js).
        !             7:  *
        !             8:  * Please see file htmlarea.js for further details.
        !             9:  **/
        !            10: 
        !            11: var is_ie = ( (navigator.userAgent.toLowerCase().indexOf("msie") != -1) &&
        !            12: 	      (navigator.userAgent.toLowerCase().indexOf("opera") == -1) );
        !            13: var is_compat = (document.compatMode == "BackCompat");
        !            14: 
        !            15: function PopupDiv(editor, titleText, handler, initFunction) {
        !            16: 	var self = this;
        !            17: 
        !            18: 	this.editor = editor;
        !            19: 	this.doc = editor._mdoc;
        !            20: 	this.handler = handler;
        !            21: 
        !            22: 	var el = this.doc.createElement("div");
        !            23: 	el.className = "content";
        !            24: 
        !            25: 	var popup = this.doc.createElement("div");
        !            26: 	popup.className = "dialog popupdiv";
        !            27: 	this.element = popup;
        !            28: 	var s = popup.style;
        !            29: 	s.position = "absolute";
        !            30: 	s.left = "0px";
        !            31: 	s.top = "0px";
        !            32: 
        !            33: 	var title = this.doc.createElement("div");
        !            34: 	title.className = "title";
        !            35: 	this.title = title;
        !            36: 	popup.appendChild(title);
        !            37: 
        !            38: 	HTMLArea._addEvent(title, "mousedown", function(ev) {
        !            39: 		self._dragStart(is_ie ? window.event : ev);
        !            40: 	});
        !            41: 
        !            42: 	var button = this.doc.createElement("div");
        !            43: 	button.className = "button";
        !            44: 	title.appendChild(button);
        !            45: 	button.innerHTML = "×";
        !            46: 	title.appendChild(this.doc.createTextNode(titleText));
        !            47: 	this.titleText = titleText;
        !            48: 
        !            49: 	button.onmouseover = function() {
        !            50: 		this.className += " button-hilite";
        !            51: 	};
        !            52: 	button.onmouseout = function() {
        !            53: 		this.className = this.className.replace(/\s*button-hilite\s*/g, " ");
        !            54: 	};
        !            55: 	button.onclick = function() {
        !            56: 		this.className = this.className.replace(/\s*button-hilite\s*/g, " ");
        !            57: 		self.close();
        !            58: 	};
        !            59: 
        !            60: 	popup.appendChild(el);
        !            61: 	this.content = el;
        !            62: 
        !            63: 	this.doc.body.appendChild(popup);
        !            64: 
        !            65: 	this.dragging = false;
        !            66: 	this.onShow = null;
        !            67: 	this.onClose = null;
        !            68: 	this.modal = false;
        !            69: 
        !            70: 	initFunction(this);
        !            71: };
        !            72: 
        !            73: PopupDiv.currentPopup = null;
        !            74: 
        !            75: PopupDiv.prototype.showAtElement = function(el, mode) {
        !            76: 	this.defaultSize();
        !            77: 	var pos, ew, eh;
        !            78: 	var popup = this.element;
        !            79: 	popup.style.display = "block";
        !            80: 	var w = popup.offsetWidth;
        !            81: 	var h = popup.offsetHeight;
        !            82: 	popup.style.display = "none";
        !            83: 	if (el != window) {
        !            84: 		pos = PopupDiv.getAbsolutePos(el);
        !            85: 		ew = el.offsetWidth;
        !            86: 		eh = el.offsetHeight;
        !            87: 	} else {
        !            88: 		pos = {x:0, y:0};
        !            89: 		var size = PopupDiv.getWindowSize();
        !            90: 		ew = size.x;
        !            91: 		eh = size.y;
        !            92: 	}
        !            93: 	var FX = false, FY = false;
        !            94: 	if (mode.indexOf("l") != -1) {
        !            95: 		pos.x -= w;
        !            96: 		FX = true;
        !            97: 	}
        !            98: 	if (mode.indexOf("r") != -1) {
        !            99: 		pos.x += ew;
        !           100: 		FX = true;
        !           101: 	}
        !           102: 	if (mode.indexOf("t") != -1) {
        !           103: 		pos.y -= h;
        !           104: 		FY = true;
        !           105: 	}
        !           106: 	if (mode.indexOf("b") != -1) {
        !           107: 		pos.y += eh;
        !           108: 		FY = true;
        !           109: 	}
        !           110: 	if (mode.indexOf("c") != -1) {
        !           111: 		FX || (pos.x += Math.round((ew - w) / 2));
        !           112: 		FY || (pos.y += Math.round((eh - h) / 2));
        !           113: 	}
        !           114: 	this.showAt(pos.x, pos.y);
        !           115: };
        !           116: 
        !           117: PopupDiv.prototype.defaultSize = function() {
        !           118: 	var s = this.element.style;
        !           119: 	var cs = this.element.currentStyle;
        !           120: 	var addX = (is_ie && is_compat) ? (parseInt(cs.borderLeftWidth) +
        !           121: 					   parseInt(cs.borderRightWidth) +
        !           122: 					   parseInt(cs.paddingLeft) +
        !           123: 					   parseInt(cs.paddingRight)) : 0;
        !           124: 	var addY = (is_ie && is_compat) ? (parseInt(cs.borderTopWidth) +
        !           125: 					   parseInt(cs.borderBottomWidth) +
        !           126: 					   parseInt(cs.paddingTop) +
        !           127: 					   parseInt(cs.paddingBottom)) : 0;
        !           128: 	s.display = "block";
        !           129: 	s.width = (this.content.offsetWidth + addX) + "px";
        !           130: 	s.height = (this.content.offsetHeight + this.title.offsetHeight) + "px";
        !           131: 	s.display = "none";
        !           132: };
        !           133: 
        !           134: PopupDiv.prototype.showAt = function(x, y) {
        !           135: 	this.defaultSize();
        !           136: 	var s = this.element.style;
        !           137: 	s.display = "block";
        !           138: 	s.left = x + "px";
        !           139: 	s.top = y + "px";
        !           140: 	this.hideShowCovered();
        !           141: 
        !           142: 	PopupDiv.currentPopup = this;
        !           143: 	HTMLArea._addEvents(this.doc.body, ["mousedown", "click"], PopupDiv.checkPopup);
        !           144: 	HTMLArea._addEvents(this.editor._doc.body, ["mousedown", "click"], PopupDiv.checkPopup);
        !           145: 	if (is_ie && this.modal) {
        !           146: 		this.doc.body.setCapture(false);
        !           147: 		this.doc.body.onlosecapture = function() {
        !           148: 			(PopupDiv.currentPopup) && (this.doc.body.setCapture(false));
        !           149: 		};
        !           150: 	}
        !           151: 	window.event && HTMLArea._stopEvent(window.event);
        !           152: 
        !           153: 	if (typeof this.onShow == "function") {
        !           154: 		this.onShow();
        !           155: 	} else if (typeof this.onShow == "string") {
        !           156: 		eval(this.onShow);
        !           157: 	}
        !           158: 
        !           159: 	var field = this.element.getElementsByTagName("input")[0];
        !           160: 	if (!field) {
        !           161: 		field = this.element.getElementsByTagName("select")[0];
        !           162: 	}
        !           163: 	if (!field) {
        !           164: 		field = this.element.getElementsByTagName("textarea")[0];
        !           165: 	}
        !           166: 	if (field) {
        !           167: 		field.focus();
        !           168: 	}
        !           169: };
        !           170: 
        !           171: PopupDiv.prototype.close = function() {
        !           172: 	this.element.style.display = "none";
        !           173: 	PopupDiv.currentPopup = null;
        !           174: 	this.hideShowCovered();
        !           175: 	HTMLArea._removeEvents(this.doc.body, ["mousedown", "click"], PopupDiv.checkPopup);
        !           176: 	HTMLArea._removeEvents(this.editor._doc.body, ["mousedown", "click"], PopupDiv.checkPopup);
        !           177: 	is_ie && this.modal && this.doc.body.releaseCapture();
        !           178: 	if (typeof this.onClose == "function") {
        !           179: 		this.onClose();
        !           180: 	} else if (typeof this.onClose == "string") {
        !           181: 		eval(this.onClose);
        !           182: 	}
        !           183: 	this.element.parentNode.removeChild(this.element);
        !           184: };
        !           185: 
        !           186: PopupDiv.prototype.getForm = function() {
        !           187: 	var forms = this.content.getElementsByTagName("form");
        !           188: 	return (forms.length > 0) ? forms[0] : null;
        !           189: };
        !           190: 
        !           191: PopupDiv.prototype.callHandler = function() {
        !           192: 	var tags = ["input", "textarea", "select"];
        !           193: 	var params = new Object();
        !           194: 	for (var ti in tags) {
        !           195: 		var tag = tags[ti];
        !           196: 		var els = this.content.getElementsByTagName(tag);
        !           197: 		for (var j = 0; j < els.length; ++j) {
        !           198: 			var el = els[j];
        !           199: 			params[el.name] = el.value;
        !           200: 		}
        !           201: 	}
        !           202: 	this.handler(this, params);
        !           203: 	return false;
        !           204: };
        !           205: 
        !           206: PopupDiv.getAbsolutePos = function(el) {
        !           207: 	var r = { x: el.offsetLeft, y: el.offsetTop };
        !           208: 	if (el.offsetParent) {
        !           209: 		var tmp = PopupDiv.getAbsolutePos(el.offsetParent);
        !           210: 		r.x += tmp.x;
        !           211: 		r.y += tmp.y;
        !           212: 	}
        !           213: 	return r;
        !           214: };
        !           215: 
        !           216: PopupDiv.getWindowSize = function() {
        !           217: 	if (window.innerHeight) {
        !           218: 		return { y: window.innerHeight, x: window.innerWidth };
        !           219: 	}
        !           220: 	if (this.doc.body.clientHeight) {
        !           221: 		return { y: this.doc.body.clientHeight, x: this.doc.body.clientWidth };
        !           222: 	}
        !           223: 	return { y: this.doc.documentElement.clientHeight, x: this.doc.documentElement.clientWidth };
        !           224: };
        !           225: 
        !           226: PopupDiv.prototype.hideShowCovered = function () {
        !           227: 	var self = this;
        !           228: 	function isContained(el) {
        !           229: 		while (el) {
        !           230: 			if (el == self.element) {
        !           231: 				return true;
        !           232: 			}
        !           233: 			el = el.parentNode;
        !           234: 		}
        !           235: 		return false;
        !           236: 	};
        !           237: 	var tags = new Array("applet", "select");
        !           238: 	var el = this.element;
        !           239: 
        !           240: 	var p = PopupDiv.getAbsolutePos(el);
        !           241: 	var EX1 = p.x;
        !           242: 	var EX2 = el.offsetWidth + EX1;
        !           243: 	var EY1 = p.y;
        !           244: 	var EY2 = el.offsetHeight + EY1;
        !           245: 
        !           246: 	if (el.style.display == "none") {
        !           247: 		EX1 = EX2 = EY1 = EY2 = 0;
        !           248: 	}
        !           249: 
        !           250: 	for (var k = tags.length; k > 0; ) {
        !           251: 		var ar = this.doc.getElementsByTagName(tags[--k]);
        !           252: 		var cc = null;
        !           253: 
        !           254: 		for (var i = ar.length; i > 0;) {
        !           255: 			cc = ar[--i];
        !           256: 			if (isContained(cc)) {
        !           257: 				cc.style.visibility = "visible";
        !           258: 				continue;
        !           259: 			}
        !           260: 
        !           261: 			p = PopupDiv.getAbsolutePos(cc);
        !           262: 			var CX1 = p.x;
        !           263: 			var CX2 = cc.offsetWidth + CX1;
        !           264: 			var CY1 = p.y;
        !           265: 			var CY2 = cc.offsetHeight + CY1;
        !           266: 
        !           267: 			if ((CX1 > EX2) || (CX2 < EX1) || (CY1 > EY2) || (CY2 < EY1)) {
        !           268: 				cc.style.visibility = "visible";
        !           269: 			} else {
        !           270: 				cc.style.visibility = "hidden";
        !           271: 			}
        !           272: 		}
        !           273: 	}
        !           274: };
        !           275: 
        !           276: PopupDiv.prototype._dragStart = function (ev) {
        !           277: 	if (this.dragging) {
        !           278: 		return false;
        !           279: 	}
        !           280: 	this.dragging = true;
        !           281: 	PopupDiv.currentPopup = this;
        !           282: 	var posX = ev.clientX;
        !           283: 	var posY = ev.clientY;
        !           284: 	if (is_ie) {
        !           285: 		posY += this.doc.body.scrollTop;
        !           286: 		posX += this.doc.body.scrollLeft;
        !           287: 	} else {
        !           288: 		posY += window.scrollY;
        !           289: 		posX += window.scrollX;
        !           290: 	}
        !           291: 	var st = this.element.style;
        !           292: 	this.xOffs = posX - parseInt(st.left);
        !           293: 	this.yOffs = posY - parseInt(st.top);
        !           294: 	HTMLArea._addEvent(this.doc, "mousemove", PopupDiv.dragIt);
        !           295: 	HTMLArea._addEvent(this.doc, "mouseover", HTMLArea._stopEvent);
        !           296: 	HTMLArea._addEvent(this.doc, "mouseup", PopupDiv.dragEnd);
        !           297: 	HTMLArea._stopEvent(ev);
        !           298: };
        !           299: 
        !           300: PopupDiv.dragIt = function (ev) {
        !           301: 	var popup = PopupDiv.currentPopup;
        !           302: 	if (!(popup && popup.dragging)) {
        !           303: 		return false;
        !           304: 	}
        !           305: 	is_ie && (ev = window.event);
        !           306: 	var posX = ev.clientX;
        !           307: 	var posY = ev.clientY;
        !           308: 	if (is_ie) {
        !           309: 		posY += this.doc.body.scrollTop;
        !           310: 		posX += this.doc.body.scrollLeft;
        !           311: 	} else {
        !           312: 		posY += window.scrollY;
        !           313: 		posX += window.scrollX;
        !           314: 	}
        !           315: 	popup.hideShowCovered();
        !           316: 	var st = popup.element.style;
        !           317: 	st.left = (posX - popup.xOffs) + "px";
        !           318: 	st.top = (posY - popup.yOffs) + "px";
        !           319: 	HTMLArea._stopEvent(ev);
        !           320: };
        !           321: 
        !           322: PopupDiv.dragEnd = function () {
        !           323: 	var popup = PopupDiv.currentPopup;
        !           324: 	if (!popup) {
        !           325: 		return false;
        !           326: 	}
        !           327: 	popup.dragging = false;
        !           328: 	HTMLArea._removeEvent(popup.doc, "mouseup", PopupDiv.dragEnd);
        !           329: 	HTMLArea._removeEvent(popup.doc, "mouseover", HTMLArea._stopEvent);
        !           330: 	HTMLArea._removeEvent(popup.doc, "mousemove", PopupDiv.dragIt);
        !           331: 	popup.hideShowCovered();
        !           332: };
        !           333: 
        !           334: PopupDiv.checkPopup = function (ev) {
        !           335: 	is_ie && (ev = window.event);
        !           336: 	var el = is_ie ? ev.srcElement : ev.target;
        !           337: 	var cp = PopupDiv.currentPopup;
        !           338: 	for (; (el != null) && (el != cp.element); el = el.parentNode);
        !           339: 	if (el == null) {
        !           340: 		cp.modal || ev.type == "mouseover" || cp.close();
        !           341: 		HTMLArea._stopEvent(ev);
        !           342: 	}
        !           343: };
        !           344: 
        !           345: PopupDiv.prototype.addButtons = function() {
        !           346: 	var self = this;
        !           347: 	var div = this.doc.createElement("div");
        !           348: 	this.content.appendChild(div);
        !           349: 	div.className = "buttons";
        !           350: 	for (var i = 0; i < arguments.length; ++i) {
        !           351: 		var btn = arguments[i];
        !           352: 		var button = this.doc.createElement("button");
        !           353: 		div.appendChild(button);
        !           354: 		button.innerHTML = HTMLArea.I18N.buttons[btn];
        !           355: 		switch (btn) {
        !           356: 		    case "ok":
        !           357: 			button.onclick = function() {
        !           358: 				self.callHandler();
        !           359: 				self.close();
        !           360: 			};
        !           361: 			break;
        !           362: 		    case "cancel":
        !           363: 			button.onclick = function() {
        !           364: 				self.close();
        !           365: 			};
        !           366: 			break;
        !           367: 		}
        !           368: 	}
        !           369: };

FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>