| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377 | 
							- /**
 
-  * jquery.tinymce.js
 
-  *
 
-  * Released under LGPL License.
 
-  * Copyright (c) 1999-2015 Ephox Corp. All rights reserved
 
-  *
 
-  * License: http://www.tinymce.com/license
 
-  * Contributing: http://www.tinymce.com/contributing
 
-  */
 
- /*global tinymce:true, jQuery */
 
- (function($) {
 
- 	var undef,
 
- 		lazyLoading,
 
- 		patchApplied,
 
- 		delayedInits = [],
 
- 		win = window;
 
- 	$.fn.tinymce = function(settings) {
 
- 		var self = this, url, base, lang, suffix = "";
 
- 		// No match then just ignore the call
 
- 		if (!self.length) {
 
- 			return self;
 
- 		}
 
- 		// Get editor instance
 
- 		if (!settings) {
 
- 			return window.tinymce ? tinymce.get(self[0].id) : null;
 
- 		}
 
- 		self.css('visibility', 'hidden'); // Hide textarea to avoid flicker
 
- 		function init() {
 
- 			var editors = [], initCount = 0;
 
- 			// Apply patches to the jQuery object, only once
 
- 			if (!patchApplied) {
 
- 				applyPatch();
 
- 				patchApplied = true;
 
- 			}
 
- 			// Create an editor instance for each matched node
 
- 			self.each(function(i, node) {
 
- 				var ed, id = node.id, oninit = settings.oninit;
 
- 				// Generate unique id for target element if needed
 
- 				if (!id) {
 
- 					node.id = id = tinymce.DOM.uniqueId();
 
- 				}
 
- 				// Only init the editor once
 
- 				if (tinymce.get(id)) {
 
- 					return;
 
- 				}
 
- 				// Create editor instance and render it
 
- 				ed = new tinymce.Editor(id, settings, tinymce.EditorManager);
 
- 				editors.push(ed);
 
- 				ed.on('init', function() {
 
- 					var scope, func = oninit;
 
- 					self.css('visibility', '');
 
- 					// Run this if the oninit setting is defined
 
- 					// this logic will fire the oninit callback ones each
 
- 					// matched editor instance is initialized
 
- 					if (oninit) {
 
- 						// Fire the oninit event ones each editor instance is initialized
 
- 						if (++initCount == editors.length) {
 
- 							if (typeof func === "string") {
 
- 								scope = (func.indexOf(".") === -1) ? null : tinymce.resolve(func.replace(/\.\w+$/, ""));
 
- 								func = tinymce.resolve(func);
 
- 							}
 
- 							// Call the oninit function with the object
 
- 							func.apply(scope || tinymce, editors);
 
- 						}
 
- 					}
 
- 				});
 
- 			});
 
- 			// Render the editor instances in a separate loop since we
 
- 			// need to have the full editors array used in the onInit calls
 
- 			$.each(editors, function(i, ed) {
 
- 				ed.render();
 
- 			});
 
- 		}
 
- 		// Load TinyMCE on demand, if we need to
 
- 		if (!win.tinymce && !lazyLoading && (url = settings.script_url)) {
 
- 			lazyLoading = 1;
 
- 			base = url.substring(0, url.lastIndexOf("/"));
 
- 			// Check if it's a dev/src version they want to load then
 
- 			// make sure that all plugins, themes etc are loaded in source mode as well
 
- 			if (url.indexOf('.min') != -1) {
 
- 				suffix = ".min";
 
- 			}
 
- 			// Setup tinyMCEPreInit object this will later be used by the TinyMCE
 
- 			// core script to locate other resources like CSS files, dialogs etc
 
- 			// You can also predefined a tinyMCEPreInit object and then it will use that instead
 
- 			win.tinymce = win.tinyMCEPreInit || {
 
- 				base: base,
 
- 				suffix: suffix
 
- 			};
 
- 			// url contains gzip then we assume it's a compressor
 
- 			if (url.indexOf('gzip') != -1) {
 
- 				lang = settings.language || "en";
 
- 				url = url + (/\?/.test(url) ? '&' : '?') + "js=true&core=true&suffix=" + escape(suffix) +
 
- 					"&themes=" + escape(settings.theme || 'modern') + "&plugins=" +
 
- 					escape(settings.plugins || '') + "&languages=" + (lang || '');
 
- 				// Check if compressor script is already loaded otherwise setup a basic one
 
- 				if (!win.tinyMCE_GZ) {
 
- 					win.tinyMCE_GZ = {
 
- 						start: function() {
 
- 							function load(url) {
 
- 								tinymce.ScriptLoader.markDone(tinymce.baseURI.toAbsolute(url));
 
- 							}
 
- 							// Add core languages
 
- 							load("langs/" + lang + ".js");
 
- 							// Add themes with languages
 
- 							load("themes/" + settings.theme + "/theme" + suffix + ".js");
 
- 							load("themes/" + settings.theme + "/langs/" + lang + ".js");
 
- 							// Add plugins with languages
 
- 							$.each(settings.plugins.split(","), function(i, name) {
 
- 								if (name) {
 
- 									load("plugins/" + name + "/plugin" + suffix + ".js");
 
- 									load("plugins/" + name + "/langs/" + lang + ".js");
 
- 								}
 
- 							});
 
- 						},
 
- 						end: function() {
 
- 						}
 
- 					};
 
- 				}
 
- 			}
 
- 			var script = document.createElement('script');
 
- 			script.type = 'text/javascript';
 
- 			script.onload = script.onreadystatechange = function(e) {
 
- 				e = e || window.event;
 
- 				if (lazyLoading !== 2 && (e.type == 'load' || /complete|loaded/.test(script.readyState))) {
 
- 					tinymce.dom.Event.domLoaded = 1;
 
- 					lazyLoading = 2;
 
- 					// Execute callback after mainscript has been loaded and before the initialization occurs
 
- 					if (settings.script_loaded) {
 
- 						settings.script_loaded();
 
- 					}
 
- 					init();
 
- 					$.each(delayedInits, function(i, init) {
 
- 						init();
 
- 					});
 
- 				}
 
- 			};
 
- 			script.src = url;
 
- 			document.body.appendChild(script);
 
- 		} else {
 
- 			// Delay the init call until tinymce is loaded
 
- 			if (lazyLoading === 1) {
 
- 				delayedInits.push(init);
 
- 			} else {
 
- 				init();
 
- 			}
 
- 		}
 
- 		return self;
 
- 	};
 
- 	// Add :tinymce pseudo selector this will select elements that has been converted into editor instances
 
- 	// it's now possible to use things like $('*:tinymce') to get all TinyMCE bound elements.
 
- 	$.extend($.expr[":"], {
 
- 		tinymce: function(e) {
 
- 			var editor;
 
- 			if (e.id && "tinymce" in window) {
 
- 				editor = tinymce.get(e.id);
 
- 				if (editor && editor.editorManager === tinymce) {
 
- 					return true;
 
- 				}
 
- 			}
 
- 			return false;
 
- 		}
 
- 	});
 
- 	// This function patches internal jQuery functions so that if
 
- 	// you for example remove an div element containing an editor it's
 
- 	// automatically destroyed by the TinyMCE API
 
- 	function applyPatch() {
 
- 		// Removes any child editor instances by looking for editor wrapper elements
 
- 		function removeEditors(name) {
 
- 			// If the function is remove
 
- 			if (name === "remove") {
 
- 				this.each(function(i, node) {
 
- 					var ed = tinyMCEInstance(node);
 
- 					if (ed) {
 
- 						ed.remove();
 
- 					}
 
- 				});
 
- 			}
 
- 			this.find("span.mceEditor,div.mceEditor").each(function(i, node) {
 
- 				var ed = tinymce.get(node.id.replace(/_parent$/, ""));
 
- 				if (ed) {
 
- 					ed.remove();
 
- 				}
 
- 			});
 
- 		}
 
- 		// Loads or saves contents from/to textarea if the value
 
- 		// argument is defined it will set the TinyMCE internal contents
 
- 		function loadOrSave(value) {
 
- 			var self = this, ed;
 
- 			// Handle set value
 
- 			/*jshint eqnull:true */
 
- 			if (value != null) {
 
- 				removeEditors.call(self);
 
- 				// Saves the contents before get/set value of textarea/div
 
- 				self.each(function(i, node) {
 
- 					var ed;
 
- 					if ((ed = tinymce.get(node.id))) {
 
- 						ed.setContent(value);
 
- 					}
 
- 				});
 
- 			} else if (self.length > 0) {
 
- 				// Handle get value
 
- 				if ((ed = tinymce.get(self[0].id))) {
 
- 					return ed.getContent();
 
- 				}
 
- 			}
 
- 		}
 
- 		// Returns tinymce instance for the specified element or null if it wasn't found
 
- 		function tinyMCEInstance(element) {
 
- 			var ed = null;
 
- 			if (element && element.id && win.tinymce) {
 
- 				ed = tinymce.get(element.id);
 
- 			}
 
- 			return ed;
 
- 		}
 
- 		// Checks if the specified set contains tinymce instances
 
- 		function containsTinyMCE(matchedSet) {
 
- 			return !!((matchedSet) && (matchedSet.length) && (win.tinymce) && (matchedSet.is(":tinymce")));
 
- 		}
 
- 		// Patch various jQuery functions
 
- 		var jQueryFn = {};
 
- 		// Patch some setter/getter functions these will
 
- 		// now be able to set/get the contents of editor instances for
 
- 		// example $('#editorid').html('Content'); will update the TinyMCE iframe instance
 
- 		$.each(["text", "html", "val"], function(i, name) {
 
- 			var origFn = jQueryFn[name] = $.fn[name],
 
- 				textProc = (name === "text");
 
- 			$.fn[name] = function(value) {
 
- 				var self = this;
 
- 				if (!containsTinyMCE(self)) {
 
- 					return origFn.apply(self, arguments);
 
- 				}
 
- 				if (value !== undef) {
 
- 					loadOrSave.call(self.filter(":tinymce"), value);
 
- 					origFn.apply(self.not(":tinymce"), arguments);
 
- 					return self; // return original set for chaining
 
- 				}
 
- 				var ret = "";
 
- 				var args = arguments;
 
- 				(textProc ? self : self.eq(0)).each(function(i, node) {
 
- 					var ed = tinyMCEInstance(node);
 
- 					if (ed) {
 
- 						ret += textProc ? ed.getContent().replace(/<(?:"[^"]*"|'[^']*'|[^'">])*>/g, "") : ed.getContent({save: true});
 
- 					} else {
 
- 						ret += origFn.apply($(node), args);
 
- 					}
 
- 				});
 
- 				return ret;
 
- 			};
 
- 		});
 
- 		// Makes it possible to use $('#id').append("content"); to append contents to the TinyMCE editor iframe
 
- 		$.each(["append", "prepend"], function(i, name) {
 
- 			var origFn = jQueryFn[name] = $.fn[name],
 
- 				prepend = (name === "prepend");
 
- 			$.fn[name] = function(value) {
 
- 				var self = this;
 
- 				if (!containsTinyMCE(self)) {
 
- 					return origFn.apply(self, arguments);
 
- 				}
 
- 				if (value !== undef) {
 
- 					if (typeof value === "string") {
 
- 						self.filter(":tinymce").each(function(i, node) {
 
- 							var ed = tinyMCEInstance(node);
 
- 							if (ed) {
 
- 								ed.setContent(prepend ? value + ed.getContent() : ed.getContent() + value);
 
- 							}
 
- 						});
 
- 					}
 
- 					origFn.apply(self.not(":tinymce"), arguments);
 
- 					return self; // return original set for chaining
 
- 				}
 
- 			};
 
- 		});
 
- 		// Makes sure that the editor instance gets properly destroyed when the parent element is removed
 
- 		$.each(["remove", "replaceWith", "replaceAll", "empty"], function(i, name) {
 
- 			var origFn = jQueryFn[name] = $.fn[name];
 
- 			$.fn[name] = function() {
 
- 				removeEditors.call(this, name);
 
- 				return origFn.apply(this, arguments);
 
- 			};
 
- 		});
 
- 		jQueryFn.attr = $.fn.attr;
 
- 		// Makes sure that $('#tinymce_id').attr('value') gets the editors current HTML contents
 
- 		$.fn.attr = function(name, value) {
 
- 			var self = this, args = arguments;
 
- 			if ((!name) || (name !== "value") || (!containsTinyMCE(self))) {
 
- 				if (value !== undef) {
 
- 					return jQueryFn.attr.apply(self, args);
 
- 				}
 
- 				return jQueryFn.attr.apply(self, args);
 
- 			}
 
- 			if (value !== undef) {
 
- 				loadOrSave.call(self.filter(":tinymce"), value);
 
- 				jQueryFn.attr.apply(self.not(":tinymce"), args);
 
- 				return self; // return original set for chaining
 
- 			}
 
- 			var node = self[0], ed = tinyMCEInstance(node);
 
- 			return ed ? ed.getContent({save: true}) : jQueryFn.attr.apply($(node), args);
 
- 		};
 
- 	}
 
- })(jQuery);
 
 
  |