synergy/client/app/js/excl/inspect.js (145 lines of code) (raw):

window.onload = function() { (function() { var selectedElements = []; function addListener(element, event, callback) { if (window.addEventListener) { element.addEventListener(event, callback); } else { element.attachEvent("on" + event, callback); } } function getElementXPath(element) { if (element.id !== "" && element.getAttribute("id") !== null) return 'id("' + element.id + '")'; if (element === document.body) return element.tagName; var offset = 0; var siblings = element.parentNode.childNodes; for (var i = 0, max = siblings.length; i < max; i++) { if (siblings[i] === element) return getElementXPath(element.parentNode) + '/' + element.tagName + '[' + (offset + 1) + ']'; if (siblings[i].nodeType === 1 && siblings[i].tagName === element.tagName) offset++; } } function init() { var links = document.querySelectorAll("a"); for (var i = 0, max = links.length; i < max; i++) { addListener(links[i], "click", function(e) { if (e.preventDefault) e.preventDefault(); e.returnValue = false; return false; }); } var inputs = document.querySelectorAll("input"); for (var i = 0, max = inputs.length; i < max; i++) { inputs[i].setAttribute("disabled", "disabled"); } var allElements = document.querySelectorAll("body *"); for (var i = 0, max = allElements.length; i < max; i++) { var el = allElements[i]; if (isBlockLikeElement(el)) { addListener(el, "click", function(e) { if (e.currentTarget === e.target) { var c = e.target.getAttribute("class"); if (c !== null && c.indexOf("sn_selected") > -1) { e.target.setAttribute("class", c.replace("sn_selected", "")); sendElementClicked(e.target, "removed"); selectedElements = selectedElements.filter(function(el) { return el !== e.target; }); } else { c === null ? e.target.setAttribute("class", "sn_selected") : e.target.setAttribute("class", c + " sn_selected"); sendElementClicked(e.target, "added"); selectedElements.push(e.target); } } }); } } window.console.log("... " + selectedElements.length); } function isBlockLikeElement(element) { var cStyle = element.currentStyle || window.getComputedStyle(element, ""); return cStyle.display.length > 0 && cStyle.display !== "none"; } function sendElementClicked(element, action) { var xpath = getElementXPath(element); parent.postMessage(JSON.stringify({"xpath": xpath.toLowerCase(), "action": action, "element": element.nodeName, "type": "tutorial"}), '*'); } function clearSelection() { selectedElements.forEach(function(e) { var c = e.getAttribute("class"); if (c !== null && c.indexOf("sn_selected") > -1) { e.setAttribute("class", c.replace("sn_selected", "")); } }); selectedElements = []; } function handleMessage(msg) { var _data = msg.data; if (typeof msg.data === "string") { _data = JSON.parse(msg.data); } switch (_data.action) { case "highlight": clearSelection(); for (var i = 0, max = _data.elements.length; i < max; i++) { var list = document.evaluate(_data.elements[i], document, null, XPathResult.ANY_TYPE, null); var _e = list.iterateNext(); while (_e) { if (_e) { selectedElements.push(_e); _e = list.iterateNext(); } } } selectedElements.forEach(function(e) { var c = e.getAttribute("class"); if (c === null || c.indexOf("sn_selected") < 0) { c === null ? e.setAttribute("class", "sn_selected") : e.setAttribute("class", c + " sn_selected"); } }); break; default: // clear clearSelection(); break; } } init(); addListener(window, "message", handleMessage); function countWords() { function getText(el) { var ret = ""; if (!el) { return ""; } var length = el.childNodes.length; for (var i = 0; i < length; i++) { var node = el.childNodes[i]; if (node.nodeType !== 8) { ret += node.nodeType !== 1 ? node.nodeValue : getText(node); } } return ret; } var words = getText(document.querySelector("#middle")); return words.split(/\s+/).length; } var attempts = 0; var intervalId = window.setInterval(function() { var words = countWords(); attempts++; if (words > 0) { parent.postMessage(JSON.stringify({"words": words, "action": "wordCount"}), '*'); window.clearInterval(intervalId); return; } if (attempts > 5) { window.clearInterval(intervalId); return; } }, 1000); })(); };