, probably a paypal link, don't include if (tag.parentNode && (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; }; searchshield.AVGYahooSearchEngine.prototype.updateImage = function (hash, search, score, image, alt_image, flyover, click_thru, altClick_thru) { // remove style that is set when alt image is applied this.updateImageStyle = { verticalAlign: null }; // don't show verisign icon if (alt_image && (alt_image.length > 0)) this.omitAltImage = true; var parent = searchshield.SearchEngine.prototype.updateImage; return parent.call(this, hash, search, score, image, alt_image, flyover, click_thru, altClick_thru); }; /////////////// 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") > -1) { if (domain.charAt(13) == 'm') hostMatch = true; else if ((domain.charAt(13) == '.') && (domain.length == 16)) hostMatch = true; } else if (domain.indexOf("search.live.co") > -1) { if (domain.charAt(14) == 'm') hostMatch = true; else if ((domain.charAt(14) == '.') && (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("&&"); 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) && (spanElements.length > 0)) { outHref = spanElements[0].innerHTML; // replace any nbsp's outHref = outHref.replace(" ", " "); // 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) && (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 > -1) { if ((domainLen - tldPos) == 9) hostMatch = true; } } if (hostMatch) { 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 (tag.id.toLowerCase() == "trademarks") { // don't link the trademark at the bottom of the page return false; } if ((tag.parentNode) && (tag.parentNode.id.toLowerCase() == "sc_stc")) { // 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 <= 0)) { if (tag.parentNode && tag.parentNode.parentNode) spanElements = tag.parentNode.parentNode.getElementsByTagName("CITE"); } if ((spanElements != null) && (spanElements.length > 0)) { outHref = spanElements[0].innerHTML; if (outHref != null) { // replace any nbsp's outHref = outHref.replace(" ", " "); // 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")) { // 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 < gpChildren.length; i++) { if (!!element.href && gpChildren[i].tagName == "A" && 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); }; 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 && 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 && traverseElement.className != "tbody") { if (traverseElement.className == "f") return tag.href; traverseElement = traverseElement.parentNode; } return false; } }; searchshield.BaiduSearchEngine.prototype.addImage = function(node, image, hidden) { this.addImageStyle = { position: "relative", top: "0.05em" }; var parent = searchshield.SearchEngine.prototype.addImage; return parent.call(this, node, image, hidden); }; searchshield.BaiduSearchEngine.prototype.updateImage = function (hash, search, score, image, alt_image, flyover, click_thru, altClick_thru) { // remove style that is set when alt image is applied this.updateImageStyle = { verticalAlign: null }; var parent = searchshield.SearchEngine.prototype.updateImage; return parent.call(this, hash, search, score, image, alt_image, flyover, click_thru, altClick_thru); }; /////////////// 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) && (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("&q="); var qlen = 3; if (q == -1) { q = tag.href.indexOf("&adurl="); qlen = 7; if (q == -1) return false; } // find end of url var end = tag.href.indexOf("&", q+qlen); if (end < 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 && (tag.parentNode.tagName == "H3") && tag.parentNode.parentNode && (tag.parentNode.parentNode.tagName == "LI") && tag.parentNode.parentNode.parentNode && (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); }; 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") && (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) && (tag.className.indexOf("slLink") != -1)) { //parse for embedded href if (tag.href.indexOf("/aclk?sa=") == -1) return false; var adurl = tag.href.indexOf("&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("&"); 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.addImage = function(node, image, hidden) { this.addImageStyle = { display: "inline" }; this.addAnchorStyle = { display: null }; var parent = searchshield.SearchEngine.prototype.addImage; return parent.call(this, node, image, hidden); }; searchshield.AOLSearchEngine.prototype.updateImage = function (hash, search, score, image, alt_image, flyover, click_thru, altClick_thru) { // remove style that is set when alt image is applied this.updateImageStyle = { verticalAlign: null, display: "inline" }; var parent = searchshield.SearchEngine.prototype.updateImage; return parent.call(this, hash, search, score, image, alt_image, flyover, click_thru, altClick_thru); }; searchshield.AOLSearchEngine.prototype.insertNodes = function(node, doc) { var element = node.element; var score = node.score; if (element && element.className && 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 < cnLen; i++) { if ((cN[i].nodeType == 1) && (cN[i].nodeName == 'SPAN') && (cN[i].className == 'title')) return [cN[i].nextSibling, cN[i].parentNode]; } } else { 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) && (tag.className.indexOf("nu") != -1) && (tag.className.indexOf("info") == -1)) { // exclude green links if ((tag.firstChild) && (tag.firstChild.className) && (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 = "&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) && ((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 ---> now http://us.yhs4.search.yahoo.com/yhs/search?fr=altavista&fr=altavista&itag=ody&q=warez&kgs=1&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 ) && ((domain.length - pDest) == 14)) { hostMatch = true; } else { // a reference to altavista must be present in yahoo search url var pRef = (uri.qsArray.fr && uri.qsArray.fr == 'altavista'); pDest = domain.indexOf("search.yahoo.com"); if (pDest != -1 && 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; 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 & 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) && (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.indexOf("yandex.ru") > -1) || (domain.indexOf("yandex.com") > -1)) && (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) && (tag.parentNode.parentNode) && (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); }; 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") > -1) && ((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") && ((parentNode.className.toLowerCase() == "sklik-url") || (parentNode.className.toLowerCase() == "sklik-title"))) { // locate the real url and unencode it var urlPos = tag.href.indexOf("&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") && ((grandParentNode.className.toLowerCase() == "text") || (grandParentNode.className.toLowerCase() == "hlasky otz"))) { // standard link return tag.href; } else if (greatGrandParentNode && greatGrandParentNode.tagName == "DIV" && (greatGrandParentNode.className.toLowerCase() == "hotlinks")) { // hint link return tag.href; } } } return false; }; searchshield.SeznamSearchEngine.prototype.updateImage = function (hash, search, score, image, alt_image, flyover, click_thru, altClick_thru) { this.elementAttribute = { width: "18", height: "18" }; this.updateImageStyle = { width: "18px", height: "18px" }; var parent = searchshield.SearchEngine.prototype.updateImage; return parent.call(this, hash, search, score, image, alt_image, flyover, click_thru, altClick_thru); }; /////////////// 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") > -1) && (path.indexOf("results.aspx?") == 0)) { return true; } return false; }; searchshield.WebhledaniSearchEngine.prototype.includeLink = function(tag) { var parentNode = tag.parentNode; if (searchshield.DoesURLContain(tag.href, this.search.uri.host)) { if ( tag.href.indexOf("/redir.aspx?") != -1) { attrNode = tag.attributes; if ( attrNode == null ) return false; var outHref = attrNode.getNamedItem("onmouseover").nodeValue; if ( outHref == null ) return false; var findStr = "window.status="; if (outHref.indexOf(findStr)!= -1) { // get text before first semicolon var semicolon = outHref.indexOf(";"); if (semicolon > -1) outHref = outHref.substring(findStr.length, semicolon); // strip quotation marks outHref = outHref.replace(/['"]/g, ""); var space = outHref.indexOf(" "); var firstDot = outHref.indexOf("."); if ((space > -1) && (space < firstDot)) outHref = outHref.substring(space+1); outHref = searchshield.checkUrl(outHref); return outHref; } } } return false; }; searchshield.WebhledaniSearchEngine.prototype.insertNodes = function(node, doc) { var element = node.element; var score = node.score; // 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 < cnLen; i++) { if (cN[i].nodeType == 1 && cN[i].nodeName == 'SPAN' && cN[i].className == 'sl') { if (!this.cssUpdated) { this.cssUpdated = true; // need to add style to make verdicts display inline var docStyle = doc.styleSheets[0]; if (docStyle && docStyle.addRule) { //IE docStyle.addRule('#s a','display:inline'); docStyle.addRule('#s p a .sl','display:inline'); } else if (docStyle && docStyle.insertRule) { docStyle.insertRule('#s a {display:inline}', docStyle.cssRules.length); docStyle.insertRule('#s p a .sl {display:inline}', docStyle.cssRules.length); } } return [cN[i].nextSibling, cN[i].parentNode]; } } // don't display anything return [null, null]; }; /////////////// 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") > -1) || (domain.indexOf("shop.benl.ebay") > -1)) { if ((path.indexOf("?_from=") == 0) || (path.indexOf("i.html") > -1)) { return true; } } // ebay.se if ((domain.indexOf("search.eim.ebay") > -1) && ((path.indexOf("?kw=") > -1) || (path.indexOf("?ev=") > -1))) { return true; } if ((domain.indexOf("search.auction.co.kr") > -1 ) && ((path.indexOf("?keyword=") > -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) && ((domain.indexOf(".mercadolibre.") > -1 ) || (domain.indexOf(".mercadolivre.") > -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?") > -1 ) { if ( tag.title == null || tag.title.length < 0 ) return false; outHref = searchshield.removeHtmlTags(tag.title); if (outHref.indexOf(" ") == -1) { // no spaces if (outHref.indexOf(".") > -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 && (parentNode.className.toLowerCase() == "google-ad-link")) { if (tag.href.indexOf("/aclk?sa=") != -1) { findStr = "&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("&"); 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 && (parentNode.className.toLowerCase() == "link")) { if (tag.href.indexOf("adcr.naver.com") > -1) { outHref = tag.innerText; if ((outHref == null) || (outHref.length < 0)) return false; return outHref; } } // latin america ebay if ( tag.href.toLowerCase().indexOf("clickcounter?") > -1 ) { var spanElements = tag.getElementsByTagName("span"); if ((spanElements != null) && (spanElements.length > 0)) { if ( spanElements[0].className.toLowerCase() == "mclics-url" ) { outHref = spanElements[0].innerHTML; if ( outHref == null || outHref.length < 0 ) return false; outHref = searchshield.removeHtmlTags(outHref); if (outHref.indexOf(" ") == -1) { // no spaces if (outHref.indexOf(".") > -1) { // at least one dot if (outHref.toLowerCase().indexOf("mercado") == -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") > -1) && (path.indexOf("/ad") == -1)) { return true; } return false; }; searchshield.DiggSearchEngine.prototype.includeLink = function(tag) { var outHref = false; var findStr = ""; if ((tag.parentNode) && (tag.parentNode.className.toLowerCase() == "digg-count")) { return false; } if (searchshield.DoesURLContain(tag.href, this.search.uri.host)) { if (tag.className && 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 && (tag.parentNode.tagName == "DIV")) { if (tag.parentNode.id.indexOf("text-") != -1) { return tag.href; } } else if ( tag.parentNode && tag.parentNode.parentNode && 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 < 1) return false; // no verdicts on source of twit for example "from TweetDeck" if ((tag.className.indexOf("tweet-url web") == 0) && (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) && ((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.+\&adurl\=(.+)"; var re = new RegExp(regex); var matches = href.match(re); if (matches && (matches.length >= 4)) { // else we want the fourth value var match = matches[3]; if (match && (match.length > 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 (searchshield.DoesURLContain(tag.href, this.search.uri.host) || (searchshield.DoesURLContain(tag.href, 'static.ak.fbcdn.net'))) { return false; } // don't put verdicts in areas where typing is going on if (tag.parentNode) { var parentDiv = searchshield.getParentNodeByTagName("DIV", tag, "className"); if (parentDiv && (parentDiv.className == "Mentions_Input") || (parentDiv.className.indexOf('UIThumbPager_') != -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 /////////////// /////////////// 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 > 0) { category = parts[2]; threat = parts[4]; } var scan_result = searchshield.avgCallFunc(doc, 'ReportScanResult', url, url, threat, category, ip, severity); var scan_end = avgreport.scanEnd(doc, url); return (scan_result && 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, orig_onmousemove: null, reset: function () { avglsflyover.count = 0; avglsflyover.poppedUp = false; avglsflyover.poppedElement = null; avglsflyover.orig_onmousemove = 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 || event.currentTarget; var frameDoc = eventTarget.ownerDocument; // if the element is the clock, don't pop over it if ((eventTarget.src != null) && (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, "'"); } // 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; div.onmouseout = avglsflyover.hide; // if an onmousemove is already set and it isn't us, save it and restore later if ((frameDoc.onmousemove != null) && (frameDoc.onmousemove != avglsflyover.position)) avglsflyover.orig_onmousemove = frameDoc.onmousemove; frameDoc.onmousemove = avglsflyover.position; }, hide: function (event, force) { var div = document.getElementById("XPLSS_Flyover"); if ((div == null) || (div.style == null) || (div.style.visibility == "hidden")) return; var trans_div = document.getElementById("XPLSS_Trans"); if ((trans_div == null) || (trans_div.style == null) || (trans_div.style.visibility == "hidden")) return; if (!!force) return setFlyoverStyle(div, trans_div); if (!event) event = window.event; // establish target element and get its containing document object // in case verdict is inside a frame var eventTarget = event.srcElement || event.currentTarget; var frameDoc = eventTarget.ownerDocument; // restore onmousemove if (avglsflyover.orig_onmousemove != null) frameDoc.onmousemove = avglsflyover.orig_onmousemove; if (avglsflyover.poppedElement) avglsflyover.poppedElement.style.border = ""; var relatedElement = event.toElement; if (!relatedElement) { //this happens on mouseout when verdict and flyover are on different frames/docs window.top.document.detachEvent('onmouseout', avglsflyover.hide); window.top.document.attachEvent('onmouseout', avglsflyover.hide); return; } // make sure we aren't still over the popped image or our layer if (searchshield.containedIn(avglsflyover.poppedElement, relatedElement) || searchshield.containedIn(div, relatedElement) || searchshield.containedIn(trans_div, relatedElement)) { return; } setFlyoverStyle(); // hide and move somewhere off screen (negative offsets) function setFlyoverStyle() { 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 && 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 < 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) > posX) { // right offsetX += halfX; locateX = 1; } else { //left offsetX -= (flyoverX + halfX); } if ((windowY - posY) > posY) { // below if (posY < (windowY/4)) { offsetY -= halfY; locateY = 1; } else { offsetY -= (flyoverY / 2); locateY = 2; } } else { // above if ((windowY - posY) < (windowY/4)) { offsetY -= (flyoverY - halfY); } else { offsetY -= (flyoverY / 2); locateY = 2; } } // make sure we aren't off the screen if (offsetY < 0) offsetY = 0; if ((offsetY + flyoverY) > 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 + "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"; // show the transparent layer var trans_div = document.getElementById("XPLSS_Trans"); if (trans_div == null) return; trans_div.style.visibility = "visible"; 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 += "
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; // normalize pos to 0 -- get amount of scrolling in browser window var scroll = searchshield.scrollSize(imageElem); var pageOffsetX = scroll[0]; var pageOffsetY = scroll[1]; var hasParentFrame = scroll[2]; posX -= pageOffsetX; posY -= pageOffsetY; //compensate for Firefox 3 if (posX < imgRect.left) posX = imgRect.left+halfX; // setup the offsets var offsetX = posX; var offsetY = posY; // calc where to display on page if ((windowX - posX) > posX) { // right offsetX += halfX; locateX = 1; } else { //left offsetX -= (flyoverX + halfX); } if ((windowY - posY) > posY) { // below if (posY < (windowY/4)) { offsetY -= halfY; locateY = 1; } else { offsetY -= (flyoverY / 2) - halfY; locateY = 2; } } else { // above if ((windowY - posY) < (windowY/4)) { offsetY -= (flyoverY - halfY); } else { offsetY -= (flyoverY / 2) + halfY; locateY = 2; } } // make sure we aren't off the screen if (offsetY < 0) offsetY = 0; if ((offsetY + flyoverY) > windowY) { offsetY = windowY - flyoverY; } else if (scrollBarX && ((windowY - (posY + halfY)) < 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 = paddedOffsetX + "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 < 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 < images.length; i++) { if (images[i].id == "avg_ls_image") { imageElem = images[i]; break; } } return imageElem; } }, mouseOverHandler: function (e, doc, engine) { if (e && e.srcElement && 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 (finalUrl) { // update the verdict engine.display_inline(doc, new_element, finalUrl, null, true); } } }; /////////////// FLYOVERS ///////////////