| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231 | /** * WindowManager.js * * Copyright 2009, Moxiecode Systems AB * Released under LGPL License. * * License: http://tinymce.moxiecode.com/license * Contributing: http://tinymce.moxiecode.com/contributing */(function(tinymce) {	var Dispatcher = tinymce.util.Dispatcher, each = tinymce.each, isIE = tinymce.isIE, isOpera = tinymce.isOpera;	/**	 * This class handles the creation of native windows and dialogs. This class can be extended to provide for example inline dialogs.	 *	 * @class tinymce.WindowManager	 * @example	 * // Opens a new dialog with the file.htm file and the size 320x240	 * // It also adds a custom parameter this can be retrieved by using tinyMCEPopup.getWindowArg inside the dialog.	 * tinyMCE.activeEditor.windowManager.open({	 *    url : 'file.htm',	 *    width : 320,	 *    height : 240	 * }, {	 *    custom_param : 1	 * });	 * 	 * // Displays an alert box using the active editors window manager instance	 * tinyMCE.activeEditor.windowManager.alert('Hello world!');	 * 	 * // Displays an confirm box and an alert message will be displayed depending on what you choose in the confirm	 * tinyMCE.activeEditor.windowManager.confirm("Do you want to do something", function(s) {	 *    if (s)	 *       tinyMCE.activeEditor.windowManager.alert("Ok");	 *    else	 *       tinyMCE.activeEditor.windowManager.alert("Cancel");	 * });	 */	tinymce.create('tinymce.WindowManager', {		/**		 * Constructs a new window manager instance.		 *		 * @constructor		 * @method WindowManager		 * @param {tinymce.Editor} ed Editor instance that the windows are bound to.		 */		WindowManager : function(ed) {			var t = this;			t.editor = ed;			t.onOpen = new Dispatcher(t);			t.onClose = new Dispatcher(t);			t.params = {};			t.features = {};		},		/**		 * Opens a new window.		 *		 * @method open		 * @param {Object} s Optional name/value settings collection contains things like width/height/url etc.		 * @option {String} title Window title. 		 * @option {String} file URL of the file to open in the window. 		 * @option {Number} width Width in pixels. 		 * @option {Number} height Height in pixels. 		 * @option {Boolean} resizable Specifies whether the popup window is resizable or not. 		 * @option {Boolean} maximizable Specifies whether the popup window has a "maximize" button and can get maximized or not. 		 * @option {Boolean} inline Specifies whether to display in-line (set to 1 or true for in-line display; requires inlinepopups plugin). 		 * @option {String/Boolean} popup_css Optional CSS to use in the popup. Set to false to remove the default one. 		 * @option {Boolean} translate_i18n Specifies whether translation should occur or not of i18 key strings. Default is true. 		 * @option {String/bool} close_previous Specifies whether a previously opened popup window is to be closed or not (like when calling the file browser window over the advlink popup). 		 * @option {String/bool} scrollbars Specifies whether the popup window can have scrollbars if required (i.e. content larger than the popup size specified). 		 * @param {Object} p Optional parameters/arguments collection can be used by the dialogs to retrive custom parameters.		 * @option {String} plugin_url url to plugin if opening plugin window that calls tinyMCEPopup.requireLangPack() and needs access to the plugin language js files 		 */		open : function(s, p) {			var t = this, f = '', x, y, mo = t.editor.settings.dialog_type == 'modal', w, sw, sh, vp = tinymce.DOM.getViewPort(), u;			// Default some options			s = s || {};			p = p || {};			sw = isOpera ? vp.w : screen.width; // Opera uses windows inside the Opera window			sh = isOpera ? vp.h : screen.height;			s.name = s.name || 'mc_' + new Date().getTime();			s.width = parseInt(s.width || 320);			s.height = parseInt(s.height || 240);			s.resizable = true;			s.left = s.left || parseInt(sw / 2.0) - (s.width / 2.0);			s.top = s.top || parseInt(sh / 2.0) - (s.height / 2.0);			p.inline = false;			p.mce_width = s.width;			p.mce_height = s.height;			p.mce_auto_focus = s.auto_focus;			if (mo) {				if (isIE) {					s.center = true;					s.help = false;					s.dialogWidth = s.width + 'px';					s.dialogHeight = s.height + 'px';					s.scroll = s.scrollbars || false;				}			}			// Build features string			each(s, function(v, k) {				if (tinymce.is(v, 'boolean'))					v = v ? 'yes' : 'no';				if (!/^(name|url)$/.test(k)) {					if (isIE && mo)						f += (f ? ';' : '') + k + ':' + v;					else						f += (f ? ',' : '') + k + '=' + v;				}			});			t.features = s;			t.params = p;			t.onOpen.dispatch(t, s, p);			u = s.url || s.file;			u = tinymce._addVer(u);			try {				if (isIE && mo) {					w = 1;					window.showModalDialog(u, window, f);				} else					w = window.open(u, s.name, f);			} catch (ex) {				// Ignore			}			if (!w)				alert(t.editor.getLang('popup_blocked'));		},		/**		 * Closes the specified window. This will also dispatch out a onClose event.		 *		 * @method close		 * @param {Window} w Native window object to close.		 */		close : function(w) {			w.close();			this.onClose.dispatch(this);		},		/**		 * Creates a instance of a class. This method was needed since IE can't create instances		 * of classes from a parent window due to some reference problem. Any arguments passed after the class name		 * will be passed as arguments to the constructor.		 *		 * @method createInstance		 * @param {String} cl Class name to create an instance of.		 * @return {Object} Instance of the specified class.		 * @example		 * var uri = tinyMCEPopup.editor.windowManager.createInstance('tinymce.util.URI', 'http://www.somesite.com');		 * alert(uri.getURI());		 */		createInstance : function(cl, a, b, c, d, e) {			var f = tinymce.resolve(cl);			return new f(a, b, c, d, e);		},		/**		 * Creates a confirm dialog. Please don't use the blocking behavior of this		 * native version use the callback method instead then it can be extended.		 *		 * @method confirm		 * @param {String} t Title for the new confirm dialog.		 * @param {function} cb Callback function to be executed after the user has selected ok or cancel.		 * @param {Object} s Optional scope to execute the callback in.		 * @example		 * // Displays an confirm box and an alert message will be displayed depending on what you choose in the confirm		 * tinyMCE.activeEditor.windowManager.confirm("Do you want to do something", function(s) {		 *    if (s)		 *       tinyMCE.activeEditor.windowManager.alert("Ok");		 *    else		 *       tinyMCE.activeEditor.windowManager.alert("Cancel");		 * });		 */		confirm : function(t, cb, s, w) {			w = w || window;			cb.call(s || this, w.confirm(this._decode(this.editor.getLang(t, t))));		},		/**		 * Creates a alert dialog. Please don't use the blocking behavior of this		 * native version use the callback method instead then it can be extended.		 *		 * @method alert		 * @param {String} t Title for the new alert dialog.		 * @param {function} cb Callback function to be executed after the user has selected ok.		 * @param {Object} s Optional scope to execute the callback in.		 * @example		 * // Displays an alert box using the active editors window manager instance		 * tinyMCE.activeEditor.windowManager.alert('Hello world!');		 */		alert : function(tx, cb, s, w) {			var t = this;			w = w || window;			w.alert(t._decode(t.editor.getLang(tx, tx)));			if (cb)				cb.call(s || t);		},		/**		 * Resizes the specified window or id.		 *		 * @param {Number} dw Delta width.		 * @param {Number} dh Delta height.		 * @param {window/id} win Window if the dialog isn't inline. Id if the dialog is inline.		 */		resizeBy : function(dw, dh, win) {			win.resizeBy(dw, dh);		},		// Internal functions		_decode : function(s) {			return tinymce.DOM.decode(s).replace(/\\n/g, '\n');		}	});}(tinymce));
 |