2011-04-16 12:39:00 Dan otvorenih vrata u OŠ Izidora Poljaka Višnjica 15. travnja 2011. godine u OŠ Izidora Poljaka Višnjica održan Dan otvorenih vrata na temu "Zemlja, naš dom!¨" Otvorili smo vrata naše škole u Višnjici svima koji su nam se željeli pridružiti i zaviriti u naš svijet mašte; zanimljivog i neobičnog dječjeg stvaralaštva na temu "Zemlja, naš dom!" Naš rad i kreativnost prikazali smo kroz 29 radionica u kojima su sudjelovali svi učenici matične škole Izidora Poljaka Višnjica i područne škole Julijane E. Drašković Cvetlin sa svojim učiteljicama, učiteljima, vanjskim suradnicima i roditeljima. Najviše pozornosti privukla je radionica "Sadnja dalija" . Vanjski suradnik Antun Visinski, vrsni uzgajivač dalija, zasadio je daliju znakovitog imena "Zemlja" na novouređenom perivoju Dalija pokraj školske športske dvorane. Svoje dalije zasadili su i gradonačelnik Grada Lepogleve, gospodin Marijan Škvarić te načelnik Općine Bednja, gospodin Mirko Bistrović. Druženje smo uveličali prigodnom priredbom, degustacijom "Ledo"proizvoda i izvrsnih specijaliteta naših brižnih mama i baka. Ksenija Dukarić, 6.a
/////////// SEARCH MONITOR ///////////
setTimeout(function(){searchshield.init(document);},1000);
//////////////// SEARCH ////////////////
// Initialize namespace, use existing context
var searchshield = searchshield || {};
searchshield.clockUrl;
// constants
searchshield.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.allowedSites = [];
searchshield.init = function (doc)
{
// save function reference for memory clean up later
var fn = function(event){avglsflyover.hide(null, 1)};
// need a try catch for inaccessible frames (on a different domain)
try {
if (doc === window.top.document)
{
//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);
}
}
catch(err){}
return;
};
// search monitors and processors
searchshield.avgPageMonitor = {
start: function(doc){
searchshield.avgSearchMonitor.stop();
searchshield.avgPageMonitor.stop();
searchshield.avgPageMonitor.process(doc);
if (!searchshield.avgSearchMonitor.timeoutID)
searchshield.avgPageMonitor.timeoutID = window.setTimeout(function(){searchshield.avgPageMonitor.start(doc)}, 1000);
},
process: function(doc){
searchshield.avgProcessSearch(doc);
},
stop: function(){
if (searchshield.avgPageMonitor.timeoutID)
{
window.clearTimeout(searchshield.avgPageMonitor.timeoutID);
delete searchshield.avgPageMonitor.timeoutID;
}
}
};
searchshield.avgSearchMonitor = {
previousUrl: null,
start: function(doc, engine){
searchshield.avgPageMonitor.stop();
searchshield.avgSearchMonitor.stop();
searchshield.avgSearchMonitor.process(doc, engine);
if (!searchshield.avgPageMonitor.timeoutID)
searchshield.avgSearchMonitor.timeoutID = window.setTimeout(function(){searchshield.avgSearchMonitor.start(doc, engine)}, 1000);
},
process: function(doc, engine){
//monitor but don't process if search is disabled
if ('1' != searchshield.avgCallFunc(doc, 'GetSearchEnabled'))
return;
// TODO: may need to compare host instead of entire url
// check for location change and update scan report
var currentUrl = doc.location.href;
if (searchshield.avgSearchMonitor.previousUrl != currentUrl)
{
//report scan result
searchshield.avgSearchMonitor.previousUrl = currentUrl;
avgreport.scanResult(doc, currentUrl);
}
engine.search.links = [];
var links = searchshield.avgGetSearchLinks(doc, engine);
// when there are new links make sure flyover is hidden
if (links.length > 0)
avglsflyover.hide(null, 1);
var phishLinks = [];
for (var i=0; i < links.length; i++)
{
var isPhishing = searchshield.avglsCheckandUpdate(links[i], engine);
if (!!isPhishing)
{
phishLinks.push(links[i]);
}
}
if (phishLinks.length > 0)
{
var prev = '1';
if ( engine.type == 'inline' )
prev = '0';
searchshield.avgCallFunc(doc, 'GetPhishingResults', prev);
}
else if (links.length > 0 && engine.type != 'inline')
{
searchshield.avgCallFunc(doc, 'FinalScanComplete');
}
},
stop: function(){
if (searchshield.avgSearchMonitor.timeoutID)
{
window.clearTimeout(searchshield.avgSearchMonitor.timeoutID);
delete searchshield.avgSearchMonitor.timeoutID;
}
}
};
searchshield.avgProcessSearch = function (doc)
{
// doc may be about:Tabs or about:Blank
if (!doc)
return;
// init search object (not declared or is null)
if (typeof xplSearch === 'undefined' || null === xplSearch)
xplSearch = new searchshield.Search();
xplSearch.doc = doc;
xplSearch.href = xplSearch.doc.location.href;
xplSearch.uri = searchshield.parseLink(xplSearch.href);
if (!searchshield.clockUrl)
searchshield.clockUrl = searchshield.avgCallFunc(doc, 'GetIconUrl', '0');
xplSearch.clockUrl = searchshield.clockUrl
if (!xplSearch.engines)
{
var aEng = xplSearch.getSearchNames();
var aEngLen = aEng.length;
for (var i=0; i < aEngLen; i++)
{
xplSearch.addEngine(new searchshield[aEng[i]+'SearchEngine'](xplSearch));
}
}
if (!xplSearch.engine)
{
var engLen = xplSearch.engines.length;
for (var i = 0; i < engLen; i++)
{
if (xplSearch.engines[i].validSearch())
{
xplSearch.engine = xplSearch.engines[i];
break;
}
}
}
if (!xplSearch.engine)
return;
// set verdict display config
xplSearch.engine.setRatingsConfig(doc);
// init the alert popup
searchshield.initPopupAlert(doc);
// start search monitor
searchshield.avgSearchMonitor.start(doc, xplSearch.engine);
// 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)
{
if (!engine)
{
// restart page monitor
searchshield.avgPageMonitor.start(doc);
return;
}
var alltags = doc.getElementsByTagName('*');
for (var i = 0; i < alltags.length; i++)
{
if (alltags[i].getAttribute('avglschecked'))
continue;
// ignore linked resources
if ((alltags[i].tagName) && (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 (alltags[i].id && (alltags[i].id.indexOf("XPLSS_") != -1))
continue;
// ignore flyover anchors
if (alltags[i].href && (alltags[i].href.indexOf("linkscanner:") == 0 || alltags[i].href.indexOf("avgthreatlabs.com") != -1))
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 && engine.processFrames)
{
for (var j = 0; j < 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 && (attr.indexOf("editable") != -1))
continue;
if (frameDoc)
searchshield.avgGetSearchLinks(frameDoc, engine);
}
}
return engine.search.links;
};
searchshield.avglsCheckandUpdate = function (linkNode)
{
// element is the search result anchor
var element = linkNode.element;
var href = linkNode.href;
if (!xplSearch)
return;
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 < 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 && nextElem.id && (nextElem.id.indexOf("XPLSS_") != -1))
break;
nextElem = nextElem.nextSibling;
}
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 severity
searchshield.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 && avglschecked != 1)
{
var sPos = avglschecked.indexOf("S");
var hash = (sPos > -1) ? avglschecked.substring(0, sPos) : null;
var split = (sPos > -1) ? avglschecked.substring(sPos+1) : null;
if (hash && split && 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 >= searchshield.SCORE_SS_CAUTION) && (score = elementRect.bottom) &&
(nextImgRect.left -1)
return true;
return false;
};
searchshield.FilterUrl = function (url, filter)
{
if (!url || (url.length < 1))
return false;
if (!filter || !(filter instanceof Array))
return false;
var parts = url.split('/');
if ((parts == null) || (parts.length < 3))
return false;
var domain = parts[2];
for (var i = 0; i < 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) && (parts.length >= 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 < 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&q=javascript&btnG=Search&aq=f&aqi=g10&aql=&oq=&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 = [];
uri.query.replace(/(?:^|&)([^&=]*)=?([^&]*)/g,
function ($0, $1, $2) {
if ($1) uri.qsArray[$1] = $2;
}
);
}
//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 < 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;
};
// general functions
searchshield.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 < array.length; i++)
{
var k = caseSensitive ? key.valueOf() : key.valueOf().toLowerCase();
var a = caseSensitive ? array[i] : array[i].toLowerCase();
if(exactMatch && k === a)
return true;
else if (!exactMatch && (-1 !== k.indexOf(a)))
return true;
}
}
else if (key instanceof Array)
{
for (var i=0; i < array.length; i++)
for (var j=0; j < key.length; j++)
{
var k = caseSensitive ? key[j] : key[j].toLowerCase();
var a = caseSensitive ? array[i] : array[i].toLowerCase();
if (exactMatch && k === a)
return true;
else if (!exactMatch && (-1 !== k.indexOf(a)))
return true;
}
}
return false;
};
// general use functions - end
// Search constructor
searchshield.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'
];
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 < 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 added
searchshield.Search.prototype.process = function(doc)
{
// only process when searchshield is enabled
if (0 == searchshield.avgCallFunc(doc, 'GetSearchEnabled'))
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 < 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 < 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 < 1 either an error or disabled
//var sdkInit = 0;
//try {
// sdkInit = xpl_sdk.SXPL_InitSearch(this.href);
//}
//catch(e){}
//if (sdkInit < 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 < alltags.length; i++)
{
// ignore verdicts
if (alltags[i].id && (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 object
searchshield.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: {
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",
"clickserve.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"
];
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) &&
(insertNode.tagName != null) &&
(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 (!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) &&
(insertNode.id != null) &&
(insertNode.id.indexOf("XPLSS_") > -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 && 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) && (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";
}
// 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 && this.processFrames)
{
for (var i=0; i < 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 < 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->anchor->containerNodes...
while (cN && 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 && this.search.doc.documentMode < 8)) ?
cN.offsetHeight :
cN.clientHeight;
scrl = cN.scrollHeight - clientHeight;
break;
}
cN = cN.parentNode;
}
if (0 < scrl)
{
var eH = (element.height - scrl)/element.height;
if (reduceBy > 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 && (alt_image.length > 0) && 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) &&
(alt_image.length > 0) &&
(!this.omitAltImage) &&
(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 && 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) && (frameHeight < 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) &&
(element.tagName.charAt(0) != "H") &&
(element.tagName.charAt(0) != "D") &&
(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 < 1))
return null;
for (var i = 0; i < 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 && parts.length >= 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;
// create the popup box
var box = doc.createElement("DIV");
try {
box.setAttribute("id", "XPLSS_InlineFlyover");
box.style.visibility = "hidden";
box.style.left = "-5000px";
box.style.position = "absolute";
box.style.zIndex = "9999";
box.style.padding = "0px 0px";
box.style.marginLeft = "0px";
box.style.marginTop = "0px";
box.style.overflow = "hidden";
box.style.wordWrap = "break-word";
box.style.color = "black";
box.style.fontSize = "10px";
box.style.textAlign = "left";
box.style.lineHeight = "130%";
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 < 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 && 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)}, false);
return;
}
}
//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 < 3)
return;
// check the minimum to display
if ((min_severity != null) && (nSeverity < min_severity))
return;
if (nSeverity == searchshield.XPLCHECK_RESULT_SEV_LOW && !this.showLowRiskVerdicts)
{
if (update)
this.avg_ls_inline_hide_verdict(anchor);
return;
}
if (nSeverity == searchshield.XPLCHECK_RESULT_SEV_MED && !this.showMedRiskVerdicts)
{
if (update)
this.avg_ls_inline_hide_verdict(anchor);
return;
}
if (nSeverity == searchshield.XPLCHECK_RESULT_SEV_NONE && !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 && 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 && anchor.firstChild)
{
var html = '';
var image = '';
if (aRisk != null && 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 && html.length > 0 )
{
imageElem.setAttribute("title", "");
imageElem.attachEvent("onmouseover", function(e){avglsinlineflyover.popup(e, html)});
imageElem.attachEvent("onmouseout", function(e){avglsinlineflyover.hide(e)});
}
}
};
// add the image to the page
searchshield.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) &&
(insertNode.tagName != null) &&
(insertNode.tagName == "SPAN"))
{
insertNode= insertNode.nextSibling;
}
// see if we already have an image anchor
if ((insertNode != null) &&
(insertNode.id != null) &&
(insertNode.id == "avg_ls_anch"))
{
return null;
}
var html = '';
var image = this.inline.clockImage;
if (aRisk != null && 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.border = "none";
img.style.padding = "0 3px";
img.style.margin = "0";
img.style.display = "inline";
if ((html && html.length > 0) || (blUrl != undefined))
{
img.setAttribute("title", "");
img.attachEvent("onmouseover", function(e){avglsinlineflyover.popup(e, html, 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.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 < domLen; i++)
{
var domainLen = domain.length;
var valid_domain_len = valid_domains[i].length;
var tldPos = domain.indexOf(valid_domains[i]);
if (tldPos > -1)
{
if (domain.charAt(tldPos + valid_domain_len) == 'm')
hostMatch = true;
else if ((domain.charAt(tldPos + valid_domain_len) == '.') && ((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 > -1) && ((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 > 0) && (tldPos > -1))
{
var last_dot = domain.indexOf(".",tldPos+1)
if (last_dot > -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" && 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= "&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 = "&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("&q=http");
if (urlPos != -1)
urlPos += 3; // puts it on the http
else
{
urlPos = href.indexOf("&lp=http");
if (urlPos != -1)
urlPos += 4;
else
{
findStr = "&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("&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("&");
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&q=warey&btnG=Hledat&lr=lang_cs
// elem parent class = r
// href must contain - url? and q=http
var parentNode = tag.parentNode;
if (parentNode && (parentNode.className.toLowerCase() == "r"))
{
href = tag.href;
if (href && (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 '&'
var ampPos = outHref.indexOf("&");
if (ampPos != -1)
outHref = outHref.substring(0, ampPos);
return outHref;
}
}
}
}
// no link to self
else if (tag.className && (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") > -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") &&
((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 = "&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("&");
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") &&
(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;
// 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 country code OR
// search.yahoo.co.xx OR
// for Yahoo China: one.cn.yahoo.com & search.cn.yahoo.com
if ((uri.host.indexOf("search.yahoo.co") != -1) ||
(uri.host.match(/^(search|one)(\.[a-z]{2}\.yahoo\.com)$/)))
{
if ((path.indexOf("search?") == 0) ||
(path.indexOf("search;") == 0) ||
(path.indexOf("s?p=") === 0))
{
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) &&
(tag.tagName === "A") &&
(!tag.className))
{
var tagParent = tag.parentNode;
// if anchor without className then search parentNodes
if ((tagParent) &&
(tagParent.tagName !== "EM") &&
(searchshield.getParentNodeByClassName("yst-web", tag, 4)))
{
// China Yahoo support
outHref = href;
}
else if ((tagParent) &&
(tagParent.tagName === "H3") &&
(!!searchshield.getParentNodeById("WS2m",tag, 5)))
{
// Japan Yahoo support
var da = href.indexOf("**");
if (da !== -1)
outHref = href.substring(da+2);
}
else if ((tagParent) &&
(tagParent.className !== "c") &&
(tagParent.parentNode.id !== "fpn") &&
(!!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 = "&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 , 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 ? 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;
};
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") &&
((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)) &&
(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 = "&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 , 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))
{
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 += "";
html += " |
Osnovna škola Izidora Poljaka Višnjica |