Merge branch '2.0'
[GitHub/WoltLab/WCF.git] / wcfsetup / install / files / js / 3rdParty / codemirror / addon / display / placeholder.js
1 (function(mod) {
2 if (typeof exports == "object" && typeof module == "object") // CommonJS
3 mod(require("../../lib/codemirror"));
4 else if (typeof define == "function" && define.amd) // AMD
5 define(["../../lib/codemirror"], mod);
6 else // Plain browser env
7 mod(CodeMirror);
8 })(function(CodeMirror) {
9 CodeMirror.defineOption("placeholder", "", function(cm, val, old) {
10 var prev = old && old != CodeMirror.Init;
11 if (val && !prev) {
12 cm.on("blur", onBlur);
13 cm.on("change", onChange);
14 onChange(cm);
15 } else if (!val && prev) {
16 cm.off("blur", onBlur);
17 cm.off("change", onChange);
18 clearPlaceholder(cm);
19 var wrapper = cm.getWrapperElement();
20 wrapper.className = wrapper.className.replace(" CodeMirror-empty", "");
21 }
22
23 if (val && !cm.hasFocus()) onBlur(cm);
24 });
25
26 function clearPlaceholder(cm) {
27 if (cm.state.placeholder) {
28 cm.state.placeholder.parentNode.removeChild(cm.state.placeholder);
29 cm.state.placeholder = null;
30 }
31 }
32 function setPlaceholder(cm) {
33 clearPlaceholder(cm);
34 var elt = cm.state.placeholder = document.createElement("pre");
35 elt.style.cssText = "height: 0; overflow: visible";
36 elt.className = "CodeMirror-placeholder";
37 elt.appendChild(document.createTextNode(cm.getOption("placeholder")));
38 cm.display.lineSpace.insertBefore(elt, cm.display.lineSpace.firstChild);
39 }
40
41 function onBlur(cm) {
42 if (isEmpty(cm)) setPlaceholder(cm);
43 }
44 function onChange(cm) {
45 var wrapper = cm.getWrapperElement(), empty = isEmpty(cm);
46 wrapper.className = wrapper.className.replace(" CodeMirror-empty", "") + (empty ? " CodeMirror-empty" : "");
47
48 if (empty) setPlaceholder(cm);
49 else clearPlaceholder(cm);
50 }
51
52 function isEmpty(cm) {
53 return (cm.lineCount() === 1) && (cm.getLine(0) === "");
54 }
55 });