PageSourceSearch

https://qrz.ru/js/spellsender.js

js qrz.ru collected 2026-09-24 09:28:31 UTC 13,939 bytes, 348 lines download raw bytes

1(function() {
2    var preSelection = "<!!!>";
3    var postSelection = "<!!!>";
4    var snippetMaxLen = 60;
5    var textMaxLen = 256;
6    var messages = { // Russian (Русский)
7        alt: "Выделите орфографическую ошибку мышью и нажмите Ctrl+Enter. Сделаем язык чище!",
8        badbrowser: "Ваш браузер не поддерживает возможность перехвата выделенного текста или IFRAME. "+
9                    "Возможно, слишком старая версия, а возможно, еще какая-нибудь ошибка.",
10        toobig: "Вы выбрали слишком большой объем текста!",
11        thanks: "Спасибо за сотрудничество!",
12        subject: "Орфографическая ошибка",
13        docmsg: "Документ:",
14        intextmsg: "Орфографическая ошибка в тексте:",
15        ifsendmsg: "Послать сообщение об ошибке редактору сайта?\nВаш браузер останется на этой же странице.",
16        newwin: "Страница откроется в новом окне.",
17    };
18    var cssMarker = "css";
19    var w = window;
20    var d = w.document;
21    var de = d.documentElement;
22    var b = d.body;
23    var orphoDiv = null;
24    var orphoObject = {};
25    var isFormEnabled = false;
26    var inputValue = "";
27    var changeStatus = function() {
28        var n = 0;
29        var delayStatus = function() {
30            if (++n > 20) {
31                return;
32            }
33            w.status = (n % 5) ? messages.thanks : " ";
34            setTimeout(delayStatus, 100);
35        };
36        delayStatus();
37    };
38    var hideDiv = function(e) {
39        e.style.position = "absolute";
40        e.style.top = "-10000px";
41        if (b.lastChild) {
42            b.insertBefore(e, b.lastChild);
43        } else {
44            b.appendChild(e);
45        }
46    };
47    var createDiv = function(text) {
48        var div = d.createElement("DIV");
49        div.innerHTML = "<iframe name=\"" + text + "\"></iframe>";
50        hideDiv(div);
51        return d.childNodes[0];
52    };
53    var createForm = function(url, selection, comment) {
54        var iframeID = "orphus_ifr";
55        if (!orphoDiv) {
56            orphoDiv = createDiv(iframeID);
57        }
58        var f = d.createElement("FORM");
59        f.style.position = "absolute";
60        f.style.top = "-10000px";
61        f.action = "/spellcheck/";
62        f.method = "post";
63        f.target = iframeID;
64        var formFields = {
65            ref: url,
66            c_pre: selection.pre,
67            c_sel: selection.text,
68            c_suf: selection.suf,
69            c_pos: selection.pos,
70            charset: d.charset || d.characterSet || "",
71            comment: comment
72        };
73        for (var k in formFields) {
74            var h = d.createElement("INPUT");
75            h.type = "hidden";
76            h.name = k;
77            h.value = formFields[k];
78            f.appendChild(h);
79        }
80        hideDiv(f);
81        f.submit();
82        f.parentNode.removeChild(f);
83    };
84    var getDimensions = function() {
85        var width = 0,
86            height = 0;
87        if (typeof(w.innerWidth) == "number") {
88            width = w.innerWidth;
89            height = w.innerHeight;
90        } else {
91            if (de && (de.clientWidth || de.clientHeight)) {
92                width = de.clientWidth;
93                height = de.clientHeight;
94            } else {
95                if (b && (b.clientWidth || b.clientHeight)) {
96                    width = b.clientWidth;
97                    height = b.clientHeight;
98                }
99            }
100        }
101        var offsetX = 0,
102            offsetY = 0;
103        if (typeof(w.pageYOffset) == "number") {
104            offsetY = w.pageYOffset;
105            offsetX = w.pageXOffset;
106        } else {
107            if (b && (b.scrollLeft || b.scrollTop)) {
108                offsetY = b.scrollTop;
109                offsetX = b.scrollLeft;
110            } else {
111                if (de && (de.scrollLeft || de.scrollTop)) {
112                    offsetY = de.scrollTop;
113                    offsetX = de.scrollLeft;
114                }
115            }
116        }
117        return {
118            w: width,
119            h: height,
120            x: offsetX,
121            y: offsetY
122        };
123    };
124    orphoObject.confirm = function(confirmMessage, flag, showConfirm) {
125        var ts = new Date().getTime();
126        var confirmResult = confirm(messages.docmsg + "\n   " + d.location.href + "\n" + messages.intextmsg + "\n   \"" + confirmMessage + "\"\n\n" + messages.ifsendmsg);
127        var dt = new Date().getTime() - ts;
128        if (confirmResult) {
129            flag("");
130        } else {
131            if (!showConfirm && dt < 50) {
132                var sv = d.onkeyup;
133                d.onkeyup = function(e) {
134                    if (!e) {
135                        e = window.event;
136                    }
137                    if (e.keyCode == 17) {
138                        d.onkeyup = sv;
139                        orphoObject.confirm(confirmMessage, flag, true);
140                    }
141                };
142            }
143        }
144    };
145    orphoObject.css = function(userSelection, commentValue) {
146        if (isFormEnabled) return;
147        isFormEnabled = true;
148        var div = d.createElement("DIV");
149        var w = 550;
150        if (w > b.clientWidth - 10) {
151            w = b.clientWidth - 10;
152        }
153        div.style.zIndex = "10001";
154        div.innerHTML = "" + '<div class="block-orphochecker" style="width:' + w + 'px;
154 z-index:10001;">' +
155                        "<a href=\"javascript:void(0)\" onclick=\"$(this).parent('.block-orphochecker').find('form .buttons input:last').click();\" class=\"close\">×</a>" +
156                        '<div class="header">Орфографическая ошибка в тексте:</div>' +
157                        '<div class="item">«...' + userSelection.replace(preSelection, '<u style="color:red;">').replace(postSelection, '</u>') + '...»</div>' +
158                        '<div class="message">Послать сообщение об ошибке редактору сайта?<br>Ваш браузер останется на этой же странице.</div>' +
159                        '<form><input type="text" maxlength="250" placeholder="Комментарий для редактора (необязательно):" style="width:98%;" />' +
160                        '<div class="buttons"><input type="submit" value="Отправить"> &nbsp; ' +
161                        '<input type="button" value="Отмена" class="cancel">' +
162                        '</div></form></div>';
163        hideDiv(div);
164        var inputsArray = div.getElementsByTagName("input");
165        var formsArray = div.getElementsByTagName("form");
166        var t = inputsArray[0];
167        var documentKeyDownCode = null;
168        var formElements = [];
169        var hideForm = function() {
170            d.onkeydown = documentKeyDownCode;
171            documentKeyDownCode = null;
172            div.parentNode.removeChild(div);
173            for (var i = 0; i < formElements.length; i++) {
174                formElements[i][0].style.visibility = formElements[i][1];
175            }
176            isFormEnabled = false;
177            inputValue = t.value;
178        };
179        var pos = function(p) {
180            var s = {
181                x: 0,
182                y: 0
183            };
184            while (p.offsetParent) {
185                s.x += p.offsetLeft;
186                s.y += p.offsetTop;
187                p = p.offsetParent;
188            }
189            return s;
190        };
191        setTimeout(function() {
192            var w = div.clientWidth;
193            var h = div.clientHeight;
194            var dim = getDimensions();
195            var x = (dim.w - w) / 2 + dim.x;
196            if (x < 10) {
197                x = 10;
198            }
199            var y = (dim.h - h) / 2 + dim.y - 10;
200            if (y < 10) {
201                y = 10;
202            }
203            div.style.left = x + "px";
204            div.style.top = y + "px";
205            if (navigator.userAgent.match(/MSIE (\d+)/) && RegExp.$1 < 7) {
206                var selectsArray = d.getElementsByTagName("SELECT");
207                for (var i = 0; i < selectsArray.length; i++) {
208                    var s = selectsArray[i];
209                    var p = pos(s);
210                    if (p.x > x + w || p.y > y + h || p.x + s.offsetWidth < x || p.y + s.offsetHeight < y) {
211                        continue;
212                    }
213                    formElements[formElements.length] = [s, s.style.visibility];
214                    s.style.visibility = "hidden";
215                }
216            }
217            t.value = inputValue;
218            t.focus();
219            t.select();
220            documentKeyDownCode = d.onkeydown;
221            d.onkeydown = function(e) {
222                if (!e) {
223                    e = window.event;
224                }
225                if (e.keyCode == 27) {
226                    hideForm();
227                }
228            };
229            formsArray[0].onsubmit = function() {
230                commentValue(t.value);
231                hideForm();
232                inputValue = "";
233                return false;
234            };
235            inputsArray[2].onclick = function() {
236                hideForm();
237            };
238        }, 10);
239    };
240    var stripSpace = function(text) {
241        return ("" + text).replace(/[\r\n]+/g, " ").replace(/^\s+|\s+$/g, "");
242    };
243    var getUserSelection = function() {
244        try {
245            var text = null;
246            var selection = null;
247            if (w.getSelection) {
248                selection = w.getSelection();
249            } else {
250                if (d.getSelection) {
251                    selection = d.getSelection();
252                } else {
253                    selection = d.selection;
254                }
255            }
256            var marker = null;
257            if (selection != null) {
258                var pre = "",
259                    text = null,
260                    suf = "",
261                    pos = -1;
262                if (selection.getRangeAt) {
263                    var r = selection.getRangeAt(0);
264                    text = r.toString();
265                    var subSelection1 = d.createRange();
266                    subSelection1.setStartBefore(r.startContainer.ownerDocument.body);
267                    subSelection1.setEnd(r.startContainer, r.startOffset);
268                    pre = subSelection1.toString();
269                    var subSelection2 = r.cloneRange();
270                    subSelection2.setStart(r.endContainer, r.endOffset);
271                    subSelection2.setEndAfter(r.endContainer.ownerDocument.body);
272                    suf = subSelection2.toString();
273                } else {
274                    if (selection.createRange) {
275                        var r = selection.createRange();
276                        text = r.text;
277                        var subSelection1 = selection.createRange();
278                        subSelection1.moveStart("character", -snippetMaxLen);
279                        subSelection1.moveEnd("character", -text.length);
280                        pre = subSelection1.text;
281                        var subSelection2 = selection.createRange();
282                        subSelection2.moveEnd("character", snippetMaxLen);
283                        subSelection2.moveStart("character", text.length);
284                        suf = subSelection2.text;
285                    } else {
286                        text = "" + selection;
287                    }
288                }
289                var p;
290                var s = (p = text.match(/^(\s*)/)) && p[0].length;
291                var e = (p = text.match(/(\s*)$/)) && p[0].length;
292                pre = pre + text.substring(0, s);
293                suf = text.substring(text.length - e, text.length) + suf;
294                text = text.substring(s, text.length - e);
295                if (text == "") {
296                    return null;
297                }
298                return {
299                    pre: pre,
300                    text: text,
301                    suf: suf,
302                    pos: pos
303                };
304            } else {
305                alert(messages.badbrowser);
306                return;
307            }
308        } catch (e) {
309            return null;
310        }
311    };
312
313    d.onkeypress = function(e) {
314        var correctKeyCode = 0;
315        var we = w.event;
316        if (we) {
317            correctKeyCode = we.keyCode == 10 || (we.keyCode == 13 && we.ctrlKey);
318        } else {
319            if (e) {
320                correctKeyCode = (e.which == 10 && e.modifiers == 2) || (e.keyCode == 0 && e.charCode == 106 && e.ctrlKey) || (e.keyCode == 13 && e.ctrlKey);
321            }
322        }
323        if (correctKeyCode) {
324            if (navigator.appName.indexOf("Netscape") != -1 && eval(navigator.appVersion.substring(0, 1)) < 5) {
325                alert(messages.badbrowser);
326                return;
327            }
328            var selectedText = getUserSelection();
329            if (!selectedText) {
330                return;
331            }
332            with(selectedText) {
333                pre = pre.substring(pre.length - snippetMaxLen, pre.length).replace(/^\S{1,10}\s+/, "");
334                suf = suf.substring(0, snippetMaxLen).replace(/\s+\S{1,10}$/, "");
335            }
336            var correctedText = stripSpace(selectedText.pre + preSelection + selectedText.text + postSelection + selectedText.suf);
337            if (correctedText.length > textMaxLen) {
338                alert(messages.toobig);
339                return;
340            }
341            orphoObject[cssMarker](correctedText, function(comment) {
342                createForm(d.location.href, selectedText, comment);
343                changeStatus();
344            });
345            return false;
346        }
347    };
348})();

Line numbers count LF bytes from the start of the resource, as the search results do. Vendor segments are library code the classifier recognised; they are stored but not indexed. Bytes are shown as Latin1 characters, one per byte.