Don't like ads? PRO users don't see any ads ;-)
Guest

Untitled

By: a guest on Jul 10th, 2012  |  syntax: None  |  size: 36.62 KB  |  hits: 16  |  expires: Never
download  |  raw  |  embed  |  report abuse  |  print
Text below is selected. Please press Ctrl+C to copy to your clipboard. (⌘+C on Mac)
  1. //v26 © 2011 Tynt
  2. Tynt = window.Tynt || [];
  3. if (typeof Tynt.TIL != "undefined") {
  4. } else {
  5.     (function () {
  6.         var mainTynt = function () {
  7.             var body = document.body,
  8.                 documentElement = document.documentElement,
  9.                 isIE = eval("/*@cc_on!@*/false"),
  10.                 repeat = function (a, b) {
  11.                     for (var c = "", f = 0; f < b; f++) c += a;
  12.                     return c
  13.                 },
  14.                 a50 = repeat("a", 50),
  15.                 ic_tynt_com = (Tynt.e || "") + "ic.tynt.com",
  16.                 de_tynt_com = (Tynt.e || "") + "de.tynt.com/deb/?id=" + a50,
  17.                 now = function () {
  18.                     return (new Date).getTime()
  19.                 },
  20.                 trim = function (a) {
  21.                     return a.replace(/^\s+|\s+$/g, "")
  22.                 },
  23.                 copyObj = function (a, b) {
  24.                     for (var c in a) if (a.hasOwnProperty(c)) b[c] = a[c]
  25.                 },
  26.                 createElem = function (tag, attrs, styles) {
  27.                     tag = document.createElement(tag);
  28.                     copyObj(attrs, tag);
  29.                     copyObj(styles, tag.style);
  30.                     return tag
  31.                 },
  32.                 myAddEvent, myRemoveEvent;
  33.             // Define myAddEvent and myRemoveEvent based on browser (IE/nonIE)
  34.             if (window.addEventListener) {
  35.                 myAddEvent = function (a, b, c) {
  36.                     a.addEventListener(b, c, false)
  37.                 };
  38.                 myRemoveEvent = function (a, b, c) {
  39.                     a.removeEventListener(b, c, false)
  40.                 }
  41.             } else {
  42.                 myAddEvent = function (a, b, c) {
  43.                     a.attachEvent("on" + b, c)
  44.                 };
  45.                 myRemoveEvent = function (a, b, c) {
  46.                     a.detachEvent("on" + b, c)
  47.                 }
  48.             }
  49.             var setCookie = function (key, value) {
  50.                 var c = location.hostname.split("."),
  51.                     f = 2;
  52.                 do {
  53.                     var d = c.slice(c.length - f, c.length).join(".");
  54.                     document.cookie = key + ";path=/;domain=." + d + ";" + value;
  55.                     f++
  56.                 } while (document.cookie.indexOf(key) == -1 && f <= c.length);
  57.                 if (document.cookie.indexOf(key) == -1) document.cookie = key + ";path=/;" + value
  58.             },
  59.                 addLoadEvent = function (a) {
  60.                     document.readyState == "complete" ? a() : myAddEvent(window, "load", function () {
  61.                         setTimeout(function () {
  62.                             if (typeof document.readyState == "undefined" && !isIE) document.readyState = "complete";
  63.                             a()
  64.                         }, 10)
  65.                     })
  66.                 },
  67.                 sendRequestAfterLoad = function (source, errorHandler2) {
  68.                     var sendQueue = [],
  69.                         makeImage = function (src, errorHandler) {
  70.                             // Tynt.join("~") is user id
  71.                             var url = "http://" + src.replace("id=" + a50, "id=" + Tynt.join("~"));
  72.                             if (url.indexOf(ic_tynt_com + "/b/p?") > -1 && typeof Tynt.b == "string") url += "&b=" + Tynt.b;
  73.                             var imgTag = new Image(1, 1);
  74.                             if (errorHandler) imgTag.onerror = errorHandler;
  75.                             imgTag.src = url
  76.                         };
  77.                     sendRequestAfterLoad = function (d, e) {
  78.                         sendQueue.push([d, e])
  79.                     };
  80.                     addLoadEvent(function () {
  81.                         sendRequestAfterLoad = makeImage;
  82.                         for (var d = 0; d < sendQueue.length; d++) sendRequestAfterLoad(sendQueue[d][0], sendQueue[d][1]);
  83.                         sendQueue = null
  84.                     });
  85.                     sendRequestAfterLoad(source, errorHandler2)
  86.                 },
  87.                 ca = function (a) {
  88.                     var b = [],
  89.                         c = "",
  90.                         f;
  91.                     for (f in a) if (a.hasOwnProperty(f)) {
  92.                         b.push(c, f, "=", a[f]);
  93.                         c = "&"
  94.                     }
  95.                     return b.join("")
  96.                 },
  97.                 getHash = function (a) {
  98.                     // Returns a base62 9-byte hash of input
  99.                     for (var b = 0, c = a.length < 100 ? a.length : 100, f = 0; f < c; f++) b += a.charCodeAt(f);
  100.                     a = Math.floor(Math.random() * 3844);
  101.                     c = Math.abs(now() - 12281184E5);
  102.                     return da(c, 7) + da((b + a) % 3844, 2)
  103.                 },
  104.                 ea = function (a) {
  105.                     if (a < 62) return "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz".charAt(this);
  106.                     else {
  107.                         var b = Math.floor(a / 62);
  108.                         a = a - b * 62;
  109.                         return b >= 62 ? ea(b) + "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz".charAt(a) : "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz".charAt(b) + "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz".charAt(a)
  110.                     }
  111.                 },
  112.                 da = function (a, b) {
  113.                     var c = ea(a);
  114.                     return repeat("0", b - c.length) + c
  115.                 },
  116.                 numOfWords = function (a) {
  117.                     return (a = trim(a)) ? a.split(/\s+/i).length : 0
  118.                 },
  119.                 documentTitle = trim((document.title || location.hostname).toString()).replace(RegExp(location.hash, "g"), ""),
  120.                 removeSchema = function (a) {
  121.                     return a.replace(/^https?:\/\//, "")
  122.                 },
  123.                 getCookie = function (a, b) {
  124.                     for (var c = b + "=", f = a.split(";"), d = 0; d < f.length; d++) {
  125.                         for (var e = f[d]; e.charAt(0) == " ";) e = e.substring(1, e.length);
  126.                         if (e.indexOf(c) == 0) return e.substring(c.length, e.length)
  127.                     }
  128.                     return null
  129.                 },
  130.                 checkAndPush3 = function () {
  131.                     // an implementation of queue of length 3!
  132.                     // myfun = checkAndPush3()
  133.                     // myfun(1) -> true
  134.                     // myfun(2) -> true
  135.                     // myfun(1) -> false
  136.                     // myfun(10) -> true
  137.                     // myfun(2) -> false
  138.                     // myfun(3) -> true
  139.                     // myfun(1) -> true // memory size is 3!
  140.                     var list = [];
  141.                     return function (value) {
  142.                         for (var c = list.length - 1; c >= 0; c--)
  143.                             if (list[c] == value) return false;
  144.                         list.unshift(value);
  145.                         list.length > 3 && list.pop();
  146.                         return true
  147.                     }
  148.                 },
  149.                 copyAlreadyProccessed = checkAndPush3(),
  150.                 imgSrcAlreadyProccessed = checkAndPush3(),
  151.                 contextMenuListener = function () {
  152.                     var targetElem, processConetxtMenu = function () {
  153.                         console.log('contextMenuListener clicked')
  154.                         window.removeEventListener("blur", processConetxtMenu, false);
  155.                         processCopyEvent(targetElem);
  156.                         return true
  157.                     };
  158.                     return function (event) {
  159.                         targetElem = event.target || event.srcElement;
  160.                         window.removeEventListener("blur", processConetxtMenu, false);
  161.                         if (targetElem.nodeName == "IMG" && targetElem.parentNode.nodeName != "A") {
  162.                             window.addEventListener("blur", processConetxtMenu, false);
  163.                             setTimeout(function () {
  164.                                 document.removeEventListener("blur", processConetxtMenu, false)
  165.                             }, 1E4)
  166.                         }
  167.                         return true
  168.                     }
  169.                 }(),
  170.                 copyListener = function (a) {
  171.                     processCopyEvent(a.target || a.srcElement, true)
  172.                 },
  173.                 draggingImg,
  174.                 mouseDownListener = function (a) {
  175.                     a = a.target || a.srcElement;
  176.                     draggingImg = a.nodeName == "IMG" ? a : null;
  177.                 },
  178.                 dragLeaveListener = function () { //generate dragListenerBasedOnBrowser
  179.                     var extractXYfromEvent = function (event) {
  180.                         return typeof event.pageX == "number" ? {
  181.                             x:event.pageX - (documentElement.scrollLeft ? documentElement.scrollLeft : body.scrollLeft),
  182.                             y:event.pageY - (documentElement.scrollTop ? documentElement.scrollTop : body.scrollTop)
  183.                         } : {
  184.                             x:event.clientX,
  185.                             y:event.clientY
  186.                         }
  187.                     },
  188.                     detectDrag_Ie = function (e) {
  189.                         e = extractXYfromEvent(e);
  190.                         return e.x <= 0 || e.y <= 0 || e.x >= body.clientWidth || e.y >= body.clientHeight
  191.                     },
  192.                     detectDrag_Ie_compat = function (e) {
  193.                         e = extractXYfromEvent(e);
  194.                         return e.x <= 0 || e.y <= 0 || e.x >= documentElement.clientWidth || e.y >= documentElement.clientHeight
  195.                     },
  196.                     detectDrag_firefox = function (e) {
  197.                         return e.target.nodeName == "#document"
  198.                     },
  199.                     detectDrag_others = function (e) {
  200.                         e = extractXYfromEvent(e);
  201.                         return e.x <= 4 || e.y <= 4 || e.x >= documentElement.clientWidth - 4 || e.y >= documentElement.clientHeight - 4
  202.                     },
  203.                     detectDrag = function (event) {
  204.                         detectDrag = navigator.userAgent.match("MSIE") ?
  205.                                 !document.compatMode ||
  206.                                 document.compatMode.indexOf("CSS") == -1 ? detectDrag_Ie : detectDrag_Ie_compat
  207.                             : navigator.userAgent.match("Firefox") ? detectDrag_firefox : detectDrag_others;
  208.                         detectDrag(event)
  209.                     };
  210.                     return function (event) {
  211.                         if (draggingImg && detectDrag(event)) {
  212.                             console.log('dragCaptured', event)
  213.                             processCopyEvent(draggingImg);
  214.                             draggingImg = null
  215.                         }
  216.                         return true
  217.                     }
  218.                 }(),
  219.                 addAnchorClickEvents = function () {
  220.                     function sendUrlVisitedReport(url, l) {
  221.                         if (urlIsNew(url)) {
  222.                             console.log('Reporting /b/o '+url)
  223.                             //sendRequestAfterLoad(ic_tynt_com + "/b/o?id=" + a50 + (l ? "&i=" : "&l=") + encodeURIComponent(url) + "&ts=" + now())
  224.                         }
  225.                     }
  226.  
  227.                     function processAnchorClicks(event) {
  228.                         var target = event.target || event.srcElement;
  229.                         if (event.button < 2)
  230.                             for (; target && target != document;) {
  231.                                 var href = target.href;
  232.                                 if (target.nodeName == "A" && href && location.href.split("#")[0] != href.split("#")[0] && !/^javascript/i.test(href)) {
  233.                                     sendUrlVisitedReport(href);
  234.                                     break
  235.                                 }
  236.                                 target = target.parentNode
  237.                             }
  238.                     }
  239.  
  240.                     function windowBlured() {
  241.                         objectSrc && sendUrlVisitedReport(objectSrc, true)
  242.                     }
  243.  
  244.                     function objectOverListener(e) {
  245.                         if (e) {
  246.                             e = e.target || e.srcElement;
  247.                             objectSrc = e.src || e.data || "flash";
  248.                             myAddEvent(window, "blur", windowBlured)
  249.                         }
  250.                     }
  251.  
  252.                     function objectOutListener() {
  253.                         objectSrc = null;
  254.                         myRemoveEvent(window, "blur", windowBlured)
  255.                     }
  256.  
  257.                     function processObject(elem) {
  258.                         myAddEvent(elem, "mouseover", objectOverListener);
  259.                         myAddEvent(elem, "mouseout", objectOutListener)
  260.                     }
  261.  
  262.                     function windowUnloaded() {
  263.                         objectSrc && sendUrlVisitedReport(objectSrc, true)
  264.                     }
  265.  
  266.                     var objectSrc, urlIsNew = checkAndPush3();
  267.                     myAddEvent(document, "mousedown", processAnchorClicks);
  268.                     addLoadEvent(function () {
  269.                         for (var elems = document.getElementsByTagName("iframe"), l = elems.length - 1; l >= 0; l--) {
  270.                             var iframe = elems[l];
  271.                             if (iframe.src)
  272.                                 processObject(iframe);
  273.                             else if (iframe.name) {
  274.                                 try {
  275.                                     myAddEvent(frames[iframe.name].document, "mousedown", processAnchorClicks)
  276.                                 } catch (u) {
  277.                                 }
  278.                             }
  279.                         }
  280.                         elems = document.getElementsByTagName("object");
  281.                         for (l = elems.length - 1; l >= 0; l--)
  282.                             processObject(elems[l]) // <object> elem
  283.                     });
  284.                     myAddEvent(window, "beforeunload", windowUnloaded);
  285.                     myAddEvent(window, "unload", windowUnloaded)
  286.                 },
  287.                 registerAllEvents = function () {
  288.                     /* Registers copy / drag / link click events
  289.                      * Returns a function to be called when user copy something
  290.                      */
  291.                     var unimportant3 = true,
  292.                         b,
  293.                         sendCopyEventReq = function (args, copiedText) {
  294.                             var data = {
  295.                                 id:a50,
  296.                                 wc:numOfWords(copiedText),
  297.                                 c:copiedText,
  298.                                 f:unimportant3 ? 1 : 0,
  299.                                 t:documentTitle
  300.                             };
  301.                             copyObj(args, data);
  302.                             unimportant3 = false;
  303.                             var h = data.trace_type;
  304.                             delete data.trace_type;
  305.                             var k = data.g;
  306.                             delete data.g;
  307.                             for (var o = [], j = ["id", "wc", "f", "now", "h", "trim", "c"], l = 0; l < j.length; l++) {
  308.                                 var r = j[l],
  309.                                     u = data[r];
  310.                                 u && o.push([r, encodeURIComponent(u).replace(/\'/g, "%27")]);
  311.                                 delete data[r]
  312.                             }
  313.                             for (var y in data) if (data.hasOwnProperty(y))(j = data[y]) && o.push([y, encodeURIComponent(j).replace(/\'/g, "%27")]);
  314.                             data = [];
  315.                             l = 2048 - (("http://" + ic_tynt_com + "/a/t/x#?").length + (3 + k.length) + 5);
  316.                             r = o.length;
  317.                             var B = u = 0,
  318.                                 z = 0,
  319.                                 U, H, V, I, J = 0;
  320.                             for (data[J] = {
  321.                                 g:k,
  322.                                 tp:null
  323.                             }; u < r && data.length < 35;) {
  324.                                 U = o[u][0];
  325.                                 y = o[u][1];
  326.                                 V = U.length + 2;
  327.                                 H = l - V - B;
  328.                                 if (H > 0) {
  329.                                     j = y.substring(z, z + H);
  330.                                     I = j.slice(-2).indexOf("%");
  331.                                     if (I > -1) {
  332.                                         j = y.substring(z, z + H - 2 + I);
  333.                                         B += I + 2
  334.                                     }
  335.                                     B += j.length + V;
  336.                                     z += j.length;
  337.                                     data[J][U] = j
  338.                                 } else B = l;
  339.                                 if (B >= l) {
  340.                                     data[++J] = {
  341.                                         g:k,
  342.                                         p:J
  343.                                     };
  344.                                     B = 0
  345.                                 }
  346.                                 if (z >= y.length) {
  347.                                     u++;
  348.                                     z = 0
  349.                                 }
  350.                             }
  351.                             data[0].tp = data.length;
  352.                             sendRequestAfterLoad(ic_tynt_com + "/b/t/" + h + "?" + ca(data[0]));
  353.                             for (k = 1; k < data.length; k++)
  354.                                 sendRequestAfterLoad(ic_tynt_com + "/b/x/" + h + "?" + ca(data[k]))
  355.                         };
  356.                     // Register events
  357.                     /tynt=nout/.test(location.href) || addAnchorClickEvents();
  358.                     if (window.addEventListener) {
  359.                         navigator.userAgent.match("Firefox/2") || body.addEventListener("copy", copyListener, false);
  360.                         window.addEventListener("mousedown", mouseDownListener, false);
  361.                         window.addEventListener("dragleave", dragLeaveListener, false);
  362.                         window.addEventListener("dragexit", dragLeaveListener, false);
  363.                         document.addEventListener("contextmenu", contextMenuListener, false)
  364.                     } else {
  365.                         body.attachEvent("oncopy", copyListener);
  366.                         document.getElementsByTagName("html")[0].attachEvent("ondragleave", dragLeaveListener);
  367.                         body.attachEvent("onmousedown", mouseDownListener)
  368.                     }
  369.                     //sendRequestAfterLoad(de_tynt_com);
  370.                     var processCopyEvent = function (elem, isCopyEvent) {
  371.                         if (!document.getElementById("tyntSS")) {
  372.                             // assert isCopyEvent || elem.src
  373.                             var selString;
  374.                             if (isCopyEvent)
  375.                                 selString = typeof getSelection != "undefined" ? getSelection().toString() : document.selection.createRange().text;
  376.                             var elemSrc = elem.src;
  377.                             // when dragging image (doessn't work in my ubuntu/firefox)
  378.                             elemSrc && !selString && imgSrcAlreadyProccessed(elemSrc) && sendCopyEventReq({
  379.                                 g:getHash(elemSrc),
  380.                                 trace_type:3,
  381.                                 w:elem.width,
  382.                                 h:elem.height
  383.                             }, elemSrc);
  384.                             // Copying a text (not from an input/textarea)
  385.                             if (selString && trim(selString).length &&
  386.                                     elem.nodeName != "TEXTAREA" && elem.nodeName != "INPUT") {
  387.                                 var isNewEvent = copyAlreadyProccessed(selString);
  388.                                 var k = {
  389.                                     trace_type:1
  390.                                 };
  391.                                 if (isNewEvent) b = getHash(selString);
  392.                                 k.g = b;
  393.                                 // Add 'Read more ...' to selected text
  394.                                 var success = Tynt.tyntAddToSelection ? Tynt.tyntAddToSelection(k, selString) : true;
  395.                                 isNewEvent && success && sendCopyEventReq(k, selString)
  396.                             }
  397.                         }
  398.                     };
  399.                     return processCopyEvent
  400.                 },
  401.                 validUnicodeText = function (a) {
  402.                 a = a.charCodeAt(0);
  403.                 return 3584 <= a && a <= 3711 || 11904 <= a && a <= 12591 || 12688 <= a && a <= 40959 || 63744 <= a && a <= 64255 || 65072 <= a && a <= 65103 || 131072 <= a && a <= 173791 || 194560 <= a && a <= 195103
  404.             },
  405.                 removeScriptTags = function (elem) {
  406.                     var scripts = elem.getElementsByTagName("script");
  407.                     for (var b = scripts.length - 1; b >= 0; b--) {
  408.                         var script = scripts[b];
  409.                         script.parentNode.removeChild(script)
  410.                     }
  411.                 },
  412.                 tracerVars, id_tynt_com = (Tynt.e || "") + "id.tynt.com",
  413.                 unimportant2 = {
  414.                     t:3,
  415.                     p:6,
  416.                     w:7
  417.                 },
  418.                 A, W, X,
  419.                 addIxzzCode = function (a) {
  420.                     var b = location.href;
  421.                     b = b.replace(/#(i|a)xzz=?(.*)$/g, "");
  422.                     return b + "#" + ("ixzz" + a)
  423.                 },
  424.                 escape = function (a) {
  425.                     return a.replace(/&/g, "&").replace(/</g, "<").replace(/>/g, ">")
  426.                 },
  427.                 addToSelectionLock = false,
  428.                 //something related to add extra text to selection
  429.                 addToSelection = function (ixzzCode) {
  430.                     // Returns false if another addToSelection already called
  431.                     if (addToSelectionLock) return false;
  432.                     addToSelectionLock = true;
  433.                     var addText = "";
  434.                     if (tracerVars.changeCopiedText) {
  435.                         var linkUrl = addIxzzCode(ixzzCode),
  436.                             a_start_tag = '<a style="color: #003399;" href="';
  437.                         addText += tracerVars.readMore;
  438.                         if (tracerVars.st) addText = addText + a_start_tag + linkUrl + '">' + escape(documentTitle) + "</a> ";
  439.                         if (tracerVars.su) addText = addText + a_start_tag + linkUrl + '">' + escape(linkUrl) + "</a>";
  440.                         if (tracerVars.as.length > 0) addText = addText + "\n<br>" + tracerVars.as + " ";
  441.                     }
  442.                     var div, div2;
  443.                     div = createElem("div", {}, {
  444.                         overflow:"hidden",
  445.                         color:"#000000",
  446.                         backgroundColor:"#FFFFFF",
  447.                         textAlign:"left",
  448.                         textDecoration:"none",
  449.                         border:"none"
  450.                     });
  451.                     if (!document.selection || !document.selection.createRange) {
  452.                         var selec = getSelection();
  453.                         if (selec.toString()) if (typeof selec.setBaseAndExtent != "undefined") {
  454.                             var range = selec.getRangeAt(0);
  455.                             addText = createElem("span", {
  456.                                 innerHTML:addText
  457.                             });
  458.                             if (tracerVars.t) {
  459.                                 addText.innerHTML += "<br/><br/>";
  460.                                 div.appendChild(addText);
  461.                                 div.appendChild(range.cloneContents())
  462.                             } else {
  463.                                 div.appendChild(range.cloneContents());
  464.                                 addText.innerHTML = "<br/><br/>" + addText.innerHTML;
  465.                                 div.appendChild(addText)
  466.                             }
  467.                             removeScriptTags(div);
  468.                             div.style.width = 0.1;
  469.                             div.style.height = 0.1;
  470.                             div.style.position = "absolute";
  471.                             div.style.top = "-1000px";
  472.                             div.style.left = "-1001px";
  473.                             div.appendChild(document.createElement("br"));
  474.                             addText = div.innerText.length;
  475.                             body.insertBefore(div, body.firstChild);
  476.                             if (div.innerText.length != addText) div.style.overflow = "";
  477.                             selec.selectAllChildren(div);
  478.                             setTimeout(function () {
  479.                                 div.parentNode.removeChild(div);
  480.                                 getSelection().setBaseAndExtent(range.startContainer, range.startOffset, range.endContainer, range.endOffset);
  481.                                 addToSelectionLock = false
  482.                             }, 0)
  483.                         } else {
  484.                             div2 = createElem("div", {}, {
  485.                                 height:0,
  486.                                 position:"absolute",
  487.                                 top:"-1000px"
  488.                             });
  489.                             div2.innerHTML = "<br>";
  490.                             if (tracerVars.t) {
  491.                                 body.insertBefore(div2, body.firstChild);
  492.                                 div.innerHTML = addText + "<br><br>"
  493.                             } else {
  494.                                 body.appendChild(div2);
  495.                                 div.innerHTML = "<br>" + addText + "<br>"
  496.                             }
  497.                             div2.appendChild(div);
  498.                             addText = document.createRange();
  499.                             addText.selectNode(div);
  500.                             selec.addRange(addText);
  501.                             window.setTimeout(function () {
  502.                                 div2.parentNode.removeChild(div2);
  503.                                 addToSelectionLock = false
  504.                             }, 0)
  505.                         }
  506.                     } else {
  507.                         var k = documentElement.scrollLeft || body.scrollLeft,
  508.                             o = documentElement.scrollTop || body.scrollTop;
  509.                         div2 = createElem("div", {}, {
  510.                             overflow:"hidden",
  511.                             position:"absolute",
  512.                             left:k + 20 + "px",
  513.                             top:o + 20 + "px",
  514.                             width:"1px",
  515.                             height:"1px"
  516.                         });
  517.                         body.insertBefore(div2, body.firstChild);
  518.                         var j = document.selection.createRange();
  519.                         div.innerHTML = tracerVars.t ? addText + "<br><br>" + j.htmlText : j.htmlText + "<br><br>" + addText;
  520.                         removeScriptTags(div);
  521.                         div2.appendChild(document.createElement("br"));
  522.                         div2.appendChild(div);
  523.                         addText = body.createTextRange();
  524.                         addText.moveToElementText(div);
  525.                         addText.select();
  526.                         setTimeout(function () {
  527.                             body.removeChild(div2);
  528.                             if (j.text != "") {
  529.                                 j.select();
  530.                                 documentElement.scrollLeft = k;
  531.                                 body.scrollLeft = k;
  532.                                 documentElement.scrollTop = o;
  533.                                 body.scrollTop = o
  534.                             }
  535.                             addToSelectionLock = false
  536.                         }, 0)
  537.                     }
  538.                     return true
  539.                 },
  540.                 doAddToSelection = function (param, selectText) {
  541.                     var success = true;
  542.                     if (tracerVars.changeCopiedText || A || tracerVars.el) {
  543.                         var trimmed = trim(selectText);
  544.                         var validText = trimmed.length >= 2 ?
  545.                                     validUnicodeText(trimmed.charAt(0)) ||
  546.                                     validUnicodeText(trimmed.charAt(trimmed.length - 1)) ||
  547.                                     validUnicodeText(trimmed.charAt(trimmed.length / 2))
  548.                             : validUnicodeText(trimmed);
  549.                         var d;
  550.                         // OOPCH: very complex code!
  551.                         if (d = tracerVars.h) LABELLABEL: {
  552.                             console.log('This code never executes');
  553.                             d = (d = unimportant4()) ? d.className.split(/\s+/) : [];
  554.                             for (var e = d.length - 1; e >= 0; e--) if (tracerVars.h[d[e]] !== undefined) {
  555.                                 d = tracerVars.h[d[e]];
  556.                                 break LABELLABEL
  557.                             }
  558.                             d = void 0
  559.                         }
  560.                         d = d;
  561.                         // d is always undefined
  562.                         if (d !== false &&
  563.                                 (validText && selectText.replace(/\s/g, "").length >= tracerVars.minCopyLength * 2 ||
  564.                                     !validText && numOfWords(selectText) >= tracerVars.minCopyLength)
  565.                                 || d)
  566.                             if (tracerVars.changeCopiedText || A || tracerVars.el) {
  567.                             success = addToSelection(param.g);
  568.                             if (tracerVars.changeCopiedText) param.trace_type = 0
  569.                         }
  570.                     }
  571.                     return success
  572.                 },
  573.                 unimportant4 = function () {
  574.                     return !document.selection || !document.selection.createRange ?
  575.                         function () {
  576.                             var a = getSelection().getRangeAt(0),
  577.                                 b = a.startContainer.nodeType == 3 ? a.startContainer.parentNode : a.startContainer;
  578.                             return b && trim(a.toString()) == trim(b.textContent) ? b : null
  579.                         } : function () {
  580.                         var a = document.selection.createRange(),
  581.                             b = a.duplicate();
  582.                         b.collapse(true);
  583.                         return (b = b.parentElement()) && trim(a.text) == trim(b.innerText) ? b : null
  584.                     }
  585.                 }(),
  586.                 unused1 = function (a) {
  587.                     if (a.hash != "") return false;
  588.                     if (typeof tracerVars.ba == "boolean" && tracerVars.ba) tracerVars.ba = ["/"];
  589.                     else if (!tracerVars.ba) return true;
  590.                     for (var b, c = tracerVars.ba.length - 1; c >= 0; c--) {
  591.                         b = null;
  592.                         var f = tracerVars.ba[c],
  593.                             d = f.indexOf("/");
  594.                         if (d != 0) {
  595.                             b = f.slice(0, d);
  596.                             f = f.slice(d)
  597.                         }
  598.                         if (!b || a.host == b) if (f.charAt(f.length - 1) == "#") {
  599.                             if (a.pathname.indexOf(f.slice(0, -1)) == 0) return false
  600.                         } else if (a.pathname == f) return false
  601.                     }
  602.                     return true
  603.                 },
  604.                 initTracerVarsArgs = function (a) {
  605.                     tracerVars = Tynt.i || window.tyntVariables || {};
  606.                     tracerVars.s = a.s || 1;
  607.                     tracerVars.changeCopiedText = !(tracerVars.changeCopiedText == 0 || a.a == 0);
  608.                     tracerVars.cc = tracerVars.cc || a.cc || 0;
  609.                     if (tracerVars.cc > 6) tracerVars.cc = 0;
  610.                     tracerVars.b = !!(tracerVars.b || a.b);
  611.                     tracerVars.minCopyLength = Math.max(tracerVars.minCopyLength || 8, 8);
  612.                     if (tracerVars.changeCopiedText) {
  613.                         tracerVars.readMore = (tracerVars.readMore || (typeof tyntAP != "undefined" ? tyntAP : null) || "Read more:") + " ";
  614.                         tracerVars.as = tracerVars.as || (typeof tyntAS != "undefined" ? tyntAS : null) || "";
  615.                         tracerVars.st = !!(tracerVars.st || a.st);
  616.                         tracerVars.su = !(tracerVars.su == 0 || a.su == 0);
  617.                         tracerVars.sp = tracerVars.sp || a.sp;
  618.                         if (tracerVars.sp) {
  619.                             X = tracerVars.spid;
  620.                             W = (tracerVars.spt || decodeURIComponent(a.spt || "")) + " ";
  621.                             A = tracerVars.sp || decodeURIComponent(a.sp || "")
  622.                         }
  623.                     }
  624.                 },
  625.                 removeIAxzzFromTitle = function () {
  626.                     var a = document.title.indexOf("#ixzz");
  627.                     if (a > -1) document.title = document.title.substring(0, a);
  628.                     a = document.title.indexOf("#axzz");
  629.                     if (a > -1) document.title = document.title.substring(0, a)
  630.                 },
  631.                 getUserId = function () {
  632.                     for (var a = 0; a < Tynt.length; a++) if (Tynt[a] && Tynt[a].length == 22) return Tynt[a];
  633.                     return null
  634.                 },
  635.                 tracerJsParams = function (tracerJsSrc) {
  636.                     if (!tracerJsSrc) return {};
  637.                     for (var parsed = {}, params = tracerJsSrc.substring(tracerJsSrc.indexOf("?") + 1).split("&"), f = 0; f < params.length; f++) {
  638.                         var key_value = params[f].split("=");
  639.                         if (key_value[0].indexOf("amp;") == 0) key_value[0] = key_value[0].substring(4);
  640.                         parsed[key_value[0]] = key_value[1]
  641.                     }
  642.                     tracerJsSrc = tracerJsSrc.split("/");
  643.                     tracerJsSrc.pop();
  644.                     parsed.scriptPathUri = tracerJsSrc.join("/");
  645.                     return parsed
  646.                 }(function () {
  647.                     for (var a = document.getElementsByTagName("script"), b = 0; b < a.length; b++)
  648.                         if (/\/tracer.*\?/i.test(a[b].src)) return a[b].src;
  649.                     return null
  650.                 }()),
  651.                 userId = tracerJsParams.user || getUserId();
  652.             if (!userId) throw Error("Error finding Tynt Insight userId. Please check your HTML for errors.");
  653.  
  654.             tracerJsParams.user && Tynt.push(tracerJsParams.user);
  655.             // Check tracking is disabled or not
  656.             var trackingDisabled = function () {
  657.                 var a = /tracer=test/.test(location.href);
  658.                 a && sendRequestAfterLoad(id_tynt_com + "/script/verify/" + userId);
  659.                 if (a) return true;
  660.                 if (/tracer=no_tracing/.test(location.href)) return true;
  661.                 if (/disableTracer=/.test(location.href)) {
  662.                     a = location.href.match(/disableTracer=([^?$]*)/)[1];
  663.                     var b = new Date;
  664.                     b.setDate(a && a == "on" ? b.getDate() + 365 : b.getDate() - 2);
  665.                     setCookie("disableTracer=y", "expires=" + b.toUTCString());
  666.                     console.log('oho'); // never runs
  667.                     b = createElem("div", {}, {
  668.                         zIndex:"10000",
  669.                         position:"absolute",
  670.                         top:"10%",
  671.                         left:"10%",
  672.                         width:"80%",
  673.                         height:"80%",
  674.                         backgroundColor:"white",
  675.                         color:"black",
  676.                         textAlign:"center",
  677.                         fontSize:"32px",
  678.                         paddingTop:"10%",
  679.                         border:"1px solid gray"
  680.                     });
  681.                     b.innerHTML = "Tynt Insight has been turned " + (a && a == "on" ? "off" : "on") + " in this browser.<br>You may close this window.";
  682.                     body.insertBefore(b, body.firstChild);
  683.                     return true
  684.                 }
  685.                 if (getCookie(document.cookie, "disableTracer")) return true;
  686.                 return false
  687.             }();
  688.             if (!trackingDisabled) {
  689.                 if (isIE) {
  690.                     removeIAxzzFromTitle();
  691.                     document.attachEvent("onpropertychange", removeIAxzzFromTitle)
  692.                 }
  693.                 initTracerVarsArgs(tracerJsParams);
  694.                 var processCopyEvent = registerAllEvents();
  695.                 Tynt.tyntAddToSelection = doAddToSelection;
  696.             }
  697.         };
  698.         Tynt.TIL = function () {
  699.             document.body ? mainTynt() : setTimeout(Tynt.TIL, 300)
  700.         }
  701.     })();
  702.     Tynt.TIL()
  703. }