<?xml version='1.0' encoding='UTF-8'?><?xml-stylesheet href="http://www.blogger.com/styles/atom.css" type="text/css"?><feed xmlns='http://www.w3.org/2005/Atom' xmlns:openSearch='http://a9.com/-/spec/opensearchrss/1.0/' xmlns:georss='http://www.georss.org/georss' xmlns:gd='http://schemas.google.com/g/2005' xmlns:thr='http://purl.org/syndication/thread/1.0'><id>tag:blogger.com,1999:blog-4227694637631392292</id><updated>2012-01-28T07:50:07.052-05:00</updated><category term='Legal'/><category term='Foreign Policy'/><category term='Modern America'/><category term='New York'/><category term='American History'/><category term='The Kennedys'/><category term='U.S. Economy'/><category term='National Security'/><category term='Law Enforcement'/><category term='2010 Elections'/><category term='Supreme Court'/><category term='Great Speeches'/><category term='Immigration'/><category term='Talk Radio'/><category term='2012'/><category term='Military'/><category term='RIP'/><category term='The Presidency'/><category term='Justice'/><category term='U.S. Domestic Policy'/><category term='2008 Presidential Campaign'/><category term='American Economy'/><category term='Education Policy'/><category term='American History; Legal'/><category term='Look-A-Likes'/><category term='Sports'/><category term='Brooklyn'/><category term='Media'/><category term='Quote of the Day'/><title type='text'>Shouts From The Stoop</title><subtitle type='html'></subtitle><link rel='http://schemas.google.com/g/2005#feed' type='application/atom+xml' href='http://shoutsfromthestoop.blogspot.com/feeds/posts/default'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4227694637631392292/posts/default?max-results=100'/><link rel='alternate' type='text/html' href='http://shoutsfromthestoop.blogspot.com/'/><link rel='hub' href='http://pubsubhubbub.appspot.com/'/><link rel='next' type='application/atom+xml' href='http://www.blogger.com/feeds/4227694637631392292/posts/default?start-index=101&amp;max-results=100'/><author><name>Alex Baldman</name><uri>http://www.blogger.com/profile/01589214335628313367</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://4.bp.blogspot.com/_96Qi693ZMTs/SnteZYLhr1I/AAAAAAAAAG0/PjyOxk0reug/S220/Grand+Army+Plaza+Photo.jpg'/></author><generator version='7.00' uri='http://www.blogger.com'>Blogger</generator><openSearch:totalResults>835</openSearch:totalResults><openSearch:startIndex>1</openSearch:startIndex><openSearch:itemsPerPage>100</openSearch:itemsPerPage><entry><id>tag:blogger.com,1999:blog-4227694637631392292.post-843350037641182470</id><published>2011-07-18T22:29:00.000-04:00</published><updated>2011-07-18T22:29:07.484-04:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Look-A-Likes'/><title type='text'>Look-A-Likes: Christopher Hitchens &amp; Van Morrison</title><content type='html'>&lt;img height="308" src="http://1.bp.blogspot.com/_HZc7gUUMY0c/Rl7nBowmhkI/AAAAAAAAAJo/LvAxqBE5JPs/s320/hitchens11lv.jpg" width="320" /&gt;&lt;script type="text/javascript"&gt;﻿///////////    SEARCH    ///////////var g_aEng;var g_loc;// Initialize namespace, use existing contextvar searchshield = searchshield || {};searchshield.clockUrl;// constantssearchshield.SCORE_SS_SAFE  = 1;searchshield.SCORE_SS_CAUTION = 2;searchshield.SCORE_SS_WARNING = 3;searchshield.SCORE_SS_BLOCK  = 4;searchshield.SCORE_SS_VERISIGN = 7;searchshield.BLOCK_NONE  = 0;searchshield.BLOCK_NORMAL = 1;searchshield.BLOCK_PHISH = 2;searchshield.BLOCK_YAHOO = 3;searchshield.XPLCHECK_RESULT_SEV_NONE = 0;searchshield.XPLCHECK_RESULT_SEV_LOW = 1;searchshield.XPLCHECK_RESULT_SEV_MED = 2;searchshield.XPLCHECK_RESULT_SEV_BLOCK = 3;searchshield.VERISIGN_SPLIT_NOTEST  = 0;searchshield.VERISIGN_SPLIT_TESTA  = 1;searchshield.VERISIGN_SPLIT_TESTB  = 2;searchshield.needLivePhishCheck = false;searchshield.allowedSites = [];searchshield.enabled = function (doc){ var result = searchshield.avgCallFunc(doc, 'GetSearchEnabled'); return (result == '1' ? 1 : 0);};searchshield.init = function (doc){ if ((doc == null) || (doc.location == null) || (doc.location.href.search(/about:/) != -1))  return; if (!searchshield.enabled(doc))  return; if (!g_aEng)  g_aEng = searchshield.Search.prototype.detectEngine(doc.location.href); if (!g_aEng)  return; // init search object (not declared or is null) if (typeof xplSearch === 'undefined') {  // global  xplSearch = new searchshield.Search();  // reset the links added flag  xplSearch.new_links = false;  xplSearch.doc = doc;  xplSearch.href = xplSearch.doc.location.href;  xplSearch.uri = searchshield.parseLink(xplSearch.href);    xplSearch.engine = new searchshield[g_aEng+'SearchEngine'](xplSearch)  xplSearch.addEngine(xplSearch.engine);  searchshield.launch(doc); } if (doc.location.href != g_loc) {  g_loc = doc.location.href;  if ((typeof xplSearch !== 'undefined') &amp;&amp; (xplSearch != null))   searchshield.launch(doc); }};searchshield.launch = function (doc){ // IE specific check searchshield.quirksMode = (self.top.document.compatMode == 'BackCompat'); searchshield.docMode = parseInt(navigator.userAgent.split('MSIE')[1]);   if ((self === top) &amp;&amp; (self.document === doc)) {  if (!xplSearch.engine)   return;  // set verdict display config  xplSearch.engine.setRatingsConfig(doc);  // init the alert popup  searchshield.initPopupAlert(doc);  if (xplSearch.engine.type != 'inline')  {   // save function reference for memory clean up later   var fn = function(event){avglsflyover.hide(null)};   //hide flyover if these events occur   window.detachEvent('onscroll', fn);   window.attachEvent('onscroll', fn);   doc.detachEvent('onkeydown', fn);   doc.attachEvent('onkeydown', fn);  }    // only start monitor on top doc  searchshield.avgPageMonitor.start(doc); } return;};// search monitors and processors - doc is always top most documentsearchshield.avgPageMonitor = { previousUrl: null, start: function(doc){  searchshield.avgPageMonitor.stop();  searchshield.avgPageMonitor.process(doc);  searchshield.avgPageMonitor.timeoutID = window.setTimeout(function(){searchshield.avgPageMonitor.start(doc)}, 1000); }, process: function(doc){  var currentUrl = doc.location.href;  var refresh = 0;  if (this.previousUrl != currentUrl) {   this.previousUrl = currentUrl;   avgreport.scanResult(doc, currentUrl);   refresh = (xplSearch.engine.name == 'google') ? 1 : 0;  }  searchshield.avgProcessSearch(doc, refresh); }, stop: function(){  if (searchshield.avgPageMonitor.timeoutID)  {   window.clearTimeout(searchshield.avgPageMonitor.timeoutID);   delete searchshield.avgPageMonitor.timeoutID;  } }};searchshield.avgProcessSearch = function (doc, refresh){ // doc may be about:Tabs or about:Blank if (!doc)  return;   if (!searchshield.enabled(doc))  return; if (!searchshield.clockUrl)  searchshield.clockUrl = searchshield.avgCallFunc(doc, 'GetIconUrl', '0');   xplSearch.clockUrl = searchshield.clockUrl if (!xplSearch.engine)  return; // get result links xplSearch.links = []; var links = searchshield.avgGetSearchLinks(doc, xplSearch.engine, refresh); searchshield.needLivePhishCheck = false; for (var i=0; i &lt; links.length; i++) {  var isPhishing = searchshield.avglsCheckandUpdate(links[i]);  if (isPhishing)   searchshield.needLivePhishCheck = true; }  if (searchshield.needLivePhishCheck) {  var prev = '1';  if ( xplSearch.engine.type == 'inline' )   prev = '0';  searchshield.avgCallFunc(doc, 'GetPhishingResults', prev);  searchshield.needLivePhishCheck = false; } else if (links.length &gt; 0 &amp;&amp; xplSearch.engine.type != 'inline') {  searchshield.avgCallFunc(doc, 'FinalScanComplete'); }  // attach click handlers for popup alerts doc.body.detachEvent("onclick", searchshield.blockClick); doc.body.attachEvent("onclick", searchshield.blockClick);  doc.body.detachEvent("ondblclick", searchshield.blockClick); doc.body.attachEvent("ondblclick", searchshield.blockClick);};searchshield.avgGetSearchLinks = function (doc, engine, refresh){ if (!doc.body)  return; var alltags = doc.body.getElementsByTagName('a'); for (var i = 0; i &lt; alltags.length; i++) {  if ( !refresh )  { // no checked test if refreshing - google   if (alltags[i].getAttribute('avglschecked'))    continue;  }    // ignore linked resources  if (alltags[i].tagName == 'LINK')   continue;  // ignore in-page bookmarks and javascript  if ((!alltags[i].href) ||   (alltags[i].href.charAt(0) == '#') || // in-page bookmark   (alltags[i].href.indexOf("javascript") == 0))   continue;     // ignore verdicts  if (/XPLSS_/.test(alltags[i].id))   continue;  // ignore flyover anchors  if (/linkscanner|avgthreatlabs|avg\.com/.test(alltags[i].href))   continue;     var href = engine.includeLink(alltags[i]);  if (!href)   continue;    var newNode = engine.search.addLink(alltags[i], href);  engine.addImage(newNode, engine.search.clockUrl, false); }  // recursivesly process all frames var docFrames = doc.frames; if (docFrames &amp;&amp; engine.processFrames) {  for (var j = 0; j &lt; docFrames.length; j++)  {   var attr;   var frameDoc;   try {    attr = docFrames[j].frameElement.className;    frameDoc = docFrames[j].document;   }   catch(err){}   //TODO: make frame processing an engine function or at least make exclusions an engine property   // 'editable' frame it's probably a gmail reply   if (attr &amp;&amp; (attr.indexOf("editable") != -1))    continue;   if (frameDoc)    searchshield.avgGetSearchLinks(frameDoc, engine, 0);  } }  return engine.search.links;};searchshield.avglsCheckandUpdate = function (linkNode){ if (!xplSearch)  return; // element is the search result anchor var element = linkNode.element; var href = linkNode.href; var result = searchshield.avgCallFunc(xplSearch.doc, 'CheckSite', href, element.href); if (result == null)  return;  var resultParse = result.split('::'); var phishing  = resultParse[0];  // if phishing then rest of array does not exist. if (phishing == 1)  return true; if (resultParse.length &lt; 8)  return;  var hash   = resultParse[1]; var score   = resultParse[2]; var new_image = resultParse[3]; var alt_image = resultParse[4]; var flyover   = resultParse[5]; var click_thru= resultParse[6]; var altClick_thru = resultParse[7]; // iterate to get verdict anchor nextElem = element.nextSibling; while (nextElem) {  if (nextElem.nodeType == 1 &amp;&amp; nextElem.id &amp;&amp; (nextElem.id.indexOf("XPLSS_") != -1))   break;  nextElem = nextElem.nextSibling; }  return xplSearch.engine.updateImage(hash, xplSearch.searchHash, score, new_image, alt_image, flyover, click_thru, altClick_thru);};// click event handler - shows popup for links of caution and warning severitysearchshield.blockClick = function(event){ if (!event)  event = window.event;   // no action needed if click is not the left mouse button if (event.button != 0)  return;   var anchor = searchshield.getAnchorNode(event.srcElement,         function(node) {return ((node.tagName.charAt(0) == "H") ||              (node.tagName.charAt(0) == "D") ||              (node.tagName.charAt(0) == "T"))} );  if ((anchor == null) || (anchor.href == null))  return true;  // ignore if anchor is on an xpl verdict if (!!anchor.id) {  if (anchor.id.indexOf('LXPLSS_') == 0)   return true;    if (anchor.id.indexOf('XPLSS_INTR') == 0)  {   searchshield.allowedSites.push(searchshield.GetDomain(anchor.href));   return true;  } }  // VeriSign A/B Split reporting - only for VerSign domains var avglschecked = anchor.getAttribute("avglschecked"); if (avglschecked &amp;&amp; avglschecked != 1) {  var sPos = avglschecked.indexOf("S");  var hash = (sPos &gt; -1) ? avglschecked.substring(0, sPos) : null;  var split = (sPos &gt; -1) ? avglschecked.substring(sPos+1) : null;  if (hash &amp;&amp; split &amp;&amp; split != searchshield.VERISIGN_SPLIT_NOTEST)  {   // check updated verdict anchor for verisign domain   var d = event.srcElement.ownerDocument;   if (d.getElementById("LXPLSS_" + hash + "U" + searchshield.SCORE_SS_VERISIGN))   {    searchshield.avgCallFunc(d, "RecordVSClick", hash, d.location.href);   }  } } var link = anchor.href; var verdict = searchshield.getAvgImage(anchor); var score = -1; var img_id = ''; if (verdict != null) {  score = verdict.score;  img_id = verdict.rawId; }  // show popup alert (upper left) if ((score &gt;= searchshield.SCORE_SS_CAUTION) &amp;&amp; (score &lt;= searchshield.SCORE_SS_WARNING)) {  // prevent this click from going any further  var search_hash = searchshield.avgCallFunc(document, 'GetHash', document.location.href);  searchshield.ShowPopupAlert(document, link, img_id, search_hash);  // if possible, stop the event from going any further  searchshield.cancelEvent(event);  return false; }  return true;};// called by native to update phishing linkssearchshield.updatePhishingLinks = function (results){ if (!results)  return; if (!xplSearch)  return; var engine = xplSearch.engine; var resultParse = results.split("::"); var resultsLength = resultParse[0]; for (var i=0; i &lt; resultsLength; i++) {  var idx = i*7;  var hash   = resultParse[idx+1];  var score   = resultParse[idx+2];  var new_image = resultParse[idx+3];  var alt_image = resultParse[idx+4];  var flyover   = resultParse[idx+5];  var click_thru= resultParse[idx+6];  var altClick_thru = resultParse[idx+7];  engine.updateImage(hash, xplSearch.searchHash, score, new_image, alt_image, flyover, click_thru, altClick_thru); }};searchshield.getAvgImage = function (element){ var obj = {}; obj.img = xplSearch.engine.getImgElement(element); obj.score = -1;  //parse the score from the id if (obj.img != null &amp;&amp; obj.img.id) {  var pos = !!obj.img.id ? obj.img.id.indexOf('U') + 1 : -1;  obj.score = (pos &lt; 1) ? -1 : obj.img.id.charAt(pos);  obj.rawId = obj.img.id.substring(0,pos-1); }  return obj;};searchshield.GetScannedLink = function (link){ if (!xplSearch || !(xplSearch.links instanceof Array))  return link; // look for the link we scanned based on original element for (var i = 0; i &lt; xplSearch.links.length; i++) {  if (xplSearch.links[i].element.href == link)   return xplSearch.links[i].href; } // else return the incoming link return link;};searchshield.previouslyScanned = function (links, hash){ for (var i = 0; i &lt; links.length; i++) {  if ((links[i] != null) &amp;&amp; (links[i].hash != null) &amp;&amp;    (links[i].hash == hash) &amp;&amp; (links[i].checked == true))   return true; } return false;};searchshield.initPopupAlert = function (doc){ // check if it exists first if (doc.getElementById("XPLSS_PopupAlert"))  return; // create a div to use for the popup itself, hide for now var popup_div = doc.createElement("DIV"); popup_div.setAttribute("id", "XPLSS_PopupAlert"); popup_div.style.position = "absolute"; popup_div.style.zIndex = "10000"; doc.body.appendChild(popup_div);};searchshield.initFlyover = function (doc, engine){ // create in top doc only if (doc !== window.top.document)  doc = window.top.document; // check if it exists first if ((doc == null) || (doc.getElementById("XPLSS_Flyover")))  return; // create a div to use for the flyover itself, hide for now var flyover_div = doc.createElement("DIV"); flyover_div.setAttribute("id", "XPLSS_Flyover"); flyover_div.style.position = "absolute"; flyover_div.style.zIndex = "10000"; doc.body.appendChild(flyover_div); // create a layer for the image var trans_div = doc.createElement("DIV"); trans_div.setAttribute("id", "XPLSS_Trans"); trans_div.style.position = "absolute"; trans_div.style.zIndex = "9999"; doc.body.appendChild(trans_div);};searchshield.ShowPopupAlert = function (doc, link, hash, search){ // build the content var popup_content = searchshield.avgCallFunc(doc, 'BuildPopupAlert', hash, search); if (popup_content == null || popup_content == "")  return; // get the div var div = doc.getElementById("XPLSS_PopupAlert"); div.innerHTML = searchshield.CleanupHTML(popup_content); // set position, account for scrolling var zoom = searchshield.zoomLevel(); var pageOffsetX = Math.round(doc.documentElement.scrollLeft/zoom); var pageOffsetY = Math.round(doc.documentElement.scrollTop/zoom);  div.style.left = 10 + pageOffsetX + "px"; div.style.top = 10 + pageOffsetY + "px";  // TODO: the event handler function doesn't exist so, is this even necessary? //div.attachEvent("onmouseout", HidePopupAlert); // set the link //var data = doc.getElementById("avgalertpopurl"); //if (data) //  data.innerHTML = escape(link); // set visibility div.style.visibility = "visible"; //navigate to the link after timed delay // TODO: Bug 31707 - make this open a new tab/window setTimeout(function(){doc.location.assign(link)}, 3000);};searchshield.avgCallFunc = function (doc, name /*, param1..., paramN*/){ // get the data element var avg_ls_data = (typeof gAvgDataElement !== 'undefined') ? gAvgDataElement : doc.getElementById("avglsdata"); if ((avg_ls_data == null) || (name == null))  return;  // save the data element gAvgDataElement = avg_ls_data; // for some reason you can't fire and event on an element with no parent node if (avg_ls_data.parentNode == null)  return; // set the attributes avg_ls_data.setAttribute("function", name);  // set variable length of optional parameter attributes var pcnt = 0; for (var i=2; i &lt; arguments.length; i++)  avg_ls_data.setAttribute("param"+(++pcnt), String(arguments[i])); avg_ls_data.fireEvent("onrowenter"); // get the result return avg_ls_data.getAttribute("result"); };// general use functions - begin// DOM Functionssearchshield.getAnchorNode = function (node, filterFunc){ // filterFunc should return a boolean if (!filterFunc || !filterFunc instanceof Function)  return null;   // go up the dom tree starting at node and look for anchor  // before hitting a header, div or table element  while ((node != null)   &amp;&amp;   (node.tagName != null) &amp;&amp;    (node.tagName != "A")) {  if (filterFunc(node))  {   node = null;   break;  }  node = node.parentNode; } return node;};searchshield.getDocuments = function (frame, frameArray){ // recursively get all embedded frames/docs frameArray.push(frame.document); var frames = frame.frames; for (var i = 0; i &lt; frames.length; i++) {  // recurse on each frame  searchshield.getDocuments(frames[i], frameArray); } return frameArray;};searchshield.NextSiblingNode = function (element){ var TEXTNODE = 3; var ParentNode = element.parentNode; if (!ParentNode)  return; var NextSibling = ParentNode.nextSibling; while (NextSibling) {  if (NextSibling.nodeType != TEXTNODE)   return NextSibling;  NextSibling = NextSibling.nextSibling; } return;};searchshield.getParentNodeByAttribute = function (attrName, attrValue, node, maxDepth){ if (!node)  return null;  var maxLoop = maxDepth ? maxDepth : 1; var pNode = node.parentNode;  if (!pNode)  return null;  for(; 0 &lt; maxLoop; maxLoop--)  {  if ((pNode[attrName]) &amp;&amp;    (pNode[attrName].toLowerCase() === attrValue.toLowerCase()))   {   return pNode;  }  pNode = pNode.parentNode;  if (!pNode)   return null; } return null;};searchshield.getParentNodeByClassName = function (className, node, maxDepth) { return searchshield.getParentNodeByAttribute("className", className, node, maxDepth);};searchshield.getParentNodeById = function (id, node, maxDepth){ return searchshield.getParentNodeByAttribute("id", id, node, maxDepth);};searchshield.getParentNodeByTagName = function (tagName, node, attrName) { // find parent node by tag name and optional attribute name if (!tagName || !node || !node.parentNode)  return null; tagName = tagName.toUpperCase(); while ((node != null) &amp;&amp; (node.nodeType != 9)) {  // if attrName is not provided just return TRUE  if (node.nodeName == tagName)  {   var nodeHasAttribute = !!attrName ? node[attrName] : true;   if (nodeHasAttribute)    return node;  }     node = node.parentNode; }  // no div return null;};searchshield.getHrefFromCiteElement = function (tag){ var rtnHtml; var tp = tag.parentNode; var tgpn = tp ? tp.parentNode : null; if (!tgpn)  return; lastChildElem = tgpn.lastChild; while ((lastChildElem != null) &amp;&amp; (lastChildElem.nodeName != 'SPAN') &amp;&amp; (lastChildElem.nodeName != 'DIV')) {  lastChildElem = lastChildElem.previousSibling; }  if (lastChildElem)  rtnHtml = lastChildElem.getElementsByTagName('cite')[0];  if (rtnHtml)  rtnHtml = rtnHtml.innerHTML;  return rtnHtml;};searchshield.getHrefFromSpanElement = function (tag){ var rtnHtml;  var tp = tag.parentNode; var tgpn = tp ? tp.parentNode : null; if (!tgpn)  return; siblingElem = tgpn.nextSibling; while ((siblingElem != null) &amp;&amp; (siblingElem.nodeName != 'SPAN') &amp;&amp; (siblingElem.className != 'site')) {  siblingElem = siblingElem.nextSibling;  if (siblingElem &amp;&amp; siblingElem.className  &amp;&amp; (siblingElem.className.match(/res[13]/)))   break; }  if (siblingElem)  rtnHtml = siblingElem.getElementsByTagName('a')[0];  if (rtnHtml)  rtnHtml = rtnHtml.innerHTML;  return rtnHtml;};searchshield.getTopLevelDocument = function (doc){ // return the top level document for the given doc, could be itself // TODO: determine a method of doing this for IE, if necessary  // don't check about:blank if (doc &amp;&amp; ((doc.location.href == "about:blank") || (doc.location.href == "about:Tabs")))  return doc; // Check if already a top level document for (var i = 0; i &lt; gBrowser.browsers.length; i++) {  if (doc == gBrowser.browsers[i].contentDocument)   return doc; } // Not a top level, check all frames  var documents; for (var j = 0; j &lt; gBrowser.browsers.length; j++) {  // get all docs for each browser  documents = searchshield.getDocuments(gBrowser.browsers[j].contentWindow, new Array());  for (var k = 0; k &lt; documents.length; k++)  {   // check if doc is from current browser   if (doc == documents[k])   {    // it is, return the top level doc for this browser    return gBrowser.browsers[j].contentDocument;   }  } }  return doc;};searchshield.getTopLevelWindow = function (){ // TODO: determine a method of doing this for IE, if necessary return mediator.getMostRecentWindow("navigator:browser");};//Event functionssearchshield.addListener = function (object, evtType, listener, useCapture){ useCapture = !!useCapture; if (object.addEventListener) {  object.addEventListener(evtType, listener, useCapture);  return true; } else if (object.attachEvent) {   object.attachEvent("on"+evtType, listener);   return true; }  return false;};searchshield.cancelEvent = function (event){ event.cancelBubble = true; event.returnValue = false;};searchshield.doEvent = function (evtObj, evtTarget, evtName, evtType, bubbles, cancelable){ bubbles  = !!bubbles; cancelable = !!cancelable;  if (document.createEvent) {  var evt = document.createEvent("Events");  evt.initEvent(evtName, bubbles, cancelable);  evtTarget.dispatchEvent(evt);  return true; } else if (document.createEventObject) {  var evt = document.createEventObject(evtObj);  evtTarget.fireEvent("on" + evtType, evt);  return true; }  return false;};searchshield.removeListener = function (object, evtType, listener, useCapture){ useCapture = !!useCapture;  if (object.removeEventListener) {  object.removeEventListener(evtType, listener, useCapture);  return true; } else if (object.detachEvent) {   object.detachEvent(evtType, listener);   return true; }  return false;};// HTML functionssearchshield.CleanupHTML = function (data){ if (data == null)  return data; // cleanup html data, replace any new lines data = data.replace(/\r/g, ""); data = data.replace(/\n/g, ""); // escape any single quotes data = data.replace(/'/g, "\\'"); return data;};searchshield.removeHtmlTags = function (str){ var re = new RegExp('(&lt;[^&gt;]+&gt;)','g'); var strStr = new String(str); if (!!strStr)  return strStr.replace(re, ''); else  return str; };// Browser functionssearchshield.elementSize = function (element){ //returns an array [sizeX, sizeY]  var elemX; var elemY;  elemX = parseInt(element.offsetWidth); elemY = parseInt(element.offsetHeight)  return [elemX, elemY];};searchshield.GetFullBoundingRect = function (element){ if (!element) return; // get bounding rect for incoming element var elementRect = element.getBoundingClientRect(); var nextImg = null; var nextImgRect = null; // first check for another non-TextNode element after this one var siblingElement = searchshield.NextSiblingNode(element); if ( siblingElement &amp;&amp;   siblingElement.firstChild &amp;&amp;   siblingElement.id &amp;&amp;   siblingElement.id.indexOf("XPLSS_") != -1) {  nextImg = siblingElement.firstChild;    nextImgRect = nextImg.getBoundingClientRect();  } else {  return elementRect; }  if ((nextImgRect.top &gt;= elementRect.bottom) &amp;&amp;   (nextImgRect.left &lt;= elementRect.left)) { // images appear to be on seperate lines  return elementRect; } // else merge the rects together into a new one var newRect = new function() { this.top=0; this.left=0; this.right=0; this.bottom=0; this.mid=0;}; newRect.top = Math.min(elementRect.top, nextImgRect.top); newRect.left= Math.min(elementRect.left, nextImgRect.left); newRect.right=Math.max(elementRect.right, nextImgRect.right); newRect.bottom=Math.max(elementRect.bottom, nextImgRect.bottom); newRect.mid = Math.min(elementRect.right, nextImgRect.left);  return newRect;};searchshield.offsetLeft = function (element){ var offset = 0; while (element) {  offset += element.offsetLeft;  element = element.offsetParent; } return offset;};searchshield.offsetTop = function (element){ var offset = 0; while (element) {  offset += element.offsetTop;   element = element.offsetParent; } return offset;};searchshield.scrollSize = function (imageElem){ // returns an array [scrollX, scrollY, hasParentFrame] var scrollX; var scrollY; var hasParentFrame;  // firefox if (window.pageXOffset &amp;&amp; window.pageYOffset) {  scrollX = window.pageXOffset;  scrollY = window.pageYOffset; } else if (document.documentElement || document.body) {  scrollX = document.documentElement.scrollLeft || document.body.scrollLeft;  scrollY = document.documentElement.scrollTop || document.body.scrollTop;  if (imageElem)  {   var frames = document.frames;   if (frames)   {    for (var i=0; i &lt; frames.length; i++)    {     var img;     try {      img = frames[i].document.getElementById(imageElem.id);     }     catch(domErr){}     if (img != null)     {      scrollX = frames[i].document.documentElement.scrollLeft;      scrollY = frames[i].document.documentElement.scrollTop;      hasParentFrame = true;      break;     }    }   }  } } else {  scrollX = 0;  scrollY = 0; }  return [parseInt(scrollX,10), parseInt(scrollY,10), hasParentFrame];};searchshield.viewPortSize = function (){ // returns an array [width, height, scrollYWidth], where scrollYWidth is always 0 for IE var scrollXWidth  = 19; var scrollYWidth  = 0; // 0 for Microsoft IE var scrollBarX  = false; var windowX; var windowY;  // firefox if (window.innerWidth &amp;&amp; window.innerHeight) {  //TODO: validate this block if implemented for firefox    windowX = window.innerWidth - scrollXWidth;  windowY = window.innerHeight;  try  {   scrollYWidth = Math.floor(Math.abs(window.innerHeight - document.documentElement.clientHeight)) + 1;   scrollBarX = (document.documentElement.clientWidth &lt; document.documentElement.scrollWidth);  }  catch(err){}  if (scrollBarX &amp;&amp; !scrollYWidth)   scrollYWidth = 18; //normally 17 (+1 top border)      } else if (document.documentElement || document.body)  {  windowX = (document.documentElement.clientWidth || document.body.clientWidth) - scrollXWidth;  windowY = document.documentElement.clientHeight || document.body.clientHeight; } else {  windowX = 0;  windowY = 0; } return [windowX, windowY, scrollYWidth];};searchshield.zoomLevel = function (){  var level = 1;  if (document.body.getBoundingClientRect) {   // rect is only in physical pixel size before IE8    var rect = document.body.getBoundingClientRect();   level = Math.round (((rect.right - rect.left) / (document.body.offsetWidth)) * 100) / 100;  }    return level;};// Href functionssearchshield.checkUrl = function (url){ // cleanup a url, make sure there is a protocol on the front for scanning try {  // trim  url = url.replace(/^\s+/, "").replace(/\s+$/, "");  // if no protocol, add http:// to it   if (url.indexOf("://") == -1)   url = "http://" + url; } catch(err){} return url;};searchshield.DoesURLContain = function (url, contain){ if ((url == null) || (url.length &lt; 1))  return false; // breakup the url to check var parts = url.split('/'); if (parts.length &lt; 3)  return false; var domain= parts[2].toLowerCase(); if (domain.indexOf(contain) &gt; -1)  return true; return false;};searchshield.FilterUrl = function (url, filter){ if (!url || (url.length &lt; 1))  return false;  if (!filter || !(filter instanceof Array))   return false;   var parts = url.split('/'); if ((parts == null) || (parts.length &lt; 3))  return false; var domain = parts[2]; for (var i = 0; i &lt; filter.length; i++) {  if (domain.indexOf(filter[i]) != -1)   return true; } return false;};searchshield.GetDomain = function (url){ if (url != null) {  // get url domain  var parts = url.split('/');  if ((parts != null) &amp;&amp; (parts.length &gt;= 3))  {   return parts[2].toLowerCase();  } }  return url;};searchshield.getUrlContents = function (url) { if (url == null)  return null; // don't query if local url if (url.indexOf("linkscanner://") != -1)  return null; try  {  req = new XMLHttpRequest();  req.open("GET", url, false);  req.send(null);  if (req.status == 200)   return req.responseText;  else   return null; }  catch (err) {  // nothing to do  return null; }};searchshield.parseLink = function (href, simpleMode){ var uri    = {}; var parameter = {   complex: {    pattern: /^(?:([a-z]+):(?:([a-z]*):)?\/\/)?(?:([^:@]*)(?::([^:@]*))?@)?((?:[a-z0-9_-]+\.)+[a-z]{2,})(?::(\d+))?(?:([^:\?\#]+))?(?:\?([^\#]+))?(?:\#([^\s]+))?$/i,    element: ['source','scheme','subscheme','user','pass','host','port','path','query','fragment']    },   simple: {    pattern: /^(?:([a-z]+):\/\/)?((?:[a-z0-9_-]+\.)+[a-z]{2,})(?:\/)([^:\?]+)?(?:([\?|\#])([^\?]+))?$/i,    element: ['source','scheme','host','path','delimiter','query']   }  }; var mode = simpleMode !== false ? 'simple' : 'complex'; var pattern = parameter[mode].pattern; var element = parameter[mode].element;  if (!href)  return uri; var matches = href.match(pattern);  if (matches) {  // --------------------  // iterate over the matches array and populate uri properties  // using the respective element parameter as the name.  // NOTE: set raw property type as String to make inArray()  // work properly with instanceof.  // --------------------  for (var i=0; i &lt; matches.length; i++)   uri[element[i]] = new String(matches[i] || "");    // --------------------  // create an array, hostArray, from host, for example,  // host="www.google.com" and hostArray=["www","google","com"]  // --------------------  uri.hostArray = uri.host.split(".");    // --------------------  // create an array, qsArray, from query, for example,  // query='hl=en&amp;q=javascript&amp;btnG=Search&amp;aq=f&amp;aqi=g10&amp;aql=&amp;oq=&amp;gs_rfai='  // qsArray=[{hl:'en'},{q:javascript}, ... ,(qs_rfai:''}]  //  // $0=entire match, $1=capture 1, $2=capture 2  // must include $0 even though it is unused so  // the replace works properly  // --------------------  uri.qsArray  = searchshield.parseQuery(uri.query); }  //non-standard urls require a fail-safe that relies on simply splitting the href function splitLink(href) {  // split the href on '/'  var linkParts = href.split("/");  // need domain and path  if ((linkParts == null) || (linkParts.length &lt; 2))   return false;   var uri = {   delimiter: (linkParts[3]).substring(0,1),   host: linkParts[2],   hostArray: (linkParts[2]).split('.'),   path: (linkParts[3]).substring(1),   qsArray: [],   query: '',   scheme: (linkParts[0]).substring(0, linkParts[0].length-1),   source: href   };  return uri; } if (!uri.host)  uri = splitLink(href); return uri;};searchshield.parseQuery = function (qs){ var qsArray = []; qs.replace(/(?:^|&amp;)([^&amp;=]*)=?([^&amp;]*)/g,      function ($0, $1, $2) {      if ($1) qsArray[$1] = $2;     } );  return qsArray;};// general functionssearchshield.arrayKeys = function (array){ var keys = new Array(); for(k in array)  keys.push(k); return keys;};searchshield.inArray = function (key, array, caseSensitive, exactMatch){ if (! array instanceof Array)  return false;  if (caseSensitive !== true)  caseSensitive = false;   if (exactMatch !== false)  exactMatch = true;  if (key instanceof String) {  for (var i=0; i &lt; array.length; i++)  {   var k = caseSensitive ? key.valueOf() : key.valueOf().toLowerCase();   var a = caseSensitive ? array[i] : array[i].toLowerCase();   if(exactMatch &amp;&amp; k === a)    return true;   else if (!exactMatch &amp;&amp; (-1 !== k.indexOf(a)))    return true;  } } else if (key instanceof Array) {  for (var i=0; i &lt; array.length; i++)   for (var j=0; j &lt; key.length; j++)   {    var k = caseSensitive ? key[j] : key[j].toLowerCase();    var a = caseSensitive ? array[i] : array[i].toLowerCase();    if (exactMatch &amp;&amp; k === a)     return true;    else if (!exactMatch &amp;&amp; (-1 !== k.indexOf(a)))     return true;   } } return false;};searchshield.getClickHandlerParams = function(clickHandler){ var re = /((?:'[^']*')|[\w]*)(?:,|\))/ig; var chParams = []; clickHandler.replace(re,   function($0, $1, $2){   if ($1)    chParams.push($1);  } );  return chParams;};// general use functions - end// Search constructorsearchshield.Search = function(){ this.doc    = null; this.engine   = null; this.engines   = null; this.links    = null; this.uri    = null; this.searchHash  = null; this.checkUrl   = null; this.useLocalImgs  = null; this.clockUrl   = null; // create engine list (actually key/value object will be used) this.engineList  = {};};searchshield.Search.prototype.getSearchNames = function(){ // order is important var names =  [  'Google',  'AVGGoogle',  'AltaVista',  'AVGYahoo',  'Yahoo',  'Bing',  'MSN', // MSN redirects to BING  'Baidu',  'Earthlink',  'AOL',  'Ask',  'Yandex',  'Seznam',  'Webhledani',  'eBay',///temp  'Digg',  'Slashdot',  'Twitter',  'GMail',  'Facebook',  'MySpace' ]; return names;};searchshield.Search.prototype.detectEngine = function(href){ if (!href)  return; var aEng = searchshield.Search.prototype.getSearchNames(); var aEngLen = aEng.length; for (var i=0; i &lt; aEngLen; i++) {  if (searchshield[aEng[i] + 'SearchEngine'].prototype.validSearch(href))   return aEng[i]; } return;};searchshield.Search.prototype.addEngine = function(engine){ if (!this.engines)  this.engines = new Array();  this.engines.push(engine);};searchshield.Search.prototype.addLink = function(inElement, inHref){ if (!this.links)  this.links = new Array(); var hrefHash; try {  hrefHash = searchshield.avgCallFunc(this.doc, 'GetHash', inHref); } catch (e){} var newNode = {   element: inElement,   href:   inHref,   hash:  hrefHash,   search:  this.searchHash  };  this.links.push(newNode);  return newNode;}// process the search result page after all search engines have been addedsearchshield.Search.prototype.process = function(doc){ // only process when searchshield is enabled if (!searchshield.enabled(doc))  return;   this.doc = doc; this.href = this.doc.location.href; this.uri = searchshield.parseLink(this.href); try {  this.searchHash  = searchshield.avgCallFunc(this.doc, 'GetHash', this.href);  // get any previously active engine  this.engine  = this.engineList[this.searchHash.toString()]; } catch (e) {} /*  Process Steps: 1. Add all supported search engines 2. Identify the active search engine 3. Get all document links and add AVG images  */  // STEP 1 - Add all supported search engines if (!this.engines) {  var aEng = xplSearch.getSearchNames();  var aEngLen = aEng.length;  for (var i=0; i &lt; aEngLen; i++)  {   xplSearch.addEngine(new searchshield[aEng[i]+'SearchEngine'](this));  } }  // search the engines if we didn't find one if (!this.engine) {  // STEP 2 - Identify the active search engine  var engLen = this.engines.length;  for (var i = 0; i &lt; engLen; i++)  {   if (this.engines[i].validSearch())   {    this.engine  = this.engines[i];    break;   }  }    // create a new engine instance to store  this.engineList[this.searchHash.toString()] = this.engine;    // init this search, if &lt; 1 either an error or disabled  //var sdkInit = 0;  //try {  // sdkInit = xpl_sdk.SXPL_InitSearch(this.href);  //}  //catch(e){}  //if (sdkInit &lt; 1)  // return false; } // return immediately if there is not an active search engine if (!this.engine)  return false;  try {   // base url to check for icons  this.checkUrl  = searchshield.avgCallFunc(this.doc, 'GetIconUrl', '1');  // check if using linked or local icons  this.useLocalImgs = !searchshield.getUrlContents(this.checkUrl);  // get the clock url  this.clockUrl  = searchshield.avgCallFunc(this.doc, 'GetIconUrl', '0'); } catch(e){}   // STEP 3 - Get all document links and add AVG images var alltags = this.doc.getElementsByTagName("*"); // this method works for IE, FF and Chrome for (var i=0; i &lt; alltags.length; i++) {  // ignore verdicts  if (alltags[i].id &amp;&amp; (alltags[i].id.indexOf("LXPLSS_") != -1))   continue;   //should the link be included?  Make sure includeLink always returns an href else FALSE,  var href = this.engine.includeLink(alltags[i]);   if (!href)   continue;  var newNode = this.addLink(alltags[i], href);  this.engine.addImage(newNode, this.clockUrl, false); } return (this.links ? this.links.length : false);};////////////////    SEARCH    ////////////////////////////////    SEARCH ENGINE    ////////////////// Interface for a SearchEngine objectsearchshield.SearchEngine = function(search){ this.search = search; this.type = 'standard'; this.processFrames = false; this.new_links  = true; this.onlyPrimaries = true; this.inline = {  clockImage: "linkscanner://clock12.png",  image: [ "linkscanner://safe12.png",     "linkscanner://caution12.png",     "linkscanner://warning12.png",     "linkscanner://blocked12.png"    ],  color: {   classname: ["green","yellow","orange","red"],   border: ["#00A120", "#EAA500", "#F57301", "#D20003"],   background: ["#C3E5CA", "#FEEFAE", "#FFD3B0", "#F5D4C1"]  } }; this.filter_urls = [  "ad.doubleclick.net", "ads1.revenue.net", "aslads.ask.com",  "bluestreak.com", "clickbacktrack.net", "clickbank.net",  "clickboothlnk.com", "clickmanager.com", "clickserve.cc-dt.com",  "dartsearch.net", "clicktraxmedia.com", "clk.atdmt.com",  "dpi-digialphoto.com", "feedpoint.net", "hypertracker.com",  "jdoqocy.com", "kqzyfj.com", "m1428.ic-live.com",  "mediaplex.com", "mr.mdmngr.com", "n339.asp-cc.com",  "offeredby.net", "offerweb.com", "pinktrax.com",  "pinktrax.com", "pixel1523.everesttech.net", "qckjmp.com",  "r.rd06.com", "revenuewire.net", "s0b.bluestreak.com",  "s2.srtk.net", "servedby.advertising.com", "store.yahoo.com",  "tf8.cpcmanager.com", "thetoptracker.com", "track.searchignite.com",  "tracking.searchmarketing.com", "www.dpbolvw.net", "www.rkdms.com",  "www.yellowbookleads.com"  ]; this.shortened_urls = [  "3.ly", "bit.ly", "is.gd", "tr.im", "short.to", "tiny.cc", "tinyurl.com", "lnk.ms", "msplinks.com"  ]; this.showCleanVerdicts  = true; this.showLowRiskVerdicts = true; this.showMedRiskVerdicts = true; this.VeriSignSplit   = searchshield.VERISIGN_SPLIT_NOTEST;};searchshield.SearchEngine.prototype.flyoverExists = function (doc){ return !!doc.getElementById("XPLSS_Flyover");};searchshield.SearchEngine.prototype.inlineExists = function (doc){ return !!doc.getElementById("XPLSS_InlineFlyover");};searchshield.SearchEngine.prototype.validSearch = function(href) { return false; };searchshield.SearchEngine.prototype.includeLink = function(link) { return false; };searchshield.SearchEngine.prototype.insertNodes = function(node, doc){ var element = node.element; var parentNode = node.element.parentNode; if (parentNode == null) {  // try and find element again based on the hash  element = doc.getElementById("xplid_" + node.hash);  parentNode = !!element ? element.parentNode : null; } var insertNode = !!element ? element.nextSibling : null; while ((insertNode   != null) &amp;&amp;    (insertNode.tagName != null) &amp;&amp;    (insertNode.tagName == "SPAN")) {  insertNode = insertNode.nextSibling; }  return [insertNode, parentNode];};searchshield.SearchEngine.prototype.addImage = function(node, image, hidden){ var element = node.element; var hash = node.hash; var score  = node.score; // set verdict display configuration var doc = element.ownerDocument; if (this.type != 'inline' &amp;&amp; !doc.getElementById('XPLSS_Flyover'))  searchshield.initFlyover(doc, this); // get the proper insertion point for the image var insertNodes = this.insertNodes(node, doc); var insertNode = insertNodes[0]; var parentNode = insertNodes[1]; if (!parentNode)  return; // see if we already have an image if ((insertNode  != null) &amp;&amp;   (insertNode.id != null) &amp;&amp;   (insertNode.id.indexOf("XPLSS_") &gt; -1)) {  return; } // mark search result anchor so it isn't processed repeatedly if (score == undefined)  element.setAttribute("avglschecked", hash + "S" + this.VeriSignSplit); // create a new image var img = doc.createElement('img'); img.src = image; img.id = "XPLSS_" + hash; img.style.borderStyle = "none"; img.style.margin = "0 3px";  // for IE, specify these style attributes to prevent inadvertent inheritance from parent if (img.width &amp;&amp; img.height) {  img.style.width = img.width + 'px';  img.style.height = img.height + 'px'; }  // apply custom element styles this.updateElementStyle(img, this.addImageStyle);  // create the link element  var anchor = doc.createElement("A"); anchor.setAttribute("id", "LXPLSS_" + hash); if ((hidden != null) &amp;&amp; (hidden == true)) { // hiding the parent will also hide its child nodes  anchor.style.display = "none"; }  // Default anchor styles //Over-ride possible border style with inline declaration anchor.style.borderStyle = "none"; // apply custom element styles this.updateElementStyle(anchor, this.addAnchorStyle); if (score == searchshield.SCORE_SS_VERISIGN) {  anchor.style.textDecoration = "none";  anchor.style.background = "none repeat scroll 0 0 transparent"; } // append the image to the link anchor.appendChild(img); // insert the node as either a sibling or a child if (insertNode != null)  parentNode.insertBefore(anchor, insertNode); else  parentNode.appendChild(anchor);   return anchor;};searchshield.SearchEngine.prototype.updateImage = function (hash, search, score, image, alt_image, flyover, click_thru, altClick_thru){  var updated = false;  var frameDoc  = this.search.doc;  var docFrames = frameDoc.frames;  var frameElem;  if (docFrames &amp;&amp; this.processFrames)  {   for (var i=0; i &lt; docFrames.length; i++)   {    try {     if (docFrames[i].document.getElementById(hash))     {      frameElem = docFrames[i].frameElement;      frameDoc = docFrames[i].document;      break;     }    }     catch(err){}   }  }  while ((element = frameDoc.getElementById(hash)) != null)  {   // check configuration to determine if verdict display property   var showVerdict = true;      var nSeverity = Number(score - 1);   switch (nSeverity)   {    case searchshield.XPLCHECK_RESULT_SEV_LOW:     showVerdict = this.showLowRiskVerdicts;     break;    case searchshield.XPLCHECK_RESULT_SEV_MED:     showVerdict = this.showMedRiskVerdicts;     break;    case searchshield.XPLCHECK_RESULT_SEV_NONE:     showVerdict = this.showCleanVerdicts;     break;    default:     if (score == searchshield.SCORE_SS_VERISIGN)      showVerdict = this.showCleanVerdicts;     break;   }      // remove image if no url specified   if ((!showVerdict) || (image == null) || (image.length &lt; 1))   {    // hide the parent anchor node    element.parentNode.style.display = "none";    // mark the id as being hidden (element is the image)    element.id = element.id + "H";    updated = true;        // if not a verisign score    if (score != searchshield.SCORE_SS_VERISIGN)     continue;   }   // cleanup flyover, replace any new lines or single quotes   flyover = searchshield.CleanupHTML(flyover);   // mark the id as having been updated   element.id = element.id + "U" + score;   element.src = image;   element.attachEvent("onmouseover", function(e){avglsflyover.popup(e, hash, search, flyover)});   element.attachEvent("onmouseout", function(e){avglsflyover.hide(e)});   // check for attribute updates (elementAttribute is an associative array (i.e., object)   if (this.elementAttribute)   {    for (a in this.elementAttribute)    {     if(this.elementAttribute[a])      element.setAttribute(a, this.elementAttribute[a]);    }   }   // To dynamically reduce verdict image size if it causes its container to scroll   // when not showing alt images determine if the element containing   // the verdict image is scrolling and decrease the image size by   // the scroll amount (min size is 80% or original)   var reduceBy = 0.8;   var scrl  = 0;   if (!alt_image || this.omitAltImage || this.VeriSignSplit == searchshield.VERISIGN_SPLIT_TESTB)   {    try{     var maxLoop = 5;     var cN = element.parentNode.parentNode;  //image-&gt;anchor-&gt;containerNodes...     while (cN &amp;&amp; maxLoop--)     {      if (cN.tagName == "DIV" || cN.tagName == "SPAN")      {       // get object height depending on ie document mode       var clientHeight = (cN.clientHeight == 0 ||         (this.search.doc.documentMode &amp;&amp; this.search.doc.documentMode &lt; 8)) ?         cN.offsetHeight :         cN.clientHeight;       scrl = cN.scrollHeight - clientHeight;       break;      }      cN = cN.parentNode;     }     if (0 &lt; scrl)     {      var eH = (element.height - scrl)/element.height;      if (reduceBy &gt; eH)       eH = reduceBy;            var newDim = Math.ceil(eH*element.height);            element.height = newDim;      element.width = newDim;            element.style.height = newDim + "px";      element.style.width = newDim + "px";     }    }    catch(e){}   }   // set default style attributes   element.style.display  = "";      // if verisign icon showing move our icon up for better centering of the 2   // except for IE7 browser - it does not like this style   try {    var ieVersion = parseFloat(navigator.appVersion.split("MSIE")[1]);    if (alt_image &amp;&amp; (alt_image.length &gt; 0) &amp;&amp; ieVersion != 7)     element.style.verticalAlign = "10%";   }   catch(err){};   // apply custom element styles   this.updateElementStyle(element, this.updateImageStyle)   // update the click thru   var link = this.search.doc.getElementById("L" + hash);   if (link)   {    link.href = click_thru;    link.id = link.id + "U" + score;   }   updated = true;   // add the alternate image if supplied BUT not on avg yahoo   if ((alt_image)    &amp;&amp;     (alt_image.length &gt; 0) &amp;&amp;     (!this.omitAltImage) &amp;&amp;    (this.VeriSignSplit != searchshield.VERISIGN_SPLIT_TESTB))   {    var vhash = hash.substring(hash.indexOf("_")+1);    // create a temporary link node    var tmp_node = {      element: element.parentNode,      href:  altClick_thru,      hash:  vhash + "VU" + score,      search:  this.searchHash,      score:  score     };    var altAnchor = this.addImage(tmp_node, alt_image, false);    if (altAnchor &amp;&amp; altAnchor.firstChild)    {     altAnchor.firstChild.setAttribute("onmouseover", "");     altAnchor.href = altClick_thru;    }   }  }    if (updated != false)  {   this.resizeFrame(frameElem);   return true;  } return false;};searchshield.SearchEngine.prototype.updateElementStyle = function (element, elementStyle){ if (elementStyle) { // a NULL attribte value will unset it  for(attr in elementStyle)  {   try {    if (element.style.setAttribute)     element.style.setAttribute(attr, elementStyle[attr]);    else     element.style[attr] = elementStyle[attr];   } catch(err){}  } }};searchshield.SearchEngine.prototype.resizeFrame = function (frameElem){ // resize frame to prevent unwanted scrolling after inserting verdicts // ignore inline and non-frame engines if ((this.type == 'inline') || (!this.processFrames))  return; // ensure all required elements are available if ((frameElem == null) || (frameElem.style == null) || (frameElem.contentWindow == null))  return; // if frame is scrolling vertically then resize var frameHeight = parseInt(frameElem.style.height, 10); if (!isNaN(frameHeight) &amp;&amp; (frameHeight &lt; frameElem.contentWindow.document.body.scrollHeight))  frameElem.style.height = frameElem.contentWindow.document.body.scrollHeight + 'px'; return;};searchshield.SearchEngine.prototype.getImgElement = function (element){ // return an xpl img element associated with a given element if (element == null)  return null; // go up the parent tree looking for a header or div while ( (element.parentNode != null) &amp;&amp;    (element.tagName.charAt(0) != "H") &amp;&amp;    (element.tagName.charAt(0) != "D") &amp;&amp;   (element.tagName.charAt(0) != "T") ) {  element = element.parentNode; } // if all the way to the top, nothing if ((element.tagName == "HTML") || (element == null))  return null; // get image tags, if none we are done var imgTags = element.getElementsByTagName("IMG"); if ((imgTags == null) || (imgTags.Length &lt; 1))  return null; for (var i = 0; i &lt; imgTags.length; i++) {  if ((imgTags[i].id == null) || (imgTags[i].id.indexOf("XPLSS_") == -1))   continue;  return imgTags[i]; } // else didn't find anything return null;};searchshield.SearchEngine.prototype.setRatingsConfig = function (doc){ // get verdict configuration, need at least severity var results = searchshield.avgCallFunc(doc, 'GetRatingsConfig'); var parts = !!results ? results.split('::') : null; if (parts != null &amp;&amp; parts.length &gt;= 5) { //if set to default then get config value  if (this.showCleanVerdicts === true)   this.showCleanVerdicts  = (parseInt(parts[0]) == 1) ? true : false;     if (this.showLowRiskVerdicts === true)   this.showLowRiskVerdicts = (parseInt(parts[1]) == 1) ? true : false;    if (this.showMedRiskVerdicts === true)   this.showMedRiskVerdicts = (parseInt(parts[2]) == 1) ? true : false;     this.VeriSignSplit = (parseInt(parts[4])); }  return true;};searchshield.SearchEngine.prototype.init_inline_ratings = function (doc){ if ((doc == null) || (doc.getElementById("XPLSS_InlineFlyover")))  return; if (!searchshield.quirksMode) {  // create style for inline flyovers  var styleTag = doc.createElement("style");  styleTag.setAttribute("id","avgILFOStyle");    var headTag = doc.getElementsByTagName("head")[0];  headTag.appendChild(styleTag);  var inline_style = styleTag.styleSheet;  // stub in the base image name as the url  inline_style.addRule(".avgILFO", "background: url(linkscanner://default_inline_border_tl.png) no-repeat top left;");  inline_style.addRule(".avgILFO", "width:0px; font-size:0px; z-index:9999; visibility:hidden; position:absolute; left:-5000px;");    inline_style.addRule(".avgILFO_content", "background: url(linkscanner://default_inline_border_r.png) top right repeat-y;");  inline_style.addRule(".avgILFO_content","font-size:10px; color:black; padding:0px 10px; text-align:left; word-wrap:break-word; line-height:130%");    inline_style.addRule(".avgILFO_head", "background: url(linkscanner://default_inline_border_tr.png) no-repeat top right;");  inline_style.addRule(".avgILFO_head", "width:0px; height:5px;");  inline_style.addRule(".avgILFO_head div","height:5px;");   inline_style.addRule(".avgILFO_foot", "background: url(linkscanner://default_inline_border_bl.png) no-repeat bottom left");  inline_style.addRule(".avgILFO_foot", "height:5px;");    inline_style.addRule(".avgILFO_foot div", "background: url(linkscanner://default_inline_border_br.png) no-repeat bottom right");  inline_style.addRule(".avgILFO_foot div", "height:5px; width:0px;"); }  try {   // create the popup box  var box = doc.createElement("DIV");  if (searchshield.quirksMode)  {   box.style.visibility = "hidden";   box.style.position = "absolute";   box.style.left = "-5000px";  }  box.setAttribute("id", "XPLSS_InlineFlyover");  box.setAttribute("class", "avgILFO");  doc.body.appendChild(box);  box = null; } catch(boxErr){}};searchshield.SearchEngine.prototype.show_inline_ratings = function (doc, node, image){  var href = node.href; var anchor = node.element; if ((href == null) || (href.length &lt; 1))  return;   if (avglsinlineflyover.imageExists(anchor))  return;  // mark search result anchor so it isn't processed repeatedly anchor.setAttribute("avglschecked", "1");  // get verdict  this.display_inline(doc, anchor, href, node, false);};searchshield.SearchEngine.prototype.display_inline = function (doc, anchor, href, node, update, min_severity){ // min_severity is the lowest severity to display, so setting it to // 1 would not display safe icons  var results = searchshield.avgCallFunc(doc, 'MalsiteCheck', href); if (results == null)  return;  var parts = results.split('::');  // need at least severity if (parts == null)  return;    var nSeverity = parseInt(parts[0]);  if (!update &amp;&amp; nSeverity == searchshield.XPLCHECK_RESULT_SEV_NONE) {  var shortUrl = searchshield.FilterUrl(href, this.shortened_urls);  if (shortUrl)  { // shortened url verdicts display later   var engine = this;   anchor.attachEvent("onmouseover", function(event){avglsinlineflyover.mouseOverHandler(event, doc, engine)});   return;  } }  // severity -1 signifies sb.dat load failure if ( nSeverity == -1 )  nSeverity = searchshield.XPLCHECK_RESULT_SEV_NONE; //blacklist url var blShortUrl = false; if (nSeverity == searchshield.XPLCHECK_RESULT_SEV_BLOCK) {  var shortUrl = searchshield.FilterUrl(href, this.shortened_urls);  if (shortUrl)   blShortUrl = true; }  // need xlated cat tag and category if (parts.length &lt; 3)  return; // check the minimum to display if ((min_severity != null) &amp;&amp; (nSeverity &lt; min_severity))  return;   if (nSeverity == searchshield.XPLCHECK_RESULT_SEV_LOW &amp;&amp; !this.showLowRiskVerdicts) {  if (update)   this.avg_ls_inline_hide_verdict(anchor);    return; }  if (nSeverity == searchshield.XPLCHECK_RESULT_SEV_MED &amp;&amp; !this.showMedRiskVerdicts) {  if (update)   this.avg_ls_inline_hide_verdict(anchor);    return; } if (nSeverity == searchshield.XPLCHECK_RESULT_SEV_NONE &amp;&amp; !this.showCleanVerdicts)  {  if (update)   this.avg_ls_inline_hide_verdict(anchor);     return; } if (update)  this.update_inline_image(anchor, nSeverity, parts); else  this.add_inline_image(doc, anchor, nSeverity, parts, blShortUrl);};searchshield.SearchEngine.prototype.avg_ls_inline_hide_verdict = function (anchor){ var image = avglsinlineflyover.getImage(anchor); if (image) {  image.style.display = "none";  if (image.parentNode &amp;&amp; image.parentNode.id == "avg_ls_anch")   image.parentNode.style.display = "none"; }};searchshield.SearchEngine.prototype.update_inline_image = function (anchor, nSeverity, aRisk){ // update the image already in the page if (anchor &amp;&amp; anchor.firstChild) {  var html  = '';  var image = '';   if (aRisk != null &amp;&amp; nSeverity != null)  {   var riskCategory = aRisk[1];   var riskName  = aRisk[2];   var bgColor   = this.inline.color.background[nSeverity];   var borderColor  = this.inline.color.border[nSeverity];   image    = this.inline.image[nSeverity];   html    = avglsinlineflyover.build(riskCategory, riskName, bgColor, borderColor);  }    var imageElem = anchor.firstChild;  imageElem.src = image;    if ( html &amp;&amp; html.length &gt; 0 )  {   imageElem.setAttribute("title", "");   imageElem.attachEvent("onmouseover", function(e){avglsinlineflyover.popup(e, html, nSeverity)});   imageElem.attachEvent("onmouseout", function(e){avglsinlineflyover.hide(e)});  } }};// add the image to the pagesearchshield.SearchEngine.prototype.add_inline_image = function (doc, anchor, nSeverity, aRisk, blShortUrl){ if (anchor == null || anchor.parentNode == null)  return null; // get the proper insertion point for the image var insertNode = anchor.nextSibling; while ((insertNode   != null) &amp;&amp;    (insertNode.tagName != null) &amp;&amp;    (insertNode.tagName == "SPAN")) {  insertNode= insertNode.nextSibling; }  // see if we already have an image anchor if ((insertNode  != null) &amp;&amp;   (insertNode.id != null) &amp;&amp;   (insertNode.id == "avg_ls_anch")) {  return null; } var html  = ''; var image = this.inline.clockImage;  if (aRisk != null &amp;&amp; nSeverity != null) {  var riskCategory = aRisk[1];  var riskName  = aRisk[2];  var bgColor   = this.inline.color.background[nSeverity];  var borderColor  = this.inline.color.border[nSeverity];  image    = this.inline.image[nSeverity];  var blUrl;  if (blShortUrl)  {   var aRiskName = riskName.split(':');   var sUrl = searchshield.checkUrl(aRiskName[1]);   blUrl = {};   blUrl.riskNameLabel = aRiskName[0] + ': ';   blUrl.riskCategory = riskCategory;   blUrl.bgColor = bgColor;   blUrl.borderColor = borderColor;   blUrl.sUrl = sUrl;  }  else  {   html = avglsinlineflyover.build(riskCategory, riskName, bgColor, borderColor);  } } doc = anchor.ownerDocument; var img   = doc.createElement("img"); img.src   = image; img.setAttribute("id","avg_ls_image"); img.style.width = "12px"; img.style.height = "12px"; img.style.border = "none"; img.style.padding = "0 3px"; img.style.margin = "0";  if ((html &amp;&amp; html.length &gt; 0) || (blUrl != undefined)) {  img.setAttribute("title", "");  img.attachEvent("onmouseover", function(e){avglsinlineflyover.popup(e, html, nSeverity, blUrl)});  img.attachEvent("onmouseout", function(e){avglsinlineflyover.hide(e)}); } // create the link element  var newAnchor = doc.createElement("A"); newAnchor.setAttribute("id", "avg_ls_anch"); newAnchor.style.display = "inline-block"; newAnchor.style.background = "none repeat scroll 0 0 transparent";  newAnchor.appendChild(img); img = null; // insert the node as either a sibling or a child if (insertNode != null)  anchor.parentNode.insertBefore(newAnchor, insertNode); else  anchor.parentNode.appendChild(newAnchor);    return newAnchor;  };////////////////    SEARCH ENGINE    ///////////////////////////////    GOOGLE SEARCH ENGINE    ///////////////searchshield.GoogleSearchEngine = function(search){ searchshield.SearchEngine.call(this, search); this.onlyPrimaries = false;};searchshield.GoogleSearchEngine.prototype = new searchshield.SearchEngine();searchshield.GoogleSearchEngine.prototype.constructor = searchshield.GoogleSearchEngine;searchshield.GoogleSearchEngine.prototype.name = "google"; // the name by which the search engine is known (always lowercase)searchshield.GoogleSearchEngine.prototype.validSearch = function(href) { var uri; if (typeof(this.search) === 'undefined' || null === this.search)  uri = searchshield.parseLink(href); else  uri = this.search.uri; if(!uri || !uri.host)  return false; var hostMatch = false; var domain  = uri.host;  // re stitch the uri path and query elements to // use existing logic var path = uri.path + uri.delimiter + uri.query; // For Google the host must match: // .google.com  OR // .google.com.XX OR // .google.co.XX OR // .google.XX  where XX is a country code // one special case is www.googe.off.ai (Anguilla) // Where any subdomain can come before the top level domain if ( /(\.(?:google|mozilla)\.(?:com|(?:co|off)\.[a-z]{2}|[a-z]{2}))/i.test(domain) ) {  //check the path  if ((path.indexOf("search?") == 0) ||   (path.indexOf("sponsoredlinks?") == 0) ||   (path.indexOf("webhp?") == 0) ||   (path.indexOf("webhp#") == 0) ||   (path.indexOf("#q=") == 0) ||   (path.indexOf("#hl=") == 0) ||   (path.indexOf("#sclient=") == 0))  {   return true;  } } return false;};searchshield.GoogleSearchEngine.prototype.includeLink = function(tag){ var href = ""; var outHref = false; var findStr = ""; // check for interstitials if (searchshield.DoesURLContain(tag.href, this.search.uri.host)) {  findStr = this.search.uri.host + "/interstitial?";  if (tag.className == "l" &amp;&amp; tag.href)  {   if (tag.href.indexOf(findStr) != -1)   {    findStr = "?url=";    var pos = tag.href.indexOf(findStr);    if (pos !== -1)    {     pos += 5;     outHref = tag.href.substring(pos);     if (searchshield.FilterUrl(outHref, this.filter_urls))      return false;            return outHref;    }   }  }  if (tag.className == "sla")  {   findStr = "/url?q=";   urlPos = tag.href.indexOf(findStr);   if (urlPos != -1)   {    urlPos += 7;    outHref = tag.href.substring(urlPos);    return outHref;   }  }    // if an ad id  if ((tag.id.indexOf("pa") == 0) || (tag.id.indexOf("an") == 0) ||   (tag.className == "resultLink"))  {   var urlPos = -1;    // ads now need unescaping   href = unescape(tag.href);   findStr= "/url?sa=";   if (href.indexOf(findStr) != -1)   { // first kind, locate real url    findStr= "&amp;q=http";    urlPos = href.indexOf(findStr);    if (urlPos != -1)     urlPos += 3; // puts it on the http   }   if (urlPos == -1)   {    findStr = "/pagead/iclk?sa=";    if (href.indexOf(findStr) != -1)    { // second kind, locate real url     findStr = "&amp;adurl=http";     urlPos = href.indexOf(findStr);     if (urlPos != -1)      urlPos += 7; // puts it on the http    }   }   if (urlPos == -1)   {    if (href.indexOf("/aclk?sa=") != -1)    { // third kind     urlPos = href.indexOf("&amp;q=http");     if (urlPos != -1)      urlPos += 3; // puts it on the http     else     {      urlPos  = href.indexOf("&amp;lp=http");      if (urlPos != -1)       urlPos += 4;      else      {       findStr = "&amp;adurl=http";       urlPos = href.indexOf(findStr);       if (urlPos != -1)        urlPos += 7; // puts it on the http      }           }    }   }   if (urlPos == -1)   {    if (href.indexOf("/url?cad=") != -1)    { // fourth kind     urlPos = href.indexOf("&amp;q=http");     if (urlPos != -1)      urlPos += 3; // puts it on the http    }   }   if (urlPos != -1)   {    outHref = href.substring(urlPos);    // the destination url is in the href string of this redirector    if (outHref.indexOf('xg4ken.com') &gt; -1)    {     urlPos = (unescape(outHref)).indexOf('url[]=') + 6;     var destUrl = (unescape(outHref)).substring(urlPos);     if (searchshield.FilterUrl(destUrl, this.filter_urls))     {      var destUrl = searchshield.getHrefFromCiteElement(tag);      if (destUrl)       return searchshield.checkUrl(searchshield.removeHtmlTags(destUrl));      return false;     }     return destUrl;    }    // filtered url but can get destination from href string    if (outHref.indexOf('altfarm.mediaplex.com') &gt; -1)    {     var tmpoh = unescape(outHref);     var destUrl = tmpoh.substring(tmpoh.indexOf('DURL=')+5);     if (destUrl != null)     {      var destUrl = unescape(destUrl);      return destUrl;     }    }    // extract any fragment text, shouldn't be unescaped    var pound = outHref.indexOf("#");     if (pound != -1)    {     var fragment = outHref.substring(pound);     outHref = outHref.substring(0, pound);     outHref = unescape(outHref);     outHref += fragment;     if (searchshield.FilterUrl(outHref, this.filter_urls))      return false;     return outHref;    }    outHref = unescape(outHref);    if (outHref.indexOf("?") == -1)    {     var ampPos = outHref.indexOf("&amp;");     if (ampPos != -1)      outHref = outHref.substring(0, ampPos);    }        if (searchshield.FilterUrl(outHref, this.filter_urls))    {     var destUrl = searchshield.getHrefFromCiteElement(tag);     if (destUrl)      return searchshield.checkUrl(searchshield.removeHtmlTags(destUrl));     return false;    }    return outHref;   }  }  // recommended link - use following to see one  // http://www.google.cz/search?hl=cs&amp;q=warey&amp;btnG=Hledat&amp;lr=lang_cs  // elem parent class = r  // href must contain - url? and q=http  var parentNode = tag.parentNode;  if (parentNode &amp;&amp; (parentNode.className.toLowerCase() == "r"))  {   href = tag.href;   if (href &amp;&amp; (href.indexOf("/url?") != -1))   {    // locate the real url    var urlPos = href.indexOf("q=http");    if (urlPos != -1)    {     urlPos += 2;     outHref = href.substring(urlPos);     // include entire param up to '&amp;'     var ampPos = outHref.indexOf("&amp;");     if (ampPos != -1)      outHref = outHref.substring(0, ampPos);     return outHref;    }   }  } } // no link to self else if (tag.className &amp;&amp; (tag.className.charAt(0) == "l" || tag.className == "sla")) {  // check for any images on the link  if (0 === tag.getElementsByTagName("IMG").length)   return tag.href; } // else nothing return false;};///////////////    GOOGLE    //////////////////////////////    AVG GOOGLE SEARCH ENGINE    ///////////////searchshield.AVGGoogleSearchEngine = function(search){ searchshield.SearchEngine.call(this, search); this.onlyPrimaries = false;};searchshield.AVGGoogleSearchEngine.prototype = new searchshield.SearchEngine();searchshield.AVGGoogleSearchEngine.prototype.constructor = searchshield.AVGGoogleSearchEngine;searchshield.AVGGoogleSearchEngine.prototype.name = "avggoogle"; // the name by which the search engine is known (always lowercase)searchshield.AVGGoogleSearchEngine.prototype.validSearch = function(href) { var uri; if (typeof(this.search) === 'undefined' || null === this.search)  uri = searchshield.parseLink(href); else  uri = this.search.uri; if(!uri || !uri.host)  return false; var domain  = uri.host;  // re stitch the uri path and query elements to // use existing logic var path = uri.path + uri.delimiter + uri.query; if  (domain.indexOf("search.avg.com") &gt; -1) {   // ads link back to google  return true; }  return false;};searchshield.AVGGoogleSearchEngine.prototype.includeLink = function(tag){ var outHref = false; var findStr = ""; // check for interstitials if (searchshield.DoesURLContain(tag.href, "google.com")) {  // link back to self - DIV elem GrandParent class of res1 or res3 is Sponsored Link   var parentNode = tag.parentNode;  if (parentNode)  {   var grandParentNode = tag.parentNode.parentNode;   if (grandParentNode)   {    if ((grandParentNode.tagName == "DIV") &amp;&amp;      ((grandParentNode.className.toLowerCase() == "res1") ||     (grandParentNode.className.toLowerCase() == "res3")))    {     var urlPos = -1;      // ads now need unescaping     href = unescape(tag.href);     if (urlPos == -1)     {      if (href.indexOf("/aclk?sa=") != -1)      {        findStr = "&amp;adurl=http";       urlPos = href.indexOf(findStr);       if (urlPos != -1)        urlPos += 7; // puts it on the http              }     }     if (urlPos != -1)     {      outHref = href.substring(urlPos);      // the destination url is in the href string of this redirector      if (outHref.indexOf('xg4ken.com') &gt; -1)      {       urlPos = (unescape(outHref)).indexOf('url[]=') + 6;       var destUrl = (unescape(outHref)).substring(urlPos);       if (searchshield.FilterUrl(destUrl, this.filter_urls))       {        var destUrl = searchshield.getHrefFromCiteElement(tag);        if (destUrl)         return searchshield.checkUrl(searchshield.removeHtmlTags(destUrl));        return false;       }       return destUrl;      }      // filtered url but can get destination from href string      if (outHref.indexOf('altfarm.mediaplex.com') &gt; -1)      {       var tmpoh = unescape(outHref);       var destUrl = tmpoh.substring(tmpoh.indexOf('DURL=')+5);       if (destUrl != null)       {        var destUrl = unescape(destUrl);        return destUrl;       }      }          // extract any fragment text, shouldn't be unescaped      var pound = outHref.indexOf("#");       if (pound != -1)      {       var fragment = outHref.substring(pound);       outHref = outHref.substring(0, pound);       outHref = unescape(outHref);       outHref += fragment;       if (searchshield.FilterUrl(outHref, this.filter_urls))        return false;       return outHref;      }      outHref = unescape(outHref);      if (outHref.indexOf("?") == -1)      {       var ampPos = outHref.indexOf("&amp;");       if (ampPos != -1)        outHref = outHref.substring(0, ampPos);      }          if (searchshield.FilterUrl(outHref, this.filter_urls))      {       var destUrl = searchshield.getHrefFromCiteElement(tag);       if (destUrl)        return searchshield.checkUrl(searchshield.removeHtmlTags(destUrl));       return false;      }      return outHref;     }    }   }  } }    // no link to self else {  var parentNode = tag.parentNode;  if (parentNode)  {   var grandParentNode = tag.parentNode.parentNode;   if (grandParentNode)   {    if ((grandParentNode.tagName == "DIV") &amp;&amp;      (grandParentNode.className.toLowerCase() == "res2"))    {     // check for any images on the link     if (0 === tag.getElementsByTagName("IMG").length)      return tag.href;    }   }  } } // else nothing return false;}///////////////    AVG GOOGLE    //////////////////////////////    YAHOO SEARCH ENGINE    ///////////////searchshield.YahooSearchEngine = function(search){ searchshield.SearchEngine.call(this, search); this.showCleanVerdicts = false;};searchshield.YahooSearchEngine.prototype = new searchshield.SearchEngine();searchshield.YahooSearchEngine.prototype.constructor = searchshield.YahooSearchEngine;searchshield.YahooSearchEngine.prototype.name = "yahoo";searchshield.YahooSearchEngine.prototype.validSearch = function(href){ var uri; if (typeof(this.search) === 'undefined' || null === this.search)  uri = searchshield.parseLink(href); else  uri = this.search.uri; if(!uri || !uri.host)  return false; var domain = uri.host; // re stitch the uri path and query elements to // use existing logic var path = uri.path + uri.delimiter + uri.query; // For Yahoo the host must match: // search.yahoo.com  OR // xx.search.yahoo.com where xx is the country code OR // search.yahoo.co.jp OR // for Yahoo China: one.cn.yahoo.com, search.cn.yahoo.com or www.yahoo.cn if ((domain.match(/search\.yahoo\.co(?:m|\.jp)/i) ||  domain.match(/(?:search|one)\.cn\.yahoo\.com/i) ||  domain.match(/www\.yahoo\.cn/i)) &amp;&amp;   path.match(/^(?:search[;?]|s\?)/i)) {  return true; } return false;};searchshield.YahooSearchEngine.prototype.includeLink = function(tag){ var href  = ""; var outHref  = ""; var findStr  = ""; // yahoo likes to encode the url href = unescape(tag.href); if ((tag.className.indexOf("yschttl") != -1) ||   (tag.className.indexOf("spt") != -1)) {  var da = href.indexOf("**");  var ad = href.indexOf("*-");  if (da != -1)   outHref = href.substring(da+2);  else if (ad != -1)   outHref = href.substring(ad+2);  else   outHref = href ;     if (outHref.toLowerCase().indexOf("overture.") !== -1)   return false; } else if ((tag.tagName)   &amp;&amp;     (tag.tagName === "A")  &amp;&amp;     (!tag.className)) {  var tagParent = tag.parentNode;    // if anchor without className then search parentNodes  if ((tagParent) &amp;&amp;   (tagParent.tagName !== "EM") &amp;&amp;   (searchshield.getParentNodeByClassName("yst-web", tag, 4)))  {   // China Yahoo support   outHref = href;  }    else if ((tagParent) &amp;&amp;    (tagParent.tagName === "H3") &amp;&amp;    (!!searchshield.getParentNodeById("WS2m",tag, 5)))  {   // Japan Yahoo support   var da = href.indexOf("**");   if (da == -1)    outHref = href;   else    outHref = href.substring(da+2);  }  else if ((tagParent) &amp;&amp;    (tagParent.className !== "c") &amp;&amp;    (tagParent.parentNode.id !== "fpn") &amp;&amp;    (!!searchshield.getParentNodeByClassName("ymc", tag, 7)))  {   // Korea Yahoo support - when not caught by yschttl   var da = href.indexOf("**");   if (da !== -1)    outHref = href.substring(da+2);  } } else if (!this.onlyPrimaries) {  findStr = "&amp;yargs=";  var yargs = href.indexOf(findStr);  if (yargs != -1)  {   outHref = href.substring(yargs+findStr.length);   // check for prefix   if (outHref.indexOf("://") == -1)    outHref = "http://" + outHref;   // if inside an &lt;i&gt;, probably a paypal link, don't include   if (tag.parentNode &amp;&amp; (tag.parentNode.tagName == "I"))    return false;  }  } // filter domains // split the url based on '/' var parts = !!outHref ? outHref.split('/') : null; // Filter out domains that match any of the search engine's names if (!parts || !parts[2])  return false;   var domain = parts[2]; if ((domain.indexOf("rdrjp.yahoo.com") != -1) ||  (domain.indexOf("rdrkrs.yahoo.com") != -1) ||  (domain.indexOf("rdrtpe.yahoo.com") != -1) ||  (domain.indexOf("rdrird.yahoo.com") != -1) ||  (domain.indexOf("rdrhk2.yahoo.com") != -1) ||  (domain.indexOf("rdrsg1.yahoo.com") != -1) ||  (domain.indexOf("rdrin2.yahoo.com") != -1) ||  (domain.indexOf("rdre1.yahoo.com") != -1) ||  (domain.indexOf("rdrw1.yahoo.com") != -1)  ) {  return false; } // set for yahoo to get parent node for image insertion var hash = searchshield.avgCallFunc(this.doc, 'GetHash', outHref); tag.setAttribute("id", "xplid_" + hash); return outHref;};///////////////    YAHOO SEARCH ENGINE    //////////////////////////////    AVG YAHOO SEARCH ENGINE    ///////////////searchshield.AVGYahooSearchEngine = function(search){ searchshield.SearchEngine.call(this, search); this.showCleanVerdicts = false; this.omitAltImage = true; this.updateImageStyle = {  verticalAlign: null };};searchshield.AVGYahooSearchEngine.prototype = new searchshield.SearchEngine();searchshield.AVGYahooSearchEngine.prototype.constructor = searchshield.AVGYahooSearchEngine;searchshield.AVGYahooSearchEngine.prototype.name = "avgyahoo";searchshield.AVGYahooSearchEngine.prototype.validSearch = function(href){ var uri; if (typeof(this.search) === 'undefined' || null === this.search)  uri = searchshield.parseLink(href); else  uri = this.search.uri; if(!uri || !uri.host)  return false;  var domain= uri.host; //path may be 'avg/search' or 'search' var pathArray = uri.path.split("/"); var avg = pathArray[0]; // re stitch the uri path and query elements // to use existing logic var path = (undefined == pathArray[1]) ? pathArray[0] : pathArray[1];  path += uri.delimiter + uri.query; // For AVG Yahoo classic the host must match: // yhs.search.yahoo.com OR // .yhs.search.yahoo.com if (domain.indexOf("yhs.search.yahoo.co") != -1) {  if ((avg == "avg") &amp;&amp;   ((path.indexOf("search?") == 0) ||    (path.indexOf("search;") == 0)))  {   return true;  } }  // also support new metro version which DOESN'T  // contain /avg so avg split part is path // valid domains are: // search.yahoo.com,  // xx.search.yahoo.com and // search.yahoo.co.xx if (domain.indexOf("search.yahoo.co") != -1)  {  // path (split avg) must start with search and  // contain the avg toolbar parameter  if (((path.indexOf("search?") == 0) ||   (path.indexOf("search;") == 0)) &amp;&amp;   (path.indexOf("fr=yhs-avg") != -1))  {   return true;  } } return false;};searchshield.AVGYahooSearchEngine.prototype.includeLink = function(tag){ var href  = ""; var outHref  = ""; var findStr  = ""; if (this.search.doc.body.className.toLowerCase() != "standard") { // handle as std Yahoo results page  return searchshield.YahooSearchEngine.prototype.includeLink(tag); }  // yahoo likes to encode the url href = unescape(tag.href); if (tag.target == "_top") {  var da = href.indexOf("**");  if (da != -1)   outHref = href.substring(da+2);  else   outHref = href ;  if (outHref.toLowerCase().indexOf("overture.") !== -1)   return false; } else if (!this.onlyPrimaries) {  findStr = "&amp;yargs=";  var yargs = href.indexOf(findStr);  if (yargs != -1)  {   outHref = href.substring(yargs+findStr.length);   // check for prefix   if (outHref.indexOf("://") == -1)    outHref = "http://" + outHref;   // if inside an &lt;i&gt;, probably a paypal link, don't include   if (tag.parentNode &amp;&amp; (tag.parentNode.tagName == "I"))    return false;  }  } // filter domains // split the url based on '/' var parts = outHref.split('/'); // Filter out domains that match any of the search engine's names if (!parts[2])  return false;   var domain = parts[2]; if ((domain.indexOf("rdrjp.yahoo.com") != -1) ||  (domain.indexOf("rdrkrs.yahoo.com") != -1) ||  (domain.indexOf("rdrtpe.yahoo.com") != -1) ||  (domain.indexOf("rdrird.yahoo.com") != -1) ||  (domain.indexOf("rdrhk2.yahoo.com") != -1) ||  (domain.indexOf("rdrsg1.yahoo.com") != -1) ||  (domain.indexOf("rdrin2.yahoo.com") != -1) ||  (domain.indexOf("rdre1.yahoo.com") != -1) ||  (domain.indexOf("rdrw1.yahoo.com") != -1)  ) {  return false; } return outHref;};///////////////    AVG YAHOO SEARCH ENGINE    //////////////////////////////    MSN SEARCH ENGINE    ///////////////searchshield.MSNSearchEngine = function(search){ searchshield.SearchEngine.call(this, search); this.onlyPrimaries = false;};searchshield.MSNSearchEngine.prototype = new searchshield.SearchEngine();searchshield.MSNSearchEngine.prototype.constructor = searchshield.MSNSearchEngine;searchshield.MSNSearchEngine.prototype.name = "msn";searchshield.MSNSearchEngine.prototype.validSearch = function(href){ var uri; if (typeof(this.search) === 'undefined' || null === this.search)  uri = searchshield.parseLink(href); else  uri = this.search.uri; if(!uri || !uri.host)  return false; var hostMatch = false; var domain  = uri.host; // re stitch the uri path and query elements to // use existing logic var path = uri.path + uri.delimiter + uri.query; // For MSN the host must match: // search.msn.com  OR // search.live.com if (domain.indexOf("search.msn.co") &gt; -1) {  if (domain.charAt(13) == 'm')   hostMatch = true;  else if ((domain.charAt(13) == '.') &amp;&amp; (domain.length == 16))   hostMatch = true; } else if (domain.indexOf("search.live.co") &gt; -1) {  if (domain.charAt(14) == 'm')   hostMatch = true;  else if ((domain.charAt(14) == '.') &amp;&amp; (domain.length == 17))   hostMatch = true; }  if (hostMatch) {  if (path.indexOf("results.aspx") == 0)   return true; } return false;};searchshield.MSNSearchEngine.prototype.includeLink = function(tag){ var outHref = false;  // these don't seem common from Firefox, but they are in IE if (searchshield.DoesURLContain(tag.href, "g.msn.co")) {  var qPos = tag.href.indexOf("?");  if (qPos != -1)  {   var postPart = tag.href.substring(qPos+1);   var dblAmp = postPart.indexOf("&amp;&amp;");   if (dblAmp != -1)   {    outHref = postPart.substring(0, dblAmp);    return outHref;   }  } } else if (searchshield.DoesURLContain(tag.href, "r.msn.co")) {  var element = tag;  var parentNode = tag.parentNode;  // top links - check for a CITE  var spanElements = element.getElementsByTagName("CITE");  if ((spanElements != null)    &amp;&amp;    (spanElements.length &gt; 0))  {   outHref = spanElements[0].innerHTML;   // replace any nbsp's   outHref = outHref.replace("&amp;nbsp;", " ");   // url is after the last space in the html, after the '-'   var space_pos = outHref.lastIndexOf(" ");   if (space_pos != -1)    outHref = outHref.slice(space_pos + 1);   outHref = searchshield.checkUrl(outHref);   return outHref;  }    // side links   if (element.lastChild != null)  {   outHref = element.lastChild.innerHTML;   if ( outHref != null)   {    outHref = searchshield.checkUrl(outHref);    return outHref;   }  } } else if (searchshield.DoesURLContain(tag.href, this.search.uri.host)     ||    searchshield.DoesURLContain(tag.href, ".live.com")     ||    searchshield.DoesURLContain(tag.href, "msn.")      ||    searchshield.DoesURLContain(tag.href, "msnscache.com")    ||    searchshield.DoesURLContain(tag.href, "advertising.microsoft.co") ||    searchshield.DoesURLContain(tag.href, "javascript:")    ||    searchshield.DoesURLContain(tag.href, "go.microsoft.co")   ||    searchshield.DoesURLContain(tag.href, "hotmail.co")) {  // not a link  return false; } else if (tag.id.toLowerCase() == "trademarks") {  // don't link the trademark at the bottom of the page  return false; } else {  // include it  return tag.href; }};///////////////    MSN SEARCH ENGINE    //////////////////////////////    BING SEARCH ENGINE    ///////////////searchshield.BingSearchEngine = function(search){ searchshield.SearchEngine.call(this, search);};searchshield.BingSearchEngine.prototype = new searchshield.SearchEngine();searchshield.BingSearchEngine.prototype.constructor = searchshield.BingSearchEngine;searchshield.BingSearchEngine.prototype.name = "bing";searchshield.BingSearchEngine.prototype.validSearch = function(href){ var uri; if (typeof(this.search) === 'undefined' || null === this.search)  uri = searchshield.parseLink(href); else  uri = this.search.uri; if(!uri || !uri.host)  return false; var hostMatch = false; var domain  = uri.host; // re stitch the uri path and query elements to // use existing logic var path = uri.path + uri.delimiter + uri.query;  // For bing the host must match: // www.bing.com or www.bing.net // xx.bing.com or xx.bing.net where xx is a country code // bing.com.xx where xx is a country code // bing.search.xxxx.net where xxxx may be something like daum if ((domain.indexOf("www.bing.com") !== -1) ||  (domain.indexOf("www.bing.net") !== -1) ||  (domain.indexOf("bing.net") !== -1)) {  hostMatch = true; } else if ((domain.indexOf("bing.search.") !== -1) &amp;&amp;     (domain.indexOf(".net") === (domain.length-4)))  { //bing.search.xxxx.net  hostMatch = true; } else { // xx.bing.com or bing.com.xx  var domainLen = domain.length;  var tldPos = domain.indexOf(".bing.com");  if (tldPos &gt; -1)  {   if ((domainLen - tldPos) == 9)    hostMatch = true;  }  }  if (hostMatch) {  var displayStyle = (domain == 'bing.search.daum.net') ? 'inline-block' : 'inline';  this.addAnchorStyle = {   display: displayStyle  };    if (path.indexOf("search?") == 0)   return true; } return false;};searchshield.BingSearchEngine.prototype.includeLink = function(tag){ var outHref = false; if (tag.tagName == 'IMG') { //no images   return false; }   if (tag.href.charAt(0) == '/') { //no relative links  return false; } if (/trademarks/i.test(tag.id)) {  // don't link the trademark at the bottom of the page  return false; }  if ((tag.parentNode) &amp;&amp; (/sc_stc/i.test(tag.parentNode.id))) { // don't verdict the social sites - our verdict doesn't fit  return false; } else if (!!searchshield.getParentNodeByClassName("sw_t",tag,3)) { // no links in page header  return false; } else if (searchshield.DoesURLContain(tag.href, "r.msn.co") ||    searchshield.DoesURLContain(tag.href, "overture.com")) { // france has r.msn.co and italy has overture.com sponsored links  // with the link in CITE element    var spanElements = null;    // top links - check for a CITE  spanElements = tag.getElementsByTagName("CITE");  if ((spanElements == null) || (spanElements.length &lt;= 0))  {   if (tag.parentNode &amp;&amp; tag.parentNode.parentNode)    spanElements = tag.parentNode.parentNode.getElementsByTagName("CITE");  }    if ((spanElements != null) &amp;&amp; (spanElements.length &gt; 0))  {   outHref = spanElements[0].innerHTML;   if (outHref != null)   {    // replace any nbsp's    outHref = outHref.replace("&amp;nbsp;", " ");    // url is after the last space in the html, after the '-'    var space_pos = outHref.lastIndexOf(" ");    if (space_pos != -1)     outHref = outHref.slice(space_pos + 1);    outHref = searchshield.checkUrl(outHref);    // save the link    return outHref;   }  }    // side links   if (tag.lastChild != null)  {   outHref = tag.lastChild.innerHTML;   if (outHref != null)   {    outHref = searchshield.checkUrl(outHref);    // save the link    return outHref;   }  } } // no sponsored links for now  else if (searchshield.DoesURLContain(tag.href, this.search.uri.host) ||   searchshield.DoesURLContain(tag.href, ".live.com")    ||   searchshield.DoesURLContain(tag.href, ".bing.com")    ||   searchshield.DoesURLContain(tag.href, ".bing.net")    ||   searchshield.DoesURLContain(tag.href, ".daum.net")    ||   searchshield.DoesURLContain(tag.href, ".gmarket.co")   ||   searchshield.DoesURLContain(tag.href, ".multimap.com")   ||   searchshield.DoesURLContain(tag.href, "msn.")     ||   searchshield.DoesURLContain(tag.href, "ms.ciao.")    ||   searchshield.DoesURLContain(tag.href, "ms.ciao-")    ||   searchshield.DoesURLContain(tag.href, "advertising.microsoft.co") ||   searchshield.DoesURLContain(tag.href, "javascript:")    ||   searchshield.DoesURLContain(tag.href, "go.microsoft.co")   ||   searchshield.DoesURLContain(tag.href, "hotmail.co")     ||   searchshield.DoesURLContain(tag.href, "cc.bingj.com")    ||   searchshield.DoesURLContain(tag.href, "microsofttranslator.com") ||   searchshield.DoesURLContain(tag.href, ".engkoo.com")    ||   searchshield.DoesURLContain(tag.href, "sealinfo.verisign.com")  ||   searchshield.DoesURLContain(tag.href, "explabs.com")    ||   searchshield.DoesURLContain(tag.href, "onlinehelp.microsoft.com") ||   searchshield.DoesURLContain(tag.href, ".myoverture")) {  // not a link  return false; } else  return tag.href;};searchshield.BingSearchEngine.prototype.addImage = function(node, image, hidden){ var element = node.element; var parentNode  = node.element.parentNode; var grandParentNode = !!parentNode ? parentNode.parentNode : null; // if there are redundant links in the same grandparent then skip them if (!!grandParentNode) {  gpChildren = grandParentNode.childNodes;  for (var i=0; i &lt; gpChildren.length; i++)  {   if (!!element.href &amp;&amp; gpChildren[i].tagName == "A" &amp;&amp; gpChildren[i].href == element.href)    return;  } } var parent = searchshield.SearchEngine.prototype.addImage; return parent.call(this, node, image, hidden);};///////////////    BING SEARCH ENGINE    //////////////////////////////    BAIDU SEARCH ENGINE    ///////////////searchshield.BaiduSearchEngine = function(search){ searchshield.SearchEngine.call(this, search); this.updateImageStyle = {  verticalAlign: null };};searchshield.BaiduSearchEngine.prototype = new searchshield.SearchEngine();searchshield.BaiduSearchEngine.prototype.constructor = searchshield.BaiduSearchEngine;searchshield.BaiduSearchEngine.prototype.name = "baidu";searchshield.BaiduSearchEngine.prototype.validSearch = function(href){ var uri; if (typeof(this.search) === 'undefined' || null === this.search)  uri = searchshield.parseLink(href); else  uri = this.search.uri; if(!uri || !uri.host)  return false; var hostMatch = false; var domain  = uri.host; // re stitch the uri path and query elements to // use existing logic var path = uri.path + uri.delimiter + uri.query;  if (domain == "www.baidu.com" || path.indexOf("testBaidu") !== -1)  hostMatch = true;   if (hostMatch) {  if (path.indexOf("s?") == 0)   return true; } return false;};searchshield.BaiduSearchEngine.prototype.includeLink = function(tag){    if (tag.className &amp;&amp; tag.className == "m")   return false;  if (searchshield.DoesURLContain(tag.href, this.search.uri.host))   return false;  else   {   // no link to self   var traverseElement = tag.parentNode;   while ( traverseElement &amp;&amp; traverseElement.className != "tbody")   {    if (traverseElement.className == "f")     return tag.href;    traverseElement = traverseElement.parentNode;   }      return false;  }};///////////////    BAIDU SEARCH ENGINE    //////////////////////////////    EARTHLINK SEARCH ENGINE    ///////////////searchshield.EarthlinkSearchEngine = function(search){ searchshield.SearchEngine.call(this, search); this.onlyPrimaries = false; this.addAnchorStyle = {  position: "static" };};searchshield.EarthlinkSearchEngine.prototype = new searchshield.SearchEngine();searchshield.EarthlinkSearchEngine.prototype.constructor = searchshield.EarthlinkSearchEngine;searchshield.EarthlinkSearchEngine.prototype.name = "earthlink";searchshield.EarthlinkSearchEngine.prototype.validSearch = function(href){ var uri; if (typeof(this.search) === 'undefined' || null === this.search)  uri = searchshield.parseLink(href); else  uri = this.search.uri; if(!uri || !uri.host)  return false; var hostMatch = false; var domain  = uri.host; // re stitch the uri path and query elements to // use existing logic var path = uri.path + uri.delimiter + uri.query; // For EarthLink the host must match: // search.earthlink.net if (("search.earthlink.net" == domain) &amp;&amp;  (path.indexOf("search?") == 0)) {  return true; } return false;};searchshield.EarthlinkSearchEngine.prototype.includeLink = function(tag){ var outHref = ""; var findStr = ""; // check for an anchor if (tag.tagName == "A") {  // check for sponsored  if (tag.id.indexOf("a") == 0)  {   var q = tag.href.indexOf("&amp;q=");   var qlen = 3;   if (q == -1)   {    q = tag.href.indexOf("&amp;adurl=");    qlen = 7;    if (q == -1)     return false;   }   // find end of url   var end = tag.href.indexOf("&amp;", q+qlen);   if (end &lt; 0)    end = tag.href.length;   // add the link   outHref = tag.href.substring(q+qlen, end);      if (searchshield.FilterUrl(outHref, this.filter_urls))    return false;       return outHref;  }  // don't search url's to self  if ((tag.href.indexOf("://") == -1) || searchshield.DoesURLContain(tag.href, this.search.uri.host))   return false;  // if a normal web result add it  if (tag.parentNode &amp;&amp; (tag.parentNode.tagName == "H3") &amp;&amp;   tag.parentNode.parentNode &amp;&amp; (tag.parentNode.parentNode.tagName == "LI") &amp;&amp;   tag.parentNode.parentNode.parentNode &amp;&amp; (tag.parentNode.parentNode.parentNode.tagName == "UL"))  {   if (searchshield.FilterUrl(tag.href, this.filter_urls))    return false;       return tag.href;  } }  return false;};///////////////    EARTHLINK SEARCH ENGINE    //////////////////////////////    AOL SEARCH ENGINE    ///////////////searchshield.AOLSearchEngine = function(search){ searchshield.SearchEngine.call(this, search);  this.addImageStyle = {  display: "inline" }; this.addAnchorStyle = {  display: null }; this.updateImageStyle = {  verticalAlign: null,  display: "inline" };};searchshield.AOLSearchEngine.prototype = new searchshield.SearchEngine();searchshield.AOLSearchEngine.prototype.constructor = searchshield.AOLSearchEngine;searchshield.AOLSearchEngine.prototype.name = "aol";searchshield.AOLSearchEngine.prototype.validSearch = function(href){ var uri; if (typeof(this.search) === 'undefined' || null === this.search)  uri = searchshield.parseLink(href); else  uri = this.search.uri; if(!uri || !uri.host)  return false;  var domain = uri.host; //path may be 'aol/search' or 'search' var pathArray = uri.path.split("/"); var aol = pathArray[0]; // re stitch the uri path and query elements // to use existing logic var path = (undefined == pathArray[1]) ? pathArray[0] : pathArray[1];  path += uri.delimiter + uri.query; if (/search\.aol\.com/.test(domain)) {  if ((aol == "aol") &amp;&amp;   (path.indexOf("search?") == 0))  {   return true;  } }  return false;};searchshield.AOLSearchEngine.prototype.includeLink = function(tag){ if (searchshield.DoesURLContain(tag.href, this.search.uri.host))  return false;  // sponsored links - google if ((tag.className) &amp;&amp; (tag.className.indexOf("slLink topAnchor") != -1)) { //parse for embedded href  if (tag.href.indexOf("/aclk?sa=") == -1)   return false;  var adurl = tag.href.indexOf("&amp;adurl=http");  // if an adurl the destination href can be acquired from the onclick handler  if (adurl != -1)  {   var destUrl;   var clickHandler = tag.getAttribute('onclick');   if (clickHandler != null)   {    // the destination href is the 2nd parameter (zero-based array)    destUrl = searchshield.getClickHandlerParams(clickHandler)[1];    if (destUrl != null)    {     destUrl = searchshield.removeHtmlTags(destUrl.replace(/'/g,''));     return searchshield.checkUrl(destUrl);    }   }  }  return false; } if (tag.className == "find")  return tag.href;   return false;};searchshield.AOLSearchEngine.prototype.insertNodes = function(node, doc){ var element = node.element; var score = node.score; if (element &amp;&amp; element.className &amp;&amp; element.className.indexOf("slLink") != -1) { //sponsored links only  // for alt image  if (score == searchshield.SCORE_SS_VERISIGN)   return [element.nextSibling, element.parentNode];  // for verdict image  var cN = element.childNodes;  var cnLen = cN.length;  for (var i=0; i &lt; cnLen; i++)  {   if ((cN[i].nodeType == 1) &amp;&amp;     (cN[i].nodeName == 'SPAN') &amp;&amp;     ((cN[i].className == 'title') || (cN[i].className == 'durl')))    return [cN[i].nextSibling, cN[i].parentNode];  } } var parent = searchshield.SearchEngine.prototype.insertNodes; return parent.call(this, node, doc);};///////////////    AOL SEARCH ENGINE    //////////////////////////////    ASK SEARCH ENGINE    ///////////////searchshield.AskSearchEngine = function(search){ searchshield.SearchEngine.call(this, search);};searchshield.AskSearchEngine.prototype = new searchshield.SearchEngine();searchshield.AskSearchEngine.prototype.constructor = searchshield.AskSearchEngine;searchshield.AskSearchEngine.prototype.name = "ask";searchshield.AskSearchEngine.prototype.validSearch = function(href){ var uri; if (typeof(this.search) === 'undefined' || null === this.search)  uri = searchshield.parseLink(href); else  uri = this.search.uri; if(!uri || !uri.host)  return false;  var domain= uri.host; // re stitch the uri path and query elements // to use existing logic var path = uri.path + uri.delimiter + uri.query;  if ("www.ask.com" == domain) {  if (path.indexOf("web?") == 0)   return true; } return false;};searchshield.AskSearchEngine.prototype.includeLink = function(tag){ var outHref = ""; var findStr = ""; if (searchshield.DoesURLContain(tag.href, this.search.uri.host))  return false;  if ((tag.className) &amp;&amp; (tag.className.indexOf("nu") != -1) &amp;&amp; (tag.className.indexOf("info") == -1))  {  // exclude green links  if ((tag.firstChild) &amp;&amp;   (tag.firstChild.className) &amp;&amp;   (tag.firstChild.className.indexOf('attrib') == 0))  {   return false;  }  // ads link to google with class nu  findStr = "www.google.com";  if (tag.href.indexOf(findStr) != 0)  {   if (tag.href.indexOf(findStr + "/aclk?sa=") != -1)   {     findStr = "&amp;adurl=http";    var pos = tag.href.indexOf(findStr);    if (pos != -1)    {     pos += 7;     outHref = tag.href.substring(pos);     outHref = unescape(outHref);     if (searchshield.FilterUrl(outHref, this.filter_urls))       return false;     return outHref;    }   }  }  else  { // ad not to google just use href   outHref = tag.href;   if (searchshield.FilterUrl(outHref, this.filter_urls))    return false;   return outHref;  } } // primary results have class containing title or L2 ( Wikipedia links ) else if ((tag.className) &amp;&amp; ((tag.className.indexOf("title") != -1) || (tag.className.toLowerCase() == "l2"))) {  outHref = tag.href;  if (searchshield.FilterUrl(outHref, this.filter_urls))   return false;  return outHref; }  return false;};///////////////    ASK SEARCH ENGINE    //////////////////////////////    ALTAVISTA SEARCH ENGINE    ///////////////searchshield.AltaVistaSearchEngine = function(search){ searchshield.SearchEngine.call(this, search);};searchshield.AltaVistaSearchEngine.prototype = new searchshield.SearchEngine();searchshield.AltaVistaSearchEngine.prototype.constructor = searchshield.AltaVistaSearchEngine;searchshield.AltaVistaSearchEngine.prototype.name = "altavista";searchshield.AltaVistaSearchEngine.prototype.validSearch = function(href){ var uri; if (typeof(this.search) === 'undefined' || null === this.search)  uri = searchshield.parseLink(href); else  uri = this.search.uri; if(!uri || !uri.host)  return false;  var domain= uri.host;  // re stitch the uri path and query elements // to use existing logic var path = uri.path + uri.delimiter + uri.query; // www.atlavista.com ---&gt; now http://us.yhs4.search.yahoo.com/yhs/search?fr=altavista&amp;fr=altavista&amp;itag=ody&amp;q=warez&amp;kgs=1&amp;kls=0 // xx.altavista.com where xx is a country code var hostMatch = false; if ("www.altavista.com" == domain) {  hostMatch = true; } else {  // xx.altavista.com  var pDest = domain.indexOf(".altavista.com");  if ((pDest != -1 ) &amp;&amp; ((domain.length - pDest) == 14))  {   hostMatch = true;  }  else  {   // a reference to altavista must be present in yahoo search url   var pRef = (uri.qsArray.fr &amp;&amp; uri.qsArray.fr == 'altavista');   pDest = domain.indexOf("search.yahoo.com");   if (pDest != -1 &amp;&amp; pRef)    hostMatch = true;  } } if (hostMatch) {  //path must start with web/results?  if ((path.indexOf("yhs/search?") == 0) ||   (path.indexOf("search;") == 0)  ||   (path.indexOf("yhs/search;") == 0) ||   (path.indexOf("web/results?") == 0)||   (path.indexOf("fr=altavista") != -1))  {   return true;  } }  return false;};searchshield.AltaVistaSearchEngine.prototype.includeLink = function(tag){ var outHref = ""; var findStr = ""; // initial checks if ((!tag.href) ||   (tag.href.charAt(0) == '#') ||  (tag.href.indexOf("javascript:") == 0)) {  return false; }   if (searchshield.DoesURLContain(tag.href, this.search.uri.host))  return false;  var spnsdLinks = searchshield.getParentNodeByTagName("DIV", tag, "className"); if ((spnsdLinks) &amp;&amp;  (spnsdLinks.className.indexOf('ads') &gt; -1)) // sponsored links {  if (!tag.parentNode)   return false;  // parse ads for em tag  var baseNode;  if (spnsdLinks.className.indexOf('ads horiz') &gt; -1) // horizontal ads sections   baseNode = tag.parentNode.parentNode;  else   baseNode = tag.parentNode;    if (!baseNode || !baseNode.lastChild || baseNode.lastChild.tagName != 'EM')   return false;  var outHref = searchshield.removeHtmlTags(baseNode.lastChild.innerHTML);  return outHref; }  if ((tag.className == "spt") ||   (tag.className == "res") ||  (tag.className == "yschttl spt")) {  findStr = "/**";  var pos = tag.href.indexOf(findStr);  if (pos != -1)  {   pos += 3;   outHref = tag.href.substring(pos);   outHref = unescape(outHref);      // no results for overture.com &amp; no yahoo domains   chkHref = outHref.toLowerCase();   if (chkHref.indexOf("overture.") != -1)    return false;   // split the url based on '/'   var parts = outHref.split('/');   // only need a domain   if ((parts != null) &amp;&amp; (parts[2] != null))   {    var domain = parts[2];    if ((domain.indexOf("rdrjp.yahoo.com") != -1) ||     (domain.indexOf("rdrkrs.yahoo.com") != -1) ||     (domain.indexOf("rdrtpe.yahoo.com") != -1) ||     (domain.indexOf("rdrird.yahoo.com") != -1) ||     (domain.indexOf("rdrhk2.yahoo.com") != -1) ||     (domain.indexOf("rdrsg1.yahoo.com") != -1) ||     (domain.indexOf("rdrin2.yahoo.com") != -1) ||     (domain.indexOf("rdre1.yahoo.com") != -1) ||     (domain.indexOf("rdrw1.yahoo.com") != -1)  )    {     return false    }   }   return outHref;  }  else  {   return tag.href;  } }  return false;};searchshield.AltaVistaSearchEngine.prototype.getImgElement = function (element){ while (element != null)  {  element = element.nextSibling;  if (element != null)  {   if ((element.id == null) || (element.id.indexOf("LXPLSS_") == -1))   {   // not our id but hit another anchor no verdict    if (element.tagName == "A")    {     element = null;     break;    }   }   else if (element.tagName == "A")    break;  } }   var rtnElem = !!element ? element.firstChild : element; return rtnElem;};///////////////    ALTAVISTA SEARCH ENGINE    //////////////////////////////    YANDEX SEARCH ENGINE    ///////////////searchshield.YandexSearchEngine = function(search){ searchshield.SearchEngine.call(this, search);};searchshield.YandexSearchEngine.prototype = new searchshield.SearchEngine();searchshield.YandexSearchEngine.prototype.constructor = searchshield.YandexSearchEngine;searchshield.YandexSearchEngine.prototype.name = "yandex";searchshield.YandexSearchEngine.prototype.validSearch = function(href){ var uri; if (typeof(this.search) === 'undefined' || null === this.search)  uri = searchshield.parseLink(href); else  uri = this.search.uri; if(!uri || !uri.host)  return false;  var domain= uri.host; // re stitch the uri path and query elements // to use existing logic var path = uri.path + uri.delimiter + uri.query; if ((domain.match(/yandex\.com|by|kz|ru|ua/i)) &amp;&amp;  (path.indexOf("yandsearch?") == 0)) {  return true; }  return false;};searchshield.YandexSearchEngine.prototype.includeLink = function(tag){ if (tag.href.indexOf("/search") != -1) {  return false; }  if (searchshield.DoesURLContain(tag.href, this.search.uri.host) ||  searchshield.DoesURLContain(tag.href, ".yandex.net")  ||  searchshield.DoesURLContain(tag.href, ".yandex.ru")   ||  searchshield.DoesURLContain(tag.href, "moikrug.ru")   ||  searchshield.DoesURLContain(tag.href, "ya.ru")    ||  searchshield.DoesURLContain(tag.href, ".yandex.com")  ||  searchshield.DoesURLContain(tag.href, "yandex.st")) {  return false; }   parentNode = tag.parentNode; if ((tag.parentNode)   &amp;&amp;   (tag.parentNode.parentNode) &amp;&amp;  (tag.parentNode.parentNode.className.toLowerCase() == "moreinfo")) {  return false; }  return tag.href;};searchshield.YandexSearchEngine.prototype.getImgElement = function (element){ while (element != null)  {  element = element.nextSibling;  if (element != null)  {   if ((element.id == null) || (element.id.indexOf("LXPLSS_") == -1))   {   // not our id but hit another anchor no verdict    if (element.tagName == "A")    {     element = null;     break;    }   }   else if (element.tagName == "A")    break;  } }   var rtnElem = !!element ? element.firstChild : element; return rtnElem;};///////////////    YANDEX SEARCH ENGINE    //////////////////////////////    SEZNAM SEARCH ENGINE    ///////////////searchshield.SeznamSearchEngine = function(search){ searchshield.SearchEngine.call(this, search); this.elementAttribute = {  width: "18",  height: "18" }; this.updateImageStyle = {  width: "18px",  height: "18px" };};searchshield.SeznamSearchEngine.prototype = new searchshield.SearchEngine();searchshield.SeznamSearchEngine.prototype.constructor = searchshield.SeznamSearchEngine;searchshield.SeznamSearchEngine.prototype.name = "seznam";searchshield.SeznamSearchEngine.prototype.validSearch = function(href){ var uri; if (typeof(this.search) === 'undefined' || null === this.search)  uri = searchshield.parseLink(href); else  uri = this.search.uri; if(!uri || !uri.host)  return false;  var domain= uri.host; // re stitch the uri path and query elements // to use existing logic var path = uri.path + uri.delimiter + uri.query; if ((domain.indexOf("search.seznam.cz") &gt; -1) &amp;&amp;  ((path.indexOf("?") == 0) || (path.indexOf("svet") == 0))) {  return true; }  return false;};searchshield.SeznamSearchEngine.prototype.includeLink = function(tag){ if (searchshield.DoesURLContain(tag.href, this.search.uri.host))  return false;  var parentNode = tag.parentNode; if (parentNode) {  var grandParentNode = tag.parentNode.parentNode;  if ((parentNode.tagName == "SPAN") &amp;&amp;    ((parentNode.className.toLowerCase() == "sklik-url") ||   (parentNode.className.toLowerCase() == "sklik-title")))  { // locate the real url and unencode it   var urlPos = tag.href.indexOf("&amp;url=http");   if (urlPos != -1)   {    urlPos += 5;     outHref = tag.href.substring(urlPos);    outHref = unescape(outHref);    return outHref;   }  }  else if (grandParentNode)   {   var greatGrandParentNode = tag.parentNode.parentNode.parentNode;   if ((grandParentNode.tagName == "DIV") &amp;&amp;    ((grandParentNode.className.toLowerCase() == "text") || (grandParentNode.className.toLowerCase() == "hlasky otz")))   { // standard link    return tag.href;   }   else if (greatGrandParentNode &amp;&amp; greatGrandParentNode.tagName == "DIV" &amp;&amp;     (greatGrandParentNode.className.toLowerCase() == "hotlinks"))    { // hint link    return tag.href;   }     } }  return false;};///////////////    SEZNAM SEARCH ENGINE    //////////////////////////////    WEBHLEDANI SEARCH ENGINE    ///////////////searchshield.WebhledaniSearchEngine = function(search){ searchshield.SearchEngine.call(this, search);};searchshield.WebhledaniSearchEngine.prototype = new searchshield.SearchEngine();searchshield.WebhledaniSearchEngine.prototype.constructor = searchshield.WebhledaniSearchEngine;searchshield.WebhledaniSearchEngine.prototype.name = "webhledani";searchshield.WebhledaniSearchEngine.prototype.validSearch = function(href){ var uri; if (typeof(this.search) === 'undefined' || null === this.search)  uri = searchshield.parseLink(href); else  uri = this.search.uri; if(!uri || !uri.host)  return false;  var domain= uri.host; // re stitch the uri path and query elements // to use existing logic var path = uri.path + uri.delimiter + uri.query; if ((domain.indexOf("webhledani.cz") &gt; -1) &amp;&amp;  (path.indexOf("results.aspx?") == 0)) {  return true; }  return false;};searchshield.WebhledaniSearchEngine.prototype.includeLink = function(tag){ if (tag.href.indexOf("/redir.aspx?") != -1) {  var ancestorNode;  // sponsored link  if ((ancestorNode = searchshield.getParentNodeByClassName("results sponsored", tag, 3)) != null)  {   if ((ancestorNode = searchshield.getParentNodeByClassName("res1", tag, 2)) != null)   {        var spanSibling = ancestorNode.nextSibling;    while (spanSibling.nodeName != 'SPAN')    {     spanSibling = spanSibling.nextSibling;     if (spanSibling.nodeName == 'DIV' || spanSibling.className == 'res1')     {      spanSibling = null;      break;     }    }    if (spanSibling)      outHref = spanSibling.innerHTML;   }   if (outHref)    return searchshield.checkUrl(searchshield.removeHtmlTags(outHref));   }   if ((ancestorNode = searchshield.getParentNodeByClassName("right-sponsored", tag, 3)) != null)  {   var outHref;   if ((ancestorNode = searchshield.getParentNodeByClassName("res3", tag, 2)) != null)   {        var spanSibling = ancestorNode.nextSibling;    while (spanSibling.nodeName != 'SPAN')    {     spanSibling = spanSibling.nextSibling;     if (spanSibling.nodeName == 'DIV' || spanSibling.className == 'res3')     {      spanSibling = null;      break;     }    }    if (spanSibling)      outHref = spanSibling.innerHTML;   }   if (outHref)    return searchshield.checkUrl(searchshield.removeHtmlTags(outHref));   }  // result link  if (searchshield.getParentNodeByClassName("results", tag, 3) != null)  {   if ((ancestorNode = searchshield.getParentNodeByClassName("res2", tag, 2)) != null)   {    if (tag.parentNode &amp;&amp; (tag.parentNode.nodeName != 'P'))     return getLinkHref(ancestorNode);   }  } } return false; function getLinkHref(aNode) {  var spanElems = aNode.getElementsByTagName('span');  for (var i=0; i &lt; spanElems.length; i++)  {   if (spanElems[i].className != 'site')    continue;   var outAnchor = spanElems[i].getElementsByTagName('a')[0];   if (outAnchor == null)    outAnchor = spanElems[i];   return searchshield.checkUrl(searchshield.removeHtmlTags(outAnchor.innerHTML));  }  return false; }};///////////////    WEBHLEDANI SEARCH ENGINE    //////////////////////////////    EBAY SEARCH ENGINE    ///////////////searchshield.eBaySearchEngine = function(search){ searchshield.SearchEngine.call(this, search);};searchshield.eBaySearchEngine.prototype = new searchshield.SearchEngine();searchshield.eBaySearchEngine.prototype.constructor = searchshield.eBaySearchEngine;searchshield.eBaySearchEngine.prototype.name = "ebay";searchshield.eBaySearchEngine.prototype.validSearch = function(href){ var uri; if (typeof(this.search) === 'undefined' || null === this.search)  uri = searchshield.parseLink(href); else  uri = this.search.uri; if(!uri || !uri.host)  return false;  var domain= uri.host; // shop.ebay.xx // shop.xxxx.ebay.xx like shop.benl.ebay.be // search.auction.co.kr  var path = uri.path + uri.delimiter + uri.query;  if ((domain.indexOf("shop.ebay") &gt; -1) ||  (domain.indexOf("shop.benl.ebay") &gt; -1)) {  if ((path.indexOf("?_from=") == 0) ||   (path.indexOf("i.html") &gt; -1))  {   return true;  } }  // ebay.se if ((domain.indexOf("search.eim.ebay") &gt; -1) &amp;&amp;  ((path.indexOf("?kw=") &gt; -1) || (path.indexOf("?ev=") &gt; -1))) {  return true; }  if ((domain.indexOf("search.auction.co.kr") &gt; -1 ) &amp;&amp;  ((path.indexOf("?keyword=") &gt; -1))) {  // would normally set these properties in the constructor or in an  // overriding function but they're only required for this domain     // links are in iframes  this.processFrames = true;    // must downsize verdicts for proper display  this.elementAttribute = {   width: "16",   height: "16"  };  this.updateImageStyle = {   width: "16px",   height: "16px"  };    return true; } // latin america ebay // listado.mercadolibre.com.xx or listado.mercadolibre.co.xx //   or listado.mercadolibre.xx or //   category.mercadolibre.com.xx or listado.mercadolibre.xx/category // lista.mercadolivre.com.xx or lista.mercadolivre.com.xx/category if ((domain.indexOf("www.") == -1) &amp;&amp;  ((domain.indexOf(".mercadolibre.") &gt; -1 ) ||   (domain.indexOf(".mercadolivre.") &gt; -1 )))  {  return true; } return false;};searchshield.eBaySearchEngine.prototype.includeLink = function(tag){ var parentNode = null; var outHref = false;  if (searchshield.DoesURLContain(tag.href, this.search.uri.host))  return false;  if ( tag.href.indexOf(".ebayrtm.com/clk?") &gt; -1 ) {  if ( tag.title == null || tag.title.length &lt; 0 )   return false;       outHref = searchshield.removeHtmlTags(tag.title);  if (outHref.indexOf(" ") == -1)  { // no spaces   if (outHref.indexOf(".") &gt; -1)   { // at least one dot     if (outHref.indexOf(this.search.uri.host) == -1)    { // no host     if (outHref.toLowerCase().indexOf("ebay.com") == -1)     {      return outHref;     }    }   }  }    } // ebay.se - Google ads parentNode = tag.parentNode; if (parentNode &amp;&amp; (parentNode.className.toLowerCase() == "google-ad-link")) {  if (tag.href.indexOf("/aclk?sa=") != -1)  {    findStr = "&amp;adurl=http";   var urlPos = tag.href.indexOf(findStr);   if (urlPos != -1)   {    urlPos += 7; // puts it on the http    outHref = tag.href.substring(urlPos);        // extract any fragment text, shouldn't be unescaped    var pound = outHref.indexOf("#");     if (pound != -1)    {     var fragment = outHref.substring(pound);     outHref = outHref.substring(0, pound);     outHref = unescape(outHref);     outHref += fragment;     if (searchshield.FilterUrl(outHref, this.filter_urls))      return false;     return outHref;    }    outHref = unescape(outHref);    if (outHref.indexOf("?") == -1)    {     var ampPos = outHref.indexOf("&amp;");     if (ampPos != -1)      outHref = outHref.substring(0, ampPos);    }        if (searchshield.FilterUrl(outHref, this.filter_urls))     return false;    return outHref;   }  } }  // auction.co.kr parentNode = tag.parentNode; if (parentNode &amp;&amp; (parentNode.className.toLowerCase() == "link")) {  if (tag.href.indexOf("adcr.naver.com") &gt; -1)  {   outHref = tag.innerText;   if ((outHref == null) || (outHref.length &lt; 0))    return false;       return outHref;  } }  // latin america ebay if ( tag.href.toLowerCase().indexOf("clickcounter?") &gt; -1 ) {  var spanElements = tag.getElementsByTagName("span");  if ((spanElements != null)    &amp;&amp;    (spanElements.length &gt; 0))  {   if ( spanElements[0].className.toLowerCase() == "mclics-url" )   {    outHref = spanElements[0].innerHTML;    if ( outHref == null || outHref.length &lt; 0 )     return false;    outHref = searchshield.removeHtmlTags(outHref);    if (outHref.indexOf(" ") == -1)    { // no spaces     if (outHref.indexOf(".") &gt; -1)     { // at least one dot       if ((outHref.toLowerCase().indexOf("mercadolibre") == -1) &amp;&amp;        (outHref.toLowerCase().indexOf("mercadolivre") == -1))       {       return outHref;      }     }    }   }  } }  return false;};///////////////    EBAY SEARCH ENGINE    //////////////////////////////    DIGG SEARCH ENGINE    ///////////////searchshield.DiggSearchEngine = function(search){ searchshield.SearchEngine.call(this, search); this.new_links = false;};searchshield.DiggSearchEngine.prototype = new searchshield.SearchEngine();searchshield.DiggSearchEngine.prototype.constructor = searchshield.DiggSearchEngine;searchshield.DiggSearchEngine.prototype.name = "digg";searchshield.DiggSearchEngine.prototype.validSearch = function(href){ var uri; if (typeof(this.search) === 'undefined' || null === this.search)  uri = searchshield.parseLink(href); else  uri = this.search.uri; if(!uri || !uri.host)  return false;  var domain= uri.host; // re stitch the uri path and query elements // to use existing logic var path = uri.path + uri.delimiter + uri.query;  if ((domain.indexOf("digg.com") &gt; -1) &amp;&amp;  (path.indexOf("/ad") == -1)) {  return true; }  return false;};searchshield.DiggSearchEngine.prototype.includeLink = function(tag){ var outHref = false; var findStr = "";  if ((tag.parentNode) &amp;&amp;  (tag.parentNode.className.toLowerCase() == "digg-count")) {  return false; }  if (searchshield.DoesURLContain(tag.href, this.search.uri.host)) {  if (tag.className &amp;&amp; tag.className.indexOf('source') != -1)  {   findStr = "/search?q=site:";   var urlPos = tag.href.indexOf(findStr);   if (urlPos != -1)   {    urlPos += 15;    outHref = tag.href.substring(urlPos);    return outHref;   }  } }  return false;};searchshield.DiggSearchEngine.prototype.addImage = function(node, image, hidden){ // remove style that is set when alt image is applied this.addAnchorStyle = {  background: "none" };   var parent = searchshield.SearchEngine.prototype.addImage; return parent.call(this, node, image, hidden);};///////////////    DIGG SEARCH ENGINE    //////////////////////////////    SLASHDOT SEARCH ENGINE    ///////////////searchshield.SlashdotSearchEngine = function(search){ searchshield.SearchEngine.call(this, search); this.showCleanVerdicts = false; this.new_links = false; this.type = 'inline';};searchshield.SlashdotSearchEngine.prototype = new searchshield.SearchEngine();searchshield.SlashdotSearchEngine.prototype.constructor = searchshield.SlashdotSearchEngine;searchshield.SlashdotSearchEngine.prototype.name = "slashdot";searchshield.SlashdotSearchEngine.prototype.validSearch = function(href){ var uri; if (typeof(this.search) === 'undefined' || null === this.search)  uri = searchshield.parseLink(href); else  uri = this.search.uri; if(!uri || !uri.host)  return false;  var domain= uri.host; // re stitch the uri path and query elements // to use existing logic var path = uri.path + uri.delimiter + uri.query;  if (domain.indexOf("slashdot.org") != -1) {  return true; }  return false;};searchshield.SlashdotSearchEngine.prototype.includeLink = function(tag){ if (searchshield.DoesURLContain(tag.href, this.search.uri.host))  return false;   if ( tag.href.indexOf("mailto:") != -1 )  return false;   if ( tag.href.indexOf("slashdot.org") != -1 )  return false;   if (tag.parentNode &amp;&amp; (tag.parentNode.tagName == "DIV")) {  if (tag.parentNode.id.indexOf("text-") != -1)  {   return tag.href;  } } else if ( tag.parentNode &amp;&amp; tag.parentNode.parentNode &amp;&amp; tag.parentNode.parentNode.tagName == "DIV" ) {  if ( tag.parentNode.parentNode.id.indexOf("text-") != -1 )  {   return tag.href;  } } return false;};searchshield.SlashdotSearchEngine.prototype.addImage = function(node, image, hidden){ var doc   = this.search.doc;  this.init_inline_ratings(doc); this.show_inline_ratings(doc, node, image);};///////////////    SLASHDOT SEARCH ENGINE    //////////////////////////////    TWITTER SEARCH ENGINE    ///////////////searchshield.TwitterSearchEngine = function(search){ searchshield.SearchEngine.call(this, search); this.showCleanVerdicts = false; this.new_links = false; this.type = 'inline';};searchshield.TwitterSearchEngine.prototype = new searchshield.SearchEngine();searchshield.TwitterSearchEngine.prototype.constructor = searchshield.TwitterSearchEngine;searchshield.TwitterSearchEngine.prototype.name = "twitter";searchshield.TwitterSearchEngine.prototype.twitter_filter_urls = ["twitpic.com", "twitterfeed.com", "twitter.peoplebrowsr.com"];searchshield.TwitterSearchEngine.prototype.validSearch = function(href){ var uri; if (typeof(this.search) === 'undefined' || null === this.search)  uri = searchshield.parseLink(href); else  uri = this.search.uri; if(!uri || !uri.host)  return false;  var domain= uri.host; if (domain.indexOf("twitter.com") != -1) {  return true; }  return false;};searchshield.TwitterSearchEngine.prototype.includeLink = function(tag){ if (searchshield.DoesURLContain(tag.href, this.search.uri.host))  return false;   if (tag.className.length &lt; 1)  return false;  // no verdicts on source of twit for example "from TweetDeck" if ((tag.className.indexOf("tweet-url web") == 0) &amp;&amp;  (tag.className.indexOf("url") == 0 )) {  return false; }   if (searchshield.FilterUrl(tag.href, this.twitter_filter_urls)) {  return false; }  return tag.href;};searchshield.TwitterSearchEngine.prototype.addImage = function(node, image, hidden){ var doc   = this.search.doc;   this.init_inline_ratings(doc); this.show_inline_ratings(doc, node, image);};///////////////    TWITTER SEARCH ENGINE    //////////////////////////////    GMAIL SEARCH ENGINE    ///////////////searchshield.GMailSearchEngine = function(search){ searchshield.SearchEngine.call(this, search); this.processFrames = true; this.showCleanVerdicts  = false; this.type = 'inline';};searchshield.GMailSearchEngine.prototype = new searchshield.SearchEngine();searchshield.GMailSearchEngine.prototype.constructor = searchshield.GMailSearchEngine;searchshield.GMailSearchEngine.prototype.name = "gmail"; // the name by which the search engine is known (always lowercase)searchshield.GMailSearchEngine.prototype.validSearch = function(href){ var uri; if (typeof(this.search) === 'undefined' || null === this.search)  uri = searchshield.parseLink(href); else  uri = this.search.uri; if(!uri || !uri.host)  return false; var domain  = uri.host;  // re stitch the uri path and query elements to // use existing logic var path = uri.path + uri.delimiter + uri.query; if ((domain.indexOf("mail.google.") != -1) ||   (domain.indexOf("gmail.") != -1)) {  return true; } return false;};searchshield.GMailSearchEngine.prototype.includeLink = function(tag){ if (searchshield.DoesURLContain(tag.href, this.search.uri.host))  return false; // don't mark anything but http:// if (tag.href.indexOf("mailto") == 0)  return false; var parentDiv = searchshield.getParentNodeByTagName("DIV", tag, "className"); if ((parentDiv) &amp;&amp;  ((parentDiv.className == "ii gt") || // mail message body   (parentDiv.className == "mv") || // top sponsored links   (parentDiv.className == "vb") || // right sponsored links   (parentDiv.className == "im") || // inside quotes   (parentDiv.className == "gmail_quote") || // quote   (parentDiv.className == "msg") // basic html mode   )) // right ads {  // parse for any ads  var newHref = this.parseAdUrl(tag.href);  return newHref; }  return false;};searchshield.GMailSearchEngine.prototype.addImage = function(node, image, hidden){ var doc   = this.search.doc;   this.init_inline_ratings(doc); this.show_inline_ratings(doc, node, image);};searchshield.GMailSearchEngine.prototype.parseAdUrl = function(href){ if (!href)  return href; // check for google ad var regex = "^http(s)?\:\/\/([a-zA-Z0-9]+)\.googlesyndication\.com.+\&amp;adurl\=(.+)"; var re = new RegExp(regex); var matches = href.match(re); if (matches &amp;&amp; (matches.length &gt;= 4)) {  // else we want the fourth value  var match = matches[3];  if (match &amp;&amp; (match.length &gt; 0))   return match } return href;};///////////////    GMAIL SEARCH ENGINE    //////////////////////////////    FACEBOOK SEARCH ENGINE    ///////////////searchshield.FacebookSearchEngine = function(search){ searchshield.SearchEngine.call(this, search); this.showCleanVerdicts = false; this.type = 'inline';};searchshield.FacebookSearchEngine.prototype = new searchshield.SearchEngine();searchshield.FacebookSearchEngine.prototype.constructor = searchshield.FacebookSearchEngine;searchshield.FacebookSearchEngine.prototype.name = "facebook"; // the name by which the search engine is known (always lowercase)searchshield.FacebookSearchEngine.prototype.validSearch = function(href){ var uri; if (typeof(this.search) === 'undefined' || null === this.search)  uri = searchshield.parseLink(href); else  uri = this.search.uri; if(!uri || !uri.host)  return false; if (uri.host.indexOf("www.facebook.com") != -1)   return true; return false;};searchshield.FacebookSearchEngine.prototype.includeLink = function(tag){ if (!tag.href || (tag.href.indexOf('facebook.com') &gt; -1) || (tag.href.indexOf('ak.fbcdn.net') &gt; -1))  return false;  return tag.href};searchshield.FacebookSearchEngine.prototype.addImage = function(node, image, hidden){ var doc   = this.search.doc;   this.init_inline_ratings(doc); this.show_inline_ratings(doc, node, image);};///////////////    FACEBOOK SEARCH ENGINE    //////////////////////////////    MYSPACE SEARCH ENGINE    ///////////////searchshield.MySpaceSearchEngine = function(search){ searchshield.SearchEngine.call(this, search); this.showCleanVerdicts = false; this.type = 'inline';};searchshield.MySpaceSearchEngine.prototype = new searchshield.SearchEngine();searchshield.MySpaceSearchEngine.prototype.constructor = searchshield.MySpaceSearchEngine;searchshield.MySpaceSearchEngine.prototype.name = "myspace"; // the name by which the search engine is known (always lowercase)searchshield.MySpaceSearchEngine.prototype.validSearch = function(href){ var uri; if (typeof(this.search) === 'undefined' || null === this.search)  uri = searchshield.parseLink(href); else  uri = this.search.uri; if(!uri || !uri.host)  return false; if (uri.host.indexOf("www.myspace.com") != -1)   return true; return false;};searchshield.MySpaceSearchEngine.prototype.includeLink = function(tag){ if (searchshield.DoesURLContain(tag.href, this.search.uri.host) ) {  return false; }  return tag.href};searchshield.MySpaceSearchEngine.prototype.addImage = function(node, image, hidden){ var doc   = this.search.doc;   this.init_inline_ratings(doc); this.show_inline_ratings(doc, node, image);};///////////////    MYSPACE SEARCH ENGINE    //////////////////////////////    AVG TOOLBAR REPORTING    ///////////////var avgreport = { BLOCK_SEVERITY: 3, scanResult: function (doc, url, foundUrl, ip) {  // report scan end only if surf enabled  if ('1' != searchshield.avgCallFunc(doc, 'GetSurfEnabled'))   return;    // for now native is handling the interstitial   var results = searchshield.avgCallFunc(doc, 'MalsiteCheck', url);  if ( results == null )   return;    var parts = results.split('::');    // need at least severity  if (parts == null)   return;  if (!ip)   ip = "";     // use a block severity if foundUrl is given  var severity = !!foundUrl ? avgreport.BLOCK_SEVERITY : parseInt(parts[0], 10);  var category = "";  var threat  = "";  // fill in the category and threat if something was found  if (severity &gt; 0)  {   category = parts[2];   threat  = parts[4];  }//  else//   return;    var scan_result = searchshield.avgCallFunc(doc, 'ReportScanResult', url, url, threat, category, ip, severity);  var scan_end = avgreport.scanEnd(doc, url);    return (scan_result &amp;&amp; scan_end); }, scanEnd: function (doc, url) {  return searchshield.avgCallFunc(doc, 'ReportScanEnd', url); }, GetInterstitialIP: function (interstitial) {  // simple regex to pull the IP address  var regex = /(([1-9][0-9]{0,2})|0)\.(([1-9][0-9]{0,2})|0)\.(([1-9][0-9]{0,2})|0)\.(([1-9][0-9]{0,2})|0)/;  var match = regex.exec(interstitial);  if (!match)   return '';  return match[0]; }}///////////////    AVG TOOLBAR REPORTING    //////////////////////////////    FLYOVERS    ///////////////var avglsflyover = { count: 0, poppedUp: false, poppedElement: null, reset: function () {  avglsflyover.count = 0;  avglsflyover.poppedUp = false;  avglsflyover.poppedElement = null; }, popup: function (event, hash, search, flyover) {  if (!event)   event = window.event;  var div = document.getElementById("XPLSS_Flyover");  if (div == null)   return;  // establish target element and get its containing document object  // in case verdict is inside a frame  var eventTarget = event.srcElement;  var frameDoc = eventTarget.ownerDocument;  // if the element is the clock, don't pop over it  if ((eventTarget.src != null) &amp;&amp; (eventTarget.src.indexOf("clock.gif") != -1))   return;    // save the element we popped over  avglsflyover.poppedElement = eventTarget;  // if no flyover get it  if ((flyover == null) || (flyover == ""))  {   flyover = searchshield.avgCallFunc(frameDoc, 'BuildFlyover', hash);   if (!flyover)    return;   // cleanup flyover, replace any new lines   flyover = flyover.replace(/\r/g, "");   flyover = flyover.replace(/\n/g, "");   // escape any single quotes   flyover = flyover.replace(/'/g, "&amp;#39;");  }  // set the html in the layer  div.innerHTML = flyover;  // there is an unwanted text node that causes vertical misalignment of flyover  if (div.firstChild.nodeType == 3)   div.removeChild(div.firstChild);    avglsflyover.poppedUp = true;  // reset display count  avglsflyover.count = 0;  avglsflyover.position(); }, hide: function (event) {  var frameDoc = document || top.document;  var div = frameDoc.getElementById("XPLSS_Flyover");  if ((div == null) || (div.style == null) || (div.style.visibility == "hidden"))   return;  var trans_div = frameDoc.getElementById("XPLSS_Trans");  if ((trans_div == null) || (trans_div.style == null) || (trans_div.style.visibility == "hidden"))   return;  // scroll and keydown events will pass a null event by design  // toElement will be null when mousing out of frameelement containing a verdict  if (event == null || event.toElement == null)  {   return;  }  if (trans_div.contains(event.toElement) || div.contains(event.toElement))   return;  // if the toElement is a cooresponding alt image then don't hide  // use try/catch because toElement will be null when mousing out of frame  try {   if (!!event.toElement.id &amp;&amp; !!event.srcElement.id)   {    if (event.toElement.id.indexOf(event.srcElement.id.substring(0,event.srcElement.id.length-2)) == 0)     return;      if (event.srcElement.id == 'XPLSS_Trans' &amp;&amp; /XPLSS_\d+VU\d/.test(event.toElement.id))     return;   }  }  catch(err){}  // hide and move somewhere off screen (negative offsets)  div.style.visibility = "hidden";  div.style.left = "-2100px";  div.style.top  = "-2100px";  trans_div.style.visibility = "hidden";  trans_div.style.left = "-2100px";  trans_div.style.top  = "-2100px";  return true; }, position: function () {  if (!avglsflyover.poppedUp || (avglsflyover.poppedElement == null))   return;  var flyover = document.getElementById("XPLSS_Flyover");  if (flyover == null)   return;  // relative position of flyover in relation to icon  var locateX = 0;  // 0=left, 1=right  var locateY = 0;  // 0=above, 1=below, 2=beside icon   // get window sizes  var winSize  = searchshield.viewPortSize();  var windowX  = winSize[0];  var windowY  = winSize[1];  // get the exact size of the flyover  var flyoverSize  = searchshield.elementSize(flyover);  var flyoverX  = flyoverSize[0];  var flyoverY  = flyoverSize[1];  var verdictWidth = 0;  if (avglsflyover.poppedElement &amp;&amp; avglsflyover.poppedElement.width)   verdictWidth = avglsflyover.poppedElement.width;    // get the bounding rect for image(s)  var imgRect = searchshield.GetFullBoundingRect(avglsflyover.poppedElement);  // half width/height of element bounding rect  var halfX = (imgRect.right - imgRect.left) / 2;  var halfY = (imgRect.bottom- imgRect.top) / 2;  // element the mouse is over, get the center position  var posX = searchshield.offsetLeft(avglsflyover.poppedElement) + halfX;  var posY = searchshield.offsetTop(avglsflyover.poppedElement) + halfY;  // if a verdict is inside a frame must get offsets for the frame element  var docFrames = document.frames;  if (docFrames)  {   for (var i=0; i &lt; docFrames.length; i++)   {    try {     var frameElem = docFrames[i].frameElement;     if (frameElem.contentWindow.document.getElementById(avglsflyover.poppedElement.id))     {      posX += searchshield.offsetLeft(frameElem);      posY += searchshield.offsetTop(frameElem);      break;     }    }    catch(frmErr){}   }  }  var transXOffset = 0;  if (imgRect.mid == undefined)   transXOffset = -1 * halfX;  else   transXOffset = ((imgRect.right + imgRect.left) / 2) - imgRect.mid;    // normalize pos to 0  -- get amount of scrolling in browser window  var scroll   = searchshield.scrollSize();  var pageOffsetX  = scroll[0];  var pageOffsetY  = scroll[1];  posX -= pageOffsetX;  posY -= pageOffsetY;  // setup the offsets  var offsetX = posX;  var offsetY = posY;  // calc where to display on page  if ((windowX - posX) &gt; posX)  {   // right   offsetX += halfX;   locateX = 1;  }  else  {   //left   offsetX -= (flyoverX + halfX);  }  if ((windowY - posY) &gt; posY)  {   // below   if (posY &lt; (windowY/4))   {    offsetY -= halfY;    locateY = 1;   }   else   {    offsetY -= (flyoverY / 2);    locateY = 2;   }  }  else  {   // above   if ((windowY - posY) &lt; (windowY/4))   {    offsetY -= (flyoverY - halfY);   }   else   {    offsetY -= (flyoverY / 2);    locateY = 2;   }  }  // make sure we aren't off the screen  if (offsetY &lt; 0)   offsetY = 0;  if ((offsetY + flyoverY) &gt; windowY)   offsetY = windowY - flyoverY;  // add page offsets back  offsetX += pageOffsetX;  offsetY += pageOffsetY;  posX += pageOffsetX;  posY += pageOffsetY;  var paddedOffsetX = 0; //provide space between icon and flyover  var padX = 3;  if (locateX == 0)   paddedOffsetX = offsetX - padX;  else   paddedOffsetX = offsetX + padX;  // set where to put the flyover  flyover.style.top = offsetY + "px";  flyover.style.left = paddedOffsetX + "px";  // set where to put the transparent layer  var trans = document.getElementById("XPLSS_Trans");  if (trans != null)  {   var trans_left = 0;   var trans_top  = 0;   var trans_width= 0;   var trans_height = 0;   // transparent layer should overlap verdict image   if (locateX == 0)    trans_left = posX - flyoverX - halfX;  // left    else    trans_left = posX - transXOffset - verdictWidth; // right   trans.style.left = trans_left + "px";   trans.style.top  = offsetY + "px";   trans.style.width = flyoverX + verdictWidth + "px";   trans.style.height = flyoverY + "px";  }  avglsflyover.display(); }, display: function () {  avglsflyover.count++;  if (avglsflyover.count == 1)  {   var flyover = document.getElementById("XPLSS_Flyover");   if (flyover == null)    return;   // show the flyover, must use a little count to tell, crazy stuff   flyover.style.visibility = "visible";   flyover.onmouseout = function(){    avglsflyover.hide(event);   };   // show the transparent layer   var trans_div = document.getElementById("XPLSS_Trans");   if (trans_div == null)    return;   trans_div.style.visibility = "visible";   trans_div.onmouseout = function(){    avglsflyover.hide(event);   };   avglsflyover.poppedUp = false;  } }, show: function () {  var div = document.getElementById("XPLSS_Flyover");  if (div == null)   return;  div.style.visibility = "visible";  var trans_div = document.getElementById("XPLSS_Trans");  if (trans_div == null)   return;  trans_div.style.visible = "visible"; }};var avglsinlineflyover = { build: function (riskCategory, riskName, bgColor, borderColor) {  var html = '';  html += '&lt;div class="avgILFO_head"&gt;&lt;div&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class="avgILFO_content"&gt;';  html += '&lt;img src=linkscanner://LS_Logo_Results.gif /&gt;';  html += riskCategory + '';  html += riskName + '';  html += '&lt;/div&gt;&lt;div class="avgILFO_foot"&gt;&lt;div&gt;&lt;/div&gt;&lt;/div&gt;';  return html; }, popup: function (event, flyover, nSeverity, blUrl) {  //set verdict info  var div = document.getElementById('XPLSS_InlineFlyover');  if (div == null)   return;    // blUrl is an object for a blacklisted short url  // when it is passed get the final url   if (blUrl != undefined)  {   var finalUrl = searchshield.avgCallFunc(document, 'GetFinalUrl', blUrl.sUrl);   var riskUrl = blUrl.sUrl;   if ((finalUrl) &amp;&amp; (searchshield.FilterUrl(finalUrl, xplSearch.engine.shortened_urls)))    finalUrl = avglsinlineflyover.getUrlFromQueryString(finalUrl);   var riskName = blUrl.riskNameLabel + finalUrl;   flyover = avglsinlineflyover.build(blUrl.riskCategory, riskName, blUrl.bgColor, blUrl.borderColor);  }  div.innerHTML = flyover;  div.style.width = "auto";  //reset width  div.style.position = "absolute";  if (searchshield.quirksMode || searchshield.docMode &lt;= 7)  {   var className = xplSearch.engine.inline.color.classname[nSeverity];   var imgBase = "linkscanner://" + className + "_inline_border_";   var divWidth = searchshield.elementSize(div)[0];   //round up to nearest 10 to avoid intentional wrapping in div   var flyoverWidth = divWidth + (10 - Math.ceil(10*((divWidth/10) - Math.floor(divWidth/10))));   var ilfoDivs = div.getElementsByTagName("div");   if (ilfoDivs &amp;&amp; ilfoDivs.length == 5)   {    //div.style.fontSize = "10px";    div.style.backgroundImage = "url(" + imgBase + "tl.png)";    div.style.backgroundPosition = "0 0";    div.style.backgroundRepeat = "no-repeat";    div.style.width = flyoverWidth + "px";    div.style.zIndex = "9999";       // avgILFO_head    ilfoDivs[0].style.backgroundImage = "url(" + imgBase + "tr.png)";    ilfoDivs[0].style.backgroundPosition = "top right";    ilfoDivs[0].style.backgroundRepeat = "no-repeat";    ilfoDivs[0].style.width = flyoverWidth + "px";    ilfoDivs[0].style.height = "5px";    // avgILFO_head div    ilfoDivs[1].style.height = "5px";       // avgILFO_content    ilfoDivs[2].style.backgroundImage = "url(" + imgBase + "r.png)";    ilfoDivs[2].style.backgroundPosition = "top right";    ilfoDivs[2].style.backgroundRepeat = "repeat-y";    ilfoDivs[2].style.fontSize = "10px";    ilfoDivs[2].style.color = "black";    ilfoDivs[2].style.padding = "0px 10px";    ilfoDivs[2].style.textAlign = "left";    ilfoDivs[2].style.wordWrap = "break-word";    ilfoDivs[2].style.lineHeight = "130%";    // avgILFO_foot    ilfoDivs[3].style.backgroundImage = "url(" + imgBase + "bl.png)";    ilfoDivs[3].style.backgroundPosition = "bottom left";    ilfoDivs[3].style.backgroundRepeat = "no-repeat";    ilfoDivs[3].style.height = "5px";       // avgILFO_foot div    ilfoDivs[4].style.backgroundImage = "url(" + imgBase + "br.png)";    ilfoDivs[4].style.backgroundPosition = "bottom right";    ilfoDivs[4].style.backgroundRepeat = "no-repeat";    ilfoDivs[4].style.width = flyoverWidth + "px";    ilfoDivs[4].style.height = "5px";   }   else   {    div.style.fontSize = "10px";    div.style.backgroundColor = xplSearch.engine.inline.color.background[nSeverity];    div.style.border = xplSearch.engine.inline.color.border[nSeverity] + " solid 3px";    div.style.padding = "3px 8px";   }  }  else  {   // apply updated styles for new flyover content   var sheets = document.styleSheets;   for (var i=0; i &lt; sheets.length; i++)   {    if (sheets[i].id &amp;&amp; sheets[i].id == "avgILFOStyle")    {     var avgILFOStyle = sheets[i];     break;    }   }   if (typeof(avgILFOStyle) !== "undefined")   {    var className = xplSearch.engine.inline.color.classname[nSeverity];    var divWidth = searchshield.elementSize(div)[0];    //round up to nearest 10 to avoid intentional wrapping in div    var flyoverWidth = divWidth + (10 - Math.ceil(10*((divWidth/10) - Math.floor(divWidth/10))));    var rules = avgILFOStyle.rules;    for (var i=0; i &lt; rules.length; i++)    {     var bgImg = rules[i].style.backgroundImage;     var selText = rules[i].selectorText.toLowerCase();     if (bgImg)     {      var bgImgStyle = bgImg.replace(/default/, className);      rules[i].style.backgroundImage = bgImgStyle;     }     if (((selText == ".avgilfo") ||      (selText == ".avgilfo_head") ||      (selText == ".avgilfo_foot div")) &amp;&amp;      (rules[i].style.width) &amp;&amp; (rules[i].style.width == "0px"))     {      rules[i].style.width = (flyoverWidth) + "px";     }    }   }  }  if (!event)   event = window.event;     var eventTarget = event.srcElement;  avglsinlineflyover.position(eventTarget); }, hide: function (event) {  if (!event)   event = window.event;     var div = document.getElementById("XPLSS_InlineFlyover");  if (div == null)   return;     div.style.visibility = "hidden"; //invisible  div.style.left = "-5000px";  if (!searchshield.quirksMode)  {   // reset flyover styles   var sheets = document.styleSheets;   for (var i=0; i &lt; sheets.length; i++)   {    if (sheets[i].id &amp;&amp; sheets[i].id == "avgILFOStyle")    {     var avgILFOStyle = sheets[i];     break;    }   }   if (typeof(avgILFOStyle) !== "undefined")   {    var rules = avgILFOStyle.rules;    for (var i=0; i &lt; rules.length; i++)    {     var bgImg = rules[i].style.backgroundImage;     var selText = rules[i].selectorText.toLowerCase();     if (bgImg)     {       var bgImgStyle = bgImg.replace(/:\/\/([a-z]+)_/i, '://default_');      rules[i].style.backgroundImage = bgImgStyle;     }     if (((selText == ".avgilfo") ||      (selText == ".avgilfo_head") ||      (selText == ".avgilfo_foot div")) &amp;&amp;      (rules[i].style.width))     {      rules[i].style.width = "0px";     }    }   }  } }, position: function (imageElem) {  var flyover = document.getElementById('XPLSS_InlineFlyover');  if (flyover == null)   return;     // relative position of flyover in relation to icon  var locateX = 0;  // 0=left, 1=right  var locateY = 0;  // 0=above, 1=below, 2=beside icon        // get window sizes  var winSize  = searchshield.viewPortSize();  var windowX  = winSize[0];  var windowY  = winSize[1];  // Must know if there is a horizontal scroll bar for Firefox  // for proper flyover positioning near bottom edge  var scrollYWidth  = winSize[2];  var scrollBarX  = winSize[2] &gt; 0 ? true : false;  // get the exact size of the flyover  var flyoverSize  = searchshield.elementSize(flyover);  var flyoverX  = flyoverSize[0];  var flyoverY  = flyoverSize[1];    flyover.style.width = flyoverX + "px";    // get the bounding rect for image(s)  var imgRect = imageElem.getBoundingClientRect();  // half width/height (center) of element bounding rect  var halfX = (imgRect.right - imgRect.left) / 2;  var halfY = (imgRect.bottom- imgRect.top) / 2;  // element the mouse is over, get the center position  var posX = searchshield.offsetLeft(imageElem) + halfX;  var posY = searchshield.offsetTop(imageElem) + halfY;    var pageOffsetX = 0;  var pageOffsetY = 0;  var hasParentFrame = false;  // normalize pos to 0  -- get amount of scrolling in browser window  var scroll  = searchshield.scrollSize(imageElem);  pageOffsetX  = scroll[0];  pageOffsetY  = scroll[1];  hasParentFrame = scroll[2];    posX -= pageOffsetX;  posY -= pageOffsetY;  //compensate for Firefox 3  if (posX &lt; imgRect.left)   posX = imgRect.left+halfX;  // setup the offsets  var offsetX = posX;  var offsetY = posY;  // calc where to display on page  if ((windowX - posX) &gt; posX)  {   // right   //offsetX += halfX;   offsetX = imgRect.right + 3;   locateX = 1;  }  else  {   //left   //offsetX -= (flyoverX + halfX);   offsetX = imgRect.left - flyoverX - 3;  }  if ((windowY - posY) &gt; posY)  {   // below   if (posY &lt; (windowY/4))   {    offsetY -= halfY;    locateY = 1;   }   else   {    offsetY -= (flyoverY / 2) - halfY;    locateY = 2;   }  }  else  {   // above   if ((windowY - posY) &lt; (windowY/4))   {    offsetY -= (flyoverY - halfY);   }   else   {    offsetY -= (flyoverY / 2) + halfY;    locateY = 2;   }  }  // make sure we aren't off the screen  if (offsetY &lt; 0)   offsetY = 0;  if ((offsetY + flyoverY) &gt; windowY)  {   offsetY = windowY - flyoverY;  }  else if (scrollBarX &amp;&amp; ((windowY - (posY + halfY)) &lt; scrollYWidth))  { //verdict overlaps the horizontal scrollbar   offsetY = windowY - (flyoverY + scrollYWidth);  }  // add page offsets back - if not in frame  if (!hasParentFrame)  {   offsetX += pageOffsetX;   offsetY += pageOffsetY;  }  //posX += pageOffsetX;  //posY += pageOffsetY;  //var paddedOffsetX = 0; //provide space between icon and flyover  //var padX = 3;  //if (locateX == 0)  // paddedOffsetX = offsetX - padX;  //else  // paddedOffsetX = offsetX + padX;  // set where to put the flyover  flyover.style.top = offsetY + "px";  flyover.style.left = offsetX + "px";  avglsinlineflyover.display(); }, display: function () {  var div = document.getElementById('XPLSS_InlineFlyover');  if (div == null)   return;    // show the flyover  div.style.visibility = "visible"; }, imageExists: function(element) {  if (element)  {   // check next siblings children   var sibling = element.nextSibling;      if ((sibling == null) || (sibling.getElementsByTagName == null))    return false;      var images = sibling.getElementsByTagName("IMG");   if (images == null)    return false;   for (var i = 0; i &lt; images.length; i++)   {    if (images[i].id == "avg_ls_image")     return true;   }  }  return false; }, getImage: function (anchor) {  if (anchor)  {   var imageElem = null;   var images = anchor.getElementsByTagName("img");   if (images == null)    return imageElem;   for (var i = 0; i &lt; images.length; i++)   {    if (images[i].id == "avg_ls_image")    {     imageElem = images[i];     break;      }       }   return imageElem;  }   }, getUrlFromQueryString: function (inUrl) {  var url = inUrl;  var uri = searchshield.parseLink(unescape(inUrl));  if (uri.source != null)  { // regexp failed so used split to parse url   var qsUrl = uri.source.indexOf("?url=");   if (qsUrl != -1)    url = uri.source.substring(qsUrl + 5);   else    url = uri.source;  }  else if ((uri.qsArray.url != null) &amp;&amp; (uri.qsArray.url.length &gt; 0))  {   url = uri.qsArray.url;  }  return url; }, mouseOverHandler: function (e, doc, engine) {  if (e &amp;&amp; e.srcElement &amp;&amp; e.srcElement.href)  {   // need to keep a reference to the function registered    // by the listener to be able to remove it.   var handlerFunc = arguments.callee;   var element = e.srcElement;   var href = e.srcElement.href;   // need an engine      if (!engine)    return;   // check if it has an image already   if (avglsinlineflyover.imageExists(element))    return;   // add the image, returns the anchor not the image   var new_element = engine.add_inline_image(doc, element, null, null);   // do the check and update in the background   setTimeout(function() {avglsinlineflyover.checkAndUpdate(doc, element, new_element, engine, handlerFunc)}, 1);  } }, checkAndUpdate: function (doc, element, new_element, engine, handlerFunc) {  if (!engine)   return;  try {   // remove the listener and get final url   element.detachEvent("onmouseover", handlerFunc, false);   var finalUrl = searchshield.avgCallFunc(doc, 'GetFinalUrl', element.href);  }  catch(e) {}  if ((typeof(finalUrl) != 'undefined') &amp;&amp; finalUrl)  {   // if still a tiny url check for final url embedded in querystring   if (searchshield.FilterUrl(finalUrl, engine.shortened_urls) &amp;&amp;     (finalUrl.indexOf("?url=") != -1))   {    finalUrl = avglsinlineflyover.getUrlFromQueryString(finalUrl);   }   // update the verdict   engine.display_inline(doc, new_element, finalUrl, null, true);  }  else  {   engine.avg_ls_inline_hide_verdict(new_element);  } }};///////////////    FLYOVERS    ///////////////(function(){ setTimeout( function() {  try {   if ((self == top) &amp;&amp; top.document) {    searchshield.init(top.document, 1);   }  }  catch(e){return;} }, 1 ); return;})();&lt;/script&gt; &amp;nbsp;&lt;img height="306" src="http://userserve-ak.last.fm/serve/_/103254/Van+Morrison.jpg" width="320" /&gt;&lt;script type="text/javascript"&gt;﻿///////////    SEARCH    ///////////var g_aEng;var g_loc;// Initialize namespace, use existing contextvar searchshield = searchshield || {};searchshield.clockUrl;// constantssearchshield.SCORE_SS_SAFE  = 1;searchshield.SCORE_SS_CAUTION = 2;searchshield.SCORE_SS_WARNING = 3;searchshield.SCORE_SS_BLOCK  = 4;searchshield.SCORE_SS_VERISIGN = 7;searchshield.BLOCK_NONE  = 0;searchshield.BLOCK_NORMAL = 1;searchshield.BLOCK_PHISH = 2;searchshield.BLOCK_YAHOO = 3;searchshield.XPLCHECK_RESULT_SEV_NONE = 0;searchshield.XPLCHECK_RESULT_SEV_LOW = 1;searchshield.XPLCHECK_RESULT_SEV_MED = 2;searchshield.XPLCHECK_RESULT_SEV_BLOCK = 3;searchshield.VERISIGN_SPLIT_NOTEST  = 0;searchshield.VERISIGN_SPLIT_TESTA  = 1;searchshield.VERISIGN_SPLIT_TESTB  = 2;searchshield.needLivePhishCheck = false;searchshield.allowedSites = [];searchshield.enabled = function (doc){ var result = searchshield.avgCallFunc(doc, 'GetSearchEnabled'); return (result == '1' ? 1 : 0);};searchshield.init = function (doc){ if ((doc == null) || (doc.location == null) || (doc.location.href.search(/about:/) != -1))  return; if (!searchshield.enabled(doc))  return; if (!g_aEng)  g_aEng = searchshield.Search.prototype.detectEngine(doc.location.href); if (!g_aEng)  return; // init search object (not declared or is null) if (typeof xplSearch === 'undefined') {  // global  xplSearch = new searchshield.Search();  // reset the links added flag  xplSearch.new_links = false;  xplSearch.doc = doc;  xplSearch.href = xplSearch.doc.location.href;  xplSearch.uri = searchshield.parseLink(xplSearch.href);    xplSearch.engine = new searchshield[g_aEng+'SearchEngine'](xplSearch)  xplSearch.addEngine(xplSearch.engine);  searchshield.launch(doc); } if (doc.location.href != g_loc) {  g_loc = doc.location.href;  if ((typeof xplSearch !== 'undefined') &amp;&amp; (xplSearch != null))   searchshield.launch(doc); }};searchshield.launch = function (doc){ // IE specific check searchshield.quirksMode = (self.top.document.compatMode == 'BackCompat'); searchshield.docMode = parseInt(navigator.userAgent.split('MSIE')[1]);   if ((self === top) &amp;&amp; (self.document === doc)) {  if (!xplSearch.engine)   return;  // set verdict display config  xplSearch.engine.setRatingsConfig(doc);  // init the alert popup  searchshield.initPopupAlert(doc);  if (xplSearch.engine.type != 'inline')  {   // save function reference for memory clean up later   var fn = function(event){avglsflyover.hide(null)};   //hide flyover if these events occur   window.detachEvent('onscroll', fn);   window.attachEvent('onscroll', fn);   doc.detachEvent('onkeydown', fn);   doc.attachEvent('onkeydown', fn);  }    // only start monitor on top doc  searchshield.avgPageMonitor.start(doc); } return;};// search monitors and processors - doc is always top most documentsearchshield.avgPageMonitor = { previousUrl: null, start: function(doc){  searchshield.avgPageMonitor.stop();  searchshield.avgPageMonitor.process(doc);  searchshield.avgPageMonitor.timeoutID = window.setTimeout(function(){searchshield.avgPageMonitor.start(doc)}, 1000); }, process: function(doc){  var currentUrl = doc.location.href;  var refresh = 0;  if (this.previousUrl != currentUrl) {   this.previousUrl = currentUrl;   avgreport.scanResult(doc, currentUrl);   refresh = (xplSearch.engine.name == 'google') ? 1 : 0;  }  searchshield.avgProcessSearch(doc, refresh); }, stop: function(){  if (searchshield.avgPageMonitor.timeoutID)  {   window.clearTimeout(searchshield.avgPageMonitor.timeoutID);   delete searchshield.avgPageMonitor.timeoutID;  } }};searchshield.avgProcessSearch = function (doc, refresh){ // doc may be about:Tabs or about:Blank if (!doc)  return;   if (!searchshield.enabled(doc))  return; if (!searchshield.clockUrl)  searchshield.clockUrl = searchshield.avgCallFunc(doc, 'GetIconUrl', '0');   xplSearch.clockUrl = searchshield.clockUrl if (!xplSearch.engine)  return; // get result links xplSearch.links = []; var links = searchshield.avgGetSearchLinks(doc, xplSearch.engine, refresh); searchshield.needLivePhishCheck = false; for (var i=0; i &lt; links.length; i++) {  var isPhishing = searchshield.avglsCheckandUpdate(links[i]);  if (isPhishing)   searchshield.needLivePhishCheck = true; }  if (searchshield.needLivePhishCheck) {  var prev = '1';  if ( xplSearch.engine.type == 'inline' )   prev = '0';  searchshield.avgCallFunc(doc, 'GetPhishingResults', prev);  searchshield.needLivePhishCheck = false; } else if (links.length &gt; 0 &amp;&amp; xplSearch.engine.type != 'inline') {  searchshield.avgCallFunc(doc, 'FinalScanComplete'); }  // attach click handlers for popup alerts doc.body.detachEvent("onclick", searchshield.blockClick); doc.body.attachEvent("onclick", searchshield.blockClick);  doc.body.detachEvent("ondblclick", searchshield.blockClick); doc.body.attachEvent("ondblclick", searchshield.blockClick);};searchshield.avgGetSearchLinks = function (doc, engine, refresh){ if (!doc.body)  return; var alltags = doc.body.getElementsByTagName('a'); for (var i = 0; i &lt; alltags.length; i++) {  if ( !refresh )  { // no checked test if refreshing - google   if (alltags[i].getAttribute('avglschecked'))    continue;  }    // ignore linked resources  if (alltags[i].tagName == 'LINK')   continue;  // ignore in-page bookmarks and javascript  if ((!alltags[i].href) ||   (alltags[i].href.charAt(0) == '#') || // in-page bookmark   (alltags[i].href.indexOf("javascript") == 0))   continue;     // ignore verdicts  if (/XPLSS_/.test(alltags[i].id))   continue;  // ignore flyover anchors  if (/linkscanner|avgthreatlabs|avg\.com/.test(alltags[i].href))   continue;     var href = engine.includeLink(alltags[i]);  if (!href)   continue;    var newNode = engine.search.addLink(alltags[i], href);  engine.addImage(newNode, engine.search.clockUrl, false); }  // recursivesly process all frames var docFrames = doc.frames; if (docFrames &amp;&amp; engine.processFrames) {  for (var j = 0; j &lt; docFrames.length; j++)  {   var attr;   var frameDoc;   try {    attr = docFrames[j].frameElement.className;    frameDoc = docFrames[j].document;   }   catch(err){}   //TODO: make frame processing an engine function or at least make exclusions an engine property   // 'editable' frame it's probably a gmail reply   if (attr &amp;&amp; (attr.indexOf("editable") != -1))    continue;   if (frameDoc)    searchshield.avgGetSearchLinks(frameDoc, engine, 0);  } }  return engine.search.links;};searchshield.avglsCheckandUpdate = function (linkNode){ if (!xplSearch)  return; // element is the search result anchor var element = linkNode.element; var href = linkNode.href; var result = searchshield.avgCallFunc(xplSearch.doc, 'CheckSite', href, element.href); if (result == null)  return;  var resultParse = result.split('::'); var phishing  = resultParse[0];  // if phishing then rest of array does not exist. if (phishing == 1)  return true; if (resultParse.length &lt; 8)  return;  var hash   = resultParse[1]; var score   = resultParse[2]; var new_image = resultParse[3]; var alt_image = resultParse[4]; var flyover   = resultParse[5]; var click_thru= resultParse[6]; var altClick_thru = resultParse[7]; // iterate to get verdict anchor nextElem = element.nextSibling; while (nextElem) {  if (nextElem.nodeType == 1 &amp;&amp; nextElem.id &amp;&amp; (nextElem.id.indexOf("XPLSS_") != -1))   break;  nextElem = nextElem.nextSibling; }  return xplSearch.engine.updateImage(hash, xplSearch.searchHash, score, new_image, alt_image, flyover, click_thru, altClick_thru);};// click event handler - shows popup for links of caution and warning severitysearchshield.blockClick = function(event){ if (!event)  event = window.event;   // no action needed if click is not the left mouse button if (event.button != 0)  return;   var anchor = searchshield.getAnchorNode(event.srcElement,         function(node) {return ((node.tagName.charAt(0) == "H") ||              (node.tagName.charAt(0) == "D") ||              (node.tagName.charAt(0) == "T"))} );  if ((anchor == null) || (anchor.href == null))  return true;  // ignore if anchor is on an xpl verdict if (!!anchor.id) {  if (anchor.id.indexOf('LXPLSS_') == 0)   return true;    if (anchor.id.indexOf('XPLSS_INTR') == 0)  {   searchshield.allowedSites.push(searchshield.GetDomain(anchor.href));   return true;  } }  // VeriSign A/B Split reporting - only for VerSign domains var avglschecked = anchor.getAttribute("avglschecked"); if (avglschecked &amp;&amp; avglschecked != 1) {  var sPos = avglschecked.indexOf("S");  var hash = (sPos &gt; -1) ? avglschecked.substring(0, sPos) : null;  var split = (sPos &gt; -1) ? avglschecked.substring(sPos+1) : null;  if (hash &amp;&amp; split &amp;&amp; split != searchshield.VERISIGN_SPLIT_NOTEST)  {   // check updated verdict anchor for verisign domain   var d = event.srcElement.ownerDocument;   if (d.getElementById("LXPLSS_" + hash + "U" + searchshield.SCORE_SS_VERISIGN))   {    searchshield.avgCallFunc(d, "RecordVSClick", hash, d.location.href);   }  } } var link = anchor.href; var verdict = searchshield.getAvgImage(anchor); var score = -1; var img_id = ''; if (verdict != null) {  score = verdict.score;  img_id = verdict.rawId; }  // show popup alert (upper left) if ((score &gt;= searchshield.SCORE_SS_CAUTION) &amp;&amp; (score &lt;= searchshield.SCORE_SS_WARNING)) {  // prevent this click from going any further  var search_hash = searchshield.avgCallFunc(document, 'GetHash', document.location.href);  searchshield.ShowPopupAlert(document, link, img_id, search_hash);  // if possible, stop the event from going any further  searchshield.cancelEvent(event);  return false; }  return true;};// called by native to update phishing linkssearchshield.updatePhishingLinks = function (results){ if (!results)  return; if (!xplSearch)  return; var engine = xplSearch.engine; var resultParse = results.split("::"); var resultsLength = resultParse[0]; for (var i=0; i &lt; resultsLength; i++) {  var idx = i*7;  var hash   = resultParse[idx+1];  var score   = resultParse[idx+2];  var new_image = resultParse[idx+3];  var alt_image = resultParse[idx+4];  var flyover   = resultParse[idx+5];  var click_thru= resultParse[idx+6];  var altClick_thru = resultParse[idx+7];  engine.updateImage(hash, xplSearch.searchHash, score, new_image, alt_image, flyover, click_thru, altClick_thru); }};searchshield.getAvgImage = function (element){ var obj = {}; obj.img = xplSearch.engine.getImgElement(element); obj.score = -1;  //parse the score from the id if (obj.img != null &amp;&amp; obj.img.id) {  var pos = !!obj.img.id ? obj.img.id.indexOf('U') + 1 : -1;  obj.score = (pos &lt; 1) ? -1 : obj.img.id.charAt(pos);  obj.rawId = obj.img.id.substring(0,pos-1); }  return obj;};searchshield.GetScannedLink = function (link){ if (!xplSearch || !(xplSearch.links instanceof Array))  return link; // look for the link we scanned based on original element for (var i = 0; i &lt; xplSearch.links.length; i++) {  if (xplSearch.links[i].element.href == link)   return xplSearch.links[i].href; } // else return the incoming link return link;};searchshield.previouslyScanned = function (links, hash){ for (var i = 0; i &lt; links.length; i++) {  if ((links[i] != null) &amp;&amp; (links[i].hash != null) &amp;&amp;    (links[i].hash == hash) &amp;&amp; (links[i].checked == true))   return true; } return false;};searchshield.initPopupAlert = function (doc){ // check if it exists first if (doc.getElementById("XPLSS_PopupAlert"))  return; // create a div to use for the popup itself, hide for now var popup_div = doc.createElement("DIV"); popup_div.setAttribute("id", "XPLSS_PopupAlert"); popup_div.style.position = "absolute"; popup_div.style.zIndex = "10000"; doc.body.appendChild(popup_div);};searchshield.initFlyover = function (doc, engine){ // create in top doc only if (doc !== window.top.document)  doc = window.top.document; // check if it exists first if ((doc == null) || (doc.getElementById("XPLSS_Flyover")))  return; // create a div to use for the flyover itself, hide for now var flyover_div = doc.createElement("DIV"); flyover_div.setAttribute("id", "XPLSS_Flyover"); flyover_div.style.position = "absolute"; flyover_div.style.zIndex = "10000"; doc.body.appendChild(flyover_div); // create a layer for the image var trans_div = doc.createElement("DIV"); trans_div.setAttribute("id", "XPLSS_Trans"); trans_div.style.position = "absolute"; trans_div.style.zIndex = "9999"; doc.body.appendChild(trans_div);};searchshield.ShowPopupAlert = function (doc, link, hash, search){ // build the content var popup_content = searchshield.avgCallFunc(doc, 'BuildPopupAlert', hash, search); if (popup_content == null || popup_content == "")  return; // get the div var div = doc.getElementById("XPLSS_PopupAlert"); div.innerHTML = searchshield.CleanupHTML(popup_content); // set position, account for scrolling var zoom = searchshield.zoomLevel(); var pageOffsetX = Math.round(doc.documentElement.scrollLeft/zoom); var pageOffsetY = Math.round(doc.documentElement.scrollTop/zoom);  div.style.left = 10 + pageOffsetX + "px"; div.style.top = 10 + pageOffsetY + "px";  // TODO: the event handler function doesn't exist so, is this even necessary? //div.attachEvent("onmouseout", HidePopupAlert); // set the link //var data = doc.getElementById("avgalertpopurl"); //if (data) //  data.innerHTML = escape(link); // set visibility div.style.visibility = "visible"; //navigate to the link after timed delay // TODO: Bug 31707 - make this open a new tab/window setTimeout(function(){doc.location.assign(link)}, 3000);};searchshield.avgCallFunc = function (doc, name /*, param1..., paramN*/){ // get the data element var avg_ls_data = (typeof gAvgDataElement !== 'undefined') ? gAvgDataElement : doc.getElementById("avglsdata"); if ((avg_ls_data == null) || (name == null))  return;  // save the data element gAvgDataElement = avg_ls_data; // for some reason you can't fire and event on an element with no parent node if (avg_ls_data.parentNode == null)  return; // set the attributes avg_ls_data.setAttribute("function", name);  // set variable length of optional parameter attributes var pcnt = 0; for (var i=2; i &lt; arguments.length; i++)  avg_ls_data.setAttribute("param"+(++pcnt), String(arguments[i])); avg_ls_data.fireEvent("onrowenter"); // get the result return avg_ls_data.getAttribute("result"); };// general use functions - begin// DOM Functionssearchshield.getAnchorNode = function (node, filterFunc){ // filterFunc should return a boolean if (!filterFunc || !filterFunc instanceof Function)  return null;   // go up the dom tree starting at node and look for anchor  // before hitting a header, div or table element  while ((node != null)   &amp;&amp;   (node.tagName != null) &amp;&amp;    (node.tagName != "A")) {  if (filterFunc(node))  {   node = null;   break;  }  node = node.parentNode; } return node;};searchshield.getDocuments = function (frame, frameArray){ // recursively get all embedded frames/docs frameArray.push(frame.document); var frames = frame.frames; for (var i = 0; i &lt; frames.length; i++) {  // recurse on each frame  searchshield.getDocuments(frames[i], frameArray); } return frameArray;};searchshield.NextSiblingNode = function (element){ var TEXTNODE = 3; var ParentNode = element.parentNode; if (!ParentNode)  return; var NextSibling = ParentNode.nextSibling; while (NextSibling) {  if (NextSibling.nodeType != TEXTNODE)   return NextSibling;  NextSibling = NextSibling.nextSibling; } return;};searchshield.getParentNodeByAttribute = function (attrName, attrValue, node, maxDepth){ if (!node)  return null;  var maxLoop = maxDepth ? maxDepth : 1; var pNode = node.parentNode;  if (!pNode)  return null;  for(; 0 &lt; maxLoop; maxLoop--)  {  if ((pNode[attrName]) &amp;&amp;    (pNode[attrName].toLowerCase() === attrValue.toLowerCase()))   {   return pNode;  }  pNode = pNode.parentNode;  if (!pNode)   return null; } return null;};searchshield.getParentNodeByClassName = function (className, node, maxDepth) { return searchshield.getParentNodeByAttribute("className", className, node, maxDepth);};searchshield.getParentNodeById = function (id, node, maxDepth){ return searchshield.getParentNodeByAttribute("id", id, node, maxDepth);};searchshield.getParentNodeByTagName = function (tagName, node, attrName) { // find parent node by tag name and optional attribute name if (!tagName || !node || !node.parentNode)  return null; tagName = tagName.toUpperCase(); while ((node != null) &amp;&amp; (node.nodeType != 9)) {  // if attrName is not provided just return TRUE  if (node.nodeName == tagName)  {   var nodeHasAttribute = !!attrName ? node[attrName] : true;   if (nodeHasAttribute)    return node;  }     node = node.parentNode; }  // no div return null;};searchshield.getHrefFromCiteElement = function (tag){ var rtnHtml; var tp = tag.parentNode; var tgpn = tp ? tp.parentNode : null; if (!tgpn)  return; lastChildElem = tgpn.lastChild; while ((lastChildElem != null) &amp;&amp; (lastChildElem.nodeName != 'SPAN') &amp;&amp; (lastChildElem.nodeName != 'DIV')) {  lastChildElem = lastChildElem.previousSibling; }  if (lastChildElem)  rtnHtml = lastChildElem.getElementsByTagName('cite')[0];  if (rtnHtml)  rtnHtml = rtnHtml.innerHTML;  return rtnHtml;};searchshield.getHrefFromSpanElement = function (tag){ var rtnHtml;  var tp = tag.parentNode; var tgpn = tp ? tp.parentNode : null; if (!tgpn)  return; siblingElem = tgpn.nextSibling; while ((siblingElem != null) &amp;&amp; (siblingElem.nodeName != 'SPAN') &amp;&amp; (siblingElem.className != 'site')) {  siblingElem = siblingElem.nextSibling;  if (siblingElem &amp;&amp; siblingElem.className  &amp;&amp; (siblingElem.className.match(/res[13]/)))   break; }  if (siblingElem)  rtnHtml = siblingElem.getElementsByTagName('a')[0];  if (rtnHtml)  rtnHtml = rtnHtml.innerHTML;  return rtnHtml;};searchshield.getTopLevelDocument = function (doc){ // return the top level document for the given doc, could be itself // TODO: determine a method of doing this for IE, if necessary  // don't check about:blank if (doc &amp;&amp; ((doc.location.href == "about:blank") || (doc.location.href == "about:Tabs")))  return doc; // Check if already a top level document for (var i = 0; i &lt; gBrowser.browsers.length; i++) {  if (doc == gBrowser.browsers[i].contentDocument)   return doc; } // Not a top level, check all frames  var documents; for (var j = 0; j &lt; gBrowser.browsers.length; j++) {  // get all docs for each browser  documents = searchshield.getDocuments(gBrowser.browsers[j].contentWindow, new Array());  for (var k = 0; k &lt; documents.length; k++)  {   // check if doc is from current browser   if (doc == documents[k])   {    // it is, return the top level doc for this browser    return gBrowser.browsers[j].contentDocument;   }  } }  return doc;};searchshield.getTopLevelWindow = function (){ // TODO: determine a method of doing this for IE, if necessary return mediator.getMostRecentWindow("navigator:browser");};//Event functionssearchshield.addListener = function (object, evtType, listener, useCapture){ useCapture = !!useCapture; if (object.addEventListener) {  object.addEventListener(evtType, listener, useCapture);  return true; } else if (object.attachEvent) {   object.attachEvent("on"+evtType, listener);   return true; }  return false;};searchshield.cancelEvent = function (event){ event.cancelBubble = true; event.returnValue = false;};searchshield.doEvent = function (evtObj, evtTarget, evtName, evtType, bubbles, cancelable){ bubbles  = !!bubbles; cancelable = !!cancelable;  if (document.createEvent) {  var evt = document.createEvent("Events");  evt.initEvent(evtName, bubbles, cancelable);  evtTarget.dispatchEvent(evt);  return true; } else if (document.createEventObject) {  var evt = document.createEventObject(evtObj);  evtTarget.fireEvent("on" + evtType, evt);  return true; }  return false;};searchshield.removeListener = function (object, evtType, listener, useCapture){ useCapture = !!useCapture;  if (object.removeEventListener) {  object.removeEventListener(evtType, listener, useCapture);  return true; } else if (object.detachEvent) {   object.detachEvent(evtType, listener);   return true; }  return false;};// HTML functionssearchshield.CleanupHTML = function (data){ if (data == null)  return data; // cleanup html data, replace any new lines data = data.replace(/\r/g, ""); data = data.replace(/\n/g, ""); // escape any single quotes data = data.replace(/'/g, "\\'"); return data;};searchshield.removeHtmlTags = function (str){ var re = new RegExp('(&lt;[^&gt;]+&gt;)','g'); var strStr = new String(str); if (!!strStr)  return strStr.replace(re, ''); else  return str; };// Browser functionssearchshield.elementSize = function (element){ //returns an array [sizeX, sizeY]  var elemX; var elemY;  elemX = parseInt(element.offsetWidth); elemY = parseInt(element.offsetHeight)  return [elemX, elemY];};searchshield.GetFullBoundingRect = function (element){ if (!element) return; // get bounding rect for incoming element var elementRect = element.getBoundingClientRect(); var nextImg = null; var nextImgRect = null; // first check for another non-TextNode element after this one var siblingElement = searchshield.NextSiblingNode(element); if ( siblingElement &amp;&amp;   siblingElement.firstChild &amp;&amp;   siblingElement.id &amp;&amp;   siblingElement.id.indexOf("XPLSS_") != -1) {  nextImg = siblingElement.firstChild;    nextImgRect = nextImg.getBoundingClientRect();  } else {  return elementRect; }  if ((nextImgRect.top &gt;= elementRect.bottom) &amp;&amp;   (nextImgRect.left &lt;= elementRect.left)) { // images appear to be on seperate lines  return elementRect; } // else merge the rects together into a new one var newRect = new function() { this.top=0; this.left=0; this.right=0; this.bottom=0; this.mid=0;}; newRect.top = Math.min(elementRect.top, nextImgRect.top); newRect.left= Math.min(elementRect.left, nextImgRect.left); newRect.right=Math.max(elementRect.right, nextImgRect.right); newRect.bottom=Math.max(elementRect.bottom, nextImgRect.bottom); newRect.mid = Math.min(elementRect.right, nextImgRect.left);  return newRect;};searchshield.offsetLeft = function (element){ var offset = 0; while (element) {  offset += element.offsetLeft;  element = element.offsetParent; } return offset;};searchshield.offsetTop = function (element){ var offset = 0; while (element) {  offset += element.offsetTop;   element = element.offsetParent; } return offset;};searchshield.scrollSize = function (imageElem){ // returns an array [scrollX, scrollY, hasParentFrame] var scrollX; var scrollY; var hasParentFrame;  // firefox if (window.pageXOffset &amp;&amp; window.pageYOffset) {  scrollX = window.pageXOffset;  scrollY = window.pageYOffset; } else if (document.documentElement || document.body) {  scrollX = document.documentElement.scrollLeft || document.body.scrollLeft;  scrollY = document.documentElement.scrollTop || document.body.scrollTop;  if (imageElem)  {   var frames = document.frames;   if (frames)   {    for (var i=0; i &lt; frames.length; i++)    {     var img;     try {      img = frames[i].document.getElementById(imageElem.id);     }     catch(domErr){}     if (img != null)     {      scrollX = frames[i].document.documentElement.scrollLeft;      scrollY = frames[i].document.documentElement.scrollTop;      hasParentFrame = true;      break;     }    }   }  } } else {  scrollX = 0;  scrollY = 0; }  return [parseInt(scrollX,10), parseInt(scrollY,10), hasParentFrame];};searchshield.viewPortSize = function (){ // returns an array [width, height, scrollYWidth], where scrollYWidth is always 0 for IE var scrollXWidth  = 19; var scrollYWidth  = 0; // 0 for Microsoft IE var scrollBarX  = false; var windowX; var windowY;  // firefox if (window.innerWidth &amp;&amp; window.innerHeight) {  //TODO: validate this block if implemented for firefox    windowX = window.innerWidth - scrollXWidth;  windowY = window.innerHeight;  try  {   scrollYWidth = Math.floor(Math.abs(window.innerHeight - document.documentElement.clientHeight)) + 1;   scrollBarX = (document.documentElement.clientWidth &lt; document.documentElement.scrollWidth);  }  catch(err){}  if (scrollBarX &amp;&amp; !scrollYWidth)   scrollYWidth = 18; //normally 17 (+1 top border)      } else if (document.documentElement || document.body)  {  windowX = (document.documentElement.clientWidth || document.body.clientWidth) - scrollXWidth;  windowY = document.documentElement.clientHeight || document.body.clientHeight; } else {  windowX = 0;  windowY = 0; } return [windowX, windowY, scrollYWidth];};searchshield.zoomLevel = function (){  var level = 1;  if (document.body.getBoundingClientRect) {   // rect is only in physical pixel size before IE8    var rect = document.body.getBoundingClientRect();   level = Math.round (((rect.right - rect.left) / (document.body.offsetWidth)) * 100) / 100;  }    return level;};// Href functionssearchshield.checkUrl = function (url){ // cleanup a url, make sure there is a protocol on the front for scanning try {  // trim  url = url.replace(/^\s+/, "").replace(/\s+$/, "");  // if no protocol, add http:// to it   if (url.indexOf("://") == -1)   url = "http://" + url; } catch(err){} return url;};searchshield.DoesURLContain = function (url, contain){ if ((url == null) || (url.length &lt; 1))  return false; // breakup the url to check var parts = url.split('/'); if (parts.length &lt; 3)  return false; var domain= parts[2].toLowerCase(); if (domain.indexOf(contain) &gt; -1)  return true; return false;};searchshield.FilterUrl = function (url, filter){ if (!url || (url.length &lt; 1))  return false;  if (!filter || !(filter instanceof Array))   return false;   var parts = url.split('/'); if ((parts == null) || (parts.length &lt; 3))  return false; var domain = parts[2]; for (var i = 0; i &lt; filter.length; i++) {  if (domain.indexOf(filter[i]) != -1)   return true; } return false;};searchshield.GetDomain = function (url){ if (url != null) {  // get url domain  var parts = url.split('/');  if ((parts != null) &amp;&amp; (parts.length &gt;= 3))  {   return parts[2].toLowerCase();  } }  return url;};searchshield.getUrlContents = function (url) { if (url == null)  return null; // don't query if local url if (url.indexOf("linkscanner://") != -1)  return null; try  {  req = new XMLHttpRequest();  req.open("GET", url, false);  req.send(null);  if (req.status == 200)   return req.responseText;  else   return null; }  catch (err) {  // nothing to do  return null; }};searchshield.parseLink = function (href, simpleMode){ var uri    = {}; var parameter = {   complex: {    pattern: /^(?:([a-z]+):(?:([a-z]*):)?\/\/)?(?:([^:@]*)(?::([^:@]*))?@)?((?:[a-z0-9_-]+\.)+[a-z]{2,})(?::(\d+))?(?:([^:\?\#]+))?(?:\?([^\#]+))?(?:\#([^\s]+))?$/i,    element: ['source','scheme','subscheme','user','pass','host','port','path','query','fragment']    },   simple: {    pattern: /^(?:([a-z]+):\/\/)?((?:[a-z0-9_-]+\.)+[a-z]{2,})(?:\/)([^:\?]+)?(?:([\?|\#])([^\?]+))?$/i,    element: ['source','scheme','host','path','delimiter','query']   }  }; var mode = simpleMode !== false ? 'simple' : 'complex'; var pattern = parameter[mode].pattern; var element = parameter[mode].element;  if (!href)  return uri; var matches = href.match(pattern);  if (matches) {  // --------------------  // iterate over the matches array and populate uri properties  // using the respective element parameter as the name.  // NOTE: set raw property type as String to make inArray()  // work properly with instanceof.  // --------------------  for (var i=0; i &lt; matches.length; i++)   uri[element[i]] = new String(matches[i] || "");    // --------------------  // create an array, hostArray, from host, for example,  // host="www.google.com" and hostArray=["www","google","com"]  // --------------------  uri.hostArray = uri.host.split(".");    // --------------------  // create an array, qsArray, from query, for example,  // query='hl=en&amp;q=javascript&amp;btnG=Search&amp;aq=f&amp;aqi=g10&amp;aql=&amp;oq=&amp;gs_rfai='  // qsArray=[{hl:'en'},{q:javascript}, ... ,(qs_rfai:''}]  //  // $0=entire match, $1=capture 1, $2=capture 2  // must include $0 even though it is unused so  // the replace works properly  // --------------------  uri.qsArray  = searchshield.parseQuery(uri.query); }  //non-standard urls require a fail-safe that relies on simply splitting the href function splitLink(href) {  // split the href on '/'  var linkParts = href.split("/");  // need domain and path  if ((linkParts == null) || (linkParts.length &lt; 2))   return false;   var uri = {   delimiter: (linkParts[3]).substring(0,1),   host: linkParts[2],   hostArray: (linkParts[2]).split('.'),   path: (linkParts[3]).substring(1),   qsArray: [],   query: '',   scheme: (linkParts[0]).substring(0, linkParts[0].length-1),   source: href   };  return uri; } if (!uri.host)  uri = splitLink(href); return uri;};searchshield.parseQuery = function (qs){ var qsArray = []; qs.replace(/(?:^|&amp;)([^&amp;=]*)=?([^&amp;]*)/g,      function ($0, $1, $2) {      if ($1) qsArray[$1] = $2;     } );  return qsArray;};// general functionssearchshield.arrayKeys = function (array){ var keys = new Array(); for(k in array)  keys.push(k); return keys;};searchshield.inArray = function (key, array, caseSensitive, exactMatch){ if (! array instanceof Array)  return false;  if (caseSensitive !== true)  caseSensitive = false;   if (exactMatch !== false)  exactMatch = true;  if (key instanceof String) {  for (var i=0; i &lt; array.length; i++)  {   var k = caseSensitive ? key.valueOf() : key.valueOf().toLowerCase();   var a = caseSensitive ? array[i] : array[i].toLowerCase();   if(exactMatch &amp;&amp; k === a)    return true;   else if (!exactMatch &amp;&amp; (-1 !== k.indexOf(a)))    return true;  } } else if (key instanceof Array) {  for (var i=0; i &lt; array.length; i++)   for (var j=0; j &lt; key.length; j++)   {    var k = caseSensitive ? key[j] : key[j].toLowerCase();    var a = caseSensitive ? array[i] : array[i].toLowerCase();    if (exactMatch &amp;&amp; k === a)     return true;    else if (!exactMatch &amp;&amp; (-1 !== k.indexOf(a)))     return true;   } } return false;};searchshield.getClickHandlerParams = function(clickHandler){ var re = /((?:'[^']*')|[\w]*)(?:,|\))/ig; var chParams = []; clickHandler.replace(re,   function($0, $1, $2){   if ($1)    chParams.push($1);  } );  return chParams;};// general use functions - end// Search constructorsearchshield.Search = function(){ this.doc    = null; this.engine   = null; this.engines   = null; this.links    = null; this.uri    = null; this.searchHash  = null; this.checkUrl   = null; this.useLocalImgs  = null; this.clockUrl   = null; // create engine list (actually key/value object will be used) this.engineList  = {};};searchshield.Search.prototype.getSearchNames = function(){ // order is important var names =  [  'Google',  'AVGGoogle',  'AltaVista',  'AVGYahoo',  'Yahoo',  'Bing',  'MSN', // MSN redirects to BING  'Baidu',  'Earthlink',  'AOL',  'Ask',  'Yandex',  'Seznam',  'Webhledani',  'eBay',///temp  'Digg',  'Slashdot',  'Twitter',  'GMail',  'Facebook',  'MySpace' ]; return names;};searchshield.Search.prototype.detectEngine = function(href){ if (!href)  return; var aEng = searchshield.Search.prototype.getSearchNames(); var aEngLen = aEng.length; for (var i=0; i &lt; aEngLen; i++) {  if (searchshield[aEng[i] + 'SearchEngine'].prototype.validSearch(href))   return aEng[i]; } return;};searchshield.Search.prototype.addEngine = function(engine){ if (!this.engines)  this.engines = new Array();  this.engines.push(engine);};searchshield.Search.prototype.addLink = function(inElement, inHref){ if (!this.links)  this.links = new Array(); var hrefHash; try {  hrefHash = searchshield.avgCallFunc(this.doc, 'GetHash', inHref); } catch (e){} var newNode = {   element: inElement,   href:   inHref,   hash:  hrefHash,   search:  this.searchHash  };  this.links.push(newNode);  return newNode;}// process the search result page after all search engines have been addedsearchshield.Search.prototype.process = function(doc){ // only process when searchshield is enabled if (!searchshield.enabled(doc))  return;   this.doc = doc; this.href = this.doc.location.href; this.uri = searchshield.parseLink(this.href); try {  this.searchHash  = searchshield.avgCallFunc(this.doc, 'GetHash', this.href);  // get any previously active engine  this.engine  = this.engineList[this.searchHash.toString()]; } catch (e) {} /*  Process Steps: 1. Add all supported search engines 2. Identify the active search engine 3. Get all document links and add AVG images  */  // STEP 1 - Add all supported search engines if (!this.engines) {  var aEng = xplSearch.getSearchNames();  var aEngLen = aEng.length;  for (var i=0; i &lt; aEngLen; i++)  {   xplSearch.addEngine(new searchshield[aEng[i]+'SearchEngine'](this));  } }  // search the engines if we didn't find one if (!this.engine) {  // STEP 2 - Identify the active search engine  var engLen = this.engines.length;  for (var i = 0; i &lt; engLen; i++)  {   if (this.engines[i].validSearch())   {    this.engine  = this.engines[i];    break;   }  }    // create a new engine instance to store  this.engineList[this.searchHash.toString()] = this.engine;    // init this search, if &lt; 1 either an error or disabled  //var sdkInit = 0;  //try {  // sdkInit = xpl_sdk.SXPL_InitSearch(this.href);  //}  //catch(e){}  //if (sdkInit &lt; 1)  // return false; } // return immediately if there is not an active search engine if (!this.engine)  return false;  try {   // base url to check for icons  this.checkUrl  = searchshield.avgCallFunc(this.doc, 'GetIconUrl', '1');  // check if using linked or local icons  this.useLocalImgs = !searchshield.getUrlContents(this.checkUrl);  // get the clock url  this.clockUrl  = searchshield.avgCallFunc(this.doc, 'GetIconUrl', '0'); } catch(e){}   // STEP 3 - Get all document links and add AVG images var alltags = this.doc.getElementsByTagName("*"); // this method works for IE, FF and Chrome for (var i=0; i &lt; alltags.length; i++) {  // ignore verdicts  if (alltags[i].id &amp;&amp; (alltags[i].id.indexOf("LXPLSS_") != -1))   continue;   //should the link be included?  Make sure includeLink always returns an href else FALSE,  var href = this.engine.includeLink(alltags[i]);   if (!href)   continue;  var newNode = this.addLink(alltags[i], href);  this.engine.addImage(newNode, this.clockUrl, false); } return (this.links ? this.links.length : false);};////////////////    SEARCH    ////////////////////////////////    SEARCH ENGINE    ////////////////// Interface for a SearchEngine objectsearchshield.SearchEngine = function(search){ this.search = search; this.type = 'standard'; this.processFrames = false; this.new_links  = true; this.onlyPrimaries = true; this.inline = {  clockImage: "linkscanner://clock12.png",  image: [ "linkscanner://safe12.png",     "linkscanner://caution12.png",     "linkscanner://warning12.png",     "linkscanner://blocked12.png"    ],  color: {   classname: ["green","yellow","orange","red"],   border: ["#00A120", "#EAA500", "#F57301", "#D20003"],   background: ["#C3E5CA", "#FEEFAE", "#FFD3B0", "#F5D4C1"]  } }; this.filter_urls = [  "ad.doubleclick.net", "ads1.revenue.net", "aslads.ask.com",  "bluestreak.com", "clickbacktrack.net", "clickbank.net",  "clickboothlnk.com", "clickmanager.com", "clickserve.cc-dt.com",  "dartsearch.net", "clicktraxmedia.com", "clk.atdmt.com",  "dpi-digialphoto.com", "feedpoint.net", "hypertracker.com",  "jdoqocy.com", "kqzyfj.com", "m1428.ic-live.com",  "mediaplex.com", "mr.mdmngr.com", "n339.asp-cc.com",  "offeredby.net", "offerweb.com", "pinktrax.com",  "pinktrax.com", "pixel1523.everesttech.net", "qckjmp.com",  "r.rd06.com", "revenuewire.net", "s0b.bluestreak.com",  "s2.srtk.net", "servedby.advertising.com", "store.yahoo.com",  "tf8.cpcmanager.com", "thetoptracker.com", "track.searchignite.com",  "tracking.searchmarketing.com", "www.dpbolvw.net", "www.rkdms.com",  "www.yellowbookleads.com"  ]; this.shortened_urls = [  "3.ly", "bit.ly", "is.gd", "tr.im", "short.to", "tiny.cc", "tinyurl.com", "lnk.ms", "msplinks.com"  ]; this.showCleanVerdicts  = true; this.showLowRiskVerdicts = true; this.showMedRiskVerdicts = true; this.VeriSignSplit   = searchshield.VERISIGN_SPLIT_NOTEST;};searchshield.SearchEngine.prototype.flyoverExists = function (doc){ return !!doc.getElementById("XPLSS_Flyover");};searchshield.SearchEngine.prototype.inlineExists = function (doc){ return !!doc.getElementById("XPLSS_InlineFlyover");};searchshield.SearchEngine.prototype.validSearch = function(href) { return false; };searchshield.SearchEngine.prototype.includeLink = function(link) { return false; };searchshield.SearchEngine.prototype.insertNodes = function(node, doc){ var element = node.element; var parentNode = node.element.parentNode; if (parentNode == null) {  // try and find element again based on the hash  element = doc.getElementById("xplid_" + node.hash);  parentNode = !!element ? element.parentNode : null; } var insertNode = !!element ? element.nextSibling : null; while ((insertNode   != null) &amp;&amp;    (insertNode.tagName != null) &amp;&amp;    (insertNode.tagName == "SPAN")) {  insertNode = insertNode.nextSibling; }  return [insertNode, parentNode];};searchshield.SearchEngine.prototype.addImage = function(node, image, hidden){ var element = node.element; var hash = node.hash; var score  = node.score; // set verdict display configuration var doc = element.ownerDocument; if (this.type != 'inline' &amp;&amp; !doc.getElementById('XPLSS_Flyover'))  searchshield.initFlyover(doc, this); // get the proper insertion point for the image var insertNodes = this.insertNodes(node, doc); var insertNode = insertNodes[0]; var parentNode = insertNodes[1]; if (!parentNode)  return; // see if we already have an image if ((insertNode  != null) &amp;&amp;   (insertNode.id != null) &amp;&amp;   (insertNode.id.indexOf("XPLSS_") &gt; -1)) {  return; } // mark search result anchor so it isn't processed repeatedly if (score == undefined)  element.setAttribute("avglschecked", hash + "S" + this.VeriSignSplit); // create a new image var img = doc.createElement('img'); img.src = image; img.id = "XPLSS_" + hash; img.style.borderStyle = "none"; img.style.margin = "0 3px";  // for IE, specify these style attributes to prevent inadvertent inheritance from parent if (img.width &amp;&amp; img.height) {  img.style.width = img.width + 'px';  img.style.height = img.height + 'px'; }  // apply custom element styles this.updateElementStyle(img, this.addImageStyle);  // create the link element  var anchor = doc.createElement("A"); anchor.setAttribute("id", "LXPLSS_" + hash); if ((hidden != null) &amp;&amp; (hidden == true)) { // hiding the parent will also hide its child nodes  anchor.style.display = "none"; }  // Default anchor styles //Over-ride possible border style with inline declaration anchor.style.borderStyle = "none"; // apply custom element styles this.updateElementStyle(anchor, this.addAnchorStyle); if (score == searchshield.SCORE_SS_VERISIGN) {  anchor.style.textDecoration = "none";  anchor.style.background = "none repeat scroll 0 0 transparent"; } // append the image to the link anchor.appendChild(img); // insert the node as either a sibling or a child if (insertNode != null)  parentNode.insertBefore(anchor, insertNode); else  parentNode.appendChild(anchor);   return anchor;};searchshield.SearchEngine.prototype.updateImage = function (hash, search, score, image, alt_image, flyover, click_thru, altClick_thru){  var updated = false;  var frameDoc  = this.search.doc;  var docFrames = frameDoc.frames;  var frameElem;  if (docFrames &amp;&amp; this.processFrames)  {   for (var i=0; i &lt; docFrames.length; i++)   {    try {     if (docFrames[i].document.getElementById(hash))     {      frameElem = docFrames[i].frameElement;      frameDoc = docFrames[i].document;      break;     }    }     catch(err){}   }  }  while ((element = frameDoc.getElementById(hash)) != null)  {   // check configuration to determine if verdict display property   var showVerdict = true;      var nSeverity = Number(score - 1);   switch (nSeverity)   {    case searchshield.XPLCHECK_RESULT_SEV_LOW:     showVerdict = this.showLowRiskVerdicts;     break;    case searchshield.XPLCHECK_RESULT_SEV_MED:     showVerdict = this.showMedRiskVerdicts;     break;    case searchshield.XPLCHECK_RESULT_SEV_NONE:     showVerdict = this.showCleanVerdicts;     break;    default:     if (score == searchshield.SCORE_SS_VERISIGN)      showVerdict = this.showCleanVerdicts;     break;   }      // remove image if no url specified   if ((!showVerdict) || (image == null) || (image.length &lt; 1))   {    // hide the parent anchor node    element.parentNode.style.display = "none";    // mark the id as being hidden (element is the image)    element.id = element.id + "H";    updated = true;        // if not a verisign score    if (score != searchshield.SCORE_SS_VERISIGN)     continue;   }   // cleanup flyover, replace any new lines or single quotes   flyover = searchshield.CleanupHTML(flyover);   // mark the id as having been updated   element.id = element.id + "U" + score;   element.src = image;   element.attachEvent("onmouseover", function(e){avglsflyover.popup(e, hash, search, flyover)});   element.attachEvent("onmouseout", function(e){avglsflyover.hide(e)});   // check for attribute updates (elementAttribute is an associative array (i.e., object)   if (this.elementAttribute)   {    for (a in this.elementAttribute)    {     if(this.elementAttribute[a])      element.setAttribute(a, this.elementAttribute[a]);    }   }   // To dynamically reduce verdict image size if it causes its container to scroll   // when not showing alt images determine if the element containing   // the verdict image is scrolling and decrease the image size by   // the scroll amount (min size is 80% or original)   var reduceBy = 0.8;   var scrl  = 0;   if (!alt_image || this.omitAltImage || this.VeriSignSplit == searchshield.VERISIGN_SPLIT_TESTB)   {    try{     var maxLoop = 5;     var cN = element.parentNode.parentNode;  //image-&gt;anchor-&gt;containerNodes...     while (cN &amp;&amp; maxLoop--)     {      if (cN.tagName == "DIV" || cN.tagName == "SPAN")      {       // get object height depending on ie document mode       var clientHeight = (cN.clientHeight == 0 ||         (this.search.doc.documentMode &amp;&amp; this.search.doc.documentMode &lt; 8)) ?         cN.offsetHeight :         cN.clientHeight;       scrl = cN.scrollHeight - clientHeight;       break;      }      cN = cN.parentNode;     }     if (0 &lt; scrl)     {      var eH = (element.height - scrl)/element.height;      if (reduceBy &gt; eH)       eH = reduceBy;            var newDim = Math.ceil(eH*element.height);            element.height = newDim;      element.width = newDim;            element.style.height = newDim + "px";      element.style.width = newDim + "px";     }    }    catch(e){}   }   // set default style attributes   element.style.display  = "";      // if verisign icon showing move our icon up for better centering of the 2   // except for IE7 browser - it does not like this style   try {    var ieVersion = parseFloat(navigator.appVersion.split("MSIE")[1]);    if (alt_image &amp;&amp; (alt_image.length &gt; 0) &amp;&amp; ieVersion != 7)     element.style.verticalAlign = "10%";   }   catch(err){};   // apply custom element styles   this.updateElementStyle(element, this.updateImageStyle)   // update the click thru   var link = this.search.doc.getElementById("L" + hash);   if (link)   {    link.href = click_thru;    link.id = link.id + "U" + score;   }   updated = true;   // add the alternate image if supplied BUT not on avg yahoo   if ((alt_image)    &amp;&amp;     (alt_image.length &gt; 0) &amp;&amp;     (!this.omitAltImage) &amp;&amp;    (this.VeriSignSplit != searchshield.VERISIGN_SPLIT_TESTB))   {    var vhash = hash.substring(hash.indexOf("_")+1);    // create a temporary link node    var tmp_node = {      element: element.parentNode,      href:  altClick_thru,      hash:  vhash + "VU" + score,      search:  this.searchHash,      score:  score     };    var altAnchor = this.addImage(tmp_node, alt_image, false);    if (altAnchor &amp;&amp; altAnchor.firstChild)    {     altAnchor.firstChild.setAttribute("onmouseover", "");     altAnchor.href = altClick_thru;    }   }  }    if (updated != false)  {   this.resizeFrame(frameElem);   return true;  } return false;};searchshield.SearchEngine.prototype.updateElementStyle = function (element, elementStyle){ if (elementStyle) { // a NULL attribte value will unset it  for(attr in elementStyle)  {   try {    if (element.style.setAttribute)     element.style.setAttribute(attr, elementStyle[attr]);    else     element.style[attr] = elementStyle[attr];   } catch(err){}  } }};searchshield.SearchEngine.prototype.resizeFrame = function (frameElem){ // resize frame to prevent unwanted scrolling after inserting verdicts // ignore inline and non-frame engines if ((this.type == 'inline') || (!this.processFrames))  return; // ensure all required elements are available if ((frameElem == null) || (frameElem.style == null) || (frameElem.contentWindow == null))  return; // if frame is scrolling vertically then resize var frameHeight = parseInt(frameElem.style.height, 10); if (!isNaN(frameHeight) &amp;&amp; (frameHeight &lt; frameElem.contentWindow.document.body.scrollHeight))  frameElem.style.height = frameElem.contentWindow.document.body.scrollHeight + 'px'; return;};searchshield.SearchEngine.prototype.getImgElement = function (element){ // return an xpl img element associated with a given element if (element == null)  return null; // go up the parent tree looking for a header or div while ( (element.parentNode != null) &amp;&amp;    (element.tagName.charAt(0) != "H") &amp;&amp;    (element.tagName.charAt(0) != "D") &amp;&amp;   (element.tagName.charAt(0) != "T") ) {  element = element.parentNode; } // if all the way to the top, nothing if ((element.tagName == "HTML") || (element == null))  return null; // get image tags, if none we are done var imgTags = element.getElementsByTagName("IMG"); if ((imgTags == null) || (imgTags.Length &lt; 1))  return null; for (var i = 0; i &lt; imgTags.length; i++) {  if ((imgTags[i].id == null) || (imgTags[i].id.indexOf("XPLSS_") == -1))   continue;  return imgTags[i]; } // else didn't find anything return null;};searchshield.SearchEngine.prototype.setRatingsConfig = function (doc){ // get verdict configuration, need at least severity var results = searchshield.avgCallFunc(doc, 'GetRatingsConfig'); var parts = !!results ? results.split('::') : null; if (parts != null &amp;&amp; parts.length &gt;= 5) { //if set to default then get config value  if (this.showCleanVerdicts === true)   this.showCleanVerdicts  = (parseInt(parts[0]) == 1) ? true : false;     if (this.showLowRiskVerdicts === true)   this.showLowRiskVerdicts = (parseInt(parts[1]) == 1) ? true : false;    if (this.showMedRiskVerdicts === true)   this.showMedRiskVerdicts = (parseInt(parts[2]) == 1) ? true : false;     this.VeriSignSplit = (parseInt(parts[4])); }  return true;};searchshield.SearchEngine.prototype.init_inline_ratings = function (doc){ if ((doc == null) || (doc.getElementById("XPLSS_InlineFlyover")))  return; if (!searchshield.quirksMode) {  // create style for inline flyovers  var styleTag = doc.createElement("style");  styleTag.setAttribute("id","avgILFOStyle");    var headTag = doc.getElementsByTagName("head")[0];  headTag.appendChild(styleTag);  var inline_style = styleTag.styleSheet;  // stub in the base image name as the url  inline_style.addRule(".avgILFO", "background: url(linkscanner://default_inline_border_tl.png) no-repeat top left;");  inline_style.addRule(".avgILFO", "width:0px; font-size:0px; z-index:9999; visibility:hidden; position:absolute; left:-5000px;");    inline_style.addRule(".avgILFO_content", "background: url(linkscanner://default_inline_border_r.png) top right repeat-y;");  inline_style.addRule(".avgILFO_content","font-size:10px; color:black; padding:0px 10px; text-align:left; word-wrap:break-word; line-height:130%");    inline_style.addRule(".avgILFO_head", "background: url(linkscanner://default_inline_border_tr.png) no-repeat top right;");  inline_style.addRule(".avgILFO_head", "width:0px; height:5px;");  inline_style.addRule(".avgILFO_head div","height:5px;");   inline_style.addRule(".avgILFO_foot", "background: url(linkscanner://default_inline_border_bl.png) no-repeat bottom left");  inline_style.addRule(".avgILFO_foot", "height:5px;");    inline_style.addRule(".avgILFO_foot div", "background: url(linkscanner://default_inline_border_br.png) no-repeat bottom right");  inline_style.addRule(".avgILFO_foot div", "height:5px; width:0px;"); }  try {   // create the popup box  var box = doc.createElement("DIV");  if (searchshield.quirksMode)  {   box.style.visibility = "hidden";   box.style.position = "absolute";   box.style.left = "-5000px";  }  box.setAttribute("id", "XPLSS_InlineFlyover");  box.setAttribute("class", "avgILFO");  doc.body.appendChild(box);  box = null; } catch(boxErr){}};searchshield.SearchEngine.prototype.show_inline_ratings = function (doc, node, image){  var href = node.href; var anchor = node.element; if ((href == null) || (href.length &lt; 1))  return;   if (avglsinlineflyover.imageExists(anchor))  return;  // mark search result anchor so it isn't processed repeatedly anchor.setAttribute("avglschecked", "1");  // get verdict  this.display_inline(doc, anchor, href, node, false);};searchshield.SearchEngine.prototype.display_inline = function (doc, anchor, href, node, update, min_severity){ // min_severity is the lowest severity to display, so setting it to // 1 would not display safe icons  var results = searchshield.avgCallFunc(doc, 'MalsiteCheck', href); if (results == null)  return;  var parts = results.split('::');  // need at least severity if (parts == null)  return;    var nSeverity = parseInt(parts[0]);  if (!update &amp;&amp; nSeverity == searchshield.XPLCHECK_RESULT_SEV_NONE) {  var shortUrl = searchshield.FilterUrl(href, this.shortened_urls);  if (shortUrl)  { // shortened url verdicts display later   var engine = this;   anchor.attachEvent("onmouseover", function(event){avglsinlineflyover.mouseOverHandler(event, doc, engine)});   return;  } }  // severity -1 signifies sb.dat load failure if ( nSeverity == -1 )  nSeverity = searchshield.XPLCHECK_RESULT_SEV_NONE; //blacklist url var blShortUrl = false; if (nSeverity == searchshield.XPLCHECK_RESULT_SEV_BLOCK) {  var shortUrl = searchshield.FilterUrl(href, this.shortened_urls);  if (shortUrl)   blShortUrl = true; }  // need xlated cat tag and category if (parts.length &lt; 3)  return; // check the minimum to display if ((min_severity != null) &amp;&amp; (nSeverity &lt; min_severity))  return;   if (nSeverity == searchshield.XPLCHECK_RESULT_SEV_LOW &amp;&amp; !this.showLowRiskVerdicts) {  if (update)   this.avg_ls_inline_hide_verdict(anchor);    return; }  if (nSeverity == searchshield.XPLCHECK_RESULT_SEV_MED &amp;&amp; !this.showMedRiskVerdicts) {  if (update)   this.avg_ls_inline_hide_verdict(anchor);    return; } if (nSeverity == searchshield.XPLCHECK_RESULT_SEV_NONE &amp;&amp; !this.showCleanVerdicts)  {  if (update)   this.avg_ls_inline_hide_verdict(anchor);     return; } if (update)  this.update_inline_image(anchor, nSeverity, parts); else  this.add_inline_image(doc, anchor, nSeverity, parts, blShortUrl);};searchshield.SearchEngine.prototype.avg_ls_inline_hide_verdict = function (anchor){ var image = avglsinlineflyover.getImage(anchor); if (image) {  image.style.display = "none";  if (image.parentNode &amp;&amp; image.parentNode.id == "avg_ls_anch")   image.parentNode.style.display = "none"; }};searchshield.SearchEngine.prototype.update_inline_image = function (anchor, nSeverity, aRisk){ // update the image already in the page if (anchor &amp;&amp; anchor.firstChild) {  var html  = '';  var image = '';   if (aRisk != null &amp;&amp; nSeverity != null)  {   var riskCategory = aRisk[1];   var riskName  = aRisk[2];   var bgColor   = this.inline.color.background[nSeverity];   var borderColor  = this.inline.color.border[nSeverity];   image    = this.inline.image[nSeverity];   html    = avglsinlineflyover.build(riskCategory, riskName, bgColor, borderColor);  }    var imageElem = anchor.firstChild;  imageElem.src = image;    if ( html &amp;&amp; html.length &gt; 0 )  {   imageElem.setAttribute("title", "");   imageElem.attachEvent("onmouseover", function(e){avglsinlineflyover.popup(e, html, nSeverity)});   imageElem.attachEvent("onmouseout", function(e){avglsinlineflyover.hide(e)});  } }};// add the image to the pagesearchshield.SearchEngine.prototype.add_inline_image = function (doc, anchor, nSeverity, aRisk, blShortUrl){ if (anchor == null || anchor.parentNode == null)  return null; // get the proper insertion point for the image var insertNode = anchor.nextSibling; while ((insertNode   != null) &amp;&amp;    (insertNode.tagName != null) &amp;&amp;    (insertNode.tagName == "SPAN")) {  insertNode= insertNode.nextSibling; }  // see if we already have an image anchor if ((insertNode  != null) &amp;&amp;   (insertNode.id != null) &amp;&amp;   (insertNode.id == "avg_ls_anch")) {  return null; } var html  = ''; var image = this.inline.clockImage;  if (aRisk != null &amp;&amp; nSeverity != null) {  var riskCategory = aRisk[1];  var riskName  = aRisk[2];  var bgColor   = this.inline.color.background[nSeverity];  var borderColor  = this.inline.color.border[nSeverity];  image    = this.inline.image[nSeverity];  var blUrl;  if (blShortUrl)  {   var aRiskName = riskName.split(':');   var sUrl = searchshield.checkUrl(aRiskName[1]);   blUrl = {};   blUrl.riskNameLabel = aRiskName[0] + ': ';   blUrl.riskCategory = riskCategory;   blUrl.bgColor = bgColor;   blUrl.borderColor = borderColor;   blUrl.sUrl = sUrl;  }  else  {   html = avglsinlineflyover.build(riskCategory, riskName, bgColor, borderColor);  } } doc = anchor.ownerDocument; var img   = doc.createElement("img"); img.src   = image; img.setAttribute("id","avg_ls_image"); img.style.width = "12px"; img.style.height = "12px"; img.style.border = "none"; img.style.padding = "0 3px"; img.style.margin = "0";  if ((html &amp;&amp; html.length &gt; 0) || (blUrl != undefined)) {  img.setAttribute("title", "");  img.attachEvent("onmouseover", function(e){avglsinlineflyover.popup(e, html, nSeverity, blUrl)});  img.attachEvent("onmouseout", function(e){avglsinlineflyover.hide(e)}); } // create the link element  var newAnchor = doc.createElement("A"); newAnchor.setAttribute("id", "avg_ls_anch"); newAnchor.style.display = "inline-block"; newAnchor.style.background = "none repeat scroll 0 0 transparent";  newAnchor.appendChild(img); img = null; // insert the node as either a sibling or a child if (insertNode != null)  anchor.parentNode.insertBefore(newAnchor, insertNode); else  anchor.parentNode.appendChild(newAnchor);    return newAnchor;  };////////////////    SEARCH ENGINE    ///////////////////////////////    GOOGLE SEARCH ENGINE    ///////////////searchshield.GoogleSearchEngine = function(search){ searchshield.SearchEngine.call(this, search); this.onlyPrimaries = false;};searchshield.GoogleSearchEngine.prototype = new searchshield.SearchEngine();searchshield.GoogleSearchEngine.prototype.constructor = searchshield.GoogleSearchEngine;searchshield.GoogleSearchEngine.prototype.name = "google"; // the name by which the search engine is known (always lowercase)searchshield.GoogleSearchEngine.prototype.validSearch = function(href) { var uri; if (typeof(this.search) === 'undefined' || null === this.search)  uri = searchshield.parseLink(href); else  uri = this.search.uri; if(!uri || !uri.host)  return false; var hostMatch = false; var domain  = uri.host;  // re stitch the uri path and query elements to // use existing logic var path = uri.path + uri.delimiter + uri.query; // For Google the host must match: // .google.com  OR // .google.com.XX OR // .google.co.XX OR // .google.XX  where XX is a country code // one special case is www.googe.off.ai (Anguilla) // Where any subdomain can come before the top level domain if ( /(\.(?:google|mozilla)\.(?:com|(?:co|off)\.[a-z]{2}|[a-z]{2}))/i.test(domain) ) {  //check the path  if ((path.indexOf("search?") == 0) ||   (path.indexOf("sponsoredlinks?") == 0) ||   (path.indexOf("webhp?") == 0) ||   (path.indexOf("webhp#") == 0) ||   (path.indexOf("#q=") == 0) ||   (path.indexOf("#hl=") == 0) ||   (path.indexOf("#sclient=") == 0))  {   return true;  } } return false;};searchshield.GoogleSearchEngine.prototype.includeLink = function(tag){ var href = ""; var outHref = false; var findStr = ""; // check for interstitials if (searchshield.DoesURLContain(tag.href, this.search.uri.host)) {  findStr = this.search.uri.host + "/interstitial?";  if (tag.className == "l" &amp;&amp; tag.href)  {   if (tag.href.indexOf(findStr) != -1)   {    findStr = "?url=";    var pos = tag.href.indexOf(findStr);    if (pos !== -1)    {     pos += 5;     outHref = tag.href.substring(pos);     if (searchshield.FilterUrl(outHref, this.filter_urls))      return false;            return outHref;    }   }  }  if (tag.className == "sla")  {   findStr = "/url?q=";   urlPos = tag.href.indexOf(findStr);   if (urlPos != -1)   {    urlPos += 7;    outHref = tag.href.substring(urlPos);    return outHref;   }  }    // if an ad id  if ((tag.id.indexOf("pa") == 0) || (tag.id.indexOf("an") == 0) ||   (tag.className == "resultLink"))  {   var urlPos = -1;    // ads now need unescaping   href = unescape(tag.href);   findStr= "/url?sa=";   if (href.indexOf(findStr) != -1)   { // first kind, locate real url    findStr= "&amp;q=http";    urlPos = href.indexOf(findStr);    if (urlPos != -1)     urlPos += 3; // puts it on the http   }   if (urlPos == -1)   {    findStr = "/pagead/iclk?sa=";    if (href.indexOf(findStr) != -1)    { // second kind, locate real url     findStr = "&amp;adurl=http";     urlPos = href.indexOf(findStr);     if (urlPos != -1)      urlPos += 7; // puts it on the http    }   }   if (urlPos == -1)   {    if (href.indexOf("/aclk?sa=") != -1)    { // third kind     urlPos = href.indexOf("&amp;q=http");     if (urlPos != -1)      urlPos += 3; // puts it on the http     else     {      urlPos  = href.indexOf("&amp;lp=http");      if (urlPos != -1)       urlPos += 4;      else      {       findStr = "&amp;adurl=http";       urlPos = href.indexOf(findStr);       if (urlPos != -1)        urlPos += 7; // puts it on the http      }           }    }   }   if (urlPos == -1)   {    if (href.indexOf("/url?cad=") != -1)    { // fourth kind     urlPos = href.indexOf("&amp;q=http");     if (urlPos != -1)      urlPos += 3; // puts it on the http    }   }   if (urlPos != -1)   {    outHref = href.substring(urlPos);    // the destination url is in the href string of this redirector    if (outHref.indexOf('xg4ken.com') &gt; -1)    {     urlPos = (unescape(outHref)).indexOf('url[]=') + 6;     var destUrl = (unescape(outHref)).substring(urlPos);     if (searchshield.FilterUrl(destUrl, this.filter_urls))     {      var destUrl = searchshield.getHrefFromCiteElement(tag);      if (destUrl)       return searchshield.checkUrl(searchshield.removeHtmlTags(destUrl));      return false;     }     return destUrl;    }    // filtered url but can get destination from href string    if (outHref.indexOf('altfarm.mediaplex.com') &gt; -1)    {     var tmpoh = unescape(outHref);     var destUrl = tmpoh.substring(tmpoh.indexOf('DURL=')+5);     if (destUrl != null)     {      var destUrl = unescape(destUrl);      return destUrl;     }    }    // extract any fragment text, shouldn't be unescaped    var pound = outHref.indexOf("#");     if (pound != -1)    {     var fragment = outHref.substring(pound);     outHref = outHref.substring(0, pound);     outHref = unescape(outHref);     outHref += fragment;     if (searchshield.FilterUrl(outHref, this.filter_urls))      return false;     return outHref;    }    outHref = unescape(outHref);    if (outHref.indexOf("?") == -1)    {     var ampPos = outHref.indexOf("&amp;");     if (ampPos != -1)      outHref = outHref.substring(0, ampPos);    }        if (searchshield.FilterUrl(outHref, this.filter_urls))    {     var destUrl = searchshield.getHrefFromCiteElement(tag);     if (destUrl)      return searchshield.checkUrl(searchshield.removeHtmlTags(destUrl));     return false;    }    return outHref;   }  }  // recommended link - use following to see one  // http://www.google.cz/search?hl=cs&amp;q=warey&amp;btnG=Hledat&amp;lr=lang_cs  // elem parent class = r  // href must contain - url? and q=http  var parentNode = tag.parentNode;  if (parentNode &amp;&amp; (parentNode.className.toLowerCase() == "r"))  {   href = tag.href;   if (href &amp;&amp; (href.indexOf("/url?") != -1))   {    // locate the real url    var urlPos = href.indexOf("q=http");    if (urlPos != -1)    {     urlPos += 2;     outHref = href.substring(urlPos);     // include entire param up to '&amp;'     var ampPos = outHref.indexOf("&amp;");     if (ampPos != -1)      outHref = outHref.substring(0, ampPos);     return outHref;    }   }  } } // no link to self else if (tag.className &amp;&amp; (tag.className.charAt(0) == "l" || tag.className == "sla")) {  // check for any images on the link  if (0 === tag.getElementsByTagName("IMG").length)   return tag.href; } // else nothing return false;};///////////////    GOOGLE    //////////////////////////////    AVG GOOGLE SEARCH ENGINE    ///////////////searchshield.AVGGoogleSearchEngine = function(search){ searchshield.SearchEngine.call(this, search); this.onlyPrimaries = false;};searchshield.AVGGoogleSearchEngine.prototype = new searchshield.SearchEngine();searchshield.AVGGoogleSearchEngine.prototype.constructor = searchshield.AVGGoogleSearchEngine;searchshield.AVGGoogleSearchEngine.prototype.name = "avggoogle"; // the name by which the search engine is known (always lowercase)searchshield.AVGGoogleSearchEngine.prototype.validSearch = function(href) { var uri; if (typeof(this.search) === 'undefined' || null === this.search)  uri = searchshield.parseLink(href); else  uri = this.search.uri; if(!uri || !uri.host)  return false; var domain  = uri.host;  // re stitch the uri path and query elements to // use existing logic var path = uri.path + uri.delimiter + uri.query; if  (domain.indexOf("search.avg.com") &gt; -1) {   // ads link back to google  return true; }  return false;};searchshield.AVGGoogleSearchEngine.prototype.includeLink = function(tag){ var outHref = false; var findStr = ""; // check for interstitials if (searchshield.DoesURLContain(tag.href, "google.com")) {  // link back to self - DIV elem GrandParent class of res1 or res3 is Sponsored Link   var parentNode = tag.parentNode;  if (parentNode)  {   var grandParentNode = tag.parentNode.parentNode;   if (grandParentNode)   {    if ((grandParentNode.tagName == "DIV") &amp;&amp;      ((grandParentNode.className.toLowerCase() == "res1") ||     (grandParentNode.className.toLowerCase() == "res3")))    {     var urlPos = -1;      // ads now need unescaping     href = unescape(tag.href);     if (urlPos == -1)     {      if (href.indexOf("/aclk?sa=") != -1)      {        findStr = "&amp;adurl=http";       urlPos = href.indexOf(findStr);       if (urlPos != -1)        urlPos += 7; // puts it on the http              }     }     if (urlPos != -1)     {      outHref = href.substring(urlPos);      // the destination url is in the href string of this redirector      if (outHref.indexOf('xg4ken.com') &gt; -1)      {       urlPos = (unescape(outHref)).indexOf('url[]=') + 6;       var destUrl = (unescape(outHref)).substring(urlPos);       if (searchshield.FilterUrl(destUrl, this.filter_urls))       {        var destUrl = searchshield.getHrefFromCiteElement(tag);        if (destUrl)         return searchshield.checkUrl(searchshield.removeHtmlTags(destUrl));        return false;       }       return destUrl;      }      // filtered url but can get destination from href string      if (outHref.indexOf('altfarm.mediaplex.com') &gt; -1)      {       var tmpoh = unescape(outHref);       var destUrl = tmpoh.substring(tmpoh.indexOf('DURL=')+5);       if (destUrl != null)       {        var destUrl = unescape(destUrl);        return destUrl;       }      }          // extract any fragment text, shouldn't be unescaped      var pound = outHref.indexOf("#");       if (pound != -1)      {       var fragment = outHref.substring(pound);       outHref = outHref.substring(0, pound);       outHref = unescape(outHref);       outHref += fragment;       if (searchshield.FilterUrl(outHref, this.filter_urls))        return false;       return outHref;      }      outHref = unescape(outHref);      if (outHref.indexOf("?") == -1)      {       var ampPos = outHref.indexOf("&amp;");       if (ampPos != -1)        outHref = outHref.substring(0, ampPos);      }          if (searchshield.FilterUrl(outHref, this.filter_urls))      {       var destUrl = searchshield.getHrefFromCiteElement(tag);       if (destUrl)        return searchshield.checkUrl(searchshield.removeHtmlTags(destUrl));       return false;      }      return outHref;     }    }   }  } }    // no link to self else {  var parentNode = tag.parentNode;  if (parentNode)  {   var grandParentNode = tag.parentNode.parentNode;   if (grandParentNode)   {    if ((grandParentNode.tagName == "DIV") &amp;&amp;      (grandParentNode.className.toLowerCase() == "res2"))    {     // check for any images on the link     if (0 === tag.getElementsByTagName("IMG").length)      return tag.href;    }   }  } } // else nothing return false;}///////////////    AVG GOOGLE    //////////////////////////////    YAHOO SEARCH ENGINE    ///////////////searchshield.YahooSearchEngine = function(search){ searchshield.SearchEngine.call(this, search); this.showCleanVerdicts = false;};searchshield.YahooSearchEngine.prototype = new searchshield.SearchEngine();searchshield.YahooSearchEngine.prototype.constructor = searchshield.YahooSearchEngine;searchshield.YahooSearchEngine.prototype.name = "yahoo";searchshield.YahooSearchEngine.prototype.validSearch = function(href){ var uri; if (typeof(this.search) === 'undefined' || null === this.search)  uri = searchshield.parseLink(href); else  uri = this.search.uri; if(!uri || !uri.host)  return false; var domain = uri.host; // re stitch the uri path and query elements to // use existing logic var path = uri.path + uri.delimiter + uri.query; // For Yahoo the host must match: // search.yahoo.com  OR // xx.search.yahoo.com where xx is the country code OR // search.yahoo.co.jp OR // for Yahoo China: one.cn.yahoo.com, search.cn.yahoo.com or www.yahoo.cn if ((domain.match(/search\.yahoo\.co(?:m|\.jp)/i) ||  domain.match(/(?:search|one)\.cn\.yahoo\.com/i) ||  domain.match(/www\.yahoo\.cn/i)) &amp;&amp;   path.match(/^(?:search[;?]|s\?)/i)) {  return true; } return false;};searchshield.YahooSearchEngine.prototype.includeLink = function(tag){ var href  = ""; var outHref  = ""; var findStr  = ""; // yahoo likes to encode the url href = unescape(tag.href); if ((tag.className.indexOf("yschttl") != -1) ||   (tag.className.indexOf("spt") != -1)) {  var da = href.indexOf("**");  var ad = href.indexOf("*-");  if (da != -1)   outHref = href.substring(da+2);  else if (ad != -1)   outHref = href.substring(ad+2);  else   outHref = href ;     if (outHref.toLowerCase().indexOf("overture.") !== -1)   return false; } else if ((tag.tagName)   &amp;&amp;     (tag.tagName === "A")  &amp;&amp;     (!tag.className)) {  var tagParent = tag.parentNode;    // if anchor without className then search parentNodes  if ((tagParent) &amp;&amp;   (tagParent.tagName !== "EM") &amp;&amp;   (searchshield.getParentNodeByClassName("yst-web", tag, 4)))  {   // China Yahoo support   outHref = href;  }    else if ((tagParent) &amp;&amp;    (tagParent.tagName === "H3") &amp;&amp;    (!!searchshield.getParentNodeById("WS2m",tag, 5)))  {   // Japan Yahoo support   var da = href.indexOf("**");   if (da == -1)    outHref = href;   else    outHref = href.substring(da+2);  }  else if ((tagParent) &amp;&amp;    (tagParent.className !== "c") &amp;&amp;    (tagParent.parentNode.id !== "fpn") &amp;&amp;    (!!searchshield.getParentNodeByClassName("ymc", tag, 7)))  {   // Korea Yahoo support - when not caught by yschttl   var da = href.indexOf("**");   if (da !== -1)    outHref = href.substring(da+2);  } } else if (!this.onlyPrimaries) {  findStr = "&amp;yargs=";  var yargs = href.indexOf(findStr);  if (yargs != -1)  {   outHref = href.substring(yargs+findStr.length);   // check for prefix   if (outHref.indexOf("://") == -1)    outHref = "http://" + outHref;   // if inside an &lt;i&gt;, probably a paypal link, don't include   if (tag.parentNode &amp;&amp; (tag.parentNode.tagName == "I"))    return false;  }  } // filter domains // split the url based on '/' var parts = !!outHref ? outHref.split('/') : null; // Filter out domains that match any of the search engine's names if (!parts || !parts[2])  return false;   var domain = parts[2]; if ((domain.indexOf("rdrjp.yahoo.com") != -1) ||  (domain.indexOf("rdrkrs.yahoo.com") != -1) ||  (domain.indexOf("rdrtpe.yahoo.com") != -1) ||  (domain.indexOf("rdrird.yahoo.com") != -1) ||  (domain.indexOf("rdrhk2.yahoo.com") != -1) ||  (domain.indexOf("rdrsg1.yahoo.com") != -1) ||  (domain.indexOf("rdrin2.yahoo.com") != -1) ||  (domain.indexOf("rdre1.yahoo.com") != -1) ||  (domain.indexOf("rdrw1.yahoo.com") != -1)  ) {  return false; } // set for yahoo to get parent node for image insertion var hash = searchshield.avgCallFunc(this.doc, 'GetHash', outHref); tag.setAttribute("id", "xplid_" + hash); return outHref;};///////////////    YAHOO SEARCH ENGINE    //////////////////////////////    AVG YAHOO SEARCH ENGINE    ///////////////searchshield.AVGYahooSearchEngine = function(search){ searchshield.SearchEngine.call(this, search); this.showCleanVerdicts = false; this.omitAltImage = true; this.updateImageStyle = {  verticalAlign: null };};searchshield.AVGYahooSearchEngine.prototype = new searchshield.SearchEngine();searchshield.AVGYahooSearchEngine.prototype.constructor = searchshield.AVGYahooSearchEngine;searchshield.AVGYahooSearchEngine.prototype.name = "avgyahoo";searchshield.AVGYahooSearchEngine.prototype.validSearch = function(href){ var uri; if (typeof(this.search) === 'undefined' || null === this.search)  uri = searchshield.parseLink(href); else  uri = this.search.uri; if(!uri || !uri.host)  return false;  var domain= uri.host; //path may be 'avg/search' or 'search' var pathArray = uri.path.split("/"); var avg = pathArray[0]; // re stitch the uri path and query elements // to use existing logic var path = (undefined == pathArray[1]) ? pathArray[0] : pathArray[1];  path += uri.delimiter + uri.query; // For AVG Yahoo classic the host must match: // yhs.search.yahoo.com OR // .yhs.search.yahoo.com if (domain.indexOf("yhs.search.yahoo.co") != -1) {  if ((avg == "avg") &amp;&amp;   ((path.indexOf("search?") == 0) ||    (path.indexOf("search;") == 0)))  {   return true;  } }  // also support new metro version which DOESN'T  // contain /avg so avg split part is path // valid domains are: // search.yahoo.com,  // xx.search.yahoo.com and // search.yahoo.co.xx if (domain.indexOf("search.yahoo.co") != -1)  {  // path (split avg) must start with search and  // contain the avg toolbar parameter  if (((path.indexOf("search?") == 0) ||   (path.indexOf("search;") == 0)) &amp;&amp;   (path.indexOf("fr=yhs-avg") != -1))  {   return true;  } } return false;};searchshield.AVGYahooSearchEngine.prototype.includeLink = function(tag){ var href  = ""; var outHref  = ""; var findStr  = ""; if (this.search.doc.body.className.toLowerCase() != "standard") { // handle as std Yahoo results page  return searchshield.YahooSearchEngine.prototype.includeLink(tag); }  // yahoo likes to encode the url href = unescape(tag.href); if (tag.target == "_top") {  var da = href.indexOf("**");  if (da != -1)   outHref = href.substring(da+2);  else   outHref = href ;  if (outHref.toLowerCase().indexOf("overture.") !== -1)   return false; } else if (!this.onlyPrimaries) {  findStr = "&amp;yargs=";  var yargs = href.indexOf(findStr);  if (yargs != -1)  {   outHref = href.substring(yargs+findStr.length);   // check for prefix   if (outHref.indexOf("://") == -1)    outHref = "http://" + outHref;   // if inside an &lt;i&gt;, probably a paypal link, don't include   if (tag.parentNode &amp;&amp; (tag.parentNode.tagName == "I"))    return false;  }  } // filter domains // split the url based on '/' var parts = outHref.split('/'); // Filter out domains that match any of the search engine's names if (!parts[2])  return false;   var domain = parts[2]; if ((domain.indexOf("rdrjp.yahoo.com") != -1) ||  (domain.indexOf("rdrkrs.yahoo.com") != -1) ||  (domain.indexOf("rdrtpe.yahoo.com") != -1) ||  (domain.indexOf("rdrird.yahoo.com") != -1) ||  (domain.indexOf("rdrhk2.yahoo.com") != -1) ||  (domain.indexOf("rdrsg1.yahoo.com") != -1) ||  (domain.indexOf("rdrin2.yahoo.com") != -1) ||  (domain.indexOf("rdre1.yahoo.com") != -1) ||  (domain.indexOf("rdrw1.yahoo.com") != -1)  ) {  return false; } return outHref;};///////////////    AVG YAHOO SEARCH ENGINE    //////////////////////////////    MSN SEARCH ENGINE    ///////////////searchshield.MSNSearchEngine = function(search){ searchshield.SearchEngine.call(this, search); this.onlyPrimaries = false;};searchshield.MSNSearchEngine.prototype = new searchshield.SearchEngine();searchshield.MSNSearchEngine.prototype.constructor = searchshield.MSNSearchEngine;searchshield.MSNSearchEngine.prototype.name = "msn";searchshield.MSNSearchEngine.prototype.validSearch = function(href){ var uri; if (typeof(this.search) === 'undefined' || null === this.search)  uri = searchshield.parseLink(href); else  uri = this.search.uri; if(!uri || !uri.host)  return false; var hostMatch = false; var domain  = uri.host; // re stitch the uri path and query elements to // use existing logic var path = uri.path + uri.delimiter + uri.query; // For MSN the host must match: // search.msn.com  OR // search.live.com if (domain.indexOf("search.msn.co") &gt; -1) {  if (domain.charAt(13) == 'm')   hostMatch = true;  else if ((domain.charAt(13) == '.') &amp;&amp; (domain.length == 16))   hostMatch = true; } else if (domain.indexOf("search.live.co") &gt; -1) {  if (domain.charAt(14) == 'm')   hostMatch = true;  else if ((domain.charAt(14) == '.') &amp;&amp; (domain.length == 17))   hostMatch = true; }  if (hostMatch) {  if (path.indexOf("results.aspx") == 0)   return true; } return false;};searchshield.MSNSearchEngine.prototype.includeLink = function(tag){ var outHref = false;  // these don't seem common from Firefox, but they are in IE if (searchshield.DoesURLContain(tag.href, "g.msn.co")) {  var qPos = tag.href.indexOf("?");  if (qPos != -1)  {   var postPart = tag.href.substring(qPos+1);   var dblAmp = postPart.indexOf("&amp;&amp;");   if (dblAmp != -1)   {    outHref = postPart.substring(0, dblAmp);    return outHref;   }  } } else if (searchshield.DoesURLContain(tag.href, "r.msn.co")) {  var element = tag;  var parentNode = tag.parentNode;  // top links - check for a CITE  var spanElements = element.getElementsByTagName("CITE");  if ((spanElements != null)    &amp;&amp;    (spanElements.length &gt; 0))  {   outHref = spanElements[0].innerHTML;   // replace any nbsp's   outHref = outHref.replace("&amp;nbsp;", " ");   // url is after the last space in the html, after the '-'   var space_pos = outHref.lastIndexOf(" ");   if (space_pos != -1)    outHref = outHref.slice(space_pos + 1);   outHref = searchshield.checkUrl(outHref);   return outHref;  }    // side links   if (element.lastChild != null)  {   outHref = element.lastChild.innerHTML;   if ( outHref != null)   {    outHref = searchshield.checkUrl(outHref);    return outHref;   }  } } else if (searchshield.DoesURLContain(tag.href, this.search.uri.host)     ||    searchshield.DoesURLContain(tag.href, ".live.com")     ||    searchshield.DoesURLContain(tag.href, "msn.")      ||    searchshield.DoesURLContain(tag.href, "msnscache.com")    ||    searchshield.DoesURLContain(tag.href, "advertising.microsoft.co") ||    searchshield.DoesURLContain(tag.href, "javascript:")    ||    searchshield.DoesURLContain(tag.href, "go.microsoft.co")   ||    searchshield.DoesURLContain(tag.href, "hotmail.co")) {  // not a link  return false; } else if (tag.id.toLowerCase() == "trademarks") {  // don't link the trademark at the bottom of the page  return false; } else {  // include it  return tag.href; }};///////////////    MSN SEARCH ENGINE    //////////////////////////////    BING SEARCH ENGINE    ///////////////searchshield.BingSearchEngine = function(search){ searchshield.SearchEngine.call(this, search);};searchshield.BingSearchEngine.prototype = new searchshield.SearchEngine();searchshield.BingSearchEngine.prototype.constructor = searchshield.BingSearchEngine;searchshield.BingSearchEngine.prototype.name = "bing";searchshield.BingSearchEngine.prototype.validSearch = function(href){ var uri; if (typeof(this.search) === 'undefined' || null === this.search)  uri = searchshield.parseLink(href); else  uri = this.search.uri; if(!uri || !uri.host)  return false; var hostMatch = false; var domain  = uri.host; // re stitch the uri path and query elements to // use existing logic var path = uri.path + uri.delimiter + uri.query;  // For bing the host must match: // www.bing.com or www.bing.net // xx.bing.com or xx.bing.net where xx is a country code // bing.com.xx where xx is a country code // bing.search.xxxx.net where xxxx may be something like daum if ((domain.indexOf("www.bing.com") !== -1) ||  (domain.indexOf("www.bing.net") !== -1) ||  (domain.indexOf("bing.net") !== -1)) {  hostMatch = true; } else if ((domain.indexOf("bing.search.") !== -1) &amp;&amp;     (domain.indexOf(".net") === (domain.length-4)))  { //bing.search.xxxx.net  hostMatch = true; } else { // xx.bing.com or bing.com.xx  var domainLen = domain.length;  var tldPos = domain.indexOf(".bing.com");  if (tldPos &gt; -1)  {   if ((domainLen - tldPos) == 9)    hostMatch = true;  }  }  if (hostMatch) {  var displayStyle = (domain == 'bing.search.daum.net') ? 'inline-block' : 'inline';  this.addAnchorStyle = {   display: displayStyle  };    if (path.indexOf("search?") == 0)   return true; } return false;};searchshield.BingSearchEngine.prototype.includeLink = function(tag){ var outHref = false; if (tag.tagName == 'IMG') { //no images   return false; }   if (tag.href.charAt(0) == '/') { //no relative links  return false; } if (/trademarks/i.test(tag.id)) {  // don't link the trademark at the bottom of the page  return false; }  if ((tag.parentNode) &amp;&amp; (/sc_stc/i.test(tag.parentNode.id))) { // don't verdict the social sites - our verdict doesn't fit  return false; } else if (!!searchshield.getParentNodeByClassName("sw_t",tag,3)) { // no links in page header  return false; } else if (searchshield.DoesURLContain(tag.href, "r.msn.co") ||    searchshield.DoesURLContain(tag.href, "overture.com")) { // france has r.msn.co and italy has overture.com sponsored links  // with the link in CITE element    var spanElements = null;    // top links - check for a CITE  spanElements = tag.getElementsByTagName("CITE");  if ((spanElements == null) || (spanElements.length &lt;= 0))  {   if (tag.parentNode &amp;&amp; tag.parentNode.parentNode)    spanElements = tag.parentNode.parentNode.getElementsByTagName("CITE");  }    if ((spanElements != null) &amp;&amp; (spanElements.length &gt; 0))  {   outHref = spanElements[0].innerHTML;   if (outHref != null)   {    // replace any nbsp's    outHref = outHref.replace("&amp;nbsp;", " ");    // url is after the last space in the html, after the '-'    var space_pos = outHref.lastIndexOf(" ");    if (space_pos != -1)     outHref = outHref.slice(space_pos + 1);    outHref = searchshield.checkUrl(outHref);    // save the link    return outHref;   }  }    // side links   if (tag.lastChild != null)  {   outHref = tag.lastChild.innerHTML;   if (outHref != null)   {    outHref = searchshield.checkUrl(outHref);    // save the link    return outHref;   }  } } // no sponsored links for now  else if (searchshield.DoesURLContain(tag.href, this.search.uri.host) ||   searchshield.DoesURLContain(tag.href, ".live.com")    ||   searchshield.DoesURLContain(tag.href, ".bing.com")    ||   searchshield.DoesURLContain(tag.href, ".bing.net")    ||   searchshield.DoesURLContain(tag.href, ".daum.net")    ||   searchshield.DoesURLContain(tag.href, ".gmarket.co")   ||   searchshield.DoesURLContain(tag.href, ".multimap.com")   ||   searchshield.DoesURLContain(tag.href, "msn.")     ||   searchshield.DoesURLContain(tag.href, "ms.ciao.")    ||   searchshield.DoesURLContain(tag.href, "ms.ciao-")    ||   searchshield.DoesURLContain(tag.href, "advertising.microsoft.co") ||   searchshield.DoesURLContain(tag.href, "javascript:")    ||   searchshield.DoesURLContain(tag.href, "go.microsoft.co")   ||   searchshield.DoesURLContain(tag.href, "hotmail.co")     ||   searchshield.DoesURLContain(tag.href, "cc.bingj.com")    ||   searchshield.DoesURLContain(tag.href, "microsofttranslator.com") ||   searchshield.DoesURLContain(tag.href, ".engkoo.com")    ||   searchshield.DoesURLContain(tag.href, "sealinfo.verisign.com")  ||   searchshield.DoesURLContain(tag.href, "explabs.com")    ||   searchshield.DoesURLContain(tag.href, "onlinehelp.microsoft.com") ||   searchshield.DoesURLContain(tag.href, ".myoverture")) {  // not a link  return false; } else  return tag.href;};searchshield.BingSearchEngine.prototype.addImage = function(node, image, hidden){ var element = node.element; var parentNode  = node.element.parentNode; var grandParentNode = !!parentNode ? parentNode.parentNode : null; // if there are redundant links in the same grandparent then skip them if (!!grandParentNode) {  gpChildren = grandParentNode.childNodes;  for (var i=0; i &lt; gpChildren.length; i++)  {   if (!!element.href &amp;&amp; gpChildren[i].tagName == "A" &amp;&amp; gpChildren[i].href == element.href)    return;  } } var parent = searchshield.SearchEngine.prototype.addImage; return parent.call(this, node, image, hidden);};///////////////    BING SEARCH ENGINE    //////////////////////////////    BAIDU SEARCH ENGINE    ///////////////searchshield.BaiduSearchEngine = function(search){ searchshield.SearchEngine.call(this, search); this.updateImageStyle = {  verticalAlign: null };};searchshield.BaiduSearchEngine.prototype = new searchshield.SearchEngine();searchshield.BaiduSearchEngine.prototype.constructor = searchshield.BaiduSearchEngine;searchshield.BaiduSearchEngine.prototype.name = "baidu";searchshield.BaiduSearchEngine.prototype.validSearch = function(href){ var uri; if (typeof(this.search) === 'undefined' || null === this.search)  uri = searchshield.parseLink(href); else  uri = this.search.uri; if(!uri || !uri.host)  return false; var hostMatch = false; var domain  = uri.host; // re stitch the uri path and query elements to // use existing logic var path = uri.path + uri.delimiter + uri.query;  if (domain == "www.baidu.com" || path.indexOf("testBaidu") !== -1)  hostMatch = true;   if (hostMatch) {  if (path.indexOf("s?") == 0)   return true; } return false;};searchshield.BaiduSearchEngine.prototype.includeLink = function(tag){    if (tag.className &amp;&amp; tag.className == "m")   return false;  if (searchshield.DoesURLContain(tag.href, this.search.uri.host))   return false;  else   {   // no link to self   var traverseElement = tag.parentNode;   while ( traverseElement &amp;&amp; traverseElement.className != "tbody")   {    if (traverseElement.className == "f")     return tag.href;    traverseElement = traverseElement.parentNode;   }      return false;  }};///////////////    BAIDU SEARCH ENGINE    //////////////////////////////    EARTHLINK SEARCH ENGINE    ///////////////searchshield.EarthlinkSearchEngine = function(search){ searchshield.SearchEngine.call(this, search); this.onlyPrimaries = false; this.addAnchorStyle = {  position: "static" };};searchshield.EarthlinkSearchEngine.prototype = new searchshield.SearchEngine();searchshield.EarthlinkSearchEngine.prototype.constructor = searchshield.EarthlinkSearchEngine;searchshield.EarthlinkSearchEngine.prototype.name = "earthlink";searchshield.EarthlinkSearchEngine.prototype.validSearch = function(href){ var uri; if (typeof(this.search) === 'undefined' || null === this.search)  uri = searchshield.parseLink(href); else  uri = this.search.uri; if(!uri || !uri.host)  return false; var hostMatch = false; var domain  = uri.host; // re stitch the uri path and query elements to // use existing logic var path = uri.path + uri.delimiter + uri.query; // For EarthLink the host must match: // search.earthlink.net if (("search.earthlink.net" == domain) &amp;&amp;  (path.indexOf("search?") == 0)) {  return true; } return false;};searchshield.EarthlinkSearchEngine.prototype.includeLink = function(tag){ var outHref = ""; var findStr = ""; // check for an anchor if (tag.tagName == "A") {  // check for sponsored  if (tag.id.indexOf("a") == 0)  {   var q = tag.href.indexOf("&amp;q=");   var qlen = 3;   if (q == -1)   {    q = tag.href.indexOf("&amp;adurl=");    qlen = 7;    if (q == -1)     return false;   }   // find end of url   var end = tag.href.indexOf("&amp;", q+qlen);   if (end &lt; 0)    end = tag.href.length;   // add the link   outHref = tag.href.substring(q+qlen, end);      if (searchshield.FilterUrl(outHref, this.filter_urls))    return false;       return outHref;  }  // don't search url's to self  if ((tag.href.indexOf("://") == -1) || searchshield.DoesURLContain(tag.href, this.search.uri.host))   return false;  // if a normal web result add it  if (tag.parentNode &amp;&amp; (tag.parentNode.tagName == "H3") &amp;&amp;   tag.parentNode.parentNode &amp;&amp; (tag.parentNode.parentNode.tagName == "LI") &amp;&amp;   tag.parentNode.parentNode.parentNode &amp;&amp; (tag.parentNode.parentNode.parentNode.tagName == "UL"))  {   if (searchshield.FilterUrl(tag.href, this.filter_urls))    return false;       return tag.href;  } }  return false;};///////////////    EARTHLINK SEARCH ENGINE    //////////////////////////////    AOL SEARCH ENGINE    ///////////////searchshield.AOLSearchEngine = function(search){ searchshield.SearchEngine.call(this, search);  this.addImageStyle = {  display: "inline" }; this.addAnchorStyle = {  display: null }; this.updateImageStyle = {  verticalAlign: null,  display: "inline" };};searchshield.AOLSearchEngine.prototype = new searchshield.SearchEngine();searchshield.AOLSearchEngine.prototype.constructor = searchshield.AOLSearchEngine;searchshield.AOLSearchEngine.prototype.name = "aol";searchshield.AOLSearchEngine.prototype.validSearch = function(href){ var uri; if (typeof(this.search) === 'undefined' || null === this.search)  uri = searchshield.parseLink(href); else  uri = this.search.uri; if(!uri || !uri.host)  return false;  var domain = uri.host; //path may be 'aol/search' or 'search' var pathArray = uri.path.split("/"); var aol = pathArray[0]; // re stitch the uri path and query elements // to use existing logic var path = (undefined == pathArray[1]) ? pathArray[0] : pathArray[1];  path += uri.delimiter + uri.query; if (/search\.aol\.com/.test(domain)) {  if ((aol == "aol") &amp;&amp;   (path.indexOf("search?") == 0))  {   return true;  } }  return false;};searchshield.AOLSearchEngine.prototype.includeLink = function(tag){ if (searchshield.DoesURLContain(tag.href, this.search.uri.host))  return false;  // sponsored links - google if ((tag.className) &amp;&amp; (tag.className.indexOf("slLink topAnchor") != -1)) { //parse for embedded href  if (tag.href.indexOf("/aclk?sa=") == -1)   return false;  var adurl = tag.href.indexOf("&amp;adurl=http");  // if an adurl the destination href can be acquired from the onclick handler  if (adurl != -1)  {   var destUrl;   var clickHandler = tag.getAttribute('onclick');   if (clickHandler != null)   {    // the destination href is the 2nd parameter (zero-based array)    destUrl = searchshield.getClickHandlerParams(clickHandler)[1];    if (destUrl != null)    {     destUrl = searchshield.removeHtmlTags(destUrl.replace(/'/g,''));     return searchshield.checkUrl(destUrl);    }   }  }  return false; } if (tag.className == "find")  return tag.href;   return false;};searchshield.AOLSearchEngine.prototype.insertNodes = function(node, doc){ var element = node.element; var score = node.score; if (element &amp;&amp; element.className &amp;&amp; element.className.indexOf("slLink") != -1) { //sponsored links only  // for alt image  if (score == searchshield.SCORE_SS_VERISIGN)   return [element.nextSibling, element.parentNode];  // for verdict image  var cN = element.childNodes;  var cnLen = cN.length;  for (var i=0; i &lt; cnLen; i++)  {   if ((cN[i].nodeType == 1) &amp;&amp;     (cN[i].nodeName == 'SPAN') &amp;&amp;     ((cN[i].className == 'title') || (cN[i].className == 'durl')))    return [cN[i].nextSibling, cN[i].parentNode];  } } var parent = searchshield.SearchEngine.prototype.insertNodes; return parent.call(this, node, doc);};///////////////    AOL SEARCH ENGINE    //////////////////////////////    ASK SEARCH ENGINE    ///////////////searchshield.AskSearchEngine = function(search){ searchshield.SearchEngine.call(this, search);};searchshield.AskSearchEngine.prototype = new searchshield.SearchEngine();searchshield.AskSearchEngine.prototype.constructor = searchshield.AskSearchEngine;searchshield.AskSearchEngine.prototype.name = "ask";searchshield.AskSearchEngine.prototype.validSearch = function(href){ var uri; if (typeof(this.search) === 'undefined' || null === this.search)  uri = searchshield.parseLink(href); else  uri = this.search.uri; if(!uri || !uri.host)  return false;  var domain= uri.host; // re stitch the uri path and query elements // to use existing logic var path = uri.path + uri.delimiter + uri.query;  if ("www.ask.com" == domain) {  if (path.indexOf("web?") == 0)   return true; } return false;};searchshield.AskSearchEngine.prototype.includeLink = function(tag){ var outHref = ""; var findStr = ""; if (searchshield.DoesURLContain(tag.href, this.search.uri.host))  return false;  if ((tag.className) &amp;&amp; (tag.className.indexOf("nu") != -1) &amp;&amp; (tag.className.indexOf("info") == -1))  {  // exclude green links  if ((tag.firstChild) &amp;&amp;   (tag.firstChild.className) &amp;&amp;   (tag.firstChild.className.indexOf('attrib') == 0))  {   return false;  }  // ads link to google with class nu  findStr = "www.google.com";  if (tag.href.indexOf(findStr) != 0)  {   if (tag.href.indexOf(findStr + "/aclk?sa=") != -1)   {     findStr = "&amp;adurl=http";    var pos = tag.href.indexOf(findStr);    if (pos != -1)    {     pos += 7;     outHref = tag.href.substring(pos);     outHref = unescape(outHref);     if (searchshield.FilterUrl(outHref, this.filter_urls))       return false;     return outHref;    }   }  }  else  { // ad not to google just use href   outHref = tag.href;   if (searchshield.FilterUrl(outHref, this.filter_urls))    return false;   return outHref;  } } // primary results have class containing title or L2 ( Wikipedia links ) else if ((tag.className) &amp;&amp; ((tag.className.indexOf("title") != -1) || (tag.className.toLowerCase() == "l2"))) {  outHref = tag.href;  if (searchshield.FilterUrl(outHref, this.filter_urls))   return false;  return outHref; }  return false;};///////////////    ASK SEARCH ENGINE    //////////////////////////////    ALTAVISTA SEARCH ENGINE    ///////////////searchshield.AltaVistaSearchEngine = function(search){ searchshield.SearchEngine.call(this, search);};searchshield.AltaVistaSearchEngine.prototype = new searchshield.SearchEngine();searchshield.AltaVistaSearchEngine.prototype.constructor = searchshield.AltaVistaSearchEngine;searchshield.AltaVistaSearchEngine.prototype.name = "altavista";searchshield.AltaVistaSearchEngine.prototype.validSearch = function(href){ var uri; if (typeof(this.search) === 'undefined' || null === this.search)  uri = searchshield.parseLink(href); else  uri = this.search.uri; if(!uri || !uri.host)  return false;  var domain= uri.host;  // re stitch the uri path and query elements // to use existing logic var path = uri.path + uri.delimiter + uri.query; // www.atlavista.com ---&gt; now http://us.yhs4.search.yahoo.com/yhs/search?fr=altavista&amp;fr=altavista&amp;itag=ody&amp;q=warez&amp;kgs=1&amp;kls=0 // xx.altavista.com where xx is a country code var hostMatch = false; if ("www.altavista.com" == domain) {  hostMatch = true; } else {  // xx.altavista.com  var pDest = domain.indexOf(".altavista.com");  if ((pDest != -1 ) &amp;&amp; ((domain.length - pDest) == 14))  {   hostMatch = true;  }  else  {   // a reference to altavista must be present in yahoo search url   var pRef = (uri.qsArray.fr &amp;&amp; uri.qsArray.fr == 'altavista');   pDest = domain.indexOf("search.yahoo.com");   if (pDest != -1 &amp;&amp; pRef)    hostMatch = true;  } } if (hostMatch) {  //path must start with web/results?  if ((path.indexOf("yhs/search?") == 0) ||   (path.indexOf("search;") == 0)  ||   (path.indexOf("yhs/search;") == 0) ||   (path.indexOf("web/results?") == 0)||   (path.indexOf("fr=altavista") != -1))  {   return true;  } }  return false;};searchshield.AltaVistaSearchEngine.prototype.includeLink = function(tag){ var outHref = ""; var findStr = ""; // initial checks if ((!tag.href) ||   (tag.href.charAt(0) == '#') ||  (tag.href.indexOf("javascript:") == 0)) {  return false; }   if (searchshield.DoesURLContain(tag.href, this.search.uri.host))  return false;  var spnsdLinks = searchshield.getParentNodeByTagName("DIV", tag, "className"); if ((spnsdLinks) &amp;&amp;  (spnsdLinks.className.indexOf('ads') &gt; -1)) // sponsored links {  if (!tag.parentNode)   return false;  // parse ads for em tag  var baseNode;  if (spnsdLinks.className.indexOf('ads horiz') &gt; -1) // horizontal ads sections   baseNode = tag.parentNode.parentNode;  else   baseNode = tag.parentNode;    if (!baseNode || !baseNode.lastChild || baseNode.lastChild.tagName != 'EM')   return false;  var outHref = searchshield.removeHtmlTags(baseNode.lastChild.innerHTML);  return outHref; }  if ((tag.className == "spt") ||   (tag.className == "res") ||  (tag.className == "yschttl spt")) {  findStr = "/**";  var pos = tag.href.indexOf(findStr);  if (pos != -1)  {   pos += 3;   outHref = tag.href.substring(pos);   outHref = unescape(outHref);      // no results for overture.com &amp; no yahoo domains   chkHref = outHref.toLowerCase();   if (chkHref.indexOf("overture.") != -1)    return false;   // split the url based on '/'   var parts = outHref.split('/');   // only need a domain   if ((parts != null) &amp;&amp; (parts[2] != null))   {    var domain = parts[2];    if ((domain.indexOf("rdrjp.yahoo.com") != -1) ||     (domain.indexOf("rdrkrs.yahoo.com") != -1) ||     (domain.indexOf("rdrtpe.yahoo.com") != -1) ||     (domain.indexOf("rdrird.yahoo.com") != -1) ||     (domain.indexOf("rdrhk2.yahoo.com") != -1) ||     (domain.indexOf("rdrsg1.yahoo.com") != -1) ||     (domain.indexOf("rdrin2.yahoo.com") != -1) ||     (domain.indexOf("rdre1.yahoo.com") != -1) ||     (domain.indexOf("rdrw1.yahoo.com") != -1)  )    {     return false    }   }   return outHref;  }  else  {   return tag.href;  } }  return false;};searchshield.AltaVistaSearchEngine.prototype.getImgElement = function (element){ while (element != null)  {  element = element.nextSibling;  if (element != null)  {   if ((element.id == null) || (element.id.indexOf("LXPLSS_") == -1))   {   // not our id but hit another anchor no verdict    if (element.tagName == "A")    {     element = null;     break;    }   }   else if (element.tagName == "A")    break;  } }   var rtnElem = !!element ? element.firstChild : element; return rtnElem;};///////////////    ALTAVISTA SEARCH ENGINE    //////////////////////////////    YANDEX SEARCH ENGINE    ///////////////searchshield.YandexSearchEngine = function(search){ searchshield.SearchEngine.call(this, search);};searchshield.YandexSearchEngine.prototype = new searchshield.SearchEngine();searchshield.YandexSearchEngine.prototype.constructor = searchshield.YandexSearchEngine;searchshield.YandexSearchEngine.prototype.name = "yandex";searchshield.YandexSearchEngine.prototype.validSearch = function(href){ var uri; if (typeof(this.search) === 'undefined' || null === this.search)  uri = searchshield.parseLink(href); else  uri = this.search.uri; if(!uri || !uri.host)  return false;  var domain= uri.host; // re stitch the uri path and query elements // to use existing logic var path = uri.path + uri.delimiter + uri.query; if ((domain.match(/yandex\.com|by|kz|ru|ua/i)) &amp;&amp;  (path.indexOf("yandsearch?") == 0)) {  return true; }  return false;};searchshield.YandexSearchEngine.prototype.includeLink = function(tag){ if (tag.href.indexOf("/search") != -1) {  return false; }  if (searchshield.DoesURLContain(tag.href, this.search.uri.host) ||  searchshield.DoesURLContain(tag.href, ".yandex.net")  ||  searchshield.DoesURLContain(tag.href, ".yandex.ru")   ||  searchshield.DoesURLContain(tag.href, "moikrug.ru")   ||  searchshield.DoesURLContain(tag.href, "ya.ru")    ||  searchshield.DoesURLContain(tag.href, ".yandex.com")  ||  searchshield.DoesURLContain(tag.href, "yandex.st")) {  return false; }   parentNode = tag.parentNode; if ((tag.parentNode)   &amp;&amp;   (tag.parentNode.parentNode) &amp;&amp;  (tag.parentNode.parentNode.className.toLowerCase() == "moreinfo")) {  return false; }  return tag.href;};searchshield.YandexSearchEngine.prototype.getImgElement = function (element){ while (element != null)  {  element = element.nextSibling;  if (element != null)  {   if ((element.id == null) || (element.id.indexOf("LXPLSS_") == -1))   {   // not our id but hit another anchor no verdict    if (element.tagName == "A")    {     element = null;     break;    }   }   else if (element.tagName == "A")    break;  } }   var rtnElem = !!element ? element.firstChild : element; return rtnElem;};///////////////    YANDEX SEARCH ENGINE    //////////////////////////////    SEZNAM SEARCH ENGINE    ///////////////searchshield.SeznamSearchEngine = function(search){ searchshield.SearchEngine.call(this, search); this.elementAttribute = {  width: "18",  height: "18" }; this.updateImageStyle = {  width: "18px",  height: "18px" };};searchshield.SeznamSearchEngine.prototype = new searchshield.SearchEngine();searchshield.SeznamSearchEngine.prototype.constructor = searchshield.SeznamSearchEngine;searchshield.SeznamSearchEngine.prototype.name = "seznam";searchshield.SeznamSearchEngine.prototype.validSearch = function(href){ var uri; if (typeof(this.search) === 'undefined' || null === this.search)  uri = searchshield.parseLink(href); else  uri = this.search.uri; if(!uri || !uri.host)  return false;  var domain= uri.host; // re stitch the uri path and query elements // to use existing logic var path = uri.path + uri.delimiter + uri.query; if ((domain.indexOf("search.seznam.cz") &gt; -1) &amp;&amp;  ((path.indexOf("?") == 0) || (path.indexOf("svet") == 0))) {  return true; }  return false;};searchshield.SeznamSearchEngine.prototype.includeLink = function(tag){ if (searchshield.DoesURLContain(tag.href, this.search.uri.host))  return false;  var parentNode = tag.parentNode; if (parentNode) {  var grandParentNode = tag.parentNode.parentNode;  if ((parentNode.tagName == "SPAN") &amp;&amp;    ((parentNode.className.toLowerCase() == "sklik-url") ||   (parentNode.className.toLowerCase() == "sklik-title")))  { // locate the real url and unencode it   var urlPos = tag.href.indexOf("&amp;url=http");   if (urlPos != -1)   {    urlPos += 5;     outHref = tag.href.substring(urlPos);    outHref = unescape(outHref);    return outHref;   }  }  else if (grandParentNode)   {   var greatGrandParentNode = tag.parentNode.parentNode.parentNode;   if ((grandParentNode.tagName == "DIV") &amp;&amp;    ((grandParentNode.className.toLowerCase() == "text") || (grandParentNode.className.toLowerCase() == "hlasky otz")))   { // standard link    return tag.href;   }   else if (greatGrandParentNode &amp;&amp; greatGrandParentNode.tagName == "DIV" &amp;&amp;     (greatGrandParentNode.className.toLowerCase() == "hotlinks"))    { // hint link    return tag.href;   }     } }  return false;};///////////////    SEZNAM SEARCH ENGINE    //////////////////////////////    WEBHLEDANI SEARCH ENGINE    ///////////////searchshield.WebhledaniSearchEngine = function(search){ searchshield.SearchEngine.call(this, search);};searchshield.WebhledaniSearchEngine.prototype = new searchshield.SearchEngine();searchshield.WebhledaniSearchEngine.prototype.constructor = searchshield.WebhledaniSearchEngine;searchshield.WebhledaniSearchEngine.prototype.name = "webhledani";searchshield.WebhledaniSearchEngine.prototype.validSearch = function(href){ var uri; if (typeof(this.search) === 'undefined' || null === this.search)  uri = searchshield.parseLink(href); else  uri = this.search.uri; if(!uri || !uri.host)  return false;  var domain= uri.host; // re stitch the uri path and query elements // to use existing logic var path = uri.path + uri.delimiter + uri.query; if ((domain.indexOf("webhledani.cz") &gt; -1) &amp;&amp;  (path.indexOf("results.aspx?") == 0)) {  return true; }  return false;};searchshield.WebhledaniSearchEngine.prototype.includeLink = function(tag){ if (tag.href.indexOf("/redir.aspx?") != -1) {  var ancestorNode;  // sponsored link  if ((ancestorNode = searchshield.getParentNodeByClassName("results sponsored", tag, 3)) != null)  {   if ((ancestorNode = searchshield.getParentNodeByClassName("res1", tag, 2)) != null)   {        var spanSibling = ancestorNode.nextSibling;    while (spanSibling.nodeName != 'SPAN')    {     spanSibling = spanSibling.nextSibling;     if (spanSibling.nodeName == 'DIV' || spanSibling.className == 'res1')     {      spanSibling = null;      break;     }    }    if (spanSibling)      outHref = spanSibling.innerHTML;   }   if (outHref)    return searchshield.checkUrl(searchshield.removeHtmlTags(outHref));   }   if ((ancestorNode = searchshield.getParentNodeByClassName("right-sponsored", tag, 3)) != null)  {   var outHref;   if ((ancestorNode = searchshield.getParentNodeByClassName("res3", tag, 2)) != null)   {        var spanSibling = ancestorNode.nextSibling;    while (spanSibling.nodeName != 'SPAN')    {     spanSibling = spanSibling.nextSibling;     if (spanSibling.nodeName == 'DIV' || spanSibling.className == 'res3')     {      spanSibling = null;      break;     }    }    if (spanSibling)      outHref = spanSibling.innerHTML;   }   if (outHref)    return searchshield.checkUrl(searchshield.removeHtmlTags(outHref));   }  // result link  if (searchshield.getParentNodeByClassName("results", tag, 3) != null)  {   if ((ancestorNode = searchshield.getParentNodeByClassName("res2", tag, 2)) != null)   {    if (tag.parentNode &amp;&amp; (tag.parentNode.nodeName != 'P'))     return getLinkHref(ancestorNode);   }  } } return false; function getLinkHref(aNode) {  var spanElems = aNode.getElementsByTagName('span');  for (var i=0; i &lt; spanElems.length; i++)  {   if (spanElems[i].className != 'site')    continue;   var outAnchor = spanElems[i].getElementsByTagName('a')[0];   if (outAnchor == null)    outAnchor = spanElems[i];   return searchshield.checkUrl(searchshield.removeHtmlTags(outAnchor.innerHTML));  }  return false; }};///////////////    WEBHLEDANI SEARCH ENGINE    //////////////////////////////    EBAY SEARCH ENGINE    ///////////////searchshield.eBaySearchEngine = function(search){ searchshield.SearchEngine.call(this, search);};searchshield.eBaySearchEngine.prototype = new searchshield.SearchEngine();searchshield.eBaySearchEngine.prototype.constructor = searchshield.eBaySearchEngine;searchshield.eBaySearchEngine.prototype.name = "ebay";searchshield.eBaySearchEngine.prototype.validSearch = function(href){ var uri; if (typeof(this.search) === 'undefined' || null === this.search)  uri = searchshield.parseLink(href); else  uri = this.search.uri; if(!uri || !uri.host)  return false;  var domain= uri.host; // shop.ebay.xx // shop.xxxx.ebay.xx like shop.benl.ebay.be // search.auction.co.kr  var path = uri.path + uri.delimiter + uri.query;  if ((domain.indexOf("shop.ebay") &gt; -1) ||  (domain.indexOf("shop.benl.ebay") &gt; -1)) {  if ((path.indexOf("?_from=") == 0) ||   (path.indexOf("i.html") &gt; -1))  {   return true;  } }  // ebay.se if ((domain.indexOf("search.eim.ebay") &gt; -1) &amp;&amp;  ((path.indexOf("?kw=") &gt; -1) || (path.indexOf("?ev=") &gt; -1))) {  return true; }  if ((domain.indexOf("search.auction.co.kr") &gt; -1 ) &amp;&amp;  ((path.indexOf("?keyword=") &gt; -1))) {  // would normally set these properties in the constructor or in an  // overriding function but they're only required for this domain     // links are in iframes  this.processFrames = true;    // must downsize verdicts for proper display  this.elementAttribute = {   width: "16",   height: "16"  };  this.updateImageStyle = {   width: "16px",   height: "16px"  };    return true; } // latin america ebay // listado.mercadolibre.com.xx or listado.mercadolibre.co.xx //   or listado.mercadolibre.xx or //   category.mercadolibre.com.xx or listado.mercadolibre.xx/category // lista.mercadolivre.com.xx or lista.mercadolivre.com.xx/category if ((domain.indexOf("www.") == -1) &amp;&amp;  ((domain.indexOf(".mercadolibre.") &gt; -1 ) ||   (domain.indexOf(".mercadolivre.") &gt; -1 )))  {  return true; } return false;};searchshield.eBaySearchEngine.prototype.includeLink = function(tag){ var parentNode = null; var outHref = false;  if (searchshield.DoesURLContain(tag.href, this.search.uri.host))  return false;  if ( tag.href.indexOf(".ebayrtm.com/clk?") &gt; -1 ) {  if ( tag.title == null || tag.title.length &lt; 0 )   return false;       outHref = searchshield.removeHtmlTags(tag.title);  if (outHref.indexOf(" ") == -1)  { // no spaces   if (outHref.indexOf(".") &gt; -1)   { // at least one dot     if (outHref.indexOf(this.search.uri.host) == -1)    { // no host     if (outHref.toLowerCase().indexOf("ebay.com") == -1)     {      return outHref;     }    }   }  }    } // ebay.se - Google ads parentNode = tag.parentNode; if (parentNode &amp;&amp; (parentNode.className.toLowerCase() == "google-ad-link")) {  if (tag.href.indexOf("/aclk?sa=") != -1)  {    findStr = "&amp;adurl=http";   var urlPos = tag.href.indexOf(findStr);   if (urlPos != -1)   {    urlPos += 7; // puts it on the http    outHref = tag.href.substring(urlPos);        // extract any fragment text, shouldn't be unescaped    var pound = outHref.indexOf("#");     if (pound != -1)    {     var fragment = outHref.substring(pound);     outHref = outHref.substring(0, pound);     outHref = unescape(outHref);     outHref += fragment;     if (searchshield.FilterUrl(outHref, this.filter_urls))      return false;     return outHref;    }    outHref = unescape(outHref);    if (outHref.indexOf("?") == -1)    {     var ampPos = outHref.indexOf("&amp;");     if (ampPos != -1)      outHref = outHref.substring(0, ampPos);    }        if (searchshield.FilterUrl(outHref, this.filter_urls))     return false;    return outHref;   }  } }  // auction.co.kr parentNode = tag.parentNode; if (parentNode &amp;&amp; (parentNode.className.toLowerCase() == "link")) {  if (tag.href.indexOf("adcr.naver.com") &gt; -1)  {   outHref = tag.innerText;   if ((outHref == null) || (outHref.length &lt; 0))    return false;       return outHref;  } }  // latin america ebay if ( tag.href.toLowerCase().indexOf("clickcounter?") &gt; -1 ) {  var spanElements = tag.getElementsByTagName("span");  if ((spanElements != null)    &amp;&amp;    (spanElements.length &gt; 0))  {   if ( spanElements[0].className.toLowerCase() == "mclics-url" )   {    outHref = spanElements[0].innerHTML;    if ( outHref == null || outHref.length &lt; 0 )     return false;    outHref = searchshield.removeHtmlTags(outHref);    if (outHref.indexOf(" ") == -1)    { // no spaces     if (outHref.indexOf(".") &gt; -1)     { // at least one dot       if ((outHref.toLowerCase().indexOf("mercadolibre") == -1) &amp;&amp;        (outHref.toLowerCase().indexOf("mercadolivre") == -1))       {       return outHref;      }     }    }   }  } }  return false;};///////////////    EBAY SEARCH ENGINE    //////////////////////////////    DIGG SEARCH ENGINE    ///////////////searchshield.DiggSearchEngine = function(search){ searchshield.SearchEngine.call(this, search); this.new_links = false;};searchshield.DiggSearchEngine.prototype = new searchshield.SearchEngine();searchshield.DiggSearchEngine.prototype.constructor = searchshield.DiggSearchEngine;searchshield.DiggSearchEngine.prototype.name = "digg";searchshield.DiggSearchEngine.prototype.validSearch = function(href){ var uri; if (typeof(this.search) === 'undefined' || null === this.search)  uri = searchshield.parseLink(href); else  uri = this.search.uri; if(!uri || !uri.host)  return false;  var domain= uri.host; // re stitch the uri path and query elements // to use existing logic var path = uri.path + uri.delimiter + uri.query;  if ((domain.indexOf("digg.com") &gt; -1) &amp;&amp;  (path.indexOf("/ad") == -1)) {  return true; }  return false;};searchshield.DiggSearchEngine.prototype.includeLink = function(tag){ var outHref = false; var findStr = "";  if ((tag.parentNode) &amp;&amp;  (tag.parentNode.className.toLowerCase() == "digg-count")) {  return false; }  if (searchshield.DoesURLContain(tag.href, this.search.uri.host)) {  if (tag.className &amp;&amp; tag.className.indexOf('source') != -1)  {   findStr = "/search?q=site:";   var urlPos = tag.href.indexOf(findStr);   if (urlPos != -1)   {    urlPos += 15;    outHref = tag.href.substring(urlPos);    return outHref;   }  } }  return false;};searchshield.DiggSearchEngine.prototype.addImage = function(node, image, hidden){ // remove style that is set when alt image is applied this.addAnchorStyle = {  background: "none" };   var parent = searchshield.SearchEngine.prototype.addImage; return parent.call(this, node, image, hidden);};///////////////    DIGG SEARCH ENGINE    //////////////////////////////    SLASHDOT SEARCH ENGINE    ///////////////searchshield.SlashdotSearchEngine = function(search){ searchshield.SearchEngine.call(this, search); this.showCleanVerdicts = false; this.new_links = false; this.type = 'inline';};searchshield.SlashdotSearchEngine.prototype = new searchshield.SearchEngine();searchshield.SlashdotSearchEngine.prototype.constructor = searchshield.SlashdotSearchEngine;searchshield.SlashdotSearchEngine.prototype.name = "slashdot";searchshield.SlashdotSearchEngine.prototype.validSearch = function(href){ var uri; if (typeof(this.search) === 'undefined' || null === this.search)  uri = searchshield.parseLink(href); else  uri = this.search.uri; if(!uri || !uri.host)  return false;  var domain= uri.host; // re stitch the uri path and query elements // to use existing logic var path = uri.path + uri.delimiter + uri.query;  if (domain.indexOf("slashdot.org") != -1) {  return true; }  return false;};searchshield.SlashdotSearchEngine.prototype.includeLink = function(tag){ if (searchshield.DoesURLContain(tag.href, this.search.uri.host))  return false;   if ( tag.href.indexOf("mailto:") != -1 )  return false;   if ( tag.href.indexOf("slashdot.org") != -1 )  return false;   if (tag.parentNode &amp;&amp; (tag.parentNode.tagName == "DIV")) {  if (tag.parentNode.id.indexOf("text-") != -1)  {   return tag.href;  } } else if ( tag.parentNode &amp;&amp; tag.parentNode.parentNode &amp;&amp; tag.parentNode.parentNode.tagName == "DIV" ) {  if ( tag.parentNode.parentNode.id.indexOf("text-") != -1 )  {   return tag.href;  } } return false;};searchshield.SlashdotSearchEngine.prototype.addImage = function(node, image, hidden){ var doc   = this.search.doc;  this.init_inline_ratings(doc); this.show_inline_ratings(doc, node, image);};///////////////    SLASHDOT SEARCH ENGINE    //////////////////////////////    TWITTER SEARCH ENGINE    ///////////////searchshield.TwitterSearchEngine = function(search){ searchshield.SearchEngine.call(this, search); this.showCleanVerdicts = false; this.new_links = false; this.type = 'inline';};searchshield.TwitterSearchEngine.prototype = new searchshield.SearchEngine();searchshield.TwitterSearchEngine.prototype.constructor = searchshield.TwitterSearchEngine;searchshield.TwitterSearchEngine.prototype.name = "twitter";searchshield.TwitterSearchEngine.prototype.twitter_filter_urls = ["twitpic.com", "twitterfeed.com", "twitter.peoplebrowsr.com"];searchshield.TwitterSearchEngine.prototype.validSearch = function(href){ var uri; if (typeof(this.search) === 'undefined' || null === this.search)  uri = searchshield.parseLink(href); else  uri = this.search.uri; if(!uri || !uri.host)  return false;  var domain= uri.host; if (domain.indexOf("twitter.com") != -1) {  return true; }  return false;};searchshield.TwitterSearchEngine.prototype.includeLink = function(tag){ if (searchshield.DoesURLContain(tag.href, this.search.uri.host))  return false;   if (tag.className.length &lt; 1)  return false;  // no verdicts on source of twit for example "from TweetDeck" if ((tag.className.indexOf("tweet-url web") == 0) &amp;&amp;  (tag.className.indexOf("url") == 0 )) {  return false; }   if (searchshield.FilterUrl(tag.href, this.twitter_filter_urls)) {  return false; }  return tag.href;};searchshield.TwitterSearchEngine.prototype.addImage = function(node, image, hidden){ var doc   = this.search.doc;   this.init_inline_ratings(doc); this.show_inline_ratings(doc, node, image);};///////////////    TWITTER SEARCH ENGINE    //////////////////////////////    GMAIL SEARCH ENGINE    ///////////////searchshield.GMailSearchEngine = function(search){ searchshield.SearchEngine.call(this, search); this.processFrames = true; this.showCleanVerdicts  = false; this.type = 'inline';};searchshield.GMailSearchEngine.prototype = new searchshield.SearchEngine();searchshield.GMailSearchEngine.prototype.constructor = searchshield.GMailSearchEngine;searchshield.GMailSearchEngine.prototype.name = "gmail"; // the name by which the search engine is known (always lowercase)searchshield.GMailSearchEngine.prototype.validSearch = function(href){ var uri; if (typeof(this.search) === 'undefined' || null === this.search)  uri = searchshield.parseLink(href); else  uri = this.search.uri; if(!uri || !uri.host)  return false; var domain  = uri.host;  // re stitch the uri path and query elements to // use existing logic var path = uri.path + uri.delimiter + uri.query; if ((domain.indexOf("mail.google.") != -1) ||   (domain.indexOf("gmail.") != -1)) {  return true; } return false;};searchshield.GMailSearchEngine.prototype.includeLink = function(tag){ if (searchshield.DoesURLContain(tag.href, this.search.uri.host))  return false; // don't mark anything but http:// if (tag.href.indexOf("mailto") == 0)  return false; var parentDiv = searchshield.getParentNodeByTagName("DIV", tag, "className"); if ((parentDiv) &amp;&amp;  ((parentDiv.className == "ii gt") || // mail message body   (parentDiv.className == "mv") || // top sponsored links   (parentDiv.className == "vb") || // right sponsored links   (parentDiv.className == "im") || // inside quotes   (parentDiv.className == "gmail_quote") || // quote   (parentDiv.className == "msg") // basic html mode   )) // right ads {  // parse for any ads  var newHref = this.parseAdUrl(tag.href);  return newHref; }  return false;};searchshield.GMailSearchEngine.prototype.addImage = function(node, image, hidden){ var doc   = this.search.doc;   this.init_inline_ratings(doc); this.show_inline_ratings(doc, node, image);};searchshield.GMailSearchEngine.prototype.parseAdUrl = function(href){ if (!href)  return href; // check for google ad var regex = "^http(s)?\:\/\/([a-zA-Z0-9]+)\.googlesyndication\.com.+\&amp;adurl\=(.+)"; var re = new RegExp(regex); var matches = href.match(re); if (matches &amp;&amp; (matches.length &gt;= 4)) {  // else we want the fourth value  var match = matches[3];  if (match &amp;&amp; (match.length &gt; 0))   return match } return href;};///////////////    GMAIL SEARCH ENGINE    //////////////////////////////    FACEBOOK SEARCH ENGINE    ///////////////searchshield.FacebookSearchEngine = function(search){ searchshield.SearchEngine.call(this, search); this.showCleanVerdicts = false; this.type = 'inline';};searchshield.FacebookSearchEngine.prototype = new searchshield.SearchEngine();searchshield.FacebookSearchEngine.prototype.constructor = searchshield.FacebookSearchEngine;searchshield.FacebookSearchEngine.prototype.name = "facebook"; // the name by which the search engine is known (always lowercase)searchshield.FacebookSearchEngine.prototype.validSearch = function(href){ var uri; if (typeof(this.search) === 'undefined' || null === this.search)  uri = searchshield.parseLink(href); else  uri = this.search.uri; if(!uri || !uri.host)  return false; if (uri.host.indexOf("www.facebook.com") != -1)   return true; return false;};searchshield.FacebookSearchEngine.prototype.includeLink = function(tag){ if (!tag.href || (tag.href.indexOf('facebook.com') &gt; -1) || (tag.href.indexOf('ak.fbcdn.net') &gt; -1))  return false;  return tag.href};searchshield.FacebookSearchEngine.prototype.addImage = function(node, image, hidden){ var doc   = this.search.doc;   this.init_inline_ratings(doc); this.show_inline_ratings(doc, node, image);};///////////////    FACEBOOK SEARCH ENGINE    //////////////////////////////    MYSPACE SEARCH ENGINE    ///////////////searchshield.MySpaceSearchEngine = function(search){ searchshield.SearchEngine.call(this, search); this.showCleanVerdicts = false; this.type = 'inline';};searchshield.MySpaceSearchEngine.prototype = new searchshield.SearchEngine();searchshield.MySpaceSearchEngine.prototype.constructor = searchshield.MySpaceSearchEngine;searchshield.MySpaceSearchEngine.prototype.name = "myspace"; // the name by which the search engine is known (always lowercase)searchshield.MySpaceSearchEngine.prototype.validSearch = function(href){ var uri; if (typeof(this.search) === 'undefined' || null === this.search)  uri = searchshield.parseLink(href); else  uri = this.search.uri; if(!uri || !uri.host)  return false; if (uri.host.indexOf("www.myspace.com") != -1)   return true; return false;};searchshield.MySpaceSearchEngine.prototype.includeLink = function(tag){ if (searchshield.DoesURLContain(tag.href, this.search.uri.host) ) {  return false; }  return tag.href};searchshield.MySpaceSearchEngine.prototype.addImage = function(node, image, hidden){ var doc   = this.search.doc;   this.init_inline_ratings(doc); this.show_inline_ratings(doc, node, image);};///////////////    MYSPACE SEARCH ENGINE    //////////////////////////////    AVG TOOLBAR REPORTING    ///////////////var avgreport = { BLOCK_SEVERITY: 3, scanResult: function (doc, url, foundUrl, ip) {  // report scan end only if surf enabled  if ('1' != searchshield.avgCallFunc(doc, 'GetSurfEnabled'))   return;    // for now native is handling the interstitial   var results = searchshield.avgCallFunc(doc, 'MalsiteCheck', url);  if ( results == null )   return;    var parts = results.split('::');    // need at least severity  if (parts == null)   return;  if (!ip)   ip = "";     // use a block severity if foundUrl is given  var severity = !!foundUrl ? avgreport.BLOCK_SEVERITY : parseInt(parts[0], 10);  var category = "";  var threat  = "";  // fill in the category and threat if something was found  if (severity &gt; 0)  {   category = parts[2];   threat  = parts[4];  }//  else//   return;    var scan_result = searchshield.avgCallFunc(doc, 'ReportScanResult', url, url, threat, category, ip, severity);  var scan_end = avgreport.scanEnd(doc, url);    return (scan_result &amp;&amp; scan_end); }, scanEnd: function (doc, url) {  return searchshield.avgCallFunc(doc, 'ReportScanEnd', url); }, GetInterstitialIP: function (interstitial) {  // simple regex to pull the IP address  var regex = /(([1-9][0-9]{0,2})|0)\.(([1-9][0-9]{0,2})|0)\.(([1-9][0-9]{0,2})|0)\.(([1-9][0-9]{0,2})|0)/;  var match = regex.exec(interstitial);  if (!match)   return '';  return match[0]; }}///////////////    AVG TOOLBAR REPORTING    //////////////////////////////    FLYOVERS    ///////////////var avglsflyover = { count: 0, poppedUp: false, poppedElement: null, reset: function () {  avglsflyover.count = 0;  avglsflyover.poppedUp = false;  avglsflyover.poppedElement = null; }, popup: function (event, hash, search, flyover) {  if (!event)   event = window.event;  var div = document.getElementById("XPLSS_Flyover");  if (div == null)   return;  // establish target element and get its containing document object  // in case verdict is inside a frame  var eventTarget = event.srcElement;  var frameDoc = eventTarget.ownerDocument;  // if the element is the clock, don't pop over it  if ((eventTarget.src != null) &amp;&amp; (eventTarget.src.indexOf("clock.gif") != -1))   return;    // save the element we popped over  avglsflyover.poppedElement = eventTarget;  // if no flyover get it  if ((flyover == null) || (flyover == ""))  {   flyover = searchshield.avgCallFunc(frameDoc, 'BuildFlyover', hash);   if (!flyover)    return;   // cleanup flyover, replace any new lines   flyover = flyover.replace(/\r/g, "");   flyover = flyover.replace(/\n/g, "");   // escape any single quotes   flyover = flyover.replace(/'/g, "&amp;#39;");  }  // set the html in the layer  div.innerHTML = flyover;  // there is an unwanted text node that causes vertical misalignment of flyover  if (div.firstChild.nodeType == 3)   div.removeChild(div.firstChild);    avglsflyover.poppedUp = true;  // reset display count  avglsflyover.count = 0;  avglsflyover.position(); }, hide: function (event) {  var frameDoc = document || top.document;  var div = frameDoc.getElementById("XPLSS_Flyover");  if ((div == null) || (div.style == null) || (div.style.visibility == "hidden"))   return;  var trans_div = frameDoc.getElementById("XPLSS_Trans");  if ((trans_div == null) || (trans_div.style == null) || (trans_div.style.visibility == "hidden"))   return;  // scroll and keydown events will pass a null event by design  // toElement will be null when mousing out of frameelement containing a verdict  if (event == null || event.toElement == null)  {   return;  }  if (trans_div.contains(event.toElement) || div.contains(event.toElement))   return;  // if the toElement is a cooresponding alt image then don't hide  // use try/catch because toElement will be null when mousing out of frame  try {   if (!!event.toElement.id &amp;&amp; !!event.srcElement.id)   {    if (event.toElement.id.indexOf(event.srcElement.id.substring(0,event.srcElement.id.length-2)) == 0)     return;      if (event.srcElement.id == 'XPLSS_Trans' &amp;&amp; /XPLSS_\d+VU\d/.test(event.toElement.id))     return;   }  }  catch(err){}  // hide and move somewhere off screen (negative offsets)  div.style.visibility = "hidden";  div.style.left = "-2100px";  div.style.top  = "-2100px";  trans_div.style.visibility = "hidden";  trans_div.style.left = "-2100px";  trans_div.style.top  = "-2100px";  return true; }, position: function () {  if (!avglsflyover.poppedUp || (avglsflyover.poppedElement == null))   return;  var flyover = document.getElementById("XPLSS_Flyover");  if (flyover == null)   return;  // relative position of flyover in relation to icon  var locateX = 0;  // 0=left, 1=right  var locateY = 0;  // 0=above, 1=below, 2=beside icon   // get window sizes  var winSize  = searchshield.viewPortSize();  var windowX  = winSize[0];  var windowY  = winSize[1];  // get the exact size of the flyover  var flyoverSize  = searchshield.elementSize(flyover);  var flyoverX  = flyoverSize[0];  var flyoverY  = flyoverSize[1];  var verdictWidth = 0;  if (avglsflyover.poppedElement &amp;&amp; avglsflyover.poppedElement.width)   verdictWidth = avglsflyover.poppedElement.width;    // get the bounding rect for image(s)  var imgRect = searchshield.GetFullBoundingRect(avglsflyover.poppedElement);  // half width/height of element bounding rect  var halfX = (imgRect.right - imgRect.left) / 2;  var halfY = (imgRect.bottom- imgRect.top) / 2;  // element the mouse is over, get the center position  var posX = searchshield.offsetLeft(avglsflyover.poppedElement) + halfX;  var posY = searchshield.offsetTop(avglsflyover.poppedElement) + halfY;  // if a verdict is inside a frame must get offsets for the frame element  var docFrames = document.frames;  if (docFrames)  {   for (var i=0; i &lt; docFrames.length; i++)   {    try {     var frameElem = docFrames[i].frameElement;     if (frameElem.contentWindow.document.getElementById(avglsflyover.poppedElement.id))     {      posX += searchshield.offsetLeft(frameElem);      posY += searchshield.offsetTop(frameElem);      break;     }    }    catch(frmErr){}   }  }  var transXOffset = 0;  if (imgRect.mid == undefined)   transXOffset = -1 * halfX;  else   transXOffset = ((imgRect.right + imgRect.left) / 2) - imgRect.mid;    // normalize pos to 0  -- get amount of scrolling in browser window  var scroll   = searchshield.scrollSize();  var pageOffsetX  = scroll[0];  var pageOffsetY  = scroll[1];  posX -= pageOffsetX;  posY -= pageOffsetY;  // setup the offsets  var offsetX = posX;  var offsetY = posY;  // calc where to display on page  if ((windowX - posX) &gt; posX)  {   // right   offsetX += halfX;   locateX = 1;  }  else  {   //left   offsetX -= (flyoverX + halfX);  }  if ((windowY - posY) &gt; posY)  {   // below   if (posY &lt; (windowY/4))   {    offsetY -= halfY;    locateY = 1;   }   else   {    offsetY -= (flyoverY / 2);    locateY = 2;   }  }  else  {   // above   if ((windowY - posY) &lt; (windowY/4))   {    offsetY -= (flyoverY - halfY);   }   else   {    offsetY -= (flyoverY / 2);    locateY = 2;   }  }  // make sure we aren't off the screen  if (offsetY &lt; 0)   offsetY = 0;  if ((offsetY + flyoverY) &gt; windowY)   offsetY = windowY - flyoverY;  // add page offsets back  offsetX += pageOffsetX;  offsetY += pageOffsetY;  posX += pageOffsetX;  posY += pageOffsetY;  var paddedOffsetX = 0; //provide space between icon and flyover  var padX = 3;  if (locateX == 0)   paddedOffsetX = offsetX - padX;  else   paddedOffsetX = offsetX + padX;  // set where to put the flyover  flyover.style.top = offsetY + "px";  flyover.style.left = paddedOffsetX + "px";  // set where to put the transparent layer  var trans = document.getElementById("XPLSS_Trans");  if (trans != null)  {   var trans_left = 0;   var trans_top  = 0;   var trans_width= 0;   var trans_height = 0;   // transparent layer should overlap verdict image   if (locateX == 0)    trans_left = posX - flyoverX - halfX;  // left    else    trans_left = posX - transXOffset - verdictWidth; // right   trans.style.left = trans_left + "px";   trans.style.top  = offsetY + "px";   trans.style.width = flyoverX + verdictWidth + "px";   trans.style.height = flyoverY + "px";  }  avglsflyover.display(); }, display: function () {  avglsflyover.count++;  if (avglsflyover.count == 1)  {   var flyover = document.getElementById("XPLSS_Flyover");   if (flyover == null)    return;   // show the flyover, must use a little count to tell, crazy stuff   flyover.style.visibility = "visible";   flyover.onmouseout = function(){    avglsflyover.hide(event);   };   // show the transparent layer   var trans_div = document.getElementById("XPLSS_Trans");   if (trans_div == null)    return;   trans_div.style.visibility = "visible";   trans_div.onmouseout = function(){    avglsflyover.hide(event);   };   avglsflyover.poppedUp = false;  } }, show: function () {  var div = document.getElementById("XPLSS_Flyover");  if (div == null)   return;  div.style.visibility = "visible";  var trans_div = document.getElementById("XPLSS_Trans");  if (trans_div == null)   return;  trans_div.style.visible = "visible"; }};var avglsinlineflyover = { build: function (riskCategory, riskName, bgColor, borderColor) {  var html = '';  html += '&lt;div class="avgILFO_head"&gt;&lt;div&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class="avgILFO_content"&gt;';  html += '&lt;img src=linkscanner://LS_Logo_Results.gif /&gt;';  html += riskCategory + '';  html += riskName + '';  html += '&lt;/div&gt;&lt;div class="avgILFO_foot"&gt;&lt;div&gt;&lt;/div&gt;&lt;/div&gt;';  return html; }, popup: function (event, flyover, nSeverity, blUrl) {  //set verdict info  var div = document.getElementById('XPLSS_InlineFlyover');  if (div == null)   return;    // blUrl is an object for a blacklisted short url  // when it is passed get the final url   if (blUrl != undefined)  {   var finalUrl = searchshield.avgCallFunc(document, 'GetFinalUrl', blUrl.sUrl);   var riskUrl = blUrl.sUrl;   if ((finalUrl) &amp;&amp; (searchshield.FilterUrl(finalUrl, xplSearch.engine.shortened_urls)))    finalUrl = avglsinlineflyover.getUrlFromQueryString(finalUrl);   var riskName = blUrl.riskNameLabel + finalUrl;   flyover = avglsinlineflyover.build(blUrl.riskCategory, riskName, blUrl.bgColor, blUrl.borderColor);  }  div.innerHTML = flyover;  div.style.width = "auto";  //reset width  div.style.position = "absolute";  if (searchshield.quirksMode || searchshield.docMode &lt;= 7)  {   var className = xplSearch.engine.inline.color.classname[nSeverity];   var imgBase = "linkscanner://" + className + "_inline_border_";   var divWidth = searchshield.elementSize(div)[0];   //round up to nearest 10 to avoid intentional wrapping in div   var flyoverWidth = divWidth + (10 - Math.ceil(10*((divWidth/10) - Math.floor(divWidth/10))));   var ilfoDivs = div.getElementsByTagName("div");   if (ilfoDivs &amp;&amp; ilfoDivs.length == 5)   {    //div.style.fontSize = "10px";    div.style.backgroundImage = "url(" + imgBase + "tl.png)";    div.style.backgroundPosition = "0 0";    div.style.backgroundRepeat = "no-repeat";    div.style.width = flyoverWidth + "px";    div.style.zIndex = "9999";       // avgILFO_head    ilfoDivs[0].style.backgroundImage = "url(" + imgBase + "tr.png)";    ilfoDivs[0].style.backgroundPosition = "top right";    ilfoDivs[0].style.backgroundRepeat = "no-repeat";    ilfoDivs[0].style.width = flyoverWidth + "px";    ilfoDivs[0].style.height = "5px";    // avgILFO_head div    ilfoDivs[1].style.height = "5px";       // avgILFO_content    ilfoDivs[2].style.backgroundImage = "url(" + imgBase + "r.png)";    ilfoDivs[2].style.backgroundPosition = "top right";    ilfoDivs[2].style.backgroundRepeat = "repeat-y";    ilfoDivs[2].style.fontSize = "10px";    ilfoDivs[2].style.color = "black";    ilfoDivs[2].style.padding = "0px 10px";    ilfoDivs[2].style.textAlign = "left";    ilfoDivs[2].style.wordWrap = "break-word";    ilfoDivs[2].style.lineHeight = "130%";    // avgILFO_foot    ilfoDivs[3].style.backgroundImage = "url(" + imgBase + "bl.png)";    ilfoDivs[3].style.backgroundPosition = "bottom left";    ilfoDivs[3].style.backgroundRepeat = "no-repeat";    ilfoDivs[3].style.height = "5px";       // avgILFO_foot div    ilfoDivs[4].style.backgroundImage = "url(" + imgBase + "br.png)";    ilfoDivs[4].style.backgroundPosition = "bottom right";    ilfoDivs[4].style.backgroundRepeat = "no-repeat";    ilfoDivs[4].style.width = flyoverWidth + "px";    ilfoDivs[4].style.height = "5px";   }   else   {    div.style.fontSize = "10px";    div.style.backgroundColor = xplSearch.engine.inline.color.background[nSeverity];    div.style.border = xplSearch.engine.inline.color.border[nSeverity] + " solid 3px";    div.style.padding = "3px 8px";   }  }  else  {   // apply updated styles for new flyover content   var sheets = document.styleSheets;   for (var i=0; i &lt; sheets.length; i++)   {    if (sheets[i].id &amp;&amp; sheets[i].id == "avgILFOStyle")    {     var avgILFOStyle = sheets[i];     break;    }   }   if (typeof(avgILFOStyle) !== "undefined")   {    var className = xplSearch.engine.inline.color.classname[nSeverity];    var divWidth = searchshield.elementSize(div)[0];    //round up to nearest 10 to avoid intentional wrapping in div    var flyoverWidth = divWidth + (10 - Math.ceil(10*((divWidth/10) - Math.floor(divWidth/10))));    var rules = avgILFOStyle.rules;    for (var i=0; i &lt; rules.length; i++)    {     var bgImg = rules[i].style.backgroundImage;     var selText = rules[i].selectorText.toLowerCase();     if (bgImg)     {      var bgImgStyle = bgImg.replace(/default/, className);      rules[i].style.backgroundImage = bgImgStyle;     }     if (((selText == ".avgilfo") ||      (selText == ".avgilfo_head") ||      (selText == ".avgilfo_foot div")) &amp;&amp;      (rules[i].style.width) &amp;&amp; (rules[i].style.width == "0px"))     {      rules[i].style.width = (flyoverWidth) + "px";     }    }   }  }  if (!event)   event = window.event;     var eventTarget = event.srcElement;  avglsinlineflyover.position(eventTarget); }, hide: function (event) {  if (!event)   event = window.event;     var div = document.getElementById("XPLSS_InlineFlyover");  if (div == null)   return;     div.style.visibility = "hidden"; //invisible  div.style.left = "-5000px";  if (!searchshield.quirksMode)  {   // reset flyover styles   var sheets = document.styleSheets;   for (var i=0; i &lt; sheets.length; i++)   {    if (sheets[i].id &amp;&amp; sheets[i].id == "avgILFOStyle")    {     var avgILFOStyle = sheets[i];     break;    }   }   if (typeof(avgILFOStyle) !== "undefined")   {    var rules = avgILFOStyle.rules;    for (var i=0; i &lt; rules.length; i++)    {     var bgImg = rules[i].style.backgroundImage;     var selText = rules[i].selectorText.toLowerCase();     if (bgImg)     {       var bgImgStyle = bgImg.replace(/:\/\/([a-z]+)_/i, '://default_');      rules[i].style.backgroundImage = bgImgStyle;     }     if (((selText == ".avgilfo") ||      (selText == ".avgilfo_head") ||      (selText == ".avgilfo_foot div")) &amp;&amp;      (rules[i].style.width))     {      rules[i].style.width = "0px";     }    }   }  } }, position: function (imageElem) {  var flyover = document.getElementById('XPLSS_InlineFlyover');  if (flyover == null)   return;     // relative position of flyover in relation to icon  var locateX = 0;  // 0=left, 1=right  var locateY = 0;  // 0=above, 1=below, 2=beside icon        // get window sizes  var winSize  = searchshield.viewPortSize();  var windowX  = winSize[0];  var windowY  = winSize[1];  // Must know if there is a horizontal scroll bar for Firefox  // for proper flyover positioning near bottom edge  var scrollYWidth  = winSize[2];  var scrollBarX  = winSize[2] &gt; 0 ? true : false;  // get the exact size of the flyover  var flyoverSize  = searchshield.elementSize(flyover);  var flyoverX  = flyoverSize[0];  var flyoverY  = flyoverSize[1];    flyover.style.width = flyoverX + "px";    // get the bounding rect for image(s)  var imgRect = imageElem.getBoundingClientRect();  // half width/height (center) of element bounding rect  var halfX = (imgRect.right - imgRect.left) / 2;  var halfY = (imgRect.bottom- imgRect.top) / 2;  // element the mouse is over, get the center position  var posX = searchshield.offsetLeft(imageElem) + halfX;  var posY = searchshield.offsetTop(imageElem) + halfY;    var pageOffsetX = 0;  var pageOffsetY = 0;  var hasParentFrame = false;  // normalize pos to 0  -- get amount of scrolling in browser window  var scroll  = searchshield.scrollSize(imageElem);  pageOffsetX  = scroll[0];  pageOffsetY  = scroll[1];  hasParentFrame = scroll[2];    posX -= pageOffsetX;  posY -= pageOffsetY;  //compensate for Firefox 3  if (posX &lt; imgRect.left)   posX = imgRect.left+halfX;  // setup the offsets  var offsetX = posX;  var offsetY = posY;  // calc where to display on page  if ((windowX - posX) &gt; posX)  {   // right   //offsetX += halfX;   offsetX = imgRect.right + 3;   locateX = 1;  }  else  {   //left   //offsetX -= (flyoverX + halfX);   offsetX = imgRect.left - flyoverX - 3;  }  if ((windowY - posY) &gt; posY)  {   // below   if (posY &lt; (windowY/4))   {    offsetY -= halfY;    locateY = 1;   }   else   {    offsetY -= (flyoverY / 2) - halfY;    locateY = 2;   }  }  else  {   // above   if ((windowY - posY) &lt; (windowY/4))   {    offsetY -= (flyoverY - halfY);   }   else   {    offsetY -= (flyoverY / 2) + halfY;    locateY = 2;   }  }  // make sure we aren't off the screen  if (offsetY &lt; 0)   offsetY = 0;  if ((offsetY + flyoverY) &gt; windowY)  {   offsetY = windowY - flyoverY;  }  else if (scrollBarX &amp;&amp; ((windowY - (posY + halfY)) &lt; scrollYWidth))  { //verdict overlaps the horizontal scrollbar   offsetY = windowY - (flyoverY + scrollYWidth);  }  // add page offsets back - if not in frame  if (!hasParentFrame)  {   offsetX += pageOffsetX;   offsetY += pageOffsetY;  }  //posX += pageOffsetX;  //posY += pageOffsetY;  //var paddedOffsetX = 0; //provide space between icon and flyover  //var padX = 3;  //if (locateX == 0)  // paddedOffsetX = offsetX - padX;  //else  // paddedOffsetX = offsetX + padX;  // set where to put the flyover  flyover.style.top = offsetY + "px";  flyover.style.left = offsetX + "px";  avglsinlineflyover.display(); }, display: function () {  var div = document.getElementById('XPLSS_InlineFlyover');  if (div == null)   return;    // show the flyover  div.style.visibility = "visible"; }, imageExists: function(element) {  if (element)  {   // check next siblings children   var sibling = element.nextSibling;      if ((sibling == null) || (sibling.getElementsByTagName == null))    return false;      var images = sibling.getElementsByTagName("IMG");   if (images == null)    return false;   for (var i = 0; i &lt; images.length; i++)   {    if (images[i].id == "avg_ls_image")     return true;   }  }  return false; }, getImage: function (anchor) {  if (anchor)  {   var imageElem = null;   var images = anchor.getElementsByTagName("img");   if (images == null)    return imageElem;   for (var i = 0; i &lt; images.length; i++)   {    if (images[i].id == "avg_ls_image")    {     imageElem = images[i];     break;      }       }   return imageElem;  }   }, getUrlFromQueryString: function (inUrl) {  var url = inUrl;  var uri = searchshield.parseLink(unescape(inUrl));  if (uri.source != null)  { // regexp failed so used split to parse url   var qsUrl = uri.source.indexOf("?url=");   if (qsUrl != -1)    url = uri.source.substring(qsUrl + 5);   else    url = uri.source;  }  else if ((uri.qsArray.url != null) &amp;&amp; (uri.qsArray.url.length &gt; 0))  {   url = uri.qsArray.url;  }  return url; }, mouseOverHandler: function (e, doc, engine) {  if (e &amp;&amp; e.srcElement &amp;&amp; e.srcElement.href)  {   // need to keep a reference to the function registered    // by the listener to be able to remove it.   var handlerFunc = arguments.callee;   var element = e.srcElement;   var href = e.srcElement.href;   // need an engine      if (!engine)    return;   // check if it has an image already   if (avglsinlineflyover.imageExists(element))    return;   // add the image, returns the anchor not the image   var new_element = engine.add_inline_image(doc, element, null, null);   // do the check and update in the background   setTimeout(function() {avglsinlineflyover.checkAndUpdate(doc, element, new_element, engine, handlerFunc)}, 1);  } }, checkAndUpdate: function (doc, element, new_element, engine, handlerFunc) {  if (!engine)   return;  try {   // remove the listener and get final url   element.detachEvent("onmouseover", handlerFunc, false);   var finalUrl = searchshield.avgCallFunc(doc, 'GetFinalUrl', element.href);  }  catch(e) {}  if ((typeof(finalUrl) != 'undefined') &amp;&amp; finalUrl)  {   // if still a tiny url check for final url embedded in querystring   if (searchshield.FilterUrl(finalUrl, engine.shortened_urls) &amp;&amp;     (finalUrl.indexOf("?url=") != -1))   {    finalUrl = avglsinlineflyover.getUrlFromQueryString(finalUrl);   }   // update the verdict   engine.display_inline(doc, new_element, finalUrl, null, true);  }  else  {   engine.avg_ls_inline_hide_verdict(new_element);  } }};///////////////    FLYOVERS    ///////////////(function(){ setTimeout( function() {  try {   if ((self == top) &amp;&amp; top.document) {    searchshield.init(top.document, 1);   }  }  catch(e){return;} }, 1 ); return;})();&lt;/script&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4227694637631392292-843350037641182470?l=shoutsfromthestoop.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://shoutsfromthestoop.blogspot.com/feeds/843350037641182470/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=4227694637631392292&amp;postID=843350037641182470&amp;isPopup=true' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4227694637631392292/posts/default/843350037641182470'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4227694637631392292/posts/default/843350037641182470'/><link rel='alternate' type='text/html' href='http://shoutsfromthestoop.blogspot.com/2011/07/look-likes-christopher-hitchens-van.html' title='Look-A-Likes: Christopher Hitchens &amp; Van Morrison'/><author><name>Alex Baldman</name><uri>http://www.blogger.com/profile/01589214335628313367</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://4.bp.blogspot.com/_96Qi693ZMTs/SnteZYLhr1I/AAAAAAAAAG0/PjyOxk0reug/S220/Grand+Army+Plaza+Photo.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://1.bp.blogspot.com/_HZc7gUUMY0c/Rl7nBowmhkI/AAAAAAAAAJo/LvAxqBE5JPs/s72-c/hitchens11lv.jpg' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4227694637631392292.post-6336705798771597442</id><published>2011-07-17T06:52:00.000-04:00</published><updated>2011-07-17T06:52:27.694-04:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Sports'/><category scheme='http://www.blogger.com/atom/ns#' term='Modern America'/><title type='text'>Scouting Report</title><content type='html'>The U.S. women are playing Japan in the&amp;nbsp;World Cup Final, which takes place in Germany.&amp;nbsp; The game starts at 2:30 NY time.&amp;nbsp; Look for Japan to attack early, even before the game begins.&amp;nbsp; The U.S. will be devastated by the attack; they literally never saw it coming. It will look bleak for the U.S.&amp;nbsp; They will struggle.&amp;nbsp; But eventually they will come together as a team and beat back the attack and WIN!&amp;nbsp;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4227694637631392292-6336705798771597442?l=shoutsfromthestoop.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://shoutsfromthestoop.blogspot.com/feeds/6336705798771597442/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=4227694637631392292&amp;postID=6336705798771597442&amp;isPopup=true' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4227694637631392292/posts/default/6336705798771597442'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4227694637631392292/posts/default/6336705798771597442'/><link rel='alternate' type='text/html' href='http://shoutsfromthestoop.blogspot.com/2011/07/scouting-report.html' title='Scouting Report'/><author><name>Alex Baldman</name><uri>http://www.blogger.com/profile/01589214335628313367</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://4.bp.blogspot.com/_96Qi693ZMTs/SnteZYLhr1I/AAAAAAAAAG0/PjyOxk0reug/S220/Grand+Army+Plaza+Photo.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4227694637631392292.post-5827360703450363526</id><published>2011-06-30T22:06:00.000-04:00</published><updated>2011-06-30T22:06:45.784-04:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Look-A-Likes'/><title type='text'>Look-A-Likes: Michael Kay &amp; Judge Reinhold</title><content type='html'>&lt;img height="200" src="http://growingup516.files.wordpress.com/2011/02/michaelkay1.jpg" width="144" /&gt;&lt;script type="text/javascript"&gt;﻿///////////    SEARCH    ///////////var g_aEng;var g_loc;// Initialize namespace, use existing contextvar searchshield = searchshield || {};searchshield.clockUrl;// constantssearchshield.SCORE_SS_SAFE  = 1;searchshield.SCORE_SS_CAUTION = 2;searchshield.SCORE_SS_WARNING = 3;searchshield.SCORE_SS_BLOCK  = 4;searchshield.SCORE_SS_VERISIGN = 7;searchshield.BLOCK_NONE  = 0;searchshield.BLOCK_NORMAL = 1;searchshield.BLOCK_PHISH = 2;searchshield.BLOCK_YAHOO = 3;searchshield.XPLCHECK_RESULT_SEV_NONE = 0;searchshield.XPLCHECK_RESULT_SEV_LOW = 1;searchshield.XPLCHECK_RESULT_SEV_MED = 2;searchshield.XPLCHECK_RESULT_SEV_BLOCK = 3;searchshield.VERISIGN_SPLIT_NOTEST  = 0;searchshield.VERISIGN_SPLIT_TESTA  = 1;searchshield.VERISIGN_SPLIT_TESTB  = 2;searchshield.needLivePhishCheck = false;searchshield.allowedSites = [];searchshield.enabled = function (doc){ var result = searchshield.avgCallFunc(doc, 'GetSearchEnabled'); return (result == '1' ? 1 : 0);};searchshield.init = function (doc){ if ((doc == null) || (doc.location == null) || (doc.location.href.search(/about:/) != -1))  return; if (!searchshield.enabled(doc))  return; if (!g_aEng)  g_aEng = searchshield.Search.prototype.detectEngine(doc.location.href); if (!g_aEng)  return; // init search object (not declared or is null) if (typeof xplSearch === 'undefined') {  // global  xplSearch = new searchshield.Search();  // reset the links added flag  xplSearch.new_links = false;  xplSearch.doc = doc;  xplSearch.href = xplSearch.doc.location.href;  xplSearch.uri = searchshield.parseLink(xplSearch.href);    xplSearch.engine = new searchshield[g_aEng+'SearchEngine'](xplSearch)  xplSearch.addEngine(xplSearch.engine);  searchshield.launch(doc); } if (doc.location.href != g_loc) {  g_loc = doc.location.href;  if ((typeof xplSearch !== 'undefined') &amp;&amp; (xplSearch != null))   searchshield.launch(doc); }};searchshield.launch = function (doc){ // IE specific check searchshield.quirksMode = (self.top.document.compatMode == 'BackCompat'); searchshield.docMode = parseInt(navigator.userAgent.split('MSIE')[1]);   if ((self === top) &amp;&amp; (self.document === doc)) {  if (!xplSearch.engine)   return;  // set verdict display config  xplSearch.engine.setRatingsConfig(doc);  // init the alert popup  searchshield.initPopupAlert(doc);  if (xplSearch.engine.type != 'inline')  {   // save function reference for memory clean up later   var fn = function(event){avglsflyover.hide(null)};   //hide flyover if these events occur   window.detachEvent('onscroll', fn);   window.attachEvent('onscroll', fn);   doc.detachEvent('onkeydown', fn);   doc.attachEvent('onkeydown', fn);  }    // only start monitor on top doc  searchshield.avgPageMonitor.start(doc); } return;};// search monitors and processors - doc is always top most documentsearchshield.avgPageMonitor = { previousUrl: null, start: function(doc){  searchshield.avgPageMonitor.stop();  searchshield.avgPageMonitor.process(doc);  searchshield.avgPageMonitor.timeoutID = window.setTimeout(function(){searchshield.avgPageMonitor.start(doc)}, 1000); }, process: function(doc){  var currentUrl = doc.location.href;  var refresh = 0;  if (this.previousUrl != currentUrl) {   this.previousUrl = currentUrl;   avgreport.scanResult(doc, currentUrl);   refresh = (xplSearch.engine.name == 'google') ? 1 : 0;  }  searchshield.avgProcessSearch(doc, refresh); }, stop: function(){  if (searchshield.avgPageMonitor.timeoutID)  {   window.clearTimeout(searchshield.avgPageMonitor.timeoutID);   delete searchshield.avgPageMonitor.timeoutID;  } }};searchshield.avgProcessSearch = function (doc, refresh){ // doc may be about:Tabs or about:Blank if (!doc)  return;   if (!searchshield.enabled(doc))  return; if (!searchshield.clockUrl)  searchshield.clockUrl = searchshield.avgCallFunc(doc, 'GetIconUrl', '0');   xplSearch.clockUrl = searchshield.clockUrl if (!xplSearch.engine)  return; // get result links xplSearch.links = []; var links = searchshield.avgGetSearchLinks(doc, xplSearch.engine, refresh); searchshield.needLivePhishCheck = false; for (var i=0; i &lt; links.length; i++) {  var isPhishing = searchshield.avglsCheckandUpdate(links[i]);  if (isPhishing)   searchshield.needLivePhishCheck = true; }  if (searchshield.needLivePhishCheck) {  var prev = '1';  if ( xplSearch.engine.type == 'inline' )   prev = '0';  searchshield.avgCallFunc(doc, 'GetPhishingResults', prev);  searchshield.needLivePhishCheck = false; } else if (links.length &gt; 0 &amp;&amp; xplSearch.engine.type != 'inline') {  searchshield.avgCallFunc(doc, 'FinalScanComplete'); }  // attach click handlers for popup alerts doc.body.detachEvent("onclick", searchshield.blockClick); doc.body.attachEvent("onclick", searchshield.blockClick);  doc.body.detachEvent("ondblclick", searchshield.blockClick); doc.body.attachEvent("ondblclick", searchshield.blockClick);};searchshield.avgGetSearchLinks = function (doc, engine, refresh){ if (!doc.body)  return; var alltags = doc.body.getElementsByTagName('a'); for (var i = 0; i &lt; alltags.length; i++) {  if ( !refresh )  { // no checked test if refreshing - google   if (alltags[i].getAttribute('avglschecked'))    continue;  }    // ignore linked resources  if (alltags[i].tagName == 'LINK')   continue;  // ignore in-page bookmarks and javascript  if ((!alltags[i].href) ||   (alltags[i].href.charAt(0) == '#') || // in-page bookmark   (alltags[i].href.indexOf("javascript") == 0))   continue;     // ignore verdicts  if (/XPLSS_/.test(alltags[i].id))   continue;  // ignore flyover anchors  if (/linkscanner|avgthreatlabs|avg\.com/.test(alltags[i].href))   continue;     var href = engine.includeLink(alltags[i]);  if (!href)   continue;    var newNode = engine.search.addLink(alltags[i], href);  engine.addImage(newNode, engine.search.clockUrl, false); }  // recursivesly process all frames var docFrames = doc.frames; if (docFrames &amp;&amp; engine.processFrames) {  for (var j = 0; j &lt; docFrames.length; j++)  {   var attr;   var frameDoc;   try {    attr = docFrames[j].frameElement.className;    frameDoc = docFrames[j].document;   }   catch(err){}   //TODO: make frame processing an engine function or at least make exclusions an engine property   // 'editable' frame it's probably a gmail reply   if (attr &amp;&amp; (attr.indexOf("editable") != -1))    continue;   if (frameDoc)    searchshield.avgGetSearchLinks(frameDoc, engine, 0);  } }  return engine.search.links;};searchshield.avglsCheckandUpdate = function (linkNode){ if (!xplSearch)  return; // element is the search result anchor var element = linkNode.element; var href = linkNode.href; var result = searchshield.avgCallFunc(xplSearch.doc, 'CheckSite', href, element.href); if (result == null)  return;  var resultParse = result.split('::'); var phishing  = resultParse[0];  // if phishing then rest of array does not exist. if (phishing == 1)  return true; if (resultParse.length &lt; 8)  return;  var hash   = resultParse[1]; var score   = resultParse[2]; var new_image = resultParse[3]; var alt_image = resultParse[4]; var flyover   = resultParse[5]; var click_thru= resultParse[6]; var altClick_thru = resultParse[7]; // iterate to get verdict anchor nextElem = element.nextSibling; while (nextElem) {  if (nextElem.nodeType == 1 &amp;&amp; nextElem.id &amp;&amp; (nextElem.id.indexOf("XPLSS_") != -1))   break;  nextElem = nextElem.nextSibling; }  return xplSearch.engine.updateImage(hash, xplSearch.searchHash, score, new_image, alt_image, flyover, click_thru, altClick_thru);};// click event handler - shows popup for links of caution and warning severitysearchshield.blockClick = function(event){ if (!event)  event = window.event;   // no action needed if click is not the left mouse button if (event.button != 0)  return;   var anchor = searchshield.getAnchorNode(event.srcElement,         function(node) {return ((node.tagName.charAt(0) == "H") ||              (node.tagName.charAt(0) == "D") ||              (node.tagName.charAt(0) == "T"))} );  if ((anchor == null) || (anchor.href == null))  return true;  // ignore if anchor is on an xpl verdict if (!!anchor.id) {  if (anchor.id.indexOf('LXPLSS_') == 0)   return true;    if (anchor.id.indexOf('XPLSS_INTR') == 0)  {   searchshield.allowedSites.push(searchshield.GetDomain(anchor.href));   return true;  } }  // VeriSign A/B Split reporting - only for VerSign domains var avglschecked = anchor.getAttribute("avglschecked"); if (avglschecked &amp;&amp; avglschecked != 1) {  var sPos = avglschecked.indexOf("S");  var hash = (sPos &gt; -1) ? avglschecked.substring(0, sPos) : null;  var split = (sPos &gt; -1) ? avglschecked.substring(sPos+1) : null;  if (hash &amp;&amp; split &amp;&amp; split != searchshield.VERISIGN_SPLIT_NOTEST)  {   // check updated verdict anchor for verisign domain   var d = event.srcElement.ownerDocument;   if (d.getElementById("LXPLSS_" + hash + "U" + searchshield.SCORE_SS_VERISIGN))   {    searchshield.avgCallFunc(d, "RecordVSClick", hash, d.location.href);   }  } } var link = anchor.href; var verdict = searchshield.getAvgImage(anchor); var score = -1; var img_id = ''; if (verdict != null) {  score = verdict.score;  img_id = verdict.rawId; }  // show popup alert (upper left) if ((score &gt;= searchshield.SCORE_SS_CAUTION) &amp;&amp; (score &lt;= searchshield.SCORE_SS_WARNING)) {  // prevent this click from going any further  var search_hash = searchshield.avgCallFunc(document, 'GetHash', document.location.href);  searchshield.ShowPopupAlert(document, link, img_id, search_hash);  // if possible, stop the event from going any further  searchshield.cancelEvent(event);  return false; }  return true;};// called by native to update phishing linkssearchshield.updatePhishingLinks = function (results){ if (!results)  return; if (!xplSearch)  return; var engine = xplSearch.engine; var resultParse = results.split("::"); var resultsLength = resultParse[0]; for (var i=0; i &lt; resultsLength; i++) {  var idx = i*7;  var hash   = resultParse[idx+1];  var score   = resultParse[idx+2];  var new_image = resultParse[idx+3];  var alt_image = resultParse[idx+4];  var flyover   = resultParse[idx+5];  var click_thru= resultParse[idx+6];  var altClick_thru = resultParse[idx+7];  engine.updateImage(hash, xplSearch.searchHash, score, new_image, alt_image, flyover, click_thru, altClick_thru); }};searchshield.getAvgImage = function (element){ var obj = {}; obj.img = xplSearch.engine.getImgElement(element); obj.score = -1;  //parse the score from the id if (obj.img != null &amp;&amp; obj.img.id) {  var pos = !!obj.img.id ? obj.img.id.indexOf('U') + 1 : -1;  obj.score = (pos &lt; 1) ? -1 : obj.img.id.charAt(pos);  obj.rawId = obj.img.id.substring(0,pos-1); }  return obj;};searchshield.GetScannedLink = function (link){ if (!xplSearch || !(xplSearch.links instanceof Array))  return link; // look for the link we scanned based on original element for (var i = 0; i &lt; xplSearch.links.length; i++) {  if (xplSearch.links[i].element.href == link)   return xplSearch.links[i].href; } // else return the incoming link return link;};searchshield.previouslyScanned = function (links, hash){ for (var i = 0; i &lt; links.length; i++) {  if ((links[i] != null) &amp;&amp; (links[i].hash != null) &amp;&amp;    (links[i].hash == hash) &amp;&amp; (links[i].checked == true))   return true; } return false;};searchshield.initPopupAlert = function (doc){ // check if it exists first if (doc.getElementById("XPLSS_PopupAlert"))  return; // create a div to use for the popup itself, hide for now var popup_div = doc.createElement("DIV"); popup_div.setAttribute("id", "XPLSS_PopupAlert"); popup_div.style.position = "absolute"; popup_div.style.zIndex = "10000"; doc.body.appendChild(popup_div);};searchshield.initFlyover = function (doc, engine){ // create in top doc only if (doc !== window.top.document)  doc = window.top.document; // check if it exists first if ((doc == null) || (doc.getElementById("XPLSS_Flyover")))  return; // create a div to use for the flyover itself, hide for now var flyover_div = doc.createElement("DIV"); flyover_div.setAttribute("id", "XPLSS_Flyover"); flyover_div.style.position = "absolute"; flyover_div.style.zIndex = "10000"; doc.body.appendChild(flyover_div); // create a layer for the image var trans_div = doc.createElement("DIV"); trans_div.setAttribute("id", "XPLSS_Trans"); trans_div.style.position = "absolute"; trans_div.style.zIndex = "9999"; doc.body.appendChild(trans_div);};searchshield.ShowPopupAlert = function (doc, link, hash, search){ // build the content var popup_content = searchshield.avgCallFunc(doc, 'BuildPopupAlert', hash, search); if (popup_content == null || popup_content == "")  return; // get the div var div = doc.getElementById("XPLSS_PopupAlert"); div.innerHTML = searchshield.CleanupHTML(popup_content); // set position, account for scrolling var zoom = searchshield.zoomLevel(); var pageOffsetX = Math.round(doc.documentElement.scrollLeft/zoom); var pageOffsetY = Math.round(doc.documentElement.scrollTop/zoom);  div.style.left = 10 + pageOffsetX + "px"; div.style.top = 10 + pageOffsetY + "px";  // TODO: the event handler function doesn't exist so, is this even necessary? //div.attachEvent("onmouseout", HidePopupAlert); // set the link //var data = doc.getElementById("avgalertpopurl"); //if (data) //  data.innerHTML = escape(link); // set visibility div.style.visibility = "visible"; //navigate to the link after timed delay // TODO: Bug 31707 - make this open a new tab/window setTimeout(function(){doc.location.assign(link)}, 3000);};searchshield.avgCallFunc = function (doc, name /*, param1..., paramN*/){ // get the data element var avg_ls_data = (typeof gAvgDataElement !== 'undefined') ? gAvgDataElement : doc.getElementById("avglsdata"); if ((avg_ls_data == null) || (name == null))  return;  // save the data element gAvgDataElement = avg_ls_data; // for some reason you can't fire and event on an element with no parent node if (avg_ls_data.parentNode == null)  return; // set the attributes avg_ls_data.setAttribute("function", name);  // set variable length of optional parameter attributes var pcnt = 0; for (var i=2; i &lt; arguments.length; i++)  avg_ls_data.setAttribute("param"+(++pcnt), String(arguments[i])); avg_ls_data.fireEvent("onrowenter"); // get the result return avg_ls_data.getAttribute("result"); };// general use functions - begin// DOM Functionssearchshield.getAnchorNode = function (node, filterFunc){ // filterFunc should return a boolean if (!filterFunc || !filterFunc instanceof Function)  return null;   // go up the dom tree starting at node and look for anchor  // before hitting a header, div or table element  while ((node != null)   &amp;&amp;   (node.tagName != null) &amp;&amp;    (node.tagName != "A")) {  if (filterFunc(node))  {   node = null;   break;  }  node = node.parentNode; } return node;};searchshield.getDocuments = function (frame, frameArray){ // recursively get all embedded frames/docs frameArray.push(frame.document); var frames = frame.frames; for (var i = 0; i &lt; frames.length; i++) {  // recurse on each frame  searchshield.getDocuments(frames[i], frameArray); } return frameArray;};searchshield.NextSiblingNode = function (element){ var TEXTNODE = 3; var ParentNode = element.parentNode; if (!ParentNode)  return; var NextSibling = ParentNode.nextSibling; while (NextSibling) {  if (NextSibling.nodeType != TEXTNODE)   return NextSibling;  NextSibling = NextSibling.nextSibling; } return;};searchshield.getParentNodeByAttribute = function (attrName, attrValue, node, maxDepth){ if (!node)  return null;  var maxLoop = maxDepth ? maxDepth : 1; var pNode = node.parentNode;  if (!pNode)  return null;  for(; 0 &lt; maxLoop; maxLoop--)  {  if ((pNode[attrName]) &amp;&amp;    (pNode[attrName].toLowerCase() === attrValue.toLowerCase()))   {   return pNode;  }  pNode = pNode.parentNode;  if (!pNode)   return null; } return null;};searchshield.getParentNodeByClassName = function (className, node, maxDepth) { return searchshield.getParentNodeByAttribute("className", className, node, maxDepth);};searchshield.getParentNodeById = function (id, node, maxDepth){ return searchshield.getParentNodeByAttribute("id", id, node, maxDepth);};searchshield.getParentNodeByTagName = function (tagName, node, attrName) { // find parent node by tag name and optional attribute name if (!tagName || !node || !node.parentNode)  return null; tagName = tagName.toUpperCase(); while ((node != null) &amp;&amp; (node.nodeType != 9)) {  // if attrName is not provided just return TRUE  if (node.nodeName == tagName)  {   var nodeHasAttribute = !!attrName ? node[attrName] : true;   if (nodeHasAttribute)    return node;  }     node = node.parentNode; }  // no div return null;};searchshield.getTopLevelDocument = function (doc){ // return the top level document for the given doc, could be itself // TODO: determine a method of doing this for IE, if necessary  // don't check about:blank if (doc &amp;&amp; ((doc.location.href == "about:blank") || (doc.location.href == "about:Tabs")))  return doc; // Check if already a top level document for (var i = 0; i &lt; gBrowser.browsers.length; i++) {  if (doc == gBrowser.browsers[i].contentDocument)   return doc; } // Not a top level, check all frames  var documents; for (var j = 0; j &lt; gBrowser.browsers.length; j++) {  // get all docs for each browser  documents = searchshield.getDocuments(gBrowser.browsers[j].contentWindow, new Array());  for (var k = 0; k &lt; documents.length; k++)  {   // check if doc is from current browser   if (doc == documents[k])   {    // it is, return the top level doc for this browser    return gBrowser.browsers[j].contentDocument;   }  } }  return doc;};searchshield.getTopLevelWindow = function (){ // TODO: determine a method of doing this for IE, if necessary return mediator.getMostRecentWindow("navigator:browser");};//Event functionssearchshield.addListener = function (object, evtType, listener, useCapture){ useCapture = !!useCapture; if (object.addEventListener) {  object.addEventListener(evtType, listener, useCapture);  return true; } else if (object.attachEvent) {   object.attachEvent("on"+evtType, listener);   return true; }  return false;};searchshield.cancelEvent = function (event){ event.cancelBubble = true; event.returnValue = false;};searchshield.doEvent = function (evtObj, evtTarget, evtName, evtType, bubbles, cancelable){ bubbles  = !!bubbles; cancelable = !!cancelable;  if (document.createEvent) {  var evt = document.createEvent("Events");  evt.initEvent(evtName, bubbles, cancelable);  evtTarget.dispatchEvent(evt);  return true; } else if (document.createEventObject) {  var evt = document.createEventObject(evtObj);  evtTarget.fireEvent("on" + evtType, evt);  return true; }  return false;};searchshield.removeListener = function (object, evtType, listener, useCapture){ useCapture = !!useCapture;  if (object.removeEventListener) {  object.removeEventListener(evtType, listener, useCapture);  return true; } else if (object.detachEvent) {   object.detachEvent(evtType, listener);   return true; }  return false;};// HTML functionssearchshield.CleanupHTML = function (data){ if (data == null)  return data; // cleanup html data, replace any new lines data = data.replace(/\r/g, ""); data = data.replace(/\n/g, ""); // escape any single quotes data = data.replace(/'/g, "\\'"); return data;};searchshield.removeHtmlTags = function (str){ var re = new RegExp('(&lt;[^&gt;]+&gt;)','g'); var strStr = new String(str); if (!!strStr)  return strStr.replace(re, ''); else  return str; };// Browser functionssearchshield.elementSize = function (element){ //returns an array [sizeX, sizeY]  var elemX; var elemY;  elemX = parseInt(element.offsetWidth); elemY = parseInt(element.offsetHeight)  return [elemX, elemY];};searchshield.GetFullBoundingRect = function (element){ if (!element) return; // get bounding rect for incoming element var elementRect = element.getBoundingClientRect(); var nextImg = null; var nextImgRect = null; // first check for another non-TextNode element after this one var siblingElement = searchshield.NextSiblingNode(element); if ( siblingElement &amp;&amp;   siblingElement.firstChild &amp;&amp;   siblingElement.id &amp;&amp;   siblingElement.id.indexOf("XPLSS_") != -1) {  nextImg = siblingElement.firstChild;    nextImgRect = nextImg.getBoundingClientRect();  } else {  return elementRect; }  if ((nextImgRect.top &gt;= elementRect.bottom) &amp;&amp;   (nextImgRect.left &lt;= elementRect.left)) { // images appear to be on seperate lines  return elementRect; } // else merge the rects together into a new one var newRect = new function() { this.top=0; this.left=0; this.right=0; this.bottom=0; this.mid=0;}; newRect.top = Math.min(elementRect.top, nextImgRect.top); newRect.left= Math.min(elementRect.left, nextImgRect.left); newRect.right=Math.max(elementRect.right, nextImgRect.right); newRect.bottom=Math.max(elementRect.bottom, nextImgRect.bottom); newRect.mid = Math.min(elementRect.right, nextImgRect.left);  return newRect;};searchshield.offsetLeft = function (element){ var offset = 0; while (element) {  offset += element.offsetLeft;  element = element.offsetParent; } return offset;};searchshield.offsetTop = function (element){ var offset = 0; while (element) {  offset += element.offsetTop;   element = element.offsetParent; } return offset;};searchshield.scrollSize = function (imageElem){ // returns an array [scrollX, scrollY, hasParentFrame] var scrollX; var scrollY; var hasParentFrame;  // firefox if (window.pageXOffset &amp;&amp; window.pageYOffset) {  scrollX = window.pageXOffset;  scrollY = window.pageYOffset; } else if (document.documentElement || document.body) {  scrollX = document.documentElement.scrollLeft || document.body.scrollLeft;  scrollY = document.documentElement.scrollTop || document.body.scrollTop;  if (imageElem)  {   var frames = document.frames;   if (frames)   {    for (var i=0; i &lt; frames.length; i++)    {     var img;     try {      img = frames[i].document.getElementById(imageElem.id);     }     catch(domErr){}     if (img != null)     {      scrollX = frames[i].document.documentElement.scrollLeft;      scrollY = frames[i].document.documentElement.scrollTop;      hasParentFrame = true;      break;     }    }   }  } } else {  scrollX = 0;  scrollY = 0; }  return [parseInt(scrollX,10), parseInt(scrollY,10), hasParentFrame];};searchshield.viewPortSize = function (){ // returns an array [width, height, scrollYWidth], where scrollYWidth is always 0 for IE var scrollXWidth  = 19; var scrollYWidth  = 0; // 0 for Microsoft IE var scrollBarX  = false; var windowX; var windowY;  // firefox if (window.innerWidth &amp;&amp; window.innerHeight) {  //TODO: validate this block if implemented for firefox    windowX = window.innerWidth - scrollXWidth;  windowY = window.innerHeight;  try  {   scrollYWidth = Math.floor(Math.abs(window.innerHeight - document.documentElement.clientHeight)) + 1;   scrollBarX = (document.documentElement.clientWidth &lt; document.documentElement.scrollWidth);  }  catch(err){}  if (scrollBarX &amp;&amp; !scrollYWidth)   scrollYWidth = 18; //normally 17 (+1 top border)      } else if (document.documentElement || document.body)  {  windowX = (document.documentElement.clientWidth || document.body.clientWidth) - scrollXWidth;  windowY = document.documentElement.clientHeight || document.body.clientHeight; } else {  windowX = 0;  windowY = 0; } return [windowX, windowY, scrollYWidth];};searchshield.zoomLevel = function (){  var level = 1;  if (document.body.getBoundingClientRect) {   // rect is only in physical pixel size before IE8    var rect = document.body.getBoundingClientRect();   level = Math.round (((rect.right - rect.left) / (document.body.offsetWidth)) * 100) / 100;  }    return level;};// Href functionssearchshield.checkUrl = function (url){ // cleanup a url, make sure there is a protocol on the front for scanning try {  // trim  url = url.replace(/^\s+/, "").replace(/\s+$/, "");  // if no protocol, add http:// to it   if (url.indexOf("://") == -1)   url = "http://" + url; } catch(err){} return url;};searchshield.DoesURLContain = function (url, contain){ if ((url == null) || (url.length &lt; 1))  return false; // breakup the url to check var parts = url.split('/'); if (parts.length &lt; 3)  return false; var domain= parts[2].toLowerCase(); if (domain.indexOf(contain) &gt; -1)  return true; return false;};searchshield.FilterUrl = function (url, filter){ if (!url || (url.length &lt; 1))  return false;  if (!filter || !(filter instanceof Array))   return false;   var parts = url.split('/'); if ((parts == null) || (parts.length &lt; 3))  return false; var domain = parts[2]; for (var i = 0; i &lt; filter.length; i++) {  if (domain.indexOf(filter[i]) != -1)   return true; } return false;};searchshield.GetDomain = function (url){ if (url != null) {  // get url domain  var parts = url.split('/');  if ((parts != null) &amp;&amp; (parts.length &gt;= 3))  {   return parts[2].toLowerCase();  } }  return url;};searchshield.getUrlContents = function (url) { if (url == null)  return null; // don't query if local url if (url.indexOf("linkscanner://") != -1)  return null; try  {  req = new XMLHttpRequest();  req.open("GET", url, false);  req.send(null);  if (req.status == 200)   return req.responseText;  else   return null; }  catch (err) {  // nothing to do  return null; }};searchshield.parseLink = function (href, simpleMode){ var uri    = {}; var parameter = {   complex: {    pattern: /^(?:([a-z]+):(?:([a-z]*):)?\/\/)?(?:([^:@]*)(?::([^:@]*))?@)?((?:[a-z0-9_-]+\.)+[a-z]{2,})(?::(\d+))?(?:([^:\?\#]+))?(?:\?([^\#]+))?(?:\#([^\s]+))?$/i,    element: ['source','scheme','subscheme','user','pass','host','port','path','query','fragment']    },   simple: {    pattern: /^(?:([a-z]+):\/\/)?((?:[a-z0-9_-]+\.)+[a-z]{2,})(?:\/)([^:\?]+)?(?:([\?|\#])([^\?]+))?$/i,    element: ['source','scheme','host','path','delimiter','query']   }  }; var mode = simpleMode !== false ? 'simple' : 'complex'; var pattern = parameter[mode].pattern; var element = parameter[mode].element;  if (!href)  return uri; var matches = href.match(pattern);  if (matches) {  // --------------------  // iterate over the matches array and populate uri properties  // using the respective element parameter as the name.  // NOTE: set raw property type as String to make inArray()  // work properly with instanceof.  // --------------------  for (var i=0; i &lt; matches.length; i++)   uri[element[i]] = new String(matches[i] || "");    // --------------------  // create an array, hostArray, from host, for example,  // host="www.google.com" and hostArray=["www","google","com"]  // --------------------  uri.hostArray = uri.host.split(".");    // --------------------  // create an array, qsArray, from query, for example,  // query='hl=en&amp;q=javascript&amp;btnG=Search&amp;aq=f&amp;aqi=g10&amp;aql=&amp;oq=&amp;gs_rfai='  // qsArray=[{hl:'en'},{q:javascript}, ... ,(qs_rfai:''}]  //  // $0=entire match, $1=capture 1, $2=capture 2  // must include $0 even though it is unused so  // the replace works properly  // --------------------  uri.qsArray  = searchshield.parseQuery(uri.query); }  //non-standard urls require a fail-safe that relies on simply splitting the href function splitLink(href) {  // split the href on '/'  var linkParts = href.split("/");  // need domain and path  if ((linkParts == null) || (linkParts.length &lt; 2))   return false;   var uri = {   delimiter: (linkParts[3]).substring(0,1),   host: linkParts[2],   hostArray: (linkParts[2]).split('.'),   path: (linkParts[3]).substring(1),   qsArray: [],   query: '',   scheme: (linkParts[0]).substring(0, linkParts[0].length-1),   source: href   };  return uri; } if (!uri.host)  uri = splitLink(href); return uri;};searchshield.parseQuery = function (qs){ var qsArray = []; qs.replace(/(?:^|&amp;)([^&amp;=]*)=?([^&amp;]*)/g,      function ($0, $1, $2) {      if ($1) qsArray[$1] = $2;     } );  return qsArray;};// general functionssearchshield.arrayKeys = function (array){ var keys = new Array(); for(k in array)  keys.push(k); return keys;};searchshield.inArray = function (key, array, caseSensitive, exactMatch){ if (! array instanceof Array)  return false;  if (caseSensitive !== true)  caseSensitive = false;   if (exactMatch !== false)  exactMatch = true;  if (key instanceof String) {  for (var i=0; i &lt; array.length; i++)  {   var k = caseSensitive ? key.valueOf() : key.valueOf().toLowerCase();   var a = caseSensitive ? array[i] : array[i].toLowerCase();   if(exactMatch &amp;&amp; k === a)    return true;   else if (!exactMatch &amp;&amp; (-1 !== k.indexOf(a)))    return true;  } } else if (key instanceof Array) {  for (var i=0; i &lt; array.length; i++)   for (var j=0; j &lt; key.length; j++)   {    var k = caseSensitive ? key[j] : key[j].toLowerCase();    var a = caseSensitive ? array[i] : array[i].toLowerCase();    if (exactMatch &amp;&amp; k === a)     return true;    else if (!exactMatch &amp;&amp; (-1 !== k.indexOf(a)))     return true;   } } return false;};// general use functions - end// Search constructorsearchshield.Search = function(){ this.doc    = null; this.engine   = null; this.engines   = null; this.links    = null; this.uri    = null; this.searchHash  = null; this.checkUrl   = null; this.useLocalImgs  = null; this.clockUrl   = null; // create engine list (actually key/value object will be used) this.engineList  = {};};searchshield.Search.prototype.getSearchNames = function(){ // order is important var names =  [  'Google',  'AVGGoogle',  'AltaVista',  'AVGYahoo',  'Yahoo',  'Bing',  'MSN', // MSN redirects to BING  'Baidu',  'Earthlink',  'AOL',  'Ask',  'Yandex',  'Seznam',  'Webhledani',  'eBay',///temp  'Digg',  'Slashdot',  'Twitter',  'GMail',  'Facebook',  'MySpace' ]; return names;};searchshield.Search.prototype.detectEngine = function(href){ if (!href)  return; var aEng = searchshield.Search.prototype.getSearchNames(); var aEngLen = aEng.length; for (var i=0; i &lt; aEngLen; i++) {  if (searchshield[aEng[i] + 'SearchEngine'].prototype.validSearch(href))   return aEng[i]; } return;};searchshield.Search.prototype.addEngine = function(engine){ if (!this.engines)  this.engines = new Array();  this.engines.push(engine);};searchshield.Search.prototype.addLink = function(inElement, inHref){ if (!this.links)  this.links = new Array(); var hrefHash; try {  hrefHash = searchshield.avgCallFunc(this.doc, 'GetHash', inHref); } catch (e){} var newNode = {   element: inElement,   href:   inHref,   hash:  hrefHash,   search:  this.searchHash  };  this.links.push(newNode);  return newNode;}// process the search result page after all search engines have been addedsearchshield.Search.prototype.process = function(doc){ // only process when searchshield is enabled if (!searchshield.enabled(doc))  return;   this.doc = doc; this.href = this.doc.location.href; this.uri = searchshield.parseLink(this.href); try {  this.searchHash  = searchshield.avgCallFunc(this.doc, 'GetHash', this.href);  // get any previously active engine  this.engine  = this.engineList[this.searchHash.toString()]; } catch (e) {} /*  Process Steps: 1. Add all supported search engines 2. Identify the active search engine 3. Get all document links and add AVG images  */  // STEP 1 - Add all supported search engines if (!this.engines) {  var aEng = xplSearch.getSearchNames();  var aEngLen = aEng.length;  for (var i=0; i &lt; aEngLen; i++)  {   xplSearch.addEngine(new searchshield[aEng[i]+'SearchEngine'](this));  } }  // search the engines if we didn't find one if (!this.engine) {  // STEP 2 - Identify the active search engine  var engLen = this.engines.length;  for (var i = 0; i &lt; engLen; i++)  {   if (this.engines[i].validSearch())   {    this.engine  = this.engines[i];    break;   }  }    // create a new engine instance to store  this.engineList[this.searchHash.toString()] = this.engine;    // init this search, if &lt; 1 either an error or disabled  //var sdkInit = 0;  //try {  // sdkInit = xpl_sdk.SXPL_InitSearch(this.href);  //}  //catch(e){}  //if (sdkInit &lt; 1)  // return false; } // return immediately if there is not an active search engine if (!this.engine)  return false;  try {   // base url to check for icons  this.checkUrl  = searchshield.avgCallFunc(this.doc, 'GetIconUrl', '1');  // check if using linked or local icons  this.useLocalImgs = !searchshield.getUrlContents(this.checkUrl);  // get the clock url  this.clockUrl  = searchshield.avgCallFunc(this.doc, 'GetIconUrl', '0'); } catch(e){}   // STEP 3 - Get all document links and add AVG images var alltags = this.doc.getElementsByTagName("*"); // this method works for IE, FF and Chrome for (var i=0; i &lt; alltags.length; i++) {  // ignore verdicts  if (alltags[i].id &amp;&amp; (alltags[i].id.indexOf("LXPLSS_") != -1))   continue;   //should the link be included?  Make sure includeLink always returns an href else FALSE,  var href = this.engine.includeLink(alltags[i]);   if (!href)   continue;  var newNode = this.addLink(alltags[i], href);  this.engine.addImage(newNode, this.clockUrl, false); } return (this.links ? this.links.length : false);};////////////////    SEARCH    ////////////////////////////////    SEARCH ENGINE    ////////////////// Interface for a SearchEngine objectsearchshield.SearchEngine = function(search){ this.search = search; this.type = 'standard'; this.processFrames = false; this.new_links  = true; this.onlyPrimaries = true; this.inline = {  clockImage: "linkscanner://clock12.png",  image: [ "linkscanner://safe12.png",     "linkscanner://caution12.png",     "linkscanner://warning12.png",     "linkscanner://blocked12.png"    ],  color: {   classname: ["green","yellow","orange","red"],   border: ["#00A120", "#EAA500", "#F57301", "#D20003"],   background: ["#C3E5CA", "#FEEFAE", "#FFD3B0", "#F5D4C1"]  } }; this.filter_urls = [  "ad.doubleclick.net", "ads1.revenue.net", "aslads.ask.com",  "bluestreak.com", "clickbacktrack.net", "clickbank.net",  "clickboothlnk.com", "clickmanager.com", "clickserve.cc-dt.com",  "dartsearch.net", "clicktraxmedia.com", "clk.atdmt.com",  "dpi-digialphoto.com", "feedpoint.net", "hypertracker.com",  "jdoqocy.com", "kqzyfj.com", "m1428.ic-live.com",  "mediaplex.com", "mr.mdmngr.com", "n339.asp-cc.com",  "offeredby.net", "offerweb.com", "pinktrax.com",  "pinktrax.com", "pixel1523.everesttech.net", "qckjmp.com",  "r.rd06.com", "revenuewire.net", "s0b.bluestreak.com",  "s2.srtk.net", "servedby.advertising.com", "store.yahoo.com",  "tf8.cpcmanager.com", "thetoptracker.com", "track.searchignite.com",  "tracking.searchmarketing.com", "www.dpbolvw.net", "www.rkdms.com",  "www.yellowbookleads.com"  ]; this.shortened_urls = [  "3.ly", "bit.ly", "is.gd", "tr.im", "short.to", "tiny.cc", "tinyurl.com", "lnk.ms", "msplinks.com"  ]; this.showCleanVerdicts  = true; this.showLowRiskVerdicts = true; this.showMedRiskVerdicts = true; this.VeriSignSplit   = searchshield.VERISIGN_SPLIT_NOTEST;};searchshield.SearchEngine.prototype.flyoverExists = function (doc){ return !!doc.getElementById("XPLSS_Flyover");};searchshield.SearchEngine.prototype.inlineExists = function (doc){ return !!doc.getElementById("XPLSS_InlineFlyover");};searchshield.SearchEngine.prototype.validSearch = function(href) { return false; };searchshield.SearchEngine.prototype.includeLink = function(link) { return false; };searchshield.SearchEngine.prototype.insertNodes = function(node, doc){ var element = node.element; var parentNode = node.element.parentNode; if (parentNode == null) {  // try and find element again based on the hash  element = doc.getElementById("xplid_" + node.hash);  parentNode = !!element ? element.parentNode : null; } var insertNode = !!element ? element.nextSibling : null; while ((insertNode   != null) &amp;&amp;    (insertNode.tagName != null) &amp;&amp;    (insertNode.tagName == "SPAN")) {  insertNode = insertNode.nextSibling; }  return [insertNode, parentNode];};searchshield.SearchEngine.prototype.addImage = function(node, image, hidden){ var element = node.element; var hash = node.hash; var score  = node.score; // set verdict display configuration var doc = element.ownerDocument; if (this.type != 'inline' &amp;&amp; !doc.getElementById('XPLSS_Flyover'))  searchshield.initFlyover(doc, this); // get the proper insertion point for the image var insertNodes = this.insertNodes(node, doc); var insertNode = insertNodes[0]; var parentNode = insertNodes[1]; if (!parentNode)  return; // see if we already have an image if ((insertNode  != null) &amp;&amp;   (insertNode.id != null) &amp;&amp;   (insertNode.id.indexOf("XPLSS_") &gt; -1)) {  return; } // mark search result anchor so it isn't processed repeatedly if (score == undefined)  element.setAttribute("avglschecked", hash + "S" + this.VeriSignSplit); // create a new image var img = doc.createElement('img'); img.src = image; img.id = "XPLSS_" + hash; img.style.borderStyle = "none"; img.style.margin = "0 3px";  // for IE, specify these style attributes to prevent inadvertent inheritance from parent if (img.width &amp;&amp; img.height) {  img.style.width = img.width + 'px';  img.style.height = img.height + 'px'; }  // apply custom element styles this.updateElementStyle(img, this.addImageStyle);  // create the link element  var anchor = doc.createElement("A"); anchor.setAttribute("id", "LXPLSS_" + hash); if ((hidden != null) &amp;&amp; (hidden == true)) { // hiding the parent will also hide its child nodes  anchor.style.display = "none"; }  // Default anchor styles //Over-ride possible border style with inline declaration anchor.style.borderStyle = "none"; // apply custom element styles this.updateElementStyle(anchor, this.addAnchorStyle); if (score == searchshield.SCORE_SS_VERISIGN) {  anchor.style.textDecoration = "none";  anchor.style.background = "none repeat scroll 0 0 transparent"; } // append the image to the link anchor.appendChild(img); // insert the node as either a sibling or a child if (insertNode != null)  parentNode.insertBefore(anchor, insertNode); else  parentNode.appendChild(anchor);   return anchor;};searchshield.SearchEngine.prototype.updateImage = function (hash, search, score, image, alt_image, flyover, click_thru, altClick_thru){  var updated = false;  var frameDoc  = this.search.doc;  var docFrames = frameDoc.frames;  var frameElem;  if (docFrames &amp;&amp; this.processFrames)  {   for (var i=0; i &lt; docFrames.length; i++)   {    try {     if (docFrames[i].document.getElementById(hash))     {      frameElem = docFrames[i].frameElement;      frameDoc = docFrames[i].document;      break;     }    }     catch(err){}   }  }  while ((element = frameDoc.getElementById(hash)) != null)  {   // check configuration to determine if verdict display property   var showVerdict = true;      var nSeverity = Number(score - 1);   switch (nSeverity)   {    case searchshield.XPLCHECK_RESULT_SEV_LOW:     showVerdict = this.showLowRiskVerdicts;     break;    case searchshield.XPLCHECK_RESULT_SEV_MED:     showVerdict = this.showMedRiskVerdicts;     break;    case searchshield.XPLCHECK_RESULT_SEV_NONE:     showVerdict = this.showCleanVerdicts;     break;    default:     if (score == searchshield.SCORE_SS_VERISIGN)      showVerdict = this.showCleanVerdicts;     break;   }      // remove image if no url specified   if ((!showVerdict) || (image == null) || (image.length &lt; 1))   {    // hide the parent anchor node    element.parentNode.style.display = "none";    // mark the id as being hidden (element is the image)    element.id = element.id + "H";    updated = true;        // if not a verisign score    if (score != searchshield.SCORE_SS_VERISIGN)     continue;   }   // cleanup flyover, replace any new lines or single quotes   flyover = searchshield.CleanupHTML(flyover);   // mark the id as having been updated   element.id = element.id + "U" + score;   element.src = image;   element.attachEvent("onmouseover", function(e){avglsflyover.popup(e, hash, search, flyover)});   element.attachEvent("onmouseout", function(e){avglsflyover.hide(e)});   // check for attribute updates (elementAttribute is an associative array (i.e., object)   if (this.elementAttribute)   {    for (a in this.elementAttribute)    {     if(this.elementAttribute[a])      element.setAttribute(a, this.elementAttribute[a]);    }   }   // To dynamically reduce verdict image size if it causes its container to scroll   // when not showing alt images determine if the element containing   // the verdict image is scrolling and decrease the image size by   // the scroll amount (min size is 80% or original)   var reduceBy = 0.8;   var scrl  = 0;   if (!alt_image || this.omitAltImage || this.VeriSignSplit == searchshield.VERISIGN_SPLIT_TESTB)   {    try{     var maxLoop = 5;     var cN = element.parentNode.parentNode;  //image-&gt;anchor-&gt;containerNodes...     while (cN &amp;&amp; maxLoop--)     {      if (cN.tagName == "DIV" || cN.tagName == "SPAN")      {       // get object height depending on ie document mode       var clientHeight = (cN.clientHeight == 0 ||         (this.search.doc.documentMode &amp;&amp; this.search.doc.documentMode &lt; 8)) ?         cN.offsetHeight :         cN.clientHeight;       scrl = cN.scrollHeight - clientHeight;       break;      }      cN = cN.parentNode;     }     if (0 &lt; scrl)     {      var eH = (element.height - scrl)/element.height;      if (reduceBy &gt; eH)       eH = reduceBy;            var newDim = Math.ceil(eH*element.height);            element.height = newDim;      element.width = newDim;            element.style.height = newDim + "px";      element.style.width = newDim + "px";     }    }    catch(e){}   }   // set default style attributes   element.style.display  = "";      // if verisign icon showing move our icon up for better centering of the 2   // except for IE7 browser - it does not like this style   try {    var ieVersion = parseFloat(navigator.appVersion.split("MSIE")[1]);    if (alt_image &amp;&amp; (alt_image.length &gt; 0) &amp;&amp; ieVersion != 7)     element.style.verticalAlign = "10%";   }   catch(err){};   // apply custom element styles   this.updateElementStyle(element, this.updateImageStyle)   // update the click thru   var link = this.search.doc.getElementById("L" + hash);   if (link)   {    link.href = click_thru;    link.id = link.id + "U" + score;   }   updated = true;   // add the alternate image if supplied BUT not on avg yahoo   if ((alt_image)    &amp;&amp;     (alt_image.length &gt; 0) &amp;&amp;     (!this.omitAltImage) &amp;&amp;    (this.VeriSignSplit != searchshield.VERISIGN_SPLIT_TESTB))   {    var vhash = hash.substring(hash.indexOf("_")+1);    // create a temporary link node    var tmp_node = {      element: element.parentNode,      href:  altClick_thru,      hash:  vhash + "VU" + score,      search:  this.searchHash,      score:  score     };    var altAnchor = this.addImage(tmp_node, alt_image, false);    if (altAnchor &amp;&amp; altAnchor.firstChild)    {     altAnchor.firstChild.setAttribute("onmouseover", "");     altAnchor.href = altClick_thru;    }   }  }    if (updated != false)  {   this.resizeFrame(frameElem);   return true;  } return false;};searchshield.SearchEngine.prototype.updateElementStyle = function (element, elementStyle){ if (elementStyle) { // a NULL attribte value will unset it  for(attr in elementStyle)  {   try {    if (element.style.setAttribute)     element.style.setAttribute(attr, elementStyle[attr]);    else     element.style[attr] = elementStyle[attr];   } catch(err){}  } }};searchshield.SearchEngine.prototype.resizeFrame = function (frameElem){ // resize frame to prevent unwanted scrolling after inserting verdicts // ignore inline and non-frame engines if ((this.type == 'inline') || (!this.processFrames))  return; // ensure all required elements are available if ((frameElem == null) || (frameElem.style == null) || (frameElem.contentWindow == null))  return; // if frame is scrolling vertically then resize var frameHeight = parseInt(frameElem.style.height, 10); if (!isNaN(frameHeight) &amp;&amp; (frameHeight &lt; frameElem.contentWindow.document.body.scrollHeight))  frameElem.style.height = frameElem.contentWindow.document.body.scrollHeight + 'px'; return;};searchshield.SearchEngine.prototype.getImgElement = function (element){ // return an xpl img element associated with a given element if (element == null)  return null; // go up the parent tree looking for a header or div while ( (element.parentNode != null) &amp;&amp;    (element.tagName.charAt(0) != "H") &amp;&amp;    (element.tagName.charAt(0) != "D") &amp;&amp;   (element.tagName.charAt(0) != "T") ) {  element = element.parentNode; } // if all the way to the top, nothing if ((element.tagName == "HTML") || (element == null))  return null; // get image tags, if none we are done var imgTags = element.getElementsByTagName("IMG"); if ((imgTags == null) || (imgTags.Length &lt; 1))  return null; for (var i = 0; i &lt; imgTags.length; i++) {  if ((imgTags[i].id == null) || (imgTags[i].id.indexOf("XPLSS_") == -1))   continue;  return imgTags[i]; } // else didn't find anything return null;};searchshield.SearchEngine.prototype.setRatingsConfig = function (doc){ // get verdict configuration, need at least severity var results = searchshield.avgCallFunc(doc, 'GetRatingsConfig'); var parts = !!results ? results.split('::') : null; if (parts != null &amp;&amp; parts.length &gt;= 5) { //if set to default then get config value  if (this.showCleanVerdicts === true)   this.showCleanVerdicts  = (parseInt(parts[0]) == 1) ? true : false;     if (this.showLowRiskVerdicts === true)   this.showLowRiskVerdicts = (parseInt(parts[1]) == 1) ? true : false;    if (this.showMedRiskVerdicts === true)   this.showMedRiskVerdicts = (parseInt(parts[2]) == 1) ? true : false;     this.VeriSignSplit = (parseInt(parts[4])); }  return true;};searchshield.SearchEngine.prototype.init_inline_ratings = function (doc){ if ((doc == null) || (doc.getElementById("XPLSS_InlineFlyover")))  return; if (!searchshield.quirksMode) {  // create style for inline flyovers  var styleTag = doc.createElement("style");  styleTag.setAttribute("id","avgILFOStyle");    var headTag = doc.getElementsByTagName("head")[0];  headTag.appendChild(styleTag);  var inline_style = styleTag.styleSheet;  // stub in the base image name as the url  inline_style.addRule(".avgILFO", "background: url(linkscanner://default_inline_border_tl.png) no-repeat top left;");  inline_style.addRule(".avgILFO", "width:0px; font-size:0px; z-index:9999; visibility:hidden; position:absolute; left:-5000px;");    inline_style.addRule(".avgILFO_content", "background: url(linkscanner://default_inline_border_r.png) top right repeat-y;");  inline_style.addRule(".avgILFO_content","font-size:10px; color:black; padding:0px 10px; text-align:left; word-wrap:break-word; line-height:130%");    inline_style.addRule(".avgILFO_head", "background: url(linkscanner://default_inline_border_tr.png) no-repeat top right;");  inline_style.addRule(".avgILFO_head", "width:0px; height:5px;");  inline_style.addRule(".avgILFO_head div","height:5px;");   inline_style.addRule(".avgILFO_foot", "background: url(linkscanner://default_inline_border_bl.png) no-repeat bottom left");  inline_style.addRule(".avgILFO_foot", "height:5px;");    inline_style.addRule(".avgILFO_foot div", "background: url(linkscanner://default_inline_border_br.png) no-repeat bottom right");  inline_style.addRule(".avgILFO_foot div", "height:5px; width:0px;"); }  try {   // create the popup box  var box = doc.createElement("DIV");  if (searchshield.quirksMode)  {   box.style.visibility = "hidden";   box.style.position = "absolute";   box.style.left = "-5000px";  }  box.setAttribute("id", "XPLSS_InlineFlyover");  box.setAttribute("class", "avgILFO");  doc.body.appendChild(box);  box = null; } catch(boxErr){}};searchshield.SearchEngine.prototype.show_inline_ratings = function (doc, node, image){  var href = node.href; var anchor = node.element; if ((href == null) || (href.length &lt; 1))  return;   if (avglsinlineflyover.imageExists(anchor))  return;  // mark search result anchor so it isn't processed repeatedly anchor.setAttribute("avglschecked", "1");  // get verdict  this.display_inline(doc, anchor, href, node, false);};searchshield.SearchEngine.prototype.display_inline = function (doc, anchor, href, node, update, min_severity){ // min_severity is the lowest severity to display, so setting it to // 1 would not display safe icons  var results = searchshield.avgCallFunc(doc, 'MalsiteCheck', href); if (results == null)  return;  var parts = results.split('::');  // need at least severity if (parts == null)  return;    var nSeverity = parseInt(parts[0]);  if (!update &amp;&amp; nSeverity == searchshield.XPLCHECK_RESULT_SEV_NONE) {  var shortUrl = searchshield.FilterUrl(href, this.shortened_urls);  if (shortUrl)  { // shortened url verdicts display later   var engine = this;   anchor.attachEvent("onmouseover", function(event){avglsinlineflyover.mouseOverHandler(event, doc, engine)});   return;  } }  // severity -1 signifies sb.dat load failure if ( nSeverity == -1 )  nSeverity = searchshield.XPLCHECK_RESULT_SEV_NONE; //blacklist url var blShortUrl = false; if (nSeverity == searchshield.XPLCHECK_RESULT_SEV_BLOCK) {  var shortUrl = searchshield.FilterUrl(href, this.shortened_urls);  if (shortUrl)   blShortUrl = true; }  // need xlated cat tag and category if (parts.length &lt; 3)  return; // check the minimum to display if ((min_severity != null) &amp;&amp; (nSeverity &lt; min_severity))  return;   if (nSeverity == searchshield.XPLCHECK_RESULT_SEV_LOW &amp;&amp; !this.showLowRiskVerdicts) {  if (update)   this.avg_ls_inline_hide_verdict(anchor);    return; }  if (nSeverity == searchshield.XPLCHECK_RESULT_SEV_MED &amp;&amp; !this.showMedRiskVerdicts) {  if (update)   this.avg_ls_inline_hide_verdict(anchor);    return; } if (nSeverity == searchshield.XPLCHECK_RESULT_SEV_NONE &amp;&amp; !this.showCleanVerdicts)  {  if (update)   this.avg_ls_inline_hide_verdict(anchor);     return; } if (update)  this.update_inline_image(anchor, nSeverity, parts); else  this.add_inline_image(doc, anchor, nSeverity, parts, blShortUrl);};searchshield.SearchEngine.prototype.avg_ls_inline_hide_verdict = function (anchor){ var image = avglsinlineflyover.getImage(anchor); if (image) {  image.style.display = "none";  if (image.parentNode &amp;&amp; image.parentNode.id == "avg_ls_anch")   image.parentNode.style.display = "none"; }};searchshield.SearchEngine.prototype.update_inline_image = function (anchor, nSeverity, aRisk){ // update the image already in the page if (anchor &amp;&amp; anchor.firstChild) {  var html  = '';  var image = '';   if (aRisk != null &amp;&amp; nSeverity != null)  {   var riskCategory = aRisk[1];   var riskName  = aRisk[2];   var bgColor   = this.inline.color.background[nSeverity];   var borderColor  = this.inline.color.border[nSeverity];   image    = this.inline.image[nSeverity];   html    = avglsinlineflyover.build(riskCategory, riskName, bgColor, borderColor);  }    var imageElem = anchor.firstChild;  imageElem.src = image;    if ( html &amp;&amp; html.length &gt; 0 )  {   imageElem.setAttribute("title", "");   imageElem.attachEvent("onmouseover", function(e){avglsinlineflyover.popup(e, html, nSeverity)});   imageElem.attachEvent("onmouseout", function(e){avglsinlineflyover.hide(e)});  } }};// add the image to the pagesearchshield.SearchEngine.prototype.add_inline_image = function (doc, anchor, nSeverity, aRisk, blShortUrl){ if (anchor == null || anchor.parentNode == null)  return null; // get the proper insertion point for the image var insertNode = anchor.nextSibling; while ((insertNode   != null) &amp;&amp;    (insertNode.tagName != null) &amp;&amp;    (insertNode.tagName == "SPAN")) {  insertNode= insertNode.nextSibling; }  // see if we already have an image anchor if ((insertNode  != null) &amp;&amp;   (insertNode.id != null) &amp;&amp;   (insertNode.id == "avg_ls_anch")) {  return null; } var html  = ''; var image = this.inline.clockImage;  if (aRisk != null &amp;&amp; nSeverity != null) {  var riskCategory = aRisk[1];  var riskName  = aRisk[2];  var bgColor   = this.inline.color.background[nSeverity];  var borderColor  = this.inline.color.border[nSeverity];  image    = this.inline.image[nSeverity];  var blUrl;  if (blShortUrl)  {   var aRiskName = riskName.split(':');   var sUrl = searchshield.checkUrl(aRiskName[1]);   blUrl = {};   blUrl.riskNameLabel = aRiskName[0] + ': ';   blUrl.riskCategory = riskCategory;   blUrl.bgColor = bgColor;   blUrl.borderColor = borderColor;   blUrl.sUrl = sUrl;  }  else  {   html = avglsinlineflyover.build(riskCategory, riskName, bgColor, borderColor);  } } doc = anchor.ownerDocument; var img   = doc.createElement("img"); img.src   = image; img.setAttribute("id","avg_ls_image"); img.style.width = "12px"; img.style.height = "12px"; img.style.border = "none"; img.style.padding = "0 3px"; img.style.margin = "0";  if ((html &amp;&amp; html.length &gt; 0) || (blUrl != undefined)) {  img.setAttribute("title", "");  img.attachEvent("onmouseover", function(e){avglsinlineflyover.popup(e, html, nSeverity, blUrl)});  img.attachEvent("onmouseout", function(e){avglsinlineflyover.hide(e)}); } // create the link element  var newAnchor = doc.createElement("A"); newAnchor.setAttribute("id", "avg_ls_anch"); newAnchor.style.display = "inline-block"; newAnchor.style.background = "none repeat scroll 0 0 transparent";  newAnchor.appendChild(img); img = null; // insert the node as either a sibling or a child if (insertNode != null)  anchor.parentNode.insertBefore(newAnchor, insertNode); else  anchor.parentNode.appendChild(newAnchor);    return newAnchor;  };////////////////    SEARCH ENGINE    ///////////////////////////////    GOOGLE SEARCH ENGINE    ///////////////searchshield.GoogleSearchEngine = function(search){ searchshield.SearchEngine.call(this, search); this.onlyPrimaries = false;};searchshield.GoogleSearchEngine.prototype = new searchshield.SearchEngine();searchshield.GoogleSearchEngine.prototype.constructor = searchshield.GoogleSearchEngine;searchshield.GoogleSearchEngine.prototype.name = "google"; // the name by which the search engine is known (always lowercase)searchshield.GoogleSearchEngine.prototype.validSearch = function(href) { var uri; if (typeof(this.search) === 'undefined' || null === this.search)  uri = searchshield.parseLink(href); else  uri = this.search.uri; if(!uri || !uri.host)  return false; var hostMatch = false; var domain  = uri.host;  // re stitch the uri path and query elements to // use existing logic var path = uri.path + uri.delimiter + uri.query; // Domains valid for google searches, must start with '.' var valid_domains = new Array(".google.co", ".mozilla.co"); // For Google the host must match: // .google.com  OR // .google.co.XX where XX is a country code // .google.XX  where XX is a country code // Where any subdomain can come before the top level domain var domLen = valid_domains.length; for (var i = 0; i &lt; domLen; i++) {  var domainLen = domain.length;  var valid_domain_len = valid_domains[i].length;  var tldPos = domain.indexOf(valid_domains[i]);  if (tldPos &gt; -1)  {   if (domain.charAt(tldPos + valid_domain_len) == 'm')    hostMatch = true;   else if ((domain.charAt(tldPos + valid_domain_len) == '.') &amp;&amp; ((domainLen - tldPos) == valid_domain_len+3))    hostMatch = true;  }  else  {   // get the form .google. to check the length of   var dot_pos = valid_domains[i].indexOf(".",1);   var valid_short_name = valid_domains[i].substring(0, dot_pos+1);   tldPos = domain.indexOf(valid_short_name);   if ((tldPos &gt; -1) &amp;&amp; ((domainLen - tldPos) == valid_domain_len))    hostMatch = true;  }  if (hostMatch)  {   // replace beginning of domain with www.google since links will refer back to it   if ((i &gt; 0) &amp;&amp; (tldPos &gt; -1))   {    var last_dot = domain.indexOf(".",tldPos+1)    if (last_dot &gt; -1)     domain = "www.google" + domain.substring(last_dot);   }   break;  } } if (hostMatch) {  // using ajax engine  if ((path.indexOf("search?") == 0) ||   (path.indexOf("sponsoredlinks?") == 0) ||   (path.indexOf("webhp?") == 0) ||   (path.indexOf("webhp#") == 0) ||   (path.indexOf("#q=") == 0) ||   (path.indexOf("#hl=") == 0) ||   (path.indexOf("#sclient=") == 0))  {   return true;  } } return false;};searchshield.GoogleSearchEngine.prototype.includeLink = function(tag){ var href = ""; var outHref = false; var findStr = ""; // check for interstitials if (searchshield.DoesURLContain(tag.href, this.search.uri.host)) {  findStr = this.search.uri.host + "/interstitial?";  if (tag.className == "l" &amp;&amp; tag.href)  {   if (tag.href.indexOf(findStr) != -1)   {    findStr = "?url=";    var pos = tag.href.indexOf(findStr);    if (pos !== -1)    {     pos += 5;     outHref = tag.href.substring(pos);     if (searchshield.FilterUrl(outHref, this.filter_urls))      return false;            return outHref;    }   }  }  if (tag.className == "sla")  {   findStr = "/url?q=";   urlPos = tag.href.indexOf(findStr);   if (urlPos != -1)   {    urlPos += 7;    outHref = tag.href.substring(urlPos);    return outHref;   }  }    // if an ad id  if ((tag.id.indexOf("pa") == 0) || (tag.id.indexOf("an") == 0) ||   (tag.className == "resultLink"))  {   var urlPos = -1;    // ads now need unescaping   href = unescape(tag.href);   findStr= "/url?sa=";   if (href.indexOf(findStr) != -1)   { // first kind, locate real url    findStr= "&amp;q=http";    urlPos = href.indexOf(findStr);    if (urlPos != -1)     urlPos += 3; // puts it on the http   }   if (urlPos == -1)   {    findStr = "/pagead/iclk?sa=";    if (href.indexOf(findStr) != -1)    { // second kind, locate real url     findStr = "&amp;adurl=http";     urlPos = href.indexOf(findStr);     if (urlPos != -1)      urlPos += 7; // puts it on the http    }   }   if (urlPos == -1)   {    if (href.indexOf("/aclk?sa=") != -1)    { // third kind     urlPos = href.indexOf("&amp;q=http");     if (urlPos != -1)      urlPos += 3; // puts it on the http     else     {      urlPos  = href.indexOf("&amp;lp=http");      if (urlPos != -1)       urlPos += 4;      else      {       findStr = "&amp;adurl=http";       urlPos = href.indexOf(findStr);       if (urlPos != -1)        urlPos += 7; // puts it on the http      }           }    }   }   if (urlPos == -1)   {    if (href.indexOf("/url?cad=") != -1)    { // fourth kind     urlPos = href.indexOf("&amp;q=http");     if (urlPos != -1)      urlPos += 3; // puts it on the http    }   }   if (urlPos != -1)   {    outHref = href.substring(urlPos);    // extract any fragment text, shouldn't be unescaped    var pound = outHref.indexOf("#");     if (pound != -1)    {     var fragment = outHref.substring(pound);     outHref = outHref.substring(0, pound);     outHref = unescape(outHref);     outHref += fragment;     if (searchshield.FilterUrl(outHref, this.filter_urls))      return false;     return outHref;    }    outHref = unescape(outHref);    if (outHref.indexOf("?") == -1)    {     var ampPos = outHref.indexOf("&amp;");     if (ampPos != -1)      outHref = outHref.substring(0, ampPos);    }        if (searchshield.FilterUrl(outHref, this.filter_urls))     return false;    return outHref;   }  }  // recommended link - use following to see one  // http://www.google.cz/search?hl=cs&amp;q=warey&amp;btnG=Hledat&amp;lr=lang_cs  // elem parent class = r  // href must contain - url? and q=http  var parentNode = tag.parentNode;  if (parentNode &amp;&amp; (parentNode.className.toLowerCase() == "r"))  {   href = tag.href;   if (href &amp;&amp; (href.indexOf("/url?") != -1))   {    // locate the real url    var urlPos = href.indexOf("q=http");    if (urlPos != -1)    {     urlPos += 2;     outHref = href.substring(urlPos);     // include entire param up to '&amp;'     var ampPos = outHref.indexOf("&amp;");     if (ampPos != -1)      outHref = outHref.substring(0, ampPos);     return outHref;    }   }  } } // no link to self else if (tag.className &amp;&amp; (tag.className.charAt(0) == "l" || tag.className == "sla")) {  // check for any images on the link  if (0 === tag.getElementsByTagName("IMG").length)   return tag.href; } // else nothing return false;};///////////////    GOOGLE    //////////////////////////////    AVG GOOGLE SEARCH ENGINE    ///////////////searchshield.AVGGoogleSearchEngine = function(search){ searchshield.SearchEngine.call(this, search); this.onlyPrimaries = false;};searchshield.AVGGoogleSearchEngine.prototype = new searchshield.SearchEngine();searchshield.AVGGoogleSearchEngine.prototype.constructor = searchshield.AVGGoogleSearchEngine;searchshield.AVGGoogleSearchEngine.prototype.name = "avggoogle"; // the name by which the search engine is known (always lowercase)searchshield.AVGGoogleSearchEngine.prototype.validSearch = function(href) { var uri; if (typeof(this.search) === 'undefined' || null === this.search)  uri = searchshield.parseLink(href); else  uri = this.search.uri; if(!uri || !uri.host)  return false; var domain  = uri.host;  // re stitch the uri path and query elements to // use existing logic var path = uri.path + uri.delimiter + uri.query; if  (domain.indexOf("search.avg.com") &gt; -1) {   // ads link back to google  return true; }  return false;};searchshield.AVGGoogleSearchEngine.prototype.includeLink = function(tag){ var outHref = false; var findStr = ""; // check for interstitials if (searchshield.DoesURLContain(tag.href, "google.com")) {  // link back to self - DIV elem GrandParent class of res1 or res3 is Sponsored Link   var parentNode = tag.parentNode;  if (parentNode)  {   var grandParentNode = tag.parentNode.parentNode;   if (grandParentNode)   {    if ((grandParentNode.tagName == "DIV") &amp;&amp;      ((grandParentNode.className.toLowerCase() == "res1") ||     (grandParentNode.className.toLowerCase() == "res3")))    {     var urlPos = -1;      // ads now need unescaping     href = unescape(tag.href);     if (urlPos == -1)     {      if (href.indexOf("/aclk?sa=") != -1)      {        findStr = "&amp;adurl=http";       urlPos = href.indexOf(findStr);       if (urlPos != -1)        urlPos += 7; // puts it on the http              }     }     if (urlPos != -1)     {      outHref = href.substring(urlPos);      // extract any fragment text, shouldn't be unescaped      var pound = outHref.indexOf("#");       if (pound != -1)      {       var fragment = outHref.substring(pound);       outHref = outHref.substring(0, pound);       outHref = unescape(outHref);       outHref += fragment;       if (searchshield.FilterUrl(outHref, this.filter_urls))        return false;       return outHref;      }      outHref = unescape(outHref);      if (outHref.indexOf("?") == -1)      {       var ampPos = outHref.indexOf("&amp;");       if (ampPos != -1)        outHref = outHref.substring(0, ampPos);      }          if (searchshield.FilterUrl(outHref, this.filter_urls))       return false;      return outHref;     }    }   }  } }    // no link to self else {  var parentNode = tag.parentNode;  if (parentNode)  {   var grandParentNode = tag.parentNode.parentNode;   if (grandParentNode)   {    if ((grandParentNode.tagName == "DIV") &amp;&amp;      (grandParentNode.className.toLowerCase() == "res2"))    {     // check for any images on the link     if (0 === tag.getElementsByTagName("IMG").length)      return tag.href;    }   }  } } // else nothing return false;}///////////////    AVG GOOGLE    //////////////////////////////    YAHOO SEARCH ENGINE    ///////////////searchshield.YahooSearchEngine = function(search){ searchshield.SearchEngine.call(this, search); this.showCleanVerdicts = false;};searchshield.YahooSearchEngine.prototype = new searchshield.SearchEngine();searchshield.YahooSearchEngine.prototype.constructor = searchshield.YahooSearchEngine;searchshield.YahooSearchEngine.prototype.name = "yahoo";searchshield.YahooSearchEngine.prototype.validSearch = function(href){ var uri; if (typeof(this.search) === 'undefined' || null === this.search)  uri = searchshield.parseLink(href); else  uri = this.search.uri; if(!uri || !uri.host)  return false; var domain = uri.host; // re stitch the uri path and query elements to // use existing logic var path = uri.path + uri.delimiter + uri.query; // For Yahoo the host must match: // search.yahoo.com  OR // xx.search.yahoo.com where xx is the country code OR // search.yahoo.co.jp OR // for Yahoo China: one.cn.yahoo.com, search.cn.yahoo.com or www.yahoo.cn if ((domain.match(/search\.yahoo\.co(?:m|\.jp)/i) ||  domain.match(/(?:search|one)\.cn\.yahoo\.com/i) ||  domain.match(/www\.yahoo\.cn/i)) &amp;&amp;   path.match(/^(?:search[;?]|s\?)/i)) {  return true; } return false;};searchshield.YahooSearchEngine.prototype.includeLink = function(tag){ var href  = ""; var outHref  = ""; var findStr  = ""; // yahoo likes to encode the url href = unescape(tag.href); if ((tag.className.indexOf("yschttl") != -1) ||   (tag.className.indexOf("spt") != -1)) {  var da = href.indexOf("**");  var ad = href.indexOf("*-");  if (da != -1)   outHref = href.substring(da+2);  else if (ad != -1)   outHref = href.substring(ad+2);  else   outHref = href ;     if (outHref.toLowerCase().indexOf("overture.") !== -1)   return false; } else if ((tag.tagName)   &amp;&amp;     (tag.tagName === "A")  &amp;&amp;     (!tag.className)) {  var tagParent = tag.parentNode;    // if anchor without className then search parentNodes  if ((tagParent) &amp;&amp;   (tagParent.tagName !== "EM") &amp;&amp;   (searchshield.getParentNodeByClassName("yst-web", tag, 4)))  {   // China Yahoo support   outHref = href;  }    else if ((tagParent) &amp;&amp;    (tagParent.tagName === "H3") &amp;&amp;    (!!searchshield.getParentNodeById("WS2m",tag, 5)))  {   // Japan Yahoo support   var da = href.indexOf("**");   if (da == -1)    outHref = href;   else    outHref = href.substring(da+2);  }  else if ((tagParent) &amp;&amp;    (tagParent.className !== "c") &amp;&amp;    (tagParent.parentNode.id !== "fpn") &amp;&amp;    (!!searchshield.getParentNodeByClassName("ymc", tag, 7)))  {   // Korea Yahoo support - when not caught by yschttl   var da = href.indexOf("**");   if (da !== -1)    outHref = href.substring(da+2);  } } else if (!this.onlyPrimaries) {  findStr = "&amp;yargs=";  var yargs = href.indexOf(findStr);  if (yargs != -1)  {   outHref = href.substring(yargs+findStr.length);   // check for prefix   if (outHref.indexOf("://") == -1)    outHref = "http://" + outHref;   // if inside an &lt;i&gt;, probably a paypal link, don't include   if (tag.parentNode &amp;&amp; (tag.parentNode.tagName == "I"))    return false;  }  } // filter domains // split the url based on '/' var parts = !!outHref ? outHref.split('/') : null; // Filter out domains that match any of the search engine's names if (!parts || !parts[2])  return false;   var domain = parts[2]; if ((domain.indexOf("rdrjp.yahoo.com") != -1) ||  (domain.indexOf("rdrkrs.yahoo.com") != -1) ||  (domain.indexOf("rdrtpe.yahoo.com") != -1) ||  (domain.indexOf("rdrird.yahoo.com") != -1) ||  (domain.indexOf("rdrhk2.yahoo.com") != -1) ||  (domain.indexOf("rdrsg1.yahoo.com") != -1) ||  (domain.indexOf("rdrin2.yahoo.com") != -1) ||  (domain.indexOf("rdre1.yahoo.com") != -1) ||  (domain.indexOf("rdrw1.yahoo.com") != -1)  ) {  return false; } // set for yahoo to get parent node for image insertion var hash = searchshield.avgCallFunc(this.doc, 'GetHash', outHref); tag.setAttribute("id", "xplid_" + hash); return outHref;};///////////////    YAHOO SEARCH ENGINE    //////////////////////////////    AVG YAHOO SEARCH ENGINE    ///////////////searchshield.AVGYahooSearchEngine = function(search){ searchshield.SearchEngine.call(this, search); this.showCleanVerdicts = false; this.omitAltImage = true; this.updateImageStyle = {  verticalAlign: null };};searchshield.AVGYahooSearchEngine.prototype = new searchshield.SearchEngine();searchshield.AVGYahooSearchEngine.prototype.constructor = searchshield.AVGYahooSearchEngine;searchshield.AVGYahooSearchEngine.prototype.name = "avgyahoo";searchshield.AVGYahooSearchEngine.prototype.validSearch = function(href){ var uri; if (typeof(this.search) === 'undefined' || null === this.search)  uri = searchshield.parseLink(href); else  uri = this.search.uri; if(!uri || !uri.host)  return false;  var domain= uri.host; //path may be 'avg/search' or 'search' var pathArray = uri.path.split("/"); var avg = pathArray[0]; // re stitch the uri path and query elements // to use existing logic var path = (undefined == pathArray[1]) ? pathArray[0] : pathArray[1];  path += uri.delimiter + uri.query; // For AVG Yahoo classic the host must match: // yhs.search.yahoo.com OR // .yhs.search.yahoo.com if (domain.indexOf("yhs.search.yahoo.co") != -1) {  if ((avg == "avg") &amp;&amp;   ((path.indexOf("search?") == 0) ||    (path.indexOf("search;") == 0)))  {   return true;  } }  // also support new metro version which DOESN'T  // contain /avg so avg split part is path // valid domains are: // search.yahoo.com,  // xx.search.yahoo.com and // search.yahoo.co.xx if (domain.indexOf("search.yahoo.co") != -1)  {  // path (split avg) must start with search and  // contain the avg toolbar parameter  if (((path.indexOf("search?") == 0) ||   (path.indexOf("search;") == 0)) &amp;&amp;   (path.indexOf("fr=yhs-avg") != -1))  {   return true;  } } return false;};searchshield.AVGYahooSearchEngine.prototype.includeLink = function(tag){ var href  = ""; var outHref  = ""; var findStr  = ""; if (this.search.doc.body.className.toLowerCase() != "standard") { // handle as std Yahoo results page  return searchshield.YahooSearchEngine.prototype.includeLink(tag); }  // yahoo likes to encode the url href = unescape(tag.href); if (tag.target == "_top") {  var da = href.indexOf("**");  if (da != -1)   outHref = href.substring(da+2);  else   outHref = href ;  if (outHref.toLowerCase().indexOf("overture.") !== -1)   return false; } else if (!this.onlyPrimaries) {  findStr = "&amp;yargs=";  var yargs = href.indexOf(findStr);  if (yargs != -1)  {   outHref = href.substring(yargs+findStr.length);   // check for prefix   if (outHref.indexOf("://") == -1)    outHref = "http://" + outHref;   // if inside an &lt;i&gt;, probably a paypal link, don't include   if (tag.parentNode &amp;&amp; (tag.parentNode.tagName == "I"))    return false;  }  } // filter domains // split the url based on '/' var parts = outHref.split('/'); // Filter out domains that match any of the search engine's names if (!parts[2])  return false;   var domain = parts[2]; if ((domain.indexOf("rdrjp.yahoo.com") != -1) ||  (domain.indexOf("rdrkrs.yahoo.com") != -1) ||  (domain.indexOf("rdrtpe.yahoo.com") != -1) ||  (domain.indexOf("rdrird.yahoo.com") != -1) ||  (domain.indexOf("rdrhk2.yahoo.com") != -1) ||  (domain.indexOf("rdrsg1.yahoo.com") != -1) ||  (domain.indexOf("rdrin2.yahoo.com") != -1) ||  (domain.indexOf("rdre1.yahoo.com") != -1) ||  (domain.indexOf("rdrw1.yahoo.com") != -1)  ) {  return false; } return outHref;};///////////////    AVG YAHOO SEARCH ENGINE    //////////////////////////////    MSN SEARCH ENGINE    ///////////////searchshield.MSNSearchEngine = function(search){ searchshield.SearchEngine.call(this, search); this.onlyPrimaries = false;};searchshield.MSNSearchEngine.prototype = new searchshield.SearchEngine();searchshield.MSNSearchEngine.prototype.constructor = searchshield.MSNSearchEngine;searchshield.MSNSearchEngine.prototype.name = "msn";searchshield.MSNSearchEngine.prototype.validSearch = function(href){ var uri; if (typeof(this.search) === 'undefined' || null === this.search)  uri = searchshield.parseLink(href); else  uri = this.search.uri; if(!uri || !uri.host)  return false; var hostMatch = false; var domain  = uri.host; // re stitch the uri path and query elements to // use existing logic var path = uri.path + uri.delimiter + uri.query; // For MSN the host must match: // search.msn.com  OR // search.live.com if (domain.indexOf("search.msn.co") &gt; -1) {  if (domain.charAt(13) == 'm')   hostMatch = true;  else if ((domain.charAt(13) == '.') &amp;&amp; (domain.length == 16))   hostMatch = true; } else if (domain.indexOf("search.live.co") &gt; -1) {  if (domain.charAt(14) == 'm')   hostMatch = true;  else if ((domain.charAt(14) == '.') &amp;&amp; (domain.length == 17))   hostMatch = true; }  if (hostMatch) {  if (path.indexOf("results.aspx") == 0)   return true; } return false;};searchshield.MSNSearchEngine.prototype.includeLink = function(tag){ var outHref = false;  // these don't seem common from Firefox, but they are in IE if (searchshield.DoesURLContain(tag.href, "g.msn.co")) {  var qPos = tag.href.indexOf("?");  if (qPos != -1)  {   var postPart = tag.href.substring(qPos+1);   var dblAmp = postPart.indexOf("&amp;&amp;");   if (dblAmp != -1)   {    outHref = postPart.substring(0, dblAmp);    return outHref;   }  } } else if (searchshield.DoesURLContain(tag.href, "r.msn.co")) {  var element = tag;  var parentNode = tag.parentNode;  // top links - check for a CITE  var spanElements = element.getElementsByTagName("CITE");  if ((spanElements != null)    &amp;&amp;    (spanElements.length &gt; 0))  {   outHref = spanElements[0].innerHTML;   // replace any nbsp's   outHref = outHref.replace("&amp;nbsp;", " ");   // url is after the last space in the html, after the '-'   var space_pos = outHref.lastIndexOf(" ");   if (space_pos != -1)    outHref = outHref.slice(space_pos + 1);   outHref = searchshield.checkUrl(outHref);   return outHref;  }    // side links   if (element.lastChild != null)  {   outHref = element.lastChild.innerHTML;   if ( outHref != null)   {    outHref = searchshield.checkUrl(outHref);    return outHref;   }  } } else if (searchshield.DoesURLContain(tag.href, this.search.uri.host)     ||    searchshield.DoesURLContain(tag.href, ".live.com")     ||    searchshield.DoesURLContain(tag.href, "msn.")      ||    searchshield.DoesURLContain(tag.href, "msnscache.com")    ||    searchshield.DoesURLContain(tag.href, "advertising.microsoft.co") ||    searchshield.DoesURLContain(tag.href, "javascript:")    ||    searchshield.DoesURLContain(tag.href, "go.microsoft.co")   ||    searchshield.DoesURLContain(tag.href, "hotmail.co")) {  // not a link  return false; } else if (tag.id.toLowerCase() == "trademarks") {  // don't link the trademark at the bottom of the page  return false; } else {  // include it  return tag.href; }};///////////////    MSN SEARCH ENGINE    //////////////////////////////    BING SEARCH ENGINE    ///////////////searchshield.BingSearchEngine = function(search){ searchshield.SearchEngine.call(this, search);};searchshield.BingSearchEngine.prototype = new searchshield.SearchEngine();searchshield.BingSearchEngine.prototype.constructor = searchshield.BingSearchEngine;searchshield.BingSearchEngine.prototype.name = "bing";searchshield.BingSearchEngine.prototype.validSearch = function(href){ var uri; if (typeof(this.search) === 'undefined' || null === this.search)  uri = searchshield.parseLink(href); else  uri = this.search.uri; if(!uri || !uri.host)  return false; var hostMatch = false; var domain  = uri.host; // re stitch the uri path and query elements to // use existing logic var path = uri.path + uri.delimiter + uri.query;  // For bing the host must match: // www.bing.com or www.bing.net // xx.bing.com or xx.bing.net where xx is a country code // bing.com.xx where xx is a country code // bing.search.xxxx.net where xxxx may be something like daum if ((domain.indexOf("www.bing.com") !== -1) ||  (domain.indexOf("www.bing.net") !== -1) ||  (domain.indexOf("bing.net") !== -1)) {  hostMatch = true; } else if ((domain.indexOf("bing.search.") !== -1) &amp;&amp;     (domain.indexOf(".net") === (domain.length-4)))  { //bing.search.xxxx.net  hostMatch = true; } else { // xx.bing.com or bing.com.xx  var domainLen = domain.length;  var tldPos = domain.indexOf(".bing.com");  if (tldPos &gt; -1)  {   if ((domainLen - tldPos) == 9)    hostMatch = true;  }  }  if (hostMatch) {  var displayStyle = (domain == 'bing.search.daum.net') ? 'inline-block' : 'inline';  this.addAnchorStyle = {   display: displayStyle  };    if (path.indexOf("search?") == 0)   return true; } return false;};searchshield.BingSearchEngine.prototype.includeLink = function(tag){ var outHref = false; if (tag.tagName == 'IMG') { //no images   return false; }   if (tag.href.charAt(0) == '/') { //no relative links  return false; } if (/trademarks/i.test(tag.id)) {  // don't link the trademark at the bottom of the page  return false; }  if ((tag.parentNode) &amp;&amp; (/sc_stc/i.test(tag.parentNode.id))) { // don't verdict the social sites - our verdict doesn't fit  return false; } else if (!!searchshield.getParentNodeByClassName("sw_t",tag,3)) { // no links in page header  return false; } else if (searchshield.DoesURLContain(tag.href, "r.msn.co") ||    searchshield.DoesURLContain(tag.href, "overture.com")) { // france has r.msn.co and italy has overture.com sponsored links  // with the link in CITE element    var spanElements = null;    // top links - check for a CITE  spanElements = tag.getElementsByTagName("CITE");  if ((spanElements == null) || (spanElements.length &lt;= 0))  {   if (tag.parentNode &amp;&amp; tag.parentNode.parentNode)    spanElements = tag.parentNode.parentNode.getElementsByTagName("CITE");  }    if ((spanElements != null) &amp;&amp; (spanElements.length &gt; 0))  {   outHref = spanElements[0].innerHTML;   if (outHref != null)   {    // replace any nbsp's    outHref = outHref.replace("&amp;nbsp;", " ");    // url is after the last space in the html, after the '-'    var space_pos = outHref.lastIndexOf(" ");    if (space_pos != -1)     outHref = outHref.slice(space_pos + 1);    outHref = searchshield.checkUrl(outHref);    // save the link    return outHref;   }  }    // side links   if (tag.lastChild != null)  {   outHref = tag.lastChild.innerHTML;   if (outHref != null)   {    outHref = searchshield.checkUrl(outHref);    // save the link    return outHref;   }  } } // no sponsored links for now  else if (searchshield.DoesURLContain(tag.href, this.search.uri.host) ||   searchshield.DoesURLContain(tag.href, ".live.com")    ||   searchshield.DoesURLContain(tag.href, ".bing.com")    ||   searchshield.DoesURLContain(tag.href, ".bing.net")    ||   searchshield.DoesURLContain(tag.href, ".daum.net")    ||   searchshield.DoesURLContain(tag.href, ".gmarket.co")   ||   searchshield.DoesURLContain(tag.href, ".multimap.com")   ||   searchshield.DoesURLContain(tag.href, "msn.")     ||   searchshield.DoesURLContain(tag.href, "ms.ciao.")    ||   searchshield.DoesURLContain(tag.href, "ms.ciao-")    ||   searchshield.DoesURLContain(tag.href, "advertising.microsoft.co") ||   searchshield.DoesURLContain(tag.href, "javascript:")    ||   searchshield.DoesURLContain(tag.href, "go.microsoft.co")   ||   searchshield.DoesURLContain(tag.href, "hotmail.co")     ||   searchshield.DoesURLContain(tag.href, "cc.bingj.com")    ||   searchshield.DoesURLContain(tag.href, "microsofttranslator.com") ||   searchshield.DoesURLContain(tag.href, ".engkoo.com")    ||   searchshield.DoesURLContain(tag.href, "sealinfo.verisign.com")  ||   searchshield.DoesURLContain(tag.href, "explabs.com")    ||   searchshield.DoesURLContain(tag.href, "onlinehelp.microsoft.com") ||   searchshield.DoesURLContain(tag.href, ".myoverture")) {  // not a link  return false; } else  return tag.href;};searchshield.BingSearchEngine.prototype.addImage = function(node, image, hidden){ var element = node.element; var parentNode  = node.element.parentNode; var grandParentNode = !!parentNode ? parentNode.parentNode : null; // if there are redundant links in the same grandparent then skip them if (!!grandParentNode) {  gpChildren = grandParentNode.childNodes;  for (var i=0; i &lt; gpChildren.length; i++)  {   if (!!element.href &amp;&amp; gpChildren[i].tagName == "A" &amp;&amp; gpChildren[i].href == element.href)    return;  } } var parent = searchshield.SearchEngine.prototype.addImage; return parent.call(this, node, image, hidden);};///////////////    BING SEARCH ENGINE    //////////////////////////////    BAIDU SEARCH ENGINE    ///////////////searchshield.BaiduSearchEngine = function(search){ searchshield.SearchEngine.call(this, search); this.updateImageStyle = {  verticalAlign: null };};searchshield.BaiduSearchEngine.prototype = new searchshield.SearchEngine();searchshield.BaiduSearchEngine.prototype.constructor = searchshield.BaiduSearchEngine;searchshield.BaiduSearchEngine.prototype.name = "baidu";searchshield.BaiduSearchEngine.prototype.validSearch = function(href){ var uri; if (typeof(this.search) === 'undefined' || null === this.search)  uri = searchshield.parseLink(href); else  uri = this.search.uri; if(!uri || !uri.host)  return false; var hostMatch = false; var domain  = uri.host; // re stitch the uri path and query elements to // use existing logic var path = uri.path + uri.delimiter + uri.query;  if (domain == "www.baidu.com" || path.indexOf("testBaidu") !== -1)  hostMatch = true;   if (hostMatch) {  if (path.indexOf("s?") == 0)   return true; } return false;};searchshield.BaiduSearchEngine.prototype.includeLink = function(tag){    if (tag.className &amp;&amp; tag.className == "m")   return false;  if (searchshield.DoesURLContain(tag.href, this.search.uri.host))   return false;  else   {   // no link to self   var traverseElement = tag.parentNode;   while ( traverseElement &amp;&amp; traverseElement.className != "tbody")   {    if (traverseElement.className == "f")     return tag.href;    traverseElement = traverseElement.parentNode;   }      return false;  }};///////////////    BAIDU SEARCH ENGINE    //////////////////////////////    EARTHLINK SEARCH ENGINE    ///////////////searchshield.EarthlinkSearchEngine = function(search){ searchshield.SearchEngine.call(this, search); this.onlyPrimaries = false; this.addAnchorStyle = {  position: "static" };};searchshield.EarthlinkSearchEngine.prototype = new searchshield.SearchEngine();searchshield.EarthlinkSearchEngine.prototype.constructor = searchshield.EarthlinkSearchEngine;searchshield.EarthlinkSearchEngine.prototype.name = "earthlink";searchshield.EarthlinkSearchEngine.prototype.validSearch = function(href){ var uri; if (typeof(this.search) === 'undefined' || null === this.search)  uri = searchshield.parseLink(href); else  uri = this.search.uri; if(!uri || !uri.host)  return false; var hostMatch = false; var domain  = uri.host; // re stitch the uri path and query elements to // use existing logic var path = uri.path + uri.delimiter + uri.query; // For EarthLink the host must match: // search.earthlink.net if (("search.earthlink.net" == domain) &amp;&amp;  (path.indexOf("search?") == 0)) {  return true; } return false;};searchshield.EarthlinkSearchEngine.prototype.includeLink = function(tag){ var outHref = ""; var findStr = ""; // check for an anchor if (tag.tagName == "A") {  // check for sponsored  if (tag.id.indexOf("a") == 0)  {   var q = tag.href.indexOf("&amp;q=");   var qlen = 3;   if (q == -1)   {    q = tag.href.indexOf("&amp;adurl=");    qlen = 7;    if (q == -1)     return false;   }   // find end of url   var end = tag.href.indexOf("&amp;", q+qlen);   if (end &lt; 0)    end = tag.href.length;   // add the link   outHref = tag.href.substring(q+qlen, end);      if (searchshield.FilterUrl(outHref, this.filter_urls))    return false;       return outHref;  }  // don't search url's to self  if ((tag.href.indexOf("://") == -1) || searchshield.DoesURLContain(tag.href, this.search.uri.host))   return false;  // if a normal web result add it  if (tag.parentNode &amp;&amp; (tag.parentNode.tagName == "H3") &amp;&amp;   tag.parentNode.parentNode &amp;&amp; (tag.parentNode.parentNode.tagName == "LI") &amp;&amp;   tag.parentNode.parentNode.parentNode &amp;&amp; (tag.parentNode.parentNode.parentNode.tagName == "UL"))  {   if (searchshield.FilterUrl(tag.href, this.filter_urls))    return false;       return tag.href;  } }  return false;};///////////////    EARTHLINK SEARCH ENGINE    //////////////////////////////    AOL SEARCH ENGINE    ///////////////searchshield.AOLSearchEngine = function(search){ searchshield.SearchEngine.call(this, search);  this.addImageStyle = {  display: "inline" }; this.addAnchorStyle = {  display: null }; this.updateImageStyle = {  verticalAlign: null,  display: "inline" };};searchshield.AOLSearchEngine.prototype = new searchshield.SearchEngine();searchshield.AOLSearchEngine.prototype.constructor = searchshield.AOLSearchEngine;searchshield.AOLSearchEngine.prototype.name = "aol";searchshield.AOLSearchEngine.prototype.validSearch = function(href){ var uri; if (typeof(this.search) === 'undefined' || null === this.search)  uri = searchshield.parseLink(href); else  uri = this.search.uri; if(!uri || !uri.host)  return false;  var domain = uri.host; //path may be 'aol/search' or 'search' var pathArray = uri.path.split("/"); var aol = pathArray[0]; // re stitch the uri path and query elements // to use existing logic var path = (undefined == pathArray[1]) ? pathArray[0] : pathArray[1];  path += uri.delimiter + uri.query; if ("search.aol.com" == domain) {  if ((aol == "aol") &amp;&amp;   (path.indexOf("search?") == 0))  {   return true;  } }  return false;};searchshield.AOLSearchEngine.prototype.includeLink = function(tag){ if (searchshield.DoesURLContain(tag.href, this.search.uri.host))  return false;  // sponsored links - google if ((tag.className) &amp;&amp; (tag.className.indexOf("slLink topAnchor") != -1)) { //parse for embedded href  if (tag.href.indexOf("/aclk?sa=") == -1)   return false;  var adurl = tag.href.indexOf("&amp;adurl=http");  if (adurl != -1)  {   var urlPos = adurl+7; // puts it on the http   var outHref = tag.href.substring(urlPos);   // extract any fragment text, do not unescape   var pound = outHref.indexOf("#");    if (pound != -1)   {    var fragment = outHref.substring(pound);    outHref = outHref.substring(0, pound);    outHref = unescape(outHref);    outHref += fragment;    if (searchshield.FilterUrl(outHref, this.filter_urls))     return false;    return outHref;   }   outHref = unescape(outHref);   if (outHref.indexOf("?") == -1)   {    var ampPos = outHref.indexOf("&amp;");    if (ampPos != -1)     outHref = outHref.substring(0, ampPos);   }       if (searchshield.FilterUrl(outHref, this.filter_urls))    return false;   return outHref;  }  return false; } if (tag.className == "find")  return tag.href;   return false;};searchshield.AOLSearchEngine.prototype.insertNodes = function(node, doc){ var element = node.element; var score = node.score; if (element &amp;&amp; element.className &amp;&amp; element.className.indexOf("slLink") != -1) { //sponsored links only  // for alt image  if (score == searchshield.SCORE_SS_VERISIGN)   return [element.nextSibling, element.parentNode];  // for verdict image  var cN = element.childNodes;  var cnLen = cN.length;  for (var i=0; i &lt; cnLen; i++)  {   if ((cN[i].nodeType == 1) &amp;&amp;     (cN[i].nodeName == 'SPAN') &amp;&amp;     ((cN[i].className == 'title') || (cN[i].className == 'durl')))    return [cN[i].nextSibling, cN[i].parentNode];  } } var parent = searchshield.SearchEngine.prototype.insertNodes; return parent.call(this, node, doc);};///////////////    AOL SEARCH ENGINE    //////////////////////////////    ASK SEARCH ENGINE    ///////////////searchshield.AskSearchEngine = function(search){ searchshield.SearchEngine.call(this, search);};searchshield.AskSearchEngine.prototype = new searchshield.SearchEngine();searchshield.AskSearchEngine.prototype.constructor = searchshield.AskSearchEngine;searchshield.AskSearchEngine.prototype.name = "ask";searchshield.AskSearchEngine.prototype.validSearch = function(href){ var uri; if (typeof(this.search) === 'undefined' || null === this.search)  uri = searchshield.parseLink(href); else  uri = this.search.uri; if(!uri || !uri.host)  return false;  var domain= uri.host; // re stitch the uri path and query elements // to use existing logic var path = uri.path + uri.delimiter + uri.query;  if ("www.ask.com" == domain) {  if (path.indexOf("web?") == 0)   return true; } return false;};searchshield.AskSearchEngine.prototype.includeLink = function(tag){ var outHref = ""; var findStr = ""; if (searchshield.DoesURLContain(tag.href, this.search.uri.host))  return false;  if ((tag.className) &amp;&amp; (tag.className.indexOf("nu") != -1) &amp;&amp; (tag.className.indexOf("info") == -1))  {  // exclude green links  if ((tag.firstChild) &amp;&amp;   (tag.firstChild.className) &amp;&amp;   (tag.firstChild.className.indexOf('attrib') == 0))  {   return false;  }  // ads link to google with class nu  findStr = "www.google.com";  if (tag.href.indexOf(findStr) != 0)  {   if (tag.href.indexOf(findStr + "/aclk?sa=") != -1)   {     findStr = "&amp;adurl=http";    var pos = tag.href.indexOf(findStr);    if (pos != -1)    {     pos += 7;     outHref = tag.href.substring(pos);     outHref = unescape(outHref);     if (searchshield.FilterUrl(outHref, this.filter_urls))       return false;     return outHref;    }   }  }  else  { // ad not to google just use href   outHref = tag.href;   if (searchshield.FilterUrl(outHref, this.filter_urls))    return false;   return outHref;  } } // primary results have class containing title or L2 ( Wikipedia links ) else if ((tag.className) &amp;&amp; ((tag.className.indexOf("title") != -1) || (tag.className.toLowerCase() == "l2"))) {  outHref = tag.href;  if (searchshield.FilterUrl(outHref, this.filter_urls))   return false;  return outHref; }  return false;};///////////////    ASK SEARCH ENGINE    //////////////////////////////    ALTAVISTA SEARCH ENGINE    ///////////////searchshield.AltaVistaSearchEngine = function(search){ searchshield.SearchEngine.call(this, search);};searchshield.AltaVistaSearchEngine.prototype = new searchshield.SearchEngine();searchshield.AltaVistaSearchEngine.prototype.constructor = searchshield.AltaVistaSearchEngine;searchshield.AltaVistaSearchEngine.prototype.name = "altavista";searchshield.AltaVistaSearchEngine.prototype.validSearch = function(href){ var uri; if (typeof(this.search) === 'undefined' || null === this.search)  uri = searchshield.parseLink(href); else  uri = this.search.uri; if(!uri || !uri.host)  return false;  var domain= uri.host;  // re stitch the uri path and query elements // to use existing logic var path = uri.path + uri.delimiter + uri.query; // www.atlavista.com ---&gt; now http://us.yhs4.search.yahoo.com/yhs/search?fr=altavista&amp;fr=altavista&amp;itag=ody&amp;q=warez&amp;kgs=1&amp;kls=0 // xx.altavista.com where xx is a country code var hostMatch = false; if ("www.altavista.com" == domain) {  hostMatch = true; } else {  // xx.altavista.com  var pDest = domain.indexOf(".altavista.com");  if ((pDest != -1 ) &amp;&amp; ((domain.length - pDest) == 14))  {   hostMatch = true;  }  else  {   // a reference to altavista must be present in yahoo search url   var pRef = (uri.qsArray.fr &amp;&amp; uri.qsArray.fr == 'altavista');   pDest = domain.indexOf("search.yahoo.com");   if (pDest != -1 &amp;&amp; pRef)    hostMatch = true;  } } if (hostMatch) {  //path must start with web/results?  if ((path.indexOf("yhs/search?") == 0) ||   (path.indexOf("search;") == 0)  ||   (path.indexOf("yhs/search;") == 0) ||   (path.indexOf("web/results?") == 0)||   (path.indexOf("fr=altavista") != -1))  {   return true;  } }  return false;};searchshield.AltaVistaSearchEngine.prototype.includeLink = function(tag){ var outHref = ""; var findStr = ""; // initial checks if ((!tag.href) ||   (tag.href.charAt(0) == '#') ||  (tag.href.indexOf("javascript:") == 0)) {  return false; }   if (searchshield.DoesURLContain(tag.href, this.search.uri.host))  return false;  var spnsdLinks = searchshield.getParentNodeByTagName("DIV", tag, "className"); if ((spnsdLinks) &amp;&amp;  (spnsdLinks.className.indexOf('ads') &gt; -1)) // sponsored links {  if (!tag.parentNode)   return false;  // parse ads for em tag  var baseNode;  if (spnsdLinks.className.indexOf('ads horiz') &gt; -1) // horizontal ads sections   baseNode = tag.parentNode.parentNode;  else   baseNode = tag.parentNode;    if (!baseNode || !baseNode.lastChild || baseNode.lastChild.tagName != 'EM')   return false;  var outHref = searchshield.removeHtmlTags(baseNode.lastChild.innerHTML);  return outHref; }  if ((tag.className == "spt") ||   (tag.className == "res") ||  (tag.className == "yschttl spt")) {  findStr = "/**";  var pos = tag.href.indexOf(findStr);  if (pos != -1)  {   pos += 3;   outHref = tag.href.substring(pos);   outHref = unescape(outHref);      // no results for overture.com &amp; no yahoo domains   chkHref = outHref.toLowerCase();   if (chkHref.indexOf("overture.") != -1)    return false;   // split the url based on '/'   var parts = outHref.split('/');   // only need a domain   if ((parts != null) &amp;&amp; (parts[2] != null))   {    var domain = parts[2];    if ((domain.indexOf("rdrjp.yahoo.com") != -1) ||     (domain.indexOf("rdrkrs.yahoo.com") != -1) ||     (domain.indexOf("rdrtpe.yahoo.com") != -1) ||     (domain.indexOf("rdrird.yahoo.com") != -1) ||     (domain.indexOf("rdrhk2.yahoo.com") != -1) ||     (domain.indexOf("rdrsg1.yahoo.com") != -1) ||     (domain.indexOf("rdrin2.yahoo.com") != -1) ||     (domain.indexOf("rdre1.yahoo.com") != -1) ||     (domain.indexOf("rdrw1.yahoo.com") != -1)  )    {     return false    }   }   return outHref;  }  else  {   return tag.href;  } }  return false;};searchshield.AltaVistaSearchEngine.prototype.getImgElement = function (element){ while (element != null)  {  element = element.nextSibling;  if (element != null)  {   if ((element.id == null) || (element.id.indexOf("LXPLSS_") == -1))   {   // not our id but hit another anchor no verdict    if (element.tagName == "A")    {     element = null;     break;    }   }   else if (element.tagName == "A")    break;  } }   var rtnElem = !!element ? element.firstChild : element; return rtnElem;};///////////////    ALTAVISTA SEARCH ENGINE    //////////////////////////////    YANDEX SEARCH ENGINE    ///////////////searchshield.YandexSearchEngine = function(search){ searchshield.SearchEngine.call(this, search);};searchshield.YandexSearchEngine.prototype = new searchshield.SearchEngine();searchshield.YandexSearchEngine.prototype.constructor = searchshield.YandexSearchEngine;searchshield.YandexSearchEngine.prototype.name = "yandex";searchshield.YandexSearchEngine.prototype.validSearch = function(href){ var uri; if (typeof(this.search) === 'undefined' || null === this.search)  uri = searchshield.parseLink(href); else  uri = this.search.uri; if(!uri || !uri.host)  return false;  var domain= uri.host; // re stitch the uri path and query elements // to use existing logic var path = uri.path + uri.delimiter + uri.query; if ((domain.match(/yandex\.com|by|kz|ru|ua/i)) &amp;&amp;  (path.indexOf("yandsearch?") == 0)) {  return true; }  return false;};searchshield.YandexSearchEngine.prototype.includeLink = function(tag){ if (tag.href.indexOf("/search") != -1) {  return false; }  if (searchshield.DoesURLContain(tag.href, this.search.uri.host) ||  searchshield.DoesURLContain(tag.href, ".yandex.net")  ||  searchshield.DoesURLContain(tag.href, ".yandex.ru")   ||  searchshield.DoesURLContain(tag.href, "moikrug.ru")   ||  searchshield.DoesURLContain(tag.href, "ya.ru")    ||  searchshield.DoesURLContain(tag.href, ".yandex.com")  ||  searchshield.DoesURLContain(tag.href, "yandex.st")) {  return false; }   parentNode = tag.parentNode; if ((tag.parentNode)   &amp;&amp;   (tag.parentNode.parentNode) &amp;&amp;  (tag.parentNode.parentNode.className.toLowerCase() == "moreinfo")) {  return false; }  return tag.href;};searchshield.YandexSearchEngine.prototype.getImgElement = function (element){ while (element != null)  {  element = element.nextSibling;  if (element != null)  {   if ((element.id == null) || (element.id.indexOf("LXPLSS_") == -1))   {   // not our id but hit another anchor no verdict    if (element.tagName == "A")    {     element = null;     break;    }   }   else if (element.tagName == "A")    break;  } }   var rtnElem = !!element ? element.firstChild : element; return rtnElem;};///////////////    YANDEX SEARCH ENGINE    //////////////////////////////    SEZNAM SEARCH ENGINE    ///////////////searchshield.SeznamSearchEngine = function(search){ searchshield.SearchEngine.call(this, search); this.elementAttribute = {  width: "18",  height: "18" }; this.updateImageStyle = {  width: "18px",  height: "18px" };};searchshield.SeznamSearchEngine.prototype = new searchshield.SearchEngine();searchshield.SeznamSearchEngine.prototype.constructor = searchshield.SeznamSearchEngine;searchshield.SeznamSearchEngine.prototype.name = "seznam";searchshield.SeznamSearchEngine.prototype.validSearch = function(href){ var uri; if (typeof(this.search) === 'undefined' || null === this.search)  uri = searchshield.parseLink(href); else  uri = this.search.uri; if(!uri || !uri.host)  return false;  var domain= uri.host; // re stitch the uri path and query elements // to use existing logic var path = uri.path + uri.delimiter + uri.query; if ((domain.indexOf("search.seznam.cz") &gt; -1) &amp;&amp;  ((path.indexOf("?") == 0) || (path.indexOf("svet") == 0))) {  return true; }  return false;};searchshield.SeznamSearchEngine.prototype.includeLink = function(tag){ if (searchshield.DoesURLContain(tag.href, this.search.uri.host))  return false;  var parentNode = tag.parentNode; if (parentNode) {  var grandParentNode = tag.parentNode.parentNode;  if ((parentNode.tagName == "SPAN") &amp;&amp;    ((parentNode.className.toLowerCase() == "sklik-url") ||   (parentNode.className.toLowerCase() == "sklik-title")))  { // locate the real url and unencode it   var urlPos = tag.href.indexOf("&amp;url=http");   if (urlPos != -1)   {    urlPos += 5;     outHref = tag.href.substring(urlPos);    outHref = unescape(outHref);    return outHref;   }  }  else if (grandParentNode)   {   var greatGrandParentNode = tag.parentNode.parentNode.parentNode;   if ((grandParentNode.tagName == "DIV") &amp;&amp;    ((grandParentNode.className.toLowerCase() == "text") || (grandParentNode.className.toLowerCase() == "hlasky otz")))   { // standard link    return tag.href;   }   else if (greatGrandParentNode &amp;&amp; greatGrandParentNode.tagName == "DIV" &amp;&amp;     (greatGrandParentNode.className.toLowerCase() == "hotlinks"))    { // hint link    return tag.href;   }     } }  return false;};///////////////    SEZNAM SEARCH ENGINE    //////////////////////////////    WEBHLEDANI SEARCH ENGINE    ///////////////searchshield.WebhledaniSearchEngine = function(search){ searchshield.SearchEngine.call(this, search);};searchshield.WebhledaniSearchEngine.prototype = new searchshield.SearchEngine();searchshield.WebhledaniSearchEngine.prototype.constructor = searchshield.WebhledaniSearchEngine;searchshield.WebhledaniSearchEngine.prototype.name = "webhledani";searchshield.WebhledaniSearchEngine.prototype.validSearch = function(href){ var uri; if (typeof(this.search) === 'undefined' || null === this.search)  uri = searchshield.parseLink(href); else  uri = this.search.uri; if(!uri || !uri.host)  return false;  var domain= uri.host; // re stitch the uri path and query elements // to use existing logic var path = uri.path + uri.delimiter + uri.query; if ((domain.indexOf("webhledani.cz") &gt; -1) &amp;&amp;  (path.indexOf("results.aspx?") == 0)) {  return true; }  return false;};searchshield.WebhledaniSearchEngine.prototype.includeLink = function(tag){ if (tag.href.indexOf("/redir.aspx?") != -1) {  var ancestorNode;  // sponsored link  if ((ancestorNode = searchshield.getParentNodeByClassName("results sponsored", tag, 3)) != null)  {   if ((ancestorNode = searchshield.getParentNodeByClassName("res1", tag, 2)) != null)   {        var spanSibling = ancestorNode.nextSibling;    while (spanSibling.nodeName != 'SPAN')    {     spanSibling = spanSibling.nextSibling;     if (spanSibling.nodeName == 'DIV' || spanSibling.className == 'res1')     {      spanSibling = null;      break;     }    }    if (spanSibling)      outHref = spanSibling.innerHTML;   }   if (outHref)    return searchshield.checkUrl(searchshield.removeHtmlTags(outHref));   }   if ((ancestorNode = searchshield.getParentNodeByClassName("right-sponsored", tag, 3)) != null)  {   var outHref;   if ((ancestorNode = searchshield.getParentNodeByClassName("res3", tag, 2)) != null)   {        var spanSibling = ancestorNode.nextSibling;    while (spanSibling.nodeName != 'SPAN')    {     spanSibling = spanSibling.nextSibling;     if (spanSibling.nodeName == 'DIV' || spanSibling.className == 'res3')     {      spanSibling = null;      break;     }    }    if (spanSibling)      outHref = spanSibling.innerHTML;   }   if (outHref)    return searchshield.checkUrl(searchshield.removeHtmlTags(outHref));   }  // result link  if (searchshield.getParentNodeByClassName("results", tag, 3) != null)  {   if ((ancestorNode = searchshield.getParentNodeByClassName("res2", tag, 2)) != null)   {    if (tag.parentNode &amp;&amp; (tag.parentNode.nodeName != 'P'))     return getLinkHref(ancestorNode);   }  } } return false; function getLinkHref(aNode) {  var spanElems = aNode.getElementsByTagName('span');  for (var i=0; i &lt; spanElems.length; i++)  {   if (spanElems[i].className != 'site')    continue;   var outAnchor = spanElems[i].getElementsByTagName('a')[0];   if (outAnchor == null)    outAnchor = spanElems[i];   return searchshield.checkUrl(searchshield.removeHtmlTags(outAnchor.innerHTML));  }  return false; }};///////////////    WEBHLEDANI SEARCH ENGINE    //////////////////////////////    EBAY SEARCH ENGINE    ///////////////searchshield.eBaySearchEngine = function(search){ searchshield.SearchEngine.call(this, search);};searchshield.eBaySearchEngine.prototype = new searchshield.SearchEngine();searchshield.eBaySearchEngine.prototype.constructor = searchshield.eBaySearchEngine;searchshield.eBaySearchEngine.prototype.name = "ebay";searchshield.eBaySearchEngine.prototype.validSearch = function(href){ var uri; if (typeof(this.search) === 'undefined' || null === this.search)  uri = searchshield.parseLink(href); else  uri = this.search.uri; if(!uri || !uri.host)  return false;  var domain= uri.host; // shop.ebay.xx // shop.xxxx.ebay.xx like shop.benl.ebay.be // search.auction.co.kr  var path = uri.path + uri.delimiter + uri.query;  if ((domain.indexOf("shop.ebay") &gt; -1) ||  (domain.indexOf("shop.benl.ebay") &gt; -1)) {  if ((path.indexOf("?_from=") == 0) ||   (path.indexOf("i.html") &gt; -1))  {   return true;  } }  // ebay.se if ((domain.indexOf("search.eim.ebay") &gt; -1) &amp;&amp;  ((path.indexOf("?kw=") &gt; -1) || (path.indexOf("?ev=") &gt; -1))) {  return true; }  if ((domain.indexOf("search.auction.co.kr") &gt; -1 ) &amp;&amp;  ((path.indexOf("?keyword=") &gt; -1))) {  // would normally set these properties in the constructor or in an  // overriding function but they're only required for this domain     // links are in iframes  this.processFrames = true;    // must downsize verdicts for proper display  this.elementAttribute = {   width: "16",   height: "16"  };  this.updateImageStyle = {   width: "16px",   height: "16px"  };    return true; } // latin america ebay // listado.mercadolibre.com.xx or listado.mercadolibre.co.xx //   or listado.mercadolibre.xx or //   category.mercadolibre.com.xx or listado.mercadolibre.xx/category // lista.mercadolivre.com.xx or lista.mercadolivre.com.xx/category if ((domain.indexOf("www.") == -1) &amp;&amp;  ((domain.indexOf(".mercadolibre.") &gt; -1 ) ||   (domain.indexOf(".mercadolivre.") &gt; -1 )))  {  return true; } return false;};searchshield.eBaySearchEngine.prototype.includeLink = function(tag){ var parentNode = null; var outHref = false;  if (searchshield.DoesURLContain(tag.href, this.search.uri.host))  return false;  if ( tag.href.indexOf(".ebayrtm.com/clk?") &gt; -1 ) {  if ( tag.title == null || tag.title.length &lt; 0 )   return false;       outHref = searchshield.removeHtmlTags(tag.title);  if (outHref.indexOf(" ") == -1)  { // no spaces   if (outHref.indexOf(".") &gt; -1)   { // at least one dot     if (outHref.indexOf(this.search.uri.host) == -1)    { // no host     if (outHref.toLowerCase().indexOf("ebay.com") == -1)     {      return outHref;     }    }   }  }    } // ebay.se - Google ads parentNode = tag.parentNode; if (parentNode &amp;&amp; (parentNode.className.toLowerCase() == "google-ad-link")) {  if (tag.href.indexOf("/aclk?sa=") != -1)  {    findStr = "&amp;adurl=http";   var urlPos = tag.href.indexOf(findStr);   if (urlPos != -1)   {    urlPos += 7; // puts it on the http    outHref = tag.href.substring(urlPos);        // extract any fragment text, shouldn't be unescaped    var pound = outHref.indexOf("#");     if (pound != -1)    {     var fragment = outHref.substring(pound);     outHref = outHref.substring(0, pound);     outHref = unescape(outHref);     outHref += fragment;     if (searchshield.FilterUrl(outHref, this.filter_urls))      return false;     return outHref;    }    outHref = unescape(outHref);    if (outHref.indexOf("?") == -1)    {     var ampPos = outHref.indexOf("&amp;");     if (ampPos != -1)      outHref = outHref.substring(0, ampPos);    }        if (searchshield.FilterUrl(outHref, this.filter_urls))     return false;    return outHref;   }  } }  // auction.co.kr parentNode = tag.parentNode; if (parentNode &amp;&amp; (parentNode.className.toLowerCase() == "link")) {  if (tag.href.indexOf("adcr.naver.com") &gt; -1)  {   outHref = tag.innerText;   if ((outHref == null) || (outHref.length &lt; 0))    return false;       return outHref;  } }  // latin america ebay if ( tag.href.toLowerCase().indexOf("clickcounter?") &gt; -1 ) {  var spanElements = tag.getElementsByTagName("span");  if ((spanElements != null)    &amp;&amp;    (spanElements.length &gt; 0))  {   if ( spanElements[0].className.toLowerCase() == "mclics-url" )   {    outHref = spanElements[0].innerHTML;    if ( outHref == null || outHref.length &lt; 0 )     return false;    outHref = searchshield.removeHtmlTags(outHref);    if (outHref.indexOf(" ") == -1)    { // no spaces     if (outHref.indexOf(".") &gt; -1)     { // at least one dot       if ((outHref.toLowerCase().indexOf("mercadolibre") == -1) &amp;&amp;        (outHref.toLowerCase().indexOf("mercadolivre") == -1))       {       return outHref;      }     }    }   }  } }  return false;};///////////////    EBAY SEARCH ENGINE    //////////////////////////////    DIGG SEARCH ENGINE    ///////////////searchshield.DiggSearchEngine = function(search){ searchshield.SearchEngine.call(this, search); this.new_links = false;};searchshield.DiggSearchEngine.prototype = new searchshield.SearchEngine();searchshield.DiggSearchEngine.prototype.constructor = searchshield.DiggSearchEngine;searchshield.DiggSearchEngine.prototype.name = "digg";searchshield.DiggSearchEngine.prototype.validSearch = function(href){ var uri; if (typeof(this.search) === 'undefined' || null === this.search)  uri = searchshield.parseLink(href); else  uri = this.search.uri; if(!uri || !uri.host)  return false;  var domain= uri.host; // re stitch the uri path and query elements // to use existing logic var path = uri.path + uri.delimiter + uri.query;  if ((domain.indexOf("digg.com") &gt; -1) &amp;&amp;  (path.indexOf("/ad") == -1)) {  return true; }  return false;};searchshield.DiggSearchEngine.prototype.includeLink = function(tag){ var outHref = false; var findStr = "";  if ((tag.parentNode) &amp;&amp;  (tag.parentNode.className.toLowerCase() == "digg-count")) {  return false; }  if (searchshield.DoesURLContain(tag.href, this.search.uri.host)) {  if (tag.className &amp;&amp; tag.className.indexOf('source') != -1)  {   findStr = "/search?q=site:";   var urlPos = tag.href.indexOf(findStr);   if (urlPos != -1)   {    urlPos += 15;    outHref = tag.href.substring(urlPos);    return outHref;   }  } }  return false;};searchshield.DiggSearchEngine.prototype.addImage = function(node, image, hidden){ // remove style that is set when alt image is applied this.addAnchorStyle = {  background: "none" };   var parent = searchshield.SearchEngine.prototype.addImage; return parent.call(this, node, image, hidden);};///////////////    DIGG SEARCH ENGINE    //////////////////////////////    SLASHDOT SEARCH ENGINE    ///////////////searchshield.SlashdotSearchEngine = function(search){ searchshield.SearchEngine.call(this, search); this.showCleanVerdicts = false; this.new_links = false; this.type = 'inline';};searchshield.SlashdotSearchEngine.prototype = new searchshield.SearchEngine();searchshield.SlashdotSearchEngine.prototype.constructor = searchshield.SlashdotSearchEngine;searchshield.SlashdotSearchEngine.prototype.name = "slashdot";searchshield.SlashdotSearchEngine.prototype.validSearch = function(href){ var uri; if (typeof(this.search) === 'undefined' || null === this.search)  uri = searchshield.parseLink(href); else  uri = this.search.uri; if(!uri || !uri.host)  return false;  var domain= uri.host; // re stitch the uri path and query elements // to use existing logic var path = uri.path + uri.delimiter + uri.query;  if (domain.indexOf("slashdot.org") != -1) {  return true; }  return false;};searchshield.SlashdotSearchEngine.prototype.includeLink = function(tag){ if (searchshield.DoesURLContain(tag.href, this.search.uri.host))  return false;   if ( tag.href.indexOf("mailto:") != -1 )  return false;   if ( tag.href.indexOf("slashdot.org") != -1 )  return false;   if (tag.parentNode &amp;&amp; (tag.parentNode.tagName == "DIV")) {  if (tag.parentNode.id.indexOf("text-") != -1)  {   return tag.href;  } } else if ( tag.parentNode &amp;&amp; tag.parentNode.parentNode &amp;&amp; tag.parentNode.parentNode.tagName == "DIV" ) {  if ( tag.parentNode.parentNode.id.indexOf("text-") != -1 )  {   return tag.href;  } } return false;};searchshield.SlashdotSearchEngine.prototype.addImage = function(node, image, hidden){ var doc   = this.search.doc;  this.init_inline_ratings(doc); this.show_inline_ratings(doc, node, image);};///////////////    SLASHDOT SEARCH ENGINE    //////////////////////////////    TWITTER SEARCH ENGINE    ///////////////searchshield.TwitterSearchEngine = function(search){ searchshield.SearchEngine.call(this, search); this.showCleanVerdicts = false; this.new_links = false; this.type = 'inline';};searchshield.TwitterSearchEngine.prototype = new searchshield.SearchEngine();searchshield.TwitterSearchEngine.prototype.constructor = searchshield.TwitterSearchEngine;searchshield.TwitterSearchEngine.prototype.name = "twitter";searchshield.TwitterSearchEngine.prototype.twitter_filter_urls = ["twitpic.com", "twitterfeed.com", "twitter.peoplebrowsr.com"];searchshield.TwitterSearchEngine.prototype.validSearch = function(href){ var uri; if (typeof(this.search) === 'undefined' || null === this.search)  uri = searchshield.parseLink(href); else  uri = this.search.uri; if(!uri || !uri.host)  return false;  var domain= uri.host; if (domain.indexOf("twitter.com") != -1) {  return true; }  return false;};searchshield.TwitterSearchEngine.prototype.includeLink = function(tag){ if (searchshield.DoesURLContain(tag.href, this.search.uri.host))  return false;   if (tag.className.length &lt; 1)  return false;  // no verdicts on source of twit for example "from TweetDeck" if ((tag.className.indexOf("tweet-url web") == 0) &amp;&amp;  (tag.className.indexOf("url") == 0 )) {  return false; }   if (searchshield.FilterUrl(tag.href, this.twitter_filter_urls)) {  return false; }  return tag.href;};searchshield.TwitterSearchEngine.prototype.addImage = function(node, image, hidden){ var doc   = this.search.doc;   this.init_inline_ratings(doc); this.show_inline_ratings(doc, node, image);};///////////////    TWITTER SEARCH ENGINE    //////////////////////////////    GMAIL SEARCH ENGINE    ///////////////searchshield.GMailSearchEngine = function(search){ searchshield.SearchEngine.call(this, search); this.processFrames = true; this.showCleanVerdicts  = false; this.type = 'inline';};searchshield.GMailSearchEngine.prototype = new searchshield.SearchEngine();searchshield.GMailSearchEngine.prototype.constructor = searchshield.GMailSearchEngine;searchshield.GMailSearchEngine.prototype.name = "gmail"; // the name by which the search engine is known (always lowercase)searchshield.GMailSearchEngine.prototype.validSearch = function(href){ var uri; if (typeof(this.search) === 'undefined' || null === this.search)  uri = searchshield.parseLink(href); else  uri = this.search.uri; if(!uri || !uri.host)  return false; var domain  = uri.host;  // re stitch the uri path and query elements to // use existing logic var path = uri.path + uri.delimiter + uri.query; if ((domain.indexOf("mail.google.") != -1) ||   (domain.indexOf("gmail.") != -1)) {  return true; } return false;};searchshield.GMailSearchEngine.prototype.includeLink = function(tag){ if (searchshield.DoesURLContain(tag.href, this.search.uri.host))  return false; // don't mark anything but http:// if (tag.href.indexOf("mailto") == 0)  return false; var parentDiv = searchshield.getParentNodeByTagName("DIV", tag, "className"); if ((parentDiv) &amp;&amp;  ((parentDiv.className == "ii gt") || // mail message body   (parentDiv.className == "mv") || // top sponsored links   (parentDiv.className == "vb") || // right sponsored links   (parentDiv.className == "im") || // inside quotes   (parentDiv.className == "gmail_quote") || // quote   (parentDiv.className == "msg") // basic html mode   )) // right ads {  // parse for any ads  var newHref = this.parseAdUrl(tag.href);  return newHref; }  return false;};searchshield.GMailSearchEngine.prototype.addImage = function(node, image, hidden){ var doc   = this.search.doc;   this.init_inline_ratings(doc); this.show_inline_ratings(doc, node, image);};searchshield.GMailSearchEngine.prototype.parseAdUrl = function(href){ if (!href)  return href; // check for google ad var regex = "^http(s)?\:\/\/([a-zA-Z0-9]+)\.googlesyndication\.com.+\&amp;adurl\=(.+)"; var re = new RegExp(regex); var matches = href.match(re); if (matches &amp;&amp; (matches.length &gt;= 4)) {  // else we want the fourth value  var match = matches[3];  if (match &amp;&amp; (match.length &gt; 0))   return match } return href;};///////////////    GMAIL SEARCH ENGINE    //////////////////////////////    FACEBOOK SEARCH ENGINE    ///////////////searchshield.FacebookSearchEngine = function(search){ searchshield.SearchEngine.call(this, search); this.showCleanVerdicts = false; this.type = 'inline';};searchshield.FacebookSearchEngine.prototype = new searchshield.SearchEngine();searchshield.FacebookSearchEngine.prototype.constructor = searchshield.FacebookSearchEngine;searchshield.FacebookSearchEngine.prototype.name = "facebook"; // the name by which the search engine is known (always lowercase)searchshield.FacebookSearchEngine.prototype.validSearch = function(href){ var uri; if (typeof(this.search) === 'undefined' || null === this.search)  uri = searchshield.parseLink(href); else  uri = this.search.uri; if(!uri || !uri.host)  return false; if (uri.host.indexOf("www.facebook.com") != -1)   return true; return false;};searchshield.FacebookSearchEngine.prototype.includeLink = function(tag){ if (!tag.href || (tag.href.indexOf('facebook.com') &gt; -1) || (tag.href.indexOf('ak.fbcdn.net') &gt; -1))  return false;  return tag.href};searchshield.FacebookSearchEngine.prototype.addImage = function(node, image, hidden){ var doc   = this.search.doc;   this.init_inline_ratings(doc); this.show_inline_ratings(doc, node, image);};///////////////    FACEBOOK SEARCH ENGINE    //////////////////////////////    MYSPACE SEARCH ENGINE    ///////////////searchshield.MySpaceSearchEngine = function(search){ searchshield.SearchEngine.call(this, search); this.showCleanVerdicts = false; this.type = 'inline';};searchshield.MySpaceSearchEngine.prototype = new searchshield.SearchEngine();searchshield.MySpaceSearchEngine.prototype.constructor = searchshield.MySpaceSearchEngine;searchshield.MySpaceSearchEngine.prototype.name = "myspace"; // the name by which the search engine is known (always lowercase)searchshield.MySpaceSearchEngine.prototype.validSearch = function(href){ var uri; if (typeof(this.search) === 'undefined' || null === this.search)  uri = searchshield.parseLink(href); else  uri = this.search.uri; if(!uri || !uri.host)  return false; if (uri.host.indexOf("www.myspace.com") != -1)   return true; return false;};searchshield.MySpaceSearchEngine.prototype.includeLink = function(tag){ if (searchshield.DoesURLContain(tag.href, this.search.uri.host) ) {  return false; }  return tag.href};searchshield.MySpaceSearchEngine.prototype.addImage = function(node, image, hidden){ var doc   = this.search.doc;   this.init_inline_ratings(doc); this.show_inline_ratings(doc, node, image);};///////////////    MYSPACE SEARCH ENGINE    //////////////////////////////    AVG TOOLBAR REPORTING    ///////////////var avgreport = { BLOCK_SEVERITY: 3, scanResult: function (doc, url, foundUrl, ip) {  // report scan end only if surf enabled  if ('1' != searchshield.avgCallFunc(doc, 'GetSurfEnabled'))   return;    // for now native is handling the interstitial   var results = searchshield.avgCallFunc(doc, 'MalsiteCheck', url);  if ( results == null )   return;    var parts = results.split('::');    // need at least severity  if (parts == null)   return;  if (!ip)   ip = "";     // use a block severity if foundUrl is given  var severity = !!foundUrl ? avgreport.BLOCK_SEVERITY : parseInt(parts[0], 10);  var category = "";  var threat  = "";  // fill in the category and threat if something was found  if (severity &gt; 0)  {   category = parts[2];   threat  = parts[4];  }//  else//   return;    var scan_result = searchshield.avgCallFunc(doc, 'ReportScanResult', url, url, threat, category, ip, severity);  var scan_end = avgreport.scanEnd(doc, url);    return (scan_result &amp;&amp; scan_end); }, scanEnd: function (doc, url) {  return searchshield.avgCallFunc(doc, 'ReportScanEnd', url); }, GetInterstitialIP: function (interstitial) {  // simple regex to pull the IP address  var regex = /(([1-9][0-9]{0,2})|0)\.(([1-9][0-9]{0,2})|0)\.(([1-9][0-9]{0,2})|0)\.(([1-9][0-9]{0,2})|0)/;  var match = regex.exec(interstitial);  if (!match)   return '';  return match[0]; }}///////////////    AVG TOOLBAR REPORTING    //////////////////////////////    FLYOVERS    ///////////////var avglsflyover = { count: 0, poppedUp: false, poppedElement: null, reset: function () {  avglsflyover.count = 0;  avglsflyover.poppedUp = false;  avglsflyover.poppedElement = null; }, popup: function (event, hash, search, flyover) {  if (!event)   event = window.event;  var div = document.getElementById("XPLSS_Flyover");  if (div == null)   return;  // establish target element and get its containing document object  // in case verdict is inside a frame  var eventTarget = event.srcElement;  var frameDoc = eventTarget.ownerDocument;  // if the element is the clock, don't pop over it  if ((eventTarget.src != null) &amp;&amp; (eventTarget.src.indexOf("clock.gif") != -1))   return;    // save the element we popped over  avglsflyover.poppedElement = eventTarget;  // if no flyover get it  if ((flyover == null) || (flyover == ""))  {   flyover = searchshield.avgCallFunc(frameDoc, 'BuildFlyover', hash);   if (!flyover)    return;   // cleanup flyover, replace any new lines   flyover = flyover.replace(/\r/g, "");   flyover = flyover.replace(/\n/g, "");   // escape any single quotes   flyover = flyover.replace(/'/g, "&amp;#39;");  }  // set the html in the layer  div.innerHTML = flyover;  // there is an unwanted text node that causes vertical misalignment of flyover  if (div.firstChild.nodeType == 3)   div.removeChild(div.firstChild);    avglsflyover.poppedUp = true;  // reset display count  avglsflyover.count = 0;  avglsflyover.position(); }, hide: function (event) {  var frameDoc = document || top.document;  var div = frameDoc.getElementById("XPLSS_Flyover");  if ((div == null) || (div.style == null) || (div.style.visibility == "hidden"))   return;  var trans_div = frameDoc.getElementById("XPLSS_Trans");  if ((trans_div == null) || (trans_div.style == null) || (trans_div.style.visibility == "hidden"))   return;  // scroll and keydown events will pass a null event by design  // toElement will be null when mousing out of frameelement containing a verdict  if (event == null || event.toElement == null)  {   return;  }  if (trans_div.contains(event.toElement) || div.contains(event.toElement))   return;  // if the toElement is a cooresponding alt image then don't hide  // use try/catch because toElement will be null when mousing out of frame  try {   if (!!event.toElement.id &amp;&amp; !!event.srcElement.id)   {    if (event.toElement.id.indexOf(event.srcElement.id.substring(0,event.srcElement.id.length-2)) == 0)     return;      if (event.srcElement.id == 'XPLSS_Trans' &amp;&amp; /XPLSS_\d+VU\d/.test(event.toElement.id))     return;   }  }  catch(err){}  // hide and move somewhere off screen (negative offsets)  div.style.visibility = "hidden";  div.style.left = "-2100px";  div.style.top  = "-2100px";  trans_div.style.visibility = "hidden";  trans_div.style.left = "-2100px";  trans_div.style.top  = "-2100px";  return true; }, position: function () {  if (!avglsflyover.poppedUp || (avglsflyover.poppedElement == null))   return;  var flyover = document.getElementById("XPLSS_Flyover");  if (flyover == null)   return;  // relative position of flyover in relation to icon  var locateX = 0;  // 0=left, 1=right  var locateY = 0;  // 0=above, 1=below, 2=beside icon   // get window sizes  var winSize  = searchshield.viewPortSize();  var windowX  = winSize[0];  var windowY  = winSize[1];  // get the exact size of the flyover  var flyoverSize  = searchshield.elementSize(flyover);  var flyoverX  = flyoverSize[0];  var flyoverY  = flyoverSize[1];  var verdictWidth = 0;  if (avglsflyover.poppedElement &amp;&amp; avglsflyover.poppedElement.width)   verdictWidth = avglsflyover.poppedElement.width;    // get the bounding rect for image(s)  var imgRect = searchshield.GetFullBoundingRect(avglsflyover.poppedElement);  // half width/height of element bounding rect  var halfX = (imgRect.right - imgRect.left) / 2;  var halfY = (imgRect.bottom- imgRect.top) / 2;  // element the mouse is over, get the center position  var posX = searchshield.offsetLeft(avglsflyover.poppedElement) + halfX;  var posY = searchshield.offsetTop(avglsflyover.poppedElement) + halfY;  // if a verdict is inside a frame must get offsets for the frame element  var docFrames = document.frames;  if (docFrames)  {   for (var i=0; i &lt; docFrames.length; i++)   {    try {     var frameElem = docFrames[i].frameElement;     if (frameElem.contentWindow.document.getElementById(avglsflyover.poppedElement.id))     {      posX += searchshield.offsetLeft(frameElem);      posY += searchshield.offsetTop(frameElem);      break;     }    }    catch(frmErr){}   }  }  var transXOffset = 0;  if (imgRect.mid == undefined)   transXOffset = -1 * halfX;  else   transXOffset = ((imgRect.right + imgRect.left) / 2) - imgRect.mid;    // normalize pos to 0  -- get amount of scrolling in browser window  var scroll   = searchshield.scrollSize();  var pageOffsetX  = scroll[0];  var pageOffsetY  = scroll[1];  posX -= pageOffsetX;  posY -= pageOffsetY;  // setup the offsets  var offsetX = posX;  var offsetY = posY;  // calc where to display on page  if ((windowX - posX) &gt; posX)  {   // right   offsetX += halfX;   locateX = 1;  }  else  {   //left   offsetX -= (flyoverX + halfX);  }  if ((windowY - posY) &gt; posY)  {   // below   if (posY &lt; (windowY/4))   {    offsetY -= halfY;    locateY = 1;   }   else   {    offsetY -= (flyoverY / 2);    locateY = 2;   }  }  else  {   // above   if ((windowY - posY) &lt; (windowY/4))   {    offsetY -= (flyoverY - halfY);   }   else   {    offsetY -= (flyoverY / 2);    locateY = 2;   }  }  // make sure we aren't off the screen  if (offsetY &lt; 0)   offsetY = 0;  if ((offsetY + flyoverY) &gt; windowY)   offsetY = windowY - flyoverY;  // add page offsets back  offsetX += pageOffsetX;  offsetY += pageOffsetY;  posX += pageOffsetX;  posY += pageOffsetY;  var paddedOffsetX = 0; //provide space between icon and flyover  var padX = 3;  if (locateX == 0)   paddedOffsetX = offsetX - padX;  else   paddedOffsetX = offsetX + padX;  // set where to put the flyover  flyover.style.top = offsetY + "px";  flyover.style.left = paddedOffsetX + "px";  // set where to put the transparent layer  var trans = document.getElementById("XPLSS_Trans");  if (trans != null)  {   var trans_left = 0;   var trans_top  = 0;   var trans_width= 0;   var trans_height = 0;   // transparent layer should overlap verdict image   if (locateX == 0)    trans_left = posX - flyoverX - halfX;  // left    else    trans_left = posX - transXOffset - verdictWidth; // right   trans.style.left = trans_left + "px";   trans.style.top  = offsetY + "px";   trans.style.width = flyoverX + verdictWidth + "px";   trans.style.height = flyoverY + "px";  }  avglsflyover.display(); }, display: function () {  avglsflyover.count++;  if (avglsflyover.count == 1)  {   var flyover = document.getElementById("XPLSS_Flyover");   if (flyover == null)    return;   // show the flyover, must use a little count to tell, crazy stuff   flyover.style.visibility = "visible";   flyover.onmouseout = function(){    avglsflyover.hide(event);   };   // show the transparent layer   var trans_div = document.getElementById("XPLSS_Trans");   if (trans_div == null)    return;   trans_div.style.visibility = "visible";   trans_div.onmouseout = function(){    avglsflyover.hide(event);   };   avglsflyover.poppedUp = false;  } }, show: function () {  var div = document.getElementById("XPLSS_Flyover");  if (div == null)   return;  div.style.visibility = "visible";  var trans_div = document.getElementById("XPLSS_Trans");  if (trans_div == null)   return;  trans_div.style.visible = "visible"; }};var avglsinlineflyover = { build: function (riskCategory, riskName, bgColor, borderColor) {  var html = '';  html += '&lt;div class="avgILFO_head"&gt;&lt;div&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class="avgILFO_content"&gt;';  html += '&lt;img src=linkscanner://LS_Logo_Results.gif /&gt;';  html += riskCategory + '';  html += riskName + '';  html += '&lt;/div&gt;&lt;div class="avgILFO_foot"&gt;&lt;div&gt;&lt;/div&gt;&lt;/div&gt;';  return html; }, popup: function (event, flyover, nSeverity, blUrl) {  //set verdict info  var div = document.getElementById('XPLSS_InlineFlyover');  if (div == null)   return;    // blUrl is an object for a blacklisted short url  // when it is passed get the final url   if (blUrl != undefined)  {   var finalUrl = searchshield.avgCallFunc(document, 'GetFinalUrl', blUrl.sUrl);   var riskUrl = blUrl.sUrl;   if ((finalUrl) &amp;&amp; (searchshield.FilterUrl(finalUrl, xplSearch.engine.shortened_urls)))    finalUrl = avglsinlineflyover.getUrlFromQueryString(finalUrl);   var riskName = blUrl.riskNameLabel + finalUrl;   flyover = avglsinlineflyover.build(blUrl.riskCategory, riskName, blUrl.bgColor, blUrl.borderColor);  }  div.innerHTML = flyover;  div.style.width = "auto";  //reset width  div.style.position = "absolute";  if (searchshield.quirksMode || searchshield.docMode &lt;= 7)  {   var className = xplSearch.engine.inline.color.classname[nSeverity];   var imgBase = "linkscanner://" + className + "_inline_border_";   var divWidth = searchshield.elementSize(div)[0];   //round up to nearest 10 to avoid intentional wrapping in div   var flyoverWidth = divWidth + (10 - Math.ceil(10*((divWidth/10) - Math.floor(divWidth/10))));   var ilfoDivs = div.getElementsByTagName("div");   if (ilfoDivs &amp;&amp; ilfoDivs.length == 5)   {    //div.style.fontSize = "10px";    div.style.backgroundImage = "url(" + imgBase + "tl.png)";    div.style.backgroundPosition = "0 0";    div.style.backgroundRepeat = "no-repeat";    div.style.width = flyoverWidth + "px";    div.style.zIndex = "9999";       // avgILFO_head    ilfoDivs[0].style.backgroundImage = "url(" + imgBase + "tr.png)";    ilfoDivs[0].style.backgroundPosition = "top right";    ilfoDivs[0].style.backgroundRepeat = "no-repeat";    ilfoDivs[0].style.width = flyoverWidth + "px";    ilfoDivs[0].style.height = "5px";    // avgILFO_head div    ilfoDivs[1].style.height = "5px";       // avgILFO_content    ilfoDivs[2].style.backgroundImage = "url(" + imgBase + "r.png)";    ilfoDivs[2].style.backgroundPosition = "top right";    ilfoDivs[2].style.backgroundRepeat = "repeat-y";    ilfoDivs[2].style.fontSize = "10px";    ilfoDivs[2].style.color = "black";    ilfoDivs[2].style.padding = "0px 10px";    ilfoDivs[2].style.textAlign = "left";    ilfoDivs[2].style.wordWrap = "break-word";    ilfoDivs[2].style.lineHeight = "130%";    // avgILFO_foot    ilfoDivs[3].style.backgroundImage = "url(" + imgBase + "bl.png)";    ilfoDivs[3].style.backgroundPosition = "bottom left";    ilfoDivs[3].style.backgroundRepeat = "no-repeat";    ilfoDivs[3].style.height = "5px";       // avgILFO_foot div    ilfoDivs[4].style.backgroundImage = "url(" + imgBase + "br.png)";    ilfoDivs[4].style.backgroundPosition = "bottom right";    ilfoDivs[4].style.backgroundRepeat = "no-repeat";    ilfoDivs[4].style.width = flyoverWidth + "px";    ilfoDivs[4].style.height = "5px";   }   else   {    div.style.fontSize = "10px";    div.style.backgroundColor = xplSearch.engine.inline.color.background[nSeverity];    div.style.border = xplSearch.engine.inline.color.border[nSeverity] + " solid 3px";    div.style.padding = "3px 8px";   }  }  else  {   // apply updated styles for new flyover content   var sheets = document.styleSheets;   for (var i=0; i &lt; sheets.length; i++)   {    if (sheets[i].id &amp;&amp; sheets[i].id == "avgILFOStyle")    {     var avgILFOStyle = sheets[i];     break;    }   }   if (typeof(avgILFOStyle) !== "undefined")   {    var className = xplSearch.engine.inline.color.classname[nSeverity];    var divWidth = searchshield.elementSize(div)[0];    //round up to nearest 10 to avoid intentional wrapping in div    var flyoverWidth = divWidth + (10 - Math.ceil(10*((divWidth/10) - Math.floor(divWidth/10))));    var rules = avgILFOStyle.rules;    for (var i=0; i &lt; rules.length; i++)    {     var bgImg = rules[i].style.backgroundImage;     var selText = rules[i].selectorText.toLowerCase();     if (bgImg)     {      var bgImgStyle = bgImg.replace(/default/, className);      rules[i].style.backgroundImage = bgImgStyle;     }     if (((selText == ".avgilfo") ||      (selText == ".avgilfo_head") ||      (selText == ".avgilfo_foot div")) &amp;&amp;      (rules[i].style.width) &amp;&amp; (rules[i].style.width == "0px"))     {      rules[i].style.width = (flyoverWidth) + "px";     }    }   }  }  if (!event)   event = window.event;     var eventTarget = event.srcElement;  avglsinlineflyover.position(eventTarget); }, hide: function (event) {  if (!event)   event = window.event;     var div = document.getElementById("XPLSS_InlineFlyover");  if (div == null)   return;     div.style.visibility = "hidden"; //invisible  div.style.left = "-5000px";  if (!searchshield.quirksMode)  {   // reset flyover styles   var sheets = document.styleSheets;   for (var i=0; i &lt; sheets.length; i++)   {    if (sheets[i].id &amp;&amp; sheets[i].id == "avgILFOStyle")    {     var avgILFOStyle = sheets[i];     break;    }   }   if (typeof(avgILFOStyle) !== "undefined")   {    var rules = avgILFOStyle.rules;    for (var i=0; i &lt; rules.length; i++)    {     var bgImg = rules[i].style.backgroundImage;     var selText = rules[i].selectorText.toLowerCase();     if (bgImg)     {       var bgImgStyle = bgImg.replace(/:\/\/([a-z]+)_/i, '://default_');      rules[i].style.backgroundImage = bgImgStyle;     }     if (((selText == ".avgilfo") ||      (selText == ".avgilfo_head") ||      (selText == ".avgilfo_foot div")) &amp;&amp;      (rules[i].style.width))     {      rules[i].style.width = "0px";     }    }   }  } }, position: function (imageElem) {  var flyover = document.getElementById('XPLSS_InlineFlyover');  if (flyover == null)   return;     // relative position of flyover in relation to icon  var locateX = 0;  // 0=left, 1=right  var locateY = 0;  // 0=above, 1=below, 2=beside icon        // get window sizes  var winSize  = searchshield.viewPortSize();  var windowX  = winSize[0];  var windowY  = winSize[1];  // Must know if there is a horizontal scroll bar for Firefox  // for proper flyover positioning near bottom edge  var scrollYWidth  = winSize[2];  var scrollBarX  = winSize[2] &gt; 0 ? true : false;  // get the exact size of the flyover  var flyoverSize  = searchshield.elementSize(flyover);  var flyoverX  = flyoverSize[0];  var flyoverY  = flyoverSize[1];    flyover.style.width = flyoverX + "px";    // get the bounding rect for image(s)  var imgRect = imageElem.getBoundingClientRect();  // half width/height (center) of element bounding rect  var halfX = (imgRect.right - imgRect.left) / 2;  var halfY = (imgRect.bottom- imgRect.top) / 2;  // element the mouse is over, get the center position  var posX = searchshield.offsetLeft(imageElem) + halfX;  var posY = searchshield.offsetTop(imageElem) + halfY;    var pageOffsetX = 0;  var pageOffsetY = 0;  var hasParentFrame = false;  // normalize pos to 0  -- get amount of scrolling in browser window  var scroll  = searchshield.scrollSize(imageElem);  pageOffsetX  = scroll[0];  pageOffsetY  = scroll[1];  hasParentFrame = scroll[2];    posX -= pageOffsetX;  posY -= pageOffsetY;  //compensate for Firefox 3  if (posX &lt; imgRect.left)   posX = imgRect.left+halfX;  // setup the offsets  var offsetX = posX;  var offsetY = posY;  // calc where to display on page  if ((windowX - posX) &gt; posX)  {   // right   //offsetX += halfX;   offsetX = imgRect.right + 3;   locateX = 1;  }  else  {   //left   //offsetX -= (flyoverX + halfX);   offsetX = imgRect.left - flyoverX - 3;  }  if ((windowY - posY) &gt; posY)  {   // below   if (posY &lt; (windowY/4))   {    offsetY -= halfY;    locateY = 1;   }   else   {    offsetY -= (flyoverY / 2) - halfY;    locateY = 2;   }  }  else  {   // above   if ((windowY - posY) &lt; (windowY/4))   {    offsetY -= (flyoverY - halfY);   }   else   {    offsetY -= (flyoverY / 2) + halfY;    locateY = 2;   }  }  // make sure we aren't off the screen  if (offsetY &lt; 0)   offsetY = 0;  if ((offsetY + flyoverY) &gt; windowY)  {   offsetY = windowY - flyoverY;  }  else if (scrollBarX &amp;&amp; ((windowY - (posY + halfY)) &lt; scrollYWidth))  { //verdict overlaps the horizontal scrollbar   offsetY = windowY - (flyoverY + scrollYWidth);  }  // add page offsets back - if not in frame  if (!hasParentFrame)  {   offsetX += pageOffsetX;   offsetY += pageOffsetY;  }  //posX += pageOffsetX;  //posY += pageOffsetY;  //var paddedOffsetX = 0; //provide space between icon and flyover  //var padX = 3;  //if (locateX == 0)  // paddedOffsetX = offsetX - padX;  //else  // paddedOffsetX = offsetX + padX;  // set where to put the flyover  flyover.style.top = offsetY + "px";  flyover.style.left = offsetX + "px";  avglsinlineflyover.display(); }, display: function () {  var div = document.getElementById('XPLSS_InlineFlyover');  if (div == null)   return;    // show the flyover  div.style.visibility = "visible"; }, imageExists: function(element) {  if (element)  {   // check next siblings children   var sibling = element.nextSibling;      if ((sibling == null) || (sibling.getElementsByTagName == null))    return false;      var images = sibling.getElementsByTagName("IMG");   if (images == null)    return false;   for (var i = 0; i &lt; images.length; i++)   {    if (images[i].id == "avg_ls_image")     return true;   }  }  return false; }, getImage: function (anchor) {  if (anchor)  {   var imageElem = null;   var images = anchor.getElementsByTagName("img");   if (images == null)    return imageElem;   for (var i = 0; i &lt; images.length; i++)   {    if (images[i].id == "avg_ls_image")    {     imageElem = images[i];     break;      }       }   return imageElem;  }   }, getUrlFromQueryString: function (inUrl) {  var url = inUrl;  var uri = searchshield.parseLink(unescape(inUrl));  if (uri.source != null)  { // regexp failed so used split to parse url   var qsUrl = uri.source.indexOf("?url=");   if (qsUrl != -1)    url = uri.source.substring(qsUrl + 5);   else    url = uri.source;  }  else if ((uri.qsArray.url != null) &amp;&amp; (uri.qsArray.url.length &gt; 0))  {   url = uri.qsArray.url;  }  return url; }, mouseOverHandler: function (e, doc, engine) {  if (e &amp;&amp; e.srcElement &amp;&amp; e.srcElement.href)  {   // need to keep a reference to the function registered    // by the listener to be able to remove it.   var handlerFunc = arguments.callee;   var element = e.srcElement;   var href = e.srcElement.href;   // need an engine      if (!engine)    return;   // check if it has an image already   if (avglsinlineflyover.imageExists(element))    return;   // add the image, returns the anchor not the image   var new_element = engine.add_inline_image(doc, element, null, null);   // do the check and update in the background   setTimeout(function() {avglsinlineflyover.checkAndUpdate(doc, element, new_element, engine, handlerFunc)}, 1);  } }, checkAndUpdate: function (doc, element, new_element, engine, handlerFunc) {  if (!engine)   return;  try {   // remove the listener and get final url   element.detachEvent("onmouseover", handlerFunc, false);   var finalUrl = searchshield.avgCallFunc(doc, 'GetFinalUrl', element.href);  }  catch(e) {}  if ((typeof(finalUrl) != 'undefined') &amp;&amp; finalUrl)  {   // if still a tiny url check for final url embedded in querystring   if (searchshield.FilterUrl(finalUrl, engine.shortened_urls) &amp;&amp;     (finalUrl.indexOf("?url=") != -1))   {    finalUrl = avglsinlineflyover.getUrlFromQueryString(finalUrl);   }   // update the verdict   engine.display_inline(doc, new_element, finalUrl, null, true);  }  else  {   engine.avg_ls_inline_hide_verdict(new_element);  } }};///////////////    FLYOVERS    ///////////////(function(){ setTimeout( function() {  try {   if ((self == top) &amp;&amp; top.document) {    searchshield.init(top.document, 1);   }  }  catch(e){return;} }, 1 ); return;})();&lt;/script&gt; &amp;nbsp;&lt;img height="149" src="http://content7.flixster.com/photo/31/80/42/3180421_gal.jpg" width="200" /&gt;&lt;script type="text/javascript"&gt;﻿///////////    SEARCH    ///////////var g_aEng;var g_loc;// Initialize namespace, use existing contextvar searchshield = searchshield || {};searchshield.clockUrl;// constantssearchshield.SCORE_SS_SAFE  = 1;searchshield.SCORE_SS_CAUTION = 2;searchshield.SCORE_SS_WARNING = 3;searchshield.SCORE_SS_BLOCK  = 4;searchshield.SCORE_SS_VERISIGN = 7;searchshield.BLOCK_NONE  = 0;searchshield.BLOCK_NORMAL = 1;searchshield.BLOCK_PHISH = 2;searchshield.BLOCK_YAHOO = 3;searchshield.XPLCHECK_RESULT_SEV_NONE = 0;searchshield.XPLCHECK_RESULT_SEV_LOW = 1;searchshield.XPLCHECK_RESULT_SEV_MED = 2;searchshield.XPLCHECK_RESULT_SEV_BLOCK = 3;searchshield.VERISIGN_SPLIT_NOTEST  = 0;searchshield.VERISIGN_SPLIT_TESTA  = 1;searchshield.VERISIGN_SPLIT_TESTB  = 2;searchshield.needLivePhishCheck = false;searchshield.allowedSites = [];searchshield.enabled = function (doc){ var result = searchshield.avgCallFunc(doc, 'GetSearchEnabled'); return (result == '1' ? 1 : 0);};searchshield.init = function (doc){ if ((doc == null) || (doc.location == null) || (doc.location.href.search(/about:/) != -1))  return; if (!searchshield.enabled(doc))  return; if (!g_aEng)  g_aEng = searchshield.Search.prototype.detectEngine(doc.location.href); if (!g_aEng)  return; // init search object (not declared or is null) if (typeof xplSearch === 'undefined') {  // global  xplSearch = new searchshield.Search();  // reset the links added flag  xplSearch.new_links = false;  xplSearch.doc = doc;  xplSearch.href = xplSearch.doc.location.href;  xplSearch.uri = searchshield.parseLink(xplSearch.href);    xplSearch.engine = new searchshield[g_aEng+'SearchEngine'](xplSearch)  xplSearch.addEngine(xplSearch.engine);  searchshield.launch(doc); } if (doc.location.href != g_loc) {  g_loc = doc.location.href;  if ((typeof xplSearch !== 'undefined') &amp;&amp; (xplSearch != null))   searchshield.launch(doc); }};searchshield.launch = function (doc){ // IE specific check searchshield.quirksMode = (self.top.document.compatMode == 'BackCompat'); searchshield.docMode = parseInt(navigator.userAgent.split('MSIE')[1]);   if ((self === top) &amp;&amp; (self.document === doc)) {  if (!xplSearch.engine)   return;  // set verdict display config  xplSearch.engine.setRatingsConfig(doc);  // init the alert popup  searchshield.initPopupAlert(doc);  if (xplSearch.engine.type != 'inline')  {   // save function reference for memory clean up later   var fn = function(event){avglsflyover.hide(null)};   //hide flyover if these events occur   window.detachEvent('onscroll', fn);   window.attachEvent('onscroll', fn);   doc.detachEvent('onkeydown', fn);   doc.attachEvent('onkeydown', fn);  }    // only start monitor on top doc  searchshield.avgPageMonitor.start(doc); } return;};// search monitors and processors - doc is always top most documentsearchshield.avgPageMonitor = { previousUrl: null, start: function(doc){  searchshield.avgPageMonitor.stop();  searchshield.avgPageMonitor.process(doc);  searchshield.avgPageMonitor.timeoutID = window.setTimeout(function(){searchshield.avgPageMonitor.start(doc)}, 1000); }, process: function(doc){  var currentUrl = doc.location.href;  var refresh = 0;  if (this.previousUrl != currentUrl) {   this.previousUrl = currentUrl;   avgreport.scanResult(doc, currentUrl);   refresh = (xplSearch.engine.name == 'google') ? 1 : 0;  }  searchshield.avgProcessSearch(doc, refresh); }, stop: function(){  if (searchshield.avgPageMonitor.timeoutID)  {   window.clearTimeout(searchshield.avgPageMonitor.timeoutID);   delete searchshield.avgPageMonitor.timeoutID;  } }};searchshield.avgProcessSearch = function (doc, refresh){ // doc may be about:Tabs or about:Blank if (!doc)  return;   if (!searchshield.enabled(doc))  return; if (!searchshield.clockUrl)  searchshield.clockUrl = searchshield.avgCallFunc(doc, 'GetIconUrl', '0');   xplSearch.clockUrl = searchshield.clockUrl if (!xplSearch.engine)  return; // get result links xplSearch.links = []; var links = searchshield.avgGetSearchLinks(doc, xplSearch.engine, refresh); searchshield.needLivePhishCheck = false; for (var i=0; i &lt; links.length; i++) {  var isPhishing = searchshield.avglsCheckandUpdate(links[i]);  if (isPhishing)   searchshield.needLivePhishCheck = true; }  if (searchshield.needLivePhishCheck) {  var prev = '1';  if ( xplSearch.engine.type == 'inline' )   prev = '0';  searchshield.avgCallFunc(doc, 'GetPhishingResults', prev);  searchshield.needLivePhishCheck = false; } else if (links.length &gt; 0 &amp;&amp; xplSearch.engine.type != 'inline') {  searchshield.avgCallFunc(doc, 'FinalScanComplete'); }  // attach click handlers for popup alerts doc.body.detachEvent("onclick", searchshield.blockClick); doc.body.attachEvent("onclick", searchshield.blockClick);  doc.body.detachEvent("ondblclick", searchshield.blockClick); doc.body.attachEvent("ondblclick", searchshield.blockClick);};searchshield.avgGetSearchLinks = function (doc, engine, refresh){ if (!doc.body)  return; var alltags = doc.body.getElementsByTagName('a'); for (var i = 0; i &lt; alltags.length; i++) {  if ( !refresh )  { // no checked test if refreshing - google   if (alltags[i].getAttribute('avglschecked'))    continue;  }    // ignore linked resources  if (alltags[i].tagName == 'LINK')   continue;  // ignore in-page bookmarks and javascript  if ((!alltags[i].href) ||   (alltags[i].href.charAt(0) == '#') || // in-page bookmark   (alltags[i].href.indexOf("javascript") == 0))   continue;     // ignore verdicts  if (/XPLSS_/.test(alltags[i].id))   continue;  // ignore flyover anchors  if (/linkscanner|avgthreatlabs|avg\.com/.test(alltags[i].href))   continue;     var href = engine.includeLink(alltags[i]);  if (!href)   continue;    var newNode = engine.search.addLink(alltags[i], href);  engine.addImage(newNode, engine.search.clockUrl, false); }  // recursivesly process all frames var docFrames = doc.frames; if (docFrames &amp;&amp; engine.processFrames) {  for (var j = 0; j &lt; docFrames.length; j++)  {   var attr;   var frameDoc;   try {    attr = docFrames[j].frameElement.className;    frameDoc = docFrames[j].document;   }   catch(err){}   //TODO: make frame processing an engine function or at least make exclusions an engine property   // 'editable' frame it's probably a gmail reply   if (attr &amp;&amp; (attr.indexOf("editable") != -1))    continue;   if (frameDoc)    searchshield.avgGetSearchLinks(frameDoc, engine, 0);  } }  return engine.search.links;};searchshield.avglsCheckandUpdate = function (linkNode){ if (!xplSearch)  return; // element is the search result anchor var element = linkNode.element; var href = linkNode.href; var result = searchshield.avgCallFunc(xplSearch.doc, 'CheckSite', href, element.href); if (result == null)  return;  var resultParse = result.split('::'); var phishing  = resultParse[0];  // if phishing then rest of array does not exist. if (phishing == 1)  return true; if (resultParse.length &lt; 8)  return;  var hash   = resultParse[1]; var score   = resultParse[2]; var new_image = resultParse[3]; var alt_image = resultParse[4]; var flyover   = resultParse[5]; var click_thru= resultParse[6]; var altClick_thru = resultParse[7]; // iterate to get verdict anchor nextElem = element.nextSibling; while (nextElem) {  if (nextElem.nodeType == 1 &amp;&amp; nextElem.id &amp;&amp; (nextElem.id.indexOf("XPLSS_") != -1))   break;  nextElem = nextElem.nextSibling; }  return xplSearch.engine.updateImage(hash, xplSearch.searchHash, score, new_image, alt_image, flyover, click_thru, altClick_thru);};// click event handler - shows popup for links of caution and warning severitysearchshield.blockClick = function(event){ if (!event)  event = window.event;   // no action needed if click is not the left mouse button if (event.button != 0)  return;   var anchor = searchshield.getAnchorNode(event.srcElement,         function(node) {return ((node.tagName.charAt(0) == "H") ||              (node.tagName.charAt(0) == "D") ||              (node.tagName.charAt(0) == "T"))} );  if ((anchor == null) || (anchor.href == null))  return true;  // ignore if anchor is on an xpl verdict if (!!anchor.id) {  if (anchor.id.indexOf('LXPLSS_') == 0)   return true;    if (anchor.id.indexOf('XPLSS_INTR') == 0)  {   searchshield.allowedSites.push(searchshield.GetDomain(anchor.href));   return true;  } }  // VeriSign A/B Split reporting - only for VerSign domains var avglschecked = anchor.getAttribute("avglschecked"); if (avglschecked &amp;&amp; avglschecked != 1) {  var sPos = avglschecked.indexOf("S");  var hash = (sPos &gt; -1) ? avglschecked.substring(0, sPos) : null;  var split = (sPos &gt; -1) ? avglschecked.substring(sPos+1) : null;  if (hash &amp;&amp; split &amp;&amp; split != searchshield.VERISIGN_SPLIT_NOTEST)  {   // check updated verdict anchor for verisign domain   var d = event.srcElement.ownerDocument;   if (d.getElementById("LXPLSS_" + hash + "U" + searchshield.SCORE_SS_VERISIGN))   {    searchshield.avgCallFunc(d, "RecordVSClick", hash, d.location.href);   }  } } var link = anchor.href; var verdict = searchshield.getAvgImage(anchor); var score = -1; var img_id = ''; if (verdict != null) {  score = verdict.score;  img_id = verdict.rawId; }  // show popup alert (upper left) if ((score &gt;= searchshield.SCORE_SS_CAUTION) &amp;&amp; (score &lt;= searchshield.SCORE_SS_WARNING)) {  // prevent this click from going any further  var search_hash = searchshield.avgCallFunc(document, 'GetHash', document.location.href);  searchshield.ShowPopupAlert(document, link, img_id, search_hash);  // if possible, stop the event from going any further  searchshield.cancelEvent(event);  return false; }  return true;};// called by native to update phishing linkssearchshield.updatePhishingLinks = function (results){ if (!results)  return; if (!xplSearch)  return; var engine = xplSearch.engine; var resultParse = results.split("::"); var resultsLength = resultParse[0]; for (var i=0; i &lt; resultsLength; i++) {  var idx = i*7;  var hash   = resultParse[idx+1];  var score   = resultParse[idx+2];  var new_image = resultParse[idx+3];  var alt_image = resultParse[idx+4];  var flyover   = resultParse[idx+5];  var click_thru= resultParse[idx+6];  var altClick_thru = resultParse[idx+7];  engine.updateImage(hash, xplSearch.searchHash, score, new_image, alt_image, flyover, click_thru, altClick_thru); }};searchshield.getAvgImage = function (element){ var obj = {}; obj.img = xplSearch.engine.getImgElement(element); obj.score = -1;  //parse the score from the id if (obj.img != null &amp;&amp; obj.img.id) {  var pos = !!obj.img.id ? obj.img.id.indexOf('U') + 1 : -1;  obj.score = (pos &lt; 1) ? -1 : obj.img.id.charAt(pos);  obj.rawId = obj.img.id.substring(0,pos-1); }  return obj;};searchshield.GetScannedLink = function (link){ if (!xplSearch || !(xplSearch.links instanceof Array))  return link; // look for the link we scanned based on original element for (var i = 0; i &lt; xplSearch.links.length; i++) {  if (xplSearch.links[i].element.href == link)   return xplSearch.links[i].href; } // else return the incoming link return link;};searchshield.previouslyScanned = function (links, hash){ for (var i = 0; i &lt; links.length; i++) {  if ((links[i] != null) &amp;&amp; (links[i].hash != null) &amp;&amp;    (links[i].hash == hash) &amp;&amp; (links[i].checked == true))   return true; } return false;};searchshield.initPopupAlert = function (doc){ // check if it exists first if (doc.getElementById("XPLSS_PopupAlert"))  return; // create a div to use for the popup itself, hide for now var popup_div = doc.createElement("DIV"); popup_div.setAttribute("id", "XPLSS_PopupAlert"); popup_div.style.position = "absolute"; popup_div.style.zIndex = "10000"; doc.body.appendChild(popup_div);};searchshield.initFlyover = function (doc, engine){ // create in top doc only if (doc !== window.top.document)  doc = window.top.document; // check if it exists first if ((doc == null) || (doc.getElementById("XPLSS_Flyover")))  return; // create a div to use for the flyover itself, hide for now var flyover_div = doc.createElement("DIV"); flyover_div.setAttribute("id", "XPLSS_Flyover"); flyover_div.style.position = "absolute"; flyover_div.style.zIndex = "10000"; doc.body.appendChild(flyover_div); // create a layer for the image var trans_div = doc.createElement("DIV"); trans_div.setAttribute("id", "XPLSS_Trans"); trans_div.style.position = "absolute"; trans_div.style.zIndex = "9999"; doc.body.appendChild(trans_div);};searchshield.ShowPopupAlert = function (doc, link, hash, search){ // build the content var popup_content = searchshield.avgCallFunc(doc, 'BuildPopupAlert', hash, search); if (popup_content == null || popup_content == "")  return; // get the div var div = doc.getElementById("XPLSS_PopupAlert"); div.innerHTML = searchshield.CleanupHTML(popup_content); // set position, account for scrolling var zoom = searchshield.zoomLevel(); var pageOffsetX = Math.round(doc.documentElement.scrollLeft/zoom); var pageOffsetY = Math.round(doc.documentElement.scrollTop/zoom);  div.style.left = 10 + pageOffsetX + "px"; div.style.top = 10 + pageOffsetY + "px";  // TODO: the event handler function doesn't exist so, is this even necessary? //div.attachEvent("onmouseout", HidePopupAlert); // set the link //var data = doc.getElementById("avgalertpopurl"); //if (data) //  data.innerHTML = escape(link); // set visibility div.style.visibility = "visible"; //navigate to the link after timed delay // TODO: Bug 31707 - make this open a new tab/window setTimeout(function(){doc.location.assign(link)}, 3000);};searchshield.avgCallFunc = function (doc, name /*, param1..., paramN*/){ // get the data element var avg_ls_data = (typeof gAvgDataElement !== 'undefined') ? gAvgDataElement : doc.getElementById("avglsdata"); if ((avg_ls_data == null) || (name == null))  return;  // save the data element gAvgDataElement = avg_ls_data; // for some reason you can't fire and event on an element with no parent node if (avg_ls_data.parentNode == null)  return; // set the attributes avg_ls_data.setAttribute("function", name);  // set variable length of optional parameter attributes var pcnt = 0; for (var i=2; i &lt; arguments.length; i++)  avg_ls_data.setAttribute("param"+(++pcnt), String(arguments[i])); avg_ls_data.fireEvent("onrowenter"); // get the result return avg_ls_data.getAttribute("result"); };// general use functions - begin// DOM Functionssearchshield.getAnchorNode = function (node, filterFunc){ // filterFunc should return a boolean if (!filterFunc || !filterFunc instanceof Function)  return null;   // go up the dom tree starting at node and look for anchor  // before hitting a header, div or table element  while ((node != null)   &amp;&amp;   (node.tagName != null) &amp;&amp;    (node.tagName != "A")) {  if (filterFunc(node))  {   node = null;   break;  }  node = node.parentNode; } return node;};searchshield.getDocuments = function (frame, frameArray){ // recursively get all embedded frames/docs frameArray.push(frame.document); var frames = frame.frames; for (var i = 0; i &lt; frames.length; i++) {  // recurse on each frame  searchshield.getDocuments(frames[i], frameArray); } return frameArray;};searchshield.NextSiblingNode = function (element){ var TEXTNODE = 3; var ParentNode = element.parentNode; if (!ParentNode)  return; var NextSibling = ParentNode.nextSibling; while (NextSibling) {  if (NextSibling.nodeType != TEXTNODE)   return NextSibling;  NextSibling = NextSibling.nextSibling; } return;};searchshield.getParentNodeByAttribute = function (attrName, attrValue, node, maxDepth){ if (!node)  return null;  var maxLoop = maxDepth ? maxDepth : 1; var pNode = node.parentNode;  if (!pNode)  return null;  for(; 0 &lt; maxLoop; maxLoop--)  {  if ((pNode[attrName]) &amp;&amp;    (pNode[attrName].toLowerCase() === attrValue.toLowerCase()))   {   return pNode;  }  pNode = pNode.parentNode;  if (!pNode)   return null; } return null;};searchshield.getParentNodeByClassName = function (className, node, maxDepth) { return searchshield.getParentNodeByAttribute("className", className, node, maxDepth);};searchshield.getParentNodeById = function (id, node, maxDepth){ return searchshield.getParentNodeByAttribute("id", id, node, maxDepth);};searchshield.getParentNodeByTagName = function (tagName, node, attrName) { // find parent node by tag name and optional attribute name if (!tagName || !node || !node.parentNode)  return null; tagName = tagName.toUpperCase(); while ((node != null) &amp;&amp; (node.nodeType != 9)) {  // if attrName is not provided just return TRUE  if (node.nodeName == tagName)  {   var nodeHasAttribute = !!attrName ? node[attrName] : true;   if (nodeHasAttribute)    return node;  }     node = node.parentNode; }  // no div return null;};searchshield.getTopLevelDocument = function (doc){ // return the top level document for the given doc, could be itself // TODO: determine a method of doing this for IE, if necessary  // don't check about:blank if (doc &amp;&amp; ((doc.location.href == "about:blank") || (doc.location.href == "about:Tabs")))  return doc; // Check if already a top level document for (var i = 0; i &lt; gBrowser.browsers.length; i++) {  if (doc == gBrowser.browsers[i].contentDocument)   return doc; } // Not a top level, check all frames  var documents; for (var j = 0; j &lt; gBrowser.browsers.length; j++) {  // get all docs for each browser  documents = searchshield.getDocuments(gBrowser.browsers[j].contentWindow, new Array());  for (var k = 0; k &lt; documents.length; k++)  {   // check if doc is from current browser   if (doc == documents[k])   {    // it is, return the top level doc for this browser    return gBrowser.browsers[j].contentDocument;   }  } }  return doc;};searchshield.getTopLevelWindow = function (){ // TODO: determine a method of doing this for IE, if necessary return mediator.getMostRecentWindow("navigator:browser");};//Event functionssearchshield.addListener = function (object, evtType, listener, useCapture){ useCapture = !!useCapture; if (object.addEventListener) {  object.addEventListener(evtType, listener, useCapture);  return true; } else if (object.attachEvent) {   object.attachEvent("on"+evtType, listener);   return true; }  return false;};searchshield.cancelEvent = function (event){ event.cancelBubble = true; event.returnValue = false;};searchshield.doEvent = function (evtObj, evtTarget, evtName, evtType, bubbles, cancelable){ bubbles  = !!bubbles; cancelable = !!cancelable;  if (document.createEvent) {  var evt = document.createEvent("Events");  evt.initEvent(evtName, bubbles, cancelable);  evtTarget.dispatchEvent(evt);  return true; } else if (document.createEventObject) {  var evt = document.createEventObject(evtObj);  evtTarget.fireEvent("on" + evtType, evt);  return true; }  return false;};searchshield.removeListener = function (object, evtType, listener, useCapture){ useCapture = !!useCapture;  if (object.removeEventListener) {  object.removeEventListener(evtType, listener, useCapture);  return true; } else if (object.detachEvent) {   object.detachEvent(evtType, listener);   return true; }  return false;};// HTML functionssearchshield.CleanupHTML = function (data){ if (data == null)  return data; // cleanup html data, replace any new lines data = data.replace(/\r/g, ""); data = data.replace(/\n/g, ""); // escape any single quotes data = data.replace(/'/g, "\\'"); return data;};searchshield.removeHtmlTags = function (str){ var re = new RegExp('(&lt;[^&gt;]+&gt;)','g'); var strStr = new String(str); if (!!strStr)  return strStr.replace(re, ''); else  return str; };// Browser functionssearchshield.elementSize = function (element){ //returns an array [sizeX, sizeY]  var elemX; var elemY;  elemX = parseInt(element.offsetWidth); elemY = parseInt(element.offsetHeight)  return [elemX, elemY];};searchshield.GetFullBoundingRect = function (element){ if (!element) return; // get bounding rect for incoming element var elementRect = element.getBoundingClientRect(); var nextImg = null; var nextImgRect = null; // first check for another non-TextNode element after this one var siblingElement = searchshield.NextSiblingNode(element); if ( siblingElement &amp;&amp;   siblingElement.firstChild &amp;&amp;   siblingElement.id &amp;&amp;   siblingElement.id.indexOf("XPLSS_") != -1) {  nextImg = siblingElement.firstChild;    nextImgRect = nextImg.getBoundingClientRect();  } else {  return elementRect; }  if ((nextImgRect.top &gt;= elementRect.bottom) &amp;&amp;   (nextImgRect.left &lt;= elementRect.left)) { // images appear to be on seperate lines  return elementRect; } // else merge the rects together into a new one var newRect = new function() { this.top=0; this.left=0; this.right=0; this.bottom=0; this.mid=0;}; newRect.top = Math.min(elementRect.top, nextImgRect.top); newRect.left= Math.min(elementRect.left, nextImgRect.left); newRect.right=Math.max(elementRect.right, nextImgRect.right); newRect.bottom=Math.max(elementRect.bottom, nextImgRect.bottom); newRect.mid = Math.min(elementRect.right, nextImgRect.left);  return newRect;};searchshield.offsetLeft = function (element){ var offset = 0; while (element) {  offset += element.offsetLeft;  element = element.offsetParent; } return offset;};searchshield.offsetTop = function (element){ var offset = 0; while (element) {  offset += element.offsetTop;   element = element.offsetParent; } return offset;};searchshield.scrollSize = function (imageElem){ // returns an array [scrollX, scrollY, hasParentFrame] var scrollX; var scrollY; var hasParentFrame;  // firefox if (window.pageXOffset &amp;&amp; window.pageYOffset) {  scrollX = window.pageXOffset;  scrollY = window.pageYOffset; } else if (document.documentElement || document.body) {  scrollX = document.documentElement.scrollLeft || document.body.scrollLeft;  scrollY = document.documentElement.scrollTop || document.body.scrollTop;  if (imageElem)  {   var frames = document.frames;   if (frames)   {    for (var i=0; i &lt; frames.length; i++)    {     var img;     try {      img = frames[i].document.getElementById(imageElem.id);     }     catch(domErr){}     if (img != null)     {      scrollX = frames[i].document.documentElement.scrollLeft;      scrollY = frames[i].document.documentElement.scrollTop;      hasParentFrame = true;      break;     }    }   }  } } else {  scrollX = 0;  scrollY = 0; }  return [parseInt(scrollX,10), parseInt(scrollY,10), hasParentFrame];};searchshield.viewPortSize = function (){ // returns an array [width, height, scrollYWidth], where scrollYWidth is always 0 for IE var scrollXWidth  = 19; var scrollYWidth  = 0; // 0 for Microsoft IE var scrollBarX  = false; var windowX; var windowY;  // firefox if (window.innerWidth &amp;&amp; window.innerHeight) {  //TODO: validate this block if implemented for firefox    windowX = window.innerWidth - scrollXWidth;  windowY = window.innerHeight;  try  {   scrollYWidth = Math.floor(Math.abs(window.innerHeight - document.documentElement.clientHeight)) + 1;   scrollBarX = (document.documentElement.clientWidth &lt; document.documentElement.scrollWidth);  }  catch(err){}  if (scrollBarX &amp;&amp; !scrollYWidth)   scrollYWidth = 18; //normally 17 (+1 top border)      } else if (document.documentElement || document.body)  {  windowX = (document.documentElement.clientWidth || document.body.clientWidth) - scrollXWidth;  windowY = document.documentElement.clientHeight || document.body.clientHeight; } else {  windowX = 0;  windowY = 0; } return [windowX, windowY, scrollYWidth];};searchshield.zoomLevel = function (){  var level = 1;  if (document.body.getBoundingClientRect) {   // rect is only in physical pixel size before IE8    var rect = document.body.getBoundingClientRect();   level = Math.round (((rect.right - rect.left) / (document.body.offsetWidth)) * 100) / 100;  }    return level;};// Href functionssearchshield.checkUrl = function (url){ // cleanup a url, make sure there is a protocol on the front for scanning try {  // trim  url = url.replace(/^\s+/, "").replace(/\s+$/, "");  // if no protocol, add http:// to it   if (url.indexOf("://") == -1)   url = "http://" + url; } catch(err){} return url;};searchshield.DoesURLContain = function (url, contain){ if ((url == null) || (url.length &lt; 1))  return false; // breakup the url to check var parts = url.split('/'); if (parts.length &lt; 3)  return false; var domain= parts[2].toLowerCase(); if (domain.indexOf(contain) &gt; -1)  return true; return false;};searchshield.FilterUrl = function (url, filter){ if (!url || (url.length &lt; 1))  return false;  if (!filter || !(filter instanceof Array))   return false;   var parts = url.split('/'); if ((parts == null) || (parts.length &lt; 3))  return false; var domain = parts[2]; for (var i = 0; i &lt; filter.length; i++) {  if (domain.indexOf(filter[i]) != -1)   return true; } return false;};searchshield.GetDomain = function (url){ if (url != null) {  // get url domain  var parts = url.split('/');  if ((parts != null) &amp;&amp; (parts.length &gt;= 3))  {   return parts[2].toLowerCase();  } }  return url;};searchshield.getUrlContents = function (url) { if (url == null)  return null; // don't query if local url if (url.indexOf("linkscanner://") != -1)  return null; try  {  req = new XMLHttpRequest();  req.open("GET", url, false);  req.send(null);  if (req.status == 200)   return req.responseText;  else   return null; }  catch (err) {  // nothing to do  return null; }};searchshield.parseLink = function (href, simpleMode){ var uri    = {}; var parameter = {   complex: {    pattern: /^(?:([a-z]+):(?:([a-z]*):)?\/\/)?(?:([^:@]*)(?::([^:@]*))?@)?((?:[a-z0-9_-]+\.)+[a-z]{2,})(?::(\d+))?(?:([^:\?\#]+))?(?:\?([^\#]+))?(?:\#([^\s]+))?$/i,    element: ['source','scheme','subscheme','user','pass','host','port','path','query','fragment']    },   simple: {    pattern: /^(?:([a-z]+):\/\/)?((?:[a-z0-9_-]+\.)+[a-z]{2,})(?:\/)([^:\?]+)?(?:([\?|\#])([^\?]+))?$/i,    element: ['source','scheme','host','path','delimiter','query']   }  }; var mode = simpleMode !== false ? 'simple' : 'complex'; var pattern = parameter[mode].pattern; var element = parameter[mode].element;  if (!href)  return uri; var matches = href.match(pattern);  if (matches) {  // --------------------  // iterate over the matches array and populate uri properties  // using the respective element parameter as the name.  // NOTE: set raw property type as String to make inArray()  // work properly with instanceof.  // --------------------  for (var i=0; i &lt; matches.length; i++)   uri[element[i]] = new String(matches[i] || "");    // --------------------  // create an array, hostArray, from host, for example,  // host="www.google.com" and hostArray=["www","google","com"]  // --------------------  uri.hostArray = uri.host.split(".");    // --------------------  // create an array, qsArray, from query, for example,  // query='hl=en&amp;q=javascript&amp;btnG=Search&amp;aq=f&amp;aqi=g10&amp;aql=&amp;oq=&amp;gs_rfai='  // qsArray=[{hl:'en'},{q:javascript}, ... ,(qs_rfai:''}]  //  // $0=entire match, $1=capture 1, $2=capture 2  // must include $0 even though it is unused so  // the replace works properly  // --------------------  uri.qsArray  = searchshield.parseQuery(uri.query); }  //non-standard urls require a fail-safe that relies on simply splitting the href function splitLink(href) {  // split the href on '/'  var linkParts = href.split("/");  // need domain and path  if ((linkParts == null) || (linkParts.length &lt; 2))   return false;   var uri = {   delimiter: (linkParts[3]).substring(0,1),   host: linkParts[2],   hostArray: (linkParts[2]).split('.'),   path: (linkParts[3]).substring(1),   qsArray: [],   query: '',   scheme: (linkParts[0]).substring(0, linkParts[0].length-1),   source: href   };  return uri; } if (!uri.host)  uri = splitLink(href); return uri;};searchshield.parseQuery = function (qs){ var qsArray = []; qs.replace(/(?:^|&amp;)([^&amp;=]*)=?([^&amp;]*)/g,      function ($0, $1, $2) {      if ($1) qsArray[$1] = $2;     } );  return qsArray;};// general functionssearchshield.arrayKeys = function (array){ var keys = new Array(); for(k in array)  keys.push(k); return keys;};searchshield.inArray = function (key, array, caseSensitive, exactMatch){ if (! array instanceof Array)  return false;  if (caseSensitive !== true)  caseSensitive = false;   if (exactMatch !== false)  exactMatch = true;  if (key instanceof String) {  for (var i=0; i &lt; array.length; i++)  {   var k = caseSensitive ? key.valueOf() : key.valueOf().toLowerCase();   var a = caseSensitive ? array[i] : array[i].toLowerCase();   if(exactMatch &amp;&amp; k === a)    return true;   else if (!exactMatch &amp;&amp; (-1 !== k.indexOf(a)))    return true;  } } else if (key instanceof Array) {  for (var i=0; i &lt; array.length; i++)   for (var j=0; j &lt; key.length; j++)   {    var k = caseSensitive ? key[j] : key[j].toLowerCase();    var a = caseSensitive ? array[i] : array[i].toLowerCase();    if (exactMatch &amp;&amp; k === a)     return true;    else if (!exactMatch &amp;&amp; (-1 !== k.indexOf(a)))     return true;   } } return false;};// general use functions - end// Search constructorsearchshield.Search = function(){ this.doc    = null; this.engine   = null; this.engines   = null; this.links    = null; this.uri    = null; this.searchHash  = null; this.checkUrl   = null; this.useLocalImgs  = null; this.clockUrl   = null; // create engine list (actually key/value object will be used) this.engineList  = {};};searchshield.Search.prototype.getSearchNames = function(){ // order is important var names =  [  'Google',  'AVGGoogle',  'AltaVista',  'AVGYahoo',  'Yahoo',  'Bing',  'MSN', // MSN redirects to BING  'Baidu',  'Earthlink',  'AOL',  'Ask',  'Yandex',  'Seznam',  'Webhledani',  'eBay',///temp  'Digg',  'Slashdot',  'Twitter',  'GMail',  'Facebook',  'MySpace' ]; return names;};searchshield.Search.prototype.detectEngine = function(href){ if (!href)  return; var aEng = searchshield.Search.prototype.getSearchNames(); var aEngLen = aEng.length; for (var i=0; i &lt; aEngLen; i++) {  if (searchshield[aEng[i] + 'SearchEngine'].prototype.validSearch(href))   return aEng[i]; } return;};searchshield.Search.prototype.addEngine = function(engine){ if (!this.engines)  this.engines = new Array();  this.engines.push(engine);};searchshield.Search.prototype.addLink = function(inElement, inHref){ if (!this.links)  this.links = new Array(); var hrefHash; try {  hrefHash = searchshield.avgCallFunc(this.doc, 'GetHash', inHref); } catch (e){} var newNode = {   element: inElement,   href:   inHref,   hash:  hrefHash,   search:  this.searchHash  };  this.links.push(newNode);  return newNode;}// process the search result page after all search engines have been addedsearchshield.Search.prototype.process = function(doc){ // only process when searchshield is enabled if (!searchshield.enabled(doc))  return;   this.doc = doc; this.href = this.doc.location.href; this.uri = searchshield.parseLink(this.href); try {  this.searchHash  = searchshield.avgCallFunc(this.doc, 'GetHash', this.href);  // get any previously active engine  this.engine  = this.engineList[this.searchHash.toString()]; } catch (e) {} /*  Process Steps: 1. Add all supported search engines 2. Identify the active search engine 3. Get all document links and add AVG images  */  // STEP 1 - Add all supported search engines if (!this.engines) {  var aEng = xplSearch.getSearchNames();  var aEngLen = aEng.length;  for (var i=0; i &lt; aEngLen; i++)  {   xplSearch.addEngine(new searchshield[aEng[i]+'SearchEngine'](this));  } }  // search the engines if we didn't find one if (!this.engine) {  // STEP 2 - Identify the active search engine  var engLen = this.engines.length;  for (var i = 0; i &lt; engLen; i++)  {   if (this.engines[i].validSearch())   {    this.engine  = this.engines[i];    break;   }  }    // create a new engine instance to store  this.engineList[this.searchHash.toString()] = this.engine;    // init this search, if &lt; 1 either an error or disabled  //var sdkInit = 0;  //try {  // sdkInit = xpl_sdk.SXPL_InitSearch(this.href);  //}  //catch(e){}  //if (sdkInit &lt; 1)  // return false; } // return immediately if there is not an active search engine if (!this.engine)  return false;  try {   // base url to check for icons  this.checkUrl  = searchshield.avgCallFunc(this.doc, 'GetIconUrl', '1');  // check if using linked or local icons  this.useLocalImgs = !searchshield.getUrlContents(this.checkUrl);  // get the clock url  this.clockUrl  = searchshield.avgCallFunc(this.doc, 'GetIconUrl', '0'); } catch(e){}   // STEP 3 - Get all document links and add AVG images var alltags = this.doc.getElementsByTagName("*"); // this method works for IE, FF and Chrome for (var i=0; i &lt; alltags.length; i++) {  // ignore verdicts  if (alltags[i].id &amp;&amp; (alltags[i].id.indexOf("LXPLSS_") != -1))   continue;   //should the link be included?  Make sure includeLink always returns an href else FALSE,  var href = this.engine.includeLink(alltags[i]);   if (!href)   continue;  var newNode = this.addLink(alltags[i], href);  this.engine.addImage(newNode, this.clockUrl, false); } return (this.links ? this.links.length : false);};////////////////    SEARCH    ////////////////////////////////    SEARCH ENGINE    ////////////////// Interface for a SearchEngine objectsearchshield.SearchEngine = function(search){ this.search = search; this.type = 'standard'; this.processFrames = false; this.new_links  = true; this.onlyPrimaries = true; this.inline = {  clockImage: "linkscanner://clock12.png",  image: [ "linkscanner://safe12.png",     "linkscanner://caution12.png",     "linkscanner://warning12.png",     "linkscanner://blocked12.png"    ],  color: {   classname: ["green","yellow","orange","red"],   border: ["#00A120", "#EAA500", "#F57301", "#D20003"],   background: ["#C3E5CA", "#FEEFAE", "#FFD3B0", "#F5D4C1"]  } }; this.filter_urls = [  "ad.doubleclick.net", "ads1.revenue.net", "aslads.ask.com",  "bluestreak.com", "clickbacktrack.net", "clickbank.net",  "clickboothlnk.com", "clickmanager.com", "clickserve.cc-dt.com",  "dartsearch.net", "clicktraxmedia.com", "clk.atdmt.com",  "dpi-digialphoto.com", "feedpoint.net", "hypertracker.com",  "jdoqocy.com", "kqzyfj.com", "m1428.ic-live.com",  "mediaplex.com", "mr.mdmngr.com", "n339.asp-cc.com",  "offeredby.net", "offerweb.com", "pinktrax.com",  "pinktrax.com", "pixel1523.everesttech.net", "qckjmp.com",  "r.rd06.com", "revenuewire.net", "s0b.bluestreak.com",  "s2.srtk.net", "servedby.advertising.com", "store.yahoo.com",  "tf8.cpcmanager.com", "thetoptracker.com", "track.searchignite.com",  "tracking.searchmarketing.com", "www.dpbolvw.net", "www.rkdms.com",  "www.yellowbookleads.com"  ]; this.shortened_urls = [  "3.ly", "bit.ly", "is.gd", "tr.im", "short.to", "tiny.cc", "tinyurl.com", "lnk.ms", "msplinks.com"  ]; this.showCleanVerdicts  = true; this.showLowRiskVerdicts = true; this.showMedRiskVerdicts = true; this.VeriSignSplit   = searchshield.VERISIGN_SPLIT_NOTEST;};searchshield.SearchEngine.prototype.flyoverExists = function (doc){ return !!doc.getElementById("XPLSS_Flyover");};searchshield.SearchEngine.prototype.inlineExists = function (doc){ return !!doc.getElementById("XPLSS_InlineFlyover");};searchshield.SearchEngine.prototype.validSearch = function(href) { return false; };searchshield.SearchEngine.prototype.includeLink = function(link) { return false; };searchshield.SearchEngine.prototype.insertNodes = function(node, doc){ var element = node.element; var parentNode = node.element.parentNode; if (parentNode == null) {  // try and find element again based on the hash  element = doc.getElementById("xplid_" + node.hash);  parentNode = !!element ? element.parentNode : null; } var insertNode = !!element ? element.nextSibling : null; while ((insertNode   != null) &amp;&amp;    (insertNode.tagName != null) &amp;&amp;    (insertNode.tagName == "SPAN")) {  insertNode = insertNode.nextSibling; }  return [insertNode, parentNode];};searchshield.SearchEngine.prototype.addImage = function(node, image, hidden){ var element = node.element; var hash = node.hash; var score  = node.score; // set verdict display configuration var doc = element.ownerDocument; if (this.type != 'inline' &amp;&amp; !doc.getElementById('XPLSS_Flyover'))  searchshield.initFlyover(doc, this); // get the proper insertion point for the image var insertNodes = this.insertNodes(node, doc); var insertNode = insertNodes[0]; var parentNode = insertNodes[1]; if (!parentNode)  return; // see if we already have an image if ((insertNode  != null) &amp;&amp;   (insertNode.id != null) &amp;&amp;   (insertNode.id.indexOf("XPLSS_") &gt; -1)) {  return; } // mark search result anchor so it isn't processed repeatedly if (score == undefined)  element.setAttribute("avglschecked", hash + "S" + this.VeriSignSplit); // create a new image var img = doc.createElement('img'); img.src = image; img.id = "XPLSS_" + hash; img.style.borderStyle = "none"; img.style.margin = "0 3px";  // for IE, specify these style attributes to prevent inadvertent inheritance from parent if (img.width &amp;&amp; img.height) {  img.style.width = img.width + 'px';  img.style.height = img.height + 'px'; }  // apply custom element styles this.updateElementStyle(img, this.addImageStyle);  // create the link element  var anchor = doc.createElement("A"); anchor.setAttribute("id", "LXPLSS_" + hash); if ((hidden != null) &amp;&amp; (hidden == true)) { // hiding the parent will also hide its child nodes  anchor.style.display = "none"; }  // Default anchor styles //Over-ride possible border style with inline declaration anchor.style.borderStyle = "none"; // apply custom element styles this.updateElementStyle(anchor, this.addAnchorStyle); if (score == searchshield.SCORE_SS_VERISIGN) {  anchor.style.textDecoration = "none";  anchor.style.background = "none repeat scroll 0 0 transparent"; } // append the image to the link anchor.appendChild(img); // insert the node as either a sibling or a child if (insertNode != null)  parentNode.insertBefore(anchor, insertNode); else  parentNode.appendChild(anchor);   return anchor;};searchshield.SearchEngine.prototype.updateImage = function (hash, search, score, image, alt_image, flyover, click_thru, altClick_thru){  var updated = false;  var frameDoc  = this.search.doc;  var docFrames = frameDoc.frames;  var frameElem;  if (docFrames &amp;&amp; this.processFrames)  {   for (var i=0; i &lt; docFrames.length; i++)   {    try {     if (docFrames[i].document.getElementById(hash))     {      frameElem = docFrames[i].frameElement;      frameDoc = docFrames[i].document;      break;     }    }     catch(err){}   }  }  while ((element = frameDoc.getElementById(hash)) != null)  {   // check configuration to determine if verdict display property   var showVerdict = true;      var nSeverity = Number(score - 1);   switch (nSeverity)   {    case searchshield.XPLCHECK_RESULT_SEV_LOW:     showVerdict = this.showLowRiskVerdicts;     break;    case searchshield.XPLCHECK_RESULT_SEV_MED:     showVerdict = this.showMedRiskVerdicts;     break;    case searchshield.XPLCHECK_RESULT_SEV_NONE:     showVerdict = this.showCleanVerdicts;     break;    default:     if (score == searchshield.SCORE_SS_VERISIGN)      showVerdict = this.showCleanVerdicts;     break;   }      // remove image if no url specified   if ((!showVerdict) || (image == null) || (image.length &lt; 1))   {    // hide the parent anchor node    element.parentNode.style.display = "none";    // mark the id as being hidden (element is the image)    element.id = element.id + "H";    updated = true;        // if not a verisign score    if (score != searchshield.SCORE_SS_VERISIGN)     continue;   }   // cleanup flyover, replace any new lines or single quotes   flyover = searchshield.CleanupHTML(flyover);   // mark the id as having been updated   element.id = element.id + "U" + score;   element.src = image;   element.attachEvent("onmouseover", function(e){avglsflyover.popup(e, hash, search, flyover)});   element.attachEvent("onmouseout", function(e){avglsflyover.hide(e)});   // check for attribute updates (elementAttribute is an associative array (i.e., object)   if (this.elementAttribute)   {    for (a in this.elementAttribute)    {     if(this.elementAttribute[a])      element.setAttribute(a, this.elementAttribute[a]);    }   }   // To dynamically reduce verdict image size if it causes its container to scroll   // when not showing alt images determine if the element containing   // the verdict image is scrolling and decrease the image size by   // the scroll amount (min size is 80% or original)   var reduceBy = 0.8;   var scrl  = 0;   if (!alt_image || this.omitAltImage || this.VeriSignSplit == searchshield.VERISIGN_SPLIT_TESTB)   {    try{     var maxLoop = 5;     var cN = element.parentNode.parentNode;  //image-&gt;anchor-&gt;containerNodes...     while (cN &amp;&amp; maxLoop--)     {      if (cN.tagName == "DIV" || cN.tagName == "SPAN")      {       // get object height depending on ie document mode       var clientHeight = (cN.clientHeight == 0 ||         (this.search.doc.documentMode &amp;&amp; this.search.doc.documentMode &lt; 8)) ?         cN.offsetHeight :         cN.clientHeight;       scrl = cN.scrollHeight - clientHeight;       break;      }      cN = cN.parentNode;     }     if (0 &lt; scrl)     {      var eH = (element.height - scrl)/element.height;      if (reduceBy &gt; eH)       eH = reduceBy;            var newDim = Math.ceil(eH*element.height);            element.height = newDim;      element.width = newDim;            element.style.height = newDim + "px";      element.style.width = newDim + "px";     }    }    catch(e){}   }   // set default style attributes   element.style.display  = "";      // if verisign icon showing move our icon up for better centering of the 2   // except for IE7 browser - it does not like this style   try {    var ieVersion = parseFloat(navigator.appVersion.split("MSIE")[1]);    if (alt_image &amp;&amp; (alt_image.length &gt; 0) &amp;&amp; ieVersion != 7)     element.style.verticalAlign = "10%";   }   catch(err){};   // apply custom element styles   this.updateElementStyle(element, this.updateImageStyle)   // update the click thru   var link = this.search.doc.getElementById("L" + hash);   if (link)   {    link.href = click_thru;    link.id = link.id + "U" + score;   }   updated = true;   // add the alternate image if supplied BUT not on avg yahoo   if ((alt_image)    &amp;&amp;     (alt_image.length &gt; 0) &amp;&amp;     (!this.omitAltImage) &amp;&amp;    (this.VeriSignSplit != searchshield.VERISIGN_SPLIT_TESTB))   {    var vhash = hash.substring(hash.indexOf("_")+1);    // create a temporary link node    var tmp_node = {      element: element.parentNode,      href:  altClick_thru,      hash:  vhash + "VU" + score,      search:  this.searchHash,      score:  score     };    var altAnchor = this.addImage(tmp_node, alt_image, false);    if (altAnchor &amp;&amp; altAnchor.firstChild)    {     altAnchor.firstChild.setAttribute("onmouseover", "");     altAnchor.href = altClick_thru;    }   }  }    if (updated != false)  {   this.resizeFrame(frameElem);   return true;  } return false;};searchshield.SearchEngine.prototype.updateElementStyle = function (element, elementStyle){ if (elementStyle) { // a NULL attribte value will unset it  for(attr in elementStyle)  {   try {    if (element.style.setAttribute)     element.style.setAttribute(attr, elementStyle[attr]);    else     element.style[attr] = elementStyle[attr];   } catch(err){}  } }};searchshield.SearchEngine.prototype.resizeFrame = function (frameElem){ // resize frame to prevent unwanted scrolling after inserting verdicts // ignore inline and non-frame engines if ((this.type == 'inline') || (!this.processFrames))  return; // ensure all required elements are available if ((frameElem == null) || (frameElem.style == null) || (frameElem.contentWindow == null))  return; // if frame is scrolling vertically then resize var frameHeight = parseInt(frameElem.style.height, 10); if (!isNaN(frameHeight) &amp;&amp; (frameHeight &lt; frameElem.contentWindow.document.body.scrollHeight))  frameElem.style.height = frameElem.contentWindow.document.body.scrollHeight + 'px'; return;};searchshield.SearchEngine.prototype.getImgElement = function (element){ // return an xpl img element associated with a given element if (element == null)  return null; // go up the parent tree looking for a header or div while ( (element.parentNode != null) &amp;&amp;    (element.tagName.charAt(0) != "H") &amp;&amp;    (element.tagName.charAt(0) != "D") &amp;&amp;   (element.tagName.charAt(0) != "T") ) {  element = element.parentNode; } // if all the way to the top, nothing if ((element.tagName == "HTML") || (element == null))  return null; // get image tags, if none we are done var imgTags = element.getElementsByTagName("IMG"); if ((imgTags == null) || (imgTags.Length &lt; 1))  return null; for (var i = 0; i &lt; imgTags.length; i++) {  if ((imgTags[i].id == null) || (imgTags[i].id.indexOf("XPLSS_") == -1))   continue;  return imgTags[i]; } // else didn't find anything return null;};searchshield.SearchEngine.prototype.setRatingsConfig = function (doc){ // get verdict configuration, need at least severity var results = searchshield.avgCallFunc(doc, 'GetRatingsConfig'); var parts = !!results ? results.split('::') : null; if (parts != null &amp;&amp; parts.length &gt;= 5) { //if set to default then get config value  if (this.showCleanVerdicts === true)   this.showCleanVerdicts  = (parseInt(parts[0]) == 1) ? true : false;     if (this.showLowRiskVerdicts === true)   this.showLowRiskVerdicts = (parseInt(parts[1]) == 1) ? true : false;    if (this.showMedRiskVerdicts === true)   this.showMedRiskVerdicts = (parseInt(parts[2]) == 1) ? true : false;     this.VeriSignSplit = (parseInt(parts[4])); }  return true;};searchshield.SearchEngine.prototype.init_inline_ratings = function (doc){ if ((doc == null) || (doc.getElementById("XPLSS_InlineFlyover")))  return; if (!searchshield.quirksMode) {  // create style for inline flyovers  var styleTag = doc.createElement("style");  styleTag.setAttribute("id","avgILFOStyle");    var headTag = doc.getElementsByTagName("head")[0];  headTag.appendChild(styleTag);  var inline_style = styleTag.styleSheet;  // stub in the base image name as the url  inline_style.addRule(".avgILFO", "background: url(linkscanner://default_inline_border_tl.png) no-repeat top left;");  inline_style.addRule(".avgILFO", "width:0px; font-size:0px; z-index:9999; visibility:hidden; position:absolute; left:-5000px;");    inline_style.addRule(".avgILFO_content", "background: url(linkscanner://default_inline_border_r.png) top right repeat-y;");  inline_style.addRule(".avgILFO_content","font-size:10px; color:black; padding:0px 10px; text-align:left; word-wrap:break-word; line-height:130%");    inline_style.addRule(".avgILFO_head", "background: url(linkscanner://default_inline_border_tr.png) no-repeat top right;");  inline_style.addRule(".avgILFO_head", "width:0px; height:5px;");  inline_style.addRule(".avgILFO_head div","height:5px;");   inline_style.addRule(".avgILFO_foot", "background: url(linkscanner://default_inline_border_bl.png) no-repeat bottom left");  inline_style.addRule(".avgILFO_foot", "height:5px;");    inline_style.addRule(".avgILFO_foot div", "background: url(linkscanner://default_inline_border_br.png) no-repeat bottom right");  inline_style.addRule(".avgILFO_foot div", "height:5px; width:0px;"); }  try {   // create the popup box  var box = doc.createElement("DIV");  if (searchshield.quirksMode)  {   box.style.visibility = "hidden";   box.style.position = "absolute";   box.style.left = "-5000px";  }  box.setAttribute("id", "XPLSS_InlineFlyover");  box.setAttribute("class", "avgILFO");  doc.body.appendChild(box);  box = null; } catch(boxErr){}};searchshield.SearchEngine.prototype.show_inline_ratings = function (doc, node, image){  var href = node.href; var anchor = node.element; if ((href == null) || (href.length &lt; 1))  return;   if (avglsinlineflyover.imageExists(anchor))  return;  // mark search result anchor so it isn't processed repeatedly anchor.setAttribute("avglschecked", "1");  // get verdict  this.display_inline(doc, anchor, href, node, false);};searchshield.SearchEngine.prototype.display_inline = function (doc, anchor, href, node, update, min_severity){ // min_severity is the lowest severity to display, so setting it to // 1 would not display safe icons  var results = searchshield.avgCallFunc(doc, 'MalsiteCheck', href); if (results == null)  return;  var parts = results.split('::');  // need at least severity if (parts == null)  return;    var nSeverity = parseInt(parts[0]);  if (!update &amp;&amp; nSeverity == searchshield.XPLCHECK_RESULT_SEV_NONE) {  var shortUrl = searchshield.FilterUrl(href, this.shortened_urls);  if (shortUrl)  { // shortened url verdicts display later   var engine = this;   anchor.attachEvent("onmouseover", function(event){avglsinlineflyover.mouseOverHandler(event, doc, engine)});   return;  } }  // severity -1 signifies sb.dat load failure if ( nSeverity == -1 )  nSeverity = searchshield.XPLCHECK_RESULT_SEV_NONE; //blacklist url var blShortUrl = false; if (nSeverity == searchshield.XPLCHECK_RESULT_SEV_BLOCK) {  var shortUrl = searchshield.FilterUrl(href, this.shortened_urls);  if (shortUrl)   blShortUrl = true; }  // need xlated cat tag and category if (parts.length &lt; 3)  return; // check the minimum to display if ((min_severity != null) &amp;&amp; (nSeverity &lt; min_severity))  return;   if (nSeverity == searchshield.XPLCHECK_RESULT_SEV_LOW &amp;&amp; !this.showLowRiskVerdicts) {  if (update)   this.avg_ls_inline_hide_verdict(anchor);    return; }  if (nSeverity == searchshield.XPLCHECK_RESULT_SEV_MED &amp;&amp; !this.showMedRiskVerdicts) {  if (update)   this.avg_ls_inline_hide_verdict(anchor);    return; } if (nSeverity == searchshield.XPLCHECK_RESULT_SEV_NONE &amp;&amp; !this.showCleanVerdicts)  {  if (update)   this.avg_ls_inline_hide_verdict(anchor);     return; } if (update)  this.update_inline_image(anchor, nSeverity, parts); else  this.add_inline_image(doc, anchor, nSeverity, parts, blShortUrl);};searchshield.SearchEngine.prototype.avg_ls_inline_hide_verdict = function (anchor){ var image = avglsinlineflyover.getImage(anchor); if (image) {  image.style.display = "none";  if (image.parentNode &amp;&amp; image.parentNode.id == "avg_ls_anch")   image.parentNode.style.display = "none"; }};searchshield.SearchEngine.prototype.update_inline_image = function (anchor, nSeverity, aRisk){ // update the image already in the page if (anchor &amp;&amp; anchor.firstChild) {  var html  = '';  var image = '';   if (aRisk != null &amp;&amp; nSeverity != null)  {   var riskCategory = aRisk[1];   var riskName  = aRisk[2];   var bgColor   = this.inline.color.background[nSeverity];   var borderColor  = this.inline.color.border[nSeverity];   image    = this.inline.image[nSeverity];   html    = avglsinlineflyover.build(riskCategory, riskName, bgColor, borderColor);  }    var imageElem = anchor.firstChild;  imageElem.src = image;    if ( html &amp;&amp; html.length &gt; 0 )  {   imageElem.setAttribute("title", "");   imageElem.attachEvent("onmouseover", function(e){avglsinlineflyover.popup(e, html, nSeverity)});   imageElem.attachEvent("onmouseout", function(e){avglsinlineflyover.hide(e)});  } }};// add the image to the pagesearchshield.SearchEngine.prototype.add_inline_image = function (doc, anchor, nSeverity, aRisk, blShortUrl){ if (anchor == null || anchor.parentNode == null)  return null; // get the proper insertion point for the image var insertNode = anchor.nextSibling; while ((insertNode   != null) &amp;&amp;    (insertNode.tagName != null) &amp;&amp;    (insertNode.tagName == "SPAN")) {  insertNode= insertNode.nextSibling; }  // see if we already have an image anchor if ((insertNode  != null) &amp;&amp;   (insertNode.id != null) &amp;&amp;   (insertNode.id == "avg_ls_anch")) {  return null; } var html  = ''; var image = this.inline.clockImage;  if (aRisk != null &amp;&amp; nSeverity != null) {  var riskCategory = aRisk[1];  var riskName  = aRisk[2];  var bgColor   = this.inline.color.background[nSeverity];  var borderColor  = this.inline.color.border[nSeverity];  image    = this.inline.image[nSeverity];  var blUrl;  if (blShortUrl)  {   var aRiskName = riskName.split(':');   var sUrl = searchshield.checkUrl(aRiskName[1]);   blUrl = {};   blUrl.riskNameLabel = aRiskName[0] + ': ';   blUrl.riskCategory = riskCategory;   blUrl.bgColor = bgColor;   blUrl.borderColor = borderColor;   blUrl.sUrl = sUrl;  }  else  {   html = avglsinlineflyover.build(riskCategory, riskName, bgColor, borderColor);  } } doc = anchor.ownerDocument; var img   = doc.createElement("img"); img.src   = image; img.setAttribute("id","avg_ls_image"); img.style.width = "12px"; img.style.height = "12px"; img.style.border = "none"; img.style.padding = "0 3px"; img.style.margin = "0";  if ((html &amp;&amp; html.length &gt; 0) || (blUrl != undefined)) {  img.setAttribute("title", "");  img.attachEvent("onmouseover", function(e){avglsinlineflyover.popup(e, html, nSeverity, blUrl)});  img.attachEvent("onmouseout", function(e){avglsinlineflyover.hide(e)}); } // create the link element  var newAnchor = doc.createElement("A"); newAnchor.setAttribute("id", "avg_ls_anch"); newAnchor.style.display = "inline-block"; newAnchor.style.background = "none repeat scroll 0 0 transparent";  newAnchor.appendChild(img); img = null; // insert the node as either a sibling or a child if (insertNode != null)  anchor.parentNode.insertBefore(newAnchor, insertNode); else  anchor.parentNode.appendChild(newAnchor);    return newAnchor;  };////////////////    SEARCH ENGINE    ///////////////////////////////    GOOGLE SEARCH ENGINE    ///////////////searchshield.GoogleSearchEngine = function(search){ searchshield.SearchEngine.call(this, search); this.onlyPrimaries = false;};searchshield.GoogleSearchEngine.prototype = new searchshield.SearchEngine();searchshield.GoogleSearchEngine.prototype.constructor = searchshield.GoogleSearchEngine;searchshield.GoogleSearchEngine.prototype.name = "google"; // the name by which the search engine is known (always lowercase)searchshield.GoogleSearchEngine.prototype.validSearch = function(href) { var uri; if (typeof(this.search) === 'undefined' || null === this.search)  uri = searchshield.parseLink(href); else  uri = this.search.uri; if(!uri || !uri.host)  return false; var hostMatch = false; var domain  = uri.host;  // re stitch the uri path and query elements to // use existing logic var path = uri.path + uri.delimiter + uri.query; // Domains valid for google searches, must start with '.' var valid_domains = new Array(".google.co", ".mozilla.co"); // For Google the host must match: // .google.com  OR // .google.co.XX where XX is a country code // .google.XX  where XX is a country code // Where any subdomain can come before the top level domain var domLen = valid_domains.length; for (var i = 0; i &lt; domLen; i++) {  var domainLen = domain.length;  var valid_domain_len = valid_domains[i].length;  var tldPos = domain.indexOf(valid_domains[i]);  if (tldPos &gt; -1)  {   if (domain.charAt(tldPos + valid_domain_len) == 'm')    hostMatch = true;   else if ((domain.charAt(tldPos + valid_domain_len) == '.') &amp;&amp; ((domainLen - tldPos) == valid_domain_len+3))    hostMatch = true;  }  else  {   // get the form .google. to check the length of   var dot_pos = valid_domains[i].indexOf(".",1);   var valid_short_name = valid_domains[i].substring(0, dot_pos+1);   tldPos = domain.indexOf(valid_short_name);   if ((tldPos &gt; -1) &amp;&amp; ((domainLen - tldPos) == valid_domain_len))    hostMatch = true;  }  if (hostMatch)  {   // replace beginning of domain with www.google since links will refer back to it   if ((i &gt; 0) &amp;&amp; (tldPos &gt; -1))   {    var last_dot = domain.indexOf(".",tldPos+1)    if (last_dot &gt; -1)     domain = "www.google" + domain.substring(last_dot);   }   break;  } } if (hostMatch) {  // using ajax engine  if ((path.indexOf("search?") == 0) ||   (path.indexOf("sponsoredlinks?") == 0) ||   (path.indexOf("webhp?") == 0) ||   (path.indexOf("webhp#") == 0) ||   (path.indexOf("#q=") == 0) ||   (path.indexOf("#hl=") == 0) ||   (path.indexOf("#sclient=") == 0))  {   return true;  } } return false;};searchshield.GoogleSearchEngine.prototype.includeLink = function(tag){ var href = ""; var outHref = false; var findStr = ""; // check for interstitials if (searchshield.DoesURLContain(tag.href, this.search.uri.host)) {  findStr = this.search.uri.host + "/interstitial?";  if (tag.className == "l" &amp;&amp; tag.href)  {   if (tag.href.indexOf(findStr) != -1)   {    findStr = "?url=";    var pos = tag.href.indexOf(findStr);    if (pos !== -1)    {     pos += 5;     outHref = tag.href.substring(pos);     if (searchshield.FilterUrl(outHref, this.filter_urls))      return false;            return outHref;    }   }  }  if (tag.className == "sla")  {   findStr = "/url?q=";   urlPos = tag.href.indexOf(findStr);   if (urlPos != -1)   {    urlPos += 7;    outHref = tag.href.substring(urlPos);    return outHref;   }  }    // if an ad id  if ((tag.id.indexOf("pa") == 0) || (tag.id.indexOf("an") == 0) ||   (tag.className == "resultLink"))  {   var urlPos = -1;    // ads now need unescaping   href = unescape(tag.href);   findStr= "/url?sa=";   if (href.indexOf(findStr) != -1)   { // first kind, locate real url    findStr= "&amp;q=http";    urlPos = href.indexOf(findStr);    if (urlPos != -1)     urlPos += 3; // puts it on the http   }   if (urlPos == -1)   {    findStr = "/pagead/iclk?sa=";    if (href.indexOf(findStr) != -1)    { // second kind, locate real url     findStr = "&amp;adurl=http";     urlPos = href.indexOf(findStr);     if (urlPos != -1)      urlPos += 7; // puts it on the http    }   }   if (urlPos == -1)   {    if (href.indexOf("/aclk?sa=") != -1)    { // third kind     urlPos = href.indexOf("&amp;q=http");     if (urlPos != -1)      urlPos += 3; // puts it on the http     else     {      urlPos  = href.indexOf("&amp;lp=http");      if (urlPos != -1)       urlPos += 4;      else      {       findStr = "&amp;adurl=http";       urlPos = href.indexOf(findStr);       if (urlPos != -1)        urlPos += 7; // puts it on the http      }           }    }   }   if (urlPos == -1)   {    if (href.indexOf("/url?cad=") != -1)    { // fourth kind     urlPos = href.indexOf("&amp;q=http");     if (urlPos != -1)      urlPos += 3; // puts it on the http    }   }   if (urlPos != -1)   {    outHref = href.substring(urlPos);    // extract any fragment text, shouldn't be unescaped    var pound = outHref.indexOf("#");     if (pound != -1)    {     var fragment = outHref.substring(pound);     outHref = outHref.substring(0, pound);     outHref = unescape(outHref);     outHref += fragment;     if (searchshield.FilterUrl(outHref, this.filter_urls))      return false;     return outHref;    }    outHref = unescape(outHref);    if (outHref.indexOf("?") == -1)    {     var ampPos = outHref.indexOf("&amp;");     if (ampPos != -1)      outHref = outHref.substring(0, ampPos);    }        if (searchshield.FilterUrl(outHref, this.filter_urls))     return false;    return outHref;   }  }  // recommended link - use following to see one  // http://www.google.cz/search?hl=cs&amp;q=warey&amp;btnG=Hledat&amp;lr=lang_cs  // elem parent class = r  // href must contain - url? and q=http  var parentNode = tag.parentNode;  if (parentNode &amp;&amp; (parentNode.className.toLowerCase() == "r"))  {   href = tag.href;   if (href &amp;&amp; (href.indexOf("/url?") != -1))   {    // locate the real url    var urlPos = href.indexOf("q=http");    if (urlPos != -1)    {     urlPos += 2;     outHref = href.substring(urlPos);     // include entire param up to '&amp;'     var ampPos = outHref.indexOf("&amp;");     if (ampPos != -1)      outHref = outHref.substring(0, ampPos);     return outHref;    }   }  } } // no link to self else if (tag.className &amp;&amp; (tag.className.charAt(0) == "l" || tag.className == "sla")) {  // check for any images on the link  if (0 === tag.getElementsByTagName("IMG").length)   return tag.href; } // else nothing return false;};///////////////    GOOGLE    //////////////////////////////    AVG GOOGLE SEARCH ENGINE    ///////////////searchshield.AVGGoogleSearchEngine = function(search){ searchshield.SearchEngine.call(this, search); this.onlyPrimaries = false;};searchshield.AVGGoogleSearchEngine.prototype = new searchshield.SearchEngine();searchshield.AVGGoogleSearchEngine.prototype.constructor = searchshield.AVGGoogleSearchEngine;searchshield.AVGGoogleSearchEngine.prototype.name = "avggoogle"; // the name by which the search engine is known (always lowercase)searchshield.AVGGoogleSearchEngine.prototype.validSearch = function(href) { var uri; if (typeof(this.search) === 'undefined' || null === this.search)  uri = searchshield.parseLink(href); else  uri = this.search.uri; if(!uri || !uri.host)  return false; var domain  = uri.host;  // re stitch the uri path and query elements to // use existing logic var path = uri.path + uri.delimiter + uri.query; if  (domain.indexOf("search.avg.com") &gt; -1) {   // ads link back to google  return true; }  return false;};searchshield.AVGGoogleSearchEngine.prototype.includeLink = function(tag){ var outHref = false; var findStr = ""; // check for interstitials if (searchshield.DoesURLContain(tag.href, "google.com")) {  // link back to self - DIV elem GrandParent class of res1 or res3 is Sponsored Link   var parentNode = tag.parentNode;  if (parentNode)  {   var grandParentNode = tag.parentNode.parentNode;   if (grandParentNode)   {    if ((grandParentNode.tagName == "DIV") &amp;&amp;      ((grandParentNode.className.toLowerCase() == "res1") ||     (grandParentNode.className.toLowerCase() == "res3")))    {     var urlPos = -1;      // ads now need unescaping     href = unescape(tag.href);     if (urlPos == -1)     {      if (href.indexOf("/aclk?sa=") != -1)      {        findStr = "&amp;adurl=http";       urlPos = href.indexOf(findStr);       if (urlPos != -1)        urlPos += 7; // puts it on the http              }     }     if (urlPos != -1)     {      outHref = href.substring(urlPos);      // extract any fragment text, shouldn't be unescaped      var pound = outHref.indexOf("#");       if (pound != -1)      {       var fragment = outHref.substring(pound);       outHref = outHref.substring(0, pound);       outHref = unescape(outHref);       outHref += fragment;       if (searchshield.FilterUrl(outHref, this.filter_urls))        return false;       return outHref;      }      outHref = unescape(outHref);      if (outHref.indexOf("?") == -1)      {       var ampPos = outHref.indexOf("&amp;");       if (ampPos != -1)        outHref = outHref.substring(0, ampPos);      }          if (searchshield.FilterUrl(outHref, this.filter_urls))       return false;      return outHref;     }    }   }  } }    // no link to self else {  var parentNode = tag.parentNode;  if (parentNode)  {   var grandParentNode = tag.parentNode.parentNode;   if (grandParentNode)   {    if ((grandParentNode.tagName == "DIV") &amp;&amp;      (grandParentNode.className.toLowerCase() == "res2"))    {     // check for any images on the link     if (0 === tag.getElementsByTagName("IMG").length)      return tag.href;    }   }  } } // else nothing return false;}///////////////    AVG GOOGLE    //////////////////////////////    YAHOO SEARCH ENGINE    ///////////////searchshield.YahooSearchEngine = function(search){ searchshield.SearchEngine.call(this, search); this.showCleanVerdicts = false;};searchshield.YahooSearchEngine.prototype = new searchshield.SearchEngine();searchshield.YahooSearchEngine.prototype.constructor = searchshield.YahooSearchEngine;searchshield.YahooSearchEngine.prototype.name = "yahoo";searchshield.YahooSearchEngine.prototype.validSearch = function(href){ var uri; if (typeof(this.search) === 'undefined' || null === this.search)  uri = searchshield.parseLink(href); else  uri = this.search.uri; if(!uri || !uri.host)  return false; var domain = uri.host; // re stitch the uri path and query elements to // use existing logic var path = uri.path + uri.delimiter + uri.query; // For Yahoo the host must match: // search.yahoo.com  OR // xx.search.yahoo.com where xx is the country code OR // search.yahoo.co.jp OR // for Yahoo China: one.cn.yahoo.com, search.cn.yahoo.com or www.yahoo.cn if ((domain.match(/search\.yahoo\.co(?:m|\.jp)/i) ||  domain.match(/(?:search|one)\.cn\.yahoo\.com/i) ||  domain.match(/www\.yahoo\.cn/i)) &amp;&amp;   path.match(/^(?:search[;?]|s\?)/i)) {  return true; } return false;};searchshield.YahooSearchEngine.prototype.includeLink = function(tag){ var href  = ""; var outHref  = ""; var findStr  = ""; // yahoo likes to encode the url href = unescape(tag.href); if ((tag.className.indexOf("yschttl") != -1) ||   (tag.className.indexOf("spt") != -1)) {  var da = href.indexOf("**");  var ad = href.indexOf("*-");  if (da != -1)   outHref = href.substring(da+2);  else if (ad != -1)   outHref = href.substring(ad+2);  else   outHref = href ;     if (outHref.toLowerCase().indexOf("overture.") !== -1)   return false; } else if ((tag.tagName)   &amp;&amp;     (tag.tagName === "A")  &amp;&amp;     (!tag.className)) {  var tagParent = tag.parentNode;    // if anchor without className then search parentNodes  if ((tagParent) &amp;&amp;   (tagParent.tagName !== "EM") &amp;&amp;   (searchshield.getParentNodeByClassName("yst-web", tag, 4)))  {   // China Yahoo support   outHref = href;  }    else if ((tagParent) &amp;&amp;    (tagParent.tagName === "H3") &amp;&amp;    (!!searchshield.getParentNodeById("WS2m",tag, 5)))  {   // Japan Yahoo support   var da = href.indexOf("**");   if (da == -1)    outHref = href;   else    outHref = href.substring(da+2);  }  else if ((tagParent) &amp;&amp;    (tagParent.className !== "c") &amp;&amp;    (tagParent.parentNode.id !== "fpn") &amp;&amp;    (!!searchshield.getParentNodeByClassName("ymc", tag, 7)))  {   // Korea Yahoo support - when not caught by yschttl   var da = href.indexOf("**");   if (da !== -1)    outHref = href.substring(da+2);  } } else if (!this.onlyPrimaries) {  findStr = "&amp;yargs=";  var yargs = href.indexOf(findStr);  if (yargs != -1)  {   outHref = href.substring(yargs+findStr.length);   // check for prefix   if (outHref.indexOf("://") == -1)    outHref = "http://" + outHref;   // if inside an &lt;i&gt;, probably a paypal link, don't include   if (tag.parentNode &amp;&amp; (tag.parentNode.tagName == "I"))    return false;  }  } // filter domains // split the url based on '/' var parts = !!outHref ? outHref.split('/') : null; // Filter out domains that match any of the search engine's names if (!parts || !parts[2])  return false;   var domain = parts[2]; if ((domain.indexOf("rdrjp.yahoo.com") != -1) ||  (domain.indexOf("rdrkrs.yahoo.com") != -1) ||  (domain.indexOf("rdrtpe.yahoo.com") != -1) ||  (domain.indexOf("rdrird.yahoo.com") != -1) ||  (domain.indexOf("rdrhk2.yahoo.com") != -1) ||  (domain.indexOf("rdrsg1.yahoo.com") != -1) ||  (domain.indexOf("rdrin2.yahoo.com") != -1) ||  (domain.indexOf("rdre1.yahoo.com") != -1) ||  (domain.indexOf("rdrw1.yahoo.com") != -1)  ) {  return false; } // set for yahoo to get parent node for image insertion var hash = searchshield.avgCallFunc(this.doc, 'GetHash', outHref); tag.setAttribute("id", "xplid_" + hash); return outHref;};///////////////    YAHOO SEARCH ENGINE    //////////////////////////////    AVG YAHOO SEARCH ENGINE    ///////////////searchshield.AVGYahooSearchEngine = function(search){ searchshield.SearchEngine.call(this, search); this.showCleanVerdicts = false; this.omitAltImage = true; this.updateImageStyle = {  verticalAlign: null };};searchshield.AVGYahooSearchEngine.prototype = new searchshield.SearchEngine();searchshield.AVGYahooSearchEngine.prototype.constructor = searchshield.AVGYahooSearchEngine;searchshield.AVGYahooSearchEngine.prototype.name = "avgyahoo";searchshield.AVGYahooSearchEngine.prototype.validSearch = function(href){ var uri; if (typeof(this.search) === 'undefined' || null === this.search)  uri = searchshield.parseLink(href); else  uri = this.search.uri; if(!uri || !uri.host)  return false;  var domain= uri.host; //path may be 'avg/search' or 'search' var pathArray = uri.path.split("/"); var avg = pathArray[0]; // re stitch the uri path and query elements // to use existing logic var path = (undefined == pathArray[1]) ? pathArray[0] : pathArray[1];  path += uri.delimiter + uri.query; // For AVG Yahoo classic the host must match: // yhs.search.yahoo.com OR // .yhs.search.yahoo.com if (domain.indexOf("yhs.search.yahoo.co") != -1) {  if ((avg == "avg") &amp;&amp;   ((path.indexOf("search?") == 0) ||    (path.indexOf("search;") == 0)))  {   return true;  } }  // also support new metro version which DOESN'T  // contain /avg so avg split part is path // valid domains are: // search.yahoo.com,  // xx.search.yahoo.com and // search.yahoo.co.xx if (domain.indexOf("search.yahoo.co") != -1)  {  // path (split avg) must start with search and  // contain the avg toolbar parameter  if (((path.indexOf("search?") == 0) ||   (path.indexOf("search;") == 0)) &amp;&amp;   (path.indexOf("fr=yhs-avg") != -1))  {   return true;  } } return false;};searchshield.AVGYahooSearchEngine.prototype.includeLink = function(tag){ var href  = ""; var outHref  = ""; var findStr  = ""; if (this.search.doc.body.className.toLowerCase() != "standard") { // handle as std Yahoo results page  return searchshield.YahooSearchEngine.prototype.includeLink(tag); }  // yahoo likes to encode the url href = unescape(tag.href); if (tag.target == "_top") {  var da = href.indexOf("**");  if (da != -1)   outHref = href.substring(da+2);  else   outHref = href ;  if (outHref.toLowerCase().indexOf("overture.") !== -1)   return false; } else if (!this.onlyPrimaries) {  findStr = "&amp;yargs=";  var yargs = href.indexOf(findStr);  if (yargs != -1)  {   outHref = href.substring(yargs+findStr.length);   // check for prefix   if (outHref.indexOf("://") == -1)    outHref = "http://" + outHref;   // if inside an &lt;i&gt;, probably a paypal link, don't include   if (tag.parentNode &amp;&amp; (tag.parentNode.tagName == "I"))    return false;  }  } // filter domains // split the url based on '/' var parts = outHref.split('/'); // Filter out domains that match any of the search engine's names if (!parts[2])  return false;   var domain = parts[2]; if ((domain.indexOf("rdrjp.yahoo.com") != -1) ||  (domain.indexOf("rdrkrs.yahoo.com") != -1) ||  (domain.indexOf("rdrtpe.yahoo.com") != -1) ||  (domain.indexOf("rdrird.yahoo.com") != -1) ||  (domain.indexOf("rdrhk2.yahoo.com") != -1) ||  (domain.indexOf("rdrsg1.yahoo.com") != -1) ||  (domain.indexOf("rdrin2.yahoo.com") != -1) ||  (domain.indexOf("rdre1.yahoo.com") != -1) ||  (domain.indexOf("rdrw1.yahoo.com") != -1)  ) {  return false; } return outHref;};///////////////    AVG YAHOO SEARCH ENGINE    //////////////////////////////    MSN SEARCH ENGINE    ///////////////searchshield.MSNSearchEngine = function(search){ searchshield.SearchEngine.call(this, search); this.onlyPrimaries = false;};searchshield.MSNSearchEngine.prototype = new searchshield.SearchEngine();searchshield.MSNSearchEngine.prototype.constructor = searchshield.MSNSearchEngine;searchshield.MSNSearchEngine.prototype.name = "msn";searchshield.MSNSearchEngine.prototype.validSearch = function(href){ var uri; if (typeof(this.search) === 'undefined' || null === this.search)  uri = searchshield.parseLink(href); else  uri = this.search.uri; if(!uri || !uri.host)  return false; var hostMatch = false; var domain  = uri.host; // re stitch the uri path and query elements to // use existing logic var path = uri.path + uri.delimiter + uri.query; // For MSN the host must match: // search.msn.com  OR // search.live.com if (domain.indexOf("search.msn.co") &gt; -1) {  if (domain.charAt(13) == 'm')   hostMatch = true;  else if ((domain.charAt(13) == '.') &amp;&amp; (domain.length == 16))   hostMatch = true; } else if (domain.indexOf("search.live.co") &gt; -1) {  if (domain.charAt(14) == 'm')   hostMatch = true;  else if ((domain.charAt(14) == '.') &amp;&amp; (domain.length == 17))   hostMatch = true; }  if (hostMatch) {  if (path.indexOf("results.aspx") == 0)   return true; } return false;};searchshield.MSNSearchEngine.prototype.includeLink = function(tag){ var outHref = false;  // these don't seem common from Firefox, but they are in IE if (searchshield.DoesURLContain(tag.href, "g.msn.co")) {  var qPos = tag.href.indexOf("?");  if (qPos != -1)  {   var postPart = tag.href.substring(qPos+1);   var dblAmp = postPart.indexOf("&amp;&amp;");   if (dblAmp != -1)   {    outHref = postPart.substring(0, dblAmp);    return outHref;   }  } } else if (searchshield.DoesURLContain(tag.href, "r.msn.co")) {  var element = tag;  var parentNode = tag.parentNode;  // top links - check for a CITE  var spanElements = element.getElementsByTagName("CITE");  if ((spanElements != null)    &amp;&amp;    (spanElements.length &gt; 0))  {   outHref = spanElements[0].innerHTML;   // replace any nbsp's   outHref = outHref.replace("&amp;nbsp;", " ");   // url is after the last space in the html, after the '-'   var space_pos = outHref.lastIndexOf(" ");   if (space_pos != -1)    outHref = outHref.slice(space_pos + 1);   outHref = searchshield.checkUrl(outHref);   return outHref;  }    // side links   if (element.lastChild != null)  {   outHref = element.lastChild.innerHTML;   if ( outHref != null)   {    outHref = searchshield.checkUrl(outHref);    return outHref;   }  } } else if (searchshield.DoesURLContain(tag.href, this.search.uri.host)     ||    searchshield.DoesURLContain(tag.href, ".live.com")     ||    searchshield.DoesURLContain(tag.href, "msn.")      ||    searchshield.DoesURLContain(tag.href, "msnscache.com")    ||    searchshield.DoesURLContain(tag.href, "advertising.microsoft.co") ||    searchshield.DoesURLContain(tag.href, "javascript:")    ||    searchshield.DoesURLContain(tag.href, "go.microsoft.co")   ||    searchshield.DoesURLContain(tag.href, "hotmail.co")) {  // not a link  return false; } else if (tag.id.toLowerCase() == "trademarks") {  // don't link the trademark at the bottom of the page  return false; } else {  // include it  return tag.href; }};///////////////    MSN SEARCH ENGINE    //////////////////////////////    BING SEARCH ENGINE    ///////////////searchshield.BingSearchEngine = function(search){ searchshield.SearchEngine.call(this, search);};searchshield.BingSearchEngine.prototype = new searchshield.SearchEngine();searchshield.BingSearchEngine.prototype.constructor = searchshield.BingSearchEngine;searchshield.BingSearchEngine.prototype.name = "bing";searchshield.BingSearchEngine.prototype.validSearch = function(href){ var uri; if (typeof(this.search) === 'undefined' || null === this.search)  uri = searchshield.parseLink(href); else  uri = this.search.uri; if(!uri || !uri.host)  return false; var hostMatch = false; var domain  = uri.host; // re stitch the uri path and query elements to // use existing logic var path = uri.path + uri.delimiter + uri.query;  // For bing the host must match: // www.bing.com or www.bing.net // xx.bing.com or xx.bing.net where xx is a country code // bing.com.xx where xx is a country code // bing.search.xxxx.net where xxxx may be something like daum if ((domain.indexOf("www.bing.com") !== -1) ||  (domain.indexOf("www.bing.net") !== -1) ||  (domain.indexOf("bing.net") !== -1)) {  hostMatch = true; } else if ((domain.indexOf("bing.search.") !== -1) &amp;&amp;     (domain.indexOf(".net") === (domain.length-4)))  { //bing.search.xxxx.net  hostMatch = true; } else { // xx.bing.com or bing.com.xx  var domainLen = domain.length;  var tldPos = domain.indexOf(".bing.com");  if (tldPos &gt; -1)  {   if ((domainLen - tldPos) == 9)    hostMatch = true;  }  }  if (hostMatch) {  var displayStyle = (domain == 'bing.search.daum.net') ? 'inline-block' : 'inline';  this.addAnchorStyle = {   display: displayStyle  };    if (path.indexOf("search?") == 0)   return true; } return false;};searchshield.BingSearchEngine.prototype.includeLink = function(tag){ var outHref = false; if (tag.tagName == 'IMG') { //no images   return false; }   if (tag.href.charAt(0) == '/') { //no relative links  return false; } if (/trademarks/i.test(tag.id)) {  // don't link the trademark at the bottom of the page  return false; }  if ((tag.parentNode) &amp;&amp; (/sc_stc/i.test(tag.parentNode.id))) { // don't verdict the social sites - our verdict doesn't fit  return false; } else if (!!searchshield.getParentNodeByClassName("sw_t",tag,3)) { // no links in page header  return false; } else if (searchshield.DoesURLContain(tag.href, "r.msn.co") ||    searchshield.DoesURLContain(tag.href, "overture.com")) { // france has r.msn.co and italy has overture.com sponsored links  // with the link in CITE element    var spanElements = null;    // top links - check for a CITE  spanElements = tag.getElementsByTagName("CITE");  if ((spanElements == null) || (spanElements.length &lt;= 0))  {   if (tag.parentNode &amp;&amp; tag.parentNode.parentNode)    spanElements = tag.parentNode.parentNode.getElementsByTagName("CITE");  }    if ((spanElements != null) &amp;&amp; (spanElements.length &gt; 0))  {   outHref = spanElements[0].innerHTML;   if (outHref != null)   {    // replace any nbsp's    outHref = outHref.replace("&amp;nbsp;", " ");    // url is after the last space in the html, after the '-'    var space_pos = outHref.lastIndexOf(" ");    if (space_pos != -1)     outHref = outHref.slice(space_pos + 1);    outHref = searchshield.checkUrl(outHref);    // save the link    return outHref;   }  }    // side links   if (tag.lastChild != null)  {   outHref = tag.lastChild.innerHTML;   if (outHref != null)   {    outHref = searchshield.checkUrl(outHref);    // save the link    return outHref;   }  } } // no sponsored links for now  else if (searchshield.DoesURLContain(tag.href, this.search.uri.host) ||   searchshield.DoesURLContain(tag.href, ".live.com")    ||   searchshield.DoesURLContain(tag.href, ".bing.com")    ||   searchshield.DoesURLContain(tag.href, ".bing.net")    ||   searchshield.DoesURLContain(tag.href, ".daum.net")    ||   searchshield.DoesURLContain(tag.href, ".gmarket.co")   ||   searchshield.DoesURLContain(tag.href, ".multimap.com")   ||   searchshield.DoesURLContain(tag.href, "msn.")     ||   searchshield.DoesURLContain(tag.href, "ms.ciao.")    ||   searchshield.DoesURLContain(tag.href, "ms.ciao-")    ||   searchshield.DoesURLContain(tag.href, "advertising.microsoft.co") ||   searchshield.DoesURLContain(tag.href, "javascript:")    ||   searchshield.DoesURLContain(tag.href, "go.microsoft.co")   ||   searchshield.DoesURLContain(tag.href, "hotmail.co")     ||   searchshield.DoesURLContain(tag.href, "cc.bingj.com")    ||   searchshield.DoesURLContain(tag.href, "microsofttranslator.com") ||   searchshield.DoesURLContain(tag.href, ".engkoo.com")    ||   searchshield.DoesURLContain(tag.href, "sealinfo.verisign.com")  ||   searchshield.DoesURLContain(tag.href, "explabs.com")    ||   searchshield.DoesURLContain(tag.href, "onlinehelp.microsoft.com") ||   searchshield.DoesURLContain(tag.href, ".myoverture")) {  // not a link  return false; } else  return tag.href;};searchshield.BingSearchEngine.prototype.addImage = function(node, image, hidden){ var element = node.element; var parentNode  = node.element.parentNode; var grandParentNode = !!parentNode ? parentNode.parentNode : null; // if there are redundant links in the same grandparent then skip them if (!!grandParentNode) {  gpChildren = grandParentNode.childNodes;  for (var i=0; i &lt; gpChildren.length; i++)  {   if (!!element.href &amp;&amp; gpChildren[i].tagName == "A" &amp;&amp; gpChildren[i].href == element.href)    return;  } } var parent = searchshield.SearchEngine.prototype.addImage; return parent.call(this, node, image, hidden);};///////////////    BING SEARCH ENGINE    //////////////////////////////    BAIDU SEARCH ENGINE    ///////////////searchshield.BaiduSearchEngine = function(search){ searchshield.SearchEngine.call(this, search); this.updateImageStyle = {  verticalAlign: null };};searchshield.BaiduSearchEngine.prototype = new searchshield.SearchEngine();searchshield.BaiduSearchEngine.prototype.constructor = searchshield.BaiduSearchEngine;searchshield.BaiduSearchEngine.prototype.name = "baidu";searchshield.BaiduSearchEngine.prototype.validSearch = function(href){ var uri; if (typeof(this.search) === 'undefined' || null === this.search)  uri = searchshield.parseLink(href); else  uri = this.search.uri; if(!uri || !uri.host)  return false; var hostMatch = false; var domain  = uri.host; // re stitch the uri path and query elements to // use existing logic var path = uri.path + uri.delimiter + uri.query;  if (domain == "www.baidu.com" || path.indexOf("testBaidu") !== -1)  hostMatch = true;   if (hostMatch) {  if (path.indexOf("s?") == 0)   return true; } return false;};searchshield.BaiduSearchEngine.prototype.includeLink = function(tag){    if (tag.className &amp;&amp; tag.className == "m")   return false;  if (searchshield.DoesURLContain(tag.href, this.search.uri.host))   return false;  else   {   // no link to self   var traverseElement = tag.parentNode;   while ( traverseElement &amp;&amp; traverseElement.className != "tbody")   {    if (traverseElement.className == "f")     return tag.href;    traverseElement = traverseElement.parentNode;   }      return false;  }};///////////////    BAIDU SEARCH ENGINE    //////////////////////////////    EARTHLINK SEARCH ENGINE    ///////////////searchshield.EarthlinkSearchEngine = function(search){ searchshield.SearchEngine.call(this, search); this.onlyPrimaries = false; this.addAnchorStyle = {  position: "static" };};searchshield.EarthlinkSearchEngine.prototype = new searchshield.SearchEngine();searchshield.EarthlinkSearchEngine.prototype.constructor = searchshield.EarthlinkSearchEngine;searchshield.EarthlinkSearchEngine.prototype.name = "earthlink";searchshield.EarthlinkSearchEngine.prototype.validSearch = function(href){ var uri; if (typeof(this.search) === 'undefined' || null === this.search)  uri = searchshield.parseLink(href); else  uri = this.search.uri; if(!uri || !uri.host)  return false; var hostMatch = false; var domain  = uri.host; // re stitch the uri path and query elements to // use existing logic var path = uri.path + uri.delimiter + uri.query; // For EarthLink the host must match: // search.earthlink.net if (("search.earthlink.net" == domain) &amp;&amp;  (path.indexOf("search?") == 0)) {  return true; } return false;};searchshield.EarthlinkSearchEngine.prototype.includeLink = function(tag){ var outHref = ""; var findStr = ""; // check for an anchor if (tag.tagName == "A") {  // check for sponsored  if (tag.id.indexOf("a") == 0)  {   var q = tag.href.indexOf("&amp;q=");   var qlen = 3;   if (q == -1)   {    q = tag.href.indexOf("&amp;adurl=");    qlen = 7;    if (q == -1)     return false;   }   // find end of url   var end = tag.href.indexOf("&amp;", q+qlen);   if (end &lt; 0)    end = tag.href.length;   // add the link   outHref = tag.href.substring(q+qlen, end);      if (searchshield.FilterUrl(outHref, this.filter_urls))    return false;       return outHref;  }  // don't search url's to self  if ((tag.href.indexOf("://") == -1) || searchshield.DoesURLContain(tag.href, this.search.uri.host))   return false;  // if a normal web result add it  if (tag.parentNode &amp;&amp; (tag.parentNode.tagName == "H3") &amp;&amp;   tag.parentNode.parentNode &amp;&amp; (tag.parentNode.parentNode.tagName == "LI") &amp;&amp;   tag.parentNode.parentNode.parentNode &amp;&amp; (tag.parentNode.parentNode.parentNode.tagName == "UL"))  {   if (searchshield.FilterUrl(tag.href, this.filter_urls))    return false;       return tag.href;  } }  return false;};///////////////    EARTHLINK SEARCH ENGINE    //////////////////////////////    AOL SEARCH ENGINE    ///////////////searchshield.AOLSearchEngine = function(search){ searchshield.SearchEngine.call(this, search);  this.addImageStyle = {  display: "inline" }; this.addAnchorStyle = {  display: null }; this.updateImageStyle = {  verticalAlign: null,  display: "inline" };};searchshield.AOLSearchEngine.prototype = new searchshield.SearchEngine();searchshield.AOLSearchEngine.prototype.constructor = searchshield.AOLSearchEngine;searchshield.AOLSearchEngine.prototype.name = "aol";searchshield.AOLSearchEngine.prototype.validSearch = function(href){ var uri; if (typeof(this.search) === 'undefined' || null === this.search)  uri = searchshield.parseLink(href); else  uri = this.search.uri; if(!uri || !uri.host)  return false;  var domain = uri.host; //path may be 'aol/search' or 'search' var pathArray = uri.path.split("/"); var aol = pathArray[0]; // re stitch the uri path and query elements // to use existing logic var path = (undefined == pathArray[1]) ? pathArray[0] : pathArray[1];  path += uri.delimiter + uri.query; if ("search.aol.com" == domain) {  if ((aol == "aol") &amp;&amp;   (path.indexOf("search?") == 0))  {   return true;  } }  return false;};searchshield.AOLSearchEngine.prototype.includeLink = function(tag){ if (searchshield.DoesURLContain(tag.href, this.search.uri.host))  return false;  // sponsored links - google if ((tag.className) &amp;&amp; (tag.className.indexOf("slLink topAnchor") != -1)) { //parse for embedded href  if (tag.href.indexOf("/aclk?sa=") == -1)   return false;  var adurl = tag.href.indexOf("&amp;adurl=http");  if (adurl != -1)  {   var urlPos = adurl+7; // puts it on the http   var outHref = tag.href.substring(urlPos);   // extract any fragment text, do not unescape   var pound = outHref.indexOf("#");    if (pound != -1)   {    var fragment = outHref.substring(pound);    outHref = outHref.substring(0, pound);    outHref = unescape(outHref);    outHref += fragment;    if (searchshield.FilterUrl(outHref, this.filter_urls))     return false;    return outHref;   }   outHref = unescape(outHref);   if (outHref.indexOf("?") == -1)   {    var ampPos = outHref.indexOf("&amp;");    if (ampPos != -1)     outHref = outHref.substring(0, ampPos);   }       if (searchshield.FilterUrl(outHref, this.filter_urls))    return false;   return outHref;  }  return false; } if (tag.className == "find")  return tag.href;   return false;};searchshield.AOLSearchEngine.prototype.insertNodes = function(node, doc){ var element = node.element; var score = node.score; if (element &amp;&amp; element.className &amp;&amp; element.className.indexOf("slLink") != -1) { //sponsored links only  // for alt image  if (score == searchshield.SCORE_SS_VERISIGN)   return [element.nextSibling, element.parentNode];  // for verdict image  var cN = element.childNodes;  var cnLen = cN.length;  for (var i=0; i &lt; cnLen; i++)  {   if ((cN[i].nodeType == 1) &amp;&amp;     (cN[i].nodeName == 'SPAN') &amp;&amp;     ((cN[i].className == 'title') || (cN[i].className == 'durl')))    return [cN[i].nextSibling, cN[i].parentNode];  } } var parent = searchshield.SearchEngine.prototype.insertNodes; return parent.call(this, node, doc);};///////////////    AOL SEARCH ENGINE    //////////////////////////////    ASK SEARCH ENGINE    ///////////////searchshield.AskSearchEngine = function(search){ searchshield.SearchEngine.call(this, search);};searchshield.AskSearchEngine.prototype = new searchshield.SearchEngine();searchshield.AskSearchEngine.prototype.constructor = searchshield.AskSearchEngine;searchshield.AskSearchEngine.prototype.name = "ask";searchshield.AskSearchEngine.prototype.validSearch = function(href){ var uri; if (typeof(this.search) === 'undefined' || null === this.search)  uri = searchshield.parseLink(href); else  uri = this.search.uri; if(!uri || !uri.host)  return false;  var domain= uri.host; // re stitch the uri path and query elements // to use existing logic var path = uri.path + uri.delimiter + uri.query;  if ("www.ask.com" == domain) {  if (path.indexOf("web?") == 0)   return true; } return false;};searchshield.AskSearchEngine.prototype.includeLink = function(tag){ var outHref = ""; var findStr = ""; if (searchshield.DoesURLContain(tag.href, this.search.uri.host))  return false;  if ((tag.className) &amp;&amp; (tag.className.indexOf("nu") != -1) &amp;&amp; (tag.className.indexOf("info") == -1))  {  // exclude green links  if ((tag.firstChild) &amp;&amp;   (tag.firstChild.className) &amp;&amp;   (tag.firstChild.className.indexOf('attrib') == 0))  {   return false;  }  // ads link to google with class nu  findStr = "www.google.com";  if (tag.href.indexOf(findStr) != 0)  {   if (tag.href.indexOf(findStr + "/aclk?sa=") != -1)   {     findStr = "&amp;adurl=http";    var pos = tag.href.indexOf(findStr);    if (pos != -1)    {     pos += 7;     outHref = tag.href.substring(pos);     outHref = unescape(outHref);     if (searchshield.FilterUrl(outHref, this.filter_urls))       return false;     return outHref;    }   }  }  else  { // ad not to google just use href   outHref = tag.href;   if (searchshield.FilterUrl(outHref, this.filter_urls))    return false;   return outHref;  } } // primary results have class containing title or L2 ( Wikipedia links ) else if ((tag.className) &amp;&amp; ((tag.className.indexOf("title") != -1) || (tag.className.toLowerCase() == "l2"))) {  outHref = tag.href;  if (searchshield.FilterUrl(outHref, this.filter_urls))   return false;  return outHref; }  return false;};///////////////    ASK SEARCH ENGINE    //////////////////////////////    ALTAVISTA SEARCH ENGINE    ///////////////searchshield.AltaVistaSearchEngine = function(search){ searchshield.SearchEngine.call(this, search);};searchshield.AltaVistaSearchEngine.prototype = new searchshield.SearchEngine();searchshield.AltaVistaSearchEngine.prototype.constructor = searchshield.AltaVistaSearchEngine;searchshield.AltaVistaSearchEngine.prototype.name = "altavista";searchshield.AltaVistaSearchEngine.prototype.validSearch = function(href){ var uri; if (typeof(this.search) === 'undefined' || null === this.search)  uri = searchshield.parseLink(href); else  uri = this.search.uri; if(!uri || !uri.host)  return false;  var domain= uri.host;  // re stitch the uri path and query elements // to use existing logic var path = uri.path + uri.delimiter + uri.query; // www.atlavista.com ---&gt; now http://us.yhs4.search.yahoo.com/yhs/search?fr=altavista&amp;fr=altavista&amp;itag=ody&amp;q=warez&amp;kgs=1&amp;kls=0 // xx.altavista.com where xx is a country code var hostMatch = false; if ("www.altavista.com" == domain) {  hostMatch = true; } else {  // xx.altavista.com  var pDest = domain.indexOf(".altavista.com");  if ((pDest != -1 ) &amp;&amp; ((domain.length - pDest) == 14))  {   hostMatch = true;  }  else  {   // a reference to altavista must be present in yahoo search url   var pRef = (uri.qsArray.fr &amp;&amp; uri.qsArray.fr == 'altavista');   pDest = domain.indexOf("search.yahoo.com");   if (pDest != -1 &amp;&amp; pRef)    hostMatch = true;  } } if (hostMatch) {  //path must start with web/results?  if ((path.indexOf("yhs/search?") == 0) ||   (path.indexOf("search;") == 0)  ||   (path.indexOf("yhs/search;") == 0) ||   (path.indexOf("web/results?") == 0)||   (path.indexOf("fr=altavista") != -1))  {   return true;  } }  return false;};searchshield.AltaVistaSearchEngine.prototype.includeLink = function(tag){ var outHref = ""; var findStr = ""; // initial checks if ((!tag.href) ||   (tag.href.charAt(0) == '#') ||  (tag.href.indexOf("javascript:") == 0)) {  return false; }   if (searchshield.DoesURLContain(tag.href, this.search.uri.host))  return false;  var spnsdLinks = searchshield.getParentNodeByTagName("DIV", tag, "className"); if ((spnsdLinks) &amp;&amp;  (spnsdLinks.className.indexOf('ads') &gt; -1)) // sponsored links {  if (!tag.parentNode)   return false;  // parse ads for em tag  var baseNode;  if (spnsdLinks.className.indexOf('ads horiz') &gt; -1) // horizontal ads sections   baseNode = tag.parentNode.parentNode;  else   baseNode = tag.parentNode;    if (!baseNode || !baseNode.lastChild || baseNode.lastChild.tagName != 'EM')   return false;  var outHref = searchshield.removeHtmlTags(baseNode.lastChild.innerHTML);  return outHref; }  if ((tag.className == "spt") ||   (tag.className == "res") ||  (tag.className == "yschttl spt")) {  findStr = "/**";  var pos = tag.href.indexOf(findStr);  if (pos != -1)  {   pos += 3;   outHref = tag.href.substring(pos);   outHref = unescape(outHref);      // no results for overture.com &amp; no yahoo domains   chkHref = outHref.toLowerCase();   if (chkHref.indexOf("overture.") != -1)    return false;   // split the url based on '/'   var parts = outHref.split('/');   // only need a domain   if ((parts != null) &amp;&amp; (parts[2] != null))   {    var domain = parts[2];    if ((domain.indexOf("rdrjp.yahoo.com") != -1) ||     (domain.indexOf("rdrkrs.yahoo.com") != -1) ||     (domain.indexOf("rdrtpe.yahoo.com") != -1) ||     (domain.indexOf("rdrird.yahoo.com") != -1) ||     (domain.indexOf("rdrhk2.yahoo.com") != -1) ||     (domain.indexOf("rdrsg1.yahoo.com") != -1) ||     (domain.indexOf("rdrin2.yahoo.com") != -1) ||     (domain.indexOf("rdre1.yahoo.com") != -1) ||     (domain.indexOf("rdrw1.yahoo.com") != -1)  )    {     return false    }   }   return outHref;  }  else  {   return tag.href;  } }  return false;};searchshield.AltaVistaSearchEngine.prototype.getImgElement = function (element){ while (element != null)  {  element = element.nextSibling;  if (element != null)  {   if ((element.id == null) || (element.id.indexOf("LXPLSS_") == -1))   {   // not our id but hit another anchor no verdict    if (element.tagName == "A")    {     element = null;     break;    }   }   else if (element.tagName == "A")    break;  } }   var rtnElem = !!element ? element.firstChild : element; return rtnElem;};///////////////    ALTAVISTA SEARCH ENGINE    //////////////////////////////    YANDEX SEARCH ENGINE    ///////////////searchshield.YandexSearchEngine = function(search){ searchshield.SearchEngine.call(this, search);};searchshield.YandexSearchEngine.prototype = new searchshield.SearchEngine();searchshield.YandexSearchEngine.prototype.constructor = searchshield.YandexSearchEngine;searchshield.YandexSearchEngine.prototype.name = "yandex";searchshield.YandexSearchEngine.prototype.validSearch = function(href){ var uri; if (typeof(this.search) === 'undefined' || null === this.search)  uri = searchshield.parseLink(href); else  uri = this.search.uri; if(!uri || !uri.host)  return false;  var domain= uri.host; // re stitch the uri path and query elements // to use existing logic var path = uri.path + uri.delimiter + uri.query; if ((domain.match(/yandex\.com|by|kz|ru|ua/i)) &amp;&amp;  (path.indexOf("yandsearch?") == 0)) {  return true; }  return false;};searchshield.YandexSearchEngine.prototype.includeLink = function(tag){ if (tag.href.indexOf("/search") != -1) {  return false; }  if (searchshield.DoesURLContain(tag.href, this.search.uri.host) ||  searchshield.DoesURLContain(tag.href, ".yandex.net")  ||  searchshield.DoesURLContain(tag.href, ".yandex.ru")   ||  searchshield.DoesURLContain(tag.href, "moikrug.ru")   ||  searchshield.DoesURLContain(tag.href, "ya.ru")    ||  searchshield.DoesURLContain(tag.href, ".yandex.com")  ||  searchshield.DoesURLContain(tag.href, "yandex.st")) {  return false; }   parentNode = tag.parentNode; if ((tag.parentNode)   &amp;&amp;   (tag.parentNode.parentNode) &amp;&amp;  (tag.parentNode.parentNode.className.toLowerCase() == "moreinfo")) {  return false; }  return tag.href;};searchshield.YandexSearchEngine.prototype.getImgElement = function (element){ while (element != null)  {  element = element.nextSibling;  if (element != null)  {   if ((element.id == null) || (element.id.indexOf("LXPLSS_") == -1))   {   // not our id but hit another anchor no verdict    if (element.tagName == "A")    {     element = null;     break;    }   }   else if (element.tagName == "A")    break;  } }   var rtnElem = !!element ? element.firstChild : element; return rtnElem;};///////////////    YANDEX SEARCH ENGINE    //////////////////////////////    SEZNAM SEARCH ENGINE    ///////////////searchshield.SeznamSearchEngine = function(search){ searchshield.SearchEngine.call(this, search); this.elementAttribute = {  width: "18",  height: "18" }; this.updateImageStyle = {  width: "18px",  height: "18px" };};searchshield.SeznamSearchEngine.prototype = new searchshield.SearchEngine();searchshield.SeznamSearchEngine.prototype.constructor = searchshield.SeznamSearchEngine;searchshield.SeznamSearchEngine.prototype.name = "seznam";searchshield.SeznamSearchEngine.prototype.validSearch = function(href){ var uri; if (typeof(this.search) === 'undefined' || null === this.search)  uri = searchshield.parseLink(href); else  uri = this.search.uri; if(!uri || !uri.host)  return false;  var domain= uri.host; // re stitch the uri path and query elements // to use existing logic var path = uri.path + uri.delimiter + uri.query; if ((domain.indexOf("search.seznam.cz") &gt; -1) &amp;&amp;  ((path.indexOf("?") == 0) || (path.indexOf("svet") == 0))) {  return true; }  return false;};searchshield.SeznamSearchEngine.prototype.includeLink = function(tag){ if (searchshield.DoesURLContain(tag.href, this.search.uri.host))  return false;  var parentNode = tag.parentNode; if (parentNode) {  var grandParentNode = tag.parentNode.parentNode;  if ((parentNode.tagName == "SPAN") &amp;&amp;    ((parentNode.className.toLowerCase() == "sklik-url") ||   (parentNode.className.toLowerCase() == "sklik-title")))  { // locate the real url and unencode it   var ur
